/ Hex Artifact Content
Login

Artifact cdde4d3ed7f7cf1911b961141d61a4f06e6f7ebd:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t.h"../*.** Retu
0220: 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74 79  rn the 'affinity
0230: 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  ' of the express
0240: 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e 79  ion pExpr if any
0250: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
0260: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61 20   is a column, a 
0270: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 63  reference to a c
0280: 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41 53  olumn via an 'AS
0290: 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20 61  ' alias,.** or a
02a0: 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74 68   sub-select with
02b0: 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65   a column as the
02c0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20 74   return value, t
02d0: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66 69  hen the .** affi
02e0: 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f 6c  nity of that col
02f0: 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  umn is returned.
0300: 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30 30   Otherwise, 0x00
0310: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a   is returned,.**
0320: 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 61   indicating no a
0330: 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65 20  ffinity for the 
0340: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
0350: 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52 45  * i.e. the WHERE
0360: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69   clause expressi
0370: 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ons in the follo
0380: 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
0390: 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20 61  all.** have an a
03a0: 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20 43  ffinity:.**.** C
03b0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
03c0: 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  );.** SELECT * F
03d0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b 0a  ROM t1 WHERE a;.
03e0: 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20 62  ** SELECT a AS b
03f0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62   FROM t1 WHERE b
0400: 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46 52  ;.** SELECT * FR
0410: 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65 6c  OM t1 WHERE (sel
0420: 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b 0a  ect a from t1);.
0430: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 45  */.char sqlite3E
0440: 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70 72  xprAffinity(Expr
0450: 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
0460: 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71  op;.  pExpr = sq
0470: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
0480: 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20 69  late(pExpr);.  i
0490: 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
04a0: 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20 72  & EP_Generic ) r
04b0: 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d 20  eturn 0;.  op = 
04c0: 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28  pExpr->op;.  if(
04d0: 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29   op==TK_SELECT )
04e0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
04f0: 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78 49  xpr->flags&EP_xI
0500: 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20 72  sSelect );.    r
0510: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
0520: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  rAffinity(pExpr-
0530: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
0540: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
0550: 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
0560: 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20  ITE_OMIT_CAST.  
0570: 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 54 20  if( op==TK_CAST 
0580: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
0590: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
05a0: 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
05b0: 75 65 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ue) );.    retur
05c0: 6e 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  n sqlite3Affinit
05d0: 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a  yType(pExpr->u.z
05e0: 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 7d 0a 23  Token, 0);.  }.#
05f0: 65 6e 64 69 66 0a 20 20 69 66 28 20 28 6f 70 3d  endif.  if( (op=
0600: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c  =TK_AGG_COLUMN |
0610: 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  | op==TK_COLUMN 
0620: 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  || op==TK_REGIST
0630: 45 52 29 20 0a 20 20 20 26 26 20 70 45 78 70 72  ER) .   && pExpr
0640: 2d 3e 70 54 61 62 21 3d 30 0a 20 20 29 7b 0a 20  ->pTab!=0.  ){. 
0650: 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47     /* op==TK_REG
0660: 49 53 54 45 52 20 26 26 20 70 45 78 70 72 2d 3e  ISTER && pExpr->
0670: 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e 73 20  pTab!=0 happens 
0680: 77 68 65 6e 20 70 45 78 70 72 20 77 61 73 20 6f  when pExpr was o
0690: 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20 2a 2a  riginally.    **
06a0: 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75 74   a TK_COLUMN but
06b0: 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
06c0: 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 63 61  evaluated and ca
06d0: 63 68 65 64 20 69 6e 20 61 20 72 65 67 69 73 74  ched in a regist
06e0: 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 20  er */.    int j 
06f0: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
0700: 3b 0a 20 20 20 20 69 66 28 20 6a 3c 30 20 29 20  ;.    if( j<0 ) 
0710: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46  return SQLITE_AF
0720: 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 61  F_INTEGER;.    a
0730: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 54  ssert( pExpr->pT
0740: 61 62 20 26 26 20 6a 3c 70 45 78 70 72 2d 3e 70  ab && j<pExpr->p
0750: 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
0760: 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 70   return pExpr->p
0770: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66  Tab->aCol[j].aff
0780: 69 6e 69 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74  inity;.  }.  ret
0790: 75 72 6e 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  urn pExpr->affin
07a0: 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ity;.}../*.** Se
07b0: 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  t the collating 
07c0: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65 78 70  sequence for exp
07d0: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 74 6f  ression pExpr to
07e0: 20 62 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e   be the collatin
07f0: 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 6e 61  g.** sequence na
0800: 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e 2e 20 20  med by pToken.  
0810: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
0820: 72 20 74 6f 20 61 20 6e 65 77 20 45 78 70 72 20  r to a new Expr 
0830: 6e 6f 64 65 20 74 68 61 74 0a 2a 2a 20 69 6d 70  node that.** imp
0840: 6c 65 6d 65 6e 74 73 20 74 68 65 20 43 4f 4c 4c  lements the COLL
0850: 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  ATE operator..**
0860: 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
0870: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
0880: 20 6f 63 63 75 72 73 2c 20 74 68 61 74 20 66 61   occurs, that fa
0890: 63 74 20 69 73 20 72 65 63 6f 72 64 65 64 20 69  ct is recorded i
08a0: 6e 20 70 50 61 72 73 65 2d 3e 64 62 0a 2a 2a 20  n pParse->db.** 
08b0: 61 6e 64 20 74 68 65 20 70 45 78 70 72 20 70 61  and the pExpr pa
08c0: 72 61 6d 65 74 65 72 20 69 73 20 72 65 74 75 72  rameter is retur
08d0: 6e 65 64 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  ned unchanged..*
08e0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
08f0: 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b  xprAddCollateTok
0900: 65 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  en(.  Parse *pPa
0910: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rse,           /
0920: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
0930: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
0940: 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pr,             
0950: 2f 2a 20 41 64 64 20 74 68 65 20 22 43 4f 4c 4c  /* Add the "COLL
0960: 41 54 45 22 20 63 6c 61 75 73 65 20 74 6f 20 74  ATE" clause to t
0970: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  his expression *
0980: 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  /.  const Token 
0990: 2a 70 43 6f 6c 6c 4e 61 6d 65 2c 20 20 2f 2a 20  *pCollName,  /* 
09a0: 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6e  Name of collatin
09b0: 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20  g sequence */.  
09c0: 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20  int dequote     
09d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
09e0: 20 74 6f 20 64 65 71 75 6f 74 65 20 70 43 6f 6c   to dequote pCol
09f0: 6c 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 66  lName */.){.  if
0a00: 28 20 70 43 6f 6c 6c 4e 61 6d 65 2d 3e 6e 3e 30  ( pCollName->n>0
0a10: 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e   ){.    Expr *pN
0a20: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
0a30: 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
0a40: 2c 20 54 4b 5f 43 4f 4c 4c 41 54 45 2c 20 70 43  , TK_COLLATE, pC
0a50: 6f 6c 6c 4e 61 6d 65 2c 20 64 65 71 75 6f 74 65  ollName, dequote
0a60: 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20  );.    if( pNew 
0a70: 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  ){.      pNew->p
0a80: 4c 65 66 74 20 3d 20 70 45 78 70 72 3b 0a 20 20  Left = pExpr;.  
0a90: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
0aa0: 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 7c 45 50  |= EP_Collate|EP
0ab0: 5f 53 6b 69 70 3b 0a 20 20 20 20 20 20 70 45 78  _Skip;.      pEx
0ac0: 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d  pr = pNew;.    }
0ad0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45  .  }.  return pE
0ae0: 78 70 72 3b 0a 7d 0a 45 78 70 72 20 2a 73 71 6c  xpr;.}.Expr *sql
0af0: 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61  ite3ExprAddColla
0b00: 74 65 53 74 72 69 6e 67 28 50 61 72 73 65 20 2a  teString(Parse *
0b10: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
0b20: 78 70 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  xpr, const char 
0b30: 2a 7a 43 29 7b 0a 20 20 54 6f 6b 65 6e 20 73 3b  *zC){.  Token s;
0b40: 0a 20 20 61 73 73 65 72 74 28 20 7a 43 21 3d 30  .  assert( zC!=0
0b50: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 6f 6b   );.  sqlite3Tok
0b60: 65 6e 49 6e 69 74 28 26 73 2c 20 28 63 68 61 72  enInit(&s, (char
0b70: 2a 29 7a 43 29 3b 0a 20 20 72 65 74 75 72 6e 20  *)zC);.  return 
0b80: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
0b90: 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73  llateToken(pPars
0ba0: 65 2c 20 70 45 78 70 72 2c 20 26 73 2c 20 30 29  e, pExpr, &s, 0)
0bb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6b 69 70 20  ;.}../*.** Skip 
0bc0: 6f 76 65 72 20 61 6e 79 20 54 4b 5f 43 4f 4c 4c  over any TK_COLL
0bd0: 41 54 45 20 6f 70 65 72 61 74 6f 72 73 20 61 6e  ATE operators an
0be0: 64 20 61 6e 79 20 75 6e 6c 69 6b 65 6c 79 28 29  d any unlikely()
0bf0: 0a 2a 2a 20 6f 72 20 6c 69 6b 65 6c 69 68 6f 6f  .** or likelihoo
0c00: 64 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 74 20  d() function at 
0c10: 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20 65  the root of an e
0c20: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 45 78  xpression..*/.Ex
0c30: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 53  pr *sqlite3ExprS
0c40: 6b 69 70 43 6f 6c 6c 61 74 65 28 45 78 70 72 20  kipCollate(Expr 
0c50: 2a 70 45 78 70 72 29 7b 0a 20 20 77 68 69 6c 65  *pExpr){.  while
0c60: 28 20 70 45 78 70 72 20 26 26 20 45 78 70 72 48  ( pExpr && ExprH
0c70: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
0c80: 2c 20 45 50 5f 53 6b 69 70 29 20 29 7b 0a 20 20  , EP_Skip) ){.  
0c90: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
0ca0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
0cb0: 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20 20 20  Unlikely) ){.   
0cc0: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
0cd0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
0ce0: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
0cf0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
0d00: 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ( pExpr->x.pList
0d10: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20  ->nExpr>0 );.   
0d20: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
0d30: 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op==TK_FUNCTIO
0d40: 4e 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  N );.      pExpr
0d50: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
0d60: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
0d70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
0d80: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
0d90: 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b  p==TK_COLLATE );
0da0: 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70  .      pExpr = p
0db0: 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
0dc0: 20 7d 0a 20 20 7d 20 20 20 0a 20 20 72 65 74 75   }.  }   .  retu
0dd0: 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a  rn pExpr;.}../*.
0de0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f  ** Return the co
0df0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
0e00: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
0e10: 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a 2a  ion pExpr. If.**
0e20: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66   there is no def
0e30: 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ined collating s
0e40: 65 71 75 65 6e 63 65 2c 20 72 65 74 75 72 6e 20  equence, return 
0e50: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  NULL..**.** The 
0e60: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
0e70: 63 65 20 6d 69 67 68 74 20 62 65 20 64 65 74 65  ce might be dete
0e80: 72 6d 69 6e 65 64 20 62 79 20 61 20 43 4f 4c 4c  rmined by a COLL
0e90: 41 54 45 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20  ATE operator.** 
0ea0: 6f 72 20 62 79 20 74 68 65 20 70 72 65 73 65 6e  or by the presen
0eb0: 63 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 77  ce of a column w
0ec0: 69 74 68 20 61 20 64 65 66 69 6e 65 64 20 63 6f  ith a defined co
0ed0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
0ee0: 2e 0a 2a 2a 20 43 4f 4c 4c 41 54 45 20 6f 70 65  ..** COLLATE ope
0ef0: 72 61 74 6f 72 73 20 74 61 6b 65 20 66 69 72 73  rators take firs
0f00: 74 20 70 72 65 63 65 64 65 6e 63 65 2e 20 20 4c  t precedence.  L
0f10: 65 66 74 20 6f 70 65 72 61 6e 64 73 20 74 61 6b  eft operands tak
0f20: 65 0a 2a 2a 20 70 72 65 63 65 64 65 6e 63 65 20  e.** precedence 
0f30: 6f 76 65 72 20 72 69 67 68 74 20 6f 70 65 72 61  over right opera
0f40: 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  nds..*/.CollSeq 
0f50: 2a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c  *sqlite3ExprColl
0f60: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
0f70: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
0f80: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
0f90: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 43   pParse->db;.  C
0fa0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
0fb0: 30 3b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20 70  0;.  Expr *p = p
0fc0: 45 78 70 72 3b 0a 20 20 77 68 69 6c 65 28 20 70  Expr;.  while( p
0fd0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d   ){.    int op =
0fe0: 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 69 66 28 20   p->op;.    if( 
0ff0: 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 47 65  p->flags & EP_Ge
1000: 6e 65 72 69 63 20 29 20 62 72 65 61 6b 3b 0a 20  neric ) break;. 
1010: 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41     if( op==TK_CA
1020: 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 4c  ST || op==TK_UPL
1030: 55 53 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20  US ){.      p = 
1040: 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  p->pLeft;.      
1050: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
1060: 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43      if( op==TK_C
1070: 4f 4c 4c 41 54 45 20 7c 7c 20 28 6f 70 3d 3d 54  OLLATE || (op==T
1080: 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 2d  K_REGISTER && p-
1090: 3e 6f 70 32 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  >op2==TK_COLLATE
10a0: 29 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  ) ){.      pColl
10b0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c   = sqlite3GetCol
10c0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 45 4e 43  lSeq(pParse, ENC
10d0: 28 64 62 29 2c 20 30 2c 20 70 2d 3e 75 2e 7a 54  (db), 0, p->u.zT
10e0: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  oken);.      bre
10f0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
1100: 28 20 28 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  ( (op==TK_AGG_CO
1110: 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43  LUMN || op==TK_C
1120: 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20 20 20  OLUMN.          
1130: 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  || op==TK_REGIST
1140: 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 54 52 49  ER || op==TK_TRI
1150: 47 47 45 52 29 0a 20 20 20 20 20 26 26 20 70 2d  GGER).     && p-
1160: 3e 70 54 61 62 21 3d 30 0a 20 20 20 20 29 7b 0a  >pTab!=0.    ){.
1170: 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f        /* op==TK_
1180: 52 45 47 49 53 54 45 52 20 26 26 20 70 2d 3e 70  REGISTER && p->p
1190: 54 61 62 21 3d 30 20 68 61 70 70 65 6e 73 20 77  Tab!=0 happens w
11a0: 68 65 6e 20 70 45 78 70 72 20 77 61 73 20 6f 72  hen pExpr was or
11b0: 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20 20 20 2a  iginally.      *
11c0: 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75  * a TK_COLUMN bu
11d0: 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  t was previously
11e0: 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 63   evaluated and c
11f0: 61 63 68 65 64 20 69 6e 20 61 20 72 65 67 69 73  ached in a regis
1200: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ter */.      int
1210: 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b   j = p->iColumn;
1220: 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 30 20  .      if( j>=0 
1230: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
1240: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
1250: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ->pTab->aCol[j].
1260: 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  zColl;.        p
1270: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
1280: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e  ndCollSeq(db, EN
1290: 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29  C(db), zColl, 0)
12a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
12c0: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
12d0: 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  EP_Collate ){.  
12e0: 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74      if( p->pLeft
12f0: 20 26 26 20 28 70 2d 3e 70 4c 65 66 74 2d 3e 66   && (p->pLeft->f
1300: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
1310: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)!=0 ){.       
1320: 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20   p = p->pLeft;. 
1330: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1340: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 78 74 20      Expr *pNext 
1350: 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20   = p->pRight;.  
1360: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 45 78 70        /* The Exp
1370: 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20 6e 65 76  r.x union is nev
1380: 65 72 20 75 73 65 64 20 61 74 20 74 68 65 20 73  er used at the s
1390: 61 6d 65 20 74 69 6d 65 20 61 73 20 45 78 70 72  ame time as Expr
13a0: 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20 20 20 20  .pRight */.     
13b0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e     assert( p->x.
13c0: 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70  pList==0 || p->p
13d0: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
13e0: 20 20 20 20 2f 2a 20 70 2d 3e 66 6c 61 67 73 20      /* p->flags 
13f0: 68 6f 6c 64 73 20 45 50 5f 43 6f 6c 6c 61 74 65  holds EP_Collate
1400: 20 61 6e 64 20 70 2d 3e 70 4c 65 66 74 2d 3e 66   and p->pLeft->f
1410: 6c 61 67 73 20 64 6f 65 73 20 6e 6f 74 2e 20 20  lags does not.  
1420: 41 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  And.        ** p
1430: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 63 61 6e 6e  ->x.pSelect cann
1440: 6f 74 2e 20 20 53 6f 20 69 66 20 70 2d 3e 78 2e  ot.  So if p->x.
1450: 70 4c 65 66 74 20 65 78 69 73 74 73 2c 20 69 74  pLeft exists, it
1460: 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 0a 20 20   must hold at.  
1470: 20 20 20 20 20 20 2a 2a 20 6c 65 61 73 74 20 6f        ** least o
1480: 6e 65 20 45 50 5f 43 6f 6c 6c 61 74 65 2e 20 54  ne EP_Collate. T
1490: 68 75 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  hus the followin
14a0: 67 20 74 77 6f 20 41 4c 57 41 59 53 2e 20 2a 2f  g two ALWAYS. */
14b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
14c0: 78 2e 70 4c 69 73 74 21 3d 30 20 26 26 20 41 4c  x.pList!=0 && AL
14d0: 57 41 59 53 28 21 45 78 70 72 48 61 73 50 72 6f  WAYS(!ExprHasPro
14e0: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
14f0: 65 6c 65 63 74 29 29 20 29 7b 0a 20 20 20 20 20  elect)) ){.     
1500: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
1510: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 41        for(i=0; A
1520: 4c 57 41 59 53 28 69 3c 70 2d 3e 78 2e 70 4c 69  LWAYS(i<p->x.pLi
1530: 73 74 2d 3e 6e 45 78 70 72 29 3b 20 69 2b 2b 29  st->nExpr); i++)
1540: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
1550: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
1560: 79 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  y(p->x.pList->a[
1570: 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f 43 6f 6c  i].pExpr, EP_Col
1580: 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20 20  late) ){.       
1590: 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70         pNext = p
15a0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ->x.pList->a[i].
15b0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
15c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
15f0: 20 20 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78          p = pNex
1600: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
1610: 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65 61  else{.      brea
1620: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
1630: 66 28 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43  f( sqlite3CheckC
1640: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
1650: 43 6f 6c 6c 29 20 29 7b 20 0a 20 20 20 20 70 43  Coll) ){ .    pC
1660: 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  oll = 0;.  }.  r
1670: 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a  eturn pColl;.}..
1680: 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61  /*.** pExpr is a
1690: 6e 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 63  n operand of a c
16a0: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
16b0: 6f 72 2e 20 20 61 66 66 32 20 69 73 20 74 68 65  or.  aff2 is the
16c0: 0a 2a 2a 20 74 79 70 65 20 61 66 66 69 6e 69 74  .** type affinit
16d0: 79 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 6f  y of the other o
16e0: 70 65 72 61 6e 64 2e 20 20 54 68 69 73 20 72 6f  perand.  This ro
16f0: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
1700: 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69 6e 69  e.** type affini
1710: 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  ty that should b
1720: 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 63  e used for the c
1730: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
1740: 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69  or..*/.char sqli
1750: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
1760: 74 79 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20  ty(Expr *pExpr, 
1770: 63 68 61 72 20 61 66 66 32 29 7b 0a 20 20 63 68  char aff2){.  ch
1780: 61 72 20 61 66 66 31 20 3d 20 73 71 6c 69 74 65  ar aff1 = sqlite
1790: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45  3ExprAffinity(pE
17a0: 78 70 72 29 3b 0a 20 20 69 66 28 20 61 66 66 31  xpr);.  if( aff1
17b0: 20 26 26 20 61 66 66 32 20 29 7b 0a 20 20 20 20   && aff2 ){.    
17c0: 2f 2a 20 42 6f 74 68 20 73 69 64 65 73 20 6f 66  /* Both sides of
17d0: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
17e0: 61 72 65 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 20  are columns. If 
17f0: 6f 6e 65 20 68 61 73 20 6e 75 6d 65 72 69 63 0a  one has numeric.
1800: 20 20 20 20 2a 2a 20 61 66 66 69 6e 69 74 79 2c      ** affinity,
1810: 20 75 73 65 20 74 68 61 74 2e 20 4f 74 68 65 72   use that. Other
1820: 77 69 73 65 20 75 73 65 20 6e 6f 20 61 66 66 69  wise use no affi
1830: 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  nity..    */.   
1840: 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 4e 75   if( sqlite3IsNu
1850: 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 61 66  mericAffinity(af
1860: 66 31 29 20 7c 7c 20 73 71 6c 69 74 65 33 49 73  f1) || sqlite3Is
1870: 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28  NumericAffinity(
1880: 61 66 66 32 29 20 29 7b 0a 20 20 20 20 20 20 72  aff2) ){.      r
1890: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
18a0: 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 65  _NUMERIC;.    }e
18b0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
18c0: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  n SQLITE_AFF_BLO
18d0: 42 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  B;.    }.  }else
18e0: 20 69 66 28 20 21 61 66 66 31 20 26 26 20 21 61   if( !aff1 && !a
18f0: 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65  ff2 ){.    /* Ne
1900: 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 74 68  ither side of th
1910: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  e comparison is 
1920: 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61  a column.  Compa
1930: 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65  re the.    ** re
1940: 73 75 6c 74 73 20 64 69 72 65 63 74 6c 79 2e 0a  sults directly..
1950: 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72      */.    retur
1960: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  n SQLITE_AFF_BLO
1970: 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  B;.  }else{.    
1980: 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69 73 20 61  /* One side is a
1990: 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 6f 74 68   column, the oth
19a0: 65 72 20 69 73 20 6e 6f 74 2e 20 55 73 65 20 74  er is not. Use t
19b0: 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e  he columns affin
19c0: 69 74 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ity. */.    asse
19d0: 72 74 28 20 61 66 66 31 3d 3d 30 20 7c 7c 20 61  rt( aff1==0 || a
19e0: 66 66 32 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  ff2==0 );.    re
19f0: 74 75 72 6e 20 28 61 66 66 31 20 2b 20 61 66 66  turn (aff1 + aff
1a00: 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  2);.  }.}../*.**
1a10: 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70   pExpr is a comp
1a20: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e  arison operator.
1a30: 20 20 52 65 74 75 72 6e 20 74 68 65 20 74 79 70    Return the typ
1a40: 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20  e affinity that 
1a50: 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 61 70 70  should.** be app
1a60: 6c 69 65 64 20 74 6f 20 62 6f 74 68 20 6f 70 65  lied to both ope
1a70: 72 61 6e 64 73 20 70 72 69 6f 72 20 74 6f 20 64  rands prior to d
1a80: 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70 61 72 69  oing the compari
1a90: 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  son..*/.static c
1aa0: 68 61 72 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66  har comparisonAf
1ab0: 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78  finity(Expr *pEx
1ac0: 70 72 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b  pr){.  char aff;
1ad0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
1ae0: 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70  ->op==TK_EQ || p
1af0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20  Expr->op==TK_IN 
1b00: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
1b10: 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  _LT ||.         
1b20: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
1b30: 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  T || pExpr->op==
1b40: 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_GE || pExpr->
1b50: 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20  op==TK_LE ||.   
1b60: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
1b70: 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70 45 78 70 72  ==TK_NE || pExpr
1b80: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70  ->op==TK_IS || p
1b90: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e  Expr->op==TK_ISN
1ba0: 4f 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OT );.  assert( 
1bb0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a  pExpr->pLeft );.
1bc0: 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 45    aff = sqlite3E
1bd0: 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70  xprAffinity(pExp
1be0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  r->pLeft);.  if(
1bf0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29   pExpr->pRight )
1c00: 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69  {.    aff = sqli
1c10: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
1c20: 74 79 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  ty(pExpr->pRight
1c30: 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20  , aff);.  }else 
1c40: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
1c50: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
1c60: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
1c70: 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d  aff = sqlite3Com
1c80: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78  pareAffinity(pEx
1c90: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70  pr->x.pSelect->p
1ca0: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
1cb0: 72 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65  r, aff);.  }else
1cc0: 20 69 66 28 20 21 61 66 66 20 29 7b 0a 20 20 20   if( !aff ){.   
1cd0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
1ce0: 46 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20 72 65  F_BLOB;.  }.  re
1cf0: 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a  turn aff;.}../*.
1d00: 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63 6f  ** pExpr is a co
1d10: 6d 70 61 72 69 73 6f 6e 20 65 78 70 72 65 73 73  mparison express
1d20: 69 6f 6e 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c  ion, eg. '=', '<
1d30: 27 2c 20 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a  ', IN(...) etc..
1d40: 2a 2a 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20  ** idx_affinity 
1d50: 69 73 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  is the affinity 
1d60: 6f 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f  of an indexed co
1d70: 6c 75 6d 6e 2e 20 52 65 74 75 72 6e 20 74 72 75  lumn. Return tru
1d80: 65 0a 2a 2a 20 69 66 20 74 68 65 20 69 6e 64 65  e.** if the inde
1d90: 78 20 77 69 74 68 20 61 66 66 69 6e 69 74 79 20  x with affinity 
1da0: 69 64 78 5f 61 66 66 69 6e 69 74 79 20 6d 61 79  idx_affinity may
1db0: 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   be used to impl
1dc0: 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d  ement.** the com
1dd0: 70 61 72 69 73 6f 6e 20 69 6e 20 70 45 78 70 72  parison in pExpr
1de0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1df0: 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28  IndexAffinityOk(
1e00: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61  Expr *pExpr, cha
1e10: 72 20 69 64 78 5f 61 66 66 69 6e 69 74 79 29 7b  r idx_affinity){
1e20: 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f  .  char aff = co
1e30: 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79  mparisonAffinity
1e40: 28 70 45 78 70 72 29 3b 0a 20 20 73 77 69 74 63  (pExpr);.  switc
1e50: 68 28 20 61 66 66 20 29 7b 0a 20 20 20 20 63 61  h( aff ){.    ca
1e60: 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  se SQLITE_AFF_BL
1e70: 4f 42 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  OB:.      return
1e80: 20 31 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   1;.    case SQL
1e90: 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20  ITE_AFF_TEXT:.  
1ea0: 20 20 20 20 72 65 74 75 72 6e 20 69 64 78 5f 61      return idx_a
1eb0: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
1ec0: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 64 65  AFF_TEXT;.    de
1ed0: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74  fault:.      ret
1ee0: 75 72 6e 20 73 71 6c 69 74 65 33 49 73 4e 75 6d  urn sqlite3IsNum
1ef0: 65 72 69 63 41 66 66 69 6e 69 74 79 28 69 64 78  ericAffinity(idx
1f00: 5f 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d 0a  _affinity);.  }.
1f10: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1f20: 74 68 65 20 50 35 20 76 61 6c 75 65 20 74 68 61  the P5 value tha
1f30: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
1f40: 20 66 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f   for a binary co
1f50: 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f  mparison.** opco
1f60: 64 65 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65  de (OP_Eq, OP_Ge
1f70: 20 65 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63   etc.) used to c
1f80: 6f 6d 70 61 72 65 20 70 45 78 70 72 31 20 61 6e  ompare pExpr1 an
1f90: 64 20 70 45 78 70 72 32 2e 0a 2a 2f 0a 73 74 61  d pExpr2..*/.sta
1fa0: 74 69 63 20 75 38 20 62 69 6e 61 72 79 43 6f 6d  tic u8 binaryCom
1fb0: 70 61 72 65 50 35 28 45 78 70 72 20 2a 70 45 78  pareP5(Expr *pEx
1fc0: 70 72 31 2c 20 45 78 70 72 20 2a 70 45 78 70 72  pr1, Expr *pExpr
1fd0: 32 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  2, int jumpIfNul
1fe0: 6c 29 7b 0a 20 20 75 38 20 61 66 66 20 3d 20 28  l){.  u8 aff = (
1ff0: 63 68 61 72 29 73 71 6c 69 74 65 33 45 78 70 72  char)sqlite3Expr
2000: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 32 29  Affinity(pExpr2)
2010: 3b 0a 20 20 61 66 66 20 3d 20 28 75 38 29 73 71  ;.  aff = (u8)sq
2020: 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
2030: 6e 69 74 79 28 70 45 78 70 72 31 2c 20 61 66 66  nity(pExpr1, aff
2040: 29 20 7c 20 28 75 38 29 6a 75 6d 70 49 66 4e 75  ) | (u8)jumpIfNu
2050: 6c 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 66 66  ll;.  return aff
2060: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2070: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
2080: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
2090: 75 65 6e 63 65 20 74 68 61 74 20 73 68 6f 75 6c  uence that shoul
20a0: 64 20 62 65 20 75 73 65 64 20 62 79 0a 2a 2a 20  d be used by.** 
20b0: 61 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69  a binary compari
20c0: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f 6d  son operator com
20d0: 70 61 72 69 6e 67 20 70 4c 65 66 74 20 61 6e 64  paring pLeft and
20e0: 20 70 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49   pRight..**.** I
20f0: 66 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20  f the left hand 
2100: 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61  expression has a
2110: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
2120: 6e 63 65 20 74 79 70 65 2c 20 74 68 65 6e 20 69  nce type, then i
2130: 74 20 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f 74  t is.** used. Ot
2140: 68 65 72 77 69 73 65 20 74 68 65 20 63 6f 6c 6c  herwise the coll
2150: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
2160: 6f 72 20 74 68 65 20 72 69 67 68 74 20 68 61 6e  or the right han
2170: 64 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  d expression.** 
2180: 69 73 20 75 73 65 64 2c 20 6f 72 20 74 68 65 20  is used, or the 
2190: 64 65 66 61 75 6c 74 20 28 42 49 4e 41 52 59 29  default (BINARY)
21a0: 20 69 66 20 6e 65 69 74 68 65 72 20 65 78 70 72   if neither expr
21b0: 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c  ession has a col
21c0: 6c 61 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a  lating.** type..
21d0: 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  **.** Argument p
21e0: 52 69 67 68 74 20 28 62 75 74 20 6e 6f 74 20 70  Right (but not p
21f0: 4c 65 66 74 29 20 6d 61 79 20 62 65 20 61 20 6e  Left) may be a n
2200: 75 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 49 6e 20  ull pointer. In 
2210: 74 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 74  this case,.** it
2220: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72   is not consider
2230: 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a  ed..*/.CollSeq *
2240: 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d  sqlite3BinaryCom
2250: 70 61 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 50  pareCollSeq(.  P
2260: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20  arse *pParse, . 
2270: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 0a 20   Expr *pLeft, . 
2280: 20 45 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b   Expr *pRight.){
2290: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
22a0: 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65  l;.  assert( pLe
22b0: 66 74 20 29 3b 0a 20 20 69 66 28 20 70 4c 65 66  ft );.  if( pLef
22c0: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  t->flags & EP_Co
22d0: 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 70 43 6f  llate ){.    pCo
22e0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
22f0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
2300: 70 4c 65 66 74 29 3b 0a 20 20 7d 65 6c 73 65 20  pLeft);.  }else 
2310: 69 66 28 20 70 52 69 67 68 74 20 26 26 20 28 70  if( pRight && (p
2320: 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45  Right->flags & E
2330: 50 5f 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b  P_Collate)!=0 ){
2340: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
2350: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
2360: 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b  pParse, pRight);
2370: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43  .  }else{.    pC
2380: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
2390: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
23a0: 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28   pLeft);.    if(
23b0: 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
23c0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
23d0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
23e0: 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  se, pRight);.   
23f0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2400: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pColl;.}../*.** 
2410: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
2420: 72 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  r a comparison o
2430: 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74  perator..*/.stat
2440: 69 63 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70 61  ic int codeCompa
2450: 72 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  re(.  Parse *pPa
2460: 72 73 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 70  rse,    /* The p
2470: 61 72 73 69 6e 67 20 28 61 6e 64 20 63 6f 64 65  arsing (and code
2480: 20 67 65 6e 65 72 61 74 69 6e 67 29 20 63 6f 6e   generating) con
2490: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
24a0: 70 4c 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54  pLeft,      /* T
24b0: 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20  he left operand 
24c0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  */.  Expr *pRigh
24d0: 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69  t,     /* The ri
24e0: 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  ght operand */. 
24f0: 20 69 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20 20   int opcode,    
2500: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72     /* The compar
2510: 69 73 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  ison opcode */. 
2520: 20 69 6e 74 20 69 6e 31 2c 20 69 6e 74 20 69 6e   int in1, int in
2530: 32 2c 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68  2, /* Register h
2540: 6f 6c 64 69 6e 67 20 6f 70 65 72 61 6e 64 73 20  olding operands 
2550: 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20  */.  int dest,  
2560: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
2570: 65 72 65 20 69 66 20 74 72 75 65 2e 20 20 2a 2f  ere if true.  */
2580: 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  .  int jumpIfNul
2590: 6c 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c  l    /* If true,
25a0: 20 6a 75 6d 70 20 69 66 20 65 69 74 68 65 72 20   jump if either 
25b0: 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20  operand is NULL 
25c0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 35 3b 0a  */.){.  int p5;.
25d0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 43 6f    int addr;.  Co
25e0: 6c 6c 53 65 71 20 2a 70 34 3b 0a 0a 20 20 70 34  llSeq *p4;..  p4
25f0: 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
2600: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
2610: 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52  Parse, pLeft, pR
2620: 69 67 68 74 29 3b 0a 20 20 70 35 20 3d 20 62 69  ight);.  p5 = bi
2630: 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28 70 4c  naryCompareP5(pL
2640: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 6a 75 6d  eft, pRight, jum
2650: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72  pIfNull);.  addr
2660: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2670: 64 4f 70 34 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp4(pParse->pVd
2680: 62 65 2c 20 6f 70 63 6f 64 65 2c 20 69 6e 32 2c  be, opcode, in2,
2690: 20 64 65 73 74 2c 20 69 6e 31 2c 0a 20 20 20 20   dest, in1,.    
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b0: 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 34         (void*)p4
26c0: 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
26d0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
26e0: 67 65 50 35 28 70 50 61 72 73 65 2d 3e 70 56 64  geP5(pParse->pVd
26f0: 62 65 2c 20 28 75 38 29 70 35 29 3b 0a 20 20 72  be, (u8)p5);.  r
2700: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
2710: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
2720: 20 69 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70   if expression p
2730: 45 78 70 72 20 69 73 20 61 20 76 65 63 74 6f 72  Expr is a vector
2740: 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
2750: 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  wise..*/.int sql
2760: 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72  ite3ExprIsVector
2770: 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20  (Expr *pExpr){. 
2780: 20 72 65 74 75 72 6e 20 28 20 28 70 45 78 70 72   return ( (pExpr
2790: 2d 3e 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 29  ->op==TK_VECTOR)
27a0: 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 45 78  .        || (pEx
27b0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
27c0: 54 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 53  T && pExpr->x.pS
27d0: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  elect->pEList->n
27e0: 45 78 70 72 3e 31 29 0a 20 20 29 3b 0a 7d 0a 0a  Expr>1).  );.}..
27f0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
2800: 72 65 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61  ression passed a
2810: 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
2820: 65 6e 74 20 69 73 20 6f 66 20 74 79 70 65 20 54  ent is of type T
2830: 4b 5f 56 45 43 54 4f 52 20 0a 2a 2a 20 72 65 74  K_VECTOR .** ret
2840: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
2850: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  f expressions in
2860: 20 74 68 65 20 76 65 63 74 6f 72 2e 20 4f 72 2c   the vector. Or,
2870: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
2880: 6f 6e 0a 2a 2a 20 69 73 20 61 20 73 75 62 2d 73  on.** is a sub-s
2890: 65 6c 65 63 74 2c 20 72 65 74 75 72 6e 20 74 68  elect, return th
28a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
28b0: 6d 6e 73 20 69 6e 20 74 68 65 20 73 75 62 2d 73  mns in the sub-s
28c0: 65 6c 65 63 74 2e 20 46 6f 72 0a 2a 2a 20 61 6e  elect. For.** an
28d0: 79 20 6f 74 68 65 72 20 74 79 70 65 20 6f 66 20  y other type of 
28e0: 65 78 70 72 65 73 73 69 6f 6e 2c 20 72 65 74 75  expression, retu
28f0: 72 6e 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rn 1..*/.int sql
2900: 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
2910: 7a 65 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b  ze(Expr *pExpr){
2920: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
2930: 70 72 49 73 56 65 63 74 6f 72 28 70 45 78 70 72  prIsVector(pExpr
2940: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
2950: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c  .  if( pExpr->fl
2960: 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65  ags & EP_xIsSele
2970: 63 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ct ){.    return
2980: 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
2990: 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
29a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
29b0: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
29c0: 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  Expr;.}../*.** I
29d0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
29e0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
29f0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
2a00: 20 61 20 54 4b 5f 56 45 43 54 4f 52 2c 20 72 65   a TK_VECTOR, re
2a10: 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65  turn.** a pointe
2a20: 72 20 74 6f 20 74 68 65 20 69 27 74 68 20 66 69  r to the i'th fi
2a30: 65 6c 64 20 6f 66 20 74 68 65 20 76 65 63 74 6f  eld of the vecto
2a40: 72 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 66 69  r. Or, if the fi
2a50: 72 73 74 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  rst argument.** 
2a60: 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 75 62 2d  points to a sub-
2a70: 73 65 6c 65 63 74 20 74 68 61 74 20 72 65 74 75  select that retu
2a80: 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  rns more than on
2a90: 65 20 63 6f 6c 75 6d 6e 2c 20 72 65 74 75 72 6e  e column, return
2aa0: 20 61 20 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74   a .** pointer t
2ab0: 6f 20 74 68 65 20 69 27 74 68 20 72 65 74 75 72  o the i'th retur
2ac0: 6e 65 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  ned column value
2ad0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  . Otherwise, ret
2ae0: 75 72 6e 20 61 20 63 6f 70 79 20 0a 2a 2a 20 6f  urn a copy .** o
2af0: 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  f the first argu
2b00: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
2b10: 45 78 70 72 20 2a 65 78 70 72 56 65 63 74 6f 72  Expr *exprVector
2b20: 46 69 65 6c 64 28 45 78 70 72 20 2a 70 56 65 63  Field(Expr *pVec
2b30: 74 6f 72 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61  tor, int i){.  a
2b40: 73 73 65 72 74 28 20 69 3c 73 71 6c 69 74 65 33  ssert( i<sqlite3
2b50: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
2b60: 56 65 63 74 6f 72 29 20 29 3b 0a 20 20 69 66 28  Vector) );.  if(
2b70: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65   sqlite3ExprIsVe
2b80: 63 74 6f 72 28 70 56 65 63 74 6f 72 29 20 29 7b  ctor(pVector) ){
2b90: 0a 20 20 20 20 69 66 28 20 70 56 65 63 74 6f 72  .    if( pVector
2ba0: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
2bb0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2bc0: 70 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65  pVector->x.pSele
2bd0: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  ct->pEList->a[i]
2be0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73  .pExpr;.    }els
2bf0: 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
2c00: 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74  pVector->x.pList
2c10: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
2c20: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2c30: 20 70 56 65 63 74 6f 72 3b 0a 7d 0a 0a 2f 2a 0a   pVector;.}../*.
2c40: 2a 2a 20 49 66 20 65 78 70 72 65 73 73 69 6f 6e  ** If expression
2c50: 20 70 45 78 70 72 20 69 73 20 6f 66 20 74 79 70   pExpr is of typ
2c60: 65 20 54 4b 5f 53 45 4c 45 43 54 2c 20 67 65 6e  e TK_SELECT, gen
2c70: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76  erate code to ev
2c80: 61 6c 75 61 74 65 0a 2a 2a 20 69 74 2e 20 52 65  aluate.** it. Re
2c90: 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65  turn the registe
2ca0: 72 20 69 6e 20 77 68 69 63 68 20 74 68 65 20 72  r in which the r
2cb0: 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64 20  esult is stored 
2cc0: 28 6f 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20  (or, if the .** 
2cd0: 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72  sub-select retur
2ce0: 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ns more than one
2cf0: 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 66 69 72   column, the fir
2d00: 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79 0a 2a  st in an array.*
2d10: 2a 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 69  * of registers i
2d20: 6e 20 77 68 69 63 68 20 74 68 65 20 72 65 73 75  n which the resu
2d30: 6c 74 20 69 73 20 73 74 6f 72 65 64 29 2e 0a 2a  lt is stored)..*
2d40: 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73  *.** If pExpr is
2d50: 20 6e 6f 74 20 61 20 54 4b 5f 53 45 4c 45 43 54   not a TK_SELECT
2d60: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 72 65 74   expression, ret
2d70: 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63  urn 0..*/.static
2d80: 20 69 6e 74 20 65 78 70 72 43 6f 64 65 53 75 62   int exprCodeSub
2d90: 73 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  select(Parse *pP
2da0: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
2db0: 72 29 7b 0a 20 20 69 6e 74 20 72 65 67 20 3d 20  r){.  int reg = 
2dc0: 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
2dd0: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
2de0: 0a 20 20 20 20 72 65 67 20 3d 20 73 71 6c 69 74  .    reg = sqlit
2df0: 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
2e00: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30  pParse, pExpr, 0
2e10: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
2e20: 72 6e 20 72 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn reg;.}../*.**
2e30: 20 41 72 67 75 6d 65 6e 74 20 70 56 65 63 74 6f   Argument pVecto
2e40: 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 65  r points to a ve
2e50: 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ctor expression 
2e60: 2d 20 65 69 74 68 65 72 20 61 20 54 4b 5f 56 45  - either a TK_VE
2e70: 43 54 4f 52 0a 2a 2a 20 6f 72 20 54 4b 5f 53 45  CTOR.** or TK_SE
2e80: 4c 45 43 54 20 74 68 61 74 20 72 65 74 75 72 6e  LECT that return
2e90: 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
2ea0: 63 6f 6c 75 6d 6e 2e 20 54 68 69 73 20 66 75 6e  column. This fun
2eb0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a  ction returns.**
2ec0: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75   the register nu
2ed0: 6d 62 65 72 20 6f 66 20 61 20 72 65 67 69 73 74  mber of a regist
2ee0: 65 72 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  er that contains
2ef0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a   the value of.**
2f00: 20 65 6c 65 6d 65 6e 74 20 69 46 69 65 6c 64 20   element iField 
2f10: 6f 66 20 74 68 65 20 76 65 63 74 6f 72 2e 0a 2a  of the vector..*
2f20: 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72 20  *.** If pVector 
2f30: 69 73 20 61 20 54 4b 5f 53 45 4c 45 43 54 20 65  is a TK_SELECT e
2f40: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20  xpression, then 
2f50: 63 6f 64 65 20 66 6f 72 20 69 74 20 6d 75 73 74  code for it must
2f60: 20 68 61 76 65 20 0a 2a 2a 20 61 6c 72 65 61 64   have .** alread
2f70: 79 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64  y been generated
2f80: 20 75 73 69 6e 67 20 74 68 65 20 65 78 70 72 43   using the exprC
2f90: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 29 20 72  odeSubselect() r
2fa0: 6f 75 74 69 6e 65 2e 20 49 6e 20 74 68 69 73 0a  outine. In this.
2fb0: 2a 2a 20 63 61 73 65 20 70 61 72 61 6d 65 74 65  ** case paramete
2fc0: 72 20 72 65 67 53 65 6c 65 63 74 20 73 68 6f 75  r regSelect shou
2fd0: 6c 64 20 62 65 20 74 68 65 20 66 69 72 73 74 20  ld be the first 
2fe0: 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72  in an array of r
2ff0: 65 67 69 73 74 65 72 73 0a 2a 2a 20 63 6f 6e 74  egisters.** cont
3000: 61 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c  aining the resul
3010: 74 73 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65  ts of the sub-se
3020: 6c 65 63 74 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  lect. .**.** If 
3030: 70 56 65 63 74 6f 72 20 69 73 20 6f 66 20 74 79  pVector is of ty
3040: 70 65 20 54 4b 5f 56 45 43 54 4f 52 2c 20 74 68  pe TK_VECTOR, th
3050: 65 6e 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  en code for the 
3060: 72 65 71 75 65 73 74 65 64 20 66 69 65 6c 64 0a  requested field.
3070: 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64 2e  ** is generated.
3080: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 28 2a   In this case (*
3090: 70 52 65 67 46 72 65 65 29 20 6d 61 79 20 62 65  pRegFree) may be
30a0: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
30b0: 65 72 20 6f 66 0a 2a 2a 20 61 20 74 65 6d 70 6f  er of.** a tempo
30c0: 72 61 72 79 20 72 65 67 69 73 74 65 72 20 74 6f  rary register to
30d0: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
30e0: 20 63 61 6c 6c 65 72 20 62 65 66 6f 72 65 20 72   caller before r
30f0: 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
3100: 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  Before returning
3110: 2c 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74  , output paramet
3120: 65 72 20 28 2a 70 70 45 78 70 72 29 20 69 73 20  er (*ppExpr) is 
3130: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
3140: 74 68 65 0a 2a 2a 20 45 78 70 72 20 6f 62 6a 65  the.** Expr obje
3150: 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ct corresponding
3160: 20 74 6f 20 65 6c 65 6d 65 6e 74 20 69 45 6c 65   to element iEle
3170: 6d 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 2e  m of the vector.
3180: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
3190: 78 70 72 56 65 63 74 6f 72 52 65 67 69 73 74 65  xprVectorRegiste
31a0: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
31b0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
31c0: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
31d0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
31e0: 2a 70 56 65 63 74 6f 72 2c 20 20 20 20 20 20 20  *pVector,       
31f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65             /* Ve
3200: 63 74 6f 72 20 74 6f 20 65 78 74 72 61 63 74 20  ctor to extract 
3210: 65 6c 65 6d 65 6e 74 20 66 72 6f 6d 20 2a 2f 0a  element from */.
3220: 20 20 69 6e 74 20 69 46 69 65 6c 64 2c 20 20 20    int iField,   
3230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3240: 20 20 2f 2a 20 46 69 65 6c 64 20 74 6f 20 65 78    /* Field to ex
3250: 74 72 61 63 74 20 66 72 6f 6d 20 70 56 65 63 74  tract from pVect
3260: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 53  or */.  int regS
3270: 65 6c 65 63 74 2c 20 20 20 20 20 20 20 20 20 20  elect,          
3280: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
3290: 20 69 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   in array of reg
32a0: 69 73 74 65 72 73 20 2a 2f 0a 20 20 45 78 70 72  isters */.  Expr
32b0: 20 2a 2a 70 70 45 78 70 72 2c 20 20 20 20 20 20   **ppExpr,      
32c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
32d0: 55 54 3a 20 45 78 70 72 65 73 73 69 6f 6e 20 65  UT: Expression e
32e0: 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  lement */.  int 
32f0: 2a 70 52 65 67 46 72 65 65 20 20 20 20 20 20 20  *pRegFree       
3300: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
3310: 55 54 3a 20 54 65 6d 70 20 72 65 67 69 73 74 65  UT: Temp registe
3320: 72 20 74 6f 20 66 72 65 65 20 2a 2f 0a 29 7b 0a  r to free */.){.
3330: 20 20 61 73 73 65 72 74 28 20 70 56 65 63 74 6f    assert( pVecto
3340: 72 2d 3e 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f 52  r->op==TK_VECTOR
3350: 20 7c 7c 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d   || pVector->op=
3360: 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20  =TK_SELECT );.  
3370: 61 73 73 65 72 74 28 20 28 70 56 65 63 74 6f 72  assert( (pVector
3380: 2d 3e 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 29  ->op==TK_VECTOR)
3390: 3d 3d 28 72 65 67 53 65 6c 65 63 74 3d 3d 30 29  ==(regSelect==0)
33a0: 20 29 3b 0a 20 20 69 66 28 20 72 65 67 53 65 6c   );.  if( regSel
33b0: 65 63 74 20 29 7b 0a 20 20 20 20 2a 70 70 45 78  ect ){.    *ppEx
33c0: 70 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78 2e  pr = pVector->x.
33d0: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
33e0: 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70 72  >a[iField].pExpr
33f0: 3b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 72 65  ;.     return re
3400: 67 53 65 6c 65 63 74 2b 69 46 69 65 6c 64 3b 0a  gSelect+iField;.
3410: 20 20 7d 0a 20 20 2a 70 70 45 78 70 72 20 3d 20    }.  *ppExpr = 
3420: 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74  pVector->x.pList
3430: 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70  ->a[iField].pExp
3440: 72 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  r;.  return sqli
3450: 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
3460: 70 50 61 72 73 65 2c 20 2a 70 70 45 78 70 72 2c  pParse, *ppExpr,
3470: 20 70 52 65 67 46 72 65 65 29 3b 0a 7d 0a 0a 2f   pRegFree);.}../
3480: 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20  *.** Expression 
3490: 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61  pExpr is a compa
34a0: 72 69 73 6f 6e 20 62 65 74 77 65 65 6e 20 74 77  rison between tw
34b0: 6f 20 76 65 63 74 6f 72 20 76 61 6c 75 65 73 2e  o vector values.
34c0: 20 43 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20   Compute.** the 
34d0: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 63 6f  result of the co
34e0: 6d 70 61 72 69 73 6f 6e 20 61 6e 64 20 77 72 69  mparison and wri
34f0: 74 65 20 69 74 20 74 6f 20 72 65 67 69 73 74 65  te it to registe
3500: 72 20 64 65 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  r dest..*/.stati
3510: 63 20 76 6f 69 64 20 63 6f 64 65 56 65 63 74 6f  c void codeVecto
3520: 72 43 6f 6d 70 61 72 65 28 50 61 72 73 65 20 2a  rCompare(Parse *
3530: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
3540: 78 70 72 2c 20 69 6e 74 20 64 65 73 74 29 7b 0a  xpr, int dest){.
3550: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
3560: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 45 78 70  se->pVdbe;.  Exp
3570: 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
3580: 2d 3e 70 4c 65 66 74 3b 0a 20 20 45 78 70 72 20  ->pLeft;.  Expr 
3590: 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  *pRight = pExpr-
35a0: 3e 70 52 69 67 68 74 3b 0a 20 20 69 6e 74 20 6e  >pRight;.  int n
35b0: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
35c0: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 4c 65  prVectorSize(pLe
35d0: 66 74 29 3b 0a 20 20 69 6e 74 20 6e 52 69 67 68  ft);.  int nRigh
35e0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56  t = sqlite3ExprV
35f0: 65 63 74 6f 72 53 69 7a 65 28 70 52 69 67 68 74  ectorSize(pRight
3600: 29 3b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20  );.  int addr = 
3610: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
3620: 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 43  abel(v);..  /* C
3630: 68 65 63 6b 20 74 68 61 74 20 62 6f 74 68 20 73  heck that both s
3640: 69 64 65 73 20 6f 66 20 74 68 65 20 63 6f 6d 70  ides of the comp
3650: 61 72 69 73 6f 6e 20 61 72 65 20 76 65 63 74 6f  arison are vecto
3660: 72 73 2c 20 61 6e 64 20 74 68 61 74 0a 20 20 2a  rs, and that.  *
3670: 2a 20 62 6f 74 68 20 61 72 65 20 74 68 65 20 73  * both are the s
3680: 61 6d 65 20 6c 65 6e 67 74 68 2e 20 20 2a 2f 0a  ame length.  */.
3690: 20 20 69 66 28 20 6e 4c 65 66 74 21 3d 6e 52 69    if( nLeft!=nRi
36a0: 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ght ){.    sqlit
36b0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
36c0: 65 2c 20 22 69 6e 76 61 6c 69 64 20 75 73 65 20  e, "invalid use 
36d0: 6f 66 20 72 6f 77 20 76 61 6c 75 65 22 29 3b 0a  of row value");.
36e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
36f0: 20 70 35 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70   p5 = (pExpr->op
3700: 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72  ==TK_IS || pExpr
3710: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 29 20  ->op==TK_ISNOT) 
3720: 3f 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20  ? SQLITE_NULLEQ 
3730: 3a 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  : 0;.    int i;.
3740: 20 20 20 20 69 6e 74 20 72 65 67 4c 65 66 74 20      int regLeft 
3750: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 67  = 0;.    int reg
3760: 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 69  Right = 0;.    i
3770: 6e 74 20 72 65 67 54 6d 70 20 3d 20 30 3b 0a 0a  nt regTmp = 0;..
3780: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
3790: 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20  r->op==TK_EQ || 
37a0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45  pExpr->op==TK_NE
37b0: 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45   .         || pE
37c0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c  xpr->op==TK_IS |
37d0: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
37e0: 49 53 4e 4f 54 20 0a 20 20 20 20 20 20 20 20 20  ISNOT .         
37f0: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
3800: 5f 4c 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _LT || pExpr->op
3810: 3d 3d 54 4b 5f 47 54 20 0a 20 20 20 20 20 20 20  ==TK_GT .       
3820: 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d    || pExpr->op==
3830: 54 4b 5f 4c 45 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_LE || pExpr->
3840: 6f 70 3d 3d 54 4b 5f 47 45 20 0a 20 20 20 20 29  op==TK_GE .    )
3850: 3b 0a 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  ;..    if( pExpr
3860: 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70  ->op==TK_EQ || p
3870: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20  Expr->op==TK_NE 
3880: 29 7b 0a 20 20 20 20 20 20 72 65 67 54 6d 70 20  ){.      regTmp 
3890: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
38a0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
38b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
38c0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
38d0: 65 72 2c 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d  er, (pExpr->op==
38e0: 54 4b 5f 45 51 29 2c 20 64 65 73 74 29 3b 0a 20  TK_EQ), dest);. 
38f0: 20 20 20 7d 0a 0a 20 20 20 20 72 65 67 4c 65 66     }..    regLef
3900: 74 20 3d 20 65 78 70 72 43 6f 64 65 53 75 62 73  t = exprCodeSubs
3910: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 4c  elect(pParse, pL
3920: 65 66 74 29 3b 0a 20 20 20 20 72 65 67 52 69 67  eft);.    regRig
3930: 68 74 20 3d 20 65 78 70 72 43 6f 64 65 53 75 62  ht = exprCodeSub
3940: 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
3950: 52 69 67 68 74 29 3b 0a 0a 20 20 20 20 66 6f 72  Right);..    for
3960: 28 69 3d 30 3b 20 69 3c 6e 4c 65 66 74 3b 20 69  (i=0; i<nLeft; i
3970: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  ++){.      int r
3980: 65 67 46 72 65 65 31 20 3d 20 30 2c 20 72 65 67  egFree1 = 0, reg
3990: 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 20 20 20  Free2 = 0;.     
39a0: 20 45 78 70 72 20 2a 70 4c 2c 20 2a 70 52 3b 20   Expr *pL, *pR; 
39b0: 0a 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72  .      int r1, r
39c0: 32 3b 0a 20 20 20 20 20 20 69 66 28 20 69 20 29  2;.      if( i )
39d0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
39e0: 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
39f0: 20 20 20 20 20 72 31 20 3d 20 65 78 70 72 56 65       r1 = exprVe
3a00: 63 74 6f 72 52 65 67 69 73 74 65 72 28 70 50 61  ctorRegister(pPa
3a10: 72 73 65 2c 20 70 4c 65 66 74 2c 20 69 2c 20 72  rse, pLeft, i, r
3a20: 65 67 4c 65 66 74 2c 20 26 70 4c 2c 20 26 72 65  egLeft, &pL, &re
3a30: 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
3a40: 32 20 3d 20 65 78 70 72 56 65 63 74 6f 72 52 65  2 = exprVectorRe
3a50: 67 69 73 74 65 72 28 70 50 61 72 73 65 2c 20 70  gister(pParse, p
3a60: 52 69 67 68 74 2c 20 69 2c 20 72 65 67 52 69 67  Right, i, regRig
3a70: 68 74 2c 20 26 70 52 2c 20 26 72 65 67 46 72 65  ht, &pR, &regFre
3a80: 65 32 29 3b 0a 0a 20 20 20 20 20 20 73 77 69 74  e2);..      swit
3a90: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
3aa0: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b  .        case TK
3ab0: 5f 49 53 3a 0a 20 20 20 20 20 20 20 20 20 20 63  _IS:.          c
3ac0: 6f 64 65 43 6f 6d 70 61 72 65 28 0a 20 20 20 20  odeCompare(.    
3ad0: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
3ae0: 2c 20 70 4c 2c 20 70 52 2c 20 4f 50 5f 45 71 2c  , pL, pR, OP_Eq,
3af0: 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 53   r1, r2, dest, S
3b00: 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 7c 53 51  QLITE_STOREP2|SQ
3b10: 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 20 20 20 20  LITE_NULLEQ.    
3b20: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
3b30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3b40: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp3(v, OP_IfNot
3b50: 2c 20 64 65 73 74 2c 20 61 64 64 72 2c 20 31 29  , dest, addr, 1)
3b60: 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
3b70: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
3b80: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20         break;.. 
3b90: 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 49         case TK_I
3ba0: 53 4e 4f 54 3a 0a 20 20 20 20 20 20 20 20 20 20  SNOT:.          
3bb0: 63 6f 64 65 43 6f 6d 70 61 72 65 28 0a 20 20 20  codeCompare(.   
3bc0: 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
3bd0: 65 2c 20 70 4c 2c 20 70 52 2c 20 4f 50 5f 4e 65  e, pL, pR, OP_Ne
3be0: 2c 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20  , r1, r2, dest, 
3bf0: 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 7c 53  SQLITE_STOREP2|S
3c00: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 20 20 20  QLITE_NULLEQ.   
3c10: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
3c20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3c30: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp3(v, OP_If, 
3c40: 64 65 73 74 2c 20 61 64 64 72 2c 20 31 29 3b 0a  dest, addr, 1);.
3c50: 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
3c60: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
3c70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
3c80: 20 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a       case TK_EQ:
3c90: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b  .        case TK
3ca0: 5f 4e 45 3a 0a 20 20 20 20 20 20 20 20 20 20 63  _NE:.          c
3cb0: 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
3cc0: 65 2c 20 70 4c 2c 20 70 52 2c 20 4f 50 5f 43 6d  e, pL, pR, OP_Cm
3cd0: 70 2c 20 72 31 2c 20 72 32 2c 20 72 65 67 54 6d  p, r1, r2, regTm
3ce0: 70 2c 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32  p,SQLITE_STOREP2
3cf0: 7c 70 35 29 3b 0a 20 20 20 20 20 20 20 20 20 20  |p5);.          
3d00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3d10: 34 49 6e 74 28 0a 20 20 20 20 20 20 20 20 20 20  4Int(.          
3d20: 20 20 20 20 76 2c 20 4f 50 5f 43 6d 70 54 65 73      v, OP_CmpTes
3d30: 74 2c 20 72 65 67 54 6d 70 2c 20 61 64 64 72 2c  t, regTmp, addr,
3d40: 20 64 65 73 74 2c 20 70 45 78 70 72 2d 3e 6f 70   dest, pExpr->op
3d50: 3d 3d 54 4b 5f 4e 45 0a 20 20 20 20 20 20 20 20  ==TK_NE.        
3d60: 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56    );.          V
3d70: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
3d80: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
3d90: 0a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 54  ..        case T
3da0: 4b 5f 4c 54 3a 0a 20 20 20 20 20 20 20 20 63 61  K_LT:.        ca
3db0: 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 20 20  se TK_LE:.      
3dc0: 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
3dd0: 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45        case TK_GE
3de0: 3a 0a 20 20 20 20 20 20 20 20 20 20 63 6f 64 65  :.          code
3df0: 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
3e00: 70 4c 2c 20 70 52 2c 20 4f 50 5f 43 6d 70 2c 20  pL, pR, OP_Cmp, 
3e10: 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 53 51  r1, r2, dest, SQ
3e20: 4c 49 54 45 5f 53 54 4f 52 45 50 32 7c 70 35 29  LITE_STOREP2|p5)
3e30: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
3e40: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
3e50: 28 76 2c 20 4f 50 5f 43 6d 70 54 65 73 74 2c 20  (v, OP_CmpTest, 
3e60: 64 65 73 74 2c 20 61 64 64 72 2c 20 30 2c 20 70  dest, addr, 0, p
3e70: 45 78 70 72 2d 3e 6f 70 29 3b 0a 20 20 20 20 20  Expr->op);.     
3e80: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
3e90: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
3ea0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
3eb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
3ec0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
3ed0: 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20  se, regFree1);. 
3ee0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
3ef0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
3f00: 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20  e, regFree2);.  
3f10: 20 20 20 20 69 66 28 20 69 20 29 20 73 71 6c 69      if( i ) sqli
3f20: 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
3f30: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 0a  pParse);.    }..
3f40: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
3f50: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
3f60: 2c 20 72 65 67 54 6d 70 29 3b 0a 20 20 7d 0a 0a  , regTmp);.  }..
3f70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
3f80: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
3f90: 72 29 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  r);.}..#if SQLIT
3fa0: 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
3fb0: 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  >0./*.** Check t
3fc0: 68 61 74 20 61 72 67 75 6d 65 6e 74 20 6e 48 65  hat argument nHe
3fd0: 69 67 68 74 20 69 73 20 6c 65 73 73 20 74 68 61  ight is less tha
3fe0: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
3ff0: 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 65 78 70  e maximum.** exp
4000: 72 65 73 73 69 6f 6e 20 64 65 70 74 68 20 61 6c  ression depth al
4010: 6c 6f 77 65 64 2e 20 49 66 20 69 74 20 69 73 20  lowed. If it is 
4020: 6e 6f 74 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  not, leave an er
4030: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 0a 2a  ror message in.*
4040: 2a 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 69 6e 74  * pParse..*/.int
4050: 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
4060: 6b 48 65 69 67 68 74 28 50 61 72 73 65 20 2a 70  kHeight(Parse *p
4070: 50 61 72 73 65 2c 20 69 6e 74 20 6e 48 65 69 67  Parse, int nHeig
4080: 68 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ht){.  int rc = 
4090: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
40a0: 20 6d 78 48 65 69 67 68 74 20 3d 20 70 50 61 72   mxHeight = pPar
40b0: 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  se->db->aLimit[S
40c0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52  QLITE_LIMIT_EXPR
40d0: 5f 44 45 50 54 48 5d 3b 0a 20 20 69 66 28 20 6e  _DEPTH];.  if( n
40e0: 48 65 69 67 68 74 3e 6d 78 48 65 69 67 68 74 20  Height>mxHeight 
40f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
4100: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
4110: 20 20 20 20 20 20 20 22 45 78 70 72 65 73 73 69         "Expressi
4120: 6f 6e 20 74 72 65 65 20 69 73 20 74 6f 6f 20 6c  on tree is too l
4130: 61 72 67 65 20 28 6d 61 78 69 6d 75 6d 20 64 65  arge (maximum de
4140: 70 74 68 20 25 64 29 22 2c 20 6d 78 48 65 69 67  pth %d)", mxHeig
4150: 68 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63  ht.    );.    rc
4160: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
4170: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
4180: 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;.}../* The foll
4190: 6f 77 69 6e 67 20 74 68 72 65 65 20 66 75 6e 63  owing three func
41a0: 74 69 6f 6e 73 2c 20 68 65 69 67 68 74 4f 66 45  tions, heightOfE
41b0: 78 70 72 28 29 2c 20 68 65 69 67 68 74 4f 66 45  xpr(), heightOfE
41c0: 78 70 72 4c 69 73 74 28 29 0a 2a 2a 20 61 6e 64  xprList().** and
41d0: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
41e0: 29 2c 20 61 72 65 20 75 73 65 64 20 74 6f 20 64  ), are used to d
41f0: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 61 78  etermine the max
4200: 69 6d 75 6d 20 68 65 69 67 68 74 0a 2a 2a 20 6f  imum height.** o
4210: 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  f any expression
4220: 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64   tree referenced
4230: 20 62 79 20 74 68 65 20 73 74 72 75 63 74 75 72   by the structur
4240: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 0a  e passed as the.
4250: 2a 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  ** first argumen
4260: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  t..**.** If this
4270: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20   maximum height 
4280: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
4290: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
42a0: 65 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20  e pointed.** to 
42b0: 62 79 20 70 6e 48 65 69 67 68 74 2c 20 74 68 65  by pnHeight, the
42c0: 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
42d0: 72 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 6e 48  r, then set *pnH
42e0: 65 69 67 68 74 20 74 6f 20 74 68 61 74 0a 2a 2a  eight to that.**
42f0: 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
4300: 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45  c void heightOfE
4310: 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  xpr(Expr *p, int
4320: 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69   *pnHeight){.  i
4330: 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  f( p ){.    if( 
4340: 70 2d 3e 6e 48 65 69 67 68 74 3e 2a 70 6e 48 65  p->nHeight>*pnHe
4350: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2a 70  ight ){.      *p
4360: 6e 48 65 69 67 68 74 20 3d 20 70 2d 3e 6e 48 65  nHeight = p->nHe
4370: 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ight;.    }.  }.
4380: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  }.static void he
4390: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 45  ightOfExprList(E
43a0: 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20  xprList *p, int 
43b0: 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66  *pnHeight){.  if
43c0: 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ( p ){.    int i
43d0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
43e0: 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  <p->nExpr; i++){
43f0: 0a 20 20 20 20 20 20 68 65 69 67 68 74 4f 66 45  .      heightOfE
4400: 78 70 72 28 70 2d 3e 61 5b 69 5d 2e 70 45 78 70  xpr(p->a[i].pExp
4410: 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  r, pnHeight);.  
4420: 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63    }.  }.}.static
4430: 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 53 65   void heightOfSe
4440: 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20  lect(Select *p, 
4450: 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a  int *pnHeight){.
4460: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 68    if( p ){.    h
4470: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
4480: 57 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29  Where, pnHeight)
4490: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
44a0: 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70  pr(p->pHaving, p
44b0: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
44c0: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c  ightOfExpr(p->pL
44d0: 69 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b  imit, pnHeight);
44e0: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
44f0: 72 28 70 2d 3e 70 4f 66 66 73 65 74 2c 20 70 6e  r(p->pOffset, pn
4500: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
4510: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
4520: 3e 70 45 4c 69 73 74 2c 20 70 6e 48 65 69 67 68  >pEList, pnHeigh
4530: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
4540: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f  ExprList(p->pGro
4550: 75 70 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b  upBy, pnHeight);
4560: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
4570: 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42  rList(p->pOrderB
4580: 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  y, pnHeight);.  
4590: 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74    heightOfSelect
45a0: 28 70 2d 3e 70 50 72 69 6f 72 2c 20 70 6e 48 65  (p->pPrior, pnHe
45b0: 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ight);.  }.}../*
45c0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72  .** Set the Expr
45d0: 2e 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c  .nHeight variabl
45e0: 65 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75  e in the structu
45f0: 72 65 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  re passed as an 
4600: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e  .** argument. An
4610: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68   expression with
4620: 20 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78   no children, Ex
4630: 70 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20  pr.pList or .** 
4640: 45 78 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d  Expr.pSelect mem
4650: 62 65 72 20 68 61 73 20 61 20 68 65 69 67 68 74  ber has a height
4660: 20 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72   of 1. Any other
4670: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68   expression.** h
4680: 61 73 20 61 20 68 65 69 67 68 74 20 65 71 75 61  as a height equa
4690: 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  l to the maximum
46a0: 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f   height of any o
46b0: 74 68 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e  ther .** referen
46c0: 63 65 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e  ced Expr plus on
46d0: 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72  e..**.** Also pr
46e0: 6f 70 61 67 61 74 65 20 45 50 5f 50 72 6f 70 61  opagate EP_Propa
46f0: 67 61 74 65 20 66 6c 61 67 73 20 75 70 20 66 72  gate flags up fr
4700: 6f 6d 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20  om Expr.x.pList 
4710: 74 6f 20 45 78 70 72 2e 66 6c 61 67 73 2c 0a 2a  to Expr.flags,.*
4720: 2a 20 69 66 20 61 70 70 72 6f 70 72 69 61 74 65  * if appropriate
4730: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4740: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 45   exprSetHeight(E
4750: 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  xpr *p){.  int n
4760: 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65  Height = 0;.  he
4770: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c  ightOfExpr(p->pL
4780: 65 66 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  eft, &nHeight);.
4790: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
47a0: 2d 3e 70 52 69 67 68 74 2c 20 26 6e 48 65 69 67  ->pRight, &nHeig
47b0: 68 74 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48  ht);.  if( ExprH
47c0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
47d0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
47e0: 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63     heightOfSelec
47f0: 74 28 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20  t(p->x.pSelect, 
4800: 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 65 6c  &nHeight);.  }el
4810: 73 65 20 69 66 28 20 70 2d 3e 78 2e 70 4c 69 73  se if( p->x.pLis
4820: 74 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f  t ){.    heightO
4830: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70  fExprList(p->x.p
4840: 4c 69 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b  List, &nHeight);
4850: 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d  .    p->flags |=
4860: 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20   EP_Propagate & 
4870: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46  sqlite3ExprListF
4880: 6c 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29  lags(p->x.pList)
4890: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67  ;.  }.  p->nHeig
48a0: 68 74 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31  ht = nHeight + 1
48b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
48c0: 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20  he Expr.nHeight 
48d0: 76 61 72 69 61 62 6c 65 20 75 73 69 6e 67 20 74  variable using t
48e0: 68 65 20 65 78 70 72 53 65 74 48 65 69 67 68 74  he exprSetHeight
48f0: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a  () function. If.
4900: 2a 2a 20 74 68 65 20 68 65 69 67 68 74 20 69 73  ** the height is
4910: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
4920: 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65  e maximum allowe
4930: 64 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70  d expression dep
4940: 74 68 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20  th,.** leave an 
4950: 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e  error in pParse.
4960: 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70  .**.** Also prop
4970: 61 67 61 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f  agate all EP_Pro
4980: 70 61 67 61 74 65 20 66 6c 61 67 73 20 66 72 6f  pagate flags fro
4990: 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69  m the Expr.x.pLi
49a0: 73 74 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e  st into.** Expr.
49b0: 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20  flags. .*/.void 
49c0: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65  sqlite3ExprSetHe
49d0: 69 67 68 74 41 6e 64 46 6c 61 67 73 28 50 61 72  ightAndFlags(Par
49e0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
49f0: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 50 61 72   *p){.  if( pPar
4a00: 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
4a10: 6e 3b 0a 20 20 65 78 70 72 53 65 74 48 65 69 67  n;.  exprSetHeig
4a20: 68 74 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ht(p);.  sqlite3
4a30: 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28  ExprCheckHeight(
4a40: 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67  pParse, p->nHeig
4a50: 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ht);.}../*.** Re
4a60: 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  turn the maximum
4a70: 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 65   height of any e
4a80: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72  xpression tree r
4a90: 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79 20  eferenced.** by 
4aa0: 74 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65  the select state
4ab0: 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 61  ment passed as a
4ac0: 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69  n argument..*/.i
4ad0: 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
4ae0: 45 78 70 72 48 65 69 67 68 74 28 53 65 6c 65 63  ExprHeight(Selec
4af0: 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65  t *p){.  int nHe
4b00: 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67  ight = 0;.  heig
4b10: 68 74 4f 66 53 65 6c 65 63 74 28 70 2c 20 26 6e  htOfSelect(p, &n
4b20: 48 65 69 67 68 74 29 3b 0a 20 20 72 65 74 75 72  Height);.  retur
4b30: 6e 20 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65 6c  n nHeight;.}.#el
4b40: 73 65 20 2f 2a 20 41 42 4f 56 45 3a 20 20 48 65  se /* ABOVE:  He
4b50: 69 67 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74  ight enforcement
4b60: 20 65 6e 61 62 6c 65 64 2e 20 20 42 45 4c 4f 57   enabled.  BELOW
4b70: 3a 20 48 65 69 67 68 74 20 65 6e 66 6f 72 63 65  : Height enforce
4b80: 6d 65 6e 74 20 6f 66 66 20 2a 2f 0a 2f 2a 0a 2a  ment off */./*.*
4b90: 2a 20 50 72 6f 70 61 67 61 74 65 20 61 6c 6c 20  * Propagate all 
4ba0: 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61  EP_Propagate fla
4bb0: 67 73 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72  gs from the Expr
4bc0: 2e 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a  .x.pList into.**
4bd0: 20 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f   Expr.flags. .*/
4be0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
4bf0: 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61  rSetHeightAndFla
4c00: 67 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  gs(Parse *pParse
4c10: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  , Expr *p){.  if
4c20: 28 20 70 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73  ( p && p->x.pLis
4c30: 74 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f  t && !ExprHasPro
4c40: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
4c50: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 70 2d  elect) ){.    p-
4c60: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f  >flags |= EP_Pro
4c70: 70 61 67 61 74 65 20 26 20 73 71 6c 69 74 65 33  pagate & sqlite3
4c80: 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d  ExprListFlags(p-
4c90: 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d  >x.pList);.  }.}
4ca0: 0a 23 64 65 66 69 6e 65 20 65 78 70 72 53 65 74  .#define exprSet
4cb0: 48 65 69 67 68 74 28 79 29 0a 23 65 6e 64 69 66  Height(y).#endif
4cc0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45   /* SQLITE_MAX_E
4cd0: 58 50 52 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a  XPR_DEPTH>0 */..
4ce0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
4cf0: 6e 65 20 69 73 20 74 68 65 20 63 6f 72 65 20 61  ne is the core a
4d00: 6c 6c 6f 63 61 74 6f 72 20 66 6f 72 20 45 78 70  llocator for Exp
4d10: 72 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43  r nodes..**.** C
4d20: 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65  onstruct a new e
4d30: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61  xpression node a
4d40: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
4d50: 74 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f  ter to it.  Memo
4d60: 72 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e  ry.** for this n
4d70: 6f 64 65 20 61 6e 64 20 66 6f 72 20 74 68 65 20  ode and for the 
4d80: 70 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20  pToken argument 
4d90: 69 73 20 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f  is a single allo
4da0: 63 61 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e  cation.** obtain
4db0: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44  ed from sqlite3D
4dc0: 62 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20  bMalloc().  The 
4dd0: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
4de0: 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62  .** is responsib
4df0: 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75  le for making su
4e00: 72 65 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e  re the node even
4e10: 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65  tually gets free
4e20: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75  d..**.** If dequ
4e30: 6f 74 65 20 69 73 20 74 72 75 65 2c 20 74 68 65  ote is true, the
4e40: 6e 20 74 68 65 20 74 6f 6b 65 6e 20 28 69 66 20  n the token (if 
4e50: 69 74 20 65 78 69 73 74 73 29 20 69 73 20 64 65  it exists) is de
4e60: 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65  quoted..** If de
4e70: 71 75 6f 74 65 20 69 73 20 66 61 6c 73 65 2c 20  quote is false, 
4e80: 6e 6f 20 64 65 71 75 6f 74 69 6e 67 20 69 73 20  no dequoting is 
4e90: 70 65 72 66 6f 72 6d 65 64 2e 20 20 54 68 65 20  performed.  The 
4ea0: 64 65 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d  deQuote.** param
4eb0: 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20  eter is ignored 
4ec0: 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c  if pToken is NUL
4ed0: 4c 20 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65  L or if the toke
4ee0: 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70  n does not.** ap
4ef0: 70 65 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65  pear to be quote
4f00: 64 2e 20 20 49 66 20 74 68 65 20 71 75 6f 74 65  d.  If the quote
4f10: 73 20 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f  s were of the fo
4f20: 72 6d 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65  rm "..." (double
4f30: 2d 71 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e  -quotes).** then
4f40: 20 74 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65   the EP_DblQuote
4f50: 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e  d flag is set on
4f60: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
4f70: 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63  node..**.** Spec
4f80: 69 61 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70  ial case:  If op
4f90: 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64  ==TK_INTEGER and
4fa0: 20 70 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74   pToken points t
4fb0: 6f 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a  o a string that.
4fc0: 2a 2a 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c  ** can be transl
4fd0: 61 74 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62  ated into a 32-b
4fe0: 69 74 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e  it integer, then
4ff0: 20 74 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f   the token is no
5000: 74 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75  t.** stored in u
5010: 2e 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61  .zToken.  Instea
5020: 64 2c 20 74 68 65 20 69 6e 74 65 67 65 72 20 76  d, the integer v
5030: 61 6c 75 65 73 20 69 73 20 77 72 69 74 74 65 6e  alues is written
5040: 0a 2a 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75  .** into u.iValu
5050: 65 20 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74  e and the EP_Int
5060: 56 61 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65  Value flag is se
5070: 74 2e 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f  t.  No extra sto
5080: 72 61 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63  rage.** is alloc
5090: 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65  ated to hold the
50a0: 20 69 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e   integer text an
50b0: 64 20 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c  d the dequote fl
50c0: 61 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a  ag is ignored..*
50d0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
50e0: 78 70 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69  xprAlloc(.  sqli
50f0: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
5100: 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f      /* Handle fo
5110: 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  r sqlite3DbMallo
5120: 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65 20  cZero() (may be 
5130: 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f  null) */.  int o
5140: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
5150: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
5160: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e   opcode */.  con
5170: 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  st Token *pToken
5180: 2c 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72  ,    /* Token ar
5190: 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62  gument.  Might b
51a0: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
51b0: 64 65 71 75 6f 74 65 20 20 20 20 20 20 20 20 20  dequote         
51c0: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64      /* True to d
51d0: 65 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20 45  equote */.){.  E
51e0: 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  xpr *pNew;.  int
51f0: 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 69   nExtra = 0;.  i
5200: 6e 74 20 69 56 61 6c 75 65 20 3d 20 30 3b 0a 0a  nt iValue = 0;..
5210: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
5220: 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20  );.  if( pToken 
5230: 29 7b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d 54  ){.    if( op!=T
5240: 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 70 54 6f  K_INTEGER || pTo
5250: 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20 20 20 20 20  ken->z==0.      
5260: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 65      || sqlite3Ge
5270: 74 49 6e 74 33 32 28 70 54 6f 6b 65 6e 2d 3e 7a  tInt32(pToken->z
5280: 2c 20 26 69 56 61 6c 75 65 29 3d 3d 30 20 29 7b  , &iValue)==0 ){
5290: 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 3d 20  .      nExtra = 
52a0: 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a 20 20 20  pToken->n+1;.   
52b0: 20 20 20 61 73 73 65 72 74 28 20 69 56 61 6c 75     assert( iValu
52c0: 65 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  e>=0 );.    }.  
52d0: 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  }.  pNew = sqlit
52e0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
52f0: 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29  db, sizeof(Expr)
5300: 2b 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20  +nExtra);.  if( 
5310: 70 4e 65 77 20 29 7b 0a 20 20 20 20 6d 65 6d 73  pNew ){.    mems
5320: 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65  et(pNew, 0, size
5330: 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 20 20 70  of(Expr));.    p
5340: 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29 6f 70  New->op = (u8)op
5350: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41 67 67  ;.    pNew->iAgg
5360: 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 70   = -1;.    if( p
5370: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 69  Token ){.      i
5380: 66 28 20 6e 45 78 74 72 61 3d 3d 30 20 29 7b 0a  f( nExtra==0 ){.
5390: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c          pNew->fl
53a0: 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c  ags |= EP_IntVal
53b0: 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  ue;.        pNew
53c0: 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 56 61  ->u.iValue = iVa
53d0: 6c 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  lue;.      }else
53e0: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
53f0: 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72  u.zToken = (char
5400: 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 20  *)&pNew[1];.    
5410: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b      assert( pTok
5420: 65 6e 2d 3e 7a 21 3d 30 20 7c 7c 20 70 54 6f 6b  en->z!=0 || pTok
5430: 65 6e 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  en->n==0 );.    
5440: 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e      if( pToken->
5450: 6e 20 29 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d  n ) memcpy(pNew-
5460: 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 54 6f 6b 65  >u.zToken, pToke
5470: 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 29  n->z, pToken->n)
5480: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
5490: 75 2e 7a 54 6f 6b 65 6e 5b 70 54 6f 6b 65 6e 2d  u.zToken[pToken-
54a0: 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  >n] = 0;.       
54b0: 20 69 66 28 20 64 65 71 75 6f 74 65 20 26 26 20   if( dequote && 
54c0: 73 71 6c 69 74 65 33 49 73 71 75 6f 74 65 28 70  sqlite3Isquote(p
54d0: 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d  New->u.zToken[0]
54e0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ) ){.          i
54f0: 66 28 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65  f( pNew->u.zToke
5500: 6e 5b 30 5d 3d 3d 27 22 27 20 29 20 70 4e 65 77  n[0]=='"' ) pNew
5510: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 44 62  ->flags |= EP_Db
5520: 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20 20 20 20  lQuoted;.       
5530: 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74     sqlite3Dequot
5540: 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  e(pNew->u.zToken
5550: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
5560: 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 20 53     }.    }.#if S
5570: 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
5580: 45 50 54 48 3e 30 0a 20 20 20 20 70 4e 65 77 2d  EPTH>0.    pNew-
5590: 3e 6e 48 65 69 67 68 74 20 3d 20 31 3b 0a 23 65  >nHeight = 1;.#e
55a0: 6e 64 69 66 20 20 0a 20 20 7d 0a 20 20 72 65 74  ndif  .  }.  ret
55b0: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
55c0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
55d0: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  w expression nod
55e0: 65 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 74 65  e from a zero-te
55f0: 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65 6e 20 74  rminated token t
5600: 68 61 74 20 68 61 73 0a 2a 2a 20 61 6c 72 65 61  hat has.** alrea
5610: 64 79 20 62 65 65 6e 20 64 65 71 75 6f 74 65 64  dy been dequoted
5620: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
5630: 65 33 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65  e3Expr(.  sqlite
5640: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
5650: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20    /* Handle for 
5660: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
5670: 65 72 6f 28 29 20 28 6d 61 79 20 62 65 20 6e 75  ero() (may be nu
5680: 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c  ll) */.  int op,
5690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56a0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f   /* Expression o
56b0: 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  pcode */.  const
56c0: 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 20 20   char *zToken   
56d0: 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67 75     /* Token argu
56e0: 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65 20  ment.  Might be 
56f0: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54 6f 6b  NULL */.){.  Tok
5700: 65 6e 20 78 3b 0a 20 20 78 2e 7a 20 3d 20 7a 54  en x;.  x.z = zT
5710: 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20 3d 20 7a 54  oken;.  x.n = zT
5720: 6f 6b 65 6e 20 3f 20 73 71 6c 69 74 65 33 53 74  oken ? sqlite3St
5730: 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e 29 20 3a  rlen30(zToken) :
5740: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   0;.  return sql
5750: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62  ite3ExprAlloc(db
5760: 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b 0a 7d 0a  , op, &x, 0);.}.
5770: 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20 73 75  ./*.** Attach su
5780: 62 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e 64  btrees pLeft and
5790: 20 70 52 69 67 68 74 20 74 6f 20 74 68 65 20 45   pRight to the E
57a0: 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f 74 2e 0a  xpr node pRoot..
57b0: 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f 74 3d 3d  **.** If pRoot==
57c0: 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20  NULL that means 
57d0: 74 68 61 74 20 61 20 6d 65 6d 6f 72 79 20 61 6c  that a memory al
57e0: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68  location error h
57f0: 61 73 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20  as occurred..** 
5800: 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64 65  In that case, de
5810: 6c 65 74 65 20 74 68 65 20 73 75 62 74 72 65 65  lete the subtree
5820: 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67  s pLeft and pRig
5830: 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ht..*/.void sqli
5840: 74 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62  te3ExprAttachSub
5850: 74 72 65 65 73 28 0a 20 20 73 71 6c 69 74 65 33  trees(.  sqlite3
5860: 20 2a 64 62 2c 0a 20 20 45 78 70 72 20 2a 70 52   *db,.  Expr *pR
5870: 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a 70 4c 65  oot,.  Expr *pLe
5880: 66 74 2c 0a 20 20 45 78 70 72 20 2a 70 52 69 67  ft,.  Expr *pRig
5890: 68 74 0a 29 7b 0a 20 20 69 66 28 20 70 52 6f 6f  ht.){.  if( pRoo
58a0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  t==0 ){.    asse
58b0: 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
58c0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71 6c 69  iled );.    sqli
58d0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
58e0: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71  , pLeft);.    sq
58f0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
5900: 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d  db, pRight);.  }
5910: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 52  else{.    if( pR
5920: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 52  ight ){.      pR
5930: 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d 20 70 52  oot->pRight = pR
5940: 69 67 68 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f  ight;.      pRoo
5950: 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50  t->flags |= EP_P
5960: 72 6f 70 61 67 61 74 65 20 26 20 70 52 69 67 68  ropagate & pRigh
5970: 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a  t->flags;.    }.
5980: 20 20 20 20 69 66 28 20 70 4c 65 66 74 20 29 7b      if( pLeft ){
5990: 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 4c  .      pRoot->pL
59a0: 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20  eft = pLeft;.   
59b0: 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20     pRoot->flags 
59c0: 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20  |= EP_Propagate 
59d0: 26 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 3b 0a  & pLeft->flags;.
59e0: 20 20 20 20 7d 0a 20 20 20 20 65 78 70 72 53 65      }.    exprSe
59f0: 74 48 65 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a  tHeight(pRoot);.
5a00: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
5a10: 6f 63 61 74 65 20 61 6e 20 45 78 70 72 20 6e 6f  ocate an Expr no
5a20: 64 65 20 77 68 69 63 68 20 6a 6f 69 6e 73 20 61  de which joins a
5a30: 73 20 6d 61 6e 79 20 61 73 20 74 77 6f 20 73 75  s many as two su
5a40: 62 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  btrees..**.** On
5a50: 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65  e or both of the
5a60: 20 73 75 62 74 72 65 65 73 20 63 61 6e 20 62 65   subtrees can be
5a70: 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 20 61   NULL.  Return a
5a80: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
5a90: 6e 65 77 0a 2a 2a 20 45 78 70 72 20 6e 6f 64 65  new.** Expr node
5aa0: 2e 20 20 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d  .  Or, if an OOM
5ab0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73   error occurs, s
5ac0: 65 74 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  et pParse->db->m
5ad0: 61 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a 20  allocFailed,.** 
5ae0: 66 72 65 65 20 74 68 65 20 73 75 62 74 72 65 65  free the subtree
5af0: 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  s and return NUL
5b00: 4c 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  L..*/.Expr *sqli
5b10: 74 65 33 50 45 78 70 72 28 0a 20 20 50 61 72 73  te3PExpr(.  Pars
5b20: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
5b30: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
5b40: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
5b50: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
5b60: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
5b70: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78  n opcode */.  Ex
5b80: 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20  pr *pLeft,      
5b90: 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70        /* Left op
5ba0: 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20  erand */.  Expr 
5bb0: 2a 70 52 69 67 68 74 2c 20 20 20 20 20 20 20 20  *pRight,        
5bc0: 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72     /* Right oper
5bd0: 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54  and */.  const T
5be0: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 20 20 20  oken *pToken    
5bf0: 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 6b   /* Argument tok
5c00: 65 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20  en */.){.  Expr 
5c10: 2a 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  *p;.  if( op==TK
5c20: 5f 41 4e 44 20 26 26 20 70 50 61 72 73 65 2d 3e  _AND && pParse->
5c30: 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  nErr==0 ){.    /
5c40: 2a 20 54 61 6b 65 20 61 64 76 61 6e 74 61 67 65  * Take advantage
5c50: 20 6f 66 20 73 68 6f 72 74 2d 63 69 72 63 75 69   of short-circui
5c60: 74 20 66 61 6c 73 65 20 6f 70 74 69 6d 69 7a 61  t false optimiza
5c70: 74 69 6f 6e 20 66 6f 72 20 41 4e 44 20 2a 2f 0a  tion for AND */.
5c80: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45      p = sqlite3E
5c90: 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64  xprAnd(pParse->d
5ca0: 62 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  b, pLeft, pRight
5cb0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
5cc0: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  p = sqlite3ExprA
5cd0: 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  lloc(pParse->db,
5ce0: 20 6f 70 20 26 20 54 4b 46 4c 47 5f 4d 41 53 4b   op & TKFLG_MASK
5cf0: 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20  , pToken, 1);.  
5d00: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74    sqlite3ExprAtt
5d10: 61 63 68 53 75 62 74 72 65 65 73 28 70 50 61 72  achSubtrees(pPar
5d20: 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66 74  se->db, p, pLeft
5d30: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20  , pRight);.  }. 
5d40: 20 69 66 28 20 70 20 29 20 7b 0a 20 20 20 20 73   if( p ) {.    s
5d50: 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 48  qlite3ExprCheckH
5d60: 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70 2d  eight(pParse, p-
5d70: 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 20  >nHeight);.  }. 
5d80: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
5d90: 0a 2a 2a 20 41 64 64 20 70 53 65 6c 65 63 74 20  .** Add pSelect 
5da0: 74 6f 20 74 68 65 20 45 78 70 72 2e 78 2e 70 53  to the Expr.x.pS
5db0: 65 6c 65 63 74 20 66 69 65 6c 64 2e 20 20 4f 72  elect field.  Or
5dc0: 2c 20 69 66 20 70 45 78 70 72 20 69 73 20 4e 55  , if pExpr is NU
5dd0: 4c 4c 20 28 64 75 65 0a 2a 2a 20 64 6f 20 61 20  LL (due.** do a 
5de0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
5df0: 6e 20 66 61 69 6c 75 72 65 29 20 74 68 65 6e 20  n failure) then 
5e00: 64 65 6c 65 74 65 20 74 68 65 20 70 53 65 6c 65  delete the pSele
5e10: 63 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f  ct object..*/.vo
5e20: 69 64 20 73 71 6c 69 74 65 33 50 45 78 70 72 41  id sqlite3PExprA
5e30: 64 64 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a  ddSelect(Parse *
5e40: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
5e50: 78 70 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  xpr, Select *pSe
5e60: 6c 65 63 74 29 7b 0a 20 20 69 66 28 20 70 45 78  lect){.  if( pEx
5e70: 70 72 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d  pr ){.    pExpr-
5e80: 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 70 53 65  >x.pSelect = pSe
5e90: 6c 65 63 74 3b 0a 20 20 20 20 45 78 70 72 53 65  lect;.    ExprSe
5ea0: 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  tProperty(pExpr,
5eb0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 7c 45 50   EP_xIsSelect|EP
5ec0: 5f 53 75 62 71 75 65 72 79 29 3b 0a 20 20 20 20  _Subquery);.    
5ed0: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65  sqlite3ExprSetHe
5ee0: 69 67 68 74 41 6e 64 46 6c 61 67 73 28 70 50 61  ightAndFlags(pPa
5ef0: 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 7d  rse, pExpr);.  }
5f00: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
5f10: 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
5f20: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
5f30: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
5f40: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
5f50: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a  , pSelect);.  }.
5f60: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  }.../*.** If the
5f70: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
5f80: 6c 77 61 79 73 20 65 69 74 68 65 72 20 54 52 55  lways either TRU
5f90: 45 20 6f 72 20 46 41 4c 53 45 20 28 72 65 73 70  E or FALSE (resp
5fa0: 65 63 74 69 76 65 6c 79 29 2c 0a 2a 2a 20 74 68  ectively),.** th
5fb0: 65 6e 20 72 65 74 75 72 6e 20 31 2e 20 20 49 66  en return 1.  If
5fc0: 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 64 65 74 65   one cannot dete
5fd0: 72 6d 69 6e 65 20 74 68 65 20 74 72 75 74 68 20  rmine the truth 
5fe0: 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20  value of the.** 
5ff0: 65 78 70 72 65 73 73 69 6f 6e 20 61 74 20 63 6f  expression at co
6000: 6d 70 69 6c 65 2d 74 69 6d 65 20 72 65 74 75 72  mpile-time retur
6010: 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  n 0..**.** This 
6020: 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
6030: 6f 6e 2e 20 20 49 66 20 69 73 20 4f 4b 20 74 6f  on.  If is OK to
6040: 20 72 65 74 75 72 6e 20 30 20 68 65 72 65 20 65   return 0 here e
6050: 76 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20 65 78  ven if.** the ex
6060: 70 72 65 73 73 69 6f 6e 20 72 65 61 6c 6c 79 20  pression really 
6070: 69 73 20 61 6c 77 61 79 73 20 66 61 6c 73 65 20  is always false 
6080: 6f 72 20 66 61 6c 73 65 20 28 61 20 66 61 6c 73  or false (a fals
6090: 65 20 6e 65 67 61 74 69 76 65 29 2e 0a 2a 2a 20  e negative)..** 
60a0: 42 75 74 20 69 74 20 69 73 20 61 20 62 75 67 20  But it is a bug 
60b0: 74 6f 20 72 65 74 75 72 6e 20 31 20 69 66 20 74  to return 1 if t
60c0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 69  he expression mi
60d0: 67 68 74 20 68 61 76 65 20 64 69 66 66 65 72 65  ght have differe
60e0: 6e 74 0a 2a 2a 20 62 6f 6f 6c 65 61 6e 20 76 61  nt.** boolean va
60f0: 6c 75 65 73 20 69 6e 20 64 69 66 66 65 72 65 6e  lues in differen
6100: 74 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 20  t circumstances 
6110: 28 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76  (a false positiv
6120: 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  e.).**.** Note t
6130: 68 61 74 20 69 66 20 74 68 65 20 65 78 70 72 65  hat if the expre
6140: 73 73 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66  ssion is part of
6150: 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 66 6f 72   conditional for
6160: 20 61 0a 2a 2a 20 4c 45 46 54 20 4a 4f 49 4e 2c   a.** LEFT JOIN,
6170: 20 74 68 65 6e 20 77 65 20 63 61 6e 6e 6f 74 20   then we cannot 
6180: 64 65 74 65 72 6d 69 6e 65 20 61 74 20 63 6f 6d  determine at com
6190: 70 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68 65  pile-time whethe
61a0: 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 69 73 20 69  r or not.** is i
61b0: 74 20 74 72 75 65 20 6f 72 20 66 61 6c 73 65 2c  t true or false,
61c0: 20 73 6f 20 61 6c 77 61 79 73 20 72 65 74 75 72   so always retur
61d0: 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n 0..*/.static i
61e0: 6e 74 20 65 78 70 72 41 6c 77 61 79 73 54 72 75  nt exprAlwaysTru
61f0: 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e  e(Expr *p){.  in
6200: 74 20 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 45  t v = 0;.  if( E
6210: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
6220: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
6230: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
6240: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 49   !sqlite3ExprIsI
6250: 6e 74 65 67 65 72 28 70 2c 20 26 76 29 20 29 20  nteger(p, &v) ) 
6260: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
6270: 72 6e 20 76 21 3d 30 3b 0a 7d 0a 73 74 61 74 69  rn v!=0;.}.stati
6280: 63 20 69 6e 74 20 65 78 70 72 41 6c 77 61 79 73  c int exprAlways
6290: 46 61 6c 73 65 28 45 78 70 72 20 2a 70 29 7b 0a  False(Expr *p){.
62a0: 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 69    int v = 0;.  i
62b0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
62c0: 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  ty(p, EP_FromJoi
62d0: 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  n) ) return 0;. 
62e0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
62f0: 72 49 73 49 6e 74 65 67 65 72 28 70 2c 20 26 76  rIsInteger(p, &v
6300: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
6310: 72 65 74 75 72 6e 20 76 3d 3d 30 3b 0a 7d 0a 0a  return v==0;.}..
6320: 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f 20 65  /*.** Join two e
6330: 78 70 72 65 73 73 69 6f 6e 73 20 75 73 69 6e 67  xpressions using
6340: 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
6350: 2e 20 20 49 66 20 65 69 74 68 65 72 20 65 78 70  .  If either exp
6360: 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 4e 55  ression is.** NU
6370: 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65  LL, then just re
6380: 74 75 72 6e 20 74 68 65 20 6f 74 68 65 72 20 65  turn the other e
6390: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
63a0: 20 49 66 20 6f 6e 65 20 73 69 64 65 20 6f 72 20   If one side or 
63b0: 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
63c0: 20 41 4e 44 20 69 73 20 6b 6e 6f 77 6e 20 74 6f   AND is known to
63d0: 20 62 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   be false, then 
63e0: 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 72 65  instead.** of re
63f0: 74 75 72 6e 69 6e 67 20 61 6e 20 41 4e 44 20 65  turning an AND e
6400: 78 70 72 65 73 73 69 6f 6e 2c 20 6a 75 73 74 20  xpression, just 
6410: 72 65 74 75 72 6e 20 61 20 63 6f 6e 73 74 61 6e  return a constan
6420: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74  t expression wit
6430: 68 0a 2a 2a 20 61 20 76 61 6c 75 65 20 6f 66 20  h.** a value of 
6440: 66 61 6c 73 65 2e 0a 2a 2f 0a 45 78 70 72 20 2a  false..*/.Expr *
6450: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 73  sqlite3ExprAnd(s
6460: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
6470: 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20 2a 70   *pLeft, Expr *p
6480: 52 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 4c  Right){.  if( pL
6490: 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  eft==0 ){.    re
64a0: 74 75 72 6e 20 70 52 69 67 68 74 3b 0a 20 20 7d  turn pRight;.  }
64b0: 65 6c 73 65 20 69 66 28 20 70 52 69 67 68 74 3d  else if( pRight=
64c0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
64d0: 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73 65 20   pLeft;.  }else 
64e0: 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 46 61  if( exprAlwaysFa
64f0: 6c 73 65 28 70 4c 65 66 74 29 20 7c 7c 20 65 78  lse(pLeft) || ex
6500: 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 52  prAlwaysFalse(pR
6510: 69 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71 6c  ight) ){.    sql
6520: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
6530: 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  b, pLeft);.    s
6540: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
6550: 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  (db, pRight);.  
6560: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
6570: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
6580: 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c 69 74  _INTEGER, &sqlit
6590: 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 30 5d 2c 20  e3IntTokens[0], 
65a0: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
65b0: 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71   Expr *pNew = sq
65c0: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
65d0: 62 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c 20 30 29  b, TK_AND, 0, 0)
65e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
65f0: 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28  rAttachSubtrees(
6600: 64 62 2c 20 70 4e 65 77 2c 20 70 4c 65 66 74 2c  db, pNew, pLeft,
6610: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65   pRight);.    re
6620: 74 75 72 6e 20 70 4e 65 77 3b 0a 20 20 7d 0a 7d  turn pNew;.  }.}
6630: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63  ../*.** Construc
6640: 74 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69  t a new expressi
6650: 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20 66 75  on node for a fu
6660: 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74  nction with mult
6670: 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  iple.** argument
6680: 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  s..*/.Expr *sqli
6690: 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28  te3ExprFunction(
66a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
66b0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
66c0: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
66d0: 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
66e0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
66f0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65  arse->db;.  asse
6700: 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b 0a 20 20  rt( pToken );.  
6710: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
6720: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 46  prAlloc(db, TK_F
6730: 55 4e 43 54 49 4f 4e 2c 20 70 54 6f 6b 65 6e 2c  UNCTION, pToken,
6740: 20 31 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d   1);.  if( pNew=
6750: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
6760: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
6770: 64 62 2c 20 70 4c 69 73 74 29 3b 20 2f 2a 20 41  db, pList); /* A
6780: 76 6f 69 64 20 6d 65 6d 6f 72 79 20 6c 65 61 6b  void memory leak
6790: 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69   when malloc fai
67a0: 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ls */.    return
67b0: 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e   0;.  }.  pNew->
67c0: 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b  x.pList = pList;
67d0: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
67e0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
67f0: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
6800: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
6810: 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67  SetHeightAndFlag
6820: 73 28 70 50 61 72 73 65 2c 20 70 4e 65 77 29 3b  s(pParse, pNew);
6830: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
6840: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20  }../*.** Assign 
6850: 61 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  a variable numbe
6860: 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69  r to an expressi
6870: 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64 65 73 20  on that encodes 
6880: 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69 6e  a wildcard.** in
6890: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51   the original SQ
68a0: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a 2a  L statement.  .*
68b0: 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 63  *.** Wildcards c
68c0: 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73  onsisting of a s
68d0: 69 6e 67 6c 65 20 22 3f 22 20 61 72 65 20 61 73  ingle "?" are as
68e0: 73 69 67 6e 65 64 20 74 68 65 20 6e 65 78 74 20  signed the next 
68f0: 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 76 61  sequential.** va
6900: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 2e 0a 2a  riable number..*
6910: 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f  *.** Wildcards o
6920: 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e  f the form "?nnn
6930: 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  " are assigned t
6940: 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e 6e 22 2e  he number "nnn".
6950: 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20 73 75 72    We make.** sur
6960: 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f 74 20 74  e "nnn" is not t
6970: 6f 6f 20 62 65 20 74 6f 20 61 76 6f 69 64 20 61  oo be to avoid a
6980: 20 64 65 6e 69 61 6c 20 6f 66 20 73 65 72 76 69   denial of servi
6990: 63 65 20 61 74 74 61 63 6b 20 77 68 65 6e 0a 2a  ce attack when.*
69a0: 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  * the SQL statem
69b0: 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20 61  ent comes from a
69c0: 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f 75 72 63  n external sourc
69d0: 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72  e..**.** Wildcar
69e0: 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ds of the form "
69f0: 3a 61 61 61 22 2c 20 22 40 61 61 61 22 2c 20 6f  :aaa", "@aaa", o
6a00: 72 20 22 24 61 61 61 22 20 61 72 65 20 61 73 73  r "$aaa" are ass
6a10: 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65 20 6e  igned the same n
6a20: 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68 65 20  umber.** as the 
6a30: 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61 6e 63  previous instanc
6a40: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 77 69  e of the same wi
6a50: 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66 20 74  ldcard.  Or if t
6a60: 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
6a70: 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  .** instance of 
6a80: 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20 74 68  the wildcard, th
6a90: 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69 61  e next sequentia
6aa0: 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  l variable numbe
6ab0: 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65 64  r is.** assigned
6ac0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
6ad0: 33 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e 75  3ExprAssignVarNu
6ae0: 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50 61 72  mber(Parse *pPar
6af0: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
6b00: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
6b10: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
6b20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 0a  const char *z;..
6b30: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
6b40: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
6b50: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
6b60: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
6b70: 74 56 61 6c 75 65 7c 45 50 5f 52 65 64 75 63 65  tValue|EP_Reduce
6b80: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  d|EP_TokenOnly) 
6b90: 29 3b 0a 20 20 7a 20 3d 20 70 45 78 70 72 2d 3e  );.  z = pExpr->
6ba0: 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 61 73 73 65  u.zToken;.  asse
6bb0: 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 61 73  rt( z!=0 );.  as
6bc0: 73 65 72 74 28 20 7a 5b 30 5d 21 3d 30 20 29 3b  sert( z[0]!=0 );
6bd0: 0a 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 30 20 29  .  if( z[1]==0 )
6be0: 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72  {.    /* Wildcar
6bf0: 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  d of the form "?
6c00: 22 2e 20 20 41 73 73 69 67 6e 20 74 68 65 20 6e  ".  Assign the n
6c10: 65 78 74 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ext variable num
6c20: 62 65 72 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ber */.    asser
6c30: 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 3b 0a  t( z[0]=='?' );.
6c40: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
6c50: 6d 6e 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70  mn = (ynVar)(++p
6c60: 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20  Parse->nVar);.  
6c70: 7d 65 6c 73 65 7b 0a 20 20 20 20 79 6e 56 61 72  }else{.    ynVar
6c80: 20 78 20 3d 20 30 3b 0a 20 20 20 20 75 33 32 20   x = 0;.    u32 
6c90: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
6ca0: 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69 66 28 20  n30(z);.    if( 
6cb0: 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20 20  z[0]=='?' ){.   
6cc0: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f     /* Wildcard o
6cd0: 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e  f the form "?nnn
6ce0: 22 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e 6e 6e  ".  Convert "nnn
6cf0: 22 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  " to an integer 
6d00: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75 73 65  and.      ** use
6d10: 20 69 74 20 61 73 20 74 68 65 20 76 61 72 69 61   it as the varia
6d20: 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ble number */.  
6d30: 20 20 20 20 69 36 34 20 69 3b 0a 20 20 20 20 20      i64 i;.     
6d40: 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3d 3d 73 71   int bOk = 0==sq
6d50: 6c 69 74 65 33 41 74 6f 69 36 34 28 26 7a 5b 31  lite3Atoi64(&z[1
6d60: 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20 53 51 4c 49  ], &i, n-1, SQLI
6d70: 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20  TE_UTF8);.      
6d80: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
6d90: 20 78 20 3d 20 28 79 6e 56 61 72 29 69 3b 0a 20   x = (ynVar)i;. 
6da0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
6db0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
6dc0: 74 63 61 73 65 28 20 69 3d 3d 31 20 29 3b 0a 20  tcase( i==1 );. 
6dd0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
6de0: 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ==db->aLimit[SQL
6df0: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
6e00: 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20 29 3b 0a  LE_NUMBER]-1 );.
6e10: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
6e20: 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  i==db->aLimit[SQ
6e30: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
6e40: 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 3b 0a 20  BLE_NUMBER] );. 
6e50: 20 20 20 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20       if( bOk==0 
6e60: 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e 64 62 2d 3e  || i<1 || i>db->
6e70: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
6e80: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
6e90: 42 45 52 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  BER] ){.        
6ea0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
6eb0: 70 50 61 72 73 65 2c 20 22 76 61 72 69 61 62 6c  pParse, "variabl
6ec0: 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 62 65  e number must be
6ed0: 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e 64 20   between ?1 and 
6ee0: 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ?%d",.          
6ef0: 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c    db->aLimit[SQL
6f00: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
6f10: 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a 20 20 20  LE_NUMBER]);.   
6f20: 20 20 20 20 20 78 20 3d 20 30 3b 0a 20 20 20 20       x = 0;.    
6f30: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e    }.      if( i>
6f40: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a  pParse->nVar ){.
6f50: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
6f60: 6e 56 61 72 20 3d 20 28 69 6e 74 29 69 3b 0a 20  nVar = (int)i;. 
6f70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
6f80: 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63  {.      /* Wildc
6f90: 61 72 64 73 20 6c 69 6b 65 20 22 3a 61 61 61 22  ards like ":aaa"
6fa0: 2c 20 22 24 61 61 61 22 20 6f 72 20 22 40 61 61  , "$aaa" or "@aa
6fb0: 61 22 2e 20 20 52 65 75 73 65 20 74 68 65 20 73  a".  Reuse the s
6fc0: 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20  ame variable.   
6fd0: 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20     ** number as 
6fe0: 74 68 65 20 70 72 69 6f 72 20 61 70 70 65 61 72  the prior appear
6ff0: 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65  ance of the same
7000: 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65   name, or if the
7010: 20 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 68   name.      ** h
7020: 61 73 20 6e 65 76 65 72 20 61 70 70 65 61 72 65  as never appeare
7030: 64 20 62 65 66 6f 72 65 2c 20 72 65 75 73 65 20  d before, reuse 
7040: 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c  the same variabl
7050: 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a  e number.      *
7060: 2f 0a 20 20 20 20 20 20 79 6e 56 61 72 20 69 3b  /.      ynVar i;
7070: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
7080: 69 3c 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 3b  i<pParse->nzVar;
7090: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
70a0: 66 28 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  f( pParse->azVar
70b0: 5b 69 5d 20 26 26 20 73 74 72 63 6d 70 28 70 50  [i] && strcmp(pP
70c0: 61 72 73 65 2d 3e 61 7a 56 61 72 5b 69 5d 2c 7a  arse->azVar[i],z
70d0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
70e0: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
70f0: 20 3d 20 78 20 3d 20 28 79 6e 56 61 72 29 69 2b   = x = (ynVar)i+
7100: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
7110: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
7120: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
7130: 78 3d 3d 30 20 29 20 78 20 3d 20 70 45 78 70 72  x==0 ) x = pExpr
7140: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56  ->iColumn = (ynV
7150: 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56  ar)(++pParse->nV
7160: 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ar);.    }.    i
7170: 66 28 20 78 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( x>0 ){.      
7180: 69 66 28 20 78 3e 70 50 61 72 73 65 2d 3e 6e 7a  if( x>pParse->nz
7190: 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Var ){.        c
71a0: 68 61 72 20 2a 2a 61 3b 0a 20 20 20 20 20 20 20  har **a;.       
71b0: 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65   a = sqlite3DbRe
71c0: 61 6c 6c 6f 63 28 64 62 2c 20 70 50 61 72 73 65  alloc(db, pParse
71d0: 2d 3e 61 7a 56 61 72 2c 20 78 2a 73 69 7a 65 6f  ->azVar, x*sizeo
71e0: 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20  f(a[0]));.      
71f0: 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20    if( a==0 ){.  
7200: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
7210: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
7220: 20 29 3b 20 2f 2a 20 45 72 72 6f 72 20 72 65 70   ); /* Error rep
7230: 6f 72 74 65 64 20 74 68 72 6f 75 67 68 20 6d 61  orted through ma
7240: 6c 6c 6f 63 46 61 69 6c 65 64 20 2a 2f 0a 20 20  llocFailed */.  
7250: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
7260: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7270: 20 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 20    pParse->azVar 
7280: 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  = a;.        mem
7290: 73 65 74 28 26 61 5b 70 50 61 72 73 65 2d 3e 6e  set(&a[pParse->n
72a0: 7a 56 61 72 5d 2c 20 30 2c 20 28 78 2d 70 50 61  zVar], 0, (x-pPa
72b0: 72 73 65 2d 3e 6e 7a 56 61 72 29 2a 73 69 7a 65  rse->nzVar)*size
72c0: 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20  of(a[0]));.     
72d0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72     pParse->nzVar
72e0: 20 3d 20 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = x;.      }.  
72f0: 20 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27 3f      if( z[0]!='?
7300: 27 20 7c 7c 20 70 50 61 72 73 65 2d 3e 61 7a 56  ' || pParse->azV
7310: 61 72 5b 78 2d 31 5d 3d 3d 30 20 29 7b 0a 20 20  ar[x-1]==0 ){.  
7320: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
7330: 72 65 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e  ree(db, pParse->
7340: 61 7a 56 61 72 5b 78 2d 31 5d 29 3b 0a 20 20 20  azVar[x-1]);.   
7350: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 7a 56       pParse->azV
7360: 61 72 5b 78 2d 31 5d 20 3d 20 73 71 6c 69 74 65  ar[x-1] = sqlite
7370: 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 7a  3DbStrNDup(db, z
7380: 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , n);.      }.  
7390: 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66 28 20 21    }.  } .  if( !
73a0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 26 26 20  pParse->nErr && 
73b0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 64 62 2d  pParse->nVar>db-
73c0: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
73d0: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
73e0: 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 73 71 6c  MBER] ){.    sql
73f0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7400: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53  rse, "too many S
7410: 51 4c 20 76 61 72 69 61 62 6c 65 73 22 29 3b 0a  QL variables");.
7420: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63    }.}../*.** Rec
7430: 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20  ursively delete 
7440: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
7450: 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  ee..*/.static SQ
7460: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f  LITE_NOINLINE vo
7470: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  id sqlite3ExprDe
7480: 6c 65 74 65 4e 4e 28 73 71 6c 69 74 65 33 20 2a  leteNN(sqlite3 *
7490: 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  db, Expr *p){.  
74a0: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
74b0: 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
74c0: 6b 3a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  k: Assert that t
74d0: 68 65 20 49 6e 74 56 61 6c 75 65 20 69 73 20 6e  he IntValue is n
74e0: 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 66 20 69  on-negative if i
74f0: 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 61 73  t exists */.  as
7500: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
7510: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74  operty(p, EP_Int
7520: 56 61 6c 75 65 29 20 7c 7c 20 70 2d 3e 75 2e 69  Value) || p->u.i
7530: 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 20 20 69 66  Value>=0 );.  if
7540: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
7550: 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ty(p, EP_TokenOn
7560: 6c 79 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ly) ){.    /* Th
7570: 65 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69  e Expr.x union i
7580: 73 20 6e 65 76 65 72 20 75 73 65 64 20 61 74 20  s never used at 
7590: 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73  the same time as
75a0: 20 45 78 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a   Expr.pRight */.
75b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 78      assert( p->x
75c0: 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e  .pList==0 || p->
75d0: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
75e0: 20 69 66 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 53   if( p->op!=TK_S
75f0: 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 20 73  ELECT_COLUMN ) s
7600: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
7610: 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a  (db, p->pLeft);.
7620: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
7630: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 52 69  elete(db, p->pRi
7640: 67 68 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78  ght);.    if( Ex
7650: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
7660: 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 20   EP_MemToken) ) 
7670: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
7680: 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  , p->u.zToken);.
7690: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
76a0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49  roperty(p, EP_xI
76b0: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
76c0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
76d0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70  elete(db, p->x.p
76e0: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c  Select);.    }el
76f0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
7700: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
7710: 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b  db, p->x.pList);
7720: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
7730: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
7740: 79 28 70 2c 20 45 50 5f 53 74 61 74 69 63 29 20  y(p, EP_Static) 
7750: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
7760: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d  Free(db, p);.  }
7770: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  .}.void sqlite3E
7780: 78 70 72 44 65 6c 65 74 65 28 73 71 6c 69 74 65  xprDelete(sqlite
7790: 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b  3 *db, Expr *p){
77a0: 0a 20 20 69 66 28 20 70 20 29 20 73 71 6c 69 74  .  if( p ) sqlit
77b0: 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 64  e3ExprDeleteNN(d
77c0: 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, p);.}../*.** 
77d0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
77e0: 72 20 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f 63  r of bytes alloc
77f0: 61 74 65 64 20 66 6f 72 20 74 68 65 20 65 78 70  ated for the exp
7800: 72 65 73 73 69 6f 6e 20 73 74 72 75 63 74 75 72  ression structur
7810: 65 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20  e .** passed as 
7820: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
7830: 6e 74 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61  nt. This is alwa
7840: 79 73 20 6f 6e 65 20 6f 66 20 45 58 50 52 5f 46  ys one of EXPR_F
7850: 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58 50 52  ULLSIZE,.** EXPR
7860: 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72 20  _REDUCEDSIZE or 
7870: 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49  EXPR_TOKENONLYSI
7880: 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ZE..*/.static in
7890: 74 20 65 78 70 72 53 74 72 75 63 74 53 69 7a 65  t exprStructSize
78a0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28  (Expr *p){.  if(
78b0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
78c0: 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  (p, EP_TokenOnly
78d0: 29 20 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f  ) ) return EXPR_
78e0: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a 20  TOKENONLYSIZE;. 
78f0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
7900: 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63  erty(p, EP_Reduc
7910: 65 64 29 20 29 20 72 65 74 75 72 6e 20 45 58 50  ed) ) return EXP
7920: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 3b 0a 20  R_REDUCEDSIZE;. 
7930: 20 72 65 74 75 72 6e 20 45 58 50 52 5f 46 55 4c   return EXPR_FUL
7940: 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  LSIZE;.}../*.** 
7950: 54 68 65 20 64 75 70 65 64 45 78 70 72 2a 53 69  The dupedExpr*Si
7960: 7a 65 28 29 20 72 6f 75 74 69 6e 65 73 20 65 61  ze() routines ea
7970: 63 68 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  ch return the nu
7980: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
7990: 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20 73 74 6f  quired.** to sto
79a0: 72 65 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 20  re a copy of an 
79b0: 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 20 65 78  expression or ex
79c0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
79d0: 54 68 65 79 20 64 69 66 66 65 72 20 69 6e 0a 2a  They differ in.*
79e0: 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66 20 74 68  * how much of th
79f0: 65 20 74 72 65 65 20 69 73 20 6d 65 61 73 75 72  e tree is measur
7a00: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 75  ed..**.**     du
7a10: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
7a20: 65 28 29 20 20 20 20 20 53 69 7a 65 20 6f 66 20  e()     Size of 
7a30: 6f 6e 6c 79 20 74 68 65 20 45 78 70 72 20 73 74  only the Expr st
7a40: 72 75 63 74 75 72 65 20 0a 2a 2a 20 20 20 20 20  ructure .**     
7a50: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
7a60: 65 28 29 20 20 20 20 20 20 20 53 69 7a 65 20 6f  e()       Size o
7a70: 66 20 45 78 70 72 20 2b 20 73 70 61 63 65 20 66  f Expr + space f
7a80: 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20 20  or token.**     
7a90: 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 29 20  dupedExprSize() 
7aa0: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2b            Expr +
7ab0: 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74 72 65 65   token + subtree
7ac0: 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a   components.**.*
7ad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7af0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
7b20: 20 54 68 65 20 64 75 70 65 64 45 78 70 72 53 74   The dupedExprSt
7b30: 72 75 63 74 53 69 7a 65 28 29 20 66 75 6e 63 74  ructSize() funct
7b40: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 77 6f 20  ion returns two 
7b50: 76 61 6c 75 65 73 20 4f 52 2d 65 64 20 74 6f 67  values OR-ed tog
7b60: 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28 31 29 20  ether:  .** (1) 
7b70: 74 68 65 20 73 70 61 63 65 20 72 65 71 75 69 72  the space requir
7b80: 65 64 20 66 6f 72 20 61 20 63 6f 70 79 20 6f 66  ed for a copy of
7b90: 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74   the Expr struct
7ba0: 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20 0a 2a 2a  ure only and .**
7bb0: 20 28 32 29 20 74 68 65 20 45 50 5f 78 78 78 20   (2) the EP_xxx 
7bc0: 66 6c 61 67 73 20 74 68 61 74 20 69 6e 64 69 63  flags that indic
7bd0: 61 74 65 20 77 68 61 74 20 74 68 65 20 73 74 72  ate what the str
7be0: 75 63 74 75 72 65 20 73 69 7a 65 20 73 68 6f 75  ucture size shou
7bf0: 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65 20 72 65  ld be..** The re
7c00: 74 75 72 6e 20 76 61 6c 75 65 73 20 69 73 20 61  turn values is a
7c10: 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a 2a  lways one of:.**
7c20: 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 46 55  .**      EXPR_FU
7c30: 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20 20 20 45  LLSIZE.**      E
7c40: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
7c50: 20 20 7c 20 45 50 5f 52 65 64 75 63 65 64 0a 2a    | EP_Reduced.*
7c60: 2a 20 20 20 20 20 20 45 58 50 52 5f 54 4f 4b 45  *      EXPR_TOKE
7c70: 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54  NONLYSIZE | EP_T
7c80: 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54  okenOnly.**.** T
7c90: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 73  he size of the s
7ca0: 74 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20  tructure can be 
7cb0: 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67  found by masking
7cc0: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
7cd0: 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f 75  e.** of this rou
7ce0: 74 69 6e 65 20 77 69 74 68 20 30 78 66 66 66 2e  tine with 0xfff.
7cf0: 20 20 54 68 65 20 66 6c 61 67 73 20 63 61 6e 20    The flags can 
7d00: 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b  be found by mask
7d10: 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65 74 75 72  ing the.** retur
7d20: 6e 20 76 61 6c 75 65 20 77 69 74 68 20 45 50 5f  n value with EP_
7d30: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
7d40: 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  Only..**.** Note
7d50: 20 74 68 61 74 20 77 69 74 68 20 66 6c 61 67 73   that with flags
7d60: 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  ==EXPRDUP_REDUCE
7d70: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 73 20  , this routines 
7d80: 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c 2d 73 69  works on full-si
7d90: 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75 63 65 64  ze.** (unreduced
7da0: 29 20 45 78 70 72 20 6f 62 6a 65 63 74 73 20 61  ) Expr objects a
7db0: 73 20 74 68 65 79 20 6f 72 20 6f 72 69 67 69 6e  s they or origin
7dc0: 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63 74 65 64  ally constructed
7dd0: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e 0a   by the parser..
7de0: 2a 2a 20 44 75 72 69 6e 67 20 65 78 70 72 65 73  ** During expres
7df0: 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 2c 20 65  sion analysis, e
7e00: 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  xtra information
7e10: 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64   is computed and
7e20: 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a 2a 20 6c   moved into.** l
7e30: 61 74 65 72 20 70 61 72 74 73 20 6f 66 20 74 65  ater parts of te
7e40: 68 20 45 78 70 72 20 6f 62 6a 65 63 74 20 61 6e  h Expr object an
7e50: 64 20 74 68 61 74 20 65 78 74 72 61 20 69 6e 66  d that extra inf
7e60: 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68 74 20 67  ormation might g
7e70: 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a 20 6f 66  et chopped.** of
7e80: 66 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  f if the express
7e90: 69 6f 6e 20 69 73 20 72 65 64 75 63 65 64 2e 20  ion is reduced. 
7ea0: 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20   Note also that 
7eb0: 69 74 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  it does not work
7ec0: 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61 6e 20 45   to.** make an E
7ed0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 63 6f  XPRDUP_REDUCE co
7ee0: 70 79 20 6f 66 20 61 20 72 65 64 75 63 65 64 20  py of a reduced 
7ef0: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 74 20  expression.  It 
7f00: 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c 0a 2a 2a  is only legal.**
7f10: 20 74 6f 20 72 65 64 75 63 65 20 61 20 70 72 69   to reduce a pri
7f20: 73 74 69 6e 65 20 65 78 70 72 65 73 73 69 6f 6e  stine expression
7f30: 20 74 72 65 65 20 66 72 6f 6d 20 74 68 65 20 70   tree from the p
7f40: 61 72 73 65 72 2e 20 20 54 68 65 20 69 6d 70 6c  arser.  The impl
7f50: 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 6f 66  ementation.** of
7f60: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
7f70: 53 69 7a 65 28 29 20 63 6f 6e 74 61 69 6e 20 6d  Size() contain m
7f80: 75 6c 74 69 70 6c 65 20 61 73 73 65 72 74 28 29  ultiple assert()
7f90: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74   statements that
7fa0: 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 65   attempt.** to e
7fb0: 6e 66 6f 72 63 65 20 74 68 69 73 20 63 6f 6e 73  nforce this cons
7fc0: 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  traint..*/.stati
7fd0: 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53  c int dupedExprS
7fe0: 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a  tructSize(Expr *
7ff0: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
8000: 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20 20 61 73   int nSize;.  as
8010: 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 45 58 50  sert( flags==EXP
8020: 52 44 55 50 5f 52 45 44 55 43 45 20 7c 7c 20 66  RDUP_REDUCE || f
8030: 6c 61 67 73 3d 3d 30 20 29 3b 20 2f 2a 20 4f 6e  lags==0 ); /* On
8040: 6c 79 20 6f 6e 65 20 66 6c 61 67 20 76 61 6c 75  ly one flag valu
8050: 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 61  e allowed */.  a
8060: 73 73 65 72 74 28 20 45 58 50 52 5f 46 55 4c 4c  ssert( EXPR_FULL
8070: 53 49 5a 45 3c 3d 30 78 66 66 66 20 29 3b 0a 20  SIZE<=0xfff );. 
8080: 20 61 73 73 65 72 74 28 20 28 30 78 66 66 66 20   assert( (0xfff 
8090: 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50  & (EP_Reduced|EP
80a0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d 3d 30 20  _TokenOnly))==0 
80b0: 29 3b 0a 20 20 69 66 28 20 30 3d 3d 66 6c 61 67  );.  if( 0==flag
80c0: 73 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d  s ){.    nSize =
80d0: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a   EXPR_FULLSIZE;.
80e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
80f0: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
8100: 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65  perty(p, EP_Toke
8110: 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
8120: 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
8130: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
8140: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
8150: 29 20 29 3b 20 0a 20 20 20 20 61 73 73 65 72 74  ) ); .    assert
8160: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
8170: 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65  ty(p, EP_MemToke
8180: 6e 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  n) );.    assert
8190: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
81a0: 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75 63  ty(p, EP_NoReduc
81b0: 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  e) );.    if( p-
81c0: 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e 78 2e 70  >pLeft || p->x.p
81d0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 53  List ){.      nS
81e0: 69 7a 65 20 3d 20 45 58 50 52 5f 52 45 44 55 43  ize = EXPR_REDUC
81f0: 45 44 53 49 5a 45 20 7c 20 45 50 5f 52 65 64 75  EDSIZE | EP_Redu
8200: 63 65 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ced;.    }else{.
8210: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
8220: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
8230: 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52      nSize = EXPR
8240: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c  _TOKENONLYSIZE |
8250: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20   EP_TokenOnly;. 
8260: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
8270: 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n nSize;.}../*.*
8280: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
8290: 72 65 74 75 72 6e 73 20 74 68 65 20 73 70 61 63  returns the spac
82a0: 65 20 69 6e 20 62 79 74 65 73 20 72 65 71 75 69  e in bytes requi
82b0: 72 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  red to store the
82c0: 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20 74 68 65   copy .** of the
82d0: 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20   Expr structure 
82e0: 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68  and a copy of th
82f0: 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20  e Expr.u.zToken 
8300: 73 74 72 69 6e 67 20 28 69 66 20 74 68 61 74 0a  string (if that.
8310: 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 64 65 66  ** string is def
8320: 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61 74 69 63  ined.).*/.static
8330: 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 4e 6f   int dupedExprNo
8340: 64 65 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20  deSize(Expr *p, 
8350: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
8360: 74 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45  t nByte = dupedE
8370: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c  xprStructSize(p,
8380: 20 66 6c 61 67 73 29 20 26 20 30 78 66 66 66 3b   flags) & 0xfff;
8390: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
83a0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e  roperty(p, EP_In
83b0: 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e  tValue) && p->u.
83c0: 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 6e 42  zToken ){.    nB
83d0: 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  yte += sqlite3St
83e0: 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b  rlen30(p->u.zTok
83f0: 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 74  en)+1;.  }.  ret
8400: 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42 79 74 65  urn ROUND8(nByte
8410: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
8420: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
8430: 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20   bytes required 
8440: 74 6f 20 63 72 65 61 74 65 20 61 20 64 75 70 6c  to create a dupl
8450: 69 63 61 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a  icate of the .**
8460: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73   expression pass
8470: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
8480: 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 73 65  argument. The se
8490: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
84a0: 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74 61   a.** mask conta
84b0: 69 6e 69 6e 67 20 45 58 50 52 44 55 50 5f 58 58  ining EXPRDUP_XX
84c0: 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54  X flags..**.** T
84d0: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
84e0: 64 20 69 6e 63 6c 75 64 65 73 20 73 70 61 63 65  d includes space
84f0: 20 74 6f 20 63 72 65 61 74 65 20 61 20 63 6f 70   to create a cop
8500: 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74  y of the Expr st
8510: 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c 66 20 61  ruct.** itself a
8520: 6e 64 20 74 68 65 20 62 75 66 66 65 72 20 72 65  nd the buffer re
8530: 66 65 72 72 65 64 20 74 6f 20 62 79 20 45 78 70  ferred to by Exp
8540: 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20 61  r.u.zToken, if a
8550: 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ny..**.** If the
8560: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20   EXPRDUP_REDUCE 
8570: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
8580: 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
8590: 75 65 20 69 6e 63 6c 75 64 65 73 20 0a 2a 2a 20  ue includes .** 
85a0: 73 70 61 63 65 20 74 6f 20 64 75 70 6c 69 63 61  space to duplica
85b0: 74 65 20 61 6c 6c 20 45 78 70 72 20 6e 6f 64 65  te all Expr node
85c0: 73 20 69 6e 20 74 68 65 20 74 72 65 65 20 66 6f  s in the tree fo
85d0: 72 6d 65 64 20 62 79 20 45 78 70 72 2e 70 4c 65  rmed by Expr.pLe
85e0: 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78 70 72 2e  ft .** and Expr.
85f0: 70 52 69 67 68 74 20 76 61 72 69 61 62 6c 65 73  pRight variables
8600: 20 28 62 75 74 20 6e 6f 74 20 66 6f 72 20 61 6e   (but not for an
8610: 79 20 73 74 72 75 63 74 75 72 65 73 20 70 6f 69  y structures poi
8620: 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a 2a 20 64  nted to or .** d
8630: 65 73 63 65 6e 64 65 64 20 66 72 6f 6d 20 74 68  escended from th
8640: 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 6f  e Expr.x.pList o
8650: 72 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74  r Expr.x.pSelect
8660: 20 76 61 72 69 61 62 6c 65 73 29 2e 0a 2a 2f 0a   variables)..*/.
8670: 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64  static int duped
8680: 45 78 70 72 53 69 7a 65 28 45 78 70 72 20 2a 70  ExprSize(Expr *p
8690: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
86a0: 69 6e 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20  int nByte = 0;. 
86b0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 6e 42   if( p ){.    nB
86c0: 79 74 65 20 3d 20 64 75 70 65 64 45 78 70 72 4e  yte = dupedExprN
86d0: 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  odeSize(p, flags
86e0: 29 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73  );.    if( flags
86f0: 26 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  &EXPRDUP_REDUCE 
8700: 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b  ){.      nByte +
8710: 3d 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28  = dupedExprSize(
8720: 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61 67 73 29  p->pLeft, flags)
8730: 20 2b 20 64 75 70 65 64 45 78 70 72 53 69 7a 65   + dupedExprSize
8740: 28 70 2d 3e 70 52 69 67 68 74 2c 20 66 6c 61 67  (p->pRight, flag
8750: 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  s);.    }.  }.  
8760: 72 65 74 75 72 6e 20 6e 42 79 74 65 3b 0a 7d 0a  return nByte;.}.
8770: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
8780: 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20  tion is similar 
8790: 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 44 75  to sqlite3ExprDu
87a0: 70 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74  p(), except that
87b0: 20 69 66 20 70 7a 42 75 66 66 65 72 20 0a 2a 2a   if pzBuffer .**
87c0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
87d0: 6e 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20 61  n *pzBuffer is a
87e0: 73 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74 20  ssumed to point 
87f0: 74 6f 20 61 20 62 75 66 66 65 72 20 6c 61 72 67  to a buffer larg
8800: 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f 20  e enough .** to 
8810: 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20 6f  store the copy o
8820: 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 2c 20  f expression p, 
8830: 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20 70 2d  the copies of p-
8840: 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69 66  >u.zToken.** (if
8850: 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 20 61 6e   applicable), an
8860: 64 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20  d the copies of 
8870: 74 68 65 20 70 2d 3e 70 4c 65 66 74 20 61 6e 64  the p->pLeft and
8880: 20 70 2d 3e 70 52 69 67 68 74 20 65 78 70 72 65   p->pRight expre
8890: 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61 6e  ssions,.** if an
88a0: 79 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  y. Before return
88b0: 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65 72 20 69  ing, *pzBuffer i
88c0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 66 69 72  s set to the fir
88d0: 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
88e0: 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  .** portion of t
88f0: 68 65 20 62 75 66 66 65 72 20 63 6f 70 69 65 64  he buffer copied
8900: 20 69 6e 74 6f 20 62 79 20 74 68 69 73 20 66 75   into by this fu
8910: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
8920: 63 20 45 78 70 72 20 2a 65 78 70 72 44 75 70 28  c Expr *exprDup(
8930: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
8940: 72 20 2a 70 2c 20 69 6e 74 20 64 75 70 46 6c 61  r *p, int dupFla
8950: 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66 65  gs, u8 **pzBuffe
8960: 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  r){.  Expr *pNew
8970: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56  ;           /* V
8980: 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  alue to return *
8990: 2f 0a 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 20  /.  u8 *zAlloc; 
89a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
89b0: 6f 72 79 20 73 70 61 63 65 20 66 72 6f 6d 20 77  ory space from w
89c0: 68 69 63 68 20 74 6f 20 62 75 69 6c 64 20 45 78  hich to build Ex
89d0: 70 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75  pr object */.  u
89e0: 33 32 20 73 74 61 74 69 63 46 6c 61 67 3b 20 20  32 staticFlag;  
89f0: 20 20 20 20 20 2f 2a 20 45 50 5f 53 74 61 74 69       /* EP_Stati
8a00: 63 20 69 66 20 73 70 61 63 65 20 6e 6f 74 20 6f  c if space not o
8a10: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
8a20: 6c 6f 63 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  loc */..  assert
8a30: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( db!=0 );.  ass
8a40: 65 72 74 28 20 70 20 29 3b 0a 20 20 61 73 73 65  ert( p );.  asse
8a50: 72 74 28 20 64 75 70 46 6c 61 67 73 3d 3d 30 20  rt( dupFlags==0 
8a60: 7c 7c 20 64 75 70 46 6c 61 67 73 3d 3d 45 58 50  || dupFlags==EXP
8a70: 52 44 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 20  RDUP_REDUCE );. 
8a80: 20 61 73 73 65 72 74 28 20 70 7a 42 75 66 66 65   assert( pzBuffe
8a90: 72 3d 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67 73  r==0 || dupFlags
8aa0: 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  ==EXPRDUP_REDUCE
8ab0: 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   );..  /* Figure
8ac0: 20 6f 75 74 20 77 68 65 72 65 20 74 6f 20 77 72   out where to wr
8ad0: 69 74 65 20 74 68 65 20 6e 65 77 20 45 78 70 72  ite the new Expr
8ae0: 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20   structure. */. 
8af0: 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b   if( pzBuffer ){
8b00: 0a 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a 70  .    zAlloc = *p
8b10: 7a 42 75 66 66 65 72 3b 0a 20 20 20 20 73 74 61  zBuffer;.    sta
8b20: 74 69 63 46 6c 61 67 20 3d 20 45 50 5f 53 74 61  ticFlag = EP_Sta
8b30: 74 69 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  tic;.  }else{.  
8b40: 20 20 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74    zAlloc = sqlit
8b50: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
8b60: 64 62 2c 20 64 75 70 65 64 45 78 70 72 53 69 7a  db, dupedExprSiz
8b70: 65 28 70 2c 20 64 75 70 46 6c 61 67 73 29 29 3b  e(p, dupFlags));
8b80: 0a 20 20 20 20 73 74 61 74 69 63 46 6c 61 67 20  .    staticFlag 
8b90: 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 20  = 0;.  }.  pNew 
8ba0: 3d 20 28 45 78 70 72 20 2a 29 7a 41 6c 6c 6f 63  = (Expr *)zAlloc
8bb0: 3b 0a 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b  ;..  if( pNew ){
8bc0: 0a 20 20 20 20 2f 2a 20 53 65 74 20 6e 4e 65 77  .    /* Set nNew
8bd0: 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65  Size to the size
8be0: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
8bf0: 68 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69  he structure poi
8c00: 6e 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62  nted to.    ** b
8c10: 79 20 70 4e 65 77 2e 20 54 68 69 73 20 69 73 20  y pNew. This is 
8c20: 65 69 74 68 65 72 20 45 58 50 52 5f 46 55 4c 4c  either EXPR_FULL
8c30: 53 49 5a 45 2c 20 45 58 50 52 5f 52 45 44 55 43  SIZE, EXPR_REDUC
8c40: 45 44 53 49 5a 45 20 6f 72 0a 20 20 20 20 2a 2a  EDSIZE or.    **
8c50: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
8c60: 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20 69 73 20 73  IZE. nToken is s
8c70: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
8c80: 20 6f 66 20 62 79 74 65 73 20 63 6f 6e 73 75 6d   of bytes consum
8c90: 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65  ed.    ** by the
8ca0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 2d 3e   copy of the p->
8cb0: 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20  u.zToken string 
8cc0: 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f  (if any)..    */
8cd0: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  .    const unsig
8ce0: 6e 65 64 20 6e 53 74 72 75 63 74 53 69 7a 65 20  ned nStructSize 
8cf0: 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63  = dupedExprStruc
8d00: 74 53 69 7a 65 28 70 2c 20 64 75 70 46 6c 61 67  tSize(p, dupFlag
8d10: 73 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  s);.    const in
8d20: 74 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74  t nNewSize = nSt
8d30: 72 75 63 74 53 69 7a 65 20 26 20 30 78 66 66 66  ructSize & 0xfff
8d40: 3b 0a 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e  ;.    int nToken
8d50: 3b 0a 20 20 20 20 69 66 28 20 21 45 78 70 72 48  ;.    if( !ExprH
8d60: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
8d70: 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d  _IntValue) && p-
8d80: 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  >u.zToken ){.   
8d90: 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c 69     nToken = sqli
8da0: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75  te3Strlen30(p->u
8db0: 2e 7a 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20 20  .zToken) + 1;.  
8dc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
8dd0: 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  Token = 0;.    }
8de0: 0a 20 20 20 20 69 66 28 20 64 75 70 46 6c 61 67  .    if( dupFlag
8df0: 73 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  s ){.      asser
8e00: 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  t( ExprHasProper
8e10: 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64  ty(p, EP_Reduced
8e20: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6d 65  )==0 );.      me
8e30: 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20  mcpy(zAlloc, p, 
8e40: 6e 4e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 7d  nNewSize);.    }
8e50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 33 32 20  else{.      u32 
8e60: 6e 53 69 7a 65 20 3d 20 28 75 33 32 29 65 78 70  nSize = (u32)exp
8e70: 72 53 74 72 75 63 74 53 69 7a 65 28 70 29 3b 0a  rStructSize(p);.
8e80: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c        memcpy(zAl
8e90: 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a 65 29 3b 0a  loc, p, nSize);.
8ea0: 20 20 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c        if( nSize<
8eb0: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 20 29 7b  EXPR_FULLSIZE ){
8ec0: 20 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74   .        memset
8ed0: 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d 2c  (&zAlloc[nSize],
8ee0: 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a   0, EXPR_FULLSIZ
8ef0: 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  E-nSize);.      
8f00: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
8f10: 53 65 74 20 74 68 65 20 45 50 5f 52 65 64 75 63  Set the EP_Reduc
8f20: 65 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ed, EP_TokenOnly
8f30: 2c 20 61 6e 64 20 45 50 5f 53 74 61 74 69 63 20  , and EP_Static 
8f40: 66 6c 61 67 73 20 61 70 70 72 6f 70 72 69 61 74  flags appropriat
8f50: 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 70 4e 65 77  ely. */.    pNew
8f60: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f  ->flags &= ~(EP_
8f70: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
8f80: 4f 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63 7c 45  Only|EP_Static|E
8f90: 50 5f 4d 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20 20  P_MemToken);.   
8fa0: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
8fb0: 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20 28 45  nStructSize & (E
8fc0: 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b  P_Reduced|EP_Tok
8fd0: 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20 70 4e 65  enOnly);.    pNe
8fe0: 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 73 74 61 74  w->flags |= stat
8ff0: 69 63 46 6c 61 67 3b 0a 0a 20 20 20 20 2f 2a 20  icFlag;..    /* 
9000: 43 6f 70 79 20 74 68 65 20 70 2d 3e 75 2e 7a 54  Copy the p->u.zT
9010: 6f 6b 65 6e 20 73 74 72 69 6e 67 2c 20 69 66 20  oken string, if 
9020: 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  any. */.    if( 
9030: 6e 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20  nToken ){.      
9040: 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70  char *zToken = p
9050: 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20  New->u.zToken = 
9060: 28 63 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e  (char*)&zAlloc[n
9070: 4e 65 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20  NewSize];.      
9080: 6d 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20 70  memcpy(zToken, p
9090: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  ->u.zToken, nTok
90a0: 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  en);.    }..    
90b0: 69 66 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67  if( 0==((p->flag
90c0: 73 7c 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26  s|pNew->flags) &
90d0: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
90e0: 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20  {.      /* Fill 
90f0: 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e 78 2e 70  in the pNew->x.p
9100: 53 65 6c 65 63 74 20 6f 72 20 70 4e 65 77 2d 3e  Select or pNew->
9110: 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65 72 2e 20  x.pList member. 
9120: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  */.      if( Exp
9130: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
9140: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
9150: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78  .        pNew->x
9160: 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  .pSelect = sqlit
9170: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
9180: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 64 75  p->x.pSelect, du
9190: 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 7d  pFlags);.      }
91a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e  else{.        pN
91b0: 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73 71  ew->x.pList = sq
91c0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
91d0: 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2c  (db, p->x.pList,
91e0: 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20   dupFlags);.    
91f0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
9200: 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65 77 2d 3e  * Fill in pNew->
9210: 70 4c 65 66 74 20 61 6e 64 20 70 4e 65 77 2d 3e  pLeft and pNew->
9220: 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 69  pRight. */.    i
9230: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
9240: 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64 75  ty(pNew, EP_Redu
9250: 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ced|EP_TokenOnly
9260: 29 20 29 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f  ) ){.      zAllo
9270: 63 20 2b 3d 20 64 75 70 65 64 45 78 70 72 4e 6f  c += dupedExprNo
9280: 64 65 53 69 7a 65 28 70 2c 20 64 75 70 46 6c 61  deSize(p, dupFla
9290: 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45  gs);.      if( E
92a0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
92b0: 4e 65 77 2c 20 45 50 5f 52 65 64 75 63 65 64 29  New, EP_Reduced)
92c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
92d0: 2d 3e 70 4c 65 66 74 20 3d 20 70 2d 3e 70 4c 65  ->pLeft = p->pLe
92e0: 66 74 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  ft ?.           
92f0: 20 20 20 20 20 20 20 20 20 20 20 65 78 70 72 44             exprD
9300: 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c  up(db, p->pLeft,
9310: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c   EXPRDUP_REDUCE,
9320: 20 26 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20   &zAlloc) : 0;. 
9330: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69         pNew->pRi
9340: 67 68 74 20 3d 20 70 2d 3e 70 52 69 67 68 74 20  ght = p->pRight 
9350: 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
9360: 20 20 20 20 20 20 20 20 20 65 78 70 72 44 75 70           exprDup
9370: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20  (db, p->pRight, 
9380: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20  EXPRDUP_REDUCE, 
9390: 26 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20  &zAlloc) : 0;.  
93a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
93b0: 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20  pzBuffer ){.    
93c0: 20 20 20 20 2a 70 7a 42 75 66 66 65 72 20 3d 20      *pzBuffer = 
93d0: 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 7d 0a  zAlloc;.      }.
93e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
93f0: 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
9400: 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65  perty(p, EP_Toke
9410: 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  nOnly) ){.      
9420: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
9430: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
9440: 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b  b, p->pLeft, 0);
9450: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
9460: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
9470: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52  xprDup(db, p->pR
9480: 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
9490: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
94a0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
94b0: 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e 64 20 72  .** Create and r
94c0: 65 74 75 72 6e 20 61 20 64 65 65 70 20 63 6f 70  eturn a deep cop
94d0: 79 20 6f 66 20 74 68 65 20 6f 62 6a 65 63 74 20  y of the object 
94e0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
94f0: 63 6f 6e 64 20 0a 2a 2a 20 61 72 67 75 6d 65 6e  cond .** argumen
9500: 74 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e  t. If an OOM con
9510: 64 69 74 69 6f 6e 20 69 73 20 65 6e 63 6f 75 6e  dition is encoun
9520: 74 65 72 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72  tered, NULL is r
9530: 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 74  eturned.** and t
9540: 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  he db->mallocFai
9550: 6c 65 64 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2f  led flag set..*/
9560: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9570: 4f 4d 49 54 5f 43 54 45 0a 73 74 61 74 69 63 20  OMIT_CTE.static 
9580: 57 69 74 68 20 2a 77 69 74 68 44 75 70 28 73 71  With *withDup(sq
9590: 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 74 68 20  lite3 *db, With 
95a0: 2a 70 29 7b 0a 20 20 57 69 74 68 20 2a 70 52 65  *p){.  With *pRe
95b0: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29  t = 0;.  if( p )
95c0: 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  {.    int nByte 
95d0: 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 73  = sizeof(*p) + s
95e0: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a  izeof(p->a[0]) *
95f0: 20 28 70 2d 3e 6e 43 74 65 2d 31 29 3b 0a 20 20   (p->nCte-1);.  
9600: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
9610: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
9620: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28   nByte);.    if(
9630: 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 69   pRet ){.      i
9640: 6e 74 20 69 3b 0a 20 20 20 20 20 20 70 52 65 74  nt i;.      pRet
9650: 2d 3e 6e 43 74 65 20 3d 20 70 2d 3e 6e 43 74 65  ->nCte = p->nCte
9660: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
9670: 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29   i<p->nCte; i++)
9680: 7b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  {.        pRet->
9690: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73  a[i].pSelect = s
96a0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
96b0: 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 53 65 6c  db, p->a[i].pSel
96c0: 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ect, 0);.       
96d0: 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 43 6f 6c   pRet->a[i].pCol
96e0: 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  s = sqlite3ExprL
96f0: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b  istDup(db, p->a[
9700: 69 5d 2e 70 43 6f 6c 73 2c 20 30 29 3b 0a 20 20  i].pCols, 0);.  
9710: 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d        pRet->a[i]
9720: 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  .zName = sqlite3
9730: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 2d 3e  DbStrDup(db, p->
9740: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
9750: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
9760: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
9770: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77  #else.# define w
9780: 69 74 68 44 75 70 28 78 2c 79 29 20 30 0a 23 65  ithDup(x,y) 0.#e
9790: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
97a0: 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20  following group 
97b0: 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65  of routines make
97c0: 20 64 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20   deep copies of 
97d0: 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20  expressions,.** 
97e0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73  expression lists
97f0: 2c 20 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20  , ID lists, and 
9800: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
9810: 73 2e 20 20 54 68 65 20 63 6f 70 69 65 73 20 63  s.  The copies c
9820: 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64  an.** be deleted
9830: 20 28 62 79 20 62 65 69 6e 67 20 70 61 73 73 65   (by being passe
9840: 64 20 74 6f 20 74 68 65 69 72 20 72 65 73 70 65  d to their respe
9850: 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28  ctive ...Delete(
9860: 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77  ) routines).** w
9870: 69 74 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67  ithout effecting
9880: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a   the originals..
9890: 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73  **.** The expres
98a0: 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61  sion list, ID, a
98b0: 6e 64 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20  nd source lists 
98c0: 72 65 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65  return by sqlite
98d0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a  3ExprListDup(),.
98e0: 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  ** sqlite3IdList
98f0: 44 75 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74  Dup(), and sqlit
9900: 65 33 53 72 63 4c 69 73 74 44 75 70 28 29 20 63  e3SrcListDup() c
9910: 61 6e 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65  an not be furthe
9920: 72 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62  r expanded .** b
9930: 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  y subsequent cal
9940: 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73  ls to sqlite*Lis
9950: 74 41 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e  tAppend() routin
9960: 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61  es..**.** Any ta
9970: 62 6c 65 73 20 74 68 61 74 20 74 68 65 20 53 72  bles that the Sr
9980: 63 4c 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e  cList might poin
9990: 74 20 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70  t to are not dup
99a0: 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  licated..**.** T
99b0: 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
99c0: 65 72 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f  er contains a co
99d0: 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65  mbination of the
99e0: 20 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61   EXPRDUP_XXX fla
99f0: 67 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 45 58  gs..** If the EX
9a00: 50 52 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61  PRDUP_REDUCE fla
9a10: 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  g is set, then t
9a20: 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65 74  he structure ret
9a30: 75 72 6e 65 64 20 69 73 20 61 0a 2a 2a 20 74 72  urned is a.** tr
9a40: 75 6e 63 61 74 65 64 20 76 65 72 73 69 6f 6e 20  uncated version 
9a50: 6f 66 20 74 68 65 20 75 73 75 61 6c 20 45 78 70  of the usual Exp
9a60: 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  r structure that
9a70: 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20   will be stored 
9a80: 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68  as.** part of th
9a90: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
9aa0: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
9ab0: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
9ac0: 61 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  a..*/.Expr *sqli
9ad0: 74 65 33 45 78 70 72 44 75 70 28 73 71 6c 69 74  te3ExprDup(sqlit
9ae0: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c  e3 *db, Expr *p,
9af0: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61   int flags){.  a
9b00: 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20  ssert( flags==0 
9b10: 7c 7c 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55  || flags==EXPRDU
9b20: 50 5f 52 45 44 55 43 45 20 29 3b 0a 20 20 72 65  P_REDUCE );.  re
9b30: 74 75 72 6e 20 70 20 3f 20 65 78 70 72 44 75 70  turn p ? exprDup
9b40: 28 64 62 2c 20 70 2c 20 66 6c 61 67 73 2c 20 30  (db, p, flags, 0
9b50: 29 20 3a 20 30 3b 0a 7d 0a 45 78 70 72 4c 69 73  ) : 0;.}.ExprLis
9b60: 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t *sqlite3ExprLi
9b70: 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  stDup(sqlite3 *d
9b80: 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 2c 20  b, ExprList *p, 
9b90: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 45 78  int flags){.  Ex
9ba0: 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  prList *pNew;.  
9bb0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
9bc0: 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f  item *pItem, *pO
9bd0: 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b  ldItem;.  int i;
9be0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
9bf0: 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
9c00: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
9c10: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
9c20: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
9c30: 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
9c40: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
9c50: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
9c60: 6e 45 78 70 72 20 3d 20 69 20 3d 20 70 2d 3e 6e  nExpr = i = p->n
9c70: 45 78 70 72 3b 0a 20 20 69 66 28 20 28 66 6c 61  Expr;.  if( (fla
9c80: 67 73 20 26 20 45 58 50 52 44 55 50 5f 52 45 44  gs & EXPRDUP_RED
9c90: 55 43 45 29 3d 3d 30 20 29 20 66 6f 72 28 69 3d  UCE)==0 ) for(i=
9ca0: 31 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69  1; i<p->nExpr; i
9cb0: 2b 3d 69 29 7b 7d 0a 20 20 70 4e 65 77 2d 3e 61  +=i){}.  pNew->a
9cc0: 20 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c 69 74   = pItem = sqlit
9cd0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
9ce0: 64 62 2c 20 20 69 2a 73 69 7a 65 6f 66 28 70 2d  db,  i*sizeof(p-
9cf0: 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  >a[0]) );.  if( 
9d00: 70 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  pItem==0 ){.    
9d10: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
9d20: 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74  , pNew);.    ret
9d30: 75 72 6e 20 30 3b 0a 20 20 7d 20 0a 20 20 70 4f  urn 0;.  } .  pO
9d40: 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20  ldItem = p->a;. 
9d50: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
9d60: 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
9d70: 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b  ++, pOldItem++){
9d80: 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 6c 64 45  .    Expr *pOldE
9d90: 78 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  xpr = pOldItem->
9da0: 70 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65 6d  pExpr;.    pItem
9db0: 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  ->pExpr = sqlite
9dc0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c  3ExprDup(db, pOl
9dd0: 64 45 78 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20  dExpr, flags);. 
9de0: 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20     pItem->zName 
9df0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
9e00: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
9e10: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65  zName);.    pIte
9e20: 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74  m->zSpan = sqlit
9e30: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
9e40: 4f 6c 64 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b  OldItem->zSpan);
9e50: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74  .    pItem->sort
9e60: 4f 72 64 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d  Order = pOldItem
9e70: 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ->sortOrder;.   
9e80: 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30   pItem->done = 0
9e90: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62 53 70  ;.    pItem->bSp
9ea0: 61 6e 49 73 54 61 62 20 3d 20 70 4f 6c 64 49 74  anIsTab = pOldIt
9eb0: 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 3b 0a  em->bSpanIsTab;.
9ec0: 20 20 20 20 70 49 74 65 6d 2d 3e 75 20 3d 20 70      pItem->u = p
9ed0: 4f 6c 64 49 74 65 6d 2d 3e 75 3b 0a 20 20 7d 0a  OldItem->u;.  }.
9ee0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
9ef0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f  ../*.** If curso
9f00: 72 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69  rs, triggers, vi
9f10: 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69  ews and subqueri
9f20: 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74  es are all omitt
9f30: 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62  ed from.** the b
9f40: 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20  uild, then none 
9f50: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
9f60: 20 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70   routines, excep
9f70: 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65  t for .** sqlite
9f80: 33 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61  3SelectDup(), ca
9f90: 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c  n be called. sql
9fa0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 20  ite3SelectDup() 
9fb0: 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20  is sometimes.** 
9fc0: 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55  called with a NU
9fd0: 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  LL argument..*/.
9fe0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
9ff0: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
a000: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
a010: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20  E_OMIT_TRIGGER) 
a020: 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  \. || !defined(S
a030: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
a040: 45 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71  ERY).SrcList *sq
a050: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28  lite3SrcListDup(
a060: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63  sqlite3 *db, Src
a070: 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61  List *p, int fla
a080: 67 73 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  gs){.  SrcList *
a090: 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pNew;.  int i;. 
a0a0: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 61 73   int nByte;.  as
a0b0: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
a0c0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
a0d0: 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20  rn 0;.  nByte = 
a0e0: 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d  sizeof(*p) + (p-
a0f0: 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66  >nSrc>0 ? sizeof
a100: 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e  (p->a[0]) * (p->
a110: 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20  nSrc-1) : 0);.  
a120: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
a130: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
a140: 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70  nByte );.  if( p
a150: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
a160: 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20  0;.  pNew->nSrc 
a170: 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d  = pNew->nAlloc =
a180: 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28   p->nSrc;.  for(
a190: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20  i=0; i<p->nSrc; 
a1a0: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
a1b0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
a1c0: 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d  NewItem = &pNew-
a1d0: 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63  >a[i];.    struc
a1e0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
a1f0: 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61  pOldItem = &p->a
a200: 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  [i];.    Table *
a210: 70 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 49 74  pTab;.    pNewIt
a220: 65 6d 2d 3e 70 53 63 68 65 6d 61 20 3d 20 70 4f  em->pSchema = pO
a230: 6c 64 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61 3b  ldItem->pSchema;
a240: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a  .    pNewItem->z
a250: 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74  Database = sqlit
a260: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
a270: 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  OldItem->zDataba
a280: 73 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  se);.    pNewIte
a290: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
a2a0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
a2b0: 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  OldItem->zName);
a2c0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a  .    pNewItem->z
a2d0: 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33 44  Alias = sqlite3D
a2e0: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
a2f0: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
a300: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 20     pNewItem->fg 
a310: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 66 67 3b 0a  = pOldItem->fg;.
a320: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43      pNewItem->iC
a330: 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d  ursor = pOldItem
a340: 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70  ->iCursor;.    p
a350: 4e 65 77 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  NewItem->addrFil
a360: 6c 53 75 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  lSub = pOldItem-
a370: 3e 61 64 64 72 46 69 6c 6c 53 75 62 3b 0a 20 20  >addrFillSub;.  
a380: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 72 65 67 52    pNewItem->regR
a390: 65 74 75 72 6e 20 3d 20 70 4f 6c 64 49 74 65 6d  eturn = pOldItem
a3a0: 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20  ->regReturn;.   
a3b0: 20 69 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66   if( pNewItem->f
a3c0: 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 7b  g.isIndexedBy ){
a3d0: 0a 20 20 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  .      pNewItem-
a3e0: 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 20 3d  >u1.zIndexedBy =
a3f0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
a400: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 75  (db, pOldItem->u
a410: 31 2e 7a 49 6e 64 65 78 65 64 42 79 29 3b 0a 20  1.zIndexedBy);. 
a420: 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65     }.    pNewIte
a430: 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d 20 70 4f  m->pIBIndex = pO
a440: 6c 64 49 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78  ldItem->pIBIndex
a450: 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 49 74  ;.    if( pNewIt
a460: 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63  em->fg.isTabFunc
a470: 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 49 74   ){.      pNewIt
a480: 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 20  em->u1.pFuncArg 
a490: 3d 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  = .          sql
a4a0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
a4b0: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 31  db, pOldItem->u1
a4c0: 2e 70 46 75 6e 63 41 72 67 2c 20 66 6c 61 67 73  .pFuncArg, flags
a4d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  );.    }.    pTa
a4e0: 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54  b = pNewItem->pT
a4f0: 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  ab = pOldItem->p
a500: 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61  Tab;.    if( pTa
a510: 62 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d  b ){.      pTab-
a520: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20  >nRef++;.    }. 
a530: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65     pNewItem->pSe
a540: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
a550: 6c 65 63 74 44 75 70 28 64 62 2c 20 70 4f 6c 64  lectDup(db, pOld
a560: 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 66  Item->pSelect, f
a570: 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49  lags);.    pNewI
a580: 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74  tem->pOn = sqlit
a590: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f  e3ExprDup(db, pO
a5a0: 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61  ldItem->pOn, fla
a5b0: 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  gs);.    pNewIte
a5c0: 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c 69  m->pUsing = sqli
a5d0: 74 65 33 49 64 4c 69 73 74 44 75 70 28 64 62 2c  te3IdListDup(db,
a5e0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e   pOldItem->pUsin
a5f0: 67 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  g);.    pNewItem
a600: 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64  ->colUsed = pOld
a610: 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20  Item->colUsed;. 
a620: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
a630: 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69  ;.}.IdList *sqli
a640: 74 65 33 49 64 4c 69 73 74 44 75 70 28 73 71 6c  te3IdListDup(sql
a650: 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74  ite3 *db, IdList
a660: 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a   *p){.  IdList *
a670: 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pNew;.  int i;. 
a680: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
a690: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
a6a0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20  eturn 0;.  pNew 
a6b0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
a6c0: 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f  cRawNN(db, sizeo
a6d0: 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
a6e0: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
a6f0: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49  rn 0;.  pNew->nI
a700: 64 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e  d = p->nId;.  pN
a710: 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44  ew->a = sqlite3D
a720: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
a730: 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70   p->nId*sizeof(p
a740: 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28  ->a[0]) );.  if(
a750: 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20   pNew->a==0 ){. 
a760: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
a770: 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  (db, pNew);.    
a780: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
a790: 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20 62 65 63  /* Note that bec
a7a0: 61 75 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66  ause the size of
a7b0: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
a7c0: 66 6f 72 20 70 2d 3e 61 5b 5d 20 69 73 20 6e 6f  for p->a[] is no
a7d0: 74 0a 20 20 2a 2a 20 6e 65 63 65 73 73 61 72 69  t.  ** necessari
a7e0: 6c 79 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  ly a power of tw
a7f0: 6f 2c 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  o, sqlite3IdList
a800: 41 70 70 65 6e 64 28 29 20 6d 61 79 20 6e 6f 74  Append() may not
a810: 20 62 65 20 63 61 6c 6c 65 64 0a 20 20 2a 2a 20   be called.  ** 
a820: 6f 6e 20 74 68 65 20 64 75 70 6c 69 63 61 74 65  on the duplicate
a830: 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73   created by this
a840: 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20   function. */.  
a850: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49  for(i=0; i<p->nI
a860: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  d; i++){.    str
a870: 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20  uct IdList_item 
a880: 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65  *pNewItem = &pNe
a890: 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72  w->a[i];.    str
a8a0: 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20  uct IdList_item 
a8b0: 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e  *pOldItem = &p->
a8c0: 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74  a[i];.    pNewIt
a8d0: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
a8e0: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
a8f0: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  pOldItem->zName)
a900: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
a910: 69 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  idx = pOldItem->
a920: 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  idx;.  }.  retur
a930: 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74  n pNew;.}.Select
a940: 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44   *sqlite3SelectD
a950: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
a960: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 66  Select *p, int f
a970: 6c 61 67 73 29 7b 0a 20 20 53 65 6c 65 63 74 20  lags){.  Select 
a980: 2a 70 4e 65 77 2c 20 2a 70 50 72 69 6f 72 3b 0a  *pNew, *pPrior;.
a990: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
a9a0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
a9b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
a9c0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
a9d0: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
a9e0: 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20  of(*p) );.  if( 
a9f0: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
aa00: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69   0;.  pNew->pELi
aa10: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
aa20: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
aa30: 45 4c 69 73 74 2c 20 66 6c 61 67 73 29 3b 0a 20  EList, flags);. 
aa40: 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71   pNew->pSrc = sq
aa50: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28  lite3SrcListDup(
aa60: 64 62 2c 20 70 2d 3e 70 53 72 63 2c 20 66 6c 61  db, p->pSrc, fla
aa70: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68  gs);.  pNew->pWh
aa80: 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
aa90: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 68 65  rDup(db, p->pWhe
aaa0: 72 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e  re, flags);.  pN
aab0: 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73  ew->pGroupBy = s
aac0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
aad0: 70 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42  p(db, p->pGroupB
aae0: 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  y, flags);.  pNe
aaf0: 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c  w->pHaving = sql
ab00: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
ab10: 70 2d 3e 70 48 61 76 69 6e 67 2c 20 66 6c 61 67  p->pHaving, flag
ab20: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64  s);.  pNew->pOrd
ab30: 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
ab40: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
ab50: 3e 70 4f 72 64 65 72 42 79 2c 20 66 6c 61 67 73  >pOrderBy, flags
ab60: 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20  );.  pNew->op = 
ab70: 70 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70  p->op;.  pNew->p
ab80: 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 20 3d  Prior = pPrior =
ab90: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
aba0: 70 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c  p(db, p->pPrior,
abb0: 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 70   flags);.  if( p
abc0: 50 72 69 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e  Prior ) pPrior->
abd0: 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20  pNext = pNew;.  
abe0: 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30 3b  pNew->pNext = 0;
abf0: 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20  .  pNew->pLimit 
ac00: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
ac10: 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20  (db, p->pLimit, 
ac20: 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e  flags);.  pNew->
ac30: 70 4f 66 66 73 65 74 20 3d 20 73 71 6c 69 74 65  pOffset = sqlite
ac40: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
ac50: 70 4f 66 66 73 65 74 2c 20 66 6c 61 67 73 29 3b  pOffset, flags);
ac60: 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20  .  pNew->iLimit 
ac70: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66  = 0;.  pNew->iOf
ac80: 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77  fset = 0;.  pNew
ac90: 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e  ->selFlags = p->
aca0: 73 65 6c 46 6c 61 67 73 20 26 20 7e 53 46 5f 55  selFlags & ~SF_U
acb0: 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20  sesEphemeral;.  
acc0: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
acd0: 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[0] = -1;.  pN
ace0: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
acf0: 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [1] = -1;.  pNew
ad00: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70  ->nSelectRow = p
ad10: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
ad20: 70 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20 77 69  pNew->pWith = wi
ad30: 74 68 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 69  thDup(db, p->pWi
ad40: 74 68 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  th);.  sqlite3Se
ad50: 6c 65 63 74 53 65 74 4e 61 6d 65 28 70 4e 65 77  lectSetName(pNew
ad60: 2c 20 70 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a  , p->zSelName);.
ad70: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
ad80: 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73  .#else.Select *s
ad90: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
ada0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c  sqlite3 *db, Sel
adb0: 65 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  ect *p, int flag
adc0: 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d  s){.  assert( p=
add0: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  =0 );.  return 0
ade0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
adf0: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65  ** Add a new ele
ae00: 6d 65 6e 74 20 74 6f 20 74 68 65 20 65 6e 64 20  ment to the end 
ae10: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
ae20: 20 6c 69 73 74 2e 20 20 49 66 20 70 4c 69 73 74   list.  If pList
ae30: 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79   is.** initially
ae40: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61   NULL, then crea
ae50: 74 65 20 61 20 6e 65 77 20 65 78 70 72 65 73 73  te a new express
ae60: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
ae70: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
ae80: 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63  cation error occ
ae90: 75 72 73 2c 20 74 68 65 20 65 6e 74 69 72 65 20  urs, the entire 
aea0: 6c 69 73 74 20 69 73 20 66 72 65 65 64 20 61 6e  list is freed an
aeb0: 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74  d.** NULL is ret
aec0: 75 72 6e 65 64 2e 20 20 49 66 20 6e 6f 6e 2d 4e  urned.  If non-N
aed0: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ULL is returned,
aee0: 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72   then it is guar
aef0: 61 6e 74 65 65 64 0a 2a 2a 20 74 68 61 74 20 74  anteed.** that t
af00: 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77 61 73  he new entry was
af10: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 70   successfully ap
af20: 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 4c  pended..*/.ExprL
af30: 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72  ist *sqlite3Expr
af40: 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20 50 61  ListAppend(.  Pa
af50: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
af60: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
af70: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
af80: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
af90: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f        /* List to
afa0: 20 77 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64   which to append
afb0: 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  . Might be NULL 
afc0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
afd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
afe0: 45 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65  Expression to be
aff0: 20 61 70 70 65 6e 64 65 64 2e 20 4d 69 67 68 74   appended. Might
b000: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   be NULL */.){. 
b010: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
b020: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73  Parse->db;.  ass
b030: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
b040: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
b050: 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
b060: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
b070: 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  (db, sizeof(Expr
b080: 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
b090: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
b0a0: 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a     goto no_mem;.
b0b0: 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d      }.    pList-
b0c0: 3e 6e 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20  >nExpr = 0;.    
b0d0: 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74  pList->a = sqlit
b0e0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
b0f0: 64 62 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74  db, sizeof(pList
b100: 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66  ->a[0]));.    if
b110: 28 20 70 4c 69 73 74 2d 3e 61 3d 3d 30 20 29 20  ( pList->a==0 ) 
b120: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d  goto no_mem;.  }
b130: 65 6c 73 65 20 69 66 28 20 28 70 4c 69 73 74 2d  else if( (pList-
b140: 3e 6e 45 78 70 72 20 26 20 28 70 4c 69 73 74 2d  >nExpr & (pList-
b150: 3e 6e 45 78 70 72 2d 31 29 29 3d 3d 30 20 29 7b  >nExpr-1))==0 ){
b160: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
b170: 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20  List_item *a;.  
b180: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
b190: 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20  >nExpr>0 );.    
b1a0: 61 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  a = sqlite3DbRea
b1b0: 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73 74 2d 3e  lloc(db, pList->
b1c0: 61 2c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2a  a, pList->nExpr*
b1d0: 32 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  2*sizeof(pList->
b1e0: 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  a[0]));.    if( 
b1f0: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  a==0 ){.      go
b200: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d  to no_mem;.    }
b210: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20  .    pList->a = 
b220: 61 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  a;.  }.  assert(
b230: 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b 0a   pList->a!=0 );.
b240: 20 20 69 66 28 20 31 20 29 7b 0a 20 20 20 20 73    if( 1 ){.    s
b250: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
b260: 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c  tem *pItem = &pL
b270: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45  ist->a[pList->nE
b280: 78 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73  xpr++];.    mems
b290: 65 74 28 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a  et(pItem, 0, siz
b2a0: 65 6f 66 28 2a 70 49 74 65 6d 29 29 3b 0a 20 20  eof(*pItem));.  
b2b0: 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d    pItem->pExpr =
b2c0: 20 70 45 78 70 72 3b 0a 20 20 7d 0a 20 20 72 65   pExpr;.  }.  re
b2d0: 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f  turn pList;..no_
b2e0: 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41  mem:     .  /* A
b2f0: 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d  void leaking mem
b300: 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61  ory if malloc ha
b310: 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73  s failed. */.  s
b320: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
b330: 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 73  (db, pExpr);.  s
b340: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
b350: 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  lete(db, pList);
b360: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
b370: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 6f  /*.** Set the so
b380: 72 74 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65  rt order for the
b390: 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f 6e   last element on
b3a0: 20 74 68 65 20 67 69 76 65 6e 20 45 78 70 72 4c   the given ExprL
b3b0: 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
b3c0: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53  ite3ExprListSetS
b3d0: 6f 72 74 4f 72 64 65 72 28 45 78 70 72 4c 69 73  ortOrder(ExprLis
b3e0: 74 20 2a 70 2c 20 69 6e 74 20 69 53 6f 72 74 4f  t *p, int iSortO
b3f0: 72 64 65 72 29 7b 0a 20 20 69 66 28 20 70 3d 3d  rder){.  if( p==
b400: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
b410: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 53 4f 5f  sert( SQLITE_SO_
b420: 55 4e 44 45 46 49 4e 45 44 3c 30 20 26 26 20 53  UNDEFINED<0 && S
b430: 51 4c 49 54 45 5f 53 4f 5f 41 53 43 3e 3d 30 20  QLITE_SO_ASC>=0 
b440: 26 26 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53  && SQLITE_SO_DES
b450: 43 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  C>0 );.  assert(
b460: 20 70 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20   p->nExpr>0 );. 
b470: 20 69 66 28 20 69 53 6f 72 74 4f 72 64 65 72 3c   if( iSortOrder<
b480: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
b490: 20 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31   p->a[p->nExpr-1
b4a0: 5d 2e 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c  ].sortOrder==SQL
b4b0: 49 54 45 5f 53 4f 5f 41 53 43 20 29 3b 0a 20 20  ITE_SO_ASC );.  
b4c0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
b4d0: 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d  p->a[p->nExpr-1]
b4e0: 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  .sortOrder = (u8
b4f0: 29 69 53 6f 72 74 4f 72 64 65 72 3b 0a 7d 0a 0a  )iSortOrder;.}..
b500: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78  /*.** Set the Ex
b510: 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65  prList.a[].zName
b520: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
b530: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
b540: 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74  ded item.** on t
b550: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
b560: 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20  st..**.** pList 
b570: 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f  might be NULL fo
b580: 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65  llowing an OOM e
b590: 72 72 6f 72 2e 20 20 42 75 74 20 70 4e 61 6d 65  rror.  But pName
b5a0: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65   should never be
b5b0: 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20  .** NULL.  If a 
b5c0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
b5d0: 6e 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61  n fails, the pPa
b5e0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
b5f0: 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73  ailed flag.** is
b600: 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   set..*/.void sq
b610: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74  lite3ExprListSet
b620: 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70  Name(.  Parse *p
b630: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
b640: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
b650: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
b660: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
b670: 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68  /* List to which
b680: 20 74 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e   to add the span
b690: 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  . */.  Token *pN
b6a0: 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ame,           /
b6b0: 2a 20 4e 61 6d 65 20 74 6f 20 62 65 20 61 64 64  * Name to be add
b6c0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75  ed */.  int dequ
b6d0: 6f 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ote             
b6e0: 2f 2a 20 54 72 75 65 20 74 6f 20 63 61 75 73 65  /* True to cause
b6f0: 20 74 68 65 20 6e 61 6d 65 20 74 6f 20 62 65 20   the name to be 
b700: 64 65 71 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20  dequoted */.){. 
b710: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
b720: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  0 || pParse->db-
b730: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30  >mallocFailed!=0
b740: 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   );.  if( pList 
b750: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
b760: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
b770: 65 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  em;.    assert( 
b780: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29  pList->nExpr>0 )
b790: 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70  ;.    pItem = &p
b7a0: 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
b7b0: 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73  Expr-1];.    ass
b7c0: 65 72 74 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  ert( pItem->zNam
b7d0: 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65  e==0 );.    pIte
b7e0: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
b7f0: 65 33 44 62 53 74 72 4e 44 75 70 28 70 50 61 72  e3DbStrNDup(pPar
b800: 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a  se->db, pName->z
b810: 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20  , pName->n);.   
b820: 20 69 66 28 20 64 65 71 75 6f 74 65 20 29 20 73   if( dequote ) s
b830: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 70 49  qlite3Dequote(pI
b840: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  tem->zName);.  }
b850: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
b860: 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a  e ExprList.a[].z
b870: 53 70 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20  Span element of 
b880: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
b890: 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20  y added item.** 
b8a0: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
b8b0: 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c  n list..**.** pL
b8c0: 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c  ist might be NUL
b8d0: 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f  L following an O
b8e0: 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70  OM error.  But p
b8f0: 53 70 61 6e 20 73 68 6f 75 6c 64 20 6e 65 76 65  Span should neve
b900: 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49  r be.** NULL.  I
b910: 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
b920: 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65  ation fails, the
b930: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
b940: 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a  locFailed flag.*
b950: 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69  * is set..*/.voi
b960: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
b970: 74 53 65 74 53 70 61 6e 28 0a 20 20 50 61 72 73  tSetSpan(.  Pars
b980: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
b990: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
b9a0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
b9b0: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
b9c0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77      /* List to w
b9d0: 68 69 63 68 20 74 6f 20 61 64 64 20 74 68 65 20  hich to add the 
b9e0: 73 70 61 6e 2e 20 2a 2f 0a 20 20 45 78 70 72 53  span. */.  ExprS
b9f0: 70 61 6e 20 2a 70 53 70 61 6e 20 20 20 20 20 20  pan *pSpan      
ba00: 20 20 20 2f 2a 20 54 68 65 20 73 70 61 6e 20 74     /* The span t
ba10: 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 29 7b  o be added */.){
ba20: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
ba30: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
ba40: 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
ba50: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
ba60: 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  led!=0 );.  if( 
ba70: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72  pList ){.    str
ba80: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
ba90: 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73  m *pItem = &pLis
baa0: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  t->a[pList->nExp
bab0: 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  r-1];.    assert
bac0: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30  ( pList->nExpr>0
bad0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
bae0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
baf0: 20 7c 7c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72   || pItem->pExpr
bb00: 3d 3d 70 53 70 61 6e 2d 3e 70 45 78 70 72 20 29  ==pSpan->pExpr )
bb10: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
bb20: 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
bb30: 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d  Span);.    pItem
bb40: 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65  ->zSpan = sqlite
bb50: 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28  3DbStrNDup(db, (
bb60: 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53 74  char*)pSpan->zSt
bb70: 61 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  art,.           
bb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb90: 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 70           (int)(p
bba0: 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53 70  Span->zEnd - pSp
bbb0: 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20 20  an->zStart));.  
bbc0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  }.}../*.** If th
bbd0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
bbe0: 74 20 70 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e  t pEList contain
bbf0: 73 20 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d  s more than iLim
bc00: 69 74 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20  it elements,.** 
bc10: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
bc20: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
bc30: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
bc40: 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65  3ExprListCheckLe
bc50: 6e 67 74 68 28 0a 20 20 50 61 72 73 65 20 2a 70  ngth(.  Parse *p
bc60: 50 61 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73  Parse,.  ExprLis
bc70: 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20 63 6f 6e  t *pEList,.  con
bc80: 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74  st char *zObject
bc90: 0a 29 7b 0a 20 20 69 6e 74 20 6d 78 20 3d 20 70  .){.  int mx = p
bca0: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69  Parse->db->aLimi
bcb0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
bcc0: 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73 74 63 61  OLUMN];.  testca
bcd0: 73 65 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  se( pEList && pE
bce0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20  List->nExpr==mx 
bcf0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
bd00: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
bd10: 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a  >nExpr==mx+1 );.
bd20: 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20    if( pEList && 
bd30: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 6d 78  pEList->nExpr>mx
bd40: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
bd50: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
bd60: 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e  "too many column
bd70: 73 20 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63  s in %s", zObjec
bd80: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
bd90: 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
bda0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
bdb0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  t..*/.static SQL
bdc0: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
bdd0: 64 20 65 78 70 72 4c 69 73 74 44 65 6c 65 74 65  d exprListDelete
bde0: 4e 4e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  NN(sqlite3 *db, 
bdf0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
be00: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
be10: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
be20: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65  m *pItem;.  asse
be30: 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20  rt( pList->a!=0 
be40: 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  || pList->nExpr=
be50: 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70 49 74 65  =0 );.  for(pIte
be60: 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
be70: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
be80: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
be90: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
bea0: 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d  elete(db, pItem-
beb0: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c  >pExpr);.    sql
bec0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
bed0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
bee0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
bef0: 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e  db, pItem->zSpan
bf00: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
bf10: 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
bf20: 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ->a);.  sqlite3D
bf30: 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29  bFree(db, pList)
bf40: 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
bf50: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 73  ExprListDelete(s
bf60: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
bf70: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
bf80: 69 66 28 20 70 4c 69 73 74 20 29 20 65 78 70 72  if( pList ) expr
bf90: 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28 64 62 2c  ListDeleteNN(db,
bfa0: 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pList);.}../*.*
bfb0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62 69 74  * Return the bit
bfc0: 77 69 73 65 2d 4f 52 20 6f 66 20 61 6c 6c 20 45  wise-OR of all E
bfd0: 78 70 72 2e 66 6c 61 67 73 20 66 69 65 6c 64 73  xpr.flags fields
bfe0: 20 69 6e 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a   in the given.**
bff0: 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a 75 33   ExprList..*/.u3
c000: 32 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  2 sqlite3ExprLis
c010: 74 46 6c 61 67 73 28 63 6f 6e 73 74 20 45 78 70  tFlags(const Exp
c020: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
c030: 20 69 6e 74 20 69 3b 0a 20 20 75 33 32 20 6d 20   int i;.  u32 m 
c040: 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  = 0;.  if( pList
c050: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
c060: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
c070: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 45 78   i++){.       Ex
c080: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73  pr *pExpr = pLis
c090: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
c0a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
c0b0: 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  xpr!=0 );.      
c0c0: 20 6d 20 7c 3d 20 70 45 78 70 72 2d 3e 66 6c 61   m |= pExpr->fla
c0d0: 67 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  gs;.    }.  }.  
c0e0: 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a  return m;.}../*.
c0f0: 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
c100: 73 20 61 72 65 20 57 61 6c 6b 65 72 20 63 61 6c  s are Walker cal
c110: 6c 62 61 63 6b 73 20 75 73 65 64 20 74 6f 20 63  lbacks used to c
c120: 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 73  heck expressions
c130: 20 74 6f 0a 2a 2a 20 73 65 65 20 69 66 20 74 68   to.** see if th
c140: 65 79 20 61 72 65 20 22 63 6f 6e 73 74 61 6e 74  ey are "constant
c150: 22 20 66 6f 72 20 73 6f 6d 65 20 64 65 66 69 6e  " for some defin
c160: 69 74 69 6f 6e 20 6f 66 20 63 6f 6e 73 74 61 6e  ition of constan
c170: 74 2e 20 20 54 68 65 0a 2a 2a 20 57 61 6c 6b 65  t.  The.** Walke
c180: 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 64 65  r.eCode value de
c190: 74 65 72 6d 69 6e 65 73 20 74 68 65 20 74 79 70  termines the typ
c1a0: 65 20 6f 66 20 22 63 6f 6e 73 74 61 6e 74 22 20  e of "constant" 
c1b0: 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 0a 2a  we are looking.*
c1c0: 2a 20 66 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  * for..**.** The
c1d0: 73 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  se callback rout
c1e0: 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
c1f0: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 66   implement the f
c200: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
c210: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
c220: 73 43 6f 6e 73 74 61 6e 74 28 29 20 20 20 20 20  sConstant()     
c230: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 61               pWa
c240: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 31 0a 2a  lker->eCode==1.*
c250: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  *     sqlite3Exp
c260: 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
c270: 69 6e 28 29 20 20 20 20 20 20 20 20 20 20 20 70  in()           p
c280: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32  Walker->eCode==2
c290: 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45  .**     sqlite3E
c2a0: 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61  xprIsTableConsta
c2b0: 6e 74 28 29 20 20 20 20 20 20 20 20 20 20 20 20  nt()            
c2c0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
c2d0: 3d 33 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  =3.**     sqlite
c2e0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
c2f0: 72 46 75 6e 63 74 69 6f 6e 28 29 20 20 20 20 20  rFunction()     
c300: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
c310: 65 3d 3d 34 20 6f 72 20 35 0a 2a 2a 0a 2a 2a 20  e==4 or 5.**.** 
c320: 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 20 74 68  In all cases, th
c330: 65 20 63 61 6c 6c 62 61 63 6b 73 20 73 65 74 20  e callbacks set 
c340: 57 61 6c 6b 65 72 2e 65 43 6f 64 65 3d 30 20 61  Walker.eCode=0 a
c350: 6e 64 20 61 62 6f 72 74 20 69 66 20 74 68 65 20  nd abort if the 
c360: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
c370: 20 66 6f 75 6e 64 20 74 6f 20 6e 6f 74 20 62 65   found to not be
c380: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a   a constant..**.
c390: 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 45 78  ** The sqlite3Ex
c3a0: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75  prIsConstantOrFu
c3b0: 6e 63 74 69 6f 6e 28 29 20 69 73 20 75 73 65 64  nction() is used
c3c0: 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20   for evaluating 
c3d0: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 69  expressions.** i
c3e0: 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
c3f0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
c400: 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 76 61   Walker.eCode va
c410: 6c 75 65 20 69 73 20 35 20 77 68 65 6e 20 70 61  lue is 5 when pa
c420: 72 73 69 6e 67 0a 2a 2a 20 61 6e 20 65 78 69 73  rsing.** an exis
c430: 74 69 6e 67 20 73 63 68 65 6d 61 20 61 6e 64 20  ting schema and 
c440: 34 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69 6e  4 when processin
c450: 67 20 61 20 6e 65 77 20 73 74 61 74 65 6d 65 6e  g a new statemen
c460: 74 2e 20 20 41 20 62 6f 75 6e 64 0a 2a 2a 20 70  t.  A bound.** p
c470: 61 72 61 6d 65 74 65 72 20 72 61 69 73 65 73 20  arameter raises 
c480: 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 6e 65 77  an error for new
c490: 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 62 75 74   statements, but
c4a0: 20 69 73 20 73 69 6c 65 6e 74 6c 79 20 63 6f 6e   is silently con
c4b0: 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 4e 55 4c  verted.** to NUL
c4c0: 4c 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 73  L for existing s
c4d0: 63 68 65 6d 61 73 2e 20 20 54 68 69 73 20 61 6c  chemas.  This al
c4e0: 6c 6f 77 73 20 73 71 6c 69 74 65 5f 6d 61 73 74  lows sqlite_mast
c4f0: 65 72 20 74 61 62 6c 65 73 20 74 68 61 74 20 0a  er tables that .
c500: 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62 6f 75  ** contain a bou
c510: 6e 64 20 70 61 72 61 6d 65 74 65 72 20 62 65 63  nd parameter bec
c520: 61 75 73 65 20 74 68 65 79 20 77 65 72 65 20 67  ause they were g
c530: 65 6e 65 72 61 74 65 64 20 62 79 20 6f 6c 64 65  enerated by olde
c540: 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66  r versions.** of
c550: 20 53 51 4c 69 74 65 20 74 6f 20 62 65 20 70 61   SQLite to be pa
c560: 72 73 65 64 20 62 79 20 6e 65 77 65 72 20 76 65  rsed by newer ve
c570: 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
c580: 20 77 69 74 68 6f 75 74 20 72 61 69 73 69 6e 67   without raising
c590: 20 61 0a 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20   a.** malformed 
c5a0: 73 63 68 65 6d 61 20 65 72 72 6f 72 2e 0a 2a 2f  schema error..*/
c5b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
c5c0: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57  NodeIsConstant(W
c5d0: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
c5e0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 0a 20  Expr *pExpr){.. 
c5f0: 20 2f 2a 20 49 66 20 70 57 61 6c 6b 65 72 2d 3e   /* If pWalker->
c600: 65 43 6f 64 65 20 69 73 20 32 20 74 68 65 6e 20  eCode is 2 then 
c610: 61 6e 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20  any term of the 
c620: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
c630: 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a 2a 20  comes from.  ** 
c640: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
c650: 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6c 65 66  clauses of a lef
c660: 74 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c 69 66  t join disqualif
c670: 69 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69  ies the expressi
c680: 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62 65 69  on.  ** from bei
c690: 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f  ng considered co
c6a0: 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28  nstant. */.  if(
c6b0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
c6c0: 3d 32 20 26 26 20 45 78 70 72 48 61 73 50 72 6f  =2 && ExprHasPro
c6d0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
c6e0: 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
c6f0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
c700: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
c710: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a  WRC_Abort;.  }..
c720: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
c730: 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  >op ){.    /* Co
c740: 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f 6e 73  nsider functions
c750: 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20   to be constant 
c760: 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61 72 67  if all their arg
c770: 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e 73 74  uments are const
c780: 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 65  ant.    ** and e
c790: 69 74 68 65 72 20 70 57 61 6c 6b 65 72 2d 3e 65  ither pWalker->e
c7a0: 43 6f 64 65 3d 3d 34 20 6f 72 20 35 20 6f 72 20  Code==4 or 5 or 
c7b0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  the function has
c7c0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c 49   the.    ** SQLI
c7d0: 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 20 66 6c  TE_FUNC_CONST fl
c7e0: 61 67 2e 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ag. */.    case 
c7f0: 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  TK_FUNCTION:.   
c800: 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e     if( pWalker->
c810: 65 43 6f 64 65 3e 3d 34 20 7c 7c 20 45 78 70 72  eCode>=4 || Expr
c820: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
c830: 72 2c 45 50 5f 43 6f 6e 73 74 46 75 6e 63 29 20  r,EP_ConstFunc) 
c840: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
c850: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
c860: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
c870: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
c880: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
c890: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
c8a0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63  t;.      }.    c
c8b0: 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63  ase TK_ID:.    c
c8c0: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20  ase TK_COLUMN:. 
c8d0: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
c8e0: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73  UNCTION:.    cas
c8f0: 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
c900: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
c910: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
c920: 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  D );.      testc
c930: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
c940: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
c950: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
c960: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
c970: 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20  UNCTION );.     
c980: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
c990: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
c9a0: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 69 66 28  UMN );.      if(
c9b0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
c9c0: 3d 33 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61  =3 && pExpr->iTa
c9d0: 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e  ble==pWalker->u.
c9e0: 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iCur ){.        
c9f0: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
ca00: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  nue;.      }else
ca10: 7b 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65  {.        pWalke
ca20: 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20  r->eCode = 0;.  
ca30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
ca40: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a  _Abort;.      }.
ca50: 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49      case TK_VARI
ca60: 41 42 4c 45 3a 0a 20 20 20 20 20 20 69 66 28 20  ABLE:.      if( 
ca70: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
ca80: 35 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  5 ){.        /* 
ca90: 53 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74  Silently convert
caa0: 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72   bound parameter
cab0: 73 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e  s that appear in
cac0: 73 69 64 65 20 6f 66 20 43 52 45 41 54 45 0a 20  side of CREATE. 
cad0: 20 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d         ** statem
cae0: 65 6e 74 73 20 69 6e 74 6f 20 61 20 4e 55 4c 4c  ents into a NULL
caf0: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 74 68   when parsing th
cb00: 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65  e CREATE stateme
cb10: 6e 74 20 74 65 78 74 20 6f 75 74 0a 20 20 20 20  nt text out.    
cb20: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 71      ** of the sq
cb30: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
cb40: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 45 78  e */.        pEx
cb50: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c  pr->op = TK_NULL
cb60: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
cb70: 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  ( pWalker->eCode
cb80: 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==4 ){.        /
cb90: 2a 20 41 20 62 6f 75 6e 64 20 70 61 72 61 6d 65  * A bound parame
cba0: 74 65 72 20 69 6e 20 61 20 43 52 45 41 54 45 20  ter in a CREATE 
cbb0: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 6f  statement that o
cbc0: 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 0a 20  riginates from. 
cbd0: 20 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65         ** sqlite
cbe0: 33 5f 70 72 65 70 61 72 65 28 29 20 63 61 75 73  3_prepare() caus
cbf0: 65 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  es an error */. 
cc00: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
cc10: 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20  eCode = 0;.     
cc20: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
cc30: 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ort;.      }.   
cc40: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75     /* Fall throu
cc50: 67 68 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c  gh */.    defaul
cc60: 74 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t:.      testcas
cc70: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
cc80: 5f 53 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73 65  _SELECT ); /* se
cc90: 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61  lectNodeIsConsta
cca0: 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77  nt will disallow
ccb0: 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
ccc0: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
ccd0: 4b 5f 45 58 49 53 54 53 20 29 3b 20 2f 2a 20 73  K_EXISTS ); /* s
cce0: 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74  electNodeIsConst
ccf0: 61 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f  ant will disallo
cd00: 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  w */.      retur
cd10: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
cd20: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74    }.}.static int
cd30: 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e   selectNodeIsCon
cd40: 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57  stant(Walker *pW
cd50: 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e  alker, Select *N
cd60: 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45  otUsed){.  UNUSE
cd70: 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
cd80: 73 65 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d  sed);.  pWalker-
cd90: 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 72 65  >eCode = 0;.  re
cda0: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
cdb0: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  }.static int exp
cdc0: 72 49 73 43 6f 6e 73 74 28 45 78 70 72 20 2a 70  rIsConst(Expr *p
cdd0: 2c 20 69 6e 74 20 69 6e 69 74 46 6c 61 67 2c 20  , int initFlag, 
cde0: 69 6e 74 20 69 43 75 72 29 7b 0a 20 20 57 61 6c  int iCur){.  Wal
cdf0: 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28  ker w;.  memset(
ce00: 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29  &w, 0, sizeof(w)
ce10: 29 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 69  );.  w.eCode = i
ce20: 6e 69 74 46 6c 61 67 3b 0a 20 20 77 2e 78 45 78  nitFlag;.  w.xEx
ce30: 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70  prCallback = exp
ce40: 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b  rNodeIsConstant;
ce50: 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
ce60: 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64  back = selectNod
ce70: 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77  eIsConstant;.  w
ce80: 2e 75 2e 69 43 75 72 20 3d 20 69 43 75 72 3b 0a  .u.iCur = iCur;.
ce90: 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
cea0: 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75  r(&w, p);.  retu
ceb0: 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f  rn w.eCode;.}../
cec0: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
ced0: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
cee0: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
cef0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
cf00: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
cf10: 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f  and 0 if it invo
cf20: 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f  lves variables o
cf30: 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  r function calls
cf40: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
cf50: 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
cf60: 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75   function, a dou
cf70: 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  ble-quoted strin
cf80: 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a  g (ex: "abc").**
cf90: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
cfa0: 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20   variable but a 
cfb0: 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74  single-quoted st
cfc0: 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29  ring (ex: 'abc')
cfd0: 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e   is.** a constan
cfe0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
cff0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
d000: 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  Expr *p){.  retu
d010: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
d020: 2c 20 31 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , 1, 0);.}../*.*
d030: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
d040: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
d050: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  rn non-zero if t
d060: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
d070: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 61   constant.** tha
d080: 74 20 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69 6e  t does no origin
d090: 61 74 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20  ate from the ON 
d0a0: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
d0b0: 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52   of a join..** R
d0c0: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 6e  eturn 0 if it in
d0d0: 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73  volves variables
d0e0: 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c   or function cal
d0f0: 6c 73 20 6f 72 20 74 65 72 6d 73 20 66 72 6f 6d  ls or terms from
d100: 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53 49  .** an ON or USI
d110: 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e  NG clause..*/.in
d120: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
d130: 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45  onstantNotJoin(E
d140: 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  xpr *p){.  retur
d150: 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c  n exprIsConst(p,
d160: 20 32 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   2, 0);.}../*.**
d170: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
d180: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
d190: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
d1a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
d1b0: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20  constant.** for 
d1c0: 61 6e 79 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  any single row o
d1d0: 66 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  f the table with
d1e0: 20 63 75 72 73 6f 72 20 69 43 75 72 2e 20 20 49   cursor iCur.  I
d1f0: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
d200: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
d210: 20 6d 75 73 74 20 6e 6f 74 20 72 65 66 65 72 20   must not refer 
d220: 74 6f 20 61 6e 79 20 6e 6f 6e 2d 64 65 74 65 72  to any non-deter
d230: 6d 69 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f  ministic functio
d240: 6e 20 6e 6f 72 20 61 6e 79 0a 2a 2a 20 74 61 62  n nor any.** tab
d250: 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 69 43  le other than iC
d260: 75 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ur..*/.int sqlit
d270: 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e  e3ExprIsTableCon
d280: 73 74 61 6e 74 28 45 78 70 72 20 2a 70 2c 20 69  stant(Expr *p, i
d290: 6e 74 20 69 43 75 72 29 7b 0a 20 20 72 65 74 75  nt iCur){.  retu
d2a0: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
d2b0: 2c 20 33 2c 20 69 43 75 72 29 3b 0a 7d 0a 0a 2f  , 3, iCur);.}../
d2c0: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
d2d0: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
d2e0: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
d2f0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
d300: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
d310: 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61  or a function ca
d320: 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74 61 6e 74  ll with constant
d330: 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74   arguments.  Ret
d340: 75 72 6e 20 61 6e 64 20 30 20 69 66 20 74 68 65  urn and 0 if the
d350: 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20 76 61  re.** are any va
d360: 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46  riables..**.** F
d370: 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
d380: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
d390: 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65  , a double-quote
d3a0: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61  d string (ex: "a
d3b0: 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  bc").** is consi
d3c0: 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65  dered a variable
d3d0: 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75   but a single-qu
d3e0: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
d3f0: 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20   'abc') is.** a 
d400: 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74  constant..*/.int
d410: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
d420: 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e  nstantOrFunction
d430: 28 45 78 70 72 20 2a 70 2c 20 75 38 20 69 73 49  (Expr *p, u8 isI
d440: 6e 69 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  nit){.  assert( 
d450: 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 69 73 49  isInit==0 || isI
d460: 6e 69 74 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75  nit==1 );.  retu
d470: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
d480: 2c 20 34 2b 69 73 49 6e 69 74 2c 20 30 29 3b 0a  , 4+isInit, 0);.
d490: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
d4a0: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
d4b0: 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  INTS./*.** Walk 
d4c0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
d4d0: 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66  ee.  Return 1 if
d4e0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
d4f0: 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 73 75  contains a.** su
d500: 62 71 75 65 72 79 20 6f 66 20 73 6f 6d 65 20 6b  bquery of some k
d510: 69 6e 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ind.  Return 0 i
d520: 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 73  f there are no s
d530: 75 62 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 69 6e  ubqueries..*/.in
d540: 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6e  t sqlite3ExprCon
d550: 74 61 69 6e 73 53 75 62 71 75 65 72 79 28 45 78  tainsSubquery(Ex
d560: 70 72 20 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72  pr *p){.  Walker
d570: 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c   w;.  memset(&w,
d580: 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a   0, sizeof(w));.
d590: 20 20 77 2e 65 43 6f 64 65 20 3d 20 31 3b 0a 20    w.eCode = 1;. 
d5a0: 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
d5b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57 61   = sqlite3ExprWa
d5c0: 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 78 53 65 6c  lkNoop;.  w.xSel
d5d0: 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65  ectCallback = se
d5e0: 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61  lectNodeIsConsta
d5f0: 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  nt;.  sqlite3Wal
d600: 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20  kExpr(&w, p);.  
d610: 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3d 3d  return w.eCode==
d620: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
d630: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
d640: 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63  sion p codes a c
d650: 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20  onstant integer 
d660: 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  that is small en
d670: 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69  ough.** to fit i
d680: 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  n a 32-bit integ
d690: 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64  er, return 1 and
d6a0: 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f   put the value o
d6b0: 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  f the integer.**
d6c0: 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66   in *pValue.  If
d6d0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
d6e0: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
d6f0: 72 20 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f  r or if it is to
d700: 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20  o big.** to fit 
d710: 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62  in a signed 32-b
d720: 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75  it integer, retu
d730: 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a  rn 0 and leave *
d740: 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64  pValue unchanged
d750: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
d760: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 45 78  ExprIsInteger(Ex
d770: 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c  pr *p, int *pVal
d780: 75 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ue){.  int rc = 
d790: 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65  0;..  /* If an e
d7a0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20  xpression is an 
d7b0: 69 6e 74 65 67 65 72 20 6c 69 74 65 72 61 6c 20  integer literal 
d7c0: 74 68 61 74 20 66 69 74 73 20 69 6e 20 61 20 73  that fits in a s
d7d0: 69 67 6e 65 64 20 33 32 2d 62 69 74 0a 20 20 2a  igned 32-bit.  *
d7e0: 2a 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20  * integer, then 
d7f0: 74 68 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20  the EP_IntValue 
d800: 66 6c 61 67 20 77 69 6c 6c 20 68 61 76 65 20 61  flag will have a
d810: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 74 20  lready been set 
d820: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
d830: 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c  op!=TK_INTEGER |
d840: 7c 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45 50  | (p->flags & EP
d850: 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 0a 20 20  _IntValue)!=0.  
d860: 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
d870: 74 65 33 47 65 74 49 6e 74 33 32 28 70 2d 3e 75  te3GetInt32(p->u
d880: 2e 7a 54 6f 6b 65 6e 2c 20 26 72 63 29 3d 3d 30  .zToken, &rc)==0
d890: 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 66 6c   );..  if( p->fl
d8a0: 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75  ags & EP_IntValu
d8b0: 65 20 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65  e ){.    *pValue
d8c0: 20 3d 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a   = p->u.iValue;.
d8d0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
d8e0: 7d 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  }.  switch( p->o
d8f0: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
d900: 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20  _UPLUS: {.      
d910: 72 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  rc = sqlite3Expr
d920: 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65  IsInteger(p->pLe
d930: 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20  ft, pValue);.   
d940: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
d950: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e      case TK_UMIN
d960: 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  US: {.      int 
d970: 76 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  v;.      if( sql
d980: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
d990: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20  r(p->pLeft, &v) 
d9a0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
d9b0: 74 28 20 76 21 3d 28 2d 32 31 34 37 34 38 33 36  t( v!=(-21474836
d9c0: 34 37 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20  47-1) );.       
d9d0: 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20   *pValue = -v;. 
d9e0: 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
d9f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
da00: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
da10: 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20  fault: break;.  
da20: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
da30: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46  ../*.** Return F
da40: 41 4c 53 45 20 69 66 20 74 68 65 72 65 20 69 73  ALSE if there is
da50: 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20   no chance that 
da60: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63  the expression c
da70: 61 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  an be NULL..**.*
da80: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
da90: 69 6f 6e 20 6d 69 67 68 74 20 62 65 20 4e 55 4c  ion might be NUL
daa0: 4c 20 6f 72 20 69 66 20 74 68 65 20 65 78 70 72  L or if the expr
dab0: 65 73 73 69 6f 6e 20 69 73 20 74 6f 6f 20 63 6f  ession is too co
dac0: 6d 70 6c 65 78 0a 2a 2a 20 74 6f 20 74 65 6c 6c  mplex.** to tell
dad0: 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 0a   return TRUE.  .
dae0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
daf0: 6e 65 20 69 73 20 75 73 65 64 20 61 73 20 61 6e  ne is used as an
db00: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74   optimization, t
db10: 6f 20 73 6b 69 70 20 4f 50 5f 49 73 4e 75 6c 6c  o skip OP_IsNull
db20: 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 77 68 65 6e   opcodes.** when
db30: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 20   we know that a 
db40: 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20  value cannot be 
db50: 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 61 20  NULL.  Hence, a 
db60: 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 0a 2a  false positive.*
db70: 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 54 52 55  * (returning TRU
db80: 45 20 77 68 65 6e 20 69 6e 20 66 61 63 74 20 74  E when in fact t
db90: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61  he expression ca
dba0: 6e 20 6e 65 76 65 72 20 62 65 20 4e 55 4c 4c 29  n never be NULL)
dbb0: 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 61 20 73   might.** be a s
dbc0: 6d 61 6c 6c 20 70 65 72 66 6f 72 6d 61 6e 63 65  mall performance
dbd0: 20 68 69 74 20 62 75 74 20 69 73 20 6f 74 68 65   hit but is othe
dbe0: 72 77 69 73 65 20 68 61 72 6d 6c 65 73 73 2e 20  rwise harmless. 
dbf0: 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a   On the other.**
dc00: 20 68 61 6e 64 2c 20 61 20 66 61 6c 73 65 20 6e   hand, a false n
dc10: 65 67 61 74 69 76 65 20 28 72 65 74 75 72 6e 69  egative (returni
dc20: 6e 67 20 46 41 4c 53 45 20 77 68 65 6e 20 74 68  ng FALSE when th
dc30: 65 20 72 65 73 75 6c 74 20 63 6f 75 6c 64 20 62  e result could b
dc40: 65 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69 6c 6c 20  e NULL).** will 
dc50: 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e  likely result in
dc60: 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 61 6e   an incorrect an
dc70: 73 77 65 72 2e 20 20 53 6f 20 77 68 65 6e 20 69  swer.  So when i
dc80: 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 0a  n doubt, return.
dc90: 2a 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69 6e 74 20  ** TRUE..*/.int 
dca0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65  sqlite3ExprCanBe
dcb0: 4e 75 6c 6c 28 63 6f 6e 73 74 20 45 78 70 72 20  Null(const Expr 
dcc0: 2a 70 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20  *p){.  u8 op;.  
dcd0: 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  while( p->op==TK
dce0: 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d  _UPLUS || p->op=
dcf0: 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20  =TK_UMINUS ){ p 
dd00: 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20  = p->pLeft; }.  
dd10: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66  op = p->op;.  if
dd20: 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ( op==TK_REGISTE
dd30: 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b  R ) op = p->op2;
dd40: 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
dd50: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
dd60: 45 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20 54  EGER:.    case T
dd70: 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 63 61  K_STRING:.    ca
dd80: 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20  se TK_FLOAT:.   
dd90: 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20   case TK_BLOB:. 
dda0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
ddb0: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
ddc0: 4e 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  N:.      assert(
ddd0: 20 70 2d 3e 70 54 61 62 21 3d 30 20 29 3b 0a 20   p->pTab!=0 );. 
dde0: 20 20 20 20 20 72 65 74 75 72 6e 20 45 78 70 72       return Expr
ddf0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
de00: 50 5f 43 61 6e 42 65 4e 75 6c 6c 29 20 7c 7c 0a  P_CanBeNull) ||.
de10: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70 2d               (p-
de20: 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70  >iColumn>=0 && p
de30: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 2d 3e  ->pTab->aCol[p->
de40: 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c  iColumn].notNull
de50: 3d 3d 30 29 3b 0a 20 20 20 20 64 65 66 61 75 6c  ==0);.    defaul
de60: 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
de70: 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
de80: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
de90: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
dea0: 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  ion is a constan
deb0: 74 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65  t which would be
dec0: 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 62 79  .** unchanged by
ded0: 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 77 69 74   OP_Affinity wit
dee0: 68 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 67  h the affinity g
def0: 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63 6f  iven in the seco
df00: 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  nd.** argument..
df10: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
df20: 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  ne is used to de
df30: 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4f  termine if the O
df40: 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 65 72 61  P_Affinity opera
df50: 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 6f  tion.** can be o
df60: 6d 69 74 74 65 64 2e 20 20 57 68 65 6e 20 69 6e  mitted.  When in
df70: 20 64 6f 75 62 74 20 72 65 74 75 72 6e 20 46 41   doubt return FA
df80: 4c 53 45 2e 20 20 41 20 66 61 6c 73 65 20 6e 65  LSE.  A false ne
df90: 67 61 74 69 76 65 0a 2a 2a 20 69 73 20 68 61 72  gative.** is har
dfa0: 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c 73 65 20  mless.  A false 
dfb0: 70 6f 73 69 74 69 76 65 2c 20 68 6f 77 65 76 65  positive, howeve
dfc0: 72 2c 20 63 61 6e 20 72 65 73 75 6c 74 20 69 6e  r, can result in
dfd0: 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e   the wrong.** an
dfe0: 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  swer..*/.int sql
dff0: 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41  ite3ExprNeedsNoA
e000: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 63 6f  ffinityChange(co
e010: 6e 73 74 20 45 78 70 72 20 2a 70 2c 20 63 68 61  nst Expr *p, cha
e020: 72 20 61 66 66 29 7b 0a 20 20 75 38 20 6f 70 3b  r aff){.  u8 op;
e030: 0a 20 20 69 66 28 20 61 66 66 3d 3d 53 51 4c 49  .  if( aff==SQLI
e040: 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 20 72 65  TE_AFF_BLOB ) re
e050: 74 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65 28  turn 1;.  while(
e060: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53   p->op==TK_UPLUS
e070: 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d   || p->op==TK_UM
e080: 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70  INUS ){ p = p->p
e090: 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70  Left; }.  op = p
e0a0: 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
e0b0: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
e0c0: 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69   = p->op2;.  swi
e0d0: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
e0e0: 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20  ase TK_INTEGER: 
e0f0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  {.      return a
e100: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ff==SQLITE_AFF_I
e110: 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53  NTEGER || aff==S
e120: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
e130: 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  C;.    }.    cas
e140: 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  e TK_FLOAT: {.  
e150: 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d      return aff==
e160: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
e170: 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  || aff==SQLITE_A
e180: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20  FF_NUMERIC;.    
e190: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  }.    case TK_ST
e1a0: 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 72 65  RING: {.      re
e1b0: 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45  turn aff==SQLITE
e1c0: 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d  _AFF_TEXT;.    }
e1d0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
e1e0: 42 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  B: {.      retur
e1f0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 1;.    }.    c
e200: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
e210: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
e220: 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b 20 20  ->iTable>=0 );  
e230: 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65 20 70  /* p cannot be p
e240: 61 72 74 20 6f 66 20 61 20 43 48 45 43 4b 20 63  art of a CHECK c
e250: 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
e260: 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 43 6f     return p->iCo
e270: 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20 20 20  lumn<0.         
e280: 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45   && (aff==SQLITE
e290: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20  _AFF_INTEGER || 
e2a0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
e2b0: 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20 20 7d 0a  NUMERIC);.    }.
e2c0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
e2d0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
e2e0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
e2f0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
e300: 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
e310: 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f  g is a row-id co
e320: 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e  lumn name..*/.in
e330: 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64  t sqlite3IsRowid
e340: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
e350: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
e360: 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44  rICmp(z, "_ROWID
e370: 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  _")==0 ) return 
e380: 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
e390: 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49  StrICmp(z, "ROWI
e3a0: 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  D")==0 ) return 
e3b0: 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
e3c0: 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22  StrICmp(z, "OID"
e3d0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
e3e0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
e3f0: 2f 2a 0a 2a 2a 20 70 58 20 69 73 20 74 68 65 20  /*.** pX is the 
e400: 52 48 53 20 6f 66 20 61 6e 20 49 4e 20 6f 70 65  RHS of an IN ope
e410: 72 61 74 6f 72 2e 20 20 49 66 20 70 58 20 69 73  rator.  If pX is
e420: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
e430: 65 6e 74 20 0a 2a 2a 20 74 68 61 74 20 63 61 6e  ent .** that can
e440: 20 62 65 20 73 69 6d 70 6c 69 66 69 65 64 20 74   be simplified t
e450: 6f 20 61 20 64 69 72 65 63 74 20 74 61 62 6c 65  o a direct table
e460: 20 61 63 63 65 73 73 2c 20 74 68 65 6e 20 72 65   access, then re
e470: 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65  turn.** a pointe
e480: 72 20 74 6f 20 74 68 65 20 53 45 4c 45 43 54 20  r to the SELECT 
e490: 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 66 20 70  statement.  If p
e4a0: 58 20 69 73 20 6e 6f 74 20 61 20 53 45 4c 45 43  X is not a SELEC
e4b0: 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20  T statement,.** 
e4c0: 6f 72 20 69 66 20 74 68 65 20 53 45 4c 45 43 54  or if the SELECT
e4d0: 20 73 74 61 74 65 6d 65 6e 74 20 6e 65 65 64 73   statement needs
e4e0: 20 74 6f 20 62 65 20 6d 61 6e 69 66 65 73 74 65   to be manifeste
e4f0: 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 69 65  d into a transie
e500: 6e 74 0a 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65  nt.** table, the
e510: 6e 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  n return NULL..*
e520: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
e530: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 73  _OMIT_SUBQUERY.s
e540: 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a 69 73  tatic Select *is
e550: 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
e560: 74 28 45 78 70 72 20 2a 70 58 29 7b 0a 20 20 53  t(Expr *pX){.  S
e570: 65 6c 65 63 74 20 2a 70 3b 0a 20 20 53 72 63 4c  elect *p;.  SrcL
e580: 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70  ist *pSrc;.  Exp
e590: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
e5a0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
e5b0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 45 78  int i;.  if( !Ex
e5c0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
e5d0: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
e5e0: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
e5f0: 4e 6f 74 20 61 20 73 75 62 71 75 65 72 79 20 2a  Not a subquery *
e600: 2f 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  /.  if( ExprHasP
e610: 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 56  roperty(pX, EP_V
e620: 61 72 53 65 6c 65 63 74 29 20 20 29 20 72 65 74  arSelect)  ) ret
e630: 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 65  urn 0;  /* Corre
e640: 6c 61 74 65 64 20 73 75 62 71 20 2a 2f 0a 20 20  lated subq */.  
e650: 70 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63  p = pX->x.pSelec
e660: 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  t;.  if( p->pPri
e670: 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  or ) return 0;  
e680: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
e690: 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  ot a compound SE
e6a0: 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d  LECT */.  if( p-
e6b0: 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
e6c0: 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
e6d0: 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20 74 65  egate) ){.    te
e6e0: 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46  stcase( (p->selF
e6f0: 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
e700: 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
e710: 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20  ))==SF_Distinct 
e720: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
e730: 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
e740: 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
e750: 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
e760: 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20  Aggregate );.   
e770: 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f   return 0; /* No
e780: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
e790: 64 20 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61  d and no aggrega
e7a0: 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
e7b0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
e7c0: 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20  >pGroupBy==0 ); 
e7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e7e0: 48 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  Has no GROUP BY 
e7f0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20  clause */.  if( 
e800: 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
e810: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
e820: 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d     /* Has no LIM
e830: 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 61  IT clause */.  a
e840: 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65  ssert( p->pOffse
e850: 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  t==0 );         
e860: 20 20 20 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49        /* No LIMI
e870: 54 20 6d 65 61 6e 73 20 6e 6f 20 4f 46 46 53 45  T means no OFFSE
e880: 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57  T */.  if( p->pW
e890: 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b  here ) return 0;
e8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e8b0: 20 48 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c   Has no WHERE cl
e8c0: 61 75 73 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d  ause */.  pSrc =
e8d0: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65   p->pSrc;.  asse
e8e0: 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20  rt( pSrc!=0 );. 
e8f0: 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21   if( pSrc->nSrc!
e900: 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =1 ) return 0;  
e910: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c          /* Singl
e920: 65 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63  e term in FROM c
e930: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  lause */.  if( p
e940: 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
e950: 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
e960: 20 20 2f 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74    /* FROM is not
e970: 20 61 20 73 75 62 71 75 65 72 79 20 6f 72 20 76   a subquery or v
e980: 69 65 77 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20  iew */.  pTab = 
e990: 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
e9a0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21  .  assert( pTab!
e9b0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
e9c0: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  pTab->pSelect==0
e9d0: 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   );            /
e9e0: 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  * FROM clause is
e9f0: 20 6e 6f 74 20 61 20 76 69 65 77 20 2a 2f 0a 20   not a view */. 
ea00: 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
ea10: 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b  Tab) ) return 0;
ea20: 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20          /* FROM 
ea30: 63 6c 61 75 73 65 20 6e 6f 74 20 61 20 76 69 72  clause not a vir
ea40: 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  tual table */.  
ea50: 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
ea60: 73 74 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 20 53 45  st;..  /* All SE
ea70: 4c 45 43 54 20 72 65 73 75 6c 74 73 20 6d 75 73  LECT results mus
ea80: 74 20 62 65 20 63 6f 6c 75 6d 6e 73 2e 20 2a 2f  t be columns. */
ea90: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
eaa0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
eab0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 65  ){.    Expr *pRe
eac0: 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  s = pEList->a[i]
ead0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
eae0: 70 52 65 73 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  pRes->op!=TK_COL
eaf0: 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  UMN ) return 0;.
eb00: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73      assert( pRes
eb10: 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e  ->iTable==pSrc->
eb20: 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 29 3b 20  a[0].iCursor ); 
eb30: 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c   /* Not a correl
eb40: 61 74 65 64 20 73 75 62 71 75 65 72 79 20 2a 2f  ated subquery */
eb50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
eb60: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
eb70: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
eb80: 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65  Y */../*.** Code
eb90: 20 61 6e 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74   an OP_Once inst
eba0: 72 75 63 74 69 6f 6e 20 61 6e 64 20 61 6c 6c 6f  ruction and allo
ebb0: 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 69  cate space for i
ebc0: 74 73 20 66 6c 61 67 2e 20 52 65 74 75 72 6e 20  ts flag. Return 
ebd0: 74 68 65 20 0a 2a 2a 20 61 64 64 72 65 73 73 20  the .** address 
ebe0: 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72  of the new instr
ebf0: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  uction..*/.int s
ec00: 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 50  qlite3CodeOnce(P
ec10: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
ec20: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
ec30: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
ec40: 29 3b 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75  );      /* Virtu
ec50: 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67  al machine being
ec60: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 72 65 74 75   coded */.  retu
ec70: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
ec80: 64 4f 70 31 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c  dOp1(v, OP_Once,
ec90: 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 2b 2b   pParse->nOnce++
eca0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
ecb0: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 63  rate code that c
ecc0: 68 65 63 6b 73 20 74 68 65 20 6c 65 66 74 2d 6d  hecks the left-m
ecd0: 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e  ost column of in
ece0: 64 65 78 20 74 61 62 6c 65 20 69 43 75 72 20 74  dex table iCur t
ecf0: 6f 20 73 65 65 20 69 66 0a 2a 2a 20 69 74 20 63  o see if.** it c
ed00: 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c  ontains any NULL
ed10: 20 65 6e 74 72 69 65 73 2e 20 20 43 61 75 73 65   entries.  Cause
ed20: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 61 74   the register at
ed30: 20 72 65 67 48 61 73 4e 75 6c 6c 20 74 6f 20 62   regHasNull to b
ed40: 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  e set.** to a no
ed50: 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66 20  n-NULL value if 
ed60: 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  iCur contains no
ed70: 20 4e 55 4c 4c 73 2e 20 20 43 61 75 73 65 20 72   NULLs.  Cause r
ed80: 65 67 69 73 74 65 72 20 72 65 67 48 61 73 4e 75  egister regHasNu
ed90: 6c 6c 0a 2a 2a 20 74 6f 20 62 65 20 73 65 74 20  ll.** to be set 
eda0: 74 6f 20 4e 55 4c 4c 20 69 66 20 69 43 75 72 20  to NULL if iCur 
edb0: 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
edc0: 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73  more NULL values
edd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ede0: 20 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75   sqlite3SetHasNu
edf0: 6c 6c 46 6c 61 67 28 56 64 62 65 20 2a 76 2c 20  llFlag(Vdbe *v, 
ee00: 69 6e 74 20 69 43 75 72 2c 20 69 6e 74 20 72 65  int iCur, int re
ee10: 67 48 61 73 4e 75 6c 6c 29 7b 0a 20 20 69 6e 74  gHasNull){.  int
ee20: 20 61 64 64 72 31 3b 0a 20 20 73 71 6c 69 74 65   addr1;.  sqlite
ee30: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
ee40: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
ee50: 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 61 64 64  gHasNull);.  add
ee60: 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
ee70: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77  AddOp1(v, OP_Rew
ee80: 69 6e 64 2c 20 69 43 75 72 29 3b 20 56 64 62 65  ind, iCur); Vdbe
ee90: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
eea0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
eeb0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
eec0: 43 75 72 2c 20 30 2c 20 72 65 67 48 61 73 4e 75  Cur, 0, regHasNu
eed0: 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ll);.  sqlite3Vd
eee0: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
eef0: 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b  FLAG_TYPEOFARG);
ef00: 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
ef10: 76 2c 20 22 66 69 72 73 74 5f 65 6e 74 72 79 5f  v, "first_entry_
ef20: 69 6e 28 25 64 29 22 2c 20 69 43 75 72 29 29 3b  in(%d)", iCur));
ef30: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
ef40: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
ef50: 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
ef60: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
ef70: 52 59 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67  RY./*.** The arg
ef80: 75 6d 65 6e 74 20 69 73 20 61 6e 20 49 4e 20 6f  ument is an IN o
ef90: 70 65 72 61 74 6f 72 20 77 69 74 68 20 61 20 6c  perator with a l
efa0: 69 73 74 20 28 6e 6f 74 20 61 20 73 75 62 71 75  ist (not a subqu
efb0: 65 72 79 29 20 6f 6e 20 74 68 65 20 0a 2a 2a 20  ery) on the .** 
efc0: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 2e  right-hand side.
efd0: 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
efe0: 20 74 68 61 74 20 6c 69 73 74 20 69 73 20 63 6f   that list is co
eff0: 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  nstant..*/.stati
f000: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 52  c int sqlite3InR
f010: 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70  hsIsConstant(Exp
f020: 72 20 2a 70 49 6e 29 7b 0a 20 20 45 78 70 72 20  r *pIn){.  Expr 
f030: 2a 70 4c 48 53 3b 0a 20 20 69 6e 74 20 72 65 73  *pLHS;.  int res
f040: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  ;.  assert( !Exp
f050: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 49 6e  rHasProperty(pIn
f060: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
f070: 29 3b 0a 20 20 70 4c 48 53 20 3d 20 70 49 6e 2d  );.  pLHS = pIn-
f080: 3e 70 4c 65 66 74 3b 0a 20 20 70 49 6e 2d 3e 70  >pLeft;.  pIn->p
f090: 4c 65 66 74 20 3d 20 30 3b 0a 20 20 72 65 73 20  Left = 0;.  res 
f0a0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  = sqlite3ExprIsC
f0b0: 6f 6e 73 74 61 6e 74 28 70 49 6e 29 3b 0a 20 20  onstant(pIn);.  
f0c0: 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 48  pIn->pLeft = pLH
f0d0: 53 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  S;.  return res;
f0e0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
f0f0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
f100: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 69 6d  s used by the im
f110: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
f120: 74 68 65 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65  the IN (...) ope
f130: 72 61 74 6f 72 2e 0a 2a 2a 20 54 68 65 20 70 58  rator..** The pX
f140: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
f150: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 6e 20  e expression on 
f160: 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
f170: 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 68 69 63  N operator, whic
f180: 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 65 69  h.** might be ei
f190: 74 68 65 72 20 61 20 6c 69 73 74 20 6f 66 20 65  ther a list of e
f1a0: 78 70 72 65 73 73 69 6f 6e 73 20 6f 72 20 61 20  xpressions or a 
f1b0: 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  subquery..**.** 
f1c0: 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  The job of this 
f1d0: 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 66 69  routine is to fi
f1e0: 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61 20 62  nd or create a b
f1f0: 2d 74 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61  -tree object tha
f200: 74 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64  t can.** be used
f210: 20 65 69 74 68 65 72 20 74 6f 20 74 65 73 74 20   either to test 
f220: 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20 69  for membership i
f230: 6e 20 74 68 65 20 52 48 53 20 73 65 74 20 6f 72  n the RHS set or
f240: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
f250: 75 67 68 0a 2a 2a 20 61 6c 6c 20 6d 65 6d 62 65  ugh.** all membe
f260: 72 73 20 6f 66 20 74 68 65 20 52 48 53 20 73 65  rs of the RHS se
f270: 74 2c 20 73 6b 69 70 70 69 6e 67 20 64 75 70 6c  t, skipping dupl
f280: 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20  icates..**.** A 
f290: 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 65 64  cursor is opened
f2a0: 20 6f 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6f   on the b-tree o
f2b0: 62 6a 65 63 74 20 74 68 61 74 20 69 73 20 74 68  bject that is th
f2c0: 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
f2d0: 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 61 6e 64 20  operator.** and 
f2e0: 70 58 2d 3e 69 54 61 62 6c 65 20 69 73 20 73 65  pX->iTable is se
f2f0: 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  t to the index o
f300: 66 20 74 68 61 74 20 63 75 72 73 6f 72 2e 0a 2a  f that cursor..*
f310: 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
f320: 64 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  d value of this 
f330: 66 75 6e 63 74 69 6f 6e 20 69 6e 64 69 63 61 74  function indicat
f340: 65 73 20 74 68 65 20 62 2d 74 72 65 65 20 74 79  es the b-tree ty
f350: 70 65 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  pe, as follows:.
f360: 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  **.**   IN_INDEX
f370: 5f 52 4f 57 49 44 20 20 20 20 20 20 2d 20 54 68  _ROWID      - Th
f380: 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
f390: 6e 65 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73  ned on a databas
f3a0: 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e  e table..**   IN
f3b0: 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43  _INDEX_INDEX_ASC
f3c0: 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77    - The cursor w
f3d0: 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20  as opened on an 
f3e0: 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e  ascending index.
f3f0: 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49  .**   IN_INDEX_I
f400: 4e 44 45 58 5f 44 45 53 43 20 2d 20 54 68 65 20  NDEX_DESC - The 
f410: 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65  cursor was opene
f420: 64 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e  d on a descendin
f430: 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e  g index..**   IN
f440: 5f 49 4e 44 45 58 5f 45 50 48 20 20 20 20 20 20  _INDEX_EPH      
f450: 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77    - The cursor w
f460: 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 73  as opened on a s
f470: 70 65 63 69 61 6c 6c 79 20 63 72 65 61 74 65 64  pecially created
f480: 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20   and.**         
f490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4a0: 70 6f 70 75 6c 61 74 65 64 20 65 70 68 65 72 65  populated ephere
f4b0: 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20  mal table..**   
f4c0: 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 20 20  IN_INDEX_NOOP   
f4d0: 20 20 20 20 2d 20 4e 6f 20 63 75 72 73 6f 72 20      - No cursor 
f4e0: 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20  was allocated.  
f4f0: 54 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  The IN operator 
f500: 6d 75 73 74 20 62 65 0a 2a 2a 20 20 20 20 20 20  must be.**      
f510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f520: 20 20 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61     implemented a
f530: 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  s a sequence of 
f540: 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 2a 2a 0a  comparisons..**.
f550: 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 62  ** An existing b
f560: 2d 74 72 65 65 20 6d 69 67 68 74 20 62 65 20 75  -tree might be u
f570: 73 65 64 20 69 66 20 74 68 65 20 52 48 53 20 65  sed if the RHS e
f580: 78 70 72 65 73 73 69 6f 6e 20 70 58 20 69 73 20  xpression pX is 
f590: 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 73 75 62 71  a simple.** subq
f5a0: 75 65 72 79 20 73 75 63 68 20 61 73 3a 0a 2a 2a  uery such as:.**
f5b0: 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c  .**     SELECT <
f5c0: 63 6f 6c 75 6d 6e 3e 20 46 52 4f 4d 20 3c 74 61  column> FROM <ta
f5d0: 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ble>.**.** If th
f5e0: 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
f5f0: 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69  operator is a li
f600: 73 74 20 6f 72 20 61 20 6d 6f 72 65 20 63 6f 6d  st or a more com
f610: 70 6c 65 78 20 73 75 62 71 75 65 72 79 2c 20 74  plex subquery, t
f620: 68 65 6e 0a 2a 2a 20 61 6e 20 65 70 68 65 6d 65  hen.** an epheme
f630: 72 61 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20  ral table might 
f640: 6e 65 65 64 20 74 6f 20 62 65 20 67 65 6e 65 72  need to be gener
f650: 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 52 48  ated from the RH
f660: 53 20 61 6e 64 20 74 68 65 6e 0a 2a 2a 20 70 58  S and then.** pX
f670: 2d 3e 69 54 61 62 6c 65 20 6d 61 64 65 20 74 6f  ->iTable made to
f680: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 65 70   point to the ep
f690: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 6e  hemeral table in
f6a0: 73 74 65 61 64 20 6f 66 20 61 6e 0a 2a 2a 20 65  stead of an.** e
f6b0: 78 69 73 74 69 6e 67 20 74 61 62 6c 65 2e 0a 2a  xisting table..*
f6c0: 2a 0a 2a 2a 20 54 68 65 20 69 6e 46 6c 61 67 73  *.** The inFlags
f6d0: 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73 74 20   parameter must 
f6e0: 63 6f 6e 74 61 69 6e 20 65 78 61 63 74 6c 79 20  contain exactly 
f6f0: 6f 6e 65 20 6f 66 20 74 68 65 20 62 69 74 73 0a  one of the bits.
f700: 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42  ** IN_INDEX_MEMB
f710: 45 52 53 48 49 50 20 6f 72 20 49 4e 5f 49 4e 44  ERSHIP or IN_IND
f720: 45 58 5f 4c 4f 4f 50 2e 20 20 49 66 20 69 6e 46  EX_LOOP.  If inF
f730: 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  lags contains.**
f740: 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52   IN_INDEX_MEMBER
f750: 53 48 49 50 2c 20 74 68 65 6e 20 74 68 65 20 67  SHIP, then the g
f760: 65 6e 65 72 61 74 65 64 20 74 61 62 6c 65 20 77  enerated table w
f770: 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20  ill be used for 
f780: 61 0a 2a 2a 20 66 61 73 74 20 6d 65 6d 62 65 72  a.** fast member
f790: 73 68 69 70 20 74 65 73 74 2e 20 20 57 68 65 6e  ship test.  When
f7a0: 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f   the IN_INDEX_LO
f7b0: 4f 50 20 62 69 74 20 69 73 20 73 65 74 2c 20 74  OP bit is set, t
f7c0: 68 65 0a 2a 2a 20 49 4e 20 69 6e 64 65 78 20 77  he.** IN index w
f7d0: 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 6c  ill be used to l
f7e0: 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c  oop over all val
f7f0: 75 65 73 20 6f 66 20 74 68 65 20 52 48 53 20 6f  ues of the RHS o
f800: 66 20 74 68 65 0a 2a 2a 20 49 4e 20 6f 70 65 72  f the.** IN oper
f810: 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ator..**.** When
f820: 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 69   IN_INDEX_LOOP i
f830: 73 20 75 73 65 64 20 28 61 6e 64 20 74 68 65 20  s used (and the 
f840: 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75  b-tree will be u
f850: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 0a 2a  sed to iterate.*
f860: 2a 20 74 68 72 6f 75 67 68 20 74 68 65 20 73 65  * through the se
f870: 74 20 6d 65 6d 62 65 72 73 29 20 74 68 65 6e 20  t members) then 
f880: 74 68 65 20 62 2d 74 72 65 65 20 6d 75 73 74 20  the b-tree must 
f890: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 64 75 70 6c  not contain dupl
f8a0: 69 63 61 74 65 73 2e 0a 2a 2a 20 41 6e 20 65 70  icates..** An ep
f8b0: 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75  heremal table mu
f8c0: 73 74 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73  st be used unles
f8d0: 73 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 3c  s the selected <
f8e0: 63 6f 6c 75 6d 6e 3e 20 69 73 20 67 75 61 72 61  column> is guara
f8f0: 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 75  nteed.** to be u
f900: 6e 69 71 75 65 20 2d 20 65 69 74 68 65 72 20 62  nique - either b
f910: 65 63 61 75 73 65 20 69 74 20 69 73 20 61 6e 20  ecause it is an 
f920: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
f930: 4b 45 59 20 6f 72 20 69 74 0a 2a 2a 20 68 61 73  KEY or it.** has
f940: 20 61 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72   a UNIQUE constr
f950: 61 69 6e 74 20 6f 72 20 55 4e 49 51 55 45 20 69  aint or UNIQUE i
f960: 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ndex..**.** When
f970: 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52   IN_INDEX_MEMBER
f980: 53 48 49 50 20 69 73 20 75 73 65 64 20 28 61 6e  SHIP is used (an
f990: 64 20 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c  d the b-tree wil
f9a0: 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f  l be used .** fo
f9b0: 72 20 66 61 73 74 20 73 65 74 20 6d 65 6d 62 65  r fast set membe
f9c0: 72 73 68 69 70 20 74 65 73 74 73 29 20 74 68 65  rship tests) the
f9d0: 6e 20 61 6e 20 65 70 68 65 72 65 6d 61 6c 20 74  n an epheremal t
f9e0: 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a 20 62 65  able must .** be
f9f0: 20 75 73 65 64 20 75 6e 6c 65 73 73 20 3c 63 6f   used unless <co
fa00: 6c 75 6d 6e 3e 20 69 73 20 61 6e 20 49 4e 54 45  lumn> is an INTE
fa10: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
fa20: 6f 72 20 61 6e 20 69 6e 64 65 78 20 63 61 6e 20  or an index can 
fa30: 0a 2a 2a 20 62 65 20 66 6f 75 6e 64 20 77 69 74  .** be found wit
fa40: 68 20 3c 63 6f 6c 75 6d 6e 3e 20 61 73 20 69 74  h <column> as it
fa50: 73 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75  s left-most colu
fa60: 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  mn..**.** If the
fa70: 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f   IN_INDEX_NOOP_O
fa80: 4b 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4d  K and IN_INDEX_M
fa90: 45 4d 42 45 52 53 48 49 50 20 61 72 65 20 62 6f  EMBERSHIP are bo
faa0: 74 68 20 73 65 74 20 61 6e 64 0a 2a 2a 20 69 66  th set and.** if
fab0: 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
fac0: 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61  IN operator is a
fad0: 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73 75 62   list (not a sub
fae0: 71 75 65 72 79 29 20 74 68 65 6e 20 74 68 69 73  query) then this
faf0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  .** routine migh
fb00: 74 20 64 65 63 69 64 65 20 74 68 61 74 20 63 72  t decide that cr
fb10: 65 61 74 69 6e 67 20 61 6e 20 65 70 68 65 6d 65  eating an epheme
fb20: 72 61 6c 20 62 2d 74 72 65 65 20 66 6f 72 20 6d  ral b-tree for m
fb30: 65 6d 62 65 72 73 68 69 70 0a 2a 2a 20 74 65 73  embership.** tes
fb40: 74 69 6e 67 20 69 73 20 74 6f 6f 20 65 78 70 65  ting is too expe
fb50: 6e 73 69 76 65 20 61 6e 64 20 72 65 74 75 72 6e  nsive and return
fb60: 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 20   IN_INDEX_NOOP. 
fb70: 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74   In that case, t
fb80: 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f  he.** calling ro
fb90: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 69 6d 70  utine should imp
fba0: 6c 65 6d 65 6e 74 20 74 68 65 20 49 4e 20 6f 70  lement the IN op
fbb0: 65 72 61 74 6f 72 20 75 73 69 6e 67 20 61 20 73  erator using a s
fbc0: 65 71 75 65 6e 63 65 0a 2a 2a 20 6f 66 20 45 71  equence.** of Eq
fbd0: 20 6f 72 20 4e 65 20 63 6f 6d 70 61 72 69 73 6f   or Ne compariso
fbe0: 6e 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a  n operations..**
fbf0: 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 62 2d 74  .** When the b-t
fc00: 72 65 65 20 69 73 20 62 65 69 6e 67 20 75 73 65  ree is being use
fc10: 64 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70  d for membership
fc20: 20 74 65 73 74 73 2c 20 74 68 65 20 63 61 6c 6c   tests, the call
fc30: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ing function.** 
fc40: 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 6b 6e  might need to kn
fc50: 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ow whether or no
fc60: 74 20 74 68 65 20 52 48 53 20 73 69 64 65 20 6f  t the RHS side o
fc70: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
fc80: 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61 20  r.** contains a 
fc90: 4e 55 4c 4c 2e 20 20 49 66 20 70 72 52 68 73 48  NULL.  If prRhsH
fca0: 61 73 4e 75 6c 6c 20 69 73 20 6e 6f 74 20 61 20  asNull is not a 
fcb0: 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61 6e 64  NULL pointer and
fcc0: 20 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73   .** if there is
fcd0: 20 61 6e 79 20 63 68 61 6e 63 65 20 74 68 61 74   any chance that
fce0: 20 74 68 65 20 28 2e 2e 2e 29 20 6d 69 67 68 74   the (...) might
fcf0: 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20   contain a NULL 
fd00: 76 61 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e 74  value at.** runt
fd10: 69 6d 65 2c 20 74 68 65 6e 20 61 20 72 65 67 69  ime, then a regi
fd20: 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65  ster is allocate
fd30: 64 20 61 6e 64 20 74 68 65 20 72 65 67 69 73 74  d and the regist
fd40: 65 72 20 6e 75 6d 62 65 72 20 77 72 69 74 74 65  er number writte
fd50: 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52 68 73 48 61  n.** to *prRhsHa
fd60: 73 4e 75 6c 6c 2e 20 49 66 20 74 68 65 72 65 20  sNull. If there 
fd70: 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61  is no chance tha
fd80: 74 20 74 68 65 20 28 2e 2e 2e 29 20 63 6f 6e 74  t the (...) cont
fd90: 61 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76  ains a.** NULL v
fda0: 61 6c 75 65 2c 20 74 68 65 6e 20 2a 70 72 52 68  alue, then *prRh
fdb0: 73 48 61 73 4e 75 6c 6c 20 69 73 20 6c 65 66 74  sHasNull is left
fdc0: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a   unchanged..**.*
fdd0: 2a 20 49 66 20 61 20 72 65 67 69 73 74 65 72 20  * If a register 
fde0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
fdf0: 20 69 74 73 20 6c 6f 63 61 74 69 6f 6e 20 73 74   its location st
fe00: 6f 72 65 64 20 69 6e 20 2a 70 72 52 68 73 48 61  ored in *prRhsHa
fe10: 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a 2a 2a 20 74  sNull, then.** t
fe20: 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 61 74  he value in that
fe30: 20 72 65 67 69 73 74 65 72 20 77 69 6c 6c 20 62   register will b
fe40: 65 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 62 2d  e NULL if the b-
fe50: 74 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  tree contains on
fe60: 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 4e 55 4c  e or more.** NUL
fe70: 4c 20 76 61 6c 75 65 73 2c 20 61 6e 64 20 69 74  L values, and it
fe80: 20 77 69 6c 6c 20 62 65 20 73 6f 6d 65 20 6e 6f   will be some no
fe90: 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66 20  n-NULL value if 
fea0: 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61  the b-tree conta
feb0: 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55 4c 4c 20 76  ins no.** NULL v
fec0: 61 6c 75 65 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65  alues..*/.#ifnde
fed0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
fee0: 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74  BQUERY.int sqlit
fef0: 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 0a 20  e3FindInIndex(. 
ff00: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
ff10: 0a 20 20 45 78 70 72 20 2a 70 58 2c 20 0a 20 20  .  Expr *pX, .  
ff20: 75 33 32 20 69 6e 46 6c 61 67 73 2c 20 0a 20 20  u32 inFlags, .  
ff30: 69 6e 74 20 2a 70 72 52 68 73 48 61 73 4e 75 6c  int *prRhsHasNul
ff40: 6c 2c 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70 0a  l,.  int *aiMap.
ff50: 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 20  ){.  Select *p; 
ff60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45             /* SE
ff80: 4c 45 43 54 20 74 6f 20 74 68 65 20 72 69 67 68  LECT to the righ
ff90: 74 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72  t of IN operator
ffa0: 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20   */.  int eType 
ffb0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
ffc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
ffd0: 79 70 65 20 6f 66 20 52 48 53 20 74 61 62 6c 65  ype of RHS table
ffe0: 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a  . IN_INDEX_* */.
fff0: 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61    int iTab = pPa
10000 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20  rse->nTab++;    
10010 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
10020 72 20 6f 66 20 74 68 65 20 52 48 53 20 74 61 62  r of the RHS tab
10030 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74  le */.  int must
10040 42 65 55 6e 69 71 75 65 3b 20 20 20 20 20 20 20  BeUnique;       
10050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10060 20 54 72 75 65 20 69 66 20 52 48 53 20 6d 75 73   True if RHS mus
10070 74 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20  t be unique */. 
10080 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
10090 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
100a0 29 3b 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61  );     /* Virtua
100b0 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20  l machine being 
100c0 63 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65  coded */..  asse
100d0 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49  rt( pX->op==TK_I
100e0 4e 20 29 3b 0a 20 20 6d 75 73 74 42 65 55 6e 69  N );.  mustBeUni
100f0 71 75 65 20 3d 20 28 69 6e 46 6c 61 67 73 20 26  que = (inFlags &
10100 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 29 21   IN_INDEX_LOOP)!
10110 3d 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  =0;..  /* If the
10120 20 52 48 53 20 6f 66 20 74 68 69 73 20 49 4e 28   RHS of this IN(
10130 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20 69 73  ...) operator is
10140 20 61 20 53 45 4c 45 43 54 2c 20 61 6e 64 20 69   a SELECT, and i
10150 66 20 69 74 20 6d 61 74 74 65 72 73 20 0a 20 20  f it matters .  
10160 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
10170 74 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 73  t the SELECT res
10180 75 6c 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c  ult contains NUL
10190 4c 20 76 61 6c 75 65 73 2c 20 63 68 65 63 6b 20  L values, check 
101a0 77 68 65 74 68 65 72 0a 20 20 2a 2a 20 6f 72 20  whether.  ** or 
101b0 6e 6f 74 20 4e 55 4c 4c 20 69 73 20 61 63 74 75  not NULL is actu
101c0 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 28 69  ally possible (i
101d0 74 20 6d 61 79 20 6e 6f 74 20 62 65 2c 20 66 6f  t may not be, fo
101e0 72 20 65 78 61 6d 70 6c 65 2c 20 64 75 65 20 0a  r example, due .
101f0 20 20 2a 2a 20 74 6f 20 4e 4f 54 20 4e 55 4c 4c    ** to NOT NULL
10200 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20   constraints in 
10210 74 68 65 20 73 63 68 65 6d 61 29 2e 20 49 66 20  the schema). If 
10220 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61  no NULL values a
10230 72 65 20 70 6f 73 73 69 62 6c 65 2c 0a 20 20 2a  re possible,.  *
10240 2a 20 73 65 74 20 70 72 52 68 73 48 61 73 4e 75  * set prRhsHasNu
10250 6c 6c 20 74 6f 20 30 20 62 65 66 6f 72 65 20 63  ll to 0 before c
10260 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 2a 2f 0a 20  ontinuing.  */. 
10270 20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c   if( prRhsHasNul
10280 6c 20 26 26 20 28 70 58 2d 3e 66 6c 61 67 73 20  l && (pX->flags 
10290 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  & EP_xIsSelect) 
102a0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
102b0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
102c0 73 74 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65  st = pX->x.pSele
102d0 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  ct->pEList;.    
102e0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
102f0 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
10300 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
10310 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70  3ExprCanBeNull(p
10320 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
10330 72 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  r) ) break;.    
10340 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 45 4c  }.    if( i==pEL
10350 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
10360 20 20 20 20 70 72 52 68 73 48 61 73 4e 75 6c 6c      prRhsHasNull
10370 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
10380 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
10390 65 65 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e  ee if an existin
103a0 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  g table or index
103b0 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 0a   can be used to.
103c0 20 20 2a 2a 20 73 61 74 69 73 66 79 20 74 68 65    ** satisfy the
103d0 20 71 75 65 72 79 2e 20 20 54 68 69 73 20 69 73   query.  This is
103e0 20 70 72 65 66 65 72 61 62 6c 65 20 74 6f 20 67   preferable to g
103f0 65 6e 65 72 61 74 69 6e 67 20 61 20 6e 65 77 20  enerating a new 
10400 0a 20 20 2a 2a 20 65 70 68 65 6d 65 72 61 6c 20  .  ** ephemeral 
10410 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28  table.  */.  if(
10420 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
10430 20 26 26 20 28 70 20 3d 20 69 73 43 61 6e 64 69   && (p = isCandi
10440 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 58 29  dateForInOpt(pX)
10450 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
10460 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
10470 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20  ->db;           
10480 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
10490 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20  onnection */.   
104a0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
104b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104c0 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
104d0 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20   <table>. */.   
104e0 20 69 31 36 20 69 44 62 3b 20 20 20 20 20 20 20   i16 iDb;       
104f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10500 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
10510 61 73 65 20 69 64 78 20 66 6f 72 20 70 54 61 62  ase idx for pTab
10520 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74   */.    ExprList
10530 20 2a 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45   *pEList = p->pE
10540 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 6e 45  List;.    int nE
10550 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  xpr = pEList->nE
10560 78 70 72 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  xpr;..    assert
10570 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29  ( p->pEList!=0 )
10580 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
10590 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61   Because of isCa
105a0 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
105b0 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  p) */.    assert
105c0 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  ( p->pEList->a[0
105d0 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 20 2f 2a  ].pExpr!=0 ); /*
105e0 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61   Because of isCa
105f0 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
10600 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  p) */.    assert
10610 28 20 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b 20  ( p->pSrc!=0 ); 
10620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10630 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61   Because of isCa
10640 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
10650 70 29 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d  p) */.    pTab =
10660 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
10670 54 61 62 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 64  Tab;..    /* Cod
10680 65 20 61 6e 20 4f 50 5f 54 72 61 6e 73 61 63 74  e an OP_Transact
10690 69 6f 6e 20 61 6e 64 20 4f 50 5f 54 61 62 6c 65  ion and OP_Table
106a0 4c 6f 63 6b 20 66 6f 72 20 3c 74 61 62 6c 65 3e  Lock for <table>
106b0 2e 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73  . */.    iDb = s
106c0 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
106d0 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
106e0 63 68 65 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69  chema);.    sqli
106f0 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
10700 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
10710 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 61 62  ;.    sqlite3Tab
10720 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
10730 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
10740 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  0, pTab->zName);
10750 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75  ..    /* This fu
10760 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63  nction is only c
10770 61 6c 6c 65 64 20 66 72 6f 6d 20 74 77 6f 20 70  alled from two p
10780 6c 61 63 65 73 2e 20 49 6e 20 62 6f 74 68 20 63  laces. In both c
10790 61 73 65 73 20 74 68 65 20 76 64 62 65 0a 20 20  ases the vdbe.  
107a0 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79    ** has already
107b0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2e   been allocated.
107c0 20 53 6f 20 61 73 73 75 6d 65 20 73 71 6c 69 74   So assume sqlit
107d0 65 33 47 65 74 56 64 62 65 28 29 20 69 73 20 61  e3GetVdbe() is a
107e0 6c 77 61 79 73 0a 20 20 20 20 2a 2a 20 73 75 63  lways.    ** suc
107f0 63 65 73 73 66 75 6c 20 68 65 72 65 2e 0a 20 20  cessful here..  
10800 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
10810 76 29 3b 0a 20 20 20 20 69 66 28 20 6e 45 78 70  v);.    if( nExp
10820 72 3d 3d 31 20 26 26 20 70 45 4c 69 73 74 2d 3e  r==1 && pEList->
10830 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c  a[0].pExpr->iCol
10840 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 69  umn<0 ){.      i
10850 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74  nt iAddr = sqlit
10860 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73  e3CodeOnce(pPars
10870 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  e);.      VdbeCo
10880 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20  verage(v);..    
10890 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
108a0 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c  le(pParse, iTab,
108b0 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f   iDb, pTab, OP_O
108c0 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20  penRead);.      
108d0 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
108e0 5f 52 4f 57 49 44 3b 0a 0a 20 20 20 20 20 20 73  _ROWID;..      s
108f0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
10900 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20  re(v, iAddr);.  
10910 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
10920 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
10930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10940 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
10950 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20  variable */.    
10960 20 20 69 6e 74 20 61 66 66 69 6e 69 74 79 5f 6f    int affinity_o
10970 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 74  k = 1;.      int
10980 20 69 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68   i;..      /* Ch
10990 65 63 6b 20 74 68 61 74 20 74 68 65 20 61 66 66  eck that the aff
109a0 69 6e 69 74 79 20 74 68 61 74 20 77 69 6c 6c 20  inity that will 
109b0 62 65 20 75 73 65 64 20 74 6f 20 70 65 72 66 6f  be used to perfo
109c0 72 6d 20 65 61 63 68 20 0a 20 20 20 20 20 20 2a  rm each .      *
109d0 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  * comparison is 
109e0 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
109f0 61 66 66 69 6e 69 74 79 20 6f 66 20 65 61 63 68  affinity of each
10a00 20 63 6f 6c 75 6d 6e 2e 20 49 66 0a 20 20 20 20   column. If.    
10a10 20 20 2a 2a 20 69 74 20 6e 6f 74 2c 20 69 74 20    ** it not, it 
10a20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
10a30 74 6f 20 75 73 65 20 61 6e 79 20 69 6e 64 65 78  to use any index
10a40 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  .  */.      for(
10a50 69 3d 30 3b 20 69 3c 6e 45 78 70 72 20 26 26 20  i=0; i<nExpr && 
10a60 61 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 69 2b 2b  affinity_ok; i++
10a70 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
10a80 2a 70 4c 68 73 20 3d 20 65 78 70 72 56 65 63 74  *pLhs = exprVect
10a90 6f 72 46 69 65 6c 64 28 70 58 2d 3e 70 4c 65 66  orField(pX->pLef
10aa0 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69  t, i);.        i
10ab0 6e 74 20 69 43 6f 6c 20 3d 20 70 45 4c 69 73 74  nt iCol = pEList
10ac0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 69 43  ->a[i].pExpr->iC
10ad0 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 63  olumn;.        c
10ae0 68 61 72 20 69 64 78 61 66 66 20 3d 20 70 54 61  har idxaff = pTa
10af0 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66  b->aCol[iCol].af
10b00 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20  finity;.        
10b10 63 68 61 72 20 63 6d 70 61 66 66 20 3d 20 73 71  char cmpaff = sq
10b20 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
10b30 6e 69 74 79 28 70 4c 68 73 2c 20 69 64 78 61 66  nity(pLhs, idxaf
10b40 66 29 3b 0a 20 20 20 20 20 20 20 20 73 77 69 74  f);.        swit
10b50 63 68 28 20 63 6d 70 61 66 66 20 29 7b 0a 20 20  ch( cmpaff ){.  
10b60 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
10b70 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3a 0a 20 20  ITE_AFF_BLOB:.  
10b80 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
10b90 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20  .          case 
10ba0 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3a  SQLITE_AFF_TEXT:
10bb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 66 66  .            aff
10bc0 69 6e 69 74 79 5f 6f 6b 20 3d 20 28 69 64 78 61  inity_ok = (idxa
10bd0 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ff==SQLITE_AFF_T
10be0 45 58 54 29 3b 0a 20 20 20 20 20 20 20 20 20 20  EXT);.          
10bf0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
10c00 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
10c10 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79          affinity
10c20 5f 6f 6b 20 3d 20 73 71 6c 69 74 65 33 49 73 4e  _ok = sqlite3IsN
10c30 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 69  umericAffinity(i
10c40 64 78 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20  dxaff);.        
10c50 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
10c60 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f   /* The collatio
10c70 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20  n sequence used 
10c80 62 79 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  by the compariso
10c90 6e 2e 20 49 66 20 61 6e 20 69 6e 64 65 78 20 69  n. If an index i
10ca0 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65  s to.      ** be
10cb0 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f   used in place o
10cc0 66 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 2c 20  f a temp-table, 
10cd0 69 74 20 6d 75 73 74 20 62 65 20 6f 72 64 65 72  it must be order
10ce0 65 64 20 61 63 63 6f 72 64 69 6e 67 0a 20 20 20  ed according.   
10cf0 20 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 63 6f     ** to this co
10d00 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
10d10 2e 20 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72  .  */..      for
10d20 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
10d30 65 78 3b 20 70 49 64 78 20 26 26 20 65 54 79 70  ex; pIdx && eTyp
10d40 65 3d 3d 30 20 26 26 20 61 66 66 69 6e 69 74 79  e==0 && affinity
10d50 5f 6f 6b 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  _ok; pIdx=pIdx->
10d60 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
10d70 69 66 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  if( pIdx->nKeyCo
10d80 6c 3c 6e 45 78 70 72 20 29 20 63 6f 6e 74 69 6e  l<nExpr ) contin
10d90 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
10da0 6d 75 73 74 42 65 55 6e 69 71 75 65 20 26 26 20  mustBeUnique && 
10db0 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 21 3d  (pIdx->nKeyCol!=
10dc0 6e 45 78 70 72 20 7c 7c 20 21 49 73 55 6e 69 71  nExpr || !IsUniq
10dd0 75 65 49 6e 64 65 78 28 70 49 64 78 29 29 20 29  ueIndex(pIdx)) )
10de0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  {.          cont
10df0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
10e00 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
10e10 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ; i<nExpr; i++){
10e20 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
10e30 2a 70 4c 68 73 20 3d 20 65 78 70 72 56 65 63 74  *pLhs = exprVect
10e40 6f 72 46 69 65 6c 64 28 70 58 2d 3e 70 4c 65 66  orField(pX->pLef
10e50 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
10e60 20 45 78 70 72 20 2a 70 52 68 73 20 3d 20 70 45   Expr *pRhs = pE
10e70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
10e80 3b 0a 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c  ;.          Coll
10e90 53 65 71 20 2a 70 52 65 71 20 3d 20 73 71 6c 69  Seq *pReq = sqli
10ea0 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
10eb0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
10ec0 70 4c 68 73 2c 20 70 52 68 73 29 3b 0a 20 20 20  pLhs, pRhs);.   
10ed0 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 0a 20         int j;.. 
10ee0 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
10ef0 3b 20 6a 3c 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b  ; j<nExpr; j++){
10f00 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
10f10 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
10f20 6a 5d 21 3d 70 52 68 73 2d 3e 69 43 6f 6c 75 6d  j]!=pRhs->iColum
10f30 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  n ) continue;.  
10f40 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
10f50 28 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a  ( pIdx->azColl[j
10f60 5d 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ] );.           
10f70 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
10f80 43 6d 70 28 70 52 65 71 2d 3e 7a 4e 61 6d 65 2c  Cmp(pReq->zName,
10f90 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d   pIdx->azColl[j]
10fa0 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
10fb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
10fc0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
10fd0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d            if( j=
10fe0 3d 6e 45 78 70 72 20 29 20 62 72 65 61 6b 3b 0a  =nExpr ) break;.
10ff0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 69            if( ai
11000 4d 61 70 20 29 20 61 69 4d 61 70 5b 69 5d 20 3d  Map ) aiMap[i] =
11010 20 6a 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   j;.        }.. 
11020 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d 6e 45         if( i==nE
11030 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  xpr ){.         
11040 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c   int iAddr = sql
11050 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61  ite3CodeOnce(pPa
11060 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  rse); VdbeCovera
11070 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
11080 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11090 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  p3(v, OP_OpenRea
110a0 64 2c 20 69 54 61 62 2c 20 70 49 64 78 2d 3e 74  d, iTab, pIdx->t
110b0 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  num, iDb);.     
110c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
110d0 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61  SetP4KeyInfo(pPa
110e0 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  rse, pIdx);.    
110f0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
11100 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78  t((v, "%s", pIdx
11110 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
11120 20 20 20 20 20 61 73 73 65 72 74 28 20 49 4e 5f       assert( IN_
11130 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43  INDEX_INDEX_DESC
11140 20 3d 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44   == IN_INDEX_IND
11150 45 58 5f 41 53 43 2b 31 20 29 3b 0a 20 20 20 20  EX_ASC+1 );.    
11160 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e        eType = IN
11170 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43  _INDEX_INDEX_ASC
11180 20 2b 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72   + pIdx->aSortOr
11190 64 65 72 5b 30 5d 3b 0a 0a 20 20 20 20 20 20 20  der[0];..       
111a0 20 20 20 69 66 28 20 70 72 52 68 73 48 61 73 4e     if( prRhsHasN
111b0 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ull ){.         
111c0 20 20 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c     *prRhsHasNull
111d0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
111e0 6d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  m;.#ifdef SQLITE
111f0 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55  _ENABLE_COLUMN_U
11200 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20 20 20  SED_MASK.       
11210 20 20 20 20 20 69 36 34 20 6d 61 73 6b 20 3d 20       i64 mask = 
11220 28 31 3c 3c 6e 45 78 70 72 29 2d 31 3b 0a 20 20  (1<<nExpr)-1;.  
11230 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11240 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28  3VdbeAddOp4Dup8(
11250 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65  v, OP_ColumnsUse
11260 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  d, .            
11270 20 20 20 20 69 54 61 62 2c 20 30 2c 20 30 2c 20      iTab, 0, 0, 
11280 28 75 38 2a 29 26 6d 61 73 6b 2c 20 50 34 5f 49  (u8*)&mask, P4_I
11290 4e 54 36 34 29 3b 0a 23 65 6e 64 69 66 0a 20 20  NT64);.#endif.  
112a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 45            if( nE
112b0 78 70 72 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  xpr==1 ){.      
112c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
112d0 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c  etHasNullFlag(v,
112e0 20 69 54 61 62 2c 20 2a 70 72 52 68 73 48 61 73   iTab, *prRhsHas
112f0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  Null);.         
11300 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
11310 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
11320 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
11330 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20  , iAddr);.      
11340 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
11350 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e  }.  }..  /* If n
11360 6f 20 70 72 65 65 78 69 73 74 69 6e 67 20 69 6e  o preexisting in
11370 64 65 78 20 69 73 20 61 76 61 69 6c 61 62 6c 65  dex is available
11380 20 66 6f 72 20 74 68 65 20 49 4e 20 63 6c 61 75   for the IN clau
11390 73 65 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 5f 49  se.  ** and IN_I
113a0 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 61 6e 20  NDEX_NOOP is an 
113b0 61 6c 6c 6f 77 65 64 20 72 65 70 6c 79 0a 20 20  allowed reply.  
113c0 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20 6f  ** and the RHS o
113d0 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
113e0 72 20 69 73 20 61 20 6c 69 73 74 2c 20 6e 6f 74  r is a list, not
113f0 20 61 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a   a subquery.  **
11400 20 61 6e 64 20 74 68 65 20 52 48 53 20 69 73 20   and the RHS is 
11410 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 6f 72 20  not constant or 
11420 68 61 73 20 74 77 6f 20 6f 72 20 66 65 77 65 72  has two or fewer
11430 20 74 65 72 6d 73 2c 0a 20 20 2a 2a 20 74 68 65   terms,.  ** the
11440 6e 20 69 74 20 69 73 20 6e 6f 74 20 77 6f 72 74  n it is not wort
11450 68 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70  h creating an ep
11460 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f  hemeral table to
11470 20 65 76 61 6c 75 61 74 65 0a 20 20 2a 2a 20 74   evaluate.  ** t
11480 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 73  he IN operator s
11490 6f 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45  o return IN_INDE
114a0 58 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f 0a 20 20 69  X_NOOP..  */.  i
114b0 66 28 20 65 54 79 70 65 3d 3d 30 0a 20 20 20 26  f( eType==0.   &
114c0 26 20 28 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f  & (inFlags & IN_
114d0 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 29 0a 20  INDEX_NOOP_OK). 
114e0 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f    && !ExprHasPro
114f0 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73  perty(pX, EP_xIs
11500 53 65 6c 65 63 74 29 0a 20 20 20 26 26 20 28 21  Select).   && (!
11510 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43 6f  sqlite3InRhsIsCo
11520 6e 73 74 61 6e 74 28 70 58 29 20 7c 7c 20 70 58  nstant(pX) || pX
11530 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
11540 3c 3d 32 29 0a 20 20 29 7b 0a 20 20 20 20 65 54  <=2).  ){.    eT
11550 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 4e  ype = IN_INDEX_N
11560 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  OOP;.  }..  if( 
11570 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20  eType==0 ){.    
11580 2f 2a 20 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e  /* Could not fin
11590 64 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61  d an existing ta
115a0 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20  ble or index to 
115b0 75 73 65 20 61 73 20 74 68 65 20 52 48 53 20 62  use as the RHS b
115c0 2d 74 72 65 65 2e 0a 20 20 20 20 2a 2a 20 57 65  -tree..    ** We
115d0 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 67 65   will have to ge
115e0 6e 65 72 61 74 65 20 61 6e 20 65 70 68 65 6d 65  nerate an epheme
115f0 72 61 6c 20 74 61 62 6c 65 20 74 6f 20 64 6f 20  ral table to do 
11600 74 68 65 20 6a 6f 62 2e 0a 20 20 20 20 2a 2f 0a  the job..    */.
11610 20 20 20 20 75 33 32 20 73 61 76 65 64 4e 51 75      u32 savedNQu
11620 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65  eryLoop = pParse
11630 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  ->nQueryLoop;.  
11640 20 20 69 6e 74 20 72 4d 61 79 48 61 76 65 4e 75    int rMayHaveNu
11650 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 65 54 79 70  ll = 0;.    eTyp
11660 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48  e = IN_INDEX_EPH
11670 3b 0a 20 20 20 20 69 66 28 20 69 6e 46 6c 61 67  ;.    if( inFlag
11680 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f  s & IN_INDEX_LOO
11690 50 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  P ){.      pPars
116a0 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  e->nQueryLoop = 
116b0 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d  0;.      if( pX-
116c0 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c  >pLeft->iColumn<
116d0 30 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f  0 && !ExprHasPro
116e0 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73  perty(pX, EP_xIs
116f0 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
11700 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
11710 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20  DEX_ROWID;.     
11720 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
11730 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 29 7b   prRhsHasNull ){
11740 0a 20 20 20 20 20 20 2a 70 72 52 68 73 48 61 73  .      *prRhsHas
11750 4e 75 6c 6c 20 3d 20 72 4d 61 79 48 61 76 65 4e  Null = rMayHaveN
11760 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  ull = ++pParse->
11770 6e 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nMem;.    }.    
11780 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
11790 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 58 2c  lect(pParse, pX,
117a0 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 65   rMayHaveNull, e
117b0 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52  Type==IN_INDEX_R
117c0 4f 57 49 44 29 3b 0a 20 20 20 20 70 50 61 72 73  OWID);.    pPars
117d0 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  e->nQueryLoop = 
117e0 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b  savedNQueryLoop;
117f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 58  .  }else{.    pX
11800 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b  ->iTable = iTab;
11810 0a 20 20 7d 0a 0a 20 20 69 66 28 20 61 69 4d 61  .  }..  if( aiMa
11820 70 20 26 26 20 65 54 79 70 65 21 3d 49 4e 5f 49  p && eType!=IN_I
11830 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 26  NDEX_INDEX_ASC &
11840 26 20 65 54 79 70 65 21 3d 49 4e 5f 49 4e 44 45  & eType!=IN_INDE
11850 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a  X_INDEX_DESC ){.
11860 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20      int i, n;.  
11870 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70    n = sqlite3Exp
11880 72 56 65 63 74 6f 72 53 69 7a 65 28 70 58 2d 3e  rVectorSize(pX->
11890 70 4c 65 66 74 29 3b 0a 20 20 20 20 66 6f 72 28  pLeft);.    for(
118a0 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 20 61  i=0; i<n; i++) a
118b0 69 4d 61 70 5b 69 5d 20 3d 20 69 3b 0a 20 20 7d  iMap[i] = i;.  }
118c0 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b  .  return eType;
118d0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69  .}.#endif..stati
118e0 63 20 63 68 61 72 20 2a 65 78 70 72 49 4e 41 66  c char *exprINAf
118f0 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50  finity(Parse *pP
11900 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
11910 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c 65 66  r){.  Expr *pLef
11920 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
11930 3b 0a 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73  ;.  int nVal = s
11940 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
11950 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a 20 20 63  Size(pLeft);.  c
11960 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 7a 52  har *zRet;..  zR
11970 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  et = sqlite3DbMa
11980 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
11990 3e 64 62 2c 20 6e 56 61 6c 2b 31 29 3b 0a 20 20  >db, nVal+1);.  
119a0 69 66 28 20 7a 52 65 74 20 29 7b 0a 20 20 20 20  if( zRet ){.    
119b0 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
119c0 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29  =0; i<nVal; i++)
119d0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 41  {.      Expr *pA
119e0 3b 0a 20 20 20 20 20 20 63 68 61 72 20 61 3b 0a  ;.      char a;.
119f0 20 20 20 20 20 20 69 66 28 20 6e 56 61 6c 3d 3d        if( nVal==
11a00 31 20 26 26 20 30 20 29 7b 0a 20 20 20 20 20 20  1 && 0 ){.      
11a10 20 20 70 41 20 3d 20 70 4c 65 66 74 3b 0a 20 20    pA = pLeft;.  
11a20 20 20 20 20 7d 65 6c 73 65 7b 20 20 20 20 0a 20      }else{    . 
11a30 20 20 20 20 20 20 20 70 41 20 3d 20 65 78 70 72         pA = expr
11a40 56 65 63 74 6f 72 46 69 65 6c 64 28 70 4c 65 66  VectorField(pLef
11a50 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, i);.      }. 
11a60 20 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33       a = sqlite3
11a70 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 41 29  ExprAffinity(pA)
11a80 3b 0a 20 20 20 20 20 20 7a 52 65 74 5b 69 5d 20  ;.      zRet[i] 
11a90 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
11aa0 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
11ab0 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
11ac0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 61  t->a[i].pExpr, a
11ad0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 52 65  );.    }.    zRe
11ae0 74 5b 6e 56 61 6c 5d 20 3d 20 27 5c 30 27 3b 0a  t[nVal] = '\0';.
11af0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65    }.  return zRe
11b00 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  t;.}..#ifndef SQ
11b10 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
11b20 52 59 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68  RY./*.** Load th
11b30 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 70  e Parse object p
11b40 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
11b50 73 74 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68  st argument with
11b60 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65   an error .** me
11b70 73 73 61 67 65 20 6f 66 20 74 68 65 20 66 6f 72  ssage of the for
11b80 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62 2d  m:.**.**   "sub-
11b90 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20 4e  select returns N
11ba0 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63   columns - expec
11bb0 74 65 64 20 4d 22 0a 2a 2f 20 20 20 0a 76 6f 69  ted M".*/   .voi
11bc0 64 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65  d sqlite3Subsele
11bd0 63 74 45 72 72 6f 72 28 50 61 72 73 65 20 2a 70  ctError(Parse *p
11be0 50 61 72 73 65 2c 20 69 6e 74 20 6e 41 63 74 75  Parse, int nActu
11bf0 61 6c 2c 20 69 6e 74 20 6e 45 78 70 65 63 74 29  al, int nExpect)
11c00 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
11c10 7a 46 6d 74 20 3d 20 22 73 75 62 2d 73 65 6c 65  zFmt = "sub-sele
11c20 63 74 20 72 65 74 75 72 6e 73 20 25 64 20 63 6f  ct returns %d co
11c30 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64  lumns - expected
11c40 20 25 64 22 3b 0a 20 20 73 71 6c 69 74 65 33 45   %d";.  sqlite3E
11c50 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11c60 7a 46 6d 74 2c 20 6e 41 63 74 75 61 6c 2c 20 6e  zFmt, nActual, n
11c70 45 78 70 65 63 74 29 3b 0a 7d 0a 23 65 6e 64 69  Expect);.}.#endi
11c80 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  f../*.** Generat
11c90 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61  e code for scala
11ca0 72 20 73 75 62 71 75 65 72 69 65 73 20 75 73 65  r subqueries use
11cb0 64 20 61 73 20 61 20 73 75 62 71 75 65 72 79 20  d as a subquery 
11cc0 65 78 70 72 65 73 73 69 6f 6e 2c 20 45 58 49 53  expression, EXIS
11cd0 54 53 2c 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70 65  TS,.** or IN ope
11ce0 72 61 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65  rators.  Example
11cf0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45  s:.**.**     (SE
11d00 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20  LECT a FROM b)  
11d10 20 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75          -- subqu
11d20 65 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54  ery.**     EXIST
11d30 53 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  S (SELECT a FROM
11d40 20 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20   b)   -- EXISTS 
11d50 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20  subquery.**     
11d60 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20 20 20  x IN (4,5,11)   
11d70 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 49 4e             -- IN
11d80 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 6c   operator with l
11d90 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e  ist on right-han
11da0 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20 78 20  d side.**     x 
11db0 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f  IN (SELECT a FRO
11dc0 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f  M b)     -- IN o
11dd0 70 65 72 61 74 6f 72 20 77 69 74 68 20 73 75 62  perator with sub
11de0 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72 69 67  query on the rig
11df0 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78  ht.**.** The pEx
11e00 70 72 20 70 61 72 61 6d 65 74 65 72 20 64 65 73  pr parameter des
11e10 63 72 69 62 65 73 20 74 68 65 20 65 78 70 72 65  cribes the expre
11e20 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61  ssion that conta
11e30 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70  ins the IN.** op
11e40 65 72 61 74 6f 72 20 6f 72 20 73 75 62 71 75 65  erator or subque
11e50 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  ry..**.** If par
11e60 61 6d 65 74 65 72 20 69 73 52 6f 77 69 64 20 69  ameter isRowid i
11e70 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
11e80 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
11e90 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a  r is guaranteed.
11ea0 2a 2a 20 74 6f 20 62 65 20 6f 66 20 74 68 65 20  ** to be of the 
11eb0 66 6f 72 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e  form "<rowid> IN
11ec0 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65   (?, ?, ?)", whe
11ed0 72 65 20 3c 72 6f 77 69 64 3e 20 69 73 20 61 20  re <rowid> is a 
11ee0 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20  reference.** to 
11ef0 73 6f 6d 65 20 69 6e 74 65 67 65 72 20 6b 65 79  some integer key
11f00 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62   column of a tab
11f10 6c 65 20 42 2d 54 72 65 65 2e 20 49 6e 20 74 68  le B-Tree. In th
11f20 69 73 20 63 61 73 65 2c 20 75 73 65 20 61 6e 0a  is case, use an.
11f30 2a 2a 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65  ** intkey B-Tree
11f40 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65   to store the se
11f50 74 20 6f 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c  t of IN(...) val
11f60 75 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20 74  ues instead of t
11f70 68 65 20 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f  he usual.** (slo
11f80 77 65 72 29 20 76 61 72 69 61 62 6c 65 20 6c 65  wer) variable le
11f90 6e 67 74 68 20 6b 65 79 73 20 42 2d 54 72 65 65  ngth keys B-Tree
11fa0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48  ..**.** If rMayH
11fb0 61 76 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a  aveNull is non-z
11fc0 65 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ero, that means 
11fd0 74 68 61 74 20 74 68 65 20 6f 70 65 72 61 74 69  that the operati
11fe0 6f 6e 20 69 73 20 61 6e 20 49 4e 0a 2a 2a 20 28  on is an IN.** (
11ff0 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 6f 72 20  not a SELECT or 
12000 45 58 49 53 54 53 29 20 61 6e 64 20 74 68 61 74  EXISTS) and that
12010 20 74 68 65 20 52 48 53 20 6d 69 67 68 74 20 63   the RHS might c
12020 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a  ontains NULLs..*
12030 2a 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69  * All this routi
12040 6e 65 20 64 6f 65 73 20 69 73 20 69 6e 69 74 69  ne does is initi
12050 61 6c 69 7a 65 20 74 68 65 20 72 65 67 69 73 74  alize the regist
12060 65 72 20 67 69 76 65 6e 20 62 79 20 72 4d 61 79  er given by rMay
12070 48 61 76 65 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 4e  HaveNull.** to N
12080 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67 20 72 6f  ULL.  Calling ro
12090 75 74 69 6e 65 73 20 77 69 6c 6c 20 74 61 6b 65  utines will take
120a0 20 63 61 72 65 20 6f 66 20 63 68 61 6e 67 69 6e   care of changin
120b0 67 20 74 68 69 73 20 72 65 67 69 73 74 65 72 0a  g this register.
120c0 2a 2a 20 76 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d  ** value to non-
120d0 4e 55 4c 4c 20 69 66 20 74 68 65 20 52 48 53 20  NULL if the RHS 
120e0 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a  is NULL-free..**
120f0 0a 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54  .** For a SELECT
12100 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72 61   or EXISTS opera
12110 74 6f 72 2c 20 72 65 74 75 72 6e 20 74 68 65 20  tor, return the 
12120 72 65 67 69 73 74 65 72 20 74 68 61 74 20 68 6f  register that ho
12130 6c 64 73 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  lds the.** resul
12140 74 2e 20 20 46 6f 72 20 49 4e 20 6f 70 65 72 61  t.  For IN opera
12150 74 6f 72 73 20 6f 72 20 69 66 20 61 6e 20 65 72  tors or if an er
12160 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
12170 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
12180 30 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  0..*/.#ifndef SQ
12190 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
121a0 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f  RY.int sqlite3Co
121b0 64 65 53 75 62 73 65 6c 65 63 74 28 0a 20 20 50  deSubselect(.  P
121c0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
121d0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
121e0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
121f0 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
12200 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e         /* The IN
12210 2c 20 53 45 4c 45 43 54 2c 20 6f 72 20 45 58 49  , SELECT, or EXI
12220 53 54 53 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  STS operator */.
12230 20 20 69 6e 74 20 72 48 61 73 4e 75 6c 6c 46 6c    int rHasNullFl
12240 61 67 2c 20 20 20 20 20 20 20 2f 2a 20 52 65 67  ag,       /* Reg
12250 69 73 74 65 72 20 74 68 61 74 20 72 65 63 6f 72  ister that recor
12260 64 73 20 77 68 65 74 68 65 72 20 4e 55 4c 4c 73  ds whether NULLs
12270 20 65 78 69 73 74 20 69 6e 20 52 48 53 20 2a 2f   exist in RHS */
12280 0a 20 20 69 6e 74 20 69 73 52 6f 77 69 64 20 20  .  int isRowid  
12290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
122a0 20 74 72 75 65 2c 20 4c 48 53 20 6f 66 20 49 4e   true, LHS of IN
122b0 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 72   operator is a r
122c0 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  owid */.){.  int
122d0 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20   jmpIfDynamic = 
122e0 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  -1;             
122f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d           /* One-
12300 74 69 6d 65 20 74 65 73 74 20 61 64 64 72 65 73  time test addres
12310 73 20 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67 20  s */.  int rReg 
12320 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
12330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12340 2a 20 52 65 67 69 73 74 65 72 20 73 74 6f 72 69  * Register stori
12350 6e 67 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f 0a  ng resulting */.
12360 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
12370 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
12380 65 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28  e);.  if( NEVER(
12390 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30  v==0) ) return 0
123a0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
123b0 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
123c0 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64  ;..  /* This cod
123d0 65 20 6d 75 73 74 20 62 65 20 72 75 6e 20 69 6e  e must be run in
123e0 20 69 74 73 20 65 6e 74 69 72 65 74 79 20 65 76   its entirety ev
123f0 65 72 79 20 74 69 6d 65 20 69 74 20 69 73 20 65  ery time it is e
12400 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20  ncountered.  ** 
12410 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  if any of the fo
12420 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a  llowing is true:
12430 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20  .  **.  **    * 
12440 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
12450 73 69 64 65 20 69 73 20 61 20 63 6f 72 72 65 6c  side is a correl
12460 61 74 65 64 20 73 75 62 71 75 65 72 79 0a 20 20  ated subquery.  
12470 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67  **    *  The rig
12480 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20  ht-hand side is 
12490 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
124a0 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61  st containing va
124b0 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20  riables.  **    
124c0 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69 64 65  *  We are inside
124d0 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a   a trigger.  **.
124e0 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74    ** If all of t
124f0 68 65 20 61 62 6f 76 65 20 61 72 65 20 66 61 6c  he above are fal
12500 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  se, then we can 
12510 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a 75  run this code ju
12520 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76  st once.  ** sav
12530 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20 61  e the results, a
12540 6e 64 20 72 65 75 73 65 20 74 68 65 20 73 61 6d  nd reuse the sam
12550 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73  e result on subs
12560 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f  equent invocatio
12570 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ns..  */.  if( !
12580 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
12590 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c  pExpr, EP_VarSel
125a0 65 63 74 29 20 29 7b 0a 20 20 20 20 6a 6d 70 49  ect) ){.    jmpI
125b0 66 44 79 6e 61 6d 69 63 20 3d 20 73 71 6c 69 74  fDynamic = sqlit
125c0 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73  e3CodeOnce(pPars
125d0 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
125e0 28 76 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  (v);.  }..#ifnde
125f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
12600 50 4c 41 49 4e 0a 20 20 69 66 28 20 70 50 61 72  PLAIN.  if( pPar
12610 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
12620 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67  {.    char *zMsg
12630 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
12640 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 45  f(pParse->db, "E
12650 58 45 43 55 54 45 20 25 73 25 73 20 53 55 42 51  XECUTE %s%s SUBQ
12660 55 45 52 59 20 25 64 22 2c 0a 20 20 20 20 20 20  UERY %d",.      
12670 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d    jmpIfDynamic>=
12680 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54 45 44  0?"":"CORRELATED
12690 20 22 2c 0a 20 20 20 20 20 20 20 20 70 45 78 70   ",.        pExp
126a0 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 3f 22 4c 49  r->op==TK_IN?"LI
126b0 53 54 22 3a 22 53 43 41 4c 41 52 22 2c 0a 20 20  ST":"SCALAR",.  
126c0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69 4e        pParse->iN
126d0 65 78 74 53 65 6c 65 63 74 49 64 0a 20 20 20 20  extSelectId.    
126e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
126f0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45  beAddOp4(v, OP_E
12700 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e  xplain, pParse->
12710 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c  iSelectId, 0, 0,
12720 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49   zMsg, P4_DYNAMI
12730 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  C);.  }.#endif..
12740 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
12750 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
12760 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
12770 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20  nt addr;        
12780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
12790 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e  dress of OP_Open
127a0 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
127b0 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45  ction */.      E
127c0 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
127d0 70 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20 74 68  pr->pLeft; /* th
127e0 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e LHS of the IN 
127f0 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
12800 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
12810 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  nfo = 0;      /*
12820 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   Key information
12830 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 56   */.      int nV
12840 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
12850 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
12860 20 76 65 63 74 6f 72 20 70 4c 65 66 74 20 2a 2f   vector pLeft */
12870 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 6e 56  .      .      nV
12880 61 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  al = sqlite3Expr
12890 56 65 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74  VectorSize(pLeft
128a0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65  );..      /* Whe
128b0 74 68 65 72 20 74 68 69 73 20 69 73 20 61 6e 20  ther this is an 
128c0 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29  'x IN(SELECT...)
128d0 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65  ' or an 'x IN(<e
128e0 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20  xprlist>)'.     
128f0 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69   ** expression i
12900 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65  t is handled the
12910 20 73 61 6d 65 20 77 61 79 2e 20 20 41 6e 20 65   same way.  An e
12920 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69  phemeral table i
12930 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c  s .      ** fill
12940 65 64 20 77 69 74 68 20 73 69 6e 67 6c 65 2d 66  ed with single-f
12950 69 65 6c 64 20 69 6e 64 65 78 20 6b 65 79 73 20  ield index keys 
12960 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65  representing the
12970 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a   results.      *
12980 2a 20 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43  * from the SELEC
12990 54 20 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69  T or the <exprli
129a0 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  st>..      **.  
129b0 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78      ** If the 'x
129c0 27 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ' expression is 
129d0 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20  a column value, 
129e0 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e  or the SELECT...
129f0 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
12a00 65 6e 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f  ent returns a co
12a10 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e  lumn value, then
12a20 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66   the affinity of
12a30 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63   that.      ** c
12a40 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f  olumn is used to
12a50 20 62 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78   build the index
12a60 20 6b 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27   keys. If both '
12a70 78 27 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20  x' and the.     
12a80 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74   ** SELECT... st
12a90 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75  atement are colu
12aa0 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69  mns, then numeri
12ab0 63 20 61 66 66 69 6e 69 74 79 20 69 73 20 75 73  c affinity is us
12ac0 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65  ed.      ** if e
12ad0 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73  ither column has
12ae0 20 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45   NUMERIC or INTE
12af0 47 45 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66  GER affinity. If
12b00 20 6e 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a   neither.      *
12b10 2a 20 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45  * 'x' nor the SE
12b20 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e  LECT... statemen
12b30 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74  t are columns, t
12b40 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69  hen numeric affi
12b50 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73  nity.      ** is
12b60 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a   used..      */.
12b70 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
12b80 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ble = pParse->nT
12b90 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72  ab++;.      addr
12ba0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
12bb0 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
12bc0 70 68 65 6d 65 72 61 6c 2c 20 0a 20 20 20 20 20  phemeral, .     
12bd0 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
12be0 6c 65 2c 20 28 69 73 52 6f 77 69 64 3f 30 3a 6e  le, (isRowid?0:n
12bf0 56 61 6c 29 29 3b 0a 20 20 20 20 20 20 70 4b 65  Val));.      pKe
12c00 79 49 6e 66 6f 20 3d 20 69 73 52 6f 77 69 64 20  yInfo = isRowid 
12c10 3f 20 30 20 3a 20 73 71 6c 69 74 65 33 4b 65 79  ? 0 : sqlite3Key
12c20 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65  InfoAlloc(pParse
12c30 2d 3e 64 62 2c 20 6e 56 61 6c 2c 20 31 29 3b 0a  ->db, nVal, 1);.
12c40 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
12c50 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
12c60 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
12c70 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61  ){.        /* Ca
12c80 73 65 20 31 3a 20 20 20 20 20 65 78 70 72 20 49  se 1:     expr I
12c90 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20  N (SELECT ...). 
12ca0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
12cb0 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    ** Generate co
12cc0 64 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  de to write the 
12cd0 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
12ce0 65 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74  elect into the t
12cf0 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20  emporary.       
12d00 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61   ** table alloca
12d10 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61  ted and opened a
12d20 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  bove..        */
12d30 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20  .        Select 
12d40 2a 70 53 65 6c 65 63 74 20 3d 20 70 45 78 70 72  *pSelect = pExpr
12d50 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20  ->x.pSelect;.   
12d60 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
12d70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  EList = pSelect-
12d80 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20 20 20  >pEList;..      
12d90 20 20 61 73 73 65 72 74 28 20 21 69 73 52 6f 77    assert( !isRow
12da0 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  id );.        if
12db0 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ( pEList->nExpr!
12dc0 3d 6e 56 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  =nVal ){.       
12dd0 20 20 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c     sqlite3Subsel
12de0 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c  ectError(pParse,
12df0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20   pEList->nExpr, 
12e00 6e 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  nVal);.        }
12e10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
12e20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
12e30 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
12e40 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
12e50 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
12e60 74 28 26 64 65 73 74 2c 20 53 52 54 5f 53 65 74  t(&dest, SRT_Set
12e70 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29  , pExpr->iTable)
12e80 3b 0a 20 20 20 20 20 20 20 20 20 20 64 65 73 74  ;.          dest
12e90 2e 7a 41 66 66 53 64 73 74 20 3d 20 65 78 70 72  .zAffSdst = expr
12ea0 49 4e 41 66 66 69 6e 69 74 79 28 70 50 61 72 73  INAffinity(pPars
12eb0 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  e, pExpr);.     
12ec0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 45       assert( (pE
12ed0 78 70 72 2d 3e 69 54 61 62 6c 65 26 30 78 30 30  xpr->iTable&0x00
12ee0 30 30 46 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e  00FFFF)==pExpr->
12ef0 69 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20  iTable );.      
12f00 20 20 20 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69      pSelect->iLi
12f10 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  mit = 0;.       
12f20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 53 65     testcase( pSe
12f30 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26  lect->selFlags &
12f40 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a   SF_Distinct );.
12f50 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
12f60 73 65 28 20 70 4b 65 79 49 6e 66 6f 3d 3d 30 20  se( pKeyInfo==0 
12f70 29 3b 20 2f 2a 20 43 61 75 73 65 64 20 62 79 20  ); /* Caused by 
12f80 4f 4f 4d 20 69 6e 20 73 71 6c 69 74 65 33 4b 65  OOM in sqlite3Ke
12f90 79 49 6e 66 6f 41 6c 6c 6f 63 28 29 20 2a 2f 0a  yInfoAlloc() */.
12fa0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
12fb0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
12fc0 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26 64 65  se, pSelect, &de
12fd0 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  st) ){.         
12fe0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
12ff0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 64 65 73  (pParse->db, des
13000 74 2e 7a 41 66 66 53 64 73 74 29 3b 0a 20 20 20  t.zAffSdst);.   
13010 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13020 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65  KeyInfoUnref(pKe
13030 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  yInfo);.        
13040 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
13050 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13060 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
13070 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 64 65  e(pParse->db, de
13080 73 74 2e 7a 41 66 66 53 64 73 74 29 3b 0a 20 20  st.zAffSdst);.  
13090 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
130a0 70 4b 65 79 49 6e 66 6f 21 3d 30 20 29 3b 20 2f  pKeyInfo!=0 ); /
130b0 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73 65  * OOM will cause
130c0 20 65 78 69 74 20 61 66 74 65 72 20 73 71 6c 69   exit after sqli
130d0 74 65 33 53 65 6c 65 63 74 28 29 20 2a 2f 0a 20  te3Select() */. 
130e0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
130f0 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20   pEList!=0 );.  
13100 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13110 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20  pEList->nExpr>0 
13120 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
13130 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49  ert( sqlite3KeyI
13140 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70  nfoIsWriteable(p
13150 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20  KeyInfo) );.    
13160 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
13170 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nVal; i++){.   
13180 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
13190 20 3d 20 28 6e 56 61 6c 3e 31 29 20 3f 20 65 78   = (nVal>1) ? ex
131a0 70 72 56 65 63 74 6f 72 46 69 65 6c 64 28 70 4c  prVectorField(pL
131b0 65 66 74 2c 20 69 29 20 3a 20 70 4c 65 66 74 3b  eft, i) : pLeft;
131c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4b 65  .            pKe
131d0 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  yInfo->aColl[i] 
131e0 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
131f0 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 0a 20  ompareCollSeq(. 
13200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
13210 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74  Parse, p, pEList
13220 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 0a 20 20 20  ->a[i].pExpr.   
13230 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
13240 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
13250 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
13260 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e  ( ALWAYS(pExpr->
13270 78 2e 70 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20  x.pList!=0) ){. 
13280 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 32         /* Case 2
13290 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 65  :     expr IN (e
132a0 78 70 72 6c 69 73 74 29 0a 20 20 20 20 20 20 20  xprlist).       
132b0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 46   **.        ** F
132c0 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69  or each expressi
132d0 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e 64  on, build an ind
132e0 65 78 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20  ex key from the 
132f0 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a 20  evaluation and. 
13300 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 20         ** store 
13310 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72  it in the tempor
13320 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20 3c 65  ary table. If <e
13330 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  xpr> is a column
13340 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20 20 20  , then use.     
13350 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d     ** that colum
13360 6e 73 20 61 66 66 69 6e 69 74 79 20 77 68 65 6e  ns affinity when
13370 20 62 75 69 6c 64 69 6e 67 20 69 6e 64 65 78 20   building index 
13380 6b 65 79 73 2e 20 49 66 20 3c 65 78 70 72 3e 20  keys. If <expr> 
13390 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a  is not.        *
133a0 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65 20  * a column, use 
133b0 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
133c0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
133d0 20 20 20 20 20 63 68 61 72 20 61 66 66 69 6e 69       char affini
133e0 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ty;            /
133f0 2a 20 41 66 66 69 6e 69 74 79 20 6f 66 20 74 68  * Affinity of th
13400 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e LHS of the IN 
13410 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
13420 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69  ;.        ExprLi
13430 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
13440 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
13450 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
13460 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
13470 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 2c  .        int r1,
13480 20 72 32 2c 20 72 33 3b 0a 0a 20 20 20 20 20 20   r2, r3;..      
13490 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c    affinity = sql
134a0 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
134b0 28 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20  (pLeft);.       
134c0 20 69 66 28 20 21 61 66 66 69 6e 69 74 79 20 29   if( !affinity )
134d0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 69  {.          affi
134e0 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46  nity = SQLITE_AF
134f0 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20 20 20  F_BLOB;.        
13500 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4b  }.        if( pK
13510 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
13520 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
13530 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
13540 65 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20  eable(pKeyInfo) 
13550 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65  );.          pKe
13560 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20  yInfo->aColl[0] 
13570 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
13580 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
13590 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
135a0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
135b0 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65  * Loop through e
135c0 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ach expression i
135d0 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f  n <exprlist>. */
135e0 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71  .        r1 = sq
135f0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
13600 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
13610 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r2 = sqlite3Get
13620 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
13630 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52  .        if( isR
13640 6f 77 69 64 20 29 20 73 71 6c 69 74 65 33 56 64  owid ) sqlite3Vd
13650 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
13660 75 6c 6c 2c 20 30 2c 20 72 32 29 3b 0a 20 20 20  ull, 0, r2);.   
13670 20 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73 74       for(i=pList
13680 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70  ->nExpr, pItem=p
13690 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d  List->a; i>0; i-
136a0 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
136b0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 32         Expr *pE2
136c0 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
136d0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
136e0 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20 20 20 20  ValToIns;..     
136f0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65       /* If the e
13700 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74  xpression is not
13710 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20 77   constant then w
13720 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20  e will need to. 
13730 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69 73 61           ** disa
13740 62 6c 65 20 74 68 65 20 74 65 73 74 20 74 68 61  ble the test tha
13750 74 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20  t was generated 
13760 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b 65 73  above that makes
13770 20 73 75 72 65 0a 20 20 20 20 20 20 20 20 20 20   sure.          
13780 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c  ** this code onl
13790 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63 65 2e  y executes once.
137a0 20 20 42 65 63 61 75 73 65 20 66 6f 72 20 61 20    Because for a 
137b0 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20  non-constant.   
137c0 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73         ** expres
137d0 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f 20  sion we need to 
137e0 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20  rerun this code 
137f0 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20 20  each time..     
13800 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
13810 20 20 69 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d    if( jmpIfDynam
13820 69 63 3e 3d 30 20 26 26 20 21 73 71 6c 69 74 65  ic>=0 && !sqlite
13830 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
13840 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pE2) ){.        
13850 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
13860 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 6a  hangeToNoop(v, j
13870 6d 70 49 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20  mpIfDynamic);.  
13880 20 20 20 20 20 20 20 20 20 20 6a 6d 70 49 66 44            jmpIfD
13890 79 6e 61 6d 69 63 20 3d 20 2d 31 3b 0a 20 20 20  ynamic = -1;.   
138a0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
138b0 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20      /* Evaluate 
138c0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  the expression a
138d0 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74  nd insert it int
138e0 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65  o the temp table
138f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
13900 28 20 69 73 52 6f 77 69 64 20 26 26 20 73 71 6c  ( isRowid && sql
13910 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
13920 72 28 70 45 32 2c 20 26 69 56 61 6c 54 6f 49 6e  r(pE2, &iValToIn
13930 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  s) ){.          
13940 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13950 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
13960 49 6e 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  Int, pExpr->iTab
13970 6c 65 2c 20 72 32 2c 20 69 56 61 6c 54 6f 49 6e  le, r2, iValToIn
13980 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  s);.          }e
13990 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
139a0 20 72 33 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r3 = sqlite3Exp
139b0 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
139c0 73 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a 20 20  se, pE2, r1);.  
139d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73            if( is
139e0 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
139f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13a00 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d  beAddOp2(v, OP_M
13a10 75 73 74 42 65 49 6e 74 2c 20 72 33 2c 0a 20 20  ustBeInt, r3,.  
13a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
13a40 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
13a50 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 20 20  Addr(v)+2);.    
13a60 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
13a70 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
13a80 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13a90 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
13aa0 5f 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e  _Insert, pExpr->
13ab0 69 54 61 62 6c 65 2c 20 72 32 2c 20 72 33 29 3b  iTable, r2, r3);
13ac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
13ad0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
13ae0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13af0 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
13b00 63 6f 72 64 2c 20 72 33 2c 20 31 2c 20 72 32 2c  cord, r3, 1, r2,
13b10 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a   &affinity, 1);.
13b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
13b30 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
13b40 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
13b50 72 73 65 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20  rse, r3, 1);.   
13b60 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
13b70 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13b80 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 45  OP_IdxInsert, pE
13b90 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 29  xpr->iTable, r2)
13ba0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
13bb0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
13bc0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
13bd0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
13be0 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
13bf0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
13c00 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
13c10 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20  Parse, r2);.    
13c20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4b    }.      if( pK
13c30 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
13c40 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
13c50 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28  ngeP4(v, addr, (
13c60 76 6f 69 64 20 2a 29 70 4b 65 79 49 6e 66 6f 2c  void *)pKeyInfo,
13c70 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
13c80 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
13c90 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  k;.    }..    ca
13ca0 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20  se TK_EXISTS:.  
13cb0 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
13cc0 3a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  :.    default: {
13cd0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
13ce0 73 20 68 61 73 20 74 6f 20 62 65 20 61 20 73 63  s has to be a sc
13cf0 61 6c 61 72 20 53 45 4c 45 43 54 2e 20 20 47 65  alar SELECT.  Ge
13d00 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70  nerate code to p
13d10 75 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  ut the.      ** 
13d20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 73 65  value of this se
13d30 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f 72 79  lect in a memory
13d40 20 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f 72 64   cell and record
13d50 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 20 20   the number.    
13d60 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f    ** of the memo
13d70 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75  ry cell in iColu
13d80 6d 6e 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  mn.  If this is 
13d90 61 6e 20 45 58 49 53 54 53 2c 20 77 72 69 74 65  an EXISTS, write
13da0 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74  .      ** an int
13db0 65 67 65 72 20 30 20 28 6e 6f 74 20 65 78 69 73  eger 0 (not exis
13dc0 74 73 29 20 6f 72 20 31 20 28 65 78 69 73 74 73  ts) or 1 (exists
13dd0 29 20 69 6e 74 6f 20 61 20 6d 65 6d 6f 72 79 20  ) into a memory 
13de0 63 65 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 6e  cell.      ** an
13df0 64 20 72 65 63 6f 72 64 20 74 68 61 74 20 6d 65  d record that me
13e00 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f  mory cell in iCo
13e10 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lumn..      */. 
13e20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
13e30 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
13e40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45             /* SE
13e50 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
13e60 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20 20 20 20  o encode */.    
13e70 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
13e80 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
13e90 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74          /* How t
13ea0 6f 20 64 65 61 6c 20 77 69 74 68 20 53 45 4c 45  o deal with SELE
13eb0 43 74 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20  Ct result */.   
13ec0 20 20 20 69 6e 74 20 6e 52 65 67 3b 20 20 20 20     int nReg;    
13ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ee0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
13ef0 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74  sters to allocat
13f00 65 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73 74  e */..      test
13f10 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
13f20 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20  =TK_EXISTS );.  
13f30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
13f40 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
13f50 43 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CT );.      asse
13f60 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
13f70 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70 45 78 70  K_EXISTS || pExp
13f80 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
13f90 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
13fa0 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
13fb0 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
13fc0 65 6c 65 63 74 29 20 29 3b 0a 0a 20 20 20 20 20  elect) );..     
13fd0 20 70 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78   pSel = pExpr->x
13fe0 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  .pSelect;.      
13ff0 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 6f 70  nReg = pExpr->op
14000 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 3f 20 70 53  ==TK_SELECT ? pS
14010 65 6c 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  el->pEList->nExp
14020 72 20 3a 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  r : 1;.      sql
14030 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
14040 69 74 28 26 64 65 73 74 2c 20 30 2c 20 70 50 61  it(&dest, 0, pPa
14050 72 73 65 2d 3e 6e 4d 65 6d 2b 31 29 3b 0a 20 20  rse->nMem+1);.  
14060 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
14070 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 20 20   += nReg;.      
14080 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
14090 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20  K_SELECT ){.    
140a0 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d      dest.eDest =
140b0 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20   SRT_Mem;.      
140c0 20 20 64 65 73 74 2e 69 53 64 73 74 20 3d 20 64    dest.iSdst = d
140d0 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20  est.iSDParm;.   
140e0 20 20 20 20 20 64 65 73 74 2e 6e 53 64 73 74 20       dest.nSdst 
140f0 3d 20 6e 52 65 67 3b 0a 20 20 20 20 20 20 20 20  = nReg;.        
14100 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14110 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  3(v, OP_Null, 0,
14120 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 64   dest.iSDParm, d
14130 65 73 74 2e 69 53 44 50 61 72 6d 2b 6e 52 65 67  est.iSDParm+nReg
14140 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  -1);.        Vdb
14150 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e  eComment((v, "In
14160 69 74 20 73 75 62 71 75 65 72 79 20 72 65 73 75  it subquery resu
14170 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  lt"));.      }el
14180 73 65 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74  se{.        dest
14190 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 45 78 69  .eDest = SRT_Exi
141a0 73 74 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  sts;.        sql
141b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
141c0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
141d0 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a   dest.iSDParm);.
141e0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
141f0 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 45 58  ent((v, "Init EX
14200 49 53 54 53 20 72 65 73 75 6c 74 22 29 29 3b 0a  ISTS result"));.
14210 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
14220 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
14230 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c  pParse->db, pSel
14240 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  ->pLimit);.     
14250 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20   pSel->pLimit = 
14260 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
14270 72 73 65 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c  rse, TK_INTEGER,
14280 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
14290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142a0 20 20 20 20 20 20 20 20 20 26 73 71 6c 69 74 65           &sqlite
142b0 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 29 3b 0a  3IntTokens[1]);.
142c0 20 20 20 20 20 20 70 53 65 6c 2d 3e 69 4c 69 6d        pSel->iLim
142d0 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53  it = 0;.      pS
142e0 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20  el->selFlags &= 
142f0 7e 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 3b 0a  ~SF_MultiValue;.
14300 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
14310 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
14320 70 53 65 6c 2c 20 26 64 65 73 74 29 20 29 7b 0a  pSel, &dest) ){.
14330 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
14340 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14350 72 52 65 67 20 3d 20 64 65 73 74 2e 69 53 44 50  rReg = dest.iSDP
14360 61 72 6d 3b 0a 20 20 20 20 20 20 45 78 70 72 53  arm;.      ExprS
14370 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45  etVVAProperty(pE
14380 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65  xpr, EP_NoReduce
14390 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
143a0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
143b0 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 20 29 7b   rHasNullFlag ){
143c0 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 48  .    sqlite3SetH
143d0 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 70 45  asNullFlag(v, pE
143e0 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 48 61  xpr->iTable, rHa
143f0 73 4e 75 6c 6c 46 6c 61 67 29 3b 0a 20 20 7d 0a  sNullFlag);.  }.
14400 0a 20 20 69 66 28 20 6a 6d 70 49 66 44 79 6e 61  .  if( jmpIfDyna
14410 6d 69 63 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71  mic>=0 ){.    sq
14420 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
14430 65 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69  e(v, jmpIfDynami
14440 63 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  c);.  }.  sqlite
14450 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
14460 61 72 73 65 29 3b 0a 0a 20 20 72 65 74 75 72 6e  arse);..  return
14470 20 72 52 65 67 3b 0a 7d 0a 23 65 6e 64 69 66 20   rReg;.}.#endif 
14480 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
14490 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e  UBQUERY */..#ifn
144a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
144b0 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 45  SUBQUERY./*.** E
144c0 78 70 72 20 70 49 6e 20 69 73 20 61 6e 20 49 4e  xpr pIn is an IN
144d0 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e  (...) expression
144e0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
144f0 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20  checks that the 
14500 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 20 6f  .** sub-select o
14510 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  n the RHS of the
14520 20 49 4e 28 29 20 6f 70 65 72 61 74 6f 72 20 68   IN() operator h
14530 61 73 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  as the same numb
14540 65 72 20 6f 66 20 0a 2a 2a 20 63 6f 6c 75 6d 6e  er of .** column
14550 73 20 61 73 20 74 68 65 20 76 65 63 74 6f 72 20  s as the vector 
14560 6f 6e 20 74 68 65 20 4c 48 53 2e 20 4f 72 2c 20  on the LHS. Or, 
14570 69 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  if the RHS of th
14580 65 20 49 4e 28 29 20 69 73 20 6e 6f 74 20 0a 2a  e IN() is not .*
14590 2a 20 61 20 73 75 62 2d 71 75 65 72 79 2c 20 74  * a sub-query, t
145a0 68 61 74 20 74 68 65 20 4c 48 53 20 69 73 20 61  hat the LHS is a
145b0 20 76 65 63 74 6f 72 20 6f 66 20 73 69 7a 65 20   vector of size 
145c0 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  1..*/.int sqlite
145d0 33 45 78 70 72 43 68 65 63 6b 49 4e 28 50 61 72  3ExprCheckIN(Par
145e0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
145f0 20 2a 70 49 6e 29 7b 0a 20 20 69 6e 74 20 6e 56   *pIn){.  int nV
14600 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33 45  ector = sqlite3E
14610 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 49  xprVectorSize(pI
14620 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  n->pLeft);.  if(
14630 20 28 70 49 6e 2d 3e 66 6c 61 67 73 20 26 20 45   (pIn->flags & E
14640 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
14650 20 20 20 20 69 66 28 20 6e 56 65 63 74 6f 72 21      if( nVector!
14660 3d 70 49 6e 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  =pIn->x.pSelect-
14670 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
14680 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
14690 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70 50  ubselectError(pP
146a0 61 72 73 65 2c 20 70 49 6e 2d 3e 78 2e 70 53 65  arse, pIn->x.pSe
146b0 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  lect->pEList->nE
146c0 78 70 72 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20  xpr, nVector);. 
146d0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
146e0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
146f0 20 6e 56 65 63 74 6f 72 21 3d 31 20 29 7b 0a 20   nVector!=1 ){. 
14700 20 20 20 69 66 28 20 28 70 49 6e 2d 3e 70 4c 65     if( (pIn->pLe
14710 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78  ft->flags & EP_x
14720 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
14730 20 20 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c     sqlite3Subsel
14740 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c  ectError(pParse,
14750 20 6e 56 65 63 74 6f 72 2c 20 31 29 3b 0a 20 20   nVector, 1);.  
14760 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
14770 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
14780 50 61 72 73 65 2c 20 22 69 6e 76 61 6c 69 64 20  Parse, "invalid 
14790 75 73 65 20 6f 66 20 72 6f 77 20 76 61 6c 75 65  use of row value
147a0 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ");.    }.    re
147b0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
147c0 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
147d0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
147e0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
147f0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
14800 64 65 20 66 6f 72 20 61 6e 20 49 4e 20 65 78 70  de for an IN exp
14810 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  ression..**.**  
14820 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54      x IN (SELECT
14830 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20 20 20 78 20   ...).**      x 
14840 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65  IN (value, value
14850 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65  , ...).**.** The
14860 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20   left-hand side 
14870 28 4c 48 53 29 20 69 73 20 61 20 73 63 61 6c 61  (LHS) is a scala
14880 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54  r expression.  T
14890 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
148a0 64 65 20 28 52 48 53 29 0a 2a 2a 20 69 73 20 61  de (RHS).** is a
148b0 6e 20 61 72 72 61 79 20 6f 66 20 7a 65 72 6f 20  n array of zero 
148c0 6f 72 20 6d 6f 72 65 20 76 61 6c 75 65 73 2e 20  or more values. 
148d0 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
148e0 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 4c  is true if the L
148f0 48 53 20 69 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e  HS is.** contain
14900 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52 48  ed within the RH
14910 53 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6f 66  S.  The value of
14920 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
14930 69 73 20 75 6e 6b 6e 6f 77 6e 20 28 4e 55 4c 4c  is unknown (NULL
14940 29 0a 2a 2a 20 69 66 20 74 68 65 20 4c 48 53 20  ).** if the LHS 
14950 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68  is NULL or if th
14960 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e  e LHS is not con
14970 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68  tained within th
14980 65 20 52 48 53 20 61 6e 64 20 74 68 65 0a 2a 2a  e RHS and the.**
14990 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 6f 6e   RHS contains on
149a0 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76  e or more NULL v
149b0 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  alues..**.** Thi
149c0 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
149d0 74 65 73 20 63 6f 64 65 20 74 68 61 74 20 6a 75  tes code that ju
149e0 6d 70 73 20 74 6f 20 64 65 73 74 49 66 46 61 6c  mps to destIfFal
149f0 73 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73  se if the LHS is
14a00 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e   not .** contain
14a10 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52 48  ed within the RH
14a20 53 2e 20 20 49 66 20 64 75 65 20 74 6f 20 4e 55  S.  If due to NU
14a30 4c 4c 73 20 77 65 20 63 61 6e 6e 6f 74 20 64 65  LLs we cannot de
14a40 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4c  termine if the L
14a50 48 53 0a 2a 2a 20 69 73 20 63 6f 6e 74 61 69 6e  HS.** is contain
14a60 65 64 20 69 6e 20 74 68 65 20 52 48 53 20 74 68  ed in the RHS th
14a70 65 6e 20 6a 75 6d 70 20 74 6f 20 64 65 73 74 49  en jump to destI
14a80 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65 20 4c  fNull.  If the L
14a90 48 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 0a  HS is contained.
14aa0 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 52 48  ** within the RH
14ab0 53 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f  S then fall thro
14ac0 75 67 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ugh..*/.static v
14ad0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
14ae0 6f 64 65 49 4e 28 0a 20 20 50 61 72 73 65 20 2a  odeIN(.  Parse *
14af0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
14b00 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
14b10 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
14b20 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
14b30 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
14b40 20 2f 2a 20 54 68 65 20 49 4e 20 65 78 70 72 65   /* The IN expre
14b50 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64  ssion */.  int d
14b60 65 73 74 49 66 46 61 6c 73 65 2c 20 20 20 20 20  estIfFalse,     
14b70 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
14b80 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74   LHS is not cont
14b90 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53  ained in the RHS
14ba0 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66   */.  int destIf
14bb0 4e 75 6c 6c 20 20 20 20 20 20 20 20 2f 2a 20 4a  Null        /* J
14bc0 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20  ump here if the 
14bd0 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e 6b 6e  results are unkn
14be0 6f 77 6e 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73  own due to NULLs
14bf0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 52 68   */.){.  int rRh
14c00 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 20 20 2f  sHasNull = 0;  /
14c10 2a 20 52 65 67 69 73 74 65 72 20 74 68 61 74 20  * Register that 
14c20 69 73 20 74 72 75 65 20 69 66 20 52 48 53 20 63  is true if RHS c
14c30 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c  ontains NULL val
14c40 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79  ues */.  int eTy
14c50 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pe;            /
14c60 2a 20 54 79 70 65 20 6f 66 20 74 68 65 20 52 48  * Type of the RH
14c70 53 20 2a 2f 0a 20 20 69 6e 74 20 72 31 3b 20 20  S */.  int r1;  
14c80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14c90 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65  Temporary use re
14ca0 67 69 73 74 65 72 20 2a 2f 0a 20 20 56 64 62 65  gister */.  Vdbe
14cb0 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
14cc0 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 75    /* Statement u
14cd0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
14ce0 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 4d 61  n */.  int *aiMa
14cf0 70 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  p = 0;       /* 
14d00 4d 61 70 20 66 72 6f 6d 20 76 65 63 74 6f 72 20  Map from vector 
14d10 66 69 65 6c 64 20 74 6f 20 69 6e 64 65 78 20 63  field to index c
14d20 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20  olumn */.  char 
14d30 2a 7a 41 66 66 20 3d 20 30 3b 20 20 20 20 20 20  *zAff = 0;      
14d40 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72   /* Affinity str
14d50 69 6e 67 20 66 6f 72 20 63 6f 6d 70 61 72 69 73  ing for comparis
14d60 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 65  ons */.  int nVe
14d70 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 2f  ctor;          /
14d80 2a 20 53 69 7a 65 20 6f 66 20 76 65 63 74 6f 72  * Size of vector
14d90 73 20 66 6f 72 20 74 68 69 73 20 49 4e 28 2e 2e  s for this IN(..
14da0 2e 29 20 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72  .) op */.  int r
14db0 65 67 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20  egSelect = 0;.  
14dc0 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
14dd0 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69 6e  xpr->pLeft;.  in
14de0 74 20 69 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69  t i;..  if( sqli
14df0 74 65 33 45 78 70 72 43 68 65 63 6b 49 4e 28 70  te3ExprCheckIN(p
14e00 50 61 72 73 65 2c 20 70 45 78 70 72 29 20 29 20  Parse, pExpr) ) 
14e10 72 65 74 75 72 6e 3b 0a 20 20 6e 56 65 63 74 6f  return;.  nVecto
14e20 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56  r = sqlite3ExprV
14e30 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 2d  ectorSize(pExpr-
14e40 3e 70 4c 65 66 74 29 3b 0a 20 20 61 69 4d 61 70  >pLeft);.  aiMap
14e50 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33   = (int*)sqlite3
14e60 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20  DbMallocZero(.  
14e70 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20      pParse->db, 
14e80 6e 56 65 63 74 6f 72 2a 28 73 69 7a 65 6f 66 28  nVector*(sizeof(
14e90 69 6e 74 29 20 2b 20 73 69 7a 65 6f 66 28 63 68  int) + sizeof(ch
14ea0 61 72 29 29 20 2b 20 31 0a 20 20 29 3b 0a 20 20  ar)) + 1.  );.  
14eb0 69 66 28 20 21 61 69 4d 61 70 20 29 20 72 65 74  if( !aiMap ) ret
14ec0 75 72 6e 3b 0a 20 20 7a 41 66 66 20 3d 20 28 63  urn;.  zAff = (c
14ed0 68 61 72 2a 29 26 61 69 4d 61 70 5b 6e 56 65 63  har*)&aiMap[nVec
14ee0 74 6f 72 5d 3b 0a 0a 0a 20 20 2f 2a 20 41 74 74  tor];...  /* Att
14ef0 65 6d 70 74 20 74 6f 20 63 6f 6d 70 75 74 65 20  empt to compute 
14f00 74 68 65 20 52 48 53 2e 20 41 66 74 65 72 20 74  the RHS. After t
14f10 68 69 73 20 73 74 65 70 2c 20 69 66 20 61 6e 79  his step, if any
14f20 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
14f30 0a 20 20 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4e  .  ** IN_INDEX_N
14f40 4f 4f 50 20 69 73 20 72 65 74 75 72 6e 65 64 2c  OOP is returned,
14f50 20 74 68 65 20 74 61 62 6c 65 20 6f 70 65 6e 65   the table opene
14f60 64 20 69 74 68 20 63 75 72 73 6f 72 20 70 45 78  d ith cursor pEx
14f70 70 72 2d 3e 69 54 61 62 6c 65 20 0a 20 20 2a 2a  pr->iTable .  **
14f80 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
14f90 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75  lues that make u
14fa0 70 20 74 68 65 20 52 48 53 2e 20 49 66 20 49 4e  p the RHS. If IN
14fb0 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72  _INDEX_NOOP is r
14fc0 65 74 75 72 6e 65 64 2c 0a 20 20 2a 2a 20 74 68  eturned,.  ** th
14fd0 65 20 52 48 53 20 68 61 73 20 6e 6f 74 20 79 65  e RHS has not ye
14fe0 74 20 62 65 65 6e 20 63 6f 64 65 64 2e 20 20 2a  t been coded.  *
14ff0 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  /.  v = pParse->
15000 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
15010 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f   v!=0 );       /
15020 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65 64 20 70  * OOM detected p
15030 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75  rior to this rou
15040 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  tine */.  VdbeNo
15050 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62  opComment((v, "b
15060 65 67 69 6e 20 49 4e 20 65 78 70 72 22 29 29 3b  egin IN expr"));
15070 0a 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74  .  eType = sqlit
15080 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50  e3FindInIndex(pP
15090 61 72 73 65 2c 20 70 45 78 70 72 2c 0a 20 20 20  arse, pExpr,.   
150a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150b0 20 20 20 20 20 20 20 20 20 20 49 4e 5f 49 4e 44            IN_IND
150c0 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 7c 20  EX_MEMBERSHIP | 
150d0 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b  IN_INDEX_NOOP_OK
150e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
150f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
15100 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74  estIfFalse==dest
15110 49 66 4e 75 6c 6c 20 3f 20 30 20 3a 20 26 72 52  IfNull ? 0 : &rR
15120 68 73 48 61 73 4e 75 6c 6c 2c 20 61 69 4d 61 70  hsHasNull, aiMap
15130 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  );..  assert( pP
15140 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 6e 56  arse->nErr || nV
15150 65 63 74 6f 72 3d 3d 31 20 7c 7c 20 65 54 79 70  ector==1 || eTyp
15160 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 45 50 48 0a  e==IN_INDEX_EPH.
15170 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
15180 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f  =IN_INDEX_INDEX_
15190 41 53 43 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e  ASC || eType==IN
151a0 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53  _INDEX_INDEX_DES
151b0 43 20 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f  C .  );..  /* Co
151c0 64 65 20 74 68 65 20 4c 48 53 2c 20 74 68 65 20  de the LHS, the 
151d0 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78  <expr> from "<ex
151e0 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 49  pr> IN (...)". I
151f0 66 20 74 68 65 20 4c 48 53 20 69 73 20 61 20 0a  f the LHS is a .
15200 20 20 2a 2a 20 76 65 63 74 6f 72 2c 20 74 68 65    ** vector, the
15210 6e 20 69 74 20 69 73 20 73 74 6f 72 65 64 20 69  n it is stored i
15220 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6e 56  n an array of nV
15230 65 63 74 6f 72 20 72 65 67 69 73 74 65 72 73 20  ector registers 
15240 73 74 61 72 74 69 6e 67 20 0a 20 20 2a 2a 20 61  starting .  ** a
15250 74 20 72 31 2e 0a 20 20 2a 2f 0a 20 20 72 31 20  t r1..  */.  r1 
15260 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
15270 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 56  Range(pParse, nV
15280 65 63 74 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65  ector);.  sqlite
15290 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
152a0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 6e 56  Parse);.  if( nV
152b0 65 63 74 6f 72 3e 31 20 26 26 20 28 70 4c 65 66  ector>1 && (pLef
152c0 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49  t->flags & EP_xI
152d0 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
152e0 72 65 67 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  regSelect = sqli
152f0 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
15300 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
15310 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  0, 0);.  }.  for
15320 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b  (i=0; i<nVector;
15330 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69   i++){.    int i
15340 43 6f 6c 20 3d 20 61 69 4d 61 70 5b 69 5d 3b 0a  Col = aiMap[i];.
15350 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20 3d      Expr *pLhs =
15360 20 65 78 70 72 56 65 63 74 6f 72 46 69 65 6c 64   exprVectorField
15370 28 70 4c 65 66 74 2c 20 69 29 3b 0a 0a 20 20 20  (pLeft, i);..   
15380 20 69 66 28 20 72 65 67 53 65 6c 65 63 74 20 29   if( regSelect )
15390 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
153a0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
153b0 43 6f 70 79 2c 20 72 65 67 53 65 6c 65 63 74 2b  Copy, regSelect+
153c0 69 2c 20 72 31 2b 69 43 6f 6c 2c 20 30 29 3b 0a  i, r1+iCol, 0);.
153d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
153e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
153f0 28 70 50 61 72 73 65 2c 20 70 4c 68 73 2c 20 72  (pParse, pLhs, r
15400 31 2b 69 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 0a  1+iCol);.    }..
15410 20 20 20 20 7a 41 66 66 5b 69 43 6f 6c 5d 20 3d      zAff[iCol] =
15420 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
15430 6e 69 74 79 28 70 4c 68 73 29 3b 0a 20 20 20 20  nity(pLhs);.    
15440 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
15450 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20   & EP_xIsSelect 
15460 29 7b 0a 20 20 20 20 20 20 7a 41 66 66 5b 69 43  ){.      zAff[iC
15470 6f 6c 5d 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d  ol] = sqlite3Com
15480 70 61 72 65 41 66 66 69 6e 69 74 79 28 0a 20 20  pareAffinity(.  
15490 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 78          pExpr->x
154a0 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
154b0 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 2c  ->a[iCol].pExpr,
154c0 20 7a 41 66 66 5b 69 43 6f 6c 5d 0a 20 20 20 20   zAff[iCol].    
154d0 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a    );.    }.  }..
154e0 20 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 46    /* If sqlite3F
154f0 69 6e 64 49 6e 49 6e 64 65 78 28 29 20 64 69 64  indInIndex() did
15500 20 6e 6f 74 20 66 69 6e 64 20 6f 72 20 63 72 65   not find or cre
15510 61 74 65 20 61 6e 20 69 6e 64 65 78 20 74 68 61  ate an index tha
15520 74 20 69 73 0a 20 20 2a 2a 20 73 75 69 74 61 62  t is.  ** suitab
15530 6c 65 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e  le for evaluatin
15540 67 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  g the IN operato
15550 72 2c 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65  r, then evaluate
15560 20 75 73 69 6e 67 20 61 0a 20 20 2a 2a 20 73 65   using a.  ** se
15570 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72  quence of compar
15580 69 73 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  isons..  */.  if
15590 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  ( eType==IN_INDE
155a0 58 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 45 78  X_NOOP ){.    Ex
155b0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
155c0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
155d0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
155e0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
155f0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
15600 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
15610 20 20 20 69 6e 74 20 6c 61 62 65 6c 4f 6b 20 3d     int labelOk =
15620 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
15630 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 69 6e  Label(v);.    in
15640 74 20 72 32 2c 20 72 65 67 54 6f 46 72 65 65 3b  t r2, regToFree;
15650 0a 20 20 20 20 69 6e 74 20 72 65 67 43 6b 4e 75  .    int regCkNu
15660 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ll = 0;.    int 
15670 69 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ii;.    assert( 
15680 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
15690 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
156a0 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28  lect) );.    if(
156b0 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73   destIfNull!=des
156c0 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20  tIfFalse ){.    
156d0 20 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73 71    regCkNull = sq
156e0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
156f0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
15700 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
15710 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72  (v, OP_BitAnd, r
15720 31 2c 20 72 31 2c 20 72 65 67 43 6b 4e 75 6c 6c  1, r1, regCkNull
15730 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
15740 28 69 69 3d 30 3b 20 69 69 3c 70 4c 69 73 74 2d  (ii=0; ii<pList-
15750 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20  >nExpr; ii++){. 
15760 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
15770 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
15780 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  arse, pList->a[i
15790 69 5d 2e 70 45 78 70 72 2c 20 26 72 65 67 54 6f  i].pExpr, &regTo
157a0 46 72 65 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Free);.      if(
157b0 20 72 65 67 43 6b 4e 75 6c 6c 20 26 26 20 73 71   regCkNull && sq
157c0 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75  lite3ExprCanBeNu
157d0 6c 6c 28 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e  ll(pList->a[ii].
157e0 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
157f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15800 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64  Op3(v, OP_BitAnd
15810 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 72 32 2c  , regCkNull, r2,
15820 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20   regCkNull);.   
15830 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
15840 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  i<pList->nExpr-1
15850 20 7c 7c 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d   || destIfNull!=
15860 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20  destIfFalse ){. 
15870 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15880 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45  beAddOp4(v, OP_E
15890 71 2c 20 72 31 2c 20 6c 61 62 65 6c 4f 6b 2c 20  q, r1, labelOk, 
158a0 72 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r2,.            
158b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
158c0 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  oid*)pColl, P4_C
158d0 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20  OLLSEQ);.       
158e0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
158f0 76 2c 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  v, ii<pList->nEx
15900 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 56  pr-1);.        V
15910 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
15920 20 69 69 3d 3d 70 4c 69 73 74 2d 3e 6e 45 78 70   ii==pList->nExp
15930 72 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  r-1);.        sq
15940 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
15950 35 28 76 2c 20 7a 41 66 66 5b 30 5d 29 3b 0a 20  5(v, zAff[0]);. 
15960 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15970 20 20 20 20 61 73 73 65 72 74 28 20 64 65 73 74      assert( dest
15980 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61  IfNull==destIfFa
15990 6c 73 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73  lse );.        s
159a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
159b0 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 31 2c 20 64  (v, OP_Ne, r1, d
159c0 65 73 74 49 66 46 61 6c 73 65 2c 20 72 32 2c 0a  estIfFalse, r2,.
159d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159e0 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
159f0 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
15a00 45 51 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  EQ); VdbeCoverag
15a10 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  e(v);.        sq
15a20 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
15a30 35 28 76 2c 20 7a 41 66 66 5b 30 5d 20 7c 20 53  5(v, zAff[0] | S
15a40 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
15a50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
15a60 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
15a70 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
15a80 65 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 7d  egToFree);.    }
15a90 0a 20 20 20 20 69 66 28 20 72 65 67 43 6b 4e 75  .    if( regCkNu
15aa0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ll ){.      sqli
15ab0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15ac0 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 43   OP_IsNull, regC
15ad0 6b 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c  kNull, destIfNul
15ae0 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  l); VdbeCoverage
15af0 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
15b00 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65  e3VdbeGoto(v, de
15b10 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
15b20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
15b30 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
15b40 20 6c 61 62 65 6c 4f 6b 29 3b 0a 20 20 20 20 73   labelOk);.    s
15b50 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
15b60 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
15b70 43 6b 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65  CkNull);.  }else
15b80 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 61  {.  .    /* If a
15b90 6e 79 20 76 61 6c 75 65 20 6f 6e 20 74 68 65 20  ny value on the 
15ba0 4c 48 53 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  LHS is NULL, the
15bb0 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 49   result of the I
15bc0 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 0a  N(...) operator.
15bd0 20 20 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 65      ** must be e
15be0 69 74 68 65 72 20 66 61 6c 73 65 20 6f 72 20 4e  ither false or N
15bf0 55 4c 4c 2e 20 49 66 20 74 68 65 73 65 20 74 77  ULL. If these tw
15c00 6f 20 61 72 65 20 68 61 6e 64 6c 65 64 20 69 64  o are handled id
15c10 65 6e 74 69 63 61 6c 6c 79 2c 0a 20 20 20 20 2a  entically,.    *
15c20 2a 20 74 65 73 74 20 74 68 65 20 4c 48 53 20 66  * test the LHS f
15c30 6f 72 20 4e 55 4c 4c 73 20 61 6e 64 20 6a 75 6d  or NULLs and jum
15c40 70 20 64 69 72 65 63 74 6c 79 20 74 6f 20 64 65  p directly to de
15c50 73 74 49 66 4e 75 6c 6c 20 69 66 20 61 6e 79 20  stIfNull if any 
15c60 61 72 65 0a 20 20 20 20 2a 2a 20 66 6f 75 6e 64  are.    ** found
15c70 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
15c80 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 4e   Otherwise, if N
15c90 55 4c 4c 20 61 6e 64 20 66 61 6c 73 65 20 61 72  ULL and false ar
15ca0 65 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72  e handled differ
15cb0 65 6e 74 6c 79 2c 20 61 6e 64 20 74 68 65 0a 20  ently, and the. 
15cc0 20 20 20 2a 2a 20 49 4e 28 2e 2e 2e 29 20 6f 70     ** IN(...) op
15cd0 65 72 61 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61  eration is not a
15ce0 20 76 65 63 74 6f 72 20 6f 70 65 72 61 74 69 6f   vector operatio
15cf0 6e 2c 20 61 6e 64 20 74 68 65 20 4c 48 53 20 6f  n, and the LHS o
15d00 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 70 65  f the.    ** ope
15d10 72 61 74 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 74  rator is NULL, t
15d20 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69  hen the result i
15d30 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 69  s false if the i
15d40 6e 64 65 78 20 69 73 20 0a 20 20 20 20 2a 2a 20  ndex is .    ** 
15d50 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79  completely empty
15d60 2c 20 6f 72 20 4e 55 4c 4c 20 6f 74 68 65 72 77  , or NULL otherw
15d70 69 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ise.  */.    if(
15d80 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73   destIfNull==des
15d90 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20  tIfFalse ){.    
15da0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65    for(i=0; i<nVe
15db0 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ctor; i++){.    
15dc0 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 65 78      Expr *p = ex
15dd0 70 72 56 65 63 74 6f 72 46 69 65 6c 64 28 70 45  prVectorField(pE
15de0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a  xpr->pLeft, i);.
15df0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
15e00 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
15e10 28 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  (p) ){.         
15e20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15e30 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
15e40 20 72 31 2b 61 69 4d 61 70 5b 69 5d 2c 20 64 65   r1+aiMap[i], de
15e50 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
15e60 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
15e70 20 7d 65 6c 73 65 20 69 66 28 20 6e 56 65 63 74   }else if( nVect
15e80 6f 72 3d 3d 31 20 26 26 20 73 71 6c 69 74 65 33  or==1 && sqlite3
15e90 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 45  ExprCanBeNull(pE
15ea0 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 7b 0a 20  xpr->pLeft) ){. 
15eb0 20 20 20 20 20 69 6e 74 20 61 64 64 72 31 20 3d       int addr1 =
15ec0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15ed0 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  p1(v, OP_NotNull
15ee0 2c 20 72 31 29 3b 20 56 64 62 65 43 6f 76 65 72  , r1); VdbeCover
15ef0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71  age(v);.      sq
15f00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15f10 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 45  v, OP_Rewind, pE
15f20 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73  xpr->iTable, des
15f30 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20  tIfFalse);.     
15f40 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
15f50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
15f60 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 49  dbeGoto(v, destI
15f70 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
15f80 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
15f90 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20  e(v, addr1);.   
15fa0 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 65 54   }.  .    if( eT
15fb0 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f  ype==IN_INDEX_RO
15fc0 57 49 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  WID ){.      /* 
15fd0 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68  In this case, th
15fe0 65 20 52 48 53 20 69 73 20 74 68 65 20 52 4f 57  e RHS is the ROW
15ff0 49 44 20 6f 66 20 74 61 62 6c 65 20 62 2d 74 72  ID of table b-tr
16000 65 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ee */.      sqli
16010 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
16020 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 70   OP_SeekRowid, p
16030 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65  Expr->iTable, de
16040 73 74 49 66 46 61 6c 73 65 2c 20 72 31 29 3b 0a  stIfFalse, r1);.
16050 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
16060 67 65 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ge(v);.    }else
16070 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68  {.      /* In th
16080 69 73 20 63 61 73 65 2c 20 74 68 65 20 52 48 53  is case, the RHS
16090 20 69 73 20 61 6e 20 69 6e 64 65 78 20 62 2d 74   is an index b-t
160a0 72 65 65 2e 20 41 70 70 6c 79 20 74 68 65 20 63  ree. Apply the c
160b0 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 20 20  omparison.      
160c0 2a 2a 20 61 66 66 69 6e 69 74 69 65 73 20 74 6f  ** affinities to
160d0 20 65 61 63 68 20 76 61 6c 75 65 20 6f 6e 20 74   each value on t
160e0 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 6f 70  he LHS of the op
160f0 65 72 61 74 6f 72 2e 20 20 2a 2f 0a 20 20 20 20  erator.  */.    
16100 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16110 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69  Op4(v, OP_Affini
16120 74 79 2c 20 72 31 2c 20 6e 56 65 63 74 6f 72 2c  ty, r1, nVector,
16130 20 30 2c 20 7a 41 66 66 2c 20 6e 56 65 63 74 6f   0, zAff, nVecto
16140 72 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20  r);.      .     
16150 20 69 66 28 20 6e 56 65 63 74 6f 72 3e 31 20 26   if( nVector>1 &
16160 26 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65  & destIfNull!=de
16170 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20  stIfFalse ){.   
16180 20 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20       int iIdx = 
16190 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20  pExpr->iTable;. 
161a0 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b         int addr;
161b0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64  .        int add
161c0 72 4e 65 78 74 3b 0a 0a 20 20 20 20 20 20 20 20  rNext;..        
161d0 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20 69 6e  /* Search the in
161e0 64 65 78 20 66 6f 72 20 74 68 65 20 6b 65 79 2e  dex for the key.
161f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 64 64 72   */.        addr
16200 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
16210 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f  dOp4Int(v, OP_Fo
16220 75 6e 64 2c 20 69 49 64 78 2c 20 30 2c 20 72 31  und, iIdx, 0, r1
16230 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 0a 20 20 20  , nVector);..   
16240 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20       /* At this 
16250 70 6f 69 6e 74 20 74 68 65 20 73 70 65 63 69 66  point the specif
16260 69 65 64 20 6b 65 79 20 69 73 20 6e 6f 74 20 70  ied key is not p
16270 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 69 6e  resent in the in
16280 64 65 78 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a  dex, .        **
16290 20 73 6f 20 74 68 65 20 72 65 73 75 6c 74 20 6f   so the result o
162a0 66 20 74 68 65 20 49 4e 28 2e 2e 29 20 6f 70 65  f the IN(..) ope
162b0 72 61 74 6f 72 20 6d 75 73 74 20 62 65 20 65 69  rator must be ei
162c0 74 68 65 72 20 4e 55 4c 4c 20 6f 72 0a 20 20 20  ther NULL or.   
162d0 20 20 20 20 20 2a 2a 20 30 2e 20 54 68 65 20 76       ** 0. The v
162e0 64 62 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  dbe code generat
162f0 65 64 20 62 65 6c 6f 77 20 66 69 67 75 72 65 73  ed below figures
16300 20 6f 75 74 20 77 68 69 63 68 2e 20 20 2a 2f 0a   out which.  */.
16310 20 20 20 20 20 20 20 20 61 64 64 72 4e 65 78 74          addrNext
16320 20 3d 20 31 2b 73 71 6c 69 74 65 33 56 64 62 65   = 1+sqlite3Vdbe
16330 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
16340 69 6e 64 2c 20 69 49 64 78 2c 20 64 65 73 74 49  ind, iIdx, destI
16350 66 46 61 6c 73 65 29 3b 0a 0a 20 20 20 20 20 20  fFalse);..      
16360 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65    for(i=0; i<nVe
16370 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ctor; i++){.    
16380 20 20 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20        Expr *p;. 
16390 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71           CollSeq
163a0 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20   *pColl;.       
163b0 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69     int r2 = sqli
163c0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
163d0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20  arse);.         
163e0 20 70 20 3d 20 65 78 70 72 56 65 63 74 6f 72 46   p = exprVectorF
163f0 69 65 6c 64 28 70 4c 65 66 74 2c 20 69 29 3b 0a  ield(pLeft, i);.
16400 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20            pColl 
16410 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
16420 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b  lSeq(pParse, p);
16430 0a 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ..          sqli
16440 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
16450 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78   OP_Column, iIdx
16460 2c 20 69 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  , i, r2);.      
16470 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16480 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 71 2c 20  ddOp4(v, OP_Eq, 
16490 72 31 2b 69 2c 20 30 2c 20 72 32 2c 20 28 76 6f  r1+i, 0, r2, (vo
164a0 69 64 2a 29 70 43 6f 6c 6c 2c 50 34 5f 43 4f 4c  id*)pColl,P4_COL
164b0 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 20  LSEQ);.         
164c0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
164d0 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4a  geP5(v, SQLITE_J
164e0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
164f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16500 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
16510 78 74 2c 20 69 49 64 78 2c 20 61 64 64 72 4e 65  xt, iIdx, addrNe
16520 78 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  xt);.          s
16530 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16540 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
16550 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
16560 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16570 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 73  dbeJumpHere(v, s
16580 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
16590 74 41 64 64 72 28 76 29 2d 33 29 3b 0a 20 20 20  tAddr(v)-3);.   
165a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
165b0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
165c0 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  rse, r2);.      
165d0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
165e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
165f0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73   OP_Goto, 0, des
16600 74 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20 20  tIfNull);..     
16610 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 77 61     /* The key wa
16620 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 69  s found in the i
16630 6e 64 65 78 2e 20 49 66 20 69 74 20 63 6f 6e 74  ndex. If it cont
16640 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 76 61  ains any NULL va
16650 6c 75 65 73 2c 0a 20 20 20 20 20 20 20 20 2a 2a  lues,.        **
16660 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
16670 20 6f 66 20 74 68 65 20 49 4e 28 2e 2e 2e 29 20   of the IN(...) 
16680 6f 70 65 72 61 74 6f 72 20 69 73 20 4e 55 4c 4c  operator is NULL
16690 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
166a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75  .        ** resu
166b0 6c 74 20 69 73 20 31 2e 20 20 2a 2f 0a 20 20 20  lt is 1.  */.   
166c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
166d0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
166e0 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
166f0 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69  =0; i<nVector; i
16700 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  ++){.          E
16710 78 70 72 20 2a 70 20 3d 20 65 78 70 72 56 65 63  xpr *p = exprVec
16720 74 6f 72 46 69 65 6c 64 28 70 45 78 70 72 2d 3e  torField(pExpr->
16730 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20  pLeft, i);.     
16740 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
16750 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 29  ExprCanBeNull(p)
16760 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
16770 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16780 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
16790 72 31 2b 61 69 4d 61 70 5b 69 5d 2c 20 64 65 73  r1+aiMap[i], des
167a0 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
167b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
167c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
167d0 20 72 52 68 73 48 61 73 4e 75 6c 6c 3d 3d 30 20   rRhsHasNull==0 
167e0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
167f0 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69  is branch runs i
16800 66 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 61 74  f it is known at
16810 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 74 68   compile time th
16820 61 74 20 74 68 65 20 52 48 53 0a 20 20 20 20 20  at the RHS.     
16830 20 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 63 6f 6e     ** cannot con
16840 74 61 69 6e 20 4e 55 4c 4c 20 76 61 6c 75 65 73  tain NULL values
16850 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 61  . This happens a
16860 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 20  s a result.     
16870 20 20 20 2a 2a 20 6f 66 20 22 4e 4f 54 20 4e 55     ** of "NOT NU
16880 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  LL" constraints 
16890 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
168a0 73 63 68 65 6d 61 2e 0a 20 20 20 20 20 20 20 20  schema..        
168b0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 6c  **.        ** Al
168c0 73 6f 20 72 75 6e 20 74 68 69 73 20 62 72 61 6e  so run this bran
168d0 63 68 20 69 66 20 4e 55 4c 4c 20 69 73 20 65 71  ch if NULL is eq
168e0 75 69 76 61 6c 65 6e 74 20 74 6f 20 46 41 4c 53  uivalent to FALS
168f0 45 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72  E.        ** for
16900 20 74 68 69 73 20 70 61 72 74 69 63 75 6c 61 72   this particular
16910 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 2a   IN operator.  *
16920 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
16930 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 0a  3VdbeAddOp4Int(.
16940 20 20 20 20 20 20 20 20 20 20 20 20 76 2c 20 4f              v, O
16950 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70 45 78 70  P_NotFound, pExp
16960 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49  r->iTable, destI
16970 66 46 61 6c 73 65 2c 20 72 31 2c 20 6e 56 65 63  fFalse, r1, nVec
16980 74 6f 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  tor.        );. 
16990 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
169a0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65  age(v);.      }e
169b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
169c0 49 6e 20 74 68 69 73 20 62 72 61 6e 63 68 2c 20  In this branch, 
169d0 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
169e0 4e 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  N might contain 
169f0 61 20 4e 55 4c 4c 20 61 6e 64 0a 20 20 20 20 20  a NULL and.     
16a00 20 20 20 2a 2a 20 74 68 65 20 70 72 65 73 65 6e     ** the presen
16a10 63 65 20 6f 66 20 61 20 4e 55 4c 4c 20 6f 6e 20  ce of a NULL on 
16a20 74 68 65 20 52 48 53 20 6d 61 6b 65 73 20 61 20  the RHS makes a 
16a30 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68  difference in th
16a40 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74  e.        ** out
16a50 63 6f 6d 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  come..        */
16a60 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64  .        int add
16a70 72 31 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  r1;..        /* 
16a80 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73  First check to s
16a90 65 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73  ee if the LHS is
16aa0 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
16ab0 65 20 52 48 53 2e 20 20 49 66 20 73 6f 2c 0a 20  e RHS.  If so,. 
16ac0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74         ** then t
16ad0 68 65 20 61 6e 73 77 65 72 20 69 73 20 54 52 55  he answer is TRU
16ae0 45 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f  E the presence o
16af0 66 20 4e 55 4c 4c 73 20 69 6e 20 74 68 65 20 52  f NULLs in the R
16b00 48 53 20 64 6f 65 73 0a 20 20 20 20 20 20 20 20  HS does.        
16b10 2a 2a 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20  ** not matter.  
16b20 49 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f  If the LHS is no
16b30 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  t contained in t
16b40 68 65 20 52 48 53 2c 20 74 68 65 6e 20 74 68 65  he RHS, then the
16b50 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 73 77  .        ** answ
16b60 65 72 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68  er is NULL if th
16b70 65 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e  e RHS contains N
16b80 55 4c 4c 73 20 61 6e 64 20 74 68 65 20 61 6e 73  ULLs and the ans
16b90 77 65 72 20 69 73 0a 20 20 20 20 20 20 20 20 2a  wer is.        *
16ba0 2a 20 46 41 4c 53 45 20 69 66 20 74 68 65 20 52  * FALSE if the R
16bb0 48 53 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e  HS is NULL-free.
16bc0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
16bd0 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
16be0 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
16bf0 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45  (v, OP_Found, pE
16c00 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20  xpr->iTable, 0, 
16c10 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  r1, 1);.        
16c20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
16c30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16c40 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16c50 5f 49 73 4e 75 6c 6c 2c 20 72 52 68 73 48 61 73  _IsNull, rRhsHas
16c60 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c  Null, destIfNull
16c70 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
16c80 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
16c90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
16ca0 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 46 61 6c  oto(v, destIfFal
16cb0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
16cc0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
16cd0 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
16ce0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
16cf0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
16d00 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
16d10 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
16d20 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
16d30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
16d40 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 61 69  e(pParse->db, ai
16d50 4d 61 70 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  Map);.  VdbeComm
16d60 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 49 4e 20  ent((v, "end IN 
16d70 65 78 70 72 22 29 29 3b 0a 7d 0a 23 65 6e 64 69  expr"));.}.#endi
16d80 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
16d90 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69  _SUBQUERY */..#i
16da0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16db0 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
16dc0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
16dd0 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  an instruction t
16de0 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65  hat will put the
16df0 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a   floating point.
16e00 2a 2a 20 76 61 6c 75 65 20 64 65 73 63 72 69 62  ** value describ
16e10 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20  ed by z[0..n-1] 
16e20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d  into register iM
16e30 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b  em..**.** The z[
16e40 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72  ] string will pr
16e50 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65  obably not be ze
16e60 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20  ro-terminated.  
16e70 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d  But the .** z[n]
16e80 20 63 68 61 72 61 63 74 65 72 20 69 73 20 67 75   character is gu
16e90 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73  aranteed to be s
16ea0 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f  omething that do
16eb0 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c  es not look.** l
16ec0 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61  ike the continua
16ed0 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62  tion of the numb
16ee0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
16ef0 69 64 20 63 6f 64 65 52 65 61 6c 28 56 64 62 65  id codeReal(Vdbe
16f00 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *v, const char 
16f10 2a 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c  *z, int negateFl
16f20 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20  ag, int iMem){. 
16f30 20 69 66 28 20 41 4c 57 41 59 53 28 7a 21 3d 30   if( ALWAYS(z!=0
16f40 29 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20  ) ){.    double 
16f50 76 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69 74  value;.    sqlit
16f60 65 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65  e3AtoF(z, &value
16f70 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
16f80 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46  0(z), SQLITE_UTF
16f90 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  8);.    assert( 
16fa0 21 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 76 61  !sqlite3IsNaN(va
16fb0 6c 75 65 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e  lue) ); /* The n
16fc0 65 77 20 41 74 6f 46 20 6e 65 76 65 72 20 72 65  ew AtoF never re
16fd0 74 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20  turns NaN */.   
16fe0 20 69 66 28 20 6e 65 67 61 74 65 46 6c 61 67 20   if( negateFlag 
16ff0 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65  ) value = -value
17000 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
17010 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f  eAddOp4Dup8(v, O
17020 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c  P_Real, 0, iMem,
17030 20 30 2c 20 28 75 38 2a 29 26 76 61 6c 75 65 2c   0, (u8*)&value,
17040 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d   P4_REAL);.  }.}
17050 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
17060 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74  Generate an inst
17070 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  ruction that wil
17080 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65 67 65  l put the intege
17090 72 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a  r describe by.**
170a0 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20   text z[0..n-1] 
170b0 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d  into register iM
170c0 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75  em..**.** Expr.u
170d0 2e 7a 54 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79  .zToken is alway
170e0 73 20 55 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d  s UTF8 and zero-
170f0 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73  terminated..*/.s
17100 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49  tatic void codeI
17110 6e 74 65 67 65 72 28 50 61 72 73 65 20 2a 70 50  nteger(Parse *pP
17120 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
17130 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20  r, int negFlag, 
17140 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62  int iMem){.  Vdb
17150 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
17160 56 64 62 65 3b 0a 20 20 69 66 28 20 70 45 78 70  Vdbe;.  if( pExp
17170 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  r->flags & EP_In
17180 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e  tValue ){.    in
17190 74 20 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69  t i = pExpr->u.i
171a0 56 61 6c 75 65 3b 0a 20 20 20 20 61 73 73 65 72  Value;.    asser
171b0 74 28 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69  t( i>=0 );.    i
171c0 66 28 20 6e 65 67 46 6c 61 67 20 29 20 69 20 3d  f( negFlag ) i =
171d0 20 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -i;.    sqlite3
171e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
171f0 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d 65  _Integer, i, iMe
17200 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  m);.  }else{.   
17210 20 69 6e 74 20 63 3b 0a 20 20 20 20 69 36 34 20   int c;.    i64 
17220 76 61 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74  value;.    const
17230 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 78 70 72   char *z = pExpr
17240 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
17250 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a  assert( z!=0 );.
17260 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 44      c = sqlite3D
17270 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c 20  ecOrHexToI64(z, 
17280 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 69 66 28  &value);.    if(
17290 20 63 3d 3d 30 20 7c 7c 20 28 63 3d 3d 32 20 26   c==0 || (c==2 &
172a0 26 20 6e 65 67 46 6c 61 67 29 20 29 7b 0a 20 20  & negFlag) ){.  
172b0 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20      if( negFlag 
172c0 29 7b 20 76 61 6c 75 65 20 3d 20 63 3d 3d 32 20  ){ value = c==2 
172d0 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34  ? SMALLEST_INT64
172e0 20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a 20 20 20   : -value; }.   
172f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17300 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 49  dOp4Dup8(v, OP_I
17310 6e 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c 20 30  nt64, 0, iMem, 0
17320 2c 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20 50  , (u8*)&value, P
17330 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65  4_INT64);.    }e
17340 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  lse{.#ifdef SQLI
17350 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
17360 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 73 71 6c  _POINT.      sql
17370 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
17380 72 73 65 2c 20 22 6f 76 65 72 73 69 7a 65 64 20  rse, "oversized 
17390 69 6e 74 65 67 65 72 3a 20 25 73 25 73 22 2c 20  integer: %s%s", 
173a0 6e 65 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20  negFlag ? "-" : 
173b0 22 22 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 23 69  "", z);.#else.#i
173c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
173d0 54 5f 48 45 58 5f 49 4e 54 45 47 45 52 0a 20 20  T_HEX_INTEGER.  
173e0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
173f0 73 74 72 6e 69 63 6d 70 28 7a 2c 22 30 78 22 2c  strnicmp(z,"0x",
17400 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  2)==0 ){.       
17410 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
17420 28 70 50 61 72 73 65 2c 20 22 68 65 78 20 6c 69  (pParse, "hex li
17430 74 65 72 61 6c 20 74 6f 6f 20 62 69 67 3a 20 25  teral too big: %
17440 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 7d 65  s", z);.      }e
17450 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
17460 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52   {.        codeR
17470 65 61 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61  eal(v, z, negFla
17480 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  g, iMem);.      
17490 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
174a0 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65   }.}..#if define
174b0 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
174c0 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 65  /*.** Verify the
174d0 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 6f 66 20   consistency of 
174e0 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
174f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
17500 61 63 68 65 49 73 56 61 6c 69 64 28 50 61 72 73  acheIsValid(Pars
17510 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e  e *pParse){.  in
17520 74 20 69 2c 20 6e 3b 0a 20 20 66 6f 72 28 69 3d  t i, n;.  for(i=
17530 6e 3d 30 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  n=0; i<SQLITE_N_
17540 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 29 7b 0a  COLCACHE; i++){.
17550 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
17560 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65  aColCache[i].iRe
17570 67 3e 30 20 29 20 6e 2b 2b 3b 0a 20 20 7d 0a 20  g>0 ) n++;.  }. 
17580 20 72 65 74 75 72 6e 20 6e 3d 3d 70 50 61 72 73   return n==pPars
17590 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 0a 7d 0a  e->nColCache;.}.
175a0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c  #endif../*.** Cl
175b0 65 61 72 20 61 20 63 61 63 68 65 20 65 6e 74 72  ear a cache entr
175c0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
175d0 64 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61  d cacheEntryClea
175e0 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
175f0 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
17600 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  e *p){.  if( p->
17610 74 65 6d 70 52 65 67 20 29 7b 0a 20 20 20 20 69  tempReg ){.    i
17620 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  f( pParse->nTemp
17630 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50  Reg<ArraySize(pP
17640 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20  arse->aTempReg) 
17650 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
17660 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65  >aTempReg[pParse
17670 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20  ->nTempReg++] = 
17680 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20  p->iReg;.    }. 
17690 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20     p->tempReg = 
176a0 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 52 65 67  0;.  }.  p->iReg
176b0 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
176c0 6e 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20 61  nColCache--;.  a
176d0 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
176e0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
176f0 7c 7c 20 63 61 63 68 65 49 73 56 61 6c 69 64 28  || cacheIsValid(
17700 70 50 61 72 73 65 29 20 29 3b 0a 7d 0a 0a 0a 2f  pParse) );.}.../
17710 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 69 6e 20 74  *.** Record in t
17720 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
17730 74 68 61 74 20 61 20 70 61 72 74 69 63 75 6c 61  that a particula
17740 72 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 0a  r column from a.
17750 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 20 74 61  ** particular ta
17760 62 6c 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ble is stored in
17770 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 72 65   a particular re
17780 67 69 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20  gister..*/.void 
17790 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
177a0 53 74 6f 72 65 28 50 61 72 73 65 20 2a 70 50 61  Store(Parse *pPa
177b0 72 73 65 2c 20 69 6e 74 20 69 54 61 62 2c 20 69  rse, int iTab, i
177c0 6e 74 20 69 43 6f 6c 2c 20 69 6e 74 20 69 52 65  nt iCol, int iRe
177d0 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  g){.  int i;.  i
177e0 6e 74 20 6d 69 6e 4c 72 75 3b 0a 20 20 69 6e 74  nt minLru;.  int
177f0 20 69 64 78 4c 72 75 3b 0a 20 20 73 74 72 75 63   idxLru;.  struc
17800 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
17810 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 61 6e 20  .  /* Unless an 
17820 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
17830 65 64 2c 20 72 65 67 69 73 74 65 72 20 6e 75 6d  ed, register num
17840 62 65 72 73 20 61 72 65 20 61 6c 77 61 79 73 20  bers are always 
17850 70 6f 73 69 74 69 76 65 2e 20 2a 2f 0a 20 20 61  positive. */.  a
17860 73 73 65 72 74 28 20 69 52 65 67 3e 30 20 7c 7c  ssert( iReg>0 ||
17870 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
17880 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
17890 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 61  locFailed );.  a
178a0 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 2d 31 20  ssert( iCol>=-1 
178b0 26 26 20 69 43 6f 6c 3c 33 32 37 36 38 20 29 3b  && iCol<32768 );
178c0 20 20 2f 2a 20 46 69 6e 69 74 65 20 63 6f 6c 75    /* Finite colu
178d0 6d 6e 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20  mn numbers */.. 
178e0 20 2f 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 43   /* The SQLITE_C
178f0 6f 6c 75 6d 6e 43 61 63 68 65 20 66 6c 61 67 20  olumnCache flag 
17900 64 69 73 61 62 6c 65 73 20 74 68 65 20 63 6f 6c  disables the col
17910 75 6d 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73  umn cache.  This
17920 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 66 6f   is used.  ** fo
17930 72 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 20 2d  r testing only -
17940 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
17950 53 51 4c 69 74 65 20 61 6c 77 61 79 73 20 67 65  SQLite always ge
17960 74 73 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77  ts the same answ
17970 65 72 0a 20 20 2a 2a 20 77 69 74 68 20 61 6e 64  er.  ** with and
17980 20 77 69 74 68 6f 75 74 20 74 68 65 20 63 6f 6c   without the col
17990 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a  umn cache..  */.
179a0 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69    if( Optimizati
179b0 6f 6e 44 69 73 61 62 6c 65 64 28 70 50 61 72 73  onDisabled(pPars
179c0 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f  e->db, SQLITE_Co
179d0 6c 75 6d 6e 43 61 63 68 65 29 20 29 20 72 65 74  lumnCache) ) ret
179e0 75 72 6e 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74  urn;..  /* First
179f0 20 72 65 70 6c 61 63 65 20 61 6e 79 20 65 78 69   replace any exi
17a00 73 74 69 6e 67 20 65 6e 74 72 79 2e 0a 20 20 2a  sting entry..  *
17a10 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c  *.  ** Actually,
17a20 20 74 68 65 20 77 61 79 20 74 68 65 20 63 6f 6c   the way the col
17a30 75 6d 6e 20 63 61 63 68 65 20 69 73 20 63 75 72  umn cache is cur
17a40 72 65 6e 74 6c 79 20 75 73 65 64 2c 20 77 65 20  rently used, we 
17a50 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 0a 20  are guaranteed. 
17a60 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 62 6a   ** that the obj
17a70 65 63 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 61  ect will never a
17a80 6c 72 65 61 64 79 20 62 65 20 69 6e 20 63 61 63  lready be in cac
17a90 68 65 2e 20 20 56 65 72 69 66 79 20 74 68 69 73  he.  Verify this
17aa0 20 67 75 61 72 61 6e 74 65 65 2e 0a 20 20 2a 2f   guarantee..  */
17ab0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
17ac0 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
17ad0 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
17ae0 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
17af0 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
17b00 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
17b10 52 65 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 54 61  Reg==0 || p->iTa
17b20 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20 70 2d 3e  ble!=iTab || p->
17b30 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b  iColumn!=iCol );
17b40 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
17b50 2a 20 46 69 6e 64 20 61 6e 20 65 6d 70 74 79 20  * Find an empty 
17b60 73 6c 6f 74 20 61 6e 64 20 72 65 70 6c 61 63 65  slot and replace
17b70 20 69 74 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30   it */.  for(i=0
17b80 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
17b90 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
17ba0 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
17bb0 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   p++){.    if( p
17bc0 2d 3e 69 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20  ->iReg==0 ){.   
17bd0 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70     p->iLevel = p
17be0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
17bf0 65 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 54 61  el;.      p->iTa
17c00 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  ble = iTab;.    
17c10 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69    p->iColumn = i
17c20 43 6f 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52  Col;.      p->iR
17c30 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 20  eg = iReg;.     
17c40 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b   p->tempReg = 0;
17c50 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20  .      p->lru = 
17c60 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e  pParse->iCacheCn
17c70 74 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 72 73  t++;.      pPars
17c80 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a  e->nColCache++;.
17c90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
17ca0 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
17cb0 46 61 69 6c 65 64 20 7c 7c 20 63 61 63 68 65 49  Failed || cacheI
17cc0 73 56 61 6c 69 64 28 70 50 61 72 73 65 29 20 29  sValid(pParse) )
17cd0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
17ce0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
17cf0 52 65 70 6c 61 63 65 20 74 68 65 20 6c 61 73 74  Replace the last
17d00 20 72 65 63 65 6e 74 6c 79 20 75 73 65 64 20 2a   recently used *
17d10 2f 0a 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78 37  /.  minLru = 0x7
17d20 66 66 66 66 66 66 66 3b 0a 20 20 69 64 78 4c 72  fffffff;.  idxLr
17d30 75 20 3d 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d  u = -1;.  for(i=
17d40 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
17d50 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
17d60 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
17d70 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , p++){.    if( 
17d80 70 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20 29 7b  p->lru<minLru ){
17d90 0a 20 20 20 20 20 20 69 64 78 4c 72 75 20 3d 20  .      idxLru = 
17da0 69 3b 0a 20 20 20 20 20 20 6d 69 6e 4c 72 75 20  i;.      minLru 
17db0 3d 20 70 2d 3e 6c 72 75 3b 0a 20 20 20 20 7d 0a  = p->lru;.    }.
17dc0 20 20 7d 0a 20 20 69 66 28 20 41 4c 57 41 59 53    }.  if( ALWAYS
17dd0 28 69 64 78 4c 72 75 3e 3d 30 29 20 29 7b 0a 20  (idxLru>=0) ){. 
17de0 20 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e     p = &pParse->
17df0 61 43 6f 6c 43 61 63 68 65 5b 69 64 78 4c 72 75  aColCache[idxLru
17e00 5d 3b 0a 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c  ];.    p->iLevel
17e10 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
17e20 65 4c 65 76 65 6c 3b 0a 20 20 20 20 70 2d 3e 69  eLevel;.    p->i
17e30 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20  Table = iTab;.  
17e40 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69    p->iColumn = i
17e50 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69 52 65 67  Col;.    p->iReg
17e60 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 70 2d 3e   = iReg;.    p->
17e70 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20  tempReg = 0;.   
17e80 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65   p->lru = pParse
17e90 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20  ->iCacheCnt++;. 
17ea0 20 20 20 61 73 73 65 72 74 28 20 63 61 63 68 65     assert( cache
17eb0 49 73 56 61 6c 69 64 28 70 50 61 72 73 65 29 20  IsValid(pParse) 
17ec0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
17ed0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69   }.}../*.** Indi
17ee0 63 61 74 65 20 74 68 61 74 20 72 65 67 69 73 74  cate that regist
17ef0 65 72 73 20 62 65 74 77 65 65 6e 20 69 52 65 67  ers between iReg
17f00 2e 2e 69 52 65 67 2b 6e 52 65 67 2d 31 20 61 72  ..iReg+nReg-1 ar
17f10 65 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74  e being overwrit
17f20 74 65 6e 2e 0a 2a 2a 20 50 75 72 67 65 20 74 68  ten..** Purge th
17f30 65 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73  e range of regis
17f40 74 65 72 73 20 66 72 6f 6d 20 74 68 65 20 63 6f  ters from the co
17f50 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76  lumn cache..*/.v
17f60 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
17f70 61 63 68 65 52 65 6d 6f 76 65 28 50 61 72 73 65  acheRemove(Parse
17f80 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
17f90 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  eg, int nReg){. 
17fa0 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
17fb0 65 20 2a 70 3b 0a 20 20 69 66 28 20 69 52 65 67  e *p;.  if( iReg
17fc0 3c 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  <=0 || pParse->n
17fd0 43 6f 6c 43 61 63 68 65 3d 3d 30 20 29 20 72 65  ColCache==0 ) re
17fe0 74 75 72 6e 3b 0a 20 20 70 20 3d 20 26 70 50 61  turn;.  p = &pPa
17ff0 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 53  rse->aColCache[S
18000 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
18010 2d 31 5d 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b  -1];.  while(1){
18020 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67  .    if( p->iReg
18030 20 3e 3d 20 69 52 65 67 20 26 26 20 70 2d 3e 69   >= iReg && p->i
18040 52 65 67 20 3c 20 69 52 65 67 2b 6e 52 65 67 20  Reg < iReg+nReg 
18050 29 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61  ) cacheEntryClea
18060 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  r(pParse, p);.  
18070 20 20 69 66 28 20 70 3d 3d 70 50 61 72 73 65 2d    if( p==pParse-
18080 3e 61 43 6f 6c 43 61 63 68 65 20 29 20 62 72 65  >aColCache ) bre
18090 61 6b 3b 0a 20 20 20 20 70 2d 2d 3b 0a 20 20 7d  ak;.    p--;.  }
180a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62  .}../*.** Rememb
180b0 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  er the current c
180c0 6f 6c 75 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74  olumn cache cont
180d0 65 78 74 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e  ext.  Any new en
180e0 74 72 69 65 73 20 61 64 64 65 64 0a 2a 2a 20 61  tries added.** a
180f0 64 64 65 64 20 74 6f 20 74 68 65 20 63 6f 6c 75  dded to the colu
18100 6d 6e 20 63 61 63 68 65 20 61 66 74 65 72 20 74  mn cache after t
18110 68 69 73 20 63 61 6c 6c 20 61 72 65 20 72 65 6d  his call are rem
18120 6f 76 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a  oved when the.**
18130 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70   corresponding p
18140 6f 70 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f  op occurs..*/.vo
18150 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
18160 63 68 65 50 75 73 68 28 50 61 72 73 65 20 2a 70  chePush(Parse *p
18170 50 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65  Parse){.  pParse
18180 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b  ->iCacheLevel++;
18190 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
181a0 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73  EBUG.  if( pPars
181b0 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
181c0 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54  QLITE_VdbeAddopT
181d0 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e  race ){.    prin
181e0 74 66 28 22 50 55 53 48 20 74 6f 20 25 64 5c 6e  tf("PUSH to %d\n
181f0 22 2c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  ", pParse->iCach
18200 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e  eLevel);.  }.#en
18210 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  dif.}../*.** Rem
18220 6f 76 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c  ove from the col
18230 75 6d 6e 20 63 61 63 68 65 20 61 6e 79 20 65 6e  umn cache any en
18240 74 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20  tries that were 
18250 61 64 64 65 64 20 73 69 6e 63 65 20 74 68 65 0a  added since the.
18260 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  ** the previous 
18270 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
18280 50 75 73 68 20 6f 70 65 72 61 74 69 6f 6e 2e 20  Push operation. 
18290 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
182a0 20 72 65 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20   restore.** the 
182b0 63 61 63 68 65 20 74 6f 20 74 68 65 20 73 74 61  cache to the sta
182c0 74 65 20 69 74 20 77 61 73 20 69 6e 20 70 72 69  te it was in pri
182d0 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  or the most rece
182e0 6e 74 20 50 75 73 68 2e 0a 2a 2f 0a 76 6f 69 64  nt Push..*/.void
182f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
18300 65 50 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72  ePop(Parse *pPar
18310 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  se){.  int i;.  
18320 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
18330 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70   *p;.  assert( p
18340 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
18350 65 6c 3e 3d 31 20 29 3b 0a 20 20 70 50 61 72 73  el>=1 );.  pPars
18360 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 2d 2d  e->iCacheLevel--
18370 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
18380 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 72  DEBUG.  if( pPar
18390 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
183a0 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70  SQLITE_VdbeAddop
183b0 54 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69  Trace ){.    pri
183c0 6e 74 66 28 22 50 4f 50 20 20 74 6f 20 25 64 5c  ntf("POP  to %d\
183d0 6e 22 2c 20 70 50 61 72 73 65 2d 3e 69 43 61 63  n", pParse->iCac
183e0 68 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65  heLevel);.  }.#e
183f0 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 30 2c 20  ndif.  for(i=0, 
18400 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
18410 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
18420 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
18430 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
18440 69 52 65 67 20 26 26 20 70 2d 3e 69 4c 65 76 65  iReg && p->iLeve
18450 6c 3e 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  l>pParse->iCache
18460 4c 65 76 65 6c 20 29 7b 0a 20 20 20 20 20 20 63  Level ){.      c
18470 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70  acheEntryClear(p
18480 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 7d  Parse, p);.    }
18490 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68  .  }.}../*.** Wh
184a0 65 6e 20 61 20 63 61 63 68 65 64 20 63 6f 6c 75  en a cached colu
184b0 6d 6e 20 69 73 20 72 65 75 73 65 64 2c 20 6d 61  mn is reused, ma
184c0 6b 65 20 73 75 72 65 20 74 68 61 74 20 69 74 73  ke sure that its
184d0 20 72 65 67 69 73 74 65 72 20 69 73 0a 2a 2a 20   register is.** 
184e0 6e 6f 20 6c 6f 6e 67 65 72 20 61 76 61 69 6c 61  no longer availa
184f0 62 6c 65 20 61 73 20 61 20 74 65 6d 70 20 72 65  ble as a temp re
18500 67 69 73 74 65 72 2e 20 20 74 69 63 6b 65 74 20  gister.  ticket 
18510 23 33 38 37 39 3a 20 20 74 68 61 74 20 73 61 6d  #3879:  that sam
18520 65 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 6d 69  e.** register mi
18530 67 68 74 20 62 65 20 69 6e 20 74 68 65 20 63 61  ght be in the ca
18540 63 68 65 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20  che in multiple 
18550 70 6c 61 63 65 73 2c 20 73 6f 20 62 65 20 73 75  places, so be su
18560 72 65 20 74 6f 0a 2a 2a 20 67 65 74 20 74 68 65  re to.** get the
18570 6d 20 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  m all..*/.static
18580 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70   void sqlite3Exp
18590 72 43 61 63 68 65 50 69 6e 52 65 67 69 73 74 65  rCachePinRegiste
185a0 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
185b0 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e   int iReg){.  in
185c0 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
185d0 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f  olCache *p;.  fo
185e0 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
185f0 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
18600 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
18610 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
18620 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65  if( p->iReg==iRe
18630 67 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 74 65  g ){.      p->te
18640 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d  mpReg = 0;.    }
18650 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72  .  }.}../* Gener
18660 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
18670 6c 6c 20 6c 6f 61 64 20 69 6e 74 6f 20 72 65 67  ll load into reg
18680 69 73 74 65 72 20 72 65 67 4f 75 74 20 61 20 76  ister regOut a v
18690 61 6c 75 65 20 74 68 61 74 20 69 73 0a 2a 2a 20  alue that is.** 
186a0 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
186b0 74 68 65 20 69 49 64 78 43 6f 6c 2d 74 68 20 63  the iIdxCol-th c
186c0 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70  olumn of index p
186d0 49 64 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  Idx..*/.void sql
186e0 69 74 65 33 45 78 70 72 43 6f 64 65 4c 6f 61 64  ite3ExprCodeLoad
186f0 49 6e 64 65 78 43 6f 6c 75 6d 6e 28 0a 20 20 50  IndexColumn(.  P
18700 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 2f  arse *pParse,  /
18710 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
18720 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78  ntext */.  Index
18730 20 2a 70 49 64 78 2c 20 20 20 20 2f 2a 20 54 68   *pIdx,    /* Th
18740 65 20 69 6e 64 65 78 20 77 68 6f 73 65 20 63 6f  e index whose co
18750 6c 75 6d 6e 20 69 73 20 74 6f 20 62 65 20 6c 6f  lumn is to be lo
18760 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  aded */.  int iT
18770 61 62 43 75 72 2c 20 20 20 20 2f 2a 20 43 75 72  abCur,    /* Cur
18780 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
18790 61 20 74 61 62 6c 65 20 72 6f 77 20 2a 2f 0a 20  a table row */. 
187a0 20 69 6e 74 20 69 49 64 78 43 6f 6c 2c 20 20 20   int iIdxCol,   
187b0 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f   /* The column o
187c0 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 62  f the index to b
187d0 65 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e  e loaded */.  in
187e0 74 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a  t regOut      /*
187f0 20 53 74 6f 72 65 20 74 68 65 20 69 6e 64 65 78   Store the index
18800 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e   column value in
18810 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
18820 2f 0a 29 7b 0a 20 20 69 31 36 20 69 54 61 62 43  /.){.  i16 iTabC
18830 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c  ol = pIdx->aiCol
18840 75 6d 6e 5b 69 49 64 78 43 6f 6c 5d 3b 0a 20 20  umn[iIdxCol];.  
18850 69 66 28 20 69 54 61 62 43 6f 6c 3d 3d 58 4e 5f  if( iTabCol==XN_
18860 45 58 50 52 20 29 7b 0a 20 20 20 20 61 73 73 65  EXPR ){.    asse
18870 72 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78  rt( pIdx->aColEx
18880 70 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  pr );.    assert
18890 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72  ( pIdx->aColExpr
188a0 2d 3e 6e 45 78 70 72 3e 69 49 64 78 43 6f 6c 20  ->nExpr>iIdxCol 
188b0 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69  );.    pParse->i
188c0 53 65 6c 66 54 61 62 20 3d 20 69 54 61 62 43 75  SelfTab = iTabCu
188d0 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  r;.    sqlite3Ex
188e0 70 72 43 6f 64 65 43 6f 70 79 28 70 50 61 72 73  prCodeCopy(pPars
188f0 65 2c 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70  e, pIdx->aColExp
18900 72 2d 3e 61 5b 69 49 64 78 43 6f 6c 5d 2e 70 45  r->a[iIdxCol].pE
18910 78 70 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  xpr, regOut);.  
18920 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
18930 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
18940 75 6d 6e 4f 66 54 61 62 6c 65 28 70 50 61 72 73  umnOfTable(pPars
18950 65 2d 3e 70 56 64 62 65 2c 20 70 49 64 78 2d 3e  e->pVdbe, pIdx->
18960 70 54 61 62 6c 65 2c 20 69 54 61 62 43 75 72 2c  pTable, iTabCur,
18970 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18990 20 20 20 20 20 69 54 61 62 43 6f 6c 2c 20 72 65       iTabCol, re
189a0 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  gOut);.  }.}../*
189b0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
189c0 65 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65  e to extract the
189d0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 43   value of the iC
189e0 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20  ol-th column of 
189f0 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  a table..*/.void
18a00 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
18a10 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
18a20 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  (.  Vdbe *v,    
18a30 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
18a40 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
18a50 6f 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  on */.  Table *p
18a60 54 61 62 2c 20 20 20 20 2f 2a 20 54 68 65 20 74  Tab,    /* The t
18a70 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  able containing 
18a80 74 68 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  the value */.  i
18a90 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20 20 2f  nt iTabCur,    /
18aa0 2a 20 54 68 65 20 74 61 62 6c 65 20 63 75 72 73  * The table curs
18ab0 6f 72 2e 20 20 4f 72 20 74 68 65 20 50 4b 20 63  or.  Or the PK c
18ac0 75 72 73 6f 72 20 66 6f 72 20 57 49 54 48 4f 55  ursor for WITHOU
18ad0 54 20 52 4f 57 49 44 20 2a 2f 0a 20 20 69 6e 74  T ROWID */.  int
18ae0 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 2f 2a 20   iCol,       /* 
18af0 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c  Index of the col
18b00 75 6d 6e 20 74 6f 20 65 78 74 72 61 63 74 20 2a  umn to extract *
18b10 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20 20  /.  int regOut  
18b20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74      /* Extract t
18b30 68 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68  he value into th
18b40 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29  is register */.)
18b50 7b 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c  {.  if( iCol<0 |
18b60 7c 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50  | iCol==pTab->iP
18b70 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Key ){.    sqlit
18b80 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18b90 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 43 75  OP_Rowid, iTabCu
18ba0 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65  r, regOut);.  }e
18bb0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20  lse{.    int op 
18bc0 3d 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  = IsVirtual(pTab
18bd0 29 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a  ) ? OP_VColumn :
18be0 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20   OP_Column;.    
18bf0 69 6e 74 20 78 20 3d 20 69 43 6f 6c 3b 0a 20 20  int x = iCol;.  
18c00 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28    if( !HasRowid(
18c10 70 54 61 62 29 20 26 26 20 21 49 73 56 69 72 74  pTab) && !IsVirt
18c20 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
18c30 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33 43 6f     x = sqlite3Co
18c40 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 73 71 6c 69  lumnOfIndex(sqli
18c50 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
18c60 65 78 28 70 54 61 62 29 2c 20 69 43 6f 6c 29 3b  ex(pTab), iCol);
18c70 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
18c80 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
18c90 6f 70 2c 20 69 54 61 62 43 75 72 2c 20 78 2c 20  op, iTabCur, x, 
18ca0 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69  regOut);.  }.  i
18cb0 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20  f( iCol>=0 ){.  
18cc0 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44    sqlite3ColumnD
18cd0 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20  efault(v, pTab, 
18ce0 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20  iCol, regOut);. 
18cf0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
18d00 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
18d10 69 6c 6c 20 65 78 74 72 61 63 74 20 74 68 65 20  ill extract the 
18d20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d  iColumn-th colum
18d30 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20  n from.** table 
18d40 70 54 61 62 20 61 6e 64 20 73 74 6f 72 65 20 74  pTab and store t
18d50 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  he column value 
18d60 69 6e 20 61 20 72 65 67 69 73 74 65 72 2e 20 0a  in a register. .
18d70 2a 2a 0a 2a 2a 20 41 6e 20 65 66 66 6f 72 74 20  **.** An effort 
18d80 69 73 20 6d 61 64 65 20 74 6f 20 73 74 6f 72 65  is made to store
18d90 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75   the column valu
18da0 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52  e in register iR
18db0 65 67 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20  eg.  This.** is 
18dc0 6e 6f 74 20 67 61 72 61 6e 74 65 65 65 64 20 66  not garanteeed f
18dd0 6f 72 20 47 65 74 43 6f 6c 75 6d 6e 28 29 20 2d  or GetColumn() -
18de0 20 74 68 65 20 72 65 73 75 6c 74 20 63 61 6e 20   the result can 
18df0 62 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  be stored in.** 
18e00 61 6e 79 20 72 65 67 69 73 74 65 72 2e 20 20 42  any register.  B
18e10 75 74 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  ut the result is
18e20 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6c   guaranteed to l
18e30 61 6e 64 20 69 6e 20 72 65 67 69 73 74 65 72 20  and in register 
18e40 69 52 65 67 0a 2a 2a 20 66 6f 72 20 47 65 74 43  iReg.** for GetC
18e50 6f 6c 75 6d 6e 54 6f 52 65 67 28 29 2e 0a 2a 2a  olumnToReg()..**
18e60 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62  .** There must b
18e70 65 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72  e an open cursor
18e80 20 74 6f 20 70 54 61 62 20 69 6e 20 69 54 61 62   to pTab in iTab
18e90 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  le when this rou
18ea0 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
18eb0 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30  d.  If iColumn<0
18ec0 20 74 68 65 6e 20 63 6f 64 65 20 69 73 20 67 65   then code is ge
18ed0 6e 65 72 61 74 65 64 20 74 68 61 74 20 65 78 74  nerated that ext
18ee0 72 61 63 74 73 20 74 68 65 20 72 6f 77 69 64 2e  racts the rowid.
18ef0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
18f00 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
18f10 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
18f20 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  e,   /* Parsing 
18f30 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
18f40 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
18f50 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
18f60 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e    /* Description
18f70 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 65   of the table we
18f80 20 61 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f   are reading fro
18f90 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75  m */.  int iColu
18fa0 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65 78  mn,     /* Index
18fb0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f   of the table co
18fc0 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54  lumn */.  int iT
18fd0 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 68  able,      /* Th
18fe0 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  e cursor pointin
18ff0 67 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a  g to the table *
19000 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c 20 20 20  /.  int iReg,   
19010 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72 65       /* Store re
19020 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20  sults here */.  
19030 75 38 20 70 35 20 20 20 20 20 20 20 20 20 20 20  u8 p5           
19040 20 2f 2a 20 50 35 20 76 61 6c 75 65 20 66 6f 72   /* P5 value for
19050 20 4f 50 5f 43 6f 6c 75 6d 6e 20 2b 20 46 4c 41   OP_Column + FLA
19060 47 53 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  GS */.){.  Vdbe 
19070 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
19080 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  be;.  int i;.  s
19090 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
190a0 2a 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20  *p;..  for(i=0, 
190b0 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
190c0 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
190d0 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
190e0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
190f0 69 52 65 67 3e 30 20 26 26 20 70 2d 3e 69 54 61  iReg>0 && p->iTa
19100 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70  ble==iTable && p
19110 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75  ->iColumn==iColu
19120 6d 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6c  mn ){.      p->l
19130 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  ru = pParse->iCa
19140 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  cheCnt++;.      
19150 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
19160 50 69 6e 52 65 67 69 73 74 65 72 28 70 50 61 72  PinRegister(pPar
19170 73 65 2c 20 70 2d 3e 69 52 65 67 29 3b 0a 20 20  se, p->iReg);.  
19180 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 52      return p->iR
19190 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a  eg;.    }.  }  .
191a0 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
191b0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
191c0 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61  odeGetColumnOfTa
191d0 62 6c 65 28 76 2c 20 70 54 61 62 2c 20 69 54 61  ble(v, pTab, iTa
191e0 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52  ble, iColumn, iR
191f0 65 67 29 3b 0a 20 20 69 66 28 20 70 35 20 29 7b  eg);.  if( p5 ){
19200 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19210 43 68 61 6e 67 65 50 35 28 76 2c 20 70 35 29 3b  ChangeP5(v, p5);
19220 0a 20 20 7d 65 6c 73 65 7b 20 20 20 0a 20 20 20  .  }else{   .   
19230 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
19240 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69  eStore(pParse, i
19250 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20  Table, iColumn, 
19260 69 52 65 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  iReg);.  }.  ret
19270 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 76 6f 69 64  urn iReg;.}.void
19280 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
19290 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 0a  GetColumnToReg(.
192a0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
192b0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
192c0 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
192d0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
192e0 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
192f0 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f  /* Description o
19300 66 20 74 68 65 20 74 61 62 6c 65 20 77 65 20 61  f the table we a
19310 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  re reading from 
19320 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
19330 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f  ,     /* Index o
19340 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75  f the table colu
19350 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  mn */.  int iTab
19360 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  le,      /* The 
19370 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  cursor pointing 
19380 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  to the table */.
19390 20 20 69 6e 74 20 69 52 65 67 20 20 20 20 20 20    int iReg      
193a0 20 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75     /* Store resu
193b0 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
193c0 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
193d0 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
193e0 6d 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  mn(pParse, pTab,
193f0 20 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 6c 65   iColumn, iTable
19400 2c 20 69 52 65 67 2c 20 30 29 3b 0a 20 20 69 66  , iReg, 0);.  if
19410 28 20 72 31 21 3d 69 52 65 67 20 29 20 73 71 6c  ( r1!=iReg ) sql
19420 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70  ite3VdbeAddOp2(p
19430 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
19440 5f 53 43 6f 70 79 2c 20 72 31 2c 20 69 52 65 67  _SCopy, r1, iReg
19450 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  );.}.../*.** Cle
19460 61 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61  ar all column ca
19470 63 68 65 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a  che entries..*/.
19480 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
19490 43 61 63 68 65 43 6c 65 61 72 28 50 61 72 73 65  CacheClear(Parse
194a0 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74   *pParse){.  int
194b0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
194c0 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 23 69 66 20  lCache *p;..#if 
194d0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
194e0 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  f( pParse->db->f
194f0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64  lags & SQLITE_Vd
19500 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a  beAddopTrace ){.
19510 20 20 20 20 70 72 69 6e 74 66 28 22 43 4c 45 41      printf("CLEA
19520 52 5c 6e 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  R\n");.  }.#endi
19530 66 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  f.  for(i=0, p=p
19540 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
19550 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
19560 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
19570 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65  {.    if( p->iRe
19580 67 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65  g ){.      cache
19590 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72 73  EntryClear(pPars
195a0 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, p);.    }.  }
195b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64  .}../*.** Record
195c0 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 61   the fact that a
195d0 6e 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67  n affinity chang
195e0 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 6f  e has occurred o
195f0 6e 20 69 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69  n iCount.** regi
19600 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 77  sters starting w
19610 69 74 68 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76  ith iStart..*/.v
19620 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
19630 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
19640 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
19650 2c 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69 6e  , int iStart, in
19660 74 20 69 43 6f 75 6e 74 29 7b 0a 20 20 73 71 6c  t iCount){.  sql
19670 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
19680 6f 76 65 28 70 50 61 72 73 65 2c 20 69 53 74 61  ove(pParse, iSta
19690 72 74 2c 20 69 43 6f 75 6e 74 29 3b 0a 7d 0a 0a  rt, iCount);.}..
196a0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
196b0 6f 64 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74  ode to move cont
196c0 65 6e 74 20 66 72 6f 6d 20 72 65 67 69 73 74 65  ent from registe
196d0 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d  rs iFrom...iFrom
196e0 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20  +nReg-1.** over 
196f0 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67  to iTo..iTo+nReg
19700 2d 31 2e 20 4b 65 65 70 20 74 68 65 20 63 6f 6c  -1. Keep the col
19710 75 6d 6e 20 63 61 63 68 65 20 75 70 2d 74 6f 2d  umn cache up-to-
19720 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  date..*/.void sq
19730 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
19740 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
19750 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20   int iFrom, int 
19760 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  iTo, int nReg){.
19770 20 20 61 73 73 65 72 74 28 20 69 46 72 6f 6d 3e    assert( iFrom>
19780 3d 69 54 6f 2b 6e 52 65 67 20 7c 7c 20 69 46 72  =iTo+nReg || iFr
19790 6f 6d 2b 6e 52 65 67 3c 3d 69 54 6f 20 29 3b 0a  om+nReg<=iTo );.
197a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
197b0 4f 70 33 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op3(pParse->pVdb
197c0 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f  e, OP_Move, iFro
197d0 6d 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a 20  m, iTo, nReg);. 
197e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
197f0 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20  eRemove(pParse, 
19800 69 46 72 6f 6d 2c 20 6e 52 65 67 29 3b 0a 7d 0a  iFrom, nReg);.}.
19810 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
19820 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65  ITE_DEBUG) || de
19830 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56  fined(SQLITE_COV
19840 45 52 41 47 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a  ERAGE_TEST)./*.*
19850 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
19860 20 61 6e 79 20 72 65 67 69 73 74 65 72 20 69 6e   any register in
19870 20 74 68 65 20 72 61 6e 67 65 20 69 46 72 6f 6d   the range iFrom
19880 2e 2e 69 54 6f 20 28 69 6e 63 6c 75 73 69 76 65  ..iTo (inclusive
19890 29 0a 2a 2a 20 69 73 20 75 73 65 64 20 61 73 20  ).** is used as 
198a0 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6c 75  part of the colu
198b0 6d 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  mn cache..**.** 
198c0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
198d0 75 73 65 64 20 77 69 74 68 69 6e 20 61 73 73 65  used within asse
198e0 72 74 28 29 20 61 6e 64 20 74 65 73 74 63 61 73  rt() and testcas
198f0 65 28 29 20 6d 61 63 72 6f 73 20 6f 6e 6c 79 0a  e() macros only.
19900 2a 2a 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ** and does not 
19910 61 70 70 65 61 72 20 69 6e 20 61 20 6e 6f 72 6d  appear in a norm
19920 61 6c 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61  al build..*/.sta
19930 74 69 63 20 69 6e 74 20 75 73 65 64 41 73 43 6f  tic int usedAsCo
19940 6c 75 6d 6e 43 61 63 68 65 28 50 61 72 73 65 20  lumnCache(Parse 
19950 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72  *pParse, int iFr
19960 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20  om, int iTo){.  
19970 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
19980 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20  yColCache *p;.  
19990 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
199a0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
199b0 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
199c0 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
199d0 20 20 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65    int r = p->iRe
199e0 67 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 46  g;.    if( r>=iF
199f0 72 6f 6d 20 26 26 20 72 3c 3d 69 54 6f 20 29 20  rom && r<=iTo ) 
19a00 72 65 74 75 72 6e 20 31 3b 20 20 20 20 2f 2a 4e  return 1;    /*N
19a10 4f 5f 54 45 53 54 2a 2f 0a 20 20 7d 0a 20 20 72  O_TEST*/.  }.  r
19a20 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
19a30 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
19a40 47 20 7c 7c 20 53 51 4c 49 54 45 5f 43 4f 56 45  G || SQLITE_COVE
19a50 52 41 47 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f  RAGE_TEST */.../
19a60 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20  *.** Convert an 
19a70 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
19a80 74 6f 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52  to a TK_REGISTER
19a90 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
19aa0 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 45  exprToRegister(E
19ab0 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 52 65 67  xpr *p, int iReg
19ac0 29 7b 0a 20 20 70 2d 3e 6f 70 32 20 3d 20 70 2d  ){.  p->op2 = p-
19ad0 3e 6f 70 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54  >op;.  p->op = T
19ae0 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 70 2d  K_REGISTER;.  p-
19af0 3e 69 54 61 62 6c 65 20 3d 20 69 52 65 67 3b 0a  >iTable = iReg;.
19b00 20 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65    ExprClearPrope
19b10 72 74 79 28 70 2c 20 45 50 5f 53 6b 69 70 29 3b  rty(p, EP_Skip);
19b20 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
19b30 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28  exprCodeBetween(
19b40 50 61 72 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74  Parse*,Expr*,int
19b50 2c 76 6f 69 64 28 2a 29 28 50 61 72 73 65 2a 2c  ,void(*)(Parse*,
19b60 45 78 70 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 69  Expr*,int,int),i
19b70 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  nt);../*.** Gene
19b80 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
19b90 68 65 20 63 75 72 72 65 6e 74 20 56 64 62 65 20  he current Vdbe 
19ba0 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
19bb0 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73  given.** express
19bc0 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74 20 74 6f  ion.  Attempt to
19bd0 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
19be0 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 22  ts in register "
19bf0 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75  target"..** Retu
19c00 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20  rn the register 
19c10 77 68 65 72 65 20 72 65 73 75 6c 74 73 20 61 72  where results ar
19c20 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  e stored..**.** 
19c30 57 69 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e  With this routin
19c40 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 67  e, there is no g
19c50 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 72 65  uarantee that re
19c60 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65  sults will.** be
19c70 20 73 74 6f 72 65 64 20 69 6e 20 74 61 72 67 65   stored in targe
19c80 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d  t.  The result m
19c90 69 67 68 74 20 62 65 20 73 74 6f 72 65 64 20 69  ight be stored i
19ca0 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  n some other.** 
19cb0 72 65 67 69 73 74 65 72 20 69 66 20 69 74 20 69  register if it i
19cc0 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20  s convenient to 
19cd0 64 6f 20 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c  do so.  The call
19ce0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ing function.** 
19cf0 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 72  must check the r
19d00 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d  eturn code and m
19d10 6f 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ove the results 
19d20 74 6f 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a  to the desired.*
19d30 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69  * register..*/.i
19d40 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
19d50 64 65 54 61 72 67 65 74 28 50 61 72 73 65 20 2a  deTarget(Parse *
19d60 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
19d70 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
19d80 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
19d90 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a  arse->pVdbe;  /*
19da0 20 54 68 65 20 56 4d 20 75 6e 64 65 72 20 63 6f   The VM under co
19db0 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
19dc0 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
19dd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
19de0 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f   opcode being co
19df0 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52  ded */.  int inR
19e00 65 67 20 3d 20 74 61 72 67 65 74 3b 20 20 20 20  eg = target;    
19e10 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 73 74     /* Results st
19e20 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72  ored in register
19e30 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20   inReg */.  int 
19e40 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 20 20  regFree1 = 0;   
19e50 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d        /* If non-
19e60 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20 74  zero free this t
19e70 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
19e80 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72  r */.  int regFr
19e90 65 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ee2 = 0;        
19ea0 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20   /* If non-zero 
19eb0 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72  free this tempor
19ec0 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ary register */.
19ed0 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 20 20 20    int r1, r2;   
19ee0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
19ef0 61 72 69 6f 75 73 20 72 65 67 69 73 74 65 72 20  arious register 
19f00 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20 73 71 6c  numbers */.  sql
19f10 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
19f20 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64 61  e->db; /* The da
19f30 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
19f40 6e 20 2a 2f 0a 20 20 45 78 70 72 20 74 65 6d 70  n */.  Expr temp
19f50 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
19f60 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 65 78   /* Temporary ex
19f70 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 2a 2f  pression node */
19f80 0a 20 20 69 6e 74 20 70 35 20 3d 20 30 3b 0a 0a  .  int p5 = 0;..
19f90 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
19fa0 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50  >0 && target<=pP
19fb0 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20  arse->nMem );.  
19fc0 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20  if( v==0 ){.    
19fd0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
19fe0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
19ff0 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   );.    return 0
1a000 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 45 78  ;.  }..  if( pEx
1a010 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20  pr==0 ){.    op 
1a020 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c  = TK_NULL;.  }el
1a030 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78  se{.    op = pEx
1a040 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77  pr->op;.  }.  sw
1a050 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
1a060 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
1a070 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49  MN: {.      AggI
1a080 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20  nfo *pAggInfo = 
1a090 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b  pExpr->pAggInfo;
1a0a0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67  .      struct Ag
1a0b0 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20  gInfo_col *pCol 
1a0c0 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  = &pAggInfo->aCo
1a0d0 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a  l[pExpr->iAgg];.
1a0e0 20 20 20 20 20 20 69 66 28 20 21 70 41 67 67 49        if( !pAggI
1a0f0 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20  nfo->directMode 
1a100 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1a110 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20  t( pCol->iMem>0 
1a120 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  );.        inReg
1a130 20 3d 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20   = pCol->iMem;. 
1a140 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1a150 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41      }else if( pA
1a160 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69  ggInfo->useSorti
1a170 6e 67 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20  ngIdx ){.       
1a180 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a190 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
1a1a0 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69   pAggInfo->sorti
1a1b0 6e 67 49 64 78 50 54 61 62 2c 0a 20 20 20 20 20  ngIdxPTab,.     
1a1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1d0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
1a1e0 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61  SorterColumn, ta
1a1f0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62  rget);.        b
1a200 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1a210 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65      /* Otherwise
1a220 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f  , fall thru into
1a230 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63   the TK_COLUMN c
1a240 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ase */.    }.   
1a250 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
1a260 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61   {.      int iTa
1a270 62 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  b = pExpr->iTabl
1a280 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 61  e;.      if( iTa
1a290 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  b<0 ){.        i
1a2a0 66 28 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73  f( pParse->ckBas
1a2b0 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  e>0 ){.         
1a2c0 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 43   /* Generating C
1a2d0 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73  HECK constraints
1a2e0 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 69 6e   or inserting in
1a2f0 74 6f 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78  to partial index
1a300 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e   */.          in
1a310 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  Reg = pExpr->iCo
1a320 6c 75 6d 6e 20 2b 20 70 50 61 72 73 65 2d 3e 63  lumn + pParse->c
1a330 6b 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20  kBase;.         
1a340 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1a350 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1a360 20 2f 2a 20 43 6f 64 69 6e 67 20 61 6e 20 65 78   /* Coding an ex
1a370 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73  pression that is
1a380 20 70 61 72 74 20 6f 66 20 61 6e 20 69 6e 64 65   part of an inde
1a390 78 20 77 68 65 72 65 20 63 6f 6c 75 6d 6e 20 6e  x where column n
1a3a0 61 6d 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ames.          *
1a3b0 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 72  * in the index r
1a3c0 65 66 65 72 20 74 6f 20 74 68 65 20 74 61 62 6c  efer to the tabl
1a3d0 65 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 69  e to which the i
1a3e0 6e 64 65 78 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a  ndex belongs */.
1a3f0 20 20 20 20 20 20 20 20 20 20 69 54 61 62 20 3d            iTab =
1a400 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61   pParse->iSelfTa
1a410 62 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  b;.        }.   
1a420 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67     }.      inReg
1a430 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1a440 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72  deGetColumn(pPar
1a450 73 65 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c  se, pExpr->pTab,
1a460 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a480 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20  pExpr->iColumn, 
1a490 69 54 61 62 2c 20 74 61 72 67 65 74 2c 0a 20 20  iTab, target,.  
1a4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
1a4c0 70 72 2d 3e 6f 70 32 29 3b 0a 20 20 20 20 20 20  pr->op2);.      
1a4d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1a4e0 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
1a4f0 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e  : {.      codeIn
1a500 74 65 67 65 72 28 70 50 61 72 73 65 2c 20 70 45  teger(pParse, pE
1a510 78 70 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  xpr, 0, target);
1a520 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1a530 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1a540 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
1a550 5f 50 4f 49 4e 54 0a 20 20 20 20 63 61 73 65 20  _POINT.    case 
1a560 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20  TK_FLOAT: {.    
1a570 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1a580 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1a590 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
1a5a0 3b 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c  ;.      codeReal
1a5b0 28 76 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  (v, pExpr->u.zTo
1a5c0 6b 65 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ken, 0, target);
1a5d0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1a5e0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
1a5f0 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b  ase TK_STRING: {
1a600 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1a610 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1a620 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
1a630 75 65 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ue) );.      sql
1a640 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69  ite3VdbeLoadStri
1a650 6e 67 28 76 2c 20 74 61 72 67 65 74 2c 20 70 45  ng(v, target, pE
1a660 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
1a670 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1a680 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
1a690 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ULL: {.      sql
1a6a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a6b0 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
1a6c0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65  rget);.      bre
1a6d0 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
1a6e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c  f SQLITE_OMIT_BL
1a6f0 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63  OB_LITERAL.    c
1a700 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20  ase TK_BLOB: {. 
1a710 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
1a720 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
1a730 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c  .      char *zBl
1a740 6f 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ob;.      assert
1a750 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1a760 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
1a770 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
1a780 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
1a790 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20  .zToken[0]=='x' 
1a7a0 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  || pExpr->u.zTok
1a7b0 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20  en[0]=='X' );.  
1a7c0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1a7d0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d  r->u.zToken[1]==
1a7e0 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 20  '\'' );.      z 
1a7f0 3d 20 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  = &pExpr->u.zTok
1a800 65 6e 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d  en[2];.      n =
1a810 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
1a820 28 7a 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 61  (z) - 1;.      a
1a830 73 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27  ssert( z[n]=='\'
1a840 27 20 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62  ' );.      zBlob
1a850 20 3d 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42   = sqlite3HexToB
1a860 6c 6f 62 28 73 71 6c 69 74 65 33 56 64 62 65 44  lob(sqlite3VdbeD
1a870 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  b(v), z, n);.   
1a880 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a890 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c  dOp4(v, OP_Blob,
1a8a0 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c   n/2, target, 0,
1a8b0 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d   zBlob, P4_DYNAM
1a8c0 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  IC);.      break
1a8d0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1a8e0 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41     case TK_VARIA
1a8f0 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  BLE: {.      ass
1a900 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1a910 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1a920 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
1a930 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1a940 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b  ->u.zToken!=0 );
1a950 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1a960 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
1a970 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  ]!=0 );.      sq
1a980 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a990 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20  v, OP_Variable, 
1a9a0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20  pExpr->iColumn, 
1a9b0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69  target);.      i
1a9c0 66 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  f( pExpr->u.zTok
1a9d0 65 6e 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20  en[1]!=0 ){.    
1a9e0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1a9f0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  r->u.zToken[0]==
1aa00 27 3f 27 20 0a 20 20 20 20 20 20 20 20 20 20 20  '?' .           
1aa10 20 20 7c 7c 20 73 74 72 63 6d 70 28 70 45 78 70    || strcmp(pExp
1aa20 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 50 61  r->u.zToken, pPa
1aa30 72 73 65 2d 3e 61 7a 56 61 72 5b 70 45 78 70 72  rse->azVar[pExpr
1aa40 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 29 3d 3d 30  ->iColumn-1])==0
1aa50 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
1aa60 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
1aa70 76 2c 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e 61  v, -1, pParse->a
1aa80 7a 56 61 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  zVar[pExpr->iCol
1aa90 75 6d 6e 2d 31 5d 2c 20 50 34 5f 53 54 41 54 49  umn-1], P4_STATI
1aaa0 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  C);.      }.    
1aab0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1aac0 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53     case TK_REGIS
1aad0 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52  TER: {.      inR
1aae0 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  eg = pExpr->iTab
1aaf0 6c 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  le;.      break;
1ab00 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
1ab10 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a  QLITE_OMIT_CAST.
1ab20 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54      case TK_CAST
1ab30 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70  : {.      /* Exp
1ab40 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  ressions of the 
1ab50 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65  form:   CAST(pLe
1ab60 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a  ft AS token) */.
1ab70 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71        inReg = sq
1ab80 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
1ab90 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
1aba0 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74  r->pLeft, target
1abb0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52  );.      if( inR
1abc0 65 67 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20  eg!=target ){.  
1abd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1abe0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
1abf0 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67  opy, inReg, targ
1ac00 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52  et);.        inR
1ac10 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20  eg = target;.   
1ac20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1ac30 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1ac40 4f 50 5f 43 61 73 74 2c 20 74 61 72 67 65 74 2c  OP_Cast, target,
1ac50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ac60 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1ac70 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 45 78  AffinityType(pEx
1ac80 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29  pr->u.zToken, 0)
1ac90 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1aca0 65 28 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43  e( usedAsColumnC
1acb0 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 6e 52  ache(pParse, inR
1acc0 65 67 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20 20  eg, inReg) );.  
1acd0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1ace0 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
1acf0 67 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67  ge(pParse, inReg
1ad00 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 1);.      brea
1ad10 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
1ad20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
1ad30 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  AST */.    case 
1ad40 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20  TK_IS:.    case 
1ad50 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20  TK_ISNOT:.      
1ad60 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29  op = (op==TK_IS)
1ad70 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45   ? TK_EQ : TK_NE
1ad80 3b 0a 20 20 20 20 20 20 70 35 20 3d 20 53 51 4c  ;.      p5 = SQL
1ad90 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20  ITE_NULLEQ;.    
1ada0 20 20 2f 2a 20 66 61 6c 6c 2d 74 68 72 6f 75 67    /* fall-throug
1adb0 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  h */.    case TK
1adc0 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LT:.    case TK
1add0 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LE:.    case TK
1ade0 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GT:.    case TK
1adf0 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GE:.    case TK
1ae00 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _NE:.    case TK
1ae10 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  _EQ: {.      Exp
1ae20 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
1ae30 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 69  ->pLeft;.      i
1ae40 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
1ae50 56 65 63 74 6f 72 28 70 4c 65 66 74 29 20 29 7b  Vector(pLeft) ){
1ae60 0a 20 20 20 20 20 20 20 20 63 6f 64 65 56 65 63  .        codeVec
1ae70 74 6f 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73  torCompare(pPars
1ae80 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
1ae90 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1aea0 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
1aeb0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1aec0 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
1aed0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1aee0 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
1aef0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1af00 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
1af10 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
1af20 20 20 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70          codeComp
1af30 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  are(pParse, pLef
1af40 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
1af50 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
1af60 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c    r1, r2, inReg,
1af70 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20   SQLITE_STOREP2 
1af80 7c 20 70 35 29 3b 0a 20 20 20 20 20 20 20 20 61  | p5);.        a
1af90 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f  ssert(TK_LT==OP_
1afa0 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Lt); testcase(op
1afb0 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f  ==OP_Lt); VdbeCo
1afc0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1afd0 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 20 20 61  P_Lt);.        a
1afe0 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f  ssert(TK_LE==OP_
1aff0 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Le); testcase(op
1b000 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f  ==OP_Le); VdbeCo
1b010 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1b020 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 20 20 61  P_Le);.        a
1b030 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f  ssert(TK_GT==OP_
1b040 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Gt); testcase(op
1b050 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f  ==OP_Gt); VdbeCo
1b060 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1b070 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 20 20 61  P_Gt);.        a
1b080 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f  ssert(TK_GE==OP_
1b090 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ge); testcase(op
1b0a0 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ge); VdbeCo
1b0b0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1b0c0 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 20 20 61  P_Ge);.        a
1b0d0 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f  ssert(TK_EQ==OP_
1b0e0 45 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Eq); testcase(op
1b0f0 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43 6f  ==OP_Eq); VdbeCo
1b100 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1b110 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 20 20 61  P_Eq);.        a
1b120 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f  ssert(TK_NE==OP_
1b130 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ne); testcase(op
1b140 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ne); VdbeCo
1b150 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1b160 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 20 20 74  P_Ne);.        t
1b170 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1b180 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1==0 );.        
1b190 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1b1a0 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  e2==0 );.      }
1b1b0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1b1c0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1b1d0 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  AND:.    case TK
1b1e0 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _OR:.    case TK
1b1f0 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20  _PLUS:.    case 
1b200 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73  TK_STAR:.    cas
1b210 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20  e TK_MINUS:.    
1b220 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20  case TK_REM:.   
1b230 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a   case TK_BITAND:
1b240 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
1b250 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OR:.    case TK_
1b260 53 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65 20  SLASH:.    case 
1b270 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63  TK_LSHIFT:.    c
1b280 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a  ase TK_RSHIFT: .
1b290 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43      case TK_CONC
1b2a0 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  AT: {.      asse
1b2b0 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41  rt( TK_AND==OP_A
1b2c0 6e 64 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  nd );           
1b2d0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1b2e0 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61  K_AND );.      a
1b2f0 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50  ssert( TK_OR==OP
1b300 5f 4f 72 20 29 3b 20 20 20 20 20 20 20 20 20 20  _Or );          
1b310 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1b320 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20  ==TK_OR );.     
1b330 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c 55 53   assert( TK_PLUS
1b340 3d 3d 4f 50 5f 41 64 64 20 29 3b 20 20 20 20 20  ==OP_Add );     
1b350 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1b360 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20  op==TK_PLUS );. 
1b370 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1b380 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61  MINUS==OP_Subtra
1b390 63 74 20 29 3b 20 20 20 20 20 74 65 73 74 63 61  ct );     testca
1b3a0 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53  se( op==TK_MINUS
1b3b0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1b3c0 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d  ( TK_REM==OP_Rem
1b3d0 61 69 6e 64 65 72 20 29 3b 20 20 20 20 20 20 74  ainder );      t
1b3e0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1b3f0 52 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73  REM );.      ass
1b400 65 72 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d  ert( TK_BITAND==
1b410 4f 50 5f 42 69 74 41 6e 64 20 29 3b 20 20 20 20  OP_BitAnd );    
1b420 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1b430 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20 20  TK_BITAND );.   
1b440 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
1b450 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b  TOR==OP_BitOr );
1b460 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1b470 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29  ( op==TK_BITOR )
1b480 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1b490 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76  TK_SLASH==OP_Div
1b4a0 69 64 65 20 29 3b 20 20 20 20 20 20 20 74 65 73  ide );       tes
1b4b0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c  tcase( op==TK_SL
1b4c0 41 53 48 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ASH );.      ass
1b4d0 65 72 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d  ert( TK_LSHIFT==
1b4e0 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 20  OP_ShiftLeft ); 
1b4f0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1b500 54 4b 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20 20  TK_LSHIFT );.   
1b510 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53     assert( TK_RS
1b520 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69  HIFT==OP_ShiftRi
1b530 67 68 74 20 29 3b 20 20 74 65 73 74 63 61 73 65  ght );  testcase
1b540 28 20 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20  ( op==TK_RSHIFT 
1b550 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1b560 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43   TK_CONCAT==OP_C
1b570 6f 6e 63 61 74 20 29 3b 20 20 20 20 20 20 74 65  oncat );      te
1b580 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43  stcase( op==TK_C
1b590 4f 4e 43 41 54 20 29 3b 0a 20 20 20 20 20 20 72  ONCAT );.      r
1b5a0 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1b5b0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1b5c0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
1b5d0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1b5e0 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
1b5f0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1b600 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1b610 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
1b620 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b630 4f 70 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72  Op3(v, op, r2, r
1b640 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
1b650 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1b660 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1b670 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1b680 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
1b690 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1b6a0 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
1b6b0 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70   {.      Expr *p
1b6c0 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
1b6d0 65 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  eft;.      asser
1b6e0 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20 20  t( pLeft );.    
1b6f0 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d    if( pLeft->op=
1b700 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20  =TK_INTEGER ){. 
1b710 20 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67         codeInteg
1b720 65 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  er(pParse, pLeft
1b730 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 23 69  , 1, target);.#i
1b740 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1b750 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
1b760 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1b770 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46   pLeft->op==TK_F
1b780 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LOAT ){.        
1b790 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1b7a0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1b7b0 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
1b7c0 20 20 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c          codeReal
1b7d0 28 76 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f  (v, pLeft->u.zTo
1b7e0 6b 65 6e 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  ken, 1, target);
1b7f0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65  .#endif.      }e
1b800 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 6d  lse{.        tem
1b810 70 58 2e 6f 70 20 3d 20 54 4b 5f 49 4e 54 45 47  pX.op = TK_INTEG
1b820 45 52 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70  ER;.        temp
1b830 58 2e 66 6c 61 67 73 20 3d 20 45 50 5f 49 6e 74  X.flags = EP_Int
1b840 56 61 6c 75 65 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  Value|EP_TokenOn
1b850 6c 79 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70  ly;.        temp
1b860 58 2e 75 2e 69 56 61 6c 75 65 20 3d 20 30 3b 0a  X.u.iValue = 0;.
1b870 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
1b880 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1b890 28 70 50 61 72 73 65 2c 20 26 74 65 6d 70 58 2c  (pParse, &tempX,
1b8a0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1b8b0 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
1b8c0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1b8d0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1b8e0 66 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ft, &regFree2);.
1b8f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1b900 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1b910 53 75 62 74 72 61 63 74 2c 20 72 32 2c 20 72 31  Subtract, r2, r1
1b920 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1b930 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1b940 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
1b950 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20    }.      inReg 
1b960 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20  = target;.      
1b970 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1b980 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a   case TK_BITNOT:
1b990 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
1b9a0 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
1b9b0 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f  ( TK_BITNOT==OP_
1b9c0 42 69 74 4e 6f 74 20 29 3b 20 20 20 74 65 73 74  BitNot );   test
1b9d0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54  case( op==TK_BIT
1b9e0 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73  NOT );.      ass
1b9f0 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f  ert( TK_NOT==OP_
1ba00 4e 6f 74 20 29 3b 20 20 20 20 20 20 20 20 20 74  Not );         t
1ba10 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1ba20 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20  NOT );.      r1 
1ba30 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1ba40 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1ba50 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1ba60 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65  Free1);.      te
1ba70 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1ba80 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 6e 52  ==0 );.      inR
1ba90 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20  eg = target;.   
1baa0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1bab0 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20  dOp2(v, op, r1, 
1bac0 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72  inReg);.      br
1bad0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1bae0 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
1baf0 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
1bb00 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  LL: {.      int 
1bb10 61 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65  addr;.      asse
1bb20 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f  rt( TK_ISNULL==O
1bb30 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65  P_IsNull );   te
1bb40 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
1bb50 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61  SNULL );.      a
1bb60 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c  ssert( TK_NOTNUL
1bb70 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  L==OP_NotNull );
1bb80 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1bb90 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20  K_NOTNULL );.   
1bba0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1bbb0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
1bbc0 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a  er, 1, target);.
1bbd0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1bbe0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1bbf0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1bc00 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1bc10 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1bc20 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1bc30 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
1bc40 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
1bc50 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20 20  , op, r1);.     
1bc60 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1bc70 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  v, op==TK_ISNULL
1bc80 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
1bc90 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
1bca0 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20  K_NOTNULL);.    
1bcb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1bcc0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1bcd0 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 0, target);. 
1bce0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1bcf0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
1bd00 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1bd10 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1bd20 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20  K_AGG_FUNCTION: 
1bd30 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20  {.      AggInfo 
1bd40 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e  *pInfo = pExpr->
1bd50 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
1bd60 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a  if( pInfo==0 ){.
1bd70 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1bd80 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1bd90 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1bda0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
1bdb0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1bdc0 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20  pParse, "misuse 
1bdd0 6f 66 20 61 67 67 72 65 67 61 74 65 3a 20 25 73  of aggregate: %s
1bde0 28 29 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ()", pExpr->u.zT
1bdf0 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  oken);.      }el
1be00 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 52 65  se{.        inRe
1be10 67 20 3d 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63  g = pInfo->aFunc
1be20 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d  [pExpr->iAgg].iM
1be30 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  em;.      }.    
1be40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1be50 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
1be60 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  ION: {.      Exp
1be70 72 4c 69 73 74 20 2a 70 46 61 72 67 3b 20 20 20  rList *pFarg;   
1be80 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66      /* List of f
1be90 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
1bea0 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  s */.      int n
1beb0 46 61 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  Farg;           
1bec0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
1bed0 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
1bee0 73 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63 44  s */.      FuncD
1bef0 65 66 20 2a 70 44 65 66 3b 20 20 20 20 20 20 20  ef *pDef;       
1bf00 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f    /* The functio
1bf10 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 62 6a  n definition obj
1bf20 65 63 74 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  ect */.      con
1bf30 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20  st char *zId;   
1bf40 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74      /* The funct
1bf50 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ion name */.    
1bf60 20 20 75 33 32 20 63 6f 6e 73 74 4d 61 73 6b 20    u32 constMask 
1bf70 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4d 61 73 6b  = 0;     /* Mask
1bf80 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67   of function arg
1bf90 75 6d 65 6e 74 73 20 74 68 61 74 20 61 72 65 20  uments that are 
1bfa0 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 20 20  constant */.    
1bfb0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
1bfc0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
1bfd0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
1bfe0 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64    u8 enc = ENC(d
1bff0 62 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  b);      /* The 
1c000 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 75 73  text encoding us
1c010 65 64 20 62 79 20 74 68 69 73 20 64 61 74 61 62  ed by this datab
1c020 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c  ase */.      Col
1c030 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b  lSeq *pColl = 0;
1c040 20 20 20 20 2f 2a 20 41 20 63 6f 6c 6c 61 74 69      /* A collati
1c050 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a  ng sequence */..
1c060 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1c070 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1c080 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
1c090 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ct) );.      if(
1c0a0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
1c0b0 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e  (pExpr, EP_Token
1c0c0 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20  Only) ){.       
1c0d0 20 70 46 61 72 67 20 3d 20 30 3b 0a 20 20 20 20   pFarg = 0;.    
1c0e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c0f0 20 70 46 61 72 67 20 3d 20 70 45 78 70 72 2d 3e   pFarg = pExpr->
1c100 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d  x.pList;.      }
1c110 0a 20 20 20 20 20 20 6e 46 61 72 67 20 3d 20 70  .      nFarg = p
1c120 46 61 72 67 20 3f 20 70 46 61 72 67 2d 3e 6e 45  Farg ? pFarg->nE
1c130 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 61  xpr : 0;.      a
1c140 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1c150 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1c160 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
1c170 20 20 20 20 20 7a 49 64 20 3d 20 70 45 78 70 72       zId = pExpr
1c180 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
1c190 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
1c1a0 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  FindFunction(db,
1c1b0 20 7a 49 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63   zId, nFarg, enc
1c1c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
1c1d0 70 44 65 66 3d 3d 30 20 7c 7c 20 70 44 65 66 2d  pDef==0 || pDef-
1c1e0 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29 7b  >xFinalize!=0 ){
1c1f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1c200 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1c210 20 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74 69   "unknown functi
1c220 6f 6e 3a 20 25 73 28 29 22 2c 20 7a 49 64 29 3b  on: %s()", zId);
1c230 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1c240 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
1c250 2a 20 41 74 74 65 6d 70 74 20 61 20 64 69 72 65  * Attempt a dire
1c260 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ct implementatio
1c270 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 74 2d 69  n of the built-i
1c280 6e 20 43 4f 41 4c 45 53 43 45 28 29 20 61 6e 64  n COALESCE() and
1c290 0a 20 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c 4c  .      ** IFNULL
1c2a0 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54  () functions.  T
1c2b0 68 69 73 20 61 76 6f 69 64 73 20 75 6e 6e 65 63  his avoids unnec
1c2c0 65 73 73 61 72 79 20 65 76 61 6c 75 61 74 69 6f  essary evaluatio
1c2d0 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61 72  n of.      ** ar
1c2e0 67 75 6d 65 6e 74 73 20 70 61 73 74 20 74 68 65  guments past the
1c2f0 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20   first non-NULL 
1c300 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20  argument..      
1c310 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  */.      if( pDe
1c320 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
1c330 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45  QLITE_FUNC_COALE
1c340 53 43 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69  SCE ){.        i
1c350 6e 74 20 65 6e 64 43 6f 61 6c 65 73 63 65 20 3d  nt endCoalesce =
1c360 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1c370 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
1c380 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e    assert( nFarg>
1c390 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  =2 );.        sq
1c3a0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1c3b0 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30  arse, pFarg->a[0
1c3c0 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
1c3d0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
1c3e0 31 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29  1; i<nFarg; i++)
1c3f0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
1c400 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1c410 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72   OP_NotNull, tar
1c420 67 65 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65  get, endCoalesce
1c430 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
1c440 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1c450 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1c460 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70  xprCacheRemove(p
1c470 50 61 72 73 65 2c 20 74 61 72 67 65 74 2c 20 31  Parse, target, 1
1c480 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
1c490 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
1c4a0 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
1c4b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1c4c0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61  Code(pParse, pFa
1c4d0 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  rg->a[i].pExpr, 
1c4e0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
1c4f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1c500 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
1c510 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c520 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1c530 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
1c540 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20  Coalesce);.     
1c550 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1c560 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  }..      /* The 
1c570 55 4e 4c 49 4b 45 4c 59 28 29 20 66 75 6e 63 74  UNLIKELY() funct
1c580 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
1c590 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 74   The result is t
1c5a0 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a  he value.      *
1c5b0 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 61  * of the first a
1c5c0 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a  rgument..      *
1c5d0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  /.      if( pDef
1c5e0 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
1c5f0 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45  LITE_FUNC_UNLIKE
1c600 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  LY ){.        as
1c610 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 31 20 29  sert( nFarg>=1 )
1c620 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20  ;.        inReg 
1c630 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1c640 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
1c650 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
1c660 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
1c670 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1c680 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   }..      for(i=
1c690 30 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29  0; i<nFarg; i++)
1c6a0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c  {.        if( i<
1c6b0 33 32 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  32 && sqlite3Exp
1c6c0 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 46 61 72  rIsConstant(pFar
1c6d0 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  g->a[i].pExpr) )
1c6e0 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  {.          test
1c6f0 63 61 73 65 28 20 69 3d 3d 33 31 20 29 3b 0a 20  case( i==31 );. 
1c700 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61           constMa
1c710 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 33 32 28  sk |= MASKBIT32(
1c720 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i);.        }.  
1c730 20 20 20 20 20 20 69 66 28 20 28 70 44 65 66 2d        if( (pDef-
1c740 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
1c750 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c  ITE_FUNC_NEEDCOL
1c760 4c 29 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c 20  L)!=0 && !pColl 
1c770 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  ){.          pCo
1c780 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
1c790 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1c7a0 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70  pFarg->a[i].pExp
1c7b0 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
1c7c0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1c7d0 70 46 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20  pFarg ){.       
1c7e0 20 69 66 28 20 63 6f 6e 73 74 4d 61 73 6b 20 29   if( constMask )
1c7f0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 31 20 3d  {.          r1 =
1c800 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
1c810 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73  .          pPars
1c820 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 46 61 72 67  e->nMem += nFarg
1c830 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1c840 0a 20 20 20 20 20 20 20 20 20 20 72 31 20 3d 20  .          r1 = 
1c850 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
1c860 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 46 61 72  nge(pParse, nFar
1c870 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  g);.        }.. 
1c880 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 65         /* For le
1c890 6e 67 74 68 28 29 20 61 6e 64 20 74 79 70 65 6f  ngth() and typeo
1c8a0 66 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 77 69  f() functions wi
1c8b0 74 68 20 61 20 63 6f 6c 75 6d 6e 20 61 72 67 75  th a column argu
1c8c0 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a  ment,.        **
1c8d0 20 73 65 74 20 74 68 65 20 50 35 20 70 61 72 61   set the P5 para
1c8e0 6d 65 74 65 72 20 74 6f 20 74 68 65 20 4f 50 5f  meter to the OP_
1c8f0 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 74 6f  Column opcode to
1c900 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52   OPFLAG_LENGTHAR
1c910 47 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20  G.        ** or 
1c920 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47  OPFLAG_TYPEOFARG
1c930 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20 74   respectively, t
1c940 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73  o avoid unnecess
1c950 61 72 79 20 64 61 74 61 0a 20 20 20 20 20 20 20  ary data.       
1c960 20 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20 20 20   ** loading..   
1c970 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1c980 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46  if( (pDef->funcF
1c990 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 46  lags & (SQLITE_F
1c9a0 55 4e 43 5f 4c 45 4e 47 54 48 7c 53 51 4c 49 54  UNC_LENGTH|SQLIT
1c9b0 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 29 29 21  E_FUNC_TYPEOF))!
1c9c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1c9d0 75 38 20 65 78 70 72 4f 70 3b 0a 20 20 20 20 20  u8 exprOp;.     
1c9e0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61       assert( nFa
1c9f0 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  rg==1 );.       
1ca00 20 20 20 61 73 73 65 72 74 28 20 70 46 61 72 67     assert( pFarg
1ca10 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20  ->a[0].pExpr!=0 
1ca20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70  );.          exp
1ca30 72 4f 70 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30  rOp = pFarg->a[0
1ca40 5d 2e 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20  ].pExpr->op;.   
1ca50 20 20 20 20 20 20 20 69 66 28 20 65 78 70 72 4f         if( exprO
1ca60 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p==TK_COLUMN || 
1ca70 65 78 70 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43  exprOp==TK_AGG_C
1ca80 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20  OLUMN ){.       
1ca90 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c       assert( SQL
1caa0 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 3d  ITE_FUNC_LENGTH=
1cab0 3d 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52  =OPFLAG_LENGTHAR
1cac0 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  G );.           
1cad0 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
1cae0 46 55 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f 50 46  FUNC_TYPEOF==OPF
1caf0 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20 29 3b  LAG_TYPEOFARG );
1cb00 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
1cb10 74 63 61 73 65 28 20 70 44 65 66 2d 3e 66 75 6e  tcase( pDef->fun
1cb20 63 46 6c 61 67 73 20 26 20 4f 50 46 4c 41 47 5f  cFlags & OPFLAG_
1cb30 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20  LENGTHARG );.   
1cb40 20 20 20 20 20 20 20 20 20 70 46 61 72 67 2d 3e           pFarg->
1cb50 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 32 20  a[0].pExpr->op2 
1cb60 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
1cb70 20 20 20 20 20 70 44 65 66 2d 3e 66 75 6e 63 46       pDef->funcF
1cb80 6c 61 67 73 20 26 20 28 4f 50 46 4c 41 47 5f 4c  lags & (OPFLAG_L
1cb90 45 4e 47 54 48 41 52 47 7c 4f 50 46 4c 41 47 5f  ENGTHARG|OPFLAG_
1cba0 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 20 20  TYPEOFARG);.    
1cbb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1cbc0 7d 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  }..        sqlit
1cbd0 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
1cbe0 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20  pParse);     /* 
1cbf0 54 69 63 6b 65 74 20 32 65 61 32 34 32 35 64 33  Ticket 2ea2425d3
1cc00 34 62 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  4be */.        s
1cc10 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
1cc20 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
1cc30 46 61 72 67 2c 20 72 31 2c 20 30 2c 0a 20 20 20  Farg, r1, 0,.   
1cc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc50 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
1cc60 49 54 45 5f 45 43 45 4c 5f 44 55 50 7c 53 51 4c  ITE_ECEL_DUP|SQL
1cc70 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29  ITE_ECEL_FACTOR)
1cc80 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1cc90 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
1cca0 61 72 73 65 29 3b 20 20 20 20 20 20 2f 2a 20 54  arse);      /* T
1ccb0 69 63 6b 65 74 20 32 65 61 32 34 32 35 64 33 34  icket 2ea2425d34
1ccc0 62 65 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73  be */.      }els
1ccd0 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  e{.        r1 = 
1cce0 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  0;.      }.#ifnd
1ccf0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
1cd00 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
1cd10 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76    /* Possibly ov
1cd20 65 72 6c 6f 61 64 20 74 68 65 20 66 75 6e 63 74  erload the funct
1cd30 69 6f 6e 20 69 66 20 74 68 65 20 66 69 72 73 74  ion if the first
1cd40 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 20 20 20   argument is.   
1cd50 20 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20     ** a virtual 
1cd60 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20  table column..  
1cd70 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
1cd80 46 6f 72 20 69 6e 66 69 78 20 66 75 6e 63 74 69  For infix functi
1cd90 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c  ons (LIKE, GLOB,
1cda0 20 52 45 47 45 58 50 2c 20 61 6e 64 20 4d 41 54   REGEXP, and MAT
1cdb0 43 48 29 20 75 73 65 20 74 68 65 0a 20 20 20 20  CH) use the.    
1cdc0 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75    ** second argu
1cdd0 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66 69  ment, not the fi
1cde0 72 73 74 2c 20 61 73 20 74 68 65 20 61 72 67 75  rst, as the argu
1cdf0 6d 65 6e 74 20 74 6f 20 74 65 73 74 20 74 6f 0a  ment to test to.
1ce00 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20        ** see if 
1ce10 69 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69  it is a column i
1ce20 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  n a virtual tabl
1ce30 65 2e 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65  e.  This is done
1ce40 20 62 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a   because.      *
1ce50 2a 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61  * the left opera
1ce60 6e 64 20 6f 66 20 69 6e 66 69 78 20 66 75 6e 63  nd of infix func
1ce70 74 69 6f 6e 73 20 28 74 68 65 20 6f 70 65 72 61  tions (the opera
1ce80 6e 64 20 77 65 20 77 61 6e 74 20 74 6f 0a 20 20  nd we want to.  
1ce90 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f      ** control o
1cea0 76 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73  verloading) ends
1ceb0 20 75 70 20 61 73 20 74 68 65 20 73 65 63 6f 6e   up as the secon
1cec0 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
1ced0 65 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74  e.      ** funct
1cee0 69 6f 6e 2e 20 20 54 68 65 20 65 78 70 72 65 73  ion.  The expres
1cef0 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22 20  sion "A glob B" 
1cf00 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
1cf10 20 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62   .      ** "glob
1cf20 28 42 2c 41 29 2e 20 20 57 65 20 77 61 6e 74 20  (B,A).  We want 
1cf30 74 6f 20 75 73 65 20 74 68 65 20 41 20 69 6e 20  to use the A in 
1cf40 22 41 20 67 6c 6f 62 20 42 22 20 74 6f 20 74 65  "A glob B" to te
1cf50 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  st.      ** for 
1cf60 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61  function overloa
1cf70 64 69 6e 67 2e 20 20 42 75 74 20 77 65 20 75 73  ding.  But we us
1cf80 65 20 74 68 65 20 42 20 74 65 72 6d 20 69 6e 20  e the B term in 
1cf90 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20  "glob(B,A)"..   
1cfa0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
1cfb0 6e 46 61 72 67 3e 3d 32 20 26 26 20 28 70 45 78  nFarg>=2 && (pEx
1cfc0 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49  pr->flags & EP_I
1cfd0 6e 66 69 78 46 75 6e 63 29 20 29 7b 0a 20 20 20  nfixFunc) ){.   
1cfe0 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
1cff0 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46  te3VtabOverloadF
1d000 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66  unction(db, pDef
1d010 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e  , nFarg, pFarg->
1d020 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[1].pExpr);.   
1d030 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 61     }else if( nFa
1d040 72 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  rg>0 ){.        
1d050 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74  pDef = sqlite3Vt
1d060 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69  abOverloadFuncti
1d070 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61  on(db, pDef, nFa
1d080 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  rg, pFarg->a[0].
1d090 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
1d0a0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
1d0b0 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73   pDef->funcFlags
1d0c0 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e   & SQLITE_FUNC_N
1d0d0 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20  EEDCOLL ){.     
1d0e0 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
1d0f0 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
1d100 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20  tColl; .        
1d110 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d120 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c  4(v, OP_CollSeq,
1d130 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20   0, 0, 0, (char 
1d140 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
1d150 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  SEQ);.      }.  
1d160 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1d170 64 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63  ddOp4(v, OP_Func
1d180 74 69 6f 6e 30 2c 20 63 6f 6e 73 74 4d 61 73 6b  tion0, constMask
1d190 2c 20 72 31 2c 20 74 61 72 67 65 74 2c 0a 20 20  , r1, target,.  
1d1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d1b0 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 44 65        (char*)pDe
1d1c0 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  f, P4_FUNCDEF);.
1d1d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1d1e0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38  eChangeP5(v, (u8
1d1f0 29 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 69  )nFarg);.      i
1d200 66 28 20 6e 46 61 72 67 20 26 26 20 63 6f 6e 73  f( nFarg && cons
1d210 74 4d 61 73 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  tMask==0 ){.    
1d220 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
1d230 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
1d240 73 65 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b 0a  se, r1, nFarg);.
1d250 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
1d260 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
1d270 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1d280 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
1d290 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20   TK_EXISTS:.    
1d2a0 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
1d2b0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c  {.      int nCol
1d2c0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1d2d0 28 20 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20  ( op==TK_EXISTS 
1d2e0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1d2f0 65 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  e( op==TK_SELECT
1d300 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70   );.      if( op
1d310 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 28  ==TK_SELECT && (
1d320 6e 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e  nCol = pExpr->x.
1d330 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
1d340 3e 6e 45 78 70 72 29 21 3d 31 20 29 7b 0a 20 20  >nExpr)!=1 ){.  
1d350 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 75 62        sqlite3Sub
1d360 73 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72  selectError(pPar
1d370 73 65 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20  se, nCol, 1);.  
1d380 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d390 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
1d3a0 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
1d3b0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30  pParse, pExpr, 0
1d3c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
1d3d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1d3e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
1d3f0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73   {.      int des
1d400 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74  tIfFalse = sqlit
1d410 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1d420 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65  v);.      int de
1d430 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74  stIfNull = sqlit
1d440 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1d450 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
1d460 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1d470 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65  P_Null, 0, targe
1d480 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1d490 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72  3ExprCodeIN(pPar
1d4a0 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49  se, pExpr, destI
1d4b0 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75  fFalse, destIfNu
1d4c0 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
1d4d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1d4e0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74  OP_Integer, 1, t
1d4f0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71  arget);.      sq
1d500 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1d510 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46  Label(v, destIfF
1d520 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  alse);.      sql
1d530 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1d540 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72  , OP_AddImm, tar
1d550 67 65 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  get, 0);.      s
1d560 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1d570 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66  eLabel(v, destIf
1d580 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
1d590 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
1d5a0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1d5b0 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 20 20  SUBQUERY */...  
1d5c0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78    /*.    **    x
1d5d0 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a   BETWEEN y AND z
1d5e0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1d5f0 68 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e  his is equivalen
1d600 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t to.    **.    
1d610 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78  **    x>=y AND x
1d620 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  <=z.    **.    *
1d630 2a 20 58 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * X is stored in
1d640 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20   pExpr->pLeft.. 
1d650 20 20 20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65     ** Y is store
1d660 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73  d in pExpr->pLis
1d670 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20  t->a[0].pExpr.. 
1d680 20 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65     ** Z is store
1d690 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73  d in pExpr->pLis
1d6a0 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20  t->a[1].pExpr.. 
1d6b0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54     */.    case T
1d6c0 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
1d6d0 20 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65     exprCodeBetwe
1d6e0 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  en(pParse, pExpr
1d6f0 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 30 29 3b  , target, 0, 0);
1d700 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1d710 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1d720 53 50 41 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  SPAN:.    case T
1d730 4b 5f 43 4f 4c 4c 41 54 45 3a 20 0a 20 20 20 20  K_COLLATE: .    
1d740 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b  case TK_UPLUS: {
1d750 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73  .      inReg = s
1d760 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
1d770 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
1d780 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65  pr->pLeft, targe
1d790 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
1d7a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
1d7b0 20 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20   TK_TRIGGER: {. 
1d7c0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f       /* If the o
1d7d0 70 63 6f 64 65 20 69 73 20 54 4b 5f 54 52 49 47  pcode is TK_TRIG
1d7e0 47 45 52 2c 20 74 68 65 6e 20 74 68 65 20 65 78  GER, then the ex
1d7f0 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 72 65  pression is a re
1d800 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a  ference.      **
1d810 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   to a column in 
1d820 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64  the new.* or old
1d830 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 73  .* pseudo-tables
1d840 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20   available to.  
1d850 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20 70      ** trigger p
1d860 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68 69 73  rograms. In this
1d870 20 63 61 73 65 20 45 78 70 72 2e 69 54 61 62 6c   case Expr.iTabl
1d880 65 20 69 73 20 73 65 74 20 74 6f 20 31 20 66 6f  e is set to 1 fo
1d890 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e  r the.      ** n
1d8a0 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ew.* pseudo-tabl
1d8b0 65 2c 20 6f 72 20 30 20 66 6f 72 20 74 68 65 20  e, or 0 for the 
1d8c0 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  old.* pseudo-tab
1d8d0 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e  le. Expr.iColumn
1d8e0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74  .      ** is set
1d8f0 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f   to the column o
1d900 66 20 74 68 65 20 70 73 65 75 64 6f 2d 74 61 62  f the pseudo-tab
1d910 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f 72 20 74  le to read, or t
1d920 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a  o -1 to.      **
1d930 20 72 65 61 64 20 74 68 65 20 72 6f 77 69 64 20   read the rowid 
1d940 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2a 0a  field..      **.
1d950 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65 78 70        ** The exp
1d960 72 65 73 73 69 6f 6e 20 69 73 20 69 6d 70 6c 65  ression is imple
1d970 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 61 6e 20  mented using an 
1d980 4f 50 5f 50 61 72 61 6d 20 6f 70 63 6f 64 65 2e  OP_Param opcode.
1d990 20 54 68 65 20 70 31 0a 20 20 20 20 20 20 2a 2a   The p1.      **
1d9a0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 73 65   parameter is se
1d9b0 74 20 74 6f 20 30 20 66 6f 72 20 61 6e 20 6f 6c  t to 0 for an ol
1d9c0 64 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63  d.rowid referenc
1d9d0 65 2c 20 6f 72 20 74 6f 20 28 69 2b 31 29 0a 20  e, or to (i+1). 
1d9e0 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 66 65 72       ** to refer
1d9f0 65 6e 63 65 20 61 6e 6f 74 68 65 72 20 63 6f 6c  ence another col
1da00 75 6d 6e 20 6f 66 20 74 68 65 20 6f 6c 64 2e 2a  umn of the old.*
1da10 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 77   pseudo-table, w
1da20 68 65 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 69  here .      ** i
1da30 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
1da40 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72   the column. For
1da50 20 61 20 6e 65 77 2e 72 6f 77 69 64 20 72 65 66   a new.rowid ref
1da60 65 72 65 6e 63 65 2c 20 70 31 20 69 73 0a 20 20  erence, p1 is.  
1da70 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 28 6e      ** set to (n
1da80 2b 31 29 2c 20 77 68 65 72 65 20 6e 20 69 73 20  +1), where n is 
1da90 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
1daa0 6c 75 6d 6e 73 20 69 6e 20 65 61 63 68 20 70 73  lumns in each ps
1dab0 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 20 20 20 20  eudo-table..    
1dac0 20 20 2a 2a 20 46 6f 72 20 61 20 72 65 66 65 72    ** For a refer
1dad0 65 6e 63 65 20 74 6f 20 61 6e 79 20 6f 74 68 65  ence to any othe
1dae0 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  r column in the 
1daf0 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  new.* pseudo-tab
1db00 6c 65 2c 20 70 31 0a 20 20 20 20 20 20 2a 2a 20  le, p1.      ** 
1db10 69 73 20 73 65 74 20 74 6f 20 28 6e 2b 32 2b 69  is set to (n+2+i
1db20 29 2c 20 77 68 65 72 65 20 6e 20 61 6e 64 20 69  ), where n and i
1db30 20 61 72 65 20 61 73 20 64 65 66 69 6e 65 64 20   are as defined 
1db40 70 72 65 76 69 6f 75 73 6c 79 2e 20 46 6f 72 0a  previously. For.
1db50 20 20 20 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65        ** example
1db60 2c 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 6f  , if the table o
1db70 6e 20 77 68 69 63 68 20 74 72 69 67 67 65 72 73  n which triggers
1db80 20 61 72 65 20 62 65 69 6e 67 20 66 69 72 65 64   are being fired
1db90 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 63   is.      ** dec
1dba0 6c 61 72 65 64 20 61 73 3a 0a 20 20 20 20 20 20  lared as:.      
1dbb0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 43 52  **.      **   CR
1dbc0 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
1dbd0 20 62 29 3b 0a 20 20 20 20 20 20 2a 2a 0a 20 20   b);.      **.  
1dbe0 20 20 20 20 2a 2a 20 54 68 65 6e 20 70 31 20 69      ** Then p1 i
1dbf0 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
1dc00 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20   follows:.      
1dc10 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31  **.      **   p1
1dc20 3d 3d 30 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e  ==0   ->    old.
1dc30 72 6f 77 69 64 20 20 20 20 20 70 31 3d 3d 33 20  rowid     p1==3 
1dc40 20 20 2d 3e 20 20 20 20 6e 65 77 2e 72 6f 77 69    ->    new.rowi
1dc50 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d  d.      **   p1=
1dc60 3d 31 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 61  =1   ->    old.a
1dc70 20 20 20 20 20 20 20 20 20 70 31 3d 3d 34 20 20           p1==4  
1dc80 20 2d 3e 20 20 20 20 6e 65 77 2e 61 0a 20 20 20   ->    new.a.   
1dc90 20 20 20 2a 2a 20 20 20 70 31 3d 3d 32 20 20 20     **   p1==2   
1dca0 2d 3e 20 20 20 20 6f 6c 64 2e 62 20 20 20 20 20  ->    old.b     
1dcb0 20 20 20 20 70 31 3d 3d 35 20 20 20 2d 3e 20 20      p1==5   ->  
1dcc0 20 20 6e 65 77 2e 62 20 20 20 20 20 20 20 0a 20    new.b       . 
1dcd0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61       */.      Ta
1dce0 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 45 78 70  ble *pTab = pExp
1dcf0 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69  r->pTab;.      i
1dd00 6e 74 20 70 31 20 3d 20 70 45 78 70 72 2d 3e 69  nt p1 = pExpr->i
1dd10 54 61 62 6c 65 20 2a 20 28 70 54 61 62 2d 3e 6e  Table * (pTab->n
1dd20 43 6f 6c 2b 31 29 20 2b 20 31 20 2b 20 70 45 78  Col+1) + 1 + pEx
1dd30 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20  pr->iColumn;..  
1dd40 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1dd50 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20  r->iTable==0 || 
1dd60 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 31  pExpr->iTable==1
1dd70 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1dd80 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
1dd90 3e 3d 2d 31 20 26 26 20 70 45 78 70 72 2d 3e 69  >=-1 && pExpr->i
1dda0 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f  Column<pTab->nCo
1ddb0 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  l );.      asser
1ddc0 74 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30  t( pTab->iPKey<0
1ddd0 20 7c 7c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75   || pExpr->iColu
1dde0 6d 6e 21 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20  mn!=pTab->iPKey 
1ddf0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1de00 20 70 31 3e 3d 30 20 26 26 20 70 31 3c 28 70 54   p1>=0 && p1<(pT
1de10 61 62 2d 3e 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b  ab->nCol*2+2) );
1de20 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ..      sqlite3V
1de30 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1de40 50 61 72 61 6d 2c 20 70 31 2c 20 74 61 72 67 65  Param, p1, targe
1de50 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
1de60 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 2e 25 73  mment((v, "%s.%s
1de70 20 2d 3e 20 24 25 64 22 2c 0a 20 20 20 20 20 20   -> $%d",.      
1de80 20 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65    (pExpr->iTable
1de90 20 3f 20 22 6e 65 77 22 20 3a 20 22 6f 6c 64 22   ? "new" : "old"
1dea0 29 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78 70  ),.        (pExp
1deb0 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22  r->iColumn<0 ? "
1dec0 72 6f 77 69 64 22 20 3a 20 70 45 78 70 72 2d 3e  rowid" : pExpr->
1ded0 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72  pTab->aCol[pExpr
1dee0 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65  ->iColumn].zName
1def0 29 2c 0a 20 20 20 20 20 20 20 20 74 61 72 67 65  ),.        targe
1df00 74 0a 20 20 20 20 20 20 29 29 3b 0a 0a 23 69 66  t.      ));..#if
1df10 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1df20 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
1df30 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1df40 63 6f 6c 75 6d 6e 20 68 61 73 20 52 45 41 4c 20  column has REAL 
1df50 61 66 66 69 6e 69 74 79 2c 20 69 74 20 6d 61 79  affinity, it may
1df60 20 63 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74   currently be st
1df70 6f 72 65 64 20 61 73 20 61 6e 0a 20 20 20 20 20  ored as an.     
1df80 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 55 73 65   ** integer. Use
1df90 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79   OP_RealAffinity
1dfa0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74   to make sure it
1dfb0 20 69 73 20 72 65 61 6c 6c 79 20 72 65 61 6c 2e   is really real.
1dfc0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
1dfd0 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
1dfe0 52 2d 36 30 39 38 35 2d 35 37 36 36 32 20 53 51  R-60985-57662 SQ
1dff0 4c 69 74 65 20 77 69 6c 6c 20 63 6f 6e 76 65 72  Lite will conver
1e000 74 20 74 68 65 20 76 61 6c 75 65 20 62 61 63 6b  t the value back
1e010 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 66 6c 6f   to.      ** flo
1e020 61 74 69 6e 67 20 70 6f 69 6e 74 20 77 68 65 6e  ating point when
1e030 20 65 78 74 72 61 63 74 69 6e 67 20 69 74 20 66   extracting it f
1e040 72 6f 6d 20 74 68 65 20 72 65 63 6f 72 64 2e 20  rom the record. 
1e050 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 45   */.      if( pE
1e060 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20  xpr->iColumn>=0 
1e070 0a 20 20 20 20 20 20 20 26 26 20 70 54 61 62 2d  .       && pTab-
1e080 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f  >aCol[pExpr->iCo
1e090 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d  lumn].affinity==
1e0a0 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a  SQLITE_AFF_REAL.
1e0b0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1e0c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e0d0 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66  p1(v, OP_RealAff
1e0e0 69 6e 69 74 79 2c 20 74 61 72 67 65 74 29 3b 0a  inity, target);.
1e0f0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1e100 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e110 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56  }..    case TK_V
1e120 45 43 54 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73  ECTOR: {.      s
1e130 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1e140 50 61 72 73 65 2c 20 22 69 6e 76 61 6c 69 64 20  Parse, "invalid 
1e150 75 73 65 20 6f 66 20 72 6f 77 20 76 61 6c 75 65  use of row value
1e160 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
1e170 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
1e180 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a 20 20     ** Form A:.  
1e190 20 20 2a 2a 20 20 20 43 41 53 45 20 78 20 57 48    **   CASE x WH
1e1a0 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57 48  EN e1 THEN r1 WH
1e1b0 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e  EN e2 THEN r2 ..
1e1c0 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72  . WHEN eN THEN r
1e1d0 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20  N ELSE y END.   
1e1e0 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20   **.    ** Form 
1e1f0 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45  B:.    **   CASE
1e200 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31   WHEN e1 THEN r1
1e210 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32   WHEN e2 THEN r2
1e220 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45   ... WHEN eN THE
1e230 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a  N rN ELSE y END.
1e240 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f      **.    ** Fo
1e250 72 6d 20 41 20 69 73 20 63 61 6e 20 62 65 20 74  rm A is can be t
1e260 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20  ransformed into 
1e270 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66  the equivalent f
1e280 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c 6f 77 73  orm B as follows
1e290 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20  :.    **   CASE 
1e2a0 57 48 45 4e 20 78 3d 65 31 20 54 48 45 4e 20 72  WHEN x=e1 THEN r
1e2b0 31 20 57 48 45 4e 20 78 3d 65 32 20 54 48 45 4e  1 WHEN x=e2 THEN
1e2c0 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20   r2 ....    **  
1e2d0 20 20 20 20 20 20 57 48 45 4e 20 78 3d 65 4e 20        WHEN x=eN 
1e2e0 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45  THEN rN ELSE y E
1e2f0 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ND.    **.    **
1e300 20 58 20 28 69 66 20 69 74 20 65 78 69 73 74 73   X (if it exists
1e310 29 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70  ) is in pExpr->p
1e320 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69  Left..    ** Y i
1e330 73 20 69 6e 20 74 68 65 20 6c 61 73 74 20 65 6c  s in the last el
1e340 65 6d 65 6e 74 20 6f 66 20 70 45 78 70 72 2d 3e  ement of pExpr->
1e350 78 2e 70 4c 69 73 74 20 69 66 20 70 45 78 70 72  x.pList if pExpr
1e360 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
1e370 20 69 73 0a 20 20 20 20 2a 2a 20 6f 64 64 2e 20   is.    ** odd. 
1e380 20 54 68 65 20 59 20 69 73 20 61 6c 73 6f 20 6f   The Y is also o
1e390 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74 68 65  ptional.  If the
1e3a0 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   number of eleme
1e3b0 6e 74 73 20 69 6e 20 78 2e 70 4c 69 73 74 0a 20  nts in x.pList. 
1e3c0 20 20 20 2a 2a 20 69 73 20 65 76 65 6e 2c 20 74     ** is even, t
1e3d0 68 65 6e 20 59 20 69 73 20 6f 6d 69 74 74 65 64  hen Y is omitted
1e3e0 20 61 6e 64 20 74 68 65 20 22 6f 74 68 65 72 77   and the "otherw
1e3f0 69 73 65 22 20 72 65 73 75 6c 74 20 69 73 20 4e  ise" result is N
1e400 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69 20 69  ULL..    ** Ei i
1e410 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73  s in pExpr->pLis
1e420 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20 52 69  t->a[i*2] and Ri
1e430 20 69 73 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   is pExpr->pList
1e440 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20 20  ->a[i*2+1]..    
1e450 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65  **.    ** The re
1e460 73 75 6c 74 20 6f 66 20 74 68 65 20 65 78 70 72  sult of the expr
1e470 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20 52 69  ession is the Ri
1e480 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 6d   for the first m
1e490 61 74 63 68 69 6e 67 20 45 69 2c 0a 20 20 20 20  atching Ei,.    
1e4a0 2a 2a 20 6f 72 20 69 66 20 74 68 65 72 65 20 69  ** or if there i
1e4b0 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 45 69  s no matching Ei
1e4c0 2c 20 74 68 65 20 45 4c 53 45 20 74 65 72 6d 20  , the ELSE term 
1e4d0 59 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20 69  Y, or if there i
1e4e0 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c 53 45  s.    ** no ELSE
1e4f0 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20   term, NULL..   
1e500 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
1e510 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f   assert( op==TK_
1e520 43 41 53 45 20 29 3b 20 7b 0a 20 20 20 20 20 20  CASE ); {.      
1e530 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20 20 20  int endLabel;   
1e540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e550 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20    /* GOTO label 
1e560 66 6f 72 20 65 6e 64 20 6f 66 20 43 41 53 45 20  for end of CASE 
1e570 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  stmt */.      in
1e580 74 20 6e 65 78 74 43 61 73 65 3b 20 20 20 20 20  t nextCase;     
1e590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5a0 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f  /* GOTO label fo
1e5b0 72 20 6e 65 78 74 20 57 48 45 4e 20 63 6c 61 75  r next WHEN clau
1e5c0 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  se */.      int 
1e5d0 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  nExpr;          
1e5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e5f0 20 32 78 20 6e 75 6d 62 65 72 20 6f 66 20 57 48   2x number of WH
1e600 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  EN terms */.    
1e610 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
1e620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e630 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
1e640 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ter */.      Exp
1e650 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20  rList *pEList;  
1e660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e670 2a 20 4c 69 73 74 20 6f 66 20 57 48 45 4e 20 74  * List of WHEN t
1e680 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 73 74  erms */.      st
1e690 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
1e6a0 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 20 20  em *aListelem;  
1e6b0 2f 2a 20 41 72 72 61 79 20 6f 66 20 57 48 45 4e  /* Array of WHEN
1e6c0 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
1e6d0 45 78 70 72 20 6f 70 43 6f 6d 70 61 72 65 3b 20  Expr opCompare; 
1e6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6f0 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69 20 65    /* The X==Ei e
1e700 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
1e710 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20     Expr *pX;    
1e720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e730 20 20 20 20 20 2f 2a 20 54 68 65 20 58 20 65 78       /* The X ex
1e740 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
1e750 20 20 45 78 70 72 20 2a 70 54 65 73 74 20 3d 20    Expr *pTest = 
1e760 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1e770 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66 6f      /* X==Ei (fo
1e780 72 6d 20 41 29 20 6f 72 20 6a 75 73 74 20 45 69  rm A) or just Ei
1e790 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 20 20 20   (form B) */.   
1e7a0 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74     VVA_ONLY( int
1e7b0 20 69 43 61 63 68 65 4c 65 76 65 6c 20 3d 20 70   iCacheLevel = p
1e7c0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
1e7d0 65 6c 3b 20 29 0a 0a 20 20 20 20 20 20 61 73 73  el; )..      ass
1e7e0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1e7f0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1e800 78 49 73 53 65 6c 65 63 74 29 20 26 26 20 70 45  xIsSelect) && pE
1e810 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b 0a  xpr->x.pList );.
1e820 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78        assert(pEx
1e830 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
1e840 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70  pr > 0);.      p
1e850 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  EList = pExpr->x
1e860 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c  .pList;.      aL
1e870 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74  istelem = pEList
1e880 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72  ->a;.      nExpr
1e890 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
1e8a0 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61 62 65 6c  ;.      endLabel
1e8b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1e8c0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
1e8d0 20 20 69 66 28 20 28 70 58 20 3d 20 70 45 78 70    if( (pX = pExp
1e8e0 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a  r->pLeft)!=0 ){.
1e8f0 20 20 20 20 20 20 20 20 74 65 6d 70 58 20 3d 20          tempX = 
1e900 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 74 65 73  *pX;.        tes
1e910 74 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54  tcase( pX->op==T
1e920 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  K_COLUMN );.    
1e930 20 20 20 20 65 78 70 72 54 6f 52 65 67 69 73 74      exprToRegist
1e940 65 72 28 26 74 65 6d 70 58 2c 20 73 71 6c 69 74  er(&tempX, sqlit
1e950 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1e960 50 61 72 73 65 2c 20 70 58 2c 20 26 72 65 67 46  Parse, pX, &regF
1e970 72 65 65 31 29 29 3b 0a 20 20 20 20 20 20 20 20  ree1));.        
1e980 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1e990 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  e1==0 );.       
1e9a0 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20   opCompare.op = 
1e9b0 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20 20 6f  TK_EQ;.        o
1e9c0 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d  pCompare.pLeft =
1e9d0 20 26 74 65 6d 70 58 3b 0a 20 20 20 20 20 20 20   &tempX;.       
1e9e0 20 70 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d 70   pTest = &opComp
1e9f0 61 72 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  are;.        /* 
1ea00 54 69 63 6b 65 74 20 62 33 35 31 64 39 35 66 39  Ticket b351d95f9
1ea10 63 64 35 65 66 31 37 65 39 64 39 64 62 61 65 31  cd5ef17e9d9dbae1
1ea20 38 66 35 63 61 38 36 31 31 31 39 30 30 30 31 3a  8f5ca8611190001:
1ea30 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20  .        ** The 
1ea40 76 61 6c 75 65 20 69 6e 20 72 65 67 46 72 65 65  value in regFree
1ea50 31 20 6d 69 67 68 74 20 67 65 74 20 53 43 6f 70  1 might get SCop
1ea60 79 2d 65 64 20 69 6e 74 6f 20 74 68 65 20 66 69  y-ed into the fi
1ea70 6c 65 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 20  le result..     
1ea80 20 20 20 2a 2a 20 53 6f 20 6d 61 6b 65 20 73 75     ** So make su
1ea90 72 65 20 74 68 61 74 20 74 68 65 20 72 65 67 46  re that the regF
1eaa0 72 65 65 31 20 72 65 67 69 73 74 65 72 20 69 73  ree1 register is
1eab0 20 6e 6f 74 20 72 65 75 73 65 64 20 66 6f 72 20   not reused for 
1eac0 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  other.        **
1ead0 20 70 75 72 70 6f 73 65 73 20 61 6e 64 20 70 6f   purposes and po
1eae0 73 73 69 62 6c 79 20 6f 76 65 72 77 72 69 74 74  ssibly overwritt
1eaf0 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  en.  */.        
1eb00 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20  regFree1 = 0;.  
1eb10 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
1eb20 69 3d 30 3b 20 69 3c 6e 45 78 70 72 2d 31 3b 20  i=0; i<nExpr-1; 
1eb30 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20 20  i=i+2){.        
1eb40 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1eb50 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
1eb60 20 20 20 20 20 20 69 66 28 20 70 58 20 29 7b 0a        if( pX ){.
1eb70 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1eb80 28 20 70 54 65 73 74 21 3d 30 20 29 3b 0a 20 20  ( pTest!=0 );.  
1eb90 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72          opCompar
1eba0 65 2e 70 52 69 67 68 74 20 3d 20 61 4c 69 73 74  e.pRight = aList
1ebb0 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  elem[i].pExpr;. 
1ebc0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1ebd0 20 20 20 20 20 20 20 20 70 54 65 73 74 20 3d 20          pTest = 
1ebe0 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78  aListelem[i].pEx
1ebf0 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  pr;.        }.  
1ec00 20 20 20 20 20 20 6e 65 78 74 43 61 73 65 20 3d        nextCase =
1ec10 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1ec20 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
1ec30 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 73    testcase( pTes
1ec40 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
1ec50 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
1ec60 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
1ec70 50 61 72 73 65 2c 20 70 54 65 73 74 2c 20 6e 65  Parse, pTest, ne
1ec80 78 74 43 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a  xtCase, SQLITE_J
1ec90 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
1eca0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4c      testcase( aL
1ecb0 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78  istelem[i+1].pEx
1ecc0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
1ecd0 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  N );.        sql
1ece0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
1ecf0 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69  rse, aListelem[i
1ed00 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65  +1].pExpr, targe
1ed10 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
1ed20 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 65  te3VdbeGoto(v, e
1ed30 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  ndLabel);.      
1ed40 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1ed50 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
1ed60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1ed70 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1ed80 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a 20 20 20  , nextCase);.   
1ed90 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
1eda0 6e 45 78 70 72 26 31 29 21 3d 30 20 29 7b 0a 20  nExpr&1)!=0 ){. 
1edb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1edc0 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
1edd0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
1ede0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
1edf0 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6e  rse, pEList->a[n
1ee00 45 78 70 72 2d 31 5d 2e 70 45 78 70 72 2c 20 74  Expr-1].pExpr, t
1ee10 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1ee20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1ee30 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
1ee40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ee50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ee60 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
1ee70 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
1ee80 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
1ee90 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1eea0 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  ed || pParse->nE
1eeb0 72 72 3e 30 20 0a 20 20 20 20 20 20 20 20 20 20  rr>0 .          
1eec0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 69 43 61 63   || pParse->iCac
1eed0 68 65 4c 65 76 65 6c 3d 3d 69 43 61 63 68 65 4c  heLevel==iCacheL
1eee0 65 76 65 6c 20 29 3b 0a 20 20 20 20 20 20 73 71  evel );.      sq
1eef0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1ef00 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65  Label(v, endLabe
1ef10 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
1ef20 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
1ef30 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
1ef40 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  ER.    case TK_R
1ef50 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 61 73  AISE: {.      as
1ef60 73 65 72 74 28 20 70 45 78 70 72 2d 3e 61 66 66  sert( pExpr->aff
1ef70 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61  inity==OE_Rollba
1ef80 63 6b 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ck .           |
1ef90 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  | pExpr->affinit
1efa0 79 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20 20 20 20  y==OE_Abort.    
1efb0 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
1efc0 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 46 61  >affinity==OE_Fa
1efd0 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  il.           ||
1efe0 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
1eff0 3d 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20 20 20 20  ==OE_Ignore.    
1f000 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21    );.      if( !
1f010 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72  pParse->pTrigger
1f020 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Tab ){.        s
1f030 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1f040 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
1f050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52                "R
1f060 41 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20  AISE() may only 
1f070 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 61  be used within a
1f080 20 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d   trigger-program
1f090 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
1f0a0 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
1f0b0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61      if( pExpr->a
1f0c0 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72  ffinity==OE_Abor
1f0d0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
1f0e0 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
1f0f0 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rse);.      }.  
1f100 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1f110 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1f120 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
1f130 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45   );.      if( pE
1f140 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
1f150 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20  E_Ignore ){.    
1f160 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1f170 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20 20  ddOp4(.         
1f180 20 20 20 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53     v, OP_Halt, S
1f190 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e  QLITE_OK, OE_Ign
1f1a0 6f 72 65 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75  ore, 0, pExpr->u
1f1b0 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20 20  .zToken,0);.    
1f1c0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1f1d0 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  (v);.      }else
1f1e0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1f1f0 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28  3HaltConstraint(
1f200 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 43  pParse, SQLITE_C
1f210 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45  ONSTRAINT_TRIGGE
1f220 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  R,.             
1f230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f240 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
1f250 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1f260 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  n, 0, 0);.      
1f270 7d 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  }..      break;.
1f280 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
1f290 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
1f2a0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1f2b0 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
1f2c0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1f2d0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
1f2e0 72 65 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  ree2);.  return 
1f2f0 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  inReg;.}../*.** 
1f300 46 61 63 74 6f 72 20 6f 75 74 20 74 68 65 20 63  Factor out the c
1f310 6f 64 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e  ode of the given
1f320 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 69   expression to i
1f330 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69  nitialization ti
1f340 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  me..*/.void sqli
1f350 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69  te3ExprCodeAtIni
1f360 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
1f370 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
1f380 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
1f390 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
1f3a0 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
1f3b0 6f 6e 20 74 6f 20 63 6f 64 65 20 77 68 65 6e 20  on to code when 
1f3c0 74 68 65 20 56 44 42 45 20 69 6e 69 74 69 61 6c  the VDBE initial
1f3d0 69 7a 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65  izes */.  int re
1f3e0 67 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 53  gDest,      /* S
1f3f0 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 69  tore the value i
1f400 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  n this register 
1f410 2a 2f 0a 20 20 75 38 20 72 65 75 73 61 62 6c 65  */.  u8 reusable
1f420 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1f430 66 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  f this expressio
1f440 6e 20 69 73 20 72 65 75 73 61 62 6c 65 20 2a 2f  n is reusable */
1f450 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
1f460 70 3b 0a 20 20 61 73 73 65 72 74 28 20 43 6f 6e  p;.  assert( Con
1f470 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73  stFactorOk(pPars
1f480 65 29 20 29 3b 0a 20 20 70 20 3d 20 70 50 61 72  e) );.  p = pPar
1f490 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a  se->pConstExpr;.
1f4a0 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
1f4b0 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d  3ExprDup(pParse-
1f4c0 3e 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  >db, pExpr, 0);.
1f4d0 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70    p = sqlite3Exp
1f4e0 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
1f4f0 73 65 2c 20 70 2c 20 70 45 78 70 72 29 3b 0a 20  se, p, pExpr);. 
1f500 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 73   if( p ){.     s
1f510 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
1f520 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d  tem *pItem = &p-
1f530 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a  >a[p->nExpr-1];.
1f540 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 69 43       pItem->u.iC
1f550 6f 6e 73 74 45 78 70 72 52 65 67 20 3d 20 72 65  onstExprReg = re
1f560 67 44 65 73 74 3b 0a 20 20 20 20 20 70 49 74 65  gDest;.     pIte
1f570 6d 2d 3e 72 65 75 73 61 62 6c 65 20 3d 20 72 65  m->reusable = re
1f580 75 73 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 70 50  usable;.  }.  pP
1f590 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72  arse->pConstExpr
1f5a0 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47   = p;.}../*.** G
1f5b0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1f5c0 65 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72  evaluate an expr
1f5d0 65 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65  ession and store
1f5e0 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20   the results.** 
1f5f0 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 2e  into a register.
1f600 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67    Return the reg
1f610 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68 65  ister number whe
1f620 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a  re the results.*
1f630 2a 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a  * are stored..**
1f640 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 67 69 73  .** If the regis
1f650 74 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ter is a tempora
1f660 72 79 20 72 65 67 69 73 74 65 72 20 74 68 61 74  ry register that
1f670 20 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61   can be dealloca
1f680 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69  ted,.** then wri
1f690 74 65 20 69 74 73 20 6e 75 6d 62 65 72 20 69 6e  te its number in
1f6a0 74 6f 20 2a 70 52 65 67 2e 20 20 49 66 20 74 68  to *pReg.  If th
1f6b0 65 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65  e result registe
1f6c0 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65  r is not.** a te
1f6d0 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e 20 73 65  mporary, then se
1f6e0 74 20 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e  t *pReg to zero.
1f6f0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20  .**.** If pExpr 
1f700 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 2c 20 74  is a constant, t
1f710 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
1f720 20 6d 69 67 68 74 20 67 65 6e 65 72 61 74 65 20   might generate 
1f730 74 68 69 73 0a 2a 2a 20 63 6f 64 65 20 74 6f 20  this.** code to 
1f740 66 69 6c 6c 20 74 68 65 20 72 65 67 69 73 74 65  fill the registe
1f750 72 20 69 6e 20 74 68 65 20 69 6e 69 74 69 61 6c  r in the initial
1f760 69 7a 61 74 69 6f 6e 20 73 65 63 74 69 6f 6e 20  ization section 
1f770 6f 66 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70  of the.** VDBE p
1f780 72 6f 67 72 61 6d 2c 20 69 6e 20 6f 72 64 65 72  rogram, in order
1f790 20 74 6f 20 66 61 63 74 6f 72 20 69 74 20 6f 75   to factor it ou
1f7a0 74 20 6f 66 20 74 68 65 20 65 76 61 6c 75 61 74  t of the evaluat
1f7b0 69 6f 6e 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74  ion loop..*/.int
1f7c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1f7d0 54 65 6d 70 28 50 61 72 73 65 20 2a 70 50 61 72  Temp(Parse *pPar
1f7e0 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
1f7f0 20 69 6e 74 20 2a 70 52 65 67 29 7b 0a 20 20 69   int *pReg){.  i
1f800 6e 74 20 72 32 3b 0a 20 20 70 45 78 70 72 20 3d  nt r2;.  pExpr =
1f810 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
1f820 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a  Collate(pExpr);.
1f830 20 20 69 66 28 20 43 6f 6e 73 74 46 61 63 74 6f    if( ConstFacto
1f840 72 4f 6b 28 70 50 61 72 73 65 29 0a 20 20 20 26  rOk(pParse).   &
1f850 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  & pExpr->op!=TK_
1f860 52 45 47 49 53 54 45 52 0a 20 20 20 26 26 20 73  REGISTER.   && s
1f870 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
1f880 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70  tantNotJoin(pExp
1f890 72 29 0a 20 20 29 7b 0a 20 20 20 20 45 78 70 72  r).  ){.    Expr
1f8a0 4c 69 73 74 20 2a 70 20 3d 20 70 50 61 72 73 65  List *p = pParse
1f8b0 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20  ->pConstExpr;.  
1f8c0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 2a 70 52    int i;.    *pR
1f8d0 65 67 20 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  eg  = 0;.    if(
1f8e0 20 70 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75   p ){.      stru
1f8f0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
1f900 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66   *pItem;.      f
1f910 6f 72 28 70 49 74 65 6d 3d 70 2d 3e 61 2c 20 69  or(pItem=p->a, i
1f920 3d 70 2d 3e 6e 45 78 70 72 3b 20 69 3e 30 3b 20  =p->nExpr; i>0; 
1f930 70 49 74 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20  pItem++, i--){. 
1f940 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
1f950 2d 3e 72 65 75 73 61 62 6c 65 20 26 26 20 73 71  ->reusable && sq
1f960 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
1f970 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 70 45  (pItem->pExpr,pE
1f980 78 70 72 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20 20  xpr,-1)==0 ){.  
1f990 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
1f9a0 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78  Item->u.iConstEx
1f9b0 70 72 52 65 67 3b 0a 20 20 20 20 20 20 20 20 7d  prReg;.        }
1f9c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1f9d0 20 20 20 72 32 20 3d 20 2b 2b 70 50 61 72 73 65     r2 = ++pParse
1f9e0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
1f9f0 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69  te3ExprCodeAtIni
1fa00 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
1fa10 20 72 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65   r2, 1);.  }else
1fa20 7b 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73  {.    int r1 = s
1fa30 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
1fa40 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72 32  (pParse);.    r2
1fa50 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1fa60 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
1fa70 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20   pExpr, r1);.   
1fa80 20 69 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20   if( r2==r1 ){. 
1fa90 20 20 20 20 20 2a 70 52 65 67 20 3d 20 72 31 3b       *pReg = r1;
1faa0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1fab0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1fac0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1fad0 72 31 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 67  r1);.      *pReg
1fae0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
1faf0 20 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a    return r2;.}..
1fb00 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1fb10 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76  ode that will ev
1fb20 61 6c 75 61 74 65 20 65 78 70 72 65 73 73 69 6f  aluate expressio
1fb30 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72  n pExpr and stor
1fb40 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73  e the.** results
1fb50 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72   in register tar
1fb60 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74  get.  The result
1fb70 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64  s are guaranteed
1fb80 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e   to appear.** in
1fb90 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
1fba0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1fbb0 33 45 78 70 72 43 6f 64 65 28 50 61 72 73 65 20  3ExprCode(Parse 
1fbc0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
1fbd0 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
1fbe0 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a  ){.  int inReg;.
1fbf0 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
1fc00 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70  t>0 && target<=p
1fc10 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20  Parse->nMem );. 
1fc20 20 69 66 28 20 70 45 78 70 72 20 26 26 20 70 45   if( pExpr && pE
1fc30 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49  xpr->op==TK_REGI
1fc40 53 54 45 52 20 29 7b 0a 20 20 20 20 73 71 6c 69  STER ){.    sqli
1fc50 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50  te3VdbeAddOp2(pP
1fc60 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
1fc70 43 6f 70 79 2c 20 70 45 78 70 72 2d 3e 69 54 61  Copy, pExpr->iTa
1fc80 62 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  ble, target);.  
1fc90 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 52 65 67  }else{.    inReg
1fca0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1fcb0 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
1fcc0 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b   pExpr, target);
1fcd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1fce0 72 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 7c 7c  rse->pVdbe!=0 ||
1fcf0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
1fd00 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
1fd10 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67   if( inReg!=targ
1fd20 65 74 20 26 26 20 70 50 61 72 73 65 2d 3e 70 56  et && pParse->pV
1fd30 64 62 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  dbe ){.      sql
1fd40 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70  ite3VdbeAddOp2(p
1fd50 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
1fd60 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74  _SCopy, inReg, t
1fd70 61 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20  arget);.    }.  
1fd80 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  }.}../*.** Make 
1fd90 61 20 74 72 61 6e 73 69 65 6e 74 20 63 6f 70 79  a transient copy
1fda0 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70   of expression p
1fdb0 45 78 70 72 20 61 6e 64 20 74 68 65 6e 20 63 6f  Expr and then co
1fdc0 64 65 20 69 74 20 75 73 69 6e 67 0a 2a 2a 20 73  de it using.** s
1fdd0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29  qlite3ExprCode()
1fde0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
1fdf0 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20  works just like 
1fe00 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1fe10 29 0a 2a 2a 20 65 78 63 65 70 74 20 74 68 61 74  ).** except that
1fe20 20 74 68 65 20 69 6e 70 75 74 20 65 78 70 72 65   the input expre
1fe30 73 73 69 6f 6e 20 69 73 20 67 75 61 72 61 6e 74  ssion is guarant
1fe40 65 65 64 20 74 6f 20 62 65 20 75 6e 63 68 61 6e  eed to be unchan
1fe50 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ged..*/.void sql
1fe60 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79  ite3ExprCodeCopy
1fe70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1fe80 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
1fe90 20 74 61 72 67 65 74 29 7b 0a 20 20 73 71 6c 69   target){.  sqli
1fea0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1feb0 2d 3e 64 62 3b 0a 20 20 70 45 78 70 72 20 3d 20  ->db;.  pExpr = 
1fec0 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
1fed0 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  b, pExpr, 0);.  
1fee0 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
1fef0 61 69 6c 65 64 20 29 20 73 71 6c 69 74 65 33 45  ailed ) sqlite3E
1ff00 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
1ff10 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
1ff20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
1ff30 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a  ete(db, pExpr);.
1ff40 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1ff50 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
1ff60 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73   evaluate expres
1ff70 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73  sion pExpr and s
1ff80 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75  tore the.** resu
1ff90 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  lts in register 
1ffa0 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73  target.  The res
1ffb0 75 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e 74  ults are guarant
1ffc0 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a  eed to appear.**
1ffd0 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72   in register tar
1ffe0 67 65 74 2e 20 20 49 66 20 74 68 65 20 65 78 70  get.  If the exp
1fff0 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
20000 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ant, then this r
20010 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20  outine.** might 
20020 63 68 6f 6f 73 65 20 74 6f 20 63 6f 64 65 20 74  choose to code t
20030 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74  he expression at
20040 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
20050 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  time..*/.void sq
20060 6c 69 74 65 33 45 78 70 72 43 6f 64 65 46 61 63  lite3ExprCodeFac
20070 74 6f 72 61 62 6c 65 28 50 61 72 73 65 20 2a 70  torable(Parse *p
20080 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
20090 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b  pr, int target){
200a0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f  .  if( pParse->o
200b0 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 26 26 20  kConstFactor && 
200c0 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
200d0 73 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a  stant(pExpr) ){.
200e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
200f0 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65  odeAtInit(pParse
20100 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c  , pExpr, target,
20110 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
20120 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
20130 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  e(pParse, pExpr,
20140 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a   target);.  }.}.
20150 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
20160 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
20170 74 65 73 20 74 68 65 20 67 69 76 65 6e 20 65 78  tes the given ex
20180 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 75 74  pression and put
20190 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  s the result.** 
201a0 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
201b0 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d  et..**.** Also m
201c0 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
201d0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 73  e expression res
201e0 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65  ults into anothe
201f0 72 20 22 63 61 63 68 65 22 20 72 65 67 69 73 74  r "cache" regist
20200 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79  er.** and modify
20210 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
20220 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  so that the next
20230 20 74 69 6d 65 20 69 74 20 69 73 20 65 76 61 6c   time it is eval
20240 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65  uated,.** the re
20250 73 75 6c 74 20 69 73 20 61 20 63 6f 70 79 20 6f  sult is a copy o
20260 66 20 74 68 65 20 63 61 63 68 65 20 72 65 67 69  f the cache regi
20270 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ster..**.** This
20280 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
20290 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 73   for expressions
202a0 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20 6d   that are used m
202b0 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65  ultiple .** time
202c0 73 2e 20 20 54 68 65 79 20 61 72 65 20 65 76 61  s.  They are eva
202d0 6c 75 61 74 65 64 20 6f 6e 63 65 20 61 6e 64 20  luated once and 
202e0 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
202f0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  he expression.**
20300 20 61 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a   are reused..*/.
20310 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
20320 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50 61 72  CodeAndCache(Par
20330 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
20340 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
20350 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  get){.  Vdbe *v 
20360 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
20370 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20  .  int iMem;..  
20380 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30  assert( target>0
20390 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
203a0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49  xpr->op!=TK_REGI
203b0 53 54 45 52 20 29 3b 0a 20 20 73 71 6c 69 74 65  STER );.  sqlite
203c0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
203d0 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  , pExpr, target)
203e0 3b 0a 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  ;.  iMem = ++pPa
203f0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c  rse->nMem;.  sql
20400 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
20410 2c 20 4f 50 5f 43 6f 70 79 2c 20 74 61 72 67 65  , OP_Copy, targe
20420 74 2c 20 69 4d 65 6d 29 3b 0a 20 20 65 78 70 72  t, iMem);.  expr
20430 54 6f 52 65 67 69 73 74 65 72 28 70 45 78 70 72  ToRegister(pExpr
20440 2c 20 69 4d 65 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , iMem);.}../*.*
20450 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
20460 74 68 61 74 20 70 75 73 68 65 73 20 74 68 65 20  that pushes the 
20470 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65  value of every e
20480 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69  lement of the gi
20490 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
204a0 6e 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 73 65  n list into a se
204b0 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74  quence of regist
204c0 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ers beginning at
204d0 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52   target..**.** R
204e0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
204f0 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65 76 61   of elements eva
20500 6c 75 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  luated..**.** Th
20510 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55  e SQLITE_ECEL_DU
20520 50 20 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20  P flag prevents 
20530 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 66 72  the arguments fr
20540 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 66 69 6c 6c  om being.** fill
20550 65 64 20 75 73 69 6e 67 20 4f 50 5f 53 43 6f 70  ed using OP_SCop
20560 79 2e 20 20 4f 50 5f 43 6f 70 79 20 6d 75 73 74  y.  OP_Copy must
20570 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64   be used instead
20580 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49  ..**.** The SQLI
20590 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 20 61  TE_ECEL_FACTOR a
205a0 72 67 75 6d 65 6e 74 20 61 6c 6c 6f 77 73 20 63  rgument allows c
205b0 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74  onstant argument
205c0 73 20 74 6f 20 62 65 0a 2a 2a 20 66 61 63 74 6f  s to be.** facto
205d0 72 65 64 20 6f 75 74 20 69 6e 74 6f 20 69 6e 69  red out into ini
205e0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 64 65  tialization code
205f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49  ..**.** The SQLI
20600 54 45 5f 45 43 45 4c 5f 52 45 46 20 66 6c 61 67  TE_ECEL_REF flag
20610 20 6d 65 61 6e 73 20 74 68 61 74 20 65 78 70 72   means that expr
20620 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 6c  essions in the l
20630 69 73 74 20 77 69 74 68 0a 2a 2a 20 45 78 70 72  ist with.** Expr
20640 4c 69 73 74 2e 61 5b 5d 2e 75 2e 78 2e 69 4f 72  List.a[].u.x.iOr
20650 64 65 72 42 79 43 6f 6c 3e 30 20 68 61 76 65 20  derByCol>0 have 
20660 61 6c 72 65 61 64 79 20 62 65 65 6e 20 65 76 61  already been eva
20670 6c 75 61 74 65 64 20 61 6e 64 20 73 74 6f 72 65  luated and store
20680 64 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72  d.** in register
20690 73 20 61 74 20 73 72 63 52 65 67 2c 20 61 6e 64  s at srcReg, and
206a0 20 73 6f 20 74 68 65 20 76 61 6c 75 65 20 63 61   so the value ca
206b0 6e 20 62 65 20 63 6f 70 69 65 64 20 66 72 6f 6d  n be copied from
206c0 20 74 68 65 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73   there..*/.int s
206d0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
206e0 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  prList(.  Parse 
206f0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
20700 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
20710 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
20720 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68 65 20 65  List,   /* The e
20730 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74  xpression list t
20740 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
20750 69 6e 74 20 74 61 72 67 65 74 2c 20 20 20 20 20  int target,     
20760 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77     /* Where to w
20770 72 69 74 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a  rite results */.
20780 20 20 69 6e 74 20 73 72 63 52 65 67 2c 20 20 20    int srcReg,   
20790 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 72       /* Source r
207a0 65 67 69 73 74 65 72 73 20 69 66 20 53 51 4c 49  egisters if SQLI
207b0 54 45 5f 45 43 45 4c 5f 52 45 46 20 2a 2f 0a 20  TE_ECEL_REF */. 
207c0 20 75 38 20 66 6c 61 67 73 20 20 20 20 20 20 20   u8 flags       
207d0 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 43      /* SQLITE_EC
207e0 45 4c 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b  EL_* flags */.){
207f0 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
20800 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
20810 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20    int i, j, n;. 
20820 20 75 38 20 63 6f 70 79 4f 70 20 3d 20 28 66 6c   u8 copyOp = (fl
20830 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45  ags & SQLITE_ECE
20840 4c 5f 44 55 50 29 20 3f 20 4f 50 5f 43 6f 70 79  L_DUP) ? OP_Copy
20850 20 3a 20 4f 50 5f 53 43 6f 70 79 3b 0a 20 20 56   : OP_SCopy;.  V
20860 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
20870 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
20880 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  ( pList!=0 );.  
20890 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30  assert( target>0
208a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
208b0 61 72 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 29  arse->pVdbe!=0 )
208c0 3b 20 20 2f 2a 20 4e 65 76 65 72 20 67 65 74 73  ;  /* Never gets
208d0 20 74 68 69 73 20 66 61 72 20 6f 74 68 65 72 77   this far otherw
208e0 69 73 65 20 2a 2f 0a 20 20 6e 20 3d 20 70 4c 69  ise */.  n = pLi
208f0 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28  st->nExpr;.  if(
20900 20 21 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28   !ConstFactorOk(
20910 70 50 61 72 73 65 29 20 29 20 66 6c 61 67 73 20  pParse) ) flags 
20920 26 3d 20 7e 53 51 4c 49 54 45 5f 45 43 45 4c 5f  &= ~SQLITE_ECEL_
20930 46 41 43 54 4f 52 3b 0a 20 20 66 6f 72 28 70 49  FACTOR;.  for(pI
20940 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d  tem=pList->a, i=
20950 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74  0; i<n; i++, pIt
20960 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  em++){.    Expr 
20970 2a 70 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e  *pExpr = pItem->
20980 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 28  pExpr;.    if( (
20990 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
209a0 43 45 4c 5f 52 45 46 29 21 3d 30 20 26 26 20 28  CEL_REF)!=0 && (
209b0 6a 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  j = pList->a[i].
209c0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29  u.x.iOrderByCol)
209d0 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >0 ){.      sqli
209e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
209f0 20 63 6f 70 79 4f 70 2c 20 6a 2b 73 72 63 52 65   copyOp, j+srcRe
20a00 67 2d 31 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a  g-1, target+i);.
20a10 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66      }else if( (f
20a20 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43  lags & SQLITE_EC
20a30 45 4c 5f 46 41 43 54 4f 52 29 21 3d 30 20 26 26  EL_FACTOR)!=0 &&
20a40 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
20a50 6e 73 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b  nstant(pExpr) ){
20a60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
20a70 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61  prCodeAtInit(pPa
20a80 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
20a90 65 74 2b 69 2c 20 30 29 3b 0a 20 20 20 20 7d 65  et+i, 0);.    }e
20aa0 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
20ab0 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
20ac0 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
20ad0 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
20ae0 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 69 66 28  et+i);.      if(
20af0 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 2b 69   inReg!=target+i
20b00 20 29 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65   ){.        Vdbe
20b10 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 20  Op *pOp;.       
20b20 20 69 66 28 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f   if( copyOp==OP_
20b30 43 6f 70 79 0a 20 20 20 20 20 20 20 20 20 26 26  Copy.         &&
20b40 20 28 70 4f 70 3d 73 71 6c 69 74 65 33 56 64 62   (pOp=sqlite3Vdb
20b50 65 47 65 74 4f 70 28 76 2c 20 2d 31 29 29 2d 3e  eGetOp(v, -1))->
20b60 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a  opcode==OP_Copy.
20b70 20 20 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d           && pOp-
20b80 3e 70 31 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69  >p1+pOp->p3+1==i
20b90 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26  nReg.         &&
20ba0 20 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33   pOp->p2+pOp->p3
20bb0 2b 31 3d 3d 74 61 72 67 65 74 2b 69 0a 20 20 20  +1==target+i.   
20bc0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
20bd0 20 20 70 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20    pOp->p3++;.   
20be0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20bf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20c00 65 41 64 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f  eAddOp2(v, copyO
20c10 70 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74  p, inReg, target
20c20 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  +i);.        }. 
20c30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
20c40 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
20c50 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
20c60 6f 64 65 20 66 6f 72 20 61 20 42 45 54 57 45 45  ode for a BETWEE
20c70 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a  N operator..**.*
20c80 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79  *    x BETWEEN y
20c90 20 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65   AND z.**.** The
20ca0 20 61 62 6f 76 65 20 69 73 20 65 71 75 69 76 61   above is equiva
20cb0 6c 65 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20  lent to .**.**  
20cc0 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a    x>=y AND x<=z.
20cd0 2a 2a 0a 2a 2a 20 43 6f 64 65 20 69 74 20 61 73  **.** Code it as
20ce0 20 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61   such, taking ca
20cf0 72 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d  re to do the com
20d00 6d 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f  mon subexpressio
20d10 6e 0a 2a 2a 20 65 6c 69 6d 69 6e 61 74 69 6f 6e  n.** elimination
20d20 20 6f 66 20 78 2e 0a 2a 2f 0a 73 74 61 74 69 63   of x..*/.static
20d30 20 76 6f 69 64 20 65 78 70 72 43 6f 64 65 42 65   void exprCodeBe
20d40 74 77 65 65 6e 28 0a 20 20 50 61 72 73 65 20 2a  tween(.  Parse *
20d50 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
20d60 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
20d70 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
20d80 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
20d90 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  pr,      /* The 
20da0 42 45 54 57 45 45 4e 20 65 78 70 72 65 73 73 69  BETWEEN expressi
20db0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  on */.  int dest
20dc0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d  ,         /* Jum
20dd0 70 20 68 65 72 65 20 69 66 20 74 68 65 20 6a 75  p here if the ju
20de0 6d 70 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20  mp is taken */. 
20df0 20 76 6f 69 64 20 28 2a 78 4a 75 6d 70 49 66 29   void (*xJumpIf)
20e00 28 50 61 72 73 65 2a 2c 45 78 70 72 2a 2c 69 6e  (Parse*,Expr*,in
20e10 74 2c 69 6e 74 29 2c 0a 20 20 69 6e 74 20 6a 75  t,int),.  int ju
20e20 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 54  mpIfNull    /* T
20e30 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20  ake the jump if 
20e40 74 68 65 20 42 45 54 57 45 45 4e 20 69 73 20 4e  the BETWEEN is N
20e50 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ULL */.){.  Expr
20e60 20 65 78 70 72 41 6e 64 3b 20 20 20 20 20 2f 2a   exprAnd;     /*
20e70 20 54 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f   The AND operato
20e80 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e 44 20 78  r in  x>=y AND x
20e90 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70 72 20 63  <=z  */.  Expr c
20ea0 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f 2a 20 54  ompLeft;    /* T
20eb0 68 65 20 20 78 3e 3d 79 20 20 74 65 72 6d 20 2a  he  x>=y  term *
20ec0 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 52 69 67  /.  Expr compRig
20ed0 68 74 3b 20 20 20 2f 2a 20 54 68 65 20 20 78 3c  ht;   /* The  x<
20ee0 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78  =z  term */.  Ex
20ef0 70 72 20 65 78 70 72 58 3b 20 20 20 20 20 20 20  pr exprX;       
20f00 2f 2a 20 54 68 65 20 20 78 20 20 73 75 62 65 78  /* The  x  subex
20f10 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e  pression */.  in
20f20 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20  t regFree1 = 0; 
20f30 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65  /* Temporary use
20f40 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a 20 20   register */..  
20f50 6d 65 6d 73 65 74 28 26 63 6f 6d 70 4c 65 66 74  memset(&compLeft
20f60 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  , 0, sizeof(Expr
20f70 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f  ));.  memset(&co
20f80 6d 70 52 69 67 68 74 2c 20 30 2c 20 73 69 7a 65  mpRight, 0, size
20f90 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 6d 65 6d  of(Expr));.  mem
20fa0 73 65 74 28 26 65 78 70 72 41 6e 64 2c 20 30 2c  set(&exprAnd, 0,
20fb0 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a   sizeof(Expr));.
20fc0 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
20fd0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
20fe0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
20ff0 20 29 3b 0a 20 20 65 78 70 72 58 20 3d 20 2a 70   );.  exprX = *p
21000 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 65  Expr->pLeft;.  e
21010 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41  xprAnd.op = TK_A
21020 4e 44 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 4c  ND;.  exprAnd.pL
21030 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b  eft = &compLeft;
21040 0a 20 20 65 78 70 72 41 6e 64 2e 70 52 69 67 68  .  exprAnd.pRigh
21050 74 20 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a  t = &compRight;.
21060 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20    compLeft.op = 
21070 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c 65 66  TK_GE;.  compLef
21080 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58  t.pLeft = &exprX
21090 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69  ;.  compLeft.pRi
210a0 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ght = pExpr->x.p
210b0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
210c0 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70  ;.  compRight.op
210d0 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70   = TK_LE;.  comp
210e0 52 69 67 68 74 2e 70 4c 65 66 74 20 3d 20 26 65  Right.pLeft = &e
210f0 78 70 72 58 3b 0a 20 20 63 6f 6d 70 52 69 67 68  xprX;.  compRigh
21100 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72  t.pRight = pExpr
21110 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  ->x.pList->a[1].
21120 70 45 78 70 72 3b 0a 20 20 69 66 28 20 73 71 6c  pExpr;.  if( sql
21130 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72  ite3ExprIsVector
21140 28 26 65 78 70 72 58 29 3d 3d 30 20 29 7b 0a 20  (&exprX)==0 ){. 
21150 20 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65     exprToRegiste
21160 72 28 26 65 78 70 72 58 2c 20 73 71 6c 69 74 65  r(&exprX, sqlite
21170 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
21180 61 72 73 65 2c 20 26 65 78 70 72 58 2c 20 26 72  arse, &exprX, &r
21190 65 67 46 72 65 65 31 29 29 3b 0a 20 20 7d 0a 20  egFree1));.  }. 
211a0 20 69 66 28 20 78 4a 75 6d 70 49 66 20 29 7b 0a   if( xJumpIf ){.
211b0 20 20 20 20 78 4a 75 6d 70 49 66 28 70 50 61 72      xJumpIf(pPar
211c0 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65  se, &exprAnd, de
211d0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
211e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65 78  .  }else{.    ex
211f0 70 72 58 2e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  prX.flags |= EP_
21200 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 73 71  FromJoin;.    sq
21210 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
21220 67 65 74 28 70 50 61 72 73 65 2c 20 26 65 78 70  get(pParse, &exp
21230 72 41 6e 64 2c 20 64 65 73 74 29 3b 0a 20 20 7d  rAnd, dest);.  }
21240 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
21250 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
21260 20 72 65 67 46 72 65 65 31 29 3b 0a 0a 20 20 2f   regFree1);..  /
21270 2a 20 45 6e 73 75 72 65 20 61 64 65 71 75 61 74  * Ensure adequat
21280 65 20 74 65 73 74 20 63 6f 76 65 72 61 67 65 20  e test coverage 
21290 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a  */.  testcase( j
212a0 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20  umpIfTrue==0 && 
212b0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26  jumpIfNull==0 &&
212c0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
212d0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
212e0 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d  IfTrue==0 && jum
212f0 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65  pIfNull==0 && re
21300 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74  gFree1!=0 );.  t
21310 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54  estcase( jumpIfT
21320 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66  rue==0 && jumpIf
21330 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72  Null!=0 && regFr
21340 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1==0 );.  test
21350 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65  case( jumpIfTrue
21360 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  ==0 && jumpIfNul
21370 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l!=0 && regFree1
21380 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  !=0 );.  testcas
21390 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30  e( jumpIfTrue!=0
213a0 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
213b0 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30  0 && regFree1==0
213c0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
213d0 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26  jumpIfTrue!=0 &&
213e0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26   jumpIfNull==0 &
213f0 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b  & regFree1!=0 );
21400 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d  .  testcase( jum
21410 70 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75  pIfTrue!=0 && ju
21420 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72  mpIfNull!=0 && r
21430 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
21440 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
21450 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49  True!=0 && jumpI
21460 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
21470 72 65 65 31 21 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a  ree1!=0 );.}../*
21480 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
21490 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20  e for a boolean 
214a0 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20  expression such 
214b0 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d  that a jump is m
214c0 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61  ade.** to the la
214d0 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68  bel "dest" if th
214e0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
214f0 74 72 75 65 20 62 75 74 20 65 78 65 63 75 74 69  true but executi
21500 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20  on.** continues 
21510 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66  straight thru if
21520 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
21530 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20  is false..**.** 
21540 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
21550 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  n evaluates to N
21560 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75  ULL (neither tru
21570 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68  e nor false), th
21580 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a  en.** take the j
21590 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49  ump if the jumpI
215a0 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 53 51  fNull flag is SQ
215b0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e  LITE_JUMPIFNULL.
215c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65  .**.** This code
215d0 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
215e0 66 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69  fact that certai
215f0 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28  n token values (
21600 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72  ex: TK_EQ).** ar
21610 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70  e the same as op
21620 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a  code values (ex:
21630 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70   OP_Eq) that imp
21640 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65  lement the corre
21650 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72  sponding.** oper
21660 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20  ation.  Special 
21670 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65  comments in vdbe
21680 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63  .c and the mkopc
21690 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20  odeh.awk script 
216a0 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70  in.** the make p
216b0 72 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65  rocess cause the
216c0 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69  se values to ali
216d0 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69  gn.  Assert()s i
216e0 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65  n the code.** be
216f0 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20  low verify that 
21700 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20  the numbers are 
21710 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c  aligned correctl
21720 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
21730 65 33 45 78 70 72 49 66 54 72 75 65 28 50 61 72  e3ExprIfTrue(Par
21740 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
21750 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73   *pExpr, int des
21760 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  t, int jumpIfNul
21770 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  l){.  Vdbe *v = 
21780 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
21790 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69   int op = 0;.  i
217a0 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
217b0 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20  .  int regFree2 
217c0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72  = 0;.  int r1, r
217d0 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75  2;..  assert( ju
217e0 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
217f0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a  _JUMPIFNULL || j
21800 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
21810 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
21820 29 20 29 20 20 20 20 20 72 65 74 75 72 6e 3b 20  ) )     return; 
21830 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66   /* Existence of
21840 20 56 44 42 45 20 63 68 65 63 6b 65 64 20 62 79   VDBE checked by
21850 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28   caller */.  if(
21860 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29   NEVER(pExpr==0)
21870 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 4e   ) return;  /* N
21880 6f 20 77 61 79 20 74 68 69 73 20 63 61 6e 20 68  o way this can h
21890 61 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20  appen */.  op = 
218a0 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69  pExpr->op;.  swi
218b0 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
218c0 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20  ase TK_AND: {.  
218d0 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
218e0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
218f0 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74  l(v);.      test
21900 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
21910 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
21920 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
21930 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
21940 4c 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66 4e  Left, d2,jumpIfN
21950 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ull^SQLITE_JUMPI
21960 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71  FNULL);.      sq
21970 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
21980 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
21990 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
219a0 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
219b0 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
219c0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
219d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
219e0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
219f0 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
21a00 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
21a10 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65  arse);.      bre
21a20 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
21a30 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20  se TK_OR: {.    
21a40 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
21a50 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
21a60 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
21a70 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
21a80 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
21a90 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
21aa0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
21ab0 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
21ac0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
21ad0 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
21ae0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
21af0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
21b00 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
21b10 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
21b20 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65  arse);.      bre
21b30 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
21b40 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
21b50 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
21b60 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
21b70 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
21b80 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
21b90 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
21ba0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
21bb0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
21bc0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
21bd0 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  S:.    case TK_I
21be0 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65 73 74  SNOT:.      test
21bf0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20  case( op==TK_IS 
21c00 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
21c10 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20  e( op==TK_ISNOT 
21c20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f  );.      op = (o
21c30 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45  p==TK_IS) ? TK_E
21c40 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20  Q : TK_NE;.     
21c50 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51   jumpIfNull = SQ
21c60 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20  LITE_NULLEQ;.   
21c70 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20     /* Fall thru 
21c80 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  */.    case TK_L
21c90 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
21ca0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
21cb0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
21cc0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
21cd0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
21ce0 51 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73  Q: {.      if( s
21cf0 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74  qlite3ExprIsVect
21d00 6f 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  or(pExpr->pLeft)
21d10 20 29 20 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f   ) goto default_
21d20 65 78 70 72 3b 0a 20 20 20 20 20 20 74 65 73 74  expr;.      test
21d30 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
21d40 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20  ==0 );.      r1 
21d50 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
21d60 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
21d70 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
21d80 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
21d90 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
21da0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
21db0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
21dc0 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
21dd0 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
21de0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
21df0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
21e00 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
21e10 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64         r1, r2, d
21e20 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
21e30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
21e40 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65  K_LT==OP_Lt); te
21e50 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74  stcase(op==OP_Lt
21e60 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
21e70 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a  f(v,op==OP_Lt);.
21e80 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
21e90 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74  LE==OP_Le); test
21ea0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  case(op==OP_Le);
21eb0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
21ec0 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20  v,op==OP_Le);.  
21ed0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54      assert(TK_GT
21ee0 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61  ==OP_Gt); testca
21ef0 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56  se(op==OP_Gt); V
21f00 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
21f10 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20  op==OP_Gt);.    
21f20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d    assert(TK_GE==
21f30 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Ge); testcase
21f40 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62  (op==OP_Ge); Vdb
21f50 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
21f60 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ge);.      
21f70 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50  assert(TK_EQ==OP
21f80 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Eq); testcase(o
21f90 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20  p==OP_Eq);.     
21fa0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
21fb0 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20  v, op==OP_Eq && 
21fc0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
21fd0 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
21fe0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
21ff0 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26  (v, op==OP_Eq &&
22000 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c   jumpIfNull!=SQL
22010 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
22020 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d     assert(TK_NE=
22030 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73  =OP_Ne); testcas
22040 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20  e(op==OP_Ne);.  
22050 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
22060 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20  If(v, op==OP_Ne 
22070 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  && jumpIfNull==S
22080 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
22090 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
220a0 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65  eIf(v, op==OP_Ne
220b0 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
220c0 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
220d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
220e0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
220f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
22100 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
22110 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
22120 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
22130 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
22140 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
22150 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e    assert( TK_ISN
22160 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29  ULL==OP_IsNull )
22170 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  ;   testcase( op
22180 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==TK_ISNULL );. 
22190 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
221a0 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e  NOTNULL==OP_NotN
221b0 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28  ull ); testcase(
221c0 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20   op==TK_NOTNULL 
221d0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
221e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
221f0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
22200 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
22210 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
22220 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
22230 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20  p, r1, dest);.  
22240 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
22250 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e  If(v, op==TK_ISN
22260 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65  ULL);.      Vdbe
22270 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
22280 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20  ==TK_NOTNULL);. 
22290 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
222a0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
222b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
222c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
222d0 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65  WEEN: {.      te
222e0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
222f0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65  ll==0 );.      e
22300 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70  xprCodeBetween(p
22310 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
22320 73 74 2c 20 73 71 6c 69 74 65 33 45 78 70 72 49  st, sqlite3ExprI
22330 66 54 72 75 65 2c 20 6a 75 6d 70 49 66 4e 75 6c  fTrue, jumpIfNul
22340 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
22350 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
22360 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
22370 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
22380 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  IN: {.      int 
22390 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71  destIfFalse = sq
223a0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
223b0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74  el(v);.      int
223c0 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 6a 75   destIfNull = ju
223d0 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20  mpIfNull ? dest 
223e0 3a 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20  : destIfFalse;. 
223f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
22400 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
22410 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73  Expr, destIfFals
22420 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  e, destIfNull);.
22430 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
22440 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a  eGoto(v, dest);.
22450 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
22460 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
22470 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
22480 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
22490 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66  }.#endif.    def
224a0 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65 66 61  ault: {.    defa
224b0 75 6c 74 5f 65 78 70 72 3a 0a 20 20 20 20 20 20  ult_expr:.      
224c0 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 54 72  if( exprAlwaysTr
224d0 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  ue(pExpr) ){.   
224e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
224f0 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20  Goto(v, dest);. 
22500 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65       }else if( e
22510 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70  xprAlwaysFalse(p
22520 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
22530 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a 20 20 20   /* No-op */.   
22540 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22550 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
22560 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
22570 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46 72  e, pExpr, &regFr
22580 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ee1);.        sq
22590 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
225a0 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65  v, OP_If, r1, de
225b0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d  st, jumpIfNull!=
225c0 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  0);.        Vdbe
225d0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
225e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
225f0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
22600 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
22610 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
22620 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
22630 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
22640 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
22650 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
22660 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c  regFree1);.  sql
22670 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
22680 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
22690 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  ee2);  .}../*.**
226a0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
226b0 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70  or a boolean exp
226c0 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61  ression such tha
226d0 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  t a jump is made
226e0 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c  .** to the label
226f0 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65   "dest" if the e
22700 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c  xpression is fal
22710 73 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e  se but execution
22720 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74  .** continues st
22730 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74  raight thru if t
22740 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
22750 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   true..**.** If 
22760 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65  the expression e
22770 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c  valuates to NULL
22780 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e   (neither true n
22790 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a  or false) then.*
227a0 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66  * jump if jumpIf
227b0 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a  Null is SQLITE_J
227c0 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c  UMPIFNULL or fal
227d0 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d  l through if jum
227e0 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e  pIfNull.** is 0.
227f0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
22800 45 78 70 72 49 66 46 61 6c 73 65 28 50 61 72 73  ExprIfFalse(Pars
22810 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
22820 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
22830 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
22840 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
22850 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
22860 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e  int op = 0;.  in
22870 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a  t regFree1 = 0;.
22880 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d    int regFree2 =
22890 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32   0;.  int r1, r2
228a0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d  ;..  assert( jum
228b0 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
228c0 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75  JUMPIFNULL || ju
228d0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
228e0 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29   if( NEVER(v==0)
228f0 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 45 78   ) return; /* Ex
22900 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20  istence of VDBE 
22910 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65  checked by calle
22920 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72  r */.  if( pExpr
22930 3d 3d 30 20 29 20 20 20 20 72 65 74 75 72 6e 3b  ==0 )    return;
22940 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65  ..  /* The value
22950 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e   of pExpr->op an
22960 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64  d op are related
22970 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
22980 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78  *.  **       pEx
22990 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20  pr->op          
229a0 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20    op.  **       
229b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20  ---------       
229c0 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20     ----------.  
229d0 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55  **       TK_ISNU
229e0 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e  LL          OP_N
229f0 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  otNull.  **     
22a00 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20    TK_NOTNULL    
22a10 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20       OP_IsNull. 
22a20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20   **       TK_NE 
22a30 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
22a40 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Eq.  **       TK
22a50 5f 45 51 20 20 20 20 20 20 20 20 20 20 20 20 20  _EQ             
22a60 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20   OP_Ne.  **     
22a70 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20    TK_GT         
22a80 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20       OP_Le.  ** 
22a90 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20        TK_LE     
22aa0 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20           OP_Gt. 
22ab0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20   **       TK_GE 
22ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
22ad0 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Lt.  **       TK
22ae0 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20  _LT             
22af0 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a   OP_Ge.  **.  **
22b00 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65   For other value
22b10 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20  s of pExpr->op, 
22b20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  op is undefined 
22b30 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a  and unused..  **
22b40 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b   The value of TK
22b50 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61  _ and OP_ consta
22b60 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67 65 64  nts are arranged
22b70 20 73 75 63 68 20 74 68 61 74 20 77 65 0a 20 20   such that we.  
22b80 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ** can compute t
22b90 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65  he mapping above
22ba0 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f   using the follo
22bb0 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e  wing expression.
22bc0 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20  .  ** Assert()s 
22bd0 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
22be0 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63  computation is c
22bf0 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f  orrect..  */.  o
22c00 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b  p = ((pExpr->op+
22c10 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31  (TK_ISNULL&1))^1
22c20 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b  )-(TK_ISNULL&1);
22c30 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f  ..  /* Verify co
22c40 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20  rrect alignment 
22c50 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63  of TK_ and OP_ c
22c60 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20  onstants.  */.  
22c70 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
22c80 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20  p!=TK_ISNULL || 
22c90 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  op==OP_NotNull )
22ca0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
22cb0 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c  r->op!=TK_NOTNUL
22cc0 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75  L || op==OP_IsNu
22cd0 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
22ce0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45  pExpr->op!=TK_NE
22cf0 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b   || op==OP_Eq );
22d00 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
22d10 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f  ->op!=TK_EQ || o
22d20 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73  p==OP_Ne );.  as
22d30 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
22d40 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_LT || op==OP
22d50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Ge );.  assert(
22d60 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c   pExpr->op!=TK_L
22d70 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29  E || op==OP_Gt )
22d80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
22d90 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20  r->op!=TK_GT || 
22da0 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61  op==OP_Le );.  a
22db0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
22dc0 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_GE || op==O
22dd0 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63  P_Lt );..  switc
22de0 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
22df0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
22e00 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
22e10 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
22e20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
22e30 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
22e40 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
22e50 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
22e60 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
22e70 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
22e80 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
22e90 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
22ea0 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
22eb0 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
22ec0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
22ed0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
22ee0 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
22ef0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
22f00 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f   }.    case TK_O
22f10 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  R: {.      int d
22f20 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  2 = sqlite3VdbeM
22f30 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
22f40 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
22f50 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
22f60 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
22f70 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
22f80 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20  xpr->pLeft, d2, 
22f90 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54  jumpIfNull^SQLIT
22fa0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
22fb0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
22fc0 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
22fd0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22fe0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
22ff0 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
23000 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
23010 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
23020 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
23030 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20  bel(v, d2);.    
23040 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
23050 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
23060 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
23070 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  }.    case TK_NO
23080 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  T: {.      testc
23090 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
230a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
230b0 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
230c0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
230d0 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
230e0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
230f0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
23100 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61  se TK_IS:.    ca
23110 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20  se TK_ISNOT:.   
23120 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
23130 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b  pr->op==TK_IS );
23140 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
23150 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
23160 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 6f 70  SNOT );.      op
23170 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   = (pExpr->op==T
23180 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e 45 20 3a 20  K_IS) ? TK_NE : 
23190 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 6a 75 6d  TK_EQ;.      jum
231a0 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45  pIfNull = SQLITE
231b0 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f  _NULLEQ;.      /
231c0 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20  * Fall thru */. 
231d0 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
231e0 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
231f0 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
23200 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
23210 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
23220 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
23230 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
23240 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70  e3ExprIsVector(p
23250 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 20 67  Expr->pLeft) ) g
23260 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65 78 70 72  oto default_expr
23270 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
23280 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
23290 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
232a0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
232b0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
232c0 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
232d0 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
232e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
232f0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
23300 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
23310 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ee2);.      code
23320 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
23330 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
23340 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
23350 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23360 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c     r1, r2, dest,
23370 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
23380 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54      assert(TK_LT
23390 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61  ==OP_Lt); testca
233a0 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56  se(op==OP_Lt); V
233b0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
233c0 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20  op==OP_Lt);.    
233d0 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d    assert(TK_LE==
233e0 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Le); testcase
233f0 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62  (op==OP_Le); Vdb
23400 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
23410 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20  ==OP_Le);.      
23420 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50  assert(TK_GT==OP
23430 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Gt); testcase(o
23440 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43  p==OP_Gt); VdbeC
23450 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
23460 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73  OP_Gt);.      as
23470 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47  sert(TK_GE==OP_G
23480 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
23490 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ge); VdbeCov
234a0 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
234b0 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Ge);.      asse
234c0 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29  rt(TK_EQ==OP_Eq)
234d0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
234e0 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 56 64 62  P_Eq);.      Vdb
234f0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
23500 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70  p==OP_Eq && jump
23510 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e  IfNull!=SQLITE_N
23520 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64  ULLEQ);.      Vd
23530 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
23540 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d  op==OP_Eq && jum
23550 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
23560 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 61  NULLEQ);.      a
23570 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f  ssert(TK_NE==OP_
23580 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ne); testcase(op
23590 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ne);.      
235a0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
235b0 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a  , op==OP_Ne && j
235c0 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54  umpIfNull!=SQLIT
235d0 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
235e0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
235f0 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20  v, op==OP_Ne && 
23600 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
23610 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
23620 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
23630 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
23640 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
23650 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
23660 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
23670 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
23680 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
23690 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 72 31  NULL: {.      r1
236a0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
236b0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
236c0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
236d0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73  gFree1);.      s
236e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
236f0 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74  (v, op, r1, dest
23700 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
23710 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  e( op==TK_ISNULL
23720 20 29 3b 20 20 20 56 64 62 65 43 6f 76 65 72 61   );   VdbeCovera
23730 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49  geIf(v, op==TK_I
23740 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65  SNULL);.      te
23750 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
23760 4f 54 4e 55 4c 4c 20 29 3b 20 20 56 64 62 65 43  OTNULL );  VdbeC
23770 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
23780 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20  =TK_NOTNULL);.  
23790 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
237a0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
237b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
237c0 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
237d0 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  EEN: {.      tes
237e0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
237f0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78  l==0 );.      ex
23800 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50  prCodeBetween(pP
23810 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
23820 74 2c 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  t, sqlite3ExprIf
23830 46 61 6c 73 65 2c 20 6a 75 6d 70 49 66 4e 75 6c  False, jumpIfNul
23840 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
23850 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
23860 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
23870 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
23880 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  IN: {.      if( 
23890 6a 75 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a 20 20  jumpIfNull ){.  
238a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
238b0 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
238c0 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73  pExpr, dest, des
238d0 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
238e0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64 65 73  .        int des
238f0 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65  tIfNull = sqlite
23900 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
23910 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
23920 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61  e3ExprCodeIN(pPa
23930 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
23940 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
23950 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
23960 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
23970 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
23980 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
23990 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
239a0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
239b0 20 20 20 20 64 65 66 61 75 6c 74 5f 65 78 70 72      default_expr
239c0 3a 20 0a 20 20 20 20 20 20 69 66 28 20 65 78 70  : .      if( exp
239d0 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78  rAlwaysFalse(pEx
239e0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pr) ){.        s
239f0 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
23a00 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d  , dest);.      }
23a10 65 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c 77  else if( exprAlw
23a20 61 79 73 54 72 75 65 28 70 45 78 70 72 29 20 29  aysTrue(pExpr) )
23a30 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 2d  {.        /* no-
23a40 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73  op */.      }els
23a50 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  e{.        r1 = 
23a60 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
23a70 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
23a80 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  r, &regFree1);. 
23a90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
23aa0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
23ab0 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c 20  fNot, r1, dest, 
23ac0 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a  jumpIfNull!=0);.
23ad0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
23ae0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
23af0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
23b00 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
23b10 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
23b20 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
23b30 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
23b40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
23b50 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
23b60 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
23b70 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
23b80 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
23b90 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
23ba0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20  ;.}../*.** Like 
23bb0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
23bc0 73 65 28 29 20 65 78 63 65 70 74 20 74 68 61 74  se() except that
23bd0 20 61 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20   a copy is made 
23be0 6f 66 20 70 45 78 70 72 20 62 65 66 6f 72 65 0a  of pExpr before.
23bf0 2a 2a 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  ** code generati
23c00 6f 6e 2c 20 61 6e 64 20 74 68 61 74 20 63 6f 70  on, and that cop
23c10 79 20 69 73 20 64 65 6c 65 74 65 64 20 61 66 74  y is deleted aft
23c20 65 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  er code generati
23c30 6f 6e 2e 20 54 68 69 73 0a 2a 2a 20 65 6e 73 75  on. This.** ensu
23c40 72 65 73 20 74 68 61 74 20 74 68 65 20 6f 72 69  res that the ori
23c50 67 69 6e 61 6c 20 70 45 78 70 72 20 69 73 20 75  ginal pExpr is u
23c60 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69  nchanged..*/.voi
23c70 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  d sqlite3ExprIfF
23c80 61 6c 73 65 44 75 70 28 50 61 72 73 65 20 2a 70  alseDup(Parse *p
23c90 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
23ca0 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 69 6e 74  pr, int dest,int
23cb0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
23cc0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
23cd0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72  arse->db;.  Expr
23ce0 20 2a 70 43 6f 70 79 20 3d 20 73 71 6c 69 74 65   *pCopy = sqlite
23cf0 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78  3ExprDup(db, pEx
23d00 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62  pr, 0);.  if( db
23d10 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
23d20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
23d30 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
23d40 73 65 2c 20 70 43 6f 70 79 2c 20 64 65 73 74 2c  se, pCopy, dest,
23d50 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
23d60 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  }.  sqlite3ExprD
23d70 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 70 79 29  elete(db, pCopy)
23d80 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61  ;.}.../*.** Do a
23d90 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e   deep comparison
23da0 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73 69   of two expressi
23db0 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75 72  on trees.  Retur
23dc0 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 0a 2a  n 0 if the two.*
23dd0 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  * expressions ar
23de0 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69 64 65  e completely ide
23df0 6e 74 69 63 61 6c 2e 20 20 52 65 74 75 72 6e 20  ntical.  Return 
23e00 31 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72  1 if they differ
23e10 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20 43 4f   only.** by a CO
23e20 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20 61  LLATE operator a
23e30 74 20 74 68 65 20 74 6f 70 20 6c 65 76 65 6c 2e  t the top level.
23e40 20 20 52 65 74 75 72 6e 20 32 20 69 66 20 74 68    Return 2 if th
23e50 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e  ere are differen
23e60 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61  ces.** other tha
23e70 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  n the top-level 
23e80 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
23e90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73  ..**.** If any s
23ea0 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20  ubelement of pB 
23eb0 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d  has Expr.iTable=
23ec0 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73  =(-1) then it is
23ed0 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63   allowed.** to c
23ee0 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20  ompare equal to 
23ef0 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c  an equivalent el
23f00 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68  ement in pA with
23f10 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54   Expr.iTable==iT
23f20 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 41  ab..**.** The pA
23f30 20 73 69 64 65 20 6d 69 67 68 74 20 62 65 20 75   side might be u
23f40 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45 52  sing TK_REGISTER
23f50 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68  .  If that is th
23f60 65 20 63 61 73 65 20 61 6e 64 20 70 42 20 69 73  e case and pB is
23f70 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e 67 20 54 4b  .** not using TK
23f80 5f 52 45 47 49 53 54 45 52 20 62 75 74 20 69 73  _REGISTER but is
23f90 20 6f 74 68 65 72 77 69 73 65 20 65 71 75 69 76   otherwise equiv
23fa0 61 6c 65 6e 74 2c 20 74 68 65 6e 20 73 74 69 6c  alent, then stil
23fb0 6c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a  l return 0..**.*
23fc0 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69 73  * Sometimes this
23fd0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
23fe0 74 75 72 6e 20 32 20 65 76 65 6e 20 69 66 20 74  turn 2 even if t
23ff0 68 65 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  he two expressio
24000 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65  ns.** really are
24010 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 49 66   equivalent.  If
24020 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65   we cannot prove
24030 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
24040 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65  sions are.** ide
24050 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74 75 72  ntical, we retur
24060 6e 20 32 20 6a 75 73 74 20 74 6f 20 62 65 20 73  n 2 just to be s
24070 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73  afe.  So if this
24080 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
24090 72 6e 73 20 32 2c 20 74 68 65 6e 20 79 6f 75 20  rns 2, then you 
240a0 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e  do not really kn
240b0 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e 20 69  ow for certain i
240c0 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70  f the two.** exp
240d0 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65  ressions are the
240e0 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66 20 79   same.  But if y
240f0 6f 75 20 67 65 74 20 61 20 30 20 6f 72 20 31 20  ou get a 0 or 1 
24100 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75  return, then you
24110 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72 65 20  .** can be sure 
24120 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
24130 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 49  are the same.  I
24140 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77 68 65  n the places whe
24150 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
24160 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74 20 64  ne is used, it d
24170 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74 6f 20  oes not hurt to 
24180 67 65 74 20 61 6e 20 65 78 74 72 61 20 32 20 2d  get an extra 2 -
24190 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69   that.** just mi
241a0 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 73 6f  ght result in so
241b0 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77  me slightly slow
241c0 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20 72 65  er code.  But re
241d0 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e  turning.** an in
241e0 63 6f 72 72 65 63 74 20 30 20 6f 72 20 31 20 63  correct 0 or 1 c
241f0 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 6d  ould lead to a m
24200 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  alfunction..*/.i
24210 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
24220 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41 2c 20  mpare(Expr *pA, 
24230 45 78 70 72 20 2a 70 42 2c 20 69 6e 74 20 69 54  Expr *pB, int iT
24240 61 62 29 7b 0a 20 20 75 33 32 20 63 6f 6d 62 69  ab){.  u32 combi
24250 6e 65 64 46 6c 61 67 73 3b 0a 20 20 69 66 28 20  nedFlags;.  if( 
24260 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29  pA==0 || pB==0 )
24270 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d  {.    return pB=
24280 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a 20 20 7d  =pA ? 0 : 2;.  }
24290 0a 20 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  .  combinedFlags
242a0 20 3d 20 70 41 2d 3e 66 6c 61 67 73 20 7c 20 70   = pA->flags | p
242b0 42 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20  B->flags;.  if( 
242c0 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20  combinedFlags & 
242d0 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20  EP_IntValue ){. 
242e0 20 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67     if( (pA->flag
242f0 73 26 70 42 2d 3e 66 6c 61 67 73 26 45 50 5f 49  s&pB->flags&EP_I
24300 6e 74 56 61 6c 75 65 29 21 3d 30 20 26 26 20 70  ntValue)!=0 && p
24310 41 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d 70 42 2d  A->u.iValue==pB-
24320 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20 20 20  >u.iValue ){.   
24330 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
24340 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b   }.    return 2;
24350 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f  .  }.  if( pA->o
24360 70 21 3d 70 42 2d 3e 6f 70 20 29 7b 0a 20 20 20  p!=pB->op ){.   
24370 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f   if( pA->op==TK_
24380 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74  COLLATE && sqlit
24390 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  e3ExprCompare(pA
243a0 2d 3e 70 4c 65 66 74 2c 20 70 42 2c 20 69 54 61  ->pLeft, pB, iTa
243b0 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65  b)<2 ){.      re
243c0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
243d0 20 20 69 66 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b    if( pB->op==TK
243e0 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69  _COLLATE && sqli
243f0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
24400 41 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54  A, pB->pLeft, iT
24410 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72  ab)<2 ){.      r
24420 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
24430 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
24440 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54  .  if( pA->op!=T
24450 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e  K_COLUMN && pA->
24460 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op!=TK_AGG_COLUM
24470 4e 20 26 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65  N && pA->u.zToke
24480 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d  n ){.    if( pA-
24490 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e  >op==TK_FUNCTION
244a0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
244b0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 41 2d  lite3StrICmp(pA-
244c0 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e  >u.zToken,pB->u.
244d0 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 20 72 65 74  zToken)!=0 ) ret
244e0 75 72 6e 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65  urn 2;.    }else
244f0 20 69 66 28 20 73 74 72 63 6d 70 28 70 41 2d 3e   if( strcmp(pA->
24500 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a  u.zToken,pB->u.z
24510 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20  Token)!=0 ){.   
24520 20 20 20 72 65 74 75 72 6e 20 70 41 2d 3e 6f 70     return pA->op
24530 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 3f 20 31  ==TK_COLLATE ? 1
24540 20 3a 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   : 2;.    }.  }.
24550 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73    if( (pA->flags
24560 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 21   & EP_Distinct)!
24570 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45 50  =(pB->flags & EP
24580 5f 44 69 73 74 69 6e 63 74 29 20 29 20 72 65 74  _Distinct) ) ret
24590 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 41 4c 57  urn 2;.  if( ALW
245a0 41 59 53 28 28 63 6f 6d 62 69 6e 65 64 46 6c 61  AYS((combinedFla
245b0 67 73 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  gs & EP_TokenOnl
245c0 79 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 69 66  y)==0) ){.    if
245d0 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20  ( combinedFlags 
245e0 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29  & EP_xIsSelect )
245f0 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69   return 2;.    i
24600 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
24610 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c  mpare(pA->pLeft,
24620 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62   pB->pLeft, iTab
24630 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
24640 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
24650 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69  rCompare(pA->pRi
24660 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 2c  ght, pB->pRight,
24670 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   iTab) ) return 
24680 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  2;.    if( sqlit
24690 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
246a0 65 28 70 41 2d 3e 78 2e 70 4c 69 73 74 2c 20 70  e(pA->x.pList, p
246b0 42 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61 62  B->x.pList, iTab
246c0 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
246d0 20 20 69 66 28 20 41 4c 57 41 59 53 28 28 63 6f    if( ALWAYS((co
246e0 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50  mbinedFlags & EP
246f0 5f 52 65 64 75 63 65 64 29 3d 3d 30 29 20 26 26  _Reduced)==0) &&
24700 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49   pA->op!=TK_STRI
24710 4e 47 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  NG ){.      if( 
24720 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d  pA->iColumn!=pB-
24730 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72  >iColumn ) retur
24740 6e 20 32 3b 0a 20 20 20 20 20 20 69 66 28 20 70  n 2;.      if( p
24750 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69  A->iTable!=pB->i
24760 54 61 62 6c 65 20 0a 20 20 20 20 20 20 20 26 26  Table .       &&
24770 20 28 70 41 2d 3e 69 54 61 62 6c 65 21 3d 69 54   (pA->iTable!=iT
24780 61 62 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e  ab || NEVER(pB->
24790 69 54 61 62 6c 65 3e 3d 30 29 29 20 29 20 72 65  iTable>=0)) ) re
247a0 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20  turn 2;.    }.  
247b0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
247c0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
247d0 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65  wo ExprList obje
247e0 63 74 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69  cts.  Return 0 i
247f0 66 20 74 68 65 79 20 61 72 65 20 69 64 65 6e 74  f they are ident
24800 69 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e  ical and .** non
24810 2d 7a 65 72 6f 20 69 66 20 74 68 65 79 20 64 69  -zero if they di
24820 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e  ffer in any way.
24830 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75  .**.** If any su
24840 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68  belement of pB h
24850 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d  as Expr.iTable==
24860 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73 20  (-1) then it is 
24870 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f  allowed.** to co
24880 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61  mpare equal to a
24890 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65  n equivalent ele
248a0 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20  ment in pA with 
248b0 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61  Expr.iTable==iTa
248c0 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  b..**.** This ro
248d0 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 74 75  utine might retu
248e0 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20  rn non-zero for 
248f0 65 71 75 69 76 61 6c 65 6e 74 20 45 78 70 72 4c  equivalent ExprL
24900 69 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e  ists.  The.** on
24910 6c 79 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 77  ly consequence w
24920 69 6c 6c 20 62 65 20 64 69 73 61 62 6c 65 64 20  ill be disabled 
24930 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20  optimizations.  
24940 42 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  But this routine
24950 0a 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72 20 72  .** must never r
24960 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 74  eturn 0 if the t
24970 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65  wo ExprList obje
24980 63 74 73 20 61 72 65 20 64 69 66 66 65 72 65 6e  cts are differen
24990 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75  t, or.** a malfu
249a0 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75  nction will resu
249b0 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55  lt..**.** Two NU
249c0 4c 4c 20 70 6f 69 6e 74 65 72 73 20 61 72 65 20  LL pointers are 
249d0 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
249e0 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20   the same.  But 
249f0 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a  a NULL pointer.*
24a00 2a 20 61 6c 77 61 79 73 20 64 69 66 66 65 72 73  * always differs
24a10 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c   from a non-NULL
24a20 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74   pointer..*/.int
24a30 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
24a40 43 6f 6d 70 61 72 65 28 45 78 70 72 4c 69 73 74  Compare(ExprList
24a50 20 2a 70 41 2c 20 45 78 70 72 4c 69 73 74 20 2a   *pA, ExprList *
24a60 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20  pB, int iTab){. 
24a70 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41   int i;.  if( pA
24a80 3d 3d 30 20 26 26 20 70 42 3d 3d 30 20 29 20 72  ==0 && pB==0 ) r
24a90 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
24aa0 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20  A==0 || pB==0 ) 
24ab0 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
24ac0 70 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e  pA->nExpr!=pB->n
24ad0 45 78 70 72 20 29 20 72 65 74 75 72 6e 20 31 3b  Expr ) return 1;
24ae0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41  .  for(i=0; i<pA
24af0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
24b00 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 41 20     Expr *pExprA 
24b10 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  = pA->a[i].pExpr
24b20 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  ;.    Expr *pExp
24b30 72 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45  rB = pB->a[i].pE
24b40 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 41 2d  xpr;.    if( pA-
24b50 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21  >a[i].sortOrder!
24b60 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  =pB->a[i].sortOr
24b70 64 65 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  der ) return 1;.
24b80 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
24b90 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78 70 72  xprCompare(pExpr
24ba0 41 2c 20 70 45 78 70 72 42 2c 20 69 54 61 62 29  A, pExprB, iTab)
24bb0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
24bc0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
24bd0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
24be0 65 20 69 66 20 77 65 20 63 61 6e 20 70 72 6f 76  e if we can prov
24bf0 65 20 74 68 65 20 70 45 32 20 77 69 6c 6c 20 61  e the pE2 will a
24c00 6c 77 61 79 73 20 62 65 20 74 72 75 65 20 69 66  lways be true if
24c10 20 70 45 31 20 69 73 0a 2a 2a 20 74 72 75 65 2e   pE1 is.** true.
24c20 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69    Return false i
24c30 66 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d 70  f we cannot comp
24c40 6c 65 74 65 20 74 68 65 20 70 72 6f 6f 66 20 6f  lete the proof o
24c50 72 20 69 66 20 70 45 32 20 6d 69 67 68 74 0a 2a  r if pE2 might.*
24c60 2a 20 62 65 20 66 61 6c 73 65 2e 20 20 45 78 61  * be false.  Exa
24c70 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  mples:.**.**    
24c80 20 70 45 31 3a 20 78 3d 3d 35 20 20 20 20 20 20   pE1: x==5      
24c90 20 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20   pE2: x==5      
24ca0 20 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74         Result: t
24cb0 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  rue.**     pE1: 
24cc0 78 3e 30 20 20 20 20 20 20 20 20 70 45 32 3a 20  x>0        pE2: 
24cd0 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20 20  x==5            
24ce0 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a   Result: false.*
24cf0 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 32 31 20  *     pE1: x=21 
24d00 20 20 20 20 20 20 70 45 32 3a 20 78 3d 32 31 20        pE2: x=21 
24d10 4f 52 20 79 3d 34 33 20 20 20 20 20 52 65 73 75  OR y=43     Resu
24d20 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20  lt: true.**     
24d30 70 45 31 3a 20 78 21 3d 31 32 33 20 20 20 20 20  pE1: x!=123     
24d40 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55  pE2: x IS NOT NU
24d50 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72  LL    Result: tr
24d60 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  ue.**     pE1: x
24d70 21 3d 3f 31 20 20 20 20 20 20 70 45 32 3a 20 78  !=?1      pE2: x
24d80 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20   IS NOT NULL    
24d90 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20  Result: true.** 
24da0 20 20 20 20 70 45 31 3a 20 78 20 49 53 20 4e 55      pE1: x IS NU
24db0 4c 4c 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f  LL  pE2: x IS NO
24dc0 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74  T NULL    Result
24dd0 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70  : false.**     p
24de0 45 31 3a 20 78 20 49 53 20 3f 32 20 20 20 20 70  E1: x IS ?2    p
24df0 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c  E2: x IS NOT NUL
24e00 4c 20 20 20 20 52 65 75 73 6c 74 3a 20 66 61 6c  L    Reuslt: fal
24e10 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f  se.**.** When co
24e20 6d 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d  mparing TK_COLUM
24e30 4e 20 6e 6f 64 65 73 20 62 65 74 77 65 65 6e 20  N nodes between 
24e40 70 45 31 20 61 6e 64 20 70 45 32 2c 20 69 66 20  pE1 and pE2, if 
24e50 70 45 32 20 68 61 73 0a 2a 2a 20 45 78 70 72 2e  pE2 has.** Expr.
24e60 69 54 61 62 6c 65 3c 30 20 74 68 65 6e 20 61 73  iTable<0 then as
24e70 73 75 6d 65 20 61 20 74 61 62 6c 65 20 6e 75 6d  sume a table num
24e80 62 65 72 20 67 69 76 65 6e 20 62 79 20 69 54 61  ber given by iTa
24e90 62 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 69 6e  b..**.** When in
24ea0 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 20 66   doubt, return f
24eb0 61 6c 73 65 2e 20 20 52 65 74 75 72 6e 69 6e 67  alse.  Returning
24ec0 20 74 72 75 65 20 6d 69 67 68 74 20 67 69 76 65   true might give
24ed0 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a   a performance.*
24ee0 2a 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e 20 20  * improvement.  
24ef0 52 65 74 75 72 6e 69 6e 67 20 66 61 6c 73 65 20  Returning false 
24f00 6d 69 67 68 74 20 63 61 75 73 65 20 61 20 70 65  might cause a pe
24f10 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74  rformance reduct
24f20 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69 74 20 77  ion, but.** it w
24f30 69 6c 6c 20 61 6c 77 61 79 73 20 67 69 76 65 20  ill always give 
24f40 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77  the correct answ
24f50 65 72 20 61 6e 64 20 69 73 20 68 65 6e 63 65 20  er and is hence 
24f60 61 6c 77 61 79 73 20 73 61 66 65 2e 0a 2a 2f 0a  always safe..*/.
24f70 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
24f80 6d 70 6c 69 65 73 45 78 70 72 28 45 78 70 72 20  mpliesExpr(Expr 
24f90 2a 70 45 31 2c 20 45 78 70 72 20 2a 70 45 32 2c  *pE1, Expr *pE2,
24fa0 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 66   int iTab){.  if
24fb0 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
24fc0 70 61 72 65 28 70 45 31 2c 20 70 45 32 2c 20 69  pare(pE1, pE2, i
24fd0 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Tab)==0 ){.    r
24fe0 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
24ff0 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f  f( pE2->op==TK_O
25000 52 0a 20 20 20 26 26 20 28 73 71 6c 69 74 65 33  R.   && (sqlite3
25010 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
25020 70 45 31 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c  pE1, pE2->pLeft,
25030 20 69 54 61 62 29 0a 20 20 20 20 20 20 20 20 20   iTab).         
25040 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 45 78      || sqlite3Ex
25050 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45  prImpliesExpr(pE
25060 31 2c 20 70 45 32 2d 3e 70 52 69 67 68 74 2c 20  1, pE2->pRight, 
25070 69 54 61 62 29 20 29 0a 20 20 29 7b 0a 20 20 20  iTab) ).  ){.   
25080 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
25090 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b   if( pE2->op==TK
250a0 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20 73  _NOTNULL.   && s
250b0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
250c0 65 28 70 45 31 2d 3e 70 4c 65 66 74 2c 20 70 45  e(pE1->pLeft, pE
250d0 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3d  2->pLeft, iTab)=
250e0 3d 30 0a 20 20 20 26 26 20 28 70 45 31 2d 3e 6f  =0.   && (pE1->o
250f0 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26 26 20  p!=TK_ISNULL && 
25100 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 29 0a  pE1->op!=TK_IS).
25110 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
25120 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
25130 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  0;.}../*.** An i
25140 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
25150 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
25160 72 65 20 69 73 20 75 73 65 64 20 62 79 20 74 68  re is used by th
25170 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a  e tree walker.**
25180 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
25190 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 63   an expression c
251a0 61 6e 20 62 65 20 65 76 61 6c 75 61 74 65 64 20  an be evaluated 
251b0 62 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  by reference to 
251c0 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 6e 6c  the.** index onl
251d0 79 2c 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  y, without havin
251e0 67 20 74 6f 20 64 6f 20 61 20 73 65 61 72 63 68  g to do a search
251f0 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70   for the corresp
25200 6f 6e 64 69 6e 67 0a 2a 2a 20 74 61 62 6c 65 20  onding.** table 
25210 65 6e 74 72 79 2e 20 20 54 68 65 20 49 64 78 43  entry.  The IdxC
25220 6f 76 65 72 2e 70 49 64 78 20 66 69 65 6c 64 20  over.pIdx field 
25230 69 73 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49  is the index.  I
25240 64 78 43 6f 76 65 72 2e 69 43 75 72 0a 2a 2a 20  dxCover.iCur.** 
25250 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f  is the cursor fo
25260 72 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a  r the table..*/.
25270 73 74 72 75 63 74 20 49 64 78 43 6f 76 65 72 20  struct IdxCover 
25280 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  {.  Index *pIdx;
25290 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
252a0 78 20 74 6f 20 62 65 20 74 65 73 74 65 64 20 66  x to be tested f
252b0 6f 72 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20  or coverage */. 
252c0 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20   int iCur;      
252d0 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
252e0 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  er for the table
252f0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
25300 6f 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 7d  o the index */.}
25310 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  ;../*.** Check t
25320 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
25330 72 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  re references to
25340 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c   columns in tabl
25350 65 20 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 75  e .** pWalker->u
25360 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69 43 75 72  .pIdxCover->iCur
25370 20 63 61 6e 20 62 65 20 73 61 74 69 73 66 69 65   can be satisfie
25380 64 20 75 73 69 6e 67 20 74 68 65 20 69 6e 64 65  d using the inde
25390 78 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  x.** pWalker->u.
253a0 70 49 64 78 43 6f 76 65 72 2d 3e 70 49 64 78 2e  pIdxCover->pIdx.
253b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
253c0 78 70 72 49 64 78 43 6f 76 65 72 28 57 61 6c 6b  xprIdxCover(Walk
253d0 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
253e0 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28  r *pExpr){.  if(
253f0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
25400 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 70 45 78 70  OLUMN.   && pExp
25410 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61 6c 6b  r->iTable==pWalk
25420 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d  er->u.pIdxCover-
25430 3e 69 43 75 72 0a 20 20 20 26 26 20 73 71 6c 69  >iCur.   && sqli
25440 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78  te3ColumnOfIndex
25450 28 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78  (pWalker->u.pIdx
25460 43 6f 76 65 72 2d 3e 70 49 64 78 2c 20 70 45 78  Cover->pIdx, pEx
25470 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3c 30 0a 20  pr->iColumn)<0. 
25480 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d   ){.    pWalker-
25490 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20  >eCode = 1;.    
254a0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
254b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  ;.  }.  return W
254c0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
254d0 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
254e0 69 66 20 61 6e 20 69 6e 64 65 78 20 70 49 64 78  if an index pIdx
254f0 20 6f 6e 20 74 61 62 6c 65 20 77 69 74 68 20 63   on table with c
25500 75 72 73 6f 72 20 69 43 75 72 20 63 6f 6e 74 61  ursor iCur conta
25510 69 6e 73 20 77 69 6c 6c 0a 2a 2a 20 74 68 65 20  ins will.** the 
25520 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
25530 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  .  Return true i
25540 66 20 74 68 65 20 69 6e 64 65 78 20 64 6f 65 73  f the index does
25550 20 63 6f 76 65 72 20 74 68 65 0a 2a 2a 20 65 78   cover the.** ex
25560 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 66 61 6c  pression and fal
25570 73 65 20 69 66 20 74 68 65 20 70 45 78 70 72 20  se if the pExpr 
25580 65 78 70 72 65 73 73 69 6f 6e 20 72 65 66 65 72  expression refer
25590 65 6e 63 65 73 20 74 61 62 6c 65 20 63 6f 6c 75  ences table colu
255a0 6d 6e 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20  mns.** that are 
255b0 6e 6f 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65  not found in the
255c0 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a   index pIdx..**.
255d0 2a 2a 20 41 6e 20 69 6e 64 65 78 20 63 6f 76 65  ** An index cove
255e0 72 69 6e 67 20 61 6e 20 65 78 70 72 65 73 73 69  ring an expressi
255f0 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  on means that th
25600 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e  e expression can
25610 20 62 65 0a 2a 2a 20 65 76 61 6c 75 61 74 65 64   be.** evaluated
25620 20 75 73 69 6e 67 20 6f 6e 6c 79 20 74 68 65 20   using only the 
25630 69 6e 64 65 78 20 61 6e 64 20 77 69 74 68 6f 75  index and withou
25640 74 20 68 61 76 69 6e 67 20 74 6f 20 6c 6f 6f 6b  t having to look
25650 75 70 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73  up the.** corres
25660 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20 65 6e  ponding table en
25670 74 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  try..*/.int sqli
25680 74 65 33 45 78 70 72 43 6f 76 65 72 65 64 42 79  te3ExprCoveredBy
25690 49 6e 64 65 78 28 0a 20 20 45 78 70 72 20 2a 70  Index(.  Expr *p
256a0 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  Expr,        /* 
256b0 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  The index to be 
256c0 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  tested */.  int 
256d0 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  iCur,           
256e0 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6e 75  /* The cursor nu
256f0 6d 62 65 72 20 66 6f 72 20 74 68 65 20 63 6f 72  mber for the cor
25700 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65  responding table
25710 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
25720 78 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  x         /* The
25730 20 69 6e 64 65 78 20 74 68 61 74 20 6d 69 67 68   index that migh
25740 74 20 62 65 20 75 73 65 64 20 66 6f 72 20 63 6f  t be used for co
25750 76 65 72 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 57  verage */.){.  W
25760 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72 75 63  alker w;.  struc
25770 74 20 49 64 78 43 6f 76 65 72 20 78 63 6f 76 3b  t IdxCover xcov;
25780 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c  .  memset(&w, 0,
25790 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 78   sizeof(w));.  x
257a0 63 6f 76 2e 69 43 75 72 20 3d 20 69 43 75 72 3b  cov.iCur = iCur;
257b0 0a 20 20 78 63 6f 76 2e 70 49 64 78 20 3d 20 70  .  xcov.pIdx = p
257c0 49 64 78 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  Idx;.  w.xExprCa
257d0 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 49 64 78  llback = exprIdx
257e0 43 6f 76 65 72 3b 0a 20 20 77 2e 75 2e 70 49 64  Cover;.  w.u.pId
257f0 78 43 6f 76 65 72 20 3d 20 26 78 63 6f 76 3b 0a  xCover = &xcov;.
25800 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
25810 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 20 20  r(&w, pExpr);.  
25820 72 65 74 75 72 6e 20 21 77 2e 65 43 6f 64 65 3b  return !w.eCode;
25830 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .}.../*.** An in
25840 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
25850 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
25860 65 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  e is used by the
25870 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20   tree walker.** 
25880 74 6f 20 63 6f 75 6e 74 20 72 65 66 65 72 65 6e  to count referen
25890 63 65 73 20 74 6f 20 74 61 62 6c 65 20 63 6f 6c  ces to table col
258a0 75 6d 6e 73 20 69 6e 20 74 68 65 20 61 72 67 75  umns in the argu
258b0 6d 65 6e 74 73 20 6f 66 20 61 6e 20 0a 2a 2a 20  ments of an .** 
258c0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
258d0 6f 6e 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  on, in order to 
258e0 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a 2a  implement the.**
258f0 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e   sqlite3Function
25900 54 68 69 73 53 72 63 28 29 20 72 6f 75 74 69 6e  ThisSrc() routin
25910 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 72 63  e..*/.struct Src
25920 43 6f 75 6e 74 20 7b 0a 20 20 53 72 63 4c 69 73  Count {.  SrcLis
25930 74 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 4f 6e  t *pSrc;   /* On
25940 65 20 70 61 72 74 69 63 75 6c 61 72 20 46 52 4f  e particular FRO
25950 4d 20 63 6c 61 75 73 65 20 69 6e 20 61 20 6e 65  M clause in a ne
25960 73 74 65 64 20 71 75 65 72 79 20 2a 2f 0a 20 20  sted query */.  
25970 69 6e 74 20 6e 54 68 69 73 3b 20 20 20 20 20 20  int nThis;      
25980 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
25990 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75  ferences to colu
259a0 6d 6e 73 20 69 6e 20 70 53 72 63 4c 69 73 74 20  mns in pSrcList 
259b0 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74 68 65 72 3b  */.  int nOther;
259c0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
259d0 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
259e0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74 68 65   columns in othe
259f0 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 73 20 2a  r FROM clauses *
25a00 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e  /.};../*.** Coun
25a10 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
25a20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f  references to co
25a30 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  lumns..*/.static
25a40 20 69 6e 74 20 65 78 70 72 53 72 63 43 6f 75 6e   int exprSrcCoun
25a50 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  t(Walker *pWalke
25a60 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
25a70 0a 20 20 2f 2a 20 54 68 65 20 4e 45 56 45 52 28  .  /* The NEVER(
25a80 29 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20  ) on the second 
25a90 74 65 72 6d 20 69 73 20 62 65 63 61 75 73 65 20  term is because 
25aa0 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55  sqlite3FunctionU
25ab0 73 65 73 54 68 69 73 53 72 63 28 29 0a 20 20 2a  sesThisSrc().  *
25ac0 2a 20 69 73 20 61 6c 77 61 79 73 20 63 61 6c 6c  * is always call
25ad0 65 64 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65  ed before sqlite
25ae0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
25af0 65 67 61 74 65 73 28 29 20 61 6e 64 20 73 6f 20  egates() and so 
25b00 74 68 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55  the.  ** TK_COLU
25b10 4d 4e 73 20 68 61 76 65 20 6e 6f 74 20 79 65 74  MNs have not yet
25b20 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20   been converted 
25b30 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  into TK_AGG_COLU
25b40 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a 20 73 71 6c  MN.  If.  ** sql
25b50 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73  ite3FunctionUses
25b60 54 68 69 73 53 72 63 28 29 20 69 73 20 75 73 65  ThisSrc() is use
25b70 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 69 6e  d differently in
25b80 20 74 68 65 20 66 75 74 75 72 65 2c 20 74 68 65   the future, the
25b90 0a 20 20 2a 2a 20 4e 45 56 45 52 28 29 20 77 69  .  ** NEVER() wi
25ba0 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65  ll need to be re
25bb0 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  moved. */.  if( 
25bc0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
25bd0 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45 52 28 70 45  LUMN || NEVER(pE
25be0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
25bf0 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20 20 20 69  COLUMN) ){.    i
25c00 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74  nt i;.    struct
25c10 20 53 72 63 43 6f 75 6e 74 20 2a 70 20 3d 20 70   SrcCount *p = p
25c20 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 72 63 43 6f  Walker->u.pSrcCo
25c30 75 6e 74 3b 0a 20 20 20 20 53 72 63 4c 69 73 74  unt;.    SrcList
25c40 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63   *pSrc = p->pSrc
25c50 3b 0a 20 20 20 20 69 6e 74 20 6e 53 72 63 20 3d  ;.    int nSrc =
25c60 20 70 53 72 63 20 3f 20 70 53 72 63 2d 3e 6e 53   pSrc ? pSrc->nS
25c70 72 63 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72 28  rc : 0;.    for(
25c80 69 3d 30 3b 20 69 3c 6e 53 72 63 3b 20 69 2b 2b  i=0; i<nSrc; i++
25c90 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  ){.      if( pEx
25ca0 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63  pr->iTable==pSrc
25cb0 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29  ->a[i].iCursor )
25cc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
25cd0 20 20 69 66 28 20 69 3c 6e 53 72 63 20 29 7b 0a    if( i<nSrc ){.
25ce0 20 20 20 20 20 20 70 2d 3e 6e 54 68 69 73 2b 2b        p->nThis++
25cf0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
25d00 20 20 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a     p->nOther++;.
25d10 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
25d20 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
25d30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  .}../*.** Determ
25d40 69 6e 65 20 69 66 20 61 6e 79 20 6f 66 20 74 68  ine if any of th
25d50 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74  e arguments to t
25d60 68 65 20 70 45 78 70 72 20 46 75 6e 63 74 69 6f  he pExpr Functio
25d70 6e 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 70  n reference.** p
25d80 53 72 63 4c 69 73 74 2e 20 20 52 65 74 75 72 6e  SrcList.  Return
25d90 20 74 72 75 65 20 69 66 20 74 68 65 79 20 64 6f   true if they do
25da0 2e 20 20 41 6c 73 6f 20 72 65 74 75 72 6e 20 74  .  Also return t
25db0 72 75 65 20 69 66 20 74 68 65 20 66 75 6e 63 74  rue if the funct
25dc0 69 6f 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20 61 72  ion.** has no ar
25dd0 67 75 6d 65 6e 74 73 20 6f 72 20 68 61 73 20 6f  guments or has o
25de0 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20 61 72 67  nly constant arg
25df0 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20  uments.  Return 
25e00 66 61 6c 73 65 20 69 66 20 70 45 78 70 72 0a 2a  false if pExpr.*
25e10 2a 20 72 65 66 65 72 65 6e 63 65 73 20 63 6f 6c  * references col
25e20 75 6d 6e 73 20 62 75 74 20 6e 6f 74 20 63 6f 6c  umns but not col
25e30 75 6d 6e 73 20 6f 66 20 74 61 62 6c 65 73 20 66  umns of tables f
25e40 6f 75 6e 64 20 69 6e 20 70 53 72 63 4c 69 73 74  ound in pSrcList
25e50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
25e60 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73  FunctionUsesThis
25e70 53 72 63 28 45 78 70 72 20 2a 70 45 78 70 72 2c  Src(Expr *pExpr,
25e80 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69   SrcList *pSrcLi
25e90 73 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  st){.  Walker w;
25ea0 0a 20 20 73 74 72 75 63 74 20 53 72 63 43 6f 75  .  struct SrcCou
25eb0 6e 74 20 63 6e 74 3b 0a 20 20 61 73 73 65 72 74  nt cnt;.  assert
25ec0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
25ed0 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  AGG_FUNCTION );.
25ee0 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20    memset(&w, 0, 
25ef0 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e  sizeof(w));.  w.
25f00 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
25f10 65 78 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20 20  exprSrcCount;.  
25f20 77 2e 75 2e 70 53 72 63 43 6f 75 6e 74 20 3d 20  w.u.pSrcCount = 
25f30 26 63 6e 74 3b 0a 20 20 63 6e 74 2e 70 53 72 63  &cnt;.  cnt.pSrc
25f40 20 3d 20 70 53 72 63 4c 69 73 74 3b 0a 20 20 63   = pSrcList;.  c
25f50 6e 74 2e 6e 54 68 69 73 20 3d 20 30 3b 0a 20 20  nt.nThis = 0;.  
25f60 63 6e 74 2e 6e 4f 74 68 65 72 20 3d 20 30 3b 0a  cnt.nOther = 0;.
25f70 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
25f80 72 4c 69 73 74 28 26 77 2c 20 70 45 78 70 72 2d  rList(&w, pExpr-
25f90 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  >x.pList);.  ret
25fa0 75 72 6e 20 63 6e 74 2e 6e 54 68 69 73 3e 30 20  urn cnt.nThis>0 
25fb0 7c 7c 20 63 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30  || cnt.nOther==0
25fc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
25fd0 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
25fe0 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43  the pAggInfo->aC
25ff0 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74  ol[] array.  Ret
26000 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
26010 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d  .** the new elem
26020 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e  ent.  Return a n
26030 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69  egative number i
26040 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a  f malloc fails..
26050 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  */.static int ad
26060 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73  dAggInfoColumn(s
26070 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49  qlite3 *db, AggI
26080 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69  nfo *pInfo){.  i
26090 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61  nt i;.  pInfo->a
260a0 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 41 72 72  Col = sqlite3Arr
260b0 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20  ayAllocate(.    
260c0 20 20 20 64 62 2c 0a 20 20 20 20 20 20 20 70 49     db,.       pI
260d0 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20  nfo->aCol,.     
260e0 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e    sizeof(pInfo->
260f0 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20  aCol[0]),.      
26100 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e   &pInfo->nColumn
26110 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b  ,.       &i.  );
26120 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20  .  return i;.}  
26130 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20    ../*.** Add a 
26140 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
26150 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  he pAggInfo->aFu
26160 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74  nc[] array.  Ret
26170 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
26180 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d  .** the new elem
26190 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e  ent.  Return a n
261a0 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69  egative number i
261b0 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a  f malloc fails..
261c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  */.static int ad
261d0 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c  dAggInfoFunc(sql
261e0 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66  ite3 *db, AggInf
261f0 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74  o *pInfo){.  int
26200 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75   i;.  pInfo->aFu
26210 6e 63 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61  nc = sqlite3Arra
26220 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20  yAllocate(.     
26230 20 20 64 62 2c 20 0a 20 20 20 20 20 20 20 70 49    db, .       pI
26240 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20  nfo->aFunc,.    
26250 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d     sizeof(pInfo-
26260 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20  >aFunc[0]),.    
26270 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63     &pInfo->nFunc
26280 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b  ,.       &i.  );
26290 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20  .  return i;.}  
262a0 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69    ../*.** This i
262b0 73 20 74 68 65 20 78 45 78 70 72 43 61 6c 6c 62  s the xExprCallb
262c0 61 63 6b 20 66 6f 72 20 61 20 74 72 65 65 20 77  ack for a tree w
262d0 61 6c 6b 65 72 2e 20 20 49 74 20 69 73 20 75 73  alker.  It is us
262e0 65 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65  ed to.** impleme
262f0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  nt sqlite3ExprAn
26300 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
26310 29 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45  ).  See sqlite3E
26320 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
26330 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69  ates.** for addi
26340 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
26350 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
26360 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  t analyzeAggrega
26370 74 65 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  te(Walker *pWalk
26380 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
26390 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d  {.  int i;.  Nam
263a0 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20  eContext *pNC = 
263b0 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a  pWalker->u.pNC;.
263c0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
263d0 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20  = pNC->pParse;. 
263e0 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69   SrcList *pSrcLi
263f0 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69  st = pNC->pSrcLi
26400 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70  st;.  AggInfo *p
26410 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70  AggInfo = pNC->p
26420 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 73 77 69 74  AggInfo;..  swit
26430 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
26440 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
26450 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73  _COLUMN:.    cas
26460 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
26470 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
26480 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
26490 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
264a0 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
264b0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
264c0 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63  );.      /* Chec
264d0 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
264e0 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65  column is in one
264f0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20 69   of the tables i
26500 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20 20 20  n the FROM.     
26510 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68   ** clause of th
26520 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  e aggregate quer
26530 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41  y */.      if( A
26540 4c 57 41 59 53 28 70 53 72 63 4c 69 73 74 21 3d  LWAYS(pSrcList!=
26550 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  0) ){.        st
26560 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
26570 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63 4c  m *pItem = pSrcL
26580 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20  ist->a;.        
26590 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c  for(i=0; i<pSrcL
265a0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
265b0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
265c0 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
265d0 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20  fo_col *pCol;.  
265e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
265f0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
26600 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e  (pExpr, EP_Token
26610 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
26620 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
26630 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
26640 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  =pItem->iCursor 
26650 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
26660 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
26670 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61  is point, it mea
26680 6e 73 20 74 68 61 74 20 70 45 78 70 72 20 72 65  ns that pExpr re
26690 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 0a  fers to a table.
266a0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
266b0 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 46 52  hat is in the FR
266c0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
266d0 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
266e0 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  .  .            
266f0 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  **.            *
26700 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20  * Make an entry 
26710 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  for the column i
26720 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  n pAggInfo->aCol
26730 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20 20  [] if there.    
26740 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f          ** is no
26750 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72 65  t an entry there
26760 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20 20   already..      
26770 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
26780 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
26790 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 70          pCol = p
267a0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20  AggInfo->aCol;. 
267b0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b             for(k
267c0 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; k<pAggInfo->
267d0 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43  nColumn; k++, pC
267e0 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  ol++){.         
267f0 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69       if( pCol->i
26800 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54  Table==pExpr->iT
26810 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20  able &&.        
26820 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
26830 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e  iColumn==pExpr->
26840 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
26850 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
26860 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
26870 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
26880 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
26890 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  (k>=pAggInfo->nC
268a0 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20 20 20  olumn).         
268b0 20 20 20 20 26 26 20 28 6b 20 3d 20 61 64 64 41      && (k = addA
268c0 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61  ggInfoColumn(pPa
268d0 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66  rse->db, pAggInf
268e0 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 20  o))>=0 .        
268f0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
26900 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41 67       pCol = &pAg
26910 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a  gInfo->aCol[k];.
26920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
26930 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72  ol->pTab = pExpr
26940 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
26950 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62        pCol->iTab
26960 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  le = pExpr->iTab
26970 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  le;.            
26980 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20    pCol->iColumn 
26990 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
269a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
269b0 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70  pCol->iMem = ++p
269c0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
269d0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
269e0 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d  >iSorterColumn =
269f0 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20   -1;.           
26a00 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d     pCol->pExpr =
26a10 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
26a20 20 20 20 20 20 20 69 66 28 20 70 41 67 67 49 6e        if( pAggIn
26a30 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a  fo->pGroupBy ){.
26a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a50 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20  int j, n;.      
26a60 20 20 20 20 20 20 20 20 20 20 45 78 70 72 4c 69            ExprLi
26a70 73 74 20 2a 70 47 42 20 3d 20 70 41 67 67 49 6e  st *pGB = pAggIn
26a80 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20  fo->pGroupBy;.  
26a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
26aa0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
26ab0 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d  em *pTerm = pGB-
26ac0 3e 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  >a;.            
26ad0 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78      n = pGB->nEx
26ae0 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
26af0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
26b00 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j++, pTerm++){
26b10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26b20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 54     Expr *pE = pT
26b30 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
26b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
26b50 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pE->op==TK_COL
26b60 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61 62 6c  UMN && pE->iTabl
26b70 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e==pExpr->iTable
26b80 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
26b90 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69 43            pE->iC
26ba0 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43  olumn==pExpr->iC
26bb0 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
26bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
26bd0 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
26be0 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
26bf0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
26c00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26c10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
26c20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
26c30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
26c40 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69       if( pCol->i
26c50 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29  SorterColumn<0 )
26c60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
26c70 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
26c80 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f  olumn = pAggInfo
26c90 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e  ->nSortingColumn
26ca0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
26cb0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
26cc0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  }.            /*
26cd0 20 54 68 65 72 65 20 69 73 20 6e 6f 77 20 61 6e   There is now an
26ce0 20 65 6e 74 72 79 20 66 6f 72 20 70 45 78 70 72   entry for pExpr
26cf0 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   in pAggInfo->aC
26d00 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20 20 20  ol[] (either.   
26d10 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63 61           ** beca
26d20 75 73 65 20 69 74 20 77 61 73 20 74 68 65 72 65  use it was there
26d30 20 62 65 66 6f 72 65 20 6f 72 20 62 65 63 61 75   before or becau
26d40 73 65 20 77 65 20 6a 75 73 74 20 63 72 65 61 74  se we just creat
26d50 65 64 20 69 74 29 2e 0a 20 20 20 20 20 20 20 20  ed it)..        
26d60 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74      ** Convert t
26d70 68 65 20 70 45 78 70 72 20 74 6f 20 62 65 20 61  he pExpr to be a
26d80 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72   TK_AGG_COLUMN r
26d90 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68 61 74  eferring to that
26da0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
26db0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
26dc0 20 65 6e 74 72 79 2e 0a 20 20 20 20 20 20 20 20   entry..        
26dd0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
26de0 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f     ExprSetVVAPro
26df0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
26e00 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20  NoReduce);.     
26e10 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41         pExpr->pA
26e20 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66  ggInfo = pAggInf
26e30 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  o;.            p
26e40 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47  Expr->op = TK_AG
26e50 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  G_COLUMN;.      
26e60 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67        pExpr->iAg
26e70 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20 20 20 20  g = (i16)k;.    
26e80 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
26e90 20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e           } /* en
26ea0 64 69 66 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  dif pExpr->iTabl
26eb0 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  e==pItem->iCurso
26ec0 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f  r */.        } /
26ed0 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20  * end loop over 
26ee0 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20  pSrcList */.    
26ef0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
26f00 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
26f10 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  }.    case TK_AG
26f20 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  G_FUNCTION: {.  
26f30 20 20 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63      if( (pNC->nc
26f40 46 6c 61 67 73 20 26 20 4e 43 5f 49 6e 41 67 67  Flags & NC_InAgg
26f50 46 75 6e 63 29 3d 3d 30 0a 20 20 20 20 20 20 20  Func)==0.       
26f60 26 26 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b  && pWalker->walk
26f70 65 72 44 65 70 74 68 3d 3d 70 45 78 70 72 2d 3e  erDepth==pExpr->
26f80 6f 70 32 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  op2.      ){.   
26f90 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
26fa0 20 73 65 65 20 69 66 20 70 45 78 70 72 20 69 73   see if pExpr is
26fb0 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20   a duplicate of 
26fc0 61 6e 6f 74 68 65 72 20 61 67 67 72 65 67 61 74  another aggregat
26fd0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  e .        ** fu
26fe0 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61  nction that is a
26ff0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 41  lready in the pA
27000 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  ggInfo structure
27010 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
27020 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
27030 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d  fo_func *pItem =
27040 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
27050 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
27060 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
27070 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Func; i++, pItem
27080 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
27090 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
270a0 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78  mpare(pItem->pEx
270b0 70 72 2c 20 70 45 78 70 72 2c 20 2d 31 29 3d 3d  pr, pExpr, -1)==
270c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
270d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
270e0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
270f0 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67        if( i>=pAg
27100 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a  gInfo->nFunc ){.
27110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78            /* pEx
27120 70 72 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20  pr is original. 
27130 20 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72   Make a new entr
27140 79 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  y in pAggInfo->a
27150 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20  Func[].         
27160 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38   */.          u8
27170 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73   enc = ENC(pPars
27180 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20  e->db);.        
27190 20 20 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f    i = addAggInfo
271a0 46 75 6e 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  Func(pParse->db,
271b0 20 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20   pAggInfo);.    
271c0 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29        if( i>=0 )
271d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
271e0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
271f0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
27200 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
27210 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
27220 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46   = &pAggInfo->aF
27230 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  unc[i];.        
27240 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72      pItem->pExpr
27250 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
27260 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65        pItem->iMe
27270 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  m = ++pParse->nM
27280 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  em;.            
27290 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
272a0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
272b0 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
272c0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
272d0 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74  m->pFunc = sqlit
272e0 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70  e3FindFunction(p
272f0 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20  Parse->db,.     
27300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
27310 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 0a  xpr->u.zToken, .
27320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27330 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73     pExpr->x.pLis
27340 74 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t ? pExpr->x.pLi
27350 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65  st->nExpr : 0, e
27360 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nc, 0);.        
27370 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66      if( pExpr->f
27380 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e  lags & EP_Distin
27390 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ct ){.          
273a0 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74      pItem->iDist
273b0 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  inct = pParse->n
273c0 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Tab++;.         
273d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
273e0 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
273f0 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20  Distinct = -1;. 
27400 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
27410 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27420 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61   }.        /* Ma
27430 6b 65 20 70 45 78 70 72 20 70 6f 69 6e 74 20 74  ke pExpr point t
27440 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  o the appropriat
27450 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  e pAggInfo->aFun
27460 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20 20 20  c[] entry.      
27470 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
27480 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
27490 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
274a0 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
274b0 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20  uced) );.       
274c0 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65   ExprSetVVAPrope
274d0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f  rty(pExpr, EP_No
274e0 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20  Reduce);.       
274f0 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28   pExpr->iAgg = (
27500 69 31 36 29 69 3b 0a 20 20 20 20 20 20 20 20 70  i16)i;.        p
27510 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d  Expr->pAggInfo =
27520 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20   pAggInfo;.     
27530 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
27540 75 6e 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  une;.      }else
27550 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
27560 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
27570 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
27580 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
27590 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63  ntinue;.}.static
275a0 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72   int analyzeAggr
275b0 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 28 57  egatesInSelect(W
275c0 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
275d0 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
275e0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
275f0 45 54 45 52 28 70 57 61 6c 6b 65 72 29 3b 0a 20  ETER(pWalker);. 
27600 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
27610 52 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 72 65  R(pSelect);.  re
27620 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
27630 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  e;.}../*.** Anal
27640 79 7a 65 20 74 68 65 20 70 45 78 70 72 20 65 78  yze the pExpr ex
27650 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67  pression looking
27660 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66   for aggregate f
27670 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20  unctions and.** 
27680 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74 68  for variables th
27690 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64  at need to be ad
276a0 64 65 64 20 74 6f 20 41 67 67 49 6e 66 6f 20 6f  ded to AggInfo o
276b0 62 6a 65 63 74 20 74 68 61 74 20 70 4e 43 2d 3e  bject that pNC->
276c0 70 41 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e  pAggInfo.** poin
276d0 74 73 20 74 6f 2e 20 20 41 64 64 69 74 69 6f 6e  ts to.  Addition
276e0 61 6c 20 65 6e 74 72 69 65 73 20 61 72 65 20 6d  al entries are m
276f0 61 64 65 20 6f 6e 20 74 68 65 20 41 67 67 49 6e  ade on the AggIn
27700 66 6f 20 6f 62 6a 65 63 74 20 61 73 0a 2a 2a 20  fo object as.** 
27710 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a  necessary..**.**
27720 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
27730 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
27740 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 65 78  led after the ex
27750 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65  pression has bee
27760 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79  n.** analyzed by
27770 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
27780 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76  xprNames()..*/.v
27790 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
277a0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
277b0 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e  (NameContext *pN
277c0 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  C, Expr *pExpr){
277d0 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d  .  Walker w;.  m
277e0 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a  emset(&w, 0, siz
277f0 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78  eof(w));.  w.xEx
27800 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61  prCallback = ana
27810 6c 79 7a 65 41 67 67 72 65 67 61 74 65 3b 0a 20  lyzeAggregate;. 
27820 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
27830 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72  ck = analyzeAggr
27840 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a  egatesInSelect;.
27850 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b    w.u.pNC = pNC;
27860 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e  .  assert( pNC->
27870 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20  pSrcList!=0 );. 
27880 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
27890 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a  (&w, pExpr);.}..
278a0 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74  /*.** Call sqlit
278b0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
278c0 72 65 67 61 74 65 73 28 29 20 66 6f 72 20 65 76  regates() for ev
278d0 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
278e0 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69  n an.** expressi
278f0 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e  on list.  Return
27900 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
27910 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rrors..**.** If 
27920 61 6e 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e  an error is foun
27930 64 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20  d, the analysis 
27940 69 73 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f  is cut short..*/
27950 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
27960 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
27970 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
27980 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
27990 74 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70  t){.  struct Exp
279a0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
279b0 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  m;.  int i;.  if
279c0 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
279d0 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
279e0 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  a, i=0; i<pList-
279f0 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
27a00 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c  em++){.      sql
27a10 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
27a20 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70  ggregates(pNC, p
27a30 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
27a40 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
27a50 20 41 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e 67   Allocate a sing
27a60 6c 65 20 6e 65 77 20 72 65 67 69 73 74 65 72 20  le new register 
27a70 66 6f 72 20 75 73 65 20 74 6f 20 68 6f 6c 64 20  for use to hold 
27a80 73 6f 6d 65 20 69 6e 74 65 72 6d 65 64 69 61 74  some intermediat
27a90 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74  e result..*/.int
27aa0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
27ab0 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eg(Parse *pParse
27ac0 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
27ad0 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a  >nTempReg==0 ){.
27ae0 20 20 20 20 72 65 74 75 72 6e 20 2b 2b 70 50 61      return ++pPa
27af0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20  rse->nMem;.  }. 
27b00 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e   return pParse->
27b10 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73  aTempReg[--pPars
27b20 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a  e->nTempReg];.}.
27b30 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
27b40 65 20 61 20 72 65 67 69 73 74 65 72 2c 20 6d 61  e a register, ma
27b50 6b 69 6e 67 20 61 76 61 69 6c 61 62 6c 65 20 66  king available f
27b60 6f 72 20 72 65 75 73 65 20 66 6f 72 20 73 6f 6d  or reuse for som
27b70 65 20 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f  e other.** purpo
27b80 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72  se..**.** If a r
27b90 65 67 69 73 74 65 72 20 69 73 20 63 75 72 72 65  egister is curre
27ba0 6e 74 6c 79 20 62 65 69 6e 67 20 75 73 65 64 20  ntly being used 
27bb0 62 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  by the column ca
27bc0 63 68 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  che, then.** the
27bd0 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73   deallocation is
27be0 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20   deferred until 
27bf0 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
27c00 20 6c 69 6e 65 20 74 68 61 74 20 75 73 65 73 0a   line that uses.
27c10 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65 72 20  ** the register 
27c20 62 65 63 6f 6d 65 73 20 73 74 61 6c 65 2e 0a 2a  becomes stale..*
27c30 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  /.void sqlite3Re
27c40 6c 65 61 73 65 54 65 6d 70 52 65 67 28 50 61 72  leaseTempReg(Par
27c50 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
27c60 69 52 65 67 29 7b 0a 20 20 69 66 28 20 69 52 65  iReg){.  if( iRe
27c70 67 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 65  g && pParse->nTe
27c80 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28  mpReg<ArraySize(
27c90 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
27ca0 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ) ){.    int i;.
27cb0 20 20 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43      struct yColC
27cc0 61 63 68 65 20 2a 70 3b 0a 20 20 20 20 66 6f 72  ache *p;.    for
27cd0 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
27ce0 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
27cf0 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
27d00 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20  i++, p++){.     
27d10 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52   if( p->iReg==iR
27d20 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  eg ){.        p-
27d30 3e 74 65 6d 70 52 65 67 20 3d 20 31 3b 0a 20 20  >tempReg = 1;.  
27d40 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
27d50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
27d60 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
27d70 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  [pParse->nTempRe
27d80 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d  g++] = iReg;.  }
27d90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
27da0 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65  te or deallocate
27db0 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67   a block of nReg
27dc0 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67   consecutive reg
27dd0 69 73 74 65 72 73 0a 2a 2f 0a 69 6e 74 20 73 71  isters.*/.int sq
27de0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
27df0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
27e00 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e   int nReg){.  in
27e10 74 20 69 2c 20 6e 3b 0a 20 20 69 20 3d 20 70 50  t i, n;.  i = pP
27e20 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b  arse->iRangeReg;
27e30 0a 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e  .  n = pParse->n
27e40 52 61 6e 67 65 52 65 67 3b 0a 20 20 69 66 28 20  RangeReg;.  if( 
27e50 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20 20 61  nReg<=n ){.    a
27e60 73 73 65 72 74 28 20 21 75 73 65 64 41 73 43 6f  ssert( !usedAsCo
27e70 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65  lumnCache(pParse
27e80 2c 20 69 2c 20 69 2b 6e 2d 31 29 20 29 3b 0a 20  , i, i+n-1) );. 
27e90 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67     pParse->iRang
27ea0 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20  eReg += nReg;.  
27eb0 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65    pParse->nRange
27ec0 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d  Reg -= nReg;.  }
27ed0 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20 70 50  else{.    i = pP
27ee0 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
27ef0 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
27f00 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65  = nReg;.  }.  re
27f10 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73  turn i;.}.void s
27f20 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
27f30 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50  pRange(Parse *pP
27f40 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20  arse, int iReg, 
27f50 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 73 71 6c  int nReg){.  sql
27f60 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
27f70 6f 76 65 28 70 50 61 72 73 65 2c 20 69 52 65 67  ove(pParse, iReg
27f80 2c 20 6e 52 65 67 29 3b 0a 20 20 69 66 28 20 6e  , nReg);.  if( n
27f90 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e  Reg>pParse->nRan
27fa0 67 65 52 65 67 20 29 7b 0a 20 20 20 20 70 50 61  geReg ){.    pPa
27fb0 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d  rse->nRangeReg =
27fc0 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73   nReg;.    pPars
27fd0 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d 20 69  e->iRangeReg = i
27fe0 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  Reg;.  }.}../*.*
27ff0 2a 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d 70 6f  * Mark all tempo
28000 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61  rary registers a
28010 73 20 62 65 69 6e 67 20 75 6e 61 76 61 69 6c 61  s being unavaila
28020 62 6c 65 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a  ble for reuse..*
28030 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c  /.void sqlite3Cl
28040 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28  earTempRegCache(
28050 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
28060 20 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52    pParse->nTempR
28070 65 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  eg = 0;.  pParse
28080 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b  ->nRangeReg = 0;
28090 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 69 64 61  .}../*.** Valida
280a0 74 65 20 74 68 61 74 20 6e 6f 20 74 65 6d 70 6f  te that no tempo
280b0 72 61 72 79 20 72 65 67 69 73 74 65 72 20 66 61  rary register fa
280c0 6c 6c 73 20 77 69 74 68 69 6e 20 74 68 65 20 72  lls within the r
280d0 61 6e 67 65 20 6f 66 0a 2a 2a 20 69 46 69 72 73  ange of.** iFirs
280e0 74 2e 2e 69 4c 61 73 74 2c 20 69 6e 63 6c 75 73  t..iLast, inclus
280f0 69 76 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ive.  This routi
28100 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 20  ne is only call 
28110 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 73 73 65  from within asse
28120 72 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  rt().** statemen
28130 74 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ts..*/.#ifdef SQ
28140 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73  LITE_DEBUG.int s
28150 71 6c 69 74 65 33 4e 6f 54 65 6d 70 73 49 6e 52  qlite3NoTempsInR
28160 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  ange(Parse *pPar
28170 73 65 2c 20 69 6e 74 20 69 46 69 72 73 74 2c 20  se, int iFirst, 
28180 69 6e 74 20 69 4c 61 73 74 29 7b 0a 20 20 69 6e  int iLast){.  in
28190 74 20 69 3b 0a 20 20 69 66 28 20 70 50 61 72 73  t i;.  if( pPars
281a0 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3e 30 0a 20  e->nRangeReg>0. 
281b0 20 20 26 26 20 70 50 61 72 73 65 2d 3e 69 52 61    && pParse->iRa
281c0 6e 67 65 52 65 67 2b 70 50 61 72 73 65 2d 3e 6e  ngeReg+pParse->n
281d0 52 61 6e 67 65 52 65 67 3c 69 4c 61 73 74 0a 20  RangeReg<iLast. 
281e0 20 20 26 26 20 70 50 61 72 73 65 2d 3e 69 52 61    && pParse->iRa
281f0 6e 67 65 52 65 67 3e 3d 69 46 69 72 73 74 0a 20  ngeReg>=iFirst. 
28200 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
28210 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  0;.  }.  for(i=0
28220 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 65 6d  ; i<pParse->nTem
28230 70 52 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  pReg; i++){.    
28240 69 66 28 20 70 50 61 72 73 65 2d 3e 61 54 65 6d  if( pParse->aTem
28250 70 52 65 67 5b 69 5d 3e 3d 69 46 69 72 73 74 20  pReg[i]>=iFirst 
28260 26 26 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  && pParse->aTemp
28270 52 65 67 5b 69 5d 3c 3d 69 4c 61 73 74 20 29 7b  Reg[i]<=iLast ){
28280 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
28290 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
282a0 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
282b0 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
282c0 2a 2f 0a                                         */.