/ Hex Artifact Content
Login

Artifact d5cffb307d4e812c41a6fb1f6bc94e6b0801e3e8:


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 23 69 66 6e 64 65 66  Expr;.}..#ifndef
29d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
29e0: 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  QUERY./*.** Inte
29f0: 72 70 72 65 74 20 74 68 65 20 70 56 65 63 74 6f  rpret the pVecto
2a00: 72 20 69 6e 70 75 74 20 61 73 20 61 20 76 65 63  r input as a vec
2a10: 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  tor expression. 
2a20: 20 49 66 20 70 56 65 63 74 6f 72 20 69 73 0a 2a   If pVector is.*
2a30: 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 73 63  * an ordinary sc
2a40: 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 2c  alar expression,
2a50: 20 74 72 65 61 74 20 69 74 20 61 73 20 61 20 76   treat it as a v
2a60: 65 63 74 6f 72 20 6f 66 20 73 69 7a 65 20 31 2e  ector of size 1.
2a70: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  .**.** Return a 
2a80: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62  pointer to a sub
2a90: 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 70 56  expression of pV
2aa0: 65 63 74 6f 72 20 74 68 61 74 20 69 73 20 74 68  ector that is th
2ab0: 65 20 69 2d 74 68 0a 2a 2a 20 63 6f 6c 75 6d 6e  e i-th.** column
2ac0: 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20 28   of the vector (
2ad0: 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e  numbered startin
2ae0: 67 20 77 69 74 68 20 30 29 2e 20 20 54 68 65 20  g with 0).  The 
2af0: 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a 20 65  caller must.** e
2b00: 6e 73 75 72 65 20 74 68 61 74 20 69 20 69 73 20  nsure that i is 
2b10: 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 0a 2a 2a  within range..**
2b20: 0a 2a 2a 20 70 56 65 63 74 6f 72 20 72 65 74 61  .** pVector reta
2b30: 69 6e 73 20 6f 77 6e 65 72 73 68 69 70 20 6f 66  ins ownership of
2b40: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 75   the returned su
2b50: 62 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a  bexpression..**.
2b60: 2a 2a 20 49 66 20 74 68 65 20 76 65 63 74 6f 72  ** If the vector
2b70: 20 69 73 20 61 20 28 53 45 4c 45 43 54 20 2e 2e   is a (SELECT ..
2b80: 2e 29 20 74 68 65 6e 20 74 68 65 20 65 78 70 72  .) then the expr
2b90: 65 73 73 69 6f 6e 20 72 65 74 75 72 6e 65 64 20  ession returned 
2ba0: 69 73 0a 2a 2a 20 6a 75 73 74 20 74 68 65 20 65  is.** just the e
2bb0: 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 74 68  xpression for th
2bc0: 65 20 69 2d 74 68 20 74 65 72 6d 20 6f 66 20 74  e i-th term of t
2bd0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 61  he result set, a
2be0: 6e 64 20 69 73 0a 2a 2a 20 6e 65 63 65 73 73 61  nd is.** necessa
2bf0: 72 69 6c 79 20 72 65 61 64 79 20 74 6f 20 62 65  rily ready to be
2c00: 20 65 76 61 6c 75 61 74 65 64 20 62 65 63 61 75   evaluated becau
2c10: 73 65 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  se the table cur
2c20: 73 6f 72 20 6d 69 67 68 74 0a 2a 2a 20 6e 6f 74  sor might.** not
2c30: 20 68 61 76 65 20 62 65 65 6e 20 70 6f 73 69 74   have been posit
2c40: 69 6f 6e 65 64 20 79 65 74 2e 0a 2a 2f 0a 45 78  ioned yet..*/.Ex
2c50: 70 72 20 2a 73 71 6c 69 74 65 33 56 65 63 74 6f  pr *sqlite3Vecto
2c60: 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 45 78  rFieldSubexpr(Ex
2c70: 70 72 20 2a 70 56 65 63 74 6f 72 2c 20 69 6e 74  pr *pVector, int
2c80: 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69   i){.  assert( i
2c90: 3c 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74  <sqlite3ExprVect
2ca0: 6f 72 53 69 7a 65 28 70 56 65 63 74 6f 72 29 20  orSize(pVector) 
2cb0: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
2cc0: 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 56 65  ExprIsVector(pVe
2cd0: 63 74 6f 72 29 20 29 7b 0a 20 20 20 20 69 66 28  ctor) ){.    if(
2ce0: 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b   pVector->op==TK
2cf0: 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20  _SELECT ){.     
2d00: 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 2d   return pVector-
2d10: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
2d20: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
2d30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d40: 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 2d   return pVector-
2d50: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  >x.pList->a[i].p
2d60: 45 78 70 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Expr;.    }.  }.
2d70: 20 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72    return pVector
2d80: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
2d90: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
2da0: 49 54 5f 53 55 42 51 55 45 52 59 29 20 2a 2f 0a  IT_SUBQUERY) */.
2db0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2dc0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
2dd0: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20  .** Compute and 
2de0: 72 65 74 75 72 6e 20 61 20 6e 65 77 20 45 78 70  return a new Exp
2df0: 72 20 6f 62 6a 65 63 74 20 77 68 69 63 68 20 77  r object which w
2e00: 68 65 6e 20 70 61 73 73 65 64 20 74 6f 0a 2a 2a  hen passed to.**
2e10: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
2e20: 28 29 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65  () will generate
2e30: 20 61 6c 6c 20 6e 65 63 65 73 73 61 72 79 20 63   all necessary c
2e40: 6f 64 65 20 74 6f 20 63 6f 6d 70 75 74 65 0a 2a  ode to compute.*
2e50: 2a 20 74 68 65 20 69 46 69 65 6c 64 2d 74 68 20  * the iField-th 
2e60: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65  column of the ve
2e70: 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ctor expression 
2e80: 70 56 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49  pVector..**.** I
2e90: 74 20 69 73 20 6f 6b 20 66 6f 72 20 70 56 65 63  t is ok for pVec
2ea0: 74 6f 72 20 74 6f 20 62 65 20 61 20 73 63 61 6c  tor to be a scal
2eb0: 61 72 20 28 61 73 20 6c 6f 6e 67 20 61 73 20 69  ar (as long as i
2ec0: 46 69 65 6c 64 3d 3d 30 29 2e 20 20 0a 2a 2a 20  Field==0).  .** 
2ed0: 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68  In that case, th
2ee0: 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  is routine works
2ef0: 20 6c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70   like sqlite3Exp
2f00: 72 44 75 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  rDup()..**.** Th
2f10: 65 20 63 61 6c 6c 65 72 20 6f 77 6e 73 20 74 68  e caller owns th
2f20: 65 20 72 65 74 75 72 6e 65 64 20 45 78 70 72 20  e returned Expr 
2f30: 6f 62 6a 65 63 74 20 61 6e 64 20 69 73 20 72 65  object and is re
2f40: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 2a 2a  sponsible for.**
2f50: 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74   ensuring that t
2f60: 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
2f70: 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74  e eventually get
2f80: 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  s freed..**.** T
2f90: 68 65 20 63 61 6c 6c 65 72 20 72 65 74 61 69 6e  he caller retain
2fa0: 73 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 70  s ownership of p
2fb0: 56 65 63 74 6f 72 2e 20 20 49 66 20 70 56 65 63  Vector.  If pVec
2fc0: 74 6f 72 20 69 73 20 61 20 54 4b 5f 53 45 4c 45  tor is a TK_SELE
2fd0: 43 54 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  CT,.** then the 
2fe0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 77 69 6c  return value wil
2ff0: 6c 20 72 65 66 65 72 65 6e 63 65 20 70 56 65 63  l reference pVec
3000: 74 6f 72 20 61 6e 64 20 73 6f 20 70 56 65 63 74  tor and so pVect
3010: 6f 72 20 6d 75 73 74 20 72 65 6d 61 69 6e 0a 2a  or must remain.*
3020: 2a 20 76 61 6c 69 64 20 66 6f 72 20 74 68 65 20  * valid for the 
3030: 6c 69 66 65 20 6f 66 20 74 68 65 20 72 65 74 75  life of the retu
3040: 72 6e 65 64 20 6f 62 6a 65 63 74 2e 20 20 49 66  rned object.  If
3050: 20 70 56 65 63 74 6f 72 20 69 73 20 61 20 54 4b   pVector is a TK
3060: 5f 56 45 43 54 4f 52 0a 2a 2a 20 6f 72 20 61 20  _VECTOR.** or a 
3070: 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f  scalar expressio
3080: 6e 2c 20 74 68 65 6e 20 69 74 20 63 61 6e 20 62  n, then it can b
3090: 65 20 64 65 6c 65 74 65 64 20 61 73 20 73 6f 6f  e deleted as soo
30a0: 6e 20 61 73 20 74 68 69 73 20 72 6f 75 74 69 6e  n as this routin
30b0: 65 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 2e 0a 2a  e.** routines..*
30c0: 2a 0a 2a 2a 20 41 20 74 72 69 63 6b 20 74 6f 20  *.** A trick to 
30d0: 63 61 75 73 65 20 61 20 54 4b 5f 53 45 4c 45 43  cause a TK_SELEC
30e0: 54 20 70 56 65 63 74 6f 72 20 74 6f 20 62 65 20  T pVector to be 
30f0: 64 65 6c 65 74 65 64 20 74 6f 67 65 74 68 65 72  deleted together
3100: 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 72 65 74   with.** the ret
3110: 75 72 6e 65 64 20 45 78 70 72 20 6f 62 6a 65 63  urned Expr objec
3120: 74 20 69 73 20 74 6f 20 61 74 74 61 63 68 20 74  t is to attach t
3130: 68 65 20 70 56 65 63 74 6f 72 20 74 6f 20 74 68  he pVector to th
3140: 65 20 70 52 69 67 68 74 20 66 69 65 6c 64 0a 2a  e pRight field.*
3150: 2a 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65  * of the returne
3160: 64 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55  d TK_SELECT_COLU
3170: 4d 4e 20 45 78 70 72 20 6f 62 6a 65 63 74 2e 0a  MN Expr object..
3180: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
3190: 45 78 70 72 46 6f 72 56 65 63 74 6f 72 46 69 65  ExprForVectorFie
31a0: 6c 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ld(.  Parse *pPa
31b0: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
31c0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
31d0: 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74 6f 72  .  Expr *pVector
31e0: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76  ,       /* The v
31f0: 65 63 74 6f 72 2e 20 20 4c 69 73 74 20 6f 66 20  ector.  List of 
3200: 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 72 20 61  expressions or a
3210: 20 73 75 62 2d 53 45 4c 45 43 54 20 2a 2f 0a 20   sub-SELECT */. 
3220: 20 69 6e 74 20 69 46 69 65 6c 64 20 20 20 20 20   int iField     
3230: 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 63        /* Which c
3240: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63  olumn of the vec
3250: 74 6f 72 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  tor to return */
3260: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 52 65 74  .){.  Expr *pRet
3270: 3b 0a 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d  ;.  if( pVector-
3280: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
3290: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 56  {.    assert( pV
32a0: 65 63 74 6f 72 2d 3e 66 6c 61 67 73 20 26 20 45  ector->flags & E
32b0: 50 5f 78 49 73 53 65 6c 65 63 74 20 29 3b 0a 20  P_xIsSelect );. 
32c0: 20 20 20 2f 2a 20 54 68 65 20 54 4b 5f 53 45 4c     /* The TK_SEL
32d0: 45 43 54 5f 43 4f 4c 55 4d 4e 20 45 78 70 72 20  ECT_COLUMN Expr 
32e0: 6e 6f 64 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  node:.    **.   
32f0: 20 2a 2a 20 70 4c 65 66 74 3a 20 20 20 20 20 20   ** pLeft:      
3300: 20 20 20 20 20 70 56 65 63 74 6f 72 20 63 6f 6e       pVector con
3310: 74 61 69 6e 69 6e 67 20 54 4b 5f 53 45 4c 45 43  taining TK_SELEC
3320: 54 0a 20 20 20 20 2a 2a 20 70 52 69 67 68 74 3a  T.    ** pRight:
3330: 20 20 20 20 20 20 20 20 20 20 6e 6f 74 20 75 73            not us
3340: 65 64 2e 20 20 42 75 74 20 72 65 63 75 72 73 69  ed.  But recursi
3350: 76 65 6c 79 20 64 65 6c 65 74 65 64 2e 0a 20 20  vely deleted..  
3360: 20 20 2a 2a 20 69 43 6f 6c 75 6d 6e 3a 20 20 20    ** iColumn:   
3370: 20 20 20 20 20 20 49 6e 64 65 78 20 6f 66 20 61        Index of a
3380: 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 56 65 63 74   column in pVect
3390: 6f 72 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74 2d  or.    ** pLeft-
33a0: 3e 69 54 61 62 6c 65 3a 20 20 20 46 69 72 73 74  >iTable:   First
33b0: 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20   in an array of 
33c0: 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  register holding
33d0: 20 72 65 73 75 6c 74 2c 20 6f 72 20 30 0a 20 20   result, or 0.  
33e0: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
33f0: 20 20 20 20 20 20 69 66 20 74 68 65 20 72 65 73        if the res
3400: 75 6c 74 20 69 73 20 6e 6f 74 20 79 65 74 20 63  ult is not yet c
3410: 6f 6d 70 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a  omputed..    **.
3420: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 78      ** sqlite3Ex
3430: 70 72 44 65 6c 65 74 65 28 29 20 73 70 65 63 69  prDelete() speci
3440: 66 69 63 61 6c 6c 79 20 73 6b 69 70 73 20 74 68  fically skips th
3450: 65 20 72 65 63 75 72 73 69 76 65 20 64 65 6c 65  e recursive dele
3460: 74 65 20 6f 66 0a 20 20 20 20 2a 2a 20 70 4c 65  te of.    ** pLe
3470: 66 74 20 6f 6e 20 54 4b 5f 53 45 4c 45 43 54 5f  ft on TK_SELECT_
3480: 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 2e 20 20 42  COLUMN nodes.  B
3490: 75 74 20 70 52 69 67 68 74 20 69 73 20 66 6f 6c  ut pRight is fol
34a0: 6c 6f 77 65 64 2c 20 73 6f 20 70 56 65 63 74 6f  lowed, so pVecto
34b0: 72 0a 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20  r.    ** can be 
34c0: 61 74 74 61 63 68 65 64 20 74 6f 20 70 52 69 67  attached to pRig
34d0: 68 74 20 74 6f 20 63 61 75 73 65 20 74 68 69 73  ht to cause this
34e0: 20 6e 6f 64 65 20 74 6f 20 74 61 6b 65 20 6f 77   node to take ow
34f0: 6e 65 72 73 68 69 70 20 6f 66 0a 20 20 20 20 2a  nership of.    *
3500: 2a 20 70 56 65 63 74 6f 72 2e 20 20 54 79 70 69  * pVector.  Typi
3510: 63 61 6c 6c 79 20 74 68 65 72 65 20 77 69 6c 6c  cally there will
3520: 20 62 65 20 6d 75 6c 74 69 70 6c 65 20 54 4b 5f   be multiple TK_
3530: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f  SELECT_COLUMN no
3540: 64 65 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  des.    ** with 
3550: 74 68 65 20 73 61 6d 65 20 70 4c 65 66 74 20 70  the same pLeft p
3560: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 56  ointer to the pV
3570: 65 63 74 6f 72 2c 20 62 75 74 20 6f 6e 6c 79 20  ector, but only 
3580: 6f 6e 65 20 6f 66 20 74 68 65 6d 0a 20 20 20 20  one of them.    
3590: 2a 2a 20 77 69 6c 6c 20 6f 77 6e 20 74 68 65 20  ** will own the 
35a0: 70 56 65 63 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a  pVector..    */.
35b0: 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74      pRet = sqlit
35c0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
35d0: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
35e0: 2c 20 70 56 65 63 74 6f 72 2c 20 30 2c 20 30 29  , pVector, 0, 0)
35f0: 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74 20 29  ;.    if( pRet )
3600: 20 70 52 65 74 2d 3e 69 43 6f 6c 75 6d 6e 20 3d   pRet->iColumn =
3610: 20 69 46 69 65 6c 64 3b 0a 20 20 20 20 61 73 73   iField;.    ass
3620: 65 72 74 28 20 70 52 65 74 3d 3d 30 20 7c 7c 20  ert( pRet==0 || 
3630: 70 52 65 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20  pRet->iTable==0 
3640: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
3650: 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d  if( pVector->op=
3660: 3d 54 4b 5f 56 45 43 54 4f 52 20 29 20 70 56 65  =TK_VECTOR ) pVe
3670: 63 74 6f 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e  ctor = pVector->
3680: 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c  x.pList->a[iFiel
3690: 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 52  d].pExpr;.    pR
36a0: 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  et = sqlite3Expr
36b0: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
36c0: 70 56 65 63 74 6f 72 2c 20 30 29 3b 0a 20 20 7d  pVector, 0);.  }
36d0: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
36e0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
36f0: 69 6e 65 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ine(SQLITE_OMIT_
3700: 53 55 42 51 55 45 52 59 29 20 2a 2f 0a 0a 2f 2a  SUBQUERY) */../*
3710: 0a 2a 2a 20 49 66 20 65 78 70 72 65 73 73 69 6f  .** If expressio
3720: 6e 20 70 45 78 70 72 20 69 73 20 6f 66 20 74 79  n pExpr is of ty
3730: 70 65 20 54 4b 5f 53 45 4c 45 43 54 2c 20 67 65  pe TK_SELECT, ge
3740: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
3750: 76 61 6c 75 61 74 65 0a 2a 2a 20 69 74 2e 20 52  valuate.** it. R
3760: 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74  eturn the regist
3770: 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65 20  er in which the 
3780: 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64  result is stored
3790: 20 28 6f 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a   (or, if the .**
37a0: 20 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75   sub-select retu
37b0: 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  rns more than on
37c0: 65 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 66 69  e column, the fi
37d0: 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79 0a  rst in an array.
37e0: 2a 2a 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ** of registers 
37f0: 69 6e 20 77 68 69 63 68 20 74 68 65 20 72 65 73  in which the res
3800: 75 6c 74 20 69 73 20 73 74 6f 72 65 64 29 2e 0a  ult is stored)..
3810: 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69  **.** If pExpr i
3820: 73 20 6e 6f 74 20 61 20 54 4b 5f 53 45 4c 45 43  s not a TK_SELEC
3830: 54 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 72 65  T expression, re
3840: 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  turn 0..*/.stati
3850: 63 20 69 6e 74 20 65 78 70 72 43 6f 64 65 53 75  c int exprCodeSu
3860: 62 73 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70  bselect(Parse *p
3870: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
3880: 70 72 29 7b 0a 20 20 69 6e 74 20 72 65 67 20 3d  pr){.  int reg =
3890: 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
38a0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
38b0: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
38c0: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20  ==TK_SELECT ){. 
38d0: 20 20 20 72 65 67 20 3d 20 73 71 6c 69 74 65 33     reg = sqlite3
38e0: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
38f0: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20  arse, pExpr, 0, 
3900: 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  0);.  }.#endif. 
3910: 20 72 65 74 75 72 6e 20 72 65 67 3b 0a 7d 0a 0a   return reg;.}..
3920: 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  /*.** Argument p
3930: 56 65 63 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f  Vector points to
3940: 20 61 20 76 65 63 74 6f 72 20 65 78 70 72 65 73   a vector expres
3950: 73 69 6f 6e 20 2d 20 65 69 74 68 65 72 20 61 20  sion - either a 
3960: 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a 20 6f 72 20  TK_VECTOR.** or 
3970: 54 4b 5f 53 45 4c 45 43 54 20 74 68 61 74 20 72  TK_SELECT that r
3980: 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e  eturns more than
3990: 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2e 20 54 68 69   one column. Thi
39a0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
39b0: 6e 73 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74  ns.** the regist
39c0: 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72  er number of a r
39d0: 65 67 69 73 74 65 72 20 74 68 61 74 20 63 6f 6e  egister that con
39e0: 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 20  tains the value 
39f0: 6f 66 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 69 46  of.** element iF
3a00: 69 65 6c 64 20 6f 66 20 74 68 65 20 76 65 63 74  ield of the vect
3a10: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65  or..**.** If pVe
3a20: 63 74 6f 72 20 69 73 20 61 20 54 4b 5f 53 45 4c  ctor is a TK_SEL
3a30: 45 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  ECT expression, 
3a40: 74 68 65 6e 20 63 6f 64 65 20 66 6f 72 20 69 74  then code for it
3a50: 20 6d 75 73 74 20 68 61 76 65 20 0a 2a 2a 20 61   must have .** a
3a60: 6c 72 65 61 64 79 20 62 65 65 6e 20 67 65 6e 65  lready been gene
3a70: 72 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  rated using the 
3a80: 65 78 70 72 43 6f 64 65 53 75 62 73 65 6c 65 63  exprCodeSubselec
3a90: 74 28 29 20 72 6f 75 74 69 6e 65 2e 20 49 6e 20  t() routine. In 
3aa0: 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 70 61 72  this.** case par
3ab0: 61 6d 65 74 65 72 20 72 65 67 53 65 6c 65 63 74  ameter regSelect
3ac0: 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 66   should be the f
3ad0: 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79  irst in an array
3ae0: 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 2a 2a   of registers.**
3af0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
3b00: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
3b10: 75 62 2d 73 65 6c 65 63 74 2e 20 0a 2a 2a 0a 2a  ub-select. .**.*
3b20: 2a 20 49 66 20 70 56 65 63 74 6f 72 20 69 73 20  * If pVector is 
3b30: 6f 66 20 74 79 70 65 20 54 4b 5f 56 45 43 54 4f  of type TK_VECTO
3b40: 52 2c 20 74 68 65 6e 20 63 6f 64 65 20 66 6f 72  R, then code for
3b50: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 66   the requested f
3b60: 69 65 6c 64 0a 2a 2a 20 69 73 20 67 65 6e 65 72  ield.** is gener
3b70: 61 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  ated. In this ca
3b80: 73 65 20 28 2a 70 52 65 67 46 72 65 65 29 20 6d  se (*pRegFree) m
3b90: 61 79 20 62 65 20 73 65 74 20 74 6f 20 74 68 65  ay be set to the
3ba0: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 61 20   number of.** a 
3bb0: 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
3bc0: 65 72 20 74 6f 20 62 65 20 66 72 65 65 64 20 62  er to be freed b
3bd0: 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 65 66  y the caller bef
3be0: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
3bf0: 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75  *.** Before retu
3c00: 72 6e 69 6e 67 2c 20 6f 75 74 70 75 74 20 70 61  rning, output pa
3c10: 72 61 6d 65 74 65 72 20 28 2a 70 70 45 78 70 72  rameter (*ppExpr
3c20: 29 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  ) is set to poin
3c30: 74 20 74 6f 20 74 68 65 0a 2a 2a 20 45 78 70 72  t to the.** Expr
3c40: 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f   object correspo
3c50: 6e 64 69 6e 67 20 74 6f 20 65 6c 65 6d 65 6e 74  nding to element
3c60: 20 69 45 6c 65 6d 20 6f 66 20 74 68 65 20 76 65   iElem of the ve
3c70: 63 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ctor..*/.static 
3c80: 69 6e 74 20 65 78 70 72 56 65 63 74 6f 72 52 65  int exprVectorRe
3c90: 67 69 73 74 65 72 28 0a 20 20 50 61 72 73 65 20  gister(.  Parse 
3ca0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
3cb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
3cc0: 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
3cd0: 45 78 70 72 20 2a 70 56 65 63 74 6f 72 2c 20 20  Expr *pVector,  
3ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cf0: 2f 2a 20 56 65 63 74 6f 72 20 74 6f 20 65 78 74  /* Vector to ext
3d00: 72 61 63 74 20 65 6c 65 6d 65 6e 74 20 66 72 6f  ract element fro
3d10: 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 65 6c  m */.  int iFiel
3d20: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
3d30: 20 20 20 20 20 20 20 2f 2a 20 46 69 65 6c 64 20         /* Field 
3d40: 74 6f 20 65 78 74 72 61 63 74 20 66 72 6f 6d 20  to extract from 
3d50: 70 56 65 63 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  pVector */.  int
3d60: 20 72 65 67 53 65 6c 65 63 74 2c 20 20 20 20 20   regSelect,     
3d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3d80: 46 69 72 73 74 20 69 6e 20 61 72 72 61 79 20 6f  First in array o
3d90: 66 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20  f registers */. 
3da0: 20 45 78 70 72 20 2a 2a 70 70 45 78 70 72 2c 20   Expr **ppExpr, 
3db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3dc0: 20 2f 2a 20 4f 55 54 3a 20 45 78 70 72 65 73 73   /* OUT: Express
3dd0: 69 6f 6e 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  ion element */. 
3de0: 20 69 6e 74 20 2a 70 52 65 67 46 72 65 65 20 20   int *pRegFree  
3df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e00: 20 2f 2a 20 4f 55 54 3a 20 54 65 6d 70 20 72 65   /* OUT: Temp re
3e10: 67 69 73 74 65 72 20 74 6f 20 66 72 65 65 20 2a  gister to free *
3e20: 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  /.){.  assert( p
3e30: 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 56  Vector->op==TK_V
3e40: 45 43 54 4f 52 20 7c 7c 20 70 56 65 63 74 6f 72  ECTOR || pVector
3e50: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
3e60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 56  );.  assert( (pV
3e70: 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 56 45  ector->op==TK_VE
3e80: 43 54 4f 52 29 3d 3d 28 72 65 67 53 65 6c 65 63  CTOR)==(regSelec
3e90: 74 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 72  t==0) );.  if( r
3ea0: 65 67 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  egSelect ){.    
3eb0: 2a 70 70 45 78 70 72 20 3d 20 70 56 65 63 74 6f  *ppExpr = pVecto
3ec0: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  r->x.pSelect->pE
3ed0: 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e  List->a[iField].
3ee0: 70 45 78 70 72 3b 0a 20 20 20 20 20 72 65 74 75  pExpr;.     retu
3ef0: 72 6e 20 72 65 67 53 65 6c 65 63 74 2b 69 46 69  rn regSelect+iFi
3f00: 65 6c 64 3b 0a 20 20 7d 0a 20 20 2a 70 70 45 78  eld;.  }.  *ppEx
3f10: 70 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78 2e  pr = pVector->x.
3f20: 70 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c 64 5d  pList->a[iField]
3f30: 2e 70 45 78 70 72 3b 0a 20 20 72 65 74 75 72 6e  .pExpr;.  return
3f40: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
3f50: 54 65 6d 70 28 70 50 61 72 73 65 2c 20 2a 70 70  Temp(pParse, *pp
3f60: 45 78 70 72 2c 20 70 52 65 67 46 72 65 65 29 3b  Expr, pRegFree);
3f70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73  .}../*.** Expres
3f80: 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 61 20  sion pExpr is a 
3f90: 63 6f 6d 70 61 72 69 73 6f 6e 20 62 65 74 77 65  comparison betwe
3fa0: 65 6e 20 74 77 6f 20 76 65 63 74 6f 72 20 76 61  en two vector va
3fb0: 6c 75 65 73 2e 20 43 6f 6d 70 75 74 65 0a 2a 2a  lues. Compute.**
3fc0: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
3fd0: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 28 31  he comparison (1
3fe0: 2c 20 30 2c 20 6f 72 20 4e 55 4c 4c 29 20 61 6e  , 0, or NULL) an
3ff0: 64 20 77 72 69 74 65 20 74 68 61 74 0a 2a 2a 20  d write that.** 
4000: 72 65 73 75 6c 74 20 69 6e 74 6f 20 72 65 67 69  result into regi
4010: 73 74 65 72 20 64 65 73 74 2e 0a 2a 2a 0a 2a 2a  ster dest..**.**
4020: 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
4030: 20 73 61 74 69 73 66 79 20 74 68 65 20 66 6f 6c   satisfy the fol
4040: 6c 6f 77 69 6e 67 20 70 72 65 63 6f 6e 64 69 74  lowing precondit
4050: 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 69  ions:.**.**    i
4060: 66 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  f pExpr->op==TK_
4070: 49 53 3a 20 20 20 20 20 20 6f 70 3d 3d 54 4b 5f  IS:      op==TK_
4080: 45 51 20 61 6e 64 20 70 35 3d 3d 53 51 4c 49 54  EQ and p5==SQLIT
4090: 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20 20 20 20 69  E_NULLEQ.**    i
40a0: 66 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  f pExpr->op==TK_
40b0: 49 53 4e 4f 54 3a 20 20 20 6f 70 3d 3d 54 4b 5f  ISNOT:   op==TK_
40c0: 4e 45 20 61 6e 64 20 70 35 3d 3d 53 51 4c 49 54  NE and p5==SQLIT
40d0: 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20 20 20 20 6f  E_NULLEQ.**    o
40e0: 74 68 65 72 77 69 73 65 3a 20 20 20 20 20 20 20  therwise:       
40f0: 20 20 20 20 20 20 20 20 20 6f 70 3d 3d 70 45 78           op==pEx
4100: 70 72 2d 3e 6f 70 20 61 6e 64 20 70 35 3d 3d 30  pr->op and p5==0
4110: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4120: 63 6f 64 65 56 65 63 74 6f 72 43 6f 6d 70 61 72  codeVectorCompar
4130: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
4140: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  se,        /* Co
4150: 64 65 20 67 65 6e 65 72 61 74 6f 72 20 63 6f 6e  de generator con
4160: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
4170: 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20  pExpr,          
4180: 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f  /* The compariso
4190: 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  n operation */. 
41a0: 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20   int dest,      
41b0: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
41c0: 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 74 68 69  results into thi
41d0: 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  s register */.  
41e0: 75 38 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  u8 op,          
41f0: 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69        /* Compari
4200: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  son operator */.
4210: 20 20 75 38 20 70 35 20 20 20 20 20 20 20 20 20    u8 p5         
4220: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
4230: 45 5f 4e 55 4c 4c 45 51 20 6f 72 20 7a 65 72 6f  E_NULLEQ or zero
4240: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
4250: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
4260: 3b 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20  ;.  Expr *pLeft 
4270: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
4280: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
4290: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a   pExpr->pRight;.
42a0: 20 20 69 6e 74 20 6e 4c 65 66 74 20 3d 20 73 71    int nLeft = sq
42b0: 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
42c0: 69 7a 65 28 70 4c 65 66 74 29 3b 0a 20 20 69 6e  ize(pLeft);.  in
42d0: 74 20 6e 52 69 67 68 74 20 3d 20 73 71 6c 69 74  t nRight = sqlit
42e0: 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
42f0: 28 70 52 69 67 68 74 29 3b 0a 0a 20 20 2f 2a 20  (pRight);..  /* 
4300: 43 68 65 63 6b 20 74 68 61 74 20 62 6f 74 68 20  Check that both 
4310: 73 69 64 65 73 20 6f 66 20 74 68 65 20 63 6f 6d  sides of the com
4320: 70 61 72 69 73 6f 6e 20 61 72 65 20 76 65 63 74  parison are vect
4330: 6f 72 73 2c 20 61 6e 64 20 74 68 61 74 0a 20 20  ors, and that.  
4340: 2a 2a 20 62 6f 74 68 20 61 72 65 20 74 68 65 20  ** both are the 
4350: 73 61 6d 65 20 6c 65 6e 67 74 68 2e 20 20 2a 2f  same length.  */
4360: 0a 20 20 69 66 28 20 6e 4c 65 66 74 21 3d 6e 52  .  if( nLeft!=nR
4370: 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  ight ){.    sqli
4380: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
4390: 73 65 2c 20 22 69 6e 76 61 6c 69 64 20 75 73 65  se, "invalid use
43a0: 20 6f 66 20 72 6f 77 20 76 61 6c 75 65 22 29 3b   of row value");
43b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
43c0: 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 72 65 67  t i;.    int reg
43d0: 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Left = 0;.    in
43e0: 74 20 72 65 67 52 69 67 68 74 20 3d 20 30 3b 0a  t regRight = 0;.
43f0: 20 20 20 20 75 38 20 6f 70 78 20 3d 20 6f 70 3b      u8 opx = op;
4400: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 44 6f 6e  .    int addrDon
4410: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
4420: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
4430: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
4440: 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45  >op==TK_EQ || pE
4450: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 0a  xpr->op==TK_NE .
4460: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70           || pExp
4470: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c 7c 20  r->op==TK_IS || 
4480: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
4490: 4e 4f 54 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  NOT .         ||
44a0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c   pExpr->op==TK_L
44b0: 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  T || pExpr->op==
44c0: 54 4b 5f 47 54 20 0a 20 20 20 20 20 20 20 20 20  TK_GT .         
44d0: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
44e0: 5f 4c 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _LE || pExpr->op
44f0: 3d 3d 54 4b 5f 47 45 20 0a 20 20 20 20 29 3b 0a  ==TK_GE .    );.
4500: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
4510: 72 2d 3e 6f 70 3d 3d 6f 70 20 7c 7c 20 28 70 45  r->op==op || (pE
4520: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 26  xpr->op==TK_IS &
4530: 26 20 6f 70 3d 3d 54 4b 5f 45 51 29 0a 20 20 20  & op==TK_EQ).   
4540: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
4550: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e  Expr->op==TK_ISN
4560: 4f 54 20 26 26 20 6f 70 3d 3d 54 4b 5f 4e 45 29  OT && op==TK_NE)
4570: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
4580: 70 35 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e  p5==0 || pExpr->
4590: 6f 70 21 3d 6f 70 20 29 3b 0a 20 20 20 20 61 73  op!=op );.    as
45a0: 73 65 72 74 28 20 70 35 3d 3d 53 51 4c 49 54 45  sert( p5==SQLITE
45b0: 5f 4e 55 4c 4c 45 51 20 7c 7c 20 70 45 78 70 72  _NULLEQ || pExpr
45c0: 2d 3e 6f 70 3d 3d 6f 70 20 29 3b 0a 0a 20 20 20  ->op==op );..   
45d0: 20 70 35 20 7c 3d 20 53 51 4c 49 54 45 5f 53 54   p5 |= SQLITE_ST
45e0: 4f 52 45 50 32 3b 0a 20 20 20 20 69 66 28 20 6f  OREP2;.    if( o
45f0: 70 78 3d 3d 54 4b 5f 4c 45 20 29 20 6f 70 78 20  px==TK_LE ) opx 
4600: 3d 20 54 4b 5f 4c 54 3b 0a 20 20 20 20 69 66 28  = TK_LT;.    if(
4610: 20 6f 70 78 3d 3d 54 4b 5f 47 45 20 29 20 6f 70   opx==TK_GE ) op
4620: 78 20 3d 20 54 4b 5f 47 54 3b 0a 0a 20 20 20 20  x = TK_GT;..    
4630: 72 65 67 4c 65 66 74 20 3d 20 65 78 70 72 43 6f  regLeft = exprCo
4640: 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
4650: 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20  se, pLeft);.    
4660: 72 65 67 52 69 67 68 74 20 3d 20 65 78 70 72 43  regRight = exprC
4670: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
4680: 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 0a 20  rse, pRight);.. 
4690: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c     for(i=0; i<nL
46a0: 65 66 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  eft; i++){.     
46b0: 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
46c0: 30 2c 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  0, regFree2 = 0;
46d0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 2c  .      Expr *pL,
46e0: 20 2a 70 52 3b 20 0a 20 20 20 20 20 20 69 6e 74   *pR; .      int
46f0: 20 72 31 2c 20 72 32 3b 0a 20 20 20 20 20 20 69   r1, r2;.      i
4700: 66 28 20 69 3e 30 20 29 20 73 71 6c 69 74 65 33  f( i>0 ) sqlite3
4710: 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
4720: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72 31 20  arse);.      r1 
4730: 3d 20 65 78 70 72 56 65 63 74 6f 72 52 65 67 69  = exprVectorRegi
4740: 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 4c 65  ster(pParse, pLe
4750: 66 74 2c 20 69 2c 20 72 65 67 4c 65 66 74 2c 20  ft, i, regLeft, 
4760: 26 70 4c 2c 20 26 72 65 67 46 72 65 65 31 29 3b  &pL, &regFree1);
4770: 0a 20 20 20 20 20 20 72 32 20 3d 20 65 78 70 72  .      r2 = expr
4780: 56 65 63 74 6f 72 52 65 67 69 73 74 65 72 28 70  VectorRegister(p
4790: 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 69  Parse, pRight, i
47a0: 2c 20 72 65 67 52 69 67 68 74 2c 20 26 70 52 2c  , regRight, &pR,
47b0: 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
47c0: 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
47d0: 50 61 72 73 65 2c 20 70 4c 2c 20 70 52 2c 20 6f  Parse, pL, pR, o
47e0: 70 78 2c 20 72 31 2c 20 72 32 2c 20 64 65 73 74  px, r1, r2, dest
47f0: 2c 20 70 35 29 3b 0a 20 20 20 20 20 20 74 65 73  , p5);.      tes
4800: 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29  tcase(op==OP_Lt)
4810: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
4820: 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20  (v,op==OP_Lt);. 
4830: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70       testcase(op
4840: 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f  ==OP_Le); VdbeCo
4850: 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
4860: 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 74 65 73  P_Le);.      tes
4870: 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29  tcase(op==OP_Gt)
4880: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
4890: 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20  (v,op==OP_Gt);. 
48a0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70       testcase(op
48b0: 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ge); VdbeCo
48c0: 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
48d0: 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 74 65 73  P_Ge);.      tes
48e0: 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29  tcase(op==OP_Eq)
48f0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
4900: 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20  (v,op==OP_Eq);. 
4910: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70       testcase(op
4920: 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ne); VdbeCo
4930: 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
4940: 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  P_Ne);.      sql
4950: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
4960: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
4970: 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee1);.      sqli
4980: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
4990: 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
49a0: 65 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  e2);.      if( i
49b0: 3e 30 20 29 20 73 71 6c 69 74 65 33 45 78 70 72  >0 ) sqlite3Expr
49c0: 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
49d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 6e  ;.      if( i==n
49e0: 4c 65 66 74 2d 31 20 29 7b 0a 20 20 20 20 20 20  Left-1 ){.      
49f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
4a00: 0a 20 20 20 20 20 20 69 66 28 20 6f 70 78 3d 3d  .      if( opx==
4a10: 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 20  TK_EQ ){.       
4a20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4a30: 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p2(v, OP_IfNot, 
4a40: 64 65 73 74 2c 20 61 64 64 72 44 6f 6e 65 29 3b  dest, addrDone);
4a50: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
4a60: 3b 0a 20 20 20 20 20 20 20 20 70 35 20 7c 3d 20  ;.        p5 |= 
4a70: 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c 4c 3b  SQLITE_KEEPNULL;
4a80: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
4a90: 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20 29 7b 0a 20   opx==TK_NE ){. 
4aa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
4ab0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
4ac0: 66 2c 20 64 65 73 74 2c 20 61 64 64 72 44 6f 6e  f, dest, addrDon
4ad0: 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
4ae0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 70 35 20  (v);.        p5 
4af0: 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55  |= SQLITE_KEEPNU
4b00: 4c 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LL;.      }else{
4b10: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
4b20: 20 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70   op==TK_LT || op
4b30: 3d 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 54  ==TK_GT || op==T
4b40: 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 47  K_LE || op==TK_G
4b50: 45 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  E );.        sql
4b60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
4b70: 2c 20 4f 50 5f 45 6c 73 65 4e 6f 74 45 71 2c 20  , OP_ElseNotEq, 
4b80: 30 2c 20 61 64 64 72 44 6f 6e 65 29 3b 0a 20 20  0, addrDone);.  
4b90: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
4ba0: 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c  geIf(v, op==TK_L
4bb0: 54 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  T);.        Vdbe
4bc0: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
4bd0: 3d 3d 54 4b 5f 47 54 29 3b 0a 20 20 20 20 20 20  ==TK_GT);.      
4be0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
4bf0: 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c 45 29 3b 0a  (v, op==TK_LE);.
4c00: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
4c10: 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
4c20: 5f 47 45 29 3b 0a 20 20 20 20 20 20 20 20 69 66  _GE);.        if
4c30: 28 20 69 3d 3d 6e 4c 65 66 74 2d 32 20 29 20 6f  ( i==nLeft-2 ) o
4c40: 70 78 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 7d  px = op;.      }
4c50: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
4c60: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
4c70: 65 6c 28 76 2c 20 61 64 64 72 44 6f 6e 65 29 3b  el(v, addrDone);
4c80: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  .  }.}..#if SQLI
4c90: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
4ca0: 48 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  H>0./*.** Check 
4cb0: 74 68 61 74 20 61 72 67 75 6d 65 6e 74 20 6e 48  that argument nH
4cc0: 65 69 67 68 74 20 69 73 20 6c 65 73 73 20 74 68  eight is less th
4cd0: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
4ce0: 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 65 78  he maximum.** ex
4cf0: 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68 20 61  pression depth a
4d00: 6c 6c 6f 77 65 64 2e 20 49 66 20 69 74 20 69 73  llowed. If it is
4d10: 20 6e 6f 74 2c 20 6c 65 61 76 65 20 61 6e 20 65   not, leave an e
4d20: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 0a  rror message in.
4d30: 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 69 6e  ** pParse..*/.in
4d40: 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65  t sqlite3ExprChe
4d50: 63 6b 48 65 69 67 68 74 28 50 61 72 73 65 20 2a  ckHeight(Parse *
4d60: 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 48 65 69  pParse, int nHei
4d70: 67 68 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ght){.  int rc =
4d80: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
4d90: 74 20 6d 78 48 65 69 67 68 74 20 3d 20 70 50 61  t mxHeight = pPa
4da0: 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  rse->db->aLimit[
4db0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50  SQLITE_LIMIT_EXP
4dc0: 52 5f 44 45 50 54 48 5d 3b 0a 20 20 69 66 28 20  R_DEPTH];.  if( 
4dd0: 6e 48 65 69 67 68 74 3e 6d 78 48 65 69 67 68 74  nHeight>mxHeight
4de0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
4df0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
4e00: 0a 20 20 20 20 20 20 20 22 45 78 70 72 65 73 73  .       "Express
4e10: 69 6f 6e 20 74 72 65 65 20 69 73 20 74 6f 6f 20  ion tree is too 
4e20: 6c 61 72 67 65 20 28 6d 61 78 69 6d 75 6d 20 64  large (maximum d
4e30: 65 70 74 68 20 25 64 29 22 2c 20 6d 78 48 65 69  epth %d)", mxHei
4e40: 67 68 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 72  ght.    );.    r
4e50: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
4e60: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
4e70: 63 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c  c;.}../* The fol
4e80: 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 66 75 6e  lowing three fun
4e90: 63 74 69 6f 6e 73 2c 20 68 65 69 67 68 74 4f 66  ctions, heightOf
4ea0: 45 78 70 72 28 29 2c 20 68 65 69 67 68 74 4f 66  Expr(), heightOf
4eb0: 45 78 70 72 4c 69 73 74 28 29 0a 2a 2a 20 61 6e  ExprList().** an
4ec0: 64 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74  d heightOfSelect
4ed0: 28 29 2c 20 61 72 65 20 75 73 65 64 20 74 6f 20  (), are used to 
4ee0: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 61  determine the ma
4ef0: 78 69 6d 75 6d 20 68 65 69 67 68 74 0a 2a 2a 20  ximum height.** 
4f00: 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  of any expressio
4f10: 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65  n tree reference
4f20: 64 20 62 79 20 74 68 65 20 73 74 72 75 63 74 75  d by the structu
4f30: 72 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  re passed as the
4f40: 0a 2a 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65  .** first argume
4f50: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  nt..**.** If thi
4f60: 73 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  s maximum height
4f70: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
4f80: 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
4f90: 75 65 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f  ue pointed.** to
4fa0: 20 62 79 20 70 6e 48 65 69 67 68 74 2c 20 74 68   by pnHeight, th
4fb0: 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
4fc0: 65 72 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 6e  er, then set *pn
4fd0: 48 65 69 67 68 74 20 74 6f 20 74 68 61 74 0a 2a  Height to that.*
4fe0: 2a 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74  * value..*/.stat
4ff0: 69 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66  ic void heightOf
5000: 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e  Expr(Expr *p, in
5010: 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20  t *pnHeight){.  
5020: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  if( p ){.    if(
5030: 20 70 2d 3e 6e 48 65 69 67 68 74 3e 2a 70 6e 48   p->nHeight>*pnH
5040: 65 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2a  eight ){.      *
5050: 70 6e 48 65 69 67 68 74 20 3d 20 70 2d 3e 6e 48  pnHeight = p->nH
5060: 65 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  eight;.    }.  }
5070: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  .}.static void h
5080: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
5090: 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74  ExprList *p, int
50a0: 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69   *pnHeight){.  i
50b0: 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20  f( p ){.    int 
50c0: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
50d0: 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  i<p->nExpr; i++)
50e0: 7b 0a 20 20 20 20 20 20 68 65 69 67 68 74 4f 66  {.      heightOf
50f0: 45 78 70 72 28 70 2d 3e 61 5b 69 5d 2e 70 45 78  Expr(p->a[i].pEx
5100: 70 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  pr, pnHeight);. 
5110: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69     }.  }.}.stati
5120: 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 53  c void heightOfS
5130: 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c  elect(Select *p,
5140: 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b   int *pnHeight){
5150: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
5160: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
5170: 70 57 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74  pWhere, pnHeight
5180: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  );.    heightOfE
5190: 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20  xpr(p->pHaving, 
51a0: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
51b0: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
51c0: 4c 69 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29  Limit, pnHeight)
51d0: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
51e0: 70 72 28 70 2d 3e 70 4f 66 66 73 65 74 2c 20 70  pr(p->pOffset, p
51f0: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
5200: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70  ightOfExprList(p
5210: 2d 3e 70 45 4c 69 73 74 2c 20 70 6e 48 65 69 67  ->pEList, pnHeig
5220: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
5230: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72  fExprList(p->pGr
5240: 6f 75 70 42 79 2c 20 70 6e 48 65 69 67 68 74 29  oupBy, pnHeight)
5250: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
5260: 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72  prList(p->pOrder
5270: 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  By, pnHeight);. 
5280: 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63     heightOfSelec
5290: 74 28 70 2d 3e 70 50 72 69 6f 72 2c 20 70 6e 48  t(p->pPrior, pnH
52a0: 65 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  eight);.  }.}../
52b0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
52c0: 72 2e 6e 48 65 69 67 68 74 20 76 61 72 69 61 62  r.nHeight variab
52d0: 6c 65 20 69 6e 20 74 68 65 20 73 74 72 75 63 74  le in the struct
52e0: 75 72 65 20 70 61 73 73 65 64 20 61 73 20 61 6e  ure passed as an
52f0: 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41   .** argument. A
5300: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74  n expression wit
5310: 68 20 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45  h no children, E
5320: 78 70 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a  xpr.pList or .**
5330: 20 45 78 70 72 2e 70 53 65 6c 65 63 74 20 6d 65   Expr.pSelect me
5340: 6d 62 65 72 20 68 61 73 20 61 20 68 65 69 67 68  mber has a heigh
5350: 74 20 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68 65  t of 1. Any othe
5360: 72 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  r expression.** 
5370: 68 61 73 20 61 20 68 65 69 67 68 74 20 65 71 75  has a height equ
5380: 61 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  al to the maximu
5390: 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20  m height of any 
53a0: 6f 74 68 65 72 20 0a 2a 2a 20 72 65 66 65 72 65  other .** refere
53b0: 6e 63 65 64 20 45 78 70 72 20 70 6c 75 73 20 6f  nced Expr plus o
53c0: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70  ne..**.** Also p
53d0: 72 6f 70 61 67 61 74 65 20 45 50 5f 50 72 6f 70  ropagate EP_Prop
53e0: 61 67 61 74 65 20 66 6c 61 67 73 20 75 70 20 66  agate flags up f
53f0: 72 6f 6d 20 45 78 70 72 2e 78 2e 70 4c 69 73 74  rom Expr.x.pList
5400: 20 74 6f 20 45 78 70 72 2e 66 6c 61 67 73 2c 0a   to Expr.flags,.
5410: 2a 2a 20 69 66 20 61 70 70 72 6f 70 72 69 61 74  ** if appropriat
5420: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
5430: 64 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28  d exprSetHeight(
5440: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Expr *p){.  int 
5450: 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68  nHeight = 0;.  h
5460: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
5470: 4c 65 66 74 2c 20 26 6e 48 65 69 67 68 74 29 3b  Left, &nHeight);
5480: 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28  .  heightOfExpr(
5490: 70 2d 3e 70 52 69 67 68 74 2c 20 26 6e 48 65 69  p->pRight, &nHei
54a0: 67 68 74 29 3b 0a 20 20 69 66 28 20 45 78 70 72  ght);.  if( Expr
54b0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
54c0: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
54d0: 20 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65      heightOfSele
54e0: 63 74 28 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  ct(p->x.pSelect,
54f0: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 65   &nHeight);.  }e
5500: 6c 73 65 20 69 66 28 20 70 2d 3e 78 2e 70 4c 69  lse if( p->x.pLi
5510: 73 74 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74  st ){.    height
5520: 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e  OfExprList(p->x.
5530: 70 4c 69 73 74 2c 20 26 6e 48 65 69 67 68 74 29  pList, &nHeight)
5540: 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c  ;.    p->flags |
5550: 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26  = EP_Propagate &
5560: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
5570: 46 6c 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74  Flags(p->x.pList
5580: 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69  );.  }.  p->nHei
5590: 67 68 74 20 3d 20 6e 48 65 69 67 68 74 20 2b 20  ght = nHeight + 
55a0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  1;.}../*.** Set 
55b0: 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74  the Expr.nHeight
55c0: 20 76 61 72 69 61 62 6c 65 20 75 73 69 6e 67 20   variable using 
55d0: 74 68 65 20 65 78 70 72 53 65 74 48 65 69 67 68  the exprSetHeigh
55e0: 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66  t() function. If
55f0: 0a 2a 2a 20 74 68 65 20 68 65 69 67 68 74 20 69  .** the height i
5600: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
5610: 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77  he maximum allow
5620: 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65  ed expression de
5630: 70 74 68 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e  pth,.** leave an
5640: 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65   error in pParse
5650: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f  ..**.** Also pro
5660: 70 61 67 61 74 65 20 61 6c 6c 20 45 50 5f 50 72  pagate all EP_Pr
5670: 6f 70 61 67 61 74 65 20 66 6c 61 67 73 20 66 72  opagate flags fr
5680: 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c  om the Expr.x.pL
5690: 69 73 74 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72  ist into.** Expr
56a0: 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64  .flags. .*/.void
56b0: 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48   sqlite3ExprSetH
56c0: 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28 50 61  eightAndFlags(Pa
56d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
56e0: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 50 61  r *p){.  if( pPa
56f0: 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75  rse->nErr ) retu
5700: 72 6e 3b 0a 20 20 65 78 70 72 53 65 74 48 65 69  rn;.  exprSetHei
5710: 67 68 74 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ght(p);.  sqlite
5720: 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74  3ExprCheckHeight
5730: 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69  (pParse, p->nHei
5740: 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ght);.}../*.** R
5750: 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75  eturn the maximu
5760: 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20  m height of any 
5770: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
5780: 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79  referenced.** by
5790: 20 74 68 65 20 73 65 6c 65 63 74 20 73 74 61 74   the select stat
57a0: 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20  ement passed as 
57b0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  an argument..*/.
57c0: 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
57d0: 74 45 78 70 72 48 65 69 67 68 74 28 53 65 6c 65  tExprHeight(Sele
57e0: 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48  ct *p){.  int nH
57f0: 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69  eight = 0;.  hei
5800: 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2c 20 26  ghtOfSelect(p, &
5810: 6e 48 65 69 67 68 74 29 3b 0a 20 20 72 65 74 75  nHeight);.  retu
5820: 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65  rn nHeight;.}.#e
5830: 6c 73 65 20 2f 2a 20 41 42 4f 56 45 3a 20 20 48  lse /* ABOVE:  H
5840: 65 69 67 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e  eight enforcemen
5850: 74 20 65 6e 61 62 6c 65 64 2e 20 20 42 45 4c 4f  t enabled.  BELO
5860: 57 3a 20 48 65 69 67 68 74 20 65 6e 66 6f 72 63  W: Height enforc
5870: 65 6d 65 6e 74 20 6f 66 66 20 2a 2f 0a 2f 2a 0a  ement off */./*.
5880: 2a 2a 20 50 72 6f 70 61 67 61 74 65 20 61 6c 6c  ** Propagate all
5890: 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c   EP_Propagate fl
58a0: 61 67 73 20 66 72 6f 6d 20 74 68 65 20 45 78 70  ags from the Exp
58b0: 72 2e 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a  r.x.pList into.*
58c0: 2a 20 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a  * Expr.flags. .*
58d0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
58e0: 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c  prSetHeightAndFl
58f0: 61 67 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ags(Parse *pPars
5900: 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  e, Expr *p){.  i
5910: 66 28 20 70 20 26 26 20 70 2d 3e 78 2e 70 4c 69  f( p && p->x.pLi
5920: 73 74 20 26 26 20 21 45 78 70 72 48 61 73 50 72  st && !ExprHasPr
5930: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73  operty(p, EP_xIs
5940: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 70  Select) ){.    p
5950: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72  ->flags |= EP_Pr
5960: 6f 70 61 67 61 74 65 20 26 20 73 71 6c 69 74 65  opagate & sqlite
5970: 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70  3ExprListFlags(p
5980: 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a  ->x.pList);.  }.
5990: 7d 0a 23 64 65 66 69 6e 65 20 65 78 70 72 53 65  }.#define exprSe
59a0: 74 48 65 69 67 68 74 28 79 29 0a 23 65 6e 64 69  tHeight(y).#endi
59b0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f  f /* SQLITE_MAX_
59c0: 45 58 50 52 5f 44 45 50 54 48 3e 30 20 2a 2f 0a  EXPR_DEPTH>0 */.
59d0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
59e0: 69 6e 65 20 69 73 20 74 68 65 20 63 6f 72 65 20  ine is the core 
59f0: 61 6c 6c 6f 63 61 74 6f 72 20 66 6f 72 20 45 78  allocator for Ex
5a00: 70 72 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20  pr nodes..**.** 
5a10: 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20  Construct a new 
5a20: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
5a30: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
5a40: 6e 74 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d  nter to it.  Mem
5a50: 6f 72 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20  ory.** for this 
5a60: 6e 6f 64 65 20 61 6e 64 20 66 6f 72 20 74 68 65  node and for the
5a70: 20 70 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74   pToken argument
5a80: 20 69 73 20 61 20 73 69 6e 67 6c 65 20 61 6c 6c   is a single all
5a90: 6f 63 61 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69  ocation.** obtai
5aa0: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
5ab0: 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65  DbMalloc().  The
5ac0: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
5ad0: 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69  n.** is responsi
5ae0: 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73  ble for making s
5af0: 75 72 65 20 74 68 65 20 6e 6f 64 65 20 65 76 65  ure the node eve
5b00: 6e 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65  ntually gets fre
5b10: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 71  ed..**.** If deq
5b20: 75 6f 74 65 20 69 73 20 74 72 75 65 2c 20 74 68  uote is true, th
5b30: 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20 28 69 66  en the token (if
5b40: 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20 64   it exists) is d
5b50: 65 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 64  equoted..** If d
5b60: 65 71 75 6f 74 65 20 69 73 20 66 61 6c 73 65 2c  equote is false,
5b70: 20 6e 6f 20 64 65 71 75 6f 74 69 6e 67 20 69 73   no dequoting is
5b80: 20 70 65 72 66 6f 72 6d 65 64 2e 20 20 54 68 65   performed.  The
5b90: 20 64 65 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61   deQuote.** para
5ba0: 6d 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64  meter is ignored
5bb0: 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55   if pToken is NU
5bc0: 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 74 6f 6b  LL or if the tok
5bd0: 65 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61  en does not.** a
5be0: 70 70 65 61 72 20 74 6f 20 62 65 20 71 75 6f 74  ppear to be quot
5bf0: 65 64 2e 20 20 49 66 20 74 68 65 20 71 75 6f 74  ed.  If the quot
5c00: 65 73 20 77 65 72 65 20 6f 66 20 74 68 65 20 66  es were of the f
5c10: 6f 72 6d 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c  orm "..." (doubl
5c20: 65 2d 71 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65  e-quotes).** the
5c30: 6e 20 74 68 65 20 45 50 5f 44 62 6c 51 75 6f 74  n the EP_DblQuot
5c40: 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f  ed flag is set o
5c50: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
5c60: 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65   node..**.** Spe
5c70: 63 69 61 6c 20 63 61 73 65 3a 20 20 49 66 20 6f  cial case:  If o
5c80: 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e  p==TK_INTEGER an
5c90: 64 20 70 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20  d pToken points 
5ca0: 74 6f 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  to a string that
5cb0: 0a 2a 2a 20 63 61 6e 20 62 65 20 74 72 61 6e 73  .** can be trans
5cc0: 6c 61 74 65 64 20 69 6e 74 6f 20 61 20 33 32 2d  lated into a 32-
5cd0: 62 69 74 20 69 6e 74 65 67 65 72 2c 20 74 68 65  bit integer, the
5ce0: 6e 20 74 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e  n the token is n
5cf0: 6f 74 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  ot.** stored in 
5d00: 75 2e 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65  u.zToken.  Inste
5d10: 61 64 2c 20 74 68 65 20 69 6e 74 65 67 65 72 20  ad, the integer 
5d20: 76 61 6c 75 65 73 20 69 73 20 77 72 69 74 74 65  values is writte
5d30: 6e 0a 2a 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c  n.** into u.iVal
5d40: 75 65 20 61 6e 64 20 74 68 65 20 45 50 5f 49 6e  ue and the EP_In
5d50: 74 56 61 6c 75 65 20 66 6c 61 67 20 69 73 20 73  tValue flag is s
5d60: 65 74 2e 20 20 4e 6f 20 65 78 74 72 61 20 73 74  et.  No extra st
5d70: 6f 72 61 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f  orage.** is allo
5d80: 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68  cated to hold th
5d90: 65 20 69 6e 74 65 67 65 72 20 74 65 78 74 20 61  e integer text a
5da0: 6e 64 20 74 68 65 20 64 65 71 75 6f 74 65 20 66  nd the dequote f
5db0: 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a  lag is ignored..
5dc0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
5dd0: 45 78 70 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c  ExprAlloc(.  sql
5de0: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
5df0: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66       /* Handle f
5e00: 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  or sqlite3DbMall
5e10: 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65  ocZero() (may be
5e20: 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20   null) */.  int 
5e30: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
5e40: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
5e50: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  n opcode */.  co
5e60: 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  nst Token *pToke
5e70: 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61  n,    /* Token a
5e80: 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20  rgument.  Might 
5e90: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
5ea0: 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20 20   dequote        
5eb0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
5ec0: 64 65 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20  dequote */.){.  
5ed0: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  Expr *pNew;.  in
5ee0: 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20  t nExtra = 0;.  
5ef0: 69 6e 74 20 69 56 61 6c 75 65 20 3d 20 30 3b 0a  int iValue = 0;.
5f00: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
5f10: 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e   );.  if( pToken
5f20: 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d   ){.    if( op!=
5f30: 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 70 54  TK_INTEGER || pT
5f40: 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20 20 20 20  oken->z==0.     
5f50: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47       || sqlite3G
5f60: 65 74 49 6e 74 33 32 28 70 54 6f 6b 65 6e 2d 3e  etInt32(pToken->
5f70: 7a 2c 20 26 69 56 61 6c 75 65 29 3d 3d 30 20 29  z, &iValue)==0 )
5f80: 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 3d  {.      nExtra =
5f90: 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a 20 20   pToken->n+1;.  
5fa0: 20 20 20 20 61 73 73 65 72 74 28 20 69 56 61 6c      assert( iVal
5fb0: 75 65 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  ue>=0 );.    }. 
5fc0: 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69   }.  pNew = sqli
5fd0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
5fe0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  (db, sizeof(Expr
5ff0: 29 2b 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28  )+nExtra);.  if(
6000: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 6d 65 6d   pNew ){.    mem
6010: 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a  set(pNew, 0, siz
6020: 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 20 20  eof(Expr));.    
6030: 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29 6f  pNew->op = (u8)o
6040: 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41 67  p;.    pNew->iAg
6050: 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  g = -1;.    if( 
6060: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20  pToken ){.      
6070: 69 66 28 20 6e 45 78 74 72 61 3d 3d 30 20 29 7b  if( nExtra==0 ){
6080: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  .        pNew->f
6090: 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61  lags |= EP_IntVa
60a0: 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  lue;.        pNe
60b0: 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 56  w->u.iValue = iV
60c0: 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  alue;.      }els
60d0: 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  e{.        pNew-
60e0: 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61  >u.zToken = (cha
60f0: 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20  r*)&pNew[1];.   
6100: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f       assert( pTo
6110: 6b 65 6e 2d 3e 7a 21 3d 30 20 7c 7c 20 70 54 6f  ken->z!=0 || pTo
6120: 6b 65 6e 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20  ken->n==0 );.   
6130: 20 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d       if( pToken-
6140: 3e 6e 20 29 20 6d 65 6d 63 70 79 28 70 4e 65 77  >n ) memcpy(pNew
6150: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 54 6f 6b  ->u.zToken, pTok
6160: 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e  en->z, pToken->n
6170: 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
6180: 3e 75 2e 7a 54 6f 6b 65 6e 5b 70 54 6f 6b 65 6e  >u.zToken[pToken
6190: 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  ->n] = 0;.      
61a0: 20 20 69 66 28 20 64 65 71 75 6f 74 65 20 26 26    if( dequote &&
61b0: 20 73 71 6c 69 74 65 33 49 73 71 75 6f 74 65 28   sqlite3Isquote(
61c0: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  pNew->u.zToken[0
61d0: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
61e0: 69 66 28 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b  if( pNew->u.zTok
61f0: 65 6e 5b 30 5d 3d 3d 27 22 27 20 29 20 70 4e 65  en[0]=='"' ) pNe
6200: 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 44  w->flags |= EP_D
6210: 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20 20 20  blQuoted;.      
6220: 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
6230: 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65  te(pNew->u.zToke
6240: 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  n);.        }.  
6250: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 20      }.    }.#if 
6260: 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
6270: 44 45 50 54 48 3e 30 0a 20 20 20 20 70 4e 65 77  DEPTH>0.    pNew
6280: 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31 3b 0a 23  ->nHeight = 1;.#
6290: 65 6e 64 69 66 20 20 0a 20 20 7d 0a 20 20 72 65  endif  .  }.  re
62a0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
62b0: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
62c0: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ew expression no
62d0: 64 65 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 74  de from a zero-t
62e0: 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65 6e 20  erminated token 
62f0: 74 68 61 74 20 68 61 73 0a 2a 2a 20 61 6c 72 65  that has.** alre
6300: 61 64 79 20 62 65 65 6e 20 64 65 71 75 6f 74 65  ady been dequote
6310: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
6320: 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c 69 74  te3Expr(.  sqlit
6330: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
6340: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72     /* Handle for
6350: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
6360: 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65 20 6e  Zero() (may be n
6370: 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  ull) */.  int op
6380: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6390: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
63a0: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73  opcode */.  cons
63b0: 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 20  t char *zToken  
63c0: 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67      /* Token arg
63d0: 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65  ument.  Might be
63e0: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54 6f   NULL */.){.  To
63f0: 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a 20 3d 20 7a  ken x;.  x.z = z
6400: 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20 3d 20 7a  Token;.  x.n = z
6410: 54 6f 6b 65 6e 20 3f 20 73 71 6c 69 74 65 33 53  Token ? sqlite3S
6420: 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e 29 20  trlen30(zToken) 
6430: 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  : 0;.  return sq
6440: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
6450: 62 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b 0a 7d  b, op, &x, 0);.}
6460: 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20 73  ../*.** Attach s
6470: 75 62 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e  ubtrees pLeft an
6480: 64 20 70 52 69 67 68 74 20 74 6f 20 74 68 65 20  d pRight to the 
6490: 45 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f 74 2e  Expr node pRoot.
64a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f 74 3d  .**.** If pRoot=
64b0: 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73  =NULL that means
64c0: 20 74 68 61 74 20 61 20 6d 65 6d 6f 72 79 20 61   that a memory a
64d0: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
64e0: 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a  has occurred..**
64f0: 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64   In that case, d
6500: 65 6c 65 74 65 20 74 68 65 20 73 75 62 74 72 65  elete the subtre
6510: 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69  es pLeft and pRi
6520: 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ght..*/.void sql
6530: 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53 75  ite3ExprAttachSu
6540: 62 74 72 65 65 73 28 0a 20 20 73 71 6c 69 74 65  btrees(.  sqlite
6550: 33 20 2a 64 62 2c 0a 20 20 45 78 70 72 20 2a 70  3 *db,.  Expr *p
6560: 52 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a 70 4c  Root,.  Expr *pL
6570: 65 66 74 2c 0a 20 20 45 78 70 72 20 2a 70 52 69  eft,.  Expr *pRi
6580: 67 68 74 0a 29 7b 0a 20 20 69 66 28 20 70 52 6f  ght.){.  if( pRo
6590: 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ot==0 ){.    ass
65a0: 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
65b0: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71 6c  ailed );.    sql
65c0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
65d0: 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  b, pLeft);.    s
65e0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
65f0: 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  (db, pRight);.  
6600: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
6610: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70  Right ){.      p
6620: 52 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d 20 70  Root->pRight = p
6630: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70 52 6f  Right;.      pRo
6640: 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ot->flags |= EP_
6650: 50 72 6f 70 61 67 61 74 65 20 26 20 70 52 69 67  Propagate & pRig
6660: 68 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d  ht->flags;.    }
6670: 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 20 29  .    if( pLeft )
6680: 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70  {.      pRoot->p
6690: 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20  Left = pLeft;.  
66a0: 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73      pRoot->flags
66b0: 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65   |= EP_Propagate
66c0: 20 26 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 3b   & pLeft->flags;
66d0: 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 70 72 53  .    }.    exprS
66e0: 65 74 48 65 69 67 68 74 28 70 52 6f 6f 74 29 3b  etHeight(pRoot);
66f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
6700: 6c 6f 63 61 74 65 20 61 6e 20 45 78 70 72 20 6e  locate an Expr n
6710: 6f 64 65 20 77 68 69 63 68 20 6a 6f 69 6e 73 20  ode which joins 
6720: 61 73 20 6d 61 6e 79 20 61 73 20 74 77 6f 20 73  as many as two s
6730: 75 62 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f  ubtrees..**.** O
6740: 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68  ne or both of th
6750: 65 20 73 75 62 74 72 65 65 73 20 63 61 6e 20 62  e subtrees can b
6760: 65 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 20  e NULL.  Return 
6770: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
6780: 20 6e 65 77 0a 2a 2a 20 45 78 70 72 20 6e 6f 64   new.** Expr nod
6790: 65 2e 20 20 4f 72 2c 20 69 66 20 61 6e 20 4f 4f  e.  Or, if an OO
67a0: 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  M error occurs, 
67b0: 73 65 74 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  set pParse->db->
67c0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a  mallocFailed,.**
67d0: 20 66 72 65 65 20 74 68 65 20 73 75 62 74 72 65   free the subtre
67e0: 65 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  es and return NU
67f0: 4c 4c 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  LL..*/.Expr *sql
6800: 69 74 65 33 50 45 78 70 72 28 0a 20 20 50 61 72  ite3PExpr(.  Par
6810: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
6820: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
6830: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
6840: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
6850: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
6860: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45  on opcode */.  E
6870: 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20  xpr *pLeft,     
6880: 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f         /* Left o
6890: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72  perand */.  Expr
68a0: 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 20 20   *pRight,       
68b0: 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65      /* Right ope
68c0: 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rand */.  const 
68d0: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 20 20  Token *pToken   
68e0: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
68f0: 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ken */.){.  Expr
6900: 20 2a 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54   *p;.  if( op==T
6910: 4b 5f 41 4e 44 20 26 26 20 70 50 61 72 73 65 2d  K_AND && pParse-
6920: 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  >nErr==0 ){.    
6930: 2f 2a 20 54 61 6b 65 20 61 64 76 61 6e 74 61 67  /* Take advantag
6940: 65 20 6f 66 20 73 68 6f 72 74 2d 63 69 72 63 75  e of short-circu
6950: 69 74 20 66 61 6c 73 65 20 6f 70 74 69 6d 69 7a  it false optimiz
6960: 61 74 69 6f 6e 20 66 6f 72 20 41 4e 44 20 2a 2f  ation for AND */
6970: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
6980: 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e  ExprAnd(pParse->
6990: 64 62 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  db, pLeft, pRigh
69a0: 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
69b0: 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   p = sqlite3Expr
69c0: 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
69d0: 2c 20 6f 70 20 26 20 54 4b 46 4c 47 5f 4d 41 53  , op & TKFLG_MAS
69e0: 4b 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20  K, pToken, 1);. 
69f0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74     sqlite3ExprAt
6a00: 74 61 63 68 53 75 62 74 72 65 65 73 28 70 50 61  tachSubtrees(pPa
6a10: 72 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66  rse->db, p, pLef
6a20: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a  t, pRight);.  }.
6a30: 20 20 69 66 28 20 70 20 29 20 7b 0a 20 20 20 20    if( p ) {.    
6a40: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
6a50: 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70  Height(pParse, p
6a60: 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a  ->nHeight);.  }.
6a70: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
6a80: 2a 0a 2a 2a 20 41 64 64 20 70 53 65 6c 65 63 74  *.** Add pSelect
6a90: 20 74 6f 20 74 68 65 20 45 78 70 72 2e 78 2e 70   to the Expr.x.p
6aa0: 53 65 6c 65 63 74 20 66 69 65 6c 64 2e 20 20 4f  Select field.  O
6ab0: 72 2c 20 69 66 20 70 45 78 70 72 20 69 73 20 4e  r, if pExpr is N
6ac0: 55 4c 4c 20 28 64 75 65 0a 2a 2a 20 64 6f 20 61  ULL (due.** do a
6ad0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
6ae0: 6f 6e 20 66 61 69 6c 75 72 65 29 20 74 68 65 6e  on failure) then
6af0: 20 64 65 6c 65 74 65 20 74 68 65 20 70 53 65 6c   delete the pSel
6b00: 65 63 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76  ect object..*/.v
6b10: 6f 69 64 20 73 71 6c 69 74 65 33 50 45 78 70 72  oid sqlite3PExpr
6b20: 41 64 64 53 65 6c 65 63 74 28 50 61 72 73 65 20  AddSelect(Parse 
6b30: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
6b40: 45 78 70 72 2c 20 53 65 6c 65 63 74 20 2a 70 53  Expr, Select *pS
6b50: 65 6c 65 63 74 29 7b 0a 20 20 69 66 28 20 70 45  elect){.  if( pE
6b60: 78 70 72 20 29 7b 0a 20 20 20 20 70 45 78 70 72  xpr ){.    pExpr
6b70: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 70 53  ->x.pSelect = pS
6b80: 65 6c 65 63 74 3b 0a 20 20 20 20 45 78 70 72 53  elect;.    ExprS
6b90: 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  etProperty(pExpr
6ba0: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 7c 45  , EP_xIsSelect|E
6bb0: 50 5f 53 75 62 71 75 65 72 79 29 3b 0a 20 20 20  P_Subquery);.   
6bc0: 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48   sqlite3ExprSetH
6bd0: 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28 70 50  eightAndFlags(pP
6be0: 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
6bf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
6c00: 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  t( pParse->db->m
6c10: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
6c20: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
6c30: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
6c40: 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d  b, pSelect);.  }
6c50: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  .}.../*.** If th
6c60: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
6c70: 61 6c 77 61 79 73 20 65 69 74 68 65 72 20 54 52  always either TR
6c80: 55 45 20 6f 72 20 46 41 4c 53 45 20 28 72 65 73  UE or FALSE (res
6c90: 70 65 63 74 69 76 65 6c 79 29 2c 0a 2a 2a 20 74  pectively),.** t
6ca0: 68 65 6e 20 72 65 74 75 72 6e 20 31 2e 20 20 49  hen return 1.  I
6cb0: 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 64 65 74  f one cannot det
6cc0: 65 72 6d 69 6e 65 20 74 68 65 20 74 72 75 74 68  ermine the truth
6cd0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a   value of the.**
6ce0: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74 20 63   expression at c
6cf0: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 72 65 74 75  ompile-time retu
6d00: 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rn 0..**.** This
6d10: 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
6d20: 69 6f 6e 2e 20 20 49 66 20 69 73 20 4f 4b 20 74  ion.  If is OK t
6d30: 6f 20 72 65 74 75 72 6e 20 30 20 68 65 72 65 20  o return 0 here 
6d40: 65 76 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20 65  even if.** the e
6d50: 78 70 72 65 73 73 69 6f 6e 20 72 65 61 6c 6c 79  xpression really
6d60: 20 69 73 20 61 6c 77 61 79 73 20 66 61 6c 73 65   is always false
6d70: 20 6f 72 20 66 61 6c 73 65 20 28 61 20 66 61 6c   or false (a fal
6d80: 73 65 20 6e 65 67 61 74 69 76 65 29 2e 0a 2a 2a  se negative)..**
6d90: 20 42 75 74 20 69 74 20 69 73 20 61 20 62 75 67   But it is a bug
6da0: 20 74 6f 20 72 65 74 75 72 6e 20 31 20 69 66 20   to return 1 if 
6db0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  the expression m
6dc0: 69 67 68 74 20 68 61 76 65 20 64 69 66 66 65 72  ight have differ
6dd0: 65 6e 74 0a 2a 2a 20 62 6f 6f 6c 65 61 6e 20 76  ent.** boolean v
6de0: 61 6c 75 65 73 20 69 6e 20 64 69 66 66 65 72 65  alues in differe
6df0: 6e 74 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  nt circumstances
6e00: 20 28 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69   (a false positi
6e10: 76 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ve.).**.** Note 
6e20: 74 68 61 74 20 69 66 20 74 68 65 20 65 78 70 72  that if the expr
6e30: 65 73 73 69 6f 6e 20 69 73 20 70 61 72 74 20 6f  ession is part o
6e40: 66 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 66 6f  f conditional fo
6e50: 72 20 61 0a 2a 2a 20 4c 45 46 54 20 4a 4f 49 4e  r a.** LEFT JOIN
6e60: 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 6e 6f 74  , then we cannot
6e70: 20 64 65 74 65 72 6d 69 6e 65 20 61 74 20 63 6f   determine at co
6e80: 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68  mpile-time wheth
6e90: 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 69 73 20  er or not.** is 
6ea0: 69 74 20 74 72 75 65 20 6f 72 20 66 61 6c 73 65  it true or false
6eb0: 2c 20 73 6f 20 61 6c 77 61 79 73 20 72 65 74 75  , so always retu
6ec0: 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rn 0..*/.static 
6ed0: 69 6e 74 20 65 78 70 72 41 6c 77 61 79 73 54 72  int exprAlwaysTr
6ee0: 75 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  ue(Expr *p){.  i
6ef0: 6e 74 20 76 20 3d 20 30 3b 0a 20 20 69 66 28 20  nt v = 0;.  if( 
6f00: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
6f10: 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  p, EP_FromJoin) 
6f20: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
6f30: 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73  ( !sqlite3ExprIs
6f40: 49 6e 74 65 67 65 72 28 70 2c 20 26 76 29 20 29  Integer(p, &v) )
6f50: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
6f60: 75 72 6e 20 76 21 3d 30 3b 0a 7d 0a 73 74 61 74  urn v!=0;.}.stat
6f70: 69 63 20 69 6e 74 20 65 78 70 72 41 6c 77 61 79  ic int exprAlway
6f80: 73 46 61 6c 73 65 28 45 78 70 72 20 2a 70 29 7b  sFalse(Expr *p){
6f90: 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20  .  int v = 0;.  
6fa0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
6fb0: 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rty(p, EP_FromJo
6fc0: 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  in) ) return 0;.
6fd0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
6fe0: 70 72 49 73 49 6e 74 65 67 65 72 28 70 2c 20 26  prIsInteger(p, &
6ff0: 76 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  v) ) return 0;. 
7000: 20 72 65 74 75 72 6e 20 76 3d 3d 30 3b 0a 7d 0a   return v==0;.}.
7010: 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f 20  ./*.** Join two 
7020: 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73 69 6e  expressions usin
7030: 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  g an AND operato
7040: 72 2e 20 20 49 66 20 65 69 74 68 65 72 20 65 78  r.  If either ex
7050: 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 4e  pression is.** N
7060: 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74 20 72  ULL, then just r
7070: 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65 72 20  eturn the other 
7080: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
7090: 2a 20 49 66 20 6f 6e 65 20 73 69 64 65 20 6f 72  * If one side or
70a0: 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
70b0: 65 20 41 4e 44 20 69 73 20 6b 6e 6f 77 6e 20 74  e AND is known t
70c0: 6f 20 62 65 20 66 61 6c 73 65 2c 20 74 68 65 6e  o be false, then
70d0: 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 72   instead.** of r
70e0: 65 74 75 72 6e 69 6e 67 20 61 6e 20 41 4e 44 20  eturning an AND 
70f0: 65 78 70 72 65 73 73 69 6f 6e 2c 20 6a 75 73 74  expression, just
7100: 20 72 65 74 75 72 6e 20 61 20 63 6f 6e 73 74 61   return a consta
7110: 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69  nt expression wi
7120: 74 68 0a 2a 2a 20 61 20 76 61 6c 75 65 20 6f 66  th.** a value of
7130: 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45 78 70 72 20   false..*/.Expr 
7140: 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28  *sqlite3ExprAnd(
7150: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
7160: 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20 2a  r *pLeft, Expr *
7170: 70 52 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70  pRight){.  if( p
7180: 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Left==0 ){.    r
7190: 65 74 75 72 6e 20 70 52 69 67 68 74 3b 0a 20 20  eturn pRight;.  
71a0: 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68 74  }else if( pRight
71b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
71c0: 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73 65  n pLeft;.  }else
71d0: 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 46   if( exprAlwaysF
71e0: 61 6c 73 65 28 70 4c 65 66 74 29 20 7c 7c 20 65  alse(pLeft) || e
71f0: 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70  xprAlwaysFalse(p
7200: 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71  Right) ){.    sq
7210: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
7220: 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20  db, pLeft);.    
7230: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
7240: 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20  e(db, pRight);. 
7250: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
7260: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
7270: 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c 69  K_INTEGER, &sqli
7280: 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 30 5d 2c  te3IntTokens[0],
7290: 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
72a0: 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73    Expr *pNew = s
72b0: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
72c0: 64 62 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c 20 30  db, TK_AND, 0, 0
72d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
72e0: 70 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73  prAttachSubtrees
72f0: 28 64 62 2c 20 70 4e 65 77 2c 20 70 4c 65 66 74  (db, pNew, pLeft
7300: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72  , pRight);.    r
7310: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 20 20 7d 0a  eturn pNew;.  }.
7320: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75  }../*.** Constru
7330: 63 74 20 61 20 6e 65 77 20 65 78 70 72 65 73 73  ct a new express
7340: 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20 66  ion node for a f
7350: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c  unction with mul
7360: 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e  tiple.** argumen
7370: 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  ts..*/.Expr *sql
7380: 69 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f 6e  ite3ExprFunction
7390: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
73a0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
73b0: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
73c0: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20  .  Expr *pNew;. 
73d0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
73e0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73  Parse->db;.  ass
73f0: 65 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b 0a 20  ert( pToken );. 
7400: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
7410: 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f  xprAlloc(db, TK_
7420: 46 55 4e 43 54 49 4f 4e 2c 20 70 54 6f 6b 65 6e  FUNCTION, pToken
7430: 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  , 1);.  if( pNew
7440: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
7450: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
7460: 28 64 62 2c 20 70 4c 69 73 74 29 3b 20 2f 2a 20  (db, pList); /* 
7470: 41 76 6f 69 64 20 6d 65 6d 6f 72 79 20 6c 65 61  Avoid memory lea
7480: 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61  k when malloc fa
7490: 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ils */.    retur
74a0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d  n 0;.  }.  pNew-
74b0: 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74  >x.pList = pList
74c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  ;.  assert( !Exp
74d0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65  rHasProperty(pNe
74e0: 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  w, EP_xIsSelect)
74f0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   );.  sqlite3Exp
7500: 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61  rSetHeightAndFla
7510: 67 73 28 70 50 61 72 73 65 2c 20 70 4e 65 77 29  gs(pParse, pNew)
7520: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
7530: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
7540: 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62   a variable numb
7550: 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73  er to an express
7560: 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64 65 73  ion that encodes
7570: 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69   a wildcard.** i
7580: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  n the original S
7590: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a  QL statement.  .
75a0: 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20  **.** Wildcards 
75b0: 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20  consisting of a 
75c0: 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65 20 61  single "?" are a
75d0: 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65 78 74  ssigned the next
75e0: 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 76   sequential.** v
75f0: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 2e 0a  ariable number..
7600: 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20  **.** Wildcards 
7610: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e  of the form "?nn
7620: 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  n" are assigned 
7630: 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e 6e 22  the number "nnn"
7640: 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20 73 75  .  We make.** su
7650: 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f 74 20  re "nnn" is not 
7660: 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f 69 64 20  too be to avoid 
7670: 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65 72 76  a denial of serv
7680: 69 63 65 20 61 74 74 61 63 6b 20 77 68 65 6e 0a  ice attack when.
7690: 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  ** the SQL state
76a0: 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20  ment comes from 
76b0: 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f 75 72  an external sour
76c0: 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61  ce..**.** Wildca
76d0: 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rds of the form 
76e0: 22 3a 61 61 61 22 2c 20 22 40 61 61 61 22 2c 20  ":aaa", "@aaa", 
76f0: 6f 72 20 22 24 61 61 61 22 20 61 72 65 20 61 73  or "$aaa" are as
7700: 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65 20  signed the same 
7710: 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68 65  number.** as the
7720: 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61 6e   previous instan
7730: 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 77  ce of the same w
7740: 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66 20  ildcard.  Or if 
7750: 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
7760: 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66  t.** instance of
7770: 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20 74   the wildcard, t
7780: 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69  he next sequenti
7790: 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  al variable numb
77a0: 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65  er is.** assigne
77b0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
77c0: 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e  e3ExprAssignVarN
77d0: 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50 61  umber(Parse *pPa
77e0: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
77f0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
7800: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
7810: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
7820: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
7830: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
7840: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
7850: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
7860: 6e 74 56 61 6c 75 65 7c 45 50 5f 52 65 64 75 63  ntValue|EP_Reduc
7870: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  ed|EP_TokenOnly)
7880: 20 29 3b 0a 20 20 7a 20 3d 20 70 45 78 70 72 2d   );.  z = pExpr-
7890: 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 61 73 73  >u.zToken;.  ass
78a0: 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 61  ert( z!=0 );.  a
78b0: 73 73 65 72 74 28 20 7a 5b 30 5d 21 3d 30 20 29  ssert( z[0]!=0 )
78c0: 3b 0a 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 30 20  ;.  if( z[1]==0 
78d0: 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61  ){.    /* Wildca
78e0: 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rd of the form "
78f0: 3f 22 2e 20 20 41 73 73 69 67 6e 20 74 68 65 20  ?".  Assign the 
7900: 6e 65 78 74 20 76 61 72 69 61 62 6c 65 20 6e 75  next variable nu
7910: 6d 62 65 72 20 2a 2f 0a 20 20 20 20 61 73 73 65  mber */.    asse
7920: 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 3b  rt( z[0]=='?' );
7930: 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c  .    pExpr->iCol
7940: 75 6d 6e 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b  umn = (ynVar)(++
7950: 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20  pParse->nVar);. 
7960: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 79 6e 56 61   }else{.    ynVa
7970: 72 20 78 20 3d 20 30 3b 0a 20 20 20 20 75 33 32  r x = 0;.    u32
7980: 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
7990: 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69 66 28  en30(z);.    if(
79a0: 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20   z[0]=='?' ){.  
79b0: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20      /* Wildcard 
79c0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e  of the form "?nn
79d0: 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e 6e  n".  Convert "nn
79e0: 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  n" to an integer
79f0: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75 73   and.      ** us
7a00: 65 20 69 74 20 61 73 20 74 68 65 20 76 61 72 69  e it as the vari
7a10: 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  able number */. 
7a20: 20 20 20 20 20 69 36 34 20 69 3b 0a 20 20 20 20       i64 i;.    
7a30: 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3d 3d 73    int bOk = 0==s
7a40: 71 6c 69 74 65 33 41 74 6f 69 36 34 28 26 7a 5b  qlite3Atoi64(&z[
7a50: 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20 53 51 4c  1], &i, n-1, SQL
7a60: 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20  ITE_UTF8);.     
7a70: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
7a80: 3d 20 78 20 3d 20 28 79 6e 56 61 72 29 69 3b 0a  = x = (ynVar)i;.
7a90: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
7aa0: 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  i==0 );.      te
7ab0: 73 74 63 61 73 65 28 20 69 3d 3d 31 20 29 3b 0a  stcase( i==1 );.
7ac0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
7ad0: 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  i==db->aLimit[SQ
7ae0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
7af0: 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20 29 3b  BLE_NUMBER]-1 );
7b00: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
7b10: 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53   i==db->aLimit[S
7b20: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
7b30: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 3b 0a  ABLE_NUMBER] );.
7b40: 20 20 20 20 20 20 69 66 28 20 62 4f 6b 3d 3d 30        if( bOk==0
7b50: 20 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e 64 62 2d   || i<1 || i>db-
7b60: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
7b70: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
7b80: 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 20 20 20  MBER] ){.       
7b90: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
7ba0: 28 70 50 61 72 73 65 2c 20 22 76 61 72 69 61 62  (pParse, "variab
7bb0: 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 62  le number must b
7bc0: 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e 64  e between ?1 and
7bd0: 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20   ?%d",.         
7be0: 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51     db->aLimit[SQ
7bf0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
7c00: 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a 20 20  BLE_NUMBER]);.  
7c10: 20 20 20 20 20 20 78 20 3d 20 30 3b 0a 20 20 20        x = 0;.   
7c20: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
7c30: 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b  >pParse->nVar ){
7c40: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
7c50: 3e 6e 56 61 72 20 3d 20 28 69 6e 74 29 69 3b 0a  >nVar = (int)i;.
7c60: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
7c70: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64  e{.      /* Wild
7c80: 63 61 72 64 73 20 6c 69 6b 65 20 22 3a 61 61 61  cards like ":aaa
7c90: 22 2c 20 22 24 61 61 61 22 20 6f 72 20 22 40 61  ", "$aaa" or "@a
7ca0: 61 61 22 2e 20 20 52 65 75 73 65 20 74 68 65 20  aa".  Reuse the 
7cb0: 73 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20  same variable.  
7cc0: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73      ** number as
7cd0: 20 74 68 65 20 70 72 69 6f 72 20 61 70 70 65 61   the prior appea
7ce0: 72 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d  rance of the sam
7cf0: 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68  e name, or if th
7d00: 65 20 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20  e name.      ** 
7d10: 68 61 73 20 6e 65 76 65 72 20 61 70 70 65 61 72  has never appear
7d20: 65 64 20 62 65 66 6f 72 65 2c 20 72 65 75 73 65  ed before, reuse
7d30: 20 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62   the same variab
7d40: 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20  le number.      
7d50: 2a 2f 0a 20 20 20 20 20 20 79 6e 56 61 72 20 69  */.      ynVar i
7d60: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
7d70: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72   i<pParse->nzVar
7d80: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
7d90: 69 66 28 20 70 50 61 72 73 65 2d 3e 61 7a 56 61  if( pParse->azVa
7da0: 72 5b 69 5d 20 26 26 20 73 74 72 63 6d 70 28 70  r[i] && strcmp(p
7db0: 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 69 5d 2c  Parse->azVar[i],
7dc0: 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  z)==0 ){.       
7dd0: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
7de0: 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72 29 69  n = x = (ynVar)i
7df0: 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  +1;.          br
7e00: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
7e10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
7e20: 20 78 3d 3d 30 20 29 20 78 20 3d 20 70 45 78 70   x==0 ) x = pExp
7e30: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e  r->iColumn = (yn
7e40: 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e  Var)(++pParse->n
7e50: 56 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Var);.    }.    
7e60: 69 66 28 20 78 3e 30 20 29 7b 0a 20 20 20 20 20  if( x>0 ){.     
7e70: 20 69 66 28 20 78 3e 70 50 61 72 73 65 2d 3e 6e   if( x>pParse->n
7e80: 7a 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20  zVar ){.        
7e90: 63 68 61 72 20 2a 2a 61 3b 0a 20 20 20 20 20 20  char **a;.      
7ea0: 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62 52    a = sqlite3DbR
7eb0: 65 61 6c 6c 6f 63 28 64 62 2c 20 70 50 61 72 73  ealloc(db, pPars
7ec0: 65 2d 3e 61 7a 56 61 72 2c 20 78 2a 73 69 7a 65  e->azVar, x*size
7ed0: 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20  of(a[0]));.     
7ee0: 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20     if( a==0 ){. 
7ef0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
7f00: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
7f10: 64 20 29 3b 20 2f 2a 20 45 72 72 6f 72 20 72 65  d ); /* Error re
7f20: 70 6f 72 74 65 64 20 74 68 72 6f 75 67 68 20 6d  ported through m
7f30: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 2a 2f 0a 20  allocFailed */. 
7f40: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b           return;
7f50: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7f60: 20 20 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72     pParse->azVar
7f70: 20 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 6d 65   = a;.        me
7f80: 6d 73 65 74 28 26 61 5b 70 50 61 72 73 65 2d 3e  mset(&a[pParse->
7f90: 6e 7a 56 61 72 5d 2c 20 30 2c 20 28 78 2d 70 50  nzVar], 0, (x-pP
7fa0: 61 72 73 65 2d 3e 6e 7a 56 61 72 29 2a 73 69 7a  arse->nzVar)*siz
7fb0: 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20 20  eof(a[0]));.    
7fc0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61      pParse->nzVa
7fd0: 72 20 3d 20 78 3b 0a 20 20 20 20 20 20 7d 0a 20  r = x;.      }. 
7fe0: 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27       if( z[0]!='
7ff0: 3f 27 20 7c 7c 20 70 50 61 72 73 65 2d 3e 61 7a  ?' || pParse->az
8000: 56 61 72 5b 78 2d 31 5d 3d 3d 30 20 29 7b 0a 20  Var[x-1]==0 ){. 
8010: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
8020: 46 72 65 65 28 64 62 2c 20 70 50 61 72 73 65 2d  Free(db, pParse-
8030: 3e 61 7a 56 61 72 5b 78 2d 31 5d 29 3b 0a 20 20  >azVar[x-1]);.  
8040: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 7a        pParse->az
8050: 56 61 72 5b 78 2d 31 5d 20 3d 20 73 71 6c 69 74  Var[x-1] = sqlit
8060: 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20  e3DbStrNDup(db, 
8070: 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  z, n);.      }. 
8080: 20 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66 28 20     }.  } .  if( 
8090: 21 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 26 26  !pParse->nErr &&
80a0: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 64 62   pParse->nVar>db
80b0: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
80c0: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
80d0: 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 73 71  UMBER] ){.    sq
80e0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
80f0: 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
8100: 53 51 4c 20 76 61 72 69 61 62 6c 65 73 22 29 3b  SQL variables");
8110: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
8120: 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65  cursively delete
8130: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
8140: 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  ree..*/.static S
8150: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76  QLITE_NOINLINE v
8160: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 44  oid sqlite3ExprD
8170: 65 6c 65 74 65 4e 4e 28 73 71 6c 69 74 65 33 20  eleteNN(sqlite3 
8180: 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20  *db, Expr *p){. 
8190: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
81a0: 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
81b0: 63 6b 3a 20 41 73 73 65 72 74 20 74 68 61 74 20  ck: Assert that 
81c0: 74 68 65 20 49 6e 74 56 61 6c 75 65 20 69 73 20  the IntValue is 
81d0: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 66 20  non-negative if 
81e0: 69 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 61  it exists */.  a
81f0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
8200: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e  roperty(p, EP_In
8210: 74 56 61 6c 75 65 29 20 7c 7c 20 70 2d 3e 75 2e  tValue) || p->u.
8220: 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 20 20 69  iValue>=0 );.  i
8230: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
8240: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
8250: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  nly) ){.    /* T
8260: 68 65 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20  he Expr.x union 
8270: 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 61 74  is never used at
8280: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61   the same time a
8290: 73 20 45 78 70 72 2e 70 52 69 67 68 74 20 2a 2f  s Expr.pRight */
82a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
82b0: 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 2d  x.pList==0 || p-
82c0: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
82d0: 20 20 69 66 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f    if( p->op!=TK_
82e0: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 20  SELECT_COLUMN ) 
82f0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
8300: 65 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b  e(db, p->pLeft);
8310: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
8320: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 52  Delete(db, p->pR
8330: 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28 20 45  ight);.    if( E
8340: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
8350: 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29  , EP_MemToken) )
8360: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
8370: 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  b, p->u.zToken);
8380: 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
8390: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
83a0: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
83b0: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
83c0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e  Delete(db, p->x.
83d0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65  pSelect);.    }e
83e0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
83f0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
8400: 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29  (db, p->x.pList)
8410: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
8420: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
8430: 74 79 28 70 2c 20 45 50 5f 53 74 61 74 69 63 29  ty(p, EP_Static)
8440: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
8450: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
8460: 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  }.}.void sqlite3
8470: 45 78 70 72 44 65 6c 65 74 65 28 73 71 6c 69 74  ExprDelete(sqlit
8480: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29  e3 *db, Expr *p)
8490: 7b 0a 20 20 69 66 28 20 70 20 29 20 73 71 6c 69  {.  if( p ) sqli
84a0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28  te3ExprDeleteNN(
84b0: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
84c0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
84d0: 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f  er of bytes allo
84e0: 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 65 78  cated for the ex
84f0: 70 72 65 73 73 69 6f 6e 20 73 74 72 75 63 74 75  pression structu
8500: 72 65 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73  re .** passed as
8510: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
8520: 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61 6c 77  ent. This is alw
8530: 61 79 73 20 6f 6e 65 20 6f 66 20 45 58 50 52 5f  ays one of EXPR_
8540: 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58 50  FULLSIZE,.** EXP
8550: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72  R_REDUCEDSIZE or
8560: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
8570: 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  IZE..*/.static i
8580: 6e 74 20 65 78 70 72 53 74 72 75 63 74 53 69 7a  nt exprStructSiz
8590: 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  e(Expr *p){.  if
85a0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
85b0: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
85c0: 79 29 20 29 20 72 65 74 75 72 6e 20 45 58 50 52  y) ) return EXPR
85d0: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a  _TOKENONLYSIZE;.
85e0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
85f0: 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75  perty(p, EP_Redu
8600: 63 65 64 29 20 29 20 72 65 74 75 72 6e 20 45 58  ced) ) return EX
8610: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 3b 0a  PR_REDUCEDSIZE;.
8620: 20 20 72 65 74 75 72 6e 20 45 58 50 52 5f 46 55    return EXPR_FU
8630: 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  LLSIZE;.}../*.**
8640: 20 54 68 65 20 64 75 70 65 64 45 78 70 72 2a 53   The dupedExpr*S
8650: 69 7a 65 28 29 20 72 6f 75 74 69 6e 65 73 20 65  ize() routines e
8660: 61 63 68 20 72 65 74 75 72 6e 20 74 68 65 20 6e  ach return the n
8670: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
8680: 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20 73 74  equired.** to st
8690: 6f 72 65 20 61 20 63 6f 70 79 20 6f 66 20 61 6e  ore a copy of an
86a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 20 65   expression or e
86b0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
86c0: 20 54 68 65 79 20 64 69 66 66 65 72 20 69 6e 0a   They differ in.
86d0: 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66 20 74  ** how much of t
86e0: 68 65 20 74 72 65 65 20 69 73 20 6d 65 61 73 75  he tree is measu
86f0: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64  red..**.**     d
8700: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
8710: 7a 65 28 29 20 20 20 20 20 53 69 7a 65 20 6f 66  ze()     Size of
8720: 20 6f 6e 6c 79 20 74 68 65 20 45 78 70 72 20 73   only the Expr s
8730: 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 20 20 20  tructure .**    
8740: 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69   dupedExprNodeSi
8750: 7a 65 28 29 20 20 20 20 20 20 20 53 69 7a 65 20  ze()       Size 
8760: 6f 66 20 45 78 70 72 20 2b 20 73 70 61 63 65 20  of Expr + space 
8770: 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20  for token.**    
8780: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 29   dupedExprSize()
8790: 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
87a0: 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74 72 65  + token + subtre
87b0: 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 0a  e components.**.
87c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
87d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
87e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
87f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
8810: 2a 20 54 68 65 20 64 75 70 65 64 45 78 70 72 53  * The dupedExprS
8820: 74 72 75 63 74 53 69 7a 65 28 29 20 66 75 6e 63  tructSize() func
8830: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 77 6f  tion returns two
8840: 20 76 61 6c 75 65 73 20 4f 52 2d 65 64 20 74 6f   values OR-ed to
8850: 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28 31 29  gether:  .** (1)
8860: 20 74 68 65 20 73 70 61 63 65 20 72 65 71 75 69   the space requi
8870: 72 65 64 20 66 6f 72 20 61 20 63 6f 70 79 20 6f  red for a copy o
8880: 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63  f the Expr struc
8890: 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20 0a 2a  ture only and .*
88a0: 2a 20 28 32 29 20 74 68 65 20 45 50 5f 78 78 78  * (2) the EP_xxx
88b0: 20 66 6c 61 67 73 20 74 68 61 74 20 69 6e 64 69   flags that indi
88c0: 63 61 74 65 20 77 68 61 74 20 74 68 65 20 73 74  cate what the st
88d0: 72 75 63 74 75 72 65 20 73 69 7a 65 20 73 68 6f  ructure size sho
88e0: 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65 20 72  uld be..** The r
88f0: 65 74 75 72 6e 20 76 61 6c 75 65 73 20 69 73 20  eturn values is 
8900: 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a  always one of:.*
8910: 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 46  *.**      EXPR_F
8920: 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20 20 20  ULLSIZE.**      
8930: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
8940: 20 20 20 7c 20 45 50 5f 52 65 64 75 63 65 64 0a     | EP_Reduced.
8950: 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 54 4f 4b  **      EXPR_TOK
8960: 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f  ENONLYSIZE | EP_
8970: 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20  TokenOnly.**.** 
8980: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
8990: 73 74 72 75 63 74 75 72 65 20 63 61 6e 20 62 65  structure can be
89a0: 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e   found by maskin
89b0: 67 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  g the return val
89c0: 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f  ue.** of this ro
89d0: 75 74 69 6e 65 20 77 69 74 68 20 30 78 66 66 66  utine with 0xfff
89e0: 2e 20 20 54 68 65 20 66 6c 61 67 73 20 63 61 6e  .  The flags can
89f0: 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73   be found by mas
8a00: 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65 74 75  king the.** retu
8a10: 72 6e 20 76 61 6c 75 65 20 77 69 74 68 20 45 50  rn value with EP
8a20: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
8a30: 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  nOnly..**.** Not
8a40: 65 20 74 68 61 74 20 77 69 74 68 20 66 6c 61 67  e that with flag
8a50: 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43  s==EXPRDUP_REDUC
8a60: 45 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 73  E, this routines
8a70: 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c 2d 73   works on full-s
8a80: 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75 63 65  ize.** (unreduce
8a90: 64 29 20 45 78 70 72 20 6f 62 6a 65 63 74 73 20  d) Expr objects 
8aa0: 61 73 20 74 68 65 79 20 6f 72 20 6f 72 69 67 69  as they or origi
8ab0: 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63 74 65  nally constructe
8ac0: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e  d by the parser.
8ad0: 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78 70 72 65  .** During expre
8ae0: 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 2c 20  ssion analysis, 
8af0: 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f  extra informatio
8b00: 6e 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e  n is computed an
8b10: 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a 2a 20  d moved into.** 
8b20: 6c 61 74 65 72 20 70 61 72 74 73 20 6f 66 20 74  later parts of t
8b30: 65 68 20 45 78 70 72 20 6f 62 6a 65 63 74 20 61  eh Expr object a
8b40: 6e 64 20 74 68 61 74 20 65 78 74 72 61 20 69 6e  nd that extra in
8b50: 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68 74 20  formation might 
8b60: 67 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a 20 6f  get chopped.** o
8b70: 66 66 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ff if the expres
8b80: 73 69 6f 6e 20 69 73 20 72 65 64 75 63 65 64 2e  sion is reduced.
8b90: 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74    Note also that
8ba0: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72   it does not wor
8bb0: 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61 6e 20  k to.** make an 
8bc0: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 63  EXPRDUP_REDUCE c
8bd0: 6f 70 79 20 6f 66 20 61 20 72 65 64 75 63 65 64  opy of a reduced
8be0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 74   expression.  It
8bf0: 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c 0a 2a   is only legal.*
8c00: 2a 20 74 6f 20 72 65 64 75 63 65 20 61 20 70 72  * to reduce a pr
8c10: 69 73 74 69 6e 65 20 65 78 70 72 65 73 73 69 6f  istine expressio
8c20: 6e 20 74 72 65 65 20 66 72 6f 6d 20 74 68 65 20  n tree from the 
8c30: 70 61 72 73 65 72 2e 20 20 54 68 65 20 69 6d 70  parser.  The imp
8c40: 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 6f  lementation.** o
8c50: 66 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63  f dupedExprStruc
8c60: 74 53 69 7a 65 28 29 20 63 6f 6e 74 61 69 6e 20  tSize() contain 
8c70: 6d 75 6c 74 69 70 6c 65 20 61 73 73 65 72 74 28  multiple assert(
8c80: 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  ) statements tha
8c90: 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20  t attempt.** to 
8ca0: 65 6e 66 6f 72 63 65 20 74 68 69 73 20 63 6f 6e  enforce this con
8cb0: 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74  straint..*/.stat
8cc0: 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72  ic int dupedExpr
8cd0: 53 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20  StructSize(Expr 
8ce0: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
8cf0: 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20 20 61    int nSize;.  a
8d00: 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 45 58  ssert( flags==EX
8d10: 50 52 44 55 50 5f 52 45 44 55 43 45 20 7c 7c 20  PRDUP_REDUCE || 
8d20: 66 6c 61 67 73 3d 3d 30 20 29 3b 20 2f 2a 20 4f  flags==0 ); /* O
8d30: 6e 6c 79 20 6f 6e 65 20 66 6c 61 67 20 76 61 6c  nly one flag val
8d40: 75 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20  ue allowed */.  
8d50: 61 73 73 65 72 74 28 20 45 58 50 52 5f 46 55 4c  assert( EXPR_FUL
8d60: 4c 53 49 5a 45 3c 3d 30 78 66 66 66 20 29 3b 0a  LSIZE<=0xfff );.
8d70: 20 20 61 73 73 65 72 74 28 20 28 30 78 66 66 66    assert( (0xfff
8d80: 20 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45   & (EP_Reduced|E
8d90: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d 3d 30  P_TokenOnly))==0
8da0: 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d 66 6c 61   );.  if( 0==fla
8db0: 67 73 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20  gs ){.    nSize 
8dc0: 3d 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b  = EXPR_FULLSIZE;
8dd0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
8de0: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
8df0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
8e00: 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
8e10: 64 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  d) );.    assert
8e20: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
8e30: 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  ty(p, EP_FromJoi
8e40: 6e 29 20 29 3b 20 0a 20 20 20 20 61 73 73 65 72  n) ); .    asser
8e50: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
8e60: 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b  rty(p, EP_MemTok
8e70: 65 6e 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  en) );.    asser
8e80: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
8e90: 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75  rty(p, EP_NoRedu
8ea0: 63 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ce) );.    if( p
8eb0: 2d 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e 78 2e  ->pLeft || p->x.
8ec0: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e  pList ){.      n
8ed0: 53 69 7a 65 20 3d 20 45 58 50 52 5f 52 45 44 55  Size = EXPR_REDU
8ee0: 43 45 44 53 49 5a 45 20 7c 20 45 50 5f 52 65 64  CEDSIZE | EP_Red
8ef0: 75 63 65 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  uced;.    }else{
8f00: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
8f10: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
8f20: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50       nSize = EXP
8f30: 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20  R_TOKENONLYSIZE 
8f40: 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a  | EP_TokenOnly;.
8f50: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
8f60: 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a  rn nSize;.}../*.
8f70: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
8f80: 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 70 61   returns the spa
8f90: 63 65 20 69 6e 20 62 79 74 65 73 20 72 65 71 75  ce in bytes requ
8fa0: 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  ired to store th
8fb0: 65 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20 74 68  e copy .** of th
8fc0: 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  e Expr structure
8fd0: 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 74   and a copy of t
8fe0: 68 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e  he Expr.u.zToken
8ff0: 20 73 74 72 69 6e 67 20 28 69 66 20 74 68 61 74   string (if that
9000: 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 64 65  .** string is de
9010: 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61 74 69  fined.).*/.stati
9020: 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 4e  c int dupedExprN
9030: 6f 64 65 53 69 7a 65 28 45 78 70 72 20 2a 70 2c  odeSize(Expr *p,
9040: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69   int flags){.  i
9050: 6e 74 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64  nt nByte = duped
9060: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70  ExprStructSize(p
9070: 2c 20 66 6c 61 67 73 29 20 26 20 30 78 66 66 66  , flags) & 0xfff
9080: 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  ;.  if( !ExprHas
9090: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49  Property(p, EP_I
90a0: 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75  ntValue) && p->u
90b0: 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 6e  .zToken ){.    n
90c0: 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53  Byte += sqlite3S
90d0: 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f  trlen30(p->u.zTo
90e0: 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20 72 65  ken)+1;.  }.  re
90f0: 74 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42 79 74  turn ROUND8(nByt
9100: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  e);.}../*.** Ret
9110: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
9120: 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64  f bytes required
9130: 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 75 70   to create a dup
9140: 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20 0a 2a  licate of the .*
9150: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73  * expression pas
9160: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
9170: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 73   argument. The s
9180: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
9190: 73 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74  s a.** mask cont
91a0: 61 69 6e 69 6e 67 20 45 58 50 52 44 55 50 5f 58  aining EXPRDUP_X
91b0: 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20  XX flags..**.** 
91c0: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
91d0: 65 64 20 69 6e 63 6c 75 64 65 73 20 73 70 61 63  ed includes spac
91e0: 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 63 6f  e to create a co
91f0: 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73  py of the Expr s
9200: 74 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c 66 20  truct.** itself 
9210: 61 6e 64 20 74 68 65 20 62 75 66 66 65 72 20 72  and the buffer r
9220: 65 66 65 72 72 65 64 20 74 6f 20 62 79 20 45 78  eferred to by Ex
9230: 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20  pr.u.zToken, if 
9240: 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  any..**.** If th
9250: 65 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  e EXPRDUP_REDUCE
9260: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
9270: 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  en the return va
9280: 6c 75 65 20 69 6e 63 6c 75 64 65 73 20 0a 2a 2a  lue includes .**
9290: 20 73 70 61 63 65 20 74 6f 20 64 75 70 6c 69 63   space to duplic
92a0: 61 74 65 20 61 6c 6c 20 45 78 70 72 20 6e 6f 64  ate all Expr nod
92b0: 65 73 20 69 6e 20 74 68 65 20 74 72 65 65 20 66  es in the tree f
92c0: 6f 72 6d 65 64 20 62 79 20 45 78 70 72 2e 70 4c  ormed by Expr.pL
92d0: 65 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78 70 72  eft .** and Expr
92e0: 2e 70 52 69 67 68 74 20 76 61 72 69 61 62 6c 65  .pRight variable
92f0: 73 20 28 62 75 74 20 6e 6f 74 20 66 6f 72 20 61  s (but not for a
9300: 6e 79 20 73 74 72 75 63 74 75 72 65 73 20 70 6f  ny structures po
9310: 69 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a 2a 20  inted to or .** 
9320: 64 65 73 63 65 6e 64 65 64 20 66 72 6f 6d 20 74  descended from t
9330: 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20  he Expr.x.pList 
9340: 6f 72 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63  or Expr.x.pSelec
9350: 74 20 76 61 72 69 61 62 6c 65 73 29 2e 0a 2a 2f  t variables)..*/
9360: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65  .static int dupe
9370: 64 45 78 70 72 53 69 7a 65 28 45 78 70 72 20 2a  dExprSize(Expr *
9380: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
9390: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a   int nByte = 0;.
93a0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 6e    if( p ){.    n
93b0: 42 79 74 65 20 3d 20 64 75 70 65 64 45 78 70 72  Byte = dupedExpr
93c0: 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c 61 67  NodeSize(p, flag
93d0: 73 29 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67  s);.    if( flag
93e0: 73 26 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  s&EXPRDUP_REDUCE
93f0: 20 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20   ){.      nByte 
9400: 2b 3d 20 64 75 70 65 64 45 78 70 72 53 69 7a 65  += dupedExprSize
9410: 28 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61 67 73  (p->pLeft, flags
9420: 29 20 2b 20 64 75 70 65 64 45 78 70 72 53 69 7a  ) + dupedExprSiz
9430: 65 28 70 2d 3e 70 52 69 67 68 74 2c 20 66 6c 61  e(p->pRight, fla
9440: 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  gs);.    }.  }. 
9450: 20 72 65 74 75 72 6e 20 6e 42 79 74 65 3b 0a 7d   return nByte;.}
9460: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
9470: 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72  ction is similar
9480: 20 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 44   to sqlite3ExprD
9490: 75 70 28 29 2c 20 65 78 63 65 70 74 20 74 68 61  up(), except tha
94a0: 74 20 69 66 20 70 7a 42 75 66 66 65 72 20 0a 2a  t if pzBuffer .*
94b0: 2a 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68  * is not NULL th
94c0: 65 6e 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20  en *pzBuffer is 
94d0: 61 73 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74  assumed to point
94e0: 20 74 6f 20 61 20 62 75 66 66 65 72 20 6c 61 72   to a buffer lar
94f0: 67 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f  ge enough .** to
9500: 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20   store the copy 
9510: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 2c  of expression p,
9520: 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20 70   the copies of p
9530: 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69  ->u.zToken.** (i
9540: 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 20 61  f applicable), a
9550: 6e 64 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66  nd the copies of
9560: 20 74 68 65 20 70 2d 3e 70 4c 65 66 74 20 61 6e   the p->pLeft an
9570: 64 20 70 2d 3e 70 52 69 67 68 74 20 65 78 70 72  d p->pRight expr
9580: 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61  essions,.** if a
9590: 6e 79 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72  ny. Before retur
95a0: 6e 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65 72 20  ning, *pzBuffer 
95b0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 66 69  is set to the fi
95c0: 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
95d0: 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20 6f 66 20  e.** portion of 
95e0: 74 68 65 20 62 75 66 66 65 72 20 63 6f 70 69 65  the buffer copie
95f0: 64 20 69 6e 74 6f 20 62 79 20 74 68 69 73 20 66  d into by this f
9600: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
9610: 69 63 20 45 78 70 72 20 2a 65 78 70 72 44 75 70  ic Expr *exprDup
9620: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
9630: 70 72 20 2a 70 2c 20 69 6e 74 20 64 75 70 46 6c  pr *p, int dupFl
9640: 61 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66  ags, u8 **pzBuff
9650: 65 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  er){.  Expr *pNe
9660: 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  w;           /* 
9670: 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
9680: 2a 2f 0a 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b  */.  u8 *zAlloc;
9690: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
96a0: 6d 6f 72 79 20 73 70 61 63 65 20 66 72 6f 6d 20  mory space from 
96b0: 77 68 69 63 68 20 74 6f 20 62 75 69 6c 64 20 45  which to build E
96c0: 78 70 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  xpr object */.  
96d0: 75 33 32 20 73 74 61 74 69 63 46 6c 61 67 3b 20  u32 staticFlag; 
96e0: 20 20 20 20 20 20 2f 2a 20 45 50 5f 53 74 61 74        /* EP_Stat
96f0: 69 63 20 69 66 20 73 70 61 63 65 20 6e 6f 74 20  ic if space not 
9700: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
9710: 6c 6c 6f 63 20 2a 2f 0a 0a 20 20 61 73 73 65 72  lloc */..  asser
9720: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t( db!=0 );.  as
9730: 73 65 72 74 28 20 70 20 29 3b 0a 20 20 61 73 73  sert( p );.  ass
9740: 65 72 74 28 20 64 75 70 46 6c 61 67 73 3d 3d 30  ert( dupFlags==0
9750: 20 7c 7c 20 64 75 70 46 6c 61 67 73 3d 3d 45 58   || dupFlags==EX
9760: 50 52 44 55 50 5f 52 45 44 55 43 45 20 29 3b 0a  PRDUP_REDUCE );.
9770: 20 20 61 73 73 65 72 74 28 20 70 7a 42 75 66 66    assert( pzBuff
9780: 65 72 3d 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67  er==0 || dupFlag
9790: 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43  s==EXPRDUP_REDUC
97a0: 45 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  E );..  /* Figur
97b0: 65 20 6f 75 74 20 77 68 65 72 65 20 74 6f 20 77  e out where to w
97c0: 72 69 74 65 20 74 68 65 20 6e 65 77 20 45 78 70  rite the new Exp
97d0: 72 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a  r structure. */.
97e0: 20 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29    if( pzBuffer )
97f0: 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a  {.    zAlloc = *
9800: 70 7a 42 75 66 66 65 72 3b 0a 20 20 20 20 73 74  pzBuffer;.    st
9810: 61 74 69 63 46 6c 61 67 20 3d 20 45 50 5f 53 74  aticFlag = EP_St
9820: 61 74 69 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  atic;.  }else{. 
9830: 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c 69     zAlloc = sqli
9840: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
9850: 28 64 62 2c 20 64 75 70 65 64 45 78 70 72 53 69  (db, dupedExprSi
9860: 7a 65 28 70 2c 20 64 75 70 46 6c 61 67 73 29 29  ze(p, dupFlags))
9870: 3b 0a 20 20 20 20 73 74 61 74 69 63 46 6c 61 67  ;.    staticFlag
9880: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77   = 0;.  }.  pNew
9890: 20 3d 20 28 45 78 70 72 20 2a 29 7a 41 6c 6c 6f   = (Expr *)zAllo
98a0: 63 3b 0a 0a 20 20 69 66 28 20 70 4e 65 77 20 29  c;..  if( pNew )
98b0: 7b 0a 20 20 20 20 2f 2a 20 53 65 74 20 6e 4e 65  {.    /* Set nNe
98c0: 77 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a  wSize to the siz
98d0: 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  e allocated for 
98e0: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70 6f  the structure po
98f0: 69 6e 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  inted to.    ** 
9900: 62 79 20 70 4e 65 77 2e 20 54 68 69 73 20 69 73  by pNew. This is
9910: 20 65 69 74 68 65 72 20 45 58 50 52 5f 46 55 4c   either EXPR_FUL
9920: 4c 53 49 5a 45 2c 20 45 58 50 52 5f 52 45 44 55  LSIZE, EXPR_REDU
9930: 43 45 44 53 49 5a 45 20 6f 72 0a 20 20 20 20 2a  CEDSIZE or.    *
9940: 2a 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59  * EXPR_TOKENONLY
9950: 53 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20 69 73 20  SIZE. nToken is 
9960: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
9970: 72 20 6f 66 20 62 79 74 65 73 20 63 6f 6e 73 75  r of bytes consu
9980: 6d 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  med.    ** by th
9990: 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 2d  e copy of the p-
99a0: 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67  >u.zToken string
99b0: 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a   (if any)..    *
99c0: 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  /.    const unsi
99d0: 67 6e 65 64 20 6e 53 74 72 75 63 74 53 69 7a 65  gned nStructSize
99e0: 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75   = dupedExprStru
99f0: 63 74 53 69 7a 65 28 70 2c 20 64 75 70 46 6c 61  ctSize(p, dupFla
9a00: 67 73 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69  gs);.    const i
9a10: 6e 74 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53  nt nNewSize = nS
9a20: 74 72 75 63 74 53 69 7a 65 20 26 20 30 78 66 66  tructSize & 0xff
9a30: 66 3b 0a 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65  f;.    int nToke
9a40: 6e 3b 0a 20 20 20 20 69 66 28 20 21 45 78 70 72  n;.    if( !Expr
9a50: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
9a60: 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70  P_IntValue) && p
9a70: 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20  ->u.zToken ){.  
9a80: 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c      nToken = sql
9a90: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e  ite3Strlen30(p->
9aa0: 75 2e 7a 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20  u.zToken) + 1;. 
9ab0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9ac0: 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 20 20  nToken = 0;.    
9ad0: 7d 0a 20 20 20 20 69 66 28 20 64 75 70 46 6c 61  }.    if( dupFla
9ae0: 67 73 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  gs ){.      asse
9af0: 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  rt( ExprHasPrope
9b00: 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65  rty(p, EP_Reduce
9b10: 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6d  d)==0 );.      m
9b20: 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c  emcpy(zAlloc, p,
9b30: 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20   nNewSize);.    
9b40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 33 32  }else{.      u32
9b50: 20 6e 53 69 7a 65 20 3d 20 28 75 33 32 29 65 78   nSize = (u32)ex
9b60: 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 29 3b  prStructSize(p);
9b70: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41  .      memcpy(zA
9b80: 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a 65 29 3b  lloc, p, nSize);
9b90: 0a 20 20 20 20 20 20 69 66 28 20 6e 53 69 7a 65  .      if( nSize
9ba0: 3c 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 20 29  <EXPR_FULLSIZE )
9bb0: 7b 20 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  { .        memse
9bc0: 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d  t(&zAlloc[nSize]
9bd0: 2c 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c 53 49  , 0, EXPR_FULLSI
9be0: 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20  ZE-nSize);.     
9bf0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
9c00: 20 53 65 74 20 74 68 65 20 45 50 5f 52 65 64 75   Set the EP_Redu
9c10: 63 65 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  ced, EP_TokenOnl
9c20: 79 2c 20 61 6e 64 20 45 50 5f 53 74 61 74 69 63  y, and EP_Static
9c30: 20 66 6c 61 67 73 20 61 70 70 72 6f 70 72 69 61   flags appropria
9c40: 74 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 70 4e 65  tely. */.    pNe
9c50: 77 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45 50  w->flags &= ~(EP
9c60: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
9c70: 6e 4f 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63 7c  nOnly|EP_Static|
9c80: 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20  EP_MemToken);.  
9c90: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
9ca0: 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20 28   nStructSize & (
9cb0: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
9cc0: 6b 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20 70 4e  kenOnly);.    pN
9cd0: 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 73 74 61  ew->flags |= sta
9ce0: 74 69 63 46 6c 61 67 3b 0a 0a 20 20 20 20 2f 2a  ticFlag;..    /*
9cf0: 20 43 6f 70 79 20 74 68 65 20 70 2d 3e 75 2e 7a   Copy the p->u.z
9d00: 54 6f 6b 65 6e 20 73 74 72 69 6e 67 2c 20 69 66  Token string, if
9d10: 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28   any. */.    if(
9d20: 20 6e 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20   nToken ){.     
9d30: 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20   char *zToken = 
9d40: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d  pNew->u.zToken =
9d50: 20 28 63 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b   (char*)&zAlloc[
9d60: 6e 4e 65 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20  nNewSize];.     
9d70: 20 6d 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20   memcpy(zToken, 
9d80: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f  p->u.zToken, nTo
9d90: 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ken);.    }..   
9da0: 20 69 66 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61   if( 0==((p->fla
9db0: 67 73 7c 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20  gs|pNew->flags) 
9dc0: 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  & EP_TokenOnly) 
9dd0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c  ){.      /* Fill
9de0: 20 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e 78 2e   in the pNew->x.
9df0: 70 53 65 6c 65 63 74 20 6f 72 20 70 4e 65 77 2d  pSelect or pNew-
9e00: 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65 72 2e  >x.pList member.
9e10: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 45 78   */.      if( Ex
9e20: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
9e30: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
9e40: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
9e50: 78 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  x.pSelect = sqli
9e60: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
9e70: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 64   p->x.pSelect, d
9e80: 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  upFlags);.      
9e90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
9ea0: 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73  New->x.pList = s
9eb0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
9ec0: 70 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74  p(db, p->x.pList
9ed0: 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20  , dupFlags);.   
9ee0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
9ef0: 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65 77 2d  /* Fill in pNew-
9f00: 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e 65 77 2d  >pLeft and pNew-
9f10: 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  >pRight. */.    
9f20: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
9f30: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64  rty(pNew, EP_Red
9f40: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
9f50: 79 29 20 29 7b 0a 20 20 20 20 20 20 7a 41 6c 6c  y) ){.      zAll
9f60: 6f 63 20 2b 3d 20 64 75 70 65 64 45 78 70 72 4e  oc += dupedExprN
9f70: 6f 64 65 53 69 7a 65 28 70 2c 20 64 75 70 46 6c  odeSize(p, dupFl
9f80: 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ags);.      if( 
9f90: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9fa0: 70 4e 65 77 2c 20 45 50 5f 52 65 64 75 63 65 64  pNew, EP_Reduced
9fb0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) ){.        pNe
9fc0: 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d 3e 70 4c  w->pLeft = p->pL
9fd0: 65 66 74 20 3f 0a 20 20 20 20 20 20 20 20 20 20  eft ?.          
9fe0: 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70 72              expr
9ff0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74  Dup(db, p->pLeft
a000: 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  , EXPRDUP_REDUCE
a010: 2c 20 26 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a  , &zAlloc) : 0;.
a020: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52          pNew->pR
a030: 69 67 68 74 20 3d 20 70 2d 3e 70 52 69 67 68 74  ight = p->pRight
a040: 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
a050: 20 20 20 20 20 20 20 20 20 20 65 78 70 72 44 75            exprDu
a060: 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c  p(db, p->pRight,
a070: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c   EXPRDUP_REDUCE,
a080: 20 26 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20   &zAlloc) : 0;. 
a090: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
a0a0: 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20   pzBuffer ){.   
a0b0: 20 20 20 20 20 2a 70 7a 42 75 66 66 65 72 20 3d       *pzBuffer =
a0c0: 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 7d   zAlloc;.      }
a0d0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a0e0: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
a0f0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
a100: 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  enOnly) ){.     
a110: 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d     pNew->pLeft =
a120: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
a130: 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29  db, p->pLeft, 0)
a140: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
a150: 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  pRight = sqlite3
a160: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
a170: 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20  Right, 0);.     
a180: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
a190: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
a1a0: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e 64 20  *.** Create and 
a1b0: 72 65 74 75 72 6e 20 61 20 64 65 65 70 20 63 6f  return a deep co
a1c0: 70 79 20 6f 66 20 74 68 65 20 6f 62 6a 65 63 74  py of the object
a1d0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
a1e0: 65 63 6f 6e 64 20 0a 2a 2a 20 61 72 67 75 6d 65  econd .** argume
a1f0: 6e 74 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 63 6f  nt. If an OOM co
a200: 6e 64 69 74 69 6f 6e 20 69 73 20 65 6e 63 6f 75  ndition is encou
a210: 6e 74 65 72 65 64 2c 20 4e 55 4c 4c 20 69 73 20  ntered, NULL is 
a220: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20  returned.** and 
a230: 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  the db->mallocFa
a240: 69 6c 65 64 20 66 6c 61 67 20 73 65 74 2e 0a 2a  iled flag set..*
a250: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
a260: 5f 4f 4d 49 54 5f 43 54 45 0a 73 74 61 74 69 63  _OMIT_CTE.static
a270: 20 57 69 74 68 20 2a 77 69 74 68 44 75 70 28 73   With *withDup(s
a280: 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 74 68  qlite3 *db, With
a290: 20 2a 70 29 7b 0a 20 20 57 69 74 68 20 2a 70 52   *p){.  With *pR
a2a0: 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20  et = 0;.  if( p 
a2b0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  ){.    int nByte
a2c0: 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20   = sizeof(*p) + 
a2d0: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
a2e0: 2a 20 28 70 2d 3e 6e 43 74 65 2d 31 29 3b 0a 20  * (p->nCte-1);. 
a2f0: 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65     pRet = sqlite
a300: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
a310: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66  , nByte);.    if
a320: 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20  ( pRet ){.      
a330: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 70 52 65  int i;.      pRe
a340: 74 2d 3e 6e 43 74 65 20 3d 20 70 2d 3e 6e 43 74  t->nCte = p->nCt
a350: 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  e;.      for(i=0
a360: 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b  ; i<p->nCte; i++
a370: 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d  ){.        pRet-
a380: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20  >a[i].pSelect = 
a390: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
a3a0: 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 53 65  (db, p->a[i].pSe
a3b0: 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  lect, 0);.      
a3c0: 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 43 6f    pRet->a[i].pCo
a3d0: 6c 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ls = sqlite3Expr
a3e0: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 61  ListDup(db, p->a
a3f0: 5b 69 5d 2e 70 43 6f 6c 73 2c 20 30 29 3b 0a 20  [i].pCols, 0);. 
a400: 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69         pRet->a[i
a410: 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ].zName = sqlite
a420: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 2d  3DbStrDup(db, p-
a430: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
a440: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
a450: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
a460: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
a470: 77 69 74 68 44 75 70 28 78 2c 79 29 20 30 0a 23  withDup(x,y) 0.#
a480: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
a490: 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70   following group
a4a0: 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b   of routines mak
a4b0: 65 20 64 65 65 70 20 63 6f 70 69 65 73 20 6f 66  e deep copies of
a4c0: 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a   expressions,.**
a4d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
a4e0: 73 2c 20 49 44 20 6c 69 73 74 73 2c 20 61 6e 64  s, ID lists, and
a4f0: 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
a500: 74 73 2e 20 20 54 68 65 20 63 6f 70 69 65 73 20  ts.  The copies 
a510: 63 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65  can.** be delete
a520: 64 20 28 62 79 20 62 65 69 6e 67 20 70 61 73 73  d (by being pass
a530: 65 64 20 74 6f 20 74 68 65 69 72 20 72 65 73 70  ed to their resp
a540: 65 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65  ective ...Delete
a550: 28 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20  () routines).** 
a560: 77 69 74 68 6f 75 74 20 65 66 66 65 63 74 69 6e  without effectin
a570: 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e  g the originals.
a580: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65  .**.** The expre
a590: 73 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20  ssion list, ID, 
a5a0: 61 6e 64 20 73 6f 75 72 63 65 20 6c 69 73 74 73  and source lists
a5b0: 20 72 65 74 75 72 6e 20 62 79 20 73 71 6c 69 74   return by sqlit
a5c0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2c  e3ExprListDup(),
a5d0: 0a 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c 69 73  .** sqlite3IdLis
a5e0: 74 44 75 70 28 29 2c 20 61 6e 64 20 73 71 6c 69  tDup(), and sqli
a5f0: 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 29 20  te3SrcListDup() 
a600: 63 61 6e 20 6e 6f 74 20 62 65 20 66 75 72 74 68  can not be furth
a610: 65 72 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20  er expanded .** 
a620: 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  by subsequent ca
a630: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69  lls to sqlite*Li
a640: 73 74 41 70 70 65 6e 64 28 29 20 72 6f 75 74 69  stAppend() routi
a650: 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74  nes..**.** Any t
a660: 61 62 6c 65 73 20 74 68 61 74 20 74 68 65 20 53  ables that the S
a670: 72 63 4c 69 73 74 20 6d 69 67 68 74 20 70 6f 69  rcList might poi
a680: 6e 74 20 74 6f 20 61 72 65 20 6e 6f 74 20 64 75  nt to are not du
a690: 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  plicated..**.** 
a6a0: 54 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65  The flags parame
a6b0: 74 65 72 20 63 6f 6e 74 61 69 6e 73 20 61 20 63  ter contains a c
a6c0: 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68  ombination of th
a6d0: 65 20 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c  e EXPRDUP_XXX fl
a6e0: 61 67 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 45  ags..** If the E
a6f0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 66 6c  XPRDUP_REDUCE fl
a700: 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
a710: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65  the structure re
a720: 74 75 72 6e 65 64 20 69 73 20 61 0a 2a 2a 20 74  turned is a.** t
a730: 72 75 6e 63 61 74 65 64 20 76 65 72 73 69 6f 6e  runcated version
a740: 20 6f 66 20 74 68 65 20 75 73 75 61 6c 20 45 78   of the usual Ex
a750: 70 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61  pr structure tha
a760: 74 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64  t will be stored
a770: 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74   as.** part of t
a780: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
a790: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
a7a0: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
a7b0: 6d 61 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  ma..*/.Expr *sql
a7c0: 69 74 65 33 45 78 70 72 44 75 70 28 73 71 6c 69  ite3ExprDup(sqli
a7d0: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
a7e0: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
a7f0: 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30  assert( flags==0
a800: 20 7c 7c 20 66 6c 61 67 73 3d 3d 45 58 50 52 44   || flags==EXPRD
a810: 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 20 20 72  UP_REDUCE );.  r
a820: 65 74 75 72 6e 20 70 20 3f 20 65 78 70 72 44 75  eturn p ? exprDu
a830: 70 28 64 62 2c 20 70 2c 20 66 6c 61 67 73 2c 20  p(db, p, flags, 
a840: 30 29 20 3a 20 30 3b 0a 7d 0a 45 78 70 72 4c 69  0) : 0;.}.ExprLi
a850: 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c  st *sqlite3ExprL
a860: 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  istDup(sqlite3 *
a870: 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 2c  db, ExprList *p,
a880: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 45   int flags){.  E
a890: 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  xprList *pNew;. 
a8a0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
a8b0: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70  _item *pItem, *p
a8c0: 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69  OldItem;.  int i
a8d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ;.  assert( db!=
a8e0: 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  0 );.  if( p==0 
a8f0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
a900: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
a910: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
a920: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20  zeof(*pNew) );. 
a930: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
a940: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
a950: 3e 6e 45 78 70 72 20 3d 20 69 20 3d 20 70 2d 3e  >nExpr = i = p->
a960: 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 28 66 6c  nExpr;.  if( (fl
a970: 61 67 73 20 26 20 45 58 50 52 44 55 50 5f 52 45  ags & EXPRDUP_RE
a980: 44 55 43 45 29 3d 3d 30 20 29 20 66 6f 72 28 69  DUCE)==0 ) for(i
a990: 3d 31 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20  =1; i<p->nExpr; 
a9a0: 69 2b 3d 69 29 7b 7d 0a 20 20 70 4e 65 77 2d 3e  i+=i){}.  pNew->
a9b0: 61 20 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c 69  a = pItem = sqli
a9c0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
a9d0: 28 64 62 2c 20 20 69 2a 73 69 7a 65 6f 66 28 70  (db,  i*sizeof(p
a9e0: 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28  ->a[0]) );.  if(
a9f0: 20 70 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20   pItem==0 ){.   
aa00: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
aa10: 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65  b, pNew);.    re
aa20: 74 75 72 6e 20 30 3b 0a 20 20 7d 20 0a 20 20 70  turn 0;.  } .  p
aa30: 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a  OldItem = p->a;.
aa40: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
aa50: 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
aa60: 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29  m++, pOldItem++)
aa70: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 6c 64  {.    Expr *pOld
aa80: 45 78 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  Expr = pOldItem-
aa90: 3e 70 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65  >pExpr;.    pIte
aaa0: 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74  m->pExpr = sqlit
aab0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f  e3ExprDup(db, pO
aac0: 6c 64 45 78 70 72 2c 20 66 6c 61 67 73 29 3b 0a  ldExpr, flags);.
aad0: 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65      pItem->zName
aae0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
aaf0: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
ab00: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74  >zName);.    pIt
ab10: 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69  em->zSpan = sqli
ab20: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
ab30: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 53 70 61 6e 29  pOldItem->zSpan)
ab40: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72  ;.    pItem->sor
ab50: 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64 49 74 65  tOrder = pOldIte
ab60: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  m->sortOrder;.  
ab70: 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20    pItem->done = 
ab80: 30 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62 53  0;.    pItem->bS
ab90: 70 61 6e 49 73 54 61 62 20 3d 20 70 4f 6c 64 49  panIsTab = pOldI
aba0: 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 3b  tem->bSpanIsTab;
abb0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 20 3d 20  .    pItem->u = 
abc0: 70 4f 6c 64 49 74 65 6d 2d 3e 75 3b 0a 20 20 7d  pOldItem->u;.  }
abd0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
abe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73  }../*.** If curs
abf0: 6f 72 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76  ors, triggers, v
ac00: 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72  iews and subquer
ac10: 69 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74  ies are all omit
ac20: 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  ted from.** the 
ac30: 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65  build, then none
ac40: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
ac50: 67 20 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65  g routines, exce
ac60: 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74  pt for .** sqlit
ac70: 65 33 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63  e3SelectDup(), c
ac80: 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71  an be called. sq
ac90: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29  lite3SelectDup()
aca0: 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a   is sometimes.**
acb0: 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e   called with a N
acc0: 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ULL argument..*/
acd0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
ace0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
acf0: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
ad00: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29  TE_OMIT_TRIGGER)
ad10: 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28   \. || !defined(
ad20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
ad30: 55 45 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73  UERY).SrcList *s
ad40: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
ad50: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72  (sqlite3 *db, Sr
ad60: 63 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c  cList *p, int fl
ad70: 61 67 73 29 7b 0a 20 20 53 72 63 4c 69 73 74 20  ags){.  SrcList 
ad80: 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pNew;.  int i;.
ad90: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 61    int nByte;.  a
ada0: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
adb0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
adc0: 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d  urn 0;.  nByte =
add0: 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70   sizeof(*p) + (p
ade0: 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f  ->nSrc>0 ? sizeo
adf0: 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d  f(p->a[0]) * (p-
ae00: 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20  >nSrc-1) : 0);. 
ae10: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
ae20: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
ae30: 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
ae40: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
ae50: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63   0;.  pNew->nSrc
ae60: 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20   = pNew->nAlloc 
ae70: 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72  = p->nSrc;.  for
ae80: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b  (i=0; i<p->nSrc;
ae90: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
aea0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
aeb0: 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77  pNewItem = &pNew
aec0: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75  ->a[i];.    stru
aed0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
aee0: 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e  *pOldItem = &p->
aef0: 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20  a[i];.    Table 
af00: 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 49  *pTab;.    pNewI
af10: 74 65 6d 2d 3e 70 53 63 68 65 6d 61 20 3d 20 70  tem->pSchema = p
af20: 4f 6c 64 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61  OldItem->pSchema
af30: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
af40: 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69  zDatabase = sqli
af50: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
af60: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74 61 62  pOldItem->zDatab
af70: 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ase);.    pNewIt
af80: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
af90: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
afa0: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  pOldItem->zName)
afb0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
afc0: 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33  zAlias = sqlite3
afd0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
afe0: 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  dItem->zAlias);.
aff0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67      pNewItem->fg
b000: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 66 67 3b   = pOldItem->fg;
b010: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69  .    pNewItem->i
b020: 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65  Cursor = pOldIte
b030: 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
b040: 70 4e 65 77 49 74 65 6d 2d 3e 61 64 64 72 46 69  pNewItem->addrFi
b050: 6c 6c 53 75 62 20 3d 20 70 4f 6c 64 49 74 65 6d  llSub = pOldItem
b060: 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3b 0a 20  ->addrFillSub;. 
b070: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 72 65 67     pNewItem->reg
b080: 52 65 74 75 72 6e 20 3d 20 70 4f 6c 64 49 74 65  Return = pOldIte
b090: 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20  m->regReturn;.  
b0a0: 20 20 69 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e    if( pNewItem->
b0b0: 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29  fg.isIndexedBy )
b0c0: 7b 0a 20 20 20 20 20 20 70 4e 65 77 49 74 65 6d  {.      pNewItem
b0d0: 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 20  ->u1.zIndexedBy 
b0e0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
b0f0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
b100: 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 29 3b 0a  u1.zIndexedBy);.
b110: 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74      }.    pNewIt
b120: 65 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d 20 70  em->pIBIndex = p
b130: 4f 6c 64 49 74 65 6d 2d 3e 70 49 42 49 6e 64 65  OldItem->pIBInde
b140: 78 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 49  x;.    if( pNewI
b150: 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e  tem->fg.isTabFun
b160: 63 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 49  c ){.      pNewI
b170: 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67  tem->u1.pFuncArg
b180: 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 73 71   = .          sq
b190: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
b1a0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 75  (db, pOldItem->u
b1b0: 31 2e 70 46 75 6e 63 41 72 67 2c 20 66 6c 61 67  1.pFuncArg, flag
b1c0: 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  s);.    }.    pT
b1d0: 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70  ab = pNewItem->p
b1e0: 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  Tab = pOldItem->
b1f0: 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54  pTab;.    if( pT
b200: 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  ab ){.      pTab
b210: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a  ->nRef++;.    }.
b220: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53      pNewItem->pS
b230: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
b240: 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 4f 6c  electDup(db, pOl
b250: 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  dItem->pSelect, 
b260: 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77  flags);.    pNew
b270: 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69  Item->pOn = sqli
b280: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
b290: 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c  OldItem->pOn, fl
b2a0: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ags);.    pNewIt
b2b0: 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c  em->pUsing = sql
b2c0: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 64 62  ite3IdListDup(db
b2d0: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69  , pOldItem->pUsi
b2e0: 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ng);.    pNewIte
b2f0: 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c  m->colUsed = pOl
b300: 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a  dItem->colUsed;.
b310: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
b320: 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c  w;.}.IdList *sql
b330: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 73 71  ite3IdListDup(sq
b340: 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73  lite3 *db, IdLis
b350: 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20  t *p){.  IdList 
b360: 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pNew;.  int i;.
b370: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
b380: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
b390: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
b3a0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
b3b0: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
b3c0: 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69  of(*pNew) );.  i
b3d0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
b3e0: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  urn 0;.  pNew->n
b3f0: 49 64 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70  Id = p->nId;.  p
b400: 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33  New->a = sqlite3
b410: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
b420: 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28  , p->nId*sizeof(
b430: 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66  p->a[0]) );.  if
b440: 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a  ( pNew->a==0 ){.
b450: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
b460: 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20  e(db, pNew);.   
b470: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
b480: 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20 62 65   /* Note that be
b490: 63 61 75 73 65 20 74 68 65 20 73 69 7a 65 20 6f  cause the size o
b4a0: 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  f the allocation
b4b0: 20 66 6f 72 20 70 2d 3e 61 5b 5d 20 69 73 20 6e   for p->a[] is n
b4c0: 6f 74 0a 20 20 2a 2a 20 6e 65 63 65 73 73 61 72  ot.  ** necessar
b4d0: 69 6c 79 20 61 20 70 6f 77 65 72 20 6f 66 20 74  ily a power of t
b4e0: 77 6f 2c 20 73 71 6c 69 74 65 33 49 64 4c 69 73  wo, sqlite3IdLis
b4f0: 74 41 70 70 65 6e 64 28 29 20 6d 61 79 20 6e 6f  tAppend() may no
b500: 74 20 62 65 20 63 61 6c 6c 65 64 0a 20 20 2a 2a  t be called.  **
b510: 20 6f 6e 20 74 68 65 20 64 75 70 6c 69 63 61 74   on the duplicat
b520: 65 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69  e created by thi
b530: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20  s function. */. 
b540: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
b550: 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  Id; i++){.    st
b560: 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d  ruct IdList_item
b570: 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e   *pNewItem = &pN
b580: 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74  ew->a[i];.    st
b590: 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d  ruct IdList_item
b5a0: 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d   *pOldItem = &p-
b5b0: 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49  >a[i];.    pNewI
b5c0: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
b5d0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
b5e0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pOldItem->zName
b5f0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
b600: 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  >idx = pOldItem-
b610: 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75  >idx;.  }.  retu
b620: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63  rn pNew;.}.Selec
b630: 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74  t *sqlite3Select
b640: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
b650: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
b660: 66 6c 61 67 73 29 7b 0a 20 20 53 65 6c 65 63 74  flags){.  Select
b670: 20 2a 70 4e 65 77 2c 20 2a 70 50 72 69 6f 72 3b   *pNew, *pPrior;
b680: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
b690: 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
b6a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
b6b0: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
b6c0: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
b6d0: 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
b6e0: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
b6f0: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 45 4c  n 0;.  pNew->pEL
b700: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
b710: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
b720: 70 45 4c 69 73 74 2c 20 66 6c 61 67 73 29 3b 0a  pEList, flags);.
b730: 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73    pNew->pSrc = s
b740: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
b750: 28 64 62 2c 20 70 2d 3e 70 53 72 63 2c 20 66 6c  (db, p->pSrc, fl
b760: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57  ags);.  pNew->pW
b770: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
b780: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 68  prDup(db, p->pWh
b790: 65 72 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  ere, flags);.  p
b7a0: 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  New->pGroupBy = 
b7b0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
b7c0: 75 70 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70  up(db, p->pGroup
b7d0: 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e  By, flags);.  pN
b7e0: 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71  ew->pHaving = sq
b7f0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
b800: 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 66 6c 61   p->pHaving, fla
b810: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72  gs);.  pNew->pOr
b820: 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
b830: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
b840: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 66 6c 61 67  ->pOrderBy, flag
b850: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  s);.  pNew->op =
b860: 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e   p->op;.  pNew->
b870: 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 20  pPrior = pPrior 
b880: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
b890: 75 70 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72  up(db, p->pPrior
b8a0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20  , flags);.  if( 
b8b0: 70 50 72 69 6f 72 20 29 20 70 50 72 69 6f 72 2d  pPrior ) pPrior-
b8c0: 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20  >pNext = pNew;. 
b8d0: 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30   pNew->pNext = 0
b8e0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74  ;.  pNew->pLimit
b8f0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
b900: 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c  p(db, p->pLimit,
b910: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
b920: 3e 70 4f 66 66 73 65 74 20 3d 20 73 71 6c 69 74  >pOffset = sqlit
b930: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
b940: 3e 70 4f 66 66 73 65 74 2c 20 66 6c 61 67 73 29  >pOffset, flags)
b950: 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74  ;.  pNew->iLimit
b960: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f   = 0;.  pNew->iO
b970: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 4e 65  ffset = 0;.  pNe
b980: 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d  w->selFlags = p-
b990: 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e 53 46 5f  >selFlags & ~SF_
b9a0: 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
b9b0: 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45   pNew->addrOpenE
b9c0: 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70  phm[0] = -1;.  p
b9d0: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
b9e0: 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  m[1] = -1;.  pNe
b9f0: 77 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  w->nSelectRow = 
ba00: 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  p->nSelectRow;. 
ba10: 20 70 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20 77   pNew->pWith = w
ba20: 69 74 68 44 75 70 28 64 62 2c 20 70 2d 3e 70 57  ithDup(db, p->pW
ba30: 69 74 68 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ith);.  sqlite3S
ba40: 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70 4e 65  electSetName(pNe
ba50: 77 2c 20 70 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b  w, p->zSelName);
ba60: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
ba70: 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74 20 2a  }.#else.Select *
ba80: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
ba90: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65  (sqlite3 *db, Se
baa0: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61  lect *p, int fla
bab0: 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  gs){.  assert( p
bac0: 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
bad0: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  0;.}.#endif.../*
bae0: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
baf0: 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65 6e 64  ement to the end
bb00: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
bb10: 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c 69 73  n list.  If pLis
bb20: 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c  t is.** initiall
bb30: 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65  y NULL, then cre
bb40: 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65 73  ate a new expres
bb50: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
bb60: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
bb70: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63  ocation error oc
bb80: 63 75 72 73 2c 20 74 68 65 20 65 6e 74 69 72 65  curs, the entire
bb90: 20 6c 69 73 74 20 69 73 20 66 72 65 65 64 20 61   list is freed a
bba0: 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65  nd.** NULL is re
bbb0: 74 75 72 6e 65 64 2e 20 20 49 66 20 6e 6f 6e 2d  turned.  If non-
bbc0: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
bbd0: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61  , then it is gua
bbe0: 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68 61 74 20  ranteed.** that 
bbf0: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77 61  the new entry wa
bc00: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61  s successfully a
bc10: 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45 78 70 72  ppended..*/.Expr
bc20: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70  List *sqlite3Exp
bc30: 72 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20 50  rListAppend(.  P
bc40: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
bc50: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
bc60: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
bc70: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
bc80: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
bc90: 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70 65 6e  o which to appen
bca0: 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  d. Might be NULL
bcb0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
bcc0: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r             /*
bcd0: 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62   Expression to b
bce0: 65 20 61 70 70 65 6e 64 65 64 2e 20 4d 69 67 68  e appended. Migh
bcf0: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
bd00: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
bd10: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73  pParse->db;.  as
bd20: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
bd30: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
bd40: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
bd50: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
bd60: 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70  N(db, sizeof(Exp
bd70: 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  rList) );.    if
bd80: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
bd90: 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b      goto no_mem;
bda0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
bdb0: 2d 3e 6e 45 78 70 72 20 3d 20 30 3b 0a 20 20 20  ->nExpr = 0;.   
bdc0: 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69   pList->a = sqli
bdd0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
bde0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73  (db, sizeof(pLis
bdf0: 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69  t->a[0]));.    i
be00: 66 28 20 70 4c 69 73 74 2d 3e 61 3d 3d 30 20 29  f( pList->a==0 )
be10: 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
be20: 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 69 73 74  }else if( (pList
be30: 2d 3e 6e 45 78 70 72 20 26 20 28 70 4c 69 73 74  ->nExpr & (pList
be40: 2d 3e 6e 45 78 70 72 2d 31 29 29 3d 3d 30 20 29  ->nExpr-1))==0 )
be50: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
be60: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20  rList_item *a;. 
be70: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
be80: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20  ->nExpr>0 );.   
be90: 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65   a = sqlite3DbRe
bea0: 61 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73 74 2d  alloc(db, pList-
beb0: 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  >a, pList->nExpr
bec0: 2a 32 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  *2*sizeof(pList-
bed0: 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28  >a[0]));.    if(
bee0: 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67   a==0 ){.      g
bef0: 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20  oto no_mem;.    
bf00: 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d  }.    pList->a =
bf10: 20 61 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   a;.  }.  assert
bf20: 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b  ( pList->a!=0 );
bf30: 0a 20 20 69 66 28 20 31 20 29 7b 0a 20 20 20 20  .  if( 1 ){.    
bf40: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
bf50: 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
bf60: 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
bf70: 45 78 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d  Expr++];.    mem
bf80: 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20 73 69  set(pItem, 0, si
bf90: 7a 65 6f 66 28 2a 70 49 74 65 6d 29 29 3b 0a 20  zeof(*pItem));. 
bfa0: 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
bfb0: 3d 20 70 45 78 70 72 3b 0a 20 20 7d 0a 20 20 72  = pExpr;.  }.  r
bfc0: 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f  eturn pList;..no
bfd0: 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a 20  _mem:     .  /* 
bfe0: 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65  Avoid leaking me
bff0: 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20 68  mory if malloc h
c000: 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20  as failed. */.  
c010: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
c020: 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20  e(db, pExpr);.  
c030: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
c040: 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29  elete(db, pList)
c050: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
c060: 0a 2f 2a 0a 2a 2a 20 70 43 6f 6c 75 6d 6e 73 20  ./*.** pColumns 
c070: 61 6e 64 20 70 45 78 70 72 20 66 6f 72 6d 20 61  and pExpr form a
c080: 20 76 65 63 74 6f 72 20 61 73 73 69 67 6e 6d 65   vector assignme
c090: 6e 74 20 77 68 69 63 68 20 69 73 20 70 61 72 74  nt which is part
c0a0: 20 6f 66 20 74 68 65 20 53 45 54 0a 2a 2a 20 63   of the SET.** c
c0b0: 6c 61 75 73 65 20 6f 66 20 61 6e 20 55 50 44 41  lause of an UPDA
c0c0: 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4c  TE statement.  L
c0d0: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
c0e0: 20 20 20 20 20 20 20 28 61 2c 62 2c 63 29 20 3d         (a,b,c) =
c0f0: 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78   (expr1,expr2,ex
c100: 70 72 33 29 0a 2a 2a 20 4f 72 3a 20 20 20 20 28  pr3).** Or:    (
c110: 61 2c 62 2c 63 29 20 3d 20 28 53 45 4c 45 43 54  a,b,c) = (SELECT
c120: 20 78 2c 79 2c 7a 20 46 52 4f 4d 20 2e 2e 2e 2e   x,y,z FROM ....
c130: 29 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68  ).**.** For each
c140: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 76 65 63   term of the vec
c150: 74 6f 72 20 61 73 73 69 67 6e 6d 65 6e 74 2c 20  tor assignment, 
c160: 61 70 70 65 6e 64 20 6e 65 77 20 65 6e 74 72 69  append new entri
c170: 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 65 78 70  es to the.** exp
c180: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 4c 69  ression list pLi
c190: 73 74 2e 20 20 49 6e 20 74 68 65 20 63 61 73 65  st.  In the case
c1a0: 20 6f 66 20 61 20 73 75 62 71 75 65 72 79 20 6f   of a subquery o
c1b0: 6e 20 74 68 65 20 4c 48 53 2c 20 61 70 70 65 6e  n the LHS, appen
c1c0: 64 0a 2a 2a 20 54 4b 5f 53 45 4c 45 43 54 5f 43  d.** TK_SELECT_C
c1d0: 4f 4c 55 4d 4e 20 65 78 70 72 65 73 73 69 6f 6e  OLUMN expression
c1e0: 73 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a  s..*/.ExprList *
c1f0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
c200: 70 70 65 6e 64 56 65 63 74 6f 72 28 0a 20 20 50  ppendVector(.  P
c210: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
c220: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
c230: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
c240: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
c250: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
c260: 77 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e  which to append.
c270: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
c280: 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 43 6f 6c  /.  IdList *pCol
c290: 75 6d 6e 73 2c 20 20 20 20 20 20 2f 2a 20 4c 69  umns,      /* Li
c2a0: 73 74 20 6f 66 20 6e 61 6d 65 73 20 6f 66 20 4c  st of names of L
c2b0: 48 53 20 6f 66 20 74 68 65 20 61 73 73 69 67 6e  HS of the assign
c2c0: 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ment */.  Expr *
c2d0: 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20  pExpr           
c2e0: 20 2f 2a 20 56 65 63 74 6f 72 20 65 78 70 72 65   /* Vector expre
c2f0: 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65  ssion to be appe
c300: 6e 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e  nded. Might be N
c310: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ULL */.){.  sqli
c320: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
c330: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  ->db;.  int n;. 
c340: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 43   int i;.  if( pC
c350: 6f 6c 75 6d 6e 73 3d 3d 30 20 29 20 67 6f 74 6f  olumns==0 ) goto
c360: 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65   vector_append_e
c370: 72 72 6f 72 3b 0a 20 20 69 66 28 20 70 45 78 70  rror;.  if( pExp
c380: 72 3d 3d 30 20 29 20 67 6f 74 6f 20 76 65 63 74  r==0 ) goto vect
c390: 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b  or_append_error;
c3a0: 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 45 78  .  n = sqlite3Ex
c3b0: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78  prVectorSize(pEx
c3c0: 70 72 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 75  pr);.  if( pColu
c3d0: 6d 6e 73 2d 3e 6e 49 64 21 3d 6e 20 29 7b 0a 20  mns->nId!=n ){. 
c3e0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
c3f0: 73 67 28 70 50 61 72 73 65 2c 20 22 25 64 20 63  sg(pParse, "%d c
c400: 6f 6c 75 6d 6e 73 20 61 73 73 69 67 6e 65 64 20  olumns assigned 
c410: 25 64 20 76 61 6c 75 65 73 22 2c 0a 20 20 20 20  %d values",.    
c420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c430: 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 2c 20 6e  pColumns->nId, n
c440: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 76 65 63 74  );.    goto vect
c450: 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b  or_append_error;
c460: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
c470: 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  i<n; i++){.    E
c480: 78 70 72 20 2a 70 53 75 62 45 78 70 72 20 3d 20  xpr *pSubExpr = 
c490: 73 71 6c 69 74 65 33 45 78 70 72 46 6f 72 56 65  sqlite3ExprForVe
c4a0: 63 74 6f 72 46 69 65 6c 64 28 70 50 61 72 73 65  ctorField(pParse
c4b0: 2c 20 70 45 78 70 72 2c 20 69 29 3b 0a 20 20 20  , pExpr, i);.   
c4c0: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
c4d0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
c4e0: 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 53  Parse, pList, pS
c4f0: 75 62 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  ubExpr);.    if(
c500: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20   pList ){.      
c510: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
c520: 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d  nExpr-1].zName =
c530: 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e   pColumns->a[i].
c540: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 70 43 6f  zName;.      pCo
c550: 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  lumns->a[i].zNam
c560: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = 0;.    }.  }
c570: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
c580: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20  ==TK_SELECT ){. 
c590: 20 20 20 69 66 28 20 70 4c 69 73 74 20 26 26 20     if( pList && 
c5a0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
c5b0: 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  r ){.      asser
c5c0: 74 28 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  t( pList->a[0].p
c5d0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
c5e0: 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  ECT_COLUMN );.  
c5f0: 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e      pList->a[0].
c600: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20  pExpr->pRight = 
c610: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 45 78  pExpr;.      pEx
c620: 70 72 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  pr = 0;.    }.  
c630: 7d 0a 0a 76 65 63 74 6f 72 5f 61 70 70 65 6e 64  }..vector_append
c640: 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65  _error:.  sqlite
c650: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
c660: 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65  pExpr);.  sqlite
c670: 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62  3IdListDelete(db
c680: 2c 20 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 72  , pColumns);.  r
c690: 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
c6a0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 6f  /*.** Set the so
c6b0: 72 74 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65  rt order for the
c6c0: 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f 6e   last element on
c6d0: 20 74 68 65 20 67 69 76 65 6e 20 45 78 70 72 4c   the given ExprL
c6e0: 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
c6f0: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53  ite3ExprListSetS
c700: 6f 72 74 4f 72 64 65 72 28 45 78 70 72 4c 69 73  ortOrder(ExprLis
c710: 74 20 2a 70 2c 20 69 6e 74 20 69 53 6f 72 74 4f  t *p, int iSortO
c720: 72 64 65 72 29 7b 0a 20 20 69 66 28 20 70 3d 3d  rder){.  if( p==
c730: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
c740: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 53 4f 5f  sert( SQLITE_SO_
c750: 55 4e 44 45 46 49 4e 45 44 3c 30 20 26 26 20 53  UNDEFINED<0 && S
c760: 51 4c 49 54 45 5f 53 4f 5f 41 53 43 3e 3d 30 20  QLITE_SO_ASC>=0 
c770: 26 26 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53  && SQLITE_SO_DES
c780: 43 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  C>0 );.  assert(
c790: 20 70 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20   p->nExpr>0 );. 
c7a0: 20 69 66 28 20 69 53 6f 72 74 4f 72 64 65 72 3c   if( iSortOrder<
c7b0: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
c7c0: 20 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31   p->a[p->nExpr-1
c7d0: 5d 2e 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c  ].sortOrder==SQL
c7e0: 49 54 45 5f 53 4f 5f 41 53 43 20 29 3b 0a 20 20  ITE_SO_ASC );.  
c7f0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
c800: 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d  p->a[p->nExpr-1]
c810: 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  .sortOrder = (u8
c820: 29 69 53 6f 72 74 4f 72 64 65 72 3b 0a 7d 0a 0a  )iSortOrder;.}..
c830: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78  /*.** Set the Ex
c840: 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65  prList.a[].zName
c850: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
c860: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
c870: 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74  ded item.** on t
c880: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
c890: 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20  st..**.** pList 
c8a0: 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f  might be NULL fo
c8b0: 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65  llowing an OOM e
c8c0: 72 72 6f 72 2e 20 20 42 75 74 20 70 4e 61 6d 65  rror.  But pName
c8d0: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65   should never be
c8e0: 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20  .** NULL.  If a 
c8f0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
c900: 6e 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61  n fails, the pPa
c910: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
c920: 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73  ailed flag.** is
c930: 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   set..*/.void sq
c940: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74  lite3ExprListSet
c950: 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70  Name(.  Parse *p
c960: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
c970: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
c980: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
c990: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
c9a0: 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68  /* List to which
c9b0: 20 74 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e   to add the span
c9c0: 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  . */.  Token *pN
c9d0: 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ame,           /
c9e0: 2a 20 4e 61 6d 65 20 74 6f 20 62 65 20 61 64 64  * Name to be add
c9f0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75  ed */.  int dequ
ca00: 6f 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ote             
ca10: 2f 2a 20 54 72 75 65 20 74 6f 20 63 61 75 73 65  /* True to cause
ca20: 20 74 68 65 20 6e 61 6d 65 20 74 6f 20 62 65 20   the name to be 
ca30: 64 65 71 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20  dequoted */.){. 
ca40: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
ca50: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  0 || pParse->db-
ca60: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30  >mallocFailed!=0
ca70: 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   );.  if( pList 
ca80: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
ca90: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
caa0: 65 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  em;.    assert( 
cab0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29  pList->nExpr>0 )
cac0: 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70  ;.    pItem = &p
cad0: 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
cae0: 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73  Expr-1];.    ass
caf0: 65 72 74 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  ert( pItem->zNam
cb00: 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65  e==0 );.    pIte
cb10: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
cb20: 65 33 44 62 53 74 72 4e 44 75 70 28 70 50 61 72  e3DbStrNDup(pPar
cb30: 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a  se->db, pName->z
cb40: 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20  , pName->n);.   
cb50: 20 69 66 28 20 64 65 71 75 6f 74 65 20 29 20 73   if( dequote ) s
cb60: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 70 49  qlite3Dequote(pI
cb70: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  tem->zName);.  }
cb80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
cb90: 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a  e ExprList.a[].z
cba0: 53 70 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20  Span element of 
cbb0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
cbc0: 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20  y added item.** 
cbd0: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
cbe0: 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c  n list..**.** pL
cbf0: 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c  ist might be NUL
cc00: 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f  L following an O
cc10: 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70  OM error.  But p
cc20: 53 70 61 6e 20 73 68 6f 75 6c 64 20 6e 65 76 65  Span should neve
cc30: 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49  r be.** NULL.  I
cc40: 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
cc50: 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65  ation fails, the
cc60: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
cc70: 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a  locFailed flag.*
cc80: 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69  * is set..*/.voi
cc90: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
cca0: 74 53 65 74 53 70 61 6e 28 0a 20 20 50 61 72 73  tSetSpan(.  Pars
ccb0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
ccc0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
ccd0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
cce0: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
ccf0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77      /* List to w
cd00: 68 69 63 68 20 74 6f 20 61 64 64 20 74 68 65 20  hich to add the 
cd10: 73 70 61 6e 2e 20 2a 2f 0a 20 20 45 78 70 72 53  span. */.  ExprS
cd20: 70 61 6e 20 2a 70 53 70 61 6e 20 20 20 20 20 20  pan *pSpan      
cd30: 20 20 20 2f 2a 20 54 68 65 20 73 70 61 6e 20 74     /* The span t
cd40: 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 29 7b  o be added */.){
cd50: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
cd60: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
cd70: 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
cd80: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
cd90: 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  led!=0 );.  if( 
cda0: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72  pList ){.    str
cdb0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
cdc0: 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73  m *pItem = &pLis
cdd0: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  t->a[pList->nExp
cde0: 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  r-1];.    assert
cdf0: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30  ( pList->nExpr>0
ce00: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
ce10: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
ce20: 20 7c 7c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72   || pItem->pExpr
ce30: 3d 3d 70 53 70 61 6e 2d 3e 70 45 78 70 72 20 29  ==pSpan->pExpr )
ce40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
ce50: 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
ce60: 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d  Span);.    pItem
ce70: 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65  ->zSpan = sqlite
ce80: 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28  3DbStrNDup(db, (
ce90: 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53 74  char*)pSpan->zSt
cea0: 61 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  art,.           
ceb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cec0: 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 70           (int)(p
ced0: 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53 70  Span->zEnd - pSp
cee0: 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20 20  an->zStart));.  
cef0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  }.}../*.** If th
cf00: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
cf10: 74 20 70 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e  t pEList contain
cf20: 73 20 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d  s more than iLim
cf30: 69 74 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20  it elements,.** 
cf40: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
cf50: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
cf60: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
cf70: 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65  3ExprListCheckLe
cf80: 6e 67 74 68 28 0a 20 20 50 61 72 73 65 20 2a 70  ngth(.  Parse *p
cf90: 50 61 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73  Parse,.  ExprLis
cfa0: 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20 63 6f 6e  t *pEList,.  con
cfb0: 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74  st char *zObject
cfc0: 0a 29 7b 0a 20 20 69 6e 74 20 6d 78 20 3d 20 70  .){.  int mx = p
cfd0: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69  Parse->db->aLimi
cfe0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
cff0: 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73 74 63 61  OLUMN];.  testca
d000: 73 65 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  se( pEList && pE
d010: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20  List->nExpr==mx 
d020: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
d030: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
d040: 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a  >nExpr==mx+1 );.
d050: 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20    if( pEList && 
d060: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 6d 78  pEList->nExpr>mx
d070: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
d080: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
d090: 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e  "too many column
d0a0: 73 20 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63  s in %s", zObjec
d0b0: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
d0c0: 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
d0d0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
d0e0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  t..*/.static SQL
d0f0: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
d100: 64 20 65 78 70 72 4c 69 73 74 44 65 6c 65 74 65  d exprListDelete
d110: 4e 4e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  NN(sqlite3 *db, 
d120: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
d130: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
d140: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
d150: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65  m *pItem;.  asse
d160: 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20  rt( pList->a!=0 
d170: 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  || pList->nExpr=
d180: 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70 49 74 65  =0 );.  for(pIte
d190: 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
d1a0: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
d1b0: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
d1c0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
d1d0: 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d  elete(db, pItem-
d1e0: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c  >pExpr);.    sql
d1f0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
d200: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
d210: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
d220: 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e  db, pItem->zSpan
d230: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
d240: 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
d250: 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ->a);.  sqlite3D
d260: 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29  bFree(db, pList)
d270: 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
d280: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 73  ExprListDelete(s
d290: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
d2a0: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
d2b0: 69 66 28 20 70 4c 69 73 74 20 29 20 65 78 70 72  if( pList ) expr
d2c0: 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28 64 62 2c  ListDeleteNN(db,
d2d0: 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pList);.}../*.*
d2e0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62 69 74  * Return the bit
d2f0: 77 69 73 65 2d 4f 52 20 6f 66 20 61 6c 6c 20 45  wise-OR of all E
d300: 78 70 72 2e 66 6c 61 67 73 20 66 69 65 6c 64 73  xpr.flags fields
d310: 20 69 6e 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a   in the given.**
d320: 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a 75 33   ExprList..*/.u3
d330: 32 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  2 sqlite3ExprLis
d340: 74 46 6c 61 67 73 28 63 6f 6e 73 74 20 45 78 70  tFlags(const Exp
d350: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
d360: 20 69 6e 74 20 69 3b 0a 20 20 75 33 32 20 6d 20   int i;.  u32 m 
d370: 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  = 0;.  if( pList
d380: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
d390: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
d3a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 45 78   i++){.       Ex
d3b0: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73  pr *pExpr = pLis
d3c0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
d3d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
d3e0: 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  xpr!=0 );.      
d3f0: 20 6d 20 7c 3d 20 70 45 78 70 72 2d 3e 66 6c 61   m |= pExpr->fla
d400: 67 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  gs;.    }.  }.  
d410: 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a  return m;.}../*.
d420: 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
d430: 73 20 61 72 65 20 57 61 6c 6b 65 72 20 63 61 6c  s are Walker cal
d440: 6c 62 61 63 6b 73 20 75 73 65 64 20 74 6f 20 63  lbacks used to c
d450: 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 73  heck expressions
d460: 20 74 6f 0a 2a 2a 20 73 65 65 20 69 66 20 74 68   to.** see if th
d470: 65 79 20 61 72 65 20 22 63 6f 6e 73 74 61 6e 74  ey are "constant
d480: 22 20 66 6f 72 20 73 6f 6d 65 20 64 65 66 69 6e  " for some defin
d490: 69 74 69 6f 6e 20 6f 66 20 63 6f 6e 73 74 61 6e  ition of constan
d4a0: 74 2e 20 20 54 68 65 0a 2a 2a 20 57 61 6c 6b 65  t.  The.** Walke
d4b0: 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 64 65  r.eCode value de
d4c0: 74 65 72 6d 69 6e 65 73 20 74 68 65 20 74 79 70  termines the typ
d4d0: 65 20 6f 66 20 22 63 6f 6e 73 74 61 6e 74 22 20  e of "constant" 
d4e0: 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 0a 2a  we are looking.*
d4f0: 2a 20 66 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  * for..**.** The
d500: 73 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  se callback rout
d510: 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
d520: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 66   implement the f
d530: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
d540: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
d550: 73 43 6f 6e 73 74 61 6e 74 28 29 20 20 20 20 20  sConstant()     
d560: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 61               pWa
d570: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 31 0a 2a  lker->eCode==1.*
d580: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  *     sqlite3Exp
d590: 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
d5a0: 69 6e 28 29 20 20 20 20 20 20 20 20 20 20 20 70  in()           p
d5b0: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32  Walker->eCode==2
d5c0: 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45  .**     sqlite3E
d5d0: 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61  xprIsTableConsta
d5e0: 6e 74 28 29 20 20 20 20 20 20 20 20 20 20 20 20  nt()            
d5f0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
d600: 3d 33 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  =3.**     sqlite
d610: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
d620: 72 46 75 6e 63 74 69 6f 6e 28 29 20 20 20 20 20  rFunction()     
d630: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
d640: 65 3d 3d 34 20 6f 72 20 35 0a 2a 2a 0a 2a 2a 20  e==4 or 5.**.** 
d650: 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 20 74 68  In all cases, th
d660: 65 20 63 61 6c 6c 62 61 63 6b 73 20 73 65 74 20  e callbacks set 
d670: 57 61 6c 6b 65 72 2e 65 43 6f 64 65 3d 30 20 61  Walker.eCode=0 a
d680: 6e 64 20 61 62 6f 72 74 20 69 66 20 74 68 65 20  nd abort if the 
d690: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
d6a0: 20 66 6f 75 6e 64 20 74 6f 20 6e 6f 74 20 62 65   found to not be
d6b0: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a   a constant..**.
d6c0: 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 45 78  ** The sqlite3Ex
d6d0: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75  prIsConstantOrFu
d6e0: 6e 63 74 69 6f 6e 28 29 20 69 73 20 75 73 65 64  nction() is used
d6f0: 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20   for evaluating 
d700: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 69  expressions.** i
d710: 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
d720: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
d730: 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 76 61   Walker.eCode va
d740: 6c 75 65 20 69 73 20 35 20 77 68 65 6e 20 70 61  lue is 5 when pa
d750: 72 73 69 6e 67 0a 2a 2a 20 61 6e 20 65 78 69 73  rsing.** an exis
d760: 74 69 6e 67 20 73 63 68 65 6d 61 20 61 6e 64 20  ting schema and 
d770: 34 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69 6e  4 when processin
d780: 67 20 61 20 6e 65 77 20 73 74 61 74 65 6d 65 6e  g a new statemen
d790: 74 2e 20 20 41 20 62 6f 75 6e 64 0a 2a 2a 20 70  t.  A bound.** p
d7a0: 61 72 61 6d 65 74 65 72 20 72 61 69 73 65 73 20  arameter raises 
d7b0: 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 6e 65 77  an error for new
d7c0: 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 62 75 74   statements, but
d7d0: 20 69 73 20 73 69 6c 65 6e 74 6c 79 20 63 6f 6e   is silently con
d7e0: 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 4e 55 4c  verted.** to NUL
d7f0: 4c 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 73  L for existing s
d800: 63 68 65 6d 61 73 2e 20 20 54 68 69 73 20 61 6c  chemas.  This al
d810: 6c 6f 77 73 20 73 71 6c 69 74 65 5f 6d 61 73 74  lows sqlite_mast
d820: 65 72 20 74 61 62 6c 65 73 20 74 68 61 74 20 0a  er tables that .
d830: 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62 6f 75  ** contain a bou
d840: 6e 64 20 70 61 72 61 6d 65 74 65 72 20 62 65 63  nd parameter bec
d850: 61 75 73 65 20 74 68 65 79 20 77 65 72 65 20 67  ause they were g
d860: 65 6e 65 72 61 74 65 64 20 62 79 20 6f 6c 64 65  enerated by olde
d870: 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66  r versions.** of
d880: 20 53 51 4c 69 74 65 20 74 6f 20 62 65 20 70 61   SQLite to be pa
d890: 72 73 65 64 20 62 79 20 6e 65 77 65 72 20 76 65  rsed by newer ve
d8a0: 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
d8b0: 20 77 69 74 68 6f 75 74 20 72 61 69 73 69 6e 67   without raising
d8c0: 20 61 0a 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20   a.** malformed 
d8d0: 73 63 68 65 6d 61 20 65 72 72 6f 72 2e 0a 2a 2f  schema error..*/
d8e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
d8f0: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57  NodeIsConstant(W
d900: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
d910: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 0a 20  Expr *pExpr){.. 
d920: 20 2f 2a 20 49 66 20 70 57 61 6c 6b 65 72 2d 3e   /* If pWalker->
d930: 65 43 6f 64 65 20 69 73 20 32 20 74 68 65 6e 20  eCode is 2 then 
d940: 61 6e 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20  any term of the 
d950: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
d960: 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a 2a 20  comes from.  ** 
d970: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
d980: 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6c 65 66  clauses of a lef
d990: 74 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c 69 66  t join disqualif
d9a0: 69 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69  ies the expressi
d9b0: 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62 65 69  on.  ** from bei
d9c0: 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f  ng considered co
d9d0: 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28  nstant. */.  if(
d9e0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
d9f0: 3d 32 20 26 26 20 45 78 70 72 48 61 73 50 72 6f  =2 && ExprHasPro
da00: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
da10: 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
da20: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
da30: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
da40: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a  WRC_Abort;.  }..
da50: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
da60: 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  >op ){.    /* Co
da70: 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f 6e 73  nsider functions
da80: 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20   to be constant 
da90: 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61 72 67  if all their arg
daa0: 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e 73 74  uments are const
dab0: 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 65  ant.    ** and e
dac0: 69 74 68 65 72 20 70 57 61 6c 6b 65 72 2d 3e 65  ither pWalker->e
dad0: 43 6f 64 65 3d 3d 34 20 6f 72 20 35 20 6f 72 20  Code==4 or 5 or 
dae0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  the function has
daf0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c 49   the.    ** SQLI
db00: 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 20 66 6c  TE_FUNC_CONST fl
db10: 61 67 2e 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ag. */.    case 
db20: 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  TK_FUNCTION:.   
db30: 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e     if( pWalker->
db40: 65 43 6f 64 65 3e 3d 34 20 7c 7c 20 45 78 70 72  eCode>=4 || Expr
db50: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
db60: 72 2c 45 50 5f 43 6f 6e 73 74 46 75 6e 63 29 20  r,EP_ConstFunc) 
db70: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
db80: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
db90: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
dba0: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
dbb0: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
dbc0: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
dbd0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63  t;.      }.    c
dbe0: 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63  ase TK_ID:.    c
dbf0: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20  ase TK_COLUMN:. 
dc00: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
dc10: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73  UNCTION:.    cas
dc20: 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
dc30: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
dc40: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
dc50: 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  D );.      testc
dc60: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
dc70: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
dc80: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
dc90: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
dca0: 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20  UNCTION );.     
dcb0: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
dcc0: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
dcd0: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 69 66 28  UMN );.      if(
dce0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
dcf0: 3d 33 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61  =3 && pExpr->iTa
dd00: 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e  ble==pWalker->u.
dd10: 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iCur ){.        
dd20: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
dd30: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  nue;.      }else
dd40: 7b 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65  {.        pWalke
dd50: 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20  r->eCode = 0;.  
dd60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
dd70: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a  _Abort;.      }.
dd80: 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49      case TK_VARI
dd90: 41 42 4c 45 3a 0a 20 20 20 20 20 20 69 66 28 20  ABLE:.      if( 
dda0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
ddb0: 35 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  5 ){.        /* 
ddc0: 53 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74  Silently convert
ddd0: 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72   bound parameter
dde0: 73 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e  s that appear in
ddf0: 73 69 64 65 20 6f 66 20 43 52 45 41 54 45 0a 20  side of CREATE. 
de00: 20 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d         ** statem
de10: 65 6e 74 73 20 69 6e 74 6f 20 61 20 4e 55 4c 4c  ents into a NULL
de20: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 74 68   when parsing th
de30: 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65  e CREATE stateme
de40: 6e 74 20 74 65 78 74 20 6f 75 74 0a 20 20 20 20  nt text out.    
de50: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 71      ** of the sq
de60: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
de70: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 45 78  e */.        pEx
de80: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c  pr->op = TK_NULL
de90: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
dea0: 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  ( pWalker->eCode
deb0: 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==4 ){.        /
dec0: 2a 20 41 20 62 6f 75 6e 64 20 70 61 72 61 6d 65  * A bound parame
ded0: 74 65 72 20 69 6e 20 61 20 43 52 45 41 54 45 20  ter in a CREATE 
dee0: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 6f  statement that o
def0: 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 0a 20  riginates from. 
df00: 20 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65         ** sqlite
df10: 33 5f 70 72 65 70 61 72 65 28 29 20 63 61 75 73  3_prepare() caus
df20: 65 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  es an error */. 
df30: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
df40: 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20  eCode = 0;.     
df50: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
df60: 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ort;.      }.   
df70: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75     /* Fall throu
df80: 67 68 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c  gh */.    defaul
df90: 74 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t:.      testcas
dfa0: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
dfb0: 5f 53 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73 65  _SELECT ); /* se
dfc0: 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61  lectNodeIsConsta
dfd0: 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77  nt will disallow
dfe0: 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
dff0: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
e000: 4b 5f 45 58 49 53 54 53 20 29 3b 20 2f 2a 20 73  K_EXISTS ); /* s
e010: 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74  electNodeIsConst
e020: 61 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f  ant will disallo
e030: 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  w */.      retur
e040: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
e050: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74    }.}.static int
e060: 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e   selectNodeIsCon
e070: 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57  stant(Walker *pW
e080: 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e  alker, Select *N
e090: 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45  otUsed){.  UNUSE
e0a0: 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
e0b0: 73 65 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d  sed);.  pWalker-
e0c0: 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 72 65  >eCode = 0;.  re
e0d0: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
e0e0: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  }.static int exp
e0f0: 72 49 73 43 6f 6e 73 74 28 45 78 70 72 20 2a 70  rIsConst(Expr *p
e100: 2c 20 69 6e 74 20 69 6e 69 74 46 6c 61 67 2c 20  , int initFlag, 
e110: 69 6e 74 20 69 43 75 72 29 7b 0a 20 20 57 61 6c  int iCur){.  Wal
e120: 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28  ker w;.  memset(
e130: 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29  &w, 0, sizeof(w)
e140: 29 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 69  );.  w.eCode = i
e150: 6e 69 74 46 6c 61 67 3b 0a 20 20 77 2e 78 45 78  nitFlag;.  w.xEx
e160: 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70  prCallback = exp
e170: 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b  rNodeIsConstant;
e180: 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
e190: 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64  back = selectNod
e1a0: 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77  eIsConstant;.  w
e1b0: 2e 75 2e 69 43 75 72 20 3d 20 69 43 75 72 3b 0a  .u.iCur = iCur;.
e1c0: 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
e1d0: 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75  r(&w, p);.  retu
e1e0: 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f  rn w.eCode;.}../
e1f0: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
e200: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
e210: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
e220: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
e230: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
e240: 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f  and 0 if it invo
e250: 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f  lves variables o
e260: 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  r function calls
e270: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
e280: 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
e290: 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75   function, a dou
e2a0: 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  ble-quoted strin
e2b0: 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a  g (ex: "abc").**
e2c0: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
e2d0: 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20   variable but a 
e2e0: 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74  single-quoted st
e2f0: 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29  ring (ex: 'abc')
e300: 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e   is.** a constan
e310: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
e320: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
e330: 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  Expr *p){.  retu
e340: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
e350: 2c 20 31 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , 1, 0);.}../*.*
e360: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
e370: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
e380: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  rn non-zero if t
e390: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
e3a0: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 61   constant.** tha
e3b0: 74 20 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69 6e  t does no origin
e3c0: 61 74 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20  ate from the ON 
e3d0: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
e3e0: 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52   of a join..** R
e3f0: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 6e  eturn 0 if it in
e400: 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73  volves variables
e410: 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c   or function cal
e420: 6c 73 20 6f 72 20 74 65 72 6d 73 20 66 72 6f 6d  ls or terms from
e430: 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53 49  .** an ON or USI
e440: 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e  NG clause..*/.in
e450: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
e460: 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45  onstantNotJoin(E
e470: 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  xpr *p){.  retur
e480: 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c  n exprIsConst(p,
e490: 20 32 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   2, 0);.}../*.**
e4a0: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
e4b0: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
e4c0: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
e4d0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
e4e0: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20  constant.** for 
e4f0: 61 6e 79 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  any single row o
e500: 66 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  f the table with
e510: 20 63 75 72 73 6f 72 20 69 43 75 72 2e 20 20 49   cursor iCur.  I
e520: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
e530: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
e540: 20 6d 75 73 74 20 6e 6f 74 20 72 65 66 65 72 20   must not refer 
e550: 74 6f 20 61 6e 79 20 6e 6f 6e 2d 64 65 74 65 72  to any non-deter
e560: 6d 69 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f  ministic functio
e570: 6e 20 6e 6f 72 20 61 6e 79 0a 2a 2a 20 74 61 62  n nor any.** tab
e580: 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 69 43  le other than iC
e590: 75 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ur..*/.int sqlit
e5a0: 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e  e3ExprIsTableCon
e5b0: 73 74 61 6e 74 28 45 78 70 72 20 2a 70 2c 20 69  stant(Expr *p, i
e5c0: 6e 74 20 69 43 75 72 29 7b 0a 20 20 72 65 74 75  nt iCur){.  retu
e5d0: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
e5e0: 2c 20 33 2c 20 69 43 75 72 29 3b 0a 7d 0a 0a 2f  , 3, iCur);.}../
e5f0: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
e600: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
e610: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
e620: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
e630: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
e640: 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61  or a function ca
e650: 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74 61 6e 74  ll with constant
e660: 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74   arguments.  Ret
e670: 75 72 6e 20 61 6e 64 20 30 20 69 66 20 74 68 65  urn and 0 if the
e680: 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20 76 61  re.** are any va
e690: 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46  riables..**.** F
e6a0: 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
e6b0: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
e6c0: 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65  , a double-quote
e6d0: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61  d string (ex: "a
e6e0: 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  bc").** is consi
e6f0: 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65  dered a variable
e700: 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75   but a single-qu
e710: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
e720: 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20   'abc') is.** a 
e730: 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74  constant..*/.int
e740: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
e750: 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e  nstantOrFunction
e760: 28 45 78 70 72 20 2a 70 2c 20 75 38 20 69 73 49  (Expr *p, u8 isI
e770: 6e 69 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  nit){.  assert( 
e780: 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 69 73 49  isInit==0 || isI
e790: 6e 69 74 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75  nit==1 );.  retu
e7a0: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
e7b0: 2c 20 34 2b 69 73 49 6e 69 74 2c 20 30 29 3b 0a  , 4+isInit, 0);.
e7c0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
e7d0: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
e7e0: 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  INTS./*.** Walk 
e7f0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
e800: 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66  ee.  Return 1 if
e810: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
e820: 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 73 75  contains a.** su
e830: 62 71 75 65 72 79 20 6f 66 20 73 6f 6d 65 20 6b  bquery of some k
e840: 69 6e 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ind.  Return 0 i
e850: 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 73  f there are no s
e860: 75 62 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 69 6e  ubqueries..*/.in
e870: 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6e  t sqlite3ExprCon
e880: 74 61 69 6e 73 53 75 62 71 75 65 72 79 28 45 78  tainsSubquery(Ex
e890: 70 72 20 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72  pr *p){.  Walker
e8a0: 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c   w;.  memset(&w,
e8b0: 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a   0, sizeof(w));.
e8c0: 20 20 77 2e 65 43 6f 64 65 20 3d 20 31 3b 0a 20    w.eCode = 1;. 
e8d0: 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
e8e0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57 61   = sqlite3ExprWa
e8f0: 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 78 53 65 6c  lkNoop;.  w.xSel
e900: 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65  ectCallback = se
e910: 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61  lectNodeIsConsta
e920: 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  nt;.  sqlite3Wal
e930: 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20  kExpr(&w, p);.  
e940: 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3d 3d  return w.eCode==
e950: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
e960: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
e970: 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63  sion p codes a c
e980: 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20  onstant integer 
e990: 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  that is small en
e9a0: 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69  ough.** to fit i
e9b0: 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  n a 32-bit integ
e9c0: 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64  er, return 1 and
e9d0: 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f   put the value o
e9e0: 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  f the integer.**
e9f0: 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66   in *pValue.  If
ea00: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
ea10: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
ea20: 72 20 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f  r or if it is to
ea30: 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20  o big.** to fit 
ea40: 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62  in a signed 32-b
ea50: 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75  it integer, retu
ea60: 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a  rn 0 and leave *
ea70: 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64  pValue unchanged
ea80: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ea90: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 45 78  ExprIsInteger(Ex
eaa0: 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c  pr *p, int *pVal
eab0: 75 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ue){.  int rc = 
eac0: 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65  0;..  /* If an e
ead0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20  xpression is an 
eae0: 69 6e 74 65 67 65 72 20 6c 69 74 65 72 61 6c 20  integer literal 
eaf0: 74 68 61 74 20 66 69 74 73 20 69 6e 20 61 20 73  that fits in a s
eb00: 69 67 6e 65 64 20 33 32 2d 62 69 74 0a 20 20 2a  igned 32-bit.  *
eb10: 2a 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20  * integer, then 
eb20: 74 68 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20  the EP_IntValue 
eb30: 66 6c 61 67 20 77 69 6c 6c 20 68 61 76 65 20 61  flag will have a
eb40: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 74 20  lready been set 
eb50: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
eb60: 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c  op!=TK_INTEGER |
eb70: 7c 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45 50  | (p->flags & EP
eb80: 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 0a 20 20  _IntValue)!=0.  
eb90: 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
eba0: 74 65 33 47 65 74 49 6e 74 33 32 28 70 2d 3e 75  te3GetInt32(p->u
ebb0: 2e 7a 54 6f 6b 65 6e 2c 20 26 72 63 29 3d 3d 30  .zToken, &rc)==0
ebc0: 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 66 6c   );..  if( p->fl
ebd0: 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75  ags & EP_IntValu
ebe0: 65 20 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65  e ){.    *pValue
ebf0: 20 3d 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a   = p->u.iValue;.
ec00: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
ec10: 7d 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  }.  switch( p->o
ec20: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
ec30: 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20  _UPLUS: {.      
ec40: 72 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  rc = sqlite3Expr
ec50: 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65  IsInteger(p->pLe
ec60: 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20  ft, pValue);.   
ec70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ec80: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e      case TK_UMIN
ec90: 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  US: {.      int 
eca0: 76 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  v;.      if( sql
ecb0: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
ecc0: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20  r(p->pLeft, &v) 
ecd0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
ece0: 74 28 20 76 21 3d 28 2d 32 31 34 37 34 38 33 36  t( v!=(-21474836
ecf0: 34 37 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20  47-1) );.       
ed00: 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20   *pValue = -v;. 
ed10: 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
ed20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
ed30: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
ed40: 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20  fault: break;.  
ed50: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
ed60: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46  ../*.** Return F
ed70: 41 4c 53 45 20 69 66 20 74 68 65 72 65 20 69 73  ALSE if there is
ed80: 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20   no chance that 
ed90: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63  the expression c
eda0: 61 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  an be NULL..**.*
edb0: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
edc0: 69 6f 6e 20 6d 69 67 68 74 20 62 65 20 4e 55 4c  ion might be NUL
edd0: 4c 20 6f 72 20 69 66 20 74 68 65 20 65 78 70 72  L or if the expr
ede0: 65 73 73 69 6f 6e 20 69 73 20 74 6f 6f 20 63 6f  ession is too co
edf0: 6d 70 6c 65 78 0a 2a 2a 20 74 6f 20 74 65 6c 6c  mplex.** to tell
ee00: 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 0a   return TRUE.  .
ee10: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
ee20: 6e 65 20 69 73 20 75 73 65 64 20 61 73 20 61 6e  ne is used as an
ee30: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74   optimization, t
ee40: 6f 20 73 6b 69 70 20 4f 50 5f 49 73 4e 75 6c 6c  o skip OP_IsNull
ee50: 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 77 68 65 6e   opcodes.** when
ee60: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 20   we know that a 
ee70: 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20  value cannot be 
ee80: 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 61 20  NULL.  Hence, a 
ee90: 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 0a 2a  false positive.*
eea0: 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 54 52 55  * (returning TRU
eeb0: 45 20 77 68 65 6e 20 69 6e 20 66 61 63 74 20 74  E when in fact t
eec0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61  he expression ca
eed0: 6e 20 6e 65 76 65 72 20 62 65 20 4e 55 4c 4c 29  n never be NULL)
eee0: 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 61 20 73   might.** be a s
eef0: 6d 61 6c 6c 20 70 65 72 66 6f 72 6d 61 6e 63 65  mall performance
ef00: 20 68 69 74 20 62 75 74 20 69 73 20 6f 74 68 65   hit but is othe
ef10: 72 77 69 73 65 20 68 61 72 6d 6c 65 73 73 2e 20  rwise harmless. 
ef20: 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a   On the other.**
ef30: 20 68 61 6e 64 2c 20 61 20 66 61 6c 73 65 20 6e   hand, a false n
ef40: 65 67 61 74 69 76 65 20 28 72 65 74 75 72 6e 69  egative (returni
ef50: 6e 67 20 46 41 4c 53 45 20 77 68 65 6e 20 74 68  ng FALSE when th
ef60: 65 20 72 65 73 75 6c 74 20 63 6f 75 6c 64 20 62  e result could b
ef70: 65 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69 6c 6c 20  e NULL).** will 
ef80: 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e  likely result in
ef90: 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 61 6e   an incorrect an
efa0: 73 77 65 72 2e 20 20 53 6f 20 77 68 65 6e 20 69  swer.  So when i
efb0: 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 0a  n doubt, return.
efc0: 2a 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69 6e 74 20  ** TRUE..*/.int 
efd0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65  sqlite3ExprCanBe
efe0: 4e 75 6c 6c 28 63 6f 6e 73 74 20 45 78 70 72 20  Null(const Expr 
eff0: 2a 70 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20  *p){.  u8 op;.  
f000: 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  while( p->op==TK
f010: 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d  _UPLUS || p->op=
f020: 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20  =TK_UMINUS ){ p 
f030: 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20  = p->pLeft; }.  
f040: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66  op = p->op;.  if
f050: 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ( op==TK_REGISTE
f060: 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b  R ) op = p->op2;
f070: 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
f080: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
f090: 45 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20 54  EGER:.    case T
f0a0: 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 63 61  K_STRING:.    ca
f0b0: 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20  se TK_FLOAT:.   
f0c0: 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20   case TK_BLOB:. 
f0d0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
f0e0: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
f0f0: 4e 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  N:.      assert(
f100: 20 70 2d 3e 70 54 61 62 21 3d 30 20 29 3b 0a 20   p->pTab!=0 );. 
f110: 20 20 20 20 20 72 65 74 75 72 6e 20 45 78 70 72       return Expr
f120: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
f130: 50 5f 43 61 6e 42 65 4e 75 6c 6c 29 20 7c 7c 0a  P_CanBeNull) ||.
f140: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70 2d               (p-
f150: 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70  >iColumn>=0 && p
f160: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 2d 3e  ->pTab->aCol[p->
f170: 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c  iColumn].notNull
f180: 3d 3d 30 29 3b 0a 20 20 20 20 64 65 66 61 75 6c  ==0);.    defaul
f190: 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
f1a0: 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
f1b0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
f1c0: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
f1d0: 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  ion is a constan
f1e0: 74 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65  t which would be
f1f0: 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 62 79  .** unchanged by
f200: 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 77 69 74   OP_Affinity wit
f210: 68 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 67  h the affinity g
f220: 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63 6f  iven in the seco
f230: 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  nd.** argument..
f240: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
f250: 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  ne is used to de
f260: 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4f  termine if the O
f270: 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 65 72 61  P_Affinity opera
f280: 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 6f  tion.** can be o
f290: 6d 69 74 74 65 64 2e 20 20 57 68 65 6e 20 69 6e  mitted.  When in
f2a0: 20 64 6f 75 62 74 20 72 65 74 75 72 6e 20 46 41   doubt return FA
f2b0: 4c 53 45 2e 20 20 41 20 66 61 6c 73 65 20 6e 65  LSE.  A false ne
f2c0: 67 61 74 69 76 65 0a 2a 2a 20 69 73 20 68 61 72  gative.** is har
f2d0: 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c 73 65 20  mless.  A false 
f2e0: 70 6f 73 69 74 69 76 65 2c 20 68 6f 77 65 76 65  positive, howeve
f2f0: 72 2c 20 63 61 6e 20 72 65 73 75 6c 74 20 69 6e  r, can result in
f300: 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e   the wrong.** an
f310: 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  swer..*/.int sql
f320: 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41  ite3ExprNeedsNoA
f330: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 63 6f  ffinityChange(co
f340: 6e 73 74 20 45 78 70 72 20 2a 70 2c 20 63 68 61  nst Expr *p, cha
f350: 72 20 61 66 66 29 7b 0a 20 20 75 38 20 6f 70 3b  r aff){.  u8 op;
f360: 0a 20 20 69 66 28 20 61 66 66 3d 3d 53 51 4c 49  .  if( aff==SQLI
f370: 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 20 72 65  TE_AFF_BLOB ) re
f380: 74 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65 28  turn 1;.  while(
f390: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53   p->op==TK_UPLUS
f3a0: 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d   || p->op==TK_UM
f3b0: 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70  INUS ){ p = p->p
f3c0: 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70  Left; }.  op = p
f3d0: 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
f3e0: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
f3f0: 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69   = p->op2;.  swi
f400: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
f410: 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20  ase TK_INTEGER: 
f420: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  {.      return a
f430: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ff==SQLITE_AFF_I
f440: 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53  NTEGER || aff==S
f450: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
f460: 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  C;.    }.    cas
f470: 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  e TK_FLOAT: {.  
f480: 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d      return aff==
f490: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
f4a0: 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  || aff==SQLITE_A
f4b0: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20  FF_NUMERIC;.    
f4c0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  }.    case TK_ST
f4d0: 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 72 65  RING: {.      re
f4e0: 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45  turn aff==SQLITE
f4f0: 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d  _AFF_TEXT;.    }
f500: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
f510: 42 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  B: {.      retur
f520: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 1;.    }.    c
f530: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
f540: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
f550: 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b 20 20  ->iTable>=0 );  
f560: 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65 20 70  /* p cannot be p
f570: 61 72 74 20 6f 66 20 61 20 43 48 45 43 4b 20 63  art of a CHECK c
f580: 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
f590: 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 43 6f     return p->iCo
f5a0: 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20 20 20  lumn<0.         
f5b0: 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45   && (aff==SQLITE
f5c0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20  _AFF_INTEGER || 
f5d0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
f5e0: 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20 20 7d 0a  NUMERIC);.    }.
f5f0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
f600: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
f610: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
f620: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
f630: 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
f640: 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f  g is a row-id co
f650: 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e  lumn name..*/.in
f660: 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64  t sqlite3IsRowid
f670: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
f680: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
f690: 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44  rICmp(z, "_ROWID
f6a0: 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  _")==0 ) return 
f6b0: 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
f6c0: 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49  StrICmp(z, "ROWI
f6d0: 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  D")==0 ) return 
f6e0: 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
f6f0: 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22  StrICmp(z, "OID"
f700: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
f710: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
f720: 2f 2a 0a 2a 2a 20 70 58 20 69 73 20 74 68 65 20  /*.** pX is the 
f730: 52 48 53 20 6f 66 20 61 6e 20 49 4e 20 6f 70 65  RHS of an IN ope
f740: 72 61 74 6f 72 2e 20 20 49 66 20 70 58 20 69 73  rator.  If pX is
f750: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
f760: 65 6e 74 20 0a 2a 2a 20 74 68 61 74 20 63 61 6e  ent .** that can
f770: 20 62 65 20 73 69 6d 70 6c 69 66 69 65 64 20 74   be simplified t
f780: 6f 20 61 20 64 69 72 65 63 74 20 74 61 62 6c 65  o a direct table
f790: 20 61 63 63 65 73 73 2c 20 74 68 65 6e 20 72 65   access, then re
f7a0: 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65  turn.** a pointe
f7b0: 72 20 74 6f 20 74 68 65 20 53 45 4c 45 43 54 20  r to the SELECT 
f7c0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 66 20 70  statement.  If p
f7d0: 58 20 69 73 20 6e 6f 74 20 61 20 53 45 4c 45 43  X is not a SELEC
f7e0: 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20  T statement,.** 
f7f0: 6f 72 20 69 66 20 74 68 65 20 53 45 4c 45 43 54  or if the SELECT
f800: 20 73 74 61 74 65 6d 65 6e 74 20 6e 65 65 64 73   statement needs
f810: 20 74 6f 20 62 65 20 6d 61 6e 69 66 65 73 74 65   to be manifeste
f820: 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 69 65  d into a transie
f830: 6e 74 0a 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65  nt.** table, the
f840: 6e 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  n return NULL..*
f850: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
f860: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 73  _OMIT_SUBQUERY.s
f870: 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a 69 73  tatic Select *is
f880: 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
f890: 74 28 45 78 70 72 20 2a 70 58 29 7b 0a 20 20 53  t(Expr *pX){.  S
f8a0: 65 6c 65 63 74 20 2a 70 3b 0a 20 20 53 72 63 4c  elect *p;.  SrcL
f8b0: 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70  ist *pSrc;.  Exp
f8c0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
f8d0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
f8e0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 45 78  int i;.  if( !Ex
f8f0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
f900: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
f910: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
f920: 4e 6f 74 20 61 20 73 75 62 71 75 65 72 79 20 2a  Not a subquery *
f930: 2f 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  /.  if( ExprHasP
f940: 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 56  roperty(pX, EP_V
f950: 61 72 53 65 6c 65 63 74 29 20 20 29 20 72 65 74  arSelect)  ) ret
f960: 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 65  urn 0;  /* Corre
f970: 6c 61 74 65 64 20 73 75 62 71 20 2a 2f 0a 20 20  lated subq */.  
f980: 70 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63  p = pX->x.pSelec
f990: 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  t;.  if( p->pPri
f9a0: 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  or ) return 0;  
f9b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
f9c0: 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  ot a compound SE
f9d0: 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d  LECT */.  if( p-
f9e0: 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
f9f0: 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
fa00: 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20 74 65  egate) ){.    te
fa10: 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46  stcase( (p->selF
fa20: 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
fa30: 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
fa40: 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20  ))==SF_Distinct 
fa50: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
fa60: 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
fa70: 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
fa80: 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
fa90: 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20  Aggregate );.   
faa0: 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f   return 0; /* No
fab0: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
fac0: 64 20 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61  d and no aggrega
fad0: 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
fae0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
faf0: 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20  >pGroupBy==0 ); 
fb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fb10: 48 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  Has no GROUP BY 
fb20: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20  clause */.  if( 
fb30: 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
fb40: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
fb50: 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d     /* Has no LIM
fb60: 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 61  IT clause */.  a
fb70: 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65  ssert( p->pOffse
fb80: 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  t==0 );         
fb90: 20 20 20 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49        /* No LIMI
fba0: 54 20 6d 65 61 6e 73 20 6e 6f 20 4f 46 46 53 45  T means no OFFSE
fbb0: 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57  T */.  if( p->pW
fbc0: 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b  here ) return 0;
fbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fbe0: 20 48 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c   Has no WHERE cl
fbf0: 61 75 73 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d  ause */.  pSrc =
fc00: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65   p->pSrc;.  asse
fc10: 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20  rt( pSrc!=0 );. 
fc20: 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21   if( pSrc->nSrc!
fc30: 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =1 ) return 0;  
fc40: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c          /* Singl
fc50: 65 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63  e term in FROM c
fc60: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  lause */.  if( p
fc70: 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
fc80: 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
fc90: 20 20 2f 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74    /* FROM is not
fca0: 20 61 20 73 75 62 71 75 65 72 79 20 6f 72 20 76   a subquery or v
fcb0: 69 65 77 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20  iew */.  pTab = 
fcc0: 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
fcd0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21  .  assert( pTab!
fce0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
fcf0: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  pTab->pSelect==0
fd00: 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   );            /
fd10: 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  * FROM clause is
fd20: 20 6e 6f 74 20 61 20 76 69 65 77 20 2a 2f 0a 20   not a view */. 
fd30: 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
fd40: 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b  Tab) ) return 0;
fd50: 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20          /* FROM 
fd60: 63 6c 61 75 73 65 20 6e 6f 74 20 61 20 76 69 72  clause not a vir
fd70: 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  tual table */.  
fd80: 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
fd90: 73 74 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 20 53 45  st;..  /* All SE
fda0: 4c 45 43 54 20 72 65 73 75 6c 74 73 20 6d 75 73  LECT results mus
fdb0: 74 20 62 65 20 63 6f 6c 75 6d 6e 73 2e 20 2a 2f  t be columns. */
fdc0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
fdd0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
fde0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 65  ){.    Expr *pRe
fdf0: 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  s = pEList->a[i]
fe00: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
fe10: 70 52 65 73 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  pRes->op!=TK_COL
fe20: 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  UMN ) return 0;.
fe30: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73      assert( pRes
fe40: 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e  ->iTable==pSrc->
fe50: 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 29 3b 20  a[0].iCursor ); 
fe60: 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c   /* Not a correl
fe70: 61 74 65 64 20 73 75 62 71 75 65 72 79 20 2a 2f  ated subquery */
fe80: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
fe90: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
fea0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
feb0: 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65  Y */../*.** Code
fec0: 20 61 6e 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74   an OP_Once inst
fed0: 72 75 63 74 69 6f 6e 20 61 6e 64 20 61 6c 6c 6f  ruction and allo
fee0: 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 69  cate space for i
fef0: 74 73 20 66 6c 61 67 2e 20 52 65 74 75 72 6e 20  ts flag. Return 
ff00: 74 68 65 20 0a 2a 2a 20 61 64 64 72 65 73 73 20  the .** address 
ff10: 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72  of the new instr
ff20: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  uction..*/.int s
ff30: 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 50  qlite3CodeOnce(P
ff40: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
ff50: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
ff60: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
ff70: 29 3b 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75  );      /* Virtu
ff80: 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67  al machine being
ff90: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 72 65 74 75   coded */.  retu
ffa0: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
ffb0: 64 4f 70 31 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c  dOp1(v, OP_Once,
ffc0: 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 2b 2b   pParse->nOnce++
ffd0: 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
ffe0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
fff0: 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  RY./*.** Generat
10000 65 20 63 6f 64 65 20 74 68 61 74 20 63 68 65 63  e code that chec
10010 6b 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ks the left-most
10020 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78   column of index
10030 20 74 61 62 6c 65 20 69 43 75 72 20 74 6f 20 73   table iCur to s
10040 65 65 20 69 66 0a 2a 2a 20 69 74 20 63 6f 6e 74  ee if.** it cont
10050 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 65 6e  ains any NULL en
10060 74 72 69 65 73 2e 20 20 43 61 75 73 65 20 74 68  tries.  Cause th
10070 65 20 72 65 67 69 73 74 65 72 20 61 74 20 72 65  e register at re
10080 67 48 61 73 4e 75 6c 6c 20 74 6f 20 62 65 20 73  gHasNull to be s
10090 65 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 4e  et.** to a non-N
100a0 55 4c 4c 20 76 61 6c 75 65 20 69 66 20 69 43 75  ULL value if iCu
100b0 72 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55  r contains no NU
100c0 4c 4c 73 2e 20 20 43 61 75 73 65 20 72 65 67 69  LLs.  Cause regi
100d0 73 74 65 72 20 72 65 67 48 61 73 4e 75 6c 6c 0a  ster regHasNull.
100e0 2a 2a 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20  ** to be set to 
100f0 4e 55 4c 4c 20 69 66 20 69 43 75 72 20 63 6f 6e  NULL if iCur con
10100 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
10110 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a  e NULL values..*
10120 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
10130 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46  lite3SetHasNullF
10140 6c 61 67 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  lag(Vdbe *v, int
10150 20 69 43 75 72 2c 20 69 6e 74 20 72 65 67 48 61   iCur, int regHa
10160 73 4e 75 6c 6c 29 7b 0a 20 20 69 6e 74 20 61 64  sNull){.  int ad
10170 64 72 31 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  dr1;.  sqlite3Vd
10180 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
10190 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 48 61  nteger, 0, regHa
101a0 73 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72 31 20  sNull);.  addr1 
101b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
101c0 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op1(v, OP_Rewind
101d0 2c 20 69 43 75 72 29 3b 20 56 64 62 65 43 6f 76  , iCur); VdbeCov
101e0 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
101f0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
10200 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43 75 72   OP_Column, iCur
10210 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29  , 0, regHasNull)
10220 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
10230 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
10240 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20  G_TYPEOFARG);.  
10250 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
10260 22 66 69 72 73 74 5f 65 6e 74 72 79 5f 69 6e 28  "first_entry_in(
10270 25 64 29 22 2c 20 69 43 75 72 29 29 3b 0a 20 20  %d)", iCur));.  
10280 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
10290 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 7d  ere(v, addr1);.}
102a0 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65  .#endif...#ifnde
102b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
102c0 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 65  BQUERY./*.** The
102d0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
102e0 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  IN operator with
102f0 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73   a list (not a s
10300 75 62 71 75 65 72 79 29 20 6f 6e 20 74 68 65 20  ubquery) on the 
10310 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73  .** right-hand s
10320 69 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ide.  Return TRU
10330 45 20 69 66 20 74 68 61 74 20 6c 69 73 74 20 69  E if that list i
10340 73 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 73  s constant..*/.s
10350 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
10360 33 49 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74  3InRhsIsConstant
10370 28 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 45  (Expr *pIn){.  E
10380 78 70 72 20 2a 70 4c 48 53 3b 0a 20 20 69 6e 74  xpr *pLHS;.  int
10390 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20   res;.  assert( 
103a0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
103b0 28 70 49 6e 2c 20 45 50 5f 78 49 73 53 65 6c 65  (pIn, EP_xIsSele
103c0 63 74 29 20 29 3b 0a 20 20 70 4c 48 53 20 3d 20  ct) );.  pLHS = 
103d0 70 49 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20 70 49  pIn->pLeft;.  pI
103e0 6e 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20  n->pLeft = 0;.  
103f0 72 65 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70  res = sqlite3Exp
10400 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 49 6e 29  rIsConstant(pIn)
10410 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d  ;.  pIn->pLeft =
10420 20 70 4c 48 53 3b 0a 20 20 72 65 74 75 72 6e 20   pLHS;.  return 
10430 72 65 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  res;.}.#endif../
10440 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
10450 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20 74 68  on is used by th
10460 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
10470 20 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e 29   of the IN (...)
10480 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 54 68   operator..** Th
10490 65 20 70 58 20 70 61 72 61 6d 65 74 65 72 20 69  e pX parameter i
104a0 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  s the expression
104b0 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74   on the RHS of t
104c0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20  he IN operator, 
104d0 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62  which.** might b
104e0 65 20 65 69 74 68 65 72 20 61 20 6c 69 73 74 20  e either a list 
104f0 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  of expressions o
10500 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a  r a subquery..**
10510 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74  .** The job of t
10520 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
10530 6f 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65  o find or create
10540 20 61 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74   a b-tree object
10550 20 74 68 61 74 20 63 61 6e 0a 2a 2a 20 62 65 20   that can.** be 
10560 75 73 65 64 20 65 69 74 68 65 72 20 74 6f 20 74  used either to t
10570 65 73 74 20 66 6f 72 20 6d 65 6d 62 65 72 73 68  est for membersh
10580 69 70 20 69 6e 20 74 68 65 20 52 48 53 20 73 65  ip in the RHS se
10590 74 20 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20  t or to iterate 
105a0 74 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20 6d  through.** all m
105b0 65 6d 62 65 72 73 20 6f 66 20 74 68 65 20 52 48  embers of the RH
105c0 53 20 73 65 74 2c 20 73 6b 69 70 70 69 6e 67 20  S set, skipping 
105d0 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a  duplicates..**.*
105e0 2a 20 41 20 63 75 72 73 6f 72 20 69 73 20 6f 70  * A cursor is op
105f0 65 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d 74 72  ened on the b-tr
10600 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69  ee object that i
10610 73 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  s the RHS of the
10620 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20   IN operator.** 
10630 61 6e 64 20 70 58 2d 3e 69 54 61 62 6c 65 20 69  and pX->iTable i
10640 73 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  s set to the ind
10650 65 78 20 6f 66 20 74 68 61 74 20 63 75 72 73 6f  ex of that curso
10660 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  r..**.** The ret
10670 75 72 6e 65 64 20 76 61 6c 75 65 20 6f 66 20 74  urned value of t
10680 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64  his function ind
10690 69 63 61 74 65 73 20 74 68 65 20 62 2d 74 72 65  icates the b-tre
106a0 65 20 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f  e type, as follo
106b0 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49  ws:.**.**   IN_I
106c0 4e 44 45 58 5f 52 4f 57 49 44 20 20 20 20 20 20  NDEX_ROWID      
106d0 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73  - The cursor was
106e0 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74   opened on a dat
106f0 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20  abase table..** 
10700 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58    IN_INDEX_INDEX
10710 5f 41 53 43 20 20 2d 20 54 68 65 20 63 75 72 73  _ASC  - The curs
10720 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
10730 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e   an ascending in
10740 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  dex..**   IN_IND
10750 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 2d 20  EX_INDEX_DESC - 
10760 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
10770 70 65 6e 65 64 20 6f 6e 20 61 20 64 65 73 63 65  pened on a desce
10780 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20  nding index..** 
10790 20 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20 20    IN_INDEX_EPH  
107a0 20 20 20 20 20 20 2d 20 54 68 65 20 63 75 72 73        - The curs
107b0 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
107c0 20 61 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65   a specially cre
107d0 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20  ated and.**     
107e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107f0 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20 65 70      populated ep
10800 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a  heremal table..*
10810 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  *   IN_INDEX_NOO
10820 50 20 20 20 20 20 20 20 2d 20 4e 6f 20 63 75 72  P       - No cur
10830 73 6f 72 20 77 61 73 20 61 6c 6c 6f 63 61 74 65  sor was allocate
10840 64 2e 20 20 54 68 65 20 49 4e 20 6f 70 65 72 61  d.  The IN opera
10850 74 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 20  tor must be.**  
10860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10870 20 20 20 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74         implement
10880 65 64 20 61 73 20 61 20 73 65 71 75 65 6e 63 65  ed as a sequence
10890 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e   of comparisons.
108a0 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69  .**.** An existi
108b0 6e 67 20 62 2d 74 72 65 65 20 6d 69 67 68 74 20  ng b-tree might 
108c0 62 65 20 75 73 65 64 20 69 66 20 74 68 65 20 52  be used if the R
108d0 48 53 20 65 78 70 72 65 73 73 69 6f 6e 20 70 58  HS expression pX
108e0 20 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20   is a simple.** 
108f0 73 75 62 71 75 65 72 79 20 73 75 63 68 20 61 73  subquery such as
10900 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
10910 43 54 20 3c 63 6f 6c 75 6d 6e 31 3e 2c 20 3c 63  CT <column1>, <c
10920 6f 6c 75 6d 6e 32 3e 2e 2e 2e 20 46 52 4f 4d 20  olumn2>... FROM 
10930 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66  <table>.**.** If
10940 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
10950 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61  IN operator is a
10960 20 6c 69 73 74 20 6f 72 20 61 20 6d 6f 72 65 20   list or a more 
10970 63 6f 6d 70 6c 65 78 20 73 75 62 71 75 65 72 79  complex subquery
10980 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 65 70 68  , then.** an eph
10990 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6d 69 67  emeral table mig
109a0 68 74 20 6e 65 65 64 20 74 6f 20 62 65 20 67 65  ht need to be ge
109b0 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65  nerated from the
109c0 20 52 48 53 20 61 6e 64 20 74 68 65 6e 0a 2a 2a   RHS and then.**
109d0 20 70 58 2d 3e 69 54 61 62 6c 65 20 6d 61 64 65   pX->iTable made
109e0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
109f0 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
10a00 20 69 6e 73 74 65 61 64 20 6f 66 20 61 6e 0a 2a   instead of an.*
10a10 2a 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65  * existing table
10a20 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 46 6c  ..**.** The inFl
10a30 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 6d 75  ags parameter mu
10a40 73 74 20 63 6f 6e 74 61 69 6e 20 65 78 61 63 74  st contain exact
10a50 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 69  ly one of the bi
10a60 74 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d  ts.** IN_INDEX_M
10a70 45 4d 42 45 52 53 48 49 50 20 6f 72 20 49 4e 5f  EMBERSHIP or IN_
10a80 49 4e 44 45 58 5f 4c 4f 4f 50 2e 20 20 49 66 20  INDEX_LOOP.  If 
10a90 69 6e 46 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73  inFlags contains
10aa0 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d  .** IN_INDEX_MEM
10ab0 42 45 52 53 48 49 50 2c 20 74 68 65 6e 20 74 68  BERSHIP, then th
10ac0 65 20 67 65 6e 65 72 61 74 65 64 20 74 61 62 6c  e generated tabl
10ad0 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66  e will be used f
10ae0 6f 72 20 61 0a 2a 2a 20 66 61 73 74 20 6d 65 6d  or a.** fast mem
10af0 62 65 72 73 68 69 70 20 74 65 73 74 2e 20 20 57  bership test.  W
10b00 68 65 6e 20 74 68 65 20 49 4e 5f 49 4e 44 45 58  hen the IN_INDEX
10b10 5f 4c 4f 4f 50 20 62 69 74 20 69 73 20 73 65 74  _LOOP bit is set
10b20 2c 20 74 68 65 0a 2a 2a 20 49 4e 20 69 6e 64 65  , the.** IN inde
10b30 78 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  x will be used t
10b40 6f 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20  o loop over all 
10b50 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 52 48  values of the RH
10b60 53 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 20 6f  S of the.** IN o
10b70 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57  perator..**.** W
10b80 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f  hen IN_INDEX_LOO
10b90 50 20 69 73 20 75 73 65 64 20 28 61 6e 64 20 74  P is used (and t
10ba0 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62  he b-tree will b
10bb0 65 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74  e used to iterat
10bc0 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74 68 65  e.** through the
10bd0 20 73 65 74 20 6d 65 6d 62 65 72 73 29 20 74 68   set members) th
10be0 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75  en the b-tree mu
10bf0 73 74 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 64  st not contain d
10c00 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 20 41 6e  uplicates..** An
10c10 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65   epheremal table
10c20 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 75 6e   must be used un
10c30 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63 74 65  less the selecte
10c40 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 67 75  d columns are gu
10c50 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62  aranteed.** to b
10c60 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74 68 65  e unique - eithe
10c70 72 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  r because it is 
10c80 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
10c90 52 59 20 4b 45 59 20 6f 72 20 64 75 65 20 74 6f  RY KEY or due to
10ca0 0a 2a 2a 20 61 20 55 4e 49 51 55 45 20 63 6f 6e  .** a UNIQUE con
10cb0 73 74 72 61 69 6e 74 20 6f 72 20 69 6e 64 65 78  straint or index
10cc0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f  ..**.** When IN_
10cd0 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50  INDEX_MEMBERSHIP
10ce0 20 69 73 20 75 73 65 64 20 28 61 6e 64 20 74 68   is used (and th
10cf0 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65  e b-tree will be
10d00 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61   used .** for fa
10d10 73 74 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69  st set membershi
10d20 70 20 74 65 73 74 73 29 20 74 68 65 6e 20 61 6e  p tests) then an
10d30 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65   epheremal table
10d40 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65   must .** be use
10d50 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e  d unless <column
10d60 73 3e 20 69 73 20 61 20 73 69 6e 67 6c 65 20 49  s> is a single I
10d70 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
10d80 45 59 20 63 6f 6c 75 6d 6e 20 6f 72 20 61 6e 20  EY column or an 
10d90 0a 2a 2a 20 69 6e 64 65 78 20 63 61 6e 20 62 65  .** index can be
10da0 20 66 6f 75 6e 64 20 77 69 74 68 20 74 68 65 20   found with the 
10db0 73 70 65 63 69 66 69 65 64 20 3c 63 6f 6c 75 6d  specified <colum
10dc0 6e 73 3e 20 61 73 20 69 74 73 20 6c 65 66 74 2d  ns> as its left-
10dd0 6d 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  most..**.** If t
10de0 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  he IN_INDEX_NOOP
10df0 5f 4f 4b 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58  _OK and IN_INDEX
10e00 5f 4d 45 4d 42 45 52 53 48 49 50 20 61 72 65 20  _MEMBERSHIP are 
10e10 62 6f 74 68 20 73 65 74 20 61 6e 64 0a 2a 2a 20  both set and.** 
10e20 69 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  if the RHS of th
10e30 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73  e IN operator is
10e40 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73   a list (not a s
10e50 75 62 71 75 65 72 79 29 20 74 68 65 6e 20 74 68  ubquery) then th
10e60 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6d 69  is.** routine mi
10e70 67 68 74 20 64 65 63 69 64 65 20 74 68 61 74 20  ght decide that 
10e80 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70 68 65  creating an ephe
10e90 6d 65 72 61 6c 20 62 2d 74 72 65 65 20 66 6f 72  meral b-tree for
10ea0 20 6d 65 6d 62 65 72 73 68 69 70 0a 2a 2a 20 74   membership.** t
10eb0 65 73 74 69 6e 67 20 69 73 20 74 6f 6f 20 65 78  esting is too ex
10ec0 70 65 6e 73 69 76 65 20 61 6e 64 20 72 65 74 75  pensive and retu
10ed0 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  rn IN_INDEX_NOOP
10ee0 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  .  In that case,
10ef0 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   the.** calling 
10f00 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 69  routine should i
10f10 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 4e 20  mplement the IN 
10f20 6f 70 65 72 61 74 6f 72 20 75 73 69 6e 67 20 61  operator using a
10f30 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 6f 66 20   sequence.** of 
10f40 45 71 20 6f 72 20 4e 65 20 63 6f 6d 70 61 72 69  Eq or Ne compari
10f50 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a  son operations..
10f60 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 62  **.** When the b
10f70 2d 74 72 65 65 20 69 73 20 62 65 69 6e 67 20 75  -tree is being u
10f80 73 65 64 20 66 6f 72 20 6d 65 6d 62 65 72 73 68  sed for membersh
10f90 69 70 20 74 65 73 74 73 2c 20 74 68 65 20 63 61  ip tests, the ca
10fa0 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a  lling function.*
10fb0 2a 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  * might need to 
10fc0 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20  know whether or 
10fd0 6e 6f 74 20 74 68 65 20 52 48 53 20 73 69 64 65  not the RHS side
10fe0 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
10ff0 74 6f 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  tor.** contains 
11000 61 20 4e 55 4c 4c 2e 20 20 49 66 20 70 72 52 68  a NULL.  If prRh
11010 73 48 61 73 4e 75 6c 6c 20 69 73 20 6e 6f 74 20  sHasNull is not 
11020 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61  a NULL pointer a
11030 6e 64 20 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  nd .** if there 
11040 69 73 20 61 6e 79 20 63 68 61 6e 63 65 20 74 68  is any chance th
11050 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d 69 67  at the (...) mig
11060 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c  ht contain a NUL
11070 4c 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20 72 75  L value at.** ru
11080 6e 74 69 6d 65 2c 20 74 68 65 6e 20 61 20 72 65  ntime, then a re
11090 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61  gister is alloca
110a0 74 65 64 20 61 6e 64 20 74 68 65 20 72 65 67 69  ted and the regi
110b0 73 74 65 72 20 6e 75 6d 62 65 72 20 77 72 69 74  ster number writ
110c0 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52 68 73  ten.** to *prRhs
110d0 48 61 73 4e 75 6c 6c 2e 20 49 66 20 74 68 65 72  HasNull. If ther
110e0 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74  e is no chance t
110f0 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 63 6f  hat the (...) co
11100 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c  ntains a.** NULL
11110 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a 70 72   value, then *pr
11120 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6c 65  RhsHasNull is le
11130 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  ft unchanged..**
11140 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74 65  .** If a registe
11150 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  r is allocated a
11160 6e 64 20 69 74 73 20 6c 6f 63 61 74 69 6f 6e 20  nd its location 
11170 73 74 6f 72 65 64 20 69 6e 20 2a 70 72 52 68 73  stored in *prRhs
11180 48 61 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a 2a 2a  HasNull, then.**
11190 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68   the value in th
111a0 61 74 20 72 65 67 69 73 74 65 72 20 77 69 6c 6c  at register will
111b0 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   be NULL if the 
111c0 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e 73 20  b-tree contains 
111d0 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 4e  one or more.** N
111e0 55 4c 4c 20 76 61 6c 75 65 73 2c 20 61 6e 64 20  ULL values, and 
111f0 69 74 20 77 69 6c 6c 20 62 65 20 73 6f 6d 65 20  it will be some 
11200 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69  non-NULL value i
11210 66 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e  f the b-tree con
11220 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55 4c 4c  tains no.** NULL
11230 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 49   values..**.** I
11240 66 20 74 68 65 20 61 69 4d 61 70 20 70 61 72 61  f the aiMap para
11250 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c  meter is not NUL
11260 4c 2c 20 69 74 20 6d 75 73 74 20 70 6f 69 6e 74  L, it must point
11270 20 74 6f 20 61 6e 20 61 72 72 61 79 20 63 6f 6e   to an array con
11280 74 61 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65 20 65  taining.** one e
11290 6c 65 6d 65 6e 74 20 66 6f 72 20 65 61 63 68 20  lement for each 
112a0 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65 64 20  column returned 
112b0 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  by the SELECT st
112c0 61 74 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20 52  atement on the R
112d0 48 53 0a 2a 2a 20 6f 66 20 74 68 65 20 49 4e 28  HS.** of the IN(
112e0 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 20 54  ...) operator. T
112f0 68 65 20 69 27 74 68 20 65 6e 74 72 79 20 6f 66  he i'th entry of
11300 20 74 68 65 20 61 72 72 61 79 20 69 73 20 70 6f   the array is po
11310 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65  pulated with the
11320 0a 2a 2a 20 6f 66 66 73 65 74 20 6f 66 20 74 68  .** offset of th
11330 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74  e index column t
11340 68 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 20  hat matches the 
11350 69 27 74 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75  i'th column retu
11360 72 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 53  rned by the.** S
11370 45 4c 45 43 54 2e 20 46 6f 72 20 65 78 61 6d 70  ELECT. For examp
11380 6c 65 2c 20 69 66 20 74 68 65 20 65 78 70 72 65  le, if the expre
11390 73 73 69 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74  ssion and select
113a0 65 64 20 69 6e 64 65 78 20 61 72 65 3a 0a 2a 2a  ed index are:.**
113b0 0a 2a 2a 20 20 20 28 3f 2c 3f 2c 3f 29 20 49 4e  .**   (?,?,?) IN
113c0 20 28 53 45 4c 45 43 54 20 61 2c 20 62 2c 20 63   (SELECT a, b, c
113d0 20 46 52 4f 4d 20 74 31 29 0a 2a 2a 20 20 20 43   FROM t1).**   C
113e0 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
113f0 4e 20 74 31 28 62 2c 20 63 2c 20 61 29 3b 0a 2a  N t1(b, c, a);.*
11400 2a 0a 2a 2a 20 74 68 65 6e 20 61 69 4d 61 70 5b  *.** then aiMap[
11410 5d 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  ] is populated w
11420 69 74 68 20 7b 32 2c 20 30 2c 20 31 7d 2e 0a 2a  ith {2, 0, 1}..*
11430 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
11440 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69  _OMIT_SUBQUERY.i
11450 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  nt sqlite3FindIn
11460 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a  Index(.  Parse *
11470 70 50 61 72 73 65 2c 20 0a 20 20 45 78 70 72 20  pParse, .  Expr 
11480 2a 70 58 2c 20 0a 20 20 75 33 32 20 69 6e 46 6c  *pX, .  u32 inFl
11490 61 67 73 2c 20 0a 20 20 69 6e 74 20 2a 70 72 52  ags, .  int *prR
114a0 68 73 48 61 73 4e 75 6c 6c 2c 0a 20 20 69 6e 74  hsHasNull,.  int
114b0 20 2a 61 69 4d 61 70 0a 29 7b 0a 20 20 53 65 6c   *aiMap.){.  Sel
114c0 65 63 74 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ect *p;         
114d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114e0 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 74 6f 20     /* SELECT to 
114f0 74 68 65 20 72 69 67 68 74 20 6f 66 20 49 4e 20  the right of IN 
11500 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  operator */.  in
11510 74 20 65 54 79 70 65 20 3d 20 30 3b 20 20 20 20  t eType = 0;    
11520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11530 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 52      /* Type of R
11540 48 53 20 74 61 62 6c 65 2e 20 49 4e 5f 49 4e 44  HS table. IN_IND
11550 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 54  EX_* */.  int iT
11560 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
11570 62 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20  b++;            
11580 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20 74 68 65  /* Cursor of the
11590 20 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20   RHS table */.  
115a0 69 6e 74 20 6d 75 73 74 42 65 55 6e 69 71 75 65  int mustBeUnique
115b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
115c0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
115d0 20 52 48 53 20 6d 75 73 74 20 62 65 20 75 6e 69   RHS must be uni
115e0 71 75 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  que */.  Vdbe *v
115f0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
11600 65 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f  e(pParse);     /
11610 2a 20 56 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * Virtual machin
11620 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  e being coded */
11630 0a 0a 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e  ..  assert( pX->
11640 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 6d  op==TK_IN );.  m
11650 75 73 74 42 65 55 6e 69 71 75 65 20 3d 20 28 69  ustBeUnique = (i
11660 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45  nFlags & IN_INDE
11670 58 5f 4c 4f 4f 50 29 21 3d 30 3b 0a 0a 20 20 2f  X_LOOP)!=0;..  /
11680 2a 20 49 66 20 74 68 65 20 52 48 53 20 6f 66 20  * If the RHS of 
11690 74 68 69 73 20 49 4e 28 2e 2e 2e 29 20 6f 70 65  this IN(...) ope
116a0 72 61 74 6f 72 20 69 73 20 61 20 53 45 4c 45 43  rator is a SELEC
116b0 54 2c 20 61 6e 64 20 69 66 20 69 74 20 6d 61 74  T, and if it mat
116c0 74 65 72 73 20 0a 20 20 2a 2a 20 77 68 65 74 68  ters .  ** wheth
116d0 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 53 45  er or not the SE
116e0 4c 45 43 54 20 72 65 73 75 6c 74 20 63 6f 6e 74  LECT result cont
116f0 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73  ains NULL values
11700 2c 20 63 68 65 63 6b 20 77 68 65 74 68 65 72 0a  , check whether.
11710 20 20 2a 2a 20 6f 72 20 6e 6f 74 20 4e 55 4c 4c    ** or not NULL
11720 20 69 73 20 61 63 74 75 61 6c 6c 79 20 70 6f 73   is actually pos
11730 73 69 62 6c 65 20 28 69 74 20 6d 61 79 20 6e 6f  sible (it may no
11740 74 20 62 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c  t be, for exampl
11750 65 2c 20 64 75 65 20 0a 20 20 2a 2a 20 74 6f 20  e, due .  ** to 
11760 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61  NOT NULL constra
11770 69 6e 74 73 20 69 6e 20 74 68 65 20 73 63 68 65  ints in the sche
11780 6d 61 29 2e 20 49 66 20 6e 6f 20 4e 55 4c 4c 20  ma). If no NULL 
11790 76 61 6c 75 65 73 20 61 72 65 20 70 6f 73 73 69  values are possi
117a0 62 6c 65 2c 0a 20 20 2a 2a 20 73 65 74 20 70 72  ble,.  ** set pr
117b0 52 68 73 48 61 73 4e 75 6c 6c 20 74 6f 20 30 20  RhsHasNull to 0 
117c0 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e  before continuin
117d0 67 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 52  g.  */.  if( prR
117e0 68 73 48 61 73 4e 75 6c 6c 20 26 26 20 28 70 58  hsHasNull && (pX
117f0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73  ->flags & EP_xIs
11800 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 69  Select) ){.    i
11810 6e 74 20 69 3b 0a 20 20 20 20 45 78 70 72 4c 69  nt i;.    ExprLi
11820 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 58 2d  st *pEList = pX-
11830 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
11840 73 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  st;.    for(i=0;
11850 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
11860 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
11870 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e  ( sqlite3ExprCan
11880 42 65 4e 75 6c 6c 28 70 45 4c 69 73 74 2d 3e 61  BeNull(pEList->a
11890 5b 69 5d 2e 70 45 78 70 72 29 20 29 20 62 72 65  [i].pExpr) ) bre
118a0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
118b0 28 20 69 3d 3d 70 45 4c 69 73 74 2d 3e 6e 45 78  ( i==pEList->nEx
118c0 70 72 20 29 7b 0a 20 20 20 20 20 20 70 72 52 68  pr ){.      prRh
118d0 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20  sHasNull = 0;.  
118e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68    }.  }..  /* Ch
118f0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e  eck to see if an
11900 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20   existing table 
11910 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20  or index can be 
11920 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 73 61 74  used to.  ** sat
11930 69 73 66 79 20 74 68 65 20 71 75 65 72 79 2e 20  isfy the query. 
11940 20 54 68 69 73 20 69 73 20 70 72 65 66 65 72 61   This is prefera
11950 62 6c 65 20 74 6f 20 67 65 6e 65 72 61 74 69 6e  ble to generatin
11960 67 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20 65 70  g a new .  ** ep
11970 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 20  hemeral table.  
11980 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
11990 3e 6e 45 72 72 3d 3d 30 20 26 26 20 28 70 20 3d  >nErr==0 && (p =
119a0 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
119b0 6e 4f 70 74 28 70 58 29 29 21 3d 30 20 29 7b 0a  nOpt(pX))!=0 ){.
119c0 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
119d0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
119e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
119f0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
11a00 6e 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a  n */.    Table *
11a10 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
11a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a30 2f 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c 65 3e  /* Table <table>
11a40 2e 20 2a 2f 0a 20 20 20 20 69 31 36 20 69 44 62  . */.    i16 iDb
11a50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a70 2f 2a 20 44 61 74 61 62 61 73 65 20 69 64 78 20  /* Database idx 
11a80 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 20 20  for pTab */.    
11a90 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
11aa0 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
11ab0 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 45    int nExpr = pE
11ac0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20  List->nExpr;..  
11ad0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
11ae0 69 73 74 21 3d 30 20 29 3b 20 20 20 20 20 20 20  ist!=0 );       
11af0 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65        /* Because
11b00 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46   of isCandidateF
11b10 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20  orInOpt(p) */.  
11b20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
11b30 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21  ist->a[0].pExpr!
11b40 3d 30 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65  =0 ); /* Because
11b50 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46   of isCandidateF
11b60 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20  orInOpt(p) */.  
11b70 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 72    assert( p->pSr
11b80 63 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  c!=0 );         
11b90 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65        /* Because
11ba0 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46   of isCandidateF
11bb0 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20  orInOpt(p) */.  
11bc0 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63    pTab = p->pSrc
11bd0 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20  ->a[0].pTab;..  
11be0 20 20 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f    /* Code an OP_
11bf0 54 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  Transaction and 
11c00 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72  OP_TableLock for
11c10 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20   <table>. */.   
11c20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
11c30 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
11c40 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
11c50 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
11c60 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
11c70 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71  se, iDb);.    sq
11c80 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
11c90 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
11ca0 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
11cb0 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a  >zName);..    /*
11cc0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
11cd0 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72  s only called fr
11ce0 6f 6d 20 74 77 6f 20 70 6c 61 63 65 73 2e 20 49  om two places. I
11cf0 6e 20 62 6f 74 68 20 63 61 73 65 73 20 74 68 65  n both cases the
11d00 20 76 64 62 65 0a 20 20 20 20 2a 2a 20 68 61 73   vdbe.    ** has
11d10 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
11d20 6c 6f 63 61 74 65 64 2e 20 53 6f 20 61 73 73 75  located. So assu
11d30 6d 65 20 73 71 6c 69 74 65 33 47 65 74 56 64 62  me sqlite3GetVdb
11d40 65 28 29 20 69 73 20 61 6c 77 61 79 73 0a 20 20  e() is always.  
11d50 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20    ** successful 
11d60 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  here..    */.   
11d70 20 61 73 73 65 72 74 28 76 29 3b 0a 20 20 20 20   assert(v);.    
11d80 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 26 26 20  if( nExpr==1 && 
11d90 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
11da0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  pr->iColumn<0 ){
11db0 0a 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72  .      int iAddr
11dc0 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e   = sqlite3CodeOn
11dd0 63 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ce(pParse);.    
11de0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
11df0 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
11e00 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
11e10 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54  e, iTab, iDb, pT
11e20 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
11e30 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d 20  ;.      eType = 
11e40 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a  IN_INDEX_ROWID;.
11e50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11e60 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41  beJumpHere(v, iA
11e70 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ddr);.    }else{
11e80 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
11e90 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
11ea0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
11eb0 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
11ec0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66   */.      int af
11ed0 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 31 3b 0a 20  finity_ok = 1;. 
11ee0 20 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20       int i;..   
11ef0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74     /* Check that
11f00 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 68   the affinity th
11f10 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  at will be used 
11f20 74 6f 20 70 65 72 66 6f 72 6d 20 65 61 63 68 20  to perform each 
11f30 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72  .      ** compar
11f40 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d 65  ison is the same
11f50 20 61 73 20 74 68 65 20 61 66 66 69 6e 69 74 79   as the affinity
11f60 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e   of each column.
11f70 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 69 74 20   If.      ** it 
11f80 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74 20 70  not, it is not p
11f90 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 61  ossible to use a
11fa0 6e 79 20 69 6e 64 65 78 2e 20 20 2a 2f 0a 20 20  ny index.  */.  
11fb0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
11fc0 45 78 70 72 20 26 26 20 61 66 66 69 6e 69 74 79  Expr && affinity
11fd0 5f 6f 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  _ok; i++){.     
11fe0 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20 3d 20     Expr *pLhs = 
11ff0 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65  sqlite3VectorFie
12000 6c 64 53 75 62 65 78 70 72 28 70 58 2d 3e 70 4c  ldSubexpr(pX->pL
12010 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  eft, i);.       
12020 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 4c 69   int iCol = pELi
12030 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e  st->a[i].pExpr->
12040 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  iColumn;.       
12050 20 63 68 61 72 20 69 64 78 61 66 66 20 3d 20 70   char idxaff = p
12060 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
12070 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20  affinity;.      
12080 20 20 63 68 61 72 20 63 6d 70 61 66 66 20 3d 20    char cmpaff = 
12090 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
120a0 66 69 6e 69 74 79 28 70 4c 68 73 2c 20 69 64 78  finity(pLhs, idx
120b0 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 73 77  aff);.        sw
120c0 69 74 63 68 28 20 63 6d 70 61 66 66 20 29 7b 0a  itch( cmpaff ){.
120d0 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53            case S
120e0 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3a 0a  QLITE_AFF_BLOB:.
120f0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
12100 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73  k;.          cas
12110 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  e SQLITE_AFF_TEX
12120 54 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  T:.            a
12130 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 28 69 64  ffinity_ok = (id
12140 78 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46  xaff==SQLITE_AFF
12150 5f 54 45 58 54 29 3b 0a 20 20 20 20 20 20 20 20  _TEXT);.        
12160 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
12170 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20       default:.  
12180 20 20 20 20 20 20 20 20 20 20 61 66 66 69 6e 69            affini
12190 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74 65 33 49  ty_ok = sqlite3I
121a0 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
121b0 28 69 64 78 61 66 66 29 3b 0a 20 20 20 20 20 20  (idxaff);.      
121c0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
121d0 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74     /* The collat
121e0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65  ion sequence use
121f0 64 20 62 79 20 74 68 65 20 63 6f 6d 70 61 72 69  d by the compari
12200 73 6f 6e 2e 20 49 66 20 61 6e 20 69 6e 64 65 78  son. If an index
12210 20 69 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20   is to.      ** 
12220 62 65 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65  be used in place
12230 20 6f 66 20 61 20 74 65 6d 70 2d 74 61 62 6c 65   of a temp-table
12240 2c 20 69 74 20 6d 75 73 74 20 62 65 20 6f 72 64  , it must be ord
12250 65 72 65 64 20 61 63 63 6f 72 64 69 6e 67 0a 20  ered according. 
12260 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 69 73 20       ** to this 
12270 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
12280 63 65 2e 20 20 2a 2f 0a 0a 20 20 20 20 20 20 66  ce.  */..      f
12290 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
122a0 6e 64 65 78 3b 20 70 49 64 78 20 26 26 20 65 54  ndex; pIdx && eT
122b0 79 70 65 3d 3d 30 20 26 26 20 61 66 66 69 6e 69  ype==0 && affini
122c0 74 79 5f 6f 6b 3b 20 70 49 64 78 3d 70 49 64 78  ty_ok; pIdx=pIdx
122d0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
122e0 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b 65 79    if( pIdx->nKey
122f0 43 6f 6c 3c 6e 45 78 70 72 20 29 20 63 6f 6e 74  Col<nExpr ) cont
12300 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
12310 28 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20 26  ( mustBeUnique &
12320 26 20 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  & (pIdx->nKeyCol
12330 21 3d 6e 45 78 70 72 20 7c 7c 20 21 49 73 55 6e  !=nExpr || !IsUn
12340 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 29  iqueIndex(pIdx))
12350 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   ){.          co
12360 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
12370 7d 0a 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  }..        for(i
12380 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b  =0; i<nExpr; i++
12390 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
123a0 72 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69 74 65  r *pLhs = sqlite
123b0 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65  3VectorFieldSube
123c0 78 70 72 28 70 58 2d 3e 70 4c 65 66 74 2c 20 69  xpr(pX->pLeft, i
123d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  );.          Exp
123e0 72 20 2a 70 52 68 73 20 3d 20 70 45 4c 69 73 74  r *pRhs = pEList
123f0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
12400 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
12410 2a 70 52 65 71 20 3d 20 73 71 6c 69 74 65 33 42  *pReq = sqlite3B
12420 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
12430 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 68 73  Seq(pParse, pLhs
12440 2c 20 70 52 68 73 29 3b 0a 20 20 20 20 20 20 20  , pRhs);.       
12450 20 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 20 20 20     int j;..     
12460 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65       assert( pRe
12470 71 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  q || pParse->nEr
12480 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  r );.          i
12490 66 28 20 70 52 65 71 3d 3d 30 20 29 20 62 72 65  f( pReq==0 ) bre
124a0 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 66  ak;..          f
124b0 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 78 70 72 3b  or(j=0; j<nExpr;
124c0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
124d0 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43     if( pIdx->aiC
124e0 6f 6c 75 6d 6e 5b 6a 5d 21 3d 70 52 68 73 2d 3e  olumn[j]!=pRhs->
124f0 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e  iColumn ) contin
12500 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
12510 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 7a  assert( pIdx->az
12520 43 6f 6c 6c 5b 6a 5d 20 29 3b 0a 20 20 20 20 20  Coll[j] );.     
12530 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
12540 65 33 53 74 72 49 43 6d 70 28 70 52 65 71 2d 3e  e3StrICmp(pReq->
12550 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43  zName, pIdx->azC
12560 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20 63 6f 6e  oll[j])!=0 ) con
12570 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
12580 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
12590 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
125a0 69 66 28 20 6a 3d 3d 6e 45 78 70 72 20 29 20 62  if( j==nExpr ) b
125b0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
125c0 69 66 28 20 61 69 4d 61 70 20 29 20 61 69 4d 61  if( aiMap ) aiMa
125d0 70 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 20 20  p[i] = j;.      
125e0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28    }..        if(
125f0 20 69 3d 3d 6e 45 78 70 72 20 29 7b 0a 20 20 20   i==nExpr ){.   
12600 20 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72         int iAddr
12610 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e   = sqlite3CodeOn
12620 63 65 28 70 50 61 72 73 65 29 3b 20 56 64 62 65  ce(pParse); Vdbe
12630 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
12640 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
12650 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
12660 70 65 6e 52 65 61 64 2c 20 69 54 61 62 2c 20 70  penRead, iTab, p
12670 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  Idx->tnum, iDb);
12680 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
12690 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e  e3VdbeSetP4KeyIn
126a0 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29  fo(pParse, pIdx)
126b0 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
126c0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
126d0 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b  , pIdx->zName));
126e0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
126f0 74 28 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45  t( IN_INDEX_INDE
12700 58 5f 44 45 53 43 20 3d 3d 20 49 4e 5f 49 4e 44  X_DESC == IN_IND
12710 45 58 5f 49 4e 44 45 58 5f 41 53 43 2b 31 20 29  EX_INDEX_ASC+1 )
12720 3b 0a 20 20 20 20 20 20 20 20 20 20 65 54 79 70  ;.          eTyp
12730 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  e = IN_INDEX_IND
12740 45 58 5f 41 53 43 20 2b 20 70 49 64 78 2d 3e 61  EX_ASC + pIdx->a
12750 53 6f 72 74 4f 72 64 65 72 5b 30 5d 3b 0a 0a 20  SortOrder[0];.. 
12760 20 20 20 20 20 20 20 20 20 69 66 28 20 70 72 52           if( prR
12770 68 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 20 20 20  hsHasNull ){.   
12780 20 20 20 20 20 20 20 20 20 2a 70 72 52 68 73 48           *prRhsH
12790 61 73 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73  asNull = ++pPars
127a0 65 2d 3e 6e 4d 65 6d 3b 0a 23 69 66 64 65 66 20  e->nMem;.#ifdef 
127b0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
127c0 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20  LUMN_USED_MASK. 
127d0 20 20 20 20 20 20 20 20 20 20 20 69 36 34 20 6d             i64 m
127e0 61 73 6b 20 3d 20 28 31 3c 3c 6e 45 78 70 72 29  ask = (1<<nExpr)
127f0 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1;.            
12800 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12810 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75  4Dup8(v, OP_Colu
12820 6d 6e 73 55 73 65 64 2c 20 0a 20 20 20 20 20 20  mnsUsed, .      
12830 20 20 20 20 20 20 20 20 20 20 69 54 61 62 2c 20            iTab, 
12840 30 2c 20 30 2c 20 28 75 38 2a 29 26 6d 61 73 6b  0, 0, (u8*)&mask
12850 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 23 65 6e  , P4_INT64);.#en
12860 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20  dif.            
12870 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 29 7b 0a  if( nExpr==1 ){.
12880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
12890 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46  lite3SetHasNullF
128a0 6c 61 67 28 76 2c 20 69 54 61 62 2c 20 2a 70 72  lag(v, iTab, *pr
128b0 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 20  RhsHasNull);.   
128c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
128d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
128e0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
128f0 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a  Here(v, iAddr);.
12900 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12910 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
12920 2a 20 49 66 20 6e 6f 20 70 72 65 65 78 69 73 74  * If no preexist
12930 69 6e 67 20 69 6e 64 65 78 20 69 73 20 61 76 61  ing index is ava
12940 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65 20 49  ilable for the I
12950 4e 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 61 6e  N clause.  ** an
12960 64 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20  d IN_INDEX_NOOP 
12970 69 73 20 61 6e 20 61 6c 6c 6f 77 65 64 20 72 65  is an allowed re
12980 70 6c 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ply.  ** and the
12990 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
129a0 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73  perator is a lis
129b0 74 2c 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72  t, not a subquer
129c0 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 52  y.  ** and the R
129d0 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61  HS is not consta
129e0 6e 74 20 6f 72 20 68 61 73 20 74 77 6f 20 6f 72  nt or has two or
129f0 20 66 65 77 65 72 20 74 65 72 6d 73 2c 0a 20 20   fewer terms,.  
12a00 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f  ** then it is no
12a10 74 20 77 6f 72 74 68 20 63 72 65 61 74 69 6e 67  t worth creating
12a20 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61   an ephemeral ta
12a30 62 6c 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a  ble to evaluate.
12a40 20 20 2a 2a 20 74 68 65 20 49 4e 20 6f 70 65 72    ** the IN oper
12a50 61 74 6f 72 20 73 6f 20 72 65 74 75 72 6e 20 49  ator so return I
12a60 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 0a 20 20  N_INDEX_NOOP..  
12a70 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  */.  if( eType==
12a80 30 0a 20 20 20 26 26 20 28 69 6e 46 6c 61 67 73  0.   && (inFlags
12a90 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50   & IN_INDEX_NOOP
12aa0 5f 4f 4b 29 0a 20 20 20 26 26 20 21 45 78 70 72  _OK).   && !Expr
12ab0 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20  HasProperty(pX, 
12ac0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 0a 20 20  EP_xIsSelect).  
12ad0 20 26 26 20 28 21 73 71 6c 69 74 65 33 49 6e 52   && (!sqlite3InR
12ae0 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 70 58 29  hsIsConstant(pX)
12af0 20 7c 7c 20 70 58 2d 3e 78 2e 70 4c 69 73 74 2d   || pX->x.pList-
12b00 3e 6e 45 78 70 72 3c 3d 32 29 0a 20 20 29 7b 0a  >nExpr<=2).  ){.
12b10 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
12b20 4e 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a  NDEX_NOOP;.  }..
12b30 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 20 29    if( eType==0 )
12b40 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20 6e  {.    /* Could n
12b50 6f 74 20 66 69 6e 64 20 61 6e 20 65 78 69 73 74  ot find an exist
12b60 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  ing table or ind
12b70 65 78 20 74 6f 20 75 73 65 20 61 73 20 74 68 65  ex to use as the
12b80 20 52 48 53 20 62 2d 74 72 65 65 2e 0a 20 20 20   RHS b-tree..   
12b90 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61 76 65   ** We will have
12ba0 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20   to generate an 
12bb0 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
12bc0 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e 0a 20  to do the job.. 
12bd0 20 20 20 2a 2f 0a 20 20 20 20 75 33 32 20 73 61     */.    u32 sa
12be0 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  vedNQueryLoop = 
12bf0 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
12c00 6f 70 3b 0a 20 20 20 20 69 6e 74 20 72 4d 61 79  op;.    int rMay
12c10 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20  HaveNull = 0;.  
12c20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
12c30 45 58 5f 45 50 48 3b 0a 20 20 20 20 69 66 28 20  EX_EPH;.    if( 
12c40 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44  inFlags & IN_IND
12c50 45 58 5f 4c 4f 4f 50 20 29 7b 0a 20 20 20 20 20  EX_LOOP ){.     
12c60 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
12c70 6f 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  oop = 0;.      i
12c80 66 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69 43  f( pX->pLeft->iC
12c90 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78 70 72  olumn<0 && !Expr
12ca0 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20  HasProperty(pX, 
12cb0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
12cc0 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 20 3d  .        eType =
12cd0 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b   IN_INDEX_ROWID;
12ce0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
12cf0 73 65 20 69 66 28 20 70 72 52 68 73 48 61 73 4e  se if( prRhsHasN
12d00 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2a 70 72  ull ){.      *pr
12d10 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 72 4d 61  RhsHasNull = rMa
12d20 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50  yHaveNull = ++pP
12d30 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
12d40 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  }.    sqlite3Cod
12d50 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
12d60 65 2c 20 70 58 2c 20 72 4d 61 79 48 61 76 65 4e  e, pX, rMayHaveN
12d70 75 6c 6c 2c 20 65 54 79 70 65 3d 3d 49 4e 5f 49  ull, eType==IN_I
12d80 4e 44 45 58 5f 52 4f 57 49 44 29 3b 0a 20 20 20  NDEX_ROWID);.   
12d90 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
12da0 6f 6f 70 20 3d 20 73 61 76 65 64 4e 51 75 65 72  oop = savedNQuer
12db0 79 4c 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 7b 0a  yLoop;.  }else{.
12dc0 20 20 20 20 70 58 2d 3e 69 54 61 62 6c 65 20 3d      pX->iTable =
12dd0 20 69 54 61 62 3b 0a 20 20 7d 0a 0a 20 20 69 66   iTab;.  }..  if
12de0 28 20 61 69 4d 61 70 20 26 26 20 65 54 79 70 65  ( aiMap && eType
12df0 21 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  !=IN_INDEX_INDEX
12e00 5f 41 53 43 20 26 26 20 65 54 79 70 65 21 3d 49  _ASC && eType!=I
12e10 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45  N_INDEX_INDEX_DE
12e20 53 43 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c  SC ){.    int i,
12e30 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69   n;.    n = sqli
12e40 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
12e50 65 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  e(pX->pLeft);.  
12e60 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
12e70 69 2b 2b 29 20 61 69 4d 61 70 5b 69 5d 20 3d 20  i++) aiMap[i] = 
12e80 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  i;.  }.  return 
12e90 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a  eType;.}.#endif.
12ea0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12eb0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
12ec0 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 45 78  .** Argument pEx
12ed0 70 72 20 69 73 20 61 6e 20 28 3f 2c 20 3f 2e 2e  pr is an (?, ?..
12ee0 2e 29 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65  .) IN(...) expre
12ef0 73 73 69 6f 6e 2e 20 54 68 69 73 20 0a 2a 2a 20  ssion. This .** 
12f00 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  function allocat
12f10 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  es and returns a
12f20 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
12f30 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
12f40 67 20 0a 2a 2a 20 74 68 65 20 61 66 66 69 6e 69  g .** the affini
12f50 74 69 65 73 20 74 6f 20 62 65 20 75 73 65 64 20  ties to be used 
12f60 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
12f70 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  of the compariso
12f80 6e 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 74  n..**.** It is t
12f90 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
12fa0 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
12fb0 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
12fc0 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 73  he returned.** s
12fd0 74 72 69 6e 67 20 69 73 20 65 76 65 6e 74 75 61  tring is eventua
12fe0 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e 67 20  lly freed using 
12ff0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e  sqlite3DbFree().
13000 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
13010 2a 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28  *exprINAffinity(
13020 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
13030 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 45  xpr *pExpr){.  E
13040 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
13050 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69 6e 74  pr->pLeft;.  int
13060 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 45   nVal = sqlite3E
13070 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 4c  xprVectorSize(pL
13080 65 66 74 29 3b 0a 20 20 53 65 6c 65 63 74 20 2a  eft);.  Select *
13090 70 53 65 6c 65 63 74 20 3d 20 28 70 45 78 70 72  pSelect = (pExpr
130a0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73  ->flags & EP_xIs
130b0 53 65 6c 65 63 74 29 20 3f 20 70 45 78 70 72 2d  Select) ? pExpr-
130c0 3e 78 2e 70 53 65 6c 65 63 74 20 3a 20 30 3b 0a  >x.pSelect : 0;.
130d0 20 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20    char *zRet;.. 
130e0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
130f0 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 7a  op==TK_IN );.  z
13100 52 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Ret = sqlite3DbM
13110 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65  allocZero(pParse
13120 2d 3e 64 62 2c 20 6e 56 61 6c 2b 31 29 3b 0a 20  ->db, nVal+1);. 
13130 20 69 66 28 20 7a 52 65 74 20 29 7b 0a 20 20 20   if( zRet ){.   
13140 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
13150 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b  i=0; i<nVal; i++
13160 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
13170 41 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f  A = sqlite3Vecto
13180 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 4c  rFieldSubexpr(pL
13190 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 63  eft, i);.      c
131a0 68 61 72 20 61 20 3d 20 73 71 6c 69 74 65 33 45  har a = sqlite3E
131b0 78 70 72 41 66 66 69 6e 69 74 79 28 70 41 29 3b  xprAffinity(pA);
131c0 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 65  .      if( pSele
131d0 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52  ct ){.        zR
131e0 65 74 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 43  et[i] = sqlite3C
131f0 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
13200 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
13210 61 5b 69 5d 2e 70 45 78 70 72 2c 20 61 29 3b 0a  a[i].pExpr, a);.
13220 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13230 20 20 20 20 20 7a 52 65 74 5b 69 5d 20 3d 20 61       zRet[i] = a
13240 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
13250 20 20 20 20 7a 52 65 74 5b 6e 56 61 6c 5d 20 3d      zRet[nVal] =
13260 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 72 65 74   '\0';.  }.  ret
13270 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64  urn zRet;.}.#end
13280 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
13290 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
132a0 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20  ./*.** Load the 
132b0 50 61 72 73 65 20 6f 62 6a 65 63 74 20 70 61 73  Parse object pas
132c0 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
132d0 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20 61   argument with a
132e0 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65 73 73  n error .** mess
132f0 61 67 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  age of the form:
13300 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62 2d 73 65  .**.**   "sub-se
13310 6c 65 63 74 20 72 65 74 75 72 6e 73 20 4e 20 63  lect returns N c
13320 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65  olumns - expecte
13330 64 20 4d 22 0a 2a 2f 20 20 20 0a 76 6f 69 64 20  d M".*/   .void 
13340 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74  sqlite3Subselect
13350 45 72 72 6f 72 28 50 61 72 73 65 20 2a 70 50 61  Error(Parse *pPa
13360 72 73 65 2c 20 69 6e 74 20 6e 41 63 74 75 61 6c  rse, int nActual
13370 2c 20 69 6e 74 20 6e 45 78 70 65 63 74 29 7b 0a  , int nExpect){.
13380 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
13390 6d 74 20 3d 20 22 73 75 62 2d 73 65 6c 65 63 74  mt = "sub-select
133a0 20 72 65 74 75 72 6e 73 20 25 64 20 63 6f 6c 75   returns %d colu
133b0 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20 25  mns - expected %
133c0 64 22 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72  d";.  sqlite3Err
133d0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 7a 46  orMsg(pParse, zF
133e0 6d 74 2c 20 6e 41 63 74 75 61 6c 2c 20 6e 45 78  mt, nActual, nEx
133f0 70 65 63 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  pect);.}.#endif.
13400 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
13410 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61 72 20  code for scalar 
13420 73 75 62 71 75 65 72 69 65 73 20 75 73 65 64 20  subqueries used 
13430 61 73 20 61 20 73 75 62 71 75 65 72 79 20 65 78  as a subquery ex
13440 70 72 65 73 73 69 6f 6e 2c 20 45 58 49 53 54 53  pression, EXISTS
13450 2c 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70 65 72 61  ,.** or IN opera
13460 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a  tors.  Examples:
13470 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45  .**.**     (SELE
13480 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20  CT a FROM b)    
13490 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65 72        -- subquer
134a0 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53 20  y.**     EXISTS 
134b0 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62  (SELECT a FROM b
134c0 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73 75  )   -- EXISTS su
134d0 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 78 20  bquery.**     x 
134e0 49 4e 20 28 34 2c 35 2c 31 31 29 20 20 20 20 20  IN (4,5,11)     
134f0 20 20 20 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f           -- IN o
13500 70 65 72 61 74 6f 72 20 77 69 74 68 20 6c 69 73  perator with lis
13510 74 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20  t on right-hand 
13520 73 69 64 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e  side.**     x IN
13530 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
13540 62 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65  b)     -- IN ope
13550 72 61 74 6f 72 20 77 69 74 68 20 73 75 62 71 75  rator with subqu
13560 65 72 79 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ery on the right
13570 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70 72  .**.** The pExpr
13580 20 70 61 72 61 6d 65 74 65 72 20 64 65 73 63 72   parameter descr
13590 69 62 65 73 20 74 68 65 20 65 78 70 72 65 73 73  ibes the express
135a0 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ion that contain
135b0 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72  s the IN.** oper
135c0 61 74 6f 72 20 6f 72 20 73 75 62 71 75 65 72 79  ator or subquery
135d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
135e0 65 74 65 72 20 69 73 52 6f 77 69 64 20 69 73 20  eter isRowid is 
135f0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 65  non-zero, then e
13600 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
13610 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a  is guaranteed.**
13620 20 74 6f 20 62 65 20 6f 66 20 74 68 65 20 66 6f   to be of the fo
13630 72 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e 20 28  rm "<rowid> IN (
13640 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65 72 65  ?, ?, ?)", where
13650 20 3c 72 6f 77 69 64 3e 20 69 73 20 61 20 72 65   <rowid> is a re
13660 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f  ference.** to so
13670 6d 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 63  me integer key c
13680 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65  olumn of a table
13690 20 42 2d 54 72 65 65 2e 20 49 6e 20 74 68 69 73   B-Tree. In this
136a0 20 63 61 73 65 2c 20 75 73 65 20 61 6e 0a 2a 2a   case, use an.**
136b0 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 20 74   intkey B-Tree t
136c0 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20  o store the set 
136d0 6f 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c 75 65  of IN(...) value
136e0 73 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  s instead of the
136f0 20 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65   usual.** (slowe
13700 72 29 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67  r) variable leng
13710 74 68 20 6b 65 79 73 20 42 2d 54 72 65 65 2e 0a  th keys B-Tree..
13720 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61 76  **.** If rMayHav
13730 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72  eNull is non-zer
13740 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  o, that means th
13750 61 74 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  at the operation
13760 20 69 73 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e 6f   is an IN.** (no
13770 74 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58  t a SELECT or EX
13780 49 53 54 53 29 20 61 6e 64 20 74 68 61 74 20 74  ISTS) and that t
13790 68 65 20 52 48 53 20 6d 69 67 68 74 20 63 6f 6e  he RHS might con
137a0 74 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a 20  tains NULLs..** 
137b0 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  All this routine
137c0 20 64 6f 65 73 20 69 73 20 69 6e 69 74 69 61 6c   does is initial
137d0 69 7a 65 20 74 68 65 20 72 65 67 69 73 74 65 72  ize the register
137e0 20 67 69 76 65 6e 20 62 79 20 72 4d 61 79 48 61   given by rMayHa
137f0 76 65 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 4e 55 4c  veNull.** to NUL
13800 4c 2e 20 20 43 61 6c 6c 69 6e 67 20 72 6f 75 74  L.  Calling rout
13810 69 6e 65 73 20 77 69 6c 6c 20 74 61 6b 65 20 63  ines will take c
13820 61 72 65 20 6f 66 20 63 68 61 6e 67 69 6e 67 20  are of changing 
13830 74 68 69 73 20 72 65 67 69 73 74 65 72 0a 2a 2a  this register.**
13840 20 76 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e 55   value to non-NU
13850 4c 4c 20 69 66 20 74 68 65 20 52 48 53 20 69 73  LL if the RHS is
13860 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a 2a   NULL-free..**.*
13870 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54 20 6f  * For a SELECT o
13880 72 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f  r EXISTS operato
13890 72 2c 20 72 65 74 75 72 6e 20 74 68 65 20 72 65  r, return the re
138a0 67 69 73 74 65 72 20 74 68 61 74 20 68 6f 6c 64  gister that hold
138b0 73 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2e  s the.** result.
138c0 20 20 46 6f 72 20 61 20 6d 75 6c 74 69 2d 63 6f    For a multi-co
138d0 6c 75 6d 6e 20 53 45 4c 45 43 54 2c 20 74 68 65  lumn SELECT, the
138e0 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65   result is store
138f0 64 20 69 6e 20 61 20 63 6f 6e 74 69 67 75 6f 75  d in a contiguou
13900 73 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20 72 65  s.** array of re
13910 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20  gisters and the 
13920 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
13930 74 68 65 20 72 65 67 69 73 74 65 72 20 6f 66 20  the register of 
13940 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a  the left-most.**
13950 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 2e 20   result column. 
13960 20 52 65 74 75 72 6e 20 30 20 66 6f 72 20 49 4e   Return 0 for IN
13970 20 6f 70 65 72 61 74 6f 72 73 20 6f 72 20 69 66   operators or if
13980 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
13990 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
139a0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
139b0 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64  Y.int sqlite3Cod
139c0 65 53 75 62 73 65 6c 65 63 74 28 0a 20 20 50 61  eSubselect(.  Pa
139d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
139e0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
139f0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
13a00 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
13a10 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 2c        /* The IN,
13a20 20 53 45 4c 45 43 54 2c 20 6f 72 20 45 58 49 53   SELECT, or EXIS
13a30 54 53 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  TS operator */. 
13a40 20 69 6e 74 20 72 48 61 73 4e 75 6c 6c 46 6c 61   int rHasNullFla
13a50 67 2c 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69  g,       /* Regi
13a60 73 74 65 72 20 74 68 61 74 20 72 65 63 6f 72 64  ster that record
13a70 73 20 77 68 65 74 68 65 72 20 4e 55 4c 4c 73 20  s whether NULLs 
13a80 65 78 69 73 74 20 69 6e 20 52 48 53 20 2a 2f 0a  exist in RHS */.
13a90 20 20 69 6e 74 20 69 73 52 6f 77 69 64 20 20 20    int isRowid   
13aa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
13ab0 74 72 75 65 2c 20 4c 48 53 20 6f 66 20 49 4e 20  true, LHS of IN 
13ac0 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 72 6f  operator is a ro
13ad0 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  wid */.){.  int 
13ae0 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d  jmpIfDynamic = -
13af0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
13b00 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74          /* One-t
13b10 69 6d 65 20 74 65 73 74 20 61 64 64 72 65 73 73  ime test address
13b20 20 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67 20 3d   */.  int rReg =
13b30 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
13b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13b50 20 52 65 67 69 73 74 65 72 20 73 74 6f 72 69 6e   Register storin
13b60 67 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f 0a 20  g resulting */. 
13b70 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
13b80 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
13b90 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76  );.  if( NEVER(v
13ba0 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ==0) ) return 0;
13bb0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
13bc0 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
13bd0 0a 0a 20 20 2f 2a 20 54 68 65 20 65 76 61 6c 75  ..  /* The evalu
13be0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 2f  ation of the IN/
13bf0 45 58 49 53 54 53 2f 53 45 4c 45 43 54 20 6d 75  EXISTS/SELECT mu
13c00 73 74 20 62 65 20 72 65 70 65 61 74 65 64 20 65  st be repeated e
13c10 76 65 72 79 20 74 69 6d 65 20 69 74 0a 20 20 2a  very time it.  *
13c20 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  * is encountered
13c30 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   if any of the f
13c40 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65  ollowing is true
13c50 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a  :.  **.  **    *
13c60 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64    The right-hand
13c70 20 73 69 64 65 20 69 73 20 61 20 63 6f 72 72 65   side is a corre
13c80 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 0a 20  lated subquery. 
13c90 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69   **    *  The ri
13ca0 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
13cb0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
13cc0 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76  ist containing v
13cd0 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20  ariables.  **   
13ce0 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69 64   *  We are insid
13cf0 65 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a  e a trigger.  **
13d00 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20  .  ** If all of 
13d10 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 66 61  the above are fa
13d20 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e  lse, then we can
13d30 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a   run this code j
13d40 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61  ust once.  ** sa
13d50 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20  ve the results, 
13d60 61 6e 64 20 72 65 75 73 65 20 74 68 65 20 73 61  and reuse the sa
13d70 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62  me result on sub
13d80 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69  sequent invocati
13d90 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
13da0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
13db0 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65  (pExpr, EP_VarSe
13dc0 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 6a 6d 70  lect) ){.    jmp
13dd0 49 66 44 79 6e 61 6d 69 63 20 3d 20 73 71 6c 69  IfDynamic = sqli
13de0 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72  te3CodeOnce(pPar
13df0 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  se); VdbeCoverag
13e00 65 28 76 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  e(v);.  }..#ifnd
13e10 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
13e20 58 50 4c 41 49 4e 0a 20 20 69 66 28 20 70 50 61  XPLAIN.  if( pPa
13e30 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  rse->explain==2 
13e40 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73  ){.    char *zMs
13e50 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
13e60 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22  tf(pParse->db, "
13e70 45 58 45 43 55 54 45 20 25 73 25 73 20 53 55 42  EXECUTE %s%s SUB
13e80 51 55 45 52 59 20 25 64 22 2c 0a 20 20 20 20 20  QUERY %d",.     
13e90 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e     jmpIfDynamic>
13ea0 3d 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54 45  =0?"":"CORRELATE
13eb0 44 20 22 2c 0a 20 20 20 20 20 20 20 20 70 45 78  D ",.        pEx
13ec0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 3f 22 4c  pr->op==TK_IN?"L
13ed0 49 53 54 22 3a 22 53 43 41 4c 41 52 22 2c 0a 20  IST":"SCALAR",. 
13ee0 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69         pParse->i
13ef0 4e 65 78 74 53 65 6c 65 63 74 49 64 0a 20 20 20  NextSelectId.   
13f00 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
13f10 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
13f20 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d  Explain, pParse-
13f30 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30  >iSelectId, 0, 0
13f40 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d  , zMsg, P4_DYNAM
13f50 49 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  IC);.  }.#endif.
13f60 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
13f70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
13f80 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
13f90 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20  int addr;       
13fa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
13fb0 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65  ddress of OP_Ope
13fc0 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
13fd0 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  uction */.      
13fe0 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
13ff0 78 70 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20 74  xpr->pLeft; /* t
14000 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e  he LHS of the IN
14010 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
14020 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
14030 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 2f  Info = 0;      /
14040 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f  * Key informatio
14050 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  n */.      int n
14060 56 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Val;            
14070 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
14080 66 20 76 65 63 74 6f 72 20 70 4c 65 66 74 20 2a  f vector pLeft *
14090 2f 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 6e  /.      .      n
140a0 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Val = sqlite3Exp
140b0 72 56 65 63 74 6f 72 53 69 7a 65 28 70 4c 65 66  rVectorSize(pLef
140c0 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
140d0 28 20 21 69 73 52 6f 77 69 64 20 7c 7c 20 6e 56  ( !isRowid || nV
140e0 61 6c 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20  al==1 );..      
140f0 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69 73 20  /* Whether this 
14100 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45 4c 45  is an 'x IN(SELE
14110 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78  CT...)' or an 'x
14120 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29 27   IN(<exprlist>)'
14130 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73  .      ** expres
14140 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e 64 6c  sion it is handl
14150 65 64 20 74 68 65 20 73 61 6d 65 20 77 61 79 2e  ed the same way.
14160 20 20 41 6e 20 65 70 68 65 6d 65 72 61 6c 20 74    An ephemeral t
14170 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20 2a  able is .      *
14180 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20 69 6e  * filled with in
14190 64 65 78 20 6b 65 79 73 20 72 65 70 72 65 73 65  dex keys represe
141a0 6e 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  nting the result
141b0 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20  s from the .    
141c0 20 20 2a 2a 20 53 45 4c 45 43 54 20 6f 72 20 74    ** SELECT or t
141d0 68 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20  he <exprlist>.. 
141e0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
141f0 20 49 66 20 74 68 65 20 27 78 27 20 65 78 70 72   If the 'x' expr
14200 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  ession is a colu
14210 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74 68 65  mn value, or the
14220 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20   SELECT....     
14230 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65   ** statement re
14240 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76  turns a column v
14250 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 61  alue, then the a
14260 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74 0a  ffinity of that.
14270 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20        ** column 
14280 69 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64  is used to build
14290 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79 73 2e   the index keys.
142a0 20 49 66 20 62 6f 74 68 20 27 78 27 20 61 6e 64   If both 'x' and
142b0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 53 45   the.      ** SE
142c0 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e  LECT... statemen
142d0 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74  t are columns, t
142e0 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69  hen numeric affi
142f0 6e 69 74 79 20 69 73 20 75 73 65 64 0a 20 20 20  nity is used.   
14300 20 20 20 2a 2a 20 69 66 20 65 69 74 68 65 72 20     ** if either 
14310 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52  column has NUMER
14320 49 43 20 6f 72 20 49 4e 54 45 47 45 52 20 61 66  IC or INTEGER af
14330 66 69 6e 69 74 79 2e 20 49 66 20 6e 65 69 74 68  finity. If neith
14340 65 72 0a 20 20 20 20 20 20 2a 2a 20 27 78 27 20  er.      ** 'x' 
14350 6e 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e  nor the SELECT..
14360 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20  . statement are 
14370 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75  columns, then nu
14380 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 0a 20  meric affinity. 
14390 20 20 20 20 20 2a 2a 20 69 73 20 75 73 65 64 2e       ** is used.
143a0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
143b0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
143c0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
143d0 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
143e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
143f0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
14400 61 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  al, .          p
14410 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 28 69  Expr->iTable, (i
14420 73 52 6f 77 69 64 3f 30 3a 6e 56 61 6c 29 29 3b  sRowid?0:nVal));
14430 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  .      pKeyInfo 
14440 3d 20 69 73 52 6f 77 69 64 20 3f 20 30 20 3a 20  = isRowid ? 0 : 
14450 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
14460 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  loc(pParse->db, 
14470 6e 56 61 6c 2c 20 31 29 3b 0a 0a 20 20 20 20 20  nVal, 1);..     
14480 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
14490 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
144a0 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
144b0 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20       /* Case 1: 
144c0 20 20 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c      expr IN (SEL
144d0 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20  ECT ...).       
144e0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47   **.        ** G
144f0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
14500 77 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74  write the result
14510 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20  s of the select 
14520 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61  into the tempora
14530 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61  ry.        ** ta
14540 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  ble allocated an
14550 64 20 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a  d opened above..
14560 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
14570 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65     Select *pSele
14580 63 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53  ct = pExpr->x.pS
14590 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 45  elect;.        E
145a0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
145b0 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
145c0 74 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65  t;..        asse
145d0 72 74 28 20 21 69 73 52 6f 77 69 64 20 29 3b 0a  rt( !isRowid );.
145e0 20 20 20 20 20 20 20 20 69 66 28 20 70 45 4c 69          if( pELi
145f0 73 74 2d 3e 6e 45 78 70 72 21 3d 6e 56 61 6c 20  st->nExpr!=nVal 
14600 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
14610 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72  ite3SubselectErr
14620 6f 72 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  or(pParse, pELis
14630 74 2d 3e 6e 45 78 70 72 2c 20 6e 56 61 6c 29 3b  t->nExpr, nVal);
14640 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
14650 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74            Select
14660 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20  Dest dest;.     
14670 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
14680 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
14690 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
146a0 74 2c 20 53 52 54 5f 53 65 74 2c 20 70 45 78 70  t, SRT_Set, pExp
146b0 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20  r->iTable);.    
146c0 20 20 20 20 20 20 64 65 73 74 2e 7a 41 66 66 53        dest.zAffS
146d0 64 73 74 20 3d 20 65 78 70 72 49 4e 41 66 66 69  dst = exprINAffi
146e0 6e 69 74 79 28 70 50 61 72 73 65 2c 20 70 45 78  nity(pParse, pEx
146f0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  pr);.          a
14700 73 73 65 72 74 28 20 28 70 45 78 70 72 2d 3e 69  ssert( (pExpr->i
14710 54 61 62 6c 65 26 30 78 30 30 30 30 46 46 46 46  Table&0x0000FFFF
14720 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  )==pExpr->iTable
14730 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53   );.          pS
14740 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20  elect->iLimit = 
14750 30 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  0;.          tes
14760 74 63 61 73 65 28 20 70 53 65 6c 65 63 74 2d 3e  tcase( pSelect->
14770 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
14780 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20  stinct );.      
14790 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4b      testcase( pK
147a0 65 79 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f 2a 20  eyInfo==0 ); /* 
147b0 43 61 75 73 65 64 20 62 79 20 4f 4f 4d 20 69 6e  Caused by OOM in
147c0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
147d0 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20 20 20 20 20  lloc() */.      
147e0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
147f0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
14800 65 6c 65 63 74 2c 20 26 64 65 73 74 29 20 29 7b  elect, &dest) ){
14810 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
14820 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73  ite3DbFree(pPars
14830 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41 66 66  e->db, dest.zAff
14840 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Sdst);.         
14850 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66     sqlite3KeyInf
14860 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f 29  oUnref(pKeyInfo)
14870 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
14880 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
14890 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
148a0 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72  lite3DbFree(pPar
148b0 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41 66  se->db, dest.zAf
148c0 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20  fSdst);.        
148d0 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
148e0 66 6f 21 3d 30 20 29 3b 20 2f 2a 20 4f 4f 4d 20  fo!=0 ); /* OOM 
148f0 77 69 6c 6c 20 63 61 75 73 65 20 65 78 69 74 20  will cause exit 
14900 61 66 74 65 72 20 73 71 6c 69 74 65 33 53 65 6c  after sqlite3Sel
14910 65 63 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 20  ect() */.       
14920 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73     assert( pELis
14930 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
14940 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
14950 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20  ->nExpr>0 );.   
14960 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
14970 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
14980 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e 66  riteable(pKeyInf
14990 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  o) );.          
149a0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b  for(i=0; i<nVal;
149b0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
149c0 20 20 20 45 78 70 72 20 2a 70 20 3d 20 28 6e 56     Expr *p = (nV
149d0 61 6c 3e 31 29 20 3f 20 73 71 6c 69 74 65 33 56  al>1) ? sqlite3V
149e0 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70  ectorFieldSubexp
149f0 72 28 70 4c 65 66 74 2c 20 69 29 20 3a 20 70 4c  r(pLeft, i) : pL
14a00 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eft;.           
14a10 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
14a20 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  [i] = sqlite3Bin
14a30 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
14a40 71 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  q(.             
14a50 20 20 20 70 50 61 72 73 65 2c 20 70 2c 20 70 45     pParse, p, pE
14a60 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
14a70 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a  .            );.
14a80 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
14a90 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
14aa0 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78  e if( ALWAYS(pEx
14ab0 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 29 20  pr->x.pList!=0) 
14ac0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61  ){.        /* Ca
14ad0 73 65 20 32 3a 20 20 20 20 20 65 78 70 72 20 49  se 2:     expr I
14ae0 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20  N (exprlist).   
14af0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
14b00 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70 72  ** For each expr
14b10 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e  ession, build an
14b20 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20   index key from 
14b30 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61  the evaluation a
14b40 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  nd.        ** st
14b50 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20 74 65  ore it in the te
14b60 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49  mporary table. I
14b70 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f  f <expr> is a co
14b80 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20  lumn, then use. 
14b90 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63         ** that c
14ba0 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20  olumns affinity 
14bb0 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e  when building in
14bc0 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78  dex keys. If <ex
14bd0 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20  pr> is not.     
14be0 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20     ** a column, 
14bf0 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69  use numeric affi
14c00 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nity..        */
14c10 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 61 66  .        char af
14c20 66 69 6e 69 74 79 3b 20 20 20 20 20 20 20 20 20  finity;         
14c30 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 6f     /* Affinity o
14c40 66 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65  f the LHS of the
14c50 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69   IN */.        i
14c60 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78  nt i;.        Ex
14c70 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
14c80 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
14c90 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45          struct E
14ca0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
14cb0 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  tem;.        int
14cc0 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 0a 20 20   r1, r2, r3;..  
14cd0 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d        affinity =
14ce0 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
14cf0 6e 69 74 79 28 70 4c 65 66 74 29 3b 0a 20 20 20  nity(pLeft);.   
14d00 20 20 20 20 20 69 66 28 20 21 61 66 66 69 6e 69       if( !affini
14d10 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ty ){.          
14d20 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
14d30 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20  E_AFF_BLOB;.    
14d40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
14d50 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20  ( pKeyInfo ){.  
14d60 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
14d70 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
14d80 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e  Writeable(pKeyIn
14d90 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  fo) );.         
14da0 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
14db0 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70  [0] = sqlite3Exp
14dc0 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
14dd0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
14de0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
14df0 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75     /* Loop throu
14e00 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
14e10 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e  on in <exprlist>
14e20 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 31 20  . */.        r1 
14e30 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
14e40 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
14e50 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
14e60 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
14e70 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  se);.        if(
14e80 20 69 73 52 6f 77 69 64 20 29 20 73 71 6c 69 74   isRowid ) sqlit
14e90 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14ea0 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32 29 3b  OP_Null, 0, r2);
14eb0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 70  .        for(i=p
14ec0 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74  List->nExpr, pIt
14ed0 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30  em=pList->a; i>0
14ee0 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i--, pItem++){
14ef0 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
14f00 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45  *pE2 = pItem->pE
14f10 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69  xpr;.          i
14f20 6e 74 20 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20  nt iValToIns;.. 
14f30 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
14f40 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
14f50 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68   not constant th
14f60 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20  en we will need 
14f70 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  to.          ** 
14f80 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 73 74  disable the test
14f90 20 74 68 61 74 20 77 61 73 20 67 65 6e 65 72 61   that was genera
14fa0 74 65 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d  ted above that m
14fb0 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20 20  akes sure.      
14fc0 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65      ** this code
14fd0 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f   only executes o
14fe0 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f  nce.  Because fo
14ff0 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74  r a non-constant
15000 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78  .          ** ex
15010 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64  pression we need
15020 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63   to rerun this c
15030 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20  ode each time.. 
15040 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
15050 20 20 20 20 20 20 69 66 28 20 6a 6d 70 49 66 44        if( jmpIfD
15060 79 6e 61 6d 69 63 3e 3d 30 20 26 26 20 21 73 71  ynamic>=0 && !sq
15070 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
15080 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20 20 20  ant(pE2) ){.    
15090 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
150a0 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
150b0 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 29  v, jmpIfDynamic)
150c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6d  ;.            jm
150d0 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31 3b  pIfDynamic = -1;
150e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
150f0 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75          /* Evalu
15100 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ate the expressi
15110 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74  on and insert it
15120 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74   into the temp t
15130 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
15140 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 26 26    if( isRowid &&
15150 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
15160 74 65 67 65 72 28 70 45 32 2c 20 26 69 56 61 6c  teger(pE2, &iVal
15170 54 6f 49 6e 73 29 20 29 7b 0a 20 20 20 20 20 20  ToIns) ){.      
15180 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15190 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
151a0 73 65 72 74 49 6e 74 2c 20 70 45 78 70 72 2d 3e  sertInt, pExpr->
151b0 69 54 61 62 6c 65 2c 20 72 32 2c 20 69 56 61 6c  iTable, r2, iVal
151c0 54 6f 49 6e 73 29 3b 0a 20 20 20 20 20 20 20 20  ToIns);.        
151d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
151e0 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65       r3 = sqlite
151f0 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
15200 70 50 61 72 73 65 2c 20 70 45 32 2c 20 72 31 29  pParse, pE2, r1)
15210 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
15220 28 20 69 73 52 6f 77 69 64 20 29 7b 0a 20 20 20  ( isRowid ){.   
15230 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
15240 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15250 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 33  OP_MustBeInt, r3
15260 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15280 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72    sqlite3VdbeCur
15290 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a  rentAddr(v)+2);.
152a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 64                Vd
152b0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
152c0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
152d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
152e0 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 45 78  , OP_Insert, pEx
152f0 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20  pr->iTable, r2, 
15300 72 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r3);.           
15310 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15320 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15330 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
15340 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c 20 31 2c  keRecord, r3, 1,
15350 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20   r2, &affinity, 
15360 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
15370 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
15380 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
15390 28 70 50 61 72 73 65 2c 20 72 33 2c 20 31 29 3b  (pParse, r3, 1);
153a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
153b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
153c0 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
153d0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
153e0 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r2);.          
153f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
15400 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15410 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
15420 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
15430 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r1);.        sql
15440 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
15450 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a  eg(pParse, r2);.
15460 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
15470 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20  ( pKeyInfo ){.  
15480 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15490 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64  eChangeP4(v, add
154a0 72 2c 20 28 76 6f 69 64 20 2a 29 70 4b 65 79 49  r, (void *)pKeyI
154b0 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
154c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
154d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
154e0 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53    case TK_EXISTS
154f0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  :.    case TK_SE
15500 4c 45 43 54 3a 0a 20 20 20 20 64 65 66 61 75 6c  LECT:.    defaul
15510 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61  t: {.      /* Ca
15520 73 65 20 33 3a 20 20 20 20 28 53 45 4c 45 43 54  se 3:    (SELECT
15530 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e 2e 29 0a 20   ... FROM ...). 
15540 20 20 20 20 20 2a 2a 20 20 20 20 20 6f 72 3a 20       **     or: 
15550 20 20 20 45 58 49 53 54 53 28 53 45 4c 45 43 54     EXISTS(SELECT
15560 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e 2e 29 0a 20   ... FROM ...). 
15570 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
15580 20 46 6f 72 20 61 20 53 45 4c 45 43 54 2c 20 67   For a SELECT, g
15590 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
155a0 70 75 74 20 74 68 65 20 76 61 6c 75 65 73 20 66  put the values f
155b0 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f  or all columns o
155c0 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66  f.      ** the f
155d0 69 72 73 74 20 72 6f 77 20 69 6e 74 6f 20 61 6e  irst row into an
155e0 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   array of regist
155f0 65 72 73 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ers and return t
15600 68 65 20 69 6e 64 65 78 20 6f 66 0a 20 20 20 20  he index of.    
15610 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72    ** the first r
15620 65 67 69 73 74 65 72 2e 0a 20 20 20 20 20 20 2a  egister..      *
15630 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
15640 69 73 20 69 73 20 61 6e 20 45 58 49 53 54 53 2c  is is an EXISTS,
15650 20 77 72 69 74 65 20 61 6e 20 69 6e 74 65 67 65   write an intege
15660 72 20 30 20 28 6e 6f 74 20 65 78 69 73 74 73 29  r 0 (not exists)
15670 20 6f 72 20 31 20 28 65 78 69 73 74 73 29 0a 20   or 1 (exists). 
15680 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 20 72       ** into a r
15690 65 67 69 73 74 65 72 20 61 6e 64 20 72 65 74 75  egister and retu
156a0 72 6e 20 74 68 61 74 20 72 65 67 69 73 74 65 72  rn that register
156b0 20 6e 75 6d 62 65 72 2e 0a 20 20 20 20 20 20 2a   number..      *
156c0 2a 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20 62 6f  *.      ** In bo
156d0 74 68 20 63 61 73 65 73 2c 20 74 68 65 20 71 75  th cases, the qu
156e0 65 72 79 20 69 73 20 61 75 67 6d 65 6e 74 65 64  ery is augmented
156f0 20 77 69 74 68 20 22 4c 49 4d 49 54 20 31 22 2e   with "LIMIT 1".
15700 20 20 41 6e 79 20 0a 20 20 20 20 20 20 2a 2a 20    Any .      ** 
15710 70 72 65 65 78 69 73 74 69 6e 67 20 6c 69 6d 69  preexisting limi
15720 74 20 69 73 20 64 69 73 63 61 72 64 65 64 20 69  t is discarded i
15730 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 6e  n place of the n
15740 65 77 20 4c 49 4d 49 54 20 31 2e 0a 20 20 20 20  ew LIMIT 1..    
15750 20 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63    */.      Selec
15760 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 20 20 20  t *pSel;        
15770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15780 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   /* SELECT state
15790 6d 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a  ment to encode *
157a0 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65  /.      SelectDe
157b0 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 20 20  st dest;        
157c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
157d0 20 48 6f 77 20 74 6f 20 64 65 61 6c 20 77 69 74   How to deal wit
157e0 68 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 20  h SELECT result 
157f0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 52 65  */.      int nRe
15800 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
15810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15820 2a 20 52 65 67 69 73 74 65 72 73 20 74 6f 20 61  * Registers to a
15830 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20 20 20 20  llocate */..    
15840 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
15850 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  r->op==TK_EXISTS
15860 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
15870 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
15880 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20  K_SELECT );.    
15890 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
158a0 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 7c  >op==TK_EXISTS |
158b0 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
158c0 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20  SELECT );.      
158d0 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50  assert( ExprHasP
158e0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
158f0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
15900 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20 70 45  .      pSel = pE
15910 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a  xpr->x.pSelect;.
15920 20 20 20 20 20 20 6e 52 65 67 20 3d 20 70 45 78        nReg = pEx
15930 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
15940 54 20 3f 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74  T ? pSel->pEList
15950 2d 3e 6e 45 78 70 72 20 3a 20 31 3b 0a 20 20 20  ->nExpr : 1;.   
15960 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
15970 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
15980 30 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b  0, pParse->nMem+
15990 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  1);.      pParse
159a0 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a  ->nMem += nReg;.
159b0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
159c0 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
159d0 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 65  {.        dest.e
159e0 44 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a  Dest = SRT_Mem;.
159f0 20 20 20 20 20 20 20 20 64 65 73 74 2e 69 53 64          dest.iSd
15a00 73 74 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72  st = dest.iSDPar
15a10 6d 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e  m;.        dest.
15a20 6e 53 64 73 74 20 3d 20 6e 52 65 67 3b 0a 20 20  nSdst = nReg;.  
15a30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15a40 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75  eAddOp3(v, OP_Nu
15a50 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69 53 44 50  ll, 0, dest.iSDP
15a60 61 72 6d 2c 20 64 65 73 74 2e 69 53 44 50 61 72  arm, dest.iSDPar
15a70 6d 2b 6e 52 65 67 2d 31 29 3b 0a 20 20 20 20 20  m+nReg-1);.     
15a80 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
15a90 76 2c 20 22 49 6e 69 74 20 73 75 62 71 75 65 72  v, "Init subquer
15aa0 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20  y result"));.   
15ab0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15ac0 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53    dest.eDest = S
15ad0 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20 20 20  RT_Exists;.     
15ae0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15af0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
15b00 65 72 2c 20 30 2c 20 64 65 73 74 2e 69 53 44 50  er, 0, dest.iSDP
15b10 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64  arm);.        Vd
15b20 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49  beComment((v, "I
15b30 6e 69 74 20 45 58 49 53 54 53 20 72 65 73 75 6c  nit EXISTS resul
15b40 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t"));.      }.  
15b50 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
15b60 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
15b70 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b  , pSel->pLimit);
15b80 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69  .      pSel->pLi
15b90 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78  mit = sqlite3PEx
15ba0 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e  pr(pParse, TK_IN
15bb0 54 45 47 45 52 2c 20 30 2c 20 30 2c 0a 20 20 20  TEGER, 0, 0,.   
15bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
15be0 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73  sqlite3IntTokens
15bf0 5b 31 5d 29 3b 0a 20 20 20 20 20 20 70 53 65 6c  [1]);.      pSel
15c00 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->iLimit = 0;.  
15c10 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61      pSel->selFla
15c20 67 73 20 26 3d 20 7e 53 46 5f 4d 75 6c 74 69 56  gs &= ~SF_MultiV
15c30 61 6c 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  alue;.      if( 
15c40 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
15c50 61 72 73 65 2c 20 70 53 65 6c 2c 20 26 64 65 73  arse, pSel, &des
15c60 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  t) ){.        re
15c70 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
15c80 20 20 20 20 20 20 72 52 65 67 20 3d 20 64 65 73        rReg = des
15c90 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20  t.iSDParm;.     
15ca0 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65   ExprSetVVAPrope
15cb0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f  rty(pExpr, EP_No
15cc0 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20 62  Reduce);.      b
15cd0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
15ce0 0a 20 20 69 66 28 20 72 48 61 73 4e 75 6c 6c 46  .  if( rHasNullF
15cf0 6c 61 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  lag ){.    sqlit
15d00 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67  e3SetHasNullFlag
15d10 28 76 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  (v, pExpr->iTabl
15d20 65 2c 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 29  e, rHasNullFlag)
15d30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6a 6d 70  ;.  }..  if( jmp
15d40 49 66 44 79 6e 61 6d 69 63 3e 3d 30 20 29 7b 0a  IfDynamic>=0 ){.
15d50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
15d60 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 49 66  umpHere(v, jmpIf
15d70 44 79 6e 61 6d 69 63 29 3b 0a 20 20 7d 0a 20 20  Dynamic);.  }.  
15d80 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
15d90 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  Pop(pParse);..  
15da0 72 65 74 75 72 6e 20 72 52 65 67 3b 0a 7d 0a 23  return rReg;.}.#
15db0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
15dc0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
15dd0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
15de0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
15df0 2a 0a 2a 2a 20 45 78 70 72 20 70 49 6e 20 69 73  *.** Expr pIn is
15e00 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72   an IN(...) expr
15e10 65 73 73 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e  ession. This fun
15e20 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 74 68 61  ction checks tha
15e30 74 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d 73 65  t the .** sub-se
15e40 6c 65 63 74 20 6f 6e 20 74 68 65 20 52 48 53 20  lect on the RHS 
15e50 6f 66 20 74 68 65 20 49 4e 28 29 20 6f 70 65 72  of the IN() oper
15e60 61 74 6f 72 20 68 61 73 20 74 68 65 20 73 61 6d  ator has the sam
15e70 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20  e number of .** 
15e80 63 6f 6c 75 6d 6e 73 20 61 73 20 74 68 65 20 76  columns as the v
15e90 65 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53  ector on the LHS
15ea0 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 52 48 53  . Or, if the RHS
15eb0 20 6f 66 20 74 68 65 20 49 4e 28 29 20 69 73 20   of the IN() is 
15ec0 6e 6f 74 20 0a 2a 2a 20 61 20 73 75 62 2d 71 75  not .** a sub-qu
15ed0 65 72 79 2c 20 74 68 61 74 20 74 68 65 20 4c 48  ery, that the LH
15ee0 53 20 69 73 20 61 20 76 65 63 74 6f 72 20 6f 66  S is a vector of
15ef0 20 73 69 7a 65 20 31 2e 0a 2a 2f 0a 69 6e 74 20   size 1..*/.int 
15f00 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
15f10 49 4e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  IN(Parse *pParse
15f20 2c 20 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20  , Expr *pIn){.  
15f30 69 6e 74 20 6e 56 65 63 74 6f 72 20 3d 20 73 71  int nVector = sq
15f40 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
15f50 69 7a 65 28 70 49 6e 2d 3e 70 4c 65 66 74 29 3b  ize(pIn->pLeft);
15f60 0a 20 20 69 66 28 20 28 70 49 6e 2d 3e 66 6c 61  .  if( (pIn->fla
15f70 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63  gs & EP_xIsSelec
15f80 74 29 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 56  t) ){.    if( nV
15f90 65 63 74 6f 72 21 3d 70 49 6e 2d 3e 78 2e 70 53  ector!=pIn->x.pS
15fa0 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  elect->pEList->n
15fb0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 73 71  Expr ){.      sq
15fc0 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72  lite3SubselectEr
15fd0 72 6f 72 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  ror(pParse, pIn-
15fe0 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
15ff0 73 74 2d 3e 6e 45 78 70 72 2c 20 6e 56 65 63 74  st->nExpr, nVect
16000 6f 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  or);.      retur
16010 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  n 1;.    }.  }el
16020 73 65 20 69 66 28 20 6e 56 65 63 74 6f 72 21 3d  se if( nVector!=
16030 31 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 49  1 ){.    if( (pI
16040 6e 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20  n->pLeft->flags 
16050 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  & EP_xIsSelect) 
16060 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
16070 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70  SubselectError(p
16080 50 61 72 73 65 2c 20 6e 56 65 63 74 6f 72 2c 20  Parse, nVector, 
16090 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1);.    }else{. 
160a0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
160b0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e  rMsg(pParse, "in
160c0 76 61 6c 69 64 20 75 73 65 20 6f 66 20 72 6f 77  valid use of row
160d0 20 76 61 6c 75 65 22 29 3b 0a 20 20 20 20 7d 0a   value");.    }.
160e0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
160f0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
16100 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
16110 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
16120 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  UERY./*.** Gener
16130 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e 20  ate code for an 
16140 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  IN expression..*
16150 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28  *.**      x IN (
16160 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20  SELECT ...).**  
16170 20 20 20 20 78 20 49 4e 20 28 76 61 6c 75 65 2c      x IN (value,
16180 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a   value, ...).**.
16190 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64  ** The left-hand
161a0 20 73 69 64 65 20 28 4c 48 53 29 20 69 73 20 61   side (LHS) is a
161b0 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69   scalar expressi
161c0 6f 6e 2e 20 20 54 68 65 20 72 69 67 68 74 2d 68  on.  The right-h
161d0 61 6e 64 20 73 69 64 65 20 28 52 48 53 29 0a 2a  and side (RHS).*
161e0 2a 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66  * is an array of
161f0 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 76 61   zero or more va
16200 6c 75 65 73 2e 20 20 54 68 65 20 65 78 70 72 65  lues.  The expre
16210 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 69 66  ssion is true if
16220 20 74 68 65 20 4c 48 53 20 69 73 0a 2a 2a 20 63   the LHS is.** c
16230 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
16240 74 68 65 20 52 48 53 2e 20 20 54 68 65 20 76 61  the RHS.  The va
16250 6c 75 65 20 6f 66 20 74 68 65 20 65 78 70 72 65  lue of the expre
16260 73 73 69 6f 6e 20 69 73 20 75 6e 6b 6e 6f 77 6e  ssion is unknown
16270 20 28 4e 55 4c 4c 29 0a 2a 2a 20 69 66 20 74 68   (NULL).** if th
16280 65 20 4c 48 53 20 69 73 20 4e 55 4c 4c 20 6f 72  e LHS is NULL or
16290 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e   if the LHS is n
162a0 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  ot contained wit
162b0 68 69 6e 20 74 68 65 20 52 48 53 20 61 6e 64 20  hin the RHS and 
162c0 74 68 65 0a 2a 2a 20 52 48 53 20 63 6f 6e 74 61  the.** RHS conta
162d0 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
162e0 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a  NULL values..**.
162f0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
16300 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74  generates code t
16310 68 61 74 20 6a 75 6d 70 73 20 74 6f 20 64 65 73  hat jumps to des
16320 74 49 66 46 61 6c 73 65 20 69 66 20 74 68 65 20  tIfFalse if the 
16330 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63  LHS is not .** c
16340 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
16350 74 68 65 20 52 48 53 2e 20 20 49 66 20 64 75 65  the RHS.  If due
16360 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20 63 61 6e   to NULLs we can
16370 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 69 66  not determine if
16380 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69 73 20 63   the LHS.** is c
16390 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
163a0 52 48 53 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f  RHS then jump to
163b0 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66   destIfNull.  If
163c0 20 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e 74   the LHS is cont
163d0 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20  ained.** within 
163e0 74 68 65 20 52 48 53 20 74 68 65 6e 20 66 61 6c  the RHS then fal
163f0 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a 73 74  l through..*/.st
16400 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
16410 33 45 78 70 72 43 6f 64 65 49 4e 28 0a 20 20 50  3ExprCodeIN(.  P
16420 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
16430 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
16440 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
16450 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
16460 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
16470 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e         /* The IN
16480 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
16490 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65   int destIfFalse
164a0 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68  ,      /* Jump h
164b0 65 72 65 20 69 66 20 4c 48 53 20 69 73 20 6e 6f  ere if LHS is no
164c0 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  t contained in t
164d0 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20  he RHS */.  int 
164e0 64 65 73 74 49 66 4e 75 6c 6c 20 20 20 20 20 20  destIfNull      
164f0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
16500 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 72  f the results ar
16510 65 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74 6f  e unknown due to
16520 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69   NULLs */.){.  i
16530 6e 74 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d  nt rRhsHasNull =
16540 20 30 3b 20 20 2f 2a 20 52 65 67 69 73 74 65 72   0;  /* Register
16550 20 74 68 61 74 20 69 73 20 74 72 75 65 20 69 66   that is true if
16560 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55   RHS contains NU
16570 4c 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69  LL values */.  i
16580 6e 74 20 65 54 79 70 65 3b 20 20 20 20 20 20 20  nt eType;       
16590 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20       /* Type of 
165a0 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74  the RHS */.  int
165b0 20 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   r1;            
165c0 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20     /* Temporary 
165d0 75 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  use register */.
165e0 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
165f0 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65          /* State
16600 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74  ment under const
16610 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
16620 20 2a 61 69 4d 61 70 20 3d 20 30 3b 20 20 20 20   *aiMap = 0;    
16630 20 20 20 2f 2a 20 4d 61 70 20 66 72 6f 6d 20 76     /* Map from v
16640 65 63 74 6f 72 20 66 69 65 6c 64 20 74 6f 20 69  ector field to i
16650 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  ndex column */. 
16660 20 63 68 61 72 20 2a 7a 41 66 66 20 3d 20 30 3b   char *zAff = 0;
16670 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69         /* Affini
16680 74 79 20 73 74 72 69 6e 67 20 66 6f 72 20 63 6f  ty string for co
16690 6d 70 61 72 69 73 6f 6e 73 20 2a 2f 0a 20 20 69  mparisons */.  i
166a0 6e 74 20 6e 56 65 63 74 6f 72 3b 20 20 20 20 20  nt nVector;     
166b0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
166c0 76 65 63 74 6f 72 73 20 66 6f 72 20 74 68 69 73  vectors for this
166d0 20 49 4e 28 2e 2e 2e 29 20 6f 70 20 2a 2f 0a 20   IN(...) op */. 
166e0 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
166f0 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69  Expr->pLeft;.  i
16700 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 73 71 6c  nt i;..  if( sql
16710 69 74 65 33 45 78 70 72 43 68 65 63 6b 49 4e 28  ite3ExprCheckIN(
16720 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 20 29  pParse, pExpr) )
16730 20 72 65 74 75 72 6e 3b 0a 20 20 7a 41 66 66 20   return;.  zAff 
16740 3d 20 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79  = exprINAffinity
16750 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
16760 0a 20 20 69 66 28 20 7a 41 66 66 3d 3d 30 20 29  .  if( zAff==0 )
16770 20 72 65 74 75 72 6e 3b 0a 20 20 6e 56 65 63 74   return;.  nVect
16780 6f 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  or = sqlite3Expr
16790 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72  VectorSize(pExpr
167a0 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 61 69 4d 61  ->pLeft);.  aiMa
167b0 70 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65  p = (int*)sqlite
167c0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20  3DbMallocZero(. 
167d0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c       pParse->db,
167e0 20 6e 56 65 63 74 6f 72 2a 28 73 69 7a 65 6f 66   nVector*(sizeof
167f0 28 69 6e 74 29 20 2b 20 73 69 7a 65 6f 66 28 63  (int) + sizeof(c
16800 68 61 72 29 29 20 2b 20 31 0a 20 20 29 3b 0a 20  har)) + 1.  );. 
16810 20 69 66 28 20 61 69 4d 61 70 3d 3d 30 20 29 7b   if( aiMap==0 ){
16820 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
16830 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  ee(pParse->db, z
16840 41 66 66 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Aff);.    return
16850 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 74 65  ;.  }..  /* Atte
16860 6d 70 74 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  mpt to compute t
16870 68 65 20 52 48 53 2e 20 41 66 74 65 72 20 74 68  he RHS. After th
16880 69 73 20 73 74 65 70 2c 20 69 66 20 61 6e 79 74  is step, if anyt
16890 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 0a  hing other than.
168a0 20 20 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f    ** IN_INDEX_NO
168b0 4f 50 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  OP is returned, 
168c0 74 68 65 20 74 61 62 6c 65 20 6f 70 65 6e 65 64  the table opened
168d0 20 69 74 68 20 63 75 72 73 6f 72 20 70 45 78 70   ith cursor pExp
168e0 72 2d 3e 69 54 61 62 6c 65 20 0a 20 20 2a 2a 20  r->iTable .  ** 
168f0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c  contains the val
16900 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70  ues that make up
16910 20 74 68 65 20 52 48 53 2e 20 49 66 20 49 4e 5f   the RHS. If IN_
16920 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72 65  INDEX_NOOP is re
16930 74 75 72 6e 65 64 2c 0a 20 20 2a 2a 20 74 68 65  turned,.  ** the
16940 20 52 48 53 20 68 61 73 20 6e 6f 74 20 79 65 74   RHS has not yet
16950 20 62 65 65 6e 20 63 6f 64 65 64 2e 20 20 2a 2f   been coded.  */
16960 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
16970 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
16980 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a  v!=0 );       /*
16990 20 4f 4f 4d 20 64 65 74 65 63 74 65 64 20 70 72   OOM detected pr
169a0 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74  ior to this rout
169b0 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  ine */.  VdbeNoo
169c0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65  pComment((v, "be
169d0 67 69 6e 20 49 4e 20 65 78 70 72 22 29 29 3b 0a  gin IN expr"));.
169e0 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65    eType = sqlite
169f0 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61  3FindInIndex(pPa
16a00 72 73 65 2c 20 70 45 78 70 72 2c 0a 20 20 20 20  rse, pExpr,.    
16a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a20 20 20 20 20 20 20 20 20 20 49 4e 5f 49 4e 44 45           IN_INDE
16a30 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 7c 20 49  X_MEMBERSHIP | I
16a40 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 2c  N_INDEX_NOOP_OK,
16a50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65                de
16a70 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49  stIfFalse==destI
16a80 66 4e 75 6c 6c 20 3f 20 30 20 3a 20 26 72 52 68  fNull ? 0 : &rRh
16a90 73 48 61 73 4e 75 6c 6c 2c 20 61 69 4d 61 70 29  sHasNull, aiMap)
16aa0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
16ab0 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 6e 56 65  rse->nErr || nVe
16ac0 63 74 6f 72 3d 3d 31 20 7c 7c 20 65 54 79 70 65  ctor==1 || eType
16ad0 3d 3d 49 4e 5f 49 4e 44 45 58 5f 45 50 48 0a 20  ==IN_INDEX_EPH. 
16ae0 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
16af0 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41  IN_INDEX_INDEX_A
16b00 53 43 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f  SC || eType==IN_
16b10 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43  INDEX_INDEX_DESC
16b20 20 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 64   .  );..  /* Cod
16b30 65 20 74 68 65 20 4c 48 53 2c 20 74 68 65 20 3c  e the LHS, the <
16b40 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70  expr> from "<exp
16b50 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 49 66  r> IN (...)". If
16b60 20 74 68 65 20 4c 48 53 20 69 73 20 61 20 0a 20   the LHS is a . 
16b70 20 2a 2a 20 76 65 63 74 6f 72 2c 20 74 68 65 6e   ** vector, then
16b80 20 69 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e   it is stored in
16b90 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6e 56 65   an array of nVe
16ba0 63 74 6f 72 20 72 65 67 69 73 74 65 72 73 20 73  ctor registers s
16bb0 74 61 72 74 69 6e 67 20 0a 20 20 2a 2a 20 61 74  tarting .  ** at
16bc0 20 72 31 2e 0a 20 20 2a 2f 0a 20 20 72 31 20 3d   r1..  */.  r1 =
16bd0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
16be0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 56 65  ange(pParse, nVe
16bf0 63 74 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  ctor);.  sqlite3
16c00 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
16c10 61 72 73 65 29 3b 0a 20 20 69 66 28 20 6e 56 65  arse);.  if( nVe
16c20 63 74 6f 72 3e 31 20 26 26 20 28 70 4c 65 66 74  ctor>1 && (pLeft
16c30 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73  ->flags & EP_xIs
16c40 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 69  Select) ){.    i
16c50 6e 74 20 72 65 67 53 65 6c 65 63 74 20 3d 20 73  nt regSelect = s
16c60 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
16c70 65 63 74 28 70 50 61 72 73 65 2c 20 70 4c 65 66  ect(pParse, pLef
16c80 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 66 6f  t, 0, 0);.    fo
16c90 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72  r(i=0; i<nVector
16ca0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
16cb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
16cc0 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 53  v, OP_Copy, regS
16cd0 65 6c 65 63 74 2b 69 2c 20 72 31 2b 61 69 4d 61  elect+i, r1+aiMa
16ce0 70 5b 69 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  p[i], 0);.    }.
16cf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
16d00 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b  (i=0; i<nVector;
16d10 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
16d20 72 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69 74 65  r *pLhs = sqlite
16d30 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65  3VectorFieldSube
16d40 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20  xpr(pLeft, i);. 
16d50 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
16d60 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 68  Code(pParse, pLh
16d70 73 2c 20 72 31 2b 61 69 4d 61 70 5b 69 5d 29 3b  s, r1+aiMap[i]);
16d80 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
16d90 20 49 66 20 73 71 6c 69 74 65 33 46 69 6e 64 49   If sqlite3FindI
16da0 6e 49 6e 64 65 78 28 29 20 64 69 64 20 6e 6f 74  nIndex() did not
16db0 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20   find or create 
16dc0 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73  an index that is
16dd0 0a 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 66  .  ** suitable f
16de0 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68  or evaluating th
16df0 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 74  e IN operator, t
16e00 68 65 6e 20 65 76 61 6c 75 61 74 65 20 75 73 69  hen evaluate usi
16e10 6e 67 20 61 0a 20 20 2a 2a 20 73 65 71 75 65 6e  ng a.  ** sequen
16e20 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  ce of comparison
16e30 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  s..  */.  if( eT
16e40 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 4e 4f  ype==IN_INDEX_NO
16e50 4f 50 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  OP ){.    ExprLi
16e60 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
16e70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
16e80 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
16e90 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
16ea0 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
16eb0 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69  r->pLeft);.    i
16ec0 6e 74 20 6c 61 62 65 6c 4f 6b 20 3d 20 73 71 6c  nt labelOk = sql
16ed0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
16ee0 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74 20 72 32  l(v);.    int r2
16ef0 2c 20 72 65 67 54 6f 46 72 65 65 3b 0a 20 20 20  , regToFree;.   
16f00 20 69 6e 74 20 72 65 67 43 6b 4e 75 6c 6c 20 3d   int regCkNull =
16f10 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a   0;.    int ii;.
16f20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
16f30 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
16f40 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
16f50 29 20 29 3b 0a 20 20 20 20 69 66 28 20 64 65 73  ) );.    if( des
16f60 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46  tIfNull!=destIfF
16f70 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20 72 65  alse ){.      re
16f80 67 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65  gCkNull = sqlite
16f90 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
16fa0 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
16fb0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
16fc0 4f 50 5f 42 69 74 41 6e 64 2c 20 72 31 2c 20 72  OP_BitAnd, r1, r
16fd0 31 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20  1, regCkNull);. 
16fe0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d     }.    for(ii=
16ff0 30 3b 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  0; ii<pList->nEx
17000 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  pr; ii++){.     
17010 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
17020 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
17030 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70  , pList->a[ii].p
17040 45 78 70 72 2c 20 26 72 65 67 54 6f 46 72 65 65  Expr, &regToFree
17050 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 67  );.      if( reg
17060 43 6b 4e 75 6c 6c 20 26 26 20 73 71 6c 69 74 65  CkNull && sqlite
17070 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70  3ExprCanBeNull(p
17080 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70  List->a[ii].pExp
17090 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  r) ){.        sq
170a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
170b0 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 65  v, OP_BitAnd, re
170c0 67 43 6b 4e 75 6c 6c 2c 20 72 32 2c 20 72 65 67  gCkNull, r2, reg
170d0 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d  CkNull);.      }
170e0 0a 20 20 20 20 20 20 69 66 28 20 69 69 3c 70 4c  .      if( ii<pL
170f0 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 7c 7c 20  ist->nExpr-1 || 
17100 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74  destIfNull!=dest
17110 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20  IfFalse ){.     
17120 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17130 64 4f 70 34 28 76 2c 20 4f 50 5f 45 71 2c 20 72  dOp4(v, OP_Eq, r
17140 31 2c 20 6c 61 62 65 6c 4f 6b 2c 20 72 32 2c 0a  1, labelOk, r2,.
17150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17160 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
17170 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
17180 45 51 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  EQ);.        Vdb
17190 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 69  eCoverageIf(v, i
171a0 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  i<pList->nExpr-1
171b0 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
171c0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 69 69 3d  overageIf(v, ii=
171d0 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29  =pList->nExpr-1)
171e0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
171f0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
17200 20 7a 41 66 66 5b 30 5d 29 3b 0a 20 20 20 20 20   zAff[0]);.     
17210 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17220 61 73 73 65 72 74 28 20 64 65 73 74 49 66 4e 75  assert( destIfNu
17230 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73 65 20  ll==destIfFalse 
17240 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
17250 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
17260 4f 50 5f 4e 65 2c 20 72 31 2c 20 64 65 73 74 49  OP_Ne, r1, destI
17270 66 46 61 6c 73 65 2c 20 72 32 2c 0a 20 20 20 20  fFalse, r2,.    
17280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17290 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f        (void*)pCo
172a0 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
172b0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
172c0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
172d0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
172e0 20 7a 41 66 66 5b 30 5d 20 7c 20 53 51 4c 49 54   zAff[0] | SQLIT
172f0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
17300 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
17310 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
17320 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 54 6f  eg(pParse, regTo
17330 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Free);.    }.   
17340 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20 29   if( regCkNull )
17350 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
17360 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
17370 49 73 4e 75 6c 6c 2c 20 72 65 67 43 6b 4e 75 6c  IsNull, regCkNul
17380 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 20  l, destIfNull); 
17390 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
173a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
173b0 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 49 66  beGoto(v, destIf
173c0 46 61 6c 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  False);.    }.  
173d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
173e0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62  olveLabel(v, lab
173f0 65 6c 4f 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74  elOk);.    sqlit
17400 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
17410 28 70 50 61 72 73 65 2c 20 72 65 67 43 6b 4e 75  (pParse, regCkNu
17420 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ll);.  }else{.  
17430 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 76  .    /* If any v
17440 61 6c 75 65 20 6f 6e 20 74 68 65 20 4c 48 53 20  alue on the LHS 
17450 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73  is NULL, the res
17460 75 6c 74 20 6f 66 20 74 68 65 20 49 4e 28 2e 2e  ult of the IN(..
17470 2e 29 20 6f 70 65 72 61 74 6f 72 0a 20 20 20 20  .) operator.    
17480 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
17490 72 20 66 61 6c 73 65 20 6f 72 20 4e 55 4c 4c 2e  r false or NULL.
174a0 20 49 66 20 74 68 65 73 65 20 74 77 6f 20 61 72   If these two ar
174b0 65 20 68 61 6e 64 6c 65 64 20 69 64 65 6e 74 69  e handled identi
174c0 63 61 6c 6c 79 2c 0a 20 20 20 20 2a 2a 20 74 65  cally,.    ** te
174d0 73 74 20 74 68 65 20 4c 48 53 20 66 6f 72 20 4e  st the LHS for N
174e0 55 4c 4c 73 20 61 6e 64 20 6a 75 6d 70 20 64 69  ULLs and jump di
174f0 72 65 63 74 6c 79 20 74 6f 20 64 65 73 74 49 66  rectly to destIf
17500 4e 75 6c 6c 20 69 66 20 61 6e 79 20 61 72 65 0a  Null if any are.
17510 20 20 20 20 2a 2a 20 66 6f 75 6e 64 2e 20 0a 20      ** found. . 
17520 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 74 68     **.    ** Oth
17530 65 72 77 69 73 65 2c 20 69 66 20 4e 55 4c 4c 20  erwise, if NULL 
17540 61 6e 64 20 66 61 6c 73 65 20 61 72 65 20 68 61  and false are ha
17550 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c  ndled differentl
17560 79 2c 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a  y, and the.    *
17570 2a 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74  * IN(...) operat
17580 69 6f 6e 20 69 73 20 6e 6f 74 20 61 20 76 65 63  ion is not a vec
17590 74 6f 72 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61  tor operation, a
175a0 6e 64 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  nd the LHS of th
175b0 65 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f  e.    ** operato
175c0 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  r is NULL, then 
175d0 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 66 61  the result is fa
175e0 6c 73 65 20 69 66 20 74 68 65 20 69 6e 64 65 78  lse if the index
175f0 20 69 73 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70   is .    ** comp
17600 6c 65 74 65 6c 79 20 65 6d 70 74 79 2c 20 6f 72  letely empty, or
17610 20 4e 55 4c 4c 20 6f 74 68 65 72 77 69 73 65 2e   NULL otherwise.
17620 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 65 73    */.    if( des
17630 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46  tIfNull==destIfF
17640 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20 66 6f  alse ){.      fo
17650 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72  r(i=0; i<nVector
17660 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
17670 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65  Expr *p = sqlite
17680 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65  3VectorFieldSube
17690 78 70 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  xpr(pExpr->pLeft
176a0 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , i);.        if
176b0 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e  ( sqlite3ExprCan
176c0 42 65 4e 75 6c 6c 28 70 29 20 29 7b 0a 20 20 20  BeNull(p) ){.   
176d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
176e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
176f0 73 4e 75 6c 6c 2c 20 72 31 2b 61 69 4d 61 70 5b  sNull, r1+aiMap[
17700 69 5d 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  i], destIfNull);
17710 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43  .          VdbeC
17720 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
17730 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
17740 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56 65 63    }else if( nVec
17750 74 6f 72 3d 3d 31 20 26 26 20 73 71 6c 69 74 65  tor==1 && sqlite
17760 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70  3ExprCanBeNull(p
17770 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 7b 0a  Expr->pLeft) ){.
17780 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 31 20        int addr1 
17790 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
177a0 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  Op1(v, OP_NotNul
177b0 6c 2c 20 72 31 29 3b 20 56 64 62 65 43 6f 76 65  l, r1); VdbeCove
177c0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73  rage(v);.      s
177d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
177e0 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70  (v, OP_Rewind, p
177f0 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65  Expr->iTable, de
17800 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
17810 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
17820 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17830 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74  VdbeGoto(v, dest
17840 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
17850 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
17860 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
17870 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 65    }.  .    if( e
17880 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52  Type==IN_INDEX_R
17890 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a  OWID ){.      /*
178a0 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
178b0 68 65 20 52 48 53 20 69 73 20 74 68 65 20 52 4f  he RHS is the RO
178c0 57 49 44 20 6f 66 20 74 61 62 6c 65 20 62 2d 74  WID of table b-t
178d0 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ree */.      sql
178e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
178f0 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20  , OP_SeekRowid, 
17900 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64  pExpr->iTable, d
17910 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31 29 3b  estIfFalse, r1);
17920 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
17930 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73  age(v);.    }els
17940 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  e{.      /* In t
17950 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 52 48  his case, the RH
17960 53 20 69 73 20 61 6e 20 69 6e 64 65 78 20 62 2d  S is an index b-
17970 74 72 65 65 2e 20 41 70 70 6c 79 20 74 68 65 20  tree. Apply the 
17980 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 20  comparison.     
17990 20 2a 2a 20 61 66 66 69 6e 69 74 69 65 73 20 74   ** affinities t
179a0 6f 20 65 61 63 68 20 76 61 6c 75 65 20 6f 6e 20  o each value on 
179b0 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 6f  the LHS of the o
179c0 70 65 72 61 74 6f 72 2e 20 20 2a 2f 0a 20 20 20  perator.  */.   
179d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
179e0 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e  dOp4(v, OP_Affin
179f0 69 74 79 2c 20 72 31 2c 20 6e 56 65 63 74 6f 72  ity, r1, nVector
17a00 2c 20 30 2c 20 7a 41 66 66 2c 20 6e 56 65 63 74  , 0, zAff, nVect
17a10 6f 72 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20  or);.      .    
17a20 20 20 69 66 28 20 6e 56 65 63 74 6f 72 3e 31 20    if( nVector>1 
17a30 26 26 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64  && destIfNull!=d
17a40 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20  estIfFalse ){.  
17a50 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d        int iIdx =
17a60 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
17a70 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
17a80 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  ;.        int ad
17a90 64 72 4e 65 78 74 3b 0a 0a 20 20 20 20 20 20 20  drNext;..       
17aa0 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20 69   /* Search the i
17ab0 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b 65 79  ndex for the key
17ac0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 64 64  . */.        add
17ad0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
17ae0 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
17af0 6f 75 6e 64 2c 20 69 49 64 78 2c 20 30 2c 20 72  ound, iIdx, 0, r
17b00 31 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20  1, nVector);.   
17b10 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
17b20 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  e(v);..        /
17b30 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
17b40 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6b 65  the specified ke
17b50 79 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74  y is not present
17b60 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20 0a   in the index, .
17b70 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68          ** so th
17b80 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
17b90 49 4e 28 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20  IN(..) operator 
17ba0 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
17bb0 55 4c 4c 20 6f 72 0a 20 20 20 20 20 20 20 20 2a  ULL or.        *
17bc0 2a 20 30 2e 20 54 68 65 20 76 64 62 65 20 63 6f  * 0. The vdbe co
17bd0 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 65 6c  de generated bel
17be0 6f 77 20 66 69 67 75 72 65 73 20 6f 75 74 20 77  ow figures out w
17bf0 68 69 63 68 2e 20 20 2a 2f 0a 20 20 20 20 20 20  hich.  */.      
17c00 20 20 61 64 64 72 4e 65 78 74 20 3d 20 31 2b 73    addrNext = 1+s
17c10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17c20 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
17c30 49 64 78 2c 20 64 65 73 74 49 66 46 61 6c 73 65  Idx, destIfFalse
17c40 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
17c50 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20  overage(v);..   
17c60 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
17c70 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20  nVector; i++){. 
17c80 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
17c90 3b 0a 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c  ;.          Coll
17ca0 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
17cb0 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73        int r2 = s
17cc0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
17cd0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
17ce0 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 56      p = sqlite3V
17cf0 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70  ectorFieldSubexp
17d00 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20  r(pLeft, i);.   
17d10 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
17d20 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
17d30 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 0a 20  q(pParse, p);.. 
17d40 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17d50 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
17d60 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 2c 20 69  _Column, iIdx, i
17d70 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 20  , r2);.         
17d80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17d90 70 34 28 76 2c 20 4f 50 5f 45 71 2c 20 72 31 2b  p4(v, OP_Eq, r1+
17da0 69 2c 20 30 2c 20 72 32 2c 20 28 76 6f 69 64 2a  i, 0, r2, (void*
17db0 29 70 43 6f 6c 6c 2c 50 34 5f 43 4f 4c 4c 53 45  )pColl,P4_COLLSE
17dc0 51 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  Q);.          sq
17dd0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
17de0 35 28 76 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  5(v, SQLITE_JUMP
17df0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20  IFNULL);.       
17e00 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
17e10 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  v);.          sq
17e20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17e30 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 49 64 78  v, OP_Next, iIdx
17e40 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20  , addrNext);.   
17e50 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
17e60 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
17e70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17e80 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
17e90 30 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  0, destIfFalse);
17ea0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
17eb0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
17ec0 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
17ed0 72 65 6e 74 41 64 64 72 28 76 29 2d 33 29 3b 0a  rentAddr(v)-3);.
17ee0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
17ef0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
17f00 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20  pParse, r2);.   
17f10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
17f20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17f30 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
17f40 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20  destIfNull);..  
17f50 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79        /* The key
17f60 20 77 61 73 20 66 6f 75 6e 64 20 69 6e 20 74 68   was found in th
17f70 65 20 69 6e 64 65 78 2e 20 49 66 20 69 74 20 63  e index. If it c
17f80 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c  ontains any NULL
17f90 20 76 61 6c 75 65 73 2c 0a 20 20 20 20 20 20 20   values,.       
17fa0 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73   ** then the res
17fb0 75 6c 74 20 6f 66 20 74 68 65 20 49 4e 28 2e 2e  ult of the IN(..
17fc0 2e 29 20 6f 70 65 72 61 74 6f 72 20 69 73 20 4e  .) operator is N
17fd0 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ULL. Otherwise, 
17fe0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  the.        ** r
17ff0 65 73 75 6c 74 20 69 73 20 31 2e 20 20 2a 2f 0a  esult is 1.  */.
18000 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18010 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
18020 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  ddr);.        fo
18030 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72  r(i=0; i<nVector
18040 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
18050 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69    Expr *p = sqli
18060 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75  te3VectorFieldSu
18070 62 65 78 70 72 28 70 45 78 70 72 2d 3e 70 4c 65  bexpr(pExpr->pLe
18080 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  ft, i);.        
18090 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
180a0 72 43 61 6e 42 65 4e 75 6c 6c 28 70 29 20 29 7b  rCanBeNull(p) ){
180b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
180c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
180d0 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2b  , OP_IsNull, r1+
180e0 61 69 4d 61 70 5b 69 5d 2c 20 64 65 73 74 49 66  aiMap[i], destIf
180f0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  Null);.         
18100 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
18110 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  v);.          }.
18120 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
18130 20 7d 65 6c 73 65 20 69 66 28 20 72 52 68 73 48   }else if( rRhsH
18140 61 73 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  asNull==0 ){.   
18150 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
18160 6e 63 68 20 72 75 6e 73 20 69 66 20 69 74 20 69  nch runs if it i
18170 73 20 6b 6e 6f 77 6e 20 61 74 20 63 6f 6d 70 69  s known at compi
18180 6c 65 20 74 69 6d 65 20 74 68 61 74 20 74 68 65  le time that the
18190 20 52 48 53 0a 20 20 20 20 20 20 20 20 2a 2a 20   RHS.        ** 
181a0 63 61 6e 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4e  cannot contain N
181b0 55 4c 4c 20 76 61 6c 75 65 73 2e 20 54 68 69 73  ULL values. This
181c0 20 68 61 70 70 65 6e 73 20 61 73 20 61 20 72 65   happens as a re
181d0 73 75 6c 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  sult.        ** 
181e0 6f 66 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f  of "NOT NULL" co
181f0 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65  nstraints in the
18200 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
18210 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
18220 20 20 20 20 20 2a 2a 20 41 6c 73 6f 20 72 75 6e       ** Also run
18230 20 74 68 69 73 20 62 72 61 6e 63 68 20 69 66 20   this branch if 
18240 4e 55 4c 4c 20 69 73 20 65 71 75 69 76 61 6c 65  NULL is equivale
18250 6e 74 20 74 6f 20 46 41 4c 53 45 0a 20 20 20 20  nt to FALSE.    
18260 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 69 73 20      ** for this 
18270 70 61 72 74 69 63 75 6c 61 72 20 49 4e 20 6f 70  particular IN op
18280 65 72 61 74 6f 72 2e 20 20 2a 2f 0a 20 20 20 20  erator.  */.    
18290 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
182a0 64 64 4f 70 34 49 6e 74 28 0a 20 20 20 20 20 20  ddOp4Int(.      
182b0 20 20 20 20 20 20 76 2c 20 4f 50 5f 4e 6f 74 46        v, OP_NotF
182c0 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61  ound, pExpr->iTa
182d0 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65  ble, destIfFalse
182e0 2c 20 72 31 2c 20 6e 56 65 63 74 6f 72 0a 20 20  , r1, nVector.  
182f0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
18300 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
18310 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
18320 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69         /* In thi
18330 73 20 62 72 61 6e 63 68 2c 20 74 68 65 20 52 48  s branch, the RH
18340 53 20 6f 66 20 74 68 65 20 49 4e 20 6d 69 67 68  S of the IN migh
18350 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c  t contain a NULL
18360 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
18370 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20  the presence of 
18380 61 20 4e 55 4c 4c 20 6f 6e 20 74 68 65 20 52 48  a NULL on the RH
18390 53 20 6d 61 6b 65 73 20 61 20 64 69 66 66 65 72  S makes a differ
183a0 65 6e 63 65 20 69 6e 20 74 68 65 0a 20 20 20 20  ence in the.    
183b0 20 20 20 20 2a 2a 20 6f 75 74 63 6f 6d 65 2e 0a      ** outcome..
183c0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
183d0 20 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 0a 20     int addr1;.. 
183e0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
183f0 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
18400 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e 74 61  the LHS is conta
18410 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 2e  ined in the RHS.
18420 20 20 49 66 20 73 6f 2c 0a 20 20 20 20 20 20 20    If so,.       
18430 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 61 6e 73   ** then the ans
18440 77 65 72 20 69 73 20 54 52 55 45 20 74 68 65 20  wer is TRUE the 
18450 70 72 65 73 65 6e 63 65 20 6f 66 20 4e 55 4c 4c  presence of NULL
18460 73 20 69 6e 20 74 68 65 20 52 48 53 20 64 6f 65  s in the RHS doe
18470 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74  s.        ** not
18480 20 6d 61 74 74 65 72 2e 20 20 49 66 20 74 68 65   matter.  If the
18490 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74   LHS is not cont
184a0 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53  ained in the RHS
184b0 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20  , then the.     
184c0 20 20 20 2a 2a 20 61 6e 73 77 65 72 20 69 73 20     ** answer is 
184d0 4e 55 4c 4c 20 69 66 20 74 68 65 20 52 48 53 20  NULL if the RHS 
184e0 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 20 61  contains NULLs a
184f0 6e 64 20 74 68 65 20 61 6e 73 77 65 72 20 69 73  nd the answer is
18500 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 41 4c 53  .        ** FALS
18510 45 20 69 66 20 74 68 65 20 52 48 53 20 69 73 20  E if the RHS is 
18520 4e 55 4c 4c 2d 66 72 65 65 2e 0a 20 20 20 20 20  NULL-free..     
18530 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 64     */.        ad
18540 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
18550 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
18560 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69  _Found, pExpr->i
18570 54 61 62 6c 65 2c 20 30 2c 20 72 31 2c 20 31 29  Table, 0, r1, 1)
18580 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
18590 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
185a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
185b0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
185c0 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20  l, rRhsHasNull, 
185d0 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
185e0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
185f0 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  e(v);.        sq
18600 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
18610 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
18620 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
18630 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
18640 64 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  dr1);.      }.  
18650 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
18660 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
18670 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 73  pParse, r1);.  s
18680 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
18690 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  op(pParse);.  sq
186a0 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72  lite3DbFree(pPar
186b0 73 65 2d 3e 64 62 2c 20 61 69 4d 61 70 29 3b 0a  se->db, aiMap);.
186c0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
186d0 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 41 66 66  pParse->db, zAff
186e0 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
186f0 28 28 76 2c 20 22 65 6e 64 20 49 4e 20 65 78 70  ((v, "end IN exp
18700 72 22 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  r"));.}.#endif /
18710 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
18720 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64  BQUERY */..#ifnd
18730 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
18740 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a  LOATING_POINT./*
18750 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20  .** Generate an 
18760 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
18770 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 66 6c   will put the fl
18780 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20  oating point.** 
18790 76 61 6c 75 65 20 64 65 73 63 72 69 62 65 64 20  value described 
187a0 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74  by z[0..n-1] int
187b0 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e  o register iMem.
187c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73  .**.** The z[] s
187d0 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61  tring will proba
187e0 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d  bly not be zero-
187f0 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74  terminated.  But
18800 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68   the .** z[n] ch
18810 61 72 61 63 74 65 72 20 69 73 20 67 75 61 72 61  aracter is guara
18820 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65  nteed to be some
18830 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20  thing that does 
18840 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65  not look.** like
18850 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f   the continuatio
18860 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e  n of the number.
18870 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
18880 63 6f 64 65 52 65 61 6c 28 56 64 62 65 20 2a 76  codeReal(Vdbe *v
18890 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  , const char *z,
188a0 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61 67 2c   int negateFlag,
188b0 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66   int iMem){.  if
188c0 28 20 41 4c 57 41 59 53 28 7a 21 3d 30 29 20 29  ( ALWAYS(z!=0) )
188d0 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c  {.    double val
188e0 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41  ue;.    sqlite3A
188f0 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73  toF(z, &value, s
18900 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
18910 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  ), SQLITE_UTF8);
18920 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 73 71  .    assert( !sq
18930 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c 75 65  lite3IsNaN(value
18940 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77 20  ) ); /* The new 
18950 41 74 6f 46 20 6e 65 76 65 72 20 72 65 74 75 72  AtoF never retur
18960 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69 66  ns NaN */.    if
18970 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29 20 76  ( negateFlag ) v
18980 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20  alue = -value;. 
18990 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
189a0 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 52  dOp4Dup8(v, OP_R
189b0 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c  eal, 0, iMem, 0,
189c0 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34   (u8*)&value, P4
189d0 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65  _REAL);.  }.}.#e
189e0 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ndif.../*.** Gen
189f0 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63  erate an instruc
18a00 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70  tion that will p
18a10 75 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 64  ut the integer d
18a20 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65  escribe by.** te
18a30 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74  xt z[0..n-1] int
18a40 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e  o register iMem.
18a50 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a 54  .**.** Expr.u.zT
18a60 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79 73 20 55  oken is always U
18a70 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d 74 65 72  TF8 and zero-ter
18a80 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  minated..*/.stat
18a90 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65  ic void codeInte
18aa0 67 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ger(Parse *pPars
18ab0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
18ac0 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74  int negFlag, int
18ad0 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a   iMem){.  Vdbe *
18ae0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
18af0 65 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  e;.  if( pExpr->
18b00 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61  flags & EP_IntVa
18b10 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  lue ){.    int i
18b20 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c   = pExpr->u.iVal
18b30 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
18b40 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  i>=0 );.    if( 
18b50 6e 65 67 46 6c 61 67 20 29 20 69 20 3d 20 2d 69  negFlag ) i = -i
18b60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
18b70 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
18b80 74 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b  teger, i, iMem);
18b90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
18ba0 74 20 63 3b 0a 20 20 20 20 69 36 34 20 76 61 6c  t c;.    i64 val
18bb0 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  ue;.    const ch
18bc0 61 72 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75  ar *z = pExpr->u
18bd0 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73  .zToken;.    ass
18be0 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20  ert( z!=0 );.   
18bf0 20 63 20 3d 20 73 71 6c 69 74 65 33 44 65 63 4f   c = sqlite3DecO
18c00 72 48 65 78 54 6f 49 36 34 28 7a 2c 20 26 76 61  rHexToI64(z, &va
18c10 6c 75 65 29 3b 0a 20 20 20 20 69 66 28 20 63 3d  lue);.    if( c=
18c20 3d 30 20 7c 7c 20 28 63 3d 3d 32 20 26 26 20 6e  =0 || (c==2 && n
18c30 65 67 46 6c 61 67 29 20 29 7b 0a 20 20 20 20 20  egFlag) ){.     
18c40 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 7b 20   if( negFlag ){ 
18c50 76 61 6c 75 65 20 3d 20 63 3d 3d 32 20 3f 20 53  value = c==2 ? S
18c60 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 3a 20  MALLEST_INT64 : 
18c70 2d 76 61 6c 75 65 3b 20 7d 0a 20 20 20 20 20 20  -value; }.      
18c80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18c90 34 44 75 70 38 28 76 2c 20 4f 50 5f 49 6e 74 36  4Dup8(v, OP_Int6
18ca0 34 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28  4, 0, iMem, 0, (
18cb0 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34 5f 49  u8*)&value, P4_I
18cc0 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c 73 65  NT64);.    }else
18cd0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
18ce0 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
18cf0 49 4e 54 0a 20 20 20 20 20 20 73 71 6c 69 74 65  INT.      sqlite
18d00 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
18d10 2c 20 22 6f 76 65 72 73 69 7a 65 64 20 69 6e 74  , "oversized int
18d20 65 67 65 72 3a 20 25 73 25 73 22 2c 20 6e 65 67  eger: %s%s", neg
18d30 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c  Flag ? "-" : "",
18d40 20 7a 29 3b 0a 23 65 6c 73 65 0a 23 69 66 6e 64   z);.#else.#ifnd
18d50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 48  ef SQLITE_OMIT_H
18d60 45 58 5f 49 4e 54 45 47 45 52 0a 20 20 20 20 20  EX_INTEGER.     
18d70 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
18d80 6e 69 63 6d 70 28 7a 2c 22 30 78 22 2c 32 29 3d  nicmp(z,"0x",2)=
18d90 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
18da0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
18db0 61 72 73 65 2c 20 22 68 65 78 20 6c 69 74 65 72  arse, "hex liter
18dc0 61 6c 20 74 6f 6f 20 62 69 67 3a 20 25 73 22 2c  al too big: %s",
18dd0 20 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   z);.      }else
18de0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a  .#endif.      {.
18df0 20 20 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c          codeReal
18e00 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67 2c 20  (v, z, negFlag, 
18e10 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 23  iMem);.      }.#
18e20 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
18e30 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
18e40 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
18e50 2a 2a 20 56 65 72 69 66 79 20 74 68 65 20 63 6f  ** Verify the co
18e60 6e 73 69 73 74 65 6e 63 79 20 6f 66 20 74 68 65  nsistency of the
18e70 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 0a 2a 2f   column cache.*/
18e80 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 68  .static int cach
18e90 65 49 73 56 61 6c 69 64 28 50 61 72 73 65 20 2a  eIsValid(Parse *
18ea0 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69  pParse){.  int i
18eb0 2c 20 6e 3b 0a 20 20 66 6f 72 28 69 3d 6e 3d 30  , n;.  for(i=n=0
18ec0 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
18ed0 43 41 43 48 45 3b 20 69 2b 2b 29 7b 0a 20 20 20  CACHE; i++){.   
18ee0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 43 6f   if( pParse->aCo
18ef0 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67 3e 30  lCache[i].iReg>0
18f00 20 29 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65   ) n++;.  }.  re
18f10 74 75 72 6e 20 6e 3d 3d 70 50 61 72 73 65 2d 3e  turn n==pParse->
18f20 6e 43 6f 6c 43 61 63 68 65 3b 0a 7d 0a 23 65 6e  nColCache;.}.#en
18f30 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  dif../*.** Clear
18f40 20 61 20 63 61 63 68 65 20 65 6e 74 72 79 2e 0a   a cache entry..
18f50 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
18f60 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 50  acheEntryClear(P
18f70 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74  arse *pParse, st
18f80 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
18f90 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74 65 6d  p){.  if( p->tem
18fa0 70 52 65 67 20 29 7b 0a 20 20 20 20 69 66 28 20  pReg ){.    if( 
18fb0 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
18fc0 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73  <ArraySize(pPars
18fd0 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a  e->aTempReg) ){.
18fe0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54        pParse->aT
18ff0 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e  empReg[pParse->n
19000 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 2d 3e  TempReg++] = p->
19010 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iReg;.    }.    
19020 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a  p->tempReg = 0;.
19030 20 20 7d 0a 20 20 70 2d 3e 69 52 65 67 20 3d 20    }.  p->iReg = 
19040 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 43 6f  0;.  pParse->nCo
19050 6c 43 61 63 68 65 2d 2d 3b 0a 20 20 61 73 73 65  lCache--;.  asse
19060 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  rt( pParse->db->
19070 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
19080 63 61 63 68 65 49 73 56 61 6c 69 64 28 70 50 61  cacheIsValid(pPa
19090 72 73 65 29 20 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  rse) );.}.../*.*
190a0 2a 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20  * Record in the 
190b0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 74 68 61  column cache tha
190c0 74 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 63  t a particular c
190d0 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 0a 2a 2a 20  olumn from a.** 
190e0 70 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65  particular table
190f0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20   is stored in a 
19100 70 61 72 74 69 63 75 6c 61 72 20 72 65 67 69 73  particular regis
19110 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ter..*/.void sql
19120 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f  ite3ExprCacheSto
19130 72 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  re(Parse *pParse
19140 2c 20 69 6e 74 20 69 54 61 62 2c 20 69 6e 74 20  , int iTab, int 
19150 69 43 6f 6c 2c 20 69 6e 74 20 69 52 65 67 29 7b  iCol, int iReg){
19160 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
19170 6d 69 6e 4c 72 75 3b 0a 20 20 69 6e 74 20 69 64  minLru;.  int id
19180 78 4c 72 75 3b 0a 20 20 73 74 72 75 63 74 20 79  xLru;.  struct y
19190 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20  ColCache *p;..  
191a0 2f 2a 20 55 6e 6c 65 73 73 20 61 6e 20 65 72 72  /* Unless an err
191b0 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c  or has occurred,
191c0 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
191d0 73 20 61 72 65 20 61 6c 77 61 79 73 20 70 6f 73  s are always pos
191e0 69 74 69 76 65 2e 20 2a 2f 0a 20 20 61 73 73 65  itive. */.  asse
191f0 72 74 28 20 69 52 65 67 3e 30 20 7c 7c 20 70 50  rt( iReg>0 || pP
19200 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50  arse->nErr || pP
19210 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
19220 46 61 69 6c 65 64 20 29 3b 0a 20 20 61 73 73 65  Failed );.  asse
19230 72 74 28 20 69 43 6f 6c 3e 3d 2d 31 20 26 26 20  rt( iCol>=-1 && 
19240 69 43 6f 6c 3c 33 32 37 36 38 20 29 3b 20 20 2f  iCol<32768 );  /
19250 2a 20 46 69 6e 69 74 65 20 63 6f 6c 75 6d 6e 20  * Finite column 
19260 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 2f 2a  numbers */..  /*
19270 20 54 68 65 20 53 51 4c 49 54 45 5f 43 6f 6c 75   The SQLITE_Colu
19280 6d 6e 43 61 63 68 65 20 66 6c 61 67 20 64 69 73  mnCache flag dis
19290 61 62 6c 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e  ables the column
192a0 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 69 73   cache.  This is
192b0 20 75 73 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74   used.  ** for t
192c0 65 73 74 69 6e 67 20 6f 6e 6c 79 20 2d 20 74 6f  esting only - to
192d0 20 76 65 72 69 66 79 20 74 68 61 74 20 53 51 4c   verify that SQL
192e0 69 74 65 20 61 6c 77 61 79 73 20 67 65 74 73 20  ite always gets 
192f0 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65 72 0a  the same answer.
19300 20 20 2a 2a 20 77 69 74 68 20 61 6e 64 20 77 69    ** with and wi
19310 74 68 6f 75 74 20 74 68 65 20 63 6f 6c 75 6d 6e  thout the column
19320 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69   cache..  */.  i
19330 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44  f( OptimizationD
19340 69 73 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e  isabled(pParse->
19350 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d  db, SQLITE_Colum
19360 6e 43 61 63 68 65 29 20 29 20 72 65 74 75 72 6e  nCache) ) return
19370 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 72 65  ;..  /* First re
19380 70 6c 61 63 65 20 61 6e 79 20 65 78 69 73 74 69  place any existi
19390 6e 67 20 65 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20  ng entry..  **. 
193a0 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68   ** Actually, th
193b0 65 20 77 61 79 20 74 68 65 20 63 6f 6c 75 6d 6e  e way the column
193c0 20 63 61 63 68 65 20 69 73 20 63 75 72 72 65 6e   cache is curren
193d0 74 6c 79 20 75 73 65 64 2c 20 77 65 20 61 72 65  tly used, we are
193e0 20 67 75 61 72 61 6e 74 65 65 64 0a 20 20 2a 2a   guaranteed.  **
193f0 20 74 68 61 74 20 74 68 65 20 6f 62 6a 65 63 74   that the object
19400 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 6c 72 65   will never alre
19410 61 64 79 20 62 65 20 69 6e 20 63 61 63 68 65 2e  ady be in cache.
19420 20 20 56 65 72 69 66 79 20 74 68 69 73 20 67 75    Verify this gu
19430 61 72 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a 23 69  arantee..  */.#i
19440 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 66  fndef NDEBUG.  f
19450 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
19460 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
19470 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
19480 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
19490 20 61 73 73 65 72 74 28 20 70 2d 3e 69 52 65 67   assert( p->iReg
194a0 3d 3d 30 20 7c 7c 20 70 2d 3e 69 54 61 62 6c 65  ==0 || p->iTable
194b0 21 3d 69 54 61 62 20 7c 7c 20 70 2d 3e 69 43 6f  !=iTab || p->iCo
194c0 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b 0a 20 20  lumn!=iCol );.  
194d0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 46  }.#endif..  /* F
194e0 69 6e 64 20 61 6e 20 65 6d 70 74 79 20 73 6c 6f  ind an empty slo
194f0 74 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69 74  t and replace it
19500 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   */.  for(i=0, p
19510 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
19520 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
19530 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
19540 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
19550 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Reg==0 ){.      
19560 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61 72  p->iLevel = pPar
19570 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b  se->iCacheLevel;
19580 0a 20 20 20 20 20 20 70 2d 3e 69 54 61 62 6c 65  .      p->iTable
19590 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20 70   = iTab;.      p
195a0 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c  ->iColumn = iCol
195b0 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20  ;.      p->iReg 
195c0 3d 20 69 52 65 67 3b 0a 20 20 20 20 20 20 70 2d  = iReg;.      p-
195d0 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20  >tempReg = 0;.  
195e0 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61      p->lru = pPa
195f0 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b  rse->iCacheCnt++
19600 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
19610 6e 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20 20 20  nColCache++;.   
19620 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
19630 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
19640 6c 65 64 20 7c 7c 20 63 61 63 68 65 49 73 56 61  led || cacheIsVa
19650 6c 69 64 28 70 50 61 72 73 65 29 20 29 3b 0a 20  lid(pParse) );. 
19660 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
19670 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70   }.  }..  /* Rep
19680 6c 61 63 65 20 74 68 65 20 6c 61 73 74 20 72 65  lace the last re
19690 63 65 6e 74 6c 79 20 75 73 65 64 20 2a 2f 0a 20  cently used */. 
196a0 20 6d 69 6e 4c 72 75 20 3d 20 30 78 37 66 66 66   minLru = 0x7fff
196b0 66 66 66 66 3b 0a 20 20 69 64 78 4c 72 75 20 3d  ffff;.  idxLru =
196c0 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20   -1;.  for(i=0, 
196d0 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
196e0 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
196f0 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
19700 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
19710 6c 72 75 3c 6d 69 6e 4c 72 75 20 29 7b 0a 20 20  lru<minLru ){.  
19720 20 20 20 20 69 64 78 4c 72 75 20 3d 20 69 3b 0a      idxLru = i;.
19730 20 20 20 20 20 20 6d 69 6e 4c 72 75 20 3d 20 70        minLru = p
19740 2d 3e 6c 72 75 3b 0a 20 20 20 20 7d 0a 20 20 7d  ->lru;.    }.  }
19750 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 69 64  .  if( ALWAYS(id
19760 78 4c 72 75 3e 3d 30 29 20 29 7b 0a 20 20 20 20  xLru>=0) ){.    
19770 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43 6f  p = &pParse->aCo
19780 6c 43 61 63 68 65 5b 69 64 78 4c 72 75 5d 3b 0a  lCache[idxLru];.
19790 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20      p->iLevel = 
197a0 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
197b0 76 65 6c 3b 0a 20 20 20 20 70 2d 3e 69 54 61 62  vel;.    p->iTab
197c0 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70  le = iTab;.    p
197d0 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c  ->iColumn = iCol
197e0 3b 0a 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20  ;.    p->iReg = 
197f0 69 52 65 67 3b 0a 20 20 20 20 70 2d 3e 74 65 6d  iReg;.    p->tem
19800 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 70 2d  pReg = 0;.    p-
19810 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69  >lru = pParse->i
19820 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20  CacheCnt++;.    
19830 61 73 73 65 72 74 28 20 63 61 63 68 65 49 73 56  assert( cacheIsV
19840 61 6c 69 64 28 70 50 61 72 73 65 29 20 29 3b 0a  alid(pParse) );.
19850 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
19860 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74  }../*.** Indicat
19870 65 20 74 68 61 74 20 72 65 67 69 73 74 65 72 73  e that registers
19880 20 62 65 74 77 65 65 6e 20 69 52 65 67 2e 2e 69   between iReg..i
19890 52 65 67 2b 6e 52 65 67 2d 31 20 61 72 65 20 62  Reg+nReg-1 are b
198a0 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e  eing overwritten
198b0 2e 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 72  ..** Purge the r
198c0 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72  ange of register
198d0 73 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d  s from the colum
198e0 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f 69 64  n cache..*/.void
198f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
19900 65 52 65 6d 6f 76 65 28 50 61 72 73 65 20 2a 70  eRemove(Parse *p
19910 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c  Parse, int iReg,
19920 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 73 74   int nReg){.  st
19930 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
19940 70 3b 0a 20 20 69 66 28 20 69 52 65 67 3c 3d 30  p;.  if( iReg<=0
19950 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c   || pParse->nCol
19960 43 61 63 68 65 3d 3d 30 20 29 20 72 65 74 75 72  Cache==0 ) retur
19970 6e 3b 0a 20 20 70 20 3d 20 26 70 50 61 72 73 65  n;.  p = &pParse
19980 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 53 51 4c 49  ->aColCache[SQLI
19990 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 2d 31 5d  TE_N_COLCACHE-1]
199a0 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20  ;.  while(1){.  
199b0 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20 3e 3d    if( p->iReg >=
199c0 20 69 52 65 67 20 26 26 20 70 2d 3e 69 52 65 67   iReg && p->iReg
199d0 20 3c 20 69 52 65 67 2b 6e 52 65 67 20 29 20 63   < iReg+nReg ) c
199e0 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70  acheEntryClear(p
199f0 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69  Parse, p);.    i
19a00 66 28 20 70 3d 3d 70 50 61 72 73 65 2d 3e 61 43  f( p==pParse->aC
19a10 6f 6c 43 61 63 68 65 20 29 20 62 72 65 61 6b 3b  olCache ) break;
19a20 0a 20 20 20 20 70 2d 2d 3b 0a 20 20 7d 0a 7d 0a  .    p--;.  }.}.
19a30 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20  ./*.** Remember 
19a40 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c 75  the current colu
19a50 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74 65 78 74  mn cache context
19a60 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e 74 72 69  .  Any new entri
19a70 65 73 20 61 64 64 65 64 0a 2a 2a 20 61 64 64 65  es added.** adde
19a80 64 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d to the column 
19a90 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73  cache after this
19aa0 20 63 61 6c 6c 20 61 72 65 20 72 65 6d 6f 76 65   call are remove
19ab0 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 63 6f  d when the.** co
19ac0 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 70 20  rresponding pop 
19ad0 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20  occurs..*/.void 
19ae0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
19af0 50 75 73 68 28 50 61 72 73 65 20 2a 70 50 61 72  Push(Parse *pPar
19b00 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 69  se){.  pParse->i
19b10 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a 23 69  CacheLevel++;.#i
19b20 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
19b30 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  G.  if( pParse->
19b40 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
19b50 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63  TE_VdbeAddopTrac
19b60 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  e ){.    printf(
19b70 22 50 55 53 48 20 74 6f 20 25 64 5c 6e 22 2c 20  "PUSH to %d\n", 
19b80 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
19b90 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  vel);.  }.#endif
19ba0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
19bb0 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e   from the column
19bc0 20 63 61 63 68 65 20 61 6e 79 20 65 6e 74 72 69   cache any entri
19bd0 65 73 20 74 68 61 74 20 77 65 72 65 20 61 64 64  es that were add
19be0 65 64 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20  ed since the.** 
19bf0 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 71 6c  the previous sql
19c00 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
19c10 68 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 49 6e  h operation.  In
19c20 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65   other words, re
19c30 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20 63 61 63  store.** the cac
19c40 68 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 20  he to the state 
19c50 69 74 20 77 61 73 20 69 6e 20 70 72 69 6f 72 20  it was in prior 
19c60 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
19c70 50 75 73 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  Push..*/.void sq
19c80 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
19c90 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  p(Parse *pParse)
19ca0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
19cb0 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
19cc0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
19cd0 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3e  se->iCacheLevel>
19ce0 3d 31 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  =1 );.  pParse->
19cf0 69 43 61 63 68 65 4c 65 76 65 6c 2d 2d 3b 0a 23  iCacheLevel--;.#
19d00 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
19d10 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  UG.  if( pParse-
19d20 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
19d30 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61  ITE_VdbeAddopTra
19d40 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  ce ){.    printf
19d50 28 22 50 4f 50 20 20 74 6f 20 25 64 5c 6e 22 2c  ("POP  to %d\n",
19d60 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
19d70 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  evel);.  }.#endi
19d80 66 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  f.  for(i=0, p=p
19d90 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
19da0 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
19db0 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
19dc0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65  {.    if( p->iRe
19dd0 67 20 26 26 20 70 2d 3e 69 4c 65 76 65 6c 3e 70  g && p->iLevel>p
19de0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
19df0 65 6c 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68  el ){.      cach
19e00 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72  eEntryClear(pPar
19e10 73 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20  se, p);.    }.  
19e20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  }.}../*.** When 
19e30 61 20 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e 20  a cached column 
19e40 69 73 20 72 65 75 73 65 64 2c 20 6d 61 6b 65 20  is reused, make 
19e50 73 75 72 65 20 74 68 61 74 20 69 74 73 20 72 65  sure that its re
19e60 67 69 73 74 65 72 20 69 73 0a 2a 2a 20 6e 6f 20  gister is.** no 
19e70 6c 6f 6e 67 65 72 20 61 76 61 69 6c 61 62 6c 65  longer available
19e80 20 61 73 20 61 20 74 65 6d 70 20 72 65 67 69 73   as a temp regis
19e90 74 65 72 2e 20 20 74 69 63 6b 65 74 20 23 33 38  ter.  ticket #38
19ea0 37 39 3a 20 20 74 68 61 74 20 73 61 6d 65 0a 2a  79:  that same.*
19eb0 2a 20 72 65 67 69 73 74 65 72 20 6d 69 67 68 74  * register might
19ec0 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65   be in the cache
19ed0 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61   in multiple pla
19ee0 63 65 73 2c 20 73 6f 20 62 65 20 73 75 72 65 20  ces, so be sure 
19ef0 74 6f 0a 2a 2a 20 67 65 74 20 74 68 65 6d 20 61  to.** get them a
19f00 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ll..*/.static vo
19f10 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
19f20 63 68 65 50 69 6e 52 65 67 69 73 74 65 72 28 50  chePinRegister(P
19f30 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
19f40 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t iReg){.  int i
19f50 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
19f60 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69  ache *p;.  for(i
19f70 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
19f80 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
19f90 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
19fa0 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, p++){.    if(
19fb0 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29   p->iReg==iReg )
19fc0 7b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52  {.      p->tempR
19fd0 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  eg = 0;.    }.  
19fe0 7d 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65  }.}../* Generate
19ff0 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
1a000 6c 6f 61 64 20 69 6e 74 6f 20 72 65 67 69 73 74  load into regist
1a010 65 72 20 72 65 67 4f 75 74 20 61 20 76 61 6c 75  er regOut a valu
1a020 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 70 70  e that is.** app
1a030 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65  ropriate for the
1a040 20 69 49 64 78 43 6f 6c 2d 74 68 20 63 6f 6c 75   iIdxCol-th colu
1a050 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78  mn of index pIdx
1a060 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1a070 33 45 78 70 72 43 6f 64 65 4c 6f 61 64 49 6e 64  3ExprCodeLoadInd
1a080 65 78 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73  exColumn(.  Pars
1a090 65 20 2a 70 50 61 72 73 65 2c 20 20 2f 2a 20 54  e *pParse,  /* T
1a0a0 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
1a0b0 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  xt */.  Index *p
1a0c0 49 64 78 2c 20 20 20 20 2f 2a 20 54 68 65 20 69  Idx,    /* The i
1a0d0 6e 64 65 78 20 77 68 6f 73 65 20 63 6f 6c 75 6d  ndex whose colum
1a0e0 6e 20 69 73 20 74 6f 20 62 65 20 6c 6f 61 64 65  n is to be loade
1a0f0 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43  d */.  int iTabC
1a100 75 72 2c 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ur,    /* Cursor
1a110 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 74   pointing to a t
1a120 61 62 6c 65 20 72 6f 77 20 2a 2f 0a 20 20 69 6e  able row */.  in
1a130 74 20 69 49 64 78 43 6f 6c 2c 20 20 20 20 2f 2a  t iIdxCol,    /*
1a140 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   The column of t
1a150 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 6c  he index to be l
1a160 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72  oaded */.  int r
1a170 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 53 74  egOut      /* St
1a180 6f 72 65 20 74 68 65 20 69 6e 64 65 78 20 63 6f  ore the index co
1a190 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 74 68  lumn value in th
1a1a0 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29  is register */.)
1a1b0 7b 0a 20 20 69 31 36 20 69 54 61 62 43 6f 6c 20  {.  i16 iTabCol 
1a1c0 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
1a1d0 5b 69 49 64 78 43 6f 6c 5d 3b 0a 20 20 69 66 28  [iIdxCol];.  if(
1a1e0 20 69 54 61 62 43 6f 6c 3d 3d 58 4e 5f 45 58 50   iTabCol==XN_EXP
1a1f0 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  R ){.    assert(
1a200 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 20   pIdx->aColExpr 
1a210 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1a220 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 6e  Idx->aColExpr->n
1a230 45 78 70 72 3e 69 49 64 78 43 6f 6c 20 29 3b 0a  Expr>iIdxCol );.
1a240 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c      pParse->iSel
1a250 66 54 61 62 20 3d 20 69 54 61 62 43 75 72 3b 0a  fTab = iTabCur;.
1a260 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1a270 6f 64 65 43 6f 70 79 28 70 50 61 72 73 65 2c 20  odeCopy(pParse, 
1a280 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e  pIdx->aColExpr->
1a290 61 5b 69 49 64 78 43 6f 6c 5d 2e 70 45 78 70 72  a[iIdxCol].pExpr
1a2a0 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c  , regOut);.  }el
1a2b0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
1a2c0 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
1a2d0 4f 66 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  OfTable(pParse->
1a2e0 70 56 64 62 65 2c 20 70 49 64 78 2d 3e 70 54 61  pVdbe, pIdx->pTa
1a2f0 62 6c 65 2c 20 69 54 61 62 43 75 72 2c 0a 20 20  ble, iTabCur,.  
1a300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a320 20 20 69 54 61 62 43 6f 6c 2c 20 72 65 67 4f 75    iTabCol, regOu
1a330 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
1a340 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1a350 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 76 61  o extract the va
1a360 6c 75 65 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d  lue of the iCol-
1a370 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74  th column of a t
1a380 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  able..*/.void sq
1a390 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
1a3a0 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 0a 20  ColumnOfTable(. 
1a3b0 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
1a3c0 20 2f 2a 20 54 68 65 20 56 44 42 45 20 75 6e 64   /* The VDBE und
1a3d0 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
1a3e0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
1a3f0 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  ,    /* The tabl
1a400 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
1a410 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20   value */.  int 
1a420 69 54 61 62 43 75 72 2c 20 20 20 20 2f 2a 20 54  iTabCur,    /* T
1a430 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2e  he table cursor.
1a440 20 20 4f 72 20 74 68 65 20 50 4b 20 63 75 72 73    Or the PK curs
1a450 6f 72 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52  or for WITHOUT R
1a460 4f 57 49 44 20 2a 2f 0a 20 20 69 6e 74 20 69 43  OWID */.  int iC
1a470 6f 6c 2c 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ol,       /* Ind
1a480 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ex of the column
1a490 20 74 6f 20 65 78 74 72 61 63 74 20 2a 2f 0a 20   to extract */. 
1a4a0 20 69 6e 74 20 72 65 67 4f 75 74 20 20 20 20 20   int regOut     
1a4b0 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20   /* Extract the 
1a4c0 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 69 73 20  value into this 
1a4d0 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20  register */.){. 
1a4e0 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 69   if( iCol<0 || i
1a4f0 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79  Col==pTab->iPKey
1a500 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1a510 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a520 52 6f 77 69 64 2c 20 69 54 61 62 43 75 72 2c 20  Rowid, iTabCur, 
1a530 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65  regOut);.  }else
1a540 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 49  {.    int op = I
1a550 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 3f  sVirtual(pTab) ?
1a560 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50   OP_VColumn : OP
1a570 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 6e 74  _Column;.    int
1a580 20 78 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 69   x = iCol;.    i
1a590 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
1a5a0 62 29 20 26 26 20 21 49 73 56 69 72 74 75 61 6c  b) && !IsVirtual
1a5b0 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
1a5c0 78 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  x = sqlite3Colum
1a5d0 6e 4f 66 49 6e 64 65 78 28 73 71 6c 69 74 65 33  nOfIndex(sqlite3
1a5e0 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
1a5f0 70 54 61 62 29 2c 20 69 43 6f 6c 29 3b 0a 20 20  pTab), iCol);.  
1a600 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
1a610 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c  dbeAddOp3(v, op,
1a620 20 69 54 61 62 43 75 72 2c 20 78 2c 20 72 65 67   iTabCur, x, reg
1a630 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Out);.  }.  if( 
1a640 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 73  iCol>=0 ){.    s
1a650 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61  qlite3ColumnDefa
1a660 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 43 6f  ult(v, pTab, iCo
1a670 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a  l, regOut);.  }.
1a680 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1a690 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
1a6a0 20 65 78 74 72 61 63 74 20 74 68 65 20 69 43 6f   extract the iCo
1a6b0 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66  lumn-th column f
1a6c0 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61  rom.** table pTa
1a6d0 62 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  b and store the 
1a6e0 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20  column value in 
1a6f0 61 20 72 65 67 69 73 74 65 72 2e 20 0a 2a 2a 0a  a register. .**.
1a700 2a 2a 20 41 6e 20 65 66 66 6f 72 74 20 69 73 20  ** An effort is 
1a710 6d 61 64 65 20 74 6f 20 73 74 6f 72 65 20 74 68  made to store th
1a720 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  e column value i
1a730 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2e  n register iReg.
1a740 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74    This.** is not
1a750 20 67 61 72 61 6e 74 65 65 65 64 20 66 6f 72 20   garanteeed for 
1a760 47 65 74 43 6f 6c 75 6d 6e 28 29 20 2d 20 74 68  GetColumn() - th
1a770 65 20 72 65 73 75 6c 74 20 63 61 6e 20 62 65 20  e result can be 
1a780 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 61 6e 79  stored in.** any
1a790 20 72 65 67 69 73 74 65 72 2e 20 20 42 75 74 20   register.  But 
1a7a0 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 67 75  the result is gu
1a7b0 61 72 61 6e 74 65 65 64 20 74 6f 20 6c 61 6e 64  aranteed to land
1a7c0 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65   in register iRe
1a7d0 67 0a 2a 2a 20 66 6f 72 20 47 65 74 43 6f 6c 75  g.** for GetColu
1a7e0 6d 6e 54 6f 52 65 67 28 29 2e 0a 2a 2a 0a 2a 2a  mnToReg()..**.**
1a7f0 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
1a800 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 6f  n open cursor to
1a810 20 70 54 61 62 20 69 6e 20 69 54 61 62 6c 65 20   pTab in iTable 
1a820 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
1a830 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20  e.** is called. 
1a840 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68   If iColumn<0 th
1a850 65 6e 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72  en code is gener
1a860 61 74 65 64 20 74 68 61 74 20 65 78 74 72 61 63  ated that extrac
1a870 74 73 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2f  ts the rowid..*/
1a880 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
1a890 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 0a 20  CodeGetColumn(. 
1a8a0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1a8b0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
1a8c0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
1a8d0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61   context */.  Ta
1a8e0 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f  ble *pTab,     /
1a8f0 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  * Description of
1a900 20 74 68 65 20 74 61 62 6c 65 20 77 65 20 61 72   the table we ar
1a910 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a  e reading from *
1a920 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c  /.  int iColumn,
1a930 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1a940 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d   the table colum
1a950 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  n */.  int iTabl
1a960 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  e,      /* The c
1a970 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
1a980 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  o the table */. 
1a990 20 69 6e 74 20 69 52 65 67 2c 20 20 20 20 20 20   int iReg,      
1a9a0 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c    /* Store resul
1a9b0 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 75 38 20  ts here */.  u8 
1a9c0 70 35 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p5            /*
1a9d0 20 50 35 20 76 61 6c 75 65 20 66 6f 72 20 4f 50   P5 value for OP
1a9e0 5f 43 6f 6c 75 6d 6e 20 2b 20 46 4c 41 47 53 20  _Column + FLAGS 
1a9f0 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
1aa00 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1aa10 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
1aa20 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
1aa30 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ..  for(i=0, p=p
1aa40 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
1aa50 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
1aa60 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
1aa70 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65  {.    if( p->iRe
1aa80 67 3e 30 20 26 26 20 70 2d 3e 69 54 61 62 6c 65  g>0 && p->iTable
1aa90 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 2d 3e 69  ==iTable && p->i
1aaa0 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20  Column==iColumn 
1aab0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20  ){.      p->lru 
1aac0 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
1aad0 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  Cnt++;.      sql
1aae0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 69 6e  ite3ExprCachePin
1aaf0 52 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2c  Register(pParse,
1ab00 20 70 2d 3e 69 52 65 67 29 3b 0a 20 20 20 20 20   p->iReg);.     
1ab10 20 72 65 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b   return p->iReg;
1ab20 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61  .    }.  }  .  a
1ab30 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
1ab40 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1ab50 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
1ab60 28 76 2c 20 70 54 61 62 2c 20 69 54 61 62 6c 65  (v, pTab, iTable
1ab70 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29  , iColumn, iReg)
1ab80 3b 0a 20 20 69 66 28 20 70 35 20 29 7b 0a 20 20  ;.  if( p5 ){.  
1ab90 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1aba0 6e 67 65 50 35 28 76 2c 20 70 35 29 3b 0a 20 20  ngeP5(v, p5);.  
1abb0 7d 65 6c 73 65 7b 20 20 20 0a 20 20 20 20 73 71  }else{   .    sq
1abc0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74  lite3ExprCacheSt
1abd0 6f 72 65 28 70 50 61 72 73 65 2c 20 69 54 61 62  ore(pParse, iTab
1abe0 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65  le, iColumn, iRe
1abf0 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
1ac00 20 69 52 65 67 3b 0a 7d 0a 76 6f 69 64 20 73 71   iReg;.}.void sq
1ac10 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
1ac20 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 0a 20 20 50  ColumnToReg(.  P
1ac30 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1ac40 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
1ac50 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
1ac60 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c  ontext */.  Tabl
1ac70 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20  e *pTab,     /* 
1ac80 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  Description of t
1ac90 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20  he table we are 
1aca0 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a  reading from */.
1acb0 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20    int iColumn,  
1acc0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
1acd0 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20  he table column 
1ace0 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
1acf0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
1ad00 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
1ad10 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  the table */.  i
1ad20 6e 74 20 69 52 65 67 20 20 20 20 20 20 20 20 20  nt iReg         
1ad30 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73  /* Store results
1ad40 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
1ad50 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78  t r1 = sqlite3Ex
1ad60 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
1ad70 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69 43  pParse, pTab, iC
1ad80 6f 6c 75 6d 6e 2c 20 69 54 61 62 6c 65 2c 20 69  olumn, iTable, i
1ad90 52 65 67 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  Reg, 0);.  if( r
1ada0 31 21 3d 69 52 65 67 20 29 20 73 71 6c 69 74 65  1!=iReg ) sqlite
1adb0 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72  3VdbeAddOp2(pPar
1adc0 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43  se->pVdbe, OP_SC
1add0 6f 70 79 2c 20 72 31 2c 20 69 52 65 67 29 3b 0a  opy, r1, iReg);.
1ade0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  }.../*.** Clear 
1adf0 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  all column cache
1ae00 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f 69   entries..*/.voi
1ae10 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
1ae20 68 65 43 6c 65 61 72 28 50 61 72 73 65 20 2a 70  heClear(Parse *p
1ae30 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b  Parse){.  int i;
1ae40 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
1ae50 63 68 65 20 2a 70 3b 0a 0a 23 69 66 20 53 51 4c  che *p;..#if SQL
1ae60 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
1ae70 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
1ae80 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41  s & SQLITE_VdbeA
1ae90 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20  ddopTrace ){.   
1aea0 20 70 72 69 6e 74 66 28 22 43 4c 45 41 52 5c 6e   printf("CLEAR\n
1aeb0 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ");.  }.#endif. 
1aec0 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
1aed0 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
1aee0 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
1aef0 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
1af00 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20 29     if( p->iReg )
1af10 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74  {.      cacheEnt
1af20 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20  ryClear(pParse, 
1af30 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  p);.    }.  }.}.
1af40 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68  ./*.** Record th
1af50 65 20 66 61 63 74 20 74 68 61 74 20 61 6e 20 61  e fact that an a
1af60 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65 20 68  ffinity change h
1af70 61 73 20 6f 63 63 75 72 72 65 64 20 6f 6e 20 69  as occurred on i
1af80 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65  Count.** registe
1af90 72 73 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  rs starting with
1afa0 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64   iStart..*/.void
1afb0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1afc0 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
1afd0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1afe0 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69  nt iStart, int i
1aff0 43 6f 75 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65  Count){.  sqlite
1b000 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65  3ExprCacheRemove
1b010 28 70 50 61 72 73 65 2c 20 69 53 74 61 72 74 2c  (pParse, iStart,
1b020 20 69 43 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a   iCount);.}../*.
1b030 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1b040 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74   to move content
1b050 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20   from registers 
1b060 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52  iFrom...iFrom+nR
1b070 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20  eg-1.** over to 
1b080 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e  iTo..iTo+nReg-1.
1b090 20 4b 65 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e   Keep the column
1b0a0 20 63 61 63 68 65 20 75 70 2d 74 6f 2d 64 61 74   cache up-to-dat
1b0b0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
1b0c0 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 50  e3ExprCodeMove(P
1b0d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1b0e0 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f  t iFrom, int iTo
1b0f0 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 61  , int nReg){.  a
1b100 73 73 65 72 74 28 20 69 46 72 6f 6d 3e 3d 69 54  ssert( iFrom>=iT
1b110 6f 2b 6e 52 65 67 20 7c 7c 20 69 46 72 6f 6d 2b  o+nReg || iFrom+
1b120 6e 52 65 67 3c 3d 69 54 6f 20 29 3b 0a 20 20 73  nReg<=iTo );.  s
1b130 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1b140 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
1b150 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20  OP_Move, iFrom, 
1b160 69 54 6f 2c 20 6e 52 65 67 29 3b 0a 20 20 73 71  iTo, nReg);.  sq
1b170 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65  lite3ExprCacheRe
1b180 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 46 72  move(pParse, iFr
1b190 6f 6d 2c 20 6e 52 65 67 29 3b 0a 7d 0a 0a 23 69  om, nReg);.}..#i
1b1a0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1b1b0 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
1b1c0 65 64 28 53 51 4c 49 54 45 5f 43 4f 56 45 52 41  ed(SQLITE_COVERA
1b1d0 47 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52  GE_TEST)./*.** R
1b1e0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e  eturn true if an
1b1f0 79 20 72 65 67 69 73 74 65 72 20 69 6e 20 74 68  y register in th
1b200 65 20 72 61 6e 67 65 20 69 46 72 6f 6d 2e 2e 69  e range iFrom..i
1b210 54 6f 20 28 69 6e 63 6c 75 73 69 76 65 29 0a 2a  To (inclusive).*
1b220 2a 20 69 73 20 75 73 65 64 20 61 73 20 70 61 72  * is used as par
1b230 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t of the column 
1b240 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  cache..**.** Thi
1b250 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
1b260 64 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28  d within assert(
1b270 29 20 61 6e 64 20 74 65 73 74 63 61 73 65 28 29  ) and testcase()
1b280 20 6d 61 63 72 6f 73 20 6f 6e 6c 79 0a 2a 2a 20   macros only.** 
1b290 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 61 70 70  and does not app
1b2a0 65 61 72 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20  ear in a normal 
1b2b0 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  build..*/.static
1b2c0 20 69 6e 74 20 75 73 65 64 41 73 43 6f 6c 75 6d   int usedAsColum
1b2d0 6e 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50  nCache(Parse *pP
1b2e0 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c  arse, int iFrom,
1b2f0 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69 6e 74   int iTo){.  int
1b300 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
1b310 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72  lCache *p;.  for
1b320 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
1b330 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
1b340 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
1b350 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
1b360 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a  nt r = p->iReg;.
1b370 20 20 20 20 69 66 28 20 72 3e 3d 69 46 72 6f 6d      if( r>=iFrom
1b380 20 26 26 20 72 3c 3d 69 54 6f 20 29 20 72 65 74   && r<=iTo ) ret
1b390 75 72 6e 20 31 3b 20 20 20 20 2f 2a 4e 4f 5f 54  urn 1;    /*NO_T
1b3a0 45 53 54 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  EST*/.  }.  retu
1b3b0 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 0;.}.#endif /
1b3c0 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 7c  * SQLITE_DEBUG |
1b3d0 7c 20 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47  | SQLITE_COVERAG
1b3e0 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a  E_TEST */.../*.*
1b3f0 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 65 78 70  * Convert an exp
1b400 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 74 6f 20  ression node to 
1b410 61 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 2a 2f  a TK_REGISTER.*/
1b420 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
1b430 72 54 6f 52 65 67 69 73 74 65 72 28 45 78 70 72  rToRegister(Expr
1b440 20 2a 70 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a   *p, int iReg){.
1b450 20 20 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f 70    p->op2 = p->op
1b460 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 52  ;.  p->op = TK_R
1b470 45 47 49 53 54 45 52 3b 0a 20 20 70 2d 3e 69 54  EGISTER;.  p->iT
1b480 61 62 6c 65 20 3d 20 69 52 65 67 3b 0a 20 20 45  able = iReg;.  E
1b490 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79  xprClearProperty
1b4a0 28 70 2c 20 45 50 5f 53 6b 69 70 29 3b 0a 7d 0a  (p, EP_Skip);.}.
1b4b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
1b4c0 72 43 6f 64 65 42 65 74 77 65 65 6e 28 50 61 72  rCodeBetween(Par
1b4d0 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 76 6f  se*,Expr*,int,vo
1b4e0 69 64 28 2a 29 28 50 61 72 73 65 2a 2c 45 78 70  id(*)(Parse*,Exp
1b4f0 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 69 6e 74 29  r*,int,int),int)
1b500 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  ;../*.** Generat
1b510 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20  e code into the 
1b520 63 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20  current Vdbe to 
1b530 65 76 61 6c 75 61 74 65 20 74 68 65 20 67 69 76  evaluate the giv
1b540 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  en.** expression
1b550 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74  .  Attempt to st
1b560 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
1b570 69 6e 20 72 65 67 69 73 74 65 72 20 22 74 61 72  in register "tar
1b580 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  get"..** Return 
1b590 74 68 65 20 72 65 67 69 73 74 65 72 20 77 68 65  the register whe
1b5a0 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 73  re results are s
1b5b0 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  tored..**.** Wit
1b5c0 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  h this routine, 
1b5d0 74 68 65 72 65 20 69 73 20 6e 6f 20 67 75 61 72  there is no guar
1b5e0 61 6e 74 65 65 20 74 68 61 74 20 72 65 73 75 6c  antee that resul
1b5f0 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 74  ts will.** be st
1b600 6f 72 65 64 20 69 6e 20 74 61 72 67 65 74 2e 20  ored in target. 
1b610 20 54 68 65 20 72 65 73 75 6c 74 20 6d 69 67 68   The result migh
1b620 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 73  t be stored in s
1b630 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65 67  ome other.** reg
1b640 69 73 74 65 72 20 69 66 20 69 74 20 69 73 20 63  ister if it is c
1b650 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f 20  onvenient to do 
1b660 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  so.  The calling
1b670 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73   function.** mus
1b680 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74 75  t check the retu
1b690 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76 65  rn code and move
1b6a0 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20   the results to 
1b6b0 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20 72  the desired.** r
1b6c0 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  egister..*/.int 
1b6d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1b6e0 61 72 67 65 74 28 50 61 72 73 65 20 2a 70 50 61  arget(Parse *pPa
1b6f0 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
1b700 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
1b710 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
1b720 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54 68  e->pVdbe;  /* Th
1b730 65 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73 74  e VM under const
1b740 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
1b750 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
1b760 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70         /* The op
1b770 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65 64  code being coded
1b780 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67 20   */.  int inReg 
1b790 3d 20 74 61 72 67 65 74 3b 20 20 20 20 20 20 20  = target;       
1b7a0 2f 2a 20 52 65 73 75 6c 74 73 20 73 74 6f 72 65  /* Results store
1b7b0 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 6e  d in register in
1b7c0 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  Reg */.  int reg
1b7d0 46 72 65 65 31 20 3d 20 30 3b 20 20 20 20 20 20  Free1 = 0;      
1b7e0 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72     /* If non-zer
1b7f0 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d 70  o free this temp
1b800 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 2a  orary register *
1b810 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32  /.  int regFree2
1b820 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
1b830 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65   If non-zero fre
1b840 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79  e this temporary
1b850 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
1b860 6e 74 20 72 31 2c 20 72 32 3b 20 20 20 20 20 20  nt r1, r2;      
1b870 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69           /* Vari
1b880 6f 75 73 20 72 65 67 69 73 74 65 72 20 6e 75 6d  ous register num
1b890 62 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  bers */.  sqlite
1b8a0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1b8b0 64 62 3b 20 2f 2a 20 54 68 65 20 64 61 74 61 62  db; /* The datab
1b8c0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
1b8d0 2f 0a 20 20 45 78 70 72 20 74 65 6d 70 58 3b 20  /.  Expr tempX; 
1b8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b8f0 20 54 65 6d 70 6f 72 61 72 79 20 65 78 70 72 65   Temporary expre
1b900 73 73 69 6f 6e 20 6e 6f 64 65 20 2a 2f 0a 20 20  ssion node */.  
1b910 69 6e 74 20 70 35 20 3d 20 30 3b 0a 0a 20 20 61  int p5 = 0;..  a
1b920 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
1b930 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73  && target<=pPars
1b940 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28  e->nMem );.  if(
1b950 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73   v==0 ){.    ass
1b960 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
1b970 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
1b980 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1b990 20 7d 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d   }..  if( pExpr=
1b9a0 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54  =0 ){.    op = T
1b9b0 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b  K_NULL;.  }else{
1b9c0 0a 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d  .    op = pExpr-
1b9d0 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  >op;.  }.  switc
1b9e0 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
1b9f0 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
1ba00 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f   {.      AggInfo
1ba10 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45 78   *pAggInfo = pEx
1ba20 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20  pr->pAggInfo;.  
1ba30 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
1ba40 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26  fo_col *pCol = &
1ba50 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70  pAggInfo->aCol[p
1ba60 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20  Expr->iAgg];.   
1ba70 20 20 20 69 66 28 20 21 70 41 67 67 49 6e 66 6f     if( !pAggInfo
1ba80 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a  ->directMode ){.
1ba90 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1baa0 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a  pCol->iMem>0 );.
1bab0 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20          inReg = 
1bac0 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20  pCol->iMem;.    
1bad0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1bae0 20 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67 49   }else if( pAggI
1baf0 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49  nfo->useSortingI
1bb00 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  dx ){.        sq
1bb10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1bb20 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41  v, OP_Column, pA
1bb30 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49  ggInfo->sortingI
1bb40 64 78 50 54 61 62 2c 0a 20 20 20 20 20 20 20 20  dxPTab,.        
1bb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb60 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
1bb70 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65  terColumn, targe
1bb80 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
1bb90 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1bba0 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66   /* Otherwise, f
1bbb0 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68  all thru into th
1bbc0 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65  e TK_COLUMN case
1bbd0 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   */.    }.    ca
1bbe0 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
1bbf0 20 20 20 20 20 20 69 6e 74 20 69 54 61 62 20 3d        int iTab =
1bc00 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
1bc10 20 20 20 20 20 20 69 66 28 20 69 54 61 62 3c 30        if( iTab<0
1bc20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1bc30 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3e 30  pParse->ckBase>0
1bc40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
1bc50 20 47 65 6e 65 72 61 74 69 6e 67 20 43 48 45 43   Generating CHEC
1bc60 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 72  K constraints or
1bc70 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f 20   inserting into 
1bc80 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 2a 2f  partial index */
1bc90 0a 20 20 20 20 20 20 20 20 20 20 69 6e 52 65 67  .          inReg
1bca0 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
1bcb0 6e 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b 42 61  n + pParse->ckBa
1bcc0 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  se;.          br
1bcd0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
1bce0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
1bcf0 20 43 6f 64 69 6e 67 20 61 6e 20 65 78 70 72 65   Coding an expre
1bd00 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 70 61  ssion that is pa
1bd10 72 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 77  rt of an index w
1bd20 68 65 72 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  here column name
1bd30 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  s.          ** i
1bd40 6e 20 74 68 65 20 69 6e 64 65 78 20 72 65 66 65  n the index refe
1bd50 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 74  r to the table t
1bd60 6f 20 77 68 69 63 68 20 74 68 65 20 69 6e 64 65  o which the inde
1bd70 78 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 20  x belongs */.   
1bd80 20 20 20 20 20 20 20 69 54 61 62 20 3d 20 70 50         iTab = pP
1bd90 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 3b 0a  arse->iSelfTab;.
1bda0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1bdb0 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  }.      inReg = 
1bdc0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
1bdd0 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  etColumn(pParse,
1bde0 20 70 45 78 70 72 2d 3e 70 54 61 62 2c 0a 20 20   pExpr->pTab,.  
1bdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be00 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
1be10 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54 61  pr->iColumn, iTa
1be20 62 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20  b, target,.     
1be30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be40 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1be50 3e 6f 70 32 29 3b 0a 20 20 20 20 20 20 62 72 65  >op2);.      bre
1be60 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1be70 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b  se TK_INTEGER: {
1be80 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67  .      codeInteg
1be90 65 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  er(pParse, pExpr
1bea0 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
1beb0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1bec0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1bed0 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
1bee0 49 4e 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  INT.    case TK_
1bef0 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 61  FLOAT: {.      a
1bf00 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1bf10 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1bf20 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
1bf30 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c       codeReal(v,
1bf40 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1bf50 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
1bf60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1bf70 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
1bf80 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20   TK_STRING: {.  
1bf90 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1bfa0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1bfb0 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
1bfc0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1bfd0 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28  3VdbeLoadString(
1bfe0 76 2c 20 74 61 72 67 65 74 2c 20 70 45 78 70 72  v, target, pExpr
1bff0 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
1c000 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c010 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c      case TK_NULL
1c020 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1c030 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1c040 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65  P_Null, 0, targe
1c050 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
1c060 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
1c070 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f  QLITE_OMIT_BLOB_
1c080 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65  LITERAL.    case
1c090 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20   TK_BLOB: {.    
1c0a0 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63    int n;.      c
1c0b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
1c0c0 20 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 3b      char *zBlob;
1c0d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1c0e0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1c0f0 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
1c100 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ue) );.      ass
1c110 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ert( pExpr->u.zT
1c120 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20  oken[0]=='x' || 
1c130 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
1c140 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20 20  0]=='X' );.     
1c150 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1c160 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27  u.zToken[1]=='\'
1c170 27 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 26  ' );.      z = &
1c180 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
1c190 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71  2];.      n = sq
1c1a0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
1c1b0 20 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65   - 1;.      asse
1c1c0 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20 29  rt( z[n]=='\'' )
1c1d0 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d 20  ;.      zBlob = 
1c1e0 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f 62  sqlite3HexToBlob
1c1f0 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 76  (sqlite3VdbeDb(v
1c200 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20  ), z, n);.      
1c210 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1c220 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f  4(v, OP_Blob, n/
1c230 32 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a 42  2, target, 0, zB
1c240 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  lob, P4_DYNAMIC)
1c250 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1c260 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1c270 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45  case TK_VARIABLE
1c280 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
1c290 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1c2a0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
1c2b0 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
1c2c0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
1c2d0 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20 20  .zToken!=0 );.  
1c2e0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1c2f0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d  r->u.zToken[0]!=
1c300 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
1c310 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1c320 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78  OP_Variable, pEx
1c330 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72  pr->iColumn, tar
1c340 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  get);.      if( 
1c350 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
1c360 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1]!=0 ){.       
1c370 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1c380 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27  u.zToken[0]=='?'
1c390 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c   .             |
1c3a0 7c 20 73 74 72 63 6d 70 28 70 45 78 70 72 2d 3e  | strcmp(pExpr->
1c3b0 75 2e 7a 54 6f 6b 65 6e 2c 20 70 50 61 72 73 65  u.zToken, pParse
1c3c0 2d 3e 61 7a 56 61 72 5b 70 45 78 70 72 2d 3e 69  ->azVar[pExpr->i
1c3d0 43 6f 6c 75 6d 6e 2d 31 5d 29 3d 3d 30 20 29 3b  Column-1])==0 );
1c3e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1c3f0 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
1c400 2d 31 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61  -1, pParse->azVa
1c410 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  r[pExpr->iColumn
1c420 2d 31 5d 2c 20 50 34 5f 53 54 41 54 49 43 29 3b  -1], P4_STATIC);
1c430 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
1c440 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1c450 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52  case TK_REGISTER
1c460 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20  : {.      inReg 
1c470 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  = pExpr->iTable;
1c480 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1c490 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1c4a0 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20  TE_OMIT_CAST.   
1c4b0 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b   case TK_CAST: {
1c4c0 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73  .      /* Expres
1c4d0 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72  sions of the for
1c4e0 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74 20  m:   CAST(pLeft 
1c4f0 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20  AS token) */.   
1c500 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
1c510 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
1c520 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1c530 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a  pLeft, target);.
1c540 20 20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21        if( inReg!
1c550 3d 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20  =target ){.     
1c560 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c570 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
1c580 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29  , inReg, target)
1c590 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20  ;.        inReg 
1c5a0 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20  = target;.      
1c5b0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
1c5c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1c5d0 43 61 73 74 2c 20 74 61 72 67 65 74 2c 0a 20 20  Cast, target,.  
1c5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c5f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 66 66        sqlite3Aff
1c600 69 6e 69 74 79 54 79 70 65 28 70 45 78 70 72 2d  inityType(pExpr-
1c610 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a  >u.zToken, 0));.
1c620 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1c630 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68  usedAsColumnCach
1c640 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c  e(pParse, inReg,
1c650 20 69 6e 52 65 67 29 20 29 3b 0a 20 20 20 20 20   inReg) );.     
1c660 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1c670 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
1c680 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 31  pParse, inReg, 1
1c690 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1c6a0 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
1c6b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
1c6c0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
1c6d0 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  IS:.    case TK_
1c6e0 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 6f 70 20  ISNOT:.      op 
1c6f0 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20  = (op==TK_IS) ? 
1c700 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20  TK_EQ : TK_NE;. 
1c710 20 20 20 20 20 70 35 20 3d 20 53 51 4c 49 54 45       p5 = SQLITE
1c720 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f  _NULLEQ;.      /
1c730 2a 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68 20 2a  * fall-through *
1c740 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  /.    case TK_LT
1c750 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
1c760 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
1c770 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
1c780 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
1c790 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
1c7a0 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  : {.      Expr *
1c7b0 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
1c7c0 4c 65 66 74 3b 0a 20 20 20 20 20 20 69 66 28 20  Left;.      if( 
1c7d0 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63  sqlite3ExprIsVec
1c7e0 74 6f 72 28 70 4c 65 66 74 29 20 29 7b 0a 20 20  tor(pLeft) ){.  
1c7f0 20 20 20 20 20 20 63 6f 64 65 56 65 63 74 6f 72        codeVector
1c800 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
1c810 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20 6f  pExpr, target, o
1c820 70 2c 20 70 35 29 3b 0a 20 20 20 20 20 20 7d 65  p, p5);.      }e
1c830 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20  lse{.        r1 
1c840 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1c850 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c  eTemp(pParse, pL
1c860 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1c870 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71  .        r2 = sq
1c880 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1c890 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1c8a0 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
1c8b0 65 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64  e2);.        cod
1c8c0 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
1c8d0 20 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70   pLeft, pExpr->p
1c8e0 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
1c8f0 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 69         r1, r2, i
1c900 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f  nReg, SQLITE_STO
1c910 52 45 50 32 20 7c 20 70 35 29 3b 0a 20 20 20 20  REP2 | p5);.    
1c920 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54      assert(TK_LT
1c930 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61  ==OP_Lt); testca
1c940 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56  se(op==OP_Lt); V
1c950 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1c960 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20  op==OP_Lt);.    
1c970 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45      assert(TK_LE
1c980 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61  ==OP_Le); testca
1c990 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56  se(op==OP_Le); V
1c9a0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1c9b0 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20  op==OP_Le);.    
1c9c0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54      assert(TK_GT
1c9d0 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61  ==OP_Gt); testca
1c9e0 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56  se(op==OP_Gt); V
1c9f0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1ca00 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20  op==OP_Gt);.    
1ca10 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45      assert(TK_GE
1ca20 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61  ==OP_Ge); testca
1ca30 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56  se(op==OP_Ge); V
1ca40 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1ca50 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20  op==OP_Ge);.    
1ca60 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51      assert(TK_EQ
1ca70 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61  ==OP_Eq); testca
1ca80 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56  se(op==OP_Eq); V
1ca90 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1caa0 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20  op==OP_Eq);.    
1cab0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45      assert(TK_NE
1cac0 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61  ==OP_Ne); testca
1cad0 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56  se(op==OP_Ne); V
1cae0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1caf0 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20  op==OP_Ne);.    
1cb00 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1cb10 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1cb20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1cb30 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
1cb40 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
1cb50 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1cb60 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61  e TK_AND:.    ca
1cb70 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61  se TK_OR:.    ca
1cb80 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20  se TK_PLUS:.    
1cb90 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20  case TK_STAR:.  
1cba0 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a    case TK_MINUS:
1cbb0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d  .    case TK_REM
1cbc0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  :.    case TK_BI
1cbd0 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54  TAND:.    case T
1cbe0 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73  K_BITOR:.    cas
1cbf0 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20  e TK_SLASH:.    
1cc00 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a  case TK_LSHIFT:.
1cc10 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49      case TK_RSHI
1cc20 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b  FT: .    case TK
1cc30 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20  _CONCAT: {.     
1cc40 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d   assert( TK_AND=
1cc50 3d 4f 50 5f 41 6e 64 20 29 3b 20 20 20 20 20 20  =OP_And );      
1cc60 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1cc70 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20  op==TK_AND );.  
1cc80 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4f      assert( TK_O
1cc90 52 3d 3d 4f 50 5f 4f 72 20 29 3b 20 20 20 20 20  R==OP_Or );     
1cca0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
1ccb0 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a  e( op==TK_OR );.
1ccc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1ccd0 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b  _PLUS==OP_Add );
1cce0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
1ccf0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53  ase( op==TK_PLUS
1cd00 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1cd10 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53  ( TK_MINUS==OP_S
1cd20 75 62 74 72 61 63 74 20 29 3b 20 20 20 20 20 74  ubtract );     t
1cd30 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1cd40 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20 20 20 61  MINUS );.      a
1cd50 73 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f  ssert( TK_REM==O
1cd60 50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b 20 20  P_Remainder );  
1cd70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1cd80 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20 20  ==TK_REM );.    
1cd90 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
1cda0 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29  AND==OP_BitAnd )
1cdb0 3b 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  ;      testcase(
1cdc0 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44 20 29   op==TK_BITAND )
1cdd0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1cde0 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74  TK_BITOR==OP_Bit
1cdf0 4f 72 20 29 3b 20 20 20 20 20 20 20 20 74 65 73  Or );        tes
1ce00 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49  tcase( op==TK_BI
1ce10 54 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73  TOR );.      ass
1ce20 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f  ert( TK_SLASH==O
1ce30 50 5f 44 69 76 69 64 65 20 29 3b 20 20 20 20 20  P_Divide );     
1ce40 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1ce50 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20 20  TK_SLASH );.    
1ce60 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48    assert( TK_LSH
1ce70 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66  IFT==OP_ShiftLef
1ce80 74 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28  t );   testcase(
1ce90 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20 29   op==TK_LSHIFT )
1cea0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1ceb0 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68  TK_RSHIFT==OP_Sh
1cec0 69 66 74 52 69 67 68 74 20 29 3b 20 20 74 65 73  iftRight );  tes
1ced0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 53  tcase( op==TK_RS
1cee0 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61 73  HIFT );.      as
1cef0 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d  sert( TK_CONCAT=
1cf00 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 20 20 20  =OP_Concat );   
1cf10 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1cf20 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20 20  =TK_CONCAT );.  
1cf30 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1cf40 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1cf50 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1cf60 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
1cf70 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
1cf80 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1cf90 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
1cfa0 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
1cfb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1cfc0 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20  beAddOp3(v, op, 
1cfd0 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b  r2, r1, target);
1cfe0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1cff0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1d000 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1d010 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
1d020 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1d030 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d  }.    case TK_UM
1d040 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45 78  INUS: {.      Ex
1d050 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
1d060 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
1d070 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b  assert( pLeft );
1d080 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74  .      if( pLeft
1d090 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52  ->op==TK_INTEGER
1d0a0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
1d0b0 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c 20  Integer(pParse, 
1d0c0 70 4c 65 66 74 2c 20 31 2c 20 74 61 72 67 65 74  pLeft, 1, target
1d0d0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
1d0e0 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
1d0f0 50 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65 6c 73  POINT.      }els
1d100 65 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d  e if( pLeft->op=
1d110 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20  =TK_FLOAT ){.   
1d120 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1d130 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1d140 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1d150 29 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64  ) );.        cod
1d160 65 52 65 61 6c 28 76 2c 20 70 4c 65 66 74 2d 3e  eReal(v, pLeft->
1d170 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74 61 72  u.zToken, 1, tar
1d180 67 65 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  get);.#endif.   
1d190 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d1a0 20 20 74 65 6d 70 58 2e 6f 70 20 3d 20 54 4b 5f    tempX.op = TK_
1d1b0 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 20  INTEGER;.       
1d1c0 20 74 65 6d 70 58 2e 66 6c 61 67 73 20 3d 20 45   tempX.flags = E
1d1d0 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 54 6f  P_IntValue|EP_To
1d1e0 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 20 20 20  kenOnly;.       
1d1f0 20 74 65 6d 70 58 2e 75 2e 69 56 61 6c 75 65 20   tempX.u.iValue 
1d200 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 31 20  = 0;.        r1 
1d210 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1d220 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26 74  eTemp(pParse, &t
1d230 65 6d 70 58 2c 20 26 72 65 67 46 72 65 65 31 29  empX, &regFree1)
1d240 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73  ;.        r2 = s
1d250 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1d260 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1d270 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
1d280 65 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  e2);.        sql
1d290 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1d2a0 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72  , OP_Subtract, r
1d2b0 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a  2, r1, target);.
1d2c0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1d2d0 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
1d2e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1d2f0 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20  nReg = target;. 
1d300 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1d310 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  }.    case TK_BI
1d320 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54  TNOT:.    case T
1d330 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61  K_NOT: {.      a
1d340 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54  ssert( TK_BITNOT
1d350 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 20 20  ==OP_BitNot );  
1d360 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1d370 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20  K_BITNOT );.    
1d380 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
1d390 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 20 20 20 20 20  ==OP_Not );     
1d3a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1d3b0 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20  ==TK_NOT );.    
1d3c0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1d3d0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1d3e0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1d3f0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1d400 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1d410 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1d420 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74    inReg = target
1d430 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1d440 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c  dbeAddOp2(v, op,
1d450 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20   r1, inReg);.   
1d460 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1d470 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
1d480 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
1d490 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  NOTNULL: {.     
1d4a0 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
1d4b0 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55   assert( TK_ISNU
1d4c0 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b  LL==OP_IsNull );
1d4d0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1d4e0 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20  =TK_ISNULL );.  
1d4f0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
1d500 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75  OTNULL==OP_NotNu
1d510 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28 20  ll ); testcase( 
1d520 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29  op==TK_NOTNULL )
1d530 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1d540 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1d550 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67  Integer, 1, targ
1d560 65 74 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  et);.      r1 = 
1d570 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1d580 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1d590 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
1d5a0 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ee1);.      test
1d5b0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1d5c0 30 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20  0 );.      addr 
1d5d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1d5e0 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31 29 3b 0a  Op1(v, op, r1);.
1d5f0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1d600 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49  geIf(v, op==TK_I
1d610 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64  SNULL);.      Vd
1d620 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1d630 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b  op==TK_NOTNULL);
1d640 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1d650 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1d660 6e 74 65 67 65 72 2c 20 30 2c 20 74 61 72 67 65  nteger, 0, targe
1d670 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1d680 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
1d690 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 62 72   addr);.      br
1d6a0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1d6b0 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
1d6c0 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67  ION: {.      Agg
1d6d0 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45  Info *pInfo = pE
1d6e0 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20  xpr->pAggInfo;. 
1d6f0 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d       if( pInfo==
1d700 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
1d710 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1d720 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1d730 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
1d740 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1d750 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69  rMsg(pParse, "mi
1d760 73 75 73 65 20 6f 66 20 61 67 67 72 65 67 61 74  suse of aggregat
1d770 65 3a 20 25 73 28 29 22 2c 20 70 45 78 70 72 2d  e: %s()", pExpr-
1d780 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
1d790 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1d7a0 20 69 6e 52 65 67 20 3d 20 70 49 6e 66 6f 2d 3e   inReg = pInfo->
1d7b0 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67  aFunc[pExpr->iAg
1d7c0 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d  g].iMem;.      }
1d7d0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1d7e0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1d7f0 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
1d800 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 61 72    ExprList *pFar
1d810 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  g;       /* List
1d820 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67   of function arg
1d830 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  uments */.      
1d840 69 6e 74 20 6e 46 61 72 67 3b 20 20 20 20 20 20  int nFarg;      
1d850 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1d860 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67   of function arg
1d870 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  uments */.      
1d880 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20  FuncDef *pDef;  
1d890 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75         /* The fu
1d8a0 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f  nction definitio
1d8b0 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20  n object */.    
1d8c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
1d8d0 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  d;       /* The 
1d8e0 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
1d8f0 0a 20 20 20 20 20 20 75 33 32 20 63 6f 6e 73 74  .      u32 const
1d900 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 2f 2a  Mask = 0;     /*
1d910 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63 74 69 6f   Mask of functio
1d920 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 68 61 74  n arguments that
1d930 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 20 2a 2f   are constant */
1d940 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
1d950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d960 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
1d970 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20  .      u8 enc = 
1d980 45 4e 43 28 64 62 29 3b 20 20 20 20 20 20 2f 2a  ENC(db);      /*
1d990 20 54 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69   The text encodi
1d9a0 6e 67 20 75 73 65 64 20 62 79 20 74 68 69 73 20  ng used by this 
1d9b0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
1d9c0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
1d9d0 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41 20 63 6f   = 0;    /* A co
1d9e0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1d9f0 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72   */..      asser
1da00 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1da10 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
1da20 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
1da30 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
1da40 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1da50 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
1da60 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 30 3b        pFarg = 0;
1da70 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1da80 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 70 45        pFarg = pE
1da90 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
1daa0 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 61 72      }.      nFar
1dab0 67 20 3d 20 70 46 61 72 67 20 3f 20 70 46 61 72  g = pFarg ? pFar
1dac0 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20  g->nExpr : 0;.  
1dad0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1dae0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1daf0 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
1db00 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d 20   );.      zId = 
1db10 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pExpr->u.zToken;
1db20 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71  .      pDef = sq
1db30 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
1db40 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 46 61 72 67  n(db, zId, nFarg
1db50 2c 20 65 6e 63 2c 20 30 29 3b 0a 23 69 66 64 65  , enc, 0);.#ifde
1db60 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1db70 55 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43  UNKNOWN_SQL_FUNC
1db80 54 49 4f 4e 0a 20 20 20 20 20 20 69 66 28 20 70  TION.      if( p
1db90 44 65 66 3d 3d 30 20 26 26 20 70 50 61 72 73 65  Def==0 && pParse
1dba0 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
1dbb0 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
1dbc0 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
1dbd0 64 62 2c 20 22 75 6e 6b 6e 6f 77 6e 22 2c 20 6e  db, "unknown", n
1dbe0 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 20  Farg, enc, 0);. 
1dbf0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
1dc00 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20      if( pDef==0 
1dc10 7c 7c 20 70 44 65 66 2d 3e 78 46 69 6e 61 6c 69  || pDef->xFinali
1dc20 7a 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ze!=0 ){.       
1dc30 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1dc40 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77  (pParse, "unknow
1dc50 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73 28 29  n function: %s()
1dc60 22 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20  ", zId);.       
1dc70 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1dc80 0a 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70  .      /* Attemp
1dc90 74 20 61 20 64 69 72 65 63 74 20 69 6d 70 6c 65  t a direct imple
1dca0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
1dcb0 20 62 75 69 6c 74 2d 69 6e 20 43 4f 41 4c 45 53   built-in COALES
1dcc0 43 45 28 29 20 61 6e 64 0a 20 20 20 20 20 20 2a  CE() and.      *
1dcd0 2a 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e 63 74  * IFNULL() funct
1dce0 69 6f 6e 73 2e 20 20 54 68 69 73 20 61 76 6f 69  ions.  This avoi
1dcf0 64 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 65  ds unnecessary e
1dd00 76 61 6c 75 61 74 69 6f 6e 20 6f 66 0a 20 20 20  valuation of.   
1dd10 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20     ** arguments 
1dd20 70 61 73 74 20 74 68 65 20 66 69 72 73 74 20 6e  past the first n
1dd30 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74  on-NULL argument
1dd40 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1dd50 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46   if( pDef->funcF
1dd60 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
1dd70 4e 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b 0a 20  NC_COALESCE ){. 
1dd80 20 20 20 20 20 20 20 69 6e 74 20 65 6e 64 43 6f         int endCo
1dd90 61 6c 65 73 63 65 20 3d 20 73 71 6c 69 74 65 33  alesce = sqlite3
1dda0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1ddb0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1ddc0 28 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20 20  ( nFarg>=2 );.  
1ddd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1dde0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46  rCode(pParse, pF
1ddf0 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  arg->a[0].pExpr,
1de00 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1de10 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46 61    for(i=1; i<nFa
1de20 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
1de30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1de40 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e  ddOp2(v, OP_NotN
1de50 75 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e 64  ull, target, end
1de60 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20  Coalesce);.     
1de70 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1de80 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
1de90 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1dea0 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 74  Remove(pParse, t
1deb0 61 72 67 65 74 2c 20 31 29 3b 0a 20 20 20 20 20  arget, 1);.     
1dec0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1ded0 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
1dee0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
1def0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
1df00 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d  rse, pFarg->a[i]
1df10 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  .pExpr, target);
1df20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1df30 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
1df40 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
1df50 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
1df60 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1df70 6c 28 76 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65  l(v, endCoalesce
1df80 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
1df90 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1dfa0 20 2f 2a 20 54 68 65 20 55 4e 4c 49 4b 45 4c 59   /* The UNLIKELY
1dfb0 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  () function is a
1dfc0 20 6e 6f 2d 6f 70 2e 20 20 54 68 65 20 72 65 73   no-op.  The res
1dfd0 75 6c 74 20 69 73 20 74 68 65 20 76 61 6c 75 65  ult is the value
1dfe0 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
1dff0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
1e000 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1e010 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c  if( pDef->funcFl
1e020 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
1e030 43 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20 20  C_UNLIKELY ){.  
1e040 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46        assert( nF
1e050 61 72 67 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20  arg>=1 );.      
1e060 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
1e070 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
1e080 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61  pParse, pFarg->a
1e090 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65  [0].pExpr, targe
1e0a0 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
1e0b0 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
1e0c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 61    for(i=0; i<nFa
1e0d0 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
1e0e0 20 20 69 66 28 20 69 3c 33 32 20 26 26 20 73 71    if( i<32 && sq
1e0f0 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
1e100 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d 2e  ant(pFarg->a[i].
1e110 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
1e120 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d      testcase( i=
1e130 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  =31 );.         
1e140 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 4d 41   constMask |= MA
1e150 53 4b 42 49 54 33 32 28 69 29 3b 0a 20 20 20 20  SKBIT32(i);.    
1e160 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1e170 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  ( (pDef->funcFla
1e180 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
1e190 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26 26  _NEEDCOLL)!=0 &&
1e1a0 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
1e1b0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
1e1c0 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
1e1d0 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61  pParse, pFarg->a
1e1e0 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
1e1f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1e200 20 20 20 20 69 66 28 20 70 46 61 72 67 20 29 7b      if( pFarg ){
1e210 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6e  .        if( con
1e220 73 74 4d 61 73 6b 20 29 7b 0a 20 20 20 20 20 20  stMask ){.      
1e230 20 20 20 20 72 31 20 3d 20 70 50 61 72 73 65 2d      r1 = pParse-
1e240 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20  >nMem+1;.       
1e250 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
1e260 2b 3d 20 6e 46 61 72 67 3b 0a 20 20 20 20 20 20  += nFarg;.      
1e270 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1e280 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
1e290 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
1e2a0 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20  se, nFarg);.    
1e2b0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
1e2c0 2a 20 46 6f 72 20 6c 65 6e 67 74 68 28 29 20 61  * For length() a
1e2d0 6e 64 20 74 79 70 65 6f 66 28 29 20 66 75 6e 63  nd typeof() func
1e2e0 74 69 6f 6e 73 20 77 69 74 68 20 61 20 63 6f 6c  tions with a col
1e2f0 75 6d 6e 20 61 72 67 75 6d 65 6e 74 2c 0a 20 20  umn argument,.  
1e300 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65        ** set the
1e310 20 50 35 20 70 61 72 61 6d 65 74 65 72 20 74 6f   P5 parameter to
1e320 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f   the OP_Column o
1e330 70 63 6f 64 65 20 74 6f 20 4f 50 46 4c 41 47 5f  pcode to OPFLAG_
1e340 4c 45 4e 47 54 48 41 52 47 0a 20 20 20 20 20 20  LENGTHARG.      
1e350 20 20 2a 2a 20 6f 72 20 4f 50 46 4c 41 47 5f 54    ** or OPFLAG_T
1e360 59 50 45 4f 46 41 52 47 20 72 65 73 70 65 63 74  YPEOFARG respect
1e370 69 76 65 6c 79 2c 20 74 6f 20 61 76 6f 69 64 20  ively, to avoid 
1e380 75 6e 6e 65 63 65 73 73 61 72 79 20 64 61 74 61  unnecessary data
1e390 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 61 64  .        ** load
1e3a0 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ing..        */.
1e3b0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44 65          if( (pDe
1e3c0 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28  f->funcFlags & (
1e3d0 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47  SQLITE_FUNC_LENG
1e3e0 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54  TH|SQLITE_FUNC_T
1e3f0 59 50 45 4f 46 29 29 21 3d 30 20 29 7b 0a 20 20  YPEOF))!=0 ){.  
1e400 20 20 20 20 20 20 20 20 75 38 20 65 78 70 72 4f          u8 exprO
1e410 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  p;.          ass
1e420 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b  ert( nFarg==1 );
1e430 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1e440 74 28 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  t( pFarg->a[0].p
1e450 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  Expr!=0 );.     
1e460 20 20 20 20 20 65 78 70 72 4f 70 20 3d 20 70 46       exprOp = pF
1e470 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  arg->a[0].pExpr-
1e480 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 69  >op;.          i
1e490 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 43 4f  f( exprOp==TK_CO
1e4a0 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f 70 3d 3d  LUMN || exprOp==
1e4b0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b  TK_AGG_COLUMN ){
1e4c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
1e4d0 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43  ert( SQLITE_FUNC
1e4e0 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c 41 47 5f  _LENGTH==OPFLAG_
1e4f0 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20  LENGTHARG );.   
1e500 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1e510 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50   SQLITE_FUNC_TYP
1e520 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54 59 50 45  EOF==OPFLAG_TYPE
1e530 4f 46 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20  OFARG );.       
1e540 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1e550 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
1e560 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52   OPFLAG_LENGTHAR
1e570 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  G );.           
1e580 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
1e590 70 72 2d 3e 6f 70 32 20 3d 20 0a 20 20 20 20 20  pr->op2 = .     
1e5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65               pDe
1e5b0 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28  f->funcFlags & (
1e5c0 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47  OPFLAG_LENGTHARG
1e5d0 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52  |OPFLAG_TYPEOFAR
1e5e0 47 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  G);.          }.
1e5f0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1e600 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1e610 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
1e620 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32       /* Ticket 2
1e630 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20  ea2425d34be */. 
1e640 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1e650 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
1e660 50 61 72 73 65 2c 20 70 46 61 72 67 2c 20 72 31  Parse, pFarg, r1
1e670 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
1e680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e690 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43 45 4c       SQLITE_ECEL
1e6a0 5f 44 55 50 7c 53 51 4c 49 54 45 5f 45 43 45 4c  _DUP|SQLITE_ECEL
1e6b0 5f 46 41 43 54 4f 52 29 3b 0a 20 20 20 20 20 20  _FACTOR);.      
1e6c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1e6d0 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 20 20  hePop(pParse);  
1e6e0 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65      /* Ticket 2e
1e6f0 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20  a2425d34be */.  
1e700 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e710 20 20 20 72 31 20 3d 20 30 3b 0a 20 20 20 20 20     r1 = 0;.     
1e720 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1e730 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1e740 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73  BLE.      /* Pos
1e750 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74  sibly overload t
1e760 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 74  he function if t
1e770 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
1e780 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20  t is.      ** a 
1e790 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f  virtual table co
1e7a0 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  lumn..      **. 
1e7b0 20 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69       ** For infi
1e7c0 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b  x functions (LIK
1e7d0 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c  E, GLOB, REGEXP,
1e7e0 20 61 6e 64 20 4d 41 54 43 48 29 20 75 73 65 20   and MATCH) use 
1e7f0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63  the.      ** sec
1e800 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f  ond argument, no
1e810 74 20 74 68 65 20 66 69 72 73 74 2c 20 61 73 20  t the first, as 
1e820 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  the argument to 
1e830 74 65 73 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a  test to.      **
1e840 20 73 65 65 20 69 66 20 69 74 20 69 73 20 61 20   see if it is a 
1e850 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72 74  column in a virt
1e860 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69 73  ual table.  This
1e870 20 69 73 20 64 6f 6e 65 20 62 65 63 61 75 73 65   is done because
1e880 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65  .      ** the le
1e890 66 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e  ft operand of in
1e8a0 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 74  fix functions (t
1e8b0 68 65 20 6f 70 65 72 61 6e 64 20 77 65 20 77 61  he operand we wa
1e8c0 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63  nt to.      ** c
1e8d0 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69  ontrol overloadi
1e8e0 6e 67 29 20 65 6e 64 73 20 75 70 20 61 73 20 74  ng) ends up as t
1e8f0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1e900 6e 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  nt to the.      
1e910 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  ** function.  Th
1e920 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 41 20  e expression "A 
1e930 67 6c 6f 62 20 42 22 20 69 73 20 65 71 75 69 76  glob B" is equiv
1e940 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20  alent to .      
1e950 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20  ** "glob(B,A).  
1e960 57 65 20 77 61 6e 74 20 74 6f 20 75 73 65 20 74  We want to use t
1e970 68 65 20 41 20 69 6e 20 22 41 20 67 6c 6f 62 20  he A in "A glob 
1e980 42 22 20 74 6f 20 74 65 73 74 0a 20 20 20 20 20  B" to test.     
1e990 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e   ** for function
1e9a0 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42   overloading.  B
1e9b0 75 74 20 77 65 20 75 73 65 20 74 68 65 20 42 20  ut we use the B 
1e9c0 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c  term in "glob(B,
1e9d0 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  A)"..      */.  
1e9e0 20 20 20 20 69 66 28 20 6e 46 61 72 67 3e 3d 32      if( nFarg>=2
1e9f0 20 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61 67   && (pExpr->flag
1ea00 73 20 26 20 45 50 5f 49 6e 66 69 78 46 75 6e 63  s & EP_InfixFunc
1ea10 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  ) ){.        pDe
1ea20 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f  f = sqlite3VtabO
1ea30 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28  verloadFunction(
1ea40 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c  db, pDef, nFarg,
1ea50 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78   pFarg->a[1].pEx
1ea60 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  pr);.      }else
1ea70 20 69 66 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a   if( nFarg>0 ){.
1ea80 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73          pDef = s
1ea90 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f  qlite3VtabOverlo
1eaa0 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70  adFunction(db, p
1eab0 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72  Def, nFarg, pFar
1eac0 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  g->a[0].pExpr);.
1ead0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1eae0 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66       if( pDef->f
1eaf0 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
1eb00 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20  E_FUNC_NEEDCOLL 
1eb10 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ){.        if( !
1eb20 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20  pColl ) pColl = 
1eb30 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a  db->pDfltColl; .
1eb40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1eb50 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1eb60 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30  CollSeq, 0, 0, 0
1eb70 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  , (char *)pColl,
1eb80 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
1eb90 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1eba0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1ebb0 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 2c 20 63   OP_Function0, c
1ebc0 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74 61  onstMask, r1, ta
1ebd0 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20  rget,.          
1ebe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
1ebf0 68 61 72 2a 29 70 44 65 66 2c 20 50 34 5f 46 55  har*)pDef, P4_FU
1ec00 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73 71  NCDEF);.      sq
1ec10 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
1ec20 35 28 76 2c 20 28 75 38 29 6e 46 61 72 67 29 3b  5(v, (u8)nFarg);
1ec30 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61 72 67  .      if( nFarg
1ec40 20 26 26 20 63 6f 6e 73 74 4d 61 73 6b 3d 3d 30   && constMask==0
1ec50 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1ec60 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
1ec70 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20  nge(pParse, r1, 
1ec80 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a  nFarg);.      }.
1ec90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1eca0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1ecb0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
1ecc0 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53      case TK_EXIS
1ecd0 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  TS:.    case TK_
1ece0 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  SELECT: {.      
1ecf0 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  int nCol;.      
1ed00 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1ed10 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20  _EXISTS );.     
1ed20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1ed30 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20  K_SELECT );.    
1ed40 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c    if( op==TK_SEL
1ed50 45 43 54 20 26 26 20 28 6e 43 6f 6c 20 3d 20 70  ECT && (nCol = p
1ed60 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  Expr->x.pSelect-
1ed70 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 21  >pEList->nExpr)!
1ed80 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =1 ){.        sq
1ed90 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72  lite3SubselectEr
1eda0 72 6f 72 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c  ror(pParse, nCol
1edb0 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 1);.      }els
1edc0 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  e{.        inReg
1edd0 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75   = sqlite3CodeSu
1ede0 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
1edf0 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20  pExpr, 0, 0);.  
1ee00 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
1ee10 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1ee20 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55  e TK_SELECT_COLU
1ee30 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  MN: {.      if( 
1ee40 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54  pExpr->pLeft->iT
1ee50 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  able==0 ){.     
1ee60 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d     pExpr->pLeft-
1ee70 3e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65  >iTable = sqlite
1ee80 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  3CodeSubselect(p
1ee90 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1eea0 65 66 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  eft, 0, 0);.    
1eeb0 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20    }.      inReg 
1eec0 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  = pExpr->pLeft->
1eed0 69 54 61 62 6c 65 20 2b 20 70 45 78 70 72 2d 3e  iTable + pExpr->
1eee0 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 62  iColumn;.      b
1eef0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1ef00 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
1ef10 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61      int destIfFa
1ef20 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  lse = sqlite3Vdb
1ef30 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1ef40 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e       int destIfN
1ef50 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ull = sqlite3Vdb
1ef60 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1ef70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ef80 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
1ef90 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  l, 0, target);. 
1efa0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1efb0 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
1efc0 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73  Expr, destIfFals
1efd0 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  e, destIfNull);.
1efe0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1eff0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1f000 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74  teger, 1, target
1f010 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f020 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1f030 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29  (v, destIfFalse)
1f040 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1f050 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1f060 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20  AddImm, target, 
1f070 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
1f080 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1f090 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  l(v, destIfNull)
1f0a0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1f0b0 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
1f0c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1f0d0 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 0a  ERY */...    /*.
1f0e0 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54 57      **    x BETW
1f0f0 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20  EEN y AND z.    
1f100 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  **.    ** This i
1f110 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a  s equivalent to.
1f120 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1f130 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20   x>=y AND x<=z. 
1f140 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69     **.    ** X i
1f150 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70  s stored in pExp
1f160 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a  r->pLeft..    **
1f170 20 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   Y is stored in 
1f180 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
1f190 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a  0].pExpr..    **
1f1a0 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   Z is stored in 
1f1b0 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
1f1c0 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f  1].pExpr..    */
1f1d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
1f1e0 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 65 78  WEEN: {.      ex
1f1f0 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50  prCodeBetween(pP
1f200 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
1f210 67 65 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  get, 0, 0);.    
1f220 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1f230 20 20 20 63 61 73 65 20 54 4b 5f 53 50 41 4e 3a     case TK_SPAN:
1f240 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
1f250 4c 41 54 45 3a 20 0a 20 20 20 20 63 61 73 65 20  LATE: .    case 
1f260 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20  TK_UPLUS: {.    
1f270 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
1f280 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
1f290 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1f2a0 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20  Left, target);. 
1f2b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f2c0 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54  }..    case TK_T
1f2d0 52 49 47 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  RIGGER: {.      
1f2e0 2f 2a 20 49 66 20 74 68 65 20 6f 70 63 6f 64 65  /* If the opcode
1f2f0 20 69 73 20 54 4b 5f 54 52 49 47 47 45 52 2c 20   is TK_TRIGGER, 
1f300 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73  then the express
1f310 69 6f 6e 20 69 73 20 61 20 72 65 66 65 72 65 6e  ion is a referen
1f320 63 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  ce.      ** to a
1f330 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e   column in the n
1f340 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73  ew.* or old.* ps
1f350 65 75 64 6f 2d 74 61 62 6c 65 73 20 61 76 61 69  eudo-tables avai
1f360 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a  lable to.      *
1f370 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  * trigger progra
1f380 6d 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ms. In this case
1f390 20 45 78 70 72 2e 69 54 61 62 6c 65 20 69 73 20   Expr.iTable is 
1f3a0 73 65 74 20 74 6f 20 31 20 66 6f 72 20 74 68 65  set to 1 for the
1f3b0 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20  .      ** new.* 
1f3c0 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72  pseudo-table, or
1f3d0 20 30 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a   0 for the old.*
1f3e0 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45   pseudo-table. E
1f3f0 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20  xpr.iColumn.    
1f400 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74    ** is set to t
1f410 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  he column of the
1f420 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f   pseudo-table to
1f430 20 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20   read, or to -1 
1f440 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64  to.      ** read
1f450 20 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64   the rowid field
1f460 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1f470 20 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   ** The expressi
1f480 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  on is implemente
1f490 64 20 75 73 69 6e 67 20 61 6e 20 4f 50 5f 50 61  d using an OP_Pa
1f4a0 72 61 6d 20 6f 70 63 6f 64 65 2e 20 54 68 65 20  ram opcode. The 
1f4b0 70 31 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 61  p1.      ** para
1f4c0 6d 65 74 65 72 20 69 73 20 73 65 74 20 74 6f 20  meter is set to 
1f4d0 30 20 66 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f 77  0 for an old.row
1f4e0 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 6f 72  id reference, or
1f4f0 20 74 6f 20 28 69 2b 31 29 0a 20 20 20 20 20 20   to (i+1).      
1f500 2a 2a 20 74 6f 20 72 65 66 65 72 65 6e 63 65 20  ** to reference 
1f510 61 6e 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 6f  another column o
1f520 66 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75  f the old.* pseu
1f530 64 6f 2d 74 61 62 6c 65 2c 20 77 68 65 72 65 20  do-table, where 
1f540 0a 20 20 20 20 20 20 2a 2a 20 69 20 69 73 20 74  .      ** i is t
1f550 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
1f560 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61 20 6e 65  column. For a ne
1f570 77 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63  w.rowid referenc
1f580 65 2c 20 70 31 20 69 73 0a 20 20 20 20 20 20 2a  e, p1 is.      *
1f590 2a 20 73 65 74 20 74 6f 20 28 6e 2b 31 29 2c 20  * set to (n+1), 
1f5a0 77 68 65 72 65 20 6e 20 69 73 20 74 68 65 20 6e  where n is the n
1f5b0 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
1f5c0 20 69 6e 20 65 61 63 68 20 70 73 65 75 64 6f 2d   in each pseudo-
1f5d0 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20  table..      ** 
1f5e0 46 6f 72 20 61 20 72 65 66 65 72 65 6e 63 65 20  For a reference 
1f5f0 74 6f 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6c  to any other col
1f600 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a  umn in the new.*
1f610 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 70   pseudo-table, p
1f620 31 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65  1.      ** is se
1f630 74 20 74 6f 20 28 6e 2b 32 2b 69 29 2c 20 77 68  t to (n+2+i), wh
1f640 65 72 65 20 6e 20 61 6e 64 20 69 20 61 72 65 20  ere n and i are 
1f650 61 73 20 64 65 66 69 6e 65 64 20 70 72 65 76 69  as defined previ
1f660 6f 75 73 6c 79 2e 20 46 6f 72 0a 20 20 20 20 20  ously. For.     
1f670 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20   ** example, if 
1f680 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 77 68 69  the table on whi
1f690 63 68 20 74 72 69 67 67 65 72 73 20 61 72 65 20  ch triggers are 
1f6a0 62 65 69 6e 67 20 66 69 72 65 64 20 69 73 0a 20  being fired is. 
1f6b0 20 20 20 20 20 2a 2a 20 64 65 63 6c 61 72 65 64       ** declared
1f6c0 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20   as:.      **.  
1f6d0 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
1f6e0 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
1f6f0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
1f700 2a 20 54 68 65 6e 20 70 31 20 69 73 20 69 6e 74  * Then p1 is int
1f710 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c  erpreted as foll
1f720 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ows:.      **.  
1f730 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 30 20 20      **   p1==0  
1f740 20 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f 77 69 64   ->    old.rowid
1f750 20 20 20 20 20 70 31 3d 3d 33 20 20 20 2d 3e 20       p1==3   -> 
1f760 20 20 20 6e 65 77 2e 72 6f 77 69 64 0a 20 20 20     new.rowid.   
1f770 20 20 20 2a 2a 20 20 20 70 31 3d 3d 31 20 20 20     **   p1==1   
1f780 2d 3e 20 20 20 20 6f 6c 64 2e 61 20 20 20 20 20  ->    old.a     
1f790 20 20 20 20 70 31 3d 3d 34 20 20 20 2d 3e 20 20      p1==4   ->  
1f7a0 20 20 6e 65 77 2e 61 0a 20 20 20 20 20 20 2a 2a    new.a.      **
1f7b0 20 20 20 70 31 3d 3d 32 20 20 20 2d 3e 20 20 20     p1==2   ->   
1f7c0 20 6f 6c 64 2e 62 20 20 20 20 20 20 20 20 20 70   old.b         p
1f7d0 31 3d 3d 35 20 20 20 2d 3e 20 20 20 20 6e 65 77  1==5   ->    new
1f7e0 2e 62 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  .b       .      
1f7f0 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  */.      Table *
1f800 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54  pTab = pExpr->pT
1f810 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 70 31  ab;.      int p1
1f820 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
1f830 20 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31   * (pTab->nCol+1
1f840 29 20 2b 20 31 20 2b 20 70 45 78 70 72 2d 3e 69  ) + 1 + pExpr->i
1f850 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 61  Column;..      a
1f860 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 54  ssert( pExpr->iT
1f870 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72  able==0 || pExpr
1f880 2d 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20  ->iTable==1 );. 
1f890 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
1f8a0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20  pr->iColumn>=-1 
1f8b0 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  && pExpr->iColum
1f8c0 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  n<pTab->nCol );.
1f8d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
1f8e0 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 70  ab->iPKey<0 || p
1f8f0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70  Expr->iColumn!=p
1f900 54 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a 20 20  Tab->iPKey );.  
1f910 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3e 3d      assert( p1>=
1f920 30 20 26 26 20 70 31 3c 28 70 54 61 62 2d 3e 6e  0 && p1<(pTab->n
1f930 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20 20 20  Col*2+2) );..   
1f940 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f950 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72 61 6d  dOp2(v, OP_Param
1f960 2c 20 70 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  , p1, target);. 
1f970 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1f980 28 28 76 2c 20 22 25 73 2e 25 73 20 2d 3e 20 24  ((v, "%s.%s -> $
1f990 25 64 22 2c 0a 20 20 20 20 20 20 20 20 28 70 45  %d",.        (pE
1f9a0 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22 6e  xpr->iTable ? "n
1f9b0 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a 20 20  ew" : "old"),.  
1f9c0 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69 43        (pExpr->iC
1f9d0 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77 69 64  olumn<0 ? "rowid
1f9e0 22 20 3a 20 70 45 78 70 72 2d 3e 70 54 61 62 2d  " : pExpr->pTab-
1f9f0 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f  >aCol[pExpr->iCo
1fa00 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a 20 20  lumn].zName),.  
1fa10 20 20 20 20 20 20 74 61 72 67 65 74 0a 20 20 20        target.   
1fa20 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20     ));..#ifndef 
1fa30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
1fa40 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20  TING_POINT.     
1fa50 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d   /* If the colum
1fa60 6e 20 68 61 73 20 52 45 41 4c 20 61 66 66 69 6e  n has REAL affin
1fa70 69 74 79 2c 20 69 74 20 6d 61 79 20 63 75 72 72  ity, it may curr
1fa80 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64 20  ently be stored 
1fa90 61 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 69  as an.      ** i
1faa0 6e 74 65 67 65 72 2e 20 55 73 65 20 4f 50 5f 52  nteger. Use OP_R
1fab0 65 61 6c 41 66 66 69 6e 69 74 79 20 74 6f 20 6d  ealAffinity to m
1fac0 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 72  ake sure it is r
1fad0 65 61 6c 6c 79 20 72 65 61 6c 2e 0a 20 20 20 20  eally real..    
1fae0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56    **.      ** EV
1faf0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 30 39  IDENCE-OF: R-609
1fb00 38 35 2d 35 37 36 36 32 20 53 51 4c 69 74 65 20  85-57662 SQLite 
1fb10 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74 68 65  will convert the
1fb20 20 76 61 6c 75 65 20 62 61 63 6b 20 74 6f 0a 20   value back to. 
1fb30 20 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e 67       ** floating
1fb40 20 70 6f 69 6e 74 20 77 68 65 6e 20 65 78 74 72   point when extr
1fb50 61 63 74 69 6e 67 20 69 74 20 66 72 6f 6d 20 74  acting it from t
1fb60 68 65 20 72 65 63 6f 72 64 2e 20 20 2a 2f 0a 20  he record.  */. 
1fb70 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
1fb80 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20 20  iColumn>=0 .    
1fb90 20 20 20 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c     && pTab->aCol
1fba0 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
1fbb0 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  .affinity==SQLIT
1fbc0 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20 20 20 20  E_AFF_REAL.     
1fbd0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1fbe0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
1fbf0 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79   OP_RealAffinity
1fc00 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1fc10 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
1fc20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1fc30 20 20 63 61 73 65 20 54 4b 5f 56 45 43 54 4f 52    case TK_VECTOR
1fc40 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1fc50 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1fc60 2c 20 22 69 6e 76 61 6c 69 64 20 75 73 65 20 6f  , "invalid use o
1fc70 66 20 72 6f 77 20 76 61 6c 75 65 22 29 3b 0a 20  f row value");. 
1fc80 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1fc90 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
1fca0 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20   Form A:.    ** 
1fcb0 20 20 43 41 53 45 20 78 20 57 48 45 4e 20 65 31    CASE x WHEN e1
1fcc0 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32   THEN r1 WHEN e2
1fcd0 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45   THEN r2 ... WHE
1fce0 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53  N eN THEN rN ELS
1fcf0 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20  E y END.    **. 
1fd00 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20     ** Form B:.  
1fd10 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e    **   CASE WHEN
1fd20 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e   e1 THEN r1 WHEN
1fd30 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20   e2 THEN r2 ... 
1fd40 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20  WHEN eN THEN rN 
1fd50 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a  ELSE y END.    *
1fd60 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20  *.    ** Form A 
1fd70 69 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66  is can be transf
1fd80 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20 65  ormed into the e
1fd90 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42  quivalent form B
1fda0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   as follows:.   
1fdb0 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20   **   CASE WHEN 
1fdc0 78 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48 45  x=e1 THEN r1 WHE
1fdd0 4e 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20 2e  N x=e2 THEN r2 .
1fde0 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ...    **       
1fdf0 20 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20   WHEN x=eN THEN 
1fe00 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20  rN ELSE y END.  
1fe10 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69    **.    ** X (i
1fe20 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20  f it exists) is 
1fe30 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e  in pExpr->pLeft.
1fe40 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e 20  .    ** Y is in 
1fe50 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74  the last element
1fe60 20 6f 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69   of pExpr->x.pLi
1fe70 73 74 20 69 66 20 70 45 78 70 72 2d 3e 78 2e 70  st if pExpr->x.p
1fe80 4c 69 73 74 2d 3e 6e 45 78 70 72 20 69 73 0a 20  List->nExpr is. 
1fe90 20 20 20 2a 2a 20 6f 64 64 2e 20 20 54 68 65 20     ** odd.  The 
1fea0 59 20 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e  Y is also option
1feb0 61 6c 2e 20 20 49 66 20 74 68 65 20 6e 75 6d 62  al.  If the numb
1fec0 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
1fed0 6e 20 78 2e 70 4c 69 73 74 0a 20 20 20 20 2a 2a  n x.pList.    **
1fee0 20 69 73 20 65 76 65 6e 2c 20 74 68 65 6e 20 59   is even, then Y
1fef0 20 69 73 20 6f 6d 69 74 74 65 64 20 61 6e 64 20   is omitted and 
1ff00 74 68 65 20 22 6f 74 68 65 72 77 69 73 65 22 20  the "otherwise" 
1ff10 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a  result is NULL..
1ff20 20 20 20 20 2a 2a 20 45 69 20 69 73 20 69 6e 20      ** Ei is in 
1ff30 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
1ff40 69 2a 32 5d 20 61 6e 64 20 52 69 20 69 73 20 70  i*2] and Ri is p
1ff50 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  Expr->pList->a[i
1ff60 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20  *2+1]..    **.  
1ff70 20 20 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20    ** The result 
1ff80 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
1ff90 6e 20 69 73 20 74 68 65 20 52 69 20 66 6f 72 20  n is the Ri for 
1ffa0 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69  the first matchi
1ffb0 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72  ng Ei,.    ** or
1ffc0 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
1ffd0 6d 61 74 63 68 69 6e 67 20 45 69 2c 20 74 68 65  matching Ei, the
1ffe0 20 45 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f 72   ELSE term Y, or
1fff0 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 20   if there is.   
20000 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d   ** no ELSE term
20010 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20  , NULL..    */. 
20020 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65     default: asse
20030 72 74 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45 20  rt( op==TK_CASE 
20040 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  ); {.      int e
20050 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20  ndLabel;        
20060 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20070 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 65  GOTO label for e
20080 6e 64 20 6f 66 20 43 41 53 45 20 73 74 6d 74 20  nd of CASE stmt 
20090 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 65 78  */.      int nex
200a0 74 43 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  tCase;          
200b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f             /* GO
200c0 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65 78  TO label for nex
200d0 74 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f  t WHEN clause */
200e0 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72  .      int nExpr
200f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20100 20 20 20 20 20 20 20 20 20 2f 2a 20 32 78 20 6e           /* 2x n
20110 75 6d 62 65 72 20 6f 66 20 57 48 45 4e 20 74 65  umber of WHEN te
20120 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  rms */.      int
20130 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
20140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20150 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
20160 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  /.      ExprList
20170 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20   *pEList;       
20180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
20190 74 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20  t of WHEN terms 
201a0 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
201b0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
201c0 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41 72  Listelem;  /* Ar
201d0 72 61 79 20 6f 66 20 57 48 45 4e 20 74 65 72 6d  ray of WHEN term
201e0 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  s */.      Expr 
201f0 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20 20 20 20  opCompare;      
20200 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20210 54 68 65 20 58 3d 3d 45 69 20 65 78 70 72 65 73  The X==Ei expres
20220 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78  sion */.      Ex
20230 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  pr *pX;         
20240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20250 2f 2a 20 54 68 65 20 58 20 65 78 70 72 65 73 73  /* The X express
20260 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
20270 72 20 2a 70 54 65 73 74 20 3d 20 30 3b 20 20 20  r *pTest = 0;   
20280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20290 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41 29  * X==Ei (form A)
202a0 20 6f 72 20 6a 75 73 74 20 45 69 20 28 66 6f 72   or just Ei (for
202b0 6d 20 42 29 20 2a 2f 0a 20 20 20 20 20 20 56 56  m B) */.      VV
202c0 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 69 43 61 63  A_ONLY( int iCac
202d0 68 65 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65  heLevel = pParse
202e0 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 20 29  ->iCacheLevel; )
202f0 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
20300 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
20310 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
20320 6c 65 63 74 29 20 26 26 20 70 45 78 70 72 2d 3e  lect) && pExpr->
20330 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  x.pList );.     
20340 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e 78   assert(pExpr->x
20350 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20  .pList->nExpr > 
20360 30 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74  0);.      pEList
20370 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
20380 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c  t;.      aListel
20390 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a  em = pEList->a;.
203a0 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45        nExpr = pE
203b0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
203c0 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73 71     endLabel = sq
203d0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
203e0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28  el(v);.      if(
203f0 20 28 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c   (pX = pExpr->pL
20400 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eft)!=0 ){.     
20410 20 20 20 74 65 6d 70 58 20 3d 20 2a 70 58 3b 0a     tempX = *pX;.
20420 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
20430 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pX->op==TK_COL
20440 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 65  UMN );.        e
20450 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 26 74  xprToRegister(&t
20460 65 6d 70 58 2c 20 73 71 6c 69 74 65 33 45 78 70  empX, sqlite3Exp
20470 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
20480 2c 20 70 58 2c 20 26 72 65 67 46 72 65 65 31 29  , pX, &regFree1)
20490 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
204a0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
204b0 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f   );.        opCo
204c0 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45 51  mpare.op = TK_EQ
204d0 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70  ;.        opComp
204e0 61 72 65 2e 70 4c 65 66 74 20 3d 20 26 74 65 6d  are.pLeft = &tem
204f0 70 58 3b 0a 20 20 20 20 20 20 20 20 70 54 65 73  pX;.        pTes
20500 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b 0a  t = &opCompare;.
20510 20 20 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65          /* Ticke
20520 74 20 62 33 35 31 64 39 35 66 39 63 64 35 65 66  t b351d95f9cd5ef
20530 31 37 65 39 64 39 64 62 61 65 31 38 66 35 63 61  17e9d9dbae18f5ca
20540 38 36 31 31 31 39 30 30 30 31 3a 0a 20 20 20 20  8611190001:.    
20550 20 20 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65      ** The value
20560 20 69 6e 20 72 65 67 46 72 65 65 31 20 6d 69 67   in regFree1 mig
20570 68 74 20 67 65 74 20 53 43 6f 70 79 2d 65 64 20  ht get SCopy-ed 
20580 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 72 65  into the file re
20590 73 75 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a  sult..        **
205a0 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   So make sure th
205b0 61 74 20 74 68 65 20 72 65 67 46 72 65 65 31 20  at the regFree1 
205c0 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 20  register is not 
205d0 72 65 75 73 65 64 20 66 6f 72 20 6f 74 68 65 72  reused for other
205e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 75 72 70  .        ** purp
205f0 6f 73 65 73 20 61 6e 64 20 70 6f 73 73 69 62 6c  oses and possibl
20600 79 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20  y overwritten.  
20610 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 46 72  */.        regFr
20620 65 65 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ee1 = 0;.      }
20630 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
20640 69 3c 6e 45 78 70 72 2d 31 3b 20 69 3d 69 2b 32  i<nExpr-1; i=i+2
20650 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
20660 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
20670 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
20680 20 69 66 28 20 70 58 20 29 7b 0a 20 20 20 20 20   if( pX ){.     
20690 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65       assert( pTe
206a0 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  st!=0 );.       
206b0 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 52 69     opCompare.pRi
206c0 67 68 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b  ght = aListelem[
206d0 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
206e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
206f0 20 20 20 70 54 65 73 74 20 3d 20 61 4c 69 73 74     pTest = aList
20700 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  elem[i].pExpr;. 
20710 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20720 20 6e 65 78 74 43 61 73 65 20 3d 20 73 71 6c 69   nextCase = sqli
20730 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
20740 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  (v);.        tes
20750 74 63 61 73 65 28 20 70 54 65 73 74 2d 3e 6f 70  tcase( pTest->op
20760 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
20770 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
20780 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
20790 2c 20 70 54 65 73 74 2c 20 6e 65 78 74 43 61 73  , pTest, nextCas
207a0 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  e, SQLITE_JUMPIF
207b0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 74  NULL);.        t
207c0 65 73 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c  estcase( aListel
207d0 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f  em[i+1].pExpr->o
207e0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
207f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
20800 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
20810 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70  aListelem[i+1].p
20820 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
20830 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
20840 62 65 47 6f 74 6f 28 76 2c 20 65 6e 64 4c 61 62  beGoto(v, endLab
20850 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  el);.        sql
20860 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
20870 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
20880 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
20890 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65 78  olveLabel(v, nex
208a0 74 43 61 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  tCase);.      }.
208b0 20 20 20 20 20 20 69 66 28 20 28 6e 45 78 70 72        if( (nExpr
208c0 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  &1)!=0 ){.      
208d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
208e0 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
208f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
20900 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
20910 70 45 4c 69 73 74 2d 3e 61 5b 6e 45 78 70 72 2d  pEList->a[nExpr-
20920 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  1].pExpr, target
20930 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
20940 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
20950 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 65  Parse);.      }e
20960 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
20970 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
20980 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
20990 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rget);.      }. 
209a0 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d       assert( db-
209b0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
209c0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
209d0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
209e0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
209f0 65 6c 3d 3d 69 43 61 63 68 65 4c 65 76 65 6c 20  el==iCacheLevel 
20a00 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
20a10 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
20a20 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20  (v, endLabel);. 
20a30 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20a40 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
20a50 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20  _OMIT_TRIGGER.  
20a60 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a    case TK_RAISE:
20a70 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
20a80 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
20a90 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20  ==OE_Rollback . 
20aa0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78            || pEx
20ab0 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
20ac0 5f 41 62 6f 72 74 0a 20 20 20 20 20 20 20 20 20  _Abort.         
20ad0 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69    || pExpr->affi
20ae0 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20  nity==OE_Fail.  
20af0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70           || pExp
20b00 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
20b10 49 67 6e 6f 72 65 0a 20 20 20 20 20 20 29 3b 0a  Ignore.      );.
20b20 20 20 20 20 20 20 69 66 28 20 21 70 50 61 72 73        if( !pPars
20b30 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62 20 29  e->pTriggerTab )
20b40 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
20b50 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
20b60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20b70 20 20 20 20 20 20 20 20 20 22 52 41 49 53 45 28           "RAISE(
20b80 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73  ) may only be us
20b90 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 69 67  ed within a trig
20ba0 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20  ger-program");. 
20bb0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
20bc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
20bd0 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  f( pExpr->affini
20be0 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  ty==OE_Abort ){.
20bf0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
20c00 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
20c10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
20c20 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
20c30 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
20c40 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
20c50 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
20c60 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e  affinity==OE_Ign
20c70 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ore ){.        s
20c80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
20c90 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 2c  (.            v,
20ca0 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45   OP_Halt, SQLITE
20cb0 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20  _OK, OE_Ignore, 
20cc0 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  0, pExpr->u.zTok
20cd0 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 56  en,0);.        V
20ce0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
20cf0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20d00 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 6c 74       sqlite3Halt
20d10 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73  Constraint(pPars
20d20 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  e, SQLITE_CONSTR
20d30 41 49 4e 54 5f 54 52 49 47 47 45 52 2c 0a 20 20  AINT_TRIGGER,.  
20d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d50 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
20d60 72 2d 3e 61 66 66 69 6e 69 74 79 2c 20 70 45 78  r->affinity, pEx
20d70 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c  pr->u.zToken, 0,
20d80 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   0);.      }..  
20d90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
20da0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71  .#endif.  }.  sq
20db0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
20dc0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
20dd0 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
20de0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
20df0 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
20e00 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67  ;.  return inReg
20e10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61 63 74 6f  ;.}../*.** Facto
20e20 72 20 6f 75 74 20 74 68 65 20 63 6f 64 65 20 6f  r out the code o
20e30 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
20e40 65 73 73 69 6f 6e 20 74 6f 20 69 6e 69 74 69 61  ession to initia
20e50 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a  lization time..*
20e60 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
20e70 70 72 43 6f 64 65 41 74 49 6e 69 74 28 0a 20 20  prCodeAtInit(.  
20e80 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
20e90 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
20ea0 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
20eb0 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54  pExpr,      /* T
20ec0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  he expression to
20ed0 20 63 6f 64 65 20 77 68 65 6e 20 74 68 65 20 56   code when the V
20ee0 44 42 45 20 69 6e 69 74 69 61 6c 69 7a 65 73 20  DBE initializes 
20ef0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 65 73 74  */.  int regDest
20f00 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  ,      /* Store 
20f10 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 69  the value in thi
20f20 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  s register */.  
20f30 75 38 20 72 65 75 73 61 62 6c 65 20 20 20 20 20  u8 reusable     
20f40 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
20f50 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  s expression is 
20f60 72 65 75 73 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  reusable */.){. 
20f70 20 45 78 70 72 4c 69 73 74 20 2a 70 3b 0a 20 20   ExprList *p;.  
20f80 61 73 73 65 72 74 28 20 43 6f 6e 73 74 46 61 63  assert( ConstFac
20f90 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29 3b  torOk(pParse) );
20fa0 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
20fb0 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 70 45 78  ConstExpr;.  pEx
20fc0 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
20fd0 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
20fe0 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 70 20 3d  pExpr, 0);.  p =
20ff0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
21000 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
21010 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  , pExpr);.  if( 
21020 70 20 29 7b 0a 20 20 20 20 20 73 74 72 75 63 74  p ){.     struct
21030 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
21040 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d  pItem = &p->a[p-
21050 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20  >nExpr-1];.     
21060 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45  pItem->u.iConstE
21070 78 70 72 52 65 67 20 3d 20 72 65 67 44 65 73 74  xprReg = regDest
21080 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65  ;.     pItem->re
21090 75 73 61 62 6c 65 20 3d 20 72 65 75 73 61 62 6c  usable = reusabl
210a0 65 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d  e;.  }.  pParse-
210b0 3e 70 43 6f 6e 73 74 45 78 70 72 20 3d 20 70 3b  >pConstExpr = p;
210c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
210d0 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
210e0 61 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ate an expressio
210f0 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  n and store the 
21100 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20  results.** into 
21110 61 20 72 65 67 69 73 74 65 72 2e 20 20 52 65 74  a register.  Ret
21120 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
21130 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74 68   number where th
21140 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65  e results.** are
21150 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   stored..**.** I
21160 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69  f the register i
21170 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65  s a temporary re
21180 67 69 73 74 65 72 20 74 68 61 74 20 63 61 6e 20  gister that can 
21190 62 65 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a  be deallocated,.
211a0 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 69 74  ** then write it
211b0 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70  s number into *p
211c0 52 65 67 2e 20 20 49 66 20 74 68 65 20 72 65 73  Reg.  If the res
211d0 75 6c 74 20 72 65 67 69 73 74 65 72 20 69 73 20  ult register is 
211e0 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61  not.** a tempora
211f0 72 79 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ry, then set *pR
21200 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a  eg to zero..**.*
21210 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61 20  * If pExpr is a 
21220 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74  constant, then t
21230 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
21240 74 20 67 65 6e 65 72 61 74 65 20 74 68 69 73 0a  t generate this.
21250 2a 2a 20 63 6f 64 65 20 74 6f 20 66 69 6c 6c 20  ** code to fill 
21260 74 68 65 20 72 65 67 69 73 74 65 72 20 69 6e 20  the register in 
21270 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
21280 6f 6e 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68  on section of th
21290 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61  e.** VDBE progra
212a0 6d 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66  m, in order to f
212b0 61 63 74 6f 72 20 69 74 20 6f 75 74 20 6f 66 20  actor it out of 
212c0 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 6c  the evaluation l
212d0 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oop..*/.int sqli
212e0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
212f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
21300 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
21310 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74 20 72 32  *pReg){.  int r2
21320 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69  ;.  pExpr = sqli
21330 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
21340 74 65 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28  te(pExpr);.  if(
21350 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70   ConstFactorOk(p
21360 50 61 72 73 65 29 0a 20 20 20 26 26 20 70 45 78  Parse).   && pEx
21370 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53  pr->op!=TK_REGIS
21380 54 45 52 0a 20 20 20 26 26 20 73 71 6c 69 74 65  TER.   && sqlite
21390 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e  3ExprIsConstantN
213a0 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 0a 20 20  otJoin(pExpr).  
213b0 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
213c0 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f  *p = pParse->pCo
213d0 6e 73 74 45 78 70 72 3b 0a 20 20 20 20 69 6e 74  nstExpr;.    int
213e0 20 69 3b 0a 20 20 20 20 2a 70 52 65 67 20 20 3d   i;.    *pReg  =
213f0 20 30 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b   0;.    if( p ){
21400 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
21410 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
21420 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49  em;.      for(pI
21430 74 65 6d 3d 70 2d 3e 61 2c 20 69 3d 70 2d 3e 6e  tem=p->a, i=p->n
21440 45 78 70 72 3b 20 69 3e 30 3b 20 70 49 74 65 6d  Expr; i>0; pItem
21450 2b 2b 2c 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  ++, i--){.      
21460 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 72 65 75    if( pItem->reu
21470 73 61 62 6c 65 20 26 26 20 73 71 6c 69 74 65 33  sable && sqlite3
21480 45 78 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65  ExprCompare(pIte
21490 6d 2d 3e 70 45 78 70 72 2c 70 45 78 70 72 2c 2d  m->pExpr,pExpr,-
214a0 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1)==0 ){.       
214b0 20 20 20 72 65 74 75 72 6e 20 70 49 74 65 6d 2d     return pItem-
214c0 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67  >u.iConstExprReg
214d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
214e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 32    }.    }.    r2
214f0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
21500 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  m;.    sqlite3Ex
21510 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61  prCodeAtInit(pPa
21520 72 73 65 2c 20 70 45 78 70 72 2c 20 72 32 2c 20  rse, pExpr, r2, 
21530 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
21540 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
21550 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
21560 73 65 29 3b 0a 20 20 20 20 72 32 20 3d 20 73 71  se);.    r2 = sq
21570 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
21580 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
21590 72 2c 20 72 31 29 3b 0a 20 20 20 20 69 66 28 20  r, r1);.    if( 
215a0 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20 20 20 20  r2==r1 ){.      
215b0 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20 20 20 20  *pReg = r1;.    
215c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
215d0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
215e0 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
215f0 20 20 20 20 20 20 2a 70 52 65 67 20 3d 20 30 3b        *pReg = 0;
21600 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
21610 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn r2;.}../*.**
21620 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
21630 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74  hat will evaluat
21640 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
21650 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  pr and store the
21660 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72  .** results in r
21670 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20  egister target. 
21680 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
21690 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61   guaranteed to a
216a0 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69  ppear.** in regi
216b0 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f 0a  ster target..*/.
216c0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
216d0 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61 72  Code(Parse *pPar
216e0 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
216f0 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20   int target){.  
21700 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73  int inReg;..  as
21710 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 26  sert( target>0 &
21720 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65  & target<=pParse
21730 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20  ->nMem );.  if( 
21740 70 45 78 70 72 20 26 26 20 70 45 78 70 72 2d 3e  pExpr && pExpr->
21750 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
21760 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
21770 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d  beAddOp2(pParse-
21780 3e 70 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c  >pVdbe, OP_Copy,
21790 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
217a0 74 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65  target);.  }else
217b0 7b 0a 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71  {.    inReg = sq
217c0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
217d0 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
217e0 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
217f0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
21800 70 56 64 62 65 21 3d 30 20 7c 7c 20 70 50 61 72  pVdbe!=0 || pPar
21810 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
21820 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20  iled );.    if( 
21830 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 26 26  inReg!=target &&
21840 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29   pParse->pVdbe )
21850 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
21860 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65  dbeAddOp2(pParse
21870 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70  ->pVdbe, OP_SCop
21880 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74  y, inReg, target
21890 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
218a0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 72 61  /*.** Make a tra
218b0 6e 73 69 65 6e 74 20 63 6f 70 79 20 6f 66 20 65  nsient copy of e
218c0 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
218d0 61 6e 64 20 74 68 65 6e 20 63 6f 64 65 20 69 74  and then code it
218e0 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65   using.** sqlite
218f0 33 45 78 70 72 43 6f 64 65 28 29 2e 20 20 54 68  3ExprCode().  Th
21900 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  is routine works
21910 20 6a 75 73 74 20 6c 69 6b 65 20 73 71 6c 69 74   just like sqlit
21920 65 33 45 78 70 72 43 6f 64 65 28 29 0a 2a 2a 20  e3ExprCode().** 
21930 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20  except that the 
21940 69 6e 70 75 74 20 65 78 70 72 65 73 73 69 6f 6e  input expression
21950 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
21960 6f 20 62 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a  o be unchanged..
21970 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
21980 78 70 72 43 6f 64 65 43 6f 70 79 28 50 61 72 73  xprCodeCopy(Pars
21990 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
219a0 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
219b0 65 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  et){.  sqlite3 *
219c0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
219d0 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74  .  pExpr = sqlit
219e0 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45  e3ExprDup(db, pE
219f0 78 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 21  xpr, 0);.  if( !
21a00 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
21a10 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   ) sqlite3ExprCo
21a20 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
21a30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 73 71 6c  , target);.  sql
21a40 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
21a50 62 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a  b, pExpr);.}../*
21a60 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
21a70 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c  e that will eval
21a80 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20  uate expression 
21a90 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20  pExpr and store 
21aa0 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69  the.** results i
21ab0 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
21ac0 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73 20  t.  The results 
21ad0 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74  are guaranteed t
21ae0 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72  o appear.** in r
21af0 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20  egister target. 
21b00 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
21b10 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c 20  on is constant, 
21b20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
21b30 65 0a 2a 2a 20 6d 69 67 68 74 20 63 68 6f 6f 73  e.** might choos
21b40 65 20 74 6f 20 63 6f 64 65 20 74 68 65 20 65 78  e to code the ex
21b50 70 72 65 73 73 69 6f 6e 20 61 74 20 69 6e 69 74  pression at init
21b60 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e  ialization time.
21b70 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
21b80 45 78 70 72 43 6f 64 65 46 61 63 74 6f 72 61 62  ExprCodeFactorab
21b90 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
21ba0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
21bb0 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69 66  nt target){.  if
21bc0 28 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73  ( pParse->okCons
21bd0 74 46 61 63 74 6f 72 20 26 26 20 73 71 6c 69 74  tFactor && sqlit
21be0 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
21bf0 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 73  (pExpr) ){.    s
21c00 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74  qlite3ExprCodeAt
21c10 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78  Init(pParse, pEx
21c20 70 72 2c 20 74 61 72 67 65 74 2c 20 30 29 3b 0a  pr, target, 0);.
21c30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
21c40 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
21c50 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
21c60 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  et);.  }.}../*.*
21c70 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
21c80 74 68 61 74 20 65 76 61 6c 75 61 74 65 73 20 74  that evaluates t
21c90 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
21ca0 69 6f 6e 20 61 6e 64 20 70 75 74 73 20 74 68 65  ion and puts the
21cb0 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72 65   result.** in re
21cc0 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a  gister target..*
21cd0 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20 61  *.** Also make a
21ce0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70   copy of the exp
21cf0 72 65 73 73 69 6f 6e 20 72 65 73 75 6c 74 73 20  ression results 
21d00 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22 63 61  into another "ca
21d10 63 68 65 22 20 72 65 67 69 73 74 65 72 0a 2a 2a  che" register.**
21d20 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65 20   and modify the 
21d30 65 78 70 72 65 73 73 69 6f 6e 20 73 6f 20 74 68  expression so th
21d40 61 74 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  at the next time
21d50 20 69 74 20 69 73 20 65 76 61 6c 75 61 74 65 64   it is evaluated
21d60 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  ,.** the result 
21d70 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  is a copy of the
21d80 20 63 61 63 68 65 20 72 65 67 69 73 74 65 72 2e   cache register.
21d90 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
21da0 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
21db0 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74  expressions that
21dc0 20 61 72 65 20 75 73 65 64 20 6d 75 6c 74 69 70   are used multip
21dd0 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20 54  le .** times.  T
21de0 68 65 79 20 61 72 65 20 65 76 61 6c 75 61 74 65  hey are evaluate
21df0 64 20 6f 6e 63 65 20 61 6e 64 20 74 68 65 20 72  d once and the r
21e00 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 65 78  esults of the ex
21e10 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65 20  pression.** are 
21e20 72 65 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  reused..*/.void 
21e30 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
21e40 6e 64 43 61 63 68 65 28 50 61 72 73 65 20 2a 70  ndCache(Parse *p
21e50 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
21e60 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b  pr, int target){
21e70 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
21e80 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
21e90 74 20 69 4d 65 6d 3b 0a 0a 20 20 61 73 73 65 72  t iMem;..  asser
21ea0 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20  t( target>0 );. 
21eb0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
21ec0 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op!=TK_REGISTER 
21ed0 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
21ee0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
21ef0 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 69  pr, target);.  i
21f00 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
21f10 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56  nMem;.  sqlite3V
21f20 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
21f30 43 6f 70 79 2c 20 74 61 72 67 65 74 2c 20 69 4d  Copy, target, iM
21f40 65 6d 29 3b 0a 20 20 65 78 70 72 54 6f 52 65 67  em);.  exprToReg
21f50 69 73 74 65 72 28 70 45 78 70 72 2c 20 69 4d 65  ister(pExpr, iMe
21f60 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  m);.}../*.** Gen
21f70 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
21f80 70 75 73 68 65 73 20 74 68 65 20 76 61 6c 75 65  pushes the value
21f90 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e   of every elemen
21fa0 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a  t of the given.*
21fb0 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
21fc0 74 20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e 63  t into a sequenc
21fd0 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 62  e of registers b
21fe0 65 67 69 6e 6e 69 6e 67 20 61 74 20 74 61 72 67  eginning at targ
21ff0 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  et..**.** Return
22000 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
22010 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75 61 74 65  lements evaluate
22020 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c  d..**.** The SQL
22030 49 54 45 5f 45 43 45 4c 5f 44 55 50 20 66 6c 61  ITE_ECEL_DUP fla
22040 67 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 61  g prevents the a
22050 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d 20 62 65  rguments from be
22060 69 6e 67 0a 2a 2a 20 66 69 6c 6c 65 64 20 75 73  ing.** filled us
22070 69 6e 67 20 4f 50 5f 53 43 6f 70 79 2e 20 20 4f  ing OP_SCopy.  O
22080 50 5f 43 6f 70 79 20 6d 75 73 74 20 62 65 20 75  P_Copy must be u
22090 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a  sed instead..**.
220a0 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43  ** The SQLITE_EC
220b0 45 4c 5f 46 41 43 54 4f 52 20 61 72 67 75 6d 65  EL_FACTOR argume
220c0 6e 74 20 61 6c 6c 6f 77 73 20 63 6f 6e 73 74 61  nt allows consta
220d0 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  nt arguments to 
220e0 62 65 0a 2a 2a 20 66 61 63 74 6f 72 65 64 20 6f  be.** factored o
220f0 75 74 20 69 6e 74 6f 20 69 6e 69 74 69 61 6c 69  ut into initiali
22100 7a 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 2a 2a 0a  zation code..**.
22110 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43  ** The SQLITE_EC
22120 45 4c 5f 52 45 46 20 66 6c 61 67 20 6d 65 61 6e  EL_REF flag mean
22130 73 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f  s that expressio
22140 6e 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 77  ns in the list w
22150 69 74 68 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e  ith.** ExprList.
22160 61 5b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  a[].u.x.iOrderBy
22170 43 6f 6c 3e 30 20 68 61 76 65 20 61 6c 72 65 61  Col>0 have alrea
22180 64 79 20 62 65 65 6e 20 65 76 61 6c 75 61 74 65  dy been evaluate
22190 64 20 61 6e 64 20 73 74 6f 72 65 64 0a 2a 2a 20  d and stored.** 
221a0 69 6e 20 72 65 67 69 73 74 65 72 73 20 61 74 20  in registers at 
221b0 73 72 63 52 65 67 2c 20 61 6e 64 20 73 6f 20 74  srcReg, and so t
221c0 68 65 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20  he value can be 
221d0 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 72  copied from ther
221e0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
221f0 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
22200 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
22210 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
22220 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
22230 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
22240 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
22250 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20  sion list to be 
22260 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74  coded */.  int t
22270 61 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f 2a  arget,        /*
22280 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
22290 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74  results */.  int
222a0 20 73 72 63 52 65 67 2c 20 20 20 20 20 20 20 20   srcReg,        
222b0 2f 2a 20 53 6f 75 72 63 65 20 72 65 67 69 73 74  /* Source regist
222c0 65 72 73 20 69 66 20 53 51 4c 49 54 45 5f 45 43  ers if SQLITE_EC
222d0 45 4c 5f 52 45 46 20 2a 2f 0a 20 20 75 38 20 66  EL_REF */.  u8 f
222e0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f  lags           /
222f0 2a 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 2a 20  * SQLITE_ECEL_* 
22300 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 73 74  flags */.){.  st
22310 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
22320 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
22330 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 75 38 20 63   i, j, n;.  u8 c
22340 6f 70 79 4f 70 20 3d 20 28 66 6c 61 67 73 20 26  opyOp = (flags &
22350 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50   SQLITE_ECEL_DUP
22360 29 20 3f 20 4f 50 5f 43 6f 70 79 20 3a 20 4f 50  ) ? OP_Copy : OP
22370 5f 53 43 6f 70 79 3b 0a 20 20 56 64 62 65 20 2a  _SCopy;.  Vdbe *
22380 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
22390 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  e;.  assert( pLi
223a0 73 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  st!=0 );.  asser
223b0 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20  t( target>0 );. 
223c0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
223d0 3e 70 56 64 62 65 21 3d 30 20 29 3b 20 20 2f 2a  >pVdbe!=0 );  /*
223e0 20 4e 65 76 65 72 20 67 65 74 73 20 74 68 69 73   Never gets this
223f0 20 66 61 72 20 6f 74 68 65 72 77 69 73 65 20 2a   far otherwise *
22400 2f 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e  /.  n = pList->n
22410 45 78 70 72 3b 0a 20 20 69 66 28 20 21 43 6f 6e  Expr;.  if( !Con
22420 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73  stFactorOk(pPars
22430 65 29 20 29 20 66 6c 61 67 73 20 26 3d 20 7e 53  e) ) flags &= ~S
22440 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f  QLITE_ECEL_FACTO
22450 52 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  R;.  for(pItem=p
22460 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
22470 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  n; i++, pItem++)
22480 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
22490 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  r = pItem->pExpr
224a0 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  ;.    if( (flags
224b0 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52   & SQLITE_ECEL_R
224c0 45 46 29 21 3d 30 20 26 26 20 28 6a 20 3d 20 70  EF)!=0 && (j = p
224d0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69  List->a[i].u.x.i
224e0 4f 72 64 65 72 42 79 43 6f 6c 29 3e 30 20 29 7b  OrderByCol)>0 ){
224f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
22500 62 65 41 64 64 4f 70 32 28 76 2c 20 63 6f 70 79  beAddOp2(v, copy
22510 4f 70 2c 20 6a 2b 73 72 63 52 65 67 2d 31 2c 20  Op, j+srcReg-1, 
22520 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 7d  target+i);.    }
22530 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20  else if( (flags 
22540 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41  & SQLITE_ECEL_FA
22550 43 54 4f 52 29 21 3d 30 20 26 26 20 73 71 6c 69  CTOR)!=0 && sqli
22560 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
22570 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  t(pExpr) ){.    
22580 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
22590 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20  eAtInit(pParse, 
225a0 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69 2c  pExpr, target+i,
225b0 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
225c0 20 20 20 20 20 20 69 6e 74 20 69 6e 52 65 67 20        int inReg 
225d0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
225e0 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
225f0 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29  pExpr, target+i)
22600 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52 65  ;.      if( inRe
22610 67 21 3d 74 61 72 67 65 74 2b 69 20 29 7b 0a 20  g!=target+i ){. 
22620 20 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70         VdbeOp *p
22630 4f 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  Op;.        if( 
22640 63 6f 70 79 4f 70 3d 3d 4f 50 5f 43 6f 70 79 0a  copyOp==OP_Copy.
22650 20 20 20 20 20 20 20 20 20 26 26 20 28 70 4f 70           && (pOp
22660 3d 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f  =sqlite3VdbeGetO
22670 70 28 76 2c 20 2d 31 29 29 2d 3e 6f 70 63 6f 64  p(v, -1))->opcod
22680 65 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20  e==OP_Copy.     
22690 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 31 2b 70      && pOp->p1+p
226a0 4f 70 2d 3e 70 33 2b 31 3d 3d 69 6e 52 65 67 0a  Op->p3+1==inReg.
226b0 20 20 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d           && pOp-
226c0 3e 70 32 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 74  >p2+pOp->p3+1==t
226d0 61 72 67 65 74 2b 69 0a 20 20 20 20 20 20 20 20  arget+i.        
226e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  ){.          pOp
226f0 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20 20 20 20 20  ->p3++;.        
22700 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
22710 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22720 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20 69 6e  p2(v, copyOp, in
22730 52 65 67 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a  Reg, target+i);.
22740 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22750 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
22760 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
22770 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
22780 6f 72 20 61 20 42 45 54 57 45 45 4e 20 6f 70 65  or a BETWEEN ope
22790 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  rator..**.**    
227a0 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20  x BETWEEN y AND 
227b0 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76  z.**.** The abov
227c0 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  e is equivalent 
227d0 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d  to .**.**    x>=
227e0 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a  y AND x<=z.**.**
227f0 20 43 6f 64 65 20 69 74 20 61 73 20 73 75 63 68   Code it as such
22800 2c 20 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f  , taking care to
22810 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73   do the common s
22820 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  ubexpression.** 
22830 65 6c 69 6d 69 6e 61 74 69 6f 6e 20 6f 66 20 78  elimination of x
22840 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
22850 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e   exprCodeBetween
22860 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
22870 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
22880 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
22890 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
228a0 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
228b0 20 20 20 20 2f 2a 20 54 68 65 20 42 45 54 57 45      /* The BETWE
228c0 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  EN expression */
228d0 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20  .  int dest,    
228e0 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
228f0 65 20 69 66 20 74 68 65 20 6a 75 6d 70 20 69 73  e if the jump is
22900 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 76 6f 69 64   taken */.  void
22910 20 28 2a 78 4a 75 6d 70 49 66 29 28 50 61 72 73   (*xJumpIf)(Pars
22920 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 69 6e 74  e*,Expr*,int,int
22930 29 2c 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e  ),.  int jumpIfN
22940 75 6c 6c 20 20 20 20 2f 2a 20 54 61 6b 65 20 74  ull    /* Take t
22950 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42  he jump if the B
22960 45 54 57 45 45 4e 20 69 73 20 4e 55 4c 4c 20 2a  ETWEEN is NULL *
22970 2f 0a 29 7b 0a 20 20 45 78 70 72 20 65 78 70 72  /.){.  Expr expr
22980 41 6e 64 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  And;     /* The 
22990 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 69 6e 20  AND operator in 
229a0 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 20 20   x>=y AND x<=z  
229b0 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 4c 65  */.  Expr compLe
229c0 66 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 20 78  ft;    /* The  x
229d0 3e 3d 79 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45  >=y  term */.  E
229e0 78 70 72 20 63 6f 6d 70 52 69 67 68 74 3b 20 20  xpr compRight;  
229f0 20 2f 2a 20 54 68 65 20 20 78 3c 3d 7a 20 20 74   /* The  x<=z  t
22a00 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 65 78  erm */.  Expr ex
22a10 70 72 58 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  prX;       /* Th
22a20 65 20 20 78 20 20 73 75 62 65 78 70 72 65 73 73  e  x  subexpress
22a30 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ion */.  int reg
22a40 46 72 65 65 31 20 3d 20 30 3b 20 2f 2a 20 54 65  Free1 = 0; /* Te
22a50 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65 67 69  mporary use regi
22a60 73 74 65 72 20 2a 2f 0a 0a 20 20 6d 65 6d 73 65  ster */..  memse
22a70 74 28 26 63 6f 6d 70 4c 65 66 74 2c 20 30 2c 20  t(&compLeft, 0, 
22a80 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20  sizeof(Expr));. 
22a90 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70 52 69 67   memset(&compRig
22aa0 68 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78  ht, 0, sizeof(Ex
22ab0 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  pr));.  memset(&
22ac0 65 78 70 72 41 6e 64 2c 20 30 2c 20 73 69 7a 65  exprAnd, 0, size
22ad0 6f 66 28 45 78 70 72 29 29 3b 0a 0a 20 20 61 73  of(Expr));..  as
22ae0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
22af0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
22b00 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
22b10 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72 2d   exprX = *pExpr-
22b20 3e 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e  >pLeft;.  exprAn
22b30 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20  d.op = TK_AND;. 
22b40 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d   exprAnd.pLeft =
22b50 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 65 78   &compLeft;.  ex
22b60 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20 26  prAnd.pRight = &
22b70 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 63 6f 6d  compRight;.  com
22b80 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45  pLeft.op = TK_GE
22b90 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65  ;.  compLeft.pLe
22ba0 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63  ft = &exprX;.  c
22bb0 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20 3d  ompLeft.pRight =
22bc0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
22bd0 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 63  >a[0].pExpr;.  c
22be0 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b  ompRight.op = TK
22bf0 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74  _LE;.  compRight
22c00 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b  .pLeft = &exprX;
22c10 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69  .  compRight.pRi
22c20 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ght = pExpr->x.p
22c30 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
22c40 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
22c50 78 70 72 49 73 56 65 63 74 6f 72 28 26 65 78 70  xprIsVector(&exp
22c60 72 58 29 3d 3d 30 20 29 7b 0a 20 20 20 20 65 78  rX)==0 ){.    ex
22c70 70 72 54 6f 52 65 67 69 73 74 65 72 28 26 65 78  prToRegister(&ex
22c80 70 72 58 2c 20 73 71 6c 69 74 65 33 45 78 70 72  prX, sqlite3Expr
22c90 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
22ca0 20 26 65 78 70 72 58 2c 20 26 72 65 67 46 72 65   &exprX, &regFre
22cb0 65 31 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  e1));.  }.  if( 
22cc0 78 4a 75 6d 70 49 66 20 29 7b 0a 20 20 20 20 78  xJumpIf ){.    x
22cd0 4a 75 6d 70 49 66 28 70 50 61 72 73 65 2c 20 26  JumpIf(pParse, &
22ce0 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a  exprAnd, dest, j
22cf0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65  umpIfNull);.  }e
22d00 6c 73 65 7b 0a 20 20 20 20 65 78 70 72 58 2e 66  lse{.    exprX.f
22d10 6c 61 67 73 20 7c 3d 20 45 50 5f 46 72 6f 6d 4a  lags |= EP_FromJ
22d20 6f 69 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  oin;.    sqlite3
22d30 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
22d40 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c  Parse, &exprAnd,
22d50 20 64 65 73 74 29 3b 0a 20 20 7d 0a 20 20 73 71   dest);.  }.  sq
22d60 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
22d70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
22d80 72 65 65 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73  ree1);..  /* Ens
22d90 75 72 65 20 61 64 65 71 75 61 74 65 20 74 65 73  ure adequate tes
22da0 74 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20  t coverage */.  
22db0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
22dc0 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49  True==0 && jumpI
22dd0 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46  fNull==0 && regF
22de0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73  ree1==0 );.  tes
22df0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75  tcase( jumpIfTru
22e00 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75  e==0 && jumpIfNu
22e10 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll==0 && regFree
22e20 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1!=0 );.  testca
22e30 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d  se( jumpIfTrue==
22e40 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  0 && jumpIfNull!
22e50 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d  =0 && regFree1==
22e60 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
22e70 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26   jumpIfTrue==0 &
22e80 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20  & jumpIfNull!=0 
22e90 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29  && regFree1!=0 )
22ea0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75  ;.  testcase( ju
22eb0 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a  mpIfTrue!=0 && j
22ec0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20  umpIfNull==0 && 
22ed0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
22ee0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
22ef0 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70  fTrue!=0 && jump
22f00 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67  IfNull==0 && reg
22f10 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65  Free1!=0 );.  te
22f20 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72  stcase( jumpIfTr
22f30 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e  ue!=0 && jumpIfN
22f40 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65  ull!=0 && regFre
22f50 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1==0 );.  testc
22f60 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21  ase( jumpIfTrue!
22f70 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  =0 && jumpIfNull
22f80 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21  !=0 && regFree1!
22f90 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  =0 );.}../*.** G
22fa0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
22fb0 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65   a boolean expre
22fc0 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20  ssion such that 
22fd0 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a  a jump is made.*
22fe0 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22  * to the label "
22ff0 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70  dest" if the exp
23000 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20  ression is true 
23010 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  but execution.**
23020 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69   continues strai
23030 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20  ght thru if the 
23040 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61  expression is fa
23050 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  lse..**.** If th
23060 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61  e expression eva
23070 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28  luates to NULL (
23080 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72  neither true nor
23090 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a   false), then.**
230a0 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   take the jump i
230b0 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c  f the jumpIfNull
230c0 20 66 6c 61 67 20 69 73 20 53 51 4c 49 54 45 5f   flag is SQLITE_
230d0 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  JUMPIFNULL..**.*
230e0 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70 65  * This code depe
230f0 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20  nds on the fact 
23100 74 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b  that certain tok
23110 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54  en values (ex: T
23120 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65  K_EQ).** are the
23130 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20   same as opcode 
23140 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45  values (ex: OP_E
23150 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  q) that implemen
23160 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  t the correspond
23170 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  ing.** operation
23180 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65  .  Special comme
23190 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e  nts in vdbe.c an
231a0 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  d the mkopcodeh.
231b0 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a  awk script in.**
231c0 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73   the make proces
231d0 73 20 63 61 75 73 65 20 74 68 65 73 65 20 76 61  s cause these va
231e0 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20  lues to align.  
231f0 41 73 73 65 72 74 28 29 73 20 69 6e 20 74 68 65  Assert()s in the
23200 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76   code.** below v
23210 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e  erify that the n
23220 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e  umbers are align
23230 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f  ed correctly..*/
23240 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
23250 72 49 66 54 72 75 65 28 50 61 72 73 65 20 2a 70  rIfTrue(Parse *p
23260 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
23270 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e  pr, int dest, in
23280 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
23290 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
232a0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
232b0 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  op = 0;.  int re
232c0 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e  gFree1 = 0;.  in
232d0 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a  t regFree2 = 0;.
232e0 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20    int r1, r2;.. 
232f0 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e   assert( jumpIfN
23300 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50  ull==SQLITE_JUMP
23310 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66  IFNULL || jumpIf
23320 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Null==0 );.  if(
23330 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 20   NEVER(v==0) )  
23340 20 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45     return;  /* E
23350 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45  xistence of VDBE
23360 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c   checked by call
23370 65 72 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  er */.  if( NEVE
23380 52 28 70 45 78 70 72 3d 3d 30 29 20 29 20 72 65  R(pExpr==0) ) re
23390 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61 79  turn;  /* No way
233a0 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   this can happen
233b0 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 45 78 70 72   */.  op = pExpr
233c0 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20  ->op;.  switch( 
233d0 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
233e0 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69  K_AND: {.      i
233f0 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56  nt d2 = sqlite3V
23400 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
23410 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
23420 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
23430 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
23440 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
23450 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
23460 20 64 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53   d2,jumpIfNull^S
23470 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
23480 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
23490 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
234a0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
234b0 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
234c0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
234d0 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
234e0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
234f0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
23500 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20  eLabel(v, d2);. 
23510 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
23520 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
23530 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
23540 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
23550 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  _OR: {.      tes
23560 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
23570 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
23580 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
23590 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
235a0 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
235b0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
235c0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
235d0 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
235e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
235f0 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
23600 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
23610 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
23620 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
23630 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
23640 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
23650 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
23660 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  _NOT: {.      te
23670 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
23680 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
23690 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
236a0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
236b0 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
236c0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
236d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
236e0 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20    case TK_IS:.  
236f0 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a    case TK_ISNOT:
23700 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
23710 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20   op==TK_IS );.  
23720 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
23730 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20  ==TK_ISNOT );.  
23740 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b      op = (op==TK
23750 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54  _IS) ? TK_EQ : T
23760 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 6a 75 6d 70  K_NE;.      jump
23770 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45 5f  IfNull = SQLITE_
23780 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a  NULLEQ;.      /*
23790 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20   Fall thru */.  
237a0 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
237b0 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
237c0 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
237d0 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
237e0 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
237f0 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
23800 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
23810 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 45  3ExprIsVector(pE
23820 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 20 67 6f  xpr->pLeft) ) go
23830 74 6f 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3b  to default_expr;
23840 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
23850 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
23860 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
23870 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
23880 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
23890 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
238a0 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
238b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
238c0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
238d0 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
238e0 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  e2);.      codeC
238f0 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
23900 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
23910 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
23920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23930 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20    r1, r2, dest, 
23940 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
23950 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d     assert(TK_LT=
23960 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73  =OP_Lt); testcas
23970 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64  e(op==OP_Lt); Vd
23980 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
23990 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20  p==OP_Lt);.     
239a0 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f   assert(TK_LE==O
239b0 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Le); testcase(
239c0 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65  op==OP_Le); Vdbe
239d0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
239e0 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61  =OP_Le);.      a
239f0 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f  ssert(TK_GT==OP_
23a00 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Gt); testcase(op
23a10 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f  ==OP_Gt); VdbeCo
23a20 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
23a30 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Gt);.      ass
23a40 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65  ert(TK_GE==OP_Ge
23a50 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
23a60 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Ge); VdbeCove
23a70 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
23a80 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Ge);.      asser
23a90 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b  t(TK_EQ==OP_Eq);
23aa0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
23ab0 5f 45 71 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _Eq);.      Vdbe
23ac0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
23ad0 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49  ==OP_Eq && jumpI
23ae0 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55  fNull==SQLITE_NU
23af0 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62  LLEQ);.      Vdb
23b00 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
23b10 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70  p==OP_Eq && jump
23b20 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e  IfNull!=SQLITE_N
23b30 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 61 73  ULLEQ);.      as
23b40 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e  sert(TK_NE==OP_N
23b50 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
23b60 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 56  =OP_Ne);.      V
23b70 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
23b80 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75   op==OP_Ne && ju
23b90 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
23ba0 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
23bb0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
23bc0 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a  , op==OP_Ne && j
23bd0 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54  umpIfNull!=SQLIT
23be0 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
23bf0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
23c00 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
23c10 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
23c20 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
23c30 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
23c40 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
23c50 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
23c60 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ULL: {.      ass
23c70 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d  ert( TK_ISNULL==
23c80 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74  OP_IsNull );   t
23c90 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
23ca0 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
23cb0 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55  assert( TK_NOTNU
23cc0 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  LL==OP_NotNull )
23cd0 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d  ; testcase( op==
23ce0 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20  TK_NOTNULL );.  
23cf0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
23d00 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
23d10 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
23d20 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
23d30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23d40 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31  AddOp2(v, op, r1
23d50 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 56  , dest);.      V
23d60 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
23d70 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b   op==TK_ISNULL);
23d80 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
23d90 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
23da0 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  NOTNULL);.      
23db0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
23dc0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e1==0 );.      b
23dd0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
23de0 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
23df0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
23e00 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
23e10 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f   );.      exprCo
23e20 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65  deBetween(pParse
23e30 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 73  , pExpr, dest, s
23e40 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
23e50 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
23e60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
23e70 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
23e80 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
23e90 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
23ea0 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49  .      int destI
23eb0 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33  fFalse = sqlite3
23ec0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
23ed0 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74  ;.      int dest
23ee0 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e  IfNull = jumpIfN
23ef0 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20 64 65 73  ull ? dest : des
23f00 74 49 66 46 61 6c 73 65 3b 0a 20 20 20 20 20 20  tIfFalse;.      
23f10 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
23f20 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  N(pParse, pExpr,
23f30 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65   destIfFalse, de
23f40 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
23f50 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
23f60 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  (v, dest);.     
23f70 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
23f80 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74  lveLabel(v, dest
23f90 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20  IfFalse);.      
23fa0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
23fb0 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  dif.    default:
23fc0 20 7b 0a 20 20 20 20 64 65 66 61 75 6c 74 5f 65   {.    default_e
23fd0 78 70 72 3a 0a 20 20 20 20 20 20 69 66 28 20 65  xpr:.      if( e
23fe0 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 70 45  xprAlwaysTrue(pE
23ff0 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
24000 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
24010 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  v, dest);.      
24020 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c  }else if( exprAl
24030 77 61 79 73 46 61 6c 73 65 28 70 45 78 70 72 29  waysFalse(pExpr)
24040 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e   ){.        /* N
24050 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65  o-op */.      }e
24060 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20  lse{.        r1 
24070 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
24080 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
24090 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b  xpr, &regFree1);
240a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
240b0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
240c0 5f 49 66 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a  _If, r1, dest, j
240d0 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20  umpIfNull!=0);. 
240e0 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
240f0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
24100 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
24110 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  e1==0 );.       
24120 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
24130 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
24140 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
24150 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
24160 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
24170 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
24180 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ee1);.  sqlite3R
24190 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
241a0 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b  arse, regFree2);
241b0 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65    .}../*.** Gene
241c0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
241d0 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69  boolean expressi
241e0 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a  on such that a j
241f0 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74  ump is made.** t
24200 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73  o the label "des
24210 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73  t" if the expres
24220 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62 75  sion is false bu
24230 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63  t execution.** c
24240 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68  ontinues straigh
24250 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78  t thru if the ex
24260 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65  pression is true
24270 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
24280 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61  xpression evalua
24290 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69  tes to NULL (nei
242a0 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61  ther true nor fa
242b0 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d  lse) then.** jum
242c0 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20  p if jumpIfNull 
242d0 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  is SQLITE_JUMPIF
242e0 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74 68 72  NULL or fall thr
242f0 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e 75  ough if jumpIfNu
24300 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76  ll.** is 0..*/.v
24310 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49  oid sqlite3ExprI
24320 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70 50  fFalse(Parse *pP
24330 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
24340 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74  r, int dest, int
24350 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
24360 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
24370 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f  ->pVdbe;.  int o
24380 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  p = 0;.  int reg
24390 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74  Free1 = 0;.  int
243a0 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20   regFree2 = 0;. 
243b0 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20   int r1, r2;..  
243c0 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75  assert( jumpIfNu
243d0 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ll==SQLITE_JUMPI
243e0 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e  FNULL || jumpIfN
243f0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ull==0 );.  if( 
24400 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65  NEVER(v==0) ) re
24410 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74 65 6e  turn; /* Existen
24420 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b  ce of VDBE check
24430 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a  ed by caller */.
24440 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
24450 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f      return;..  /
24460 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 70  * The value of p
24470 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20  Expr->op and op 
24480 61 72 65 20 72 65 6c 61 74 65 64 20 61 73 20 66  are related as f
24490 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ollows:.  **.  *
244a0 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f  *       pExpr->o
244b0 70 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 0a  p            op.
244c0 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d    **       -----
244d0 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d 2d  ----          --
244e0 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20  --------.  **   
244f0 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20      TK_ISNULL   
24500 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c         OP_NotNul
24510 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  l.  **       TK_
24520 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20 20  NOTNULL         
24530 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20  OP_IsNull.  **  
24540 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20 20       TK_NE      
24550 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20 20          OP_Eq.  
24560 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20 20  **       TK_EQ  
24570 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e              OP_N
24580 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  e.  **       TK_
24590 47 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20  GT              
245a0 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Le.  **      
245b0 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20 20   TK_LE          
245c0 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20      OP_Gt.  **  
245d0 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20 20       TK_GE      
245e0 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20          OP_Lt.  
245f0 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20 20  **       TK_LT  
24600 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47              OP_G
24610 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20  e.  **.  ** For 
24620 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20  other values of 
24630 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73  pExpr->op, op is
24640 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20 75   undefined and u
24650 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20  nused..  ** The 
24660 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64  value of TK_ and
24670 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61   OP_ constants a
24680 72 65 20 61 72 72 61 6e 67 65 64 20 73 75 63 68  re arranged such
24690 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63 61   that we.  ** ca
246a0 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 61  n compute the ma
246b0 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69 6e  pping above usin
246c0 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  g the following 
246d0 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a  expression..  **
246e0 20 41 73 73 65 72 74 28 29 73 20 76 65 72 69 66   Assert()s verif
246f0 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70 75  y that the compu
24700 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65 63  tation is correc
24710 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28  t..  */.  op = (
24720 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49  (pExpr->op+(TK_I
24730 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b  SNULL&1))^1)-(TK
24740 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f  _ISNULL&1);..  /
24750 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65 63 74  * Verify correct
24760 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b   alignment of TK
24770 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61  _ and OP_ consta
24780 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  nts.  */.  asser
24790 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
247a0 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f  _ISNULL || op==O
247b0 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61  P_NotNull );.  a
247c0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
247d0 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20  !=TK_NOTNULL || 
247e0 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b  op==OP_IsNull );
247f0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
24800 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f  ->op!=TK_NE || o
24810 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73  p==OP_Eq );.  as
24820 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
24830 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_EQ || op==OP
24840 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Ne );.  assert(
24850 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c   pExpr->op!=TK_L
24860 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29  T || op==OP_Ge )
24870 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
24880 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20  r->op!=TK_LE || 
24890 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61  op==OP_Gt );.  a
248a0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
248b0 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_GT || op==O
248c0 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Le );.  assert
248d0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
248e0 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20  GE || op==OP_Lt 
248f0 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45  );..  switch( pE
24900 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
24910 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20  ase TK_AND: {.  
24920 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
24930 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
24940 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
24950 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
24960 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
24970 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
24980 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
24990 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
249a0 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
249b0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
249c0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
249d0 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
249e0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
249f0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
24a00 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
24a10 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
24a20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a    case TK_OR: {.
24a30 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73        int d2 = s
24a40 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
24a50 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65  bel(v);.      te
24a60 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
24a70 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
24a80 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
24a90 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
24aa0 70 4c 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70 49  pLeft, d2, jumpI
24ab0 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d  fNull^SQLITE_JUM
24ac0 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
24ad0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
24ae0 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
24af0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
24b00 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
24b10 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
24b20 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
24b30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
24b40 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
24b50 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , d2);.      sql
24b60 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
24b70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
24b80 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
24b90 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a   case TK_NOT: {.
24ba0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
24bb0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
24bc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
24bd0 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
24be0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
24bf0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
24c00 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
24c10 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
24c20 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IS:.    case TK
24c30 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65  _ISNOT:.      te
24c40 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
24c50 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20  p==TK_IS );.    
24c60 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
24c70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20  r->op==TK_ISNOT 
24c80 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 70  );.      op = (p
24c90 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29  Expr->op==TK_IS)
24ca0 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51   ? TK_NE : TK_EQ
24cb0 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49 66 4e 75  ;.      jumpIfNu
24cc0 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  ll = SQLITE_NULL
24cd0 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c  EQ;.      /* Fal
24ce0 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 63 61  l thru */.    ca
24cf0 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
24d00 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
24d10 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
24d20 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
24d30 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
24d40 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
24d50 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
24d60 72 49 73 56 65 63 74 6f 72 28 70 45 78 70 72 2d  rIsVector(pExpr-
24d70 3e 70 4c 65 66 74 29 20 29 20 67 6f 74 6f 20 64  >pLeft) ) goto d
24d80 65 66 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20 20  efault_expr;.   
24d90 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
24da0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
24db0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
24dc0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
24dd0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
24de0 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
24df0 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
24e00 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
24e10 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
24e20 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
24e30 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
24e40 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
24e50 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
24e60 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
24e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
24e80 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r2, dest, jump
24e90 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61  IfNull);.      a
24ea0 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f  ssert(TK_LT==OP_
24eb0 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Lt); testcase(op
24ec0 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f  ==OP_Lt); VdbeCo
24ed0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
24ee0 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Lt);.      ass
24ef0 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65  ert(TK_LE==OP_Le
24f00 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
24f10 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Le); VdbeCove
24f20 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
24f30 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Le);.      asser
24f40 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b  t(TK_GT==OP_Gt);
24f50 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
24f60 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Gt); VdbeCovera
24f70 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74  geIf(v,op==OP_Gt
24f80 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
24f90 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74  TK_GE==OP_Ge); t
24fa0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
24fb0 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
24fc0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b  If(v,op==OP_Ge);
24fd0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
24fe0 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73  _EQ==OP_Eq); tes
24ff0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29  tcase(op==OP_Eq)
25000 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
25010 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
25020 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  _Eq && jumpIfNul
25030 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  l!=SQLITE_NULLEQ
25040 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
25050 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
25060 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Eq && jumpIfNu
25070 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll==SQLITE_NULLE
25080 51 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  Q);.      assert
25090 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20  (TK_NE==OP_Ne); 
250a0 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
250b0 4e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  Ne);.      VdbeC
250c0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
250d0 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66  =OP_Ne && jumpIf
250e0 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c  Null!=SQLITE_NUL
250f0 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65  LEQ);.      Vdbe
25100 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
25110 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49  ==OP_Ne && jumpI
25120 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55  fNull==SQLITE_NU
25130 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73  LLEQ);.      tes
25140 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
25150 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
25160 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
25170 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
25180 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
25190 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
251a0 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
251b0 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71   {.      r1 = sq
251c0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
251d0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
251e0 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
251f0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
25200 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
25210 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20  p, r1, dest);.  
25220 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
25230 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20 20  ==TK_ISNULL );  
25240 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
25250 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  v, op==TK_ISNULL
25260 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
25270 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  e( op==TK_NOTNUL
25280 4c 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61  L );  VdbeCovera
25290 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e  geIf(v, op==TK_N
252a0 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74  OTNULL);.      t
252b0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
252c0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  1==0 );.      br
252d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
252e0 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
252f0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
25300 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
25310 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64  );.      exprCod
25320 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c  eBetween(pParse,
25330 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 73 71   pExpr, dest, sq
25340 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
25350 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
25360 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
25370 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
25380 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
25390 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
253a0 0a 20 20 20 20 20 20 69 66 28 20 6a 75 6d 70 49  .      if( jumpI
253b0 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  fNull ){.       
253c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
253d0 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
253e0 2c 20 64 65 73 74 2c 20 64 65 73 74 29 3b 0a 20  , dest, dest);. 
253f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
25400 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75      int destIfNu
25410 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ll = sqlite3Vdbe
25420 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
25430 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
25440 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
25450 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73  pExpr, dest, des
25460 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
25470 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
25480 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
25490 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
254a0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
254b0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
254c0 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64  default: {.    d
254d0 65 66 61 75 6c 74 5f 65 78 70 72 3a 20 0a 20 20  efault_expr: .  
254e0 20 20 20 20 69 66 28 20 65 78 70 72 41 6c 77 61      if( exprAlwa
254f0 79 73 46 61 6c 73 65 28 70 45 78 70 72 29 20 29  ysFalse(pExpr) )
25500 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
25510 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73  3VdbeGoto(v, des
25520 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  t);.      }else 
25530 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 54 72  if( exprAlwaysTr
25540 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  ue(pExpr) ){.   
25550 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f       /* no-op */
25560 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
25570 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
25580 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
25590 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72  Parse, pExpr, &r
255a0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
255b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
255c0 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op3(v, OP_IfNot,
255d0 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49   r1, dest, jumpI
255e0 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20  fNull!=0);.     
255f0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
25600 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  v);.        test
25610 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
25620 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  0 );.        tes
25630 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
25640 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  l==0 );.      }.
25650 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
25660 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
25670 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
25680 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
25690 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
256a0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
256b0 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a 0a  , regFree2);.}..
256c0 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69 74  /*.** Like sqlit
256d0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 29 20  e3ExprIfFalse() 
256e0 65 78 63 65 70 74 20 74 68 61 74 20 61 20 63 6f  except that a co
256f0 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 70 45  py is made of pE
25700 78 70 72 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f  xpr before.** co
25710 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2c 20 61  de generation, a
25720 6e 64 20 74 68 61 74 20 63 6f 70 79 20 69 73 20  nd that copy is 
25730 64 65 6c 65 74 65 64 20 61 66 74 65 72 20 63 6f  deleted after co
25740 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20 54  de generation. T
25750 68 69 73 0a 2a 2a 20 65 6e 73 75 72 65 73 20 74  his.** ensures t
25760 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hat the original
25770 20 70 45 78 70 72 20 69 73 20 75 6e 63 68 61 6e   pExpr is unchan
25780 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ged..*/.void sql
25790 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 44  ite3ExprIfFalseD
257a0 75 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  up(Parse *pParse
257b0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
257c0 6e 74 20 64 65 73 74 2c 69 6e 74 20 6a 75 6d 70  nt dest,int jump
257d0 49 66 4e 75 6c 6c 29 7b 0a 20 20 73 71 6c 69 74  IfNull){.  sqlit
257e0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
257f0 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 43 6f  >db;.  Expr *pCo
25800 70 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  py = sqlite3Expr
25810 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30  Dup(db, pExpr, 0
25820 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
25830 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a  locFailed==0 ){.
25840 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
25850 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
25860 43 6f 70 79 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Copy, dest, jump
25870 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73  IfNull);.  }.  s
25880 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
25890 28 64 62 2c 20 70 43 6f 70 79 29 3b 0a 7d 0a 0a  (db, pCopy);.}..
258a0 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70  ./*.** Do a deep
258b0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74   comparison of t
258c0 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  wo expression tr
258d0 65 65 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ees.  Return 0 i
258e0 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70  f the two.** exp
258f0 72 65 73 73 69 6f 6e 73 20 61 72 65 20 63 6f 6d  ressions are com
25900 70 6c 65 74 65 6c 79 20 69 64 65 6e 74 69 63 61  pletely identica
25910 6c 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  l.  Return 1 if 
25920 74 68 65 79 20 64 69 66 66 65 72 20 6f 6e 6c 79  they differ only
25930 0a 2a 2a 20 62 79 20 61 20 43 4f 4c 4c 41 54 45  .** by a COLLATE
25940 20 6f 70 65 72 61 74 6f 72 20 61 74 20 74 68 65   operator at the
25950 20 74 6f 70 20 6c 65 76 65 6c 2e 20 20 52 65 74   top level.  Ret
25960 75 72 6e 20 32 20 69 66 20 74 68 65 72 65 20 61  urn 2 if there a
25970 72 65 20 64 69 66 66 65 72 65 6e 63 65 73 0a 2a  re differences.*
25980 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  * other than the
25990 20 74 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c 41   top-level COLLA
259a0 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a  TE operator..**.
259b0 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c 65  ** If any subele
259c0 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20 45  ment of pB has E
259d0 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29  xpr.iTable==(-1)
259e0 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f   then it is allo
259f0 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72  wed.** to compar
25a00 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65 71  e equal to an eq
25a10 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74  uivalent element
25a20 20 69 6e 20 70 41 20 77 69 74 68 20 45 78 70 72   in pA with Expr
25a30 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a  .iTable==iTab..*
25a40 2a 0a 2a 2a 20 54 68 65 20 70 41 20 73 69 64 65  *.** The pA side
25a50 20 6d 69 67 68 74 20 62 65 20 75 73 69 6e 67 20   might be using 
25a60 54 4b 5f 52 45 47 49 53 54 45 52 2e 20 20 49 66  TK_REGISTER.  If
25a70 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73   that is the cas
25a80 65 20 61 6e 64 20 70 42 20 69 73 0a 2a 2a 20 6e  e and pB is.** n
25a90 6f 74 20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49  ot using TK_REGI
25aa0 53 54 45 52 20 62 75 74 20 69 73 20 6f 74 68 65  STER but is othe
25ab0 72 77 69 73 65 20 65 71 75 69 76 61 6c 65 6e 74  rwise equivalent
25ac0 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74  , then still ret
25ad0 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d  urn 0..**.** Som
25ae0 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75 74  etimes this rout
25af0 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
25b00 32 20 65 76 65 6e 20 69 66 20 74 68 65 20 74 77  2 even if the tw
25b10 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  o expressions.**
25b20 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75 69   really are equi
25b30 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20 63  valent.  If we c
25b40 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61 74  annot prove that
25b50 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
25b60 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61   are.** identica
25b70 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 32 20 6a  l, we return 2 j
25b80 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e 20  ust to be safe. 
25b90 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
25ba0 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 32  ine.** returns 2
25bb0 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f  , then you do no
25bc0 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f  t really know fo
25bd0 72 20 63 65 72 74 61 69 6e 20 69 66 20 74 68 65  r certain if the
25be0 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69   two.** expressi
25bf0 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  ons are the same
25c00 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20 67 65  .  But if you ge
25c10 74 20 61 20 30 20 6f 72 20 31 20 72 65 74 75 72  t a 0 or 1 retur
25c20 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63  n, then you.** c
25c30 61 6e 20 62 65 20 73 75 72 65 20 74 68 65 20 65  an be sure the e
25c40 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74  xpressions are t
25c50 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68 65  he same.  In the
25c60 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a 2a   places where.**
25c70 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
25c80 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20 6e   used, it does n
25c90 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74 20 61  ot hurt to get a
25ca0 6e 20 65 78 74 72 61 20 32 20 2d 20 74 68 61 74  n extra 2 - that
25cb0 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20 72  .** just might r
25cc0 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c  esult in some sl
25cd0 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f  ightly slower co
25ce0 64 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e 69  de.  But returni
25cf0 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65  ng.** an incorre
25d00 63 74 20 30 20 6f 72 20 31 20 63 6f 75 6c 64 20  ct 0 or 1 could 
25d10 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e  lead to a malfun
25d20 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
25d30 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
25d40 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20  (Expr *pA, Expr 
25d50 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a  *pB, int iTab){.
25d60 20 20 75 33 32 20 63 6f 6d 62 69 6e 65 64 46 6c    u32 combinedFl
25d70 61 67 73 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30  ags;.  if( pA==0
25d80 20 7c 7c 20 70 42 3d 3d 30 20 29 7b 0a 20 20 20   || pB==0 ){.   
25d90 20 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 20 3f   return pB==pA ?
25da0 20 30 20 3a 20 32 3b 0a 20 20 7d 0a 20 20 63 6f   0 : 2;.  }.  co
25db0 6d 62 69 6e 65 64 46 6c 61 67 73 20 3d 20 70 41  mbinedFlags = pA
25dc0 2d 3e 66 6c 61 67 73 20 7c 20 70 42 2d 3e 66 6c  ->flags | pB->fl
25dd0 61 67 73 3b 0a 20 20 69 66 28 20 63 6f 6d 62 69  ags;.  if( combi
25de0 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 49 6e  nedFlags & EP_In
25df0 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 66  tValue ){.    if
25e00 28 20 28 70 41 2d 3e 66 6c 61 67 73 26 70 42 2d  ( (pA->flags&pB-
25e10 3e 66 6c 61 67 73 26 45 50 5f 49 6e 74 56 61 6c  >flags&EP_IntVal
25e20 75 65 29 21 3d 30 20 26 26 20 70 41 2d 3e 75 2e  ue)!=0 && pA->u.
25e30 69 56 61 6c 75 65 3d 3d 70 42 2d 3e 75 2e 69 56  iValue==pB->u.iV
25e40 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 72 65  alue ){.      re
25e50 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
25e60 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a    return 2;.  }.
25e70 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42    if( pA->op!=pB
25e80 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 69 66 28 20  ->op ){.    if( 
25e90 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41  pA->op==TK_COLLA
25ea0 54 45 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  TE && sqlite3Exp
25eb0 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65  rCompare(pA->pLe
25ec0 66 74 2c 20 70 42 2c 20 69 54 61 62 29 3c 32 20  ft, pB, iTab)<2 
25ed0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
25ee0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
25ef0 20 70 42 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c   pB->op==TK_COLL
25f00 41 54 45 20 26 26 20 73 71 6c 69 74 65 33 45 78  ATE && sqlite3Ex
25f10 70 72 43 6f 6d 70 61 72 65 28 70 41 2c 20 70 42  prCompare(pA, pB
25f20 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3c 32  ->pLeft, iTab)<2
25f30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
25f40 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65   1;.    }.    re
25f50 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66  turn 2;.  }.  if
25f60 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  ( pA->op!=TK_COL
25f70 55 4d 4e 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54  UMN && pA->op!=T
25f80 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 26 26 20  K_AGG_COLUMN && 
25f90 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a  pA->u.zToken ){.
25fa0 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d      if( pA->op==
25fb0 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20  TK_FUNCTION ){. 
25fc0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
25fd0 53 74 72 49 43 6d 70 28 70 41 2d 3e 75 2e 7a 54  StrICmp(pA->u.zT
25fe0 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65  oken,pB->u.zToke
25ff0 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 32  n)!=0 ) return 2
26000 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
26010 73 74 72 63 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f  strcmp(pA->u.zTo
26020 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e  ken,pB->u.zToken
26030 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )!=0 ){.      re
26040 74 75 72 6e 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f  turn pA->op==TK_
26050 43 4f 4c 4c 41 54 45 20 3f 20 31 20 3a 20 32 3b  COLLATE ? 1 : 2;
26060 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
26070 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50   (pA->flags & EP
26080 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42 2d  _Distinct)!=(pB-
26090 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74  >flags & EP_Dist
260a0 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20 32  inct) ) return 2
260b0 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 28  ;.  if( ALWAYS((
260c0 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20  combinedFlags & 
260d0 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3d 3d 30  EP_TokenOnly)==0
260e0 29 20 29 7b 0a 20 20 20 20 69 66 28 20 63 6f 6d  ) ){.    if( com
260f0 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f  binedFlags & EP_
26100 78 49 73 53 65 6c 65 63 74 20 29 20 72 65 74 75  xIsSelect ) retu
26110 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71  rn 2;.    if( sq
26120 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
26130 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e  (pA->pLeft, pB->
26140 70 4c 65 66 74 2c 20 69 54 61 62 29 20 29 20 72  pLeft, iTab) ) r
26150 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28  eturn 2;.    if(
26160 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
26170 61 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c 20  are(pA->pRight, 
26180 70 42 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62  pB->pRight, iTab
26190 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
261a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
261b0 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 41 2d  rListCompare(pA-
261c0 3e 78 2e 70 4c 69 73 74 2c 20 70 42 2d 3e 78 2e  >x.pList, pB->x.
261d0 70 4c 69 73 74 2c 20 69 54 61 62 29 20 29 20 72  pList, iTab) ) r
261e0 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28  eturn 2;.    if(
261f0 20 41 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e 65   ALWAYS((combine
26200 64 46 6c 61 67 73 20 26 20 45 50 5f 52 65 64 75  dFlags & EP_Redu
26210 63 65 64 29 3d 3d 30 29 20 26 26 20 70 41 2d 3e  ced)==0) && pA->
26220 6f 70 21 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b  op!=TK_STRING ){
26230 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e 69  .      if( pA->i
26240 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c  Column!=pB->iCol
26250 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  umn ) return 2;.
26260 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e 69 54        if( pA->iT
26270 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65  able!=pB->iTable
26280 20 0a 20 20 20 20 20 20 20 26 26 20 28 70 41 2d   .       && (pA-
26290 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20 7c 7c  >iTable!=iTab ||
262a0 20 4e 45 56 45 52 28 70 42 2d 3e 69 54 61 62 6c   NEVER(pB->iTabl
262b0 65 3e 3d 30 29 29 20 29 20 72 65 74 75 72 6e 20  e>=0)) ) return 
262c0 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  2;.    }.  }.  r
262d0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
262e0 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 45 78  * Compare two Ex
262f0 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 2e 20  prList objects. 
26300 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   Return 0 if the
26310 79 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 20  y are identical 
26320 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  and .** non-zero
26330 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72 20   if they differ 
26340 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a  in any way..**.*
26350 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c 65 6d  * If any subelem
26360 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20 45 78  ent of pB has Ex
26370 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20  pr.iTable==(-1) 
26380 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77  then it is allow
26390 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65  ed.** to compare
263a0 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65 71 75   equal to an equ
263b0 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20  ivalent element 
263c0 69 6e 20 70 41 20 77 69 74 68 20 45 78 70 72 2e  in pA with Expr.
263d0 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a  iTable==iTab..**
263e0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
263f0 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 6e 6f   might return no
26400 6e 2d 7a 65 72 6f 20 66 6f 72 20 65 71 75 69 76  n-zero for equiv
26410 61 6c 65 6e 74 20 45 78 70 72 4c 69 73 74 73 2e  alent ExprLists.
26420 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79 20 63 6f    The.** only co
26430 6e 73 65 71 75 65 6e 63 65 20 77 69 6c 6c 20 62  nsequence will b
26440 65 20 64 69 73 61 62 6c 65 64 20 6f 70 74 69 6d  e disabled optim
26450 69 7a 61 74 69 6f 6e 73 2e 20 20 42 75 74 20 74  izations.  But t
26460 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d  his routine.** m
26470 75 73 74 20 6e 65 76 65 72 20 72 65 74 75 72 6e  ust never return
26480 20 30 20 69 66 20 74 68 65 20 74 77 6f 20 45 78   0 if the two Ex
26490 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 20 61  prList objects a
264a0 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20 6f 72  re different, or
264b0 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f  .** a malfunctio
264c0 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 2e 0a 2a  n will result..*
264d0 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 70 6f  *.** Two NULL po
264e0 69 6e 74 65 72 73 20 61 72 65 20 63 6f 6e 73 69  inters are consi
264f0 64 65 72 65 64 20 74 6f 20 62 65 20 74 68 65 20  dered to be the 
26500 73 61 6d 65 2e 20 20 42 75 74 20 61 20 4e 55 4c  same.  But a NUL
26510 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 61 6c 77  L pointer.** alw
26520 61 79 73 20 64 69 66 66 65 72 73 20 66 72 6f 6d  ays differs from
26530 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e   a non-NULL poin
26540 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ter..*/.int sqli
26550 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
26560 72 65 28 45 78 70 72 4c 69 73 74 20 2a 70 41 2c  re(ExprList *pA,
26570 20 45 78 70 72 4c 69 73 74 20 2a 70 42 2c 20 69   ExprList *pB, i
26580 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 6e 74 20  nt iTab){.  int 
26590 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 26  i;.  if( pA==0 &
265a0 26 20 70 42 3d 3d 30 20 29 20 72 65 74 75 72 6e  & pB==0 ) return
265b0 20 30 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20   0;.  if( pA==0 
265c0 7c 7c 20 70 42 3d 3d 30 20 29 20 72 65 74 75 72  || pB==0 ) retur
265d0 6e 20 31 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6e  n 1;.  if( pA->n
265e0 45 78 70 72 21 3d 70 42 2d 3e 6e 45 78 70 72 20  Expr!=pB->nExpr 
265f0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f  ) return 1;.  fo
26600 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 6e 45 78  r(i=0; i<pA->nEx
26610 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
26620 70 72 20 2a 70 45 78 70 72 41 20 3d 20 70 41 2d  pr *pExprA = pA-
26630 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
26640 20 45 78 70 72 20 2a 70 45 78 70 72 42 20 3d 20   Expr *pExprB = 
26650 70 42 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  pB->a[i].pExpr;.
26660 20 20 20 20 69 66 28 20 70 41 2d 3e 61 5b 69 5d      if( pA->a[i]
26670 2e 73 6f 72 74 4f 72 64 65 72 21 3d 70 42 2d 3e  .sortOrder!=pB->
26680 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29  a[i].sortOrder )
26690 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69   return 1;.    i
266a0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
266b0 6d 70 61 72 65 28 70 45 78 70 72 41 2c 20 70 45  mpare(pExprA, pE
266c0 78 70 72 42 2c 20 69 54 61 62 29 20 29 20 72 65  xprB, iTab) ) re
266d0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
266e0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
266f0 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
26700 77 65 20 63 61 6e 20 70 72 6f 76 65 20 74 68 65  we can prove the
26710 20 70 45 32 20 77 69 6c 6c 20 61 6c 77 61 79 73   pE2 will always
26720 20 62 65 20 74 72 75 65 20 69 66 20 70 45 31 20   be true if pE1 
26730 69 73 0a 2a 2a 20 74 72 75 65 2e 20 20 52 65 74  is.** true.  Ret
26740 75 72 6e 20 66 61 6c 73 65 20 69 66 20 77 65 20  urn false if we 
26750 63 61 6e 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20  cannot complete 
26760 74 68 65 20 70 72 6f 6f 66 20 6f 72 20 69 66 20  the proof or if 
26770 70 45 32 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  pE2 might.** be 
26780 66 61 6c 73 65 2e 20 20 45 78 61 6d 70 6c 65 73  false.  Examples
26790 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 45 31 3a  :.**.**     pE1:
267a0 20 78 3d 3d 35 20 20 20 20 20 20 20 70 45 32 3a   x==5       pE2:
267b0 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20   x==5           
267c0 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a    Result: true.*
267d0 2a 20 20 20 20 20 70 45 31 3a 20 78 3e 30 20 20  *     pE1: x>0  
267e0 20 20 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20        pE2: x==5 
267f0 20 20 20 20 20 20 20 20 20 20 20 20 52 65 73 75              Resu
26800 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20  lt: false.**    
26810 20 70 45 31 3a 20 78 3d 32 31 20 20 20 20 20 20   pE1: x=21      
26820 20 70 45 32 3a 20 78 3d 32 31 20 4f 52 20 79 3d   pE2: x=21 OR y=
26830 34 33 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74  43     Result: t
26840 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  rue.**     pE1: 
26850 78 21 3d 31 32 33 20 20 20 20 20 70 45 32 3a 20  x!=123     pE2: 
26860 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20  x IS NOT NULL   
26870 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a   Result: true.**
26880 20 20 20 20 20 70 45 31 3a 20 78 21 3d 3f 31 20       pE1: x!=?1 
26890 20 20 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e       pE2: x IS N
268a0 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c  OT NULL    Resul
268b0 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70  t: true.**     p
268c0 45 31 3a 20 78 20 49 53 20 4e 55 4c 4c 20 20 70  E1: x IS NULL  p
268d0 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c  E2: x IS NOT NUL
268e0 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c  L    Result: fal
268f0 73 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  se.**     pE1: x
26900 20 49 53 20 3f 32 20 20 20 20 70 45 32 3a 20 78   IS ?2    pE2: x
26910 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20   IS NOT NULL    
26920 52 65 75 73 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a  Reuslt: false.**
26930 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70 61 72 69  .** When compari
26940 6e 67 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64  ng TK_COLUMN nod
26950 65 73 20 62 65 74 77 65 65 6e 20 70 45 31 20 61  es between pE1 a
26960 6e 64 20 70 45 32 2c 20 69 66 20 70 45 32 20 68  nd pE2, if pE2 h
26970 61 73 0a 2a 2a 20 45 78 70 72 2e 69 54 61 62 6c  as.** Expr.iTabl
26980 65 3c 30 20 74 68 65 6e 20 61 73 73 75 6d 65 20  e<0 then assume 
26990 61 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 67  a table number g
269a0 69 76 65 6e 20 62 79 20 69 54 61 62 2e 0a 2a 2a  iven by iTab..**
269b0 0a 2a 2a 20 57 68 65 6e 20 69 6e 20 64 6f 75 62  .** When in doub
269c0 74 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e  t, return false.
269d0 20 20 52 65 74 75 72 6e 69 6e 67 20 74 72 75 65    Returning true
269e0 20 6d 69 67 68 74 20 67 69 76 65 20 61 20 70 65   might give a pe
269f0 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6d 70  rformance.** imp
26a00 72 6f 76 65 6d 65 6e 74 2e 20 20 52 65 74 75 72  rovement.  Retur
26a10 6e 69 6e 67 20 66 61 6c 73 65 20 6d 69 67 68 74  ning false might
26a20 20 63 61 75 73 65 20 61 20 70 65 72 66 6f 72 6d   cause a perform
26a30 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2c 20  ance reduction, 
26a40 62 75 74 0a 2a 2a 20 69 74 20 77 69 6c 6c 20 61  but.** it will a
26a50 6c 77 61 79 73 20 67 69 76 65 20 74 68 65 20 63  lways give the c
26a60 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 61 6e  orrect answer an
26a70 64 20 69 73 20 68 65 6e 63 65 20 61 6c 77 61 79  d is hence alway
26a80 73 20 73 61 66 65 2e 0a 2a 2f 0a 69 6e 74 20 73  s safe..*/.int s
26a90 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65  qlite3ExprImplie
26aa0 73 45 78 70 72 28 45 78 70 72 20 2a 70 45 31 2c  sExpr(Expr *pE1,
26ab0 20 45 78 70 72 20 2a 70 45 32 2c 20 69 6e 74 20   Expr *pE2, int 
26ac0 69 54 61 62 29 7b 0a 20 20 69 66 28 20 73 71 6c  iTab){.  if( sql
26ad0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
26ae0 70 45 31 2c 20 70 45 32 2c 20 69 54 61 62 29 3d  pE1, pE2, iTab)=
26af0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
26b00 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45   1;.  }.  if( pE
26b10 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a 20 20 20  2->op==TK_OR.   
26b20 26 26 20 28 73 71 6c 69 74 65 33 45 78 70 72 49  && (sqlite3ExprI
26b30 6d 70 6c 69 65 73 45 78 70 72 28 70 45 31 2c 20  mpliesExpr(pE1, 
26b40 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  pE2->pLeft, iTab
26b50 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  ).             |
26b60 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70  | sqlite3ExprImp
26b70 6c 69 65 73 45 78 70 72 28 70 45 31 2c 20 70 45  liesExpr(pE1, pE
26b80 32 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29  2->pRight, iTab)
26b90 20 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75   ).  ){.    retu
26ba0 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
26bb0 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  pE2->op==TK_NOTN
26bc0 55 4c 4c 0a 20 20 20 26 26 20 73 71 6c 69 74 65  ULL.   && sqlite
26bd0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 31  3ExprCompare(pE1
26be0 2d 3e 70 4c 65 66 74 2c 20 70 45 32 2d 3e 70 4c  ->pLeft, pE2->pL
26bf0 65 66 74 2c 20 69 54 61 62 29 3d 3d 30 0a 20 20  eft, iTab)==0.  
26c00 20 26 26 20 28 70 45 31 2d 3e 6f 70 21 3d 54 4b   && (pE1->op!=TK
26c10 5f 49 53 4e 55 4c 4c 20 26 26 20 70 45 31 2d 3e  _ISNULL && pE1->
26c20 6f 70 21 3d 54 4b 5f 49 53 29 0a 20 20 29 7b 0a  op!=TK_IS).  ){.
26c30 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
26c40 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
26c50 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
26c60 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
26c70 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73  ing structure is
26c80 20 75 73 65 64 20 62 79 20 74 68 65 20 74 72 65   used by the tre
26c90 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 64  e walker.** to d
26ca0 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 20 65  etermine if an e
26cb0 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65  xpression can be
26cc0 20 65 76 61 6c 75 61 74 65 64 20 62 79 20 72 65   evaluated by re
26cd0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a 2a  ference to the.*
26ce0 2a 20 69 6e 64 65 78 20 6f 6e 6c 79 2c 20 77 69  * index only, wi
26cf0 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
26d00 64 6f 20 61 20 73 65 61 72 63 68 20 66 6f 72 20  do a search for 
26d10 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
26d20 67 0a 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72 79  g.** table entry
26d30 2e 20 20 54 68 65 20 49 64 78 43 6f 76 65 72 2e  .  The IdxCover.
26d40 70 49 64 78 20 66 69 65 6c 64 20 69 73 20 74 68  pIdx field is th
26d50 65 20 69 6e 64 65 78 2e 20 20 49 64 78 43 6f 76  e index.  IdxCov
26d60 65 72 2e 69 43 75 72 0a 2a 2a 20 69 73 20 74 68  er.iCur.** is th
26d70 65 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  e cursor for the
26d80 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63   table..*/.struc
26d90 74 20 49 64 78 43 6f 76 65 72 20 7b 0a 20 20 49  t IdxCover {.  I
26da0 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
26db0 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20  /* The index to 
26dc0 62 65 20 74 65 73 74 65 64 20 66 6f 72 20 63 6f  be tested for co
26dd0 76 65 72 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  verage */.  int 
26de0 69 43 75 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  iCur;        /* 
26df0 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  Cursor number fo
26e00 72 20 74 68 65 20 74 61 62 6c 65 20 63 6f 72 72  r the table corr
26e10 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
26e20 20 69 6e 64 65 78 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   index */.};../*
26e30 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
26e40 20 69 66 20 74 68 65 72 65 20 61 72 65 20 72 65   if there are re
26e50 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75  ferences to colu
26e60 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 0a 2a 2a  mns in table .**
26e70 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78   pWalker->u.pIdx
26e80 43 6f 76 65 72 2d 3e 69 43 75 72 20 63 61 6e 20  Cover->iCur can 
26e90 62 65 20 73 61 74 69 73 66 69 65 64 20 75 73 69  be satisfied usi
26ea0 6e 67 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20  ng the index.** 
26eb0 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43  pWalker->u.pIdxC
26ec0 6f 76 65 72 2d 3e 70 49 64 78 2e 0a 2a 2f 0a 73  over->pIdx..*/.s
26ed0 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 49 64  tatic int exprId
26ee0 78 43 6f 76 65 72 28 57 61 6c 6b 65 72 20 2a 70  xCover(Walker *p
26ef0 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
26f00 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70  xpr){.  if( pExp
26f10 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
26f20 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69 54  .   && pExpr->iT
26f30 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75  able==pWalker->u
26f40 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69 43 75 72  .pIdxCover->iCur
26f50 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 43 6f  .   && sqlite3Co
26f60 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 57 61 6c  lumnOfIndex(pWal
26f70 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72  ker->u.pIdxCover
26f80 2d 3e 70 49 64 78 2c 20 70 45 78 70 72 2d 3e 69  ->pIdx, pExpr->i
26f90 43 6f 6c 75 6d 6e 29 3c 30 0a 20 20 29 7b 0a 20  Column)<0.  ){. 
26fa0 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
26fb0 65 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  e = 1;.    retur
26fc0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
26fd0 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
26fe0 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
26ff0 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e   Determine if an
27000 20 69 6e 64 65 78 20 70 49 64 78 20 6f 6e 20 74   index pIdx on t
27010 61 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72  able with cursor
27020 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 77   iCur contains w
27030 69 6c 6c 0a 2a 2a 20 74 68 65 20 65 78 70 72 65  ill.** the expre
27040 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65  ssion pExpr.  Re
27050 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
27060 20 69 6e 64 65 78 20 64 6f 65 73 20 63 6f 76 65   index does cove
27070 72 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  r the.** express
27080 69 6f 6e 20 61 6e 64 20 66 61 6c 73 65 20 69 66  ion and false if
27090 20 74 68 65 20 70 45 78 70 72 20 65 78 70 72 65   the pExpr expre
270a0 73 73 69 6f 6e 20 72 65 66 65 72 65 6e 63 65 73  ssion references
270b0 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 0a 2a   table columns.*
270c0 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 66  * that are not f
270d0 6f 75 6e 64 20 69 6e 20 74 68 65 20 69 6e 64 65  ound in the inde
270e0 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 41 6e  x pIdx..**.** An
270f0 20 69 6e 64 65 78 20 63 6f 76 65 72 69 6e 67 20   index covering 
27100 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 65  an expression me
27110 61 6e 73 20 74 68 61 74 20 74 68 65 20 65 78 70  ans that the exp
27120 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 0a 2a  ression can be.*
27130 2a 20 65 76 61 6c 75 61 74 65 64 20 75 73 69 6e  * evaluated usin
27140 67 20 6f 6e 6c 79 20 74 68 65 20 69 6e 64 65 78  g only the index
27150 20 61 6e 64 20 77 69 74 68 6f 75 74 20 68 61 76   and without hav
27160 69 6e 67 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68  ing to lookup th
27170 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  e.** correspondi
27180 6e 67 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 0a  ng table entry..
27190 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
271a0 70 72 43 6f 76 65 72 65 64 42 79 49 6e 64 65 78  prCoveredByIndex
271b0 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  (.  Expr *pExpr,
271c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
271d0 6e 64 65 78 20 74 6f 20 62 65 20 74 65 73 74 65  ndex to be teste
271e0 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c  d */.  int iCur,
271f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
27200 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
27210 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f  for the correspo
27220 6e 64 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20  nding table */. 
27230 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20   Index *pIdx    
27240 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
27250 78 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  x that might be 
27260 75 73 65 64 20 66 6f 72 20 63 6f 76 65 72 61 67  used for coverag
27270 65 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65 72  e */.){.  Walker
27280 20 77 3b 0a 20 20 73 74 72 75 63 74 20 49 64 78   w;.  struct Idx
27290 43 6f 76 65 72 20 78 63 6f 76 3b 0a 20 20 6d 65  Cover xcov;.  me
272a0 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
272b0 6f 66 28 77 29 29 3b 0a 20 20 78 63 6f 76 2e 69  of(w));.  xcov.i
272c0 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 78 63  Cur = iCur;.  xc
272d0 6f 76 2e 70 49 64 78 20 3d 20 70 49 64 78 3b 0a  ov.pIdx = pIdx;.
272e0 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
272f0 6b 20 3d 20 65 78 70 72 49 64 78 43 6f 76 65 72  k = exprIdxCover
27300 3b 0a 20 20 77 2e 75 2e 70 49 64 78 43 6f 76 65  ;.  w.u.pIdxCove
27310 72 20 3d 20 26 78 63 6f 76 3b 0a 20 20 73 71 6c  r = &xcov;.  sql
27320 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
27330 20 70 45 78 70 72 29 3b 0a 20 20 72 65 74 75 72   pExpr);.  retur
27340 6e 20 21 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 0a  n !w.eCode;.}...
27350 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
27360 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
27370 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ng structure is 
27380 75 73 65 64 20 62 79 20 74 68 65 20 74 72 65 65  used by the tree
27390 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63 6f   walker.** to co
273a0 75 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 74  unt references t
273b0 6f 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20  o table columns 
273c0 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  in the arguments
273d0 20 6f 66 20 61 6e 20 0a 2a 2a 20 61 67 67 72 65   of an .** aggre
273e0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 69  gate function, i
273f0 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c 65  n order to imple
27400 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 73 71 6c 69  ment the.** sqli
27410 74 65 33 46 75 6e 63 74 69 6f 6e 54 68 69 73 53  te3FunctionThisS
27420 72 63 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  rc() routine..*/
27430 0a 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74  .struct SrcCount
27440 20 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53   {.  SrcList *pS
27450 72 63 3b 20 20 20 2f 2a 20 4f 6e 65 20 70 61 72  rc;   /* One par
27460 74 69 63 75 6c 61 72 20 46 52 4f 4d 20 63 6c 61  ticular FROM cla
27470 75 73 65 20 69 6e 20 61 20 6e 65 73 74 65 64 20  use in a nested 
27480 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  query */.  int n
27490 54 68 69 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e  This;       /* N
274a0 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
274b0 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69  ces to columns i
274c0 6e 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20  n pSrcList */.  
274d0 69 6e 74 20 6e 4f 74 68 65 72 3b 20 20 20 20 20  int nOther;     
274e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
274f0 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75  ferences to colu
27500 6d 6e 73 20 69 6e 20 6f 74 68 65 72 20 46 52 4f  mns in other FRO
27510 4d 20 63 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b 0a  M clauses */.};.
27520 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65  ./*.** Count the
27530 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
27540 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73  ences to columns
27550 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27560 65 78 70 72 53 72 63 43 6f 75 6e 74 28 57 61 6c  exprSrcCount(Wal
27570 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78  ker *pWalker, Ex
27580 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 2f 2a  pr *pExpr){.  /*
27590 20 54 68 65 20 4e 45 56 45 52 28 29 20 6f 6e 20   The NEVER() on 
275a0 74 68 65 20 73 65 63 6f 6e 64 20 74 65 72 6d 20  the second term 
275b0 69 73 20 62 65 63 61 75 73 65 20 73 71 6c 69 74  is because sqlit
275c0 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68  e3FunctionUsesTh
275d0 69 73 53 72 63 28 29 0a 20 20 2a 2a 20 69 73 20  isSrc().  ** is 
275e0 61 6c 77 61 79 73 20 63 61 6c 6c 65 64 20 62 65  always called be
275f0 66 6f 72 65 20 73 71 6c 69 74 65 33 45 78 70 72  fore sqlite3Expr
27600 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
27610 73 28 29 20 61 6e 64 20 73 6f 20 74 68 65 0a 20  s() and so the. 
27620 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20 68   ** TK_COLUMNs h
27630 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  ave not yet been
27640 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
27650 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20  TK_AGG_COLUMN.  
27660 49 66 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 46  If.  ** sqlite3F
27670 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53  unctionUsesThisS
27680 72 63 28 29 20 69 73 20 75 73 65 64 20 64 69 66  rc() is used dif
27690 66 65 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  ferently in the 
276a0 66 75 74 75 72 65 2c 20 74 68 65 0a 20 20 2a 2a  future, the.  **
276b0 20 4e 45 56 45 52 28 29 20 77 69 6c 6c 20 6e 65   NEVER() will ne
276c0 65 64 20 74 6f 20 62 65 20 72 65 6d 6f 76 65 64  ed to be removed
276d0 2e 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72  . */.  if( pExpr
276e0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
276f0 7c 7c 20 4e 45 56 45 52 28 70 45 78 70 72 2d 3e  || NEVER(pExpr->
27700 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
27710 4e 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  N) ){.    int i;
27720 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 43  .    struct SrcC
27730 6f 75 6e 74 20 2a 70 20 3d 20 70 57 61 6c 6b 65  ount *p = pWalke
27740 72 2d 3e 75 2e 70 53 72 63 43 6f 75 6e 74 3b 0a  r->u.pSrcCount;.
27750 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
27760 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  c = p->pSrc;.   
27770 20 69 6e 74 20 6e 53 72 63 20 3d 20 70 53 72 63   int nSrc = pSrc
27780 20 3f 20 70 53 72 63 2d 3e 6e 53 72 63 20 3a 20   ? pSrc->nSrc : 
27790 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
277a0 69 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<nSrc; i++){.  
277b0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
277c0 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 69  Table==pSrc->a[i
277d0 5d 2e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61  ].iCursor ) brea
277e0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
277f0 20 69 3c 6e 53 72 63 20 29 7b 0a 20 20 20 20 20   i<nSrc ){.     
27800 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20 20   p->nThis++;.   
27810 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
27820 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20 20 20 7d  >nOther++;.    }
27830 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
27840 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
27850 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69  *.** Determine i
27860 66 20 61 6e 79 20 6f 66 20 74 68 65 20 61 72 67  f any of the arg
27870 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 70 45  uments to the pE
27880 78 70 72 20 46 75 6e 63 74 69 6f 6e 20 72 65 66  xpr Function ref
27890 65 72 65 6e 63 65 0a 2a 2a 20 70 53 72 63 4c 69  erence.** pSrcLi
278a0 73 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  st.  Return true
278b0 20 69 66 20 74 68 65 79 20 64 6f 2e 20 20 41 6c   if they do.  Al
278c0 73 6f 20 72 65 74 75 72 6e 20 74 72 75 65 20 69  so return true i
278d0 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  f the function.*
278e0 2a 20 68 61 73 20 6e 6f 20 61 72 67 75 6d 65 6e  * has no argumen
278f0 74 73 20 6f 72 20 68 61 73 20 6f 6e 6c 79 20 63  ts or has only c
27900 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74  onstant argument
27910 73 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65  s.  Return false
27920 20 69 66 20 70 45 78 70 72 0a 2a 2a 20 72 65 66   if pExpr.** ref
27930 65 72 65 6e 63 65 73 20 63 6f 6c 75 6d 6e 73 20  erences columns 
27940 62 75 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73 20  but not columns 
27950 6f 66 20 74 61 62 6c 65 73 20 66 6f 75 6e 64 20  of tables found 
27960 69 6e 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a  in pSrcList..*/.
27970 69 6e 74 20 73 71 6c 69 74 65 33 46 75 6e 63 74  int sqlite3Funct
27980 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 45  ionUsesThisSrc(E
27990 78 70 72 20 2a 70 45 78 70 72 2c 20 53 72 63 4c  xpr *pExpr, SrcL
279a0 69 73 74 20 2a 70 53 72 63 4c 69 73 74 29 7b 0a  ist *pSrcList){.
279b0 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74    Walker w;.  st
279c0 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 63 6e  ruct SrcCount cn
279d0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  t;.  assert( pEx
279e0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
279f0 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 6d 65 6d  UNCTION );.  mem
27a00 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
27a10 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72  f(w));.  w.xExpr
27a20 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 53  Callback = exprS
27a30 72 63 43 6f 75 6e 74 3b 0a 20 20 77 2e 75 2e 70  rcCount;.  w.u.p
27a40 53 72 63 43 6f 75 6e 74 20 3d 20 26 63 6e 74 3b  SrcCount = &cnt;
27a50 0a 20 20 63 6e 74 2e 70 53 72 63 20 3d 20 70 53  .  cnt.pSrc = pS
27a60 72 63 4c 69 73 74 3b 0a 20 20 63 6e 74 2e 6e 54  rcList;.  cnt.nT
27a70 68 69 73 20 3d 20 30 3b 0a 20 20 63 6e 74 2e 6e  his = 0;.  cnt.n
27a80 4f 74 68 65 72 20 3d 20 30 3b 0a 20 20 73 71 6c  Other = 0;.  sql
27a90 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74  ite3WalkExprList
27aa0 28 26 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c  (&w, pExpr->x.pL
27ab0 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 63  ist);.  return c
27ac0 6e 74 2e 6e 54 68 69 73 3e 30 20 7c 7c 20 63 6e  nt.nThis>0 || cn
27ad0 74 2e 6e 4f 74 68 65 72 3d 3d 30 3b 0a 7d 0a 0a  t.nOther==0;.}..
27ae0 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
27af0 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70  element to the p
27b00 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
27b10 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74  array.  Return t
27b20 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74  he index of.** t
27b30 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20  he new element. 
27b40 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69   Return a negati
27b50 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c  ve number if mal
27b60 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  loc fails..*/.st
27b70 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49  atic int addAggI
27b80 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65  nfoColumn(sqlite
27b90 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a  3 *db, AggInfo *
27ba0 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b  pInfo){.  int i;
27bb0 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d  .  pInfo->aCol =
27bc0 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c   sqlite3ArrayAll
27bd0 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64 62  ocate(.       db
27be0 2c 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  ,.       pInfo->
27bf0 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a  aCol,.       siz
27c00 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  eof(pInfo->aCol[
27c10 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e  0]),.       &pIn
27c20 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20  fo->nColumn,.   
27c30 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65      &i.  );.  re
27c40 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f  turn i;.}    ../
27c50 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
27c60 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41  lement to the pA
27c70 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20  ggInfo->aFunc[] 
27c80 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74  array.  Return t
27c90 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74  he index of.** t
27ca0 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20  he new element. 
27cb0 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69   Return a negati
27cc0 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c  ve number if mal
27cd0 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  loc fails..*/.st
27ce0 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49  atic int addAggI
27cf0 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74 65 33 20  nfoFunc(sqlite3 
27d00 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49  *db, AggInfo *pI
27d10 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  nfo){.  int i;. 
27d20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20   pInfo->aFunc = 
27d30 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
27d40 63 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c  cate(.       db,
27d50 20 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e   .       pInfo->
27d60 61 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 73 69  aFunc,.       si
27d70 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e  zeof(pInfo->aFun
27d80 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70  c[0]),.       &p
27d90 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20  Info->nFunc,.   
27da0 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65      &i.  );.  re
27db0 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f  turn i;.}    ../
27dc0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
27dd0 20 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 66   xExprCallback f
27de0 6f 72 20 61 20 74 72 65 65 20 77 61 6c 6b 65 72  or a tree walker
27df0 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 74 6f  .  It is used to
27e00 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71  .** implement sq
27e10 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
27e20 41 67 67 72 65 67 61 74 65 73 28 29 2e 20 20 53  Aggregates().  S
27e30 65 65 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  ee sqlite3ExprAn
27e40 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 0a  alyzeAggregates.
27e50 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ** for additiona
27e60 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
27e70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61  /.static int ana
27e80 6c 79 7a 65 41 67 67 72 65 67 61 74 65 28 57 61  lyzeAggregate(Wa
27e90 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
27ea0 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
27eb0 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74  nt i;.  NameCont
27ec0 65 78 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b  ext *pNC = pWalk
27ed0 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50 61 72  er->u.pNC;.  Par
27ee0 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43  se *pParse = pNC
27ef0 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53 72 63 4c  ->pParse;.  SrcL
27f00 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20  ist *pSrcList = 
27f10 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20  pNC->pSrcList;. 
27f20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
27f30 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67 67 49 6e  fo = pNC->pAggIn
27f40 66 6f 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70  fo;..  switch( p
27f50 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
27f60 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
27f70 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  MN:.    case TK_
27f80 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
27f90 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
27fa0 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
27fb0 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MN );.      test
27fc0 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
27fd0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
27fe0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
27ff0 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c 75 6d  see if the colum
28000 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74  n is in one of t
28010 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  he tables in the
28020 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63   FROM.      ** c
28030 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67  lause of the agg
28040 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a  regate query */.
28050 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
28060 28 70 53 72 63 4c 69 73 74 21 3d 30 29 20 29 7b  (pSrcList!=0) ){
28070 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
28080 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
28090 74 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e  tem = pSrcList->
280a0 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  a;.        for(i
280b0 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e  =0; i<pSrcList->
280c0 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  nSrc; i++, pItem
280d0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
280e0 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
280f0 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20  l *pCol;.       
28100 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
28110 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
28120 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  r, EP_TokenOnly|
28130 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
28140 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
28150 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65  pr->iTable==pIte
28160 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  m->iCursor ){.  
28170 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
28180 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
28190 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  int, it means th
281a0 61 74 20 70 45 78 70 72 20 72 65 66 65 72 73 20  at pExpr refers 
281b0 74 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20  to a table.     
281c0 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69         ** that i
281d0 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
281e0 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72  ause of the aggr
281f0 65 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a 20  egate query.  . 
28200 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20             **.  
28210 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b            ** Mak
28220 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74  e an entry for t
28230 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67  he column in pAg
28240 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66  gInfo->aCol[] if
28250 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20 20   there.         
28260 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20     ** is not an 
28270 65 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72 65  entry there alre
28280 61 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ady..           
28290 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
282a0 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20  int k;.         
282b0 20 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e     pCol = pAggIn
282c0 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20  fo->aCol;.      
282d0 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
282e0 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  <pAggInfo->nColu
282f0 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  mn; k++, pCol++)
28300 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
28310 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65  if( pCol->iTable
28320 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
28330 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
28340 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75       pCol->iColu
28350 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75  mn==pExpr->iColu
28360 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
28370 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
28380 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
28390 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
283a0 20 20 20 20 20 20 20 69 66 28 20 28 6b 3e 3d 70         if( (k>=p
283b0 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
283c0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  ).             &
283d0 26 20 28 6b 20 3d 20 61 64 64 41 67 67 49 6e 66  & (k = addAggInf
283e0 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e  oColumn(pParse->
283f0 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d  db, pAggInfo))>=
28400 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  0 .            )
28410 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
28420 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f  pCol = &pAggInfo
28430 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20  ->aCol[k];.     
28440 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70           pCol->p
28450 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61  Tab = pExpr->pTa
28460 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b;.             
28470 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20   pCol->iTable = 
28480 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20  pExpr->iTable;. 
28490 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
284a0 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78  l->iColumn = pEx
284b0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
284c0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
284d0 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65  >iMem = ++pParse
284e0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
284f0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
28500 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a  terColumn = -1;.
28510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
28520 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  ol->pExpr = pExp
28530 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
28540 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70   if( pAggInfo->p
28550 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
28560 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a             int j
28570 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  , n;.           
28580 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
28590 47 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70  GB = pAggInfo->p
285a0 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20  GroupBy;.       
285b0 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
285c0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
285d0 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20  Term = pGB->a;. 
285e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
285f0 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20   = pGB->nExpr;. 
28600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
28610 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b  or(j=0; j<n; j++
28620 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
28630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
28640 70 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e  pr *pE = pTerm->
28650 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
28660 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d           if( pE-
28670 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
28680 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45  & pE->iTable==pE
28690 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20  xpr->iTable &&. 
286a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286b0 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e       pE->iColumn
286c0 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ==pExpr->iColumn
286d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
286e0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53          pCol->iS
286f0 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b  orterColumn = j;
28700 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28710 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
28720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
28730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28740 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
28750 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
28760 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65  if( pCol->iSorte
28770 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  rColumn<0 ){.   
28780 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
28790 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
287a0 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f   = pAggInfo->nSo
287b0 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20  rtingColumn++;. 
287c0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
287d0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
287e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72           /* Ther
287f0 65 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72  e is now an entr
28800 79 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20 70  y for pExpr in p
28810 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
28820 28 65 69 74 68 65 72 0a 20 20 20 20 20 20 20 20  (either.        
28830 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69      ** because i
28840 74 20 77 61 73 20 74 68 65 72 65 20 62 65 66 6f  t was there befo
28850 72 65 20 6f 72 20 62 65 63 61 75 73 65 20 77 65  re or because we
28860 20 6a 75 73 74 20 63 72 65 61 74 65 64 20 69 74   just created it
28870 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  )..            *
28880 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70 45  * Convert the pE
28890 78 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f 41  xpr to be a TK_A
288a0 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72  GG_COLUMN referr
288b0 69 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20 20  ing to that.    
288c0 20 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67 49          ** pAggI
288d0 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72  nfo->aCol[] entr
288e0 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  y..            *
288f0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  /.            Ex
28900 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
28910 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64  (pExpr, EP_NoRed
28920 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  uce);.          
28930 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66    pExpr->pAggInf
28940 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20  o = pAggInfo;.  
28950 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
28960 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c  >op = TK_AGG_COL
28970 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  UMN;.           
28980 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28   pExpr->iAgg = (
28990 69 31 36 29 6b 3b 0a 20 20 20 20 20 20 20 20 20  i16)k;.         
289a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
289b0 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70      } /* endif p
289c0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49  Expr->iTable==pI
289d0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a  tem->iCursor */.
289e0 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64          } /* end
289f0 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c   loop over pSrcL
28a00 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ist */.      }. 
28a10 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
28a20 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20  Prune;.    }.   
28a30 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
28a40 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69  CTION: {.      i
28a50 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73  f( (pNC->ncFlags
28a60 20 26 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 29   & NC_InAggFunc)
28a70 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70 57  ==0.       && pW
28a80 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70  alker->walkerDep
28a90 74 68 3d 3d 70 45 78 70 72 2d 3e 6f 70 32 0a 20  th==pExpr->op2. 
28aa0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
28ab0 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
28ac0 69 66 20 70 45 78 70 72 20 69 73 20 61 20 64 75  if pExpr is a du
28ad0 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68  plicate of anoth
28ae0 65 72 20 61 67 67 72 65 67 61 74 65 20 0a 20 20  er aggregate .  
28af0 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
28b00 6e 20 74 68 61 74 20 69 73 20 61 6c 72 65 61 64  n that is alread
28b10 79 20 69 6e 20 74 68 65 20 70 41 67 67 49 6e 66  y in the pAggInf
28b20 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20  o structure.    
28b30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
28b40 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
28b50 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70 41 67 67  nc *pItem = pAgg
28b60 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20  Info->aFunc;.   
28b70 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
28b80 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
28b90 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
28ba0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
28bb0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
28bc0 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70  (pItem->pExpr, p
28bd0 45 78 70 72 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a  Expr, -1)==0 ){.
28be0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
28bf0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
28c00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28c10 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f   if( i>=pAggInfo
28c20 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20  ->nFunc ){.     
28c30 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73       /* pExpr is
28c40 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65   original.  Make
28c50 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20   a new entry in 
28c60 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
28c70 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ].          */. 
28c80 20 20 20 20 20 20 20 20 20 75 38 20 65 6e 63 20           u8 enc 
28c90 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62  = ENC(pParse->db
28ca0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d  );.          i =
28cb0 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28   addAggInfoFunc(
28cc0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67  pParse->db, pAgg
28cd0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  Info);.         
28ce0 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20   if( i>=0 ){.   
28cf0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
28d00 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
28d10 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
28d20 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
28d30 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70        pItem = &p
28d40 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69  AggInfo->aFunc[i
28d50 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ];.            p
28d60 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45  Item->pExpr = pE
28d70 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
28d80 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b   pItem->iMem = +
28d90 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
28da0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
28db0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
28dc0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
28dd0 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
28de0 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 46         pItem->pF
28df0 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  unc = sqlite3Fin
28e00 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  dFunction(pParse
28e10 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ->db,.          
28e20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
28e30 75 2e 7a 54 6f 6b 65 6e 2c 20 0a 20 20 20 20 20  u.zToken, .     
28e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
28e50 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20 70  xpr->x.pList ? p
28e60 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
28e70 45 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30  Expr : 0, enc, 0
28e80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
28e90 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
28ea0 26 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b  & EP_Distinct ){
28eb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
28ec0 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20  Item->iDistinct 
28ed0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
28ee0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
28ef0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
28f00 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69     pItem->iDisti
28f10 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  nct = -1;.      
28f20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28f30 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
28f40 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45        /* Make pE
28f50 78 70 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  xpr point to the
28f60 20 61 70 70 72 6f 70 72 69 61 74 65 20 70 41 67   appropriate pAg
28f70 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65  gInfo->aFunc[] e
28f80 6e 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ntry.        */.
28f90 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
28fa0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
28fb0 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e  (pExpr, EP_Token
28fc0 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
28fd0 20 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72   );.        Expr
28fe0 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
28ff0 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63  Expr, EP_NoReduc
29000 65 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  e);.        pExp
29010 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29 69  r->iAgg = (i16)i
29020 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
29030 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67  >pAggInfo = pAgg
29040 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 72 65  Info;.        re
29050 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
29060 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
29070 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
29080 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  Continue;.      
29090 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
290a0 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
290b0 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  e;.}.static int 
290c0 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
290d0 73 49 6e 53 65 6c 65 63 74 28 57 61 6c 6b 65 72  sInSelect(Walker
290e0 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
290f0 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 55  t *pSelect){.  U
29100 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
29110 70 57 61 6c 6b 65 72 29 3b 0a 20 20 55 4e 55 53  pWalker);.  UNUS
29120 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 53 65  ED_PARAMETER(pSe
29130 6c 65 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  lect);.  return 
29140 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
29150 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74  ./*.** Analyze t
29160 68 65 20 70 45 78 70 72 20 65 78 70 72 65 73 73  he pExpr express
29170 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ion looking for 
29180 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
29190 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76  ons and.** for v
291a0 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65  ariables that ne
291b0 65 64 20 74 6f 20 62 65 20 61 64 64 65 64 20 74  ed to be added t
291c0 6f 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74  o AggInfo object
291d0 20 74 68 61 74 20 70 4e 43 2d 3e 70 41 67 67 49   that pNC->pAggI
291e0 6e 66 6f 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  nfo.** points to
291f0 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 65 6e  .  Additional en
29200 74 72 69 65 73 20 61 72 65 20 6d 61 64 65 20 6f  tries are made o
29210 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 6f 62  n the AggInfo ob
29220 6a 65 63 74 20 61 73 0a 2a 2a 20 6e 65 63 65 73  ject as.** neces
29230 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  sary..**.** This
29240 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
29250 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61  only be called a
29260 66 74 65 72 20 74 68 65 20 65 78 70 72 65 73 73  fter the express
29270 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  ion has been.** 
29280 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69  analyzed by sqli
29290 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61  te3ResolveExprNa
292a0 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  mes()..*/.void s
292b0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
292c0 65 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d 65  eAggregates(Name
292d0 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78  Context *pNC, Ex
292e0 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 57 61  pr *pExpr){.  Wa
292f0 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74  lker w;.  memset
29300 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  (&w, 0, sizeof(w
29310 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  ));.  w.xExprCal
29320 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41  lback = analyzeA
29330 67 67 72 65 67 61 74 65 3b 0a 20 20 77 2e 78 53  ggregate;.  w.xS
29340 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
29350 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
29360 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e 75  sInSelect;.  w.u
29370 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 61 73  .pNC = pNC;.  as
29380 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c  sert( pNC->pSrcL
29390 69 73 74 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  ist!=0 );.  sqli
293a0 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
293b0 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pExpr);.}../*.**
293c0 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70   Call sqlite3Exp
293d0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
293e0 65 73 28 29 20 66 6f 72 20 65 76 65 72 79 20 65  es() for every e
293f0 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a  xpression in an.
29400 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
29410 73 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  st.  Return the 
29420 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
29430 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
29440 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68  ror is found, th
29450 65 20 61 6e 61 6c 79 73 69 73 20 69 73 20 63 75  e analysis is cu
29460 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64  t short..*/.void
29470 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
29480 79 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d 65 43  yzeAggList(NameC
29490 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70  ontext *pNC, Exp
294a0 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
294b0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
294c0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
294d0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
294e0 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49  st ){.    for(pI
294f0 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d  tem=pList->a, i=
29500 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
29510 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
29520 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
29530 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
29540 61 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d  ates(pNC, pItem-
29550 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  >pExpr);.    }. 
29560 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
29570 63 61 74 65 20 61 20 73 69 6e 67 6c 65 20 6e 65  cate a single ne
29580 77 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 75  w register for u
29590 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f 6d 65 20  se to hold some 
295a0 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73  intermediate res
295b0 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ult..*/.int sqli
295c0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 50 61  te3GetTempReg(Pa
295d0 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
295e0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d  if( pParse->nTem
295f0 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pReg==0 ){.    r
29600 65 74 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e  eturn ++pParse->
29610 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nMem;.  }.  retu
29620 72 6e 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  rn pParse->aTemp
29630 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 54  Reg[--pParse->nT
29640 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  empReg];.}../*.*
29650 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 72  * Deallocate a r
29660 65 67 69 73 74 65 72 2c 20 6d 61 6b 69 6e 67 20  egister, making 
29670 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65  available for re
29680 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  use for some oth
29690 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65 2e 0a 2a  er.** purpose..*
296a0 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74  *.** If a regist
296b0 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  er is currently 
296c0 62 65 69 6e 67 20 75 73 65 64 20 62 79 20 74 68  being used by th
296d0 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2c 20  e column cache, 
296e0 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64 65 61 6c  then.** the deal
296f0 6c 6f 63 61 74 69 6f 6e 20 69 73 20 64 65 66 65  location is defe
29700 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 63  rred until the c
29710 6f 6c 75 6d 6e 20 63 61 63 68 65 20 6c 69 6e 65  olumn cache line
29720 20 74 68 61 74 20 75 73 65 73 0a 2a 2a 20 74 68   that uses.** th
29730 65 20 72 65 67 69 73 74 65 72 20 62 65 63 6f 6d  e register becom
29740 65 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a 76 6f 69  es stale..*/.voi
29750 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65  d sqlite3Release
29760 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70  TempReg(Parse *p
29770 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29  Parse, int iReg)
29780 7b 0a 20 20 69 66 28 20 69 52 65 67 20 26 26 20  {.  if( iReg && 
29790 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
297a0 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73  <ArraySize(pPars
297b0 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a  e->aTempReg) ){.
297c0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73      int i;.    s
297d0 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
297e0 2a 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  *p;.    for(i=0,
297f0 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
29800 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
29810 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
29820 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  p++){.      if( 
29830 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b  p->iReg==iReg ){
29840 0a 20 20 20 20 20 20 20 20 70 2d 3e 74 65 6d 70  .        p->temp
29850 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Reg = 1;.       
29860 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
29870 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
29880 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72  e->aTempReg[pPar
29890 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20  se->nTempReg++] 
298a0 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = iReg;.  }.}../
298b0 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72  *.** Allocate or
298c0 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 20 62 6c   deallocate a bl
298d0 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e 73  ock of nReg cons
298e0 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72  ecutive register
298f0 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  s.*/.int sqlite3
29900 47 65 74 54 65 6d 70 52 61 6e 67 65 28 50 61 72  GetTempRange(Par
29910 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
29920 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c 20  nReg){.  int i, 
29930 6e 3b 0a 20 20 69 20 3d 20 70 50 61 72 73 65 2d  n;.  i = pParse-
29940 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e 20  >iRangeReg;.  n 
29950 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65  = pParse->nRange
29960 52 65 67 3b 0a 20 20 69 66 28 20 6e 52 65 67 3c  Reg;.  if( nReg<
29970 3d 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =n ){.    assert
29980 28 20 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43  ( !usedAsColumnC
29990 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 2c 20  ache(pParse, i, 
299a0 69 2b 6e 2d 31 29 20 29 3b 0a 20 20 20 20 70 50  i+n-1) );.    pP
299b0 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20  arse->iRangeReg 
299c0 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61  += nReg;.    pPa
299d0 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 2d  rse->nRangeReg -
299e0 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b  = nReg;.  }else{
299f0 0a 20 20 20 20 69 20 3d 20 70 50 61 72 73 65 2d  .    i = pParse-
29a00 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
29a10 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
29a20 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  g;.  }.  return 
29a30 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  i;.}.void sqlite
29a40 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
29a50 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
29a60 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e   int iReg, int n
29a70 52 65 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 45  Reg){.  sqlite3E
29a80 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70  xprCacheRemove(p
29a90 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 52 65  Parse, iReg, nRe
29aa0 67 29 3b 0a 20 20 69 66 28 20 6e 52 65 67 3e 70  g);.  if( nReg>p
29ab0 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
29ac0 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
29ad0 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65 67  nRangeReg = nReg
29ae0 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52  ;.    pParse->iR
29af0 61 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b 0a  angeReg = iReg;.
29b00 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72    }.}../*.** Mar
29b10 6b 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20  k all temporary 
29b20 72 65 67 69 73 74 65 72 73 20 61 73 20 62 65 69  registers as bei
29b30 6e 67 20 75 6e 61 76 61 69 6c 61 62 6c 65 20 66  ng unavailable f
29b40 6f 72 20 72 65 75 73 65 2e 0a 2a 2f 0a 76 6f 69  or reuse..*/.voi
29b50 64 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65  d sqlite3ClearTe
29b60 6d 70 52 65 67 43 61 63 68 65 28 50 61 72 73 65  mpRegCache(Parse
29b70 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61   *pParse){.  pPa
29b80 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20 3d 20  rse->nTempReg = 
29b90 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 52 61  0;.  pParse->nRa
29ba0 6e 67 65 52 65 67 20 3d 20 30 3b 0a 7d 0a 0a 2f  ngeReg = 0;.}../
29bb0 2a 0a 2a 2a 20 56 61 6c 69 64 61 74 65 20 74 68  *.** Validate th
29bc0 61 74 20 6e 6f 20 74 65 6d 70 6f 72 61 72 79 20  at no temporary 
29bd0 72 65 67 69 73 74 65 72 20 66 61 6c 6c 73 20 77  register falls w
29be0 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20  ithin the range 
29bf0 6f 66 0a 2a 2a 20 69 46 69 72 73 74 2e 2e 69 4c  of.** iFirst..iL
29c00 61 73 74 2c 20 69 6e 63 6c 75 73 69 76 65 2e 20  ast, inclusive. 
29c10 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
29c20 20 6f 6e 6c 79 20 63 61 6c 6c 20 66 72 6f 6d 20   only call from 
29c30 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 0a  within assert().
29c40 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  ** statements..*
29c50 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
29c60 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65  DEBUG.int sqlite
29c70 33 4e 6f 54 65 6d 70 73 49 6e 52 61 6e 67 65 28  3NoTempsInRange(
29c80 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
29c90 6e 74 20 69 46 69 72 73 74 2c 20 69 6e 74 20 69  nt iFirst, int i
29ca0 4c 61 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Last){.  int i;.
29cb0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 52    if( pParse->nR
29cc0 61 6e 67 65 52 65 67 3e 30 0a 20 20 20 26 26 20  angeReg>0.   && 
29cd0 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
29ce0 67 2b 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65  g+pParse->nRange
29cf0 52 65 67 3c 69 4c 61 73 74 0a 20 20 20 26 26 20  Reg<iLast.   && 
29d00 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
29d10 67 3e 3d 69 46 69 72 73 74 0a 20 20 29 7b 0a 20  g>=iFirst.  ){. 
29d20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
29d30 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
29d40 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3b  Parse->nTempReg;
29d50 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
29d60 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
29d70 69 5d 3e 3d 69 46 69 72 73 74 20 26 26 20 70 50  i]>=iFirst && pP
29d80 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69  arse->aTempReg[i
29d90 5d 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20 20  ]<=iLast ){.    
29da0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
29db0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  }.  }.  return 1
29dc0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
29dd0 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a        LITE_DEBUG */.