/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 94b3d94696e86840f2d0d038c638eefde57c2a40:


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 66 20 74  QUERY./*.** If t
29f0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61  he expression pa
2a00: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
2a10: 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
2a20: 54 4b 5f 56 45 43 54 4f 52 2c 20 72 65 74 75 72  TK_VECTOR, retur
2a30: 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  n.** a pointer t
2a40: 6f 20 74 68 65 20 69 27 74 68 20 66 69 65 6c 64  o the i'th field
2a50: 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 2e 20   of the vector. 
2a60: 4f 72 2c 20 69 66 20 74 68 65 20 66 69 72 73 74  Or, if the first
2a70: 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 70 6f 69   argument.** poi
2a80: 6e 74 73 20 74 6f 20 61 20 73 75 62 2d 73 65 6c  nts to a sub-sel
2a90: 65 63 74 20 74 68 61 74 20 72 65 74 75 72 6e 73  ect that returns
2aa0: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63   more than one c
2ab0: 6f 6c 75 6d 6e 2c 20 72 65 74 75 72 6e 20 61 20  olumn, return a 
2ac0: 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  .** pointer to t
2ad0: 68 65 20 69 27 74 68 20 72 65 74 75 72 6e 65 64  he i'th returned
2ae0: 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2e 20 4f   column value. O
2af0: 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
2b00: 20 61 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20 74   a copy .** of t
2b10: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
2b20: 74 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  t..*/.Expr *sqli
2b30: 74 65 33 45 78 70 72 56 65 63 74 6f 72 46 69 65  te3ExprVectorFie
2b40: 6c 64 28 45 78 70 72 20 2a 70 56 65 63 74 6f 72  ld(Expr *pVector
2b50: 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61 73 73 65  , int i){.  asse
2b60: 72 74 28 20 69 3c 73 71 6c 69 74 65 33 45 78 70  rt( i<sqlite3Exp
2b70: 72 56 65 63 74 6f 72 53 69 7a 65 28 70 56 65 63  rVectorSize(pVec
2b80: 74 6f 72 29 20 29 3b 0a 20 20 69 66 28 20 73 71  tor) );.  if( sq
2b90: 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f  lite3ExprIsVecto
2ba0: 72 28 70 56 65 63 74 6f 72 29 20 29 7b 0a 20 20  r(pVector) ){.  
2bb0: 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f    if( pVector->o
2bc0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
2bd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 56 65        return pVe
2be0: 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  ctor->x.pSelect-
2bf0: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  >pEList->a[i].pE
2c00: 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  xpr;.    }else{.
2c10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 56 65        return pVe
2c20: 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  ctor->x.pList->a
2c30: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d  [i].pExpr;.    }
2c40: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 56  .  }.  return pV
2c50: 65 63 74 6f 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ector;.}.#endif.
2c60: 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78 70 72 65 73  ./*.** If expres
2c70: 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 6f 66  sion pExpr is of
2c80: 20 74 79 70 65 20 54 4b 5f 53 45 4c 45 43 54 2c   type TK_SELECT,
2c90: 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   generate code t
2ca0: 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 69 74  o evaluate.** it
2cb0: 2e 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67  . Return the reg
2cc0: 69 73 74 65 72 20 69 6e 20 77 68 69 63 68 20 74  ister in which t
2cd0: 68 65 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f  he result is sto
2ce0: 72 65 64 20 28 6f 72 2c 20 69 66 20 74 68 65 20  red (or, if the 
2cf0: 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 20 72  .** sub-select r
2d00: 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e  eturns more than
2d10: 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2c 20 74 68 65   one column, the
2d20: 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72   first in an arr
2d30: 61 79 0a 2a 2a 20 6f 66 20 72 65 67 69 73 74 65  ay.** of registe
2d40: 72 73 20 69 6e 20 77 68 69 63 68 20 74 68 65 20  rs in which the 
2d50: 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64  result is stored
2d60: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  )..**.** If pExp
2d70: 72 20 69 73 20 6e 6f 74 20 61 20 54 4b 5f 53 45  r is not a TK_SE
2d80: 4c 45 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2c  LECT expression,
2d90: 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74   return 0..*/.st
2da0: 61 74 69 63 20 69 6e 74 20 65 78 70 72 43 6f 64  atic int exprCod
2db0: 65 53 75 62 73 65 6c 65 63 74 28 50 61 72 73 65  eSubselect(Parse
2dc0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
2dd0: 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 72 65  pExpr){.  int re
2de0: 67 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  g = 0;.#ifndef S
2df0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
2e00: 45 52 59 0a 20 20 69 66 28 20 70 45 78 70 72 2d  ERY.  if( pExpr-
2e10: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
2e20: 7b 0a 20 20 20 20 72 65 67 20 3d 20 73 71 6c 69  {.    reg = sqli
2e30: 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
2e40: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
2e50: 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  0, 0);.  }.#endi
2e60: 66 0a 20 20 72 65 74 75 72 6e 20 72 65 67 3b 0a  f.  return reg;.
2e70: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  }../*.** Argumen
2e80: 74 20 70 56 65 63 74 6f 72 20 70 6f 69 6e 74 73  t pVector points
2e90: 20 74 6f 20 61 20 76 65 63 74 6f 72 20 65 78 70   to a vector exp
2ea0: 72 65 73 73 69 6f 6e 20 2d 20 65 69 74 68 65 72  ression - either
2eb0: 20 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a 20   a TK_VECTOR.** 
2ec0: 6f 72 20 54 4b 5f 53 45 4c 45 43 54 20 74 68 61  or TK_SELECT tha
2ed0: 74 20 72 65 74 75 72 6e 73 20 6d 6f 72 65 20 74  t returns more t
2ee0: 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2e 20  han one column. 
2ef0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
2f00: 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 72 65 67  turns.** the reg
2f10: 69 73 74 65 72 20 6e 75 6d 62 65 72 20 6f 66 20  ister number of 
2f20: 61 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20  a register that 
2f30: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c  contains the val
2f40: 75 65 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65 6e 74  ue of.** element
2f50: 20 69 46 69 65 6c 64 20 6f 66 20 74 68 65 20 76   iField of the v
2f60: 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ector..**.** If 
2f70: 70 56 65 63 74 6f 72 20 69 73 20 61 20 54 4b 5f  pVector is a TK_
2f80: 53 45 4c 45 43 54 20 65 78 70 72 65 73 73 69 6f  SELECT expressio
2f90: 6e 2c 20 74 68 65 6e 20 63 6f 64 65 20 66 6f 72  n, then code for
2fa0: 20 69 74 20 6d 75 73 74 20 68 61 76 65 20 0a 2a   it must have .*
2fb0: 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 67  * already been g
2fc0: 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20 74  enerated using t
2fd0: 68 65 20 65 78 70 72 43 6f 64 65 53 75 62 73 65  he exprCodeSubse
2fe0: 6c 65 63 74 28 29 20 72 6f 75 74 69 6e 65 2e 20  lect() routine. 
2ff0: 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20  In this.** case 
3000: 70 61 72 61 6d 65 74 65 72 20 72 65 67 53 65 6c  parameter regSel
3010: 65 63 74 20 73 68 6f 75 6c 64 20 62 65 20 74 68  ect should be th
3020: 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72  e first in an ar
3030: 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
3040: 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  .** containing t
3050: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
3060: 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 0a 2a  e sub-select. .*
3070: 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72 20  *.** If pVector 
3080: 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f 56 45  is of type TK_VE
3090: 43 54 4f 52 2c 20 74 68 65 6e 20 63 6f 64 65 20  CTOR, then code 
30a0: 66 6f 72 20 74 68 65 20 72 65 71 75 65 73 74 65  for the requeste
30b0: 64 20 66 69 65 6c 64 0a 2a 2a 20 69 73 20 67 65  d field.** is ge
30c0: 6e 65 72 61 74 65 64 2e 20 49 6e 20 74 68 69 73  nerated. In this
30d0: 20 63 61 73 65 20 28 2a 70 52 65 67 46 72 65 65   case (*pRegFree
30e0: 29 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  ) may be set to 
30f0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
3100: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67   a temporary reg
3110: 69 73 74 65 72 20 74 6f 20 62 65 20 66 72 65 65  ister to be free
3120: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
3130: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
3140: 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72  ..**.** Before r
3150: 65 74 75 72 6e 69 6e 67 2c 20 6f 75 74 70 75 74  eturning, output
3160: 20 70 61 72 61 6d 65 74 65 72 20 28 2a 70 70 45   parameter (*ppE
3170: 78 70 72 29 20 69 73 20 73 65 74 20 74 6f 20 70  xpr) is set to p
3180: 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20 45  oint to the.** E
3190: 78 70 72 20 6f 62 6a 65 63 74 20 63 6f 72 72 65  xpr object corre
31a0: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65 6c 65 6d  sponding to elem
31b0: 65 6e 74 20 69 45 6c 65 6d 20 6f 66 20 74 68 65  ent iElem of the
31c0: 20 76 65 63 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74   vector..*/.stat
31d0: 69 63 20 69 6e 74 20 65 78 70 72 56 65 63 74 6f  ic int exprVecto
31e0: 72 52 65 67 69 73 74 65 72 28 0a 20 20 50 61 72  rRegister(.  Par
31f0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
3200: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3210: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
3220: 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74 6f 72  .  Expr *pVector
3230: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3240: 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 74 6f 20     /* Vector to 
3250: 65 78 74 72 61 63 74 20 65 6c 65 6d 65 6e 74 20  extract element 
3260: 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 46  from */.  int iF
3270: 69 65 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20  ield,           
3280: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 65            /* Fie
3290: 6c 64 20 74 6f 20 65 78 74 72 61 63 74 20 66 72  ld to extract fr
32a0: 6f 6d 20 70 56 65 63 74 6f 72 20 2a 2f 0a 20 20  om pVector */.  
32b0: 69 6e 74 20 72 65 67 53 65 6c 65 63 74 2c 20 20  int regSelect,  
32c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d0: 2f 2a 20 46 69 72 73 74 20 69 6e 20 61 72 72 61  /* First in arra
32e0: 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 2a  y of registers *
32f0: 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45 78 70  /.  Expr **ppExp
3300: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
3310: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 78 70 72      /* OUT: Expr
3320: 65 73 73 69 6f 6e 20 65 6c 65 6d 65 6e 74 20 2a  ession element *
3330: 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 46 72 65  /.  int *pRegFre
3340: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
3350: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 65 6d 70      /* OUT: Temp
3360: 20 72 65 67 69 73 74 65 72 20 74 6f 20 66 72 65   register to fre
3370: 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  e */.){.  assert
3380: 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54  ( pVector->op==T
3390: 4b 5f 56 45 43 54 4f 52 20 7c 7c 20 70 56 65 63  K_VECTOR || pVec
33a0: 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  tor->op==TK_SELE
33b0: 43 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CT );.  assert( 
33c0: 28 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b  (pVector->op==TK
33d0: 5f 56 45 43 54 4f 52 29 3d 3d 28 72 65 67 53 65  _VECTOR)==(regSe
33e0: 6c 65 63 74 3d 3d 30 29 20 29 3b 0a 20 20 69 66  lect==0) );.  if
33f0: 28 20 72 65 67 53 65 6c 65 63 74 20 29 7b 0a 20  ( regSelect ){. 
3400: 20 20 20 2a 70 70 45 78 70 72 20 3d 20 70 56 65     *ppExpr = pVe
3410: 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  ctor->x.pSelect-
3420: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c  >pEList->a[iFiel
3430: 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 72  d].pExpr;.     r
3440: 65 74 75 72 6e 20 72 65 67 53 65 6c 65 63 74 2b  eturn regSelect+
3450: 69 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 2a 70  iField;.  }.  *p
3460: 70 45 78 70 72 20 3d 20 70 56 65 63 74 6f 72 2d  pExpr = pVector-
3470: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69 65  >x.pList->a[iFie
3480: 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 72 65 74  ld].pExpr;.  ret
3490: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43  urn sqlite3ExprC
34a0: 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
34b0: 2a 70 70 45 78 70 72 2c 20 70 52 65 67 46 72 65  *ppExpr, pRegFre
34c0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70  e);.}../*.** Exp
34d0: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73  ression pExpr is
34e0: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62 65   a comparison be
34f0: 74 77 65 65 6e 20 74 77 6f 20 76 65 63 74 6f 72  tween two vector
3500: 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 75 74 65   values. Compute
3510: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f  .** the result o
3520: 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
3530: 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 74 6f   and write it to
3540: 20 72 65 67 69 73 74 65 72 20 64 65 73 74 2e 0a   register dest..
3550: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
3560: 6f 64 65 56 65 63 74 6f 72 43 6f 6d 70 61 72 65  odeVectorCompare
3570: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
3580: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
3590: 20 64 65 73 74 29 7b 0a 20 20 56 64 62 65 20 2a   dest){.  Vdbe *
35a0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
35b0: 65 3b 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74  e;.  Expr *pLeft
35c0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
35d0: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20  .  Expr *pRight 
35e0: 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  = pExpr->pRight;
35f0: 0a 20 20 69 6e 74 20 6e 4c 65 66 74 20 3d 20 73  .  int nLeft = s
3600: 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
3610: 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a 20 20 69  Size(pLeft);.  i
3620: 6e 74 20 6e 52 69 67 68 74 20 3d 20 73 71 6c 69  nt nRight = sqli
3630: 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
3640: 65 28 70 52 69 67 68 74 29 3b 0a 20 20 69 6e 74  e(pRight);.  int
3650: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
3660: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
3670: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
3680: 74 20 62 6f 74 68 20 73 69 64 65 73 20 6f 66 20  t both sides of 
3690: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61  the comparison a
36a0: 72 65 20 76 65 63 74 6f 72 73 2c 20 61 6e 64 20  re vectors, and 
36b0: 74 68 61 74 0a 20 20 2a 2a 20 62 6f 74 68 20 61  that.  ** both a
36c0: 72 65 20 74 68 65 20 73 61 6d 65 20 6c 65 6e 67  re the same leng
36d0: 74 68 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6e 4c  th.  */.  if( nL
36e0: 65 66 74 21 3d 6e 52 69 67 68 74 20 29 7b 0a 20  eft!=nRight ){. 
36f0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
3700: 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 76 61  sg(pParse, "inva
3710: 6c 69 64 20 75 73 65 20 6f 66 20 72 6f 77 20 76  lid use of row v
3720: 61 6c 75 65 22 29 3b 0a 20 20 7d 65 6c 73 65 7b  alue");.  }else{
3730: 0a 20 20 20 20 69 6e 74 20 70 35 20 3d 20 28 70  .    int p5 = (p
3740: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
3750: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
3760: 5f 49 53 4e 4f 54 29 20 3f 20 53 51 4c 49 54 45  _ISNOT) ? SQLITE
3770: 5f 4e 55 4c 4c 45 51 20 3a 20 30 3b 0a 20 20 20  _NULLEQ : 0;.   
3780: 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
3790: 72 65 67 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20  regLeft = 0;.   
37a0: 20 69 6e 74 20 72 65 67 52 69 67 68 74 20 3d 20   int regRight = 
37b0: 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 54 6d  0;.    int regTm
37c0: 70 20 3d 20 30 3b 0a 0a 20 20 20 20 61 73 73 65  p = 0;..    asse
37d0: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
37e0: 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_EQ || pExpr->o
37f0: 70 3d 3d 54 4b 5f 4e 45 20 0a 20 20 20 20 20 20  p==TK_NE .      
3800: 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d     || pExpr->op=
3810: 3d 54 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d  =TK_IS || pExpr-
3820: 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 0a 20  >op==TK_ISNOT . 
3830: 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72          || pExpr
3840: 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70  ->op==TK_LT || p
3850: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20  Expr->op==TK_GT 
3860: 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78  .         || pEx
3870: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c  pr->op==TK_LE ||
3880: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
3890: 45 20 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 69  E .    );..    i
38a0: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
38b0: 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _EQ || pExpr->op
38c0: 3d 3d 54 4b 5f 4e 45 20 29 7b 0a 20 20 20 20 20  ==TK_NE ){.     
38d0: 20 72 65 67 54 6d 70 20 3d 20 73 71 6c 69 74 65   regTmp = sqlite
38e0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
38f0: 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
3900: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3910: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 28 70 45 78  OP_Integer, (pEx
3920: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 29 2c 20  pr->op==TK_EQ), 
3930: 64 65 73 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  dest);.    }..  
3940: 20 20 72 65 67 4c 65 66 74 20 3d 20 65 78 70 72    regLeft = expr
3950: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
3960: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
3970: 20 20 72 65 67 52 69 67 68 74 20 3d 20 65 78 70    regRight = exp
3980: 72 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  rCodeSubselect(p
3990: 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a  Parse, pRight);.
39a0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
39b0: 6e 4c 65 66 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  nLeft; i++){.   
39c0: 20 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20     int regFree1 
39d0: 3d 20 30 2c 20 72 65 67 46 72 65 65 32 20 3d 20  = 0, regFree2 = 
39e0: 30 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  0;.      Expr *p
39f0: 4c 2c 20 2a 70 52 3b 20 0a 20 20 20 20 20 20 69  L, *pR; .      i
3a00: 6e 74 20 72 31 2c 20 72 32 3b 0a 20 20 20 20 20  nt r1, r2;.     
3a10: 20 69 66 28 20 69 20 29 20 73 71 6c 69 74 65 33   if( i ) sqlite3
3a20: 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
3a30: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72 31 20  arse);.      r1 
3a40: 3d 20 65 78 70 72 56 65 63 74 6f 72 52 65 67 69  = exprVectorRegi
3a50: 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 4c 65  ster(pParse, pLe
3a60: 66 74 2c 20 69 2c 20 72 65 67 4c 65 66 74 2c 20  ft, i, regLeft, 
3a70: 26 70 4c 2c 20 26 72 65 67 46 72 65 65 31 29 3b  &pL, &regFree1);
3a80: 0a 20 20 20 20 20 20 72 32 20 3d 20 65 78 70 72  .      r2 = expr
3a90: 56 65 63 74 6f 72 52 65 67 69 73 74 65 72 28 70  VectorRegister(p
3aa0: 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 69  Parse, pRight, i
3ab0: 2c 20 72 65 67 52 69 67 68 74 2c 20 26 70 52 2c  , regRight, &pR,
3ac0: 20 26 72 65 67 46 72 65 65 32 29 3b 0a 0a 20 20   &regFree2);..  
3ad0: 20 20 20 20 73 77 69 74 63 68 28 20 70 45 78 70      switch( pExp
3ae0: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20 20  r->op ){.       
3af0: 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20   case TK_IS:.   
3b00: 20 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61         codeCompa
3b10: 72 65 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  re(.            
3b20: 20 20 70 50 61 72 73 65 2c 20 70 4c 2c 20 70 52    pParse, pL, pR
3b30: 2c 20 4f 50 5f 45 71 2c 20 72 31 2c 20 72 32 2c  , OP_Eq, r1, r2,
3b40: 20 64 65 73 74 2c 20 53 51 4c 49 54 45 5f 53 54   dest, SQLITE_ST
3b50: 4f 52 45 50 32 7c 53 51 4c 49 54 45 5f 4e 55 4c  OREP2|SQLITE_NUL
3b60: 4c 45 51 0a 20 20 20 20 20 20 20 20 20 20 29 3b  LEQ.          );
3b70: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
3b80: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
3b90: 4f 50 5f 49 66 4e 6f 74 2c 20 64 65 73 74 2c 20  OP_IfNot, dest, 
3ba0: 61 64 64 72 2c 20 31 29 3b 0a 20 20 20 20 20 20  addr, 1);.      
3bb0: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
3bc0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  (v);.          b
3bd0: 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 63  reak;..        c
3be0: 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20  ase TK_ISNOT:.  
3bf0: 20 20 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70          codeComp
3c00: 61 72 65 28 0a 20 20 20 20 20 20 20 20 20 20 20  are(.           
3c10: 20 20 20 70 50 61 72 73 65 2c 20 70 4c 2c 20 70     pParse, pL, p
3c20: 52 2c 20 4f 50 5f 4e 65 2c 20 72 31 2c 20 72 32  R, OP_Ne, r1, r2
3c30: 2c 20 64 65 73 74 2c 20 53 51 4c 49 54 45 5f 53  , dest, SQLITE_S
3c40: 54 4f 52 45 50 32 7c 53 51 4c 49 54 45 5f 4e 55  TOREP2|SQLITE_NU
3c50: 4c 4c 45 51 0a 20 20 20 20 20 20 20 20 20 20 29  LLEQ.          )
3c60: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
3c70: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
3c80: 20 4f 50 5f 49 66 2c 20 64 65 73 74 2c 20 61 64   OP_If, dest, ad
3c90: 64 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  dr, 1);.        
3ca0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
3cb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
3cc0: 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 63 61 73  ak;..        cas
3cd0: 65 20 54 4b 5f 45 51 3a 0a 20 20 20 20 20 20 20  e TK_EQ:.       
3ce0: 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
3cf0: 20 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61         codeCompa
3d00: 72 65 28 70 50 61 72 73 65 2c 20 70 4c 2c 20 70  re(pParse, pL, p
3d10: 52 2c 20 4f 50 5f 43 6d 70 2c 20 72 31 2c 20 72  R, OP_Cmp, r1, r
3d20: 32 2c 20 72 65 67 54 6d 70 2c 53 51 4c 49 54 45  2, regTmp,SQLITE
3d30: 5f 53 54 4f 52 45 50 32 7c 70 35 29 3b 0a 20 20  _STOREP2|p5);.  
3d40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
3d50: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 0a 20 20  dbeAddOp4Int(.  
3d60: 20 20 20 20 20 20 20 20 20 20 20 20 76 2c 20 4f              v, O
3d70: 50 5f 43 6d 70 54 65 73 74 2c 20 72 65 67 54 6d  P_CmpTest, regTm
3d80: 70 2c 20 61 64 64 72 2c 20 64 65 73 74 2c 20 70  p, addr, dest, p
3d90: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 0a  Expr->op==TK_NE.
3da0: 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
3db0: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
3dc0: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
3dd0: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
3de0: 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
3df0: 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45        case TK_LE
3e00: 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 54  :.        case T
3e10: 4b 5f 47 54 3a 0a 20 20 20 20 20 20 20 20 63 61  K_GT:.        ca
3e20: 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 20 20  se TK_GE:.      
3e30: 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
3e40: 70 50 61 72 73 65 2c 20 70 4c 2c 20 70 52 2c 20  pParse, pL, pR, 
3e50: 4f 50 5f 43 6d 70 2c 20 72 31 2c 20 72 32 2c 20  OP_Cmp, r1, r2, 
3e60: 64 65 73 74 2c 20 53 51 4c 49 54 45 5f 53 54 4f  dest, SQLITE_STO
3e70: 52 45 50 32 7c 70 35 29 3b 0a 20 20 20 20 20 20  REP2|p5);.      
3e80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3e90: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 43  ddOp4Int(v, OP_C
3ea0: 6d 70 54 65 73 74 2c 20 64 65 73 74 2c 20 61 64  mpTest, dest, ad
3eb0: 64 72 2c 20 30 2c 20 70 45 78 70 72 2d 3e 6f 70  dr, 0, pExpr->op
3ec0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
3ed0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
3ee0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
3ef0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 71       }..      sq
3f00: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
3f10: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
3f20: 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ree1);.      sql
3f30: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
3f40: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
3f50: 65 65 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ee2);.      if( 
3f60: 69 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 43  i ) sqlite3ExprC
3f70: 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
3f80: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69  .    }..    sqli
3f90: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
3fa0: 67 28 70 50 61 72 73 65 2c 20 72 65 67 54 6d 70  g(pParse, regTmp
3fb0: 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
3fc0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
3fd0: 6c 28 76 2c 20 61 64 64 72 29 3b 0a 7d 0a 0a 23  l(v, addr);.}..#
3fe0: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  if SQLITE_MAX_EX
3ff0: 50 52 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a  PR_DEPTH>0./*.**
4000: 20 43 68 65 63 6b 20 74 68 61 74 20 61 72 67 75   Check that argu
4010: 6d 65 6e 74 20 6e 48 65 69 67 68 74 20 69 73 20  ment nHeight is 
4020: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
4030: 61 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  al to the maximu
4040: 6d 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  m.** expression 
4050: 64 65 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49  depth allowed. I
4060: 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61  f it is not, lea
4070: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
4080: 61 67 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65  age in.** pParse
4090: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
40a0: 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28  ExprCheckHeight(
40b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
40c0: 6e 74 20 6e 48 65 69 67 68 74 29 7b 0a 20 20 69  nt nHeight){.  i
40d0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
40e0: 4b 3b 0a 20 20 69 6e 74 20 6d 78 48 65 69 67 68  K;.  int mxHeigh
40f0: 74 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  t = pParse->db->
4100: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
4110: 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b  MIT_EXPR_DEPTH];
4120: 0a 20 20 69 66 28 20 6e 48 65 69 67 68 74 3e 6d  .  if( nHeight>m
4130: 78 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20 73  xHeight ){.    s
4140: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
4150: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22  Parse, .       "
4160: 45 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  Expression tree 
4170: 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61  is too large (ma
4180: 78 69 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22  ximum depth %d)"
4190: 2c 20 6d 78 48 65 69 67 68 74 0a 20 20 20 20 29  , mxHeight.    )
41a0: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
41b0: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  E_ERROR;.  }.  r
41c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
41d0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  The following th
41e0: 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68  ree functions, h
41f0: 65 69 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68  eightOfExpr(), h
4200: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
4210: 29 0a 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f  ).** and heightO
4220: 66 53 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75  fSelect(), are u
4230: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
4240: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69   the maximum hei
4250: 67 68 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78  ght.** of any ex
4260: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65  pression tree re
4270: 66 65 72 65 6e 63 65 64 20 62 79 20 74 68 65 20  ferenced by the 
4280: 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
4290: 20 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   as the.** first
42a0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
42b0: 20 49 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d   If this maximum
42c0: 20 68 65 69 67 68 74 20 69 73 20 67 72 65 61 74   height is great
42d0: 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
42e0: 65 6e 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65  ent value pointe
42f0: 64 0a 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69  d.** to by pnHei
4300: 67 68 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20  ght, the second 
4310: 70 61 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20  parameter, then 
4320: 73 65 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f  set *pnHeight to
4330: 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a   that.** value..
4340: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  */.static void h
4350: 65 69 67 68 74 4f 66 45 78 70 72 28 45 78 70 72  eightOfExpr(Expr
4360: 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67   *p, int *pnHeig
4370: 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  ht){.  if( p ){.
4380: 20 20 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67      if( p->nHeig
4390: 68 74 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a  ht>*pnHeight ){.
43a0: 20 20 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20        *pnHeight 
43b0: 3d 20 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20  = p->nHeight;.  
43c0: 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63    }.  }.}.static
43d0: 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78   void heightOfEx
43e0: 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20  prList(ExprList 
43f0: 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68  *p, int *pnHeigh
4400: 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  t){.  if( p ){. 
4410: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
4420: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70  r(i=0; i<p->nExp
4430: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68  r; i++){.      h
4440: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61  eightOfExpr(p->a
4450: 5b 69 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69  [i].pExpr, pnHei
4460: 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ght);.    }.  }.
4470: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  }.static void he
4480: 69 67 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c  ightOfSelect(Sel
4490: 65 63 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48  ect *p, int *pnH
44a0: 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20  eight){.  if( p 
44b0: 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  ){.    heightOfE
44c0: 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70  xpr(p->pWhere, p
44d0: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
44e0: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 48  ightOfExpr(p->pH
44f0: 61 76 69 6e 67 2c 20 70 6e 48 65 69 67 68 74 29  aving, pnHeight)
4500: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
4510: 70 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e  pr(p->pLimit, pn
4520: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
4530: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4f 66  ghtOfExpr(p->pOf
4540: 66 73 65 74 2c 20 70 6e 48 65 69 67 68 74 29 3b  fset, pnHeight);
4550: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
4560: 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c  rList(p->pEList,
4570: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
4580: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
4590: 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e  (p->pGroupBy, pn
45a0: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
45b0: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
45c0: 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69  >pOrderBy, pnHei
45d0: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
45e0: 4f 66 53 65 6c 65 63 74 28 70 2d 3e 70 50 72 69  OfSelect(p->pPri
45f0: 6f 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  or, pnHeight);. 
4600: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
4610: 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74  the Expr.nHeight
4620: 20 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68 65   variable in the
4630: 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
4640: 64 20 61 73 20 61 6e 20 0a 2a 2a 20 61 72 67 75  d as an .** argu
4650: 6d 65 6e 74 2e 20 41 6e 20 65 78 70 72 65 73 73  ment. An express
4660: 69 6f 6e 20 77 69 74 68 20 6e 6f 20 63 68 69 6c  ion with no chil
4670: 64 72 65 6e 2c 20 45 78 70 72 2e 70 4c 69 73 74  dren, Expr.pList
4680: 20 6f 72 20 0a 2a 2a 20 45 78 70 72 2e 70 53 65   or .** Expr.pSe
4690: 6c 65 63 74 20 6d 65 6d 62 65 72 20 68 61 73 20  lect member has 
46a0: 61 20 68 65 69 67 68 74 20 6f 66 20 31 2e 20 41  a height of 1. A
46b0: 6e 79 20 6f 74 68 65 72 20 65 78 70 72 65 73 73  ny other express
46c0: 69 6f 6e 0a 2a 2a 20 68 61 73 20 61 20 68 65 69  ion.** has a hei
46d0: 67 68 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65  ght equal to the
46e0: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20   maximum height 
46f0: 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 0a 2a 2a  of any other .**
4700: 20 72 65 66 65 72 65 6e 63 65 64 20 45 78 70 72   referenced Expr
4710: 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a   plus one..**.**
4720: 20 41 6c 73 6f 20 70 72 6f 70 61 67 61 74 65 20   Also propagate 
4730: 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61  EP_Propagate fla
4740: 67 73 20 75 70 20 66 72 6f 6d 20 45 78 70 72 2e  gs up from Expr.
4750: 78 2e 70 4c 69 73 74 20 74 6f 20 45 78 70 72 2e  x.pList to Expr.
4760: 66 6c 61 67 73 2c 0a 2a 2a 20 69 66 20 61 70 70  flags,.** if app
4770: 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61  ropriate..*/.sta
4780: 74 69 63 20 76 6f 69 64 20 65 78 70 72 53 65 74  tic void exprSet
4790: 48 65 69 67 68 74 28 45 78 70 72 20 2a 70 29 7b  Height(Expr *p){
47a0: 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d  .  int nHeight =
47b0: 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78   0;.  heightOfEx
47c0: 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48  pr(p->pLeft, &nH
47d0: 65 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74  eight);.  height
47e0: 4f 66 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74  OfExpr(p->pRight
47f0: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 69  , &nHeight);.  i
4800: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
4810: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
4820: 63 74 29 20 29 7b 0a 20 20 20 20 68 65 69 67 68  ct) ){.    heigh
4830: 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 78 2e 70  tOfSelect(p->x.p
4840: 53 65 6c 65 63 74 2c 20 26 6e 48 65 69 67 68 74  Select, &nHeight
4850: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
4860: 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20  ->x.pList ){.   
4870: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
4880: 74 28 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e  t(p->x.pList, &n
4890: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 70 2d 3e  Height);.    p->
48a0: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70  flags |= EP_Prop
48b0: 61 67 61 74 65 20 26 20 73 71 6c 69 74 65 33 45  agate & sqlite3E
48c0: 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e  xprListFlags(p->
48d0: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20  x.pList);.  }.  
48e0: 70 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e 48 65  p->nHeight = nHe
48f0: 69 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a  ight + 1;.}../*.
4900: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e  ** Set the Expr.
4910: 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65  nHeight variable
4920: 20 75 73 69 6e 67 20 74 68 65 20 65 78 70 72 53   using the exprS
4930: 65 74 48 65 69 67 68 74 28 29 20 66 75 6e 63 74  etHeight() funct
4940: 69 6f 6e 2e 20 49 66 0a 2a 2a 20 74 68 65 20 68  ion. If.** the h
4950: 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72  eight is greater
4960: 20 74 68 61 6e 20 74 68 65 20 6d 61 78 69 6d 75   than the maximu
4970: 6d 20 61 6c 6c 6f 77 65 64 20 65 78 70 72 65 73  m allowed expres
4980: 73 69 6f 6e 20 64 65 70 74 68 2c 0a 2a 2a 20 6c  sion depth,.** l
4990: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  eave an error in
49a0: 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 41   pParse..**.** A
49b0: 6c 73 6f 20 70 72 6f 70 61 67 61 74 65 20 61 6c  lso propagate al
49c0: 6c 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66  l EP_Propagate f
49d0: 6c 61 67 73 20 66 72 6f 6d 20 74 68 65 20 45 78  lags from the Ex
49e0: 70 72 2e 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a  pr.x.pList into.
49f0: 2a 2a 20 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a  ** Expr.flags. .
4a00: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
4a10: 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46  xprSetHeightAndF
4a20: 6c 61 67 73 28 50 61 72 73 65 20 2a 70 50 61 72  lags(Parse *pPar
4a30: 73 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  se, Expr *p){.  
4a40: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
4a50: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 65 78 70   ) return;.  exp
4a60: 72 53 65 74 48 65 69 67 68 74 28 70 29 3b 0a 20  rSetHeight(p);. 
4a70: 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
4a80: 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20  kHeight(pParse, 
4a90: 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 7d 0a 0a  p->nHeight);.}..
4aa0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
4ab0: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20   maximum height 
4ac0: 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  of any expressio
4ad0: 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65  n tree reference
4ae0: 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c 65  d.** by the sele
4af0: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  ct statement pas
4b00: 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
4b10: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
4b20: 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67  e3SelectExprHeig
4b30: 68 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  ht(Select *p){. 
4b40: 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30   int nHeight = 0
4b50: 3b 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65  ;.  heightOfSele
4b60: 63 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29 3b  ct(p, &nHeight);
4b70: 0a 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67 68  .  return nHeigh
4b80: 74 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 41 42  t;.}.#else /* AB
4b90: 4f 56 45 3a 20 20 48 65 69 67 68 74 20 65 6e 66  OVE:  Height enf
4ba0: 6f 72 63 65 6d 65 6e 74 20 65 6e 61 62 6c 65 64  orcement enabled
4bb0: 2e 20 20 42 45 4c 4f 57 3a 20 48 65 69 67 68 74  .  BELOW: Height
4bc0: 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 6f 66 66   enforcement off
4bd0: 20 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 70 61 67   */./*.** Propag
4be0: 61 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61  ate all EP_Propa
4bf0: 67 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d 20  gate flags from 
4c00: 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74  the Expr.x.pList
4c10: 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c   into.** Expr.fl
4c20: 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  ags. .*/.void sq
4c30: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
4c40: 68 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73 65  htAndFlags(Parse
4c50: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
4c60: 70 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 70  p){.  if( p && p
4c70: 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 21 45 78  ->x.pList && !Ex
4c80: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
4c90: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
4ca0: 7b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c  {.    p->flags |
4cb0: 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26  = EP_Propagate &
4cc0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
4cd0: 46 6c 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74  Flags(p->x.pList
4ce0: 29 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65  );.  }.}.#define
4cf0: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 79   exprSetHeight(y
4d00: 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ).#endif /* SQLI
4d10: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
4d20: 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  H>0 */../*.** Th
4d30: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
4d40: 65 20 63 6f 72 65 20 61 6c 6c 6f 63 61 74 6f 72  e core allocator
4d50: 20 66 6f 72 20 45 78 70 72 20 6e 6f 64 65 73 2e   for Expr nodes.
4d60: 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  .**.** Construct
4d70: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
4d80: 6e 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72  n node and retur
4d90: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  n a pointer to i
4da0: 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f  t.  Memory.** fo
4db0: 72 20 74 68 69 73 20 6e 6f 64 65 20 61 6e 64 20  r this node and 
4dc0: 66 6f 72 20 74 68 65 20 70 54 6f 6b 65 6e 20 61  for the pToken a
4dd0: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 73 69 6e  rgument is a sin
4de0: 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  gle allocation.*
4df0: 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  * obtained from 
4e00: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28  sqlite3DbMalloc(
4e10: 29 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  ).  The calling 
4e20: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72  function.** is r
4e30: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d  esponsible for m
4e40: 61 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e  aking sure the n
4e50: 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67  ode eventually g
4e60: 65 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a  ets freed..**.**
4e70: 20 49 66 20 64 65 71 75 6f 74 65 20 69 73 20 74   If dequote is t
4e80: 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 74 6f  rue, then the to
4e90: 6b 65 6e 20 28 69 66 20 69 74 20 65 78 69 73 74  ken (if it exist
4ea0: 73 29 20 69 73 20 64 65 71 75 6f 74 65 64 2e 0a  s) is dequoted..
4eb0: 2a 2a 20 49 66 20 64 65 71 75 6f 74 65 20 69 73  ** If dequote is
4ec0: 20 66 61 6c 73 65 2c 20 6e 6f 20 64 65 71 75 6f   false, no dequo
4ed0: 74 69 6e 67 20 69 73 20 70 65 72 66 6f 72 6d 65  ting is performe
4ee0: 64 2e 20 20 54 68 65 20 64 65 51 75 6f 74 65 0a  d.  The deQuote.
4ef0: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
4f00: 69 67 6e 6f 72 65 64 20 69 66 20 70 54 6f 6b 65  ignored if pToke
4f10: 6e 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20  n is NULL or if 
4f20: 74 68 65 20 74 6f 6b 65 6e 20 64 6f 65 73 20 6e  the token does n
4f30: 6f 74 0a 2a 2a 20 61 70 70 65 61 72 20 74 6f 20  ot.** appear to 
4f40: 62 65 20 71 75 6f 74 65 64 2e 20 20 49 66 20 74  be quoted.  If t
4f50: 68 65 20 71 75 6f 74 65 73 20 77 65 72 65 20 6f  he quotes were o
4f60: 66 20 74 68 65 20 66 6f 72 6d 20 22 2e 2e 2e 22  f the form "..."
4f70: 20 28 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 29   (double-quotes)
4f80: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 45 50 5f  .** then the EP_
4f90: 44 62 6c 51 75 6f 74 65 64 20 66 6c 61 67 20 69  DblQuoted flag i
4fa0: 73 20 73 65 74 20 6f 6e 20 74 68 65 20 65 78 70  s set on the exp
4fb0: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a  ression node..**
4fc0: 0a 2a 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65  .** Special case
4fd0: 3a 20 20 49 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54  :  If op==TK_INT
4fe0: 45 47 45 52 20 61 6e 64 20 70 54 6f 6b 65 6e 20  EGER and pToken 
4ff0: 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69  points to a stri
5000: 6e 67 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62  ng that.** can b
5010: 65 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74  e translated int
5020: 6f 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  o a 32-bit integ
5030: 65 72 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b  er, then the tok
5040: 65 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f  en is not.** sto
5050: 72 65 64 20 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e  red in u.zToken.
5060: 20 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 69    Instead, the i
5070: 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 69 73  nteger values is
5080: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
5090: 20 75 2e 69 56 61 6c 75 65 20 61 6e 64 20 74 68   u.iValue and th
50a0: 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c  e EP_IntValue fl
50b0: 61 67 20 69 73 20 73 65 74 2e 20 20 4e 6f 20 65  ag is set.  No e
50c0: 78 74 72 61 20 73 74 6f 72 61 67 65 0a 2a 2a 20  xtra storage.** 
50d0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  is allocated to 
50e0: 68 6f 6c 64 20 74 68 65 20 69 6e 74 65 67 65 72  hold the integer
50f0: 20 74 65 78 74 20 61 6e 64 20 74 68 65 20 64 65   text and the de
5100: 71 75 6f 74 65 20 66 6c 61 67 20 69 73 20 69 67  quote flag is ig
5110: 6e 6f 72 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  nored..*/.Expr *
5120: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
5130: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
5140: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
5150: 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65  andle for sqlite
5160: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20  3DbMallocZero() 
5170: 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f  (may be null) */
5180: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
5190: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
51a0: 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20  pression opcode 
51b0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e  */.  const Token
51c0: 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 2f 2a 20   *pToken,    /* 
51d0: 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20  Token argument. 
51e0: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
51f0: 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20  /.  int dequote 
5200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
5210: 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20 2a  rue to dequote *
5220: 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  /.){.  Expr *pNe
5230: 77 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  w;.  int nExtra 
5240: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56 61 6c 75  = 0;.  int iValu
5250: 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  e = 0;..  assert
5260: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( db!=0 );.  if(
5270: 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69   pToken ){.    i
5280: 66 28 20 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45  f( op!=TK_INTEGE
5290: 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d  R || pToken->z==
52a0: 30 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73  0.          || s
52b0: 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 70  qlite3GetInt32(p
52c0: 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56 61 6c 75  Token->z, &iValu
52d0: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  e)==0 ){.      n
52e0: 45 78 74 72 61 20 3d 20 70 54 6f 6b 65 6e 2d 3e  Extra = pToken->
52f0: 6e 2b 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  n+1;.      asser
5300: 74 28 20 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a  t( iValue>=0 );.
5310: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77      }.  }.  pNew
5320: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
5330: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
5340: 6f 66 28 45 78 70 72 29 2b 6e 45 78 74 72 61 29  of(Expr)+nExtra)
5350: 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ;.  if( pNew ){.
5360: 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c      memset(pNew,
5370: 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29   0, sizeof(Expr)
5380: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20  );.    pNew->op 
5390: 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e  = (u8)op;.    pN
53a0: 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20  ew->iAgg = -1;. 
53b0: 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b     if( pToken ){
53c0: 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78 74 72  .      if( nExtr
53d0: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  a==0 ){.        
53e0: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pNew->flags |= E
53f0: 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20  P_IntValue;.    
5400: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c      pNew->u.iVal
5410: 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20  ue = iValue;.   
5420: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5430: 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e    pNew->u.zToken
5440: 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b   = (char*)&pNew[
5450: 31 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  1];.        asse
5460: 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30  rt( pToken->z!=0
5470: 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30   || pToken->n==0
5480: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
5490: 70 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63  pToken->n ) memc
54a0: 70 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65  py(pNew->u.zToke
54b0: 6e 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54  n, pToken->z, pT
54c0: 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20  oken->n);.      
54d0: 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e    pNew->u.zToken
54e0: 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b  [pToken->n] = 0;
54f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 65 71  .        if( deq
5500: 75 6f 74 65 20 26 26 20 73 71 6c 69 74 65 33 49  uote && sqlite3I
5510: 73 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a  squote(pNew->u.z
5520: 54 6f 6b 65 6e 5b 30 5d 29 20 29 7b 0a 20 20 20  Token[0]) ){.   
5530: 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d         if( pNew-
5540: 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 22  >u.zToken[0]=='"
5550: 27 20 29 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20  ' ) pNew->flags 
5560: 7c 3d 20 45 50 5f 44 62 6c 51 75 6f 74 65 64 3b  |= EP_DblQuoted;
5570: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
5580: 65 33 44 65 71 75 6f 74 65 28 70 4e 65 77 2d 3e  e3Dequote(pNew->
5590: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
55a0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
55b0: 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41   }.#if SQLITE_MA
55c0: 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20  X_EXPR_DEPTH>0. 
55d0: 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67 68 74     pNew->nHeight
55e0: 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20 0a 20   = 1;.#endif  . 
55f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
5600: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
5610: 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65 73  ate a new expres
5620: 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d 20 61  sion node from a
5630: 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64   zero-terminated
5640: 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61 73 0a   token that has.
5650: 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ** already been 
5660: 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78 70  dequoted..*/.Exp
5670: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28 0a  r *sqlite3Expr(.
5680: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
5690: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
56a0: 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33 44  dle for sqlite3D
56b0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28 6d  bMallocZero() (m
56c0: 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20  ay be null) */. 
56d0: 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
56e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
56f0: 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f  ession opcode */
5700: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5710: 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20 54 6f  Token      /* To
5720: 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d  ken argument.  M
5730: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
5740: 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a 20 20  ){.  Token x;.  
5750: 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20 20  x.z = zToken;.  
5760: 78 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20 3f 20 73  x.n = zToken ? s
5770: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
5780: 54 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20 20 72 65  Token) : 0;.  re
5790: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
57a0: 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26 78  Alloc(db, op, &x
57b0: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  , 0);.}../*.** A
57c0: 74 74 61 63 68 20 73 75 62 74 72 65 65 73 20 70  ttach subtrees p
57d0: 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 20  Left and pRight 
57e0: 74 6f 20 74 68 65 20 45 78 70 72 20 6e 6f 64 65  to the Expr node
57f0: 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66   pRoot..**.** If
5800: 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68 61   pRoot==NULL tha
5810: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20 6d  t means that a m
5820: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
5830: 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
5840: 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20  red..** In that 
5850: 63 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65  case, delete the
5860: 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74 20   subtrees pLeft 
5870: 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a 76  and pRight..*/.v
5880: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
5890: 74 74 61 63 68 53 75 62 74 72 65 65 73 28 0a 20  ttachSubtrees(. 
58a0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
58b0: 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20 45  Expr *pRoot,.  E
58c0: 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45 78  xpr *pLeft,.  Ex
58d0: 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20  pr *pRight.){.  
58e0: 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b 0a  if( pRoot==0 ){.
58f0: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
5900: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
5910: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
5920: 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29  elete(db, pLeft)
5930: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
5940: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67  rDelete(db, pRig
5950: 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ht);.  }else{.  
5960: 20 20 69 66 28 20 70 52 69 67 68 74 20 29 7b 0a    if( pRight ){.
5970: 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52 69        pRoot->pRi
5980: 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  ght = pRight;.  
5990: 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73      pRoot->flags
59a0: 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65   |= EP_Propagate
59b0: 20 26 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73   & pRight->flags
59c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
59d0: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 70  pLeft ){.      p
59e0: 52 6f 6f 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c  Root->pLeft = pL
59f0: 65 66 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74  eft;.      pRoot
5a00: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72  ->flags |= EP_Pr
5a10: 6f 70 61 67 61 74 65 20 26 20 70 4c 65 66 74 2d  opagate & pLeft-
5a20: 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20  >flags;.    }.  
5a30: 20 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28    exprSetHeight(
5a40: 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pRoot);.  }.}../
5a50: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
5a60: 20 45 78 70 72 20 6e 6f 64 65 20 77 68 69 63 68   Expr node which
5a70: 20 6a 6f 69 6e 73 20 61 73 20 6d 61 6e 79 20 61   joins as many a
5a80: 73 20 74 77 6f 20 73 75 62 74 72 65 65 73 2e 0a  s two subtrees..
5a90: 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f 74  **.** One or bot
5aa0: 68 20 6f 66 20 74 68 65 20 73 75 62 74 72 65 65  h of the subtree
5ab0: 73 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 20  s can be NULL.  
5ac0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
5ad0: 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 45   to the new.** E
5ae0: 78 70 72 20 6e 6f 64 65 2e 20 20 4f 72 2c 20 69  xpr node.  Or, i
5af0: 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f  f an OOM error o
5b00: 63 63 75 72 73 2c 20 73 65 74 20 70 50 61 72 73  ccurs, set pPars
5b10: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
5b20: 6c 65 64 2c 0a 2a 2a 20 66 72 65 65 20 74 68 65  led,.** free the
5b30: 20 73 75 62 74 72 65 65 73 20 61 6e 64 20 72 65   subtrees and re
5b40: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78  turn NULL..*/.Ex
5b50: 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70 72  pr *sqlite3PExpr
5b60: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
5b70: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
5b80: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
5b90: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
5ba0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
5bb0: 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65  xpression opcode
5bc0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
5bd0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
5be0: 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   Left operand */
5bf0: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
5c00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69             /* Ri
5c10: 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  ght operand */. 
5c20: 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54   const Token *pT
5c30: 6f 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72 67 75  oken     /* Argu
5c40: 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b  ment token */.){
5c50: 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 69 66  .  Expr *p;.  if
5c60: 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 26 26 20  ( op==TK_AND && 
5c70: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
5c80: 29 7b 0a 20 20 20 20 2f 2a 20 54 61 6b 65 20 61  ){.    /* Take a
5c90: 64 76 61 6e 74 61 67 65 20 6f 66 20 73 68 6f 72  dvantage of shor
5ca0: 74 2d 63 69 72 63 75 69 74 20 66 61 6c 73 65 20  t-circuit false 
5cb0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72  optimization for
5cc0: 20 41 4e 44 20 2a 2f 0a 20 20 20 20 70 20 3d 20   AND */.    p = 
5cd0: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70  sqlite3ExprAnd(p
5ce0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 66 74  Parse->db, pLeft
5cf0: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c  , pRight);.  }el
5d00: 73 65 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69  se{.    p = sqli
5d10: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61  te3ExprAlloc(pPa
5d20: 72 73 65 2d 3e 64 62 2c 20 6f 70 20 26 20 54 4b  rse->db, op & TK
5d30: 46 4c 47 5f 4d 41 53 4b 2c 20 70 54 6f 6b 65 6e  FLG_MASK, pToken
5d40: 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
5d50: 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72  3ExprAttachSubtr
5d60: 65 65 73 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ees(pParse->db, 
5d70: 70 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  p, pLeft, pRight
5d80: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 20 29  );.  }.  if( p )
5d90: 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   {.    sqlite3Ex
5da0: 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70 50  prCheckHeight(pP
5db0: 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74  arse, p->nHeight
5dc0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
5dd0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  p;.}../*.** Add 
5de0: 70 53 65 6c 65 63 74 20 74 6f 20 74 68 65 20 45  pSelect to the E
5df0: 78 70 72 2e 78 2e 70 53 65 6c 65 63 74 20 66 69  xpr.x.pSelect fi
5e00: 65 6c 64 2e 20 20 4f 72 2c 20 69 66 20 70 45 78  eld.  Or, if pEx
5e10: 70 72 20 69 73 20 4e 55 4c 4c 20 28 64 75 65 0a  pr is NULL (due.
5e20: 2a 2a 20 64 6f 20 61 20 6d 65 6d 6f 72 79 20 61  ** do a memory a
5e30: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72  llocation failur
5e40: 65 29 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74  e) then delete t
5e50: 68 65 20 70 53 65 6c 65 63 74 20 6f 62 6a 65 63  he pSelect objec
5e60: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
5e70: 65 33 50 45 78 70 72 41 64 64 53 65 6c 65 63 74  e3PExprAddSelect
5e80: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
5e90: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 53 65 6c  Expr *pExpr, Sel
5ea0: 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
5eb0: 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20   if( pExpr ){.  
5ec0: 20 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65    pExpr->x.pSele
5ed0: 63 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20  ct = pSelect;.  
5ee0: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
5ef0: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
5f00: 65 6c 65 63 74 7c 45 50 5f 53 75 62 71 75 65 72  elect|EP_Subquer
5f10: 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  y);.    sqlite3E
5f20: 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46  xprSetHeightAndF
5f30: 6c 61 67 73 28 70 50 61 72 73 65 2c 20 70 45 78  lags(pParse, pEx
5f40: 70 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  pr);.  }else{.  
5f50: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
5f60: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
5f70: 65 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ed );.    sqlite
5f80: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 50  3SelectDelete(pP
5f90: 61 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c 65 63  arse->db, pSelec
5fa0: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  t);.  }.}.../*.*
5fb0: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
5fc0: 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 65 69  ion is always ei
5fd0: 74 68 65 72 20 54 52 55 45 20 6f 72 20 46 41 4c  ther TRUE or FAL
5fe0: 53 45 20 28 72 65 73 70 65 63 74 69 76 65 6c 79  SE (respectively
5ff0: 29 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  ),.** then retur
6000: 6e 20 31 2e 20 20 49 66 20 6f 6e 65 20 63 61 6e  n 1.  If one can
6010: 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 74 68  not determine th
6020: 65 20 74 72 75 74 68 20 76 61 6c 75 65 20 6f 66  e truth value of
6030: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
6040: 6f 6e 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  on at compile-ti
6050: 6d 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a  me return 0..**.
6060: 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70  ** This is an op
6070: 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 66 20  timization.  If 
6080: 69 73 20 4f 4b 20 74 6f 20 72 65 74 75 72 6e 20  is OK to return 
6090: 30 20 68 65 72 65 20 65 76 65 6e 20 69 66 0a 2a  0 here even if.*
60a0: 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * the expression
60b0: 20 72 65 61 6c 6c 79 20 69 73 20 61 6c 77 61 79   really is alway
60c0: 73 20 66 61 6c 73 65 20 6f 72 20 66 61 6c 73 65  s false or false
60d0: 20 28 61 20 66 61 6c 73 65 20 6e 65 67 61 74 69   (a false negati
60e0: 76 65 29 2e 0a 2a 2a 20 42 75 74 20 69 74 20 69  ve)..** But it i
60f0: 73 20 61 20 62 75 67 20 74 6f 20 72 65 74 75 72  s a bug to retur
6100: 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65  n 1 if the expre
6110: 73 73 69 6f 6e 20 6d 69 67 68 74 20 68 61 76 65  ssion might have
6120: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 62 6f   different.** bo
6130: 6f 6c 65 61 6e 20 76 61 6c 75 65 73 20 69 6e 20  olean values in 
6140: 64 69 66 66 65 72 65 6e 74 20 63 69 72 63 75 6d  different circum
6150: 73 74 61 6e 63 65 73 20 28 61 20 66 61 6c 73 65  stances (a false
6160: 20 70 6f 73 69 74 69 76 65 2e 29 0a 2a 2a 0a 2a   positive.).**.*
6170: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 74  * Note that if t
6180: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
6190: 20 70 61 72 74 20 6f 66 20 63 6f 6e 64 69 74 69   part of conditi
61a0: 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a 2a 20 4c 45  onal for a.** LE
61b0: 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 77 65  FT JOIN, then we
61c0: 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e   cannot determin
61d0: 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  e at compile-tim
61e0: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
61f0: 0a 2a 2a 20 69 73 20 69 74 20 74 72 75 65 20 6f  .** is it true o
6200: 72 20 66 61 6c 73 65 2c 20 73 6f 20 61 6c 77 61  r false, so alwa
6210: 79 73 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  ys return 0..*/.
6220: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 41  static int exprA
6230: 6c 77 61 79 73 54 72 75 65 28 45 78 70 72 20 2a  lwaysTrue(Expr *
6240: 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b  p){.  int v = 0;
6250: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
6260: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
6270: 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20  mJoin) ) return 
6280: 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  0;.  if( !sqlite
6290: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
62a0: 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e 20 30  , &v) ) return 0
62b0: 3b 0a 20 20 72 65 74 75 72 6e 20 76 21 3d 30 3b  ;.  return v!=0;
62c0: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  .}.static int ex
62d0: 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 45 78  prAlwaysFalse(Ex
62e0: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20  pr *p){.  int v 
62f0: 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48  = 0;.  if( ExprH
6300: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
6310: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74  _FromJoin) ) ret
6320: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
6330: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
6340: 65 72 28 70 2c 20 26 76 29 20 29 20 72 65 74 75  er(p, &v) ) retu
6350: 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 76  rn 0;.  return v
6360: 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f  ==0;.}../*.** Jo
6370: 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  in two expressio
6380: 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e 44 20  ns using an AND 
6390: 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 65 69  operator.  If ei
63a0: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ther expression 
63b0: 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e  is.** NULL, then
63c0: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68 65   just return the
63d0: 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f   other expressio
63e0: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20  n..**.** If one 
63f0: 73 69 64 65 20 6f 72 20 74 68 65 20 6f 74 68 65  side or the othe
6400: 72 20 6f 66 20 74 68 65 20 41 4e 44 20 69 73 20  r of the AND is 
6410: 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66 61 6c 73  known to be fals
6420: 65 2c 20 74 68 65 6e 20 69 6e 73 74 65 61 64 0a  e, then instead.
6430: 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69 6e 67 20  ** of returning 
6440: 61 6e 20 41 4e 44 20 65 78 70 72 65 73 73 69 6f  an AND expressio
6450: 6e 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20 61  n, just return a
6460: 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73   constant expres
6470: 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 61 20 76  sion with.** a v
6480: 61 6c 75 65 20 6f 66 20 66 61 6c 73 65 2e 0a 2a  alue of false..*
6490: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
64a0: 78 70 72 41 6e 64 28 73 71 6c 69 74 65 33 20 2a  xprAnd(sqlite3 *
64b0: 64 62 2c 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  db, Expr *pLeft,
64c0: 20 45 78 70 72 20 2a 70 52 69 67 68 74 29 7b 0a   Expr *pRight){.
64d0: 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20 29    if( pLeft==0 )
64e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 52 69  {.    return pRi
64f0: 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ght;.  }else if(
6500: 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20   pRight==0 ){.  
6510: 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a    return pLeft;.
6520: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72    }else if( expr
6530: 41 6c 77 61 79 73 46 61 6c 73 65 28 70 4c 65 66  AlwaysFalse(pLef
6540: 74 29 20 7c 7c 20 65 78 70 72 41 6c 77 61 79 73  t) || exprAlways
6550: 46 61 6c 73 65 28 70 52 69 67 68 74 29 20 29 7b  False(pRight) ){
6560: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
6570: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74  Delete(db, pLeft
6580: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
6590: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69  prDelete(db, pRi
65a0: 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ght);.    return
65b0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
65c0: 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52  c(db, TK_INTEGER
65d0: 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b  , &sqlite3IntTok
65e0: 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20 20 7d 65  ens[0], 0);.  }e
65f0: 6c 73 65 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  lse{.    Expr *p
6600: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
6610: 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 41 4e  rAlloc(db, TK_AN
6620: 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  D, 0, 0);.    sq
6630: 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53  lite3ExprAttachS
6640: 75 62 74 72 65 65 73 28 64 62 2c 20 70 4e 65 77  ubtrees(db, pNew
6650: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29  , pLeft, pRight)
6660: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4e 65  ;.    return pNe
6670: 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  w;.  }.}../*.** 
6680: 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20  Construct a new 
6690: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
66a0: 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 77  for a function w
66b0: 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  ith multiple.** 
66c0: 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78  arguments..*/.Ex
66d0: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46  pr *sqlite3ExprF
66e0: 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  unction(Parse *p
66f0: 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74 20  Parse, ExprList 
6700: 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
6710: 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a  Token){.  Expr *
6720: 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74 65 33 20  pNew;.  sqlite3 
6730: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
6740: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b  ;.  assert( pTok
6750: 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  en );.  pNew = s
6760: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
6770: 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 2c  db, TK_FUNCTION,
6780: 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20 69   pToken, 1);.  i
6790: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
67a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
67b0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
67c0: 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6d 65 6d  t); /* Avoid mem
67d0: 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e 20 6d 61  ory leak when ma
67e0: 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20  lloc fails */.  
67f0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
6800: 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20    pNew->x.pList 
6810: 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73 73 65 72  = pList;.  asser
6820: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
6830: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49 73  rty(pNew, EP_xIs
6840: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 73 71 6c  Select) );.  sql
6850: 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68  ite3ExprSetHeigh
6860: 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73 65  tAndFlags(pParse
6870: 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72  , pNew);.  retur
6880: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
6890: 20 41 73 73 69 67 6e 20 61 20 76 61 72 69 61 62   Assign a variab
68a0: 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20  le number to an 
68b0: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
68c0: 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63 61  encodes a wildca
68d0: 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69  rd.** in the ori
68e0: 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  ginal SQL statem
68f0: 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c  ent.  .**.** Wil
6900: 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69 6e  dcards consistin
6910: 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22 3f  g of a single "?
6920: 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  " are assigned t
6930: 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69  he next sequenti
6940: 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e  al.** variable n
6950: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c  umber..**.** Wil
6960: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
6970: 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73  rm "?nnn" are as
6980: 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62 65  signed the numbe
6990: 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b  r "nnn".  We mak
69a0: 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20  e.** sure "nnn" 
69b0: 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65 20 74 6f  is not too be to
69c0: 20 61 76 6f 69 64 20 61 20 64 65 6e 69 61 6c 20   avoid a denial 
69d0: 6f 66 20 73 65 72 76 69 63 65 20 61 74 74 61 63  of service attac
69e0: 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51  k when.** the SQ
69f0: 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65  L statement come
6a00: 73 20 66 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e  s from an extern
6a10: 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a  al source..**.**
6a20: 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68   Wildcards of th
6a30: 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 2c 20 22  e form ":aaa", "
6a40: 40 61 61 61 22 2c 20 6f 72 20 22 24 61 61 61 22  @aaa", or "$aaa"
6a50: 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68   are assigned th
6a60: 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a  e same number.**
6a70: 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73   as the previous
6a80: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
6a90: 20 73 61 6d 65 20 77 69 6c 64 63 61 72 64 2e 20   same wildcard. 
6aa0: 20 4f 72 20 69 66 20 74 68 69 73 20 69 73 20 74   Or if this is t
6ab0: 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74  he first.** inst
6ac0: 61 6e 63 65 20 6f 66 20 74 68 65 20 77 69 6c 64  ance of the wild
6ad0: 63 61 72 64 2c 20 74 68 65 20 6e 65 78 74 20 73  card, the next s
6ae0: 65 71 75 65 6e 74 69 61 6c 20 76 61 72 69 61 62  equential variab
6af0: 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20  le number is.** 
6b00: 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69  assigned..*/.voi
6b10: 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 73 73  d sqlite3ExprAss
6b20: 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50 61 72  ignVarNumber(Par
6b30: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
6b40: 20 2a 70 45 78 70 72 29 7b 0a 20 20 73 71 6c 69   *pExpr){.  sqli
6b50: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
6b60: 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68  ->db;.  const ch
6b70: 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 45  ar *z;..  if( pE
6b80: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
6b90: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
6ba0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
6bb0: 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45  r, EP_IntValue|E
6bc0: 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b  P_Reduced|EP_Tok
6bd0: 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d  enOnly) );.  z =
6be0: 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
6bf0: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30  ;.  assert( z!=0
6c00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 5b   );.  assert( z[
6c10: 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a  0]!=0 );.  if( z
6c20: 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  [1]==0 ){.    /*
6c30: 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65   Wildcard of the
6c40: 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73 69   form "?".  Assi
6c50: 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72 69  gn the next vari
6c60: 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  able number */. 
6c70: 20 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d     assert( z[0]=
6c80: 3d 27 3f 27 20 29 3b 0a 20 20 20 20 70 45 78 70  ='?' );.    pExp
6c90: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e  r->iColumn = (yn
6ca0: 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e  Var)(++pParse->n
6cb0: 56 61 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Var);.  }else{. 
6cc0: 20 20 20 79 6e 56 61 72 20 78 20 3d 20 30 3b 0a     ynVar x = 0;.
6cd0: 20 20 20 20 75 33 32 20 6e 20 3d 20 73 71 6c 69      u32 n = sqli
6ce0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a  te3Strlen30(z);.
6cf0: 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f      if( z[0]=='?
6d00: 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69  ' ){.      /* Wi
6d10: 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f  ldcard of the fo
6d20: 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76  rm "?nnn".  Conv
6d30: 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20  ert "nnn" to an 
6d40: 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20 20 20  integer and.    
6d50: 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20 74    ** use it as t
6d60: 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  he variable numb
6d70: 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20  er */.      i64 
6d80: 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f 6b  i;.      int bOk
6d90: 20 3d 20 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f   = 0==sqlite3Ato
6da0: 69 36 34 28 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e  i64(&z[1], &i, n
6db0: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  -1, SQLITE_UTF8)
6dc0: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  ;.      pExpr->i
6dd0: 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e  Column = x = (yn
6de0: 56 61 72 29 69 3b 0a 20 20 20 20 20 20 74 65 73  Var)i;.      tes
6df0: 74 63 61 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20  tcase( i==0 );. 
6e00: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
6e10: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==1 );.      tes
6e20: 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c  tcase( i==db->aL
6e30: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
6e40: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
6e50: 52 5d 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65  R]-1 );.      te
6e60: 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61  stcase( i==db->a
6e70: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
6e80: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
6e90: 45 52 5d 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ER] );.      if(
6ea0: 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c   bOk==0 || i<1 |
6eb0: 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  | i>db->aLimit[S
6ec0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
6ed0: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a  ABLE_NUMBER] ){.
6ee0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
6ef0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
6f00: 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72  "variable number
6f10: 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
6f20: 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20   ?1 and ?%d",.  
6f30: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 4c            db->aL
6f40: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
6f50: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
6f60: 52 5d 29 3b 0a 20 20 20 20 20 20 20 20 78 20 3d  R]);.        x =
6f70: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
6f80: 20 20 69 66 28 20 69 3e 70 50 61 72 73 65 2d 3e    if( i>pParse->
6f90: 6e 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20  nVar ){.        
6fa0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 28  pParse->nVar = (
6fb0: 69 6e 74 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20  int)i;.      }. 
6fc0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6fd0: 2f 2a 20 57 69 6c 64 63 61 72 64 73 20 6c 69 6b  /* Wildcards lik
6fe0: 65 20 22 3a 61 61 61 22 2c 20 22 24 61 61 61 22  e ":aaa", "$aaa"
6ff0: 20 6f 72 20 22 40 61 61 61 22 2e 20 20 52 65 75   or "@aaa".  Reu
7000: 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69  se the same vari
7010: 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75  able.      ** nu
7020: 6d 62 65 72 20 61 73 20 74 68 65 20 70 72 69 6f  mber as the prio
7030: 72 20 61 70 70 65 61 72 61 6e 63 65 20 6f 66 20  r appearance of 
7040: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f  the same name, o
7050: 72 20 69 66 20 74 68 65 20 6e 61 6d 65 0a 20 20  r if the name.  
7060: 20 20 20 20 2a 2a 20 68 61 73 20 6e 65 76 65 72      ** has never
7070: 20 61 70 70 65 61 72 65 64 20 62 65 66 6f 72 65   appeared before
7080: 2c 20 72 65 75 73 65 20 74 68 65 20 73 61 6d 65  , reuse the same
7090: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
70a0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
70b0: 79 6e 56 61 72 20 69 3b 0a 20 20 20 20 20 20 66  ynVar i;.      f
70c0: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
70d0: 2d 3e 6e 7a 56 61 72 3b 20 69 2b 2b 29 7b 0a 20  ->nzVar; i++){. 
70e0: 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73         if( pPars
70f0: 65 2d 3e 61 7a 56 61 72 5b 69 5d 20 26 26 20 73  e->azVar[i] && s
7100: 74 72 63 6d 70 28 70 50 61 72 73 65 2d 3e 61 7a  trcmp(pParse->az
7110: 56 61 72 5b 69 5d 2c 7a 29 3d 3d 30 20 29 7b 0a  Var[i],z)==0 ){.
7120: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
7130: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20 28  >iColumn = x = (
7140: 79 6e 56 61 72 29 69 2b 31 3b 0a 20 20 20 20 20  ynVar)i+1;.     
7150: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7160: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
7170: 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29 20 78      if( x==0 ) x
7180: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
7190: 6e 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50  n = (ynVar)(++pP
71a0: 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 20  arse->nVar);.   
71b0: 20 7d 0a 20 20 20 20 69 66 28 20 78 3e 30 20 29   }.    if( x>0 )
71c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 78 3e 70 50  {.      if( x>pP
71d0: 61 72 73 65 2d 3e 6e 7a 56 61 72 20 29 7b 0a 20  arse->nzVar ){. 
71e0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 2a 61 3b         char **a;
71f0: 0a 20 20 20 20 20 20 20 20 61 20 3d 20 73 71 6c  .        a = sql
7200: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
7210: 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c  , pParse->azVar,
7220: 20 78 2a 73 69 7a 65 6f 66 28 61 5b 30 5d 29 29   x*sizeof(a[0]))
7230: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 3d  ;.        if( a=
7240: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
7250: 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
7260: 6f 63 46 61 69 6c 65 64 20 29 3b 20 2f 2a 20 45  ocFailed ); /* E
7270: 72 72 6f 72 20 72 65 70 6f 72 74 65 64 20 74 68  rror reported th
7280: 72 6f 75 67 68 20 6d 61 6c 6c 6f 63 46 61 69 6c  rough mallocFail
7290: 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ed */.          
72a0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
72b0: 7d 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  }.        pParse
72c0: 2d 3e 61 7a 56 61 72 20 3d 20 61 3b 0a 20 20 20  ->azVar = a;.   
72d0: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61 5b 70       memset(&a[p
72e0: 50 61 72 73 65 2d 3e 6e 7a 56 61 72 5d 2c 20 30  Parse->nzVar], 0
72f0: 2c 20 28 78 2d 70 50 61 72 73 65 2d 3e 6e 7a 56  , (x-pParse->nzV
7300: 61 72 29 2a 73 69 7a 65 6f 66 28 61 5b 30 5d 29  ar)*sizeof(a[0])
7310: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
7320: 65 2d 3e 6e 7a 56 61 72 20 3d 20 78 3b 0a 20 20  e->nzVar = x;.  
7330: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
7340: 7a 5b 30 5d 21 3d 27 3f 27 20 7c 7c 20 70 50 61  z[0]!='?' || pPa
7350: 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 3d  rse->azVar[x-1]=
7360: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
7370: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
7380: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d  pParse->azVar[x-
7390: 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  1]);.        pPa
73a0: 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 20  rse->azVar[x-1] 
73b0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
73c0: 75 70 28 64 62 2c 20 7a 2c 20 6e 29 3b 0a 20 20  up(db, z, n);.  
73d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
73e0: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
73f0: 6e 45 72 72 20 26 26 20 70 50 61 72 73 65 2d 3e  nErr && pParse->
7400: 6e 56 61 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  nVar>db->aLimit[
7410: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
7420: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b  IABLE_NUMBER] ){
7430: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
7440: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
7450: 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61 72 69 61  o many SQL varia
7460: 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bles");.  }.}../
7470: 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79  *.** Recursively
7480: 20 64 65 6c 65 74 65 20 61 6e 20 65 78 70 72 65   delete an expre
7490: 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73  ssion tree..*/.s
74a0: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
74b0: 4e 4c 49 4e 45 20 76 6f 69 64 20 73 71 6c 69 74  NLINE void sqlit
74c0: 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 73  e3ExprDeleteNN(s
74d0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
74e0: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
74f0: 70 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 53 61 6e  p!=0 );.  /* San
7500: 69 74 79 20 63 68 65 63 6b 3a 20 41 73 73 65 72  ity check: Asser
7510: 74 20 74 68 61 74 20 74 68 65 20 49 6e 74 56 61  t that the IntVa
7520: 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74  lue is non-negat
7530: 69 76 65 20 69 66 20 69 74 20 65 78 69 73 74 73  ive if it exists
7540: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 45   */.  assert( !E
7550: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
7560: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c  , EP_IntValue) |
7570: 7c 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30  | p->u.iValue>=0
7580: 20 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48   );.  if( !ExprH
7590: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
75a0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
75b0: 20 20 20 2f 2a 20 54 68 65 20 45 78 70 72 2e 78     /* The Expr.x
75c0: 20 75 6e 69 6f 6e 20 69 73 20 6e 65 76 65 72 20   union is never 
75d0: 75 73 65 64 20 61 74 20 74 68 65 20 73 61 6d 65  used at the same
75e0: 20 74 69 6d 65 20 61 73 20 45 78 70 72 2e 70 52   time as Expr.pR
75f0: 69 67 68 74 20 2a 2f 0a 20 20 20 20 61 73 73 65  ight */.    asse
7600: 72 74 28 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d  rt( p->x.pList==
7610: 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d  0 || p->pRight==
7620: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  0 );.    if( p->
7630: 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f  op!=TK_SELECT_CO
7640: 4c 55 4d 4e 20 29 20 73 71 6c 69 74 65 33 45 78  LUMN ) sqlite3Ex
7650: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
7660: 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69  pLeft);.    sqli
7670: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
7680: 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  , p->pRight);.  
7690: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
76a0: 70 65 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54  perty(p, EP_MemT
76b0: 6f 6b 65 6e 29 20 29 20 73 71 6c 69 74 65 33 44  oken) ) sqlite3D
76c0: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 7a  bFree(db, p->u.z
76d0: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 69 66 28 20  Token);.    if( 
76e0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
76f0: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
7700: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7710: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
7720: 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b  , p->x.pSelect);
7730: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7740: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
7750: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78  tDelete(db, p->x
7760: 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  .pList);.    }. 
7770: 20 7d 0a 20 20 69 66 28 20 21 45 78 70 72 48 61   }.  if( !ExprHa
7780: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
7790: 53 74 61 74 69 63 29 20 29 7b 0a 20 20 20 20 73  Static) ){.    s
77a0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
77b0: 20 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20   p);.  }.}.void 
77c0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
77d0: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  e(sqlite3 *db, E
77e0: 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  xpr *p){.  if( p
77f0: 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 44 65   ) sqlite3ExprDe
7800: 6c 65 74 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d  leteNN(db, p);.}
7810: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
7820: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
7830: 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  es allocated for
7840: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
7850: 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 70 61  structure .** pa
7860: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
7870: 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73  t argument. This
7880: 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f   is always one o
7890: 66 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c  f EXPR_FULLSIZE,
78a0: 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55 43 45 44  .** EXPR_REDUCED
78b0: 53 49 5a 45 20 6f 72 20 45 58 50 52 5f 54 4f 4b  SIZE or EXPR_TOK
78c0: 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a 73  ENONLYSIZE..*/.s
78d0: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 53 74  tatic int exprSt
78e0: 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70  ructSize(Expr *p
78f0: 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  ){.  if( ExprHas
7900: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
7910: 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65 74 75  okenOnly) ) retu
7920: 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c  rn EXPR_TOKENONL
7930: 59 53 49 5a 45 3b 0a 20 20 69 66 28 20 45 78 70  YSIZE;.  if( Exp
7940: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
7950: 45 50 5f 52 65 64 75 63 65 64 29 20 29 20 72 65  EP_Reduced) ) re
7960: 74 75 72 6e 20 45 58 50 52 5f 52 45 44 55 43 45  turn EXPR_REDUCE
7970: 44 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20  DSIZE;.  return 
7980: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 7d  EXPR_FULLSIZE;.}
7990: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65  ../*.** The dupe
79a0: 64 45 78 70 72 2a 53 69 7a 65 28 29 20 72 6f 75  dExpr*Size() rou
79b0: 74 69 6e 65 73 20 65 61 63 68 20 72 65 74 75 72  tines each retur
79c0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
79d0: 62 79 74 65 73 20 72 65 71 75 69 72 65 64 0a 2a  bytes required.*
79e0: 2a 20 74 6f 20 73 74 6f 72 65 20 61 20 63 6f 70  * to store a cop
79f0: 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  y of an expressi
7a00: 6f 6e 20 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  on or expression
7a10: 20 74 72 65 65 2e 20 20 54 68 65 79 20 64 69 66   tree.  They dif
7a20: 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75  fer in.** how mu
7a30: 63 68 20 6f 66 20 74 68 65 20 74 72 65 65 20 69  ch of the tree i
7a40: 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a  s measured..**.*
7a50: 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72 53  *     dupedExprS
7a60: 74 72 75 63 74 53 69 7a 65 28 29 20 20 20 20 20  tructSize()     
7a70: 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20 74 68 65  Size of only the
7a80: 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20   Expr structure 
7a90: 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70  .**     dupedExp
7aa0: 72 4e 6f 64 65 53 69 7a 65 28 29 20 20 20 20 20  rNodeSize()     
7ab0: 20 20 53 69 7a 65 20 6f 66 20 45 78 70 72 20 2b    Size of Expr +
7ac0: 20 73 70 61 63 65 20 66 6f 72 20 74 6f 6b 65 6e   space for token
7ad0: 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70  .**     dupedExp
7ae0: 72 53 69 7a 65 28 29 20 20 20 20 20 20 20 20 20  rSize()         
7af0: 20 20 45 78 70 72 20 2b 20 74 6f 6b 65 6e 20 2b    Expr + token +
7b00: 20 73 75 62 74 72 65 65 20 63 6f 6d 70 6f 6e 65   subtree compone
7b10: 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  nts.**.*********
7b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b60: 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 75 70  **.**.** The dup
7b70: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
7b80: 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  () function retu
7b90: 72 6e 73 20 74 77 6f 20 76 61 6c 75 65 73 20 4f  rns two values O
7ba0: 52 2d 65 64 20 74 6f 67 65 74 68 65 72 3a 20 20  R-ed together:  
7bb0: 0a 2a 2a 20 28 31 29 20 74 68 65 20 73 70 61 63  .** (1) the spac
7bc0: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  e required for a
7bd0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70   copy of the Exp
7be0: 72 20 73 74 72 75 63 74 75 72 65 20 6f 6e 6c 79  r structure only
7bf0: 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20 74 68 65   and .** (2) the
7c00: 20 45 50 5f 78 78 78 20 66 6c 61 67 73 20 74 68   EP_xxx flags th
7c10: 61 74 20 69 6e 64 69 63 61 74 65 20 77 68 61 74  at indicate what
7c20: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 73   the structure s
7c30: 69 7a 65 20 73 68 6f 75 6c 64 20 62 65 2e 0a 2a  ize should be..*
7c40: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
7c50: 75 65 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e  ues is always on
7c60: 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  e of:.**.**     
7c70: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a   EXPR_FULLSIZE.*
7c80: 2a 20 20 20 20 20 20 45 58 50 52 5f 52 45 44 55  *      EXPR_REDU
7c90: 43 45 44 53 49 5a 45 20 20 20 7c 20 45 50 5f 52  CEDSIZE   | EP_R
7ca0: 65 64 75 63 65 64 0a 2a 2a 20 20 20 20 20 20 45  educed.**      E
7cb0: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
7cc0: 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  E | EP_TokenOnly
7cd0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20  .**.** The size 
7ce0: 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65  of the structure
7cf0: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79   can be found by
7d00: 20 6d 61 73 6b 69 6e 67 20 74 68 65 20 72 65 74   masking the ret
7d10: 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20  urn value.** of 
7d20: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74  this routine wit
7d30: 68 20 30 78 66 66 66 2e 20 20 54 68 65 20 66 6c  h 0xfff.  The fl
7d40: 61 67 73 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ags can be found
7d50: 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 0a   by masking the.
7d60: 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
7d70: 77 69 74 68 20 45 50 5f 52 65 64 75 63 65 64 7c  with EP_Reduced|
7d80: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a  EP_TokenOnly..**
7d90: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 69  .** Note that wi
7da0: 74 68 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55  th flags==EXPRDU
7db0: 50 5f 52 45 44 55 43 45 2c 20 74 68 69 73 20 72  P_REDUCE, this r
7dc0: 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73 20 6f 6e  outines works on
7dd0: 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75   full-size.** (u
7de0: 6e 72 65 64 75 63 65 64 29 20 45 78 70 72 20 6f  nreduced) Expr o
7df0: 62 6a 65 63 74 73 20 61 73 20 74 68 65 79 20 6f  bjects as they o
7e00: 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e  r originally con
7e10: 73 74 72 75 63 74 65 64 20 62 79 20 74 68 65 20  structed by the 
7e20: 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75 72 69 6e  parser..** Durin
7e30: 67 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61  g expression ana
7e40: 6c 79 73 69 73 2c 20 65 78 74 72 61 20 69 6e 66  lysis, extra inf
7e50: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70  ormation is comp
7e60: 75 74 65 64 20 61 6e 64 20 6d 6f 76 65 64 20 69  uted and moved i
7e70: 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20 70 61 72  nto.** later par
7e80: 74 73 20 6f 66 20 74 65 68 20 45 78 70 72 20 6f  ts of teh Expr o
7e90: 62 6a 65 63 74 20 61 6e 64 20 74 68 61 74 20 65  bject and that e
7ea0: 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  xtra information
7eb0: 20 6d 69 67 68 74 20 67 65 74 20 63 68 6f 70 70   might get chopp
7ec0: 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20 74 68 65  ed.** off if the
7ed0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72   expression is r
7ee0: 65 64 75 63 65 64 2e 20 20 4e 6f 74 65 20 61 6c  educed.  Note al
7ef0: 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  so that it does 
7f00: 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d  not work to.** m
7f10: 61 6b 65 20 61 6e 20 45 58 50 52 44 55 50 5f 52  ake an EXPRDUP_R
7f20: 45 44 55 43 45 20 63 6f 70 79 20 6f 66 20 61 20  EDUCE copy of a 
7f30: 72 65 64 75 63 65 64 20 65 78 70 72 65 73 73 69  reduced expressi
7f40: 6f 6e 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20  on.  It is only 
7f50: 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20 72 65 64 75  legal.** to redu
7f60: 63 65 20 61 20 70 72 69 73 74 69 6e 65 20 65 78  ce a pristine ex
7f70: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 66 72  pression tree fr
7f80: 6f 6d 20 74 68 65 20 70 61 72 73 65 72 2e 20 20  om the parser.  
7f90: 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
7fa0: 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70 65 64 45 78  on.** of dupedEx
7fb0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 63  prStructSize() c
7fc0: 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70 6c 65 20  ontain multiple 
7fd0: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
7fe0: 6e 74 73 20 74 68 61 74 20 61 74 74 65 6d 70 74  nts that attempt
7ff0: 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72 63 65 20 74  .** to enforce t
8000: 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a  his constraint..
8010: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75  */.static int du
8020: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
8030: 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  e(Expr *p, int f
8040: 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 53 69  lags){.  int nSi
8050: 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c  ze;.  assert( fl
8060: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
8070: 55 43 45 20 7c 7c 20 66 6c 61 67 73 3d 3d 30 20  UCE || flags==0 
8080: 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66  ); /* Only one f
8090: 6c 61 67 20 76 61 6c 75 65 20 61 6c 6c 6f 77 65  lag value allowe
80a0: 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 45  d */.  assert( E
80b0: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3c 3d 30 78  XPR_FULLSIZE<=0x
80c0: 66 66 66 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fff );.  assert(
80d0: 20 28 30 78 66 66 66 20 26 20 28 45 50 5f 52 65   (0xfff & (EP_Re
80e0: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
80f0: 6c 79 29 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28  ly))==0 );.  if(
8100: 20 30 3d 3d 66 6c 61 67 73 20 29 7b 0a 20 20 20   0==flags ){.   
8110: 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 46 55   nSize = EXPR_FU
8120: 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c 73 65 7b  LLSIZE;.  }else{
8130: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
8140: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8150: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
8160: 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20  _Reduced) );.   
8170: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
8180: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
8190: 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20 20  FromJoin) ); .  
81a0: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
81b0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
81c0: 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a 20 20  _MemToken) );.  
81d0: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
81e0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
81f0: 5f 4e 6f 52 65 64 75 63 65 29 20 29 3b 0a 20 20  _NoReduce) );.  
8200: 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c    if( p->pLeft |
8210: 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a  | p->x.pList ){.
8220: 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58        nSize = EX
8230: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 7c  PR_REDUCEDSIZE |
8240: 20 45 50 5f 52 65 64 75 63 65 64 3b 0a 20 20 20   EP_Reduced;.   
8250: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
8260: 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d  sert( p->pRight=
8270: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 53 69 7a  =0 );.      nSiz
8280: 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e  e = EXPR_TOKENON
8290: 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65  LYSIZE | EP_Toke
82a0: 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  nOnly;.    }.  }
82b0: 0a 20 20 72 65 74 75 72 6e 20 6e 53 69 7a 65 3b  .  return nSize;
82c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
82d0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
82e0: 74 68 65 20 73 70 61 63 65 20 69 6e 20 62 79 74  the space in byt
82f0: 65 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 73  es required to s
8300: 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20 0a 2a  tore the copy .*
8310: 2a 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74  * of the Expr st
8320: 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 63 6f  ructure and a co
8330: 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 2e 75  py of the Expr.u
8340: 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28  .zToken string (
8350: 69 66 20 74 68 61 74 0a 2a 2a 20 73 74 72 69 6e  if that.** strin
8360: 67 20 69 73 20 64 65 66 69 6e 65 64 2e 29 0a 2a  g is defined.).*
8370: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70  /.static int dup
8380: 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 45  edExprNodeSize(E
8390: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
83a0: 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20  s){.  int nByte 
83b0: 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63  = dupedExprStruc
83c0: 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 20  tSize(p, flags) 
83d0: 26 20 30 78 66 66 66 3b 0a 20 20 69 66 28 20 21  & 0xfff;.  if( !
83e0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
83f0: 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  p, EP_IntValue) 
8400: 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29  && p->u.zToken )
8410: 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73  {.    nByte += s
8420: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
8430: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a 20  ->u.zToken)+1;. 
8440: 20 7d 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e   }.  return ROUN
8450: 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a  D8(nByte);.}../*
8460: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
8470: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
8480: 65 71 75 69 72 65 64 20 74 6f 20 63 72 65 61 74  equired to creat
8490: 65 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66  e a duplicate of
84a0: 20 74 68 65 20 0a 2a 2a 20 65 78 70 72 65 73 73   the .** express
84b0: 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74 68  ion passed as th
84c0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
84d0: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  . The second arg
84e0: 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 6d 61  ument is a.** ma
84f0: 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67 20 45 58  sk containing EX
8500: 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e  PRDUP_XXX flags.
8510: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  .**.** The value
8520: 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64   returned includ
8530: 65 73 20 73 70 61 63 65 20 74 6f 20 63 72 65 61  es space to crea
8540: 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  te a copy of the
8550: 20 45 78 70 72 20 73 74 72 75 63 74 0a 2a 2a 20   Expr struct.** 
8560: 69 74 73 65 6c 66 20 61 6e 64 20 74 68 65 20 62  itself and the b
8570: 75 66 66 65 72 20 72 65 66 65 72 72 65 64 20 74  uffer referred t
8580: 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a 54 6f 6b  o by Expr.u.zTok
8590: 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a  en, if any..**.*
85a0: 2a 20 49 66 20 74 68 65 20 45 58 50 52 44 55 50  * If the EXPRDUP
85b0: 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69 73 20  _REDUCE flag is 
85c0: 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72 65  set, then the re
85d0: 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 63 6c 75  turn value inclu
85e0: 64 65 73 20 0a 2a 2a 20 73 70 61 63 65 20 74 6f  des .** space to
85f0: 20 64 75 70 6c 69 63 61 74 65 20 61 6c 6c 20 45   duplicate all E
8600: 78 70 72 20 6e 6f 64 65 73 20 69 6e 20 74 68 65  xpr nodes in the
8610: 20 74 72 65 65 20 66 6f 72 6d 65 64 20 62 79 20   tree formed by 
8620: 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a 2a 20 61  Expr.pLeft .** a
8630: 6e 64 20 45 78 70 72 2e 70 52 69 67 68 74 20 76  nd Expr.pRight v
8640: 61 72 69 61 62 6c 65 73 20 28 62 75 74 20 6e 6f  ariables (but no
8650: 74 20 66 6f 72 20 61 6e 79 20 73 74 72 75 63 74  t for any struct
8660: 75 72 65 73 20 70 6f 69 6e 74 65 64 20 74 6f 20  ures pointed to 
8670: 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64 65 64  or .** descended
8680: 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78   from the Expr.x
8690: 2e 70 4c 69 73 74 20 6f 72 20 45 78 70 72 2e 78  .pList or Expr.x
86a0: 2e 70 53 65 6c 65 63 74 20 76 61 72 69 61 62 6c  .pSelect variabl
86b0: 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  es)..*/.static i
86c0: 6e 74 20 64 75 70 65 64 45 78 70 72 53 69 7a 65  nt dupedExprSize
86d0: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c  (Expr *p, int fl
86e0: 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  ags){.  int nByt
86f0: 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29  e = 0;.  if( p )
8700: 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 64 75  {.    nByte = du
8710: 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28  pedExprNodeSize(
8720: 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69  p, flags);.    i
8730: 66 28 20 66 6c 61 67 73 26 45 58 50 52 44 55 50  f( flags&EXPRDUP
8740: 5f 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20 20  _REDUCE ){.     
8750: 20 6e 42 79 74 65 20 2b 3d 20 64 75 70 65 64 45   nByte += dupedE
8760: 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c 65 66 74  xprSize(p->pLeft
8770: 2c 20 66 6c 61 67 73 29 20 2b 20 64 75 70 65 64  , flags) + duped
8780: 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 52 69 67  ExprSize(p->pRig
8790: 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  ht, flags);.    
87a0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
87b0: 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Byte;.}../*.** T
87c0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
87d0: 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74  similar to sqlit
87e0: 65 33 45 78 70 72 44 75 70 28 29 2c 20 65 78 63  e3ExprDup(), exc
87f0: 65 70 74 20 74 68 61 74 20 69 66 20 70 7a 42 75  ept that if pzBu
8800: 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f 74 20  ffer .** is not 
8810: 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42 75 66  NULL then *pzBuf
8820: 66 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74  fer is assumed t
8830: 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  o point to a buf
8840: 66 65 72 20 6c 61 72 67 65 20 65 6e 6f 75 67 68  fer large enough
8850: 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74 68   .** to store th
8860: 65 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73  e copy of expres
8870: 73 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f 70 69  sion p, the copi
8880: 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b 65  es of p->u.zToke
8890: 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69 63 61  n.** (if applica
88a0: 62 6c 65 29 2c 20 61 6e 64 20 74 68 65 20 63 6f  ble), and the co
88b0: 70 69 65 73 20 6f 66 20 74 68 65 20 70 2d 3e 70  pies of the p->p
88c0: 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70 52 69 67  Left and p->pRig
88d0: 68 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a  ht expressions,.
88e0: 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65 66 6f 72  ** if any. Befor
88f0: 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a  e returning, *pz
8900: 42 75 66 66 65 72 20 69 73 20 73 65 74 20 74 6f  Buffer is set to
8910: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
8920: 70 61 73 74 20 74 68 65 0a 2a 2a 20 70 6f 72 74  past the.** port
8930: 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 66 66 65  ion of the buffe
8940: 72 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 62 79  r copied into by
8950: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
8960: 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a  */.static Expr *
8970: 65 78 70 72 44 75 70 28 73 71 6c 69 74 65 33 20  exprDup(sqlite3 
8980: 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e  *db, Expr *p, in
8990: 74 20 64 75 70 46 6c 61 67 73 2c 20 75 38 20 2a  t dupFlags, u8 *
89a0: 2a 70 7a 42 75 66 66 65 72 29 7b 0a 20 20 45 78  *pzBuffer){.  Ex
89b0: 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  pr *pNew;       
89c0: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
89d0: 72 65 74 75 72 6e 20 2a 2f 0a 20 20 75 38 20 2a  return */.  u8 *
89e0: 7a 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20  zAlloc;         
89f0: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 73 70 61 63    /* Memory spac
8a00: 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20  e from which to 
8a10: 62 75 69 6c 64 20 45 78 70 72 20 6f 62 6a 65 63  build Expr objec
8a20: 74 20 2a 2f 0a 20 20 75 33 32 20 73 74 61 74 69  t */.  u32 stati
8a30: 63 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20  cFlag;       /* 
8a40: 45 50 5f 53 74 61 74 69 63 20 69 66 20 73 70 61  EP_Static if spa
8a50: 63 65 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20  ce not obtained 
8a60: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a  from malloc */..
8a70: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
8a80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 20 29  );.  assert( p )
8a90: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 75 70 46  ;.  assert( dupF
8aa0: 6c 61 67 73 3d 3d 30 20 7c 7c 20 64 75 70 46 6c  lags==0 || dupFl
8ab0: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
8ac0: 55 43 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  UCE );.  assert(
8ad0: 20 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c 7c 20   pzBuffer==0 || 
8ae0: 64 75 70 46 6c 61 67 73 3d 3d 45 58 50 52 44 55  dupFlags==EXPRDU
8af0: 50 5f 52 45 44 55 43 45 20 29 3b 0a 0a 20 20 2f  P_REDUCE );..  /
8b00: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65  * Figure out whe
8b10: 72 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  re to write the 
8b20: 6e 65 77 20 45 78 70 72 20 73 74 72 75 63 74 75  new Expr structu
8b30: 72 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 7a 42  re. */.  if( pzB
8b40: 75 66 66 65 72 20 29 7b 0a 20 20 20 20 7a 41 6c  uffer ){.    zAl
8b50: 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65 72 3b  loc = *pzBuffer;
8b60: 0a 20 20 20 20 73 74 61 74 69 63 46 6c 61 67 20  .    staticFlag 
8b70: 3d 20 45 50 5f 53 74 61 74 69 63 3b 0a 20 20 7d  = EP_Static;.  }
8b80: 65 6c 73 65 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63  else{.    zAlloc
8b90: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
8ba0: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 64 75 70 65  ocRawNN(db, dupe
8bb0: 64 45 78 70 72 53 69 7a 65 28 70 2c 20 64 75 70  dExprSize(p, dup
8bc0: 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 73 74 61  Flags));.    sta
8bd0: 74 69 63 46 6c 61 67 20 3d 20 30 3b 0a 20 20 7d  ticFlag = 0;.  }
8be0: 0a 20 20 70 4e 65 77 20 3d 20 28 45 78 70 72 20  .  pNew = (Expr 
8bf0: 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 69 66 28  *)zAlloc;..  if(
8c00: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 2f 2a 20   pNew ){.    /* 
8c10: 53 65 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20  Set nNewSize to 
8c20: 74 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74  the size allocat
8c30: 65 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63  ed for the struc
8c40: 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a  ture pointed to.
8c50: 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e 20      ** by pNew. 
8c60: 54 68 69 73 20 69 73 20 65 69 74 68 65 72 20 45  This is either E
8c70: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45 58  XPR_FULLSIZE, EX
8c80: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f  PR_REDUCEDSIZE o
8c90: 72 0a 20 20 20 20 2a 2a 20 45 58 50 52 5f 54 4f  r.    ** EXPR_TO
8ca0: 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e 54 6f  KENONLYSIZE. nTo
8cb0: 6b 65 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68  ken is set to th
8cc0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
8cd0: 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20 20 2a  s consumed.    *
8ce0: 2a 20 62 79 20 74 68 65 20 63 6f 70 79 20 6f 66  * by the copy of
8cf0: 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e   the p->u.zToken
8d00: 20 73 74 72 69 6e 67 20 28 69 66 20 61 6e 79 29   string (if any)
8d10: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f 6e  ..    */.    con
8d20: 73 74 20 75 6e 73 69 67 6e 65 64 20 6e 53 74 72  st unsigned nStr
8d30: 75 63 74 53 69 7a 65 20 3d 20 64 75 70 65 64 45  uctSize = dupedE
8d40: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c  xprStructSize(p,
8d50: 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20   dupFlags);.    
8d60: 63 6f 6e 73 74 20 69 6e 74 20 6e 4e 65 77 53 69  const int nNewSi
8d70: 7a 65 20 3d 20 6e 53 74 72 75 63 74 53 69 7a 65  ze = nStructSize
8d80: 20 26 20 30 78 66 66 66 3b 0a 20 20 20 20 69 6e   & 0xfff;.    in
8d90: 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 69 66  t nToken;.    if
8da0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
8db0: 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75  ty(p, EP_IntValu
8dc0: 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65  e) && p->u.zToke
8dd0: 6e 20 29 7b 0a 20 20 20 20 20 20 6e 54 6f 6b 65  n ){.      nToke
8de0: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
8df0: 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  n30(p->u.zToken)
8e00: 20 2b 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   + 1;.    }else{
8e10: 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20  .      nToken = 
8e20: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
8e30: 20 64 75 70 46 6c 61 67 73 20 29 7b 0a 20 20 20   dupFlags ){.   
8e40: 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48     assert( ExprH
8e50: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
8e60: 5f 52 65 64 75 63 65 64 29 3d 3d 30 20 29 3b 0a  _Reduced)==0 );.
8e70: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c        memcpy(zAl
8e80: 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53 69 7a 65  loc, p, nNewSize
8e90: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
8ea0: 20 20 20 20 75 33 32 20 6e 53 69 7a 65 20 3d 20      u32 nSize = 
8eb0: 28 75 33 32 29 65 78 70 72 53 74 72 75 63 74 53  (u32)exprStructS
8ec0: 69 7a 65 28 70 29 3b 0a 20 20 20 20 20 20 6d 65  ize(p);.      me
8ed0: 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20  mcpy(zAlloc, p, 
8ee0: 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66  nSize);.      if
8ef0: 28 20 6e 53 69 7a 65 3c 45 58 50 52 5f 46 55 4c  ( nSize<EXPR_FUL
8f00: 4c 53 49 5a 45 20 29 7b 20 0a 20 20 20 20 20 20  LSIZE ){ .      
8f10: 20 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c 6f 63    memset(&zAlloc
8f20: 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58 50 52  [nSize], 0, EXPR
8f30: 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65 29  _FULLSIZE-nSize)
8f40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8f50: 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
8f60: 45 50 5f 52 65 64 75 63 65 64 2c 20 45 50 5f 54  EP_Reduced, EP_T
8f70: 6f 6b 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20 45 50  okenOnly, and EP
8f80: 5f 53 74 61 74 69 63 20 66 6c 61 67 73 20 61 70  _Static flags ap
8f90: 70 72 6f 70 72 69 61 74 65 6c 79 2e 20 2a 2f 0a  propriately. */.
8fa0: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
8fb0: 26 3d 20 7e 28 45 50 5f 52 65 64 75 63 65 64 7c  &= ~(EP_Reduced|
8fc0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
8fd0: 53 74 61 74 69 63 7c 45 50 5f 4d 65 6d 54 6f 6b  Static|EP_MemTok
8fe0: 65 6e 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66  en);.    pNew->f
8ff0: 6c 61 67 73 20 7c 3d 20 6e 53 74 72 75 63 74 53  lags |= nStructS
9000: 69 7a 65 20 26 20 28 45 50 5f 52 65 64 75 63 65  ize & (EP_Reduce
9010: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b  d|EP_TokenOnly);
9020: 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73  .    pNew->flags
9030: 20 7c 3d 20 73 74 61 74 69 63 46 6c 61 67 3b 0a   |= staticFlag;.
9040: 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65  .    /* Copy the
9050: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72   p->u.zToken str
9060: 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a  ing, if any. */.
9070: 20 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29      if( nToken )
9080: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54  {.      char *zT
9090: 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e 7a  oken = pNew->u.z
90a0: 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26  Token = (char*)&
90b0: 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65 5d  zAlloc[nNewSize]
90c0: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
90d0: 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54 6f 6b  Token, p->u.zTok
90e0: 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20  en, nToken);.   
90f0: 20 7d 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 28   }..    if( 0==(
9100: 28 70 2d 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e  (p->flags|pNew->
9110: 66 6c 61 67 73 29 20 26 20 45 50 5f 54 6f 6b 65  flags) & EP_Toke
9120: 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  nOnly) ){.      
9130: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  /* Fill in the p
9140: 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f  New->x.pSelect o
9150: 72 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20  r pNew->x.pList 
9160: 6d 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20  member. */.     
9170: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
9180: 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65  erty(p, EP_xIsSe
9190: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
91a0: 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74   pNew->x.pSelect
91b0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
91c0: 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65  Dup(db, p->x.pSe
91d0: 6c 65 63 74 2c 20 64 75 70 46 6c 61 67 73 29 3b  lect, dupFlags);
91e0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
91f0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c        pNew->x.pL
9200: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
9210: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
9220: 78 2e 70 4c 69 73 74 2c 20 64 75 70 46 6c 61 67  x.pList, dupFlag
9230: 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  s);.      }.    
9240: 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69  }..    /* Fill i
9250: 6e 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e  n pNew->pLeft an
9260: 64 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20  d pNew->pRight. 
9270: 2a 2f 0a 20 20 20 20 69 66 28 20 45 78 70 72 48  */.    if( ExprH
9280: 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c  asProperty(pNew,
9290: 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54   EP_Reduced|EP_T
92a0: 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  okenOnly) ){.   
92b0: 20 20 20 7a 41 6c 6c 6f 63 20 2b 3d 20 64 75 70     zAlloc += dup
92c0: 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70  edExprNodeSize(p
92d0: 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20  , dupFlags);.   
92e0: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
92f0: 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
9300: 52 65 64 75 63 65 64 29 20 29 7b 0a 20 20 20 20  Reduced) ){.    
9310: 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20      pNew->pLeft 
9320: 3d 20 70 2d 3e 70 4c 65 66 74 20 3f 0a 20 20 20  = p->pLeft ?.   
9330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9340: 20 20 20 65 78 70 72 44 75 70 28 64 62 2c 20 70     exprDup(db, p
9350: 2d 3e 70 4c 65 66 74 2c 20 45 58 50 52 44 55 50  ->pLeft, EXPRDUP
9360: 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63  _REDUCE, &zAlloc
9370: 29 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 70  ) : 0;.        p
9380: 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 70 2d  New->pRight = p-
9390: 3e 70 52 69 67 68 74 20 3f 0a 20 20 20 20 20 20  >pRight ?.      
93a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93b0: 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e   exprDup(db, p->
93c0: 70 52 69 67 68 74 2c 20 45 58 50 52 44 55 50 5f  pRight, EXPRDUP_
93d0: 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29  REDUCE, &zAlloc)
93e0: 20 3a 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   : 0;.      }.  
93f0: 20 20 20 20 69 66 28 20 70 7a 42 75 66 66 65 72      if( pzBuffer
9400: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 42   ){.        *pzB
9410: 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a  uffer = zAlloc;.
9420: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
9430: 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 45 78  e{.      if( !Ex
9440: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
9450: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
9460: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
9470: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
9480: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  xprDup(db, p->pL
9490: 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  eft, 0);.       
94a0: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20   pNew->pRight = 
94b0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
94c0: 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 30 29  b, p->pRight, 0)
94d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
94e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
94f0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  w;.}../*.** Crea
9500: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
9510: 64 65 65 70 20 63 6f 70 79 20 6f 66 20 74 68 65  deep copy of the
9520: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
9530: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a  s the second .**
9540: 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 61 6e   argument. If an
9550: 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 69   OOM condition i
9560: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 4e  s encountered, N
9570: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ULL is returned.
9580: 2a 2a 20 61 6e 64 20 74 68 65 20 64 62 2d 3e 6d  ** and the db->m
9590: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
95a0: 20 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66   set..*/.#ifndef
95b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
95c0: 0a 73 74 61 74 69 63 20 57 69 74 68 20 2a 77 69  .static With *wi
95d0: 74 68 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  thDup(sqlite3 *d
95e0: 62 2c 20 57 69 74 68 20 2a 70 29 7b 0a 20 20 57  b, With *p){.  W
95f0: 69 74 68 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20  ith *pRet = 0;. 
9600: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e   if( p ){.    in
9610: 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66  t nByte = sizeof
9620: 28 2a 70 29 20 2b 20 73 69 7a 65 6f 66 28 70 2d  (*p) + sizeof(p-
9630: 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 43 74  >a[0]) * (p->nCt
9640: 65 2d 31 29 3b 0a 20 20 20 20 70 52 65 74 20 3d  e-1);.    pRet =
9650: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
9660: 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b  Zero(db, nByte);
9670: 0a 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b  .    if( pRet ){
9680: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
9690: 20 20 20 20 70 52 65 74 2d 3e 6e 43 74 65 20 3d      pRet->nCte =
96a0: 20 70 2d 3e 6e 43 74 65 3b 0a 20 20 20 20 20 20   p->nCte;.      
96b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
96c0: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  te; i++){.      
96d0: 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 53 65    pRet->a[i].pSe
96e0: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
96f0: 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 61  lectDup(db, p->a
9700: 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b  [i].pSelect, 0);
9710: 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61  .        pRet->a
9720: 5b 69 5d 2e 70 43 6f 6c 73 20 3d 20 73 71 6c 69  [i].pCols = sqli
9730: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
9740: 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73  b, p->a[i].pCols
9750: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52  , 0);.        pR
9760: 65 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  et->a[i].zName =
9770: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
9780: 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61  (db, p->a[i].zNa
9790: 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
97a0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
97b0: 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  pRet;.}.#else.# 
97c0: 64 65 66 69 6e 65 20 77 69 74 68 44 75 70 28 78  define withDup(x
97d0: 2c 79 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,y) 0.#endif../*
97e0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
97f0: 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69  g group of routi
9800: 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63 6f  nes make deep co
9810: 70 69 65 73 20 6f 66 20 65 78 70 72 65 73 73 69  pies of expressi
9820: 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69  ons,.** expressi
9830: 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69 73  on lists, ID lis
9840: 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20 73  ts, and select s
9850: 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20  tatements.  The 
9860: 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65  copies can.** be
9870: 20 64 65 6c 65 74 65 64 20 28 62 79 20 62 65 69   deleted (by bei
9880: 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  ng passed to the
9890: 69 72 20 72 65 73 70 65 63 74 69 76 65 20 2e 2e  ir respective ..
98a0: 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69 6e  .Delete() routin
98b0: 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65  es).** without e
98c0: 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72 69  ffecting the ori
98d0: 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ginals..**.** Th
98e0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
98f0: 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72 63  t, ID, and sourc
9900: 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20 62  e lists return b
9910: 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  y sqlite3ExprLis
9920: 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74  tDup(),.** sqlit
9930: 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20 61  e3IdListDup(), a
9940: 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  nd sqlite3SrcLis
9950: 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62  tDup() can not b
9960: 65 20 66 75 72 74 68 65 72 20 65 78 70 61 6e 64  e further expand
9970: 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65 71  ed .** by subseq
9980: 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71  uent calls to sq
9990: 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64 28  lite*ListAppend(
99a0: 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a  ) routines..**.*
99b0: 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68 61  * Any tables tha
99c0: 74 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d 69  t the SrcList mi
99d0: 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72 65  ght point to are
99e0: 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e   not duplicated.
99f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73  .**.** The flags
9a00: 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74 61   parameter conta
9a10: 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f  ins a combinatio
9a20: 6e 20 6f 66 20 74 68 65 20 45 58 50 52 44 55 50  n of the EXPRDUP
9a30: 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 20 49  _XXX flags..** I
9a40: 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 52 45  f the EXPRDUP_RE
9a50: 44 55 43 45 20 66 6c 61 67 20 69 73 20 73 65 74  DUCE flag is set
9a60: 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72 75 63  , then the struc
9a70: 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 69 73  ture returned is
9a80: 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64 20   a.** truncated 
9a90: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 75  version of the u
9aa0: 73 75 61 6c 20 45 78 70 72 20 73 74 72 75 63 74  sual Expr struct
9ab0: 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ure that will be
9ac0: 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 70 61   stored as.** pa
9ad0: 72 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d  rt of the in-mem
9ae0: 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69  ory representati
9af0: 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  on of the databa
9b00: 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78  se schema..*/.Ex
9b10: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44  pr *sqlite3ExprD
9b20: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
9b30: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61  Expr *p, int fla
9b40: 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 66  gs){.  assert( f
9b50: 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73  lags==0 || flags
9b60: 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  ==EXPRDUP_REDUCE
9b70: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 20 3f   );.  return p ?
9b80: 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2c 20   exprDup(db, p, 
9b90: 66 6c 61 67 73 2c 20 30 29 20 3a 20 30 3b 0a 7d  flags, 0) : 0;.}
9ba0: 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74  .ExprList *sqlit
9bb0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 73 71  e3ExprListDup(sq
9bc0: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c  lite3 *db, ExprL
9bd0: 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  ist *p, int flag
9be0: 73 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  s){.  ExprList *
9bf0: 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45  pNew;.  struct E
9c00: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
9c10: 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a  tem, *pOldItem;.
9c20: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
9c30: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66  t( db!=0 );.  if
9c40: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
9c50: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
9c60: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
9c70: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
9c80: 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
9c90: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
9ca0: 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20    pNew->nExpr = 
9cb0: 69 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20  i = p->nExpr;.  
9cc0: 69 66 28 20 28 66 6c 61 67 73 20 26 20 45 58 50  if( (flags & EXP
9cd0: 52 44 55 50 5f 52 45 44 55 43 45 29 3d 3d 30 20  RDUP_REDUCE)==0 
9ce0: 29 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d 3e  ) for(i=1; i<p->
9cf0: 6e 45 78 70 72 3b 20 69 2b 3d 69 29 7b 7d 0a 20  nExpr; i+=i){}. 
9d00: 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d   pNew->a = pItem
9d10: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
9d20: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 20 69 2a 73  ocRawNN(db,  i*s
9d30: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29  izeof(p->a[0]) )
9d40: 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 3d 3d 30  ;.  if( pItem==0
9d50: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
9d60: 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b  bFree(db, pNew);
9d70: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
9d80: 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d   } .  pOldItem =
9d90: 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30   p->a;.  for(i=0
9da0: 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b  ; i<p->nExpr; i+
9db0: 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64  +, pItem++, pOld
9dc0: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Item++){.    Exp
9dd0: 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d 20 70 4f  r *pOldExpr = pO
9de0: 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20  ldItem->pExpr;. 
9df0: 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
9e00: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
9e10: 28 64 62 2c 20 70 4f 6c 64 45 78 70 72 2c 20 66  (db, pOldExpr, f
9e20: 6c 61 67 73 29 3b 0a 20 20 20 20 70 49 74 65 6d  lags);.    pItem
9e30: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
9e40: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
9e50: 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ldItem->zName);.
9e60: 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e      pItem->zSpan
9e70: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
9e80: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
9e90: 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74  >zSpan);.    pIt
9ea0: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20  em->sortOrder = 
9eb0: 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72  pOldItem->sortOr
9ec0: 64 65 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  der;.    pItem->
9ed0: 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 49  done = 0;.    pI
9ee0: 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 20  tem->bSpanIsTab 
9ef0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 53 70 61  = pOldItem->bSpa
9f00: 6e 49 73 54 61 62 3b 0a 20 20 20 20 70 49 74 65  nIsTab;.    pIte
9f10: 6d 2d 3e 75 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  m->u = pOldItem-
9f20: 3e 75 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  >u;.  }.  return
9f30: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
9f40: 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69 67  If cursors, trig
9f50: 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64 20  gers, views and 
9f60: 73 75 62 71 75 65 72 69 65 73 20 61 72 65 20 61  subqueries are a
9f70: 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 0a  ll omitted from.
9f80: 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74 68  ** the build, th
9f90: 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 66  en none of the f
9fa0: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
9fb0: 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a 2a  s, except for .*
9fc0: 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  * sqlite3SelectD
9fd0: 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61 6c  up(), can be cal
9fe0: 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c 65  led. sqlite3Sele
9ff0: 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65 74  ctDup() is somet
a000: 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 77  imes.** called w
a010: 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75 6d  ith a NULL argum
a020: 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ent..*/.#if !def
a030: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
a040: 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
a050: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
a060: 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21 64  RIGGER) \. || !d
a070: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
a080: 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72 63  IT_SUBQUERY).Src
a090: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63  List *sqlite3Src
a0a0: 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20  ListDup(sqlite3 
a0b0: 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c  *db, SrcList *p,
a0c0: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53   int flags){.  S
a0d0: 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  rcList *pNew;.  
a0e0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79  int i;.  int nBy
a0f0: 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  te;.  assert( db
a100: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  !=0 );.  if( p==
a110: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
a120: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
a130: 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20  p) + (p->nSrc>0 
a140: 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  ? sizeof(p->a[0]
a150: 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20  ) * (p->nSrc-1) 
a160: 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  : 0);.  pNew = s
a170: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
a180: 77 4e 4e 28 64 62 2c 20 6e 42 79 74 65 20 29 3b  wNN(db, nByte );
a190: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
a1a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
a1b0: 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e  w->nSrc = pNew->
a1c0: 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63  nAlloc = p->nSrc
a1d0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
a1e0: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
a1f0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
a200: 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20  _item *pNewItem 
a210: 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20  = &pNew->a[i];. 
a220: 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
a230: 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d  t_item *pOldItem
a240: 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20   = &p->a[i];.   
a250: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
a260: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 63 68    pNewItem->pSch
a270: 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  ema = pOldItem->
a280: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70 4e 65  pSchema;.    pNe
a290: 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  wItem->zDatabase
a2a0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
a2b0: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
a2c0: 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  >zDatabase);.   
a2d0: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pNewItem->zName
a2e0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
a2f0: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
a300: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65  >zName);.    pNe
a310: 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20  wItem->zAlias = 
a320: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
a330: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41  db, pOldItem->zA
a340: 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 49  lias);.    pNewI
a350: 74 65 6d 2d 3e 66 67 20 3d 20 70 4f 6c 64 49 74  tem->fg = pOldIt
a360: 65 6d 2d 3e 66 67 3b 0a 20 20 20 20 70 4e 65 77  em->fg;.    pNew
a370: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20  Item->iCursor = 
a380: 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pOldItem->iCurso
a390: 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  r;.    pNewItem-
a3a0: 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 70  >addrFillSub = p
a3b0: 4f 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  OldItem->addrFil
a3c0: 6c 53 75 62 3b 0a 20 20 20 20 70 4e 65 77 49 74  lSub;.    pNewIt
a3d0: 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20  em->regReturn = 
a3e0: 70 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52 65 74  pOldItem->regRet
a3f0: 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  urn;.    if( pNe
a400: 77 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65  wItem->fg.isInde
a410: 78 65 64 42 79 20 29 7b 0a 20 20 20 20 20 20 70  xedBy ){.      p
a420: 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64  NewItem->u1.zInd
a430: 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74 65 33  exedBy = sqlite3
a440: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
a450: 64 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78  dItem->u1.zIndex
a460: 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20  edBy);.    }.   
a470: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 42 49 6e   pNewItem->pIBIn
a480: 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  dex = pOldItem->
a490: 70 49 42 49 6e 64 65 78 3b 0a 20 20 20 20 69 66  pIBIndex;.    if
a4a0: 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69  ( pNewItem->fg.i
a4b0: 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 20  sTabFunc ){.    
a4c0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 70    pNewItem->u1.p
a4d0: 46 75 6e 63 41 72 67 20 3d 20 0a 20 20 20 20 20  FuncArg = .     
a4e0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
a4f0: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64  ListDup(db, pOld
a500: 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72  Item->u1.pFuncAr
a510: 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d  g, flags);.    }
a520: 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e 65 77  .    pTab = pNew
a530: 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c  Item->pTab = pOl
a540: 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  dItem->pTab;.   
a550: 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
a560: 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b     pTab->nRef++;
a570: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49  .    }.    pNewI
a580: 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  tem->pSelect = s
a590: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
a5a0: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53  db, pOldItem->pS
a5b0: 65 6c 65 63 74 2c 20 66 6c 61 67 73 29 3b 0a 20  elect, flags);. 
a5c0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e     pNewItem->pOn
a5d0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
a5e0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
a5f0: 70 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  pOn, flags);.   
a600: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e   pNewItem->pUsin
a610: 67 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73  g = sqlite3IdLis
a620: 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  tDup(db, pOldIte
a630: 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20  m->pUsing);.    
a640: 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  pNewItem->colUse
a650: 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f  d = pOldItem->co
a660: 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74  lUsed;.  }.  ret
a670: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69  urn pNew;.}.IdLi
a680: 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73  st *sqlite3IdLis
a690: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
a6a0: 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20  , IdList *p){.  
a6b0: 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  IdList *pNew;.  
a6c0: 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
a6d0: 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   db!=0 );.  if( 
a6e0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
a6f0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
a700: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
a710: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  b, sizeof(*pNew)
a720: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
a730: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
a740: 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e  pNew->nId = p->n
a750: 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20  Id;.  pNew->a = 
a760: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
a770: 61 77 4e 4e 28 64 62 2c 20 70 2d 3e 6e 49 64 2a  awNN(db, p->nId*
a780: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
a790: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61  );.  if( pNew->a
a7a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
a7b0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65  e3DbFree(db, pNe
a7c0: 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  w);.    return 0
a7d0: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20  ;.  }.  /* Note 
a7e0: 74 68 61 74 20 62 65 63 61 75 73 65 20 74 68 65  that because the
a7f0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c   size of the all
a800: 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d 3e 61  ocation for p->a
a810: 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e  [] is not.  ** n
a820: 65 63 65 73 73 61 72 69 6c 79 20 61 20 70 6f 77  ecessarily a pow
a830: 65 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c 69 74  er of two, sqlit
a840: 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 29  e3IdListAppend()
a850: 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c   may not be call
a860: 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64  ed.  ** on the d
a870: 75 70 6c 69 63 61 74 65 20 63 72 65 61 74 65 64  uplicate created
a880: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
a890: 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  n. */.  for(i=0;
a8a0: 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b   i<p->nId; i++){
a8b0: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
a8c0: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
a8d0: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
a8e0: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
a8f0: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65  st_item *pOldIte
a900: 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  m = &p->a[i];.  
a910: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
a920: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
a930: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
a940: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ->zName);.    pN
a950: 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f  ewItem->idx = pO
a960: 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d  ldItem->idx;.  }
a970: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
a980: 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65  }.Select *sqlite
a990: 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74  3SelectDup(sqlit
a9a0: 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a  e3 *db, Select *
a9b0: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
a9c0: 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 2c 20 2a   Select *pNew, *
a9d0: 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74  pPrior;.  assert
a9e0: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( db!=0 );.  if(
a9f0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
aa00: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
aa10: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
aa20: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  db, sizeof(*p) )
aa30: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
aa40: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
aa50: 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c  ew->pEList = sql
aa60: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
aa70: 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 66  db, p->pEList, f
aa80: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  lags);.  pNew->p
aa90: 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Src = sqlite3Src
aaa0: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
aab0: 53 72 63 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  Src, flags);.  p
aac0: 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71  New->pWhere = sq
aad0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
aae0: 20 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c 61 67   p->pWhere, flag
aaf0: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f  s);.  pNew->pGro
ab00: 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  upBy = sqlite3Ex
ab10: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
ab20: 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c 61 67 73  >pGroupBy, flags
ab30: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69  );.  pNew->pHavi
ab40: 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ng = sqlite3Expr
ab50: 44 75 70 28 64 62 2c 20 70 2d 3e 70 48 61 76 69  Dup(db, p->pHavi
ab60: 6e 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e  ng, flags);.  pN
ab70: 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73  ew->pOrderBy = s
ab80: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
ab90: 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  p(db, p->pOrderB
aba0: 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  y, flags);.  pNe
abb0: 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20  w->op = p->op;. 
abc0: 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20   pNew->pPrior = 
abd0: 70 50 72 69 6f 72 20 3d 20 73 71 6c 69 74 65 33  pPrior = sqlite3
abe0: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d  SelectDup(db, p-
abf0: 3e 70 50 72 69 6f 72 2c 20 66 6c 61 67 73 29 3b  >pPrior, flags);
ac00: 0a 20 20 69 66 28 20 70 50 72 69 6f 72 20 29 20  .  if( pPrior ) 
ac10: 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20  pPrior->pNext = 
ac20: 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e  pNew;.  pNew->pN
ac30: 65 78 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ext = 0;.  pNew-
ac40: 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65  >pLimit = sqlite
ac50: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
ac60: 70 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a  pLimit, flags);.
ac70: 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20    pNew->pOffset 
ac80: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
ac90: 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c  (db, p->pOffset,
aca0: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
acb0: 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70  >iLimit = 0;.  p
acc0: 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30  New->iOffset = 0
acd0: 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61  ;.  pNew->selFla
ace0: 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73  gs = p->selFlags
acf0: 20 26 20 7e 53 46 5f 55 73 65 73 45 70 68 65 6d   & ~SF_UsesEphem
ad00: 65 72 61 6c 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  eral;.  pNew->ad
ad10: 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
ad20: 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72  -1;.  pNew->addr
ad30: 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31  OpenEphm[1] = -1
ad40: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63  ;.  pNew->nSelec
ad50: 74 52 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c 65 63  tRow = p->nSelec
ad60: 74 52 6f 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 57  tRow;.  pNew->pW
ad70: 69 74 68 20 3d 20 77 69 74 68 44 75 70 28 64 62  ith = withDup(db
ad80: 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a 20 20 73  , p->pWith);.  s
ad90: 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e  qlite3SelectSetN
ada0: 61 6d 65 28 70 4e 65 77 2c 20 70 2d 3e 7a 53 65  ame(pNew, p->zSe
adb0: 6c 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  lName);.  return
adc0: 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53   pNew;.}.#else.S
add0: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
ade0: 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20  lectDup(sqlite3 
adf0: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  *db, Select *p, 
ae00: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73  int flags){.  as
ae10: 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20  sert( p==0 );.  
ae20: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
ae30: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  if.../*.** Add a
ae40: 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
ae50: 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65 78  the end of an ex
ae60: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
ae70: 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69  If pList is.** i
ae80: 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74  nitially NULL, t
ae90: 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77  hen create a new
aea0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
aeb0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
aec0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
aed0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
aee0: 20 65 6e 74 69 72 65 20 6c 69 73 74 20 69 73 20   entire list is 
aef0: 66 72 65 65 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c  freed and.** NUL
af00: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  L is returned.  
af10: 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72  If non-NULL is r
af20: 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 69 74  eturned, then it
af30: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a   is guaranteed.*
af40: 2a 20 74 68 61 74 20 74 68 65 20 6e 65 77 20 65  * that the new e
af50: 6e 74 72 79 20 77 61 73 20 73 75 63 63 65 73 73  ntry was success
af60: 66 75 6c 6c 79 20 61 70 70 65 6e 64 65 64 2e 0a  fully appended..
af70: 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c  */.ExprList *sql
af80: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
af90: 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nd(.  Parse *pPa
afa0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
afb0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
afc0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
afd0: 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a  pList,        /*
afe0: 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74   List to which t
aff0: 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20  o append. Might 
b000: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
b010: 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20  r *pExpr        
b020: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
b030: 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65  on to be appende
b040: 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  d. Might be NULL
b050: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
b060: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
b070: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  b;.  assert( db!
b080: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73  =0 );.  if( pLis
b090: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
b0a0: 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
b0b0: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
b0c0: 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b  eof(ExprList) );
b0d0: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
b0e0: 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
b0f0: 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  no_mem;.    }.  
b100: 20 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3d    pList->nExpr =
b110: 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61   0;.    pList->a
b120: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
b130: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
b140: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29  of(pList->a[0]))
b150: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  ;.    if( pList-
b160: 3e 61 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f  >a==0 ) goto no_
b170: 6d 65 6d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  mem;.  }else if(
b180: 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26   (pList->nExpr &
b190: 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31   (pList->nExpr-1
b1a0: 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72  ))==0 ){.    str
b1b0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
b1c0: 6d 20 2a 61 3b 0a 20 20 20 20 61 73 73 65 72 74  m *a;.    assert
b1d0: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30  ( pList->nExpr>0
b1e0: 20 29 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69   );.    a = sqli
b1f0: 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c  te3DbRealloc(db,
b200: 20 70 4c 69 73 74 2d 3e 61 2c 20 70 4c 69 73 74   pList->a, pList
b210: 2d 3e 6e 45 78 70 72 2a 32 2a 73 69 7a 65 6f 66  ->nExpr*2*sizeof
b220: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
b230: 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a      if( a==0 ){.
b240: 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65        goto no_me
b250: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  m;.    }.    pLi
b260: 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20  st->a = a;.  }. 
b270: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
b280: 61 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 31 20  a!=0 );.  if( 1 
b290: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
b2a0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
b2b0: 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
b2c0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a  List->nExpr++];.
b2d0: 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d      memset(pItem
b2e0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74  , 0, sizeof(*pIt
b2f0: 65 6d 29 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  em));.    pItem-
b300: 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
b310: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69    }.  return pLi
b320: 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20  st;..no_mem:    
b330: 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61   .  /* Avoid lea
b340: 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d  king memory if m
b350: 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c 65 64  alloc has failed
b360: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78  . */.  sqlite3Ex
b370: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
b380: 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  pr);.  sqlite3Ex
b390: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
b3a0: 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72   pList);.  retur
b3b0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n 0;.}../*.** Se
b3c0: 74 20 74 68 65 20 73 6f 72 74 20 6f 72 64 65 72  t the sort order
b3d0: 20 66 6f 72 20 74 68 65 20 6c 61 73 74 20 65 6c   for the last el
b3e0: 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20 67 69 76  ement on the giv
b3f0: 65 6e 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a  en ExprList..*/.
b400: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
b410: 4c 69 73 74 53 65 74 53 6f 72 74 4f 72 64 65 72  ListSetSortOrder
b420: 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e  (ExprList *p, in
b430: 74 20 69 53 6f 72 74 4f 72 64 65 72 29 7b 0a 20  t iSortOrder){. 
b440: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
b450: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51  rn;.  assert( SQ
b460: 4c 49 54 45 5f 53 4f 5f 55 4e 44 45 46 49 4e 45  LITE_SO_UNDEFINE
b470: 44 3c 30 20 26 26 20 53 51 4c 49 54 45 5f 53 4f  D<0 && SQLITE_SO
b480: 5f 41 53 43 3e 3d 30 20 26 26 20 53 51 4c 49 54  _ASC>=0 && SQLIT
b490: 45 5f 53 4f 5f 44 45 53 43 3e 30 20 29 3b 0a 20  E_SO_DESC>0 );. 
b4a0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 45 78 70   assert( p->nExp
b4b0: 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 53 6f  r>0 );.  if( iSo
b4c0: 72 74 4f 72 64 65 72 3c 30 20 29 7b 0a 20 20 20  rtOrder<0 ){.   
b4d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 5b 70 2d   assert( p->a[p-
b4e0: 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72  >nExpr-1].sortOr
b4f0: 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41  der==SQLITE_SO_A
b500: 53 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  SC );.    return
b510: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61 5b 70 2d 3e  ;.  }.  p->a[p->
b520: 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64  nExpr-1].sortOrd
b530: 65 72 20 3d 20 28 75 38 29 69 53 6f 72 74 4f 72  er = (u8)iSortOr
b540: 64 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  der;.}../*.** Se
b550: 74 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61  t the ExprList.a
b560: 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74  [].zName element
b570: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
b580: 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d  ently added item
b590: 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65  .** on the expre
b5a0: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
b5b0: 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65  * pList might be
b5c0: 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20   NULL following 
b5d0: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42  an OOM error.  B
b5e0: 75 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20  ut pName should 
b5f0: 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c  never be.** NULL
b600: 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  .  If a memory a
b610: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c  llocation fails,
b620: 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d   the pParse->db-
b630: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
b640: 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f  ag.** is set..*/
b650: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
b660: 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a 20 20  rListSetName(.  
b670: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
b680: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
b690: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
b6a0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
b6b0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
b6c0: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64 20  to which to add 
b6d0: 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54  the span. */.  T
b6e0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20  oken *pName,    
b6f0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74         /* Name t
b700: 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 20 20  o be added */.  
b710: 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20  int dequote     
b720: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
b730: 74 6f 20 63 61 75 73 65 20 74 68 65 20 6e 61 6d  to cause the nam
b740: 65 20 74 6f 20 62 65 20 64 65 71 75 6f 74 65 64  e to be dequoted
b750: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
b760: 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50 61   pList!=0 || pPa
b770: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
b780: 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  ailed!=0 );.  if
b790: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73  ( pList ){.    s
b7a0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
b7b0: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
b7c0: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
b7d0: 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 70 49  Expr>0 );.    pI
b7e0: 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  tem = &pList->a[
b7f0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b  pList->nExpr-1];
b800: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
b810: 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a  em->zName==0 );.
b820: 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65      pItem->zName
b830: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
b840: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
b850: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
b860: 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20 64 65 71  >n);.    if( deq
b870: 75 6f 74 65 20 29 20 73 71 6c 69 74 65 33 44 65  uote ) sqlite3De
b880: 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61  quote(pItem->zNa
b890: 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  me);.  }.}../*.*
b8a0: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69  * Set the ExprLi
b8b0: 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65  st.a[].zSpan ele
b8c0: 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74  ment of the most
b8d0: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
b8e0: 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65  item.** on the e
b8f0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
b900: 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68  **.** pList migh
b910: 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77  t be NULL follow
b920: 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72  ing an OOM error
b930: 2e 20 20 42 75 74 20 70 53 70 61 6e 20 73 68 6f  .  But pSpan sho
b940: 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20  uld never be.** 
b950: 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f  NULL.  If a memo
b960: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
b970: 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d  ils, the pParse-
b980: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
b990: 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74  d flag.** is set
b9a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
b9b0: 33 45 78 70 72 4c 69 73 74 53 65 74 53 70 61 6e  3ExprListSetSpan
b9c0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
b9d0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
b9e0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
b9f0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
ba00: 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c  ist,        /* L
ba10: 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20  ist to which to 
ba20: 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f  add the span. */
ba30: 0a 20 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70  .  ExprSpan *pSp
ba40: 61 6e 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  an         /* Th
ba50: 65 20 73 70 61 6e 20 74 6f 20 62 65 20 61 64 64  e span to be add
ba60: 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ed */.){.  sqlit
ba70: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
ba80: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >db;.  assert( p
ba90: 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d  List!=0 || db->m
baa0: 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29  allocFailed!=0 )
bab0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
bac0: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
bad0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
bae0: 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
baf0: 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20  st->nExpr-1];.  
bb00: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
bb10: 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20  >nExpr>0 );.    
bb20: 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
bb30: 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 49 74 65  ocFailed || pIte
bb40: 6d 2d 3e 70 45 78 70 72 3d 3d 70 53 70 61 6e 2d  m->pExpr==pSpan-
bb50: 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 73 71  >pExpr );.    sq
bb60: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
bb70: 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20  pItem->zSpan);. 
bb80: 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20     pItem->zSpan 
bb90: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
bba0: 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 53  up(db, (char*)pS
bbb0: 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20  pan->zStart,.   
bbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbe0: 20 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45   (int)(pSpan->zE
bbf0: 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61  nd - pSpan->zSta
bc00: 72 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rt));.  }.}../*.
bc10: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
bc20: 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74  sion list pEList
bc30: 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74   contains more t
bc40: 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65  han iLimit eleme
bc50: 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e  nts,.** leave an
bc60: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
bc70: 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69  n pParse..*/.voi
bc80: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
bc90: 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20  tCheckLength(.  
bca0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20  Parse *pParse,. 
bcb0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
bcc0: 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  t,.  const char 
bcd0: 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e  *zObject.){.  in
bce0: 74 20 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e 64  t mx = pParse->d
bcf0: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
bd00: 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a  _LIMIT_COLUMN];.
bd10: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69    testcase( pELi
bd20: 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
bd30: 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73  xpr==mx );.  tes
bd40: 74 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26  tcase( pEList &&
bd50: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   pEList->nExpr==
bd60: 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 45  mx+1 );.  if( pE
bd70: 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
bd80: 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20  nExpr>mx ){.    
bd90: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
bda0: 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
bdb0: 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22  y columns in %s"
bdc0: 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a  , zObject);.  }.
bdd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
bde0: 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65 73  an entire expres
bdf0: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  sion list..*/.st
be00: 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
be10: 4c 49 4e 45 20 76 6f 69 64 20 65 78 70 72 4c 69  LINE void exprLi
be20: 73 74 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69 74  stDeleteNN(sqlit
be30: 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74  e3 *db, ExprList
be40: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
be50: 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  i;.  struct Expr
be60: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
be70: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
be80: 74 2d 3e 61 21 3d 30 20 7c 7c 20 70 4c 69 73 74  t->a!=0 || pList
be90: 2d 3e 6e 45 78 70 72 3d 3d 30 20 29 3b 0a 20 20  ->nExpr==0 );.  
bea0: 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
beb0: 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74  >a, i=0; i<pList
bec0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  ->nExpr; i++, pI
bed0: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  tem++){.    sqli
bee0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
bef0: 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
bf00: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
bf10: 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e  ee(db, pItem->zN
bf20: 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
bf30: 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
bf40: 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 7d 0a 20  m->zSpan);.  }. 
bf50: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
bf60: 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20  b, pList->a);.  
bf70: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
bf80: 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 76 6f 69 64  , pList);.}.void
bf90: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
bfa0: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
bfb0: 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  db, ExprList *pL
bfc0: 69 73 74 29 7b 0a 20 20 69 66 28 20 70 4c 69 73  ist){.  if( pLis
bfd0: 74 20 29 20 65 78 70 72 4c 69 73 74 44 65 6c 65  t ) exprListDele
bfe0: 74 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b  teNN(db, pList);
bff0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
c000: 20 74 68 65 20 62 69 74 77 69 73 65 2d 4f 52 20   the bitwise-OR 
c010: 6f 66 20 61 6c 6c 20 45 78 70 72 2e 66 6c 61 67  of all Expr.flag
c020: 73 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20  s fields in the 
c030: 67 69 76 65 6e 0a 2a 2a 20 45 78 70 72 4c 69 73  given.** ExprLis
c040: 74 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65  t..*/.u32 sqlite
c050: 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28 63  3ExprListFlags(c
c060: 6f 6e 73 74 20 45 78 70 72 4c 69 73 74 20 2a 70  onst ExprList *p
c070: 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
c080: 20 20 75 33 32 20 6d 20 3d 20 30 3b 0a 20 20 69    u32 m = 0;.  i
c090: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
c0a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
c0b0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
c0c0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
c0d0: 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  r = pList->a[i].
c0e0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 61 73  pExpr;.       as
c0f0: 73 65 72 74 28 20 70 45 78 70 72 21 3d 30 20 29  sert( pExpr!=0 )
c100: 3b 0a 20 20 20 20 20 20 20 6d 20 7c 3d 20 70 45  ;.       m |= pE
c110: 78 70 72 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20  xpr->flags;.    
c120: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d  }.  }.  return m
c130: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65  ;.}../*.** These
c140: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 57 61   routines are Wa
c150: 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 75  lker callbacks u
c160: 73 65 64 20 74 6f 20 63 68 65 63 6b 20 65 78 70  sed to check exp
c170: 72 65 73 73 69 6f 6e 73 20 74 6f 0a 2a 2a 20 73  ressions to.** s
c180: 65 65 20 69 66 20 74 68 65 79 20 61 72 65 20 22  ee if they are "
c190: 63 6f 6e 73 74 61 6e 74 22 20 66 6f 72 20 73 6f  constant" for so
c1a0: 6d 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66  me definition of
c1b0: 20 63 6f 6e 73 74 61 6e 74 2e 20 20 54 68 65 0a   constant.  The.
c1c0: 2a 2a 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20  ** Walker.eCode 
c1d0: 76 61 6c 75 65 20 64 65 74 65 72 6d 69 6e 65 73  value determines
c1e0: 20 74 68 65 20 74 79 70 65 20 6f 66 20 22 63 6f   the type of "co
c1f0: 6e 73 74 61 6e 74 22 20 77 65 20 61 72 65 20 6c  nstant" we are l
c200: 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72 2e 0a 2a  ooking.** for..*
c210: 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 62  *.** These callb
c220: 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ack routines are
c230: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
c240: 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  nt the following
c250: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69  :.**.**     sqli
c260: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
c270: 74 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20  t()             
c280: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
c290: 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20 20 20 73 71  ode==1.**     sq
c2a0: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
c2b0: 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20 20 20 20  antNotJoin()    
c2c0: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
c2d0: 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20 20 20 20  eCode==2.**     
c2e0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61 62  sqlite3ExprIsTab
c2f0: 6c 65 43 6f 6e 73 74 61 6e 74 28 29 20 20 20 20  leConstant()    
c300: 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72           pWalker
c310: 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a 20 20 20  ->eCode==3.**   
c320: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43    sqlite3ExprIsC
c330: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
c340: 6e 28 29 20 20 20 20 20 20 20 20 70 57 61 6c 6b  n()        pWalk
c350: 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20  er->eCode==4 or 
c360: 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c 6c 20 63  5.**.** In all c
c370: 61 73 65 73 2c 20 74 68 65 20 63 61 6c 6c 62 61  ases, the callba
c380: 63 6b 73 20 73 65 74 20 57 61 6c 6b 65 72 2e 65  cks set Walker.e
c390: 43 6f 64 65 3d 30 20 61 6e 64 20 61 62 6f 72 74  Code=0 and abort
c3a0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
c3b0: 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e 64 20 74  on.** is found t
c3c0: 6f 20 6e 6f 74 20 62 65 20 61 20 63 6f 6e 73 74  o not be a const
c3d0: 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ant..**.** The s
c3e0: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
c3f0: 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29  tantOrFunction()
c400: 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 76 61   is used for eva
c410: 6c 75 61 74 69 6e 67 20 65 78 70 72 65 73 73 69  luating expressi
c420: 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41  ons.** in a CREA
c430: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
c440: 6e 74 2e 20 20 54 68 65 20 57 61 6c 6b 65 72 2e  nt.  The Walker.
c450: 65 43 6f 64 65 20 76 61 6c 75 65 20 69 73 20 35  eCode value is 5
c460: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 0a 2a 2a   when parsing.**
c470: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 63 68   an existing sch
c480: 65 6d 61 20 61 6e 64 20 34 20 77 68 65 6e 20 70  ema and 4 when p
c490: 72 6f 63 65 73 73 69 6e 67 20 61 20 6e 65 77 20  rocessing a new 
c4a0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 62 6f  statement.  A bo
c4b0: 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  und.** parameter
c4c0: 20 72 61 69 73 65 73 20 61 6e 20 65 72 72 6f 72   raises an error
c4d0: 20 66 6f 72 20 6e 65 77 20 73 74 61 74 65 6d 65   for new stateme
c4e0: 6e 74 73 2c 20 62 75 74 20 69 73 20 73 69 6c 65  nts, but is sile
c4f0: 6e 74 6c 79 20 63 6f 6e 76 65 72 74 65 64 0a 2a  ntly converted.*
c500: 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f 72 20 65 78  * to NULL for ex
c510: 69 73 74 69 6e 67 20 73 63 68 65 6d 61 73 2e 20  isting schemas. 
c520: 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 73 71 6c   This allows sql
c530: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
c540: 73 20 74 68 61 74 20 0a 2a 2a 20 63 6f 6e 74 61  s that .** conta
c550: 69 6e 20 61 20 62 6f 75 6e 64 20 70 61 72 61 6d  in a bound param
c560: 65 74 65 72 20 62 65 63 61 75 73 65 20 74 68 65  eter because the
c570: 79 20 77 65 72 65 20 67 65 6e 65 72 61 74 65 64  y were generated
c580: 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f   by older versio
c590: 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20  ns.** of SQLite 
c5a0: 74 6f 20 62 65 20 70 61 72 73 65 64 20 62 79 20  to be parsed by 
c5b0: 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
c5c0: 66 20 53 51 4c 69 74 65 20 77 69 74 68 6f 75 74  f SQLite without
c5d0: 20 72 61 69 73 69 6e 67 20 61 0a 2a 2a 20 6d 61   raising a.** ma
c5e0: 6c 66 6f 72 6d 65 64 20 73 63 68 65 6d 61 20 65  lformed schema e
c5f0: 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
c600: 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  int exprNodeIsCo
c610: 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70  nstant(Walker *p
c620: 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
c630: 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70  xpr){..  /* If p
c640: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 69 73  Walker->eCode is
c650: 20 32 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d   2 then any term
c660: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
c670: 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72  on that comes fr
c680: 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f  om.  ** the ON o
c690: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  r USING clauses 
c6a0: 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 64  of a left join d
c6b0: 69 73 71 75 61 6c 69 66 69 65 73 20 74 68 65 20  isqualifies the 
c6c0: 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20  expression.  ** 
c6d0: 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69  from being consi
c6e0: 64 65 72 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20  dered constant. 
c6f0: 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c 6b 65 72  */.  if( pWalker
c700: 2d 3e 65 43 6f 64 65 3d 3d 32 20 26 26 20 45 78  ->eCode==2 && Ex
c710: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
c720: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
c730: 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72  ) ){.    pWalker
c740: 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20  ->eCode = 0;.   
c750: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
c760: 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68  t;.  }..  switch
c770: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
c780: 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66     /* Consider f
c790: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20 63  unctions to be c
c7a0: 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20 74  onstant if all t
c7b0: 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20 61  heir arguments a
c7c0: 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20  re constant.    
c7d0: 2a 2a 20 61 6e 64 20 65 69 74 68 65 72 20 70 57  ** and either pW
c7e0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20  alker->eCode==4 
c7f0: 6f 72 20 35 20 6f 72 20 74 68 65 20 66 75 6e 63  or 5 or the func
c800: 74 69 6f 6e 20 68 61 73 20 74 68 65 0a 20 20 20  tion has the.   
c810: 20 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f   ** SQLITE_FUNC_
c820: 43 4f 4e 53 54 20 66 6c 61 67 2e 20 2a 2f 0a 20  CONST flag. */. 
c830: 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
c840: 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70  ION:.      if( p
c850: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3e 3d 34  Walker->eCode>=4
c860: 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
c870: 72 74 79 28 70 45 78 70 72 2c 45 50 5f 43 6f 6e  rty(pExpr,EP_Con
c880: 73 74 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20  stFunc) ){.     
c890: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
c8a0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65  ntinue;.      }e
c8b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 57 61  lse{.        pWa
c8c0: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b  lker->eCode = 0;
c8d0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
c8e0: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
c8f0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
c900: 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  D:.    case TK_C
c910: 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20  OLUMN:.    case 
c920: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
c930: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
c940: 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 74  _COLUMN:.      t
c950: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
c960: 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20  op==TK_ID );.   
c970: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
c980: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
c990: 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  N );.      testc
c9a0: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
c9b0: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
c9c0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
c9d0: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
c9e0: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _AGG_COLUMN );. 
c9f0: 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72       if( pWalker
ca00: 2d 3e 65 43 6f 64 65 3d 3d 33 20 26 26 20 70 45  ->eCode==3 && pE
ca10: 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61  xpr->iTable==pWa
ca20: 6c 6b 65 72 2d 3e 75 2e 69 43 75 72 20 29 7b 0a  lker->u.iCur ){.
ca30: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
ca40: 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20  RC_Continue;.   
ca50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ca60: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
ca70: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
ca80: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
ca90: 20 20 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65        }.    case
caa0: 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20 20   TK_VARIABLE:.  
cab0: 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d      if( pWalker-
cac0: 3e 65 43 6f 64 65 3d 3d 35 20 29 7b 0a 20 20 20  >eCode==5 ){.   
cad0: 20 20 20 20 20 2f 2a 20 53 69 6c 65 6e 74 6c 79       /* Silently
cae0: 20 63 6f 6e 76 65 72 74 20 62 6f 75 6e 64 20 70   convert bound p
caf0: 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 61  arameters that a
cb00: 70 70 65 61 72 20 69 6e 73 69 64 65 20 6f 66 20  ppear inside of 
cb10: 43 52 45 41 54 45 0a 20 20 20 20 20 20 20 20 2a  CREATE.        *
cb20: 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74  * statements int
cb30: 6f 20 61 20 4e 55 4c 4c 20 77 68 65 6e 20 70 61  o a NULL when pa
cb40: 72 73 69 6e 67 20 74 68 65 20 43 52 45 41 54 45  rsing the CREATE
cb50: 20 73 74 61 74 65 6d 65 6e 74 20 74 65 78 74 20   statement text 
cb60: 6f 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  out.        ** o
cb70: 66 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  f the sqlite_mas
cb80: 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  ter table */.   
cb90: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
cba0: 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20   TK_NULL;.      
cbb0: 7d 65 6c 73 65 20 69 66 28 20 70 57 61 6c 6b 65  }else if( pWalke
cbc0: 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 29 7b 0a 20  r->eCode==4 ){. 
cbd0: 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 75 6e         /* A boun
cbe0: 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e 20 61  d parameter in a
cbf0: 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e   CREATE statemen
cc00: 74 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65  t that originate
cc10: 73 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 2a  s from.        *
cc20: 2a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  * sqlite3_prepar
cc30: 65 28 29 20 63 61 75 73 65 73 20 61 6e 20 65 72  e() causes an er
cc40: 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ror */.        p
cc50: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20  Walker->eCode = 
cc60: 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
cc70: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
cc80: 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61     }.      /* Fa
cc90: 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20  ll through */.  
cca0: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
ccb0: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
ccc0: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
ccd0: 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64 65  ); /* selectNode
cce0: 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c 20  IsConstant will 
ccf0: 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20  disallow */.    
cd00: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
cd10: 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  r->op==TK_EXISTS
cd20: 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64   ); /* selectNod
cd30: 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c  eIsConstant will
cd40: 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20   disallow */.   
cd50: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
cd60: 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74  ntinue;.  }.}.st
cd70: 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 4e  atic int selectN
cd80: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57 61  odeIsConstant(Wa
cd90: 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
cda0: 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 29 7b  elect *NotUsed){
cdb0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
cdc0: 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
cdd0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
cde0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43   0;.  return WRC
cdf0: 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74 61 74 69 63  _Abort;.}.static
ce00: 20 69 6e 74 20 65 78 70 72 49 73 43 6f 6e 73 74   int exprIsConst
ce10: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 6e  (Expr *p, int in
ce20: 69 74 46 6c 61 67 2c 20 69 6e 74 20 69 43 75 72  itFlag, int iCur
ce30: 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
ce40: 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
ce50: 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 65  izeof(w));.  w.e
ce60: 43 6f 64 65 20 3d 20 69 6e 69 74 46 6c 61 67 3b  Code = initFlag;
ce70: 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
ce80: 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 43  ck = exprNodeIsC
ce90: 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 78 53 65  onstant;.  w.xSe
cea0: 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73  lectCallback = s
ceb0: 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74  electNodeIsConst
cec0: 61 6e 74 3b 0a 20 20 77 2e 75 2e 69 43 75 72 20  ant;.  w.u.iCur 
ced0: 3d 20 69 43 75 72 3b 0a 20 20 73 71 6c 69 74 65  = iCur;.  sqlite
cee0: 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29  3WalkExpr(&w, p)
cef0: 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f  ;.  return w.eCo
cf00: 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  de;.}../*.** Wal
cf10: 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
cf20: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f  tree.  Return no
cf30: 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78  n-zero if the ex
cf40: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
cf50: 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66  tant.** and 0 if
cf60: 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72   it involves var
cf70: 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69  iables or functi
cf80: 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20  on calls..**.** 
cf90: 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
cfa0: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
cfb0: 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74  n, a double-quot
cfc0: 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22  ed string (ex: "
cfd0: 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73  abc").** is cons
cfe0: 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c  idered a variabl
cff0: 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71  e but a single-q
d000: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
d010: 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61  : 'abc') is.** a
d020: 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e   constant..*/.in
d030: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
d040: 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29  onstant(Expr *p)
d050: 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49  {.  return exprI
d060: 73 43 6f 6e 73 74 28 70 2c 20 31 2c 20 30 29 3b  sConst(p, 1, 0);
d070: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  .}../*.** Walk a
d080: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
d090: 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  e.  Return non-z
d0a0: 65 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65  ero if the expre
d0b0: 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
d0c0: 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e  t.** that does n
d0d0: 6f 20 6f 72 69 67 69 6e 61 74 65 20 66 72 6f 6d  o originate from
d0e0: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
d0f0: 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f   clauses of a jo
d100: 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  in..** Return 0 
d110: 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76  if it involves v
d120: 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63  ariables or func
d130: 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65  tion calls or te
d140: 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f  rms from.** an O
d150: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
d160: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
d170: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e  3ExprIsConstantN
d180: 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b  otJoin(Expr *p){
d190: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
d1a0: 43 6f 6e 73 74 28 70 2c 20 32 2c 20 30 29 3b 0a  Const(p, 2, 0);.
d1b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
d1c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
d1d0: 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  .  Return non-ze
d1e0: 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ro if the expres
d1f0: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
d200: 0a 2a 2a 20 66 6f 72 20 61 6e 79 20 73 69 6e 67  .** for any sing
d210: 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 74 61  le row of the ta
d220: 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72 20  ble with cursor 
d230: 69 43 75 72 2e 20 20 49 6e 20 6f 74 68 65 72 20  iCur.  In other 
d240: 77 6f 72 64 73 2c 20 74 68 65 0a 2a 2a 20 65 78  words, the.** ex
d250: 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 6e 6f  pression must no
d260: 74 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20 6e  t refer to any n
d270: 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63  on-deterministic
d280: 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 20 61 6e   function nor an
d290: 79 0a 2a 2a 20 74 61 62 6c 65 20 6f 74 68 65 72  y.** table other
d2a0: 20 74 68 61 6e 20 69 43 75 72 2e 0a 2a 2f 0a 69   than iCur..*/.i
d2b0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
d2c0: 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 45 78  TableConstant(Ex
d2d0: 70 72 20 2a 70 2c 20 69 6e 74 20 69 43 75 72 29  pr *p, int iCur)
d2e0: 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49  {.  return exprI
d2f0: 73 43 6f 6e 73 74 28 70 2c 20 33 2c 20 69 43 75  sConst(p, 3, iCu
d300: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  r);.}../*.** Wal
d310: 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
d320: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f  tree.  Return no
d330: 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78  n-zero if the ex
d340: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
d350: 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e  tant.** or a fun
d360: 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20  ction call with 
d370: 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e  constant argumen
d380: 74 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20  ts.  Return and 
d390: 30 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72  0 if there.** ar
d3a0: 65 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e  e any variables.
d3b0: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70  .**.** For the p
d3c0: 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20  urposes of this 
d3d0: 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62  function, a doub
d3e0: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
d3f0: 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20   (ex: "abc").** 
d400: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
d410: 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73  variable but a s
d420: 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ingle-quoted str
d430: 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20  ing (ex: 'abc') 
d440: 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74  is.** a constant
d450: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
d460: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
d470: 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70  Function(Expr *p
d480: 2c 20 75 38 20 69 73 49 6e 69 74 29 7b 0a 20 20  , u8 isInit){.  
d490: 61 73 73 65 72 74 28 20 69 73 49 6e 69 74 3d 3d  assert( isInit==
d4a0: 30 20 7c 7c 20 69 73 49 6e 69 74 3d 3d 31 20 29  0 || isInit==1 )
d4b0: 3b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49  ;.  return exprI
d4c0: 73 43 6f 6e 73 74 28 70 2c 20 34 2b 69 73 49 6e  sConst(p, 4+isIn
d4d0: 69 74 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 64 65  it, 0);.}..#ifde
d4e0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
d4f0: 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a  CURSOR_HINTS./*.
d500: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
d510: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
d520: 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70  urn 1 if the exp
d530: 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ression contains
d540: 20 61 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 6f   a.** subquery o
d550: 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 52 65  f some kind.  Re
d560: 74 75 72 6e 20 30 20 69 66 20 74 68 65 72 65 20  turn 0 if there 
d570: 61 72 65 20 6e 6f 20 73 75 62 71 75 65 72 69 65  are no subquerie
d580: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
d590: 33 45 78 70 72 43 6f 6e 74 61 69 6e 73 53 75 62  3ExprContainsSub
d5a0: 71 75 65 72 79 28 45 78 70 72 20 2a 70 29 7b 0a  query(Expr *p){.
d5b0: 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65    Walker w;.  me
d5c0: 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
d5d0: 6f 66 28 77 29 29 3b 0a 20 20 77 2e 65 43 6f 64  of(w));.  w.eCod
d5e0: 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70 72  e = 1;.  w.xExpr
d5f0: 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74  Callback = sqlit
d600: 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a  e3ExprWalkNoop;.
d610: 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
d620: 61 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65  ack = selectNode
d630: 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 73 71  IsConstant;.  sq
d640: 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
d650: 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77  , p);.  return w
d660: 2e 65 43 6f 64 65 3d 3d 30 3b 0a 7d 0a 23 65 6e  .eCode==0;.}.#en
d670: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  dif../*.** If th
d680: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63  e expression p c
d690: 6f 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  odes a constant 
d6a0: 69 6e 74 65 67 65 72 20 74 68 61 74 20 69 73 20  integer that is 
d6b0: 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20  small enough.** 
d6c0: 74 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62  to fit in a 32-b
d6d0: 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75  it integer, retu
d6e0: 72 6e 20 31 20 61 6e 64 20 70 75 74 20 74 68 65  rn 1 and put the
d6f0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e   value of the in
d700: 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61  teger.** in *pVa
d710: 6c 75 65 2e 20 20 49 66 20 74 68 65 20 65 78 70  lue.  If the exp
d720: 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61  ression is not a
d730: 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20  n integer or if 
d740: 69 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a  it is too big.**
d750: 20 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67   to fit in a sig
d760: 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67  ned 32-bit integ
d770: 65 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64  er, return 0 and
d780: 20 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75   leave *pValue u
d790: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74  nchanged..*/.int
d7a0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
d7b0: 74 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69  teger(Expr *p, i
d7c0: 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69  nt *pValue){.  i
d7d0: 6e 74 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a  nt rc = 0;..  /*
d7e0: 20 49 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   If an expressio
d7f0: 6e 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  n is an integer 
d800: 6c 69 74 65 72 61 6c 20 74 68 61 74 20 66 69 74  literal that fit
d810: 73 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32  s in a signed 32
d820: 2d 62 69 74 0a 20 20 2a 2a 20 69 6e 74 65 67 65  -bit.  ** intege
d830: 72 2c 20 74 68 65 6e 20 74 68 65 20 45 50 5f 49  r, then the EP_I
d840: 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 77 69 6c  ntValue flag wil
d850: 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  l have already b
d860: 65 65 6e 20 73 65 74 20 2a 2f 0a 20 20 61 73 73  een set */.  ass
d870: 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49  ert( p->op!=TK_I
d880: 4e 54 45 47 45 52 20 7c 7c 20 28 70 2d 3e 66 6c  NTEGER || (p->fl
d890: 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75  ags & EP_IntValu
d8a0: 65 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  e)!=0.          
d8b0: 20 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e   || sqlite3GetIn
d8c0: 74 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  t32(p->u.zToken,
d8d0: 20 26 72 63 29 3d 3d 30 20 29 3b 0a 0a 20 20 69   &rc)==0 );..  i
d8e0: 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50  f( p->flags & EP
d8f0: 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20  _IntValue ){.   
d900: 20 2a 70 56 61 6c 75 65 20 3d 20 70 2d 3e 75 2e   *pValue = p->u.
d910: 69 56 61 6c 75 65 3b 0a 20 20 20 20 72 65 74 75  iValue;.    retu
d920: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74  rn 1;.  }.  swit
d930: 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
d940: 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20   case TK_UPLUS: 
d950: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
d960: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
d970: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c  r(p->pLeft, pVal
d980: 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ue);.      break
d990: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
d9a0: 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20   TK_UMINUS: {.  
d9b0: 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 20      int v;.     
d9c0: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
d9d0: 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65  IsInteger(p->pLe
d9e0: 66 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20  ft, &v) ){.     
d9f0: 20 20 20 61 73 73 65 72 74 28 20 76 21 3d 28 2d     assert( v!=(-
da00: 32 31 34 37 34 38 33 36 34 37 2d 31 29 20 29 3b  2147483647-1) );
da10: 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65  .        *pValue
da20: 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72   = -v;.        r
da30: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  c = 1;.      }. 
da40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
da50: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62  }.    default: b
da60: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
da70: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
da80: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  Return FALSE if 
da90: 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e  there is no chan
daa0: 63 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72  ce that the expr
dab0: 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20 4e 55  ession can be NU
dac0: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  LL..**.** If the
dad0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68   expression migh
dae0: 74 20 62 65 20 4e 55 4c 4c 20 6f 72 20 69 66 20  t be NULL or if 
daf0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
db00: 73 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a  s too complex.**
db10: 20 74 6f 20 74 65 6c 6c 20 72 65 74 75 72 6e 20   to tell return 
db20: 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  TRUE.  .**.** Th
db30: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
db40: 65 64 20 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ed as an optimiz
db50: 61 74 69 6f 6e 2c 20 74 6f 20 73 6b 69 70 20 4f  ation, to skip O
db60: 50 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f 64 65 73  P_IsNull opcodes
db70: 0a 2a 2a 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77  .** when we know
db80: 20 74 68 61 74 20 61 20 76 61 6c 75 65 20 63 61   that a value ca
db90: 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 20 48  nnot be NULL.  H
dba0: 65 6e 63 65 2c 20 61 20 66 61 6c 73 65 20 70 6f  ence, a false po
dbb0: 73 69 74 69 76 65 0a 2a 2a 20 28 72 65 74 75 72  sitive.** (retur
dbc0: 6e 69 6e 67 20 54 52 55 45 20 77 68 65 6e 20 69  ning TRUE when i
dbd0: 6e 20 66 61 63 74 20 74 68 65 20 65 78 70 72 65  n fact the expre
dbe0: 73 73 69 6f 6e 20 63 61 6e 20 6e 65 76 65 72 20  ssion can never 
dbf0: 62 65 20 4e 55 4c 4c 29 20 6d 69 67 68 74 0a 2a  be NULL) might.*
dc00: 2a 20 62 65 20 61 20 73 6d 61 6c 6c 20 70 65 72  * be a small per
dc10: 66 6f 72 6d 61 6e 63 65 20 68 69 74 20 62 75 74  formance hit but
dc20: 20 69 73 20 6f 74 68 65 72 77 69 73 65 20 68 61   is otherwise ha
dc30: 72 6d 6c 65 73 73 2e 20 20 4f 6e 20 74 68 65 20  rmless.  On the 
dc40: 6f 74 68 65 72 0a 2a 2a 20 68 61 6e 64 2c 20 61  other.** hand, a
dc50: 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 20   false negative 
dc60: 28 72 65 74 75 72 6e 69 6e 67 20 46 41 4c 53 45  (returning FALSE
dc70: 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   when the result
dc80: 20 63 6f 75 6c 64 20 62 65 20 4e 55 4c 4c 29 0a   could be NULL).
dc90: 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72  ** will likely r
dca0: 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f  esult in an inco
dcb0: 72 72 65 63 74 20 61 6e 73 77 65 72 2e 20 20 53  rrect answer.  S
dcc0: 6f 20 77 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c  o when in doubt,
dcd0: 20 72 65 74 75 72 6e 0a 2a 2a 20 54 52 55 45 2e   return.** TRUE.
dce0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
dcf0: 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e  xprCanBeNull(con
dd00: 73 74 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 75  st Expr *p){.  u
dd10: 38 20 6f 70 3b 0a 20 20 77 68 69 6c 65 28 20 70  8 op;.  while( p
dd20: 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c  ->op==TK_UPLUS |
dd30: 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e  | p->op==TK_UMIN
dd40: 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65  US ){ p = p->pLe
dd50: 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e  ft; }.  op = p->
dd60: 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  op;.  if( op==TK
dd70: 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d  _REGISTER ) op =
dd80: 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63   p->op2;.  switc
dd90: 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
dda0: 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20  e TK_INTEGER:.  
ddb0: 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
ddc0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  :.    case TK_FL
ddd0: 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  OAT:.    case TK
dde0: 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65 74  _BLOB:.      ret
ddf0: 75 72 6e 20 30 3b 0a 20 20 20 20 63 61 73 65 20  urn 0;.    case 
de00: 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20  TK_COLUMN:.     
de10: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 54 61 62   assert( p->pTab
de20: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  !=0 );.      ret
de30: 75 72 6e 20 45 78 70 72 48 61 73 50 72 6f 70 65  urn ExprHasPrope
de40: 72 74 79 28 70 2c 20 45 50 5f 43 61 6e 42 65 4e  rty(p, EP_CanBeN
de50: 75 6c 6c 29 20 7c 7c 0a 20 20 20 20 20 20 20 20  ull) ||.        
de60: 20 20 20 20 20 28 70 2d 3e 69 43 6f 6c 75 6d 6e       (p->iColumn
de70: 3e 3d 30 20 26 26 20 70 2d 3e 70 54 61 62 2d 3e  >=0 && p->pTab->
de80: 61 43 6f 6c 5b 70 2d 3e 69 43 6f 6c 75 6d 6e 5d  aCol[p->iColumn]
de90: 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 29 3b 0a 20 20  .notNull==0);.  
dea0: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
deb0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d   return 1;.  }.}
dec0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
ded0: 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
dee0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
def0: 20 63 6f 6e 73 74 61 6e 74 20 77 68 69 63 68 20   constant which 
df00: 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 75 6e 63 68  would be.** unch
df10: 61 6e 67 65 64 20 62 79 20 4f 50 5f 41 66 66 69  anged by OP_Affi
df20: 6e 69 74 79 20 77 69 74 68 20 74 68 65 20 61 66  nity with the af
df30: 66 69 6e 69 74 79 20 67 69 76 65 6e 20 69 6e 20  finity given in 
df40: 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72  the second.** ar
df50: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  gument..**.** Th
df60: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
df70: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
df80: 69 66 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69  if the OP_Affini
df90: 74 79 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20  ty operation.** 
dfa0: 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 2e 20  can be omitted. 
dfb0: 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 20 72   When in doubt r
dfc0: 65 74 75 72 6e 20 46 41 4c 53 45 2e 20 20 41 20  eturn FALSE.  A 
dfd0: 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 0a 2a  false negative.*
dfe0: 2a 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 20 20  * is harmless.  
dff0: 41 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65  A false positive
e000: 2c 20 68 6f 77 65 76 65 72 2c 20 63 61 6e 20 72  , however, can r
e010: 65 73 75 6c 74 20 69 6e 20 74 68 65 20 77 72 6f  esult in the wro
e020: 6e 67 0a 2a 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f  ng.** answer..*/
e030: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
e040: 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43  NeedsNoAffinityC
e050: 68 61 6e 67 65 28 63 6f 6e 73 74 20 45 78 70 72  hange(const Expr
e060: 20 2a 70 2c 20 63 68 61 72 20 61 66 66 29 7b 0a   *p, char aff){.
e070: 20 20 75 38 20 6f 70 3b 0a 20 20 69 66 28 20 61    u8 op;.  if( a
e080: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42  ff==SQLITE_AFF_B
e090: 4c 4f 42 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  LOB ) return 1;.
e0a0: 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d    while( p->op==
e0b0: 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f  TK_UPLUS || p->o
e0c0: 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20  p==TK_UMINUS ){ 
e0d0: 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a  p = p->pLeft; }.
e0e0: 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20    op = p->op;.  
e0f0: 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  if( op==TK_REGIS
e100: 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70  TER ) op = p->op
e110: 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  2;.  switch( op 
e120: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  ){.    case TK_I
e130: 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
e140: 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49  return aff==SQLI
e150: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c  TE_AFF_INTEGER |
e160: 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  | aff==SQLITE_AF
e170: 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d  F_NUMERIC;.    }
e180: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
e190: 41 54 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  AT: {.      retu
e1a0: 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  rn aff==SQLITE_A
e1b0: 46 46 5f 52 45 41 4c 20 7c 7c 20 61 66 66 3d 3d  FF_REAL || aff==
e1c0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
e1d0: 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  IC;.    }.    ca
e1e0: 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a  se TK_STRING: {.
e1f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66        return aff
e200: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  ==SQLITE_AFF_TEX
e210: 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  T;.    }.    cas
e220: 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  e TK_BLOB: {.   
e230: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
e240: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43   }.    case TK_C
e250: 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61  OLUMN: {.      a
e260: 73 73 65 72 74 28 20 70 2d 3e 69 54 61 62 6c 65  ssert( p->iTable
e270: 3e 3d 30 20 29 3b 20 20 2f 2a 20 70 20 63 61 6e  >=0 );  /* p can
e280: 6e 6f 74 20 62 65 20 70 61 72 74 20 6f 66 20 61  not be part of a
e290: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
e2a0: 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  t */.      retur
e2b0: 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20  n p->iColumn<0. 
e2c0: 20 20 20 20 20 20 20 20 20 26 26 20 28 61 66 66           && (aff
e2d0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  ==SQLITE_AFF_INT
e2e0: 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c  EGER || aff==SQL
e2f0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 29  ITE_AFF_NUMERIC)
e300: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
e310: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  ult: {.      ret
e320: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
e330: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
e340: 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
e350: 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61 20 72  en string is a r
e360: 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ow-id column nam
e370: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
e380: 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63  3IsRowid(const c
e390: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73  har *z){.  if( s
e3a0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
e3b0: 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29   "_ROWID_")==0 )
e3c0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
e3d0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
e3e0: 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30 20 29  z, "ROWID")==0 )
e3f0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
e400: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
e410: 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29 20 72  z, "OID")==0 ) r
e420: 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
e430: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 58  n 0;.}../*.** pX
e440: 20 69 73 20 74 68 65 20 52 48 53 20 6f 66 20 61   is the RHS of a
e450: 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20  n IN operator.  
e460: 49 66 20 70 58 20 69 73 20 61 20 53 45 4c 45 43  If pX is a SELEC
e470: 54 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20  T statement .** 
e480: 74 68 61 74 20 63 61 6e 20 62 65 20 73 69 6d 70  that can be simp
e490: 6c 69 66 69 65 64 20 74 6f 20 61 20 64 69 72 65  lified to a dire
e4a0: 63 74 20 74 61 62 6c 65 20 61 63 63 65 73 73 2c  ct table access,
e4b0: 20 74 68 65 6e 20 72 65 74 75 72 6e 0a 2a 2a 20   then return.** 
e4c0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
e4d0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
e4e0: 74 2e 20 20 49 66 20 70 58 20 69 73 20 6e 6f 74  t.  If pX is not
e4f0: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
e500: 65 6e 74 2c 0a 2a 2a 20 6f 72 20 69 66 20 74 68  ent,.** or if th
e510: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
e520: 6e 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6d  nt needs to be m
e530: 61 6e 69 66 65 73 74 65 64 20 69 6e 74 6f 20 61  anifested into a
e540: 20 74 72 61 6e 73 69 65 6e 74 0a 2a 2a 20 74 61   transient.** ta
e550: 62 6c 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ble, then return
e560: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 6e 64 65   NULL..*/.#ifnde
e570: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
e580: 42 51 55 45 52 59 0a 73 74 61 74 69 63 20 53 65  BQUERY.static Se
e590: 6c 65 63 74 20 2a 69 73 43 61 6e 64 69 64 61 74  lect *isCandidat
e5a0: 65 46 6f 72 49 6e 4f 70 74 28 45 78 70 72 20 2a  eForInOpt(Expr *
e5b0: 70 58 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  pX){.  Select *p
e5c0: 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  ;.  SrcList *pSr
e5d0: 63 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  c;.  ExprList *p
e5e0: 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a  EList;.  Table *
e5f0: 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pTab;.  int i;. 
e600: 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
e610: 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73  perty(pX, EP_xIs
e620: 53 65 6c 65 63 74 29 20 29 20 72 65 74 75 72 6e  Select) ) return
e630: 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 61 20 73 75   0;  /* Not a su
e640: 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20  bquery */.  if( 
e650: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
e660: 70 58 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74  pX, EP_VarSelect
e670: 29 20 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  )  ) return 0;  
e680: 2f 2a 20 43 6f 72 72 65 6c 61 74 65 64 20 73 75  /* Correlated su
e690: 62 71 20 2a 2f 0a 20 20 70 20 3d 20 70 58 2d 3e  bq */.  p = pX->
e6a0: 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 69 66 28  x.pSelect;.  if(
e6b0: 20 70 2d 3e 70 50 72 69 6f 72 20 29 20 72 65 74   p->pPrior ) ret
e6c0: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
e6d0: 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d      /* Not a com
e6e0: 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a  pound SELECT */.
e6f0: 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
e700: 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
e710: 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 20 29  |SF_Aggregate) )
e720: 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  {.    testcase( 
e730: 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  (p->selFlags & (
e740: 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
e750: 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44  ggregate))==SF_D
e760: 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 74  istinct );.    t
e770: 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c  estcase( (p->sel
e780: 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
e790: 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
e7a0: 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74  e))==SF_Aggregat
e7b0: 65 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  e );.    return 
e7c0: 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54 49 4e 43  0; /* No DISTINC
e7d0: 54 20 6b 65 79 77 6f 72 64 20 61 6e 64 20 6e 6f  T keyword and no
e7e0: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
e7f0: 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20 61 73  ions */.  }.  as
e800: 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42  sert( p->pGroupB
e810: 79 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  y==0 );         
e820: 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 47       /* Has no G
e830: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a  ROUP BY clause *
e840: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69  /.  if( p->pLimi
e850: 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
e860: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
e870: 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c 61 75 73  s no LIMIT claus
e880: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  e */.  assert( p
e890: 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20  ->pOffset==0 ); 
e8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e8b0: 20 4e 6f 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20   No LIMIT means 
e8c0: 6e 6f 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69  no OFFSET */.  i
e8d0: 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72  f( p->pWhere ) r
e8e0: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
e8f0: 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20        /* Has no 
e900: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
e910: 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
e920: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
e930: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 53 72  !=0 );.  if( pSr
e940: 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74  c->nSrc!=1 ) ret
e950: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
e960: 2f 2a 20 53 69 6e 67 6c 65 20 74 65 72 6d 20 69  /* Single term i
e970: 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  n FROM clause */
e980: 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30  .  if( pSrc->a[0
e990: 5d 2e 70 53 65 6c 65 63 74 20 29 20 72 65 74 75  ].pSelect ) retu
e9a0: 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f  rn 0;     /* FRO
e9b0: 4d 20 69 73 20 6e 6f 74 20 61 20 73 75 62 71 75  M is not a subqu
e9c0: 65 72 79 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20  ery or view */. 
e9d0: 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b   pTab = pSrc->a[
e9e0: 30 5d 2e 70 54 61 62 3b 0a 20 20 61 73 73 65 72  0].pTab;.  asser
e9f0: 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
ea00: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70 53  assert( pTab->pS
ea10: 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20 20 20  elect==0 );     
ea20: 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63         /* FROM c
ea30: 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61 20 76  lause is not a v
ea40: 69 65 77 20 2a 2f 0a 20 20 69 66 28 20 49 73 56  iew */.  if( IsV
ea50: 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72  irtual(pTab) ) r
ea60: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
ea70: 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6e  /* FROM clause n
ea80: 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ot a virtual tab
ea90: 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d  le */.  pEList =
eaa0: 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f   p->pEList;..  /
eab0: 2a 20 41 6c 6c 20 53 45 4c 45 43 54 20 72 65 73  * All SELECT res
eac0: 75 6c 74 73 20 6d 75 73 74 20 62 65 20 63 6f 6c  ults must be col
ead0: 75 6d 6e 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  umns. */.  for(i
eae0: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
eaf0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
eb00: 78 70 72 20 2a 70 52 65 73 20 3d 20 70 45 4c 69  xpr *pRes = pELi
eb10: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
eb20: 20 20 20 20 69 66 28 20 70 52 65 73 2d 3e 6f 70      if( pRes->op
eb30: 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65  !=TK_COLUMN ) re
eb40: 74 75 72 6e 20 30 3b 0a 20 20 20 20 61 73 73 65  turn 0;.    asse
eb50: 72 74 28 20 70 52 65 73 2d 3e 69 54 61 62 6c 65  rt( pRes->iTable
eb60: 3d 3d 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75  ==pSrc->a[0].iCu
eb70: 72 73 6f 72 20 29 3b 20 20 2f 2a 20 4e 6f 74 20  rsor );  /* Not 
eb80: 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62  a correlated sub
eb90: 71 75 65 72 79 20 2a 2f 0a 20 20 7d 0a 20 20 72  query */.  }.  r
eba0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 23 65 6e 64 69  eturn p;.}.#endi
ebb0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
ebc0: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a  _SUBQUERY */../*
ebd0: 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 4f  .** Code an OP_O
ebe0: 6e 63 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  nce instruction 
ebf0: 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 73 70 61  and allocate spa
ec00: 63 65 20 66 6f 72 20 69 74 73 20 66 6c 61 67 2e  ce for its flag.
ec10: 20 52 65 74 75 72 6e 20 74 68 65 20 0a 2a 2a 20   Return the .** 
ec20: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
ec30: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ew instruction..
ec40: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f  */.int sqlite3Co
ec50: 64 65 4f 6e 63 65 28 50 61 72 73 65 20 2a 70 50  deOnce(Parse *pP
ec60: 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  arse){.  Vdbe *v
ec70: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
ec80: 65 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 20  e(pParse);      
ec90: 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61 63 68 69  /* Virtual machi
eca0: 6e 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  ne being coded *
ecb0: 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  /.  return sqlit
ecc0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
ecd0: 4f 50 5f 4f 6e 63 65 2c 20 70 50 61 72 73 65 2d  OP_Once, pParse-
ece0: 3e 6e 4f 6e 63 65 2b 2b 29 3b 0a 7d 0a 0a 23 69  >nOnce++);.}..#i
ecf0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ed00: 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
ed10: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
ed20: 68 61 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c  hat checks the l
ed30: 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  eft-most column 
ed40: 6f 66 20 69 6e 64 65 78 20 74 61 62 6c 65 20 69  of index table i
ed50: 43 75 72 20 74 6f 20 73 65 65 20 69 66 0a 2a 2a  Cur to see if.**
ed60: 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79   it contains any
ed70: 20 4e 55 4c 4c 20 65 6e 74 72 69 65 73 2e 20 20   NULL entries.  
ed80: 43 61 75 73 65 20 74 68 65 20 72 65 67 69 73 74  Cause the regist
ed90: 65 72 20 61 74 20 72 65 67 48 61 73 4e 75 6c 6c  er at regHasNull
eda0: 20 74 6f 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f   to be set.** to
edb0: 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75   a non-NULL valu
edc0: 65 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61 69  e if iCur contai
edd0: 6e 73 20 6e 6f 20 4e 55 4c 4c 73 2e 20 20 43 61  ns no NULLs.  Ca
ede0: 75 73 65 20 72 65 67 69 73 74 65 72 20 72 65 67  use register reg
edf0: 48 61 73 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 62 65  HasNull.** to be
ee00: 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20   set to NULL if 
ee10: 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  iCur contains on
ee20: 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76  e or more NULL v
ee30: 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  alues..*/.static
ee40: 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 74   void sqlite3Set
ee50: 48 61 73 4e 75 6c 6c 46 6c 61 67 28 56 64 62 65  HasNullFlag(Vdbe
ee60: 20 2a 76 2c 20 69 6e 74 20 69 43 75 72 2c 20 69   *v, int iCur, i
ee70: 6e 74 20 72 65 67 48 61 73 4e 75 6c 6c 29 7b 0a  nt regHasNull){.
ee80: 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20 73    int addr1;.  s
ee90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
eea0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
eeb0: 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a  0, regHasNull);.
eec0: 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
eed0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
eee0: 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 29 3b  P_Rewind, iCur);
eef0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
ef00: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
ef10: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
ef20: 6d 6e 2c 20 69 43 75 72 2c 20 30 2c 20 72 65 67  mn, iCur, 0, reg
ef30: 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 73 71 6c 69  HasNull);.  sqli
ef40: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
ef50: 76 2c 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46  v, OPFLAG_TYPEOF
ef60: 41 52 47 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  ARG);.  VdbeComm
ef70: 65 6e 74 28 28 76 2c 20 22 66 69 72 73 74 5f 65  ent((v, "first_e
ef80: 6e 74 72 79 5f 69 6e 28 25 64 29 22 2c 20 69 43  ntry_in(%d)", iC
ef90: 75 72 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ur));.  sqlite3V
efa0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
efb0: 64 64 72 31 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ddr1);.}.#endif.
efc0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
efd0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
efe0: 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
eff0: 74 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61  t is an IN opera
f000: 74 6f 72 20 77 69 74 68 20 61 20 6c 69 73 74 20  tor with a list 
f010: 28 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 29  (not a subquery)
f020: 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 72 69 67 68   on the .** righ
f030: 74 2d 68 61 6e 64 20 73 69 64 65 2e 20 20 52 65  t-hand side.  Re
f040: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 61  turn TRUE if tha
f050: 74 20 6c 69 73 74 20 69 73 20 63 6f 6e 73 74 61  t list is consta
f060: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
f070: 74 20 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73  t sqlite3InRhsIs
f080: 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70  Constant(Expr *p
f090: 49 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c 48  In){.  Expr *pLH
f0a0: 53 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  S;.  int res;.  
f0b0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
f0c0: 50 72 6f 70 65 72 74 79 28 70 49 6e 2c 20 45 50  Property(pIn, EP
f0d0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
f0e0: 20 70 4c 48 53 20 3d 20 70 49 6e 2d 3e 70 4c 65   pLHS = pIn->pLe
f0f0: 66 74 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74  ft;.  pIn->pLeft
f100: 20 3d 20 30 3b 0a 20 20 72 65 73 20 3d 20 73 71   = 0;.  res = sq
f110: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
f120: 61 6e 74 28 70 49 6e 29 3b 0a 20 20 70 49 6e 2d  ant(pIn);.  pIn-
f130: 3e 70 4c 65 66 74 20 3d 20 70 4c 48 53 3b 0a 20  >pLeft = pLHS;. 
f140: 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 23   return res;.}.#
f150: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
f160: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
f170: 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d  ed by the implem
f180: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
f190: 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f  IN (...) operato
f1a0: 72 2e 0a 2a 2a 20 54 68 65 20 70 58 20 70 61 72  r..** The pX par
f1b0: 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 65 78  ameter is the ex
f1c0: 70 72 65 73 73 69 6f 6e 20 6f 6e 20 74 68 65 20  pression on the 
f1d0: 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
f1e0: 65 72 61 74 6f 72 2c 20 77 68 69 63 68 0a 2a 2a  erator, which.**
f1f0: 20 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72   might be either
f200: 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65   a list of expre
f210: 73 73 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 71  ssions or a subq
f220: 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  uery..**.** The 
f230: 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74  job of this rout
f240: 69 6e 65 20 69 73 20 74 6f 20 66 69 6e 64 20 6f  ine is to find o
f250: 72 20 63 72 65 61 74 65 20 61 20 62 2d 74 72 65  r create a b-tre
f260: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 63 61  e object that ca
f270: 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 65 69 74  n.** be used eit
f280: 68 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20  her to test for 
f290: 6d 65 6d 62 65 72 73 68 69 70 20 69 6e 20 74 68  membership in th
f2a0: 65 20 52 48 53 20 73 65 74 20 6f 72 20 74 6f 20  e RHS set or to 
f2b0: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 0a  iterate through.
f2c0: 2a 2a 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f  ** all members o
f2d0: 66 20 74 68 65 20 52 48 53 20 73 65 74 2c 20 73  f the RHS set, s
f2e0: 6b 69 70 70 69 6e 67 20 64 75 70 6c 69 63 61 74  kipping duplicat
f2f0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72 73  es..**.** A curs
f300: 6f 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20  or is opened on 
f310: 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63  the b-tree objec
f320: 74 20 74 68 61 74 20 69 73 20 74 68 65 20 52 48  t that is the RH
f330: 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
f340: 61 74 6f 72 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e  ator.** and pX->
f350: 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  iTable is set to
f360: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
f370: 61 74 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  at cursor..**.**
f380: 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   The returned va
f390: 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  lue of this func
f3a0: 74 69 6f 6e 20 69 6e 64 69 63 61 74 65 73 20 74  tion indicates t
f3b0: 68 65 20 62 2d 74 72 65 65 20 74 79 70 65 2c 20  he b-tree type, 
f3c0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
f3d0: 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  *   IN_INDEX_ROW
f3e0: 49 44 20 20 20 20 20 20 2d 20 54 68 65 20 63 75  ID      - The cu
f3f0: 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
f400: 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 61  on a database ta
f410: 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  ble..**   IN_IND
f420: 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 20 2d 20  EX_INDEX_ASC  - 
f430: 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
f440: 70 65 6e 65 64 20 6f 6e 20 61 6e 20 61 73 63 65  pened on an asce
f450: 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20  nding index..** 
f460: 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58    IN_INDEX_INDEX
f470: 5f 44 45 53 43 20 2d 20 54 68 65 20 63 75 72 73  _DESC - The curs
f480: 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
f490: 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e   a descending in
f4a0: 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  dex..**   IN_IND
f4b0: 45 58 5f 45 50 48 20 20 20 20 20 20 20 20 2d 20  EX_EPH        - 
f4c0: 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
f4d0: 70 65 6e 65 64 20 6f 6e 20 61 20 73 70 65 63 69  pened on a speci
f4e0: 61 6c 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64  ally created and
f4f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
f500: 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 70 75              popu
f510: 6c 61 74 65 64 20 65 70 68 65 72 65 6d 61 6c 20  lated epheremal 
f520: 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49  table..**   IN_I
f530: 4e 44 45 58 5f 4e 4f 4f 50 20 20 20 20 20 20 20  NDEX_NOOP       
f540: 2d 20 4e 6f 20 63 75 72 73 6f 72 20 77 61 73 20  - No cursor was 
f550: 61 6c 6c 6f 63 61 74 65 64 2e 20 20 54 68 65 20  allocated.  The 
f560: 49 4e 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74  IN operator must
f570: 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   be.**          
f580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
f590: 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
f5a0: 73 65 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70  sequence of comp
f5b0: 61 72 69 73 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41  arisons..**.** A
f5c0: 6e 20 65 78 69 73 74 69 6e 67 20 62 2d 74 72 65  n existing b-tre
f5d0: 65 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 20  e might be used 
f5e0: 69 66 20 74 68 65 20 52 48 53 20 65 78 70 72 65  if the RHS expre
f5f0: 73 73 69 6f 6e 20 70 58 20 69 73 20 61 20 73 69  ssion pX is a si
f600: 6d 70 6c 65 0a 2a 2a 20 73 75 62 71 75 65 72 79  mple.** subquery
f610: 20 73 75 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20   such as:.**.** 
f620: 20 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75      SELECT <colu
f630: 6d 6e 31 3e 2c 20 3c 63 6f 6c 75 6d 6e 32 3e 2e  mn1>, <column2>.
f640: 2e 2e 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a  .. FROM <table>.
f650: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 52 48 53  **.** If the RHS
f660: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
f670: 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20 6f 72  tor is a list or
f680: 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20   a more complex 
f690: 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a  subquery, then.*
f6a0: 2a 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  * an ephemeral t
f6b0: 61 62 6c 65 20 6d 69 67 68 74 20 6e 65 65 64 20  able might need 
f6c0: 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 20  to be generated 
f6d0: 66 72 6f 6d 20 74 68 65 20 52 48 53 20 61 6e 64  from the RHS and
f6e0: 20 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61   then.** pX->iTa
f6f0: 62 6c 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e  ble made to poin
f700: 74 20 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72  t to the ephemer
f710: 61 6c 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64  al table instead
f720: 20 6f 66 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69   of an.** existi
f730: 6e 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ng table..**.** 
f740: 54 68 65 20 69 6e 46 6c 61 67 73 20 70 61 72 61  The inFlags para
f750: 6d 65 74 65 72 20 6d 75 73 74 20 63 6f 6e 74 61  meter must conta
f760: 69 6e 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 6f  in exactly one o
f770: 66 20 74 68 65 20 62 69 74 73 0a 2a 2a 20 49 4e  f the bits.** IN
f780: 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49  _INDEX_MEMBERSHI
f790: 50 20 6f 72 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f  P or IN_INDEX_LO
f7a0: 4f 50 2e 20 20 49 66 20 69 6e 46 6c 61 67 73 20  OP.  If inFlags 
f7b0: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 49 4e 5f 49  contains.** IN_I
f7c0: 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 2c  NDEX_MEMBERSHIP,
f7d0: 20 74 68 65 6e 20 74 68 65 20 67 65 6e 65 72 61   then the genera
f7e0: 74 65 64 20 74 61 62 6c 65 20 77 69 6c 6c 20 62  ted table will b
f7f0: 65 20 75 73 65 64 20 66 6f 72 20 61 0a 2a 2a 20  e used for a.** 
f800: 66 61 73 74 20 6d 65 6d 62 65 72 73 68 69 70 20  fast membership 
f810: 74 65 73 74 2e 20 20 57 68 65 6e 20 74 68 65 20  test.  When the 
f820: 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 69  IN_INDEX_LOOP bi
f830: 74 20 69 73 20 73 65 74 2c 20 74 68 65 0a 2a 2a  t is set, the.**
f840: 20 49 4e 20 69 6e 64 65 78 20 77 69 6c 6c 20 62   IN index will b
f850: 65 20 75 73 65 64 20 74 6f 20 6c 6f 6f 70 20 6f  e used to loop o
f860: 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f  ver all values o
f870: 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  f the RHS of the
f880: 0a 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e  .** IN operator.
f890: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49  .**.** When IN_I
f8a0: 4e 44 45 58 5f 4c 4f 4f 50 20 69 73 20 75 73 65  NDEX_LOOP is use
f8b0: 64 20 28 61 6e 64 20 74 68 65 20 62 2d 74 72 65  d (and the b-tre
f8c0: 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  e will be used t
f8d0: 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68 72  o iterate.** thr
f8e0: 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d 65 6d  ough the set mem
f8f0: 62 65 72 73 29 20 74 68 65 6e 20 74 68 65 20 62  bers) then the b
f900: 2d 74 72 65 65 20 6d 75 73 74 20 6e 6f 74 20 63  -tree must not c
f910: 6f 6e 74 61 69 6e 20 64 75 70 6c 69 63 61 74 65  ontain duplicate
f920: 73 2e 0a 2a 2a 20 41 6e 20 65 70 68 65 72 65 6d  s..** An epherem
f930: 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  al table must be
f940: 20 75 73 65 64 20 75 6e 6c 65 73 73 20 74 68 65   used unless the
f950: 20 73 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e   selected column
f960: 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64  s are guaranteed
f970: 0a 2a 2a 20 74 6f 20 62 65 20 75 6e 69 71 75 65  .** to be unique
f980: 20 2d 20 65 69 74 68 65 72 20 62 65 63 61 75 73   - either becaus
f990: 65 20 69 74 20 69 73 20 61 6e 20 49 4e 54 45 47  e it is an INTEG
f9a0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  ER PRIMARY KEY o
f9b0: 72 20 64 75 65 20 74 6f 0a 2a 2a 20 61 20 55 4e  r due to.** a UN
f9c0: 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  IQUE constraint 
f9d0: 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20  or index..**.** 
f9e0: 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4d 45  When IN_INDEX_ME
f9f0: 4d 42 45 52 53 48 49 50 20 69 73 20 75 73 65 64  MBERSHIP is used
fa00: 20 28 61 6e 64 20 74 68 65 20 62 2d 74 72 65 65   (and the b-tree
fa10: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a   will be used .*
fa20: 2a 20 66 6f 72 20 66 61 73 74 20 73 65 74 20 6d  * for fast set m
fa30: 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 29  embership tests)
fa40: 20 74 68 65 6e 20 61 6e 20 65 70 68 65 72 65 6d   then an epherem
fa50: 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a  al table must .*
fa60: 2a 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73  * be used unless
fa70: 20 3c 63 6f 6c 75 6d 6e 73 3e 20 69 73 20 61 20   <columns> is a 
fa80: 73 69 6e 67 6c 65 20 49 4e 54 45 47 45 52 20 50  single INTEGER P
fa90: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
faa0: 6e 20 6f 72 20 61 6e 20 0a 2a 2a 20 69 6e 64 65  n or an .** inde
fab0: 78 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 77  x can be found w
fac0: 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69 65  ith the specifie
fad0: 64 20 3c 63 6f 6c 75 6d 6e 73 3e 20 61 73 20 69  d <columns> as i
fae0: 74 73 20 6c 65 66 74 2d 6d 6f 73 74 2e 0a 2a 2a  ts left-most..**
faf0: 0a 2a 2a 20 49 66 20 74 68 65 20 49 4e 5f 49 4e  .** If the IN_IN
fb00: 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 20 61 6e 64 20  DEX_NOOP_OK and 
fb10: 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53  IN_INDEX_MEMBERS
fb20: 48 49 50 20 61 72 65 20 62 6f 74 68 20 73 65 74  HIP are both set
fb30: 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 65 20 52   and.** if the R
fb40: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
fb50: 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20  rator is a list 
fb60: 28 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 29  (not a subquery)
fb70: 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f   then this.** ro
fb80: 75 74 69 6e 65 20 6d 69 67 68 74 20 64 65 63 69  utine might deci
fb90: 64 65 20 74 68 61 74 20 63 72 65 61 74 69 6e 67  de that creating
fba0: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 62 2d   an ephemeral b-
fbb0: 74 72 65 65 20 66 6f 72 20 6d 65 6d 62 65 72 73  tree for members
fbc0: 68 69 70 0a 2a 2a 20 74 65 73 74 69 6e 67 20 69  hip.** testing i
fbd0: 73 20 74 6f 6f 20 65 78 70 65 6e 73 69 76 65 20  s too expensive 
fbe0: 61 6e 64 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e  and return IN_IN
fbf0: 44 45 58 5f 4e 4f 4f 50 2e 20 20 49 6e 20 74 68  DEX_NOOP.  In th
fc00: 61 74 20 63 61 73 65 2c 20 74 68 65 0a 2a 2a 20  at case, the.** 
fc10: 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20  calling routine 
fc20: 73 68 6f 75 6c 64 20 69 6d 70 6c 65 6d 65 6e 74  should implement
fc30: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
fc40: 20 75 73 69 6e 67 20 61 20 73 65 71 75 65 6e 63   using a sequenc
fc50: 65 0a 2a 2a 20 6f 66 20 45 71 20 6f 72 20 4e 65  e.** of Eq or Ne
fc60: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
fc70: 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 57 68  ations..**.** Wh
fc80: 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20 69 73  en the b-tree is
fc90: 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20   being used for 
fca0: 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73  membership tests
fcb0: 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  , the calling fu
fcc0: 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 69 67 68 74 20  nction.** might 
fcd0: 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 77 68 65  need to know whe
fce0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
fcf0: 52 48 53 20 73 69 64 65 20 6f 66 20 74 68 65 20  RHS side of the 
fd00: 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 63  IN operator.** c
fd10: 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c 2e 20  ontains a NULL. 
fd20: 20 49 66 20 70 72 52 68 73 48 61 73 4e 75 6c 6c   If prRhsHasNull
fd30: 20 69 73 20 6e 6f 74 20 61 20 4e 55 4c 4c 20 70   is not a NULL p
fd40: 6f 69 6e 74 65 72 20 61 6e 64 20 0a 2a 2a 20 69  ointer and .** i
fd50: 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 63  f there is any c
fd60: 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 28  hance that the (
fd70: 2e 2e 2e 29 20 6d 69 67 68 74 20 63 6f 6e 74 61  ...) might conta
fd80: 69 6e 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20  in a NULL value 
fd90: 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20 74  at.** runtime, t
fda0: 68 65 6e 20 61 20 72 65 67 69 73 74 65 72 20 69  hen a register i
fdb0: 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
fdc0: 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d  the register num
fdd0: 62 65 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74  ber written.** t
fde0: 6f 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2e  o *prRhsHasNull.
fdf0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
fe00: 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  chance that the 
fe10: 28 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e 73 20 61  (...) contains a
fe20: 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20  .** NULL value, 
fe30: 74 68 65 6e 20 2a 70 72 52 68 73 48 61 73 4e 75  then *prRhsHasNu
fe40: 6c 6c 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61  ll is left uncha
fe50: 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  nged..**.** If a
fe60: 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c   register is all
fe70: 6f 63 61 74 65 64 20 61 6e 64 20 69 74 73 20 6c  ocated and its l
fe80: 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65 64 20 69  ocation stored i
fe90: 6e 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c  n *prRhsHasNull,
fea0: 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 76 61 6c   then.** the val
feb0: 75 65 20 69 6e 20 74 68 61 74 20 72 65 67 69 73  ue in that regis
fec0: 74 65 72 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c  ter will be NULL
fed0: 20 69 66 20 74 68 65 20 62 2d 74 72 65 65 20 63   if the b-tree c
fee0: 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
fef0: 6f 72 65 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75  ore.** NULL valu
ff00: 65 73 2c 20 61 6e 64 20 69 74 20 77 69 6c 6c 20  es, and it will 
ff10: 62 65 20 73 6f 6d 65 20 6e 6f 6e 2d 4e 55 4c 4c  be some non-NULL
ff20: 20 76 61 6c 75 65 20 69 66 20 74 68 65 20 62 2d   value if the b-
ff30: 74 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  tree contains no
ff40: 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e  .** NULL values.
ff50: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 61 69  .**.** If the ai
ff60: 4d 61 70 20 70 61 72 61 6d 65 74 65 72 20 69 73  Map parameter is
ff70: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 75   not NULL, it mu
ff80: 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 61  st point to an a
ff90: 72 72 61 79 20 63 6f 6e 74 61 69 6e 69 6e 67 0a  rray containing.
ffa0: 2a 2a 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 66  ** one element f
ffb0: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 72  or each column r
ffc0: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53  eturned by the S
ffd0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
ffe0: 6f 6e 20 74 68 65 20 52 48 53 0a 2a 2a 20 6f 66  on the RHS.** of
fff0: 20 74 68 65 20 49 4e 28 2e 2e 2e 29 20 6f 70 65   the IN(...) ope
10000 72 61 74 6f 72 2e 20 54 68 65 20 69 27 74 68 20  rator. The i'th 
10010 65 6e 74 72 79 20 6f 66 20 74 68 65 20 61 72 72  entry of the arr
10020 61 79 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  ay is populated 
10030 77 69 74 68 20 74 68 65 0a 2a 2a 20 6f 66 66 73  with the.** offs
10040 65 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  et of the index 
10050 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 61 74 63  column that matc
10060 68 65 73 20 74 68 65 20 69 27 74 68 20 63 6f 6c  hes the i'th col
10070 75 6d 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20  umn returned by 
10080 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54 2e 20 46  the.** SELECT. F
10090 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  or example, if t
100a0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  he expression an
100b0 64 20 73 65 6c 65 63 74 65 64 20 69 6e 64 65 78  d selected index
100c0 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 3f   are:.**.**   (?
100d0 2c 3f 2c 3f 29 20 49 4e 20 28 53 45 4c 45 43 54  ,?,?) IN (SELECT
100e0 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74 31   a, b, c FROM t1
100f0 29 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e  ).**   CREATE IN
10100 44 45 58 20 69 31 20 4f 4e 20 74 31 28 62 2c 20  DEX i1 ON t1(b, 
10110 63 2c 20 61 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65  c, a);.**.** the
10120 6e 20 61 69 4d 61 70 5b 5d 20 69 73 20 70 6f 70  n aiMap[] is pop
10130 75 6c 61 74 65 64 20 77 69 74 68 20 7b 32 2c 20  ulated with {2, 
10140 30 2c 20 31 7d 2e 0a 2a 2f 0a 23 69 66 6e 64 65  0, 1}..*/.#ifnde
10150 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
10160 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74  BQUERY.int sqlit
10170 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 0a 20  e3FindInIndex(. 
10180 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
10190 0a 20 20 45 78 70 72 20 2a 70 58 2c 20 0a 20 20  .  Expr *pX, .  
101a0 75 33 32 20 69 6e 46 6c 61 67 73 2c 20 0a 20 20  u32 inFlags, .  
101b0 69 6e 74 20 2a 70 72 52 68 73 48 61 73 4e 75 6c  int *prRhsHasNul
101c0 6c 2c 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70 0a  l,.  int *aiMap.
101d0 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 20  ){.  Select *p; 
101e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45             /* SE
10200 4c 45 43 54 20 74 6f 20 74 68 65 20 72 69 67 68  LECT to the righ
10210 74 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72  t of IN operator
10220 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20   */.  int eType 
10230 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
10240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10250 79 70 65 20 6f 66 20 52 48 53 20 74 61 62 6c 65  ype of RHS table
10260 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a  . IN_INDEX_* */.
10270 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61    int iTab = pPa
10280 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20  rse->nTab++;    
10290 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
102a0 72 20 6f 66 20 74 68 65 20 52 48 53 20 74 61 62  r of the RHS tab
102b0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74  le */.  int must
102c0 42 65 55 6e 69 71 75 65 3b 20 20 20 20 20 20 20  BeUnique;       
102d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
102e0 20 54 72 75 65 20 69 66 20 52 48 53 20 6d 75 73   True if RHS mus
102f0 74 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20  t be unique */. 
10300 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
10310 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
10320 29 3b 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61  );     /* Virtua
10330 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20  l machine being 
10340 63 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65  coded */..  asse
10350 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49  rt( pX->op==TK_I
10360 4e 20 29 3b 0a 20 20 6d 75 73 74 42 65 55 6e 69  N );.  mustBeUni
10370 71 75 65 20 3d 20 28 69 6e 46 6c 61 67 73 20 26  que = (inFlags &
10380 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 29 21   IN_INDEX_LOOP)!
10390 3d 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  =0;..  /* If the
103a0 20 52 48 53 20 6f 66 20 74 68 69 73 20 49 4e 28   RHS of this IN(
103b0 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20 69 73  ...) operator is
103c0 20 61 20 53 45 4c 45 43 54 2c 20 61 6e 64 20 69   a SELECT, and i
103d0 66 20 69 74 20 6d 61 74 74 65 72 73 20 0a 20 20  f it matters .  
103e0 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
103f0 74 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 73  t the SELECT res
10400 75 6c 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c  ult contains NUL
10410 4c 20 76 61 6c 75 65 73 2c 20 63 68 65 63 6b 20  L values, check 
10420 77 68 65 74 68 65 72 0a 20 20 2a 2a 20 6f 72 20  whether.  ** or 
10430 6e 6f 74 20 4e 55 4c 4c 20 69 73 20 61 63 74 75  not NULL is actu
10440 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 28 69  ally possible (i
10450 74 20 6d 61 79 20 6e 6f 74 20 62 65 2c 20 66 6f  t may not be, fo
10460 72 20 65 78 61 6d 70 6c 65 2c 20 64 75 65 20 0a  r example, due .
10470 20 20 2a 2a 20 74 6f 20 4e 4f 54 20 4e 55 4c 4c    ** to NOT NULL
10480 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20   constraints in 
10490 74 68 65 20 73 63 68 65 6d 61 29 2e 20 49 66 20  the schema). If 
104a0 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61  no NULL values a
104b0 72 65 20 70 6f 73 73 69 62 6c 65 2c 0a 20 20 2a  re possible,.  *
104c0 2a 20 73 65 74 20 70 72 52 68 73 48 61 73 4e 75  * set prRhsHasNu
104d0 6c 6c 20 74 6f 20 30 20 62 65 66 6f 72 65 20 63  ll to 0 before c
104e0 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 2a 2f 0a 20  ontinuing.  */. 
104f0 20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c   if( prRhsHasNul
10500 6c 20 26 26 20 28 70 58 2d 3e 66 6c 61 67 73 20  l && (pX->flags 
10510 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  & EP_xIsSelect) 
10520 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
10530 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
10540 73 74 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65  st = pX->x.pSele
10550 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  ct->pEList;.    
10560 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
10570 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
10580 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
10590 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70  3ExprCanBeNull(p
105a0 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
105b0 72 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  r) ) break;.    
105c0 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 45 4c  }.    if( i==pEL
105d0 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
105e0 20 20 20 20 70 72 52 68 73 48 61 73 4e 75 6c 6c      prRhsHasNull
105f0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
10600 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
10610 65 65 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e  ee if an existin
10620 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  g table or index
10630 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 0a   can be used to.
10640 20 20 2a 2a 20 73 61 74 69 73 66 79 20 74 68 65    ** satisfy the
10650 20 71 75 65 72 79 2e 20 20 54 68 69 73 20 69 73   query.  This is
10660 20 70 72 65 66 65 72 61 62 6c 65 20 74 6f 20 67   preferable to g
10670 65 6e 65 72 61 74 69 6e 67 20 61 20 6e 65 77 20  enerating a new 
10680 0a 20 20 2a 2a 20 65 70 68 65 6d 65 72 61 6c 20  .  ** ephemeral 
10690 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28  table.  */.  if(
106a0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
106b0 20 26 26 20 28 70 20 3d 20 69 73 43 61 6e 64 69   && (p = isCandi
106c0 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 58 29  dateForInOpt(pX)
106d0 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
106e0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
106f0 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20  ->db;           
10700 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
10710 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20  onnection */.   
10720 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
10730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10740 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
10750 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20   <table>. */.   
10760 20 69 31 36 20 69 44 62 3b 20 20 20 20 20 20 20   i16 iDb;       
10770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10780 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
10790 61 73 65 20 69 64 78 20 66 6f 72 20 70 54 61 62  ase idx for pTab
107a0 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74   */.    ExprList
107b0 20 2a 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45   *pEList = p->pE
107c0 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 6e 45  List;.    int nE
107d0 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  xpr = pEList->nE
107e0 78 70 72 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  xpr;..    assert
107f0 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29  ( p->pEList!=0 )
10800 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
10810 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61   Because of isCa
10820 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
10830 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  p) */.    assert
10840 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  ( p->pEList->a[0
10850 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 20 2f 2a  ].pExpr!=0 ); /*
10860 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61   Because of isCa
10870 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
10880 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  p) */.    assert
10890 28 20 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b 20  ( p->pSrc!=0 ); 
108a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
108b0 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61   Because of isCa
108c0 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
108d0 70 29 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d  p) */.    pTab =
108e0 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
108f0 54 61 62 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 64  Tab;..    /* Cod
10900 65 20 61 6e 20 4f 50 5f 54 72 61 6e 73 61 63 74  e an OP_Transact
10910 69 6f 6e 20 61 6e 64 20 4f 50 5f 54 61 62 6c 65  ion and OP_Table
10920 4c 6f 63 6b 20 66 6f 72 20 3c 74 61 62 6c 65 3e  Lock for <table>
10930 2e 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73  . */.    iDb = s
10940 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
10950 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
10960 63 68 65 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69  chema);.    sqli
10970 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
10980 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
10990 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 61 62  ;.    sqlite3Tab
109a0 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
109b0 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
109c0 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  0, pTab->zName);
109d0 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75  ..    /* This fu
109e0 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63  nction is only c
109f0 61 6c 6c 65 64 20 66 72 6f 6d 20 74 77 6f 20 70  alled from two p
10a00 6c 61 63 65 73 2e 20 49 6e 20 62 6f 74 68 20 63  laces. In both c
10a10 61 73 65 73 20 74 68 65 20 76 64 62 65 0a 20 20  ases the vdbe.  
10a20 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79    ** has already
10a30 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2e   been allocated.
10a40 20 53 6f 20 61 73 73 75 6d 65 20 73 71 6c 69 74   So assume sqlit
10a50 65 33 47 65 74 56 64 62 65 28 29 20 69 73 20 61  e3GetVdbe() is a
10a60 6c 77 61 79 73 0a 20 20 20 20 2a 2a 20 73 75 63  lways.    ** suc
10a70 63 65 73 73 66 75 6c 20 68 65 72 65 2e 0a 20 20  cessful here..  
10a80 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
10a90 76 29 3b 0a 20 20 20 20 69 66 28 20 6e 45 78 70  v);.    if( nExp
10aa0 72 3d 3d 31 20 26 26 20 70 45 4c 69 73 74 2d 3e  r==1 && pEList->
10ab0 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c  a[0].pExpr->iCol
10ac0 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 69  umn<0 ){.      i
10ad0 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74  nt iAddr = sqlit
10ae0 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73  e3CodeOnce(pPars
10af0 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  e);.      VdbeCo
10b00 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20  verage(v);..    
10b10 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
10b20 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c  le(pParse, iTab,
10b30 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f   iDb, pTab, OP_O
10b40 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20  penRead);.      
10b50 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
10b60 5f 52 4f 57 49 44 3b 0a 0a 20 20 20 20 20 20 73  _ROWID;..      s
10b70 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
10b80 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20  re(v, iAddr);.  
10b90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
10ba0 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
10bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bc0 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
10bd0 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20  variable */.    
10be0 20 20 69 6e 74 20 61 66 66 69 6e 69 74 79 5f 6f    int affinity_o
10bf0 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 74  k = 1;.      int
10c00 20 69 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68   i;..      /* Ch
10c10 65 63 6b 20 74 68 61 74 20 74 68 65 20 61 66 66  eck that the aff
10c20 69 6e 69 74 79 20 74 68 61 74 20 77 69 6c 6c 20  inity that will 
10c30 62 65 20 75 73 65 64 20 74 6f 20 70 65 72 66 6f  be used to perfo
10c40 72 6d 20 65 61 63 68 20 0a 20 20 20 20 20 20 2a  rm each .      *
10c50 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  * comparison is 
10c60 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
10c70 61 66 66 69 6e 69 74 79 20 6f 66 20 65 61 63 68  affinity of each
10c80 20 63 6f 6c 75 6d 6e 2e 20 49 66 0a 20 20 20 20   column. If.    
10c90 20 20 2a 2a 20 69 74 20 6e 6f 74 2c 20 69 74 20    ** it not, it 
10ca0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
10cb0 74 6f 20 75 73 65 20 61 6e 79 20 69 6e 64 65 78  to use any index
10cc0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  .  */.      for(
10cd0 69 3d 30 3b 20 69 3c 6e 45 78 70 72 20 26 26 20  i=0; i<nExpr && 
10ce0 61 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 69 2b 2b  affinity_ok; i++
10cf0 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
10d00 2a 70 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 45  *pLhs = sqlite3E
10d10 78 70 72 56 65 63 74 6f 72 46 69 65 6c 64 28 70  xprVectorField(p
10d20 58 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20  X->pLeft, i);.  
10d30 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
10d40 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
10d50 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
10d60 20 20 20 20 20 20 63 68 61 72 20 69 64 78 61 66        char idxaf
10d70 66 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  f = pTab->aCol[i
10d80 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20  Col].affinity;. 
10d90 20 20 20 20 20 20 20 63 68 61 72 20 63 6d 70 61         char cmpa
10da0 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  ff = sqlite3Comp
10db0 61 72 65 41 66 66 69 6e 69 74 79 28 70 4c 68 73  areAffinity(pLhs
10dc0 2c 20 69 64 78 61 66 66 29 3b 0a 20 20 20 20 20  , idxaff);.     
10dd0 20 20 20 73 77 69 74 63 68 28 20 63 6d 70 61 66     switch( cmpaf
10de0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  f ){.          c
10df0 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  ase SQLITE_AFF_B
10e00 4c 4f 42 3a 0a 20 20 20 20 20 20 20 20 20 20 20  LOB:.           
10e10 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
10e20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46    case SQLITE_AF
10e30 46 5f 54 45 58 54 3a 0a 20 20 20 20 20 20 20 20  F_TEXT:.        
10e40 20 20 20 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20      affinity_ok 
10e50 3d 20 28 69 64 78 61 66 66 3d 3d 53 51 4c 49 54  = (idxaff==SQLIT
10e60 45 5f 41 46 46 5f 54 45 58 54 29 3b 0a 20 20 20  E_AFF_TEXT);.   
10e70 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
10e80 20 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c            defaul
10e90 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  t:.            a
10ea0 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 73 71 6c  ffinity_ok = sql
10eb0 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66  ite3IsNumericAff
10ec0 69 6e 69 74 79 28 69 64 78 61 66 66 29 3b 0a 20  inity(idxaff);. 
10ed0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
10ee0 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  ..      /* The c
10ef0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
10f00 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63 6f  e used by the co
10f10 6d 70 61 72 69 73 6f 6e 2e 20 49 66 20 61 6e 20  mparison. If an 
10f20 69 6e 64 65 78 20 69 73 20 74 6f 0a 20 20 20 20  index is to.    
10f30 20 20 2a 2a 20 62 65 20 75 73 65 64 20 69 6e 20    ** be used in 
10f40 70 6c 61 63 65 20 6f 66 20 61 20 74 65 6d 70 2d  place of a temp-
10f50 74 61 62 6c 65 2c 20 69 74 20 6d 75 73 74 20 62  table, it must b
10f60 65 20 6f 72 64 65 72 65 64 20 61 63 63 6f 72 64  e ordered accord
10f70 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ing.      ** to 
10f80 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  this collation s
10f90 65 71 75 65 6e 63 65 2e 20 20 2a 2f 0a 0a 20 20  equence.  */..  
10fa0 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
10fb0 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 20  b->pIndex; pIdx 
10fc0 26 26 20 65 54 79 70 65 3d 3d 30 20 26 26 20 61  && eType==0 && a
10fd0 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 70 49 64 78  ffinity_ok; pIdx
10fe0 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
10ff0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
11000 3e 6e 4b 65 79 43 6f 6c 3c 6e 45 78 70 72 20 29  >nKeyCol<nExpr )
11010 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
11020 20 20 20 69 66 28 20 6d 75 73 74 42 65 55 6e 69     if( mustBeUni
11030 71 75 65 20 26 26 20 28 70 49 64 78 2d 3e 6e 4b  que && (pIdx->nK
11040 65 79 43 6f 6c 21 3d 6e 45 78 70 72 20 7c 7c 20  eyCol!=nExpr || 
11050 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70  !IsUniqueIndex(p
11060 49 64 78 29 29 20 29 7b 0a 20 20 20 20 20 20 20  Idx)) ){.       
11070 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
11080 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
11090 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
110a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
110b0 20 20 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 73    Expr *pLhs = s
110c0 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
110d0 46 69 65 6c 64 28 70 58 2d 3e 70 4c 65 66 74 2c  Field(pX->pLeft,
110e0 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 45   i);.          E
110f0 78 70 72 20 2a 70 52 68 73 20 3d 20 70 45 4c 69  xpr *pRhs = pELi
11100 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
11110 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65            CollSe
11120 71 20 2a 70 52 65 71 20 3d 20 73 71 6c 69 74 65  q *pReq = sqlite
11130 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
11140 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c  llSeq(pParse, pL
11150 68 73 2c 20 70 52 68 73 29 3b 0a 20 20 20 20 20  hs, pRhs);.     
11160 20 20 20 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 20       int j;..   
11170 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
11180 6a 3c 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  j<nExpr; j++){. 
11190 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
111a0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
111b0 21 3d 70 52 68 73 2d 3e 69 43 6f 6c 75 6d 6e 20  !=pRhs->iColumn 
111c0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
111d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
111e0 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20  pIdx->azColl[j] 
111f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
11200 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
11210 70 28 70 52 65 71 2d 3e 7a 4e 61 6d 65 2c 20 70  p(pReq->zName, p
11220 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21  Idx->azColl[j])!
11230 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
11240 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
11250 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
11260 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e          if( j==n
11270 45 78 70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  Expr ) break;.  
11280 20 20 20 20 20 20 20 20 69 66 28 20 61 69 4d 61          if( aiMa
11290 70 20 29 20 61 69 4d 61 70 5b 69 5d 20 3d 20 6a  p ) aiMap[i] = j
112a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
112b0 20 20 20 20 20 69 66 28 20 69 3d 3d 6e 45 78 70       if( i==nExp
112c0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  r ){.          i
112d0 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74  nt iAddr = sqlit
112e0 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73  e3CodeOnce(pPars
112f0 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
11300 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  (v);.          s
11310 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
11320 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  (v, OP_OpenRead,
11330 20 69 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75   iTab, pIdx->tnu
11340 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20  m, iDb);.       
11350 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
11360 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73  tP4KeyInfo(pPars
11370 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  e, pIdx);.      
11380 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
11390 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d 3e  (v, "%s", pIdx->
113a0 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20  zName));.       
113b0 20 20 20 61 73 73 65 72 74 28 20 49 4e 5f 49 4e     assert( IN_IN
113c0 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 3d  DEX_INDEX_DESC =
113d0 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  = IN_INDEX_INDEX
113e0 5f 41 53 43 2b 31 20 29 3b 0a 20 20 20 20 20 20  _ASC+1 );.      
113f0 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
11400 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 2b  NDEX_INDEX_ASC +
11410 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
11420 72 5b 30 5d 3b 0a 0a 20 20 20 20 20 20 20 20 20  r[0];..         
11430 20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c   if( prRhsHasNul
11440 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l ){.           
11450 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d   *prRhsHasNull =
11460 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
11470 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
11480 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45  NABLE_COLUMN_USE
11490 44 5f 4d 41 53 4b 0a 20 20 20 20 20 20 20 20 20  D_MASK.         
114a0 20 20 20 69 36 34 20 6d 61 73 6b 20 3d 20 28 31     i64 mask = (1
114b0 3c 3c 6e 45 78 70 72 29 2d 31 3b 0a 20 20 20 20  <<nExpr)-1;.    
114c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
114d0 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c  dbeAddOp4Dup8(v,
114e0 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 2c   OP_ColumnsUsed,
114f0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
11500 20 20 69 54 61 62 2c 20 30 2c 20 30 2c 20 28 75    iTab, 0, 0, (u
11510 38 2a 29 26 6d 61 73 6b 2c 20 50 34 5f 49 4e 54  8*)&mask, P4_INT
11520 36 34 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  64);.#endif.    
11530 20 20 20 20 20 20 20 20 69 66 28 20 6e 45 78 70          if( nExp
11540 72 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  r==1 ){.        
11550 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74        sqlite3Set
11560 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 69  HasNullFlag(v, i
11570 54 61 62 2c 20 2a 70 72 52 68 73 48 61 73 4e 75  Tab, *prRhsHasNu
11580 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ll);.           
11590 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
115a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
115b0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
115c0 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20  iAddr);.        
115d0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
115e0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20    }..  /* If no 
115f0 70 72 65 65 78 69 73 74 69 6e 67 20 69 6e 64 65  preexisting inde
11600 78 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 66  x is available f
11610 6f 72 20 74 68 65 20 49 4e 20 63 6c 61 75 73 65  or the IN clause
11620 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 5f 49 4e 44  .  ** and IN_IND
11630 45 58 5f 4e 4f 4f 50 20 69 73 20 61 6e 20 61 6c  EX_NOOP is an al
11640 6c 6f 77 65 64 20 72 65 70 6c 79 0a 20 20 2a 2a  lowed reply.  **
11650 20 61 6e 64 20 74 68 65 20 52 48 53 20 6f 66 20   and the RHS of 
11660 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
11670 69 73 20 61 20 6c 69 73 74 2c 20 6e 6f 74 20 61  is a list, not a
11680 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 61   subquery.  ** a
11690 6e 64 20 74 68 65 20 52 48 53 20 69 73 20 6e 6f  nd the RHS is no
116a0 74 20 63 6f 6e 73 74 61 6e 74 20 6f 72 20 68 61  t constant or ha
116b0 73 20 74 77 6f 20 6f 72 20 66 65 77 65 72 20 74  s two or fewer t
116c0 65 72 6d 73 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  erms,.  ** then 
116d0 69 74 20 69 73 20 6e 6f 74 20 77 6f 72 74 68 20  it is not worth 
116e0 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70 68 65  creating an ephe
116f0 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f 20 65  meral table to e
11700 76 61 6c 75 61 74 65 0a 20 20 2a 2a 20 74 68 65  valuate.  ** the
11710 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 73 6f 20   IN operator so 
11720 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f  return IN_INDEX_
11730 4e 4f 4f 50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  NOOP..  */.  if(
11740 20 65 54 79 70 65 3d 3d 30 0a 20 20 20 26 26 20   eType==0.   && 
11750 28 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e  (inFlags & IN_IN
11760 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 29 0a 20 20 20  DEX_NOOP_OK).   
11770 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
11780 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65  rty(pX, EP_xIsSe
11790 6c 65 63 74 29 0a 20 20 20 26 26 20 28 21 73 71  lect).   && (!sq
117a0 6c 69 74 65 33 49 6e 52 68 73 49 73 43 6f 6e 73  lite3InRhsIsCons
117b0 74 61 6e 74 28 70 58 29 20 7c 7c 20 70 58 2d 3e  tant(pX) || pX->
117c0 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c 3d  x.pList->nExpr<=
117d0 32 29 0a 20 20 29 7b 0a 20 20 20 20 65 54 79 70  2).  ){.    eTyp
117e0 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  e = IN_INDEX_NOO
117f0 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 54  P;.  }..  if( eT
11800 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ype==0 ){.    /*
11810 20 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20   Could not find 
11820 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c  an existing tabl
11830 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 75 73  e or index to us
11840 65 20 61 73 20 74 68 65 20 52 48 53 20 62 2d 74  e as the RHS b-t
11850 72 65 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20 77  ree..    ** We w
11860 69 6c 6c 20 68 61 76 65 20 74 6f 20 67 65 6e 65  ill have to gene
11870 72 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61  rate an ephemera
11880 6c 20 74 61 62 6c 65 20 74 6f 20 64 6f 20 74 68  l table to do th
11890 65 20 6a 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20  e job..    */.  
118a0 20 20 75 33 32 20 73 61 76 65 64 4e 51 75 65 72    u32 savedNQuer
118b0 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e  yLoop = pParse->
118c0 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20  nQueryLoop;.    
118d0 69 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c  int rMayHaveNull
118e0 20 3d 20 30 3b 0a 20 20 20 20 65 54 79 70 65 20   = 0;.    eType 
118f0 3d 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a  = IN_INDEX_EPH;.
11900 20 20 20 20 69 66 28 20 69 6e 46 6c 61 67 73 20      if( inFlags 
11910 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20  & IN_INDEX_LOOP 
11920 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
11930 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 30 3b  >nQueryLoop = 0;
11940 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 70  .      if( pX->p
11950 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  Left->iColumn<0 
11960 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
11970 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65  rty(pX, EP_xIsSe
11980 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
11990 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45   eType = IN_INDE
119a0 58 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20 7d  X_ROWID;.      }
119b0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
119c0 72 52 68 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 20  rRhsHasNull ){. 
119d0 20 20 20 20 20 2a 70 72 52 68 73 48 61 73 4e 75       *prRhsHasNu
119e0 6c 6c 20 3d 20 72 4d 61 79 48 61 76 65 4e 75 6c  ll = rMayHaveNul
119f0 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  l = ++pParse->nM
11a00 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  em;.    }.    sq
11a10 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
11a20 63 74 28 70 50 61 72 73 65 2c 20 70 58 2c 20 72  ct(pParse, pX, r
11a30 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 65 54 79  MayHaveNull, eTy
11a40 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  pe==IN_INDEX_ROW
11a50 49 44 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ID);.    pParse-
11a60 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 73 61  >nQueryLoop = sa
11a70 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20  vedNQueryLoop;. 
11a80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 58 2d 3e   }else{.    pX->
11a90 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20  iTable = iTab;. 
11aa0 20 7d 0a 0a 20 20 69 66 28 20 61 69 4d 61 70 20   }..  if( aiMap 
11ab0 26 26 20 65 54 79 70 65 21 3d 49 4e 5f 49 4e 44  && eType!=IN_IND
11ac0 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 26 26 20  EX_INDEX_ASC && 
11ad0 65 54 79 70 65 21 3d 49 4e 5f 49 4e 44 45 58 5f  eType!=IN_INDEX_
11ae0 49 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a 20 20  INDEX_DESC ){.  
11af0 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 20 20    int i, n;.    
11b00 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56  n = sqlite3ExprV
11b10 65 63 74 6f 72 53 69 7a 65 28 70 58 2d 3e 70 4c  ectorSize(pX->pL
11b20 65 66 74 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  eft);.    for(i=
11b30 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 20 61 69 4d  0; i<n; i++) aiM
11b40 61 70 5b 69 5d 20 3d 20 69 3b 0a 20 20 7d 0a 20  ap[i] = i;.  }. 
11b50 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d   return eType;.}
11b60 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
11b70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
11b80 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 41 72 67 75  QUERY./*.** Argu
11b90 6d 65 6e 74 20 70 45 78 70 72 20 69 73 20 61 6e  ment pExpr is an
11ba0 20 28 3f 2c 20 3f 2e 2e 2e 29 20 49 4e 28 2e 2e   (?, ?...) IN(..
11bb0 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 54  .) expression. T
11bc0 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
11bd0 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20 72   allocates and r
11be0 65 74 75 72 6e 73 20 61 20 6e 75 6c 2d 74 65 72  eturns a nul-ter
11bf0 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 63  minated string c
11c00 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68  ontaining .** th
11c10 65 20 61 66 66 69 6e 69 74 69 65 73 20 74 6f 20  e affinities to 
11c20 62 65 20 75 73 65 64 20 66 6f 72 20 65 61 63 68  be used for each
11c30 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 63   column of the c
11c40 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2a 0a 2a 2a  omparison..**.**
11c50 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
11c60 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
11c70 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e 73 75 72   caller to ensur
11c80 65 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72  e that the retur
11c90 6e 65 64 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73  ned.** string is
11ca0 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
11cb0 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44  d using sqlite3D
11cc0 62 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  bFree()..*/.stat
11cd0 69 63 20 63 68 61 72 20 2a 65 78 70 72 49 4e 41  ic char *exprINA
11ce0 66 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70  ffinity(Parse *p
11cf0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
11d00 70 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c 65  pr){.  Expr *pLe
11d10 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
11d20 74 3b 0a 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20  t;.  int nVal = 
11d30 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
11d40 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a 20 20  rSize(pLeft);.  
11d50 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
11d60 3d 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  = (pExpr->flags 
11d70 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  & EP_xIsSelect) 
11d80 3f 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  ? pExpr->x.pSele
11d90 63 74 20 3a 20 30 3b 0a 20 20 63 68 61 72 20 2a  ct : 0;.  char *
11da0 7a 52 65 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  zRet;..  assert(
11db0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
11dc0 4e 20 29 3b 0a 20 20 7a 52 65 74 20 3d 20 73 71  N );.  zRet = sq
11dd0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
11de0 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56  o(pParse->db, nV
11df0 61 6c 2b 31 29 3b 0a 20 20 69 66 28 20 7a 52 65  al+1);.  if( zRe
11e00 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  t ){.    int i;.
11e10 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
11e20 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Val; i++){.     
11e30 20 45 78 70 72 20 2a 70 41 20 3d 20 73 71 6c 69   Expr *pA = sqli
11e40 74 65 33 45 78 70 72 56 65 63 74 6f 72 46 69 65  te3ExprVectorFie
11e50 6c 64 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20  ld(pLeft, i);.  
11e60 20 20 20 20 63 68 61 72 20 61 20 3d 20 73 71 6c      char a = sql
11e70 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
11e80 28 70 41 29 3b 0a 20 20 20 20 20 20 69 66 28 20  (pA);.      if( 
11e90 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
11ea0 20 20 20 7a 52 65 74 5b 69 5d 20 3d 20 73 71 6c     zRet[i] = sql
11eb0 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
11ec0 69 74 79 28 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ity(pSelect->pEL
11ed0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
11ee0 20 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   a);.      }else
11ef0 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74 5b 69  {.        zRet[i
11f00 5d 20 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = a;.      }. 
11f10 20 20 20 7d 0a 20 20 20 20 7a 52 65 74 5b 6e 56     }.    zRet[nV
11f20 61 6c 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a  al] = '\0';.  }.
11f30 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d    return zRet;.}
11f40 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
11f50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
11f60 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64  QUERY./*.** Load
11f70 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
11f80 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
11f90 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 77  first argument w
11fa0 69 74 68 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a  ith an error .**
11fb0 20 6d 65 73 73 61 67 65 20 6f 66 20 74 68 65 20   message of the 
11fc0 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73  form:.**.**   "s
11fd0 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e  ub-select return
11fe0 73 20 4e 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78  s N columns - ex
11ff0 70 65 63 74 65 64 20 4d 22 0a 2a 2f 20 20 20 0a  pected M".*/   .
12000 76 6f 69 64 20 73 71 6c 69 74 65 33 53 75 62 73  void sqlite3Subs
12010 65 6c 65 63 74 45 72 72 6f 72 28 50 61 72 73 65  electError(Parse
12020 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 41   *pParse, int nA
12030 63 74 75 61 6c 2c 20 69 6e 74 20 6e 45 78 70 65  ctual, int nExpe
12040 63 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ct){.  const cha
12050 72 20 2a 7a 46 6d 74 20 3d 20 22 73 75 62 2d 73  r *zFmt = "sub-s
12060 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20 25 64  elect returns %d
12070 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63   columns - expec
12080 74 65 64 20 25 64 22 3b 0a 20 20 73 71 6c 69 74  ted %d";.  sqlit
12090 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
120a0 65 2c 20 7a 46 6d 74 2c 20 6e 41 63 74 75 61 6c  e, zFmt, nActual
120b0 2c 20 6e 45 78 70 65 63 74 29 3b 0a 7d 0a 23 65  , nExpect);.}.#e
120c0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ndif../*.** Gene
120d0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 73 63  rate code for sc
120e0 61 6c 61 72 20 73 75 62 71 75 65 72 69 65 73 20  alar subqueries 
120f0 75 73 65 64 20 61 73 20 61 20 73 75 62 71 75 65  used as a subque
12100 72 79 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 45  ry expression, E
12110 58 49 53 54 53 2c 0a 2a 2a 20 6f 72 20 49 4e 20  XISTS,.** or IN 
12120 6f 70 65 72 61 74 6f 72 73 2e 20 20 45 78 61 6d  operators.  Exam
12130 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ples:.**.**     
12140 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62  (SELECT a FROM b
12150 29 20 20 20 20 20 20 20 20 20 20 2d 2d 20 73 75  )          -- su
12160 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 45 58  bquery.**     EX
12170 49 53 54 53 20 28 53 45 4c 45 43 54 20 61 20 46  ISTS (SELECT a F
12180 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58 49 53  ROM b)   -- EXIS
12190 54 53 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20  TS subquery.**  
121a0 20 20 20 78 20 49 4e 20 28 34 2c 35 2c 31 31 29     x IN (4,5,11)
121b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
121c0 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74   IN operator wit
121d0 68 20 6c 69 73 74 20 6f 6e 20 72 69 67 68 74 2d  h list on right-
121e0 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20 20  hand side.**    
121f0 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20   x IN (SELECT a 
12200 46 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20 49  FROM b)     -- I
12210 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
12220 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20  subquery on the 
12230 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20  right.**.** The 
12240 70 45 78 70 72 20 70 61 72 61 6d 65 74 65 72 20  pExpr parameter 
12250 64 65 73 63 72 69 62 65 73 20 74 68 65 20 65 78  describes the ex
12260 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f  pression that co
12270 6e 74 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a  ntains the IN.**
12280 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 75 62   operator or sub
12290 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  query..**.** If 
122a0 70 61 72 61 6d 65 74 65 72 20 69 73 52 6f 77 69  parameter isRowi
122b0 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  d is non-zero, t
122c0 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 70  hen expression p
122d0 45 78 70 72 20 69 73 20 67 75 61 72 61 6e 74 65  Expr is guarante
122e0 65 64 0a 2a 2a 20 74 6f 20 62 65 20 6f 66 20 74  ed.** to be of t
122f0 68 65 20 66 6f 72 6d 20 22 3c 72 6f 77 69 64 3e  he form "<rowid>
12300 20 49 4e 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20   IN (?, ?, ?)", 
12310 77 68 65 72 65 20 3c 72 6f 77 69 64 3e 20 69 73  where <rowid> is
12320 20 61 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20   a reference.** 
12330 74 6f 20 73 6f 6d 65 20 69 6e 74 65 67 65 72 20  to some integer 
12340 6b 65 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20  key column of a 
12350 74 61 62 6c 65 20 42 2d 54 72 65 65 2e 20 49 6e  table B-Tree. In
12360 20 74 68 69 73 20 63 61 73 65 2c 20 75 73 65 20   this case, use 
12370 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20 42 2d 54  an.** intkey B-T
12380 72 65 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65  ree to store the
12390 20 73 65 74 20 6f 66 20 49 4e 28 2e 2e 2e 29 20   set of IN(...) 
123a0 76 61 6c 75 65 73 20 69 6e 73 74 65 61 64 20 6f  values instead o
123b0 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 28  f the usual.** (
123c0 73 6c 6f 77 65 72 29 20 76 61 72 69 61 62 6c 65  slower) variable
123d0 20 6c 65 6e 67 74 68 20 6b 65 79 73 20 42 2d 54   length keys B-T
123e0 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d  ree..**.** If rM
123f0 61 79 48 61 76 65 4e 75 6c 6c 20 69 73 20 6e 6f  ayHaveNull is no
12400 6e 2d 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65 61  n-zero, that mea
12410 6e 73 20 74 68 61 74 20 74 68 65 20 6f 70 65 72  ns that the oper
12420 61 74 69 6f 6e 20 69 73 20 61 6e 20 49 4e 0a 2a  ation is an IN.*
12430 2a 20 28 6e 6f 74 20 61 20 53 45 4c 45 43 54 20  * (not a SELECT 
12440 6f 72 20 45 58 49 53 54 53 29 20 61 6e 64 20 74  or EXISTS) and t
12450 68 61 74 20 74 68 65 20 52 48 53 20 6d 69 67 68  hat the RHS migh
12460 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73  t contains NULLs
12470 2e 0a 2a 2a 20 41 6c 6c 20 74 68 69 73 20 72 6f  ..** All this ro
12480 75 74 69 6e 65 20 64 6f 65 73 20 69 73 20 69 6e  utine does is in
12490 69 74 69 61 6c 69 7a 65 20 74 68 65 20 72 65 67  itialize the reg
124a0 69 73 74 65 72 20 67 69 76 65 6e 20 62 79 20 72  ister given by r
124b0 4d 61 79 48 61 76 65 4e 75 6c 6c 0a 2a 2a 20 74  MayHaveNull.** t
124c0 6f 20 4e 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67  o NULL.  Calling
124d0 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 74   routines will t
124e0 61 6b 65 20 63 61 72 65 20 6f 66 20 63 68 61 6e  ake care of chan
124f0 67 69 6e 67 20 74 68 69 73 20 72 65 67 69 73 74  ging this regist
12500 65 72 0a 2a 2a 20 76 61 6c 75 65 20 74 6f 20 6e  er.** value to n
12510 6f 6e 2d 4e 55 4c 4c 20 69 66 20 74 68 65 20 52  on-NULL if the R
12520 48 53 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e  HS is NULL-free.
12530 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 53 45 4c  .**.** For a SEL
12540 45 43 54 20 6f 72 20 45 58 49 53 54 53 20 6f 70  ECT or EXISTS op
12550 65 72 61 74 6f 72 2c 20 72 65 74 75 72 6e 20 74  erator, return t
12560 68 65 20 72 65 67 69 73 74 65 72 20 74 68 61 74  he register that
12570 20 68 6f 6c 64 73 20 74 68 65 0a 2a 2a 20 72 65   holds the.** re
12580 73 75 6c 74 2e 20 20 46 6f 72 20 49 4e 20 6f 70  sult.  For IN op
12590 65 72 61 74 6f 72 73 20 6f 72 20 69 66 20 61 6e  erators or if an
125a0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
125b0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
125c0 69 73 20 30 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  is 0..*/.#ifndef
125d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
125e0 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65  QUERY.int sqlite
125f0 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 0a  3CodeSubselect(.
12600 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
12610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
12620 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
12630 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
12640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
12650 20 49 4e 2c 20 53 45 4c 45 43 54 2c 20 6f 72 20   IN, SELECT, or 
12660 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72 20  EXISTS operator 
12670 2a 2f 0a 20 20 69 6e 74 20 72 48 61 73 4e 75 6c  */.  int rHasNul
12680 6c 46 6c 61 67 2c 20 20 20 20 20 20 20 2f 2a 20  lFlag,       /* 
12690 52 65 67 69 73 74 65 72 20 74 68 61 74 20 72 65  Register that re
126a0 63 6f 72 64 73 20 77 68 65 74 68 65 72 20 4e 55  cords whether NU
126b0 4c 4c 73 20 65 78 69 73 74 20 69 6e 20 52 48 53  LLs exist in RHS
126c0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 77 69   */.  int isRowi
126d0 64 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d             /*
126e0 20 49 66 20 74 72 75 65 2c 20 4c 48 53 20 6f 66   If true, LHS of
126f0 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
12700 61 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20  a rowid */.){.  
12710 69 6e 74 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63  int jmpIfDynamic
12720 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20   = -1;          
12730 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
12740 6e 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64  ne-time test add
12750 72 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 72 52  ress */.  int rR
12760 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  eg = 0;         
12770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12780 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74    /* Register st
12790 6f 72 69 6e 67 20 72 65 73 75 6c 74 69 6e 67 20  oring resulting 
127a0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  */.  Vdbe *v = s
127b0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
127c0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 4e 45 56  arse);.  if( NEV
127d0 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(v==0) ) retur
127e0 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  n 0;.  sqlite3Ex
127f0 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
12800 73 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  se);..  /* This 
12810 63 6f 64 65 20 6d 75 73 74 20 62 65 20 72 75 6e  code must be run
12820 20 69 6e 20 69 74 73 20 65 6e 74 69 72 65 74 79   in its entirety
12830 20 65 76 65 72 79 20 74 69 6d 65 20 69 74 20 69   every time it i
12840 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20  s encountered.  
12850 2a 2a 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  ** if any of the
12860 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72   following is tr
12870 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ue:.  **.  **   
12880 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61   *  The right-ha
12890 6e 64 20 73 69 64 65 20 69 73 20 61 20 63 6f 72  nd side is a cor
128a0 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79  related subquery
128b0 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20  .  **    *  The 
128c0 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
128d0 69 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  is an expression
128e0 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67   list containing
128f0 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20   variables.  ** 
12900 20 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73     *  We are ins
12910 69 64 65 20 61 20 74 72 69 67 67 65 72 0a 20 20  ide a trigger.  
12920 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f  **.  ** If all o
12930 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20  f the above are 
12940 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63  false, then we c
12950 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65  an run this code
12960 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20   just once.  ** 
12970 73 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 73  save the results
12980 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68 65 20  , and reuse the 
12990 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73  same result on s
129a0 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61  ubsequent invoca
129b0 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
129c0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
129d0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72  ty(pExpr, EP_Var
129e0 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 6a  Select) ){.    j
129f0 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 73 71  mpIfDynamic = sq
12a00 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50  lite3CodeOnce(pP
12a10 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72  arse); VdbeCover
12a20 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 23 69 66  age(v);.  }..#if
12a30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12a40 5f 45 58 50 4c 41 49 4e 0a 20 20 69 66 28 20 70  _EXPLAIN.  if( p
12a50 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
12a60 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  2 ){.    char *z
12a70 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
12a80 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c  intf(pParse->db,
12a90 20 22 45 58 45 43 55 54 45 20 25 73 25 73 20 53   "EXECUTE %s%s S
12aa0 55 42 51 55 45 52 59 20 25 64 22 2c 0a 20 20 20  UBQUERY %d",.   
12ab0 20 20 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69       jmpIfDynami
12ac0 63 3e 3d 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41  c>=0?"":"CORRELA
12ad0 54 45 44 20 22 2c 0a 20 20 20 20 20 20 20 20 70  TED ",.        p
12ae0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 3f  Expr->op==TK_IN?
12af0 22 4c 49 53 54 22 3a 22 53 43 41 4c 41 52 22 2c  "LIST":"SCALAR",
12b00 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
12b10 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 0a 20  >iNextSelectId. 
12b20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
12b30 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
12b40 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73  P_Explain, pPars
12b50 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c  e->iSelectId, 0,
12b60 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e   0, zMsg, P4_DYN
12b70 41 4d 49 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  AMIC);.  }.#endi
12b80 66 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  f..  switch( pEx
12b90 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
12ba0 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
12bb0 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20    int addr;     
12bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12bd0 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f   Address of OP_O
12be0 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
12bf0 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  truction */.    
12c00 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
12c10 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a  pExpr->pLeft; /*
12c20 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   the LHS of the 
12c30 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
12c40 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
12c50 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20  eyInfo = 0;     
12c60 20 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74   /* Key informat
12c70 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ion */.      int
12c80 20 6e 56 61 6c 3b 20 20 20 20 20 20 20 20 20 20   nVal;          
12c90 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
12ca0 20 6f 66 20 76 65 63 74 6f 72 20 70 4c 65 66 74   of vector pLeft
12cb0 20 2a 2f 0a 20 20 20 20 20 20 0a 20 20 20 20 20   */.      .     
12cc0 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 45   nVal = sqlite3E
12cd0 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 4c  xprVectorSize(pL
12ce0 65 66 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  eft);.      asse
12cf0 72 74 28 20 21 69 73 52 6f 77 69 64 20 7c 7c 20  rt( !isRowid || 
12d00 6e 56 61 6c 3d 3d 31 20 29 3b 0a 0a 20 20 20 20  nVal==1 );..    
12d10 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69    /* Whether thi
12d20 73 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45  s is an 'x IN(SE
12d30 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20  LECT...)' or an 
12d40 27 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e  'x IN(<exprlist>
12d50 29 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72  )'.      ** expr
12d60 65 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e  ession it is han
12d70 64 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77 61  dled the same wa
12d80 79 2e 20 20 41 6e 20 65 70 68 65 6d 65 72 61 6c  y.  An ephemeral
12d90 20 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20   table is .     
12da0 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20   ** filled with 
12db0 69 6e 64 65 78 20 6b 65 79 73 20 72 65 70 72 65  index keys repre
12dc0 73 65 6e 74 69 6e 67 20 74 68 65 20 72 65 73 75  senting the resu
12dd0 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  lts from the .  
12de0 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 6f 72      ** SELECT or
12df0 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e   the <exprlist>.
12e00 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
12e10 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20 65 78  ** If the 'x' ex
12e20 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
12e30 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74  lumn value, or t
12e40 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20  he SELECT....   
12e50 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
12e60 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e  returns a column
12e70 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65   value, then the
12e80 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61   affinity of tha
12e90 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  t.      ** colum
12ea0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62 75 69  n is used to bui
12eb0 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79  ld the index key
12ec0 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27 20 61  s. If both 'x' a
12ed0 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  nd the.      ** 
12ee0 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d  SELECT... statem
12ef0 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c  ent are columns,
12f00 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66   then numeric af
12f10 66 69 6e 69 74 79 20 69 73 20 75 73 65 64 0a 20  finity is used. 
12f20 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74 68 65       ** if eithe
12f30 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d  r column has NUM
12f40 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45 52 20  ERIC or INTEGER 
12f50 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e 65 69  affinity. If nei
12f60 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 27 78  ther.      ** 'x
12f70 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45 43 54  ' nor the SELECT
12f80 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72  ... statement ar
12f90 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  e columns, then 
12fa0 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
12fb0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73 65  .      ** is use
12fc0 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
12fd0 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
12fe0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
12ff0 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
13000 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13010 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
13020 65 72 61 6c 2c 20 0a 20 20 20 20 20 20 20 20 20  eral, .         
13030 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
13040 28 69 73 52 6f 77 69 64 3f 30 3a 6e 56 61 6c 29  (isRowid?0:nVal)
13050 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66  );.      pKeyInf
13060 6f 20 3d 20 69 73 52 6f 77 69 64 20 3f 20 30 20  o = isRowid ? 0 
13070 3a 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  : sqlite3KeyInfo
13080 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
13090 2c 20 6e 56 61 6c 2c 20 31 29 3b 0a 0a 20 20 20  , nVal, 1);..   
130a0 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
130b0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
130c0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
130d0 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31         /* Case 1
130e0 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 53  :     expr IN (S
130f0 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20  ELECT ...).     
13100 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
13110 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
13120 6f 20 77 72 69 74 65 20 74 68 65 20 72 65 73 75  o write the resu
13130 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  lts of the selec
13140 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f  t into the tempo
13150 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  rary.        ** 
13160 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20  table allocated 
13170 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f 76 65  and opened above
13180 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
13190 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
131a0 6c 65 63 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  lect = pExpr->x.
131b0 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20  pSelect;.       
131c0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
131d0 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  t = pSelect->pEL
131e0 69 73 74 3b 0a 0a 20 20 20 20 20 20 20 20 61 73  ist;..        as
131f0 73 65 72 74 28 20 21 69 73 52 6f 77 69 64 20 29  sert( !isRowid )
13200 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  ;.        if( pE
13210 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 6e 56 61  List->nExpr!=nVa
13220 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  l ){.          s
13230 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45  qlite3SubselectE
13240 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 45 4c  rror(pParse, pEL
13250 69 73 74 2d 3e 6e 45 78 70 72 2c 20 6e 56 61 6c  ist->nExpr, nVal
13260 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
13270 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65  {.          Sele
13280 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20  ctDest dest;.   
13290 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
132a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
132b0 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
132c0 65 73 74 2c 20 53 52 54 5f 53 65 74 2c 20 70 45  est, SRT_Set, pE
132d0 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20  xpr->iTable);.  
132e0 20 20 20 20 20 20 20 20 64 65 73 74 2e 7a 41 66          dest.zAf
132f0 66 53 64 73 74 20 3d 20 65 78 70 72 49 4e 41 66  fSdst = exprINAf
13300 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 70  finity(pParse, p
13310 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
13320 20 61 73 73 65 72 74 28 20 28 70 45 78 70 72 2d   assert( (pExpr-
13330 3e 69 54 61 62 6c 65 26 30 78 30 30 30 30 46 46  >iTable&0x0000FF
13340 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  FF)==pExpr->iTab
13350 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  le );.          
13360 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20  pSelect->iLimit 
13370 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 74  = 0;.          t
13380 65 73 74 63 61 73 65 28 20 70 53 65 6c 65 63 74  estcase( pSelect
13390 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
133a0 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20  Distinct );.    
133b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
133c0 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f  pKeyInfo==0 ); /
133d0 2a 20 43 61 75 73 65 64 20 62 79 20 4f 4f 4d 20  * Caused by OOM 
133e0 69 6e 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  in sqlite3KeyInf
133f0 6f 41 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20 20 20  oAlloc() */.    
13400 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
13410 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
13420 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29 20  pSelect, &dest) 
13430 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
13440 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
13450 72 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41  rse->db, dest.zA
13460 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20  ffSdst);.       
13470 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49       sqlite3KeyI
13480 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66  nfoUnref(pKeyInf
13490 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  o);.            
134a0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
134b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
134c0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
134d0 61 72 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a  arse->db, dest.z
134e0 41 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20  AffSdst);.      
134f0 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79      assert( pKey
13500 49 6e 66 6f 21 3d 30 20 29 3b 20 2f 2a 20 4f 4f  Info!=0 ); /* OO
13510 4d 20 77 69 6c 6c 20 63 61 75 73 65 20 65 78 69  M will cause exi
13520 74 20 61 66 74 65 72 20 73 71 6c 69 74 65 33 53  t after sqlite3S
13530 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20 20 20 20  elect() */.     
13540 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c       assert( pEL
13550 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist!=0 );.      
13560 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
13570 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
13580 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
13590 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
135a0 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49  sWriteable(pKeyI
135b0 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20  nfo) );.        
135c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 61    for(i=0; i<nVa
135d0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
135e0 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 28       Expr *p = (
135f0 6e 56 61 6c 3e 31 29 20 3f 20 73 71 6c 69 74 65  nVal>1) ? sqlite
13600 33 45 78 70 72 56 65 63 74 6f 72 46 69 65 6c 64  3ExprVectorField
13610 28 70 4c 65 66 74 2c 20 69 29 20 3a 20 70 4c 65  (pLeft, i) : pLe
13620 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ft;.            
13630 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
13640 69 5d 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  i] = sqlite3Bina
13650 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
13660 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
13670 20 20 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c    pParse, p, pEL
13680 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 0a  ist->a[i].pExpr.
13690 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20              );. 
136a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
136b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
136c0 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70   if( ALWAYS(pExp
136d0 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 29 20 29  r->x.pList!=0) )
136e0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73  {.        /* Cas
136f0 65 20 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e  e 2:     expr IN
13700 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20   (exprlist).    
13710 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
13720 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70 72 65  * For each expre
13730 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20  ssion, build an 
13740 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74  index key from t
13750 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e  he evaluation an
13760 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f  d.        ** sto
13770 72 65 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d  re it in the tem
13780 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66  porary table. If
13790 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c   <expr> is a col
137a0 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20  umn, then use.  
137b0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f        ** that co
137c0 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77  lumns affinity w
137d0 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64  hen building ind
137e0 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70  ex keys. If <exp
137f0 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20  r> is not.      
13800 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75    ** a column, u
13810 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  se numeric affin
13820 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ity..        */.
13830 20 20 20 20 20 20 20 20 63 68 61 72 20 61 66 66          char aff
13840 69 6e 69 74 79 3b 20 20 20 20 20 20 20 20 20 20  inity;          
13850 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 6f 66    /* Affinity of
13860 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   the LHS of the 
13870 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  IN */.        in
13880 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70  t i;.        Exp
13890 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
138a0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
138b0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78         struct Ex
138c0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
138d0 65 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  em;.        int 
138e0 72 31 2c 20 72 32 2c 20 72 33 3b 0a 0a 20 20 20  r1, r2, r3;..   
138f0 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20       affinity = 
13900 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
13910 69 74 79 28 70 4c 65 66 74 29 3b 0a 20 20 20 20  ity(pLeft);.    
13920 20 20 20 20 69 66 28 20 21 61 66 66 69 6e 69 74      if( !affinit
13930 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  y ){.          a
13940 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
13950 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20  _AFF_BLOB;.     
13960 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
13970 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20   pKeyInfo ){.   
13980 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
13990 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
139a0 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e 66  riteable(pKeyInf
139b0 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  o) );.          
139c0 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
139d0 30 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  0] = sqlite3Expr
139e0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
139f0 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
13a00 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
13a10 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
13a20 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  h each expressio
13a30 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e  n in <exprlist>.
13a40 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 31 20 3d   */.        r1 =
13a50 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
13a60 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
13a70 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
13a80 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
13a90 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
13aa0 69 73 52 6f 77 69 64 20 29 20 73 71 6c 69 74 65  isRowid ) sqlite
13ab0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13ac0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32 29 3b 0a  P_Null, 0, r2);.
13ad0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4c          for(i=pL
13ae0 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  ist->nExpr, pIte
13af0 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b  m=pList->a; i>0;
13b00 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
13b10 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
13b20 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78  pE2 = pItem->pEx
13b30 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  pr;.          in
13b40 74 20 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20  t iValToIns;..  
13b50 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
13b60 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
13b70 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65  not constant the
13b80 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  n we will need t
13b90 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64  o.          ** d
13ba0 69 73 61 62 6c 65 20 74 68 65 20 74 65 73 74 20  isable the test 
13bb0 74 68 61 74 20 77 61 73 20 67 65 6e 65 72 61 74  that was generat
13bc0 65 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d 61  ed above that ma
13bd0 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20 20 20  kes sure.       
13be0 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20     ** this code 
13bf0 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e  only executes on
13c00 63 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72  ce.  Because for
13c10 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a   a non-constant.
13c20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70            ** exp
13c30 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20  ression we need 
13c40 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f  to rerun this co
13c50 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20  de each time..  
13c60 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
13c70 20 20 20 20 20 69 66 28 20 6a 6d 70 49 66 44 79       if( jmpIfDy
13c80 6e 61 6d 69 63 3e 3d 30 20 26 26 20 21 73 71 6c  namic>=0 && !sql
13c90 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
13ca0 6e 74 28 70 45 32 29 20 29 7b 0a 20 20 20 20 20  nt(pE2) ){.     
13cb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13cc0 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
13cd0 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 29 3b  , jmpIfDynamic);
13ce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6d 70  .            jmp
13cf0 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31 3b 0a  IfDynamic = -1;.
13d00 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
13d10 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61         /* Evalua
13d20 74 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  te the expressio
13d30 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20  n and insert it 
13d40 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61  into the temp ta
13d50 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ble */.         
13d60 20 69 66 28 20 69 73 52 6f 77 69 64 20 26 26 20   if( isRowid && 
13d70 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
13d80 65 67 65 72 28 70 45 32 2c 20 26 69 56 61 6c 54  eger(pE2, &iValT
13d90 6f 49 6e 73 29 20 29 7b 0a 20 20 20 20 20 20 20  oIns) ){.       
13da0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13db0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
13dc0 65 72 74 49 6e 74 2c 20 70 45 78 70 72 2d 3e 69  ertInt, pExpr->i
13dd0 54 61 62 6c 65 2c 20 72 32 2c 20 69 56 61 6c 54  Table, r2, iValT
13de0 6f 49 6e 73 29 3b 0a 20 20 20 20 20 20 20 20 20  oIns);.         
13df0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13e00 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33      r3 = sqlite3
13e10 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
13e20 50 61 72 73 65 2c 20 70 45 32 2c 20 72 31 29 3b  Parse, pE2, r1);
13e30 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
13e40 20 69 73 52 6f 77 69 64 20 29 7b 0a 20 20 20 20   isRowid ){.    
13e50 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13e60 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13e70 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 33 2c  P_MustBeInt, r3,
13e80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ea0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
13eb0 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20  entAddr(v)+2);. 
13ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62               Vdb
13ed0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
13ee0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
13ef0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
13f00 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 45 78 70   OP_Insert, pExp
13f10 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 72  r->iTable, r2, r
13f20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  3);.            
13f30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
13f40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13f50 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
13f60 65 52 65 63 6f 72 64 2c 20 72 33 2c 20 31 2c 20  eRecord, r3, 1, 
13f70 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31  r2, &affinity, 1
13f80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
13f90 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
13fa0 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
13fb0 70 50 61 72 73 65 2c 20 72 33 2c 20 31 29 3b 0a  pParse, r3, 1);.
13fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
13fd0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13fe0 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
13ff0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
14000 72 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r2);.           
14010 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
14020 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14030 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
14040 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
14050 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
14060 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
14070 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20  g(pParse, r2);. 
14080 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
14090 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20   pKeyInfo ){.   
140a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
140b0 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72  ChangeP4(v, addr
140c0 2c 20 28 76 6f 69 64 20 2a 29 70 4b 65 79 49 6e  , (void *)pKeyIn
140d0 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
140e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
140f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
14100 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
14110 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
14120 45 43 54 3a 0a 20 20 20 20 64 65 66 61 75 6c 74  ECT:.    default
14130 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  : {.      /* If 
14140 74 68 69 73 20 68 61 73 20 74 6f 20 62 65 20 61  this has to be a
14150 20 73 63 61 6c 61 72 20 53 45 4c 45 43 54 2e 20   scalar SELECT. 
14160 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
14170 6f 20 70 75 74 20 74 68 65 0a 20 20 20 20 20 20  o put the.      
14180 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  ** value of this
14190 20 73 65 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d   select in a mem
141a0 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 63  ory cell and rec
141b0 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 0a 20  ord the number. 
141c0 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d       ** of the m
141d0 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43  emory cell in iC
141e0 6f 6c 75 6d 6e 2e 20 20 49 66 20 74 68 69 73 20  olumn.  If this 
141f0 69 73 20 61 6e 20 45 58 49 53 54 53 2c 20 77 72  is an EXISTS, wr
14200 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20  ite.      ** an 
14210 69 6e 74 65 67 65 72 20 30 20 28 6e 6f 74 20 65  integer 0 (not e
14220 78 69 73 74 73 29 20 6f 72 20 31 20 28 65 78 69  xists) or 1 (exi
14230 73 74 73 29 20 69 6e 74 6f 20 61 20 6d 65 6d 6f  sts) into a memo
14240 72 79 20 63 65 6c 6c 0a 20 20 20 20 20 20 2a 2a  ry cell.      **
14250 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68 61 74   and record that
14260 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20   memory cell in 
14270 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a  iColumn..      *
14280 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  /.      Select *
14290 70 53 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20  pSel;           
142a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
142b0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
142c0 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20  t to encode */. 
142d0 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
142e0 64 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  dest;           
142f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
14300 77 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53  w to deal with S
14310 45 4c 45 43 74 20 72 65 73 75 6c 74 20 2a 2f 0a  ELECt result */.
14320 20 20 20 20 20 20 69 6e 74 20 6e 52 65 67 3b 20        int nReg; 
14330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
14350 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f  egisters to allo
14360 63 61 74 65 20 2a 2f 0a 0a 20 20 20 20 20 20 74  cate */..      t
14370 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
14380 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b  op==TK_EXISTS );
14390 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
143a0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
143b0 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 61  ELECT );.      a
143c0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
143d0 3d 3d 54 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70  ==TK_EXISTS || p
143e0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
143f0 45 43 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ECT );.      ass
14400 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
14410 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
14420 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 0a 20 20  IsSelect) );..  
14430 20 20 20 20 70 53 65 6c 20 3d 20 70 45 78 70 72      pSel = pExpr
14440 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20  ->x.pSelect;.   
14450 20 20 20 6e 52 65 67 20 3d 20 70 45 78 70 72 2d     nReg = pExpr-
14460 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 3f  >op==TK_SELECT ?
14470 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2d 3e 6e   pSel->pEList->n
14480 45 78 70 72 20 3a 20 31 3b 0a 20 20 20 20 20 20  Expr : 1;.      
14490 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
144a0 74 49 6e 69 74 28 26 64 65 73 74 2c 20 30 2c 20  tInit(&dest, 0, 
144b0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 29 3b  pParse->nMem+1);
144c0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
144d0 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20  Mem += nReg;.   
144e0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
144f0 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20  ==TK_SELECT ){. 
14500 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65 73         dest.eDes
14510 74 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20  t = SRT_Mem;.   
14520 20 20 20 20 20 64 65 73 74 2e 69 53 64 73 74 20       dest.iSdst 
14530 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a  = dest.iSDParm;.
14540 20 20 20 20 20 20 20 20 64 65 73 74 2e 6e 53 64          dest.nSd
14550 73 74 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 20  st = nReg;.     
14560 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14570 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp3(v, OP_Null,
14580 20 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d   0, dest.iSDParm
14590 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2b 6e  , dest.iSDParm+n
145a0 52 65 67 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  Reg-1);.        
145b0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
145c0 22 49 6e 69 74 20 73 75 62 71 75 65 72 79 20 72  "Init subquery r
145d0 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20  esult"));.      
145e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64  }else{.        d
145f0 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f  est.eDest = SRT_
14600 45 78 69 73 74 73 3b 0a 20 20 20 20 20 20 20 20  Exists;.        
14610 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14620 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
14630 20 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d   0, dest.iSDParm
14640 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
14650 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74  omment((v, "Init
14660 20 45 58 49 53 54 53 20 72 65 73 75 6c 74 22 29   EXISTS result")
14670 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
14680 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
14690 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
146a0 53 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  Sel->pLimit);.  
146b0 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74      pSel->pLimit
146c0 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
146d0 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 54 45 47  pParse, TK_INTEG
146e0 45 52 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  ER, 0, 0,.      
146f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14700 20 20 20 20 20 20 20 20 20 20 20 20 26 73 71 6c              &sql
14710 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d  ite3IntTokens[1]
14720 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 69  );.      pSel->i
14730 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
14740 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20   pSel->selFlags 
14750 26 3d 20 7e 53 46 5f 4d 75 6c 74 69 56 61 6c 75  &= ~SF_MultiValu
14760 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  e;.      if( sql
14770 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
14780 65 2c 20 70 53 65 6c 2c 20 26 64 65 73 74 29 20  e, pSel, &dest) 
14790 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
147a0 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
147b0 20 20 20 72 52 65 67 20 3d 20 64 65 73 74 2e 69     rReg = dest.i
147c0 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 45 78  SDParm;.      Ex
147d0 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
147e0 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64  (pExpr, EP_NoRed
147f0 75 63 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  uce);.      brea
14800 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
14810 69 66 28 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67  if( rHasNullFlag
14820 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
14830 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c  etHasNullFlag(v,
14840 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
14850 72 48 61 73 4e 75 6c 6c 46 6c 61 67 29 3b 0a 20  rHasNullFlag);. 
14860 20 7d 0a 0a 20 20 69 66 28 20 6a 6d 70 49 66 44   }..  if( jmpIfD
14870 79 6e 61 6d 69 63 3e 3d 30 20 29 7b 0a 20 20 20  ynamic>=0 ){.   
14880 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
14890 48 65 72 65 28 76 2c 20 6a 6d 70 49 66 44 79 6e  Here(v, jmpIfDyn
148a0 61 6d 69 63 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  amic);.  }.  sql
148b0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
148c0 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 72 65 74  (pParse);..  ret
148d0 75 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e 64  urn rReg;.}.#end
148e0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
148f0 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23  T_SUBQUERY */..#
14900 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14910 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
14920 2a 20 45 78 70 72 20 70 49 6e 20 69 73 20 61 6e  * Expr pIn is an
14930 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73 73   IN(...) express
14940 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ion. This functi
14950 6f 6e 20 63 68 65 63 6b 73 20 74 68 61 74 20 74  on checks that t
14960 68 65 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63  he .** sub-selec
14970 74 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20  t on the RHS of 
14980 74 68 65 20 49 4e 28 29 20 6f 70 65 72 61 74 6f  the IN() operato
14990 72 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e  r has the same n
149a0 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 63 6f 6c  umber of .** col
149b0 75 6d 6e 73 20 61 73 20 74 68 65 20 76 65 63 74  umns as the vect
149c0 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20 4f  or on the LHS. O
149d0 72 2c 20 69 66 20 74 68 65 20 52 48 53 20 6f 66  r, if the RHS of
149e0 20 74 68 65 20 49 4e 28 29 20 69 73 20 6e 6f 74   the IN() is not
149f0 20 0a 2a 2a 20 61 20 73 75 62 2d 71 75 65 72 79   .** a sub-query
14a00 2c 20 74 68 61 74 20 74 68 65 20 4c 48 53 20 69  , that the LHS i
14a10 73 20 61 20 76 65 63 74 6f 72 20 6f 66 20 73 69  s a vector of si
14a20 7a 65 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ze 1..*/.int sql
14a30 69 74 65 33 45 78 70 72 43 68 65 63 6b 49 4e 28  ite3ExprCheckIN(
14a40 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
14a50 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 69 6e 74  xpr *pIn){.  int
14a60 20 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c 69 74   nVector = sqlit
14a70 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
14a80 28 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  (pIn->pLeft);.  
14a90 69 66 28 20 28 70 49 6e 2d 3e 66 6c 61 67 73 20  if( (pIn->flags 
14aa0 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  & EP_xIsSelect) 
14ab0 29 7b 0a 20 20 20 20 69 66 28 20 6e 56 65 63 74  ){.    if( nVect
14ac0 6f 72 21 3d 70 49 6e 2d 3e 78 2e 70 53 65 6c 65  or!=pIn->x.pSele
14ad0 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ct->pEList->nExp
14ae0 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
14af0 65 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72  e3SubselectError
14b00 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 78 2e  (pParse, pIn->x.
14b10 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
14b20 3e 6e 45 78 70 72 2c 20 6e 56 65 63 74 6f 72 29  >nExpr, nVector)
14b30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
14b40 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
14b50 69 66 28 20 6e 56 65 63 74 6f 72 21 3d 31 20 29  if( nVector!=1 )
14b60 7b 0a 20 20 20 20 69 66 28 20 28 70 49 6e 2d 3e  {.    if( (pIn->
14b70 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45  pLeft->flags & E
14b80 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
14b90 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 75 62        sqlite3Sub
14ba0 73 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72  selectError(pPar
14bb0 73 65 2c 20 6e 56 65 63 74 6f 72 2c 20 31 29 3b  se, nVector, 1);
14bc0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14bd0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
14be0 67 28 70 50 61 72 73 65 2c 20 22 69 6e 76 61 6c  g(pParse, "inval
14bf0 69 64 20 75 73 65 20 6f 66 20 72 6f 77 20 76 61  id use of row va
14c00 6c 75 65 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lue");.    }.   
14c10 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
14c20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
14c30 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
14c40 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
14c50 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  Y./*.** Generate
14c60 20 63 6f 64 65 20 66 6f 72 20 61 6e 20 49 4e 20   code for an IN 
14c70 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
14c80 2a 20 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c  *      x IN (SEL
14c90 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20 20  ECT ...).**     
14ca0 20 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61   x IN (value, va
14cb0 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20  lue, ...).**.** 
14cc0 54 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69  The left-hand si
14cd0 64 65 20 28 4c 48 53 29 20 69 73 20 61 20 73 63  de (LHS) is a sc
14ce0 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 2e  alar expression.
14cf0 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64    The right-hand
14d00 20 73 69 64 65 20 28 52 48 53 29 0a 2a 2a 20 69   side (RHS).** i
14d10 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 7a 65  s an array of ze
14d20 72 6f 20 6f 72 20 6d 6f 72 65 20 76 61 6c 75 65  ro or more value
14d30 73 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69  s.  The expressi
14d40 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20 74 68  on is true if th
14d50 65 20 4c 48 53 20 69 73 0a 2a 2a 20 63 6f 6e 74  e LHS is.** cont
14d60 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65  ained within the
14d70 20 52 48 53 2e 20 20 54 68 65 20 76 61 6c 75 65   RHS.  The value
14d80 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
14d90 6f 6e 20 69 73 20 75 6e 6b 6e 6f 77 6e 20 28 4e  on is unknown (N
14da0 55 4c 4c 29 0a 2a 2a 20 69 66 20 74 68 65 20 4c  ULL).** if the L
14db0 48 53 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66  HS is NULL or if
14dc0 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20   the LHS is not 
14dd0 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
14de0 20 74 68 65 20 52 48 53 20 61 6e 64 20 74 68 65   the RHS and the
14df0 0a 2a 2a 20 52 48 53 20 63 6f 6e 74 61 69 6e 73  .** RHS contains
14e00 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c   one or more NUL
14e10 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20  L values..**.** 
14e20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
14e30 65 72 61 74 65 73 20 63 6f 64 65 20 74 68 61 74  erates code that
14e40 20 6a 75 6d 70 73 20 74 6f 20 64 65 73 74 49 66   jumps to destIf
14e50 46 61 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53  False if the LHS
14e60 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 74   is not .** cont
14e70 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65  ained within the
14e80 20 52 48 53 2e 20 20 49 66 20 64 75 65 20 74 6f   RHS.  If due to
14e90 20 4e 55 4c 4c 73 20 77 65 20 63 61 6e 6e 6f 74   NULLs we cannot
14ea0 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
14eb0 65 20 4c 48 53 0a 2a 2a 20 69 73 20 63 6f 6e 74  e LHS.** is cont
14ec0 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53  ained in the RHS
14ed0 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 64 65   then jump to de
14ee0 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68  stIfNull.  If th
14ef0 65 20 4c 48 53 20 69 73 20 63 6f 6e 74 61 69 6e  e LHS is contain
14f00 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  ed.** within the
14f10 20 52 48 53 20 74 68 65 6e 20 66 61 6c 6c 20 74   RHS then fall t
14f20 68 72 6f 75 67 68 2e 0a 2a 2f 0a 73 74 61 74 69  hrough..*/.stati
14f30 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  c void sqlite3Ex
14f40 70 72 43 6f 64 65 49 4e 28 0a 20 20 50 61 72 73  prCodeIN(.  Pars
14f50 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
14f60 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
14f70 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
14f80 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
14f90 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
14fa0 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 20 65 78      /* The IN ex
14fb0 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e  pression */.  in
14fc0 74 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 20  t destIfFalse,  
14fd0 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
14fe0 20 69 66 20 4c 48 53 20 69 73 20 6e 6f 74 20 63   if LHS is not c
14ff0 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
15000 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  RHS */.  int des
15010 74 49 66 4e 75 6c 6c 20 20 20 20 20 20 20 20 2f  tIfNull        /
15020 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74  * Jump here if t
15030 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 75  he results are u
15040 6e 6b 6e 6f 77 6e 20 64 75 65 20 74 6f 20 4e 55  nknown due to NU
15050 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  LLs */.){.  int 
15060 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b  rRhsHasNull = 0;
15070 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68    /* Register th
15080 61 74 20 69 73 20 74 72 75 65 20 69 66 20 52 48  at is true if RH
15090 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20  S contains NULL 
150a0 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20  values */.  int 
150b0 65 54 79 70 65 3b 20 20 20 20 20 20 20 20 20 20  eType;          
150c0 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 68 65    /* Type of the
150d0 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 72 31   RHS */.  int r1
150e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
150f0 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65  /* Temporary use
15100 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 56   register */.  V
15110 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
15120 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e       /* Statemen
15130 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  t under construc
15140 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  tion */.  int *a
15150 69 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20  iMap = 0;       
15160 2f 2a 20 4d 61 70 20 66 72 6f 6d 20 76 65 63 74  /* Map from vect
15170 6f 72 20 66 69 65 6c 64 20 74 6f 20 69 6e 64 65  or field to inde
15180 78 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68  x column */.  ch
15190 61 72 20 2a 7a 41 66 66 20 3d 20 30 3b 20 20 20  ar *zAff = 0;   
151a0 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20      /* Affinity 
151b0 73 74 72 69 6e 67 20 66 6f 72 20 63 6f 6d 70 61  string for compa
151c0 72 69 73 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  risons */.  int 
151d0 6e 56 65 63 74 6f 72 3b 20 20 20 20 20 20 20 20  nVector;        
151e0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 76 65 63    /* Size of vec
151f0 74 6f 72 73 20 66 6f 72 20 74 68 69 73 20 49 4e  tors for this IN
15200 28 2e 2e 2e 29 20 6f 70 20 2a 2f 0a 20 20 45 78  (...) op */.  Ex
15210 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
15220 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69 6e 74 20  r->pLeft;.  int 
15230 69 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  i;..  if( sqlite
15240 33 45 78 70 72 43 68 65 63 6b 49 4e 28 70 50 61  3ExprCheckIN(pPa
15250 72 73 65 2c 20 70 45 78 70 72 29 20 29 20 72 65  rse, pExpr) ) re
15260 74 75 72 6e 3b 0a 20 20 7a 41 66 66 20 3d 20 65  turn;.  zAff = e
15270 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28 70 50  xprINAffinity(pP
15280 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
15290 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65  nVector = sqlite
152a0 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
152b0 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
152c0 20 61 69 4d 61 70 20 3d 20 28 69 6e 74 2a 29 73   aiMap = (int*)s
152d0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
152e0 72 6f 28 0a 20 20 20 20 20 20 70 50 61 72 73 65  ro(.      pParse
152f0 2d 3e 64 62 2c 20 6e 56 65 63 74 6f 72 2a 28 73  ->db, nVector*(s
15300 69 7a 65 6f 66 28 69 6e 74 29 20 2b 20 73 69 7a  izeof(int) + siz
15310 65 6f 66 28 63 68 61 72 29 29 20 2b 20 31 0a 20  eof(char)) + 1. 
15320 20 29 3b 0a 20 20 69 66 28 20 21 7a 41 66 66 20   );.  if( !zAff 
15330 7c 7c 20 21 61 69 4d 61 70 20 29 7b 0a 20 20 20  || !aiMap ){.   
15340 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
15350 50 61 72 73 65 2d 3e 64 62 2c 20 61 69 4d 61 70  Parse->db, aiMap
15360 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
15370 20 7d 0a 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74   }..  /* Attempt
15380 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
15390 52 48 53 2e 20 41 66 74 65 72 20 74 68 69 73 20  RHS. After this 
153a0 73 74 65 70 2c 20 69 66 20 61 6e 79 74 68 69 6e  step, if anythin
153b0 67 20 6f 74 68 65 72 20 74 68 61 6e 0a 20 20 2a  g other than.  *
153c0 2a 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20  * IN_INDEX_NOOP 
153d0 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
153e0 20 74 61 62 6c 65 20 6f 70 65 6e 65 64 20 69 74   table opened it
153f0 68 20 63 75 72 73 6f 72 20 70 45 78 70 72 2d 3e  h cursor pExpr->
15400 69 54 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 6e  iTable .  ** con
15410 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 73  tains the values
15420 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68   that make up th
15430 65 20 52 48 53 2e 20 49 66 20 49 4e 5f 49 4e 44  e RHS. If IN_IND
15440 45 58 5f 4e 4f 4f 50 20 69 73 20 72 65 74 75 72  EX_NOOP is retur
15450 6e 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 52 48  ned,.  ** the RH
15460 53 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  S has not yet be
15470 65 6e 20 63 6f 64 65 64 2e 20 20 2a 2f 0a 20 20  en coded.  */.  
15480 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
15490 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  e;.  assert( v!=
154a0 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 4f 4f  0 );       /* OO
154b0 4d 20 64 65 74 65 63 74 65 64 20 70 72 69 6f 72  M detected prior
154c0 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
154d0 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
154e0 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e  mment((v, "begin
154f0 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 20 20 65   IN expr"));.  e
15500 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69  Type = sqlite3Fi
15510 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65  ndInIndex(pParse
15520 2c 20 70 45 78 70 72 2c 0a 20 20 20 20 20 20 20  , pExpr,.       
15530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15540 20 20 20 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4d        IN_INDEX_M
15550 45 4d 42 45 52 53 48 49 50 20 7c 20 49 4e 5f 49  EMBERSHIP | IN_I
15560 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 2c 0a 20 20  NDEX_NOOP_OK,.  
15570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15580 20 20 20 20 20 20 20 20 20 20 20 64 65 73 74 49             destI
15590 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75  fFalse==destIfNu
155a0 6c 6c 20 3f 20 30 20 3a 20 26 72 52 68 73 48 61  ll ? 0 : &rRhsHa
155b0 73 4e 75 6c 6c 2c 20 61 69 4d 61 70 29 3b 0a 0a  sNull, aiMap);..
155c0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
155d0 2d 3e 6e 45 72 72 20 7c 7c 20 6e 56 65 63 74 6f  ->nErr || nVecto
155e0 72 3d 3d 31 20 7c 7c 20 65 54 79 70 65 3d 3d 49  r==1 || eType==I
155f0 4e 5f 49 4e 44 45 58 5f 45 50 48 0a 20 20 20 20  N_INDEX_EPH.    
15600 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f     || eType==IN_
15610 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20  INDEX_INDEX_ASC 
15620 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  || eType==IN_IND
15630 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 0a 20  EX_INDEX_DESC . 
15640 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74   );..  /* Code t
15650 68 65 20 4c 48 53 2c 20 74 68 65 20 3c 65 78 70  he LHS, the <exp
15660 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20  r> from "<expr> 
15670 49 4e 20 28 2e 2e 2e 29 22 2e 20 49 66 20 74 68  IN (...)". If th
15680 65 20 4c 48 53 20 69 73 20 61 20 0a 20 20 2a 2a  e LHS is a .  **
15690 20 76 65 63 74 6f 72 2c 20 74 68 65 6e 20 69 74   vector, then it
156a0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 6e   is stored in an
156b0 20 61 72 72 61 79 20 6f 66 20 6e 56 65 63 74 6f   array of nVecto
156c0 72 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  r registers star
156d0 74 69 6e 67 20 0a 20 20 2a 2a 20 61 74 20 72 31  ting .  ** at r1
156e0 2e 0a 20 20 2a 2f 0a 20 20 72 31 20 3d 20 73 71  ..  */.  r1 = sq
156f0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
15700 65 28 70 50 61 72 73 65 2c 20 6e 56 65 63 74 6f  e(pParse, nVecto
15710 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  r);.  sqlite3Exp
15720 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
15730 65 29 3b 0a 20 20 69 66 28 20 6e 56 65 63 74 6f  e);.  if( nVecto
15740 72 3e 31 20 26 26 20 28 70 4c 65 66 74 2d 3e 66  r>1 && (pLeft->f
15750 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c  lags & EP_xIsSel
15760 65 63 74 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  ect) ){.    int 
15770 72 65 67 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  regSelect = sqli
15780 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
15790 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
157a0 30 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 69  0, 0);.    for(i
157b0 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69  =0; i<nVector; i
157c0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
157d0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
157e0 4f 50 5f 43 6f 70 79 2c 20 72 65 67 53 65 6c 65  OP_Copy, regSele
157f0 63 74 2b 69 2c 20 72 31 2b 61 69 4d 61 70 5b 69  ct+i, r1+aiMap[i
15800 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ], 0);.    }.  }
15810 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d  else{.    for(i=
15820 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b  0; i<nVector; i+
15830 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
15840 70 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 45 78  pLhs = sqlite3Ex
15850 70 72 56 65 63 74 6f 72 46 69 65 6c 64 28 70 4c  prVectorField(pL
15860 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 73  eft, i);.      s
15870 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
15880 50 61 72 73 65 2c 20 70 4c 68 73 2c 20 72 31 2b  Parse, pLhs, r1+
15890 61 69 4d 61 70 5b 69 5d 29 3b 0a 20 20 20 20 7d  aiMap[i]);.    }
158a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 71  .  }..  /* If sq
158b0 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
158c0 28 29 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20  () did not find 
158d0 6f 72 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64  or create an ind
158e0 65 78 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  ex that is.  ** 
158f0 73 75 69 74 61 62 6c 65 20 66 6f 72 20 65 76 61  suitable for eva
15900 6c 75 61 74 69 6e 67 20 74 68 65 20 49 4e 20 6f  luating the IN o
15910 70 65 72 61 74 6f 72 2c 20 74 68 65 6e 20 65 76  perator, then ev
15920 61 6c 75 61 74 65 20 75 73 69 6e 67 20 61 0a 20  aluate using a. 
15930 20 2a 2a 20 73 65 71 75 65 6e 63 65 20 6f 66 20   ** sequence of 
15940 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 20 20 2a  comparisons..  *
15950 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49  /.  if( eType==I
15960 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 29 7b 0a  N_INDEX_NOOP ){.
15970 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
15980 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
15990 4c 69 73 74 3b 0a 20 20 20 20 43 6f 6c 6c 53 65  List;.    CollSe
159a0 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  q *pColl = sqlit
159b0 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
159c0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
159d0 66 74 29 3b 0a 20 20 20 20 69 6e 74 20 6c 61 62  ft);.    int lab
159e0 65 6c 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  elOk = sqlite3Vd
159f0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
15a00 20 20 20 20 69 6e 74 20 72 32 2c 20 72 65 67 54      int r2, regT
15a10 6f 46 72 65 65 3b 0a 20 20 20 20 69 6e 74 20 72  oFree;.    int r
15a20 65 67 43 6b 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20  egCkNull = 0;.  
15a30 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 61 73    int ii;.    as
15a40 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
15a50 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
15a60 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
15a70 20 20 20 69 66 28 20 64 65 73 74 49 66 4e 75 6c     if( destIfNul
15a80 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29  l!=destIfFalse )
15a90 7b 0a 20 20 20 20 20 20 72 65 67 43 6b 4e 75 6c  {.      regCkNul
15aa0 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  l = sqlite3GetTe
15ab0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
15ac0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15ad0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74  AddOp3(v, OP_Bit
15ae0 41 6e 64 2c 20 72 31 2c 20 72 31 2c 20 72 65 67  And, r1, r1, reg
15af0 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20  CkNull);.    }. 
15b00 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
15b10 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 69  pList->nExpr; ii
15b20 2b 2b 29 7b 0a 20 20 20 20 20 20 72 32 20 3d 20  ++){.      r2 = 
15b30 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
15b40 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 69 73  emp(pParse, pLis
15b50 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20  t->a[ii].pExpr, 
15b60 26 72 65 67 54 6f 46 72 65 65 29 3b 0a 20 20 20  &regToFree);.   
15b70 20 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c     if( regCkNull
15b80 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
15b90 61 6e 42 65 4e 75 6c 6c 28 70 4c 69 73 74 2d 3e  anBeNull(pList->
15ba0 61 5b 69 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  a[ii].pExpr) ){.
15bb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15bc0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
15bd0 42 69 74 41 6e 64 2c 20 72 65 67 43 6b 4e 75 6c  BitAnd, regCkNul
15be0 6c 2c 20 72 32 2c 20 72 65 67 43 6b 4e 75 6c 6c  l, r2, regCkNull
15bf0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
15c00 20 69 66 28 20 69 69 3c 70 4c 69 73 74 2d 3e 6e   if( ii<pList->n
15c10 45 78 70 72 2d 31 20 7c 7c 20 64 65 73 74 49 66  Expr-1 || destIf
15c20 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c 73  Null!=destIfFals
15c30 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
15c40 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
15c50 2c 20 4f 50 5f 45 71 2c 20 72 31 2c 20 6c 61 62  , OP_Eq, r1, lab
15c60 65 6c 4f 6b 2c 20 72 32 2c 0a 20 20 20 20 20 20  elOk, r2,.      
15c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c80 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c      (void*)pColl
15c90 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
15ca0 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
15cb0 61 67 65 49 66 28 76 2c 20 69 69 3c 70 4c 69 73  ageIf(v, ii<pLis
15cc0 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20  t->nExpr-1);.   
15cd0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
15ce0 65 49 66 28 76 2c 20 69 69 3d 3d 70 4c 69 73 74  eIf(v, ii==pList
15cf0 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20  ->nExpr-1);.    
15d00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
15d10 68 61 6e 67 65 50 35 28 76 2c 20 7a 41 66 66 5b  hangeP5(v, zAff[
15d20 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  0]);.      }else
15d30 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
15d40 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65  ( destIfNull==de
15d50 73 74 49 66 46 61 6c 73 65 20 29 3b 0a 20 20 20  stIfFalse );.   
15d60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15d70 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c  AddOp4(v, OP_Ne,
15d80 20 72 31 2c 20 64 65 73 74 49 66 46 61 6c 73 65   r1, destIfFalse
15d90 2c 20 72 32 2c 0a 20 20 20 20 20 20 20 20 20 20  , r2,.          
15da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15db0 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34  (void*)pColl, P4
15dc0 5f 43 4f 4c 4c 53 45 51 29 3b 20 56 64 62 65 43  _COLLSEQ); VdbeC
15dd0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
15de0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
15df0 68 61 6e 67 65 50 35 28 76 2c 20 7a 41 66 66 5b  hangeP5(v, zAff[
15e00 30 5d 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  0] | SQLITE_JUMP
15e10 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d  IFNULL);.      }
15e20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
15e30 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
15e40 72 73 65 2c 20 72 65 67 54 6f 46 72 65 65 29 3b  rse, regToFree);
15e50 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
15e60 65 67 43 6b 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  egCkNull ){.    
15e70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15e80 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
15e90 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 64 65 73  , regCkNull, des
15ea0 74 49 66 4e 75 6c 6c 29 3b 20 56 64 62 65 43 6f  tIfNull); VdbeCo
15eb0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
15ec0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
15ed0 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29  (v, destIfFalse)
15ee0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
15ef0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
15f00 62 65 6c 28 76 2c 20 6c 61 62 65 6c 4f 6b 29 3b  bel(v, labelOk);
15f10 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
15f20 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
15f30 65 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20  e, regCkNull);. 
15f40 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f   }else{.  .    /
15f50 2a 20 49 66 20 61 6e 79 20 76 61 6c 75 65 20 6f  * If any value o
15f60 6e 20 74 68 65 20 4c 48 53 20 69 73 20 4e 55 4c  n the LHS is NUL
15f70 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  L, the result of
15f80 20 74 68 65 20 49 4e 28 2e 2e 2e 29 20 6f 70 65   the IN(...) ope
15f90 72 61 74 6f 72 0a 20 20 20 20 2a 2a 20 6d 75 73  rator.    ** mus
15fa0 74 20 62 65 20 65 69 74 68 65 72 20 66 61 6c 73  t be either fals
15fb0 65 20 6f 72 20 4e 55 4c 4c 2e 20 49 66 20 74 68  e or NULL. If th
15fc0 65 73 65 20 74 77 6f 20 61 72 65 20 68 61 6e 64  ese two are hand
15fd0 6c 65 64 20 69 64 65 6e 74 69 63 61 6c 6c 79 2c  led identically,
15fe0 0a 20 20 20 20 2a 2a 20 74 65 73 74 20 74 68 65  .    ** test the
15ff0 20 4c 48 53 20 66 6f 72 20 4e 55 4c 4c 73 20 61   LHS for NULLs a
16000 6e 64 20 6a 75 6d 70 20 64 69 72 65 63 74 6c 79  nd jump directly
16010 20 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c 20 69   to destIfNull i
16020 66 20 61 6e 79 20 61 72 65 0a 20 20 20 20 2a 2a  f any are.    **
16030 20 66 6f 75 6e 64 2e 20 0a 20 20 20 20 2a 2a 0a   found. .    **.
16040 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65      ** Otherwise
16050 2c 20 69 66 20 4e 55 4c 4c 20 61 6e 64 20 66 61  , if NULL and fa
16060 6c 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20  lse are handled 
16070 64 69 66 66 65 72 65 6e 74 6c 79 2c 20 61 6e 64  differently, and
16080 20 74 68 65 0a 20 20 20 20 2a 2a 20 49 4e 28 2e   the.    ** IN(.
16090 2e 2e 29 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  ..) operation is
160a0 20 6e 6f 74 20 61 20 76 65 63 74 6f 72 20 6f 70   not a vector op
160b0 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 74 68 65  eration, and the
160c0 20 4c 48 53 20 6f 66 20 74 68 65 0a 20 20 20 20   LHS of the.    
160d0 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69 73 20 4e  ** operator is N
160e0 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 72 65  ULL, then the re
160f0 73 75 6c 74 20 69 73 20 66 61 6c 73 65 20 69 66  sult is false if
16100 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 0a 20   the index is . 
16110 20 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79     ** completely
16120 20 65 6d 70 74 79 2c 20 6f 72 20 4e 55 4c 4c 20   empty, or NULL 
16130 6f 74 68 65 72 77 69 73 65 2e 20 20 2a 2f 0a 20  otherwise.  */. 
16140 20 20 20 69 66 28 20 64 65 73 74 49 66 4e 75 6c     if( destIfNul
16150 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29  l==destIfFalse )
16160 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
16170 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29   i<nVector; i++)
16180 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
16190 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56  p = sqlite3ExprV
161a0 65 63 74 6f 72 46 69 65 6c 64 28 70 45 78 70 72  ectorField(pExpr
161b0 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20  ->pLeft, i);.   
161c0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
161d0 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 29  ExprCanBeNull(p)
161e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
161f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16200 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31  v, OP_IsNull, r1
16210 2b 61 69 4d 61 70 5b 69 5d 2c 20 64 65 73 74 49  +aiMap[i], destI
16220 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  fNull);.        
16230 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  }.      }.    }e
16240 6c 73 65 20 69 66 28 20 6e 56 65 63 74 6f 72 3d  lse if( nVector=
16250 3d 31 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  =1 && sqlite3Exp
16260 72 43 61 6e 42 65 4e 75 6c 6c 28 70 45 78 70 72  rCanBeNull(pExpr
16270 2d 3e 70 4c 65 66 74 29 20 29 7b 0a 20 20 20 20  ->pLeft) ){.    
16280 20 20 69 6e 74 20 61 64 64 72 31 20 3d 20 73 71    int addr1 = sq
16290 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
162a0 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72  v, OP_NotNull, r
162b0 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  1); VdbeCoverage
162c0 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
162d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
162e0 4f 50 5f 52 65 77 69 6e 64 2c 20 70 45 78 70 72  OP_Rewind, pExpr
162f0 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66  ->iTable, destIf
16300 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 56 64  False);.      Vd
16310 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
16320 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16330 47 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 4e 75  Goto(v, destIfNu
16340 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
16350 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
16360 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 7d 0a  , addr1);.    }.
16370 20 20 0a 20 20 20 20 69 66 28 20 65 54 79 70 65    .    if( eType
16380 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  ==IN_INDEX_ROWID
16390 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20   ){.      /* In 
163a0 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 52  this case, the R
163b0 48 53 20 69 73 20 74 68 65 20 52 4f 57 49 44 20  HS is the ROWID 
163c0 6f 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20  of table b-tree 
163d0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
163e0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
163f0 5f 53 65 65 6b 52 6f 77 69 64 2c 20 70 45 78 70  _SeekRowid, pExp
16400 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49  r->iTable, destI
16410 66 46 61 6c 73 65 2c 20 72 31 29 3b 0a 20 20 20  fFalse, r1);.   
16420 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
16430 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  v);.    }else{. 
16440 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20       /* In this 
16450 63 61 73 65 2c 20 74 68 65 20 52 48 53 20 69 73  case, the RHS is
16460 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65   an index b-tree
16470 2e 20 41 70 70 6c 79 20 74 68 65 20 63 6f 6d 70  . Apply the comp
16480 61 72 69 73 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  arison.      ** 
16490 61 66 66 69 6e 69 74 69 65 73 20 74 6f 20 65 61  affinities to ea
164a0 63 68 20 76 61 6c 75 65 20 6f 6e 20 74 68 65 20  ch value on the 
164b0 4c 48 53 20 6f 66 20 74 68 65 20 6f 70 65 72 61  LHS of the opera
164c0 74 6f 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 73  tor.  */.      s
164d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
164e0 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c  (v, OP_Affinity,
164f0 20 72 31 2c 20 6e 56 65 63 74 6f 72 2c 20 30 2c   r1, nVector, 0,
16500 20 7a 41 66 66 2c 20 6e 56 65 63 74 6f 72 29 3b   zAff, nVector);
16510 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66  .      .      if
16520 28 20 6e 56 65 63 74 6f 72 3e 31 20 26 26 20 64  ( nVector>1 && d
16530 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49  estIfNull!=destI
16540 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20  fFalse ){.      
16550 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 45 78    int iIdx = pEx
16560 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
16570 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
16580 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65        int addrNe
16590 78 74 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  xt;..        /* 
165a0 53 65 61 72 63 68 20 74 68 65 20 69 6e 64 65 78  Search the index
165b0 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 2a 2f   for the key. */
165c0 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20  .        addr = 
165d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
165e0 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  4Int(v, OP_Found
165f0 2c 20 69 49 64 78 2c 20 30 2c 20 72 31 2c 20 6e  , iIdx, 0, r1, n
16600 56 65 63 74 6f 72 29 3b 0a 0a 20 20 20 20 20 20  Vector);..      
16610 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
16620 6e 74 20 74 68 65 20 73 70 65 63 69 66 69 65 64  nt the specified
16630 20 6b 65 79 20 69 73 20 6e 6f 74 20 70 72 65 73   key is not pres
16640 65 6e 74 20 69 6e 20 74 68 65 20 69 6e 64 65 78  ent in the index
16650 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  , .        ** so
16660 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
16670 68 65 20 49 4e 28 2e 2e 29 20 6f 70 65 72 61 74  he IN(..) operat
16680 6f 72 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  or must be eithe
16690 72 20 4e 55 4c 4c 20 6f 72 0a 20 20 20 20 20 20  r NULL or.      
166a0 20 20 2a 2a 20 30 2e 20 54 68 65 20 76 64 62 65    ** 0. The vdbe
166b0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
166c0 62 65 6c 6f 77 20 66 69 67 75 72 65 73 20 6f 75  below figures ou
166d0 74 20 77 68 69 63 68 2e 20 20 2a 2f 0a 20 20 20  t which.  */.   
166e0 20 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20       addrNext = 
166f0 31 2b 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  1+sqlite3VdbeAdd
16700 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
16710 2c 20 69 49 64 78 2c 20 64 65 73 74 49 66 46 61  , iIdx, destIfFa
16720 6c 73 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 66  lse);..        f
16730 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f  or(i=0; i<nVecto
16740 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
16750 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20     Expr *p;.    
16760 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
16770 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  Coll;.          
16780 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33  int r2 = sqlite3
16790 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
167a0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 20  e);.          p 
167b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
167c0 74 6f 72 46 69 65 6c 64 28 70 4c 65 66 74 2c 20  torField(pLeft, 
167d0 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  i);.          pC
167e0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
167f0 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
16800 20 70 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20   p);..          
16810 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16820 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
16830 69 49 64 78 2c 20 69 2c 20 72 32 29 3b 0a 20 20  iIdx, i, r2);.  
16840 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16850 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
16860 45 71 2c 20 72 31 2b 69 2c 20 30 2c 20 72 32 2c  Eq, r1+i, 0, r2,
16870 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 50 34   (void*)pColl,P4
16880 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20  _COLLSEQ);.     
16890 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
168a0 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49  ChangeP5(v, SQLI
168b0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
168c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
168d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
168e0 50 5f 4e 65 78 74 2c 20 69 49 64 78 2c 20 61 64  P_Next, iIdx, ad
168f0 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 20  drNext);.       
16900 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16910 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
16920 20 30 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29   0, destIfFalse)
16930 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
16940 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
16950 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  v, sqlite3VdbeCu
16960 72 72 65 6e 74 41 64 64 72 28 76 29 2d 33 29 3b  rrentAddr(v)-3);
16970 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
16980 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
16990 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
169a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
169b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
169c0 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
169d0 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 0a 20   destIfNull);.. 
169e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65         /* The ke
169f0 79 20 77 61 73 20 66 6f 75 6e 64 20 69 6e 20 74  y was found in t
16a00 68 65 20 69 6e 64 65 78 2e 20 49 66 20 69 74 20  he index. If it 
16a10 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c  contains any NUL
16a20 4c 20 76 61 6c 75 65 73 2c 0a 20 20 20 20 20 20  L values,.      
16a30 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65    ** then the re
16a40 73 75 6c 74 20 6f 66 20 74 68 65 20 49 4e 28 2e  sult of the IN(.
16a50 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20 69 73 20  ..) operator is 
16a60 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73 65 2c  NULL. Otherwise,
16a70 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
16a80 72 65 73 75 6c 74 20 69 73 20 31 2e 20 20 2a 2f  result is 1.  */
16a90 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16aa0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
16ab0 61 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 66  addr);.        f
16ac0 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f  or(i=0; i<nVecto
16ad0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
16ae0 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c     Expr *p = sql
16af0 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 46 69  ite3ExprVectorFi
16b00 65 6c 64 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  eld(pExpr->pLeft
16b10 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
16b20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
16b30 61 6e 42 65 4e 75 6c 6c 28 70 29 20 29 7b 0a 20  anBeNull(p) ){. 
16b40 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
16b50 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16b60 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2b 61 69  OP_IsNull, r1+ai
16b70 4d 61 70 5b 69 5d 2c 20 64 65 73 74 49 66 4e 75  Map[i], destIfNu
16b80 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ll);.          }
16b90 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
16ba0 20 20 7d 65 6c 73 65 20 69 66 28 20 72 52 68 73    }else if( rRhs
16bb0 48 61 73 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20  HasNull==0 ){.  
16bc0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
16bd0 61 6e 63 68 20 72 75 6e 73 20 69 66 20 69 74 20  anch runs if it 
16be0 69 73 20 6b 6e 6f 77 6e 20 61 74 20 63 6f 6d 70  is known at comp
16bf0 69 6c 65 20 74 69 6d 65 20 74 68 61 74 20 74 68  ile time that th
16c00 65 20 52 48 53 0a 20 20 20 20 20 20 20 20 2a 2a  e RHS.        **
16c10 20 63 61 6e 6e 6f 74 20 63 6f 6e 74 61 69 6e 20   cannot contain 
16c20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 20 54 68 69  NULL values. Thi
16c30 73 20 68 61 70 70 65 6e 73 20 61 73 20 61 20 72  s happens as a r
16c40 65 73 75 6c 74 0a 20 20 20 20 20 20 20 20 2a 2a  esult.        **
16c50 20 6f 66 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63   of "NOT NULL" c
16c60 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68  onstraints in th
16c70 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
16c80 61 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  a..        **.  
16c90 20 20 20 20 20 20 2a 2a 20 41 6c 73 6f 20 72 75        ** Also ru
16ca0 6e 20 74 68 69 73 20 62 72 61 6e 63 68 20 69 66  n this branch if
16cb0 20 4e 55 4c 4c 20 69 73 20 65 71 75 69 76 61 6c   NULL is equival
16cc0 65 6e 74 20 74 6f 20 46 41 4c 53 45 0a 20 20 20  ent to FALSE.   
16cd0 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 69 73       ** for this
16ce0 20 70 61 72 74 69 63 75 6c 61 72 20 49 4e 20 6f   particular IN o
16cf0 70 65 72 61 74 6f 72 2e 20 20 2a 2f 0a 20 20 20  perator.  */.   
16d00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16d10 41 64 64 4f 70 34 49 6e 74 28 0a 20 20 20 20 20  AddOp4Int(.     
16d20 20 20 20 20 20 20 20 76 2c 20 4f 50 5f 4e 6f 74         v, OP_Not
16d30 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54  Found, pExpr->iT
16d40 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73  able, destIfFals
16d50 65 2c 20 72 31 2c 20 6e 56 65 63 74 6f 72 0a 20  e, r1, nVector. 
16d60 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
16d70 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
16d80 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
16d90 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68          /* In th
16da0 69 73 20 62 72 61 6e 63 68 2c 20 74 68 65 20 52  is branch, the R
16db0 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6d 69 67  HS of the IN mig
16dc0 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c  ht contain a NUL
16dd0 4c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  L and.        **
16de0 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66   the presence of
16df0 20 61 20 4e 55 4c 4c 20 6f 6e 20 74 68 65 20 52   a NULL on the R
16e00 48 53 20 6d 61 6b 65 73 20 61 20 64 69 66 66 65  HS makes a diffe
16e10 72 65 6e 63 65 20 69 6e 20 74 68 65 0a 20 20 20  rence in the.   
16e20 20 20 20 20 20 2a 2a 20 6f 75 74 63 6f 6d 65 2e       ** outcome.
16e30 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
16e40 20 20 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 0a      int addr1;..
16e50 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
16e60 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
16e70 20 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e 74   the LHS is cont
16e80 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53  ained in the RHS
16e90 2e 20 20 49 66 20 73 6f 2c 0a 20 20 20 20 20 20  .  If so,.      
16ea0 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 61 6e    ** then the an
16eb0 73 77 65 72 20 69 73 20 54 52 55 45 20 74 68 65  swer is TRUE the
16ec0 20 70 72 65 73 65 6e 63 65 20 6f 66 20 4e 55 4c   presence of NUL
16ed0 4c 73 20 69 6e 20 74 68 65 20 52 48 53 20 64 6f  Ls in the RHS do
16ee0 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f  es.        ** no
16ef0 74 20 6d 61 74 74 65 72 2e 20 20 49 66 20 74 68  t matter.  If th
16f00 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e  e LHS is not con
16f10 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48  tained in the RH
16f20 53 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  S, then the.    
16f30 20 20 20 20 2a 2a 20 61 6e 73 77 65 72 20 69 73      ** answer is
16f40 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 52 48 53   NULL if the RHS
16f50 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 20   contains NULLs 
16f60 61 6e 64 20 74 68 65 20 61 6e 73 77 65 72 20 69  and the answer i
16f70 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 41 4c  s.        ** FAL
16f80 53 45 20 69 66 20 74 68 65 20 52 48 53 20 69 73  SE if the RHS is
16f90 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 20 20 20 20   NULL-free..    
16fa0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
16fb0 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
16fc0 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
16fd0 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e  P_Found, pExpr->
16fe0 69 54 61 62 6c 65 2c 20 30 2c 20 72 31 2c 20 31  iTable, 0, r1, 1
16ff0 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
17000 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
17010 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17020 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
17030 6c 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c  ll, rRhsHasNull,
17040 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
17050 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
17060 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
17070 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
17080 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
17090 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
170a0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
170b0 64 64 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ddr1);.      }. 
170c0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
170d0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
170e0 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
170f0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
17100 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 73  Pop(pParse);.  s
17110 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
17120 72 73 65 2d 3e 64 62 2c 20 61 69 4d 61 70 29 3b  rse->db, aiMap);
17130 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
17140 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 41 66  (pParse->db, zAf
17150 66 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  f);.  VdbeCommen
17160 74 28 28 76 2c 20 22 65 6e 64 20 49 4e 20 65 78  t((v, "end IN ex
17170 70 72 22 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  pr"));.}.#endif 
17180 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
17190 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e  UBQUERY */..#ifn
171a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
171b0 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f  FLOATING_POINT./
171c0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e  *.** Generate an
171d0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61   instruction tha
171e0 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 66  t will put the f
171f0 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a  loating point.**
17200 20 76 61 6c 75 65 20 64 65 73 63 72 69 62 65 64   value described
17210 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e   by z[0..n-1] in
17220 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d  to register iMem
17230 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20  ..**.** The z[] 
17240 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62  string will prob
17250 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f  ably not be zero
17260 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75  -terminated.  Bu
17270 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63  t the .** z[n] c
17280 68 61 72 61 63 74 65 72 20 69 73 20 67 75 61 72  haracter is guar
17290 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f 6d  anteed to be som
172a0 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73  ething that does
172b0 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b   not look.** lik
172c0 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69  e the continuati
172d0 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  on of the number
172e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
172f0 20 63 6f 64 65 52 65 61 6c 28 56 64 62 65 20 2a   codeReal(Vdbe *
17300 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  v, const char *z
17310 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61 67  , int negateFlag
17320 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69  , int iMem){.  i
17330 66 28 20 41 4c 57 41 59 53 28 7a 21 3d 30 29 20  f( ALWAYS(z!=0) 
17340 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61  ){.    double va
17350 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  lue;.    sqlite3
17360 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20  AtoF(z, &value, 
17370 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
17380 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  z), SQLITE_UTF8)
17390 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 73  ;.    assert( !s
173a0 71 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c 75  qlite3IsNaN(valu
173b0 65 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77  e) ); /* The new
173c0 20 41 74 6f 46 20 6e 65 76 65 72 20 72 65 74 75   AtoF never retu
173d0 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69  rns NaN */.    i
173e0 66 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29 20  f( negateFlag ) 
173f0 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a  value = -value;.
17400 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17410 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
17420 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30  Real, 0, iMem, 0
17430 2c 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20 50  , (u8*)&value, P
17440 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23  4_REAL);.  }.}.#
17450 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  endif.../*.** Ge
17460 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75  nerate an instru
17470 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20  ction that will 
17480 70 75 74 20 74 68 65 20 69 6e 74 65 67 65 72 20  put the integer 
17490 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20 74  describe by.** t
174a0 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e  ext z[0..n-1] in
174b0 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d  to register iMem
174c0 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a  ..**.** Expr.u.z
174d0 54 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79 73 20  Token is always 
174e0 55 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d 74 65  UTF8 and zero-te
174f0 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74 61  rminated..*/.sta
17500 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74  tic void codeInt
17510 65 67 65 72 28 50 61 72 73 65 20 2a 70 50 61 72  eger(Parse *pPar
17520 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
17530 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e   int negFlag, in
17540 74 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20  t iMem){.  Vdbe 
17550 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
17560 62 65 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  be;.  if( pExpr-
17570 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56  >flags & EP_IntV
17580 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  alue ){.    int 
17590 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69 56 61  i = pExpr->u.iVa
175a0 6c 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  lue;.    assert(
175b0 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28   i>=0 );.    if(
175c0 20 6e 65 67 46 6c 61 67 20 29 20 69 20 3d 20 2d   negFlag ) i = -
175d0 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  i;.    sqlite3Vd
175e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
175f0 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29  nteger, i, iMem)
17600 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
17610 6e 74 20 63 3b 0a 20 20 20 20 69 36 34 20 76 61  nt c;.    i64 va
17620 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  lue;.    const c
17630 68 61 72 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e  har *z = pExpr->
17640 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73  u.zToken;.    as
17650 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20  sert( z!=0 );.  
17660 20 20 63 20 3d 20 73 71 6c 69 74 65 33 44 65 63    c = sqlite3Dec
17670 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c 20 26 76  OrHexToI64(z, &v
17680 61 6c 75 65 29 3b 0a 20 20 20 20 69 66 28 20 63  alue);.    if( c
17690 3d 3d 30 20 7c 7c 20 28 63 3d 3d 32 20 26 26 20  ==0 || (c==2 && 
176a0 6e 65 67 46 6c 61 67 29 20 29 7b 0a 20 20 20 20  negFlag) ){.    
176b0 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 7b    if( negFlag ){
176c0 20 76 61 6c 75 65 20 3d 20 63 3d 3d 32 20 3f 20   value = c==2 ? 
176d0 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 3a  SMALLEST_INT64 :
176e0 20 2d 76 61 6c 75 65 3b 20 7d 0a 20 20 20 20 20   -value; }.     
176f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17700 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 49 6e 74  p4Dup8(v, OP_Int
17710 36 34 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20  64, 0, iMem, 0, 
17720 28 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34 5f  (u8*)&value, P4_
17730 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c 73  INT64);.    }els
17740 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e{.#ifdef SQLITE
17750 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
17760 4f 49 4e 54 0a 20 20 20 20 20 20 73 71 6c 69 74  OINT.      sqlit
17770 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
17780 65 2c 20 22 6f 76 65 72 73 69 7a 65 64 20 69 6e  e, "oversized in
17790 74 65 67 65 72 3a 20 25 73 25 73 22 2c 20 6e 65  teger: %s%s", ne
177a0 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22 22  gFlag ? "-" : ""
177b0 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 23 69 66 6e  , z);.#else.#ifn
177c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
177d0 48 45 58 5f 49 4e 54 45 47 45 52 0a 20 20 20 20  HEX_INTEGER.    
177e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
177f0 72 6e 69 63 6d 70 28 7a 2c 22 30 78 22 2c 32 29  rnicmp(z,"0x",2)
17800 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
17810 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
17820 50 61 72 73 65 2c 20 22 68 65 78 20 6c 69 74 65  Parse, "hex lite
17830 72 61 6c 20 74 6f 6f 20 62 69 67 3a 20 25 73 22  ral too big: %s"
17840 2c 20 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , z);.      }els
17850 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b  e.#endif.      {
17860 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65 61  .        codeRea
17870 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67 2c  l(v, z, negFlag,
17880 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a   iMem);.      }.
17890 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
178a0 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
178b0 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a  SQLITE_DEBUG)./*
178c0 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 65 20 63  .** Verify the c
178d0 6f 6e 73 69 73 74 65 6e 63 79 20 6f 66 20 74 68  onsistency of th
178e0 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 0a 2a  e column cache.*
178f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63  /.static int cac
17900 68 65 49 73 56 61 6c 69 64 28 50 61 72 73 65 20  heIsValid(Parse 
17910 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20  *pParse){.  int 
17920 69 2c 20 6e 3b 0a 20 20 66 6f 72 28 69 3d 6e 3d  i, n;.  for(i=n=
17930 30 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  0; i<SQLITE_N_CO
17940 4c 43 41 43 48 45 3b 20 69 2b 2b 29 7b 0a 20 20  LCACHE; i++){.  
17950 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 43    if( pParse->aC
17960 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67 3e  olCache[i].iReg>
17970 30 20 29 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 72  0 ) n++;.  }.  r
17980 65 74 75 72 6e 20 6e 3d 3d 70 50 61 72 73 65 2d  eturn n==pParse-
17990 3e 6e 43 6f 6c 43 61 63 68 65 3b 0a 7d 0a 23 65  >nColCache;.}.#e
179a0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ndif../*.** Clea
179b0 72 20 61 20 63 61 63 68 65 20 65 6e 74 72 79 2e  r a cache entry.
179c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
179d0 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28  cacheEntryClear(
179e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73  Parse *pParse, s
179f0 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
17a00 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74 65  *p){.  if( p->te
17a10 6d 70 52 65 67 20 29 7b 0a 20 20 20 20 69 66 28  mpReg ){.    if(
17a20 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
17a30 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72  g<ArraySize(pPar
17a40 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b  se->aTempReg) ){
17a50 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61  .      pParse->a
17a60 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e  TempReg[pParse->
17a70 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 2d  nTempReg++] = p-
17a80 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20  >iReg;.    }.   
17a90 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b   p->tempReg = 0;
17aa0 0a 20 20 7d 0a 20 20 70 2d 3e 69 52 65 67 20 3d  .  }.  p->iReg =
17ab0 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 43   0;.  pParse->nC
17ac0 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20 61 73 73  olCache--;.  ass
17ad0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
17ae0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
17af0 20 63 61 63 68 65 49 73 56 61 6c 69 64 28 70 50   cacheIsValid(pP
17b00 61 72 73 65 29 20 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  arse) );.}.../*.
17b10 2a 2a 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65  ** Record in the
17b20 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 74 68   column cache th
17b30 61 74 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  at a particular 
17b40 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 0a 2a 2a  column from a.**
17b50 20 70 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c   particular tabl
17b60 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61  e is stored in a
17b70 20 70 61 72 74 69 63 75 6c 61 72 20 72 65 67 69   particular regi
17b80 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ster..*/.void sq
17b90 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74  lite3ExprCacheSt
17ba0 6f 72 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ore(Parse *pPars
17bb0 65 2c 20 69 6e 74 20 69 54 61 62 2c 20 69 6e 74  e, int iTab, int
17bc0 20 69 43 6f 6c 2c 20 69 6e 74 20 69 52 65 67 29   iCol, int iReg)
17bd0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
17be0 20 6d 69 6e 4c 72 75 3b 0a 20 20 69 6e 74 20 69   minLru;.  int i
17bf0 64 78 4c 72 75 3b 0a 20 20 73 74 72 75 63 74 20  dxLru;.  struct 
17c00 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20  yColCache *p;.. 
17c10 20 2f 2a 20 55 6e 6c 65 73 73 20 61 6e 20 65 72   /* Unless an er
17c20 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
17c30 2c 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  , register numbe
17c40 72 73 20 61 72 65 20 61 6c 77 61 79 73 20 70 6f  rs are always po
17c50 73 69 74 69 76 65 2e 20 2a 2f 0a 20 20 61 73 73  sitive. */.  ass
17c60 65 72 74 28 20 69 52 65 67 3e 30 20 7c 7c 20 70  ert( iReg>0 || p
17c70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70  Parse->nErr || p
17c80 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
17c90 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 61 73 73  cFailed );.  ass
17ca0 65 72 74 28 20 69 43 6f 6c 3e 3d 2d 31 20 26 26  ert( iCol>=-1 &&
17cb0 20 69 43 6f 6c 3c 33 32 37 36 38 20 29 3b 20 20   iCol<32768 );  
17cc0 2f 2a 20 46 69 6e 69 74 65 20 63 6f 6c 75 6d 6e  /* Finite column
17cd0 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 2f   numbers */..  /
17ce0 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 43 6f 6c  * The SQLITE_Col
17cf0 75 6d 6e 43 61 63 68 65 20 66 6c 61 67 20 64 69  umnCache flag di
17d00 73 61 62 6c 65 73 20 74 68 65 20 63 6f 6c 75 6d  sables the colum
17d10 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 69  n cache.  This i
17d20 73 20 75 73 65 64 0a 20 20 2a 2a 20 66 6f 72 20  s used.  ** for 
17d30 74 65 73 74 69 6e 67 20 6f 6e 6c 79 20 2d 20 74  testing only - t
17d40 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 53 51  o verify that SQ
17d50 4c 69 74 65 20 61 6c 77 61 79 73 20 67 65 74 73  Lite always gets
17d60 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65 72   the same answer
17d70 0a 20 20 2a 2a 20 77 69 74 68 20 61 6e 64 20 77  .  ** with and w
17d80 69 74 68 6f 75 74 20 74 68 65 20 63 6f 6c 75 6d  ithout the colum
17d90 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20  n cache..  */.  
17da0 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  if( Optimization
17db0 44 69 73 61 62 6c 65 64 28 70 50 61 72 73 65 2d  Disabled(pParse-
17dc0 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 6c 75  >db, SQLITE_Colu
17dd0 6d 6e 43 61 63 68 65 29 20 29 20 72 65 74 75 72  mnCache) ) retur
17de0 6e 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 72  n;..  /* First r
17df0 65 70 6c 61 63 65 20 61 6e 79 20 65 78 69 73 74  eplace any exist
17e00 69 6e 67 20 65 6e 74 72 79 2e 0a 20 20 2a 2a 0a  ing entry..  **.
17e10 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74    ** Actually, t
17e20 68 65 20 77 61 79 20 74 68 65 20 63 6f 6c 75 6d  he way the colum
17e30 6e 20 63 61 63 68 65 20 69 73 20 63 75 72 72 65  n cache is curre
17e40 6e 74 6c 79 20 75 73 65 64 2c 20 77 65 20 61 72  ntly used, we ar
17e50 65 20 67 75 61 72 61 6e 74 65 65 64 0a 20 20 2a  e guaranteed.  *
17e60 2a 20 74 68 61 74 20 74 68 65 20 6f 62 6a 65 63  * that the objec
17e70 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 6c 72  t will never alr
17e80 65 61 64 79 20 62 65 20 69 6e 20 63 61 63 68 65  eady be in cache
17e90 2e 20 20 56 65 72 69 66 79 20 74 68 69 73 20 67  .  Verify this g
17ea0 75 61 72 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a 23  uarantee..  */.#
17eb0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
17ec0 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
17ed0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
17ee0 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
17ef0 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
17f00 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 52 65    assert( p->iRe
17f10 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 54 61 62 6c  g==0 || p->iTabl
17f20 65 21 3d 69 54 61 62 20 7c 7c 20 70 2d 3e 69 43  e!=iTab || p->iC
17f30 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b 0a 20  olumn!=iCol );. 
17f40 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
17f50 46 69 6e 64 20 61 6e 20 65 6d 70 74 79 20 73 6c  Find an empty sl
17f60 6f 74 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69  ot and replace i
17f70 74 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20  t */.  for(i=0, 
17f80 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
17f90 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
17fa0 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
17fb0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
17fc0 69 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  iReg==0 ){.     
17fd0 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61   p->iLevel = pPa
17fe0 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
17ff0 3b 0a 20 20 20 20 20 20 70 2d 3e 69 54 61 62 6c  ;.      p->iTabl
18000 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20  e = iTab;.      
18010 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f  p->iColumn = iCo
18020 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67  l;.      p->iReg
18030 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 20 20 70   = iReg;.      p
18040 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20  ->tempReg = 0;. 
18050 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50       p->lru = pP
18060 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b  arse->iCacheCnt+
18070 2b 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  +;.      pParse-
18080 3e 6e 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20 20  >nColCache++;.  
18090 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
180a0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
180b0 69 6c 65 64 20 7c 7c 20 63 61 63 68 65 49 73 56  iled || cacheIsV
180c0 61 6c 69 64 28 70 50 61 72 73 65 29 20 29 3b 0a  alid(pParse) );.
180d0 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
180e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
180f0 70 6c 61 63 65 20 74 68 65 20 6c 61 73 74 20 72  place the last r
18100 65 63 65 6e 74 6c 79 20 75 73 65 64 20 2a 2f 0a  ecently used */.
18110 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78 37 66 66    minLru = 0x7ff
18120 66 66 66 66 66 3b 0a 20 20 69 64 78 4c 72 75 20  fffff;.  idxLru 
18130 3d 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  = -1;.  for(i=0,
18140 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
18150 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
18160 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
18170 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  p++){.    if( p-
18180 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20 29 7b 0a 20  >lru<minLru ){. 
18190 20 20 20 20 20 69 64 78 4c 72 75 20 3d 20 69 3b       idxLru = i;
181a0 0a 20 20 20 20 20 20 6d 69 6e 4c 72 75 20 3d 20  .      minLru = 
181b0 70 2d 3e 6c 72 75 3b 0a 20 20 20 20 7d 0a 20 20  p->lru;.    }.  
181c0 7d 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 69  }.  if( ALWAYS(i
181d0 64 78 4c 72 75 3e 3d 30 29 20 29 7b 0a 20 20 20  dxLru>=0) ){.   
181e0 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43   p = &pParse->aC
181f0 6f 6c 43 61 63 68 65 5b 69 64 78 4c 72 75 5d 3b  olCache[idxLru];
18200 0a 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d  .    p->iLevel =
18210 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
18220 65 76 65 6c 3b 0a 20 20 20 20 70 2d 3e 69 54 61  evel;.    p->iTa
18230 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  ble = iTab;.    
18240 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f  p->iColumn = iCo
18250 6c 3b 0a 20 20 20 20 70 2d 3e 69 52 65 67 20 3d  l;.    p->iReg =
18260 20 69 52 65 67 3b 0a 20 20 20 20 70 2d 3e 74 65   iReg;.    p->te
18270 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 70  mpReg = 0;.    p
18280 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e  ->lru = pParse->
18290 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20  iCacheCnt++;.   
182a0 20 61 73 73 65 72 74 28 20 63 61 63 68 65 49 73   assert( cacheIs
182b0 56 61 6c 69 64 28 70 50 61 72 73 65 29 20 29 3b  Valid(pParse) );
182c0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
182d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61  .}../*.** Indica
182e0 74 65 20 74 68 61 74 20 72 65 67 69 73 74 65 72  te that register
182f0 73 20 62 65 74 77 65 65 6e 20 69 52 65 67 2e 2e  s between iReg..
18300 69 52 65 67 2b 6e 52 65 67 2d 31 20 61 72 65 20  iReg+nReg-1 are 
18310 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65  being overwritte
18320 6e 2e 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20  n..** Purge the 
18330 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65  range of registe
18340 72 73 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75  rs from the colu
18350 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f 69  mn cache..*/.voi
18360 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
18370 68 65 52 65 6d 6f 76 65 28 50 61 72 73 65 20 2a  heRemove(Parse *
18380 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
18390 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 73  , int nReg){.  s
183a0 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
183b0 2a 70 3b 0a 20 20 69 66 28 20 69 52 65 67 3c 3d  *p;.  if( iReg<=
183c0 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 43 6f  0 || pParse->nCo
183d0 6c 43 61 63 68 65 3d 3d 30 20 29 20 72 65 74 75  lCache==0 ) retu
183e0 72 6e 3b 0a 20 20 70 20 3d 20 26 70 50 61 72 73  rn;.  p = &pPars
183f0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 53 51 4c  e->aColCache[SQL
18400 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 2d 31  ITE_N_COLCACHE-1
18410 5d 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a 20  ];.  while(1){. 
18420 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20 3e     if( p->iReg >
18430 3d 20 69 52 65 67 20 26 26 20 70 2d 3e 69 52 65  = iReg && p->iRe
18440 67 20 3c 20 69 52 65 67 2b 6e 52 65 67 20 29 20  g < iReg+nReg ) 
18450 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28  cacheEntryClear(
18460 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
18470 69 66 28 20 70 3d 3d 70 50 61 72 73 65 2d 3e 61  if( p==pParse->a
18480 43 6f 6c 43 61 63 68 65 20 29 20 62 72 65 61 6b  ColCache ) break
18490 3b 0a 20 20 20 20 70 2d 2d 3b 0a 20 20 7d 0a 7d  ;.    p--;.  }.}
184a0 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72  ../*.** Remember
184b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c   the current col
184c0 75 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74 65 78  umn cache contex
184d0 74 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e 74 72  t.  Any new entr
184e0 69 65 73 20 61 64 64 65 64 0a 2a 2a 20 61 64 64  ies added.** add
184f0 65 64 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e  ed to the column
18500 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
18510 73 20 63 61 6c 6c 20 61 72 65 20 72 65 6d 6f 76  s call are remov
18520 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 63  ed when the.** c
18530 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 70  orresponding pop
18540 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64   occurs..*/.void
18550 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
18560 65 50 75 73 68 28 50 61 72 73 65 20 2a 70 50 61  ePush(Parse *pPa
18570 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e  rse){.  pParse->
18580 69 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a 23  iCacheLevel++;.#
18590 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
185a0 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  UG.  if( pParse-
185b0 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
185c0 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61  ITE_VdbeAddopTra
185d0 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  ce ){.    printf
185e0 28 22 50 55 53 48 20 74 6f 20 25 64 5c 6e 22 2c  ("PUSH to %d\n",
185f0 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
18600 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  evel);.  }.#endi
18610 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  f.}../*.** Remov
18620 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d  e from the colum
18630 6e 20 63 61 63 68 65 20 61 6e 79 20 65 6e 74 72  n cache any entr
18640 69 65 73 20 74 68 61 74 20 77 65 72 65 20 61 64  ies that were ad
18650 64 65 64 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a  ded since the.**
18660 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 71   the previous sq
18670 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
18680 73 68 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 49  sh operation.  I
18690 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
186a0 65 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20 63 61  estore.** the ca
186b0 63 68 65 20 74 6f 20 74 68 65 20 73 74 61 74 65  che to the state
186c0 20 69 74 20 77 61 73 20 69 6e 20 70 72 69 6f 72   it was in prior
186d0 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
186e0 20 50 75 73 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73   Push..*/.void s
186f0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
18700 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  op(Parse *pParse
18710 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
18720 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
18730 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  p;.  assert( pPa
18740 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
18750 3e 3d 31 20 29 3b 0a 20 20 70 50 61 72 73 65 2d  >=1 );.  pParse-
18760 3e 69 43 61 63 68 65 4c 65 76 65 6c 2d 2d 3b 0a  >iCacheLevel--;.
18770 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
18780 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65  BUG.  if( pParse
18790 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
187a0 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72  LITE_VdbeAddopTr
187b0 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  ace ){.    print
187c0 66 28 22 50 4f 50 20 20 74 6f 20 25 64 5c 6e 22  f("POP  to %d\n"
187d0 2c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  , pParse->iCache
187e0 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64  Level);.  }.#end
187f0 69 66 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  if.  for(i=0, p=
18800 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
18810 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
18820 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
18830 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52  ){.    if( p->iR
18840 65 67 20 26 26 20 70 2d 3e 69 4c 65 76 65 6c 3e  eg && p->iLevel>
18850 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
18860 76 65 6c 20 29 7b 0a 20 20 20 20 20 20 63 61 63  vel ){.      cac
18870 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61  heEntryClear(pPa
18880 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20  rse, p);.    }. 
18890 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e   }.}../*.** When
188a0 20 61 20 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e   a cached column
188b0 20 69 73 20 72 65 75 73 65 64 2c 20 6d 61 6b 65   is reused, make
188c0 20 73 75 72 65 20 74 68 61 74 20 69 74 73 20 72   sure that its r
188d0 65 67 69 73 74 65 72 20 69 73 0a 2a 2a 20 6e 6f  egister is.** no
188e0 20 6c 6f 6e 67 65 72 20 61 76 61 69 6c 61 62 6c   longer availabl
188f0 65 20 61 73 20 61 20 74 65 6d 70 20 72 65 67 69  e as a temp regi
18900 73 74 65 72 2e 20 20 74 69 63 6b 65 74 20 23 33  ster.  ticket #3
18910 38 37 39 3a 20 20 74 68 61 74 20 73 61 6d 65 0a  879:  that same.
18920 2a 2a 20 72 65 67 69 73 74 65 72 20 6d 69 67 68  ** register migh
18930 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  t be in the cach
18940 65 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c  e in multiple pl
18950 61 63 65 73 2c 20 73 6f 20 62 65 20 73 75 72 65  aces, so be sure
18960 20 74 6f 0a 2a 2a 20 67 65 74 20 74 68 65 6d 20   to.** get them 
18970 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  all..*/.static v
18980 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
18990 61 63 68 65 50 69 6e 52 65 67 69 73 74 65 72 28  achePinRegister(
189a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
189b0 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt iReg){.  int 
189c0 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
189d0 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28  Cache *p;.  for(
189e0 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
189f0 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
18a00 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
18a10 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
18a20 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20  ( p->iReg==iReg 
18a30 29 7b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70  ){.      p->temp
18a40 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Reg = 0;.    }. 
18a50 20 7d 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74   }.}../* Generat
18a60 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
18a70 20 6c 6f 61 64 20 69 6e 74 6f 20 72 65 67 69 73   load into regis
18a80 74 65 72 20 72 65 67 4f 75 74 20 61 20 76 61 6c  ter regOut a val
18a90 75 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 70  ue that is.** ap
18aa0 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68  propriate for th
18ab0 65 20 69 49 64 78 43 6f 6c 2d 74 68 20 63 6f 6c  e iIdxCol-th col
18ac0 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49 64  umn of index pId
18ad0 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  x..*/.void sqlit
18ae0 65 33 45 78 70 72 43 6f 64 65 4c 6f 61 64 49 6e  e3ExprCodeLoadIn
18af0 64 65 78 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72  dexColumn(.  Par
18b00 73 65 20 2a 70 50 61 72 73 65 2c 20 20 2f 2a 20  se *pParse,  /* 
18b10 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
18b20 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ext */.  Index *
18b30 70 49 64 78 2c 20 20 20 20 2f 2a 20 54 68 65 20  pIdx,    /* The 
18b40 69 6e 64 65 78 20 77 68 6f 73 65 20 63 6f 6c 75  index whose colu
18b50 6d 6e 20 69 73 20 74 6f 20 62 65 20 6c 6f 61 64  mn is to be load
18b60 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ed */.  int iTab
18b70 43 75 72 2c 20 20 20 20 2f 2a 20 43 75 72 73 6f  Cur,    /* Curso
18b80 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  r pointing to a 
18b90 74 61 62 6c 65 20 72 6f 77 20 2a 2f 0a 20 20 69  table row */.  i
18ba0 6e 74 20 69 49 64 78 43 6f 6c 2c 20 20 20 20 2f  nt iIdxCol,    /
18bb0 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  * The column of 
18bc0 74 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  the index to be 
18bd0 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20  loaded */.  int 
18be0 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 53  regOut      /* S
18bf0 74 6f 72 65 20 74 68 65 20 69 6e 64 65 78 20 63  tore the index c
18c00 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 74  olumn value in t
18c10 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  his register */.
18c20 29 7b 0a 20 20 69 31 36 20 69 54 61 62 43 6f 6c  ){.  i16 iTabCol
18c30 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
18c40 6e 5b 69 49 64 78 43 6f 6c 5d 3b 0a 20 20 69 66  n[iIdxCol];.  if
18c50 28 20 69 54 61 62 43 6f 6c 3d 3d 58 4e 5f 45 58  ( iTabCol==XN_EX
18c60 50 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  PR ){.    assert
18c70 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72  ( pIdx->aColExpr
18c80 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
18c90 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e  pIdx->aColExpr->
18ca0 6e 45 78 70 72 3e 69 49 64 78 43 6f 6c 20 29 3b  nExpr>iIdxCol );
18cb0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65  .    pParse->iSe
18cc0 6c 66 54 61 62 20 3d 20 69 54 61 62 43 75 72 3b  lfTab = iTabCur;
18cd0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
18ce0 43 6f 64 65 43 6f 70 79 28 70 50 61 72 73 65 2c  CodeCopy(pParse,
18cf0 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d   pIdx->aColExpr-
18d00 3e 61 5b 69 49 64 78 43 6f 6c 5d 2e 70 45 78 70  >a[iIdxCol].pExp
18d10 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65  r, regOut);.  }e
18d20 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
18d30 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
18d40 6e 4f 66 54 61 62 6c 65 28 70 50 61 72 73 65 2d  nOfTable(pParse-
18d50 3e 70 56 64 62 65 2c 20 70 49 64 78 2d 3e 70 54  >pVdbe, pIdx->pT
18d60 61 62 6c 65 2c 20 69 54 61 62 43 75 72 2c 0a 20  able, iTabCur,. 
18d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d90 20 20 20 69 54 61 62 43 6f 6c 2c 20 72 65 67 4f     iTabCol, regO
18da0 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ut);.  }.}../*.*
18db0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
18dc0 74 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 76  to extract the v
18dd0 61 6c 75 65 20 6f 66 20 74 68 65 20 69 43 6f 6c  alue of the iCol
18de0 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20  -th column of a 
18df0 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  table..*/.void s
18e00 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
18e10 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 0a  tColumnOfTable(.
18e20 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
18e30 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 75 6e    /* The VDBE un
18e40 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
18e50 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
18e60 62 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62  b,    /* The tab
18e70 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
18e80 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  e value */.  int
18e90 20 69 54 61 62 43 75 72 2c 20 20 20 20 2f 2a 20   iTabCur,    /* 
18ea0 54 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72  The table cursor
18eb0 2e 20 20 4f 72 20 74 68 65 20 50 4b 20 63 75 72  .  Or the PK cur
18ec0 73 6f 72 20 66 6f 72 20 57 49 54 48 4f 55 54 20  sor for WITHOUT 
18ed0 52 4f 57 49 44 20 2a 2f 0a 20 20 69 6e 74 20 69  ROWID */.  int i
18ee0 43 6f 6c 2c 20 20 20 20 20 20 20 2f 2a 20 49 6e  Col,       /* In
18ef0 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  dex of the colum
18f00 6e 20 74 6f 20 65 78 74 72 61 63 74 20 2a 2f 0a  n to extract */.
18f10 20 20 69 6e 74 20 72 65 67 4f 75 74 20 20 20 20    int regOut    
18f20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65    /* Extract the
18f30 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 69 73   value into this
18f40 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a   register */.){.
18f50 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20    if( iCol<0 || 
18f60 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b 65  iCol==pTab->iPKe
18f70 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
18f80 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18f90 5f 52 6f 77 69 64 2c 20 69 54 61 62 43 75 72 2c  _Rowid, iTabCur,
18fa0 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c 73   regOut);.  }els
18fb0 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  e{.    int op = 
18fc0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
18fd0 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f  ? OP_VColumn : O
18fe0 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 6e  P_Column;.    in
18ff0 74 20 78 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  t x = iCol;.    
19000 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54  if( !HasRowid(pT
19010 61 62 29 20 26 26 20 21 49 73 56 69 72 74 75 61  ab) && !IsVirtua
19020 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
19030 20 78 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75   x = sqlite3Colu
19040 6d 6e 4f 66 49 6e 64 65 78 28 73 71 6c 69 74 65  mnOfIndex(sqlite
19050 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
19060 28 70 54 61 62 29 2c 20 69 43 6f 6c 29 3b 0a 20  (pTab), iCol);. 
19070 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
19080 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70  VdbeAddOp3(v, op
19090 2c 20 69 54 61 62 43 75 72 2c 20 78 2c 20 72 65  , iTabCur, x, re
190a0 67 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  gOut);.  }.  if(
190b0 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20   iCol>=0 ){.    
190c0 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66  sqlite3ColumnDef
190d0 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 43  ault(v, pTab, iC
190e0 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d  ol, regOut);.  }
190f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
19100 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
19110 6c 20 65 78 74 72 61 63 74 20 74 68 65 20 69 43  l extract the iC
19120 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20  olumn-th column 
19130 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54  from.** table pT
19140 61 62 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ab and store the
19150 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e   column value in
19160 20 61 20 72 65 67 69 73 74 65 72 2e 20 0a 2a 2a   a register. .**
19170 0a 2a 2a 20 41 6e 20 65 66 66 6f 72 74 20 69 73  .** An effort is
19180 20 6d 61 64 65 20 74 6f 20 73 74 6f 72 65 20 74   made to store t
19190 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  he column value 
191a0 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67  in register iReg
191b0 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6e 6f  .  This.** is no
191c0 74 20 67 61 72 61 6e 74 65 65 65 64 20 66 6f 72  t garanteeed for
191d0 20 47 65 74 43 6f 6c 75 6d 6e 28 29 20 2d 20 74   GetColumn() - t
191e0 68 65 20 72 65 73 75 6c 74 20 63 61 6e 20 62 65  he result can be
191f0 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 61 6e   stored in.** an
19200 79 20 72 65 67 69 73 74 65 72 2e 20 20 42 75 74  y register.  But
19210 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 67   the result is g
19220 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6c 61 6e  uaranteed to lan
19230 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52  d in register iR
19240 65 67 0a 2a 2a 20 66 6f 72 20 47 65 74 43 6f 6c  eg.** for GetCol
19250 75 6d 6e 54 6f 52 65 67 28 29 2e 0a 2a 2a 0a 2a  umnToReg()..**.*
19260 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20  * There must be 
19270 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74  an open cursor t
19280 6f 20 70 54 61 62 20 69 6e 20 69 54 61 62 6c 65  o pTab in iTable
19290 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
192a0 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e  ne.** is called.
192b0 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74    If iColumn<0 t
192c0 68 65 6e 20 63 6f 64 65 20 69 73 20 67 65 6e 65  hen code is gene
192d0 72 61 74 65 64 20 74 68 61 74 20 65 78 74 72 61  rated that extra
192e0 63 74 73 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a  cts the rowid..*
192f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
19300 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 0a  rCodeGetColumn(.
19310 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
19320 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
19330 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
19340 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
19350 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
19360 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f  /* Description o
19370 66 20 74 68 65 20 74 61 62 6c 65 20 77 65 20 61  f the table we a
19380 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  re reading from 
19390 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
193a0 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f  ,     /* Index o
193b0 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75  f the table colu
193c0 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  mn */.  int iTab
193d0 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  le,      /* The 
193e0 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  cursor pointing 
193f0 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  to the table */.
19400 20 20 69 6e 74 20 69 52 65 67 2c 20 20 20 20 20    int iReg,     
19410 20 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75     /* Store resu
19420 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 75 38  lts here */.  u8
19430 20 70 35 20 20 20 20 20 20 20 20 20 20 20 20 2f   p5            /
19440 2a 20 50 35 20 76 61 6c 75 65 20 66 6f 72 20 4f  * P5 value for O
19450 50 5f 43 6f 6c 75 6d 6e 20 2b 20 46 4c 41 47 53  P_Column + FLAGS
19460 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
19470 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
19480 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
19490 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
194a0 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  ;..  for(i=0, p=
194b0 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
194c0 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
194d0 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
194e0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52  ){.    if( p->iR
194f0 65 67 3e 30 20 26 26 20 70 2d 3e 69 54 61 62 6c  eg>0 && p->iTabl
19500 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 2d 3e  e==iTable && p->
19510 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e  iColumn==iColumn
19520 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75   ){.      p->lru
19530 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
19540 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71  eCnt++;.      sq
19550 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 69  lite3ExprCachePi
19560 6e 52 65 67 69 73 74 65 72 28 70 50 61 72 73 65  nRegister(pParse
19570 2c 20 70 2d 3e 69 52 65 67 29 3b 0a 20 20 20 20  , p->iReg);.    
19580 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 52 65 67    return p->iReg
19590 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20  ;.    }.  }  .  
195a0 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
195b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
195c0 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
195d0 65 28 76 2c 20 70 54 61 62 2c 20 69 54 61 62 6c  e(v, pTab, iTabl
195e0 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67  e, iColumn, iReg
195f0 29 3b 0a 20 20 69 66 28 20 70 35 20 29 7b 0a 20  );.  if( p5 ){. 
19600 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
19610 61 6e 67 65 50 35 28 76 2c 20 70 35 29 3b 0a 20  angeP5(v, p5);. 
19620 20 7d 65 6c 73 65 7b 20 20 20 0a 20 20 20 20 73   }else{   .    s
19630 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53  qlite3ExprCacheS
19640 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 54 61  tore(pParse, iTa
19650 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52  ble, iColumn, iR
19660 65 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eg);.  }.  retur
19670 6e 20 69 52 65 67 3b 0a 7d 0a 76 6f 69 64 20 73  n iReg;.}.void s
19680 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
19690 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 0a 20 20  tColumnToReg(.  
196a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
196b0 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
196c0 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
196d0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62  context */.  Tab
196e0 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a  le *pTab,     /*
196f0 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
19700 74 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65  the table we are
19710 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f   reading from */
19720 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20  .  int iColumn, 
19730 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
19740 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  the table column
19750 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
19760 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75  ,      /* The cu
19770 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
19780 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
19790 69 6e 74 20 69 52 65 67 20 20 20 20 20 20 20 20  int iReg        
197a0 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74   /* Store result
197b0 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  s here */.){.  i
197c0 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45  nt r1 = sqlite3E
197d0 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
197e0 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69  (pParse, pTab, i
197f0 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 6c 65 2c 20  Column, iTable, 
19800 69 52 65 67 2c 20 30 29 3b 0a 20 20 69 66 28 20  iReg, 0);.  if( 
19810 72 31 21 3d 69 52 65 67 20 29 20 73 71 6c 69 74  r1!=iReg ) sqlit
19820 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61  e3VdbeAddOp2(pPa
19830 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53  rse->pVdbe, OP_S
19840 43 6f 70 79 2c 20 72 31 2c 20 69 52 65 67 29 3b  Copy, r1, iReg);
19850 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  .}.../*.** Clear
19860 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63 68   all column cach
19870 65 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f  e entries..*/.vo
19880 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
19890 63 68 65 43 6c 65 61 72 28 50 61 72 73 65 20 2a  cheClear(Parse *
198a0 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69  pParse){.  int i
198b0 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
198c0 61 63 68 65 20 2a 70 3b 0a 0a 23 69 66 20 53 51  ache *p;..#if SQ
198d0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
198e0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61   pParse->db->fla
198f0 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
19900 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
19910 20 20 70 72 69 6e 74 66 28 22 43 4c 45 41 52 5c    printf("CLEAR\
19920 6e 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n");.  }.#endif.
19930 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
19940 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
19950 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
19960 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
19970 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20      if( p->iReg 
19980 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e  ){.      cacheEn
19990 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c  tryClear(pParse,
199a0 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d   p);.    }.  }.}
199b0 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74  ../*.** Record t
199c0 68 65 20 66 61 63 74 20 74 68 61 74 20 61 6e 20  he fact that an 
199d0 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65 20  affinity change 
199e0 68 61 73 20 6f 63 63 75 72 72 65 64 20 6f 6e 20  has occurred on 
199f0 69 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73 74  iCount.** regist
19a00 65 72 73 20 73 74 61 72 74 69 6e 67 20 77 69 74  ers starting wit
19a10 68 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69  h iStart..*/.voi
19a20 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
19a30 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
19a40 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
19a50 69 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20  int iStart, int 
19a60 69 43 6f 75 6e 74 29 7b 0a 20 20 73 71 6c 69 74  iCount){.  sqlit
19a70 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
19a80 65 28 70 50 61 72 73 65 2c 20 69 53 74 61 72 74  e(pParse, iStart
19a90 2c 20 69 43 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a  , iCount);.}../*
19aa0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
19ab0 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e  e to move conten
19ac0 74 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73  t from registers
19ad0 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e   iFrom...iFrom+n
19ae0 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f  Reg-1.** over to
19af0 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31   iTo..iTo+nReg-1
19b00 2e 20 4b 65 65 70 20 74 68 65 20 63 6f 6c 75 6d  . Keep the colum
19b10 6e 20 63 61 63 68 65 20 75 70 2d 74 6f 2d 64 61  n cache up-to-da
19b20 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  te..*/.void sqli
19b30 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
19b40 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
19b50 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54  nt iFrom, int iT
19b60 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  o, int nReg){.  
19b70 61 73 73 65 72 74 28 20 69 46 72 6f 6d 3e 3d 69  assert( iFrom>=i
19b80 54 6f 2b 6e 52 65 67 20 7c 7c 20 69 46 72 6f 6d  To+nReg || iFrom
19b90 2b 6e 52 65 67 3c 3d 69 54 6f 20 29 3b 0a 20 20  +nReg<=iTo );.  
19ba0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19bb0 33 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  3(pParse->pVdbe,
19bc0 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c   OP_Move, iFrom,
19bd0 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a 20 20 73   iTo, nReg);.  s
19be0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52  qlite3ExprCacheR
19bf0 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 46  emove(pParse, iF
19c00 72 6f 6d 2c 20 6e 52 65 67 29 3b 0a 7d 0a 0a 23  rom, nReg);.}..#
19c10 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
19c20 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  E_DEBUG) || defi
19c30 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56 45 52  ned(SQLITE_COVER
19c40 41 47 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  AGE_TEST)./*.** 
19c50 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61  Return true if a
19c60 6e 79 20 72 65 67 69 73 74 65 72 20 69 6e 20 74  ny register in t
19c70 68 65 20 72 61 6e 67 65 20 69 46 72 6f 6d 2e 2e  he range iFrom..
19c80 69 54 6f 20 28 69 6e 63 6c 75 73 69 76 65 29 0a  iTo (inclusive).
19c90 2a 2a 20 69 73 20 75 73 65 64 20 61 73 20 70 61  ** is used as pa
19ca0 72 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  rt of the column
19cb0 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   cache..**.** Th
19cc0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
19cd0 65 64 20 77 69 74 68 69 6e 20 61 73 73 65 72 74  ed within assert
19ce0 28 29 20 61 6e 64 20 74 65 73 74 63 61 73 65 28  () and testcase(
19cf0 29 20 6d 61 63 72 6f 73 20 6f 6e 6c 79 0a 2a 2a  ) macros only.**
19d00 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 61 70   and does not ap
19d10 70 65 61 72 20 69 6e 20 61 20 6e 6f 72 6d 61 6c  pear in a normal
19d20 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69   build..*/.stati
19d30 63 20 69 6e 74 20 75 73 65 64 41 73 43 6f 6c 75  c int usedAsColu
19d40 6d 6e 43 61 63 68 65 28 50 61 72 73 65 20 2a 70  mnCache(Parse *p
19d50 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d  Parse, int iFrom
19d60 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69 6e  , int iTo){.  in
19d70 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
19d80 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f  olCache *p;.  fo
19d90 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
19da0 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
19db0 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
19dc0 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
19dd0 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b  int r = p->iReg;
19de0 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 46 72 6f  .    if( r>=iFro
19df0 6d 20 26 26 20 72 3c 3d 69 54 6f 20 29 20 72 65  m && r<=iTo ) re
19e00 74 75 72 6e 20 31 3b 20 20 20 20 2f 2a 4e 4f 5f  turn 1;    /*NO_
19e10 54 45 53 54 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  TEST*/.  }.  ret
19e20 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
19e30 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
19e40 7c 7c 20 53 51 4c 49 54 45 5f 43 4f 56 45 52 41  || SQLITE_COVERA
19e50 47 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a  GE_TEST */.../*.
19e60 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 65 78  ** Convert an ex
19e70 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 74 6f  pression node to
19e80 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 2a   a TK_REGISTER.*
19e90 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
19ea0 70 72 54 6f 52 65 67 69 73 74 65 72 28 45 78 70  prToRegister(Exp
19eb0 72 20 2a 70 2c 20 69 6e 74 20 69 52 65 67 29 7b  r *p, int iReg){
19ec0 0a 20 20 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f  .  p->op2 = p->o
19ed0 70 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f  p;.  p->op = TK_
19ee0 52 45 47 49 53 54 45 52 3b 0a 20 20 70 2d 3e 69  REGISTER;.  p->i
19ef0 54 61 62 6c 65 20 3d 20 69 52 65 67 3b 0a 20 20  Table = iReg;.  
19f00 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74  ExprClearPropert
19f10 79 28 70 2c 20 45 50 5f 53 6b 69 70 29 3b 0a 7d  y(p, EP_Skip);.}
19f20 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  ..static void ex
19f30 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 50 61  prCodeBetween(Pa
19f40 72 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 76  rse*,Expr*,int,v
19f50 6f 69 64 28 2a 29 28 50 61 72 73 65 2a 2c 45 78  oid(*)(Parse*,Ex
19f60 70 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 69 6e 74  pr*,int,int),int
19f70 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  );../*.** Genera
19f80 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65  te code into the
19f90 20 63 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f   current Vdbe to
19fa0 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 67 69   evaluate the gi
19fb0 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
19fc0 6e 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20 73  n.  Attempt to s
19fd0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
19fe0 20 69 6e 20 72 65 67 69 73 74 65 72 20 22 74 61   in register "ta
19ff0 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e  rget"..** Return
1a000 20 74 68 65 20 72 65 67 69 73 74 65 72 20 77 68   the register wh
1a010 65 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  ere results are 
1a020 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69  stored..**.** Wi
1a030 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  th this routine,
1a040 20 74 68 65 72 65 20 69 73 20 6e 6f 20 67 75 61   there is no gua
1a050 72 61 6e 74 65 65 20 74 68 61 74 20 72 65 73 75  rantee that resu
1a060 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73  lts will.** be s
1a070 74 6f 72 65 64 20 69 6e 20 74 61 72 67 65 74 2e  tored in target.
1a080 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d 69 67    The result mig
1a090 68 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ht be stored in 
1a0a0 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65  some other.** re
1a0b0 67 69 73 74 65 72 20 69 66 20 69 74 20 69 73 20  gister if it is 
1a0c0 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f  convenient to do
1a0d0 20 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e   so.  The callin
1a0e0 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75  g function.** mu
1a0f0 73 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74  st check the ret
1a100 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76  urn code and mov
1a110 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f  e the results to
1a120 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20   the desired.** 
1a130 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74  register..*/.int
1a140 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1a150 54 61 72 67 65 74 28 50 61 72 73 65 20 2a 70 50  Target(Parse *pP
1a160 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
1a170 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
1a180 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1a190 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54  se->pVdbe;  /* T
1a1a0 68 65 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73  he VM under cons
1a1b0 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
1a1c0 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
1a1d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
1a1e0 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65  pcode being code
1a1f0 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67  d */.  int inReg
1a200 20 3d 20 74 61 72 67 65 74 3b 20 20 20 20 20 20   = target;      
1a210 20 2f 2a 20 52 65 73 75 6c 74 73 20 73 74 6f 72   /* Results stor
1a220 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ed in register i
1a230 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65  nReg */.  int re
1a240 67 46 72 65 65 31 20 3d 20 30 3b 20 20 20 20 20  gFree1 = 0;     
1a250 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
1a260 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d  ro free this tem
1a270 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
1a280 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  */.  int regFree
1a290 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  2 = 0;         /
1a2a0 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72  * If non-zero fr
1a2b0 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  ee this temporar
1a2c0 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  y register */.  
1a2d0 69 6e 74 20 72 31 2c 20 72 32 3b 20 20 20 20 20  int r1, r2;     
1a2e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 72            /* Var
1a2f0 69 6f 75 73 20 72 65 67 69 73 74 65 72 20 6e 75  ious register nu
1a300 6d 62 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74  mbers */.  sqlit
1a310 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1a320 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64 61 74 61  >db; /* The data
1a330 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1a340 2a 2f 0a 20 20 45 78 70 72 20 74 65 6d 70 58 3b  */.  Expr tempX;
1a350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a360 2a 20 54 65 6d 70 6f 72 61 72 79 20 65 78 70 72  * Temporary expr
1a370 65 73 73 69 6f 6e 20 6e 6f 64 65 20 2a 2f 0a 20  ession node */. 
1a380 20 69 6e 74 20 70 35 20 3d 20 30 3b 0a 0a 20 20   int p5 = 0;..  
1a390 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30  assert( target>0
1a3a0 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72   && target<=pPar
1a3b0 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66  se->nMem );.  if
1a3c0 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ( v==0 ){.    as
1a3d0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
1a3e0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1a3f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1a400 20 20 7d 0a 0a 20 20 69 66 28 20 70 45 78 70 72    }..  if( pExpr
1a410 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20  ==0 ){.    op = 
1a420 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65  TK_NULL;.  }else
1a430 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72  {.    op = pExpr
1a440 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74  ->op;.  }.  swit
1a450 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
1a460 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
1a470 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66  : {.      AggInf
1a480 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45  o *pAggInfo = pE
1a490 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20  xpr->pAggInfo;. 
1a4a0 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
1a4b0 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20  nfo_col *pCol = 
1a4c0 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  &pAggInfo->aCol[
1a4d0 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20  pExpr->iAgg];.  
1a4e0 20 20 20 20 69 66 28 20 21 70 41 67 67 49 6e 66      if( !pAggInf
1a4f0 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b  o->directMode ){
1a500 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1a510 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b   pCol->iMem>0 );
1a520 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d  .        inReg =
1a530 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20   pCol->iMem;.   
1a540 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a550 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67    }else if( pAgg
1a560 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67  Info->useSorting
1a570 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Idx ){.        s
1a580 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1a590 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70  (v, OP_Column, p
1a5a0 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67  AggInfo->sorting
1a5b0 49 64 78 50 54 61 62 2c 0a 20 20 20 20 20 20 20  IdxPTab,.       
1a5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5d0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
1a5e0 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72 67  rterColumn, targ
1a5f0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  et);.        bre
1a600 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1a610 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    /* Otherwise, 
1a620 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74  fall thru into t
1a630 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73  he TK_COLUMN cas
1a640 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63  e */.    }.    c
1a650 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
1a660 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61 62 20  .      int iTab 
1a670 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  = pExpr->iTable;
1a680 0a 20 20 20 20 20 20 69 66 28 20 69 54 61 62 3c  .      if( iTab<
1a690 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
1a6a0 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3e   pParse->ckBase>
1a6b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
1a6c0 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 43 48 45  * Generating CHE
1a6d0 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  CK constraints o
1a6e0 72 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f  r inserting into
1a6f0 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 2a   partial index *
1a700 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 52 65  /.          inRe
1a710 67 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  g = pExpr->iColu
1a720 6d 6e 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b 42  mn + pParse->ckB
1a730 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ase;.          b
1a740 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
1a750 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
1a760 2a 20 43 6f 64 69 6e 67 20 61 6e 20 65 78 70 72  * Coding an expr
1a770 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 70  ession that is p
1a780 61 72 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  art of an index 
1a790 77 68 65 72 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  where column nam
1a7a0 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  es.          ** 
1a7b0 69 6e 20 74 68 65 20 69 6e 64 65 78 20 72 65 66  in the index ref
1a7c0 65 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  er to the table 
1a7d0 74 6f 20 77 68 69 63 68 20 74 68 65 20 69 6e 64  to which the ind
1a7e0 65 78 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20  ex belongs */.  
1a7f0 20 20 20 20 20 20 20 20 69 54 61 62 20 3d 20 70          iTab = p
1a800 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 3b  Parse->iSelfTab;
1a810 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a820 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   }.      inReg =
1a830 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1a840 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  GetColumn(pParse
1a850 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c 0a 20  , pExpr->pTab,. 
1a860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1a880 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54  xpr->iColumn, iT
1a890 61 62 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20  ab, target,.    
1a8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8b0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1a8c0 2d 3e 6f 70 32 29 3b 0a 20 20 20 20 20 20 62 72  ->op2);.      br
1a8d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1a8e0 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20  ase TK_INTEGER: 
1a8f0 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65  {.      codeInte
1a900 67 65 72 28 70 50 61 72 73 65 2c 20 70 45 78 70  ger(pParse, pExp
1a910 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 0, target);. 
1a920 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a930 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1a940 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
1a950 4f 49 4e 54 0a 20 20 20 20 63 61 73 65 20 54 4b  OINT.    case TK
1a960 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
1a970 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1a980 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1a990 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
1a9a0 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76        codeReal(v
1a9b0 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1a9c0 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  n, 0, target);. 
1a9d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a9e0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
1a9f0 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20  e TK_STRING: {. 
1aa00 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1aa10 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1aa20 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1aa30 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) );.      sqlit
1aa40 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67  e3VdbeLoadString
1aa50 28 76 2c 20 74 61 72 67 65 74 2c 20 70 45 78 70  (v, target, pExp
1aa60 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
1aa70 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1aa80 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c  .    case TK_NUL
1aa90 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
1aaa0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1aab0 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67  OP_Null, 0, targ
1aac0 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  et);.      break
1aad0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1aae0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42  SQLITE_OMIT_BLOB
1aaf0 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73  _LITERAL.    cas
1ab00 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  e TK_BLOB: {.   
1ab10 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
1ab20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
1ab30 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62       char *zBlob
1ab40 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1ab50 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1ab60 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1ab70 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73  lue) );.      as
1ab80 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
1ab90 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c  Token[0]=='x' ||
1aba0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1abb0 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20  [0]=='X' );.    
1abc0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1abd0 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c  >u.zToken[1]=='\
1abe0 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20  '' );.      z = 
1abf0 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  &pExpr->u.zToken
1ac00 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73  [2];.      n = s
1ac10 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1ac20 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73  ) - 1;.      ass
1ac30 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20  ert( z[n]=='\'' 
1ac40 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d  );.      zBlob =
1ac50 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f   sqlite3HexToBlo
1ac60 62 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  b(sqlite3VdbeDb(
1ac70 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  v), z, n);.     
1ac80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ac90 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e  p4(v, OP_Blob, n
1aca0 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a  /2, target, 0, z
1acb0 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43  Blob, P4_DYNAMIC
1acc0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1acd0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1ace0 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
1acf0 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  E: {.      asser
1ad00 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1ad10 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
1ad20 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
1ad30 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1ad40 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20  u.zToken!=0 );. 
1ad50 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
1ad60 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21  pr->u.zToken[0]!
1ad70 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1ad80 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1ad90 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45   OP_Variable, pE
1ada0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61  xpr->iColumn, ta
1adb0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28  rget);.      if(
1adc0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1add0 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  [1]!=0 ){.      
1ade0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1adf0 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f  >u.zToken[0]=='?
1ae00 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ' .             
1ae10 7c 7c 20 73 74 72 63 6d 70 28 70 45 78 70 72 2d  || strcmp(pExpr-
1ae20 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 50 61 72 73  >u.zToken, pPars
1ae30 65 2d 3e 61 7a 56 61 72 5b 70 45 78 70 72 2d 3e  e->azVar[pExpr->
1ae40 69 43 6f 6c 75 6d 6e 2d 31 5d 29 3d 3d 30 20 29  iColumn-1])==0 )
1ae50 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1ae60 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
1ae70 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56   -1, pParse->azV
1ae80 61 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  ar[pExpr->iColum
1ae90 6e 2d 31 5d 2c 20 50 34 5f 53 54 41 54 49 43 29  n-1], P4_STATIC)
1aea0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1aeb0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1aec0 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45   case TK_REGISTE
1aed0 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67  R: {.      inReg
1aee0 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
1aef0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1af00 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1af10 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20  ITE_OMIT_CAST.  
1af20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20    case TK_CAST: 
1af30 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65  {.      /* Expre
1af40 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f  ssions of the fo
1af50 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74  rm:   CAST(pLeft
1af60 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20   AS token) */.  
1af70 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
1af80 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
1af90 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
1afa0 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b  >pLeft, target);
1afb0 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52 65 67  .      if( inReg
1afc0 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20  !=target ){.    
1afd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1afe0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
1aff0 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74  y, inReg, target
1b000 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  );.        inReg
1b010 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20   = target;.     
1b020 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1b030 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1b040 5f 43 61 73 74 2c 20 74 61 72 67 65 74 2c 0a 20  _Cast, target,. 
1b050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b060 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 66         sqlite3Af
1b070 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70 72  finityType(pExpr
1b080 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 29 3b  ->u.zToken, 0));
1b090 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1b0a0 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63   usedAsColumnCac
1b0b0 68 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67  he(pParse, inReg
1b0c0 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20 20 20 20  , inReg) );.    
1b0d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1b0e0 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
1b0f0 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20  (pParse, inReg, 
1b100 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
1b110 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
1b120 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53   SQLITE_OMIT_CAS
1b130 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  T */.    case TK
1b140 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IS:.    case TK
1b150 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 6f 70  _ISNOT:.      op
1b160 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f   = (op==TK_IS) ?
1b170 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a   TK_EQ : TK_NE;.
1b180 20 20 20 20 20 20 70 35 20 3d 20 53 51 4c 49 54        p5 = SQLIT
1b190 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20  E_NULLEQ;.      
1b1a0 2f 2a 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68 20  /* fall-through 
1b1b0 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  */.    case TK_L
1b1c0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
1b1d0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
1b1e0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
1b1f0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
1b200 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
1b210 51 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20  Q: {.      Expr 
1b220 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
1b230 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 69 66 28  pLeft;.      if(
1b240 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65   sqlite3ExprIsVe
1b250 63 74 6f 72 28 70 4c 65 66 74 29 20 29 7b 0a 20  ctor(pLeft) ){. 
1b260 20 20 20 20 20 20 20 63 6f 64 65 56 65 63 74 6f         codeVecto
1b270 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  rCompare(pParse,
1b280 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b   pExpr, target);
1b290 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1b2a0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1b2b0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1b2c0 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 72  Parse, pLeft, &r
1b2d0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1b2e0 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
1b2f0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1b300 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
1b310 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
1b320 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
1b330 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  e(pParse, pLeft,
1b340 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1b350 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
1b360 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53  r1, r2, inReg, S
1b370 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 7c 20  QLITE_STOREP2 | 
1b380 70 35 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  p5);.        ass
1b390 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74  ert(TK_LT==OP_Lt
1b3a0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1b3b0 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Lt); VdbeCove
1b3c0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1b3d0 4c 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Lt);.        ass
1b3e0 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65  ert(TK_LE==OP_Le
1b3f0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1b400 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Le); VdbeCove
1b410 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1b420 4c 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Le);.        ass
1b430 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74  ert(TK_GT==OP_Gt
1b440 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1b450 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Gt); VdbeCove
1b460 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1b470 47 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Gt);.        ass
1b480 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65  ert(TK_GE==OP_Ge
1b490 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1b4a0 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Ge); VdbeCove
1b4b0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1b4c0 47 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Ge);.        ass
1b4d0 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71  ert(TK_EQ==OP_Eq
1b4e0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1b4f0 4f 50 5f 45 71 29 3b 20 56 64 62 65 43 6f 76 65  OP_Eq); VdbeCove
1b500 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1b510 45 71 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Eq);.        ass
1b520 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65  ert(TK_NE==OP_Ne
1b530 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1b540 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Ne); VdbeCove
1b550 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1b560 4e 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  Ne);.        tes
1b570 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1b580 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  =0 );.        te
1b590 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
1b5a0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ==0 );.      }. 
1b5b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1b5c0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  }.    case TK_AN
1b5d0 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f  D:.    case TK_O
1b5e0 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50  R:.    case TK_P
1b5f0 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  LUS:.    case TK
1b600 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20  _STAR:.    case 
1b610 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61  TK_MINUS:.    ca
1b620 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63  se TK_REM:.    c
1b630 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20  ase TK_BITAND:. 
1b640 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52     case TK_BITOR
1b650 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c  :.    case TK_SL
1b660 41 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ASH:.    case TK
1b670 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73  _LSHIFT:.    cas
1b680 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20  e TK_RSHIFT: .  
1b690 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54    case TK_CONCAT
1b6a0 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
1b6b0 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64  ( TK_AND==OP_And
1b6c0 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 74   );            t
1b6d0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1b6e0 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73  AND );.      ass
1b6f0 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f  ert( TK_OR==OP_O
1b700 72 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  r );            
1b710 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1b720 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 61  TK_OR );.      a
1b730 73 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d  ssert( TK_PLUS==
1b740 4f 50 5f 41 64 64 20 29 3b 20 20 20 20 20 20 20  OP_Add );       
1b750 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1b760 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20  ==TK_PLUS );.   
1b770 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d 49     assert( TK_MI
1b780 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74  NUS==OP_Subtract
1b790 20 29 3b 20 20 20 20 20 74 65 73 74 63 61 73 65   );     testcase
1b7a0 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29  ( op==TK_MINUS )
1b7b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1b7c0 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69  TK_REM==OP_Remai
1b7d0 6e 64 65 72 20 29 3b 20 20 20 20 20 20 74 65 73  nder );      tes
1b7e0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45  tcase( op==TK_RE
1b7f0 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  M );.      asser
1b800 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50  t( TK_BITAND==OP
1b810 5f 42 69 74 41 6e 64 20 29 3b 20 20 20 20 20 20  _BitAnd );      
1b820 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1b830 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20 20 20 20  _BITAND );.     
1b840 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f   assert( TK_BITO
1b850 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 20 20  R==OP_BitOr );  
1b860 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1b870 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a  op==TK_BITOR );.
1b880 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1b890 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64  _SLASH==OP_Divid
1b8a0 65 20 29 3b 20 20 20 20 20 20 20 74 65 73 74 63  e );       testc
1b8b0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53  ase( op==TK_SLAS
1b8c0 48 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  H );.      asser
1b8d0 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50  t( TK_LSHIFT==OP
1b8e0 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 20 20 20  _ShiftLeft );   
1b8f0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1b900 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20  _LSHIFT );.     
1b910 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49   assert( TK_RSHI
1b920 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68  FT==OP_ShiftRigh
1b930 74 20 29 3b 20 20 74 65 73 74 63 61 73 65 28 20  t );  testcase( 
1b940 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b  op==TK_RSHIFT );
1b950 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1b960 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e  K_CONCAT==OP_Con
1b970 63 61 74 20 29 3b 20 20 20 20 20 20 74 65 73 74  cat );      test
1b980 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e  case( op==TK_CON
1b990 43 41 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20  CAT );.      r1 
1b9a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1b9b0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1b9c0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1b9d0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
1b9e0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1b9f0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1ba00 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
1ba10 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
1ba20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ba30 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c  3(v, op, r2, r1,
1ba40 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1ba50 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1ba60 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
1ba70 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1ba80 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
1ba90 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1baa0 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b  ase TK_UMINUS: {
1bab0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
1bac0 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
1bad0 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
1bae0 20 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20   pLeft );.      
1baf0 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  if( pLeft->op==T
1bb00 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20  K_INTEGER ){.   
1bb10 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72       codeInteger
1bb20 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
1bb30 31 2c 20 74 61 72 67 65 74 29 3b 0a 23 69 66 6e  1, target);.#ifn
1bb40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1bb50 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
1bb60 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1bb70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f  Left->op==TK_FLO
1bb80 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  AT ){.        as
1bb90 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1bba0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1bbb0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1bbc0 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76        codeReal(v
1bbd0 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65  , pLeft->u.zToke
1bbe0 6e 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 23  n, 1, target);.#
1bbf0 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73  endif.      }els
1bc00 65 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58  e{.        tempX
1bc10 2e 6f 70 20 3d 20 54 4b 5f 49 4e 54 45 47 45 52  .op = TK_INTEGER
1bc20 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e  ;.        tempX.
1bc30 66 6c 61 67 73 20 3d 20 45 50 5f 49 6e 74 56 61  flags = EP_IntVa
1bc40 6c 75 65 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  lue|EP_TokenOnly
1bc50 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e  ;.        tempX.
1bc60 75 2e 69 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20  u.iValue = 0;.  
1bc70 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1bc80 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1bc90 50 61 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26  Parse, &tempX, &
1bca0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1bcb0 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
1bcc0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1bcd0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1bce0 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
1bcf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1bd00 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75  eAddOp3(v, OP_Su
1bd10 62 74 72 61 63 74 2c 20 72 32 2c 20 72 31 2c 20  btract, r2, r1, 
1bd20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
1bd30 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1bd40 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
1bd50 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  }.      inReg = 
1bd60 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 62 72  target;.      br
1bd70 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1bd80 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20  ase TK_BITNOT:. 
1bd90 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
1bda0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1bdb0 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69  TK_BITNOT==OP_Bi
1bdc0 74 4e 6f 74 20 29 3b 20 20 20 74 65 73 74 63 61  tNot );   testca
1bdd0 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f  se( op==TK_BITNO
1bde0 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  T );.      asser
1bdf0 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f  t( TK_NOT==OP_No
1be00 74 20 29 3b 20 20 20 20 20 20 20 20 20 74 65 73  t );         tes
1be10 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f  tcase( op==TK_NO
1be20 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  T );.      r1 = 
1be30 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1be40 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1be50 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
1be60 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ee1);.      test
1be70 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1be80 30 20 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67  0 );.      inReg
1be90 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20   = target;.     
1bea0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1beb0 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69 6e  p2(v, op, r1, in
1bec0 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Reg);.      brea
1bed0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1bee0 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
1bef0 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
1bf00 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  : {.      int ad
1bf10 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  dr;.      assert
1bf20 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f  ( TK_ISNULL==OP_
1bf30 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74  IsNull );   test
1bf40 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
1bf50 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ULL );.      ass
1bf60 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d  ert( TK_NOTNULL=
1bf70 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74  =OP_NotNull ); t
1bf80 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1bf90 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  NOTNULL );.     
1bfa0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1bfb0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1bfc0 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 1, target);.  
1bfd0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1bfe0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1bff0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1c000 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
1c010 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1c020 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1c030 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
1c040 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
1c050 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56  op, r1);.      V
1c060 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1c070 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b   op==TK_ISNULL);
1c080 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
1c090 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
1c0a0 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  NOTNULL);.      
1c0b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1c0c0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1c0d0 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
1c0e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
1c0f0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
1c100 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1c110 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1c120 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a  AGG_FUNCTION: {.
1c130 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70        AggInfo *p
1c140 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41  Info = pExpr->pA
1c150 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66  ggInfo;.      if
1c160 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20  ( pInfo==0 ){.  
1c170 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1c180 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1c190 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
1c1a0 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  e) );.        sq
1c1b0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1c1c0 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66  arse, "misuse of
1c1d0 20 61 67 67 72 65 67 61 74 65 3a 20 25 73 28 29   aggregate: %s()
1c1e0 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  ", pExpr->u.zTok
1c1f0 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  en);.      }else
1c200 7b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20  {.        inReg 
1c210 3d 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70  = pInfo->aFunc[p
1c220 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d  Expr->iAgg].iMem
1c230 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c240 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1c250 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
1c260 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c  N: {.      ExprL
1c270 69 73 74 20 2a 70 46 61 72 67 3b 20 20 20 20 20  ist *pFarg;     
1c280 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e    /* List of fun
1c290 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
1c2a0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 61  */.      int nFa
1c2b0 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rg;             
1c2c0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6e  /* Number of fun
1c2d0 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
1c2e0 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66  */.      FuncDef
1c2f0 20 2a 70 44 65 66 3b 20 20 20 20 20 20 20 20 20   *pDef;         
1c300 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  /* The function 
1c310 64 65 66 69 6e 69 74 69 6f 6e 20 6f 62 6a 65 63  definition objec
1c320 74 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74  t */.      const
1c330 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20   char *zId;     
1c340 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f    /* The functio
1c350 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  n name */.      
1c360 75 33 32 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20  u32 constMask = 
1c370 30 3b 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f  0;     /* Mask o
1c380 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  f function argum
1c390 65 6e 74 73 20 74 68 61 74 20 61 72 65 20 63 6f  ents that are co
1c3a0 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20  nstant */.      
1c3b0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
1c3c0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
1c3d0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
1c3e0 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  u8 enc = ENC(db)
1c3f0 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65  ;      /* The te
1c400 78 74 20 65 6e 63 6f 64 69 6e 67 20 75 73 65 64  xt encoding used
1c410 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73   by this databas
1c420 65 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53  e */.      CollS
1c430 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20 20  eq *pColl = 0;  
1c440 20 20 2f 2a 20 41 20 63 6f 6c 6c 61 74 69 6e 67    /* A collating
1c450 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20   sequence */..  
1c460 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1c470 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1c480 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
1c490 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45  ) );.      if( E
1c4a0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1c4b0 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  Expr, EP_TokenOn
1c4c0 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ly) ){.        p
1c4d0 46 61 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  Farg = 0;.      
1c4e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
1c4f0 46 61 72 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e  Farg = pExpr->x.
1c500 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pList;.      }. 
1c510 20 20 20 20 20 6e 46 61 72 67 20 3d 20 70 46 61       nFarg = pFa
1c520 72 67 20 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70  rg ? pFarg->nExp
1c530 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 61 73 73  r : 0;.      ass
1c540 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1c550 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1c560 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
1c570 20 20 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e     zId = pExpr->
1c580 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
1c590 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69  pDef = sqlite3Fi
1c5a0 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a  ndFunction(db, z
1c5b0 49 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20  Id, nFarg, enc, 
1c5c0 30 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  0);.#ifdef SQLIT
1c5d0 45 5f 45 4e 41 42 4c 45 5f 55 4e 4b 4e 4f 57 4e  E_ENABLE_UNKNOWN
1c5e0 5f 53 51 4c 5f 46 55 4e 43 54 49 4f 4e 0a 20 20  _SQL_FUNCTION.  
1c5f0 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20      if( pDef==0 
1c600 26 26 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  && pParse->expla
1c610 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  in ){.        pD
1c620 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ef = sqlite3Find
1c630 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 75 6e  Function(db, "un
1c640 6b 6e 6f 77 6e 22 2c 20 6e 46 61 72 67 2c 20 65  known", nFarg, e
1c650 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  nc, 0);.      }.
1c660 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
1c670 20 70 44 65 66 3d 3d 30 20 7c 7c 20 70 44 65 66   pDef==0 || pDef
1c680 2d 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29  ->xFinalize!=0 )
1c690 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1c6a0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1c6b0 2c 20 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74  , "unknown funct
1c6c0 69 6f 6e 3a 20 25 73 28 29 22 2c 20 7a 49 64 29  ion: %s()", zId)
1c6d0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1c6e0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1c6f0 2f 2a 20 41 74 74 65 6d 70 74 20 61 20 64 69 72  /* Attempt a dir
1c700 65 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ect implementati
1c710 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 74 2d  on of the built-
1c720 69 6e 20 43 4f 41 4c 45 53 43 45 28 29 20 61 6e  in COALESCE() an
1c730 64 0a 20 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c  d.      ** IFNUL
1c740 4c 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  L() functions.  
1c750 54 68 69 73 20 61 76 6f 69 64 73 20 75 6e 6e 65  This avoids unne
1c760 63 65 73 73 61 72 79 20 65 76 61 6c 75 61 74 69  cessary evaluati
1c770 6f 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61  on of.      ** a
1c780 72 67 75 6d 65 6e 74 73 20 70 61 73 74 20 74 68  rguments past th
1c790 65 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c  e first non-NULL
1c7a0 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20   argument..     
1c7b0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44   */.      if( pD
1c7c0 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
1c7d0 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c  SQLITE_FUNC_COAL
1c7e0 45 53 43 45 20 29 7b 0a 20 20 20 20 20 20 20 20  ESCE ){.        
1c7f0 69 6e 74 20 65 6e 64 43 6f 61 6c 65 73 63 65 20  int endCoalesce 
1c800 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1c810 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
1c820 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67     assert( nFarg
1c830 3e 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73  >=2 );.        s
1c840 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
1c850 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b  Parse, pFarg->a[
1c860 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  0].pExpr, target
1c870 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
1c880 3d 31 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b  =1; i<nFarg; i++
1c890 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
1c8a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1c8b0 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61  , OP_NotNull, ta
1c8c0 72 67 65 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63  rget, endCoalesc
1c8d0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64  e);.          Vd
1c8e0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1c8f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1c900 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
1c910 70 50 61 72 73 65 2c 20 74 61 72 67 65 74 2c 20  pParse, target, 
1c920 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  1);.          sq
1c930 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
1c940 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
1c950 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1c960 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46  rCode(pParse, pF
1c970 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  arg->a[i].pExpr,
1c980 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1c990 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1c9a0 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
1c9b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c9c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1c9d0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e  solveLabel(v, en
1c9e0 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20  dCoalesce);.    
1c9f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1ca00 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   }..      /* The
1ca10 20 55 4e 4c 49 4b 45 4c 59 28 29 20 66 75 6e 63   UNLIKELY() func
1ca20 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
1ca30 20 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20    The result is 
1ca40 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20  the value.      
1ca50 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ** of the first 
1ca60 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20  argument..      
1ca70 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  */.      if( pDe
1ca80 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
1ca90 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b  QLITE_FUNC_UNLIK
1caa0 45 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ELY ){.        a
1cab0 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 31 20  ssert( nFarg>=1 
1cac0 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  );.        inReg
1cad0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1cae0 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
1caf0 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
1cb00 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
1cb10 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1cb20 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28 69    }..      for(i
1cb30 3d 30 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b  =0; i<nFarg; i++
1cb40 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
1cb50 3c 33 32 20 26 26 20 73 71 6c 69 74 65 33 45 78  <32 && sqlite3Ex
1cb60 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 46 61  prIsConstant(pFa
1cb70 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20  rg->a[i].pExpr) 
1cb80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  ){.          tes
1cb90 74 63 61 73 65 28 20 69 3d 3d 33 31 20 29 3b 0a  tcase( i==31 );.
1cba0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d            constM
1cbb0 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 33 32  ask |= MASKBIT32
1cbc0 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  (i);.        }. 
1cbd0 20 20 20 20 20 20 20 69 66 28 20 28 70 44 65 66         if( (pDef
1cbe0 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
1cbf0 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
1cc00 4c 4c 29 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c  LL)!=0 && !pColl
1cc10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43   ){.          pC
1cc20 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
1cc30 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
1cc40 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78   pFarg->a[i].pEx
1cc50 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  pr);.        }. 
1cc60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1cc70 20 70 46 61 72 67 20 29 7b 0a 20 20 20 20 20 20   pFarg ){.      
1cc80 20 20 69 66 28 20 63 6f 6e 73 74 4d 61 73 6b 20    if( constMask 
1cc90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 31 20  ){.          r1 
1cca0 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
1ccb0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72  ;.          pPar
1ccc0 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 46 61 72  se->nMem += nFar
1ccd0 67 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  g;.        }else
1cce0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 31 20 3d  {.          r1 =
1ccf0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
1cd00 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 46 61  ange(pParse, nFa
1cd10 72 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  rg);.        }..
1cd20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
1cd30 65 6e 67 74 68 28 29 20 61 6e 64 20 74 79 70 65  ength() and type
1cd40 6f 66 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 77  of() functions w
1cd50 69 74 68 20 61 20 63 6f 6c 75 6d 6e 20 61 72 67  ith a column arg
1cd60 75 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 2a  ument,.        *
1cd70 2a 20 73 65 74 20 74 68 65 20 50 35 20 70 61 72  * set the P5 par
1cd80 61 6d 65 74 65 72 20 74 6f 20 74 68 65 20 4f 50  ameter to the OP
1cd90 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 74  _Column opcode t
1cda0 6f 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41  o OPFLAG_LENGTHA
1cdb0 52 47 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  RG.        ** or
1cdc0 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52   OPFLAG_TYPEOFAR
1cdd0 47 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20  G respectively, 
1cde0 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73  to avoid unneces
1cdf0 73 61 72 79 20 64 61 74 61 0a 20 20 20 20 20 20  sary data.      
1ce00 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20 20    ** loading..  
1ce10 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1ce20 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63   if( (pDef->func
1ce30 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f  Flags & (SQLITE_
1ce40 46 55 4e 43 5f 4c 45 4e 47 54 48 7c 53 51 4c 49  FUNC_LENGTH|SQLI
1ce50 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 29 29  TE_FUNC_TYPEOF))
1ce60 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
1ce70 20 75 38 20 65 78 70 72 4f 70 3b 0a 20 20 20 20   u8 exprOp;.    
1ce80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46        assert( nF
1ce90 61 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  arg==1 );.      
1cea0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 61 72      assert( pFar
1ceb0 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30  g->a[0].pExpr!=0
1cec0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78   );.          ex
1ced0 70 72 4f 70 20 3d 20 70 46 61 72 67 2d 3e 61 5b  prOp = pFarg->a[
1cee0 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20  0].pExpr->op;.  
1cef0 20 20 20 20 20 20 20 20 69 66 28 20 65 78 70 72          if( expr
1cf00 4f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  Op==TK_COLUMN ||
1cf10 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f   exprOp==TK_AGG_
1cf20 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
1cf30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51        assert( SQ
1cf40 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48  LITE_FUNC_LENGTH
1cf50 3d 3d 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41  ==OPFLAG_LENGTHA
1cf60 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  RG );.          
1cf70 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
1cf80 5f 46 55 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f 50  _FUNC_TYPEOF==OP
1cf90 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20 29  FLAG_TYPEOFARG )
1cfa0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ;.            te
1cfb0 73 74 63 61 73 65 28 20 70 44 65 66 2d 3e 66 75  stcase( pDef->fu
1cfc0 6e 63 46 6c 61 67 73 20 26 20 4f 50 46 4c 41 47  ncFlags & OPFLAG
1cfd0 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20  _LENGTHARG );.  
1cfe0 20 20 20 20 20 20 20 20 20 20 70 46 61 72 67 2d            pFarg-
1cff0 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 32  >a[0].pExpr->op2
1d000 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   = .            
1d010 20 20 20 20 20 20 70 44 65 66 2d 3e 66 75 6e 63        pDef->func
1d020 46 6c 61 67 73 20 26 20 28 4f 50 46 4c 41 47 5f  Flags & (OPFLAG_
1d030 4c 45 4e 47 54 48 41 52 47 7c 4f 50 46 4c 41 47  LENGTHARG|OPFLAG
1d040 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 20  _TYPEOFARG);.   
1d050 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d060 20 7d 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69   }..        sqli
1d070 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
1d080 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a  (pParse);     /*
1d090 20 54 69 63 6b 65 74 20 32 65 61 32 34 32 35 64   Ticket 2ea2425d
1d0a0 33 34 62 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  34be */.        
1d0b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
1d0c0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
1d0d0 70 46 61 72 67 2c 20 72 31 2c 20 30 2c 0a 20 20  pFarg, r1, 0,.  
1d0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
1d100 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 7c 53 51  LITE_ECEL_DUP|SQ
1d110 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52  LITE_ECEL_FACTOR
1d120 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1d130 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
1d140 50 61 72 73 65 29 3b 20 20 20 20 20 20 2f 2a 20  Parse);      /* 
1d150 54 69 63 6b 65 74 20 32 65 61 32 34 32 35 64 33  Ticket 2ea2425d3
1d160 34 62 65 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c  4be */.      }el
1d170 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d  se{.        r1 =
1d180 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e   0;.      }.#ifn
1d190 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1d1a0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
1d1b0 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f     /* Possibly o
1d1c0 76 65 72 6c 6f 61 64 20 74 68 65 20 66 75 6e 63  verload the func
1d1d0 74 69 6f 6e 20 69 66 20 74 68 65 20 66 69 72 73  tion if the firs
1d1e0 74 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 20 20  t argument is.  
1d1f0 20 20 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c      ** a virtual
1d200 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20   table column.. 
1d210 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
1d220 20 46 6f 72 20 69 6e 66 69 78 20 66 75 6e 63 74   For infix funct
1d230 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42  ions (LIKE, GLOB
1d240 2c 20 52 45 47 45 58 50 2c 20 61 6e 64 20 4d 41  , REGEXP, and MA
1d250 54 43 48 29 20 75 73 65 20 74 68 65 0a 20 20 20  TCH) use the.   
1d260 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67     ** second arg
1d270 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66  ument, not the f
1d280 69 72 73 74 2c 20 61 73 20 74 68 65 20 61 72 67  irst, as the arg
1d290 75 6d 65 6e 74 20 74 6f 20 74 65 73 74 20 74 6f  ument to test to
1d2a0 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66  .      ** see if
1d2b0 20 69 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20   it is a column 
1d2c0 69 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  in a virtual tab
1d2d0 6c 65 2e 20 20 54 68 69 73 20 69 73 20 64 6f 6e  le.  This is don
1d2e0 65 20 62 65 63 61 75 73 65 0a 20 20 20 20 20 20  e because.      
1d2f0 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72  ** the left oper
1d300 61 6e 64 20 6f 66 20 69 6e 66 69 78 20 66 75 6e  and of infix fun
1d310 63 74 69 6f 6e 73 20 28 74 68 65 20 6f 70 65 72  ctions (the oper
1d320 61 6e 64 20 77 65 20 77 61 6e 74 20 74 6f 0a 20  and we want to. 
1d330 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20       ** control 
1d340 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64  overloading) end
1d350 73 20 75 70 20 61 73 20 74 68 65 20 73 65 63 6f  s up as the seco
1d360 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
1d370 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  he.      ** func
1d380 74 69 6f 6e 2e 20 20 54 68 65 20 65 78 70 72 65  tion.  The expre
1d390 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22  ssion "A glob B"
1d3a0 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
1d3b0 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f  o .      ** "glo
1d3c0 62 28 42 2c 41 29 2e 20 20 57 65 20 77 61 6e 74  b(B,A).  We want
1d3d0 20 74 6f 20 75 73 65 20 74 68 65 20 41 20 69 6e   to use the A in
1d3e0 20 22 41 20 67 6c 6f 62 20 42 22 20 74 6f 20 74   "A glob B" to t
1d3f0 65 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  est.      ** for
1d400 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f   function overlo
1d410 61 64 69 6e 67 2e 20 20 42 75 74 20 77 65 20 75  ading.  But we u
1d420 73 65 20 74 68 65 20 42 20 74 65 72 6d 20 69 6e  se the B term in
1d430 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20   "glob(B,A)"..  
1d440 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
1d450 20 6e 46 61 72 67 3e 3d 32 20 26 26 20 28 70 45   nFarg>=2 && (pE
1d460 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
1d470 49 6e 66 69 78 46 75 6e 63 29 20 29 7b 0a 20 20  InfixFunc) ){.  
1d480 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
1d490 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64  ite3VtabOverload
1d4a0 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65  Function(db, pDe
1d4b0 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d  f, nFarg, pFarg-
1d4c0 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[1].pExpr);.  
1d4d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46      }else if( nF
1d4e0 61 72 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  arg>0 ){.       
1d4f0 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56   pDef = sqlite3V
1d500 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74  tabOverloadFunct
1d510 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46  ion(db, pDef, nF
1d520 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d  arg, pFarg->a[0]
1d530 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  .pExpr);.      }
1d540 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
1d550 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67  ( pDef->funcFlag
1d560 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
1d570 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20  NEEDCOLL ){.    
1d580 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
1d590 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
1d5a0 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20  ltColl; .       
1d5b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d5c0 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71  p4(v, OP_CollSeq
1d5d0 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72  , 0, 0, 0, (char
1d5e0 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c   *)pColl, P4_COL
1d5f0 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LSEQ);.      }. 
1d600 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1d610 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e  AddOp4(v, OP_Fun
1d620 63 74 69 6f 6e 30 2c 20 63 6f 6e 73 74 4d 61 73  ction0, constMas
1d630 6b 2c 20 72 31 2c 20 74 61 72 67 65 74 2c 0a 20  k, r1, target,. 
1d640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d650 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 44         (char*)pD
1d660 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  ef, P4_FUNCDEF);
1d670 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1d680 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75  beChangeP5(v, (u
1d690 38 29 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20  8)nFarg);.      
1d6a0 69 66 28 20 6e 46 61 72 67 20 26 26 20 63 6f 6e  if( nFarg && con
1d6b0 73 74 4d 61 73 6b 3d 3d 30 20 29 7b 0a 20 20 20  stMask==0 ){.   
1d6c0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
1d6d0 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
1d6e0 72 73 65 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b  rse, r1, nFarg);
1d6f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
1d700 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
1d710 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1d720 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
1d730 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20  e TK_EXISTS:.   
1d740 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
1d750 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f   {.      int nCo
1d760 6c 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  l;.      testcas
1d770 65 28 20 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  e( op==TK_EXISTS
1d780 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1d790 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  se( op==TK_SELEC
1d7a0 54 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  T );.      if( o
1d7b0 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20  p==TK_SELECT && 
1d7c0 28 6e 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 78  (nCol = pExpr->x
1d7d0 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
1d7e0 2d 3e 6e 45 78 70 72 29 21 3d 31 20 29 7b 0a 20  ->nExpr)!=1 ){. 
1d7f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 75         sqlite3Su
1d800 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61  bselectError(pPa
1d810 72 73 65 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20  rse, nCol, 1);. 
1d820 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1d830 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
1d840 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
1d850 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1d860 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
1d870 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1d880 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
1d890 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65  : {.      int de
1d8a0 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69  stIfFalse = sqli
1d8b0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1d8c0 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64  (v);.      int d
1d8d0 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69  estIfNull = sqli
1d8e0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1d8f0 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
1d900 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1d910 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67  OP_Null, 0, targ
1d920 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
1d930 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61  e3ExprCodeIN(pPa
1d940 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
1d950 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e  IfFalse, destIfN
1d960 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
1d970 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1d980 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
1d990 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73  target);.      s
1d9a0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1d9b0 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66  eLabel(v, destIf
1d9c0 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 73 71  False);.      sq
1d9d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1d9e0 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61  v, OP_AddImm, ta
1d9f0 72 67 65 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  rget, 0);.      
1da00 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1da10 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49  veLabel(v, destI
1da20 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
1da30 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
1da40 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1da50 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 20  _SUBQUERY */... 
1da60 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20     /*.    **    
1da70 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20  x BETWEEN y AND 
1da80 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  z.    **.    ** 
1da90 54 68 69 73 20 69 73 20 65 71 75 69 76 61 6c 65  This is equivale
1daa0 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20  nt to.    **.   
1dab0 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20   **    x>=y AND 
1dac0 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  x<=z.    **.    
1dad0 2a 2a 20 58 20 69 73 20 73 74 6f 72 65 64 20 69  ** X is stored i
1dae0 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a  n pExpr->pLeft..
1daf0 20 20 20 20 2a 2a 20 59 20 69 73 20 73 74 6f 72      ** Y is stor
1db00 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69  ed in pExpr->pLi
1db10 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a  st->a[0].pExpr..
1db20 20 20 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72      ** Z is stor
1db30 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69  ed in pExpr->pLi
1db40 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a  st->a[1].pExpr..
1db50 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1db60 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20  TK_BETWEEN: {.  
1db70 20 20 20 20 65 78 70 72 43 6f 64 65 42 65 74 77      exprCodeBetw
1db80 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70  een(pParse, pExp
1db90 72 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 30 29  r, target, 0, 0)
1dba0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1dbb0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1dbc0 5f 53 50 41 4e 3a 0a 20 20 20 20 63 61 73 65 20  _SPAN:.    case 
1dbd0 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20 0a 20 20 20  TK_COLLATE: .   
1dbe0 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20   case TK_UPLUS: 
1dbf0 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  {.      inReg = 
1dc00 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1dc10 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
1dc20 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67  xpr->pLeft, targ
1dc30 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  et);.      break
1dc40 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
1dc50 65 20 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b 0a  e TK_TRIGGER: {.
1dc60 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1dc70 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f 54 52 49  opcode is TK_TRI
1dc80 47 47 45 52 2c 20 74 68 65 6e 20 74 68 65 20 65  GGER, then the e
1dc90 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 72  xpression is a r
1dca0 65 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a  eference.      *
1dcb0 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  * to a column in
1dcc0 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c   the new.* or ol
1dcd0 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  d.* pseudo-table
1dce0 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a 20  s available to. 
1dcf0 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20       ** trigger 
1dd00 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68 69  programs. In thi
1dd10 73 20 63 61 73 65 20 45 78 70 72 2e 69 54 61 62  s case Expr.iTab
1dd20 6c 65 20 69 73 20 73 65 74 20 74 6f 20 31 20 66  le is set to 1 f
1dd30 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  or the.      ** 
1dd40 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  new.* pseudo-tab
1dd50 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20 74 68 65  le, or 0 for the
1dd60 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61   old.* pseudo-ta
1dd70 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75 6d  ble. Expr.iColum
1dd80 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65  n.      ** is se
1dd90 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t to the column 
1dda0 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d 74 61  of the pseudo-ta
1ddb0 62 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f 72 20  ble to read, or 
1ddc0 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20 20 2a  to -1 to.      *
1ddd0 2a 20 72 65 61 64 20 74 68 65 20 72 6f 77 69 64  * read the rowid
1dde0 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2a   field..      **
1ddf0 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65 78  .      ** The ex
1de00 70 72 65 73 73 69 6f 6e 20 69 73 20 69 6d 70 6c  pression is impl
1de10 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 61 6e  emented using an
1de20 20 4f 50 5f 50 61 72 61 6d 20 6f 70 63 6f 64 65   OP_Param opcode
1de30 2e 20 54 68 65 20 70 31 0a 20 20 20 20 20 20 2a  . The p1.      *
1de40 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 73  * parameter is s
1de50 65 74 20 74 6f 20 30 20 66 6f 72 20 61 6e 20 6f  et to 0 for an o
1de60 6c 64 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e  ld.rowid referen
1de70 63 65 2c 20 6f 72 20 74 6f 20 28 69 2b 31 29 0a  ce, or to (i+1).
1de80 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 66 65        ** to refe
1de90 72 65 6e 63 65 20 61 6e 6f 74 68 65 72 20 63 6f  rence another co
1dea0 6c 75 6d 6e 20 6f 66 20 74 68 65 20 6f 6c 64 2e  lumn of the old.
1deb0 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20  * pseudo-table, 
1dec0 77 68 65 72 65 20 0a 20 20 20 20 20 20 2a 2a 20  where .      ** 
1ded0 69 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  i is the index o
1dee0 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 46 6f  f the column. Fo
1def0 72 20 61 20 6e 65 77 2e 72 6f 77 69 64 20 72 65  r a new.rowid re
1df00 66 65 72 65 6e 63 65 2c 20 70 31 20 69 73 0a 20  ference, p1 is. 
1df10 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 28       ** set to (
1df20 6e 2b 31 29 2c 20 77 68 65 72 65 20 6e 20 69 73  n+1), where n is
1df30 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
1df40 6f 6c 75 6d 6e 73 20 69 6e 20 65 61 63 68 20 70  olumns in each p
1df50 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 20 20 20  seudo-table..   
1df60 20 20 20 2a 2a 20 46 6f 72 20 61 20 72 65 66 65     ** For a refe
1df70 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 6f 74 68  rence to any oth
1df80 65 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  er column in the
1df90 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61   new.* pseudo-ta
1dfa0 62 6c 65 2c 20 70 31 0a 20 20 20 20 20 20 2a 2a  ble, p1.      **
1dfb0 20 69 73 20 73 65 74 20 74 6f 20 28 6e 2b 32 2b   is set to (n+2+
1dfc0 69 29 2c 20 77 68 65 72 65 20 6e 20 61 6e 64 20  i), where n and 
1dfd0 69 20 61 72 65 20 61 73 20 64 65 66 69 6e 65 64  i are as defined
1dfe0 20 70 72 65 76 69 6f 75 73 6c 79 2e 20 46 6f 72   previously. For
1dff0 0a 20 20 20 20 20 20 2a 2a 20 65 78 61 6d 70 6c  .      ** exampl
1e000 65 2c 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  e, if the table 
1e010 6f 6e 20 77 68 69 63 68 20 74 72 69 67 67 65 72  on which trigger
1e020 73 20 61 72 65 20 62 65 69 6e 67 20 66 69 72 65  s are being fire
1e030 64 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65  d is.      ** de
1e040 63 6c 61 72 65 64 20 61 73 3a 0a 20 20 20 20 20  clared as:.     
1e050 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 43   **.      **   C
1e060 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
1e070 2c 20 62 29 3b 0a 20 20 20 20 20 20 2a 2a 0a 20  , b);.      **. 
1e080 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 70 31 20       ** Then p1 
1e090 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
1e0a0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20  s follows:.     
1e0b0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 70   **.      **   p
1e0c0 31 3d 3d 30 20 20 20 2d 3e 20 20 20 20 6f 6c 64  1==0   ->    old
1e0d0 2e 72 6f 77 69 64 20 20 20 20 20 70 31 3d 3d 33  .rowid     p1==3
1e0e0 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 72 6f 77     ->    new.row
1e0f0 69 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31  id.      **   p1
1e100 3d 3d 31 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e  ==1   ->    old.
1e110 61 20 20 20 20 20 20 20 20 20 70 31 3d 3d 34 20  a         p1==4 
1e120 20 20 2d 3e 20 20 20 20 6e 65 77 2e 61 0a 20 20    ->    new.a.  
1e130 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 32 20 20      **   p1==2  
1e140 20 2d 3e 20 20 20 20 6f 6c 64 2e 62 20 20 20 20   ->    old.b    
1e150 20 20 20 20 20 70 31 3d 3d 35 20 20 20 2d 3e 20       p1==5   -> 
1e160 20 20 20 6e 65 77 2e 62 20 20 20 20 20 20 20 0a     new.b       .
1e170 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54        */.      T
1e180 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 45 78  able *pTab = pEx
1e190 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  pr->pTab;.      
1e1a0 69 6e 74 20 70 31 20 3d 20 70 45 78 70 72 2d 3e  int p1 = pExpr->
1e1b0 69 54 61 62 6c 65 20 2a 20 28 70 54 61 62 2d 3e  iTable * (pTab->
1e1c0 6e 43 6f 6c 2b 31 29 20 2b 20 31 20 2b 20 70 45  nCol+1) + 1 + pE
1e1d0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a 20  xpr->iColumn;.. 
1e1e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
1e1f0 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c 7c  pr->iTable==0 ||
1e200 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
1e210 31 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  1 );.      asser
1e220 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  t( pExpr->iColum
1e230 6e 3e 3d 2d 31 20 26 26 20 70 45 78 70 72 2d 3e  n>=-1 && pExpr->
1e240 69 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43  iColumn<pTab->nC
1e250 6f 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ol );.      asse
1e260 72 74 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c  rt( pTab->iPKey<
1e270 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  0 || pExpr->iCol
1e280 75 6d 6e 21 3d 70 54 61 62 2d 3e 69 50 4b 65 79  umn!=pTab->iPKey
1e290 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1e2a0 28 20 70 31 3e 3d 30 20 26 26 20 70 31 3c 28 70  ( p1>=0 && p1<(p
1e2b0 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b 32 29 20 29  Tab->nCol*2+2) )
1e2c0 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
1e2d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1e2e0 5f 50 61 72 61 6d 2c 20 70 31 2c 20 74 61 72 67  _Param, p1, targ
1e2f0 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  et);.      VdbeC
1e300 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 2e 25  omment((v, "%s.%
1e310 73 20 2d 3e 20 24 25 64 22 2c 0a 20 20 20 20 20  s -> $%d",.     
1e320 20 20 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c     (pExpr->iTabl
1e330 65 20 3f 20 22 6e 65 77 22 20 3a 20 22 6f 6c 64  e ? "new" : "old
1e340 22 29 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78  "),.        (pEx
1e350 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20  pr->iColumn<0 ? 
1e360 22 72 6f 77 69 64 22 20 3a 20 70 45 78 70 72 2d  "rowid" : pExpr-
1e370 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70  >pTab->aCol[pExp
1e380 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d  r->iColumn].zNam
1e390 65 29 2c 0a 20 20 20 20 20 20 20 20 74 61 72 67  e),.        targ
1e3a0 65 74 0a 20 20 20 20 20 20 29 29 3b 0a 0a 23 69  et.      ));..#i
1e3b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1e3c0 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
1e3d0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
1e3e0 20 63 6f 6c 75 6d 6e 20 68 61 73 20 52 45 41 4c   column has REAL
1e3f0 20 61 66 66 69 6e 69 74 79 2c 20 69 74 20 6d 61   affinity, it ma
1e400 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65 20 73  y currently be s
1e410 74 6f 72 65 64 20 61 73 20 61 6e 0a 20 20 20 20  tored as an.    
1e420 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 55 73    ** integer. Us
1e430 65 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74  e OP_RealAffinit
1e440 79 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 69  y to make sure i
1e450 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65 61 6c  t is really real
1e460 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1e470 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   ** EVIDENCE-OF:
1e480 20 52 2d 36 30 39 38 35 2d 35 37 36 36 32 20 53   R-60985-57662 S
1e490 51 4c 69 74 65 20 77 69 6c 6c 20 63 6f 6e 76 65  QLite will conve
1e4a0 72 74 20 74 68 65 20 76 61 6c 75 65 20 62 61 63  rt the value bac
1e4b0 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 66 6c  k to.      ** fl
1e4c0 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 77 68 65  oating point whe
1e4d0 6e 20 65 78 74 72 61 63 74 69 6e 67 20 69 74 20  n extracting it 
1e4e0 66 72 6f 6d 20 74 68 65 20 72 65 63 6f 72 64 2e  from the record.
1e4f0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
1e500 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30  Expr->iColumn>=0
1e510 20 0a 20 20 20 20 20 20 20 26 26 20 70 54 61 62   .       && pTab
1e520 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43  ->aCol[pExpr->iC
1e530 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3d  olumn].affinity=
1e540 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
1e550 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
1e560 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e570 4f 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66  Op1(v, OP_RealAf
1e580 66 69 6e 69 74 79 2c 20 74 61 72 67 65 74 29 3b  finity, target);
1e590 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1e5a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e5b0 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   }..    case TK_
1e5c0 56 45 43 54 4f 52 3a 20 7b 0a 20 20 20 20 20 20  VECTOR: {.      
1e5d0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1e5e0 70 50 61 72 73 65 2c 20 22 69 6e 76 61 6c 69 64  pParse, "invalid
1e5f0 20 75 73 65 20 6f 66 20 72 6f 77 20 76 61 6c 75   use of row valu
1e600 65 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e");.      break
1e610 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
1e620 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a 20      ** Form A:. 
1e630 20 20 20 2a 2a 20 20 20 43 41 53 45 20 78 20 57     **   CASE x W
1e640 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57  HEN e1 THEN r1 W
1e650 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e  HEN e2 THEN r2 .
1e660 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20  .. WHEN eN THEN 
1e670 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20  rN ELSE y END.  
1e680 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d    **.    ** Form
1e690 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53   B:.    **   CAS
1e6a0 45 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72  E WHEN e1 THEN r
1e6b0 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72  1 WHEN e2 THEN r
1e6c0 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48  2 ... WHEN eN TH
1e6d0 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44  EN rN ELSE y END
1e6e0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
1e6f0 6f 72 6d 20 41 20 69 73 20 63 61 6e 20 62 65 20  orm A is can be 
1e700 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  transformed into
1e710 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
1e720 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c 6f 77  form B as follow
1e730 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45  s:.    **   CASE
1e740 20 57 48 45 4e 20 78 3d 65 31 20 54 48 45 4e 20   WHEN x=e1 THEN 
1e750 72 31 20 57 48 45 4e 20 78 3d 65 32 20 54 48 45  r1 WHEN x=e2 THE
1e760 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20  N r2 ....    ** 
1e770 20 20 20 20 20 20 20 57 48 45 4e 20 78 3d 65 4e         WHEN x=eN
1e780 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20   THEN rN ELSE y 
1e790 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  END.    **.    *
1e7a0 2a 20 58 20 28 69 66 20 69 74 20 65 78 69 73 74  * X (if it exist
1e7b0 73 29 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e  s) is in pExpr->
1e7c0 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20  pLeft..    ** Y 
1e7d0 69 73 20 69 6e 20 74 68 65 20 6c 61 73 74 20 65  is in the last e
1e7e0 6c 65 6d 65 6e 74 20 6f 66 20 70 45 78 70 72 2d  lement of pExpr-
1e7f0 3e 78 2e 70 4c 69 73 74 20 69 66 20 70 45 78 70  >x.pList if pExp
1e800 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
1e810 72 20 69 73 0a 20 20 20 20 2a 2a 20 6f 64 64 2e  r is.    ** odd.
1e820 20 20 54 68 65 20 59 20 69 73 20 61 6c 73 6f 20    The Y is also 
1e830 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74 68  optional.  If th
1e840 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
1e850 65 6e 74 73 20 69 6e 20 78 2e 70 4c 69 73 74 0a  ents in x.pList.
1e860 20 20 20 20 2a 2a 20 69 73 20 65 76 65 6e 2c 20      ** is even, 
1e870 74 68 65 6e 20 59 20 69 73 20 6f 6d 69 74 74 65  then Y is omitte
1e880 64 20 61 6e 64 20 74 68 65 20 22 6f 74 68 65 72  d and the "other
1e890 77 69 73 65 22 20 72 65 73 75 6c 74 20 69 73 20  wise" result is 
1e8a0 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69 20  NULL..    ** Ei 
1e8b0 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69  is in pExpr->pLi
1e8c0 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20 52  st->a[i*2] and R
1e8d0 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c 69 73  i is pExpr->pLis
1e8e0 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20  t->a[i*2+1]..   
1e8f0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
1e900 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65 78 70  esult of the exp
1e910 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20 52  ression is the R
1e920 69 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  i for the first 
1e930 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20 20 20  matching Ei,.   
1e940 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72 65 20   ** or if there 
1e950 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 45  is no matching E
1e960 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65 72 6d  i, the ELSE term
1e970 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20   Y, or if there 
1e980 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c 53  is.    ** no ELS
1e990 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20  E term, NULL..  
1e9a0 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74    */.    default
1e9b0 3a 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b  : assert( op==TK
1e9c0 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20 20 20 20  _CASE ); {.     
1e9d0 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20 20   int endLabel;  
1e9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9f0 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c     /* GOTO label
1ea00 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41 53 45   for end of CASE
1ea10 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69   stmt */.      i
1ea20 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20 20 20  nt nextCase;    
1ea30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea40 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66   /* GOTO label f
1ea50 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63 6c 61  or next WHEN cla
1ea60 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  use */.      int
1ea70 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20 20   nExpr;         
1ea80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ea90 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66 20 57  * 2x number of W
1eaa0 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  HEN terms */.   
1eab0 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
1eac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ead0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1eae0 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 45 78  nter */.      Ex
1eaf0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20  prList *pEList; 
1eb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb10 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45 4e 20  /* List of WHEN 
1eb20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 73  terms */.      s
1eb30 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
1eb40 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 20  tem *aListelem; 
1eb50 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57 48 45   /* Array of WHE
1eb60 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  N terms */.     
1eb70 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72 65 3b   Expr opCompare;
1eb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb90 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69 20     /* The X==Ei 
1eba0 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
1ebb0 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20      Expr *pX;   
1ebc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebd0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 20 65        /* The X e
1ebe0 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
1ebf0 20 20 20 45 78 70 72 20 2a 70 54 65 73 74 20 3d     Expr *pTest =
1ec00 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1ec10 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66       /* X==Ei (f
1ec20 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73 74 20 45  orm A) or just E
1ec30 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 20 20  i (form B) */.  
1ec40 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e      VVA_ONLY( in
1ec50 74 20 69 43 61 63 68 65 4c 65 76 65 6c 20 3d 20  t iCacheLevel = 
1ec60 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1ec70 76 65 6c 3b 20 29 0a 0a 20 20 20 20 20 20 61 73  vel; )..      as
1ec80 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1ec90 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1eca0 5f 78 49 73 53 65 6c 65 63 74 29 20 26 26 20 70  _xIsSelect) && p
1ecb0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b  Expr->x.pList );
1ecc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45  .      assert(pE
1ecd0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
1ece0 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20  xpr > 0);.      
1ecf0 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  pEList = pExpr->
1ed00 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61  x.pList;.      a
1ed10 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73  Listelem = pELis
1ed20 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78 70  t->a;.      nExp
1ed30 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  r = pEList->nExp
1ed40 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61 62 65  r;.      endLabe
1ed50 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
1ed60 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
1ed70 20 20 20 69 66 28 20 28 70 58 20 3d 20 70 45 78     if( (pX = pEx
1ed80 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b  pr->pLeft)!=0 ){
1ed90 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 20 3d  .        tempX =
1eda0 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 74 65   *pX;.        te
1edb0 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d  stcase( pX->op==
1edc0 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
1edd0 20 20 20 20 20 65 78 70 72 54 6f 52 65 67 69 73       exprToRegis
1ede0 74 65 72 28 26 74 65 6d 70 58 2c 20 73 71 6c 69  ter(&tempX, sqli
1edf0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1ee00 70 50 61 72 73 65 2c 20 70 58 2c 20 26 72 65 67  pParse, pX, &reg
1ee10 46 72 65 65 31 29 29 3b 0a 20 20 20 20 20 20 20  Free1));.       
1ee20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1ee30 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1ee40 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d    opCompare.op =
1ee50 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20 20   TK_EQ;.        
1ee60 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20  opCompare.pLeft 
1ee70 3d 20 26 74 65 6d 70 58 3b 0a 20 20 20 20 20 20  = &tempX;.      
1ee80 20 20 70 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d    pTest = &opCom
1ee90 70 61 72 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a  pare;.        /*
1eea0 20 54 69 63 6b 65 74 20 62 33 35 31 64 39 35 66   Ticket b351d95f
1eeb0 39 63 64 35 65 66 31 37 65 39 64 39 64 62 61 65  9cd5ef17e9d9dbae
1eec0 31 38 66 35 63 61 38 36 31 31 31 39 30 30 30 31  18f5ca8611190001
1eed0 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65  :.        ** The
1eee0 20 76 61 6c 75 65 20 69 6e 20 72 65 67 46 72 65   value in regFre
1eef0 65 31 20 6d 69 67 68 74 20 67 65 74 20 53 43 6f  e1 might get SCo
1ef00 70 79 2d 65 64 20 69 6e 74 6f 20 74 68 65 20 66  py-ed into the f
1ef10 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20 20 20 20  ile result..    
1ef20 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b 65 20 73      ** So make s
1ef30 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65 67  ure that the reg
1ef40 46 72 65 65 31 20 72 65 67 69 73 74 65 72 20 69  Free1 register i
1ef50 73 20 6e 6f 74 20 72 65 75 73 65 64 20 66 6f 72  s not reused for
1ef60 20 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20 2a   other.        *
1ef70 2a 20 70 75 72 70 6f 73 65 73 20 61 6e 64 20 70  * purposes and p
1ef80 6f 73 73 69 62 6c 79 20 6f 76 65 72 77 72 69 74  ossibly overwrit
1ef90 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ten.  */.       
1efa0 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20   regFree1 = 0;. 
1efb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
1efc0 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 2d 31 3b  (i=0; i<nExpr-1;
1efd0 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20   i=i+2){.       
1efe0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1eff0 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
1f000 20 20 20 20 20 20 20 69 66 28 20 70 58 20 29 7b         if( pX ){
1f010 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1f020 74 28 20 70 54 65 73 74 21 3d 30 20 29 3b 0a 20  t( pTest!=0 );. 
1f030 20 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61           opCompa
1f040 72 65 2e 70 52 69 67 68 74 20 3d 20 61 4c 69 73  re.pRight = aLis
1f050 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a  telem[i].pExpr;.
1f060 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1f070 20 20 20 20 20 20 20 20 20 70 54 65 73 74 20 3d           pTest =
1f080 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45   aListelem[i].pE
1f090 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  xpr;.        }. 
1f0a0 20 20 20 20 20 20 20 6e 65 78 74 43 61 73 65 20         nextCase 
1f0b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1f0c0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
1f0d0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
1f0e0 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  st->op==TK_COLUM
1f0f0 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  N );.        sql
1f100 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
1f110 70 50 61 72 73 65 2c 20 70 54 65 73 74 2c 20 6e  pParse, pTest, n
1f120 65 78 74 43 61 73 65 2c 20 53 51 4c 49 54 45 5f  extCase, SQLITE_
1f130 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
1f140 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1f150 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45  Listelem[i+1].pE
1f160 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
1f170 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  MN );.        sq
1f180 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1f190 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b  arse, aListelem[
1f1a0 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  i+1].pExpr, targ
1f1b0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  et);.        sql
1f1c0 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1f1d0 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20  endLabel);.     
1f1e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1f1f0 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
1f200 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1f210 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1f220 76 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a 20 20  v, nextCase);.  
1f230 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1f240 28 6e 45 78 70 72 26 31 29 21 3d 30 20 29 7b 0a  (nExpr&1)!=0 ){.
1f250 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1f260 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
1f270 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
1f280 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1f290 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  arse, pEList->a[
1f2a0 6e 45 78 70 72 2d 31 5d 2e 70 45 78 70 72 2c 20  nExpr-1].pExpr, 
1f2b0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
1f2c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1f2d0 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  ePop(pParse);.  
1f2e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f2f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f300 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
1f310 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
1f320 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
1f330 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
1f340 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  led || pParse->n
1f350 45 72 72 3e 30 20 0a 20 20 20 20 20 20 20 20 20  Err>0 .         
1f360 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 69 43 61    || pParse->iCa
1f370 63 68 65 4c 65 76 65 6c 3d 3d 69 43 61 63 68 65  cheLevel==iCache
1f380 4c 65 76 65 6c 20 29 3b 0a 20 20 20 20 20 20 73  Level );.      s
1f390 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1f3a0 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62  eLabel(v, endLab
1f3b0 65 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  el);.      break
1f3c0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1f3d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
1f3e0 47 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GER.    case TK_
1f3f0 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 61  RAISE: {.      a
1f400 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 61 66  ssert( pExpr->af
1f410 66 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62  finity==OE_Rollb
1f420 61 63 6b 20 0a 20 20 20 20 20 20 20 20 20 20 20  ack .           
1f430 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  || pExpr->affini
1f440 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20 20 20  ty==OE_Abort.   
1f450 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72          || pExpr
1f460 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 46  ->affinity==OE_F
1f470 61 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ail.           |
1f480 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  | pExpr->affinit
1f490 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20 20 20  y==OE_Ignore.   
1f4a0 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20     );.      if( 
1f4b0 21 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65  !pParse->pTrigge
1f4c0 72 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  rTab ){.        
1f4d0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1f4e0 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
1f4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1f500 52 41 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79  RAISE() may only
1f510 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20   be used within 
1f520 61 20 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61  a trigger-progra
1f530 6d 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  m");.        ret
1f540 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
1f550 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
1f560 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f  affinity==OE_Abo
1f570 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rt ){.        sq
1f580 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50  lite3MayAbort(pP
1f590 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  arse);.      }. 
1f5a0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1f5b0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1f5c0 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1f5d0 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
1f5e0 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
1f5f0 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20  OE_Ignore ){.   
1f600 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1f610 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20  AddOp4(.        
1f620 20 20 20 20 76 2c 20 4f 50 5f 48 61 6c 74 2c 20      v, OP_Halt, 
1f630 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67  SQLITE_OK, OE_Ig
1f640 6e 6f 72 65 2c 20 30 2c 20 70 45 78 70 72 2d 3e  nore, 0, pExpr->
1f650 75 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20  u.zToken,0);.   
1f660 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1f670 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  e(v);.      }els
1f680 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
1f690 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74  e3HaltConstraint
1f6a0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
1f6b0 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47  CONSTRAINT_TRIGG
1f6c0 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ER,.            
1f6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6e0 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74    pExpr->affinit
1f6f0 79 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  y, pExpr->u.zTok
1f700 65 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  en, 0, 0);.     
1f710 20 7d 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   }..      break;
1f720 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1f730 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
1f740 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1f750 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73  , regFree1);.  s
1f760 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1f770 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
1f780 46 72 65 65 32 29 3b 0a 20 20 72 65 74 75 72 6e  Free2);.  return
1f790 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   inReg;.}../*.**
1f7a0 20 46 61 63 74 6f 72 20 6f 75 74 20 74 68 65 20   Factor out the 
1f7b0 63 6f 64 65 20 6f 66 20 74 68 65 20 67 69 76 65  code of the give
1f7c0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  n expression to 
1f7d0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74  initialization t
1f7e0 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ime..*/.void sql
1f7f0 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e  ite3ExprCodeAtIn
1f800 69 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  it(.  Parse *pPa
1f810 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
1f820 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1f830 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
1f840 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
1f850 69 6f 6e 20 74 6f 20 63 6f 64 65 20 77 68 65 6e  ion to code when
1f860 20 74 68 65 20 56 44 42 45 20 69 6e 69 74 69 61   the VDBE initia
1f870 6c 69 7a 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  lizes */.  int r
1f880 65 67 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20  egDest,      /* 
1f890 53 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20  Store the value 
1f8a0 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72  in this register
1f8b0 20 2a 2f 0a 20 20 75 38 20 72 65 75 73 61 62 6c   */.  u8 reusabl
1f8c0 65 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  e       /* True 
1f8d0 69 66 20 74 68 69 73 20 65 78 70 72 65 73 73 69  if this expressi
1f8e0 6f 6e 20 69 73 20 72 65 75 73 61 62 6c 65 20 2a  on is reusable *
1f8f0 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  /.){.  ExprList 
1f900 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 43 6f  *p;.  assert( Co
1f910 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72  nstFactorOk(pPar
1f920 73 65 29 20 29 3b 0a 20 20 70 20 3d 20 70 50 61  se) );.  p = pPa
1f930 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b  rse->pConstExpr;
1f940 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74  .  pExpr = sqlit
1f950 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65  e3ExprDup(pParse
1f960 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b  ->db, pExpr, 0);
1f970 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78  .  p = sqlite3Ex
1f980 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
1f990 72 73 65 2c 20 70 2c 20 70 45 78 70 72 29 3b 0a  rse, p, pExpr);.
1f9a0 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
1f9b0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
1f9c0 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
1f9d0 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 3b  ->a[p->nExpr-1];
1f9e0 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 69  .     pItem->u.i
1f9f0 43 6f 6e 73 74 45 78 70 72 52 65 67 20 3d 20 72  ConstExprReg = r
1fa00 65 67 44 65 73 74 3b 0a 20 20 20 20 20 70 49 74  egDest;.     pIt
1fa10 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20 3d 20 72  em->reusable = r
1fa20 65 75 73 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 70  eusable;.  }.  p
1fa30 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
1fa40 72 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r = p;.}../*.** 
1fa50 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1fa60 20 65 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70   evaluate an exp
1fa70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72  ression and stor
1fa80 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a  e the results.**
1fa90 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72   into a register
1faa0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  .  Return the re
1fab0 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68  gister number wh
1fac0 65 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ere the results.
1fad0 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a  ** are stored..*
1fae0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 67 69  *.** If the regi
1faf0 73 74 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72  ster is a tempor
1fb00 61 72 79 20 72 65 67 69 73 74 65 72 20 74 68 61  ary register tha
1fb10 74 20 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63  t can be dealloc
1fb20 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72  ated,.** then wr
1fb30 69 74 65 20 69 74 73 20 6e 75 6d 62 65 72 20 69  ite its number i
1fb40 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49 66 20 74  nto *pReg.  If t
1fb50 68 65 20 72 65 73 75 6c 74 20 72 65 67 69 73 74  he result regist
1fb60 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74  er is not.** a t
1fb70 65 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e 20 73  emporary, then s
1fb80 65 74 20 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f  et *pReg to zero
1fb90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
1fba0 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 2c 20   is a constant, 
1fbb0 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
1fbc0 65 20 6d 69 67 68 74 20 67 65 6e 65 72 61 74 65  e might generate
1fbd0 20 74 68 69 73 0a 2a 2a 20 63 6f 64 65 20 74 6f   this.** code to
1fbe0 20 66 69 6c 6c 20 74 68 65 20 72 65 67 69 73 74   fill the regist
1fbf0 65 72 20 69 6e 20 74 68 65 20 69 6e 69 74 69 61  er in the initia
1fc00 6c 69 7a 61 74 69 6f 6e 20 73 65 63 74 69 6f 6e  lization section
1fc10 20 6f 66 20 74 68 65 0a 2a 2a 20 56 44 42 45 20   of the.** VDBE 
1fc20 70 72 6f 67 72 61 6d 2c 20 69 6e 20 6f 72 64 65  program, in orde
1fc30 72 20 74 6f 20 66 61 63 74 6f 72 20 69 74 20 6f  r to factor it o
1fc40 75 74 20 6f 66 20 74 68 65 20 65 76 61 6c 75 61  ut of the evalua
1fc50 74 69 6f 6e 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e  tion loop..*/.in
1fc60 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
1fc70 65 54 65 6d 70 28 50 61 72 73 65 20 2a 70 50 61  eTemp(Parse *pPa
1fc80 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
1fc90 2c 20 69 6e 74 20 2a 70 52 65 67 29 7b 0a 20 20  , int *pReg){.  
1fca0 69 6e 74 20 72 32 3b 0a 20 20 70 45 78 70 72 20  int r2;.  pExpr 
1fcb0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
1fcc0 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 29 3b  pCollate(pExpr);
1fcd0 0a 20 20 69 66 28 20 43 6f 6e 73 74 46 61 63 74  .  if( ConstFact
1fce0 6f 72 4f 6b 28 70 50 61 72 73 65 29 0a 20 20 20  orOk(pParse).   
1fcf0 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  && pExpr->op!=TK
1fd00 5f 52 45 47 49 53 54 45 52 0a 20 20 20 26 26 20  _REGISTER.   && 
1fd10 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
1fd20 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78  stantNotJoin(pEx
1fd30 70 72 29 0a 20 20 29 7b 0a 20 20 20 20 45 78 70  pr).  ){.    Exp
1fd40 72 4c 69 73 74 20 2a 70 20 3d 20 70 50 61 72 73  rList *p = pPars
1fd50 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20  e->pConstExpr;. 
1fd60 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 2a 70     int i;.    *p
1fd70 52 65 67 20 20 3d 20 30 3b 0a 20 20 20 20 69 66  Reg  = 0;.    if
1fd80 28 20 70 20 29 7b 0a 20 20 20 20 20 20 73 74 72  ( p ){.      str
1fd90 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
1fda0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20  m *pItem;.      
1fdb0 66 6f 72 28 70 49 74 65 6d 3d 70 2d 3e 61 2c 20  for(pItem=p->a, 
1fdc0 69 3d 70 2d 3e 6e 45 78 70 72 3b 20 69 3e 30 3b  i=p->nExpr; i>0;
1fdd0 20 70 49 74 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a   pItem++, i--){.
1fde0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
1fdf0 6d 2d 3e 72 65 75 73 61 62 6c 65 20 26 26 20 73  m->reusable && s
1fe00 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
1fe10 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 70  e(pItem->pExpr,p
1fe20 45 78 70 72 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20  Expr,-1)==0 ){. 
1fe30 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1fe40 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45  pItem->u.iConstE
1fe50 78 70 72 52 65 67 3b 0a 20 20 20 20 20 20 20 20  xprReg;.        
1fe60 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1fe70 20 20 20 20 72 32 20 3d 20 2b 2b 70 50 61 72 73      r2 = ++pPars
1fe80 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c  e->nMem;.    sql
1fe90 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e  ite3ExprCodeAtIn
1fea0 69 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  it(pParse, pExpr
1feb0 2c 20 72 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73  , r2, 1);.  }els
1fec0 65 7b 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20  e{.    int r1 = 
1fed0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
1fee0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72  g(pParse);.    r
1fef0 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
1ff00 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
1ff10 2c 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20  , pExpr, r1);.  
1ff20 20 20 69 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a    if( r2==r1 ){.
1ff30 20 20 20 20 20 20 2a 70 52 65 67 20 3d 20 72 31        *pReg = r1
1ff40 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1ff50 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
1ff60 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1ff70 20 72 31 29 3b 0a 20 20 20 20 20 20 2a 70 52 65   r1);.      *pRe
1ff80 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  g = 0;.    }.  }
1ff90 0a 20 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a  .  return r2;.}.
1ffa0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1ffb0 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
1ffc0 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73 69  valuate expressi
1ffd0 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f  on pExpr and sto
1ffe0 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74  re the.** result
1fff0 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  s in register ta
20000 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c  rget.  The resul
20010 74 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  ts are guarantee
20020 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69  d to appear.** i
20030 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
20040 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
20050 65 33 45 78 70 72 43 6f 64 65 28 50 61 72 73 65  e3ExprCode(Parse
20060 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
20070 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65  pExpr, int targe
20080 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b  t){.  int inReg;
20090 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67  ..  assert( targ
200a0 65 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d  et>0 && target<=
200b0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a  pParse->nMem );.
200c0 20 20 69 66 28 20 70 45 78 70 72 20 26 26 20 70    if( pExpr && p
200d0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47  Expr->op==TK_REG
200e0 49 53 54 45 52 20 29 7b 0a 20 20 20 20 73 71 6c  ISTER ){.    sql
200f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70  ite3VdbeAddOp2(p
20100 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
20110 5f 43 6f 70 79 2c 20 70 45 78 70 72 2d 3e 69 54  _Copy, pExpr->iT
20120 61 62 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a 20  able, target);. 
20130 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 52 65   }else{.    inRe
20140 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
20150 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
20160 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  , pExpr, target)
20170 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
20180 61 72 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 7c  arse->pVdbe!=0 |
20190 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
201a0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
201b0 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72    if( inReg!=tar
201c0 67 65 74 20 26 26 20 70 50 61 72 73 65 2d 3e 70  get && pParse->p
201d0 56 64 62 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Vdbe ){.      sq
201e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
201f0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
20200 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20  P_SCopy, inReg, 
20210 74 61 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a 20  target);.    }. 
20220 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
20230 20 61 20 74 72 61 6e 73 69 65 6e 74 20 63 6f 70   a transient cop
20240 79 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20  y of expression 
20250 70 45 78 70 72 20 61 6e 64 20 74 68 65 6e 20 63  pExpr and then c
20260 6f 64 65 20 69 74 20 75 73 69 6e 67 0a 2a 2a 20  ode it using.** 
20270 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
20280 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  ).  This routine
20290 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65   works just like
202a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
202b0 28 29 0a 2a 2a 20 65 78 63 65 70 74 20 74 68 61  ().** except tha
202c0 74 20 74 68 65 20 69 6e 70 75 74 20 65 78 70 72  t the input expr
202d0 65 73 73 69 6f 6e 20 69 73 20 67 75 61 72 61 6e  ession is guaran
202e0 74 65 65 64 20 74 6f 20 62 65 20 75 6e 63 68 61  teed to be uncha
202f0 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  nged..*/.void sq
20300 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70  lite3ExprCodeCop
20310 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
20320 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
20330 74 20 74 61 72 67 65 74 29 7b 0a 20 20 73 71 6c  t target){.  sql
20340 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
20350 65 2d 3e 64 62 3b 0a 20 20 70 45 78 70 72 20 3d  e->db;.  pExpr =
20360 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
20370 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  db, pExpr, 0);. 
20380 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
20390 46 61 69 6c 65 64 20 29 20 73 71 6c 69 74 65 33  Failed ) sqlite3
203a0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
203b0 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b   pExpr, target);
203c0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
203d0 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b  lete(db, pExpr);
203e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
203f0 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
20400 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65  l evaluate expre
20410 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20  ssion pExpr and 
20420 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73  store the.** res
20430 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72  ults in register
20440 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65   target.  The re
20450 73 75 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e  sults are guaran
20460 74 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a  teed to appear.*
20470 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  * in register ta
20480 72 67 65 74 2e 20 20 49 66 20 74 68 65 20 65 78  rget.  If the ex
20490 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
204a0 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20  tant, then this 
204b0 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74  routine.** might
204c0 20 63 68 6f 6f 73 65 20 74 6f 20 63 6f 64 65 20   choose to code 
204d0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  the expression a
204e0 74 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  t initialization
204f0 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   time..*/.void s
20500 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 46 61  qlite3ExprCodeFa
20510 63 74 6f 72 61 62 6c 65 28 50 61 72 73 65 20 2a  ctorable(Parse *
20520 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
20530 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
20540 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
20550 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 26 26  okConstFactor &&
20560 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
20570 6e 73 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b  nstant(pExpr) ){
20580 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
20590 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73  CodeAtInit(pPars
205a0 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
205b0 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
205c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
205d0 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
205e0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a 7d  , target);.  }.}
205f0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
20600 20 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75   code that evalu
20610 61 74 65 73 20 74 68 65 20 67 69 76 65 6e 20 65  ates the given e
20620 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 75  xpression and pu
20630 74 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  ts the result.**
20640 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72   in register tar
20650 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20  get..**.** Also 
20660 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  make a copy of t
20670 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  he expression re
20680 73 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68  sults into anoth
20690 65 72 20 22 63 61 63 68 65 22 20 72 65 67 69 73  er "cache" regis
206a0 74 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66  ter.** and modif
206b0 79 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  y the expression
206c0 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78   so that the nex
206d0 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 76 61  t time it is eva
206e0 6c 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72  luated,.** the r
206f0 65 73 75 6c 74 20 69 73 20 61 20 63 6f 70 79 20  esult is a copy 
20700 6f 66 20 74 68 65 20 63 61 63 68 65 20 72 65 67  of the cache reg
20710 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ister..**.** Thi
20720 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
20730 64 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  d for expression
20740 73 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20  s that are used 
20750 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d  multiple .** tim
20760 65 73 2e 20 20 54 68 65 79 20 61 72 65 20 65 76  es.  They are ev
20770 61 6c 75 61 74 65 64 20 6f 6e 63 65 20 61 6e 64  aluated once and
20780 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
20790 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  the expression.*
207a0 2a 20 61 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f  * are reused..*/
207b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
207c0 72 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50 61  rCodeAndCache(Pa
207d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
207e0 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
207f0 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76  rget){.  Vdbe *v
20800 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
20810 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a 20  ;.  int iMem;.. 
20820 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e   assert( target>
20830 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
20840 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47  Expr->op!=TK_REG
20850 49 53 54 45 52 20 29 3b 0a 20 20 73 71 6c 69 74  ISTER );.  sqlit
20860 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
20870 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
20880 29 3b 0a 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50  );.  iMem = ++pP
20890 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71  arse->nMem;.  sq
208a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
208b0 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 74 61 72 67  v, OP_Copy, targ
208c0 65 74 2c 20 69 4d 65 6d 29 3b 0a 20 20 65 78 70  et, iMem);.  exp
208d0 72 54 6f 52 65 67 69 73 74 65 72 28 70 45 78 70  rToRegister(pExp
208e0 72 2c 20 69 4d 65 6d 29 3b 0a 7d 0a 0a 2f 2a 0a  r, iMem);.}../*.
208f0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
20900 20 74 68 61 74 20 70 75 73 68 65 73 20 74 68 65   that pushes the
20910 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20   value of every 
20920 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67  element of the g
20930 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69  iven.** expressi
20940 6f 6e 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 73  on list into a s
20950 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73  equence of regis
20960 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 61  ters beginning a
20970 74 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20  t target..**.** 
20980 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
20990 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65 76  r of elements ev
209a0 61 6c 75 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  aluated..**.** T
209b0 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44  he SQLITE_ECEL_D
209c0 55 50 20 66 6c 61 67 20 70 72 65 76 65 6e 74 73  UP flag prevents
209d0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 66   the arguments f
209e0 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 66 69 6c  rom being.** fil
209f0 6c 65 64 20 75 73 69 6e 67 20 4f 50 5f 53 43 6f  led using OP_SCo
20a00 70 79 2e 20 20 4f 50 5f 43 6f 70 79 20 6d 75 73  py.  OP_Copy mus
20a10 74 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61  t be used instea
20a20 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c  d..**.** The SQL
20a30 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 20  ITE_ECEL_FACTOR 
20a40 61 72 67 75 6d 65 6e 74 20 61 6c 6c 6f 77 73 20  argument allows 
20a50 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e  constant argumen
20a60 74 73 20 74 6f 20 62 65 0a 2a 2a 20 66 61 63 74  ts to be.** fact
20a70 6f 72 65 64 20 6f 75 74 20 69 6e 74 6f 20 69 6e  ored out into in
20a80 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 64  itialization cod
20a90 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c  e..**.** The SQL
20aa0 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 66 6c 61  ITE_ECEL_REF fla
20ab0 67 20 6d 65 61 6e 73 20 74 68 61 74 20 65 78 70  g means that exp
20ac0 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
20ad0 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20 45 78 70  list with.** Exp
20ae0 72 4c 69 73 74 2e 61 5b 5d 2e 75 2e 78 2e 69 4f  rList.a[].u.x.iO
20af0 72 64 65 72 42 79 43 6f 6c 3e 30 20 68 61 76 65  rderByCol>0 have
20b00 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 65 76   already been ev
20b10 61 6c 75 61 74 65 64 20 61 6e 64 20 73 74 6f 72  aluated and stor
20b20 65 64 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  ed.** in registe
20b30 72 73 20 61 74 20 73 72 63 52 65 67 2c 20 61 6e  rs at srcReg, an
20b40 64 20 73 6f 20 74 68 65 20 76 61 6c 75 65 20 63  d so the value c
20b50 61 6e 20 62 65 20 63 6f 70 69 65 64 20 66 72 6f  an be copied fro
20b60 6d 20 74 68 65 72 65 2e 0a 2a 2f 0a 69 6e 74 20  m there..*/.int 
20b70 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
20b80 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65  xprList(.  Parse
20b90 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
20ba0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
20bb0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
20bc0 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68 65 20  pList,   /* The 
20bd0 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
20be0 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
20bf0 20 69 6e 74 20 74 61 72 67 65 74 2c 20 20 20 20   int target,    
20c00 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
20c10 77 72 69 74 65 20 72 65 73 75 6c 74 73 20 2a 2f  write results */
20c20 0a 20 20 69 6e 74 20 73 72 63 52 65 67 2c 20 20  .  int srcReg,  
20c30 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20        /* Source 
20c40 72 65 67 69 73 74 65 72 73 20 69 66 20 53 51 4c  registers if SQL
20c50 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 2a 2f 0a  ITE_ECEL_REF */.
20c60 20 20 75 38 20 66 6c 61 67 73 20 20 20 20 20 20    u8 flags      
20c70 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45       /* SQLITE_E
20c80 43 45 4c 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29  CEL_* flags */.)
20c90 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  {.  struct ExprL
20ca0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
20cb0 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a  .  int i, j, n;.
20cc0 20 20 75 38 20 63 6f 70 79 4f 70 20 3d 20 28 66    u8 copyOp = (f
20cd0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43  lags & SQLITE_EC
20ce0 45 4c 5f 44 55 50 29 20 3f 20 4f 50 5f 43 6f 70  EL_DUP) ? OP_Cop
20cf0 79 20 3a 20 4f 50 5f 53 43 6f 70 79 3b 0a 20 20  y : OP_SCopy;.  
20d00 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
20d10 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
20d20 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20  t( pList!=0 );. 
20d30 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e   assert( target>
20d40 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
20d50 50 61 72 73 65 2d 3e 70 56 64 62 65 21 3d 30 20  Parse->pVdbe!=0 
20d60 29 3b 20 20 2f 2a 20 4e 65 76 65 72 20 67 65 74  );  /* Never get
20d70 73 20 74 68 69 73 20 66 61 72 20 6f 74 68 65 72  s this far other
20d80 77 69 73 65 20 2a 2f 0a 20 20 6e 20 3d 20 70 4c  wise */.  n = pL
20d90 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66  ist->nExpr;.  if
20da0 28 20 21 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b  ( !ConstFactorOk
20db0 28 70 50 61 72 73 65 29 20 29 20 66 6c 61 67 73  (pParse) ) flags
20dc0 20 26 3d 20 7e 53 51 4c 49 54 45 5f 45 43 45 4c   &= ~SQLITE_ECEL
20dd0 5f 46 41 43 54 4f 52 3b 0a 20 20 66 6f 72 28 70  _FACTOR;.  for(p
20de0 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
20df0 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49  =0; i<n; i++, pI
20e00 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  tem++){.    Expr
20e10 20 2a 70 45 78 70 72 20 3d 20 70 49 74 65 6d 2d   *pExpr = pItem-
20e20 3e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  >pExpr;.    if( 
20e30 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
20e40 45 43 45 4c 5f 52 45 46 29 21 3d 30 20 26 26 20  ECEL_REF)!=0 && 
20e50 28 6a 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  (j = pList->a[i]
20e60 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
20e70 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  )>0 ){.      sql
20e80 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
20e90 2c 20 63 6f 70 79 4f 70 2c 20 6a 2b 73 72 63 52  , copyOp, j+srcR
20ea0 65 67 2d 31 2c 20 74 61 72 67 65 74 2b 69 29 3b  eg-1, target+i);
20eb0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
20ec0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
20ed0 43 45 4c 5f 46 41 43 54 4f 52 29 21 3d 30 20 26  CEL_FACTOR)!=0 &
20ee0 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  & sqlite3ExprIsC
20ef0 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 29 20 29  onstant(pExpr) )
20f00 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
20f10 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50  xprCodeAtInit(pP
20f20 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
20f30 67 65 74 2b 69 2c 20 30 29 3b 0a 20 20 20 20 7d  get+i, 0);.    }
20f40 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
20f50 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
20f60 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
20f70 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
20f80 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 69 66  get+i);.      if
20f90 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 2b  ( inReg!=target+
20fa0 69 20 29 7b 0a 20 20 20 20 20 20 20 20 56 64 62  i ){.        Vdb
20fb0 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20  eOp *pOp;.      
20fc0 20 20 69 66 28 20 63 6f 70 79 4f 70 3d 3d 4f 50    if( copyOp==OP
20fd0 5f 43 6f 70 79 0a 20 20 20 20 20 20 20 20 20 26  _Copy.         &
20fe0 26 20 28 70 4f 70 3d 73 71 6c 69 74 65 33 56 64  & (pOp=sqlite3Vd
20ff0 62 65 47 65 74 4f 70 28 76 2c 20 2d 31 29 29 2d  beGetOp(v, -1))-
21000 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79  >opcode==OP_Copy
21010 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4f 70  .         && pOp
21020 2d 3e 70 31 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d  ->p1+pOp->p3+1==
21030 69 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20 26  inReg.         &
21040 26 20 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70  & pOp->p2+pOp->p
21050 33 2b 31 3d 3d 74 61 72 67 65 74 2b 69 0a 20 20  3+1==target+i.  
21060 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
21070 20 20 20 70 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20     pOp->p3++;.  
21080 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21090 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
210a0 62 65 41 64 64 4f 70 32 28 76 2c 20 63 6f 70 79  beAddOp2(v, copy
210b0 4f 70 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65  Op, inReg, targe
210c0 74 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  t+i);.        }.
210d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
210e0 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  }.  return n;.}.
210f0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
21100 63 6f 64 65 20 66 6f 72 20 61 20 42 45 54 57 45  code for a BETWE
21110 45 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a  EN operator..**.
21120 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20  **    x BETWEEN 
21130 79 20 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68  y AND z.**.** Th
21140 65 20 61 62 6f 76 65 20 69 73 20 65 71 75 69 76  e above is equiv
21150 61 6c 65 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20  alent to .**.** 
21160 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a     x>=y AND x<=z
21170 0a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 69 74 20 61  .**.** Code it a
21180 73 20 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63  s such, taking c
21190 61 72 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f  are to do the co
211a0 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69  mmon subexpressi
211b0 6f 6e 0a 2a 2a 20 65 6c 69 6d 69 6e 61 74 69 6f  on.** eliminatio
211c0 6e 20 6f 66 20 78 2e 0a 2a 2f 0a 73 74 61 74 69  n of x..*/.stati
211d0 63 20 76 6f 69 64 20 65 78 70 72 43 6f 64 65 42  c void exprCodeB
211e0 65 74 77 65 65 6e 28 0a 20 20 50 61 72 73 65 20  etween(.  Parse 
211f0 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
21200 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
21210 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
21220 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
21230 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  xpr,      /* The
21240 20 42 45 54 57 45 45 4e 20 65 78 70 72 65 73 73   BETWEEN express
21250 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  ion */.  int des
21260 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  t,         /* Ju
21270 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20 6a  mp here if the j
21280 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a  ump is taken */.
21290 20 20 76 6f 69 64 20 28 2a 78 4a 75 6d 70 49 66    void (*xJumpIf
212a0 29 28 50 61 72 73 65 2a 2c 45 78 70 72 2a 2c 69  )(Parse*,Expr*,i
212b0 6e 74 2c 69 6e 74 29 2c 0a 20 20 69 6e 74 20 6a  nt,int),.  int j
212c0 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20  umpIfNull    /* 
212d0 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  Take the jump if
212e0 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 73 20   the BETWEEN is 
212f0 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  NULL */.){.  Exp
21300 72 20 65 78 70 72 41 6e 64 3b 20 20 20 20 20 2f  r exprAnd;     /
21310 2a 20 54 68 65 20 41 4e 44 20 6f 70 65 72 61 74  * The AND operat
21320 6f 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e 44 20  or in  x>=y AND 
21330 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70 72 20  x<=z  */.  Expr 
21340 63 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f 2a 20  compLeft;    /* 
21350 54 68 65 20 20 78 3e 3d 79 20 20 74 65 72 6d 20  The  x>=y  term 
21360 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 52 69  */.  Expr compRi
21370 67 68 74 3b 20 20 20 2f 2a 20 54 68 65 20 20 78  ght;   /* The  x
21380 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45  <=z  term */.  E
21390 78 70 72 20 65 78 70 72 58 3b 20 20 20 20 20 20  xpr exprX;      
213a0 20 2f 2a 20 54 68 65 20 20 78 20 20 73 75 62 65   /* The  x  sube
213b0 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  xpression */.  i
213c0 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
213d0 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73   /* Temporary us
213e0 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a 20  e register */.. 
213f0 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70 4c 65 66   memset(&compLef
21400 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70  t, 0, sizeof(Exp
21410 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 63  r));.  memset(&c
21420 6f 6d 70 52 69 67 68 74 2c 20 30 2c 20 73 69 7a  ompRight, 0, siz
21430 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 6d 65  eof(Expr));.  me
21440 6d 73 65 74 28 26 65 78 70 72 41 6e 64 2c 20 30  mset(&exprAnd, 0
21450 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b  , sizeof(Expr));
21460 0a 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  ..  assert( !Exp
21470 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
21480 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
21490 29 20 29 3b 0a 20 20 65 78 70 72 58 20 3d 20 2a  ) );.  exprX = *
214a0 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
214b0 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f  exprAnd.op = TK_
214c0 41 4e 44 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70  AND;.  exprAnd.p
214d0 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74  Left = &compLeft
214e0 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 52 69 67  ;.  exprAnd.pRig
214f0 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b  ht = &compRight;
21500 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d  .  compLeft.op =
21510 20 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c 65   TK_GE;.  compLe
21520 66 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72  ft.pLeft = &expr
21530 58 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52  X;.  compLeft.pR
21540 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  ight = pExpr->x.
21550 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
21560 72 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f  r;.  compRight.o
21570 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d  p = TK_LE;.  com
21580 70 52 69 67 68 74 2e 70 4c 65 66 74 20 3d 20 26  pRight.pLeft = &
21590 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 52 69 67  exprX;.  compRig
215a0 68 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70  ht.pRight = pExp
215b0 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d  r->x.pList->a[1]
215c0 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 73 71  .pExpr;.  if( sq
215d0 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f  lite3ExprIsVecto
215e0 72 28 26 65 78 70 72 58 29 3d 3d 30 20 29 7b 0a  r(&exprX)==0 ){.
215f0 20 20 20 20 65 78 70 72 54 6f 52 65 67 69 73 74      exprToRegist
21600 65 72 28 26 65 78 70 72 58 2c 20 73 71 6c 69 74  er(&exprX, sqlit
21610 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
21620 50 61 72 73 65 2c 20 26 65 78 70 72 58 2c 20 26  Parse, &exprX, &
21630 72 65 67 46 72 65 65 31 29 29 3b 0a 20 20 7d 0a  regFree1));.  }.
21640 20 20 69 66 28 20 78 4a 75 6d 70 49 66 20 29 7b    if( xJumpIf ){
21650 0a 20 20 20 20 78 4a 75 6d 70 49 66 28 70 50 61  .    xJumpIf(pPa
21660 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64  rse, &exprAnd, d
21670 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
21680 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65  ;.  }else{.    e
21690 78 70 72 58 2e 66 6c 61 67 73 20 7c 3d 20 45 50  xprX.flags |= EP
216a0 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 73  _FromJoin;.    s
216b0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
216c0 72 67 65 74 28 70 50 61 72 73 65 2c 20 26 65 78  rget(pParse, &ex
216d0 70 72 41 6e 64 2c 20 64 65 73 74 29 3b 0a 20 20  prAnd, dest);.  
216e0 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
216f0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
21700 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 0a 20 20  , regFree1);..  
21710 2f 2a 20 45 6e 73 75 72 65 20 61 64 65 71 75 61  /* Ensure adequa
21720 74 65 20 74 65 73 74 20 63 6f 76 65 72 61 67 65  te test coverage
21730 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
21740 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26  jumpIfTrue==0 &&
21750 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26   jumpIfNull==0 &
21760 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  & regFree1==0 );
21770 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d  .  testcase( jum
21780 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75  pIfTrue==0 && ju
21790 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72  mpIfNull==0 && r
217a0 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20  egFree1!=0 );.  
217b0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
217c0 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49  True==0 && jumpI
217d0 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
217e0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73  ree1==0 );.  tes
217f0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75  tcase( jumpIfTru
21800 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75  e==0 && jumpIfNu
21810 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll!=0 && regFree
21820 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1!=0 );.  testca
21830 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d  se( jumpIfTrue!=
21840 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  0 && jumpIfNull=
21850 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d  =0 && regFree1==
21860 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
21870 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26   jumpIfTrue!=0 &
21880 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  & jumpIfNull==0 
21890 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29  && regFree1!=0 )
218a0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75  ;.  testcase( ju
218b0 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a  mpIfTrue!=0 && j
218c0 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
218d0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
218e0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
218f0 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70  fTrue!=0 && jump
21900 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67  IfNull!=0 && reg
21910 46 72 65 65 31 21 3d 30 20 29 3b 0a 7d 0a 0a 2f  Free1!=0 );.}../
21920 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
21930 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e  de for a boolean
21940 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68   expression such
21950 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20   that a jump is 
21960 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c  made.** to the l
21970 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74  abel "dest" if t
21980 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
21990 20 74 72 75 65 20 62 75 74 20 65 78 65 63 75 74   true but execut
219a0 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73  ion.** continues
219b0 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69   straight thru i
219c0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
219d0 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a   is false..**.**
219e0 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
219f0 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  on evaluates to 
21a00 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72  NULL (neither tr
21a10 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74  ue nor false), t
21a20 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20  hen.** take the 
21a30 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70  jump if the jump
21a40 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 53  IfNull flag is S
21a50 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
21a60 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64  ..**.** This cod
21a70 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65  e depends on the
21a80 20 66 61 63 74 20 74 68 61 74 20 63 65 72 74 61   fact that certa
21a90 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20  in token values 
21aa0 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61  (ex: TK_EQ).** a
21ab0 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f  re the same as o
21ac0 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78  pcode values (ex
21ad0 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d  : OP_Eq) that im
21ae0 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72  plement the corr
21af0 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65  esponding.** ope
21b00 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c  ration.  Special
21b10 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62   comments in vdb
21b20 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70  e.c and the mkop
21b30 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74  codeh.awk script
21b40 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20   in.** the make 
21b50 70 72 6f 63 65 73 73 20 63 61 75 73 65 20 74 68  process cause th
21b60 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c  ese values to al
21b70 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20  ign.  Assert()s 
21b80 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62  in the code.** b
21b90 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61 74  elow verify that
21ba0 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65   the numbers are
21bb0 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74   aligned correct
21bc0 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
21bd0 74 65 33 45 78 70 72 49 66 54 72 75 65 28 50 61  te3ExprIfTrue(Pa
21be0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
21bf0 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65  r *pExpr, int de
21c00 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  st, int jumpIfNu
21c10 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ll){.  Vdbe *v =
21c20 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
21c30 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20    int op = 0;.  
21c40 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
21c50 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32  ;.  int regFree2
21c60 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20   = 0;.  int r1, 
21c70 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a  r2;..  assert( j
21c80 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
21c90 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20  E_JUMPIFNULL || 
21ca0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
21cb0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d  .  if( NEVER(v==
21cc0 30 29 20 29 20 20 20 20 20 72 65 74 75 72 6e 3b  0) )     return;
21cd0 20 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f    /* Existence o
21ce0 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20 62  f VDBE checked b
21cf0 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66  y caller */.  if
21d00 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30  ( NEVER(pExpr==0
21d10 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  ) ) return;  /* 
21d20 4e 6f 20 77 61 79 20 74 68 69 73 20 63 61 6e 20  No way this can 
21d30 68 61 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d  happen */.  op =
21d40 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77   pExpr->op;.  sw
21d50 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
21d60 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20  case TK_AND: {. 
21d70 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71       int d2 = sq
21d80 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
21d90 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73  el(v);.      tes
21da0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
21db0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
21dc0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
21dd0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
21de0 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66  pLeft, d2,jumpIf
21df0 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50  Null^SQLITE_JUMP
21e00 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
21e10 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
21e20 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
21e30 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
21e40 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
21e50 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
21e60 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
21e70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21e80 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
21e90 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d2);.      sqlit
21ea0 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
21eb0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72  Parse);.      br
21ec0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
21ed0 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20  ase TK_OR: {.   
21ee0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
21ef0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
21f00 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
21f10 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
21f20 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
21f30 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
21f40 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
21f50 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
21f60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
21f70 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
21f80 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
21f90 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
21fa0 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
21fb0 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
21fc0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72  Parse);.      br
21fd0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
21fe0 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
21ff0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
22000 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
22010 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
22020 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
22030 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
22040 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
22050 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
22060 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
22070 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  IS:.    case TK_
22080 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65 73  ISNOT:.      tes
22090 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
220a0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
220b0 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  se( op==TK_ISNOT
220c0 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28   );.      op = (
220d0 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f  op==TK_IS) ? TK_
220e0 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20  EQ : TK_NE;.    
220f0 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53    jumpIfNull = S
22100 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20  QLITE_NULLEQ;.  
22110 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75      /* Fall thru
22120 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
22130 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
22140 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
22150 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
22160 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
22170 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
22180 45 51 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  EQ: {.      if( 
22190 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63  sqlite3ExprIsVec
221a0 74 6f 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  tor(pExpr->pLeft
221b0 29 20 29 20 67 6f 74 6f 20 64 65 66 61 75 6c 74  ) ) goto default
221c0 5f 65 78 70 72 3b 0a 20 20 20 20 20 20 74 65 73  _expr;.      tes
221d0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
221e0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31  l==0 );.      r1
221f0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
22200 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
22210 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
22220 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
22230 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
22240 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
22250 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
22260 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
22270 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
22280 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
22290 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
222a0 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
222b0 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
222c0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
222d0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
222e0 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74  TK_LT==OP_Lt); t
222f0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
22300 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
22310 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  If(v,op==OP_Lt);
22320 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
22330 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73  _LE==OP_Le); tes
22340 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29  tcase(op==OP_Le)
22350 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
22360 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20  (v,op==OP_Le);. 
22370 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
22380 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63  T==OP_Gt); testc
22390 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20  ase(op==OP_Gt); 
223a0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
223b0 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20  ,op==OP_Gt);.   
223c0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d     assert(TK_GE=
223d0 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73  =OP_Ge); testcas
223e0 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64  e(op==OP_Ge); Vd
223f0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
22400 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20  p==OP_Ge);.     
22410 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f   assert(TK_EQ==O
22420 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65 28  P_Eq); testcase(
22430 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20  op==OP_Eq);.    
22440 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
22450 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26  (v, op==OP_Eq &&
22460 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c   jumpIfNull==SQL
22470 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
22480 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
22490 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26  f(v, op==OP_Eq &
224a0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51  & jumpIfNull!=SQ
224b0 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
224c0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45      assert(TK_NE
224d0 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61  ==OP_Ne); testca
224e0 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20  se(op==OP_Ne);. 
224f0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
22500 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65  eIf(v, op==OP_Ne
22510 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
22520 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
22530 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
22540 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e  geIf(v, op==OP_N
22550 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  e && jumpIfNull!
22560 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
22570 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
22580 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
22590 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
225a0 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
225b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
225c0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
225d0 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
225e0 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
225f0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53     assert( TK_IS
22600 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  NULL==OP_IsNull 
22610 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  );   testcase( o
22620 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a  p==TK_ISNULL );.
22630 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
22640 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74  _NOTNULL==OP_Not
22650 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65  Null ); testcase
22660 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ( op==TK_NOTNULL
22670 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
22680 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
22690 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
226a0 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
226b0 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e1);.      sqlit
226c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
226d0 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20  op, r1, dest);. 
226e0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
226f0 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53  eIf(v, op==TK_IS
22700 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64 62  NULL);.      Vdb
22710 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
22720 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a  p==TK_NOTNULL);.
22730 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
22740 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
22750 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
22760 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  }.    case TK_BE
22770 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74  TWEEN: {.      t
22780 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
22790 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
227a0 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28  exprCodeBetween(
227b0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
227c0 65 73 74 2c 20 73 71 6c 69 74 65 33 45 78 70 72  est, sqlite3Expr
227d0 49 66 54 72 75 65 2c 20 6a 75 6d 70 49 66 4e 75  IfTrue, jumpIfNu
227e0 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
227f0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
22800 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
22810 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
22820 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _IN: {.      int
22830 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73   destIfFalse = s
22840 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
22850 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e  bel(v);.      in
22860 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 6a  t destIfNull = j
22870 75 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74  umpIfNull ? dest
22880 20 3a 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a   : destIfFalse;.
22890 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
228a0 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
228b0 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c  pExpr, destIfFal
228c0 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  se, destIfNull);
228d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
228e0 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b  beGoto(v, dest);
228f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
22900 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
22910 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
22920 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
22930 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65   }.#endif.    de
22940 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65 66  fault: {.    def
22950 61 75 6c 74 5f 65 78 70 72 3a 0a 20 20 20 20 20  ault_expr:.     
22960 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 54   if( exprAlwaysT
22970 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20  rue(pExpr) ){.  
22980 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
22990 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a  eGoto(v, dest);.
229a0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
229b0 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  exprAlwaysFalse(
229c0 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
229d0 20 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a 20 20    /* No-op */.  
229e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
229f0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
22a00 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
22a10 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46  se, pExpr, &regF
22a20 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73  ree1);.        s
22a30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
22a40 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64  (v, OP_If, r1, d
22a50 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  est, jumpIfNull!
22a60 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  =0);.        Vdb
22a70 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
22a80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
22a90 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
22aa0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
22ab0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
22ac0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
22ad0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
22ae0 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
22af0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
22b00 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
22b10 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
22b20 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
22b30 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a  ree2);  .}../*.*
22b40 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
22b50 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78  for a boolean ex
22b60 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68  pression such th
22b70 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  at a jump is mad
22b80 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65  e.** to the labe
22b90 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20  l "dest" if the 
22ba0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61  expression is fa
22bb0 6c 73 65 20 62 75 74 20 65 78 65 63 75 74 69 6f  lse but executio
22bc0 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73  n.** continues s
22bd0 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20  traight thru if 
22be0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
22bf0 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s true..**.** If
22c00 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
22c10 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
22c20 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20  L (neither true 
22c30 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a  nor false) then.
22c40 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49  ** jump if jumpI
22c50 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f  fNull is SQLITE_
22c60 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61  JUMPIFNULL or fa
22c70 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75  ll through if ju
22c80 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30  mpIfNull.** is 0
22c90 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
22ca0 33 45 78 70 72 49 66 46 61 6c 73 65 28 50 61 72  3ExprIfFalse(Par
22cb0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
22cc0 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73   *pExpr, int des
22cd0 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  t, int jumpIfNul
22ce0 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  l){.  Vdbe *v = 
22cf0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
22d00 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69   int op = 0;.  i
22d10 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
22d20 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20  .  int regFree2 
22d30 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72  = 0;.  int r1, r
22d40 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75  2;..  assert( ju
22d50 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
22d60 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a  _JUMPIFNULL || j
22d70 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
22d80 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
22d90 29 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 45  ) ) return; /* E
22da0 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45  xistence of VDBE
22db0 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c   checked by call
22dc0 65 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  er */.  if( pExp
22dd0 72 3d 3d 30 20 29 20 20 20 20 72 65 74 75 72 6e  r==0 )    return
22de0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75  ;..  /* The valu
22df0 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61  e of pExpr->op a
22e00 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65  nd op are relate
22e10 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  d as follows:.  
22e20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45  **.  **       pE
22e30 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20  xpr->op         
22e40 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20     op.  **      
22e50 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20   ---------      
22e60 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20      ----------. 
22e70 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e   **       TK_ISN
22e80 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f  ULL          OP_
22e90 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20  NotNull.  **    
22ea0 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20     TK_NOTNULL   
22eb0 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a        OP_IsNull.
22ec0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45    **       TK_NE
22ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
22ee0 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Eq.  **       T
22ef0 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20 20 20  K_EQ            
22f00 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20    OP_Ne.  **    
22f10 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20     TK_GT        
22f20 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a        OP_Le.  **
22f30 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20         TK_LE    
22f40 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a            OP_Gt.
22f50 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45    **       TK_GE
22f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
22f70 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Lt.  **       T
22f80 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20 20  K_LT            
22f90 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a    OP_Ge.  **.  *
22fa0 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75  * For other valu
22fb0 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c  es of pExpr->op,
22fc0 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64   op is undefined
22fd0 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a   and unused..  *
22fe0 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54  * The value of T
22ff0 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74  K_ and OP_ const
23000 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67 65  ants are arrange
23010 64 20 73 75 63 68 20 74 68 61 74 20 77 65 0a 20  d such that we. 
23020 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20   ** can compute 
23030 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76  the mapping abov
23040 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c  e using the foll
23050 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  owing expression
23060 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73  ..  ** Assert()s
23070 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
23080 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20   computation is 
23090 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20  correct..  */.  
230a0 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70  op = ((pExpr->op
230b0 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e  +(TK_ISNULL&1))^
230c0 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29  1)-(TK_ISNULL&1)
230d0 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63  ;..  /* Verify c
230e0 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74  orrect alignment
230f0 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20   of TK_ and OP_ 
23100 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20  constants.  */. 
23110 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
23120 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c  op!=TK_ISNULL ||
23130 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20   op==OP_NotNull 
23140 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
23150 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55  pr->op!=TK_NOTNU
23160 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e  LL || op==OP_IsN
23170 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ull );.  assert(
23180 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e   pExpr->op!=TK_N
23190 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29  E || op==OP_Eq )
231a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
231b0 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20  r->op!=TK_EQ || 
231c0 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61  op==OP_Ne );.  a
231d0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
231e0 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_LT || op==O
231f0 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Ge );.  assert
23200 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
23210 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20  LE || op==OP_Gt 
23220 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
23230 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c  pr->op!=TK_GT ||
23240 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20   op==OP_Le );.  
23250 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
23260 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_GE || op==
23270 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74  OP_Lt );..  swit
23280 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
23290 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
232a0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
232b0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
232c0 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
232d0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
232e0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
232f0 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
23300 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
23310 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
23320 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
23330 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
23340 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
23350 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
23360 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
23370 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
23380 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
23390 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
233a0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
233b0 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  OR: {.      int 
233c0 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
233d0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
233e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
233f0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
23400 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
23410 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
23420 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c  Expr->pLeft, d2,
23430 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49   jumpIfNull^SQLI
23440 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
23450 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
23460 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
23470 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
23480 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
23490 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
234a0 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
234b0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
234c0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
234d0 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20  abel(v, d2);.   
234e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
234f0 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
23500 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
23510 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
23520 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  OT: {.      test
23530 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
23540 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
23550 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
23560 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
23570 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
23580 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
23590 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
235a0 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63  ase TK_IS:.    c
235b0 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20  ase TK_ISNOT:.  
235c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
235d0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29  xpr->op==TK_IS )
235e0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
235f0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
23600 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 6f  ISNOT );.      o
23610 70 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d  p = (pExpr->op==
23620 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e 45 20 3a  TK_IS) ? TK_NE :
23630 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 6a 75   TK_EQ;.      ju
23640 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54  mpIfNull = SQLIT
23650 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20  E_NULLEQ;.      
23660 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a  /* Fall thru */.
23670 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
23680 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
23690 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
236a0 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
236b0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
236c0 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
236d0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
236e0 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28  te3ExprIsVector(
236f0 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 20  pExpr->pLeft) ) 
23700 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65 78 70  goto default_exp
23710 72 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  r;.      testcas
23720 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
23730 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
23740 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
23750 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
23760 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
23770 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
23780 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
23790 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
237a0 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
237b0 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64  ree2);.      cod
237c0 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
237d0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
237e0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
237f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23800 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74      r1, r2, dest
23810 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
23820 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c       assert(TK_L
23830 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63  T==OP_Lt); testc
23840 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20  ase(op==OP_Lt); 
23850 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
23860 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20  ,op==OP_Lt);.   
23870 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d     assert(TK_LE=
23880 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73  =OP_Le); testcas
23890 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64  e(op==OP_Le); Vd
238a0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
238b0 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20  p==OP_Le);.     
238c0 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f   assert(TK_GT==O
238d0 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65 28  P_Gt); testcase(
238e0 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65  op==OP_Gt); Vdbe
238f0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
23900 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61  =OP_Gt);.      a
23910 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f  ssert(TK_GE==OP_
23920 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ge); testcase(op
23930 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ge); VdbeCo
23940 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
23950 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Ge);.      ass
23960 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71  ert(TK_EQ==OP_Eq
23970 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
23980 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 56 64  OP_Eq);.      Vd
23990 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
239a0 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d  op==OP_Eq && jum
239b0 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f  pIfNull!=SQLITE_
239c0 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56  NULLEQ);.      V
239d0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
239e0 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75   op==OP_Eq && ju
239f0 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
23a00 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
23a10 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50  assert(TK_NE==OP
23a20 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Ne); testcase(o
23a30 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20  p==OP_Ne);.     
23a40 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
23a50 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20  v, op==OP_Ne && 
23a60 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49  jumpIfNull!=SQLI
23a70 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
23a80 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
23a90 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26  (v, op==OP_Ne &&
23aa0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c   jumpIfNull==SQL
23ab0 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
23ac0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
23ad0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
23ae0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
23af0 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
23b00 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
23b10 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
23b20 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
23b30 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 72  TNULL: {.      r
23b40 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
23b50 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
23b60 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
23b70 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
23b80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23b90 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73  2(v, op, r1, des
23ba0 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
23bb0 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  se( op==TK_ISNUL
23bc0 4c 20 29 3b 20 20 20 56 64 62 65 43 6f 76 65 72  L );   VdbeCover
23bd0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
23be0 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74  ISNULL);.      t
23bf0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
23c00 4e 4f 54 4e 55 4c 4c 20 29 3b 20 20 56 64 62 65  NOTNULL );  Vdbe
23c10 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
23c20 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20  ==TK_NOTNULL);. 
23c30 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
23c40 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
23c50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
23c60 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
23c70 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65  WEEN: {.      te
23c80 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
23c90 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65  ll==0 );.      e
23ca0 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70  xprCodeBetween(p
23cb0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
23cc0 73 74 2c 20 73 71 6c 69 74 65 33 45 78 70 72 49  st, sqlite3ExprI
23cd0 66 46 61 6c 73 65 2c 20 6a 75 6d 70 49 66 4e 75  fFalse, jumpIfNu
23ce0 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
23cf0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
23d00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
23d10 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
23d20 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  _IN: {.      if(
23d30 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a 20   jumpIfNull ){. 
23d40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
23d50 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c  prCodeIN(pParse,
23d60 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65   pExpr, dest, de
23d70 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st);.      }else
23d80 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64 65  {.        int de
23d90 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74  stIfNull = sqlit
23da0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
23db0 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
23dc0 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50  te3ExprCodeIN(pP
23dd0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
23de0 74 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  t, destIfNull);.
23df0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
23e00 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
23e10 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  v, destIfNull);.
23e20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
23e30 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
23e40 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  f.    default: {
23e50 0a 20 20 20 20 64 65 66 61 75 6c 74 5f 65 78 70  .    default_exp
23e60 72 3a 20 0a 20 20 20 20 20 20 69 66 28 20 65 78  r: .      if( ex
23e70 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45  prAlwaysFalse(pE
23e80 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
23e90 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
23ea0 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  v, dest);.      
23eb0 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c  }else if( exprAl
23ec0 77 61 79 73 54 72 75 65 28 70 45 78 70 72 29 20  waysTrue(pExpr) 
23ed0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f  ){.        /* no
23ee0 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c  -op */.      }el
23ef0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d  se{.        r1 =
23f00 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
23f10 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
23f20 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  pr, &regFree1);.
23f30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
23f40 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
23f50 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c  IfNot, r1, dest,
23f60 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b   jumpIfNull!=0);
23f70 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
23f80 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
23f90 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
23fa0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
23fb0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
23fc0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
23fd0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
23fe0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  k;.    }.  }.  s
23ff0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
24000 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
24010 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65  Free1);.  sqlite
24020 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
24030 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32  pParse, regFree2
24040 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65  );.}../*.** Like
24050 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
24060 6c 73 65 28 29 20 65 78 63 65 70 74 20 74 68 61  lse() except tha
24070 74 20 61 20 63 6f 70 79 20 69 73 20 6d 61 64 65  t a copy is made
24080 20 6f 66 20 70 45 78 70 72 20 62 65 66 6f 72 65   of pExpr before
24090 0a 2a 2a 20 63 6f 64 65 20 67 65 6e 65 72 61 74  .** code generat
240a0 69 6f 6e 2c 20 61 6e 64 20 74 68 61 74 20 63 6f  ion, and that co
240b0 70 79 20 69 73 20 64 65 6c 65 74 65 64 20 61 66  py is deleted af
240c0 74 65 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74  ter code generat
240d0 69 6f 6e 2e 20 54 68 69 73 0a 2a 2a 20 65 6e 73  ion. This.** ens
240e0 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6f 72  ures that the or
240f0 69 67 69 6e 61 6c 20 70 45 78 70 72 20 69 73 20  iginal pExpr is 
24100 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f  unchanged..*/.vo
24110 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  id sqlite3ExprIf
24120 46 61 6c 73 65 44 75 70 28 50 61 72 73 65 20 2a  FalseDup(Parse *
24130 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
24140 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 69 6e  xpr, int dest,in
24150 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
24160 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
24170 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70  Parse->db;.  Exp
24180 72 20 2a 70 43 6f 70 79 20 3d 20 73 71 6c 69 74  r *pCopy = sqlit
24190 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45  e3ExprDup(db, pE
241a0 78 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 64  xpr, 0);.  if( d
241b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
241c0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
241d0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
241e0 72 73 65 2c 20 70 43 6f 70 79 2c 20 64 65 73 74  rse, pCopy, dest
241f0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
24200 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
24210 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 70 79  Delete(db, pCopy
24220 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  );.}.../*.** Do 
24230 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f  a deep compariso
24240 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73  n of two express
24250 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75  ion trees.  Retu
24260 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 0a  rn 0 if the two.
24270 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  ** expressions a
24280 72 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69 64  re completely id
24290 65 6e 74 69 63 61 6c 2e 20 20 52 65 74 75 72 6e  entical.  Return
242a0 20 31 20 69 66 20 74 68 65 79 20 64 69 66 66 65   1 if they diffe
242b0 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20 43  r only.** by a C
242c0 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20  OLLATE operator 
242d0 61 74 20 74 68 65 20 74 6f 70 20 6c 65 76 65 6c  at the top level
242e0 2e 20 20 52 65 74 75 72 6e 20 32 20 69 66 20 74  .  Return 2 if t
242f0 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65  here are differe
24300 6e 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74 68  nces.** other th
24310 61 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  an the top-level
24320 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
24330 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20  r..**.** If any 
24340 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42  subelement of pB
24350 20 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65   has Expr.iTable
24360 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69  ==(-1) then it i
24370 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
24380 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f  compare equal to
24390 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65   an equivalent e
243a0 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74  lement in pA wit
243b0 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69  h Expr.iTable==i
243c0 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  Tab..**.** The p
243d0 41 20 73 69 64 65 20 6d 69 67 68 74 20 62 65 20  A side might be 
243e0 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45  using TK_REGISTE
243f0 52 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74  R.  If that is t
24400 68 65 20 63 61 73 65 20 61 6e 64 20 70 42 20 69  he case and pB i
24410 73 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e 67 20 54  s.** not using T
24420 4b 5f 52 45 47 49 53 54 45 52 20 62 75 74 20 69  K_REGISTER but i
24430 73 20 6f 74 68 65 72 77 69 73 65 20 65 71 75 69  s otherwise equi
24440 76 61 6c 65 6e 74 2c 20 74 68 65 6e 20 73 74 69  valent, then sti
24450 6c 6c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a  ll return 0..**.
24460 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69  ** Sometimes thi
24470 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
24480 65 74 75 72 6e 20 32 20 65 76 65 6e 20 69 66 20  eturn 2 even if 
24490 74 68 65 20 74 77 6f 20 65 78 70 72 65 73 73 69  the two expressi
244a0 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72  ons.** really ar
244b0 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 49  e equivalent.  I
244c0 66 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76  f we cannot prov
244d0 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65  e that the expre
244e0 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64  ssions are.** id
244f0 65 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74 75  entical, we retu
24500 72 6e 20 32 20 6a 75 73 74 20 74 6f 20 62 65 20  rn 2 just to be 
24510 73 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68 69  safe.  So if thi
24520 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
24530 75 72 6e 73 20 32 2c 20 74 68 65 6e 20 79 6f 75  urns 2, then you
24540 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b   do not really k
24550 6e 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e 20  now for certain 
24560 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78  if the two.** ex
24570 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68  pressions are th
24580 65 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66 20  e same.  But if 
24590 79 6f 75 20 67 65 74 20 61 20 30 20 6f 72 20 31  you get a 0 or 1
245a0 20 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f   return, then yo
245b0 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72 65  u.** can be sure
245c0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
245d0 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20   are the same.  
245e0 49 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77 68  In the places wh
245f0 65 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ere.** this rout
24600 69 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74 20  ine is used, it 
24610 64 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74 6f  does not hurt to
24620 20 67 65 74 20 61 6e 20 65 78 74 72 61 20 32 20   get an extra 2 
24630 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d  - that.** just m
24640 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 73  ight result in s
24650 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f  ome slightly slo
24660 77 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20 72  wer code.  But r
24670 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69  eturning.** an i
24680 6e 63 6f 72 72 65 63 74 20 30 20 6f 72 20 31 20  ncorrect 0 or 1 
24690 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20  could lead to a 
246a0 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  malfunction..*/.
246b0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
246c0 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41 2c  ompare(Expr *pA,
246d0 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74 20 69   Expr *pB, int i
246e0 54 61 62 29 7b 0a 20 20 75 33 32 20 63 6f 6d 62  Tab){.  u32 comb
246f0 69 6e 65 64 46 6c 61 67 73 3b 0a 20 20 69 66 28  inedFlags;.  if(
24700 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20   pA==0 || pB==0 
24710 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42  ){.    return pB
24720 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a 20 20  ==pA ? 0 : 2;.  
24730 7d 0a 20 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67  }.  combinedFlag
24740 73 20 3d 20 70 41 2d 3e 66 6c 61 67 73 20 7c 20  s = pA->flags | 
24750 70 42 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28  pB->flags;.  if(
24760 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26   combinedFlags &
24770 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a   EP_IntValue ){.
24780 20 20 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61      if( (pA->fla
24790 67 73 26 70 42 2d 3e 66 6c 61 67 73 26 45 50 5f  gs&pB->flags&EP_
247a0 49 6e 74 56 61 6c 75 65 29 21 3d 30 20 26 26 20  IntValue)!=0 && 
247b0 70 41 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d 70 42  pA->u.iValue==pB
247c0 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20 20  ->u.iValue ){.  
247d0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
247e0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32    }.    return 2
247f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e  ;.  }.  if( pA->
24800 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 7b 0a 20 20  op!=pB->op ){.  
24810 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b    if( pA->op==TK
24820 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69  _COLLATE && sqli
24830 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
24840 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2c 20 69 54  A->pLeft, pB, iT
24850 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72  ab)<2 ){.      r
24860 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
24870 20 20 20 69 66 28 20 70 42 2d 3e 6f 70 3d 3d 54     if( pB->op==T
24880 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c  K_COLLATE && sql
24890 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
248a0 70 41 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69  pA, pB->pLeft, i
248b0 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20  Tab)<2 ){.      
248c0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
248d0 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20      return 2;.  
248e0 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d  }.  if( pA->op!=
248f0 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d  TK_COLUMN && pA-
24900 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op!=TK_AGG_COLU
24910 4d 4e 20 26 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b  MN && pA->u.zTok
24920 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41  en ){.    if( pA
24930 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op==TK_FUNCTIO
24940 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  N ){.      if( s
24950 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 41  qlite3StrICmp(pA
24960 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75  ->u.zToken,pB->u
24970 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 20 72 65  .zToken)!=0 ) re
24980 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 65 6c 73  turn 2;.    }els
24990 65 20 69 66 28 20 73 74 72 63 6d 70 28 70 41 2d  e if( strcmp(pA-
249a0 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e  >u.zToken,pB->u.
249b0 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20  zToken)!=0 ){.  
249c0 20 20 20 20 72 65 74 75 72 6e 20 70 41 2d 3e 6f      return pA->o
249d0 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 3f 20  p==TK_COLLATE ? 
249e0 31 20 3a 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  1 : 2;.    }.  }
249f0 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67  .  if( (pA->flag
24a00 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29  s & EP_Distinct)
24a10 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45  !=(pB->flags & E
24a20 50 5f 44 69 73 74 69 6e 63 74 29 20 29 20 72 65  P_Distinct) ) re
24a30 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 41 4c  turn 2;.  if( AL
24a40 57 41 59 53 28 28 63 6f 6d 62 69 6e 65 64 46 6c  WAYS((combinedFl
24a50 61 67 73 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ags & EP_TokenOn
24a60 6c 79 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 69  ly)==0) ){.    i
24a70 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  f( combinedFlags
24a80 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20   & EP_xIsSelect 
24a90 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
24aa0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
24ab0 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74  ompare(pA->pLeft
24ac0 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61  , pB->pLeft, iTa
24ad0 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  b) ) return 2;. 
24ae0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
24af0 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52  prCompare(pA->pR
24b00 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74  ight, pB->pRight
24b10 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e  , iTab) ) return
24b20 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   2;.    if( sqli
24b30 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
24b40 72 65 28 70 41 2d 3e 78 2e 70 4c 69 73 74 2c 20  re(pA->x.pList, 
24b50 70 42 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61  pB->x.pList, iTa
24b60 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  b) ) return 2;. 
24b70 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 28 63     if( ALWAYS((c
24b80 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45  ombinedFlags & E
24b90 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 29 20 26  P_Reduced)==0) &
24ba0 26 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52  & pA->op!=TK_STR
24bb0 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ING ){.      if(
24bc0 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42   pA->iColumn!=pB
24bd0 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75  ->iColumn ) retu
24be0 72 6e 20 32 3b 0a 20 20 20 20 20 20 69 66 28 20  rn 2;.      if( 
24bf0 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e  pA->iTable!=pB->
24c00 69 54 61 62 6c 65 20 0a 20 20 20 20 20 20 20 26  iTable .       &
24c10 26 20 28 70 41 2d 3e 69 54 61 62 6c 65 21 3d 69  & (pA->iTable!=i
24c20 54 61 62 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d  Tab || NEVER(pB-
24c30 3e 69 54 61 62 6c 65 3e 3d 30 29 29 20 29 20 72  >iTable>=0)) ) r
24c40 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20  eturn 2;.    }. 
24c50 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
24c60 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
24c70 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a  two ExprList obj
24c80 65 63 74 73 2e 20 20 52 65 74 75 72 6e 20 30 20  ects.  Return 0 
24c90 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65 6e  if they are iden
24ca0 74 69 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f  tical and .** no
24cb0 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 79 20 64  n-zero if they d
24cc0 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79  iffer in any way
24cd0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73  ..**.** If any s
24ce0 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20  ubelement of pB 
24cf0 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d  has Expr.iTable=
24d00 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73  =(-1) then it is
24d10 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63   allowed.** to c
24d20 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20  ompare equal to 
24d30 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c  an equivalent el
24d40 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68  ement in pA with
24d50 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54   Expr.iTable==iT
24d60 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ab..**.** This r
24d70 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 74  outine might ret
24d80 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72  urn non-zero for
24d90 20 65 71 75 69 76 61 6c 65 6e 74 20 45 78 70 72   equivalent Expr
24da0 4c 69 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f  Lists.  The.** o
24db0 6e 6c 79 20 63 6f 6e 73 65 71 75 65 6e 63 65 20  nly consequence 
24dc0 77 69 6c 6c 20 62 65 20 64 69 73 61 62 6c 65 64  will be disabled
24dd0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20   optimizations. 
24de0 20 42 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e   But this routin
24df0 65 0a 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72 20  e.** must never 
24e00 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20  return 0 if the 
24e10 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a  two ExprList obj
24e20 65 63 74 73 20 61 72 65 20 64 69 66 66 65 72 65  ects are differe
24e30 6e 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66  nt, or.** a malf
24e40 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73  unction will res
24e50 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e  ult..**.** Two N
24e60 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20 61 72 65  ULL pointers are
24e70 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
24e80 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74  e the same.  But
24e90 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a   a NULL pointer.
24ea0 2a 2a 20 61 6c 77 61 79 73 20 64 69 66 66 65 72  ** always differ
24eb0 73 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c  s from a non-NUL
24ec0 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e  L pointer..*/.in
24ed0 74 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  t sqlite3ExprLis
24ee0 74 43 6f 6d 70 61 72 65 28 45 78 70 72 4c 69 73  tCompare(ExprLis
24ef0 74 20 2a 70 41 2c 20 45 78 70 72 4c 69 73 74 20  t *pA, ExprList 
24f00 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a  *pB, int iTab){.
24f10 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
24f20 41 3d 3d 30 20 26 26 20 70 42 3d 3d 30 20 29 20  A==0 && pB==0 ) 
24f30 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
24f40 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29  pA==0 || pB==0 )
24f50 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
24f60 20 70 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e   pA->nExpr!=pB->
24f70 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e 20 31  nExpr ) return 1
24f80 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
24f90 41 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  A->nExpr; i++){.
24fa0 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 41      Expr *pExprA
24fb0 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70   = pA->a[i].pExp
24fc0 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  r;.    Expr *pEx
24fd0 70 72 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70  prB = pB->a[i].p
24fe0 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 41  Expr;.    if( pA
24ff0 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
25000 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  !=pB->a[i].sortO
25010 72 64 65 72 20 29 20 72 65 74 75 72 6e 20 31 3b  rder ) return 1;
25020 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
25030 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78 70  ExprCompare(pExp
25040 72 41 2c 20 70 45 78 70 72 42 2c 20 69 54 61 62  rA, pExprB, iTab
25050 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
25060 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
25070 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
25080 75 65 20 69 66 20 77 65 20 63 61 6e 20 70 72 6f  ue if we can pro
25090 76 65 20 74 68 65 20 70 45 32 20 77 69 6c 6c 20  ve the pE2 will 
250a0 61 6c 77 61 79 73 20 62 65 20 74 72 75 65 20 69  always be true i
250b0 66 20 70 45 31 20 69 73 0a 2a 2a 20 74 72 75 65  f pE1 is.** true
250c0 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20  .  Return false 
250d0 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d  if we cannot com
250e0 70 6c 65 74 65 20 74 68 65 20 70 72 6f 6f 66 20  plete the proof 
250f0 6f 72 20 69 66 20 70 45 32 20 6d 69 67 68 74 0a  or if pE2 might.
25100 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20 20 45 78  ** be false.  Ex
25110 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  amples:.**.**   
25120 20 20 70 45 31 3a 20 78 3d 3d 35 20 20 20 20 20    pE1: x==5     
25130 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20    pE2: x==5     
25140 20 20 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20          Result: 
25150 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a  true.**     pE1:
25160 20 78 3e 30 20 20 20 20 20 20 20 20 70 45 32 3a   x>0        pE2:
25170 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20   x==5           
25180 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a    Result: false.
25190 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 32 31  **     pE1: x=21
251a0 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d 32 31         pE2: x=21
251b0 20 4f 52 20 79 3d 34 33 20 20 20 20 20 52 65 73   OR y=43     Res
251c0 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20  ult: true.**    
251d0 20 70 45 31 3a 20 78 21 3d 31 32 33 20 20 20 20   pE1: x!=123    
251e0 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e   pE2: x IS NOT N
251f0 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74  ULL    Result: t
25200 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  rue.**     pE1: 
25210 78 21 3d 3f 31 20 20 20 20 20 20 70 45 32 3a 20  x!=?1      pE2: 
25220 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20  x IS NOT NULL   
25230 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a   Result: true.**
25240 20 20 20 20 20 70 45 31 3a 20 78 20 49 53 20 4e       pE1: x IS N
25250 55 4c 4c 20 20 70 45 32 3a 20 78 20 49 53 20 4e  ULL  pE2: x IS N
25260 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c  OT NULL    Resul
25270 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20  t: false.**     
25280 70 45 31 3a 20 78 20 49 53 20 3f 32 20 20 20 20  pE1: x IS ?2    
25290 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55  pE2: x IS NOT NU
252a0 4c 4c 20 20 20 20 52 65 75 73 6c 74 3a 20 66 61  LL    Reuslt: fa
252b0 6c 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63  lse.**.** When c
252c0 6f 6d 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55  omparing TK_COLU
252d0 4d 4e 20 6e 6f 64 65 73 20 62 65 74 77 65 65 6e  MN nodes between
252e0 20 70 45 31 20 61 6e 64 20 70 45 32 2c 20 69 66   pE1 and pE2, if
252f0 20 70 45 32 20 68 61 73 0a 2a 2a 20 45 78 70 72   pE2 has.** Expr
25300 2e 69 54 61 62 6c 65 3c 30 20 74 68 65 6e 20 61  .iTable<0 then a
25310 73 73 75 6d 65 20 61 20 74 61 62 6c 65 20 6e 75  ssume a table nu
25320 6d 62 65 72 20 67 69 76 65 6e 20 62 79 20 69 54  mber given by iT
25330 61 62 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 69  ab..**.** When i
25340 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 20  n doubt, return 
25350 66 61 6c 73 65 2e 20 20 52 65 74 75 72 6e 69 6e  false.  Returnin
25360 67 20 74 72 75 65 20 6d 69 67 68 74 20 67 69 76  g true might giv
25370 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a  e a performance.
25380 2a 2a 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e 20  ** improvement. 
25390 20 52 65 74 75 72 6e 69 6e 67 20 66 61 6c 73 65   Returning false
253a0 20 6d 69 67 68 74 20 63 61 75 73 65 20 61 20 70   might cause a p
253b0 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63  erformance reduc
253c0 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69 74 20  tion, but.** it 
253d0 77 69 6c 6c 20 61 6c 77 61 79 73 20 67 69 76 65  will always give
253e0 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73   the correct ans
253f0 77 65 72 20 61 6e 64 20 69 73 20 68 65 6e 63 65  wer and is hence
25400 20 61 6c 77 61 79 73 20 73 61 66 65 2e 0a 2a 2f   always safe..*/
25410 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
25420 49 6d 70 6c 69 65 73 45 78 70 72 28 45 78 70 72  ImpliesExpr(Expr
25430 20 2a 70 45 31 2c 20 45 78 70 72 20 2a 70 45 32   *pE1, Expr *pE2
25440 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69  , int iTab){.  i
25450 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
25460 6d 70 61 72 65 28 70 45 31 2c 20 70 45 32 2c 20  mpare(pE1, pE2, 
25470 69 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20  iTab)==0 ){.    
25480 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
25490 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f  if( pE2->op==TK_
254a0 4f 52 0a 20 20 20 26 26 20 28 73 71 6c 69 74 65  OR.   && (sqlite
254b0 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72  3ExprImpliesExpr
254c0 28 70 45 31 2c 20 70 45 32 2d 3e 70 4c 65 66 74  (pE1, pE2->pLeft
254d0 2c 20 69 54 61 62 29 0a 20 20 20 20 20 20 20 20  , iTab).        
254e0 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 45       || sqlite3E
254f0 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70  xprImpliesExpr(p
25500 45 31 2c 20 70 45 32 2d 3e 70 52 69 67 68 74 2c  E1, pE2->pRight,
25510 20 69 54 61 62 29 20 29 0a 20 20 29 7b 0a 20 20   iTab) ).  ){.  
25520 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
25530 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54    if( pE2->op==T
25540 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20  K_NOTNULL.   && 
25550 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
25560 72 65 28 70 45 31 2d 3e 70 4c 65 66 74 2c 20 70  re(pE1->pLeft, p
25570 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29  E2->pLeft, iTab)
25580 3d 3d 30 0a 20 20 20 26 26 20 28 70 45 31 2d 3e  ==0.   && (pE1->
25590 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26 26  op!=TK_ISNULL &&
255a0 20 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 29   pE1->op!=TK_IS)
255b0 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
255c0 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
255d0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20   0;.}../*.** An 
255e0 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
255f0 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
25600 75 72 65 20 69 73 20 75 73 65 64 20 62 79 20 74  ure is used by t
25610 68 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a  he tree walker.*
25620 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  * to determine i
25630 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
25640 63 61 6e 20 62 65 20 65 76 61 6c 75 61 74 65 64  can be evaluated
25650 20 62 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f   by reference to
25660 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 6e   the.** index on
25670 6c 79 2c 20 77 69 74 68 6f 75 74 20 68 61 76 69  ly, without havi
25680 6e 67 20 74 6f 20 64 6f 20 61 20 73 65 61 72 63  ng to do a searc
25690 68 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73  h for the corres
256a0 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 61 62 6c 65  ponding.** table
256b0 20 65 6e 74 72 79 2e 20 20 54 68 65 20 49 64 78   entry.  The Idx
256c0 43 6f 76 65 72 2e 70 49 64 78 20 66 69 65 6c 64  Cover.pIdx field
256d0 20 69 73 20 74 68 65 20 69 6e 64 65 78 2e 20 20   is the index.  
256e0 49 64 78 43 6f 76 65 72 2e 69 43 75 72 0a 2a 2a  IdxCover.iCur.**
256f0 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 66   is the cursor f
25700 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  or the table..*/
25710 0a 73 74 72 75 63 74 20 49 64 78 43 6f 76 65 72  .struct IdxCover
25720 20 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78   {.  Index *pIdx
25730 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64  ;     /* The ind
25740 65 78 20 74 6f 20 62 65 20 74 65 73 74 65 64 20  ex to be tested 
25750 66 6f 72 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a  for coverage */.
25760 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20    int iCur;     
25770 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
25780 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
25790 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
257a0 74 6f 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  to the index */.
257b0 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  };../*.** Check 
257c0 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
257d0 61 72 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  are references t
257e0 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62  o columns in tab
257f0 6c 65 20 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e  le .** pWalker->
25800 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69 43 75  u.pIdxCover->iCu
25810 72 20 63 61 6e 20 62 65 20 73 61 74 69 73 66 69  r can be satisfi
25820 65 64 20 75 73 69 6e 67 20 74 68 65 20 69 6e 64  ed using the ind
25830 65 78 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 75  ex.** pWalker->u
25840 2e 70 49 64 78 43 6f 76 65 72 2d 3e 70 49 64 78  .pIdxCover->pIdx
25850 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25860 65 78 70 72 49 64 78 43 6f 76 65 72 28 57 61 6c  exprIdxCover(Wal
25870 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78  ker *pWalker, Ex
25880 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66  pr *pExpr){.  if
25890 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
258a0 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 70 45 78  COLUMN.   && pEx
258b0 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61 6c  pr->iTable==pWal
258c0 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72  ker->u.pIdxCover
258d0 2d 3e 69 43 75 72 0a 20 20 20 26 26 20 73 71 6c  ->iCur.   && sql
258e0 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65  ite3ColumnOfInde
258f0 78 28 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64  x(pWalker->u.pId
25900 78 43 6f 76 65 72 2d 3e 70 49 64 78 2c 20 70 45  xCover->pIdx, pE
25910 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3c 30 0a  xpr->iColumn)<0.
25920 20 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72    ){.    pWalker
25930 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 20  ->eCode = 1;.   
25940 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
25950 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
25960 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
25970 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
25980 20 69 66 20 61 6e 20 69 6e 64 65 78 20 70 49 64   if an index pId
25990 78 20 6f 6e 20 74 61 62 6c 65 20 77 69 74 68 20  x on table with 
259a0 63 75 72 73 6f 72 20 69 43 75 72 20 63 6f 6e 74  cursor iCur cont
259b0 61 69 6e 73 20 77 69 6c 6c 0a 2a 2a 20 74 68 65  ains will.** the
259c0 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
259d0 72 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20  r.  Return true 
259e0 69 66 20 74 68 65 20 69 6e 64 65 78 20 64 6f 65  if the index doe
259f0 73 20 63 6f 76 65 72 20 74 68 65 0a 2a 2a 20 65  s cover the.** e
25a00 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 66 61  xpression and fa
25a10 6c 73 65 20 69 66 20 74 68 65 20 70 45 78 70 72  lse if the pExpr
25a20 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 66 65   expression refe
25a30 72 65 6e 63 65 73 20 74 61 62 6c 65 20 63 6f 6c  rences table col
25a40 75 6d 6e 73 0a 2a 2a 20 74 68 61 74 20 61 72 65  umns.** that are
25a50 20 6e 6f 74 20 66 6f 75 6e 64 20 69 6e 20 74 68   not found in th
25a60 65 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a  e index pIdx..**
25a70 0a 2a 2a 20 41 6e 20 69 6e 64 65 78 20 63 6f 76  .** An index cov
25a80 65 72 69 6e 67 20 61 6e 20 65 78 70 72 65 73 73  ering an express
25a90 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ion means that t
25aa0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61  he expression ca
25ab0 6e 20 62 65 0a 2a 2a 20 65 76 61 6c 75 61 74 65  n be.** evaluate
25ac0 64 20 75 73 69 6e 67 20 6f 6e 6c 79 20 74 68 65  d using only the
25ad0 20 69 6e 64 65 78 20 61 6e 64 20 77 69 74 68 6f   index and witho
25ae0 75 74 20 68 61 76 69 6e 67 20 74 6f 20 6c 6f 6f  ut having to loo
25af0 6b 75 70 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65  kup the.** corre
25b00 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20 65  sponding table e
25b10 6e 74 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ntry..*/.int sql
25b20 69 74 65 33 45 78 70 72 43 6f 76 65 72 65 64 42  ite3ExprCoveredB
25b30 79 49 6e 64 65 78 28 0a 20 20 45 78 70 72 20 2a  yIndex(.  Expr *
25b40 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a  pExpr,        /*
25b50 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65   The index to be
25b60 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74   tested */.  int
25b70 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20   iCur,          
25b80 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6e   /* The cursor n
25b90 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 63 6f  umber for the co
25ba0 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c  rresponding tabl
25bb0 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  e */.  Index *pI
25bc0 64 78 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  dx         /* Th
25bd0 65 20 69 6e 64 65 78 20 74 68 61 74 20 6d 69 67  e index that mig
25be0 68 74 20 62 65 20 75 73 65 64 20 66 6f 72 20 63  ht be used for c
25bf0 6f 76 65 72 61 67 65 20 2a 2f 0a 29 7b 0a 20 20  overage */.){.  
25c00 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72 75  Walker w;.  stru
25c10 63 74 20 49 64 78 43 6f 76 65 72 20 78 63 6f 76  ct IdxCover xcov
25c20 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30  ;.  memset(&w, 0
25c30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20  , sizeof(w));.  
25c40 78 63 6f 76 2e 69 43 75 72 20 3d 20 69 43 75 72  xcov.iCur = iCur
25c50 3b 0a 20 20 78 63 6f 76 2e 70 49 64 78 20 3d 20  ;.  xcov.pIdx = 
25c60 70 49 64 78 3b 0a 20 20 77 2e 78 45 78 70 72 43  pIdx;.  w.xExprC
25c70 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 49 64  allback = exprId
25c80 78 43 6f 76 65 72 3b 0a 20 20 77 2e 75 2e 70 49  xCover;.  w.u.pI
25c90 64 78 43 6f 76 65 72 20 3d 20 26 78 63 6f 76 3b  dxCover = &xcov;
25ca0 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
25cb0 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 20  pr(&w, pExpr);. 
25cc0 20 72 65 74 75 72 6e 20 21 77 2e 65 43 6f 64 65   return !w.eCode
25cd0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  ;.}.../*.** An i
25ce0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
25cf0 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
25d00 72 65 20 69 73 20 75 73 65 64 20 62 79 20 74 68  re is used by th
25d10 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a  e tree walker.**
25d20 20 74 6f 20 63 6f 75 6e 74 20 72 65 66 65 72 65   to count refere
25d30 6e 63 65 73 20 74 6f 20 74 61 62 6c 65 20 63 6f  nces to table co
25d40 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 61 72 67  lumns in the arg
25d50 75 6d 65 6e 74 73 20 6f 66 20 61 6e 20 0a 2a 2a  uments of an .**
25d60 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
25d70 69 6f 6e 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f  ion, in order to
25d80 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a   implement the.*
25d90 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f  * sqlite3Functio
25da0 6e 54 68 69 73 53 72 63 28 29 20 72 6f 75 74 69  nThisSrc() routi
25db0 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 72  ne..*/.struct Sr
25dc0 63 43 6f 75 6e 74 20 7b 0a 20 20 53 72 63 4c 69  cCount {.  SrcLi
25dd0 73 74 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 4f  st *pSrc;   /* O
25de0 6e 65 20 70 61 72 74 69 63 75 6c 61 72 20 46 52  ne particular FR
25df0 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 61 20 6e  OM clause in a n
25e00 65 73 74 65 64 20 71 75 65 72 79 20 2a 2f 0a 20  ested query */. 
25e10 20 69 6e 74 20 6e 54 68 69 73 3b 20 20 20 20 20   int nThis;     
25e20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
25e30 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
25e40 75 6d 6e 73 20 69 6e 20 70 53 72 63 4c 69 73 74  umns in pSrcList
25e50 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74 68 65 72   */.  int nOther
25e60 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ;      /* Number
25e70 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
25e80 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74 68  o columns in oth
25e90 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 73 20  er FROM clauses 
25ea0 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75  */.};../*.** Cou
25eb0 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
25ec0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63   references to c
25ed0 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  olumns..*/.stati
25ee0 63 20 69 6e 74 20 65 78 70 72 53 72 63 43 6f 75  c int exprSrcCou
25ef0 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  nt(Walker *pWalk
25f00 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
25f10 7b 0a 20 20 2f 2a 20 54 68 65 20 4e 45 56 45 52  {.  /* The NEVER
25f20 28 29 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64  () on the second
25f30 20 74 65 72 6d 20 69 73 20 62 65 63 61 75 73 65   term is because
25f40 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e   sqlite3Function
25f50 55 73 65 73 54 68 69 73 53 72 63 28 29 0a 20 20  UsesThisSrc().  
25f60 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 63 61 6c  ** is always cal
25f70 6c 65 64 20 62 65 66 6f 72 65 20 73 71 6c 69 74  led before sqlit
25f80 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
25f90 72 65 67 61 74 65 73 28 29 20 61 6e 64 20 73 6f  regates() and so
25fa0 20 74 68 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c   the.  ** TK_COL
25fb0 55 4d 4e 73 20 68 61 76 65 20 6e 6f 74 20 79 65  UMNs have not ye
25fc0 74 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64  t been converted
25fd0 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c   into TK_AGG_COL
25fe0 55 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a 20 73 71  UMN.  If.  ** sq
25ff0 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65  lite3FunctionUse
26000 73 54 68 69 73 53 72 63 28 29 20 69 73 20 75 73  sThisSrc() is us
26010 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 69  ed differently i
26020 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74 68  n the future, th
26030 65 0a 20 20 2a 2a 20 4e 45 56 45 52 28 29 20 77  e.  ** NEVER() w
26040 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 72  ill need to be r
26050 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66 28  emoved. */.  if(
26060 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
26070 4f 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45 52 28 70  OLUMN || NEVER(p
26080 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
26090 5f 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20 20 20  _COLUMN) ){.    
260a0 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63  int i;.    struc
260b0 74 20 53 72 63 43 6f 75 6e 74 20 2a 70 20 3d 20  t SrcCount *p = 
260c0 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 72 63 43  pWalker->u.pSrcC
260d0 6f 75 6e 74 3b 0a 20 20 20 20 53 72 63 4c 69 73  ount;.    SrcLis
260e0 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  t *pSrc = p->pSr
260f0 63 3b 0a 20 20 20 20 69 6e 74 20 6e 53 72 63 20  c;.    int nSrc 
26100 3d 20 70 53 72 63 20 3f 20 70 53 72 63 2d 3e 6e  = pSrc ? pSrc->n
26110 53 72 63 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72  Src : 0;.    for
26120 28 69 3d 30 3b 20 69 3c 6e 53 72 63 3b 20 69 2b  (i=0; i<nSrc; i+
26130 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  +){.      if( pE
26140 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72  xpr->iTable==pSr
26150 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20  c->a[i].iCursor 
26160 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
26170 20 20 20 69 66 28 20 69 3c 6e 53 72 63 20 29 7b     if( i<nSrc ){
26180 0a 20 20 20 20 20 20 70 2d 3e 6e 54 68 69 73 2b  .      p->nThis+
26190 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  +;.    }else{.  
261a0 20 20 20 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b 3b      p->nOther++;
261b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
261c0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
261d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  ;.}../*.** Deter
261e0 6d 69 6e 65 20 69 66 20 61 6e 79 20 6f 66 20 74  mine if any of t
261f0 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  he arguments to 
26200 74 68 65 20 70 45 78 70 72 20 46 75 6e 63 74 69  the pExpr Functi
26210 6f 6e 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20  on reference.** 
26220 70 53 72 63 4c 69 73 74 2e 20 20 52 65 74 75 72  pSrcList.  Retur
26230 6e 20 74 72 75 65 20 69 66 20 74 68 65 79 20 64  n true if they d
26240 6f 2e 20 20 41 6c 73 6f 20 72 65 74 75 72 6e 20  o.  Also return 
26250 74 72 75 65 20 69 66 20 74 68 65 20 66 75 6e 63  true if the func
26260 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20 61  tion.** has no a
26270 72 67 75 6d 65 6e 74 73 20 6f 72 20 68 61 73 20  rguments or has 
26280 6f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20 61 72  only constant ar
26290 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e  guments.  Return
262a0 20 66 61 6c 73 65 20 69 66 20 70 45 78 70 72 0a   false if pExpr.
262b0 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 63 6f  ** references co
262c0 6c 75 6d 6e 73 20 62 75 74 20 6e 6f 74 20 63 6f  lumns but not co
262d0 6c 75 6d 6e 73 20 6f 66 20 74 61 62 6c 65 73 20  lumns of tables 
262e0 66 6f 75 6e 64 20 69 6e 20 70 53 72 63 4c 69 73  found in pSrcLis
262f0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
26300 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69  3FunctionUsesThi
26310 73 53 72 63 28 45 78 70 72 20 2a 70 45 78 70 72  sSrc(Expr *pExpr
26320 2c 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c  , SrcList *pSrcL
26330 69 73 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  ist){.  Walker w
26340 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 43 6f  ;.  struct SrcCo
26350 75 6e 74 20 63 6e 74 3b 0a 20 20 61 73 73 65 72  unt cnt;.  asser
26360 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
26370 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b  _AGG_FUNCTION );
26380 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c  .  memset(&w, 0,
26390 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77   sizeof(w));.  w
263a0 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
263b0 20 65 78 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20   exprSrcCount;. 
263c0 20 77 2e 75 2e 70 53 72 63 43 6f 75 6e 74 20 3d   w.u.pSrcCount =
263d0 20 26 63 6e 74 3b 0a 20 20 63 6e 74 2e 70 53 72   &cnt;.  cnt.pSr
263e0 63 20 3d 20 70 53 72 63 4c 69 73 74 3b 0a 20 20  c = pSrcList;.  
263f0 63 6e 74 2e 6e 54 68 69 73 20 3d 20 30 3b 0a 20  cnt.nThis = 0;. 
26400 20 63 6e 74 2e 6e 4f 74 68 65 72 20 3d 20 30 3b   cnt.nOther = 0;
26410 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
26420 70 72 4c 69 73 74 28 26 77 2c 20 70 45 78 70 72  prList(&w, pExpr
26430 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 72 65  ->x.pList);.  re
26440 74 75 72 6e 20 63 6e 74 2e 6e 54 68 69 73 3e 30  turn cnt.nThis>0
26450 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68 65 72 3d 3d   || cnt.nOther==
26460 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  0;.}../*.** Add 
26470 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
26480 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61   the pAggInfo->a
26490 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52 65  Col[] array.  Re
264a0 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
264b0 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65  f.** the new ele
264c0 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20  ment.  Return a 
264d0 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20  negative number 
264e0 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e  if malloc fails.
264f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
26500 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28  ddAggInfoColumn(
26510 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67  sqlite3 *db, Agg
26520 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20  Info *pInfo){.  
26530 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e  int i;.  pInfo->
26540 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 41 72  aCol = sqlite3Ar
26550 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20  rayAllocate(.   
26560 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20 20 70      db,.       p
26570 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20  Info->aCol,.    
26580 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d     sizeof(pInfo-
26590 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20  >aCol[0]),.     
265a0 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d    &pInfo->nColum
265b0 6e 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29  n,.       &i.  )
265c0 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20  ;.  return i;.} 
265d0 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61     ../*.** Add a
265e0 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
265f0 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  the pAggInfo->aF
26600 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20 52 65  unc[] array.  Re
26610 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
26620 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65  f.** the new ele
26630 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20  ment.  Return a 
26640 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20  negative number 
26650 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e  if malloc fails.
26660 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
26670 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 73 71  ddAggInfoFunc(sq
26680 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e  lite3 *db, AggIn
26690 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e  fo *pInfo){.  in
266a0 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46  t i;.  pInfo->aF
266b0 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 41 72 72  unc = sqlite3Arr
266c0 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20  ayAllocate(.    
266d0 20 20 20 64 62 2c 20 0a 20 20 20 20 20 20 20 70     db, .       p
266e0 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20  Info->aFunc,.   
266f0 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f      sizeof(pInfo
26700 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20  ->aFunc[0]),.   
26710 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e      &pInfo->nFun
26720 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29  c,.       &i.  )
26730 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20  ;.  return i;.} 
26740 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20     ../*.** This 
26750 69 73 20 74 68 65 20 78 45 78 70 72 43 61 6c 6c  is the xExprCall
26760 62 61 63 6b 20 66 6f 72 20 61 20 74 72 65 65 20  back for a tree 
26770 77 61 6c 6b 65 72 2e 20 20 49 74 20 69 73 20 75  walker.  It is u
26780 73 65 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d  sed to.** implem
26790 65 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 41  ent sqlite3ExprA
267a0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
267b0 28 29 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  ().  See sqlite3
267c0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
267d0 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64  gates.** for add
267e0 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
267f0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
26800 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67  nt analyzeAggreg
26810 61 74 65 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ate(Walker *pWal
26820 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
26830 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61  ){.  int i;.  Na
26840 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d  meContext *pNC =
26850 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b   pWalker->u.pNC;
26860 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
26870 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
26880 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c    SrcList *pSrcL
26890 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c  ist = pNC->pSrcL
268a0 69 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a  ist;.  AggInfo *
268b0 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e  pAggInfo = pNC->
268c0 70 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 73 77 69  pAggInfo;..  swi
268d0 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
268e0 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
268f0 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  G_COLUMN:.    ca
26900 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
26910 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
26920 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
26930 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  G_COLUMN );.    
26940 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
26950 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
26960 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65   );.      /* Che
26970 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
26980 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e   column is in on
26990 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20  e of the tables 
269a0 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20 20  in the FROM.    
269b0 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74    ** clause of t
269c0 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65  he aggregate que
269d0 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ry */.      if( 
269e0 41 4c 57 41 59 53 28 70 53 72 63 4c 69 73 74 21  ALWAYS(pSrcList!
269f0 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  =0) ){.        s
26a00 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
26a10 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63  em *pItem = pSrc
26a20 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20  List->a;.       
26a30 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63   for(i=0; i<pSrc
26a40 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
26a50 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
26a60 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
26a70 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20  nfo_col *pCol;. 
26a80 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
26a90 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
26aa0 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65  y(pExpr, EP_Toke
26ab0 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
26ac0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ) );.          i
26ad0 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
26ae0 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ==pItem->iCursor
26af0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26b00 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
26b10 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65  his point, it me
26b20 61 6e 73 20 74 68 61 74 20 70 45 78 70 72 20 72  ans that pExpr r
26b30 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
26b40 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
26b50 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 46  that is in the F
26b60 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
26b70 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  e aggregate quer
26b80 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  y.  .           
26b90 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20   **.            
26ba0 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79  ** Make an entry
26bb0 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
26bc0 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  in pAggInfo->aCo
26bd0 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20  l[] if there.   
26be0 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e           ** is n
26bf0 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72  ot an entry ther
26c00 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20  e already..     
26c10 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
26c20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
26c30 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20           pCol = 
26c40 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a  pAggInfo->aCol;.
26c50 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
26c60 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d  k=0; k<pAggInfo-
26c70 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70  >nColumn; k++, p
26c80 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
26c90 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
26ca0 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69  iTable==pExpr->i
26cb0 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20  Table &&.       
26cc0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
26cd0 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
26ce0 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
26cf0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
26d00 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
26d10 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
26d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
26d30 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e   (k>=pAggInfo->n
26d40 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20 20  Column).        
26d50 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61 64 64       && (k = add
26d60 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50  AggInfoColumn(pP
26d70 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e  arse->db, pAggIn
26d80 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20 20 20  fo))>=0 .       
26d90 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
26da0 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41        pCol = &pA
26db0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b  ggInfo->aCol[k];
26dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
26dd0 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78 70  Col->pTab = pExp
26de0 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  r->pTab;.       
26df0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61         pCol->iTa
26e00 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61  ble = pExpr->iTa
26e10 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ble;.           
26e20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e     pCol->iColumn
26e30 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
26e40 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
26e50 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b   pCol->iMem = ++
26e60 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
26e70 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
26e80 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20  ->iSorterColumn 
26e90 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
26ea0 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20      pCol->pExpr 
26eb0 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
26ec0 20 20 20 20 20 20 20 69 66 28 20 70 41 67 67 49         if( pAggI
26ed0 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b  nfo->pGroupBy ){
26ee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26ef0 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20   int j, n;.     
26f00 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 4c             ExprL
26f10 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67 67 49  ist *pGB = pAggI
26f20 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  nfo->pGroupBy;. 
26f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
26f40 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
26f50 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47 42  tem *pTerm = pGB
26f60 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ->a;.           
26f70 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45       n = pGB->nE
26f80 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
26f90 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
26fa0 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  n; j++, pTerm++)
26fb0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
26fc0 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
26fd0 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
26fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
26ff0 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( pE->op==TK_CO
27000 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61 62  LUMN && pE->iTab
27010 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  le==pExpr->iTabl
27020 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  e &&.           
27030 20 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69             pE->i
27040 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69  Column==pExpr->i
27050 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
27060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
27070 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
27080 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  n = j;.         
27090 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
270a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
270b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
270c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
270d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
270e0 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
270f0 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20  iSorterColumn<0 
27100 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
27110 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
27120 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66  Column = pAggInf
27130 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  o->nSortingColum
27140 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  n++;.           
27150 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
27160 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f   }.            /
27170 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77 20 61  * There is now a
27180 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45 78 70  n entry for pExp
27190 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  r in pAggInfo->a
271a0 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20 20  Col[] (either.  
271b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63            ** bec
271c0 61 75 73 65 20 69 74 20 77 61 73 20 74 68 65 72  ause it was ther
271d0 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65 63 61  e before or beca
271e0 75 73 65 20 77 65 20 6a 75 73 74 20 63 72 65 61  use we just crea
271f0 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20 20 20  ted it)..       
27200 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20       ** Convert 
27210 74 68 65 20 70 45 78 70 72 20 74 6f 20 62 65 20  the pExpr to be 
27220 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  a TK_AGG_COLUMN 
27230 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68 61  referring to tha
27240 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  t.            **
27250 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
27260 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20 20 20  ] entry..       
27270 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
27280 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72      ExprSetVVAPr
27290 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
272a0 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20  _NoReduce);.    
272b0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
272c0 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e  AggInfo = pAggIn
272d0 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo;.            
272e0 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41  pExpr->op = TK_A
272f0 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20  GG_COLUMN;.     
27300 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41         pExpr->iA
27310 67 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20 20 20  gg = (i16)k;.   
27320 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
27330 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65            } /* e
27340 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54 61 62  ndif pExpr->iTab
27350 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73  le==pItem->iCurs
27360 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20  or */.        } 
27370 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72  /* end loop over
27380 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20   pSrcList */.   
27390 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
273a0 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
273b0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
273c0 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  GG_FUNCTION: {. 
273d0 20 20 20 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e       if( (pNC->n
273e0 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 6e 41 67  cFlags & NC_InAg
273f0 67 46 75 6e 63 29 3d 3d 30 0a 20 20 20 20 20 20  gFunc)==0.      
27400 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c   && pWalker->wal
27410 6b 65 72 44 65 70 74 68 3d 3d 70 45 78 70 72 2d  kerDepth==pExpr-
27420 3e 6f 70 32 0a 20 20 20 20 20 20 29 7b 0a 20 20  >op2.      ){.  
27430 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
27440 6f 20 73 65 65 20 69 66 20 70 45 78 70 72 20 69  o see if pExpr i
27450 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66  s a duplicate of
27460 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65 67 61   another aggrega
27470 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  te .        ** f
27480 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20  unction that is 
27490 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70  already in the p
274a0 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72  AggInfo structur
274b0 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  e.        */.   
274c0 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
274d0 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20  nfo_func *pItem 
274e0 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  = pAggInfo->aFun
274f0 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  c;.        for(i
27500 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
27510 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65  nFunc; i++, pIte
27520 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
27530 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
27540 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45  ompare(pItem->pE
27550 78 70 72 2c 20 70 45 78 70 72 2c 20 2d 31 29 3d  xpr, pExpr, -1)=
27560 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
27570 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
27580 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
27590 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70 41         if( i>=pA
275a0 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b  ggInfo->nFunc ){
275b0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 45  .          /* pE
275c0 78 70 72 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e  xpr is original.
275d0 20 20 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e 74    Make a new ent
275e0 72 79 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e  ry in pAggInfo->
275f0 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20  aFunc[].        
27600 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75    */.          u
27610 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72  8 enc = ENC(pPar
27620 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20  se->db);.       
27630 20 20 20 69 20 3d 20 61 64 64 41 67 67 49 6e 66     i = addAggInf
27640 6f 46 75 6e 63 28 70 50 61 72 73 65 2d 3e 64 62  oFunc(pParse->db
27650 2c 20 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20  , pAggInfo);.   
27660 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20         if( i>=0 
27670 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
27680 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
27690 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
276a0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
276b0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
276c0 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61  m = &pAggInfo->a
276d0 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20  Func[i];.       
276e0 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70       pItem->pExp
276f0 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  r = pExpr;.     
27700 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d         pItem->iM
27710 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
27720 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Mem;.           
27730 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
27740 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
27750 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
27760 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
27770 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69  em->pFunc = sqli
27780 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
27790 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20  pParse->db,.    
277a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
277b0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
277c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
277d0 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69      pExpr->x.pLi
277e0 73 74 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st ? pExpr->x.pL
277f0 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20  ist->nExpr : 0, 
27800 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  enc, 0);.       
27810 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
27820 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69  flags & EP_Disti
27830 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nct ){.         
27840 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73       pItem->iDis
27850 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e  tinct = pParse->
27860 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
27870 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27880 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
27890 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a  iDistinct = -1;.
278a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
278b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
278c0 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d    }.        /* M
278d0 61 6b 65 20 70 45 78 70 72 20 70 6f 69 6e 74 20  ake pExpr point 
278e0 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  to the appropria
278f0 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  te pAggInfo->aFu
27900 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20 20  nc[] entry.     
27910 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
27920 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
27930 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
27940 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
27950 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20  duced) );.      
27960 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70    ExprSetVVAProp
27970 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e  erty(pExpr, EP_N
27980 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20  oReduce);.      
27990 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20    pExpr->iAgg = 
279a0 28 69 31 36 29 69 3b 0a 20 20 20 20 20 20 20 20  (i16)i;.        
279b0 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20  pExpr->pAggInfo 
279c0 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20  = pAggInfo;.    
279d0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
279e0 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rune;.      }els
279f0 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  e{.        retur
27a00 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
27a10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
27a20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
27a30 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69  ontinue;.}.stati
27a40 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67  c int analyzeAgg
27a50 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 28  regatesInSelect(
27a60 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
27a70 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
27a80 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
27a90 4d 45 54 45 52 28 70 57 61 6c 6b 65 72 29 3b 0a  METER(pWalker);.
27aa0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
27ab0 45 52 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 72  ER(pSelect);.  r
27ac0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
27ad0 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61  ue;.}../*.** Ana
27ae0 6c 79 7a 65 20 74 68 65 20 70 45 78 70 72 20 65  lyze the pExpr e
27af0 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e  xpression lookin
27b00 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20  g for aggregate 
27b10 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a  functions and.**
27b20 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74   for variables t
27b30 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61  hat need to be a
27b40 64 64 65 64 20 74 6f 20 41 67 67 49 6e 66 6f 20  dded to AggInfo 
27b50 6f 62 6a 65 63 74 20 74 68 61 74 20 70 4e 43 2d  object that pNC-
27b60 3e 70 41 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f 69  >pAggInfo.** poi
27b70 6e 74 73 20 74 6f 2e 20 20 41 64 64 69 74 69 6f  nts to.  Additio
27b80 6e 61 6c 20 65 6e 74 72 69 65 73 20 61 72 65 20  nal entries are 
27b90 6d 61 64 65 20 6f 6e 20 74 68 65 20 41 67 67 49  made on the AggI
27ba0 6e 66 6f 20 6f 62 6a 65 63 74 20 61 73 0a 2a 2a  nfo object as.**
27bb0 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a   necessary..**.*
27bc0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
27bd0 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61  hould only be ca
27be0 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 65  lled after the e
27bf0 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65  xpression has be
27c00 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62  en.** analyzed b
27c10 79 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  y sqlite3Resolve
27c20 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a  ExprNames()..*/.
27c30 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
27c40 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
27c50 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70  s(NameContext *p
27c60 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  NC, Expr *pExpr)
27c70 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
27c80 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69  memset(&w, 0, si
27c90 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45  zeof(w));.  w.xE
27ca0 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e  xprCallback = an
27cb0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 3b 0a  alyzeAggregate;.
27cc0 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
27cd0 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67  ack = analyzeAgg
27ce0 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 3b  regatesInSelect;
27cf0 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43  .  w.u.pNC = pNC
27d00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d  ;.  assert( pNC-
27d10 3e 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a  >pSrcList!=0 );.
27d20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
27d30 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a  r(&w, pExpr);.}.
27d40 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69  ./*.** Call sqli
27d50 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
27d60 67 72 65 67 61 74 65 73 28 29 20 66 6f 72 20 65  gregates() for e
27d70 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  very expression 
27d80 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73  in an.** express
27d90 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74 75 72  ion list.  Retur
27da0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
27db0 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  errors..**.** If
27dc0 20 61 6e 20 65 72 72 6f 72 20 69 73 20 66 6f 75   an error is fou
27dd0 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73  nd, the analysis
27de0 20 69 73 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a   is cut short..*
27df0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
27e00 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
27e10 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e  (NameContext *pN
27e20 43 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  C, ExprList *pLi
27e30 73 74 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78  st){.  struct Ex
27e40 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
27e50 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  em;.  int i;.  i
27e60 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
27e70 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
27e80 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74  >a, i=0; i<pList
27e90 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  ->nExpr; i++, pI
27ea0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  tem++){.      sq
27eb0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
27ec0 41 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c 20  Aggregates(pNC, 
27ed0 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
27ee0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
27ef0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e  * Allocate a sin
27f00 67 6c 65 20 6e 65 77 20 72 65 67 69 73 74 65 72  gle new register
27f10 20 66 6f 72 20 75 73 65 20 74 6f 20 68 6f 6c 64   for use to hold
27f20 20 73 6f 6d 65 20 69 6e 74 65 72 6d 65 64 69 61   some intermedia
27f30 74 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e  te result..*/.in
27f40 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  t sqlite3GetTemp
27f50 52 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73  Reg(Parse *pPars
27f60 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  e){.  if( pParse
27f70 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b  ->nTempReg==0 ){
27f80 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 2b 70 50  .    return ++pP
27f90 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a  arse->nMem;.  }.
27fa0 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d    return pParse-
27fb0 3e 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72  >aTempReg[--pPar
27fc0 73 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d  se->nTempReg];.}
27fd0 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61  ../*.** Dealloca
27fe0 74 65 20 61 20 72 65 67 69 73 74 65 72 2c 20 6d  te a register, m
27ff0 61 6b 69 6e 67 20 61 76 61 69 6c 61 62 6c 65 20  aking available 
28000 66 6f 72 20 72 65 75 73 65 20 66 6f 72 20 73 6f  for reuse for so
28010 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70  me other.** purp
28020 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ose..**.** If a 
28030 72 65 67 69 73 74 65 72 20 69 73 20 63 75 72 72  register is curr
28040 65 6e 74 6c 79 20 62 65 69 6e 67 20 75 73 65 64  ently being used
28050 20 62 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63   by the column c
28060 61 63 68 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  ache, then.** th
28070 65 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  e deallocation i
28080 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c  s deferred until
28090 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
280a0 65 20 6c 69 6e 65 20 74 68 61 74 20 75 73 65 73  e line that uses
280b0 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65 72  .** the register
280c0 20 62 65 63 6f 6d 65 73 20 73 74 61 6c 65 2e 0a   becomes stale..
280d0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
280e0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 50 61  eleaseTempReg(Pa
280f0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
28100 20 69 52 65 67 29 7b 0a 20 20 69 66 28 20 69 52   iReg){.  if( iR
28110 65 67 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54  eg && pParse->nT
28120 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65  empReg<ArraySize
28130 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65  (pParse->aTempRe
28140 67 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  g) ){.    int i;
28150 0a 20 20 20 20 73 74 72 75 63 74 20 79 43 6f 6c  .    struct yCol
28160 43 61 63 68 65 20 2a 70 3b 0a 20 20 20 20 66 6f  Cache *p;.    fo
28170 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
28180 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
28190 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
281a0 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
281b0 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69    if( p->iReg==i
281c0 52 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Reg ){.        p
281d0 2d 3e 74 65 6d 70 52 65 67 20 3d 20 31 3b 0a 20  ->tempReg = 1;. 
281e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
281f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
28200 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65   pParse->aTempRe
28210 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  g[pParse->nTempR
28220 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20  eg++] = iReg;.  
28230 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
28240 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74  ate or deallocat
28250 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65  e a block of nRe
28260 67 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65  g consecutive re
28270 67 69 73 74 65 72 73 0a 2a 2f 0a 69 6e 74 20 73  gisters.*/.int s
28280 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
28290 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
282a0 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69  , int nReg){.  i
282b0 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 20 3d 20 70  nt i, n;.  i = p
282c0 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
282d0 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  n = pParse->
282e0 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20 69 66 28  nRangeReg;.  if(
282f0 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20 20   nReg<=n ){.    
28300 61 73 73 65 72 74 28 20 21 75 73 65 64 41 73 43  assert( !usedAsC
28310 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73  olumnCache(pPars
28320 65 2c 20 69 2c 20 69 2b 6e 2d 31 29 20 29 3b 0a  e, i, i+n-1) );.
28330 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e      pParse->iRan
28340 67 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20  geReg += nReg;. 
28350 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67     pParse->nRang
28360 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20  eReg -= nReg;.  
28370 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20 70  }else{.    i = p
28380 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
28390 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
283a0 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72  += nReg;.  }.  r
283b0 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20  eturn i;.}.void 
283c0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
283d0 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70  mpRange(Parse *p
283e0 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c  Parse, int iReg,
283f0 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 73 71   int nReg){.  sq
28400 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65  lite3ExprCacheRe
28410 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 52 65  move(pParse, iRe
28420 67 2c 20 6e 52 65 67 29 3b 0a 20 20 69 66 28 20  g, nReg);.  if( 
28430 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61  nReg>pParse->nRa
28440 6e 67 65 52 65 67 20 29 7b 0a 20 20 20 20 70 50  ngeReg ){.    pP
28450 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
28460 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72  = nReg;.    pPar
28470 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d 20  se->iRangeReg = 
28480 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  iReg;.  }.}../*.
28490 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d 70  ** Mark all temp
284a0 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20  orary registers 
284b0 61 73 20 62 65 69 6e 67 20 75 6e 61 76 61 69 6c  as being unavail
284c0 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 2e 0a  able for reuse..
284d0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
284e0 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65  learTempRegCache
284f0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
28500 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  .  pParse->nTemp
28510 52 65 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Reg = 0;.  pPars
28520 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 30  e->nRangeReg = 0
28530 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 69 64  ;.}../*.** Valid
28540 61 74 65 20 74 68 61 74 20 6e 6f 20 74 65 6d 70  ate that no temp
28550 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 66  orary register f
28560 61 6c 6c 73 20 77 69 74 68 69 6e 20 74 68 65 20  alls within the 
28570 72 61 6e 67 65 20 6f 66 0a 2a 2a 20 69 46 69 72  range of.** iFir
28580 73 74 2e 2e 69 4c 61 73 74 2c 20 69 6e 63 6c 75  st..iLast, inclu
28590 73 69 76 65 2e 20 20 54 68 69 73 20 72 6f 75 74  sive.  This rout
285a0 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
285b0 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 73 73   from within ass
285c0 65 72 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65  ert().** stateme
285d0 6e 74 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  nts..*/.#ifdef S
285e0 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e 74 20  QLITE_DEBUG.int 
285f0 73 71 6c 69 74 65 33 4e 6f 54 65 6d 70 73 49 6e  sqlite3NoTempsIn
28600 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61  Range(Parse *pPa
28610 72 73 65 2c 20 69 6e 74 20 69 46 69 72 73 74 2c  rse, int iFirst,
28620 20 69 6e 74 20 69 4c 61 73 74 29 7b 0a 20 20 69   int iLast){.  i
28630 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 50 61 72  nt i;.  if( pPar
28640 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3e 30 0a  se->nRangeReg>0.
28650 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e 69 52     && pParse->iR
28660 61 6e 67 65 52 65 67 2b 70 50 61 72 73 65 2d 3e  angeReg+pParse->
28670 6e 52 61 6e 67 65 52 65 67 3c 69 4c 61 73 74 0a  nRangeReg<iLast.
28680 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e 69 52     && pParse->iR
28690 61 6e 67 65 52 65 67 3e 3d 69 46 69 72 73 74 0a  angeReg>=iFirst.
286a0 20 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e    ){.     return
286b0 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d   0;.  }.  for(i=
286c0 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 65  0; i<pParse->nTe
286d0 6d 70 52 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  mpReg; i++){.   
286e0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 54 65   if( pParse->aTe
286f0 6d 70 52 65 67 5b 69 5d 3e 3d 69 46 69 72 73 74  mpReg[i]>=iFirst
28700 20 26 26 20 70 50 61 72 73 65 2d 3e 61 54 65 6d   && pParse->aTem
28710 70 52 65 67 5b 69 5d 3c 3d 69 4c 61 73 74 20 29  pReg[i]<=iLast )
28720 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
28730 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
28740 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
28750 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
28760 20 2a 2f 0a                                       */.