/ Hex Artifact Content
Login

Artifact 57fa7eb870a37c69a40cfe4c25b062e37fea12b7:


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 23  eturn addr;.}..#
2710: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  if SQLITE_MAX_EX
2720: 50 52 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a  PR_DEPTH>0./*.**
2730: 20 43 68 65 63 6b 20 74 68 61 74 20 61 72 67 75   Check that argu
2740: 6d 65 6e 74 20 6e 48 65 69 67 68 74 20 69 73 20  ment nHeight is 
2750: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
2760: 61 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  al to the maximu
2770: 6d 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  m.** expression 
2780: 64 65 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49  depth allowed. I
2790: 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61  f it is not, lea
27a0: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
27b0: 61 67 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65  age in.** pParse
27c0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
27d0: 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28  ExprCheckHeight(
27e0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
27f0: 6e 74 20 6e 48 65 69 67 68 74 29 7b 0a 20 20 69  nt nHeight){.  i
2800: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2810: 4b 3b 0a 20 20 69 6e 74 20 6d 78 48 65 69 67 68  K;.  int mxHeigh
2820: 74 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  t = pParse->db->
2830: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
2840: 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b  MIT_EXPR_DEPTH];
2850: 0a 20 20 69 66 28 20 6e 48 65 69 67 68 74 3e 6d  .  if( nHeight>m
2860: 78 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20 73  xHeight ){.    s
2870: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2880: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22  Parse, .       "
2890: 45 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  Expression tree 
28a0: 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61  is too large (ma
28b0: 78 69 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22  ximum depth %d)"
28c0: 2c 20 6d 78 48 65 69 67 68 74 0a 20 20 20 20 29  , mxHeight.    )
28d0: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
28e0: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  E_ERROR;.  }.  r
28f0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
2900: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  The following th
2910: 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68  ree functions, h
2920: 65 69 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68  eightOfExpr(), h
2930: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
2940: 29 0a 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f  ).** and heightO
2950: 66 53 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75  fSelect(), are u
2960: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
2970: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69   the maximum hei
2980: 67 68 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78  ght.** of any ex
2990: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65  pression tree re
29a0: 66 65 72 65 6e 63 65 64 20 62 79 20 74 68 65 20  ferenced by the 
29b0: 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
29c0: 20 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   as the.** first
29d0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
29e0: 20 49 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d   If this maximum
29f0: 20 68 65 69 67 68 74 20 69 73 20 67 72 65 61 74   height is great
2a00: 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
2a10: 65 6e 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65  ent value pointe
2a20: 64 0a 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69  d.** to by pnHei
2a30: 67 68 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20  ght, the second 
2a40: 70 61 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20  parameter, then 
2a50: 73 65 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f  set *pnHeight to
2a60: 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a   that.** value..
2a70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  */.static void h
2a80: 65 69 67 68 74 4f 66 45 78 70 72 28 45 78 70 72  eightOfExpr(Expr
2a90: 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67   *p, int *pnHeig
2aa0: 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  ht){.  if( p ){.
2ab0: 20 20 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67      if( p->nHeig
2ac0: 68 74 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a  ht>*pnHeight ){.
2ad0: 20 20 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20        *pnHeight 
2ae0: 3d 20 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20  = p->nHeight;.  
2af0: 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63    }.  }.}.static
2b00: 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78   void heightOfEx
2b10: 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20  prList(ExprList 
2b20: 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68  *p, int *pnHeigh
2b30: 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  t){.  if( p ){. 
2b40: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
2b50: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70  r(i=0; i<p->nExp
2b60: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68  r; i++){.      h
2b70: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61  eightOfExpr(p->a
2b80: 5b 69 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69  [i].pExpr, pnHei
2b90: 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ght);.    }.  }.
2ba0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  }.static void he
2bb0: 69 67 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c  ightOfSelect(Sel
2bc0: 65 63 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48  ect *p, int *pnH
2bd0: 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20  eight){.  if( p 
2be0: 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  ){.    heightOfE
2bf0: 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70  xpr(p->pWhere, p
2c00: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
2c10: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 48  ightOfExpr(p->pH
2c20: 61 76 69 6e 67 2c 20 70 6e 48 65 69 67 68 74 29  aving, pnHeight)
2c30: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
2c40: 70 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e  pr(p->pLimit, pn
2c50: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
2c60: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4f 66  ghtOfExpr(p->pOf
2c70: 66 73 65 74 2c 20 70 6e 48 65 69 67 68 74 29 3b  fset, pnHeight);
2c80: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
2c90: 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c  rList(p->pEList,
2ca0: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
2cb0: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
2cc0: 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e  (p->pGroupBy, pn
2cd0: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
2ce0: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
2cf0: 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69  >pOrderBy, pnHei
2d00: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
2d10: 4f 66 53 65 6c 65 63 74 28 70 2d 3e 70 50 72 69  OfSelect(p->pPri
2d20: 6f 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  or, pnHeight);. 
2d30: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
2d40: 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74  the Expr.nHeight
2d50: 20 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68 65   variable in the
2d60: 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
2d70: 64 20 61 73 20 61 6e 20 0a 2a 2a 20 61 72 67 75  d as an .** argu
2d80: 6d 65 6e 74 2e 20 41 6e 20 65 78 70 72 65 73 73  ment. An express
2d90: 69 6f 6e 20 77 69 74 68 20 6e 6f 20 63 68 69 6c  ion with no chil
2da0: 64 72 65 6e 2c 20 45 78 70 72 2e 70 4c 69 73 74  dren, Expr.pList
2db0: 20 6f 72 20 0a 2a 2a 20 45 78 70 72 2e 70 53 65   or .** Expr.pSe
2dc0: 6c 65 63 74 20 6d 65 6d 62 65 72 20 68 61 73 20  lect member has 
2dd0: 61 20 68 65 69 67 68 74 20 6f 66 20 31 2e 20 41  a height of 1. A
2de0: 6e 79 20 6f 74 68 65 72 20 65 78 70 72 65 73 73  ny other express
2df0: 69 6f 6e 0a 2a 2a 20 68 61 73 20 61 20 68 65 69  ion.** has a hei
2e00: 67 68 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65  ght equal to the
2e10: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20   maximum height 
2e20: 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 0a 2a 2a  of any other .**
2e30: 20 72 65 66 65 72 65 6e 63 65 64 20 45 78 70 72   referenced Expr
2e40: 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a   plus one..**.**
2e50: 20 41 6c 73 6f 20 70 72 6f 70 61 67 61 74 65 20   Also propagate 
2e60: 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61  EP_Propagate fla
2e70: 67 73 20 75 70 20 66 72 6f 6d 20 45 78 70 72 2e  gs up from Expr.
2e80: 78 2e 70 4c 69 73 74 20 74 6f 20 45 78 70 72 2e  x.pList to Expr.
2e90: 66 6c 61 67 73 2c 0a 2a 2a 20 69 66 20 61 70 70  flags,.** if app
2ea0: 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61  ropriate..*/.sta
2eb0: 74 69 63 20 76 6f 69 64 20 65 78 70 72 53 65 74  tic void exprSet
2ec0: 48 65 69 67 68 74 28 45 78 70 72 20 2a 70 29 7b  Height(Expr *p){
2ed0: 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d  .  int nHeight =
2ee0: 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78   0;.  heightOfEx
2ef0: 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48  pr(p->pLeft, &nH
2f00: 65 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74  eight);.  height
2f10: 4f 66 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74  OfExpr(p->pRight
2f20: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 69  , &nHeight);.  i
2f30: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
2f40: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
2f50: 63 74 29 20 29 7b 0a 20 20 20 20 68 65 69 67 68  ct) ){.    heigh
2f60: 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 78 2e 70  tOfSelect(p->x.p
2f70: 53 65 6c 65 63 74 2c 20 26 6e 48 65 69 67 68 74  Select, &nHeight
2f80: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
2f90: 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20  ->x.pList ){.   
2fa0: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
2fb0: 74 28 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e  t(p->x.pList, &n
2fc0: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 70 2d 3e  Height);.    p->
2fd0: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70  flags |= EP_Prop
2fe0: 61 67 61 74 65 20 26 20 73 71 6c 69 74 65 33 45  agate & sqlite3E
2ff0: 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e  xprListFlags(p->
3000: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20  x.pList);.  }.  
3010: 70 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e 48 65  p->nHeight = nHe
3020: 69 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a  ight + 1;.}../*.
3030: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e  ** Set the Expr.
3040: 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65  nHeight variable
3050: 20 75 73 69 6e 67 20 74 68 65 20 65 78 70 72 53   using the exprS
3060: 65 74 48 65 69 67 68 74 28 29 20 66 75 6e 63 74  etHeight() funct
3070: 69 6f 6e 2e 20 49 66 0a 2a 2a 20 74 68 65 20 68  ion. If.** the h
3080: 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72  eight is greater
3090: 20 74 68 61 6e 20 74 68 65 20 6d 61 78 69 6d 75   than the maximu
30a0: 6d 20 61 6c 6c 6f 77 65 64 20 65 78 70 72 65 73  m allowed expres
30b0: 73 69 6f 6e 20 64 65 70 74 68 2c 0a 2a 2a 20 6c  sion depth,.** l
30c0: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  eave an error in
30d0: 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 41   pParse..**.** A
30e0: 6c 73 6f 20 70 72 6f 70 61 67 61 74 65 20 61 6c  lso propagate al
30f0: 6c 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66  l EP_Propagate f
3100: 6c 61 67 73 20 66 72 6f 6d 20 74 68 65 20 45 78  lags from the Ex
3110: 70 72 2e 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a  pr.x.pList into.
3120: 2a 2a 20 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a  ** Expr.flags. .
3130: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
3140: 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46  xprSetHeightAndF
3150: 6c 61 67 73 28 50 61 72 73 65 20 2a 70 50 61 72  lags(Parse *pPar
3160: 73 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  se, Expr *p){.  
3170: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
3180: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 65 78 70   ) return;.  exp
3190: 72 53 65 74 48 65 69 67 68 74 28 70 29 3b 0a 20  rSetHeight(p);. 
31a0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
31b0: 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20  kHeight(pParse, 
31c0: 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 7d 0a 0a  p->nHeight);.}..
31d0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
31e0: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20   maximum height 
31f0: 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  of any expressio
3200: 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65  n tree reference
3210: 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c 65  d.** by the sele
3220: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  ct statement pas
3230: 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
3240: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
3250: 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67  e3SelectExprHeig
3260: 68 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  ht(Select *p){. 
3270: 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30   int nHeight = 0
3280: 3b 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65  ;.  heightOfSele
3290: 63 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29 3b  ct(p, &nHeight);
32a0: 0a 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67 68  .  return nHeigh
32b0: 74 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 41 42  t;.}.#else /* AB
32c0: 4f 56 45 3a 20 20 48 65 69 67 68 74 20 65 6e 66  OVE:  Height enf
32d0: 6f 72 63 65 6d 65 6e 74 20 65 6e 61 62 6c 65 64  orcement enabled
32e0: 2e 20 20 42 45 4c 4f 57 3a 20 48 65 69 67 68 74  .  BELOW: Height
32f0: 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 6f 66 66   enforcement off
3300: 20 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 70 61 67   */./*.** Propag
3310: 61 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61  ate all EP_Propa
3320: 67 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d 20  gate flags from 
3330: 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74  the Expr.x.pList
3340: 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c   into.** Expr.fl
3350: 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  ags. .*/.void sq
3360: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
3370: 68 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73 65  htAndFlags(Parse
3380: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
3390: 70 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 70  p){.  if( p && p
33a0: 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 21 45 78  ->x.pList && !Ex
33b0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
33c0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
33d0: 7b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c  {.    p->flags |
33e0: 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26  = EP_Propagate &
33f0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
3400: 46 6c 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74  Flags(p->x.pList
3410: 29 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65  );.  }.}.#define
3420: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 79   exprSetHeight(y
3430: 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ).#endif /* SQLI
3440: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
3450: 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  H>0 */../*.** Th
3460: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
3470: 65 20 63 6f 72 65 20 61 6c 6c 6f 63 61 74 6f 72  e core allocator
3480: 20 66 6f 72 20 45 78 70 72 20 6e 6f 64 65 73 2e   for Expr nodes.
3490: 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  .**.** Construct
34a0: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
34b0: 6e 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72  n node and retur
34c0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  n a pointer to i
34d0: 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f  t.  Memory.** fo
34e0: 72 20 74 68 69 73 20 6e 6f 64 65 20 61 6e 64 20  r this node and 
34f0: 66 6f 72 20 74 68 65 20 70 54 6f 6b 65 6e 20 61  for the pToken a
3500: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 73 69 6e  rgument is a sin
3510: 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  gle allocation.*
3520: 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  * obtained from 
3530: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28  sqlite3DbMalloc(
3540: 29 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  ).  The calling 
3550: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72  function.** is r
3560: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d  esponsible for m
3570: 61 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e  aking sure the n
3580: 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67  ode eventually g
3590: 65 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a  ets freed..**.**
35a0: 20 49 66 20 64 65 71 75 6f 74 65 20 69 73 20 74   If dequote is t
35b0: 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 74 6f  rue, then the to
35c0: 6b 65 6e 20 28 69 66 20 69 74 20 65 78 69 73 74  ken (if it exist
35d0: 73 29 20 69 73 20 64 65 71 75 6f 74 65 64 2e 0a  s) is dequoted..
35e0: 2a 2a 20 49 66 20 64 65 71 75 6f 74 65 20 69 73  ** If dequote is
35f0: 20 66 61 6c 73 65 2c 20 6e 6f 20 64 65 71 75 6f   false, no dequo
3600: 74 69 6e 67 20 69 73 20 70 65 72 66 6f 72 6d 65  ting is performe
3610: 64 2e 20 20 54 68 65 20 64 65 51 75 6f 74 65 0a  d.  The deQuote.
3620: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
3630: 69 67 6e 6f 72 65 64 20 69 66 20 70 54 6f 6b 65  ignored if pToke
3640: 6e 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20  n is NULL or if 
3650: 74 68 65 20 74 6f 6b 65 6e 20 64 6f 65 73 20 6e  the token does n
3660: 6f 74 0a 2a 2a 20 61 70 70 65 61 72 20 74 6f 20  ot.** appear to 
3670: 62 65 20 71 75 6f 74 65 64 2e 20 20 49 66 20 74  be quoted.  If t
3680: 68 65 20 71 75 6f 74 65 73 20 77 65 72 65 20 6f  he quotes were o
3690: 66 20 74 68 65 20 66 6f 72 6d 20 22 2e 2e 2e 22  f the form "..."
36a0: 20 28 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 29   (double-quotes)
36b0: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 45 50 5f  .** then the EP_
36c0: 44 62 6c 51 75 6f 74 65 64 20 66 6c 61 67 20 69  DblQuoted flag i
36d0: 73 20 73 65 74 20 6f 6e 20 74 68 65 20 65 78 70  s set on the exp
36e0: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a  ression node..**
36f0: 0a 2a 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65  .** Special case
3700: 3a 20 20 49 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54  :  If op==TK_INT
3710: 45 47 45 52 20 61 6e 64 20 70 54 6f 6b 65 6e 20  EGER and pToken 
3720: 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69  points to a stri
3730: 6e 67 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62  ng that.** can b
3740: 65 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74  e translated int
3750: 6f 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  o a 32-bit integ
3760: 65 72 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b  er, then the tok
3770: 65 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f  en is not.** sto
3780: 72 65 64 20 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e  red in u.zToken.
3790: 20 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 69    Instead, the i
37a0: 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 69 73  nteger values is
37b0: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
37c0: 20 75 2e 69 56 61 6c 75 65 20 61 6e 64 20 74 68   u.iValue and th
37d0: 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c  e EP_IntValue fl
37e0: 61 67 20 69 73 20 73 65 74 2e 20 20 4e 6f 20 65  ag is set.  No e
37f0: 78 74 72 61 20 73 74 6f 72 61 67 65 0a 2a 2a 20  xtra storage.** 
3800: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  is allocated to 
3810: 68 6f 6c 64 20 74 68 65 20 69 6e 74 65 67 65 72  hold the integer
3820: 20 74 65 78 74 20 61 6e 64 20 74 68 65 20 64 65   text and the de
3830: 71 75 6f 74 65 20 66 6c 61 67 20 69 73 20 69 67  quote flag is ig
3840: 6e 6f 72 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  nored..*/.Expr *
3850: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
3860: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
3870: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
3880: 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65  andle for sqlite
3890: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20  3DbMallocZero() 
38a0: 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f  (may be null) */
38b0: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
38c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
38d0: 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20  pression opcode 
38e0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e  */.  const Token
38f0: 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 2f 2a 20   *pToken,    /* 
3900: 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20  Token argument. 
3910: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
3920: 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20  /.  int dequote 
3930: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3940: 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20 2a  rue to dequote *
3950: 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  /.){.  Expr *pNe
3960: 77 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  w;.  int nExtra 
3970: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56 61 6c 75  = 0;.  int iValu
3980: 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  e = 0;..  assert
3990: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( db!=0 );.  if(
39a0: 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69   pToken ){.    i
39b0: 66 28 20 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45  f( op!=TK_INTEGE
39c0: 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d  R || pToken->z==
39d0: 30 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73  0.          || s
39e0: 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 70  qlite3GetInt32(p
39f0: 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56 61 6c 75  Token->z, &iValu
3a00: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  e)==0 ){.      n
3a10: 45 78 74 72 61 20 3d 20 70 54 6f 6b 65 6e 2d 3e  Extra = pToken->
3a20: 6e 2b 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  n+1;.      asser
3a30: 74 28 20 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a  t( iValue>=0 );.
3a40: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77      }.  }.  pNew
3a50: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
3a60: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
3a70: 6f 66 28 45 78 70 72 29 2b 6e 45 78 74 72 61 29  of(Expr)+nExtra)
3a80: 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ;.  if( pNew ){.
3a90: 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c      memset(pNew,
3aa0: 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29   0, sizeof(Expr)
3ab0: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20  );.    pNew->op 
3ac0: 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e  = (u8)op;.    pN
3ad0: 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20  ew->iAgg = -1;. 
3ae0: 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b     if( pToken ){
3af0: 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78 74 72  .      if( nExtr
3b00: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  a==0 ){.        
3b10: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pNew->flags |= E
3b20: 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20  P_IntValue;.    
3b30: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c      pNew->u.iVal
3b40: 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20  ue = iValue;.   
3b50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3b60: 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20    int c;.       
3b70: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   pNew->u.zToken 
3b80: 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31  = (char*)&pNew[1
3b90: 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ];.        asser
3ba0: 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20  t( pToken->z!=0 
3bb0: 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20  || pToken->n==0 
3bc0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
3bd0: 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70  Token->n ) memcp
3be0: 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  y(pNew->u.zToken
3bf0: 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f  , pToken->z, pTo
3c00: 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20  ken->n);.       
3c10: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b   pNew->u.zToken[
3c20: 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a  pToken->n] = 0;.
3c30: 20 20 20 20 20 20 20 20 69 66 28 20 64 65 71 75          if( dequ
3c40: 6f 74 65 20 26 26 20 6e 45 78 74 72 61 3e 3d 33  ote && nExtra>=3
3c50: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26   .             &
3c60: 26 20 28 28 63 20 3d 20 70 54 6f 6b 65 6e 2d 3e  & ((c = pToken->
3c70: 7a 5b 30 5d 29 3d 3d 27 5c 27 27 20 7c 7c 20 63  z[0])=='\'' || c
3c80: 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5b 27 20  =='"' || c=='[' 
3c90: 7c 7c 20 63 3d 3d 27 60 27 29 20 29 7b 0a 20 20  || c=='`') ){.  
3ca0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
3cb0: 65 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a  equote(pNew->u.z
3cc0: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  Token);.        
3cd0: 20 20 69 66 28 20 63 3d 3d 27 22 27 20 29 20 70    if( c=='"' ) p
3ce0: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
3cf0: 5f 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20  _DblQuoted;.    
3d00: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
3d10: 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d    }.#if SQLITE_M
3d20: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a  AX_EXPR_DEPTH>0.
3d30: 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67 68      pNew->nHeigh
3d40: 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20 0a  t = 1;.#endif  .
3d50: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
3d60: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  w;.}../*.** Allo
3d70: 63 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65  cate a new expre
3d80: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d 20  ssion node from 
3d90: 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  a zero-terminate
3da0: 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61 73  d token that has
3db0: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e  .** already been
3dc0: 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78   dequoted..*/.Ex
3dd0: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28  pr *sqlite3Expr(
3de0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
3df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
3e00: 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ndle for sqlite3
3e10: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28  DbMallocZero() (
3e20: 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a  may be null) */.
3e30: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
3e40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
3e50: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
3e60: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
3e70: 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20 54  zToken      /* T
3e80: 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20  oken argument.  
3e90: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
3ea0: 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a 20  .){.  Token x;. 
3eb0: 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20   x.z = zToken;. 
3ec0: 20 78 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20 3f 20   x.n = zToken ? 
3ed0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
3ee0: 7a 54 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20 20 72  zToken) : 0;.  r
3ef0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
3f00: 72 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26  rAlloc(db, op, &
3f10: 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  x, 0);.}../*.** 
3f20: 41 74 74 61 63 68 20 73 75 62 74 72 65 65 73 20  Attach subtrees 
3f30: 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74  pLeft and pRight
3f40: 20 74 6f 20 74 68 65 20 45 78 70 72 20 6e 6f 64   to the Expr nod
3f50: 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49  e pRoot..**.** I
3f60: 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68  f pRoot==NULL th
3f70: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20  at means that a 
3f80: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
3f90: 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
3fa0: 72 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74  rred..** In that
3fb0: 20 63 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68   case, delete th
3fc0: 65 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74  e subtrees pLeft
3fd0: 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a   and pRight..*/.
3fe0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
3ff0: 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28 0a  AttachSubtrees(.
4000: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
4010: 20 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20   Expr *pRoot,.  
4020: 45 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45  Expr *pLeft,.  E
4030: 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20  xpr *pRight.){. 
4040: 20 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b   if( pRoot==0 ){
4050: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
4060: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
4070: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
4080: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74  Delete(db, pLeft
4090: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
40a0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69  prDelete(db, pRi
40b0: 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ght);.  }else{. 
40c0: 20 20 20 69 66 28 20 70 52 69 67 68 74 20 29 7b     if( pRight ){
40d0: 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52  .      pRoot->pR
40e0: 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20  ight = pRight;. 
40f0: 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67       pRoot->flag
4100: 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74  s |= EP_Propagat
4110: 65 20 26 20 70 52 69 67 68 74 2d 3e 66 6c 61 67  e & pRight->flag
4120: 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  s;.    }.    if(
4130: 20 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20   pLeft ){.      
4140: 70 52 6f 6f 74 2d 3e 70 4c 65 66 74 20 3d 20 70  pRoot->pLeft = p
4150: 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f  Left;.      pRoo
4160: 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50  t->flags |= EP_P
4170: 72 6f 70 61 67 61 74 65 20 26 20 70 4c 65 66 74  ropagate & pLeft
4180: 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20  ->flags;.    }. 
4190: 20 20 20 65 78 70 72 53 65 74 48 65 69 67 68 74     exprSetHeight
41a0: 28 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  (pRoot);.  }.}..
41b0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
41c0: 6e 20 45 78 70 72 20 6e 6f 64 65 20 77 68 69 63  n Expr node whic
41d0: 68 20 6a 6f 69 6e 73 20 61 73 20 6d 61 6e 79 20  h joins as many 
41e0: 61 73 20 74 77 6f 20 73 75 62 74 72 65 65 73 2e  as two subtrees.
41f0: 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f  .**.** One or bo
4200: 74 68 20 6f 66 20 74 68 65 20 73 75 62 74 72 65  th of the subtre
4210: 65 73 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20  es can be NULL. 
4220: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
4230: 72 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20  r to the new.** 
4240: 45 78 70 72 20 6e 6f 64 65 2e 20 20 4f 72 2c 20  Expr node.  Or, 
4250: 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  if an OOM error 
4260: 6f 63 63 75 72 73 2c 20 73 65 74 20 70 50 61 72  occurs, set pPar
4270: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
4280: 69 6c 65 64 2c 0a 2a 2a 20 66 72 65 65 20 74 68  iled,.** free th
4290: 65 20 73 75 62 74 72 65 65 73 20 61 6e 64 20 72  e subtrees and r
42a0: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45  eturn NULL..*/.E
42b0: 78 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70  xpr *sqlite3PExp
42c0: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
42d0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
42e0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
42f0: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
4300: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4310: 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64  Expression opcod
4320: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65  e */.  Expr *pLe
4330: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ft,            /
4340: 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a  * Left operand *
4350: 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  /.  Expr *pRight
4360: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ,           /* R
4370: 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  ight operand */.
4380: 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70    const Token *p
4390: 54 6f 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72 67  Token     /* Arg
43a0: 75 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29  ument token */.)
43b0: 7b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 69  {.  Expr *p;.  i
43c0: 66 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 26 26  f( op==TK_AND &&
43d0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
43e0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 61 6b 65 20   ){.    /* Take 
43f0: 61 64 76 61 6e 74 61 67 65 20 6f 66 20 73 68 6f  advantage of sho
4400: 72 74 2d 63 69 72 63 75 69 74 20 66 61 6c 73 65  rt-circuit false
4410: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f   optimization fo
4420: 72 20 41 4e 44 20 2a 2f 0a 20 20 20 20 70 20 3d  r AND */.    p =
4430: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
4440: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 66  pParse->db, pLef
4450: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 65  t, pRight);.  }e
4460: 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c  lse{.    p = sql
4470: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50  ite3ExprAlloc(pP
4480: 61 72 73 65 2d 3e 64 62 2c 20 6f 70 20 26 20 54  arse->db, op & T
4490: 4b 46 4c 47 5f 4d 41 53 4b 2c 20 70 54 6f 6b 65  KFLG_MASK, pToke
44a0: 6e 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  n, 1);.    sqlit
44b0: 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74  e3ExprAttachSubt
44c0: 72 65 65 73 28 70 50 61 72 73 65 2d 3e 64 62 2c  rees(pParse->db,
44d0: 20 70 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68   p, pLeft, pRigh
44e0: 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 20  t);.  }.  if( p 
44f0: 29 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ) {.    sqlite3E
4500: 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70  xprCheckHeight(p
4510: 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68  Parse, p->nHeigh
4520: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
4530: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64   p;.}../*.** Add
4540: 20 70 53 65 6c 65 63 74 20 74 6f 20 74 68 65 20   pSelect to the 
4550: 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74 20 66  Expr.x.pSelect f
4560: 69 65 6c 64 2e 20 20 4f 72 2c 20 69 66 20 70 45  ield.  Or, if pE
4570: 78 70 72 20 69 73 20 4e 55 4c 4c 20 28 64 75 65  xpr is NULL (due
4580: 0a 2a 2a 20 64 6f 20 61 20 6d 65 6d 6f 72 79 20  .** do a memory 
4590: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75  allocation failu
45a0: 72 65 29 20 74 68 65 6e 20 64 65 6c 65 74 65 20  re) then delete 
45b0: 74 68 65 20 70 53 65 6c 65 63 74 20 6f 62 6a 65  the pSelect obje
45c0: 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ct..*/.void sqli
45d0: 74 65 33 50 45 78 70 72 41 64 64 53 65 6c 65 63  te3PExprAddSelec
45e0: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
45f0: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 53 65   Expr *pExpr, Se
4600: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
4610: 20 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20    if( pExpr ){. 
4620: 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c     pExpr->x.pSel
4630: 65 63 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a 20  ect = pSelect;. 
4640: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
4650: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
4660: 53 65 6c 65 63 74 7c 45 50 5f 53 75 62 71 75 65  Select|EP_Subque
4670: 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ry);.    sqlite3
4680: 45 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64  ExprSetHeightAnd
4690: 46 6c 61 67 73 28 70 50 61 72 73 65 2c 20 70 45  Flags(pParse, pE
46a0: 78 70 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  xpr);.  }else{. 
46b0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
46c0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
46d0: 6c 65 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  led );.    sqlit
46e0: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
46f0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c 65  Parse->db, pSele
4700: 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  ct);.  }.}.../*.
4710: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
4720: 73 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 65  sion is always e
4730: 69 74 68 65 72 20 54 52 55 45 20 6f 72 20 46 41  ither TRUE or FA
4740: 4c 53 45 20 28 72 65 73 70 65 63 74 69 76 65 6c  LSE (respectivel
4750: 79 29 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  y),.** then retu
4760: 72 6e 20 31 2e 20 20 49 66 20 6f 6e 65 20 63 61  rn 1.  If one ca
4770: 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 74  nnot determine t
4780: 68 65 20 74 72 75 74 68 20 76 61 6c 75 65 20 6f  he truth value o
4790: 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  f the.** express
47a0: 69 6f 6e 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  ion at compile-t
47b0: 69 6d 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a  ime return 0..**
47c0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f  .** This is an o
47d0: 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 66  ptimization.  If
47e0: 20 69 73 20 4f 4b 20 74 6f 20 72 65 74 75 72 6e   is OK to return
47f0: 20 30 20 68 65 72 65 20 65 76 65 6e 20 69 66 0a   0 here even if.
4800: 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ** the expressio
4810: 6e 20 72 65 61 6c 6c 79 20 69 73 20 61 6c 77 61  n really is alwa
4820: 79 73 20 66 61 6c 73 65 20 6f 72 20 66 61 6c 73  ys false or fals
4830: 65 20 28 61 20 66 61 6c 73 65 20 6e 65 67 61 74  e (a false negat
4840: 69 76 65 29 2e 0a 2a 2a 20 42 75 74 20 69 74 20  ive)..** But it 
4850: 69 73 20 61 20 62 75 67 20 74 6f 20 72 65 74 75  is a bug to retu
4860: 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72  rn 1 if the expr
4870: 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 68 61 76  ession might hav
4880: 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 62  e different.** b
4890: 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73 20 69 6e  oolean values in
48a0: 20 64 69 66 66 65 72 65 6e 74 20 63 69 72 63 75   different circu
48b0: 6d 73 74 61 6e 63 65 73 20 28 61 20 66 61 6c 73  mstances (a fals
48c0: 65 20 70 6f 73 69 74 69 76 65 2e 29 0a 2a 2a 0a  e positive.).**.
48d0: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20  ** Note that if 
48e0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
48f0: 73 20 70 61 72 74 20 6f 66 20 63 6f 6e 64 69 74  s part of condit
4900: 69 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a 2a 20 4c  ional for a.** L
4910: 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 77  EFT JOIN, then w
4920: 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69  e cannot determi
4930: 6e 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ne at compile-ti
4940: 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  me whether or no
4950: 74 0a 2a 2a 20 69 73 20 69 74 20 74 72 75 65 20  t.** is it true 
4960: 6f 72 20 66 61 6c 73 65 2c 20 73 6f 20 61 6c 77  or false, so alw
4970: 61 79 73 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f  ays return 0..*/
4980: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
4990: 41 6c 77 61 79 73 54 72 75 65 28 45 78 70 72 20  AlwaysTrue(Expr 
49a0: 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30  *p){.  int v = 0
49b0: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
49c0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
49d0: 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e  omJoin) ) return
49e0: 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   0;.  if( !sqlit
49f0: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
4a00: 70 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e 20  p, &v) ) return 
4a10: 30 3b 0a 20 20 72 65 74 75 72 6e 20 76 21 3d 30  0;.  return v!=0
4a20: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65  ;.}.static int e
4a30: 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 45  xprAlwaysFalse(E
4a40: 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76  xpr *p){.  int v
4a50: 20 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72   = 0;.  if( Expr
4a60: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
4a70: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65  P_FromJoin) ) re
4a80: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73  turn 0;.  if( !s
4a90: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
4aa0: 67 65 72 28 70 2c 20 26 76 29 20 29 20 72 65 74  ger(p, &v) ) ret
4ab0: 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
4ac0: 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a  v==0;.}../*.** J
4ad0: 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73 69  oin two expressi
4ae0: 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e 44  ons using an AND
4af0: 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 65   operator.  If e
4b00: 69 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  ither expression
4b10: 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65   is.** NULL, the
4b20: 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68  n just return th
4b30: 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  e other expressi
4b40: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65  on..**.** If one
4b50: 20 73 69 64 65 20 6f 72 20 74 68 65 20 6f 74 68   side or the oth
4b60: 65 72 20 6f 66 20 74 68 65 20 41 4e 44 20 69 73  er of the AND is
4b70: 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66 61 6c   known to be fal
4b80: 73 65 2c 20 74 68 65 6e 20 69 6e 73 74 65 61 64  se, then instead
4b90: 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69 6e 67  .** of returning
4ba0: 20 61 6e 20 41 4e 44 20 65 78 70 72 65 73 73 69   an AND expressi
4bb0: 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20  on, just return 
4bc0: 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65  a constant expre
4bd0: 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 61 20  ssion with.** a 
4be0: 76 61 6c 75 65 20 6f 66 20 66 61 6c 73 65 2e 0a  value of false..
4bf0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
4c00: 45 78 70 72 41 6e 64 28 73 71 6c 69 74 65 33 20  ExprAnd(sqlite3 
4c10: 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c 65 66 74  *db, Expr *pLeft
4c20: 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74 29 7b  , Expr *pRight){
4c30: 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20  .  if( pLeft==0 
4c40: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 52  ){.    return pR
4c50: 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ight;.  }else if
4c60: 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20  ( pRight==0 ){. 
4c70: 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b     return pLeft;
4c80: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70  .  }else if( exp
4c90: 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 4c 65  rAlwaysFalse(pLe
4ca0: 66 74 29 20 7c 7c 20 65 78 70 72 41 6c 77 61 79  ft) || exprAlway
4cb0: 73 46 61 6c 73 65 28 70 52 69 67 68 74 29 20 29  sFalse(pRight) )
4cc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
4cd0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66  rDelete(db, pLef
4ce0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
4cf0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52  xprDelete(db, pR
4d00: 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72  ight);.    retur
4d10: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  n sqlite3ExprAll
4d20: 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45  oc(db, TK_INTEGE
4d30: 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f  R, &sqlite3IntTo
4d40: 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20 20 7d  kens[0], 0);.  }
4d50: 65 6c 73 65 7b 0a 20 20 20 20 45 78 70 72 20 2a  else{.    Expr *
4d60: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
4d70: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 41  prAlloc(db, TK_A
4d80: 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  ND, 0, 0);.    s
4d90: 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68  qlite3ExprAttach
4da0: 53 75 62 74 72 65 65 73 28 64 62 2c 20 70 4e 65  Subtrees(db, pNe
4db0: 77 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  w, pLeft, pRight
4dc0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4e  );.    return pN
4dd0: 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ew;.  }.}../*.**
4de0: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77   Construct a new
4df0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
4e00: 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20   for a function 
4e10: 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a  with multiple.**
4e20: 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45   arguments..*/.E
4e30: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
4e40: 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  Function(Parse *
4e50: 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74  pParse, ExprList
4e60: 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
4e70: 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20  pToken){.  Expr 
4e80: 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74 65 33  *pNew;.  sqlite3
4e90: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
4ea0: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  b;.  assert( pTo
4eb0: 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20  ken );.  pNew = 
4ec0: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
4ed0: 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  (db, TK_FUNCTION
4ee0: 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20  , pToken, 1);.  
4ef0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
4f00: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
4f10: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
4f20: 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6d 65  st); /* Avoid me
4f30: 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e 20 6d  mory leak when m
4f40: 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20  alloc fails */. 
4f50: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
4f60: 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74  .  pNew->x.pList
4f70: 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73 73 65   = pList;.  asse
4f80: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
4f90: 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49  erty(pNew, EP_xI
4fa0: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 73 71  sSelect) );.  sq
4fb0: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
4fc0: 68 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73  htAndFlags(pPars
4fd0: 65 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75  e, pNew);.  retu
4fe0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
4ff0: 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72 69 61  * Assign a varia
5000: 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e  ble number to an
5010: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
5020: 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63   encodes a wildc
5030: 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72  ard.** in the or
5040: 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65  iginal SQL state
5050: 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69  ment.  .**.** Wi
5060: 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69  ldcards consisti
5070: 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22  ng of a single "
5080: 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  ?" are assigned 
5090: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74  the next sequent
50a0: 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  ial.** variable 
50b0: 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69  number..**.** Wi
50c0: 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66  ldcards of the f
50d0: 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61  orm "?nnn" are a
50e0: 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62  ssigned the numb
50f0: 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61  er "nnn".  We ma
5100: 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22  ke.** sure "nnn"
5110: 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65 20 74   is not too be t
5120: 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69 61 6c  o avoid a denial
5130: 20 6f 66 20 73 65 72 76 69 63 65 20 61 74 74 61   of service atta
5140: 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53  ck when.** the S
5150: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d  QL statement com
5160: 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74 65 72  es from an exter
5170: 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a  nal source..**.*
5180: 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74  * Wildcards of t
5190: 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 2c 20  he form ":aaa", 
51a0: 22 40 61 61 61 22 2c 20 6f 72 20 22 24 61 61 61  "@aaa", or "$aaa
51b0: 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  " are assigned t
51c0: 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a  he same number.*
51d0: 2a 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75  * as the previou
51e0: 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  s instance of th
51f0: 65 20 73 61 6d 65 20 77 69 6c 64 63 61 72 64 2e  e same wildcard.
5200: 20 20 4f 72 20 69 66 20 74 68 69 73 20 69 73 20    Or if this is 
5210: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 73  the first.** ins
5220: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 77 69 6c  tance of the wil
5230: 64 63 61 72 64 2c 20 74 68 65 20 6e 65 78 74 20  dcard, the next 
5240: 73 65 71 75 65 6e 74 69 61 6c 20 76 61 72 69 61  sequential varia
5250: 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a  ble number is.**
5260: 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f   assigned..*/.vo
5270: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 73  id sqlite3ExprAs
5280: 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50 61  signVarNumber(Pa
5290: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
52a0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 73 71 6c  r *pExpr){.  sql
52b0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
52c0: 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  e->db;.  const c
52d0: 68 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 70  har *z;..  if( p
52e0: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
52f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  ;.  assert( !Exp
5300: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
5310: 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c  pr, EP_IntValue|
5320: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
5330: 6b 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20 20 7a 20  kenOnly) );.  z 
5340: 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  = pExpr->u.zToke
5350: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 21 3d  n;.  assert( z!=
5360: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  0 );.  assert( z
5370: 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  [0]!=0 );.  if( 
5380: 7a 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  z[1]==0 ){.    /
5390: 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68  * Wildcard of th
53a0: 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73  e form "?".  Ass
53b0: 69 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72  ign the next var
53c0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  iable number */.
53d0: 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d      assert( z[0]
53e0: 3d 3d 27 3f 27 20 29 3b 0a 20 20 20 20 70 45 78  =='?' );.    pEx
53f0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79  pr->iColumn = (y
5400: 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e  nVar)(++pParse->
5410: 6e 56 61 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nVar);.  }else{.
5420: 20 20 20 20 79 6e 56 61 72 20 78 20 3d 20 30 3b      ynVar x = 0;
5430: 0a 20 20 20 20 75 33 32 20 6e 20 3d 20 73 71 6c  .    u32 n = sql
5440: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b  ite3Strlen30(z);
5450: 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27  .    if( z[0]=='
5460: 3f 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57  ?' ){.      /* W
5470: 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66  ildcard of the f
5480: 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e  orm "?nnn".  Con
5490: 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e  vert "nnn" to an
54a0: 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20 20   integer and.   
54b0: 20 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20     ** use it as 
54c0: 74 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  the variable num
54d0: 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 36 34  ber */.      i64
54e0: 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f   i;.      int bO
54f0: 6b 20 3d 20 30 3d 3d 73 71 6c 69 74 65 33 41 74  k = 0==sqlite3At
5500: 6f 69 36 34 28 26 7a 5b 31 5d 2c 20 26 69 2c 20  oi64(&z[1], &i, 
5510: 6e 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  n-1, SQLITE_UTF8
5520: 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
5530: 69 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20 28 79  iColumn = x = (y
5540: 6e 56 61 72 29 69 3b 0a 20 20 20 20 20 20 74 65  nVar)i;.      te
5550: 73 74 63 61 73 65 28 20 69 3d 3d 30 20 29 3b 0a  stcase( i==0 );.
5560: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
5570: 69 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 74 65  i==1 );.      te
5580: 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61  stcase( i==db->a
5590: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
55a0: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
55b0: 45 52 5d 2d 31 20 29 3b 0a 20 20 20 20 20 20 74  ER]-1 );.      t
55c0: 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e  estcase( i==db->
55d0: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
55e0: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
55f0: 42 45 52 5d 20 29 3b 0a 20 20 20 20 20 20 69 66  BER] );.      if
5600: 28 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20  ( bOk==0 || i<1 
5610: 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  || i>db->aLimit[
5620: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
5630: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b  IABLE_NUMBER] ){
5640: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5650: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
5660: 20 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65   "variable numbe
5670: 72 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65  r must be betwee
5680: 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a 20  n ?1 and ?%d",. 
5690: 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61             db->a
56a0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
56b0: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
56c0: 45 52 5d 29 3b 0a 20 20 20 20 20 20 20 20 78 20  ER]);.        x 
56d0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
56e0: 20 20 20 69 66 28 20 69 3e 70 50 61 72 73 65 2d     if( i>pParse-
56f0: 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20  >nVar ){.       
5700: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20   pParse->nVar = 
5710: 28 69 6e 74 29 69 3b 0a 20 20 20 20 20 20 7d 0a  (int)i;.      }.
5720: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5730: 20 2f 2a 20 57 69 6c 64 63 61 72 64 73 20 6c 69   /* Wildcards li
5740: 6b 65 20 22 3a 61 61 61 22 2c 20 22 24 61 61 61  ke ":aaa", "$aaa
5750: 22 20 6f 72 20 22 40 61 61 61 22 2e 20 20 52 65  " or "@aaa".  Re
5760: 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72  use the same var
5770: 69 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6e  iable.      ** n
5780: 75 6d 62 65 72 20 61 73 20 74 68 65 20 70 72 69  umber as the pri
5790: 6f 72 20 61 70 70 65 61 72 61 6e 63 65 20 6f 66  or appearance of
57a0: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20   the same name, 
57b0: 6f 72 20 69 66 20 74 68 65 20 6e 61 6d 65 0a 20  or if the name. 
57c0: 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 65 76 65       ** has neve
57d0: 72 20 61 70 70 65 61 72 65 64 20 62 65 66 6f 72  r appeared befor
57e0: 65 2c 20 72 65 75 73 65 20 74 68 65 20 73 61 6d  e, reuse the sam
57f0: 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  e variable numbe
5800: 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  r.      */.     
5810: 20 79 6e 56 61 72 20 69 3b 0a 20 20 20 20 20 20   ynVar i;.      
5820: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
5830: 65 2d 3e 6e 7a 56 61 72 3b 20 69 2b 2b 29 7b 0a  e->nzVar; i++){.
5840: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72          if( pPar
5850: 73 65 2d 3e 61 7a 56 61 72 5b 69 5d 20 26 26 20  se->azVar[i] && 
5860: 73 74 72 63 6d 70 28 70 50 61 72 73 65 2d 3e 61  strcmp(pParse->a
5870: 7a 56 61 72 5b 69 5d 2c 7a 29 3d 3d 30 20 29 7b  zVar[i],z)==0 ){
5880: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
5890: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20  ->iColumn = x = 
58a0: 28 79 6e 56 61 72 29 69 2b 31 3b 0a 20 20 20 20  (ynVar)i+1;.    
58b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
58c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
58d0: 20 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29 20       if( x==0 ) 
58e0: 78 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  x = pExpr->iColu
58f0: 6d 6e 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70  mn = (ynVar)(++p
5900: 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20  Parse->nVar);.  
5910: 20 20 7d 0a 20 20 20 20 69 66 28 20 78 3e 30 20    }.    if( x>0 
5920: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 78 3e 70  ){.      if( x>p
5930: 50 61 72 73 65 2d 3e 6e 7a 56 61 72 20 29 7b 0a  Parse->nzVar ){.
5940: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 2a 61          char **a
5950: 3b 0a 20 20 20 20 20 20 20 20 61 20 3d 20 73 71  ;.        a = sq
5960: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
5970: 62 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  b, pParse->azVar
5980: 2c 20 78 2a 73 69 7a 65 6f 66 28 61 5b 30 5d 29  , x*sizeof(a[0])
5990: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
59a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
59b0: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
59c0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 20 2f 2a 20  locFailed ); /* 
59d0: 45 72 72 6f 72 20 72 65 70 6f 72 74 65 64 20 74  Error reported t
59e0: 68 72 6f 75 67 68 20 6d 61 6c 6c 6f 63 46 61 69  hrough mallocFai
59f0: 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  led */.         
5a00: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
5a10: 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 72 73   }.        pPars
5a20: 65 2d 3e 61 7a 56 61 72 20 3d 20 61 3b 0a 20 20  e->azVar = a;.  
5a30: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61 5b        memset(&a[
5a40: 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 5d 2c 20  pParse->nzVar], 
5a50: 30 2c 20 28 78 2d 70 50 61 72 73 65 2d 3e 6e 7a  0, (x-pParse->nz
5a60: 56 61 72 29 2a 73 69 7a 65 6f 66 28 61 5b 30 5d  Var)*sizeof(a[0]
5a70: 29 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  ));.        pPar
5a80: 73 65 2d 3e 6e 7a 56 61 72 20 3d 20 78 3b 0a 20  se->nzVar = x;. 
5a90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
5aa0: 20 7a 5b 30 5d 21 3d 27 3f 27 20 7c 7c 20 70 50   z[0]!='?' || pP
5ab0: 61 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d  arse->azVar[x-1]
5ac0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
5ad0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
5ae0: 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 78   pParse->azVar[x
5af0: 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 50  -1]);.        pP
5b00: 61 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d  arse->azVar[x-1]
5b10: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
5b20: 44 75 70 28 64 62 2c 20 7a 2c 20 6e 29 3b 0a 20  Dup(db, z, n);. 
5b30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5b40: 20 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d   .  if( !pParse-
5b50: 3e 6e 45 72 72 20 26 26 20 70 50 61 72 73 65 2d  >nErr && pParse-
5b60: 3e 6e 56 61 72 3e 64 62 2d 3e 61 4c 69 6d 69 74  >nVar>db->aLimit
5b70: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
5b80: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29  RIABLE_NUMBER] )
5b90: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
5ba0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
5bb0: 6f 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61 72 69  oo many SQL vari
5bc0: 61 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a  ables");.  }.}..
5bd0: 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c  /*.** Recursivel
5be0: 79 20 64 65 6c 65 74 65 20 61 6e 20 65 78 70 72  y delete an expr
5bf0: 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a  ession tree..*/.
5c00: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
5c10: 49 4e 4c 49 4e 45 20 76 6f 69 64 20 73 71 6c 69  INLINE void sqli
5c20: 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28  te3ExprDeleteNN(
5c30: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
5c40: 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  r *p){.  assert(
5c50: 20 70 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 53 61   p!=0 );.  /* Sa
5c60: 6e 69 74 79 20 63 68 65 63 6b 3a 20 41 73 73 65  nity check: Asse
5c70: 72 74 20 74 68 61 74 20 74 68 65 20 49 6e 74 56  rt that the IntV
5c80: 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61  alue is non-nega
5c90: 74 69 76 65 20 69 66 20 69 74 20 65 78 69 73 74  tive if it exist
5ca0: 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21  s */.  assert( !
5cb0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
5cc0: 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  p, EP_IntValue) 
5cd0: 7c 7c 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d  || p->u.iValue>=
5ce0: 30 20 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72  0 );.  if( !Expr
5cf0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
5d00: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a  P_TokenOnly) ){.
5d10: 20 20 20 20 2f 2a 20 54 68 65 20 45 78 70 72 2e      /* The Expr.
5d20: 78 20 75 6e 69 6f 6e 20 69 73 20 6e 65 76 65 72  x union is never
5d30: 20 75 73 65 64 20 61 74 20 74 68 65 20 73 61 6d   used at the sam
5d40: 65 20 74 69 6d 65 20 61 73 20 45 78 70 72 2e 70  e time as Expr.p
5d50: 52 69 67 68 74 20 2a 2f 0a 20 20 20 20 61 73 73  Right */.    ass
5d60: 65 72 74 28 20 70 2d 3e 78 2e 70 4c 69 73 74 3d  ert( p->x.pList=
5d70: 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d  =0 || p->pRight=
5d80: 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
5d90: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
5da0: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  p->pLeft);.    s
5db0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
5dc0: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b  (db, p->pRight);
5dd0: 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
5de0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d  Property(p, EP_M
5df0: 65 6d 54 6f 6b 65 6e 29 20 29 20 73 71 6c 69 74  emToken) ) sqlit
5e00: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
5e10: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 69  u.zToken);.    i
5e20: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
5e30: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
5e40: 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ct) ){.      sql
5e50: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
5e60: 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63  (db, p->x.pSelec
5e70: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
5e80: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
5e90: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
5ea0: 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
5eb0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 45 78 70  }.  }.  if( !Exp
5ec0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
5ed0: 45 50 5f 53 74 61 74 69 63 29 20 29 7b 0a 20 20  EP_Static) ){.  
5ee0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
5ef0: 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f  db, p);.  }.}.vo
5f00: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  id sqlite3ExprDe
5f10: 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
5f20: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  , Expr *p){.  if
5f30: 28 20 70 20 29 20 73 71 6c 69 74 65 33 45 78 70  ( p ) sqlite3Exp
5f40: 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 29  rDeleteNN(db, p)
5f50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
5f60: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
5f70: 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  bytes allocated 
5f80: 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69  for the expressi
5f90: 6f 6e 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a  on structure .**
5fa0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
5fb0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54  irst argument. T
5fc0: 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e  his is always on
5fd0: 65 20 6f 66 20 45 58 50 52 5f 46 55 4c 4c 53 49  e of EXPR_FULLSI
5fe0: 5a 45 2c 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55  ZE,.** EXPR_REDU
5ff0: 43 45 44 53 49 5a 45 20 6f 72 20 45 58 50 52 5f  CEDSIZE or EXPR_
6000: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a  TOKENONLYSIZE..*
6010: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
6020: 72 53 74 72 75 63 74 53 69 7a 65 28 45 78 70 72  rStructSize(Expr
6030: 20 2a 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72   *p){.  if( Expr
6040: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
6050: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72  P_TokenOnly) ) r
6060: 65 74 75 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e  eturn EXPR_TOKEN
6070: 4f 4e 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28 20  ONLYSIZE;.  if( 
6080: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
6090: 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20 29  p, EP_Reduced) )
60a0: 20 72 65 74 75 72 6e 20 45 58 50 52 5f 52 45 44   return EXPR_RED
60b0: 55 43 45 44 53 49 5a 45 3b 0a 20 20 72 65 74 75  UCEDSIZE;.  retu
60c0: 72 6e 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  rn EXPR_FULLSIZE
60d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64  ;.}../*.** The d
60e0: 75 70 65 64 45 78 70 72 2a 53 69 7a 65 28 29 20  upedExpr*Size() 
60f0: 72 6f 75 74 69 6e 65 73 20 65 61 63 68 20 72 65  routines each re
6100: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
6110: 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65  of bytes require
6120: 64 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 61 20  d.** to store a 
6130: 63 6f 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65  copy of an expre
6140: 73 73 69 6f 6e 20 6f 72 20 65 78 70 72 65 73 73  ssion or express
6150: 69 6f 6e 20 74 72 65 65 2e 20 20 54 68 65 79 20  ion tree.  They 
6160: 64 69 66 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77  differ in.** how
6170: 20 6d 75 63 68 20 6f 66 20 74 68 65 20 74 72 65   much of the tre
6180: 65 20 69 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a  e is measured..*
6190: 2a 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78  *.**     dupedEx
61a0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 20  prStructSize()  
61b0: 20 20 20 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20     Size of only 
61c0: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75  the Expr structu
61d0: 72 65 20 0a 2a 2a 20 20 20 20 20 64 75 70 65 64  re .**     duped
61e0: 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 29 20 20  ExprNodeSize()  
61f0: 20 20 20 20 20 53 69 7a 65 20 6f 66 20 45 78 70       Size of Exp
6200: 72 20 2b 20 73 70 61 63 65 20 66 6f 72 20 74 6f  r + space for to
6210: 6b 65 6e 0a 2a 2a 20 20 20 20 20 64 75 70 65 64  ken.**     duped
6220: 45 78 70 72 53 69 7a 65 28 29 20 20 20 20 20 20  ExprSize()      
6230: 20 20 20 20 20 45 78 70 72 20 2b 20 74 6f 6b 65       Expr + toke
6240: 6e 20 2b 20 73 75 62 74 72 65 65 20 63 6f 6d 70  n + subtree comp
6250: 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  onents.**.******
6260: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
62a0: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  *****.**.** The 
62b0: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
62c0: 69 7a 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 72  ize() function r
62d0: 65 74 75 72 6e 73 20 74 77 6f 20 76 61 6c 75 65  eturns two value
62e0: 73 20 4f 52 2d 65 64 20 74 6f 67 65 74 68 65 72  s OR-ed together
62f0: 3a 20 20 0a 2a 2a 20 28 31 29 20 74 68 65 20 73  :  .** (1) the s
6300: 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f  pace required fo
6310: 72 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  r a copy of the 
6320: 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20 6f  Expr structure o
6330: 6e 6c 79 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20  nly and .** (2) 
6340: 74 68 65 20 45 50 5f 78 78 78 20 66 6c 61 67 73  the EP_xxx flags
6350: 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 20 77   that indicate w
6360: 68 61 74 20 74 68 65 20 73 74 72 75 63 74 75 72  hat the structur
6370: 65 20 73 69 7a 65 20 73 68 6f 75 6c 64 20 62 65  e size should be
6380: 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  ..** The return 
6390: 76 61 6c 75 65 73 20 69 73 20 61 6c 77 61 79 73  values is always
63a0: 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20   one of:.**.**  
63b0: 20 20 20 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a      EXPR_FULLSIZ
63c0: 45 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 52  E.**      EXPR_R
63d0: 45 44 55 43 45 44 53 49 5a 45 20 20 20 7c 20 45  EDUCEDSIZE   | E
63e0: 50 5f 52 65 64 75 63 65 64 0a 2a 2a 20 20 20 20  P_Reduced.**    
63f0: 20 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59    EXPR_TOKENONLY
6400: 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f  SIZE | EP_TokenO
6410: 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69  nly.**.** The si
6420: 7a 65 20 6f 66 20 74 68 65 20 73 74 72 75 63 74  ze of the struct
6430: 75 72 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ure can be found
6440: 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 20   by masking the 
6450: 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
6460: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
6470: 77 69 74 68 20 30 78 66 66 66 2e 20 20 54 68 65  with 0xfff.  The
6480: 20 66 6c 61 67 73 20 63 61 6e 20 62 65 20 66 6f   flags can be fo
6490: 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74  und by masking t
64a0: 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  he.** return val
64b0: 75 65 20 77 69 74 68 20 45 50 5f 52 65 64 75 63  ue with EP_Reduc
64c0: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e  ed|EP_TokenOnly.
64d0: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
64e0: 20 77 69 74 68 20 66 6c 61 67 73 3d 3d 45 58 50   with flags==EXP
64f0: 52 44 55 50 5f 52 45 44 55 43 45 2c 20 74 68 69  RDUP_REDUCE, thi
6500: 73 20 72 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73  s routines works
6510: 20 6f 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a   on full-size.**
6520: 20 28 75 6e 72 65 64 75 63 65 64 29 20 45 78 70   (unreduced) Exp
6530: 72 20 6f 62 6a 65 63 74 73 20 61 73 20 74 68 65  r objects as the
6540: 79 20 6f 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20  y or originally 
6550: 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 74  constructed by t
6560: 68 65 20 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75  he parser..** Du
6570: 72 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20  ring expression 
6580: 61 6e 61 6c 79 73 69 73 2c 20 65 78 74 72 61 20  analysis, extra 
6590: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63  information is c
65a0: 6f 6d 70 75 74 65 64 20 61 6e 64 20 6d 6f 76 65  omputed and move
65b0: 64 20 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20  d into.** later 
65c0: 70 61 72 74 73 20 6f 66 20 74 65 68 20 45 78 70  parts of teh Exp
65d0: 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 61  r object and tha
65e0: 74 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  t extra informat
65f0: 69 6f 6e 20 6d 69 67 68 74 20 67 65 74 20 63 68  ion might get ch
6600: 6f 70 70 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20  opped.** off if 
6610: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
6620: 73 20 72 65 64 75 63 65 64 2e 20 20 4e 6f 74 65  s reduced.  Note
6630: 20 61 6c 73 6f 20 74 68 61 74 20 69 74 20 64 6f   also that it do
6640: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a  es not work to.*
6650: 2a 20 6d 61 6b 65 20 61 6e 20 45 58 50 52 44 55  * make an EXPRDU
6660: 50 5f 52 45 44 55 43 45 20 63 6f 70 79 20 6f 66  P_REDUCE copy of
6670: 20 61 20 72 65 64 75 63 65 64 20 65 78 70 72 65   a reduced expre
6680: 73 73 69 6f 6e 2e 20 20 49 74 20 69 73 20 6f 6e  ssion.  It is on
6690: 6c 79 20 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20 72  ly legal.** to r
66a0: 65 64 75 63 65 20 61 20 70 72 69 73 74 69 6e 65  educe a pristine
66b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
66c0: 20 66 72 6f 6d 20 74 68 65 20 70 61 72 73 65 72   from the parser
66d0: 2e 20 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  .  The implement
66e0: 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70 65  ation.** of dupe
66f0: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
6700: 29 20 63 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70  ) contain multip
6710: 6c 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74  le assert() stat
6720: 65 6d 65 6e 74 73 20 74 68 61 74 20 61 74 74 65  ements that atte
6730: 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72 63  mpt.** to enforc
6740: 65 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  e this constrain
6750: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
6760: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
6770: 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e  Size(Expr *p, in
6780: 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20  t flags){.  int 
6790: 6e 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  nSize;.  assert(
67a0: 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f   flags==EXPRDUP_
67b0: 52 45 44 55 43 45 20 7c 7c 20 66 6c 61 67 73 3d  REDUCE || flags=
67c0: 3d 30 20 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e  =0 ); /* Only on
67d0: 65 20 66 6c 61 67 20 76 61 6c 75 65 20 61 6c 6c  e flag value all
67e0: 6f 77 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  owed */.  assert
67f0: 28 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3c  ( EXPR_FULLSIZE<
6800: 3d 30 78 66 66 66 20 29 3b 0a 20 20 61 73 73 65  =0xfff );.  asse
6810: 72 74 28 20 28 30 78 66 66 66 20 26 20 28 45 50  rt( (0xfff & (EP
6820: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
6830: 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29 3b 0a 20 20  nOnly))==0 );.  
6840: 69 66 28 20 30 3d 3d 66 6c 61 67 73 20 29 7b 0a  if( 0==flags ){.
6850: 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52      nSize = EXPR
6860: 5f 46 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c  _FULLSIZE;.  }el
6870: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
6880: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
6890: 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  (p, EP_TokenOnly
68a0: 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
68b0: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
68c0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
68d0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20  EP_FromJoin) ); 
68e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
68f0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
6900: 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 3b   EP_MemToken) );
6910: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
6920: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
6930: 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 20 29 3b   EP_NoReduce) );
6940: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66  .    if( p->pLef
6950: 74 20 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20  t || p->x.pList 
6960: 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  ){.      nSize =
6970: 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a   EXPR_REDUCEDSIZ
6980: 45 20 7c 20 45 50 5f 52 65 64 75 63 65 64 3b 0a  E | EP_Reduced;.
6990: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
69a0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
69b0: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e  ht==0 );.      n
69c0: 53 69 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45  Size = EXPR_TOKE
69d0: 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54  NONLYSIZE | EP_T
69e0: 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a  okenOnly;.    }.
69f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53 69    }.  return nSi
6a00: 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ze;.}../*.** Thi
6a10: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
6a20: 6e 73 20 74 68 65 20 73 70 61 63 65 20 69 6e 20  ns the space in 
6a30: 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74  bytes required t
6a40: 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79  o store the copy
6a50: 20 0a 2a 2a 20 6f 66 20 74 68 65 20 45 78 70 72   .** of the Expr
6a60: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
6a70: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70   copy of the Exp
6a80: 72 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e  r.u.zToken strin
6a90: 67 20 28 69 66 20 74 68 61 74 0a 2a 2a 20 73 74  g (if that.** st
6aa0: 72 69 6e 67 20 69 73 20 64 65 66 69 6e 65 64 2e  ring is defined.
6ab0: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ).*/.static int 
6ac0: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
6ad0: 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  e(Expr *p, int f
6ae0: 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79  lags){.  int nBy
6af0: 74 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74  te = dupedExprSt
6b00: 72 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67  ructSize(p, flag
6b10: 73 29 20 26 20 30 78 66 66 66 3b 0a 20 20 69 66  s) & 0xfff;.  if
6b20: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
6b30: 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75  ty(p, EP_IntValu
6b40: 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65  e) && p->u.zToke
6b50: 6e 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b  n ){.    nByte +
6b60: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
6b70: 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31  0(p->u.zToken)+1
6b80: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 52  ;.  }.  return R
6b90: 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a  OUND8(nByte);.}.
6ba0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
6bb0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
6bc0: 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 72  s required to cr
6bd0: 65 61 74 65 20 61 20 64 75 70 6c 69 63 61 74 65  eate a duplicate
6be0: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 65 78 70 72   of the .** expr
6bf0: 65 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73  ession passed as
6c00: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
6c10: 65 6e 74 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  ent. The second 
6c20: 61 72 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a  argument is a.**
6c30: 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67   mask containing
6c40: 20 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61   EXPRDUP_XXX fla
6c50: 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61  gs..**.** The va
6c60: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 6e 63  lue returned inc
6c70: 6c 75 64 65 73 20 73 70 61 63 65 20 74 6f 20 63  ludes space to c
6c80: 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20  reate a copy of 
6c90: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 0a  the Expr struct.
6ca0: 2a 2a 20 69 74 73 65 6c 66 20 61 6e 64 20 74 68  ** itself and th
6cb0: 65 20 62 75 66 66 65 72 20 72 65 66 65 72 72 65  e buffer referre
6cc0: 64 20 74 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a  d to by Expr.u.z
6cd0: 54 6f 6b 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a  Token, if any..*
6ce0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52  *.** If the EXPR
6cf0: 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20  DUP_REDUCE flag 
6d00: 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  is set, then the
6d10: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
6d20: 63 6c 75 64 65 73 20 0a 2a 2a 20 73 70 61 63 65  cludes .** space
6d30: 20 74 6f 20 64 75 70 6c 69 63 61 74 65 20 61 6c   to duplicate al
6d40: 6c 20 45 78 70 72 20 6e 6f 64 65 73 20 69 6e 20  l Expr nodes in 
6d50: 74 68 65 20 74 72 65 65 20 66 6f 72 6d 65 64 20  the tree formed 
6d60: 62 79 20 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a  by Expr.pLeft .*
6d70: 2a 20 61 6e 64 20 45 78 70 72 2e 70 52 69 67 68  * and Expr.pRigh
6d80: 74 20 76 61 72 69 61 62 6c 65 73 20 28 62 75 74  t variables (but
6d90: 20 6e 6f 74 20 66 6f 72 20 61 6e 79 20 73 74 72   not for any str
6da0: 75 63 74 75 72 65 73 20 70 6f 69 6e 74 65 64 20  uctures pointed 
6db0: 74 6f 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e  to or .** descen
6dc0: 64 65 64 20 66 72 6f 6d 20 74 68 65 20 45 78 70  ded from the Exp
6dd0: 72 2e 78 2e 70 4c 69 73 74 20 6f 72 20 45 78 70  r.x.pList or Exp
6de0: 72 2e 78 2e 70 53 65 6c 65 63 74 20 76 61 72 69  r.x.pSelect vari
6df0: 61 62 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69  ables)..*/.stati
6e00: 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53  c int dupedExprS
6e10: 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ize(Expr *p, int
6e20: 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e   flags){.  int n
6e30: 42 79 74 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Byte = 0;.  if( 
6e40: 70 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d  p ){.    nByte =
6e50: 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69   dupedExprNodeSi
6e60: 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ze(p, flags);.  
6e70: 20 20 69 66 28 20 66 6c 61 67 73 26 45 58 50 52    if( flags&EXPR
6e80: 44 55 50 5f 52 45 44 55 43 45 20 29 7b 0a 20 20  DUP_REDUCE ){.  
6e90: 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 64 75 70      nByte += dup
6ea0: 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c  edExprSize(p->pL
6eb0: 65 66 74 2c 20 66 6c 61 67 73 29 20 2b 20 64 75  eft, flags) + du
6ec0: 70 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70  pedExprSize(p->p
6ed0: 52 69 67 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20  Right, flags);. 
6ee0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
6ef0: 6e 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n nByte;.}../*.*
6f00: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
6f10: 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71  is similar to sq
6f20: 6c 69 74 65 33 45 78 70 72 44 75 70 28 29 2c 20  lite3ExprDup(), 
6f30: 65 78 63 65 70 74 20 74 68 61 74 20 69 66 20 70  except that if p
6f40: 7a 42 75 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e  zBuffer .** is n
6f50: 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a  ot NULL then *pz
6f60: 42 75 66 66 65 72 20 69 73 20 61 73 73 75 6d 65  Buffer is assume
6f70: 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  d to point to a 
6f80: 62 75 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f  buffer large eno
6f90: 75 67 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65  ugh .** to store
6fa0: 20 74 68 65 20 63 6f 70 79 20 6f 66 20 65 78 70   the copy of exp
6fb0: 72 65 73 73 69 6f 6e 20 70 2c 20 74 68 65 20 63  ression p, the c
6fc0: 6f 70 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54  opies of p->u.zT
6fd0: 6f 6b 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c  oken.** (if appl
6fe0: 69 63 61 62 6c 65 29 2c 20 61 6e 64 20 74 68 65  icable), and the
6ff0: 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70   copies of the p
7000: 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70  ->pLeft and p->p
7010: 52 69 67 68 74 20 65 78 70 72 65 73 73 69 6f 6e  Right expression
7020: 73 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65  s,.** if any. Be
7030: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
7040: 2a 70 7a 42 75 66 66 65 72 20 69 73 20 73 65 74  *pzBuffer is set
7050: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
7060: 74 65 20 70 61 73 74 20 74 68 65 0a 2a 2a 20 70  te past the.** p
7070: 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75  ortion of the bu
7080: 66 66 65 72 20 63 6f 70 69 65 64 20 69 6e 74 6f  ffer copied into
7090: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
70a0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70  n..*/.static Exp
70b0: 72 20 2a 65 78 70 72 44 75 70 28 73 71 6c 69 74  r *exprDup(sqlit
70c0: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c  e3 *db, Expr *p,
70d0: 20 69 6e 74 20 64 75 70 46 6c 61 67 73 2c 20 75   int dupFlags, u
70e0: 38 20 2a 2a 70 7a 42 75 66 66 65 72 29 7b 0a 20  8 **pzBuffer){. 
70f0: 20 45 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20   Expr *pNew;    
7100: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
7110: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 75  to return */.  u
7120: 38 20 2a 7a 41 6c 6c 6f 63 3b 20 20 20 20 20 20  8 *zAlloc;      
7130: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 73       /* Memory s
7140: 70 61 63 65 20 66 72 6f 6d 20 77 68 69 63 68 20  pace from which 
7150: 74 6f 20 62 75 69 6c 64 20 45 78 70 72 20 6f 62  to build Expr ob
7160: 6a 65 63 74 20 2a 2f 0a 20 20 75 33 32 20 73 74  ject */.  u32 st
7170: 61 74 69 63 46 6c 61 67 3b 20 20 20 20 20 20 20  aticFlag;       
7180: 2f 2a 20 45 50 5f 53 74 61 74 69 63 20 69 66 20  /* EP_Static if 
7190: 73 70 61 63 65 20 6e 6f 74 20 6f 62 74 61 69 6e  space not obtain
71a0: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 2a  ed from malloc *
71b0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  /..  assert( db!
71c0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
71d0: 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  p );.  assert( d
71e0: 75 70 46 6c 61 67 73 3d 3d 30 20 7c 7c 20 64 75  upFlags==0 || du
71f0: 70 46 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f  pFlags==EXPRDUP_
7200: 52 45 44 55 43 45 20 29 3b 0a 20 20 61 73 73 65  REDUCE );.  asse
7210: 72 74 28 20 70 7a 42 75 66 66 65 72 3d 3d 30 20  rt( pzBuffer==0 
7220: 7c 7c 20 64 75 70 46 6c 61 67 73 3d 3d 45 58 50  || dupFlags==EXP
7230: 52 44 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 0a  RDUP_REDUCE );..
7240: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
7250: 77 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 74  where to write t
7260: 68 65 20 6e 65 77 20 45 78 70 72 20 73 74 72 75  he new Expr stru
7270: 63 74 75 72 65 2e 20 2a 2f 0a 20 20 69 66 28 20  cture. */.  if( 
7280: 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20  pzBuffer ){.    
7290: 7a 41 6c 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66  zAlloc = *pzBuff
72a0: 65 72 3b 0a 20 20 20 20 73 74 61 74 69 63 46 6c  er;.    staticFl
72b0: 61 67 20 3d 20 45 50 5f 53 74 61 74 69 63 3b 0a  ag = EP_Static;.
72c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 41 6c    }else{.    zAl
72d0: 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  loc = sqlite3DbM
72e0: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 64  allocRawNN(db, d
72f0: 75 70 65 64 45 78 70 72 53 69 7a 65 28 70 2c 20  upedExprSize(p, 
7300: 64 75 70 46 6c 61 67 73 29 29 3b 0a 20 20 20 20  dupFlags));.    
7310: 73 74 61 74 69 63 46 6c 61 67 20 3d 20 30 3b 0a  staticFlag = 0;.
7320: 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20 28 45 78    }.  pNew = (Ex
7330: 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20  pr *)zAlloc;..  
7340: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
7350: 2f 2a 20 53 65 74 20 6e 4e 65 77 53 69 7a 65 20  /* Set nNewSize 
7360: 74 6f 20 74 68 65 20 73 69 7a 65 20 61 6c 6c 6f  to the size allo
7370: 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 74  cated for the st
7380: 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20  ructure pointed 
7390: 74 6f 0a 20 20 20 20 2a 2a 20 62 79 20 70 4e 65  to.    ** by pNe
73a0: 77 2e 20 54 68 69 73 20 69 73 20 65 69 74 68 65  w. This is eithe
73b0: 72 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c  r EXPR_FULLSIZE,
73c0: 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a   EXPR_REDUCEDSIZ
73d0: 45 20 6f 72 0a 20 20 20 20 2a 2a 20 45 58 50 52  E or.    ** EXPR
73e0: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20  _TOKENONLYSIZE. 
73f0: 6e 54 6f 6b 65 6e 20 69 73 20 73 65 74 20 74 6f  nToken is set to
7400: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
7410: 79 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20  ytes consumed.  
7420: 20 20 2a 2a 20 62 79 20 74 68 65 20 63 6f 70 79    ** by the copy
7430: 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f   of the p->u.zTo
7440: 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20 61  ken string (if a
7450: 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ny)..    */.    
7460: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 6e  const unsigned n
7470: 53 74 72 75 63 74 53 69 7a 65 20 3d 20 64 75 70  StructSize = dup
7480: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
7490: 28 70 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20  (p, dupFlags);. 
74a0: 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4e 65     const int nNe
74b0: 77 53 69 7a 65 20 3d 20 6e 53 74 72 75 63 74 53  wSize = nStructS
74c0: 69 7a 65 20 26 20 30 78 66 66 66 3b 0a 20 20 20  ize & 0xfff;.   
74d0: 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20   int nToken;.   
74e0: 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
74f0: 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56  perty(p, EP_IntV
7500: 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54  alue) && p->u.zT
7510: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 6e 54  oken ){.      nT
7520: 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  oken = sqlite3St
7530: 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b  rlen30(p->u.zTok
7540: 65 6e 29 20 2b 20 31 3b 0a 20 20 20 20 7d 65 6c  en) + 1;.    }el
7550: 73 65 7b 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e  se{.      nToken
7560: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
7570: 69 66 28 20 64 75 70 46 6c 61 67 73 20 29 7b 0a  if( dupFlags ){.
7580: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
7590: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
75a0: 20 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 20   EP_Reduced)==0 
75b0: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
75c0: 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53  zAlloc, p, nNewS
75d0: 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ize);.    }else{
75e0: 0a 20 20 20 20 20 20 75 33 32 20 6e 53 69 7a 65  .      u32 nSize
75f0: 20 3d 20 28 75 33 32 29 65 78 70 72 53 74 72 75   = (u32)exprStru
7600: 63 74 53 69 7a 65 28 70 29 3b 0a 20 20 20 20 20  ctSize(p);.     
7610: 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20   memcpy(zAlloc, 
7620: 70 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20  p, nSize);.     
7630: 20 69 66 28 20 6e 53 69 7a 65 3c 45 58 50 52 5f   if( nSize<EXPR_
7640: 46 55 4c 4c 53 49 5a 45 20 29 7b 20 0a 20 20 20  FULLSIZE ){ .   
7650: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 7a 41 6c       memset(&zAl
7660: 6c 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20 45  loc[nSize], 0, E
7670: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53 69  XPR_FULLSIZE-nSi
7680: 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ze);.      }.   
7690: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74   }..    /* Set t
76a0: 68 65 20 45 50 5f 52 65 64 75 63 65 64 2c 20 45  he EP_Reduced, E
76b0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61 6e 64  P_TokenOnly, and
76c0: 20 45 50 5f 53 74 61 74 69 63 20 66 6c 61 67 73   EP_Static flags
76d0: 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 20   appropriately. 
76e0: 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  */.    pNew->fla
76f0: 67 73 20 26 3d 20 7e 28 45 50 5f 52 65 64 75 63  gs &= ~(EP_Reduc
7700: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  ed|EP_TokenOnly|
7710: 45 50 5f 53 74 61 74 69 63 7c 45 50 5f 4d 65 6d  EP_Static|EP_Mem
7720: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 70 4e 65 77  Token);.    pNew
7730: 2d 3e 66 6c 61 67 73 20 7c 3d 20 6e 53 74 72 75  ->flags |= nStru
7740: 63 74 53 69 7a 65 20 26 20 28 45 50 5f 52 65 64  ctSize & (EP_Red
7750: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
7760: 79 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c  y);.    pNew->fl
7770: 61 67 73 20 7c 3d 20 73 74 61 74 69 63 46 6c 61  ags |= staticFla
7780: 67 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  g;..    /* Copy 
7790: 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20  the p->u.zToken 
77a0: 73 74 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20  string, if any. 
77b0: 2a 2f 0a 20 20 20 20 69 66 28 20 6e 54 6f 6b 65  */.    if( nToke
77c0: 6e 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  n ){.      char 
77d0: 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e  *zToken = pNew->
77e0: 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72  u.zToken = (char
77f0: 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69  *)&zAlloc[nNewSi
7800: 7a 65 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  ze];.      memcp
7810: 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a  y(zToken, p->u.z
7820: 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a  Token, nToken);.
7830: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 30      }..    if( 0
7840: 3d 3d 28 28 70 2d 3e 66 6c 61 67 73 7c 70 4e 65  ==((p->flags|pNe
7850: 77 2d 3e 66 6c 61 67 73 29 20 26 20 45 50 5f 54  w->flags) & EP_T
7860: 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  okenOnly) ){.   
7870: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
7880: 65 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63  e pNew->x.pSelec
7890: 74 20 6f 72 20 70 4e 65 77 2d 3e 78 2e 70 4c 69  t or pNew->x.pLi
78a0: 73 74 20 6d 65 6d 62 65 72 2e 20 2a 2f 0a 20 20  st member. */.  
78b0: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
78c0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49  roperty(p, EP_xI
78d0: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
78e0: 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c      pNew->x.pSel
78f0: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
7900: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e  ectDup(db, p->x.
7910: 70 53 65 6c 65 63 74 2c 20 64 75 70 46 6c 61 67  pSelect, dupFlag
7920: 73 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  s);.      }else{
7930: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78  .        pNew->x
7940: 2e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  .pList = sqlite3
7950: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
7960: 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 64 75 70 46  p->x.pList, dupF
7970: 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lags);.      }. 
7980: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6c     }..    /* Fil
7990: 6c 20 69 6e 20 70 4e 65 77 2d 3e 70 4c 65 66 74  l in pNew->pLeft
79a0: 20 61 6e 64 20 70 4e 65 77 2d 3e 70 52 69 67 68   and pNew->pRigh
79b0: 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 45 78  t. */.    if( Ex
79c0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e  prHasProperty(pN
79d0: 65 77 2c 20 45 50 5f 52 65 64 75 63 65 64 7c 45  ew, EP_Reduced|E
79e0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a  P_TokenOnly) ){.
79f0: 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 2b 3d 20        zAlloc += 
7a00: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
7a10: 65 28 70 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a  e(p, dupFlags);.
7a20: 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
7a30: 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20  sProperty(pNew, 
7a40: 45 50 5f 52 65 64 75 63 65 64 29 20 29 7b 0a 20  EP_Reduced) ){. 
7a50: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65         pNew->pLe
7a60: 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74 20 3f 0a  ft = p->pLeft ?.
7a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a80: 20 20 20 20 20 20 65 78 70 72 44 75 70 28 64 62        exprDup(db
7a90: 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58 50 52  , p->pLeft, EXPR
7aa0: 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c  DUP_REDUCE, &zAl
7ab0: 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20 20 20  loc) : 0;.      
7ac0: 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d    pNew->pRight =
7ad0: 20 70 2d 3e 70 52 69 67 68 74 20 3f 0a 20 20 20   p->pRight ?.   
7ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7af0: 20 20 20 20 65 78 70 72 44 75 70 28 64 62 2c 20      exprDup(db, 
7b00: 70 2d 3e 70 52 69 67 68 74 2c 20 45 58 50 52 44  p->pRight, EXPRD
7b10: 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c  UP_REDUCE, &zAll
7b20: 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20 20 20 7d  oc) : 0;.      }
7b30: 0a 20 20 20 20 20 20 69 66 28 20 70 7a 42 75 66  .      if( pzBuf
7b40: 66 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  fer ){.        *
7b50: 70 7a 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f  pzBuffer = zAllo
7b60: 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
7b70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
7b80: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
7b90: 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  (p, EP_TokenOnly
7ba0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) ){.        pNe
7bb0: 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  w->pLeft = sqlit
7bc0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
7bd0: 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20  >pLeft, 0);.    
7be0: 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74      pNew->pRight
7bf0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
7c00: 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c  p(db, p->pRight,
7c10: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
7c20: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
7c30: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  pNew;.}../*.** C
7c40: 72 65 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e  reate and return
7c50: 20 61 20 64 65 65 70 20 63 6f 70 79 20 6f 66 20   a deep copy of 
7c60: 74 68 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65  the object passe
7c70: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
7c80: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 49 66  .** argument. If
7c90: 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f   an OOM conditio
7ca0: 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  n is encountered
7cb0: 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
7cc0: 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 62  ed.** and the db
7cd0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  ->mallocFailed f
7ce0: 6c 61 67 20 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e  lag set..*/.#ifn
7cf0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7d00: 43 54 45 0a 73 74 61 74 69 63 20 57 69 74 68 20  CTE.static With 
7d10: 2a 77 69 74 68 44 75 70 28 73 71 6c 69 74 65 33  *withDup(sqlite3
7d20: 20 2a 64 62 2c 20 57 69 74 68 20 2a 70 29 7b 0a   *db, With *p){.
7d30: 20 20 57 69 74 68 20 2a 70 52 65 74 20 3d 20 30    With *pRet = 0
7d40: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
7d50: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a   int nByte = siz
7d60: 65 6f 66 28 2a 70 29 20 2b 20 73 69 7a 65 6f 66  eof(*p) + sizeof
7d70: 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e  (p->a[0]) * (p->
7d80: 6e 43 74 65 2d 31 29 3b 0a 20 20 20 20 70 52 65  nCte-1);.    pRe
7d90: 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
7da0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
7db0: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74  e);.    if( pRet
7dc0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
7dd0: 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 43 74  .      pRet->nCt
7de0: 65 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a 20 20 20  e = p->nCte;.   
7df0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
7e00: 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCte; i++){.   
7e10: 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e       pRet->a[i].
7e20: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
7e30: 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
7e40: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20  ->a[i].pSelect, 
7e50: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74  0);.        pRet
7e60: 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20 3d 20 73  ->a[i].pCols = s
7e70: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
7e80: 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43  p(db, p->a[i].pC
7e90: 6f 6c 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ols, 0);.       
7ea0: 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d   pRet->a[i].zNam
7eb0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
7ec0: 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e  Dup(db, p->a[i].
7ed0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
7ee0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
7ef0: 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65  rn pRet;.}.#else
7f00: 0a 23 20 64 65 66 69 6e 65 20 77 69 74 68 44 75  .# define withDu
7f10: 70 28 78 2c 79 29 20 30 0a 23 65 6e 64 69 66 0a  p(x,y) 0.#endif.
7f20: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
7f30: 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f  wing group of ro
7f40: 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70  utines make deep
7f50: 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65   copies of expre
7f60: 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65  ssions,.** expre
7f70: 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20  ssion lists, ID 
7f80: 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63  lists, and selec
7f90: 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54  t statements.  T
7fa0: 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a  he copies can.**
7fb0: 20 62 65 20 64 65 6c 65 74 65 64 20 28 62 79 20   be deleted (by 
7fc0: 62 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20  being passed to 
7fd0: 74 68 65 69 72 20 72 65 73 70 65 63 74 69 76 65  their respective
7fe0: 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75   ...Delete() rou
7ff0: 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75  tines).** withou
8000: 74 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20  t effecting the 
8010: 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a  originals..**.**
8020: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
8030: 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f  list, ID, and so
8040: 75 72 63 65 20 6c 69 73 74 73 20 72 65 74 75 72  urce lists retur
8050: 6e 20 62 79 20 73 71 6c 69 74 65 33 45 78 70 72  n by sqlite3Expr
8060: 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71  ListDup(),.** sq
8070: 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 29  lite3IdListDup()
8080: 2c 20 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63  , and sqlite3Src
8090: 4c 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f  ListDup() can no
80a0: 74 20 62 65 20 66 75 72 74 68 65 72 20 65 78 70  t be further exp
80b0: 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62  anded .** by sub
80c0: 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
80d0: 20 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65   sqlite*ListAppe
80e0: 6e 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a  nd() routines..*
80f0: 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20  *.** Any tables 
8100: 74 68 61 74 20 74 68 65 20 53 72 63 4c 69 73 74  that the SrcList
8110: 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
8120: 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74  are not duplicat
8130: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c  ed..**.** The fl
8140: 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 63 6f  ags parameter co
8150: 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61  ntains a combina
8160: 74 69 6f 6e 20 6f 66 20 74 68 65 20 45 58 50 52  tion of the EXPR
8170: 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a  DUP_XXX flags..*
8180: 2a 20 49 66 20 74 68 65 20 45 58 50 52 44 55 50  * If the EXPRDUP
8190: 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69 73 20  _REDUCE flag is 
81a0: 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 73 74  set, then the st
81b0: 72 75 63 74 75 72 65 20 72 65 74 75 72 6e 65 64  ructure returned
81c0: 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74   is a.** truncat
81d0: 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  ed version of th
81e0: 65 20 75 73 75 61 6c 20 45 78 70 72 20 73 74 72  e usual Expr str
81f0: 75 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c  ucture that will
8200: 20 62 65 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a   be stored as.**
8210: 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 2d   part of the in-
8220: 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74  memory represent
8230: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74  ation of the dat
8240: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f  abase schema..*/
8250: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
8260: 70 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  prDup(sqlite3 *d
8270: 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  b, Expr *p, int 
8280: 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74  flags){.  assert
8290: 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c  ( flags==0 || fl
82a0: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
82b0: 55 43 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  UCE );.  return 
82c0: 70 20 3f 20 65 78 70 72 44 75 70 28 64 62 2c 20  p ? exprDup(db, 
82d0: 70 2c 20 66 6c 61 67 73 2c 20 30 29 20 3a 20 30  p, flags, 0) : 0
82e0: 3b 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71  ;.}.ExprList *sq
82f0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
8300: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
8310: 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66  prList *p, int f
8320: 6c 61 67 73 29 7b 0a 20 20 45 78 70 72 4c 69 73  lags){.  ExprLis
8330: 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63  t *pNew;.  struc
8340: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
8350: 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65  *pItem, *pOldIte
8360: 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  m;.  int i;.  as
8370: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
8380: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
8390: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
83a0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
83b0: 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  wNN(db, sizeof(*
83c0: 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70  pNew) );.  if( p
83d0: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
83e0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72  0;.  pNew->nExpr
83f0: 20 3d 20 69 20 3d 20 70 2d 3e 6e 45 78 70 72 3b   = i = p->nExpr;
8400: 0a 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20  .  if( (flags & 
8410: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3d  EXPRDUP_REDUCE)=
8420: 3d 30 20 29 20 66 6f 72 28 69 3d 31 3b 20 69 3c  =0 ) for(i=1; i<
8430: 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 3d 69 29 7b  p->nExpr; i+=i){
8440: 7d 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49  }.  pNew->a = pI
8450: 74 65 6d 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  tem = sqlite3DbM
8460: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 20  allocRawNN(db,  
8470: 69 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  i*sizeof(p->a[0]
8480: 29 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65 6d  ) );.  if( pItem
8490: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
84a0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65  e3DbFree(db, pNe
84b0: 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  w);.    return 0
84c0: 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65  ;.  } .  pOldIte
84d0: 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28  m = p->a;.  for(
84e0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=0; i<p->nExpr;
84f0: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70   i++, pItem++, p
8500: 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  OldItem++){.    
8510: 45 78 70 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d  Expr *pOldExpr =
8520: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72   pOldItem->pExpr
8530: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78  ;.    pItem->pEx
8540: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
8550: 44 75 70 28 64 62 2c 20 70 4f 6c 64 45 78 70 72  Dup(db, pOldExpr
8560: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 49  , flags);.    pI
8570: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
8580: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
8590: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pOldItem->zName
85a0: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53  );.    pItem->zS
85b0: 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53  pan = sqlite3DbS
85c0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
85d0: 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  em->zSpan);.    
85e0: 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pItem->sortOrder
85f0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72   = pOldItem->sor
8600: 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65  tOrder;.    pIte
8610: 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20  m->done = 0;.   
8620: 20 70 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54   pItem->bSpanIsT
8630: 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62  ab = pOldItem->b
8640: 53 70 61 6e 49 73 54 61 62 3b 0a 20 20 20 20 70  SpanIsTab;.    p
8650: 49 74 65 6d 2d 3e 75 20 3d 20 70 4f 6c 64 49 74  Item->u = pOldIt
8660: 65 6d 2d 3e 75 3b 0a 20 20 7d 0a 20 20 72 65 74  em->u;.  }.  ret
8670: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
8680: 2a 2a 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74  ** If cursors, t
8690: 72 69 67 67 65 72 73 2c 20 76 69 65 77 73 20 61  riggers, views a
86a0: 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 61 72  nd subqueries ar
86b0: 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72  e all omitted fr
86c0: 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c  om.** the build,
86d0: 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68   then none of th
86e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
86f0: 69 6e 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72  ines, except for
8700: 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65   .** sqlite3Sele
8710: 63 74 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20  ctDup(), can be 
8720: 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53  called. sqlite3S
8730: 65 6c 65 63 74 44 75 70 28 29 20 69 73 20 73 6f  electDup() is so
8740: 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65  metimes.** calle
8750: 64 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72  d with a NULL ar
8760: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21  gument..*/.#if !
8770: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
8780: 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
8790: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
87a0: 54 5f 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c  T_TRIGGER) \. ||
87b0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
87c0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a  _OMIT_SUBQUERY).
87d0: 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  SrcList *sqlite3
87e0: 53 72 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74  SrcListDup(sqlit
87f0: 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20  e3 *db, SrcList 
8800: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
8810: 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b    SrcList *pNew;
8820: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
8830: 6e 42 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28  nByte;.  assert(
8840: 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   db!=0 );.  if( 
8850: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
8860: 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  .  nByte = sizeo
8870: 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63  f(*p) + (p->nSrc
8880: 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61  >0 ? sizeof(p->a
8890: 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d  [0]) * (p->nSrc-
88a0: 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20  1) : 0);.  pNew 
88b0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
88c0: 63 52 61 77 4e 4e 28 64 62 2c 20 6e 42 79 74 65  cRawNN(db, nByte
88d0: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
88e0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
88f0: 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65  pNew->nSrc = pNe
8900: 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e  w->nAlloc = p->n
8910: 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  Src;.  for(i=0; 
8920: 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  i<p->nSrc; i++){
8930: 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
8940: 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74  ist_item *pNewIt
8950: 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d  em = &pNew->a[i]
8960: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  ;.    struct Src
8970: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49  List_item *pOldI
8980: 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a  tem = &p->a[i];.
8990: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
89a0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
89b0: 53 63 68 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65  Schema = pOldIte
89c0: 6d 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20  m->pSchema;.    
89d0: 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62  pNewItem->zDatab
89e0: 61 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ase = sqlite3DbS
89f0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
8a00: 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  em->zDatabase);.
8a10: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e      pNewItem->zN
8a20: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
8a30: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
8a40: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
8a50: 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  pNewItem->zAlias
8a60: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
8a70: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
8a80: 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e  >zAlias);.    pN
8a90: 65 77 49 74 65 6d 2d 3e 66 67 20 3d 20 70 4f 6c  ewItem->fg = pOl
8aa0: 64 49 74 65 6d 2d 3e 66 67 3b 0a 20 20 20 20 70  dItem->fg;.    p
8ab0: 4e 65 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  NewItem->iCursor
8ac0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75   = pOldItem->iCu
8ad0: 72 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74  rsor;.    pNewIt
8ae0: 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
8af0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 61 64 64 72  = pOldItem->addr
8b00: 46 69 6c 6c 53 75 62 3b 0a 20 20 20 20 70 4e 65  FillSub;.    pNe
8b10: 77 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  wItem->regReturn
8b20: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 72 65 67   = pOldItem->reg
8b30: 52 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20  Return;.    if( 
8b40: 70 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 49  pNewItem->fg.isI
8b50: 6e 64 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20  ndexedBy ){.    
8b60: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 7a    pNewItem->u1.z
8b70: 49 6e 64 65 78 65 64 42 79 20 3d 20 73 71 6c 69  IndexedBy = sqli
8b80: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
8b90: 70 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e  pOldItem->u1.zIn
8ba0: 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a  dexedBy);.    }.
8bb0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49      pNewItem->pI
8bc0: 42 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74 65  BIndex = pOldIte
8bd0: 6d 2d 3e 70 49 42 49 6e 64 65 78 3b 0a 20 20 20  m->pIBIndex;.   
8be0: 20 69 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66   if( pNewItem->f
8bf0: 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20  g.isTabFunc ){. 
8c00: 20 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75       pNewItem->u
8c10: 31 2e 70 46 75 6e 63 41 72 67 20 3d 20 0a 20 20  1.pFuncArg = .  
8c20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
8c30: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
8c40: 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e  OldItem->u1.pFun
8c50: 63 41 72 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20  cArg, flags);.  
8c60: 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 70    }.    pTab = p
8c70: 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20  NewItem->pTab = 
8c80: 70 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pOldItem->pTab;.
8c90: 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a      if( pTab ){.
8ca0: 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66        pTab->nRef
8cb0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  ++;.    }.    pN
8cc0: 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20  ewItem->pSelect 
8cd0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
8ce0: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
8cf0: 3e 70 53 65 6c 65 63 74 2c 20 66 6c 61 67 73 29  >pSelect, flags)
8d00: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
8d10: 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pOn = sqlite3Exp
8d20: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
8d30: 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a  m->pOn, flags);.
8d40: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55      pNewItem->pU
8d50: 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64  sing = sqlite3Id
8d60: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64  ListDup(db, pOld
8d70: 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20  Item->pUsing);. 
8d80: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c     pNewItem->col
8d90: 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  Used = pOldItem-
8da0: 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20  >colUsed;.  }.  
8db0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49  return pNew;.}.I
8dc0: 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64  dList *sqlite3Id
8dd0: 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20  ListDup(sqlite3 
8de0: 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b  *db, IdList *p){
8df0: 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b  .  IdList *pNew;
8e00: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
8e10: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69  rt( db!=0 );.  i
8e20: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
8e30: 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   0;.  pNew = sql
8e40: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
8e50: 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e  N(db, sizeof(*pN
8e60: 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  ew) );.  if( pNe
8e70: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
8e80: 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70  .  pNew->nId = p
8e90: 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61  ->nId;.  pNew->a
8ea0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
8eb0: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 70 2d 3e 6e  ocRawNN(db, p->n
8ec0: 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30  Id*sizeof(p->a[0
8ed0: 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  ]) );.  if( pNew
8ee0: 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ->a==0 ){.    sq
8ef0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
8f00: 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72  pNew);.    retur
8f10: 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f  n 0;.  }.  /* No
8f20: 74 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20  te that because 
8f30: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
8f40: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70  allocation for p
8f50: 2d 3e 61 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a  ->a[] is not.  *
8f60: 2a 20 6e 65 63 65 73 73 61 72 69 6c 79 20 61 20  * necessarily a 
8f70: 70 6f 77 65 72 20 6f 66 20 74 77 6f 2c 20 73 71  power of two, sq
8f80: 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e  lite3IdListAppen
8f90: 64 28 29 20 6d 61 79 20 6e 6f 74 20 62 65 20 63  d() may not be c
8fa0: 61 6c 6c 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68  alled.  ** on th
8fb0: 65 20 64 75 70 6c 69 63 61 74 65 20 63 72 65 61  e duplicate crea
8fc0: 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
8fd0: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  tion. */.  for(i
8fe0: 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b  =0; i<p->nId; i+
8ff0: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49  +){.    struct I
9000: 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77  dList_item *pNew
9010: 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b  Item = &pNew->a[
9020: 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49  i];.    struct I
9030: 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64  dList_item *pOld
9040: 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b  Item = &p->a[i];
9050: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a  .    pNewItem->z
9060: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
9070: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
9080: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
9090: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d   pNewItem->idx =
90a0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a   pOldItem->idx;.
90b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
90c0: 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c  w;.}.Select *sql
90d0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71  ite3SelectDup(sq
90e0: 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63  lite3 *db, Selec
90f0: 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  t *p, int flags)
9100: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  {.  Select *pNew
9110: 2c 20 2a 70 50 72 69 6f 72 3b 0a 20 20 61 73 73  , *pPrior;.  ass
9120: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
9130: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
9140: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
9150: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
9160: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  NN(db, sizeof(*p
9170: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
9180: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
9190: 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20   pNew->pEList = 
91a0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
91b0: 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74  up(db, p->pEList
91c0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
91d0: 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  ->pSrc = sqlite3
91e0: 53 72 63 4c 69 73 74 44 75 70 28 64 62 2c 20 70  SrcListDup(db, p
91f0: 2d 3e 70 53 72 63 2c 20 66 6c 61 67 73 29 3b 0a  ->pSrc, flags);.
9200: 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d    pNew->pWhere =
9210: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
9220: 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 66  db, p->pWhere, f
9230: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  lags);.  pNew->p
9240: 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
9250: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
9260: 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c   p->pGroupBy, fl
9270: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48  ags);.  pNew->pH
9280: 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45  aving = sqlite3E
9290: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 48  xprDup(db, p->pH
92a0: 61 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b 0a 20  aving, flags);. 
92b0: 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
92c0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
92d0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64  tDup(db, p->pOrd
92e0: 65 72 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20  erBy, flags);.  
92f0: 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70  pNew->op = p->op
9300: 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  ;.  pNew->pPrior
9310: 20 3d 20 70 50 72 69 6f 72 20 3d 20 73 71 6c 69   = pPrior = sqli
9320: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
9330: 20 70 2d 3e 70 50 72 69 6f 72 2c 20 66 6c 61 67   p->pPrior, flag
9340: 73 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72  s);.  if( pPrior
9350: 20 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74   ) pPrior->pNext
9360: 20 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d   = pNew;.  pNew-
9370: 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 4e  >pNext = 0;.  pN
9380: 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c  ew->pLimit = sql
9390: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
93a0: 70 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61 67 73  p->pLimit, flags
93b0: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73  );.  pNew->pOffs
93c0: 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  et = sqlite3Expr
93d0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73  Dup(db, p->pOffs
93e0: 65 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e  et, flags);.  pN
93f0: 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  ew->iLimit = 0;.
9400: 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20    pNew->iOffset 
9410: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c  = 0;.  pNew->sel
9420: 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c  Flags = p->selFl
9430: 61 67 73 20 26 20 7e 53 46 5f 55 73 65 73 45 70  ags & ~SF_UsesEp
9440: 68 65 6d 65 72 61 6c 3b 0a 20 20 70 4e 65 77 2d  hemeral;.  pNew-
9450: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
9460: 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61   = -1;.  pNew->a
9470: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d  ddrOpenEphm[1] =
9480: 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 65   -1;.  pNew->nSe
9490: 6c 65 63 74 52 6f 77 20 3d 20 70 2d 3e 6e 53 65  lectRow = p->nSe
94a0: 6c 65 63 74 52 6f 77 3b 0a 20 20 70 4e 65 77 2d  lectRow;.  pNew-
94b0: 3e 70 57 69 74 68 20 3d 20 77 69 74 68 44 75 70  >pWith = withDup
94c0: 28 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a  (db, p->pWith);.
94d0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53    sqlite3SelectS
94e0: 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20 70 2d 3e  etName(pNew, p->
94f0: 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 72 65 74  zSelName);.  ret
9500: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73  urn pNew;.}.#els
9510: 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65  e.Select *sqlite
9520: 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74  3SelectDup(sqlit
9530: 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a  e3 *db, Select *
9540: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
9550: 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b   assert( p==0 );
9560: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
9570: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64  endif.../*.** Ad
9580: 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
9590: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e  to the end of an
95a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
95b0: 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a  .  If pList is.*
95c0: 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c  * initially NULL
95d0: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
95e0: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  new expression l
95f0: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ist..**.** If a 
9600: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
9610: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
9620: 74 68 65 20 65 6e 74 69 72 65 20 6c 69 73 74 20  the entire list 
9630: 69 73 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a 20  is freed and.** 
9640: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
9650: 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69  .  If non-NULL i
9660: 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e  s returned, then
9670: 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
9680: 64 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65  d.** that the ne
9690: 77 20 65 6e 74 72 79 20 77 61 73 20 73 75 63 63  w entry was succ
96a0: 65 73 73 66 75 6c 6c 79 20 61 70 70 65 6e 64 65  essfully appende
96b0: 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a  d..*/.ExprList *
96c0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
96d0: 70 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a  ppend(.  Parse *
96e0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
96f0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
9700: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
9710: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  t *pList,       
9720: 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63   /* List to whic
9730: 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67  h to append. Mig
9740: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
9750: 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20  Expr *pExpr     
9760: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
9770: 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65  ssion to be appe
9780: 6e 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e  nded. Might be N
9790: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ULL */.){.  sqli
97a0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
97b0: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
97c0: 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  db!=0 );.  if( p
97d0: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
97e0: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62  List = sqlite3Db
97f0: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
9800: 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29  sizeof(ExprList)
9810: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
9820: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  t==0 ){.      go
9830: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d  to no_mem;.    }
9840: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 45 78 70  .    pList->nExp
9850: 72 20 3d 20 30 3b 0a 20 20 20 20 70 4c 69 73 74  r = 0;.    pList
9860: 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ->a = sqlite3DbM
9870: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
9880: 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
9890: 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ]));.    if( pLi
98a0: 73 74 2d 3e 61 3d 3d 30 20 29 20 67 6f 74 6f 20  st->a==0 ) goto 
98b0: 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 65 6c 73 65 20  no_mem;.  }else 
98c0: 69 66 28 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70  if( (pList->nExp
98d0: 72 20 26 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70  r & (pList->nExp
98e0: 72 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  r-1))==0 ){.    
98f0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
9900: 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 61 73 73  item *a;.    ass
9910: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
9920: 72 3e 30 20 29 3b 0a 20 20 20 20 61 20 3d 20 73  r>0 );.    a = s
9930: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
9940: 64 62 2c 20 70 4c 69 73 74 2d 3e 61 2c 20 70 4c  db, pList->a, pL
9950: 69 73 74 2d 3e 6e 45 78 70 72 2a 32 2a 73 69 7a  ist->nExpr*2*siz
9960: 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
9970: 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20  );.    if( a==0 
9980: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f  ){.      goto no
9990: 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _mem;.    }.    
99a0: 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20  pList->a = a;.  
99b0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  }.  assert( pLis
99c0: 74 2d 3e 61 21 3d 30 20 29 3b 0a 20 20 69 66 28  t->a!=0 );.  if(
99d0: 20 31 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74   1 ){.    struct
99e0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
99f0: 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
9a00: 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b  a[pList->nExpr++
9a10: 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49  ];.    memset(pI
9a20: 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  tem, 0, sizeof(*
9a30: 70 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49 74  pItem));.    pIt
9a40: 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  em->pExpr = pExp
9a50: 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  r;.  }.  return 
9a60: 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20  pList;..no_mem: 
9a70: 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20      .  /* Avoid 
9a80: 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69  leaking memory i
9a90: 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69  f malloc has fai
9aa0: 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  led. */.  sqlite
9ab0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
9ac0: 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65  pExpr);.  sqlite
9ad0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
9ae0: 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65  db, pList);.  re
9af0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
9b00: 20 53 65 74 20 74 68 65 20 73 6f 72 74 20 6f 72   Set the sort or
9b10: 64 65 72 20 66 6f 72 20 74 68 65 20 6c 61 73 74  der for the last
9b20: 20 65 6c 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20   element on the 
9b30: 67 69 76 65 6e 20 45 78 70 72 4c 69 73 74 2e 0a  given ExprList..
9b40: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
9b50: 78 70 72 4c 69 73 74 53 65 74 53 6f 72 74 4f 72  xprListSetSortOr
9b60: 64 65 72 28 45 78 70 72 4c 69 73 74 20 2a 70 2c  der(ExprList *p,
9b70: 20 69 6e 74 20 69 53 6f 72 74 4f 72 64 65 72 29   int iSortOrder)
9b80: 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  {.  if( p==0 ) r
9b90: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
9ba0: 20 53 51 4c 49 54 45 5f 53 4f 5f 55 4e 44 45 46   SQLITE_SO_UNDEF
9bb0: 49 4e 45 44 3c 30 20 26 26 20 53 51 4c 49 54 45  INED<0 && SQLITE
9bc0: 5f 53 4f 5f 41 53 43 3e 3d 30 20 26 26 20 53 51  _SO_ASC>=0 && SQ
9bd0: 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3e 30 20 29  LITE_SO_DESC>0 )
9be0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
9bf0: 45 78 70 72 3e 30 20 29 3b 0a 20 20 69 66 28 20  Expr>0 );.  if( 
9c00: 69 53 6f 72 74 4f 72 64 65 72 3c 30 20 29 7b 0a  iSortOrder<0 ){.
9c10: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
9c20: 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72  [p->nExpr-1].sor
9c30: 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53  tOrder==SQLITE_S
9c40: 4f 5f 41 53 43 20 29 3b 0a 20 20 20 20 72 65 74  O_ASC );.    ret
9c50: 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61 5b  urn;.  }.  p->a[
9c60: 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74  p->nExpr-1].sort
9c70: 4f 72 64 65 72 20 3d 20 28 75 38 29 69 53 6f 72  Order = (u8)iSor
9c80: 74 4f 72 64 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tOrder;.}../*.**
9c90: 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73   Set the ExprLis
9ca0: 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d  t.a[].zName elem
9cb0: 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ent of the most 
9cc0: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69  recently added i
9cd0: 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78  tem.** on the ex
9ce0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
9cf0: 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74  *.** pList might
9d00: 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69   be NULL followi
9d10: 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  ng an OOM error.
9d20: 20 20 42 75 74 20 70 4e 61 6d 65 20 73 68 6f 75    But pName shou
9d30: 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e  ld never be.** N
9d40: 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72  ULL.  If a memor
9d50: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
9d60: 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e  ls, the pParse->
9d70: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9d80: 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e   flag.** is set.
9d90: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9da0: 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28  ExprListSetName(
9db0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9dc0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
9dd0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
9de0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
9df0: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st,        /* Li
9e00: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
9e10: 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a  dd the span. */.
9e20: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20    Token *pName, 
9e30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
9e40: 65 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f  e to be added */
9e50: 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20  .  int dequote  
9e60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
9e70: 75 65 20 74 6f 20 63 61 75 73 65 20 74 68 65 20  ue to cause the 
9e80: 6e 61 6d 65 20 74 6f 20 62 65 20 64 65 71 75 6f  name to be dequo
9e90: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  ted */.){.  asse
9ea0: 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20  rt( pList!=0 || 
9eb0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
9ec0: 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20  ocFailed!=0 );. 
9ed0: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
9ee0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
9ef0: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
9f00: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
9f10: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20  ->nExpr>0 );.   
9f20: 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d   pItem = &pList-
9f30: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  >a[pList->nExpr-
9f40: 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
9f50: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20  pItem->zName==0 
9f60: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e  );.    pItem->zN
9f70: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
9f80: 74 72 4e 44 75 70 28 70 50 61 72 73 65 2d 3e 64  trNDup(pParse->d
9f90: 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61  b, pName->z, pNa
9fa0: 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20  me->n);.    if( 
9fb0: 64 65 71 75 6f 74 65 20 26 26 20 70 49 74 65 6d  dequote && pItem
9fc0: 2d 3e 7a 4e 61 6d 65 20 29 20 73 71 6c 69 74 65  ->zName ) sqlite
9fd0: 33 44 65 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e  3Dequote(pItem->
9fe0: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  zName);.  }.}../
9ff0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
a000: 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20  rList.a[].zSpan 
a010: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d  element of the m
a020: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
a030: 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68  ed item.** on th
a040: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
a050: 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d  t..**.** pList m
a060: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c  ight be NULL fol
a070: 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72  lowing an OOM er
a080: 72 6f 72 2e 20 20 42 75 74 20 70 53 70 61 6e 20  ror.  But pSpan 
a090: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a  should never be.
a0a0: 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d  ** NULL.  If a m
a0b0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
a0c0: 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72   fails, the pPar
a0d0: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
a0e0: 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20  iled flag.** is 
a0f0: 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
a100: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53  ite3ExprListSetS
a110: 70 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  pan(.  Parse *pP
a120: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
a130: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
a140: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
a150: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  *pList,        /
a160: 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20  * List to which 
a170: 74 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e  to add the span.
a180: 20 2a 2f 0a 20 20 45 78 70 72 53 70 61 6e 20 2a   */.  ExprSpan *
a190: 70 53 70 61 6e 20 20 20 20 20 20 20 20 20 2f 2a  pSpan         /*
a1a0: 20 54 68 65 20 73 70 61 6e 20 74 6f 20 62 65 20   The span to be 
a1b0: 61 64 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 71  added */.){.  sq
a1c0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
a1d0: 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  se->db;.  assert
a1e0: 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62  ( pList!=0 || db
a1f0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d  ->mallocFailed!=
a200: 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  0 );.  if( pList
a210: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
a220: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
a230: 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  tem = &pList->a[
a240: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b  pList->nExpr-1];
a250: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
a260: 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
a270: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
a280: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70  allocFailed || p
a290: 49 74 65 6d 2d 3e 70 45 78 70 72 3d 3d 70 53 70  Item->pExpr==pSp
a2a0: 61 6e 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20  an->pExpr );.   
a2b0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
a2c0: 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29  b, pItem->zSpan)
a2d0: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70  ;.    pItem->zSp
a2e0: 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  an = sqlite3DbSt
a2f0: 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a  rNDup(db, (char*
a300: 29 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a  )pSpan->zStart,.
a310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a330: 20 20 20 20 28 69 6e 74 29 28 70 53 70 61 6e 2d      (int)(pSpan-
a340: 3e 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a  >zEnd - pSpan->z
a350: 53 74 61 72 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  Start));.  }.}..
a360: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
a370: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c  ression list pEL
a380: 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72  ist contains mor
a390: 65 20 74 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c  e than iLimit el
a3a0: 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65  ements,.** leave
a3b0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
a3c0: 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  e in pParse..*/.
a3d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
a3e0: 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28  ListCheckLength(
a3f0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
a400: 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ,.  ExprList *pE
a410: 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68  List,.  const ch
a420: 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20  ar *zObject.){. 
a430: 20 69 6e 74 20 6d 78 20 3d 20 70 50 61 72 73 65   int mx = pParse
a440: 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ->db->aLimit[SQL
a450: 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
a460: 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  ];.  testcase( p
a470: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
a480: 3e 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20  >nExpr==mx );.  
a490: 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74  testcase( pEList
a4a0: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
a4b0: 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28  r==mx+1 );.  if(
a4c0: 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
a4d0: 74 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20  t->nExpr>mx ){. 
a4e0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
a4f0: 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
a500: 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  many columns in 
a510: 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20  %s", zObject);. 
a520: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
a530: 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70  te an entire exp
a540: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f  ression list..*/
a550: 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
a560: 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 65 78 70  OINLINE void exp
a570: 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28 73 71  rListDeleteNN(sq
a580: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c  lite3 *db, ExprL
a590: 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
a5a0: 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 45  nt i;.  struct E
a5b0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
a5c0: 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  tem;.  assert( p
a5d0: 4c 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 70 4c  List->a!=0 || pL
a5e0: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 29 3b  ist->nExpr==0 );
a5f0: 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69  .  for(pItem=pLi
a600: 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c  st->a, i=0; i<pL
a610: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  ist->nExpr; i++,
a620: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73   pItem++){.    s
a630: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
a640: 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  (db, pItem->pExp
a650: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  r);.    sqlite3D
a660: 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
a670: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
a680: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
a690: 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20  Item->zSpan);.  
a6a0: 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
a6b0: 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b  e(db, pList->a);
a6c0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
a6d0: 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 76  (db, pList);.}.v
a6e0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
a6f0: 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65  istDelete(sqlite
a700: 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20  3 *db, ExprList 
a710: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 66 28 20 70  *pList){.  if( p
a720: 4c 69 73 74 20 29 20 65 78 70 72 4c 69 73 74 44  List ) exprListD
a730: 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 4c 69 73  eleteNN(db, pLis
a740: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  t);.}../*.** Ret
a750: 75 72 6e 20 74 68 65 20 62 69 74 77 69 73 65 2d  urn the bitwise-
a760: 4f 52 20 6f 66 20 61 6c 6c 20 45 78 70 72 2e 66  OR of all Expr.f
a770: 6c 61 67 73 20 66 69 65 6c 64 73 20 69 6e 20 74  lags fields in t
a780: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 45 78 70 72  he given.** Expr
a790: 4c 69 73 74 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  List..*/.u32 sql
a7a0: 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67  ite3ExprListFlag
a7b0: 73 28 63 6f 6e 73 74 20 45 78 70 72 4c 69 73 74  s(const ExprList
a7c0: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
a7d0: 69 3b 0a 20 20 75 33 32 20 6d 20 3d 20 30 3b 0a  i;.  u32 m = 0;.
a7e0: 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
a7f0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c     for(i=0; i<pL
a800: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
a810: 7b 0a 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  {.       Expr *p
a820: 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Expr = pList->a[
a830: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
a840: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 21 3d   assert( pExpr!=
a850: 30 20 29 3b 0a 20 20 20 20 20 20 20 6d 20 7c 3d  0 );.       m |=
a860: 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 3b 0a 20   pExpr->flags;. 
a870: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
a880: 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n m;.}../*.** Th
a890: 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
a8a0: 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b   Walker callback
a8b0: 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20  s used to check 
a8c0: 65 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 0a 2a  expressions to.*
a8d0: 2a 20 73 65 65 20 69 66 20 74 68 65 79 20 61 72  * see if they ar
a8e0: 65 20 22 63 6f 6e 73 74 61 6e 74 22 20 66 6f 72  e "constant" for
a8f0: 20 73 6f 6d 65 20 64 65 66 69 6e 69 74 69 6f 6e   some definition
a900: 20 6f 66 20 63 6f 6e 73 74 61 6e 74 2e 20 20 54   of constant.  T
a910: 68 65 0a 2a 2a 20 57 61 6c 6b 65 72 2e 65 43 6f  he.** Walker.eCo
a920: 64 65 20 76 61 6c 75 65 20 64 65 74 65 72 6d 69  de value determi
a930: 6e 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20  nes the type of 
a940: 22 63 6f 6e 73 74 61 6e 74 22 20 77 65 20 61 72  "constant" we ar
a950: 65 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72  e looking.** for
a960: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61  ..**.** These ca
a970: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20  llback routines 
a980: 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c  are used to impl
a990: 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77  ement the follow
a9a0: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73  ing:.**.**     s
a9b0: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
a9c0: 74 61 6e 74 28 29 20 20 20 20 20 20 20 20 20 20  tant()          
a9d0: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
a9e0: 3e 65 43 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20 20  >eCode==1.**    
a9f0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
aa00: 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20  nstantNotJoin() 
aa10: 20 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65            pWalke
aa20: 72 2d 3e 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20  r->eCode==2.**  
aa30: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73     sqlite3ExprIs
aa40: 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 29 20  TableConstant() 
aa50: 20 20 20 20 20 20 20 20 20 20 20 20 70 57 61 6c              pWal
aa60: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a  ker->eCode==3.**
aa70: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
aa80: 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63  IsConstantOrFunc
aa90: 74 69 6f 6e 28 29 20 20 20 20 20 20 20 20 70 57  tion()        pW
aaa0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20  alker->eCode==4 
aab0: 6f 72 20 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c  or 5.**.** In al
aac0: 6c 20 63 61 73 65 73 2c 20 74 68 65 20 63 61 6c  l cases, the cal
aad0: 6c 62 61 63 6b 73 20 73 65 74 20 57 61 6c 6b 65  lbacks set Walke
aae0: 72 2e 65 43 6f 64 65 3d 30 20 61 6e 64 20 61 62  r.eCode=0 and ab
aaf0: 6f 72 74 20 69 66 20 74 68 65 20 65 78 70 72 65  ort if the expre
ab00: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e  ssion.** is foun
ab10: 64 20 74 6f 20 6e 6f 74 20 62 65 20 61 20 63 6f  d to not be a co
ab20: 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  nstant..**.** Th
ab30: 65 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  e sqlite3ExprIsC
ab40: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
ab50: 6e 28 29 20 69 73 20 75 73 65 64 20 66 6f 72 20  n() is used for 
ab60: 65 76 61 6c 75 61 74 69 6e 67 20 65 78 70 72 65  evaluating expre
ab70: 73 73 69 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20 43  ssions.** in a C
ab80: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
ab90: 65 6d 65 6e 74 2e 20 20 54 68 65 20 57 61 6c 6b  ement.  The Walk
aba0: 65 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 69  er.eCode value i
abb0: 73 20 35 20 77 68 65 6e 20 70 61 72 73 69 6e 67  s 5 when parsing
abc0: 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20  .** an existing 
abd0: 73 63 68 65 6d 61 20 61 6e 64 20 34 20 77 68 65  schema and 4 whe
abe0: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20 6e  n processing a n
abf0: 65 77 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41  ew statement.  A
ac00: 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65   bound.** parame
ac10: 74 65 72 20 72 61 69 73 65 73 20 61 6e 20 65 72  ter raises an er
ac20: 72 6f 72 20 66 6f 72 20 6e 65 77 20 73 74 61 74  ror for new stat
ac30: 65 6d 65 6e 74 73 2c 20 62 75 74 20 69 73 20 73  ements, but is s
ac40: 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 65  ilently converte
ac50: 64 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f 72  d.** to NULL for
ac60: 20 65 78 69 73 74 69 6e 67 20 73 63 68 65 6d 61   existing schema
ac70: 73 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  s.  This allows 
ac80: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
ac90: 62 6c 65 73 20 74 68 61 74 20 0a 2a 2a 20 63 6f  bles that .** co
aca0: 6e 74 61 69 6e 20 61 20 62 6f 75 6e 64 20 70 61  ntain a bound pa
acb0: 72 61 6d 65 74 65 72 20 62 65 63 61 75 73 65 20  rameter because 
acc0: 74 68 65 79 20 77 65 72 65 20 67 65 6e 65 72 61  they were genera
acd0: 74 65 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72  ted by older ver
ace0: 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69  sions.** of SQLi
acf0: 74 65 20 74 6f 20 62 65 20 70 61 72 73 65 64 20  te to be parsed 
ad00: 62 79 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e  by newer version
ad10: 73 20 6f 66 20 53 51 4c 69 74 65 20 77 69 74 68  s of SQLite with
ad20: 6f 75 74 20 72 61 69 73 69 6e 67 20 61 0a 2a 2a  out raising a.**
ad30: 20 6d 61 6c 66 6f 72 6d 65 64 20 73 63 68 65 6d   malformed schem
ad40: 61 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74  a error..*/.stat
ad50: 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49  ic int exprNodeI
ad60: 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72  sConstant(Walker
ad70: 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
ad80: 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49  *pExpr){..  /* I
ad90: 66 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  f pWalker->eCode
ada0: 20 69 73 20 32 20 74 68 65 6e 20 61 6e 79 20 74   is 2 then any t
adb0: 65 72 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65  erm of the expre
adc0: 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73  ssion that comes
add0: 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f   from.  ** the O
ade0: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
adf0: 65 73 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69  es of a left joi
ae00: 6e 20 64 69 73 71 75 61 6c 69 66 69 65 73 20 74  n disqualifies t
ae10: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  he expression.  
ae20: 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f  ** from being co
ae30: 6e 73 69 64 65 72 65 64 20 63 6f 6e 73 74 61 6e  nsidered constan
ae40: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c  t. */.  if( pWal
ae50: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 20 26 26  ker->eCode==2 &&
ae60: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
ae70: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
ae80: 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70 57 61 6c  oin) ){.    pWal
ae90: 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a  ker->eCode = 0;.
aea0: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
aeb0: 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69  bort;.  }..  swi
aec0: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
aed0: 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65  {.    /* Conside
aee0: 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62  r functions to b
aef0: 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c  e constant if al
af00: 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74  l their argument
af10: 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20  s are constant. 
af20: 20 20 20 2a 2a 20 61 6e 64 20 65 69 74 68 65 72     ** and either
af30: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
af40: 3d 34 20 6f 72 20 35 20 6f 72 20 74 68 65 20 66  =4 or 5 or the f
af50: 75 6e 63 74 69 6f 6e 20 68 61 73 20 74 68 65 0a  unction has the.
af60: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 55      ** SQLITE_FU
af70: 4e 43 5f 43 4f 4e 53 54 20 66 6c 61 67 2e 20 2a  NC_CONST flag. *
af80: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  /.    case TK_FU
af90: 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66  NCTION:.      if
afa0: 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  ( pWalker->eCode
afb0: 3e 3d 34 20 7c 7c 20 45 78 70 72 48 61 73 50 72  >=4 || ExprHasPr
afc0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f  operty(pExpr,EP_
afd0: 43 6f 6e 73 74 46 75 6e 63 29 20 29 7b 0a 20 20  ConstFunc) ){.  
afe0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
aff0: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20  _Continue;.     
b000: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b010: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
b020: 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
b030: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
b040: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
b050: 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54  K_ID:.    case T
b060: 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  K_COLUMN:.    ca
b070: 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
b080: 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ON:.    case TK_
b090: 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20  AGG_COLUMN:.    
b0a0: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
b0b0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a  r->op==TK_ID );.
b0c0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
b0d0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
b0e0: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  LUMN );.      te
b0f0: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
b100: 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
b110: 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ON );.      test
b120: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
b130: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
b140: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c  ;.      if( pWal
b150: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 20 26 26  ker->eCode==3 &&
b160: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
b170: 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 43 75 72 20  pWalker->u.iCur 
b180: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
b190: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
b1a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b1b0: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
b1c0: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
b1d0: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
b1e0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63  t;.      }.    c
b1f0: 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a  ase TK_VARIABLE:
b200: 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b  .      if( pWalk
b210: 65 72 2d 3e 65 43 6f 64 65 3d 3d 35 20 29 7b 0a  er->eCode==5 ){.
b220: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6c 65 6e          /* Silen
b230: 74 6c 79 20 63 6f 6e 76 65 72 74 20 62 6f 75 6e  tly convert boun
b240: 64 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 61  d parameters tha
b250: 74 20 61 70 70 65 61 72 20 69 6e 73 69 64 65 20  t appear inside 
b260: 6f 66 20 43 52 45 41 54 45 0a 20 20 20 20 20 20  of CREATE.      
b270: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20    ** statements 
b280: 69 6e 74 6f 20 61 20 4e 55 4c 4c 20 77 68 65 6e  into a NULL when
b290: 20 70 61 72 73 69 6e 67 20 74 68 65 20 43 52 45   parsing the CRE
b2a0: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74 65  ATE statement te
b2b0: 78 74 20 6f 75 74 0a 20 20 20 20 20 20 20 20 2a  xt out.        *
b2c0: 2a 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f  * of the sqlite_
b2d0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a  master table */.
b2e0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
b2f0: 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20  p = TK_NULL;.   
b300: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57 61     }else if( pWa
b310: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 29  lker->eCode==4 )
b320: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62  {.        /* A b
b330: 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  ound parameter i
b340: 6e 20 61 20 43 52 45 41 54 45 20 73 74 61 74 65  n a CREATE state
b350: 6d 65 6e 74 20 74 68 61 74 20 6f 72 69 67 69 6e  ment that origin
b360: 61 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 20 20  ates from.      
b370: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72 65    ** sqlite3_pre
b380: 70 61 72 65 28 29 20 63 61 75 73 65 73 20 61 6e  pare() causes an
b390: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20   error */.      
b3a0: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
b3b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
b3c0: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
b3d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
b3e0: 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f   Fall through */
b3f0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
b400: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
b410: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
b420: 43 54 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e  CT ); /* selectN
b430: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69  odeIsConstant wi
b440: 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20  ll disallow */. 
b450: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
b460: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49  Expr->op==TK_EXI
b470: 53 54 53 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74  STS ); /* select
b480: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77  NodeIsConstant w
b490: 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a  ill disallow */.
b4a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
b4b0: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d  _Continue;.  }.}
b4c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65  .static int sele
b4d0: 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  ctNodeIsConstant
b4e0: 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
b4f0: 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65  , Select *NotUse
b500: 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d){.  UNUSED_PAR
b510: 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
b520: 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  .  pWalker->eCod
b530: 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  e = 0;.  return 
b540: 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74 61  WRC_Abort;.}.sta
b550: 74 69 63 20 69 6e 74 20 65 78 70 72 49 73 43 6f  tic int exprIsCo
b560: 6e 73 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  nst(Expr *p, int
b570: 20 69 6e 69 74 46 6c 61 67 2c 20 69 6e 74 20 69   initFlag, int i
b580: 43 75 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  Cur){.  Walker w
b590: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30  ;.  memset(&w, 0
b5a0: 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20  , sizeof(w));.  
b5b0: 77 2e 65 43 6f 64 65 20 3d 20 69 6e 69 74 46 6c  w.eCode = initFl
b5c0: 61 67 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  ag;.  w.xExprCal
b5d0: 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65  lback = exprNode
b5e0: 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e  IsConstant;.  w.
b5f0: 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
b600: 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f  = selectNodeIsCo
b610: 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 75 2e 69 43  nstant;.  w.u.iC
b620: 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 73 71 6c  ur = iCur;.  sql
b630: 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
b640: 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e   p);.  return w.
b650: 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eCode;.}../*.** 
b660: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
b670: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
b680: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
b690: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
b6a0: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30  onstant.** and 0
b6b0: 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20   if it involves 
b6c0: 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e  variables or fun
b6d0: 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a  ction calls..**.
b6e0: 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
b6f0: 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ses of this func
b700: 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71  tion, a double-q
b710: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
b720: 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63  : "abc").** is c
b730: 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69  onsidered a vari
b740: 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c  able but a singl
b750: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
b760: 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a  (ex: 'abc') is.*
b770: 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f  * a constant..*/
b780: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
b790: 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20  IsConstant(Expr 
b7a0: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78  *p){.  return ex
b7b0: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 31 2c 20  prIsConst(p, 1, 
b7c0: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  0);.}../*.** Wal
b7d0: 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
b7e0: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f  tree.  Return no
b7f0: 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78  n-zero if the ex
b800: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
b810: 74 61 6e 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65  tant.** that doe
b820: 73 20 6e 6f 20 6f 72 69 67 69 6e 61 74 65 20 66  s no originate f
b830: 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55 53  rom the ON or US
b840: 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61  ING clauses of a
b850: 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e   join..** Return
b860: 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65   0 if it involve
b870: 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66  s variables or f
b880: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72  unction calls or
b890: 20 74 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61   terms from.** a
b8a0: 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  n ON or USING cl
b8b0: 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ause..*/.int sql
b8c0: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
b8d0: 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a  ntNotJoin(Expr *
b8e0: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70  p){.  return exp
b8f0: 72 49 73 43 6f 6e 73 74 28 70 2c 20 32 2c 20 30  rIsConst(p, 2, 0
b900: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  );.}../*.** Walk
b910: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
b920: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  ree.  Return non
b930: 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70  -zero if the exp
b940: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
b950: 61 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e 79 20 73  ant.** for any s
b960: 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
b970: 20 74 61 62 6c 65 20 77 69 74 68 20 63 75 72 73   table with curs
b980: 6f 72 20 69 43 75 72 2e 20 20 49 6e 20 6f 74 68  or iCur.  In oth
b990: 65 72 20 77 6f 72 64 73 2c 20 74 68 65 0a 2a 2a  er words, the.**
b9a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74   expression must
b9b0: 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 61 6e   not refer to an
b9c0: 79 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73  y non-determinis
b9d0: 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72  tic function nor
b9e0: 20 61 6e 79 0a 2a 2a 20 74 61 62 6c 65 20 6f 74   any.** table ot
b9f0: 68 65 72 20 74 68 61 6e 20 69 43 75 72 2e 0a 2a  her than iCur..*
ba00: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
ba10: 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74  rIsTableConstant
ba20: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 43  (Expr *p, int iC
ba30: 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78  ur){.  return ex
ba40: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 33 2c 20  prIsConst(p, 3, 
ba50: 69 43 75 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  iCur);.}../*.** 
ba60: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
ba70: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
ba80: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
ba90: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
baa0: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20  onstant.** or a 
bab0: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69  function call wi
bac0: 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75  th constant argu
bad0: 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61  ments.  Return a
bae0: 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a  nd 0 if there.**
baf0: 20 61 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c   are any variabl
bb00: 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  es..**.** For th
bb10: 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
bb20: 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64  is function, a d
bb30: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
bb40: 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a  ing (ex: "abc").
bb50: 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
bb60: 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20   a variable but 
bb70: 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20  a single-quoted 
bb80: 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63  string (ex: 'abc
bb90: 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74  ') is.** a const
bba0: 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ant..*/.int sqli
bbb0: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
bbc0: 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72  tOrFunction(Expr
bbd0: 20 2a 70 2c 20 75 38 20 69 73 49 6e 69 74 29 7b   *p, u8 isInit){
bbe0: 0a 20 20 61 73 73 65 72 74 28 20 69 73 49 6e 69  .  assert( isIni
bbf0: 74 3d 3d 30 20 7c 7c 20 69 73 49 6e 69 74 3d 3d  t==0 || isInit==
bc00: 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 78  1 );.  return ex
bc10: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 34 2b 69  prIsConst(p, 4+i
bc20: 73 49 6e 69 74 2c 20 30 29 3b 0a 7d 0a 0a 23 69  sInit, 0);.}..#i
bc30: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
bc40: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a  LE_CURSOR_HINTS.
bc50: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
bc60: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
bc70: 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
bc80: 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61  expression conta
bc90: 69 6e 73 20 61 0a 2a 2a 20 73 75 62 71 75 65 72  ins a.** subquer
bca0: 79 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20  y of some kind. 
bcb0: 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   Return 0 if the
bcc0: 72 65 20 61 72 65 20 6e 6f 20 73 75 62 71 75 65  re are no subque
bcd0: 72 69 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ries..*/.int sql
bce0: 69 74 65 33 45 78 70 72 43 6f 6e 74 61 69 6e 73  ite3ExprContains
bcf0: 53 75 62 71 75 65 72 79 28 45 78 70 72 20 2a 70  Subquery(Expr *p
bd00: 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
bd10: 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
bd20: 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 65  izeof(w));.  w.e
bd30: 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45  Code = 1;.  w.xE
bd40: 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71  xprCallback = sq
bd50: 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f  lite3ExprWalkNoo
bd60: 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  p;.  w.xSelectCa
bd70: 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 4e  llback = selectN
bd80: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20  odeIsConstant;. 
bd90: 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
bda0: 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72  (&w, p);.  retur
bdb0: 6e 20 77 2e 65 43 6f 64 65 3d 3d 30 3b 0a 7d 0a  n w.eCode==0;.}.
bdc0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
bdd0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
bde0: 70 20 63 6f 64 65 73 20 61 20 63 6f 6e 73 74 61  p codes a consta
bdf0: 6e 74 20 69 6e 74 65 67 65 72 20 74 68 61 74 20  nt integer that 
be00: 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a  is small enough.
be10: 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 33  ** to fit in a 3
be20: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72  2-bit integer, r
be30: 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75 74 20  eturn 1 and put 
be40: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
be50: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a   integer.** in *
be60: 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20  pValue.  If the 
be70: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f  expression is no
be80: 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20  t an integer or 
be90: 69 66 20 69 74 20 69 73 20 74 6f 6f 20 62 69 67  if it is too big
bea0: 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20  .** to fit in a 
beb0: 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e  signed 32-bit in
bec0: 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 30 20  teger, return 0 
bed0: 61 6e 64 20 6c 65 61 76 65 20 2a 70 56 61 6c 75  and leave *pValu
bee0: 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  e unchanged..*/.
bef0: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
bf00: 73 49 6e 74 65 67 65 72 28 45 78 70 72 20 2a 70  sInteger(Expr *p
bf10: 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a  , int *pValue){.
bf20: 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 0a 20    int rc = 0;.. 
bf30: 20 2f 2a 20 49 66 20 61 6e 20 65 78 70 72 65 73   /* If an expres
bf40: 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65 67  sion is an integ
bf50: 65 72 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20  er literal that 
bf60: 66 69 74 73 20 69 6e 20 61 20 73 69 67 6e 65 64  fits in a signed
bf70: 20 33 32 2d 62 69 74 0a 20 20 2a 2a 20 69 6e 74   32-bit.  ** int
bf80: 65 67 65 72 2c 20 74 68 65 6e 20 74 68 65 20 45  eger, then the E
bf90: 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20  P_IntValue flag 
bfa0: 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64  will have alread
bfb0: 79 20 62 65 65 6e 20 73 65 74 20 2a 2f 0a 20 20  y been set */.  
bfc0: 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54  assert( p->op!=T
bfd0: 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 28 70 2d  K_INTEGER || (p-
bfe0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56  >flags & EP_IntV
bff0: 61 6c 75 65 29 21 3d 30 0a 20 20 20 20 20 20 20  alue)!=0.       
c000: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 65      || sqlite3Ge
c010: 74 49 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b  tInt32(p->u.zTok
c020: 65 6e 2c 20 26 72 63 29 3d 3d 30 20 29 3b 0a 0a  en, &rc)==0 );..
c030: 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26    if( p->flags &
c040: 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a   EP_IntValue ){.
c050: 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 70 2d      *pValue = p-
c060: 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 72  >u.iValue;.    r
c070: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73  eturn 1;.  }.  s
c080: 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
c090: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55      case TK_UPLU
c0a0: 53 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  S: {.      rc = 
c0b0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
c0c0: 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70  eger(p->pLeft, p
c0d0: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72  Value);.      br
c0e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
c0f0: 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b  ase TK_UMINUS: {
c100: 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a 20 20  .      int v;.  
c110: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
c120: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e  xprIsInteger(p->
c130: 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a 20 20  pLeft, &v) ){.  
c140: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 76 21        assert( v!
c150: 3d 28 2d 32 31 34 37 34 38 33 36 34 37 2d 31 29  =(-2147483647-1)
c160: 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 56 61   );.        *pVa
c170: 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20  lue = -v;.      
c180: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
c190: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
c1a0: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
c1b0: 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  : break;.  }.  r
c1c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
c1d0: 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20  ** Return FALSE 
c1e0: 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63  if there is no c
c1f0: 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 65  hance that the e
c200: 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65  xpression can be
c210: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
c220: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  the expression m
c230: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6f 72 20  ight be NULL or 
c240: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
c250: 6e 20 69 73 20 74 6f 6f 20 63 6f 6d 70 6c 65 78  n is too complex
c260: 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20 72 65 74 75  .** to tell retu
c270: 72 6e 20 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a  rn TRUE.  .**.**
c280: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
c290: 20 75 73 65 64 20 61 73 20 61 6e 20 6f 70 74 69   used as an opti
c2a0: 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 20 73 6b 69  mization, to ski
c2b0: 70 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f  p OP_IsNull opco
c2c0: 64 65 73 0a 2a 2a 20 77 68 65 6e 20 77 65 20 6b  des.** when we k
c2d0: 6e 6f 77 20 74 68 61 74 20 61 20 76 61 6c 75 65  now that a value
c2e0: 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e   cannot be NULL.
c2f0: 20 20 48 65 6e 63 65 2c 20 61 20 66 61 6c 73 65    Hence, a false
c300: 20 70 6f 73 69 74 69 76 65 0a 2a 2a 20 28 72 65   positive.** (re
c310: 74 75 72 6e 69 6e 67 20 54 52 55 45 20 77 68 65  turning TRUE whe
c320: 6e 20 69 6e 20 66 61 63 74 20 74 68 65 20 65 78  n in fact the ex
c330: 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 6e 65 76  pression can nev
c340: 65 72 20 62 65 20 4e 55 4c 4c 29 20 6d 69 67 68  er be NULL) migh
c350: 74 0a 2a 2a 20 62 65 20 61 20 73 6d 61 6c 6c 20  t.** be a small 
c360: 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 20  performance hit 
c370: 62 75 74 20 69 73 20 6f 74 68 65 72 77 69 73 65  but is otherwise
c380: 20 68 61 72 6d 6c 65 73 73 2e 20 20 4f 6e 20 74   harmless.  On t
c390: 68 65 20 6f 74 68 65 72 0a 2a 2a 20 68 61 6e 64  he other.** hand
c3a0: 2c 20 61 20 66 61 6c 73 65 20 6e 65 67 61 74 69  , a false negati
c3b0: 76 65 20 28 72 65 74 75 72 6e 69 6e 67 20 46 41  ve (returning FA
c3c0: 4c 53 45 20 77 68 65 6e 20 74 68 65 20 72 65 73  LSE when the res
c3d0: 75 6c 74 20 63 6f 75 6c 64 20 62 65 20 4e 55 4c  ult could be NUL
c3e0: 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c  L).** will likel
c3f0: 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69  y result in an i
c400: 6e 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 2e  ncorrect answer.
c410: 20 20 53 6f 20 77 68 65 6e 20 69 6e 20 64 6f 75    So when in dou
c420: 62 74 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 54 52  bt, return.** TR
c430: 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  UE..*/.int sqlit
c440: 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28  e3ExprCanBeNull(
c450: 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 29 7b 0a  const Expr *p){.
c460: 20 20 75 38 20 6f 70 3b 0a 20 20 77 68 69 6c 65    u8 op;.  while
c470: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55  ( p->op==TK_UPLU
c480: 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  S || p->op==TK_U
c490: 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e  MINUS ){ p = p->
c4a0: 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20  pLeft; }.  op = 
c4b0: 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  p->op;.  if( op=
c4c0: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f  =TK_REGISTER ) o
c4d0: 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77  p = p->op2;.  sw
c4e0: 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
c4f0: 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
c500: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
c510: 49 4e 47 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ING:.    case TK
c520: 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65  _FLOAT:.    case
c530: 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20   TK_BLOB:.      
c540: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 63 61  return 0;.    ca
c550: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  se TK_COLUMN:.  
c560: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
c570: 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab!=0 );.      
c580: 72 65 74 75 72 6e 20 45 78 70 72 48 61 73 50 72  return ExprHasPr
c590: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 43 61 6e  operty(p, EP_Can
c5a0: 42 65 4e 75 6c 6c 29 20 7c 7c 0a 20 20 20 20 20  BeNull) ||.     
c5b0: 20 20 20 20 20 20 20 20 28 70 2d 3e 69 43 6f 6c          (p->iCol
c5c0: 75 6d 6e 3e 3d 30 20 26 26 20 70 2d 3e 70 54 61  umn>=0 && p->pTa
c5d0: 62 2d 3e 61 43 6f 6c 5b 70 2d 3e 69 43 6f 6c 75  b->aCol[p->iColu
c5e0: 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 29 3b  mn].notNull==0);
c5f0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
c600: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
c610: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
c620: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
c630: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ven expression i
c640: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 77 68 69  s a constant whi
c650: 63 68 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 75  ch would be.** u
c660: 6e 63 68 61 6e 67 65 64 20 62 79 20 4f 50 5f 41  nchanged by OP_A
c670: 66 66 69 6e 69 74 79 20 77 69 74 68 20 74 68 65  ffinity with the
c680: 20 61 66 66 69 6e 69 74 79 20 67 69 76 65 6e 20   affinity given 
c690: 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a  in the second.**
c6a0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
c6b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
c6c0: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
c6d0: 6e 65 20 69 66 20 74 68 65 20 4f 50 5f 41 66 66  ne if the OP_Aff
c6e0: 69 6e 69 74 79 20 6f 70 65 72 61 74 69 6f 6e 0a  inity operation.
c6f0: 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65  ** can be omitte
c700: 64 2e 20 20 57 68 65 6e 20 69 6e 20 64 6f 75 62  d.  When in doub
c710: 74 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 20  t return FALSE. 
c720: 20 41 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76   A false negativ
c730: 65 0a 2a 2a 20 69 73 20 68 61 72 6d 6c 65 73 73  e.** is harmless
c740: 2e 20 20 41 20 66 61 6c 73 65 20 70 6f 73 69 74  .  A false posit
c750: 69 76 65 2c 20 68 6f 77 65 76 65 72 2c 20 63 61  ive, however, ca
c760: 6e 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20  n result in the 
c770: 77 72 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65 72 2e  wrong.** answer.
c780: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
c790: 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69  xprNeedsNoAffini
c7a0: 74 79 43 68 61 6e 67 65 28 63 6f 6e 73 74 20 45  tyChange(const E
c7b0: 78 70 72 20 2a 70 2c 20 63 68 61 72 20 61 66 66  xpr *p, char aff
c7c0: 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 69 66  ){.  u8 op;.  if
c7d0: 28 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  ( aff==SQLITE_AF
c7e0: 46 5f 42 4c 4f 42 20 29 20 72 65 74 75 72 6e 20  F_BLOB ) return 
c7f0: 31 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f  1;.  while( p->o
c800: 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70  p==TK_UPLUS || p
c810: 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20  ->op==TK_UMINUS 
c820: 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b  ){ p = p->pLeft;
c830: 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b   }.  op = p->op;
c840: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45  .  if( op==TK_RE
c850: 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d  GISTER ) op = p-
c860: 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20  >op2;.  switch( 
c870: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
c880: 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  K_INTEGER: {.   
c890: 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53     return aff==S
c8a0: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
c8b0: 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45  R || aff==SQLITE
c8c0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
c8d0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
c8e0: 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 72  FLOAT: {.      r
c8f0: 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54  eturn aff==SQLIT
c900: 45 5f 41 46 46 5f 52 45 41 4c 20 7c 7c 20 61 66  E_AFF_REAL || af
c910: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
c920: 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20  MERIC;.    }.   
c930: 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
c940: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
c950: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
c960: 54 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  TEXT;.    }.    
c970: 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a  case TK_BLOB: {.
c980: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
c990: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
c9a0: 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
c9b0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 54 61    assert( p->iTa
c9c0: 62 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 70 20  ble>=0 );  /* p 
c9d0: 63 61 6e 6e 6f 74 20 62 65 20 70 61 72 74 20 6f  cannot be part o
c9e0: 66 20 61 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  f a CHECK constr
c9f0: 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 72 65  aint */.      re
ca00: 74 75 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c  turn p->iColumn<
ca10: 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28  0.          && (
ca20: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
ca30: 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d  INTEGER || aff==
ca40: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
ca50: 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  IC);.    }.    d
ca60: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
ca70: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
ca80: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
ca90: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
caa0: 67 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20  given string is 
cab0: 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20  a row-id column 
cac0: 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  name..*/.int sql
cad0: 69 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73  ite3IsRowid(cons
cae0: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66  t char *z){.  if
caf0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
cb00: 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d  (z, "_ROWID_")==
cb10: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
cb20: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
cb30: 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d  mp(z, "ROWID")==
cb40: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
cb50: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
cb60: 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20  mp(z, "OID")==0 
cb70: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
cb80: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
cb90: 20 70 58 20 69 73 20 74 68 65 20 52 48 53 20 6f   pX is the RHS o
cba0: 66 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  f an IN operator
cbb0: 2e 20 20 49 66 20 70 58 20 69 73 20 61 20 53 45  .  If pX is a SE
cbc0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 0a  LECT statement .
cbd0: 2a 2a 20 74 68 61 74 20 63 61 6e 20 62 65 20 73  ** that can be s
cbe0: 69 6d 70 6c 69 66 69 65 64 20 74 6f 20 61 20 64  implified to a d
cbf0: 69 72 65 63 74 20 74 61 62 6c 65 20 61 63 63 65  irect table acce
cc00: 73 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 0a  ss, then return.
cc10: 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
cc20: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
cc30: 6d 65 6e 74 2e 20 20 49 66 20 70 58 20 69 73 20  ment.  If pX is 
cc40: 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 73 74 61  not a SELECT sta
cc50: 74 65 6d 65 6e 74 2c 0a 2a 2a 20 6f 72 20 69 66  tement,.** or if
cc60: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
cc70: 65 6d 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 62  ement needs to b
cc80: 65 20 6d 61 6e 69 66 65 73 74 65 64 20 69 6e 74  e manifested int
cc90: 6f 20 61 20 74 72 61 6e 73 69 65 6e 74 0a 2a 2a  o a transient.**
cca0: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 72 65 74   table, then ret
ccb0: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66  urn NULL..*/.#if
ccc0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ccd0: 5f 53 55 42 51 55 45 52 59 0a 73 74 61 74 69 63  _SUBQUERY.static
cce0: 20 53 65 6c 65 63 74 20 2a 69 73 43 61 6e 64 69   Select *isCandi
ccf0: 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 45 78 70  dateForInOpt(Exp
cd00: 72 20 2a 70 58 29 7b 0a 20 20 53 65 6c 65 63 74  r *pX){.  Select
cd10: 20 2a 70 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a   *p;.  SrcList *
cd20: 70 53 72 63 3b 0a 20 20 45 78 70 72 4c 69 73 74  pSrc;.  ExprList
cd30: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 45 78 70 72   *pEList;.  Expr
cd40: 20 2a 70 52 65 73 3b 0a 20 20 54 61 62 6c 65 20   *pRes;.  Table 
cd50: 2a 70 54 61 62 3b 0a 20 20 69 66 28 20 21 45 78  *pTab;.  if( !Ex
cd60: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
cd70: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
cd80: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
cd90: 4e 6f 74 20 61 20 73 75 62 71 75 65 72 79 20 2a  Not a subquery *
cda0: 2f 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  /.  if( ExprHasP
cdb0: 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 56  roperty(pX, EP_V
cdc0: 61 72 53 65 6c 65 63 74 29 20 20 29 20 72 65 74  arSelect)  ) ret
cdd0: 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 65  urn 0;  /* Corre
cde0: 6c 61 74 65 64 20 73 75 62 71 20 2a 2f 0a 20 20  lated subq */.  
cdf0: 70 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63  p = pX->x.pSelec
ce00: 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  t;.  if( p->pPri
ce10: 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  or ) return 0;  
ce20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
ce30: 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  ot a compound SE
ce40: 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d  LECT */.  if( p-
ce50: 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
ce60: 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
ce70: 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20 74 65  egate) ){.    te
ce80: 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46  stcase( (p->selF
ce90: 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
cea0: 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
ceb0: 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20  ))==SF_Distinct 
cec0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
ced0: 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
cee0: 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
cef0: 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
cf00: 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20  Aggregate );.   
cf10: 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f   return 0; /* No
cf20: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
cf30: 64 20 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61  d and no aggrega
cf40: 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
cf50: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
cf60: 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20  >pGroupBy==0 ); 
cf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cf80: 48 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  Has no GROUP BY 
cf90: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20  clause */.  if( 
cfa0: 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
cfb0: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
cfc0: 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d     /* Has no LIM
cfd0: 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 61  IT clause */.  a
cfe0: 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65  ssert( p->pOffse
cff0: 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  t==0 );         
d000: 20 20 20 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49        /* No LIMI
d010: 54 20 6d 65 61 6e 73 20 6e 6f 20 4f 46 46 53 45  T means no OFFSE
d020: 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57  T */.  if( p->pW
d030: 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b  here ) return 0;
d040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d050: 20 48 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c   Has no WHERE cl
d060: 61 75 73 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d  ause */.  pSrc =
d070: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65   p->pSrc;.  asse
d080: 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20  rt( pSrc!=0 );. 
d090: 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21   if( pSrc->nSrc!
d0a0: 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =1 ) return 0;  
d0b0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c          /* Singl
d0c0: 65 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63  e term in FROM c
d0d0: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  lause */.  if( p
d0e0: 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
d0f0: 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
d100: 20 20 2f 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74    /* FROM is not
d110: 20 61 20 73 75 62 71 75 65 72 79 20 6f 72 20 76   a subquery or v
d120: 69 65 77 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20  iew */.  pTab = 
d130: 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
d140: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21  .  assert( pTab!
d150: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
d160: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  pTab->pSelect==0
d170: 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   );            /
d180: 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  * FROM clause is
d190: 20 6e 6f 74 20 61 20 76 69 65 77 20 2a 2f 0a 20   not a view */. 
d1a0: 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
d1b0: 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b  Tab) ) return 0;
d1c0: 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20          /* FROM 
d1d0: 63 6c 61 75 73 65 20 6e 6f 74 20 61 20 76 69 72  clause not a vir
d1e0: 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  tual table */.  
d1f0: 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
d200: 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74  st;.  if( pEList
d210: 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74  ->nExpr!=1 ) ret
d220: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  urn 0;       /* 
d230: 4f 6e 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  One column in th
d240: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
d250: 20 20 70 52 65 73 20 3d 20 70 45 4c 69 73 74 2d    pRes = pEList-
d260: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69  >a[0].pExpr;.  i
d270: 66 28 20 70 52 65 73 2d 3e 6f 70 21 3d 54 4b 5f  f( pRes->op!=TK_
d280: 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20  COLUMN ) return 
d290: 30 3b 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20  0;    /* Result 
d2a0: 69 73 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  is a column */. 
d2b0: 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69   assert( pRes->i
d2c0: 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 30  Table==pSrc->a[0
d2d0: 5d 2e 69 43 75 72 73 6f 72 20 29 3b 20 20 2f 2a  ].iCursor );  /*
d2e0: 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61 74 65   Not a correlate
d2f0: 64 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  d subquery */.  
d300: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 23 65 6e 64  return p;.}.#end
d310: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
d320: 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f  T_SUBQUERY */../
d330: 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f  *.** Code an OP_
d340: 4f 6e 63 65 20 69 6e 73 74 72 75 63 74 69 6f 6e  Once instruction
d350: 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 73 70   and allocate sp
d360: 61 63 65 20 66 6f 72 20 69 74 73 20 66 6c 61 67  ace for its flag
d370: 2e 20 52 65 74 75 72 6e 20 74 68 65 20 0a 2a 2a  . Return the .**
d380: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
d390: 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  new instruction.
d3a0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
d3b0: 6f 64 65 4f 6e 63 65 28 50 61 72 73 65 20 2a 70  odeOnce(Parse *p
d3c0: 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a  Parse){.  Vdbe *
d3d0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
d3e0: 62 65 28 70 50 61 72 73 65 29 3b 20 20 20 20 20  be(pParse);     
d3f0: 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61 63 68   /* Virtual mach
d400: 69 6e 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ine being coded 
d410: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  */.  return sqli
d420: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
d430: 20 4f 50 5f 4f 6e 63 65 2c 20 70 50 61 72 73 65   OP_Once, pParse
d440: 2d 3e 6e 4f 6e 63 65 2b 2b 29 3b 0a 7d 0a 0a 2f  ->nOnce++);.}../
d450: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
d460: 64 65 20 74 68 61 74 20 63 68 65 63 6b 73 20 74  de that checks t
d470: 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  he left-most col
d480: 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 61 62  umn of index tab
d490: 6c 65 20 69 43 75 72 20 74 6f 20 73 65 65 20 69  le iCur to see i
d4a0: 66 0a 2a 2a 20 69 74 20 63 6f 6e 74 61 69 6e 73  f.** it contains
d4b0: 20 61 6e 79 20 4e 55 4c 4c 20 65 6e 74 72 69 65   any NULL entrie
d4c0: 73 2e 20 20 43 61 75 73 65 20 74 68 65 20 72 65  s.  Cause the re
d4d0: 67 69 73 74 65 72 20 61 74 20 72 65 67 48 61 73  gister at regHas
d4e0: 4e 75 6c 6c 20 74 6f 20 62 65 20 73 65 74 0a 2a  Null to be set.*
d4f0: 2a 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20  * to a non-NULL 
d500: 76 61 6c 75 65 20 69 66 20 69 43 75 72 20 63 6f  value if iCur co
d510: 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 73 2e  ntains no NULLs.
d520: 20 20 43 61 75 73 65 20 72 65 67 69 73 74 65 72    Cause register
d530: 20 72 65 67 48 61 73 4e 75 6c 6c 0a 2a 2a 20 74   regHasNull.** t
d540: 6f 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c  o be set to NULL
d550: 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61 69 6e   if iCur contain
d560: 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55  s one or more NU
d570: 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74  LL values..*/.st
d580: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
d590: 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28  3SetHasNullFlag(
d5a0: 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 43 75  Vdbe *v, int iCu
d5b0: 72 2c 20 69 6e 74 20 72 65 67 48 61 73 4e 75 6c  r, int regHasNul
d5c0: 6c 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 31 3b  l){.  int addr1;
d5d0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
d5e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
d5f0: 65 72 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c  er, 0, regHasNul
d600: 6c 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71  l);.  addr1 = sq
d610: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
d620: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43  v, OP_Rewind, iC
d630: 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ur); VdbeCoverag
d640: 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
d650: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d660: 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c 20 30 2c  Column, iCur, 0,
d670: 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20   regHasNull);.  
d680: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
d690: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59  eP5(v, OPFLAG_TY
d6a0: 50 45 4f 46 41 52 47 29 3b 0a 20 20 56 64 62 65  PEOFARG);.  Vdbe
d6b0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 69 72  Comment((v, "fir
d6c0: 73 74 5f 65 6e 74 72 79 5f 69 6e 28 25 64 29 22  st_entry_in(%d)"
d6d0: 2c 20 69 43 75 72 29 29 3b 0a 20 20 73 71 6c 69  , iCur));.  sqli
d6e0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
d6f0: 76 2c 20 61 64 64 72 31 29 3b 0a 7d 0a 0a 0a 23  v, addr1);.}...#
d700: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d710: 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
d720: 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69  * The argument i
d730: 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  s an IN operator
d740: 20 77 69 74 68 20 61 20 6c 69 73 74 20 28 6e 6f   with a list (no
d750: 74 20 61 20 73 75 62 71 75 65 72 79 29 20 6f 6e  t a subquery) on
d760: 20 74 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68   the .** right-h
d770: 61 6e 64 20 73 69 64 65 2e 20 20 52 65 74 75 72  and side.  Retur
d780: 6e 20 54 52 55 45 20 69 66 20 74 68 61 74 20 6c  n TRUE if that l
d790: 69 73 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e  ist is constant.
d7a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
d7b0: 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43 6f 6e  qlite3InRhsIsCon
d7c0: 73 74 61 6e 74 28 45 78 70 72 20 2a 70 49 6e 29  stant(Expr *pIn)
d7d0: 7b 0a 20 20 45 78 70 72 20 2a 70 4c 48 53 3b 0a  {.  Expr *pLHS;.
d7e0: 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 61 73 73    int res;.  ass
d7f0: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
d800: 70 65 72 74 79 28 70 49 6e 2c 20 45 50 5f 78 49  perty(pIn, EP_xI
d810: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 70 4c  sSelect) );.  pL
d820: 48 53 20 3d 20 70 49 6e 2d 3e 70 4c 65 66 74 3b  HS = pIn->pLeft;
d830: 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20  .  pIn->pLeft = 
d840: 30 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c 69 74  0;.  res = sqlit
d850: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
d860: 28 70 49 6e 29 3b 0a 20 20 70 49 6e 2d 3e 70 4c  (pIn);.  pIn->pL
d870: 65 66 74 20 3d 20 70 4c 48 53 3b 0a 20 20 72 65  eft = pLHS;.  re
d880: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 23 65 6e 64  turn res;.}.#end
d890: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
d8a0: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
d8b0: 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  by the implement
d8c0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20  ation of the IN 
d8d0: 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 0a  (...) operator..
d8e0: 2a 2a 20 54 68 65 20 70 58 20 70 61 72 61 6d 65  ** The pX parame
d8f0: 74 65 72 20 69 73 20 74 68 65 20 65 78 70 72 65  ter is the expre
d900: 73 73 69 6f 6e 20 6f 6e 20 74 68 65 20 52 48 53  ssion on the RHS
d910: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
d920: 74 6f 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6d 69  tor, which.** mi
d930: 67 68 74 20 62 65 20 65 69 74 68 65 72 20 61 20  ght be either a 
d940: 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69  list of expressi
d950: 6f 6e 73 20 6f 72 20 61 20 73 75 62 71 75 65 72  ons or a subquer
d960: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62  y..**.** The job
d970: 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
d980: 20 69 73 20 74 6f 20 66 69 6e 64 20 6f 72 20 63   is to find or c
d990: 72 65 61 74 65 20 61 20 62 2d 74 72 65 65 20 6f  reate a b-tree o
d9a0: 62 6a 65 63 74 20 74 68 61 74 20 63 61 6e 0a 2a  bject that can.*
d9b0: 2a 20 62 65 20 75 73 65 64 20 65 69 74 68 65 72  * be used either
d9c0: 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6d 65 6d   to test for mem
d9d0: 62 65 72 73 68 69 70 20 69 6e 20 74 68 65 20 52  bership in the R
d9e0: 48 53 20 73 65 74 20 6f 72 20 74 6f 20 69 74 65  HS set or to ite
d9f0: 72 61 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20  rate through.** 
da00: 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 20 74  all members of t
da10: 68 65 20 52 48 53 20 73 65 74 2c 20 73 6b 69 70  he RHS set, skip
da20: 70 69 6e 67 20 64 75 70 6c 69 63 61 74 65 73 2e  ping duplicates.
da30: 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72 73 6f 72 20  .**.** A cursor 
da40: 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65  is opened on the
da50: 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20 74   b-tree object t
da60: 68 61 74 20 69 73 20 74 68 65 20 52 48 53 20 6f  hat is the RHS o
da70: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
da80: 72 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e 69 54 61  r.** and pX->iTa
da90: 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ble is set to th
daa0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20  e index of that 
dab0: 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  cursor..**.** Th
dac0: 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
dad0: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
dae0: 6e 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20  n indicates the 
daf0: 62 2d 74 72 65 65 20 74 79 70 65 2c 20 61 73 20  b-tree type, as 
db00: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
db10: 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20   IN_INDEX_ROWID 
db20: 20 20 20 20 20 2d 20 54 68 65 20 63 75 72 73 6f       - The curso
db30: 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
db40: 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  a database table
db50: 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f  ..**   IN_INDEX_
db60: 49 4e 44 45 58 5f 41 53 43 20 20 2d 20 54 68 65  INDEX_ASC  - The
db70: 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e   cursor was open
db80: 65 64 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69  ed on an ascendi
db90: 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49  ng index..**   I
dba0: 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45  N_INDEX_INDEX_DE
dbb0: 53 43 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20  SC - The cursor 
dbc0: 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  was opened on a 
dbd0: 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78  descending index
dbe0: 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f  ..**   IN_INDEX_
dbf0: 45 50 48 20 20 20 20 20 20 20 20 2d 20 54 68 65  EPH        - The
dc00: 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e   cursor was open
dc10: 65 64 20 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c  ed on a speciall
dc20: 79 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a  y created and.**
dc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc40: 20 20 20 20 20 20 20 20 20 70 6f 70 75 6c 61 74           populat
dc50: 65 64 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  ed epheremal tab
dc60: 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  le..**   IN_INDE
dc70: 58 5f 4e 4f 4f 50 20 20 20 20 20 20 20 2d 20 4e  X_NOOP       - N
dc80: 6f 20 63 75 72 73 6f 72 20 77 61 73 20 61 6c 6c  o cursor was all
dc90: 6f 63 61 74 65 64 2e 20 20 54 68 65 20 49 4e 20  ocated.  The IN 
dca0: 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 20 62 65  operator must be
dcb0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 69 6d 70 6c              impl
dcd0: 65 6d 65 6e 74 65 64 20 61 73 20 61 20 73 65 71  emented as a seq
dce0: 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72 69  uence of compari
dcf0: 73 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  sons..**.** An e
dd00: 78 69 73 74 69 6e 67 20 62 2d 74 72 65 65 20 6d  xisting b-tree m
dd10: 69 67 68 74 20 62 65 20 75 73 65 64 20 69 66 20  ight be used if 
dd20: 74 68 65 20 52 48 53 20 65 78 70 72 65 73 73 69  the RHS expressi
dd30: 6f 6e 20 70 58 20 69 73 20 61 20 73 69 6d 70 6c  on pX is a simpl
dd40: 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 73 75  e.** subquery su
dd50: 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ch as:.**.**    
dd60: 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e   SELECT <column>
dd70: 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a   FROM <table>.**
dd80: 0a 2a 2a 20 49 66 20 74 68 65 20 52 48 53 20 6f  .** If the RHS o
dd90: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
dda0: 72 20 69 73 20 61 20 6c 69 73 74 20 6f 72 20 61  r is a list or a
ddb0: 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 73 75   more complex su
ddc0: 62 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20  bquery, then.** 
ddd0: 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  an ephemeral tab
dde0: 6c 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  le might need to
ddf0: 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 66 72   be generated fr
de00: 6f 6d 20 74 68 65 20 52 48 53 20 61 6e 64 20 74  om the RHS and t
de10: 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61 62 6c  hen.** pX->iTabl
de20: 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20  e made to point 
de30: 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  to the ephemeral
de40: 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64 20 6f   table instead o
de50: 66 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67  f an.** existing
de60: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   table..**.** Th
de70: 65 20 69 6e 46 6c 61 67 73 20 70 61 72 61 6d 65  e inFlags parame
de80: 74 65 72 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e  ter must contain
de90: 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20   exactly one of 
dea0: 74 68 65 20 62 69 74 73 0a 2a 2a 20 49 4e 5f 49  the bits.** IN_I
deb0: 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20  NDEX_MEMBERSHIP 
dec0: 6f 72 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50  or IN_INDEX_LOOP
ded0: 2e 20 20 49 66 20 69 6e 46 6c 61 67 73 20 63 6f  .  If inFlags co
dee0: 6e 74 61 69 6e 73 0a 2a 2a 20 49 4e 5f 49 4e 44  ntains.** IN_IND
def0: 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 2c 20 74  EX_MEMBERSHIP, t
df00: 68 65 6e 20 74 68 65 20 67 65 6e 65 72 61 74 65  hen the generate
df10: 64 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 20  d table will be 
df20: 75 73 65 64 20 66 6f 72 20 61 0a 2a 2a 20 66 61  used for a.** fa
df30: 73 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65  st membership te
df40: 73 74 2e 20 20 57 68 65 6e 20 74 68 65 20 49 4e  st.  When the IN
df50: 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 69 74 20  _INDEX_LOOP bit 
df60: 69 73 20 73 65 74 2c 20 74 68 65 0a 2a 2a 20 49  is set, the.** I
df70: 4e 20 69 6e 64 65 78 20 77 69 6c 6c 20 62 65 20  N index will be 
df80: 75 73 65 64 20 74 6f 20 6c 6f 6f 70 20 6f 76 65  used to loop ove
df90: 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20  r all values of 
dfa0: 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 0a 2a  the RHS of the.*
dfb0: 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  * IN operator..*
dfc0: 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44  *.** When IN_IND
dfd0: 45 58 5f 4c 4f 4f 50 20 69 73 20 75 73 65 64 20  EX_LOOP is used 
dfe0: 28 61 6e 64 20 74 68 65 20 62 2d 74 72 65 65 20  (and the b-tree 
dff0: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
e000: 69 74 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75  iterate.** throu
e010: 67 68 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65  gh the set membe
e020: 72 73 29 20 74 68 65 6e 20 74 68 65 20 62 2d 74  rs) then the b-t
e030: 72 65 65 20 6d 75 73 74 20 6e 6f 74 20 63 6f 6e  ree must not con
e040: 74 61 69 6e 20 64 75 70 6c 69 63 61 74 65 73 2e  tain duplicates.
e050: 0a 2a 2a 20 41 6e 20 65 70 68 65 72 65 6d 61 6c  .** An epheremal
e060: 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 75   table must be u
e070: 73 65 64 20 75 6e 6c 65 73 73 20 74 68 65 20 73  sed unless the s
e080: 65 6c 65 63 74 65 64 20 3c 63 6f 6c 75 6d 6e 3e  elected <column>
e090: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a   is guaranteed.*
e0a0: 2a 20 74 6f 20 62 65 20 75 6e 69 71 75 65 20 2d  * to be unique -
e0b0: 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
e0c0: 69 74 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52  it is an INTEGER
e0d0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
e0e0: 69 74 0a 2a 2a 20 68 61 73 20 61 20 55 4e 49 51  it.** has a UNIQ
e0f0: 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72  UE constraint or
e100: 20 55 4e 49 51 55 45 20 69 6e 64 65 78 2e 0a 2a   UNIQUE index..*
e110: 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44  *.** When IN_IND
e120: 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 69 73  EX_MEMBERSHIP is
e130: 20 75 73 65 64 20 28 61 6e 64 20 74 68 65 20 62   used (and the b
e140: 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73  -tree will be us
e150: 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74 20  ed .** for fast 
e160: 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74  set membership t
e170: 65 73 74 73 29 20 74 68 65 6e 20 61 6e 20 65 70  ests) then an ep
e180: 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75  heremal table mu
e190: 73 74 20 0a 2a 2a 20 62 65 20 75 73 65 64 20 75  st .** be used u
e1a0: 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 3e 20 69  nless <column> i
e1b0: 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  s an INTEGER PRI
e1c0: 4d 41 52 59 20 4b 45 59 20 6f 72 20 61 6e 20 69  MARY KEY or an i
e1d0: 6e 64 65 78 20 63 61 6e 20 0a 2a 2a 20 62 65 20  ndex can .** be 
e1e0: 66 6f 75 6e 64 20 77 69 74 68 20 3c 63 6f 6c 75  found with <colu
e1f0: 6d 6e 3e 20 61 73 20 69 74 73 20 6c 65 66 74 2d  mn> as its left-
e200: 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a  most column..**.
e210: 2a 2a 20 49 66 20 74 68 65 20 49 4e 5f 49 4e 44  ** If the IN_IND
e220: 45 58 5f 4e 4f 4f 50 5f 4f 4b 20 61 6e 64 20 49  EX_NOOP_OK and I
e230: 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48  N_INDEX_MEMBERSH
e240: 49 50 20 61 72 65 20 62 6f 74 68 20 73 65 74 20  IP are both set 
e250: 61 6e 64 0a 2a 2a 20 69 66 20 74 68 65 20 52 48  and.** if the RH
e260: 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
e270: 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20 28  ator is a list (
e280: 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 29 20  not a subquery) 
e290: 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75  then this.** rou
e2a0: 74 69 6e 65 20 6d 69 67 68 74 20 64 65 63 69 64  tine might decid
e2b0: 65 20 74 68 61 74 20 63 72 65 61 74 69 6e 67 20  e that creating 
e2c0: 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 62 2d 74  an ephemeral b-t
e2d0: 72 65 65 20 66 6f 72 20 6d 65 6d 62 65 72 73 68  ree for membersh
e2e0: 69 70 0a 2a 2a 20 74 65 73 74 69 6e 67 20 69 73  ip.** testing is
e2f0: 20 74 6f 6f 20 65 78 70 65 6e 73 69 76 65 20 61   too expensive a
e300: 6e 64 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44  nd return IN_IND
e310: 45 58 5f 4e 4f 4f 50 2e 20 20 49 6e 20 74 68 61  EX_NOOP.  In tha
e320: 74 20 63 61 73 65 2c 20 74 68 65 0a 2a 2a 20 63  t case, the.** c
e330: 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 73  alling routine s
e340: 68 6f 75 6c 64 20 69 6d 70 6c 65 6d 65 6e 74 20  hould implement 
e350: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
e360: 75 73 69 6e 67 20 61 20 73 65 71 75 65 6e 63 65  using a sequence
e370: 0a 2a 2a 20 6f 66 20 45 71 20 6f 72 20 4e 65 20  .** of Eq or Ne 
e380: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
e390: 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  tions..**.** Whe
e3a0: 6e 20 74 68 65 20 62 2d 74 72 65 65 20 69 73 20  n the b-tree is 
e3b0: 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 6d  being used for m
e3c0: 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 2c  embership tests,
e3d0: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
e3e0: 63 74 69 6f 6e 0a 2a 2a 20 6d 69 67 68 74 20 6e  ction.** might n
e3f0: 65 65 64 20 74 6f 20 6b 6e 6f 77 20 77 68 65 74  eed to know whet
e400: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 52  her or not the R
e410: 48 53 20 73 69 64 65 20 6f 66 20 74 68 65 20 49  HS side of the I
e420: 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 63 6f  N operator.** co
e430: 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c 2e 20 20  ntains a NULL.  
e440: 49 66 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20  If prRhsHasNull 
e450: 69 73 20 6e 6f 74 20 61 20 4e 55 4c 4c 20 70 6f  is not a NULL po
e460: 69 6e 74 65 72 20 61 6e 64 20 0a 2a 2a 20 69 66  inter and .** if
e470: 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 63 68   there is any ch
e480: 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 28 2e  ance that the (.
e490: 2e 2e 29 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  ..) might contai
e4a0: 6e 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61  n a NULL value a
e4b0: 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68  t.** runtime, th
e4c0: 65 6e 20 61 20 72 65 67 69 73 74 65 72 20 69 73  en a register is
e4d0: 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
e4e0: 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  he register numb
e4f0: 65 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f  er written.** to
e500: 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2e 20   *prRhsHasNull. 
e510: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63  If there is no c
e520: 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 28  hance that the (
e530: 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e 73 20 61 0a  ...) contains a.
e540: 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74  ** NULL value, t
e550: 68 65 6e 20 2a 70 72 52 68 73 48 61 73 4e 75 6c  hen *prRhsHasNul
e560: 6c 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e  l is left unchan
e570: 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ged..**.** If a 
e580: 72 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f  register is allo
e590: 63 61 74 65 64 20 61 6e 64 20 69 74 73 20 6c 6f  cated and its lo
e5a0: 63 61 74 69 6f 6e 20 73 74 6f 72 65 64 20 69 6e  cation stored in
e5b0: 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20   *prRhsHasNull, 
e5c0: 74 68 65 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75  then.** the valu
e5d0: 65 20 69 6e 20 74 68 61 74 20 72 65 67 69 73 74  e in that regist
e5e0: 65 72 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20  er will be NULL 
e5f0: 69 66 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f  if the b-tree co
e600: 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f  ntains one or mo
e610: 72 65 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65  re.** NULL value
e620: 73 2c 20 61 6e 64 20 69 74 20 77 69 6c 6c 20 62  s, and it will b
e630: 65 20 73 6f 6d 65 20 6e 6f 6e 2d 4e 55 4c 4c 20  e some non-NULL 
e640: 76 61 6c 75 65 20 69 66 20 74 68 65 20 62 2d 74  value if the b-t
e650: 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a  ree contains no.
e660: 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a  ** NULL values..
e670: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
e680: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
e690: 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 49  int sqlite3FindI
e6a0: 6e 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  nIndex(Parse *pP
e6b0: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 58 2c 20  arse, Expr *pX, 
e6c0: 75 33 32 20 69 6e 46 6c 61 67 73 2c 20 69 6e 74  u32 inFlags, int
e6d0: 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 29 7b   *prRhsHasNull){
e6e0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 20 20 20  .  Select *p;   
e6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e700: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45           /* SELE
e710: 43 54 20 74 6f 20 74 68 65 20 72 69 67 68 74 20  CT to the right 
e720: 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  of IN operator *
e730: 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20  /.  int eType = 
e740: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
e750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70            /* Typ
e760: 65 20 6f 66 20 52 48 53 20 74 61 62 6c 65 2e 20  e of RHS table. 
e770: 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20  IN_INDEX_* */.  
e780: 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72 73  int iTab = pPars
e790: 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 20  e->nTab++;      
e7a0: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
e7b0: 6f 66 20 74 68 65 20 52 48 53 20 74 61 62 6c 65  of the RHS table
e7c0: 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 42 65   */.  int mustBe
e7d0: 55 6e 69 71 75 65 3b 20 20 20 20 20 20 20 20 20  Unique;         
e7e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e7f0: 72 75 65 20 69 66 20 52 48 53 20 6d 75 73 74 20  rue if RHS must 
e800: 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 56  be unique */.  V
e810: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
e820: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
e830: 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20       /* Virtual 
e840: 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63 6f  machine being co
e850: 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ded */..  assert
e860: 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20  ( pX->op==TK_IN 
e870: 29 3b 0a 20 20 6d 75 73 74 42 65 55 6e 69 71 75  );.  mustBeUniqu
e880: 65 20 3d 20 28 69 6e 46 6c 61 67 73 20 26 20 49  e = (inFlags & I
e890: 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 29 21 3d 30  N_INDEX_LOOP)!=0
e8a0: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
e8b0: 20 73 65 65 20 69 66 20 61 6e 20 65 78 69 73 74   see if an exist
e8c0: 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  ing table or ind
e8d0: 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  ex can be used t
e8e0: 6f 0a 20 20 2a 2a 20 73 61 74 69 73 66 79 20 74  o.  ** satisfy t
e8f0: 68 65 20 71 75 65 72 79 2e 20 20 54 68 69 73 20  he query.  This 
e900: 69 73 20 70 72 65 66 65 72 61 62 6c 65 20 74 6f  is preferable to
e910: 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 6e 65   generating a ne
e920: 77 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65 72 61  w .  ** ephemera
e930: 6c 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  l table..  */.  
e940: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
e950: 3d 3d 30 20 26 26 20 28 70 20 3d 20 69 73 43 61  ==0 && (p = isCa
e960: 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
e970: 70 58 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73  pX))!=0 ){.    s
e980: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
e990: 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20  rse->db;        
e9a0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
e9b0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
e9c0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
e9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
e9f0: 62 6c 65 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a  ble <table>. */.
ea00: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b      Expr *pExpr;
ea10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
ea30: 70 72 65 73 73 69 6f 6e 20 3c 63 6f 6c 75 6d 6e  pression <column
ea40: 3e 20 2a 2f 0a 20 20 20 20 69 31 36 20 69 43 6f  > */.    i16 iCo
ea50: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
ea60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea70: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
ea80: 6d 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20  mn <column> */. 
ea90: 20 20 20 69 31 36 20 69 44 62 3b 20 20 20 20 20     i16 iDb;     
eaa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eab0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
eac0: 61 62 61 73 65 20 69 64 78 20 66 6f 72 20 70 54  abase idx for pT
ead0: 61 62 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  ab */..    asser
eae0: 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20  t( p->pEList!=0 
eaf0: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
eb00: 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43  * Because of isC
eb10: 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
eb20: 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  (p) */.    asser
eb30: 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  t( p->pEList->a[
eb40: 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 20 2f  0].pExpr!=0 ); /
eb50: 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43  * Because of isC
eb60: 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
eb70: 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  (p) */.    asser
eb80: 74 28 20 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b  t( p->pSrc!=0 );
eb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
eba0: 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43  * Because of isC
ebb0: 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
ebc0: 28 70 29 20 2a 2f 0a 20 20 20 20 70 54 61 62 20  (p) */.    pTab 
ebd0: 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  = p->pSrc->a[0].
ebe0: 70 54 61 62 3b 0a 20 20 20 20 70 45 78 70 72 20  pTab;.    pExpr 
ebf0: 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  = p->pEList->a[0
ec00: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 43 6f  ].pExpr;.    iCo
ec10: 6c 20 3d 20 28 69 31 36 29 70 45 78 70 72 2d 3e  l = (i16)pExpr->
ec20: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 0a 20 20 20  iColumn;.   .   
ec30: 20 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54   /* Code an OP_T
ec40: 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 4f  ransaction and O
ec50: 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20  P_TableLock for 
ec60: 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20  <table>. */.    
ec70: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
ec80: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
ec90: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
eca0: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
ecb0: 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
ecc0: 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  e, iDb);.    sql
ecd0: 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
ece0: 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
ecf0: 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
ed00: 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20  zName);..    /* 
ed10: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
ed20: 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f   only called fro
ed30: 6d 20 74 77 6f 20 70 6c 61 63 65 73 2e 20 49 6e  m two places. In
ed40: 20 62 6f 74 68 20 63 61 73 65 73 20 74 68 65 20   both cases the 
ed50: 76 64 62 65 0a 20 20 20 20 2a 2a 20 68 61 73 20  vdbe.    ** has 
ed60: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
ed70: 6f 63 61 74 65 64 2e 20 53 6f 20 61 73 73 75 6d  ocated. So assum
ed80: 65 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  e sqlite3GetVdbe
ed90: 28 29 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20  () is always.   
eda0: 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 68   ** successful h
edb0: 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ere..    */.    
edc0: 61 73 73 65 72 74 28 76 29 3b 0a 20 20 20 20 69  assert(v);.    i
edd0: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
ede0: 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73     int iAddr = s
edf0: 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70  qlite3CodeOnce(p
ee00: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 56 64  Parse);.      Vd
ee10: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a  beCoverage(v);..
ee20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65        sqlite3Ope
ee30: 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  nTable(pParse, i
ee40: 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20  Tab, iDb, pTab, 
ee50: 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20  OP_OpenRead);.  
ee60: 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
ee70: 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 0a 20 20 20  NDEX_ROWID;..   
ee80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
ee90: 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29  mpHere(v, iAddr)
eea0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
eeb0: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20     Index *pIdx; 
eec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eed0: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
eee0: 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
eef0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  .      /* The co
ef00: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
ef10: 20 75 73 65 64 20 62 79 20 74 68 65 20 63 6f 6d   used by the com
ef20: 70 61 72 69 73 6f 6e 2e 20 49 66 20 61 6e 20 69  parison. If an i
ef30: 6e 64 65 78 20 69 73 20 74 6f 0a 20 20 20 20 20  ndex is to.     
ef40: 20 2a 2a 20 62 65 20 75 73 65 64 20 69 6e 20 70   ** be used in p
ef50: 6c 61 63 65 20 6f 66 20 61 20 74 65 6d 70 2d 74  lace of a temp-t
ef60: 61 62 6c 65 2c 20 69 74 20 6d 75 73 74 20 62 65  able, it must be
ef70: 20 6f 72 64 65 72 65 64 20 61 63 63 6f 72 64 69   ordered accordi
ef80: 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  ng.      ** to t
ef90: 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  his collation se
efa0: 71 75 65 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20  quence.  */.    
efb0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71 20    CollSeq *pReq 
efc0: 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
efd0: 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
efe0: 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c  arse, pX->pLeft,
eff0: 20 70 45 78 70 72 29 3b 0a 0a 20 20 20 20 20 20   pExpr);..      
f000: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
f010: 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20  e affinity that 
f020: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
f030: 70 65 72 66 6f 72 6d 20 74 68 65 20 0a 20 20 20  perform the .   
f040: 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e     ** comparison
f050: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
f060: 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20  the affinity of 
f070: 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 49 66 0a 20  the column. If. 
f080: 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 6e 6f       ** it is no
f090: 74 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  t, it is not pos
f0a0: 73 69 62 6c 65 20 74 6f 20 75 73 65 20 61 6e 79  sible to use any
f0b0: 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 2a 2f   index..      */
f0c0: 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66 69 6e  .      int affin
f0d0: 69 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74 65 33  ity_ok = sqlite3
f0e0: 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28  IndexAffinityOk(
f0f0: 70 58 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  pX, pTab->aCol[i
f100: 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 29 3b 0a  Col].affinity);.
f110: 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d  .      for(pIdx=
f120: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
f130: 64 78 20 26 26 20 65 54 79 70 65 3d 3d 30 20 26  dx && eType==0 &
f140: 26 20 61 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 70  & affinity_ok; p
f150: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
f160: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
f170: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d  Idx->aiColumn[0]
f180: 3d 3d 69 43 6f 6c 29 0a 20 20 20 20 20 20 20 20  ==iCol).        
f190: 20 26 26 20 73 71 6c 69 74 65 33 46 69 6e 64 43   && sqlite3FindC
f1a0: 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64  ollSeq(db, ENC(d
f1b0: 62 29 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  b), pIdx->azColl
f1c0: 5b 30 5d 2c 20 30 29 3d 3d 70 52 65 71 0a 20 20  [0], 0)==pReq.  
f1d0: 20 20 20 20 20 20 20 26 26 20 28 21 6d 75 73 74         && (!must
f1e0: 42 65 55 6e 69 71 75 65 20 7c 7c 20 28 70 49 64  BeUnique || (pId
f1f0: 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 26 26  x->nKeyCol==1 &&
f200: 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70   IsUniqueIndex(p
f210: 49 64 78 29 29 29 0a 20 20 20 20 20 20 20 20 29  Idx))).        )
f220: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
f230: 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43  iAddr = sqlite3C
f240: 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b  odeOnce(pParse);
f250: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
f260: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
f270: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
f280: 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54   OP_OpenRead, iT
f290: 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20  ab, pIdx->tnum, 
f2a0: 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iDb);.          
f2b0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34  sqlite3VdbeSetP4
f2c0: 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
f2d0: 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20  pIdx);.         
f2e0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
f2f0: 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61   "%s", pIdx->zNa
f300: 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  me));.          
f310: 61 73 73 65 72 74 28 20 49 4e 5f 49 4e 44 45 58  assert( IN_INDEX
f320: 5f 49 4e 44 45 58 5f 44 45 53 43 20 3d 3d 20 49  _INDEX_DESC == I
f330: 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53  N_INDEX_INDEX_AS
f340: 43 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  C+1 );.         
f350: 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45   eType = IN_INDE
f360: 58 5f 49 4e 44 45 58 5f 41 53 43 20 2b 20 70 49  X_INDEX_ASC + pI
f370: 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30  dx->aSortOrder[0
f380: 5d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66  ];..          if
f390: 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 26  ( prRhsHasNull &
f3a0: 26 20 21 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  & !pTab->aCol[iC
f3b0: 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 7b 0a 20  ol].notNull ){. 
f3c0: 20 20 20 20 20 20 20 20 20 20 20 2a 70 72 52 68             *prRh
f3d0: 73 48 61 73 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61  sHasNull = ++pPa
f3e0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
f3f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
f400: 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20  tHasNullFlag(v, 
f410: 69 54 61 62 2c 20 2a 70 72 52 68 73 48 61 73 4e  iTab, *prRhsHasN
f420: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ull);.          
f430: 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
f440: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
f450: 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20  v, iAddr);.     
f460: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
f470: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
f480: 6e 6f 20 70 72 65 65 78 69 73 74 69 6e 67 20 69  no preexisting i
f490: 6e 64 65 78 20 69 73 20 61 76 61 69 6c 61 62 6c  ndex is availabl
f4a0: 65 20 66 6f 72 20 74 68 65 20 49 4e 20 63 6c 61  e for the IN cla
f4b0: 75 73 65 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 5f  use.  ** and IN_
f4c0: 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 61 6e  INDEX_NOOP is an
f4d0: 20 61 6c 6c 6f 77 65 64 20 72 65 70 6c 79 0a 20   allowed reply. 
f4e0: 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20   ** and the RHS 
f4f0: 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
f500: 6f 72 20 69 73 20 61 20 6c 69 73 74 2c 20 6e 6f  or is a list, no
f510: 74 20 61 20 73 75 62 71 75 65 72 79 0a 20 20 2a  t a subquery.  *
f520: 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20 69 73  * and the RHS is
f530: 20 6e 6f 74 20 63 6f 6e 74 61 6e 74 20 6f 72 20   not contant or 
f540: 68 61 73 20 74 77 6f 20 6f 72 20 66 65 77 65 72  has two or fewer
f550: 20 74 65 72 6d 73 2c 0a 20 20 2a 2a 20 74 68 65   terms,.  ** the
f560: 6e 20 69 74 20 69 73 20 6e 6f 74 20 77 6f 72 74  n it is not wort
f570: 68 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70  h creating an ep
f580: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f  hemeral table to
f590: 20 65 76 61 6c 75 61 74 65 0a 20 20 2a 2a 20 74   evaluate.  ** t
f5a0: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 73  he IN operator s
f5b0: 6f 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45  o return IN_INDE
f5c0: 58 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f 0a 20 20 69  X_NOOP..  */.  i
f5d0: 66 28 20 65 54 79 70 65 3d 3d 30 0a 20 20 20 26  f( eType==0.   &
f5e0: 26 20 28 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f  & (inFlags & IN_
f5f0: 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 29 0a 20  INDEX_NOOP_OK). 
f600: 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f    && !ExprHasPro
f610: 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73  perty(pX, EP_xIs
f620: 53 65 6c 65 63 74 29 0a 20 20 20 26 26 20 28 21  Select).   && (!
f630: 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43 6f  sqlite3InRhsIsCo
f640: 6e 73 74 61 6e 74 28 70 58 29 20 7c 7c 20 70 58  nstant(pX) || pX
f650: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
f660: 3c 3d 32 29 0a 20 20 29 7b 0a 20 20 20 20 65 54  <=2).  ){.    eT
f670: 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 4e  ype = IN_INDEX_N
f680: 4f 4f 50 3b 0a 20 20 7d 0a 20 20 20 20 20 0a 0a  OOP;.  }.     ..
f690: 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 20 29    if( eType==0 )
f6a0: 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20 6e  {.    /* Could n
f6b0: 6f 74 20 66 69 6e 64 20 61 6e 20 65 78 69 73 74  ot find an exist
f6c0: 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  ing table or ind
f6d0: 65 78 20 74 6f 20 75 73 65 20 61 73 20 74 68 65  ex to use as the
f6e0: 20 52 48 53 20 62 2d 74 72 65 65 2e 0a 20 20 20   RHS b-tree..   
f6f0: 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61 76 65   ** We will have
f700: 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20   to generate an 
f710: 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
f720: 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e 0a 20  to do the job.. 
f730: 20 20 20 2a 2f 0a 20 20 20 20 75 33 32 20 73 61     */.    u32 sa
f740: 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  vedNQueryLoop = 
f750: 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
f760: 6f 70 3b 0a 20 20 20 20 69 6e 74 20 72 4d 61 79  op;.    int rMay
f770: 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20  HaveNull = 0;.  
f780: 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
f790: 45 58 5f 45 50 48 3b 0a 20 20 20 20 69 66 28 20  EX_EPH;.    if( 
f7a0: 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44  inFlags & IN_IND
f7b0: 45 58 5f 4c 4f 4f 50 20 29 7b 0a 20 20 20 20 20  EX_LOOP ){.     
f7c0: 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
f7d0: 6f 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  oop = 0;.      i
f7e0: 66 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69 43  f( pX->pLeft->iC
f7f0: 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78 70 72  olumn<0 && !Expr
f800: 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20  HasProperty(pX, 
f810: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
f820: 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 20 3d  .        eType =
f830: 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b   IN_INDEX_ROWID;
f840: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
f850: 73 65 20 69 66 28 20 70 72 52 68 73 48 61 73 4e  se if( prRhsHasN
f860: 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2a 70 72  ull ){.      *pr
f870: 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 72 4d 61  RhsHasNull = rMa
f880: 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50  yHaveNull = ++pP
f890: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
f8a0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  }.    sqlite3Cod
f8b0: 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
f8c0: 65 2c 20 70 58 2c 20 72 4d 61 79 48 61 76 65 4e  e, pX, rMayHaveN
f8d0: 75 6c 6c 2c 20 65 54 79 70 65 3d 3d 49 4e 5f 49  ull, eType==IN_I
f8e0: 4e 44 45 58 5f 52 4f 57 49 44 29 3b 0a 20 20 20  NDEX_ROWID);.   
f8f0: 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
f900: 6f 6f 70 20 3d 20 73 61 76 65 64 4e 51 75 65 72  oop = savedNQuer
f910: 79 4c 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 7b 0a  yLoop;.  }else{.
f920: 20 20 20 20 70 58 2d 3e 69 54 61 62 6c 65 20 3d      pX->iTable =
f930: 20 69 54 61 62 3b 0a 20 20 7d 0a 20 20 72 65 74   iTab;.  }.  ret
f940: 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e  urn eType;.}.#en
f950: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  dif../*.** Gener
f960: 61 74 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61  ate code for sca
f970: 6c 61 72 20 73 75 62 71 75 65 72 69 65 73 20 75  lar subqueries u
f980: 73 65 64 20 61 73 20 61 20 73 75 62 71 75 65 72  sed as a subquer
f990: 79 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 45 58  y expression, EX
f9a0: 49 53 54 53 2c 0a 2a 2a 20 6f 72 20 49 4e 20 6f  ISTS,.** or IN o
f9b0: 70 65 72 61 74 6f 72 73 2e 20 20 45 78 61 6d 70  perators.  Examp
f9c0: 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  les:.**.**     (
f9d0: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29  SELECT a FROM b)
f9e0: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 73 75 62            -- sub
f9f0: 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 45 58 49  query.**     EXI
fa00: 53 54 53 20 28 53 45 4c 45 43 54 20 61 20 46 52  STS (SELECT a FR
fa10: 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58 49 53 54  OM b)   -- EXIST
fa20: 53 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20  S subquery.**   
fa30: 20 20 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20    x IN (4,5,11) 
fa40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
fa50: 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  IN operator with
fa60: 20 6c 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68   list on right-h
fa70: 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20  and side.**     
fa80: 78 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46  x IN (SELECT a F
fa90: 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e  ROM b)     -- IN
faa0: 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 73   operator with s
fab0: 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72  ubquery on the r
fac0: 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ight.**.** The p
fad0: 45 78 70 72 20 70 61 72 61 6d 65 74 65 72 20 64  Expr parameter d
fae0: 65 73 63 72 69 62 65 73 20 74 68 65 20 65 78 70  escribes the exp
faf0: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e  ression that con
fb00: 74 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20  tains the IN.** 
fb10: 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 75 62 71  operator or subq
fb20: 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  uery..**.** If p
fb30: 61 72 61 6d 65 74 65 72 20 69 73 52 6f 77 69 64  arameter isRowid
fb40: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
fb50: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  en expression pE
fb60: 78 70 72 20 69 73 20 67 75 61 72 61 6e 74 65 65  xpr is guarantee
fb70: 64 0a 2a 2a 20 74 6f 20 62 65 20 6f 66 20 74 68  d.** to be of th
fb80: 65 20 66 6f 72 6d 20 22 3c 72 6f 77 69 64 3e 20  e form "<rowid> 
fb90: 49 4e 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77  IN (?, ?, ?)", w
fba0: 68 65 72 65 20 3c 72 6f 77 69 64 3e 20 69 73 20  here <rowid> is 
fbb0: 61 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74  a reference.** t
fbc0: 6f 20 73 6f 6d 65 20 69 6e 74 65 67 65 72 20 6b  o some integer k
fbd0: 65 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74  ey column of a t
fbe0: 61 62 6c 65 20 42 2d 54 72 65 65 2e 20 49 6e 20  able B-Tree. In 
fbf0: 74 68 69 73 20 63 61 73 65 2c 20 75 73 65 20 61  this case, use a
fc00: 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20 42 2d 54 72  n.** intkey B-Tr
fc10: 65 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ee to store the 
fc20: 73 65 74 20 6f 66 20 49 4e 28 2e 2e 2e 29 20 76  set of IN(...) v
fc30: 61 6c 75 65 73 20 69 6e 73 74 65 61 64 20 6f 66  alues instead of
fc40: 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 28 73   the usual.** (s
fc50: 6c 6f 77 65 72 29 20 76 61 72 69 61 62 6c 65 20  lower) variable 
fc60: 6c 65 6e 67 74 68 20 6b 65 79 73 20 42 2d 54 72  length keys B-Tr
fc70: 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61  ee..**.** If rMa
fc80: 79 48 61 76 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e  yHaveNull is non
fc90: 2d 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e  -zero, that mean
fca0: 73 20 74 68 61 74 20 74 68 65 20 6f 70 65 72 61  s that the opera
fcb0: 74 69 6f 6e 20 69 73 20 61 6e 20 49 4e 0a 2a 2a  tion is an IN.**
fcc0: 20 28 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 6f   (not a SELECT o
fcd0: 72 20 45 58 49 53 54 53 29 20 61 6e 64 20 74 68  r EXISTS) and th
fce0: 61 74 20 74 68 65 20 52 48 53 20 6d 69 67 68 74  at the RHS might
fcf0: 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 2e   contains NULLs.
fd00: 0a 2a 2a 20 41 6c 6c 20 74 68 69 73 20 72 6f 75  .** All this rou
fd10: 74 69 6e 65 20 64 6f 65 73 20 69 73 20 69 6e 69  tine does is ini
fd20: 74 69 61 6c 69 7a 65 20 74 68 65 20 72 65 67 69  tialize the regi
fd30: 73 74 65 72 20 67 69 76 65 6e 20 62 79 20 72 4d  ster given by rM
fd40: 61 79 48 61 76 65 4e 75 6c 6c 0a 2a 2a 20 74 6f  ayHaveNull.** to
fd50: 20 4e 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67 20   NULL.  Calling 
fd60: 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 74 61  routines will ta
fd70: 6b 65 20 63 61 72 65 20 6f 66 20 63 68 61 6e 67  ke care of chang
fd80: 69 6e 67 20 74 68 69 73 20 72 65 67 69 73 74 65  ing this registe
fd90: 72 0a 2a 2a 20 76 61 6c 75 65 20 74 6f 20 6e 6f  r.** value to no
fda0: 6e 2d 4e 55 4c 4c 20 69 66 20 74 68 65 20 52 48  n-NULL if the RH
fdb0: 53 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a  S is NULL-free..
fdc0: 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45  **.** For a SELE
fdd0: 43 54 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65  CT or EXISTS ope
fde0: 72 61 74 6f 72 2c 20 72 65 74 75 72 6e 20 74 68  rator, return th
fdf0: 65 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20  e register that 
fe00: 68 6f 6c 64 73 20 74 68 65 0a 2a 2a 20 72 65 73  holds the.** res
fe10: 75 6c 74 2e 20 20 46 6f 72 20 49 4e 20 6f 70 65  ult.  For IN ope
fe20: 72 61 74 6f 72 73 20 6f 72 20 69 66 20 61 6e 20  rators or if an 
fe30: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
fe40: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
fe50: 73 20 30 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  s 0..*/.#ifndef 
fe60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
fe70: 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33  UERY.int sqlite3
fe80: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 0a 20  CodeSubselect(. 
fe90: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
fea0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
feb0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
fec0: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
fed0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
fee0: 49 4e 2c 20 53 45 4c 45 43 54 2c 20 6f 72 20 45  IN, SELECT, or E
fef0: 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72 20 2a  XISTS operator *
ff00: 2f 0a 20 20 69 6e 74 20 72 48 61 73 4e 75 6c 6c  /.  int rHasNull
ff10: 46 6c 61 67 2c 20 20 20 20 20 20 20 2f 2a 20 52  Flag,       /* R
ff20: 65 67 69 73 74 65 72 20 74 68 61 74 20 72 65 63  egister that rec
ff30: 6f 72 64 73 20 77 68 65 74 68 65 72 20 4e 55 4c  ords whether NUL
ff40: 4c 73 20 65 78 69 73 74 20 69 6e 20 52 48 53 20  Ls exist in RHS 
ff50: 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 77 69 64  */.  int isRowid
ff60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ff70: 49 66 20 74 72 75 65 2c 20 4c 48 53 20 6f 66 20  If true, LHS of 
ff80: 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61  IN operator is a
ff90: 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 69   rowid */.){.  i
ffa0: 6e 74 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20  nt jmpIfDynamic 
ffb0: 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20  = -1;           
ffc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
ffd0: 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64 72  e-time test addr
ffe0: 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 72 52 65  ess */.  int rRe
fff0: 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
10000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10010 20 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74 6f   /* Register sto
10020 72 69 6e 67 20 72 65 73 75 6c 74 69 6e 67 20 2a  ring resulting *
10030 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  /.  Vdbe *v = sq
10040 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
10050 72 73 65 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  rse);.  if( NEVE
10060 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(v==0) ) return
10070 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   0;.  sqlite3Exp
10080 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
10090 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63  e);..  /* This c
100a0 6f 64 65 20 6d 75 73 74 20 62 65 20 72 75 6e 20  ode must be run 
100b0 69 6e 20 69 74 73 20 65 6e 74 69 72 65 74 79 20  in its entirety 
100c0 65 76 65 72 79 20 74 69 6d 65 20 69 74 20 69 73  every time it is
100d0 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a   encountered.  *
100e0 2a 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  * if any of the 
100f0 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75  following is tru
10100 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  e:.  **.  **    
10110 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  *  The right-han
10120 64 20 73 69 64 65 20 69 73 20 61 20 63 6f 72 72  d side is a corr
10130 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 0a  elated subquery.
10140 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72    **    *  The r
10150 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69  ight-hand side i
10160 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  s an expression 
10170 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  list containing 
10180 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20  variables.  **  
10190 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69    *  We are insi
101a0 64 65 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a  de a trigger.  *
101b0 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66  *.  ** If all of
101c0 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 66   the above are f
101d0 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61  alse, then we ca
101e0 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20  n run this code 
101f0 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73  just once.  ** s
10200 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c  ave the results,
10210 20 61 6e 64 20 72 65 75 73 65 20 74 68 65 20 73   and reuse the s
10220 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75  ame result on su
10230 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74  bsequent invocat
10240 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
10250 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
10260 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53  y(pExpr, EP_VarS
10270 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 6a 6d  elect) ){.    jm
10280 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 73 71 6c  pIfDynamic = sql
10290 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61  ite3CodeOnce(pPa
102a0 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  rse); VdbeCovera
102b0 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e  ge(v);.  }..#ifn
102c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
102d0 45 58 50 4c 41 49 4e 0a 20 20 69 66 28 20 70 50  EXPLAIN.  if( pP
102e0 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  arse->explain==2
102f0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d   ){.    char *zM
10300 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
10310 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ntf(pParse->db, 
10320 22 45 58 45 43 55 54 45 20 25 73 25 73 20 53 55  "EXECUTE %s%s SU
10330 42 51 55 45 52 59 20 25 64 22 2c 0a 20 20 20 20  BQUERY %d",.    
10340 20 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63      jmpIfDynamic
10350 3e 3d 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54  >=0?"":"CORRELAT
10360 45 44 20 22 2c 0a 20 20 20 20 20 20 20 20 70 45  ED ",.        pE
10370 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 3f 22  xpr->op==TK_IN?"
10380 4c 49 53 54 22 3a 22 53 43 41 4c 41 52 22 2c 0a  LIST":"SCALAR",.
10390 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
103a0 69 4e 65 78 74 53 65 6c 65 63 74 49 64 0a 20 20  iNextSelectId.  
103b0 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
103c0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
103d0 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65  _Explain, pParse
103e0 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20  ->iSelectId, 0, 
103f0 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41  0, zMsg, P4_DYNA
10400 4d 49 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  MIC);.  }.#endif
10410 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
10420 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
10430 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
10440 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20   char affinity; 
10450 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10460 41 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20  Affinity of the 
10470 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 2a 2f  LHS of the IN */
10480 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
10490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104a0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
104b0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
104c0 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f  l instruction */
104d0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
104e0 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
104f0 74 3b 20 2f 2a 20 74 68 65 20 4c 48 53 20 6f 66  t; /* the LHS of
10500 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
10510 20 2a 2f 0a 20 20 20 20 20 20 4b 65 79 49 6e 66   */.      KeyInf
10520 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b  o *pKeyInfo = 0;
10530 20 20 20 20 20 20 2f 2a 20 4b 65 79 20 69 6e 66        /* Key inf
10540 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20  ormation */..   
10550 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73 71     affinity = sq
10560 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
10570 79 28 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20  y(pLeft);..     
10580 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69 73   /* Whether this
10590 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45 4c   is an 'x IN(SEL
105a0 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27  ECT...)' or an '
105b0 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29  x IN(<exprlist>)
105c0 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65  '.      ** expre
105d0 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e 64  ssion it is hand
105e0 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77 61 79  led the same way
105f0 2e 20 20 41 6e 20 65 70 68 65 6d 65 72 61 6c 20  .  An ephemeral 
10600 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20  table is .      
10610 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20 73  ** filled with s
10620 69 6e 67 6c 65 2d 66 69 65 6c 64 20 69 6e 64 65  ingle-field inde
10630 78 20 6b 65 79 73 20 72 65 70 72 65 73 65 6e 74  x keys represent
10640 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ing the results.
10650 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68        ** from th
10660 65 20 53 45 4c 45 43 54 20 6f 72 20 74 68 65 20  e SELECT or the 
10670 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20  <exprlist>..    
10680 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
10690 20 74 68 65 20 27 78 27 20 65 78 70 72 65 73 73   the 'x' express
106a0 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  ion is a column 
106b0 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 45  value, or the SE
106c0 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  LECT....      **
106d0 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72   statement retur
106e0 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  ns a column valu
106f0 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69  e, then the affi
10700 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20 20 20  nity of that.   
10710 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20     ** column is 
10720 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68  used to build th
10730 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66  e index keys. If
10740 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68   both 'x' and th
10750 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43  e.      ** SELEC
10760 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61  T... statement a
10770 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  re columns, then
10780 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
10790 79 20 69 73 20 75 73 65 64 0a 20 20 20 20 20 20  y is used.      
107a0 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c  ** if either col
107b0 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20  umn has NUMERIC 
107c0 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e  or INTEGER affin
107d0 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a  ity. If neither.
107e0 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72        ** 'x' nor
107f0 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73   the SELECT... s
10800 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c  tatement are col
10810 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72  umns, then numer
10820 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20  ic affinity.    
10830 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20 20    ** is used..  
10840 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78      */.      pEx
10850 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61  pr->iTable = pPa
10860 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
10870 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
10880 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10890 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
108a0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
108b0 21 69 73 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  !isRowid);.     
108c0 20 70 4b 65 79 49 6e 66 6f 20 3d 20 69 73 52 6f   pKeyInfo = isRo
108d0 77 69 64 20 3f 20 30 20 3a 20 73 71 6c 69 74 65  wid ? 0 : sqlite
108e0 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50  3KeyInfoAlloc(pP
108f0 61 72 73 65 2d 3e 64 62 2c 20 31 2c 20 31 29 3b  arse->db, 1, 1);
10900 0a 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ..      if( Expr
10910 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
10920 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
10930 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
10940 61 73 65 20 31 3a 20 20 20 20 20 65 78 70 72 20  ase 1:     expr 
10950 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a  IN (SELECT ...).
10960 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
10970 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63     ** Generate c
10980 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ode to write the
10990 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
109a0 73 65 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20  select into the 
109b0 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20  temporary.      
109c0 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63    ** table alloc
109d0 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20  ated and opened 
109e0 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a  above..        *
109f0 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74  /.        Select
10a00 20 2a 70 53 65 6c 65 63 74 20 3d 20 70 45 78 70   *pSelect = pExp
10a10 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20  r->x.pSelect;.  
10a20 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
10a30 20 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20 45   dest;.        E
10a40 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
10a50 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ..        assert
10a60 28 20 21 69 73 52 6f 77 69 64 20 29 3b 0a 20 20  ( !isRowid );.  
10a70 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
10a80 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
10a90 74 2c 20 53 52 54 5f 53 65 74 2c 20 70 45 78 70  t, SRT_Set, pExp
10aa0 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20  r->iTable);.    
10ab0 20 20 20 20 64 65 73 74 2e 61 66 66 53 64 73 74      dest.affSdst
10ac0 20 3d 20 28 75 38 29 61 66 66 69 6e 69 74 79 3b   = (u8)affinity;
10ad0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
10ae0 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 26   (pExpr->iTable&
10af0 30 78 30 30 30 30 46 46 46 46 29 3d 3d 70 45 78  0x0000FFFF)==pEx
10b00 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20  pr->iTable );.  
10b10 20 20 20 20 20 20 70 53 65 6c 65 63 74 2d 3e 69        pSelect->i
10b20 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
10b30 20 20 20 74 65 73 74 63 61 73 65 28 20 70 53 65     testcase( pSe
10b40 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26  lect->selFlags &
10b50 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a   SF_Distinct );.
10b60 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
10b70 28 20 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 3b  ( pKeyInfo==0 );
10b80 20 2f 2a 20 43 61 75 73 65 64 20 62 79 20 4f 4f   /* Caused by OO
10b90 4d 20 69 6e 20 73 71 6c 69 74 65 33 4b 65 79 49  M in sqlite3KeyI
10ba0 6e 66 6f 41 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20  nfoAlloc() */.  
10bb0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
10bc0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
10bd0 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29 20  pSelect, &dest) 
10be0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
10bf0 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
10c00 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20  (pKeyInfo);.    
10c10 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
10c20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10c30 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65    pEList = pSele
10c40 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  ct->pEList;.    
10c50 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79      assert( pKey
10c60 49 6e 66 6f 21 3d 30 20 29 3b 20 2f 2a 20 4f 4f  Info!=0 ); /* OO
10c70 4d 20 77 69 6c 6c 20 63 61 75 73 65 20 65 78 69  M will cause exi
10c80 74 20 61 66 74 65 72 20 73 71 6c 69 74 65 33 53  t after sqlite3S
10c90 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20 20 20 20  elect() */.     
10ca0 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73     assert( pELis
10cb0 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
10cc0 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 2d 3e  assert( pEList->
10cd0 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 20  nExpr>0 );.     
10ce0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
10cf0 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
10d00 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20 29  able(pKeyInfo) )
10d10 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e  ;.        pKeyIn
10d20 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73  fo->aColl[0] = s
10d30 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
10d40 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
10d50 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
10d60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d90 20 20 20 20 20 20 20 20 20 20 70 45 4c 69 73 74            pEList
10da0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
10db0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41       }else if( A
10dc0 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70  LWAYS(pExpr->x.p
10dd0 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  List!=0) ){.    
10de0 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20      /* Case 2:  
10df0 20 20 20 65 78 70 72 20 49 4e 20 28 65 78 70 72     expr IN (expr
10e00 6c 69 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a  list).        **
10e10 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  .        ** For 
10e20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c  each expression,
10e30 20 62 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20   build an index 
10e40 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61  key from the eva
10e50 6c 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20  luation and.    
10e60 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20      ** store it 
10e70 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  in the temporary
10e80 20 74 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72   table. If <expr
10e90 3e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74  > is a column, t
10ea0 68 65 6e 20 75 73 65 0a 20 20 20 20 20 20 20 20  hen use.        
10eb0 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20  ** that columns 
10ec0 61 66 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75  affinity when bu
10ed0 69 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79  ilding index key
10ee0 73 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20  s. If <expr> is 
10ef0 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  not.        ** a
10f00 20 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d   column, use num
10f10 65 72 69 63 20 61 66 66 69 6e 69 74 79 2e 0a 20  eric affinity.. 
10f20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
10f30 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
10f40 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
10f50 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
10f60 74 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  t;.        struc
10f70 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
10f80 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20  *pItem;.        
10f90 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a  int r1, r2, r3;.
10fa0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 61 66  .        if( !af
10fb0 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20  finity ){.      
10fc0 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53      affinity = S
10fd0 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a  QLITE_AFF_BLOB;.
10fe0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10ff0 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29    if( pKeyInfo )
11000 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
11010 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  rt( sqlite3KeyIn
11020 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b  foIsWriteable(pK
11030 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20  eyInfo) );.     
11040 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61       pKeyInfo->a
11050 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65  Coll[0] = sqlite
11060 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
11070 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
11080 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  t);.        }.. 
11090 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74         /* Loop t
110a0 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72  hrough each expr
110b0 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c  ession in <exprl
110c0 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ist>. */.       
110d0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
110e0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
110f0 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71  .        r2 = sq
11100 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
11110 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
11120 20 69 66 28 20 69 73 52 6f 77 69 64 20 29 20 73   if( isRowid ) s
11130 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11140 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
11150 72 32 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  r2);.        for
11160 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  (i=pList->nExpr,
11170 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b   pItem=pList->a;
11180 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d   i>0; i--, pItem
11190 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  ++){.          E
111a0 78 70 72 20 2a 70 45 32 20 3d 20 70 49 74 65 6d  xpr *pE2 = pItem
111b0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
111c0 20 20 20 69 6e 74 20 69 56 61 6c 54 6f 49 6e 73     int iValToIns
111d0 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
111e0 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
111f0 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e  n is not constan
11200 74 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e  t then we will n
11210 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20  eed to.         
11220 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 65 20   ** disable the 
11230 74 65 73 74 20 74 68 61 74 20 77 61 73 20 67 65  test that was ge
11240 6e 65 72 61 74 65 64 20 61 62 6f 76 65 20 74 68  nerated above th
11250 61 74 20 6d 61 6b 65 73 20 73 75 72 65 0a 20 20  at makes sure.  
11260 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
11270 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63 75 74  code only execut
11280 65 73 20 6f 6e 63 65 2e 20 20 42 65 63 61 75 73  es once.  Becaus
11290 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73  e for a non-cons
112a0 74 61 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a  tant.          *
112b0 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77 65 20  * expression we 
112c0 6e 65 65 64 20 74 6f 20 72 65 72 75 6e 20 74 68  need to rerun th
112d0 69 73 20 63 6f 64 65 20 65 61 63 68 20 74 69 6d  is code each tim
112e0 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
112f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 6d            if( jm
11300 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 20 26 26  pIfDynamic>=0 &&
11310 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
11320 6f 6e 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a  onstant(pE2) ){.
11330 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
11340 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
11350 6f 6f 70 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61  oop(v, jmpIfDyna
11360 6d 69 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20  mic);.          
11370 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d    jmpIfDynamic =
11380 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   -1;.          }
11390 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  ..          /* E
113a0 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72  valuate the expr
113b0 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72  ession and inser
113c0 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65  t it into the te
113d0 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  mp table */.    
113e0 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69        if( isRowi
113f0 64 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  d && sqlite3Expr
11400 49 73 49 6e 74 65 67 65 72 28 70 45 32 2c 20 26  IsInteger(pE2, &
11410 69 56 61 6c 54 6f 49 6e 73 29 20 29 7b 0a 20 20  iValToIns) ){.  
11420 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11430 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
11440 50 5f 49 6e 73 65 72 74 49 6e 74 2c 20 70 45 78  P_InsertInt, pEx
11450 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20  pr->iTable, r2, 
11460 69 56 61 6c 54 6f 49 6e 73 29 3b 0a 20 20 20 20  iValToIns);.    
11470 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11480 20 20 20 20 20 20 20 20 20 72 33 20 3d 20 73 71           r3 = sq
11490 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
114a0 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 32 2c  get(pParse, pE2,
114b0 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r1);.          
114c0 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 29 7b    if( isRowid ){
114d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
114e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
114f0 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
11500 2c 20 72 33 2c 0a 20 20 20 20 20 20 20 20 20 20  , r3,.          
11510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11520 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11530 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
11540 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2);.            
11550 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
11560 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
11570 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11580 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
11590 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
115a0 72 32 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20  r2, r3);.       
115b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
115c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
115d0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
115e0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 33  P_MakeRecord, r3
115f0 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69  , 1, r2, &affini
11600 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ty, 1);.        
11610 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
11620 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
11630 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 33 2c  ange(pParse, r3,
11640 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   1);.           
11650 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11660 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
11670 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  sert, pExpr->iTa
11680 62 6c 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  ble, r2);.      
11690 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
116a0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
116b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
116c0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
116d0 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  se, r1);.       
116e0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
116f0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
11700 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
11710 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29    if( pKeyInfo )
11720 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
11730 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
11740 20 61 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 70   addr, (void *)p
11750 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
11760 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NFO);.      }.  
11770 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11780 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  ..    case TK_EX
11790 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54  ISTS:.    case T
117a0 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 64 65  K_SELECT:.    de
117b0 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f  fault: {.      /
117c0 2a 20 49 66 20 74 68 69 73 20 68 61 73 20 74 6f  * If this has to
117d0 20 62 65 20 61 20 73 63 61 6c 61 72 20 53 45 4c   be a scalar SEL
117e0 45 43 54 2e 20 20 47 65 6e 65 72 61 74 65 20 63  ECT.  Generate c
117f0 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65 0a 20  ode to put the. 
11800 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66       ** value of
11810 20 74 68 69 73 20 73 65 6c 65 63 74 20 69 6e 20   this select in 
11820 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  a memory cell an
11830 64 20 72 65 63 6f 72 64 20 74 68 65 20 6e 75 6d  d record the num
11840 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ber.      ** of 
11850 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  the memory cell 
11860 69 6e 20 69 43 6f 6c 75 6d 6e 2e 20 20 49 66 20  in iColumn.  If 
11870 74 68 69 73 20 69 73 20 61 6e 20 45 58 49 53 54  this is an EXIST
11880 53 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a  S, write.      *
11890 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 30 20 28  * an integer 0 (
118a0 6e 6f 74 20 65 78 69 73 74 73 29 20 6f 72 20 31  not exists) or 1
118b0 20 28 65 78 69 73 74 73 29 20 69 6e 74 6f 20 61   (exists) into a
118c0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 0a 20 20 20   memory cell.   
118d0 20 20 20 2a 2a 20 61 6e 64 20 72 65 63 6f 72 64     ** and record
118e0 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c   that memory cel
118f0 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20  l in iColumn..  
11900 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c      */.      Sel
11910 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 20  ect *pSel;      
11920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11930 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61     /* SELECT sta
11940 74 65 6d 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65  tement to encode
11950 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74   */.      Select
11960 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20  Dest dest;      
11970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11980 2f 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c 20 77  /* How to deal w
11990 69 74 68 20 53 45 4c 45 43 74 20 72 65 73 75 6c  ith SELECt resul
119a0 74 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73 74  t */..      test
119b0 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
119c0 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20  =TK_EXISTS );.  
119d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
119e0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
119f0 43 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CT );.      asse
11a00 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
11a10 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70 45 78 70  K_EXISTS || pExp
11a20 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
11a30 20 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72   );..      asser
11a40 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  t( ExprHasProper
11a50 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
11a60 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
11a70 20 70 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78   pSel = pExpr->x
11a80 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  .pSelect;.      
11a90 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
11aa0 74 49 6e 69 74 28 26 64 65 73 74 2c 20 30 2c 20  tInit(&dest, 0, 
11ab0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b  ++pParse->nMem);
11ac0 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
11ad0 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
11ae0 29 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e  ){.        dest.
11af0 65 44 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b  eDest = SRT_Mem;
11b00 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 69 53  .        dest.iS
11b10 64 73 74 20 3d 20 64 65 73 74 2e 69 53 44 50 61  dst = dest.iSDPa
11b20 72 6d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rm;.        sqli
11b30 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11b40 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73   OP_Null, 0, des
11b50 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  t.iSDParm);.    
11b60 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
11b70 28 76 2c 20 22 49 6e 69 74 20 73 75 62 71 75 65  (v, "Init subque
11b80 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20  ry result"));.  
11b90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11ba0 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20     dest.eDest = 
11bb0 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20 20  SRT_Exists;.    
11bc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11bd0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
11be0 67 65 72 2c 20 30 2c 20 64 65 73 74 2e 69 53 44  ger, 0, dest.iSD
11bf0 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56  Parm);.        V
11c00 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
11c10 49 6e 69 74 20 45 58 49 53 54 53 20 72 65 73 75  Init EXISTS resu
11c20 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lt"));.      }. 
11c30 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
11c40 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
11c50 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 29  b, pSel->pLimit)
11c60 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c  ;.      pSel->pL
11c70 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50 45  imit = sqlite3PE
11c80 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49  xpr(pParse, TK_I
11c90 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c 0a 20 20  NTEGER, 0, 0,.  
11ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cc0 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e  &sqlite3IntToken
11cd0 73 5b 31 5d 29 3b 0a 20 20 20 20 20 20 70 53 65  s[1]);.      pSe
11ce0 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  l->iLimit = 0;. 
11cf0 20 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c       pSel->selFl
11d00 61 67 73 20 26 3d 20 7e 53 46 5f 4d 75 6c 74 69  ags &= ~SF_Multi
11d10 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 69 66 28  Value;.      if(
11d20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
11d30 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 26 64 65  Parse, pSel, &de
11d40 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  st) ){.        r
11d50 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
11d60 0a 20 20 20 20 20 20 72 52 65 67 20 3d 20 64 65  .      rReg = de
11d70 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20  st.iSDParm;.    
11d80 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70    ExprSetVVAProp
11d90 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e  erty(pExpr, EP_N
11da0 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20  oReduce);.      
11db0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
11dc0 0a 0a 20 20 69 66 28 20 72 48 61 73 4e 75 6c 6c  ..  if( rHasNull
11dd0 46 6c 61 67 20 29 7b 0a 20 20 20 20 73 71 6c 69  Flag ){.    sqli
11de0 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61  te3SetHasNullFla
11df0 67 28 76 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  g(v, pExpr->iTab
11e00 6c 65 2c 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67  le, rHasNullFlag
11e10 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6a 6d  );.  }..  if( jm
11e20 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 20 29 7b  pIfDynamic>=0 ){
11e30 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11e40 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 49  JumpHere(v, jmpI
11e50 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20 7d 0a 20  fDynamic);.  }. 
11e60 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
11e70 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 0a 20  ePop(pParse);.. 
11e80 20 72 65 74 75 72 6e 20 72 52 65 67 3b 0a 7d 0a   return rReg;.}.
11e90 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
11ea0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
11eb0 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
11ec0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
11ed0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
11ee0 6f 64 65 20 66 6f 72 20 61 6e 20 49 4e 20 65 78  ode for an IN ex
11ef0 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
11f00 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43       x IN (SELEC
11f10 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20 20 20 78  T ...).**      x
11f20 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75   IN (value, valu
11f30 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  e, ...).**.** Th
11f40 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65  e left-hand side
11f50 20 28 4c 48 53 29 20 69 73 20 61 20 73 63 61 6c   (LHS) is a scal
11f60 61 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  ar expression.  
11f70 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
11f80 69 64 65 20 28 52 48 53 29 0a 2a 2a 20 69 73 20  ide (RHS).** is 
11f90 61 6e 20 61 72 72 61 79 20 6f 66 20 7a 65 72 6f  an array of zero
11fa0 20 6f 72 20 6d 6f 72 65 20 76 61 6c 75 65 73 2e   or more values.
11fb0 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e    The expression
11fc0 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
11fd0 4c 48 53 20 69 73 0a 2a 2a 20 63 6f 6e 74 61 69  LHS is.** contai
11fe0 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52  ned within the R
11ff0 48 53 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6f  HS.  The value o
12000 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
12010 20 69 73 20 75 6e 6b 6e 6f 77 6e 20 28 4e 55 4c   is unknown (NUL
12020 4c 29 0a 2a 2a 20 69 66 20 74 68 65 20 4c 48 53  L).** if the LHS
12030 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74   is NULL or if t
12040 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f  he LHS is not co
12050 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74  ntained within t
12060 68 65 20 52 48 53 20 61 6e 64 20 74 68 65 0a 2a  he RHS and the.*
12070 2a 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 6f  * RHS contains o
12080 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20  ne or more NULL 
12090 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  values..**.** Th
120a0 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
120b0 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20 6a  ates code that j
120c0 75 6d 70 73 20 74 6f 20 64 65 73 74 49 66 46 61  umps to destIfFa
120d0 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53 20 69  lse if the LHS i
120e0 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 74 61 69  s not .** contai
120f0 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52  ned within the R
12100 48 53 2e 20 20 49 66 20 64 75 65 20 74 6f 20 4e  HS.  If due to N
12110 55 4c 4c 73 20 77 65 20 63 61 6e 6e 6f 74 20 64  ULLs we cannot d
12120 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
12130 4c 48 53 0a 2a 2a 20 69 73 20 63 6f 6e 74 61 69  LHS.** is contai
12140 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 20 74  ned in the RHS t
12150 68 65 6e 20 6a 75 6d 70 20 74 6f 20 64 65 73 74  hen jump to dest
12160 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65 20  IfNull.  If the 
12170 4c 48 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  LHS is contained
12180 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 52  .** within the R
12190 48 53 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72  HS then fall thr
121a0 6f 75 67 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ough..*/.static 
121b0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
121c0 43 6f 64 65 49 4e 28 0a 20 20 50 61 72 73 65 20  CodeIN(.  Parse 
121d0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
121e0 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
121f0 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
12200 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
12210 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
12220 20 20 2f 2a 20 54 68 65 20 49 4e 20 65 78 70 72    /* The IN expr
12230 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
12240 64 65 73 74 49 66 46 61 6c 73 65 2c 20 20 20 20  destIfFalse,    
12250 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
12260 66 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e  f LHS is not con
12270 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48  tained in the RH
12280 53 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49  S */.  int destI
12290 66 4e 75 6c 6c 20 20 20 20 20 20 20 20 2f 2a 20  fNull        /* 
122a0 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65  Jump here if the
122b0 20 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e 6b   results are unk
122c0 6e 6f 77 6e 20 64 75 65 20 74 6f 20 4e 55 4c 4c  nown due to NULL
122d0 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 52  s */.){.  int rR
122e0 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 20 20  hsHasNull = 0;  
122f0 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 61 74  /* Register that
12300 20 69 73 20 74 72 75 65 20 69 66 20 52 48 53 20   is true if RHS 
12310 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61  contains NULL va
12320 6c 75 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 61  lues */.  char a
12330 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20 20 20  ffinity;        
12340 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 61 66  /* Comparison af
12350 66 69 6e 69 74 79 20 74 6f 20 75 73 65 20 2a 2f  finity to use */
12360 0a 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20 20  .  int eType;   
12370 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65           /* Type
12380 20 6f 66 20 74 68 65 20 52 48 53 20 2a 2f 0a 20   of the RHS */. 
12390 20 69 6e 74 20 72 31 3b 20 20 20 20 20 20 20 20   int r1;        
123a0 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
123b0 61 72 79 20 75 73 65 20 72 65 67 69 73 74 65 72  ary use register
123c0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
123d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
123e0 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63  tatement under c
123f0 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a  onstruction */..
12400 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
12410 20 52 48 53 2e 20 20 20 41 66 74 65 72 20 74 68   RHS.   After th
12420 69 73 20 73 74 65 70 2c 20 74 68 65 20 74 61 62  is step, the tab
12430 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72 0a 20  le with cursor. 
12440 20 2a 2a 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   ** pExpr->iTabl
12450 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20  e will contains 
12460 74 68 65 20 76 61 6c 75 65 73 20 74 68 61 74 20  the values that 
12470 6d 61 6b 65 20 75 70 20 74 68 65 20 52 48 53 2e  make up the RHS.
12480 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72  .  */.  v = pPar
12490 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
124a0 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20  ert( v!=0 );    
124b0 20 20 20 2f 2a 20 4f 4f 4d 20 64 65 74 65 63 74     /* OOM detect
124c0 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73  ed prior to this
124d0 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 56 64   routine */.  Vd
124e0 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
124f0 2c 20 22 62 65 67 69 6e 20 49 4e 20 65 78 70 72  , "begin IN expr
12500 22 29 29 3b 0a 20 20 65 54 79 70 65 20 3d 20 73  "));.  eType = s
12510 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65  qlite3FindInInde
12520 78 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  x(pParse, pExpr,
12530 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49 4e                IN
12550 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49  _INDEX_MEMBERSHI
12560 50 20 7c 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  P | IN_INDEX_NOO
12570 50 5f 4f 4b 2c 0a 20 20 20 20 20 20 20 20 20 20  P_OK,.          
12580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12590 20 20 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d     destIfFalse==
125a0 64 65 73 74 49 66 4e 75 6c 6c 20 3f 20 30 20 3a  destIfNull ? 0 :
125b0 20 26 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a   &rRhsHasNull);.
125c0 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
125d0 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f   the affinity to
125e0 20 75 73 65 20 74 6f 20 63 72 65 61 74 65 20 61   use to create a
125f0 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 72 65   key from the re
12600 73 75 6c 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68  sults.  ** of th
12610 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 61 66  e expression. af
12620 66 69 6e 69 74 79 53 74 72 20 73 74 6f 72 65 73  finityStr stores
12630 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67   a static string
12640 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0a 20 20   suitable for.  
12650 2a 2a 20 50 34 20 6f 66 20 4f 50 5f 4d 61 6b 65  ** P4 of OP_Make
12660 52 65 63 6f 72 64 2e 0a 20 20 2a 2f 0a 20 20 61  Record..  */.  a
12670 66 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72  ffinity = compar
12680 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78  isonAffinity(pEx
12690 70 72 29 3b 0a 0a 20 20 2f 2a 20 43 6f 64 65 20  pr);..  /* Code 
126a0 74 68 65 20 4c 48 53 2c 20 74 68 65 20 3c 65 78  the LHS, the <ex
126b0 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e  pr> from "<expr>
126c0 20 49 4e 20 28 2e 2e 2e 29 22 2e 0a 20 20 2a 2f   IN (...)"..  */
126d0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
126e0 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
126f0 0a 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  .  r1 = sqlite3G
12700 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
12710 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
12720 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
12730 70 72 2d 3e 70 4c 65 66 74 2c 20 72 31 29 3b 0a  pr->pLeft, r1);.
12740 0a 20 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33  .  /* If sqlite3
12750 46 69 6e 64 49 6e 49 6e 64 65 78 28 29 20 64 69  FindInIndex() di
12760 64 20 6e 6f 74 20 66 69 6e 64 20 6f 72 20 63 72  d not find or cr
12770 65 61 74 65 20 61 6e 20 69 6e 64 65 78 20 74 68  eate an index th
12780 61 74 20 69 73 0a 20 20 2a 2a 20 73 75 69 74 61  at is.  ** suita
12790 62 6c 65 20 66 6f 72 20 65 76 61 6c 75 61 74 69  ble for evaluati
127a0 6e 67 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  ng the IN operat
127b0 6f 72 2c 20 74 68 65 6e 20 65 76 61 6c 75 61 74  or, then evaluat
127c0 65 20 75 73 69 6e 67 20 61 0a 20 20 2a 2a 20 73  e using a.  ** s
127d0 65 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61  equence of compa
127e0 72 69 73 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  risons..  */.  i
127f0 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  f( eType==IN_IND
12800 45 58 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 45  EX_NOOP ){.    E
12810 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
12820 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
12830 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
12840 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
12850 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
12860 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
12870 20 20 20 20 69 6e 74 20 6c 61 62 65 6c 4f 6b 20      int labelOk 
12880 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
12890 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 69  eLabel(v);.    i
128a0 6e 74 20 72 32 2c 20 72 65 67 54 6f 46 72 65 65  nt r2, regToFree
128b0 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 43 6b 4e  ;.    int regCkN
128c0 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ull = 0;.    int
128d0 20 69 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28   ii;.    assert(
128e0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
128f0 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
12900 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66  elect) );.    if
12910 28 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65  ( destIfNull!=de
12920 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20  stIfFalse ){.   
12930 20 20 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73     regCkNull = s
12940 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
12950 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
12960 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12970 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20  3(v, OP_BitAnd, 
12980 72 31 2c 20 72 31 2c 20 72 65 67 43 6b 4e 75 6c  r1, r1, regCkNul
12990 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  l);.    }.    fo
129a0 72 28 69 69 3d 30 3b 20 69 69 3c 70 4c 69 73 74  r(ii=0; ii<pList
129b0 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a  ->nExpr; ii++){.
129c0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
129d0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
129e0 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b  Parse, pList->a[
129f0 69 69 5d 2e 70 45 78 70 72 2c 20 26 72 65 67 54  ii].pExpr, &regT
12a00 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20 69 66  oFree);.      if
12a10 28 20 72 65 67 43 6b 4e 75 6c 6c 20 26 26 20 73  ( regCkNull && s
12a20 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e  qlite3ExprCanBeN
12a30 75 6c 6c 28 70 4c 69 73 74 2d 3e 61 5b 69 69 5d  ull(pList->a[ii]
12a40 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
12a50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12a60 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e  dOp3(v, OP_BitAn
12a70 64 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 72 32  d, regCkNull, r2
12a80 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20  , regCkNull);.  
12a90 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
12aa0 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  ii<pList->nExpr-
12ab0 31 20 7c 7c 20 64 65 73 74 49 66 4e 75 6c 6c 21  1 || destIfNull!
12ac0 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a  =destIfFalse ){.
12ad0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
12ae0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
12af0 45 71 2c 20 72 31 2c 20 6c 61 62 65 6c 4f 6b 2c  Eq, r1, labelOk,
12b00 20 72 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20   r2,.           
12b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
12b20 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  void*)pColl, P4_
12b30 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
12b40 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
12b50 28 76 2c 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45  (v, ii<pList->nE
12b60 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  xpr-1);.        
12b70 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
12b80 2c 20 69 69 3d 3d 70 4c 69 73 74 2d 3e 6e 45 78  , ii==pList->nEx
12b90 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 73  pr-1);.        s
12ba0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
12bb0 50 35 28 76 2c 20 61 66 66 69 6e 69 74 79 29 3b  P5(v, affinity);
12bc0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
12bd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 65        assert( de
12be0 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66  stIfNull==destIf
12bf0 46 61 6c 73 65 20 29 3b 0a 20 20 20 20 20 20 20  False );.       
12c00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12c10 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 31 2c  p4(v, OP_Ne, r1,
12c20 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 32   destIfFalse, r2
12c30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12c40 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
12c50 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c  d*)pColl, P4_COL
12c60 4c 53 45 51 29 3b 20 56 64 62 65 43 6f 76 65 72  LSEQ); VdbeCover
12c70 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
12c80 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
12c90 65 50 35 28 76 2c 20 61 66 66 69 6e 69 74 79 20  eP5(v, affinity 
12ca0 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  | SQLITE_JUMPIFN
12cb0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ULL);.      }.  
12cc0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
12cd0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
12ce0 2c 20 72 65 67 54 6f 46 72 65 65 29 3b 0a 20 20  , regToFree);.  
12cf0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65 67 43    }.    if( regC
12d00 6b 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73  kNull ){.      s
12d10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12d20 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
12d30 65 67 43 6b 4e 75 6c 6c 2c 20 64 65 73 74 49 66  egCkNull, destIf
12d40 4e 75 6c 6c 29 3b 20 56 64 62 65 43 6f 76 65 72  Null); VdbeCover
12d50 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71  age(v);.      sq
12d60 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
12d70 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
12d80 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
12d90 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
12da0 28 76 2c 20 6c 61 62 65 6c 4f 6b 29 3b 0a 20 20  (v, labelOk);.  
12db0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
12dc0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
12dd0 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 7d 65  regCkNull);.  }e
12de0 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 49  lse{.  .    /* I
12df0 66 20 74 68 65 20 4c 48 53 20 69 73 20 4e 55 4c  f the LHS is NUL
12e00 4c 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  L, then the resu
12e10 6c 74 20 69 73 20 65 69 74 68 65 72 20 66 61 6c  lt is either fal
12e20 73 65 20 6f 72 20 4e 55 4c 4c 20 64 65 70 65 6e  se or NULL depen
12e30 64 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 77  ding.    ** on w
12e40 68 65 74 68 65 72 20 74 68 65 20 52 48 53 20 69  hether the RHS i
12e50 73 20 65 6d 70 74 79 20 6f 72 20 6e 6f 74 2c 20  s empty or not, 
12e60 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 20 20  respectively..  
12e70 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
12e80 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c  ite3ExprCanBeNul
12e90 6c 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20  l(pExpr->pLeft) 
12ea0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73  ){.      if( des
12eb0 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46  tIfNull==destIfF
12ec0 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  alse ){.        
12ed0 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f 72 20  /* Shortcut for 
12ee0 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
12ef0 77 68 65 72 65 20 74 68 65 20 66 61 6c 73 65 20  where the false 
12f00 61 6e 64 20 4e 55 4c 4c 20 6f 75 74 63 6f 6d 65  and NULL outcome
12f10 73 20 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a  s are.        **
12f20 20 74 68 65 20 73 61 6d 65 2e 20 2a 2f 0a 20 20   the same. */.  
12f30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12f40 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
12f50 4e 75 6c 6c 2c 20 72 31 2c 20 64 65 73 74 49 66  Null, r1, destIf
12f60 4e 75 6c 6c 29 3b 20 56 64 62 65 43 6f 76 65 72  Null); VdbeCover
12f70 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65  age(v);.      }e
12f80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
12f90 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
12fa0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
12fb0 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 31 29 3b 20 56  _NotNull, r1); V
12fc0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
12fd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
12fe0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12ff0 52 65 77 69 6e 64 2c 20 70 45 78 70 72 2d 3e 69  Rewind, pExpr->i
13000 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c  Table, destIfFal
13010 73 65 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  se);.        Vdb
13020 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
13030 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13040 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 4e  eGoto(v, destIfN
13050 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ull);.        sq
13060 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
13070 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20  e(v, addr1);.   
13080 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
13090 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f    if( eType==IN_
130a0 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20  INDEX_ROWID ){. 
130b0 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20       /* In this 
130c0 63 61 73 65 2c 20 74 68 65 20 52 48 53 20 69 73  case, the RHS is
130d0 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74 61   the ROWID of ta
130e0 62 6c 65 20 62 2d 74 72 65 65 0a 20 20 20 20 20  ble b-tree.     
130f0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
13100 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13110 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 31 2c  P_MustBeInt, r1,
13120 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 20 56   destIfFalse); V
13130 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
13140 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13150 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f  eAddOp3(v, OP_No
13160 74 45 78 69 73 74 73 2c 20 70 45 78 70 72 2d 3e  tExists, pExpr->
13170 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61  iTable, destIfFa
13180 6c 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  lse, r1);.      
13190 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
131a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
131b0 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73    /* In this cas
131c0 65 2c 20 74 68 65 20 52 48 53 20 69 73 20 61 6e  e, the RHS is an
131d0 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 0a 20   index b-tree.. 
131e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
131f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
13200 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20  v, OP_Affinity, 
13210 72 31 2c 20 31 2c 20 30 2c 20 26 61 66 66 69 6e  r1, 1, 0, &affin
13220 69 74 79 2c 20 31 29 3b 0a 20 20 0a 20 20 20 20  ity, 1);.  .    
13230 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 74 20    /* If the set 
13240 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 20  membership test 
13250 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20  fails, then the 
13260 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 0a 20  result of the . 
13270 20 20 20 20 20 2a 2a 20 22 78 20 49 4e 20 28 2e       ** "x IN (.
13280 2e 2e 29 22 20 65 78 70 72 65 73 73 69 6f 6e 20  ..)" expression 
13290 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 30  must be either 0
132a0 20 6f 72 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65   or NULL. If the
132b0 20 73 65 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f   set.      ** co
132c0 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 20 76  ntains no NULL v
132d0 61 6c 75 65 73 2c 20 74 68 65 6e 20 74 68 65 20  alues, then the 
132e0 72 65 73 75 6c 74 20 69 73 20 30 2e 20 49 66 20  result is 0. If 
132f0 74 68 65 20 73 65 74 20 0a 20 20 20 20 20 20 2a  the set .      *
13300 2a 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f  * contains one o
13310 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75  r more NULL valu
13320 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  es, then the res
13330 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20  ult of the.     
13340 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69   ** expression i
13350 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 0a 20 20 20  s also NULL..   
13360 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
13370 72 74 28 20 64 65 73 74 49 66 46 61 6c 73 65 21  rt( destIfFalse!
13380 3d 64 65 73 74 49 66 4e 75 6c 6c 20 7c 7c 20 72  =destIfNull || r
13390 52 68 73 48 61 73 4e 75 6c 6c 3d 3d 30 20 29 3b  RhsHasNull==0 );
133a0 0a 20 20 20 20 20 20 69 66 28 20 72 52 68 73 48  .      if( rRhsH
133b0 61 73 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  asNull==0 ){.   
133c0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
133d0 6e 63 68 20 72 75 6e 73 20 69 66 20 69 74 20 69  nch runs if it i
133e0 73 20 6b 6e 6f 77 6e 20 61 74 20 63 6f 6d 70 69  s known at compi
133f0 6c 65 20 74 69 6d 65 20 74 68 61 74 20 74 68 65  le time that the
13400 20 52 48 53 0a 20 20 20 20 20 20 20 20 2a 2a 20   RHS.        ** 
13410 63 61 6e 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4e  cannot contain N
13420 55 4c 4c 20 76 61 6c 75 65 73 2e 20 54 68 69 73  ULL values. This
13430 20 68 61 70 70 65 6e 73 20 61 73 20 74 68 65 20   happens as the 
13440 72 65 73 75 6c 74 0a 20 20 20 20 20 20 20 20 2a  result.        *
13450 2a 20 6f 66 20 61 20 22 4e 4f 54 20 4e 55 4c 4c  * of a "NOT NULL
13460 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20  " constraint in 
13470 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
13480 65 6d 61 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ema..        **.
13490 20 20 20 20 20 20 20 20 2a 2a 20 41 6c 73 6f 20          ** Also 
134a0 72 75 6e 20 74 68 69 73 20 62 72 61 6e 63 68 20  run this branch 
134b0 69 66 20 4e 55 4c 4c 20 69 73 20 65 71 75 69 76  if NULL is equiv
134c0 61 6c 65 6e 74 20 74 6f 20 46 41 4c 53 45 0a 20  alent to FALSE. 
134d0 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68         ** for th
134e0 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 49 4e  is particular IN
134f0 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 20   operator..     
13500 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71     */.        sq
13510 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
13520 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e  nt(v, OP_NotFoun
13530 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
13540 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72  , destIfFalse, r
13550 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 56  1, 1);.        V
13560 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
13570 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13580 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20       /* In this 
13590 62 72 61 6e 63 68 2c 20 74 68 65 20 52 48 53 20  branch, the RHS 
135a0 6f 66 20 74 68 65 20 49 4e 20 6d 69 67 68 74 20  of the IN might 
135b0 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 61  contain a NULL a
135c0 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  nd.        ** th
135d0 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 61 20  e presence of a 
135e0 4e 55 4c 4c 20 6f 6e 20 74 68 65 20 52 48 53 20  NULL on the RHS 
135f0 6d 61 6b 65 73 20 61 20 64 69 66 66 65 72 65 6e  makes a differen
13600 63 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  ce in the.      
13610 20 20 2a 2a 20 6f 75 74 63 6f 6d 65 2e 0a 20 20    ** outcome..  
13620 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
13630 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20 0a 20   int addr1;.  . 
13640 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
13650 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
13660 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e 74 61  the LHS is conta
13670 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 2e  ined in the RHS.
13680 20 20 49 66 20 73 6f 2c 0a 20 20 20 20 20 20 20    If so,.       
13690 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 61 6e 73   ** then the ans
136a0 77 65 72 20 69 73 20 54 52 55 45 20 74 68 65 20  wer is TRUE the 
136b0 70 72 65 73 65 6e 63 65 20 6f 66 20 4e 55 4c 4c  presence of NULL
136c0 73 20 69 6e 20 74 68 65 20 52 48 53 20 64 6f 65  s in the RHS doe
136d0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74  s.        ** not
136e0 20 6d 61 74 74 65 72 2e 20 20 49 66 20 74 68 65   matter.  If the
136f0 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74   LHS is not cont
13700 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53  ained in the RHS
13710 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20  , then the.     
13720 20 20 20 2a 2a 20 61 6e 73 77 65 72 20 69 73 20     ** answer is 
13730 4e 55 4c 4c 20 69 66 20 74 68 65 20 52 48 53 20  NULL if the RHS 
13740 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 20 61  contains NULLs a
13750 6e 64 20 74 68 65 20 61 6e 73 77 65 72 20 69 73  nd the answer is
13760 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 41 4c 53  .        ** FALS
13770 45 20 69 66 20 74 68 65 20 52 48 53 20 69 73 20  E if the RHS is 
13780 4e 55 4c 4c 2d 66 72 65 65 2e 0a 20 20 20 20 20  NULL-free..     
13790 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 64     */.        ad
137a0 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
137b0 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
137c0 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69  _Found, pExpr->i
137d0 54 61 62 6c 65 2c 20 30 2c 20 72 31 2c 20 31 29  Table, 0, r1, 1)
137e0 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
137f0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
13800 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13810 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
13820 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20  l, rRhsHasNull, 
13830 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
13840 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
13850 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  e(v);.        sq
13860 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
13870 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
13880 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13890 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
138a0 64 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  dr1);.      }.  
138b0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
138c0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
138d0 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 73  pParse, r1);.  s
138e0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
138f0 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 56 64  op(pParse);.  Vd
13900 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  beComment((v, "e
13910 6e 64 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 7d  nd IN expr"));.}
13920 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
13930 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
13940 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
13950 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
13960 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20 47 65 6e  _POINT./*.** Gen
13970 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63  erate an instruc
13980 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70  tion that will p
13990 75 74 20 74 68 65 20 66 6c 6f 61 74 69 6e 67 20  ut the floating 
139a0 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 20 64  point.** value d
139b0 65 73 63 72 69 62 65 64 20 62 79 20 7a 5b 30 2e  escribed by z[0.
139c0 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73  .n-1] into regis
139d0 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20  ter iMem..**.** 
139e0 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77  The z[] string w
139f0 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74  ill probably not
13a00 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61   be zero-termina
13a10 74 65 64 2e 20 20 42 75 74 20 74 68 65 20 0a 2a  ted.  But the .*
13a20 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65 72  * z[n] character
13a30 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
13a40 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 20 74  o be something t
13a50 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f  hat does not loo
13a60 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f  k.** like the co
13a70 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68  ntinuation of th
13a80 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61  e number..*/.sta
13a90 74 69 63 20 76 6f 69 64 20 63 6f 64 65 52 65 61  tic void codeRea
13aa0 6c 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74  l(Vdbe *v, const
13ab0 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 65   char *z, int ne
13ac0 67 61 74 65 46 6c 61 67 2c 20 69 6e 74 20 69 4d  gateFlag, int iM
13ad0 65 6d 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59  em){.  if( ALWAY
13ae0 53 28 7a 21 3d 30 29 20 29 7b 0a 20 20 20 20 64  S(z!=0) ){.    d
13af0 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20 20  ouble value;.   
13b00 20 73 71 6c 69 74 65 33 41 74 6f 46 28 7a 2c 20   sqlite3AtoF(z, 
13b10 26 76 61 6c 75 65 2c 20 73 71 6c 69 74 65 33 53  &value, sqlite3S
13b20 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c 49  trlen30(z), SQLI
13b30 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 61 73  TE_UTF8);.    as
13b40 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 49 73  sert( !sqlite3Is
13b50 4e 61 4e 28 76 61 6c 75 65 29 20 29 3b 20 2f 2a  NaN(value) ); /*
13b60 20 54 68 65 20 6e 65 77 20 41 74 6f 46 20 6e 65   The new AtoF ne
13b70 76 65 72 20 72 65 74 75 72 6e 73 20 4e 61 4e 20  ver returns NaN 
13b80 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 67 61 74  */.    if( negat
13b90 65 46 6c 61 67 20 29 20 76 61 6c 75 65 20 3d 20  eFlag ) value = 
13ba0 2d 76 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69  -value;.    sqli
13bb0 74 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70  te3VdbeAddOp4Dup
13bc0 38 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c  8(v, OP_Real, 0,
13bd0 20 69 4d 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26   iMem, 0, (u8*)&
13be0 76 61 6c 75 65 2c 20 50 34 5f 52 45 41 4c 29 3b  value, P4_REAL);
13bf0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  .  }.}.#endif...
13c00 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
13c10 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
13c20 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20  at will put the 
13c30 69 6e 74 65 67 65 72 20 64 65 73 63 72 69 62 65  integer describe
13c40 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e   by.** text z[0.
13c50 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73  .n-1] into regis
13c60 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20  ter iMem..**.** 
13c70 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 69 73  Expr.u.zToken is
13c80 20 61 6c 77 61 79 73 20 55 54 46 38 20 61 6e 64   always UTF8 and
13c90 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64   zero-terminated
13ca0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
13cb0 20 63 6f 64 65 49 6e 74 65 67 65 72 28 50 61 72   codeInteger(Par
13cc0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
13cd0 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 6e 65 67   *pExpr, int neg
13ce0 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b  Flag, int iMem){
13cf0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
13d00 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66  rse->pVdbe;.  if
13d10 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26  ( pExpr->flags &
13d20 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a   EP_IntValue ){.
13d30 20 20 20 20 69 6e 74 20 69 20 3d 20 70 45 78 70      int i = pExp
13d40 72 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20  r->u.iValue;.   
13d50 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 29 3b   assert( i>=0 );
13d60 0a 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67  .    if( negFlag
13d70 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20 73   ) i = -i;.    s
13d80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13d90 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
13da0 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73  i, iMem);.  }els
13db0 65 7b 0a 20 20 20 20 69 6e 74 20 63 3b 0a 20 20  e{.    int c;.  
13dc0 20 20 69 36 34 20 76 61 6c 75 65 3b 0a 20 20 20    i64 value;.   
13dd0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
13de0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
13df0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 21  ;.    assert( z!
13e00 3d 30 20 29 3b 0a 20 20 20 20 63 20 3d 20 73 71  =0 );.    c = sq
13e10 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49  lite3DecOrHexToI
13e20 36 34 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20  64(z, &value);. 
13e30 20 20 20 69 66 28 20 63 3d 3d 30 20 7c 7c 20 28     if( c==0 || (
13e40 63 3d 3d 32 20 26 26 20 6e 65 67 46 6c 61 67 29  c==2 && negFlag)
13e50 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65   ){.      if( ne
13e60 67 46 6c 61 67 20 29 7b 20 76 61 6c 75 65 20 3d  gFlag ){ value =
13e70 20 63 3d 3d 32 20 3f 20 53 4d 41 4c 4c 45 53 54   c==2 ? SMALLEST
13e80 5f 49 4e 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b  _INT64 : -value;
13e90 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
13ea0 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76  VdbeAddOp4Dup8(v
13eb0 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69  , OP_Int64, 0, i
13ec0 4d 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76 61  Mem, 0, (u8*)&va
13ed0 6c 75 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a  lue, P4_INT64);.
13ee0 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65      }else{.#ifde
13ef0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
13f00 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
13f10 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
13f20 73 67 28 70 50 61 72 73 65 2c 20 22 6f 76 65 72  sg(pParse, "over
13f30 73 69 7a 65 64 20 69 6e 74 65 67 65 72 3a 20 25  sized integer: %
13f40 73 25 73 22 2c 20 6e 65 67 46 6c 61 67 20 3f 20  s%s", negFlag ? 
13f50 22 2d 22 20 3a 20 22 22 2c 20 7a 29 3b 0a 23 65  "-" : "", z);.#e
13f60 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  lse.#ifndef SQLI
13f70 54 45 5f 4f 4d 49 54 5f 48 45 58 5f 49 4e 54 45  TE_OMIT_HEX_INTE
13f80 47 45 52 0a 20 20 20 20 20 20 69 66 28 20 73 71  GER.      if( sq
13f90 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a  lite3_strnicmp(z
13fa0 2c 22 30 78 22 2c 32 29 3d 3d 30 20 29 7b 0a 20  ,"0x",2)==0 ){. 
13fb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
13fc0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
13fd0 68 65 78 20 6c 69 74 65 72 61 6c 20 74 6f 6f 20  hex literal too 
13fe0 62 69 67 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20  big: %s", z);.  
13ff0 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
14000 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
14010 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a 2c 20   codeReal(v, z, 
14020 6e 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a  negFlag, iMem);.
14030 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
14040 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20     }.  }.}..#if 
14050 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
14060 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 56 65 72 69  EBUG)./*.** Veri
14070 66 79 20 74 68 65 20 63 6f 6e 73 69 73 74 65 6e  fy the consisten
14080 63 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  cy of the column
14090 20 63 61 63 68 65 0a 2a 2f 0a 73 74 61 74 69 63   cache.*/.static
140a0 20 69 6e 74 20 63 61 63 68 65 49 73 56 61 6c 69   int cacheIsVali
140b0 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  d(Parse *pParse)
140c0 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  {.  int i, n;.  
140d0 66 6f 72 28 69 3d 6e 3d 30 3b 20 69 3c 53 51 4c  for(i=n=0; i<SQL
140e0 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
140f0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50  i++){.    if( pP
14100 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
14110 69 5d 2e 69 52 65 67 3e 30 20 29 20 6e 2b 2b 3b  i].iReg>0 ) n++;
14120 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3d  .  }.  return n=
14130 3d 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  =pParse->nColCac
14140 68 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  he;.}.#endif../*
14150 0a 2a 2a 20 43 6c 65 61 72 20 61 20 63 61 63 68  .** Clear a cach
14160 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61 74  e entry..*/.stat
14170 69 63 20 76 6f 69 64 20 63 61 63 68 65 45 6e 74  ic void cacheEnt
14180 72 79 43 6c 65 61 72 28 50 61 72 73 65 20 2a 70  ryClear(Parse *p
14190 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 79 43  Parse, struct yC
141a0 6f 6c 43 61 63 68 65 20 2a 70 29 7b 0a 20 20 69  olCache *p){.  i
141b0 66 28 20 70 2d 3e 74 65 6d 70 52 65 67 20 29 7b  f( p->tempReg ){
141c0 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
141d0 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53  >nTempReg<ArrayS
141e0 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d  ize(pParse->aTem
141f0 70 52 65 67 29 20 29 7b 0a 20 20 20 20 20 20 70  pReg) ){.      p
14200 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
14210 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
14220 2b 2b 5d 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20  ++] = p->iReg;. 
14230 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74 65 6d 70     }.    p->temp
14240 52 65 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  Reg = 0;.  }.  p
14250 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 70 50  ->iReg = 0;.  pP
14260 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 2d  arse->nColCache-
14270 2d 3b 0a 20 20 61 73 73 65 72 74 28 20 63 61 63  -;.  assert( cac
14280 68 65 49 73 56 61 6c 69 64 28 70 50 61 72 73 65  heIsValid(pParse
14290 29 20 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  ) );.}.../*.** R
142a0 65 63 6f 72 64 20 69 6e 20 74 68 65 20 63 6f 6c  ecord in the col
142b0 75 6d 6e 20 63 61 63 68 65 20 74 68 61 74 20 61  umn cache that a
142c0 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6c 75   particular colu
142d0 6d 6e 20 66 72 6f 6d 20 61 0a 2a 2a 20 70 61 72  mn from a.** par
142e0 74 69 63 75 6c 61 72 20 74 61 62 6c 65 20 69 73  ticular table is
142f0 20 73 74 6f 72 65 64 20 69 6e 20 61 20 70 61 72   stored in a par
14300 74 69 63 75 6c 61 72 20 72 65 67 69 73 74 65 72  ticular register
14310 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
14320 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28  3ExprCacheStore(
14330 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
14340 6e 74 20 69 54 61 62 2c 20 69 6e 74 20 69 43 6f  nt iTab, int iCo
14350 6c 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20  l, int iReg){.  
14360 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d 69 6e  int i;.  int min
14370 4c 72 75 3b 0a 20 20 69 6e 74 20 69 64 78 4c 72  Lru;.  int idxLr
14380 75 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  u;.  struct yCol
14390 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20  Cache *p;..  /* 
143a0 55 6e 6c 65 73 73 20 61 6e 20 65 72 72 6f 72 20  Unless an error 
143b0 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 72 65  has occurred, re
143c0 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 61  gister numbers a
143d0 72 65 20 61 6c 77 61 79 73 20 70 6f 73 69 74 69  re always positi
143e0 76 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ve. */.  assert(
143f0 20 69 52 65 67 3e 30 20 7c 7c 20 70 50 61 72 73   iReg>0 || pPars
14400 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73  e->nErr || pPars
14410 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
14420 6c 65 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28  led );.  assert(
14430 20 69 43 6f 6c 3e 3d 2d 31 20 26 26 20 69 43 6f   iCol>=-1 && iCo
14440 6c 3c 33 32 37 36 38 20 29 3b 20 20 2f 2a 20 46  l<32768 );  /* F
14450 69 6e 69 74 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d  inite column num
14460 62 65 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  bers */..  /* Th
14470 65 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43  e SQLITE_ColumnC
14480 61 63 68 65 20 66 6c 61 67 20 64 69 73 61 62 6c  ache flag disabl
14490 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  es the column ca
144a0 63 68 65 2e 20 20 54 68 69 73 20 69 73 20 75 73  che.  This is us
144b0 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 65 73 74  ed.  ** for test
144c0 69 6e 67 20 6f 6e 6c 79 20 2d 20 74 6f 20 76 65  ing only - to ve
144d0 72 69 66 79 20 74 68 61 74 20 53 51 4c 69 74 65  rify that SQLite
144e0 20 61 6c 77 61 79 73 20 67 65 74 73 20 74 68 65   always gets the
144f0 20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20 2a   same answer.  *
14500 2a 20 77 69 74 68 20 61 6e 64 20 77 69 74 68 6f  * with and witho
14510 75 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  ut the column ca
14520 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  che..  */.  if( 
14530 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61  OptimizationDisa
14540 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  bled(pParse->db,
14550 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61   SQLITE_ColumnCa
14560 63 68 65 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  che) ) return;..
14570 20 20 2f 2a 20 46 69 72 73 74 20 72 65 70 6c 61    /* First repla
14580 63 65 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20  ce any existing 
14590 65 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  entry..  **.  **
145a0 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 77   Actually, the w
145b0 61 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  ay the column ca
145c0 63 68 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  che is currently
145d0 20 75 73 65 64 2c 20 77 65 20 61 72 65 20 67 75   used, we are gu
145e0 61 72 61 6e 74 65 65 64 0a 20 20 2a 2a 20 74 68  aranteed.  ** th
145f0 61 74 20 74 68 65 20 6f 62 6a 65 63 74 20 77 69  at the object wi
14600 6c 6c 20 6e 65 76 65 72 20 61 6c 72 65 61 64 79  ll never already
14610 20 62 65 20 69 6e 20 63 61 63 68 65 2e 20 20 56   be in cache.  V
14620 65 72 69 66 79 20 74 68 69 73 20 67 75 61 72 61  erify this guara
14630 6e 74 65 65 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  ntee..  */.#ifnd
14640 65 66 20 4e 44 45 42 55 47 0a 20 20 66 6f 72 28  ef NDEBUG.  for(
14650 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
14660 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
14670 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
14680 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 61 73  ++, p++){.    as
14690 73 65 72 74 28 20 70 2d 3e 69 52 65 67 3d 3d 30  sert( p->iReg==0
146a0 20 7c 7c 20 70 2d 3e 69 54 61 62 6c 65 21 3d 69   || p->iTable!=i
146b0 54 61 62 20 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d  Tab || p->iColum
146c0 6e 21 3d 69 43 6f 6c 20 29 3b 0a 20 20 7d 0a 23  n!=iCol );.  }.#
146d0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 46 69 6e 64  endif..  /* Find
146e0 20 61 6e 20 65 6d 70 74 79 20 73 6c 6f 74 20 61   an empty slot a
146f0 6e 64 20 72 65 70 6c 61 63 65 20 69 74 20 2a 2f  nd replace it */
14700 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
14710 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
14720 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
14730 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
14740 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67  .    if( p->iReg
14750 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
14760 69 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d  iLevel = pParse-
14770 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20  >iCacheLevel;.  
14780 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20      p->iTable = 
14790 69 54 61 62 3b 0a 20 20 20 20 20 20 70 2d 3e 69  iTab;.      p->i
147a0 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20  Column = iCol;. 
147b0 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 69       p->iReg = i
147c0 52 65 67 3b 0a 20 20 20 20 20 20 70 2d 3e 74 65  Reg;.      p->te
147d0 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 20  mpReg = 0;.     
147e0 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65   p->lru = pParse
147f0 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20  ->iCacheCnt++;. 
14800 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 43 6f       pParse->nCo
14810 6c 43 61 63 68 65 2b 2b 3b 0a 20 20 20 20 20 20  lCache++;.      
14820 61 73 73 65 72 74 28 20 63 61 63 68 65 49 73 56  assert( cacheIsV
14830 61 6c 69 64 28 70 50 61 72 73 65 29 20 29 3b 0a  alid(pParse) );.
14840 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
14850 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
14860 70 6c 61 63 65 20 74 68 65 20 6c 61 73 74 20 72  place the last r
14870 65 63 65 6e 74 6c 79 20 75 73 65 64 20 2a 2f 0a  ecently used */.
14880 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78 37 66 66    minLru = 0x7ff
14890 66 66 66 66 66 3b 0a 20 20 69 64 78 4c 72 75 20  fffff;.  idxLru 
148a0 3d 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  = -1;.  for(i=0,
148b0 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
148c0 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
148d0 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
148e0 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  p++){.    if( p-
148f0 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20 29 7b 0a 20  >lru<minLru ){. 
14900 20 20 20 20 20 69 64 78 4c 72 75 20 3d 20 69 3b       idxLru = i;
14910 0a 20 20 20 20 20 20 6d 69 6e 4c 72 75 20 3d 20  .      minLru = 
14920 70 2d 3e 6c 72 75 3b 0a 20 20 20 20 7d 0a 20 20  p->lru;.    }.  
14930 7d 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 69  }.  if( ALWAYS(i
14940 64 78 4c 72 75 3e 3d 30 29 20 29 7b 0a 20 20 20  dxLru>=0) ){.   
14950 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43   p = &pParse->aC
14960 6f 6c 43 61 63 68 65 5b 69 64 78 4c 72 75 5d 3b  olCache[idxLru];
14970 0a 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d  .    p->iLevel =
14980 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
14990 65 76 65 6c 3b 0a 20 20 20 20 70 2d 3e 69 54 61  evel;.    p->iTa
149a0 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  ble = iTab;.    
149b0 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f  p->iColumn = iCo
149c0 6c 3b 0a 20 20 20 20 70 2d 3e 69 52 65 67 20 3d  l;.    p->iReg =
149d0 20 69 52 65 67 3b 0a 20 20 20 20 70 2d 3e 74 65   iReg;.    p->te
149e0 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 70  mpReg = 0;.    p
149f0 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e  ->lru = pParse->
14a00 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20  iCacheCnt++;.   
14a10 20 61 73 73 65 72 74 28 20 63 61 63 68 65 49 73   assert( cacheIs
14a20 56 61 6c 69 64 28 70 50 61 72 73 65 29 20 29 3b  Valid(pParse) );
14a30 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
14a40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61  .}../*.** Indica
14a50 74 65 20 74 68 61 74 20 72 65 67 69 73 74 65 72  te that register
14a60 73 20 62 65 74 77 65 65 6e 20 69 52 65 67 2e 2e  s between iReg..
14a70 69 52 65 67 2b 6e 52 65 67 2d 31 20 61 72 65 20  iReg+nReg-1 are 
14a80 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65  being overwritte
14a90 6e 2e 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20  n..** Purge the 
14aa0 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65  range of registe
14ab0 72 73 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75  rs from the colu
14ac0 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f 69  mn cache..*/.voi
14ad0 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
14ae0 68 65 52 65 6d 6f 76 65 28 50 61 72 73 65 20 2a  heRemove(Parse *
14af0 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
14b00 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 73  , int nReg){.  s
14b10 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
14b20 2a 70 3b 0a 20 20 69 66 28 20 69 52 65 67 3c 3d  *p;.  if( iReg<=
14b30 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 43 6f  0 || pParse->nCo
14b40 6c 43 61 63 68 65 3d 3d 30 20 29 20 72 65 74 75  lCache==0 ) retu
14b50 72 6e 3b 0a 20 20 70 20 3d 20 26 70 50 61 72 73  rn;.  p = &pPars
14b60 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 53 51 4c  e->aColCache[SQL
14b70 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 2d 31  ITE_N_COLCACHE-1
14b80 5d 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a 20  ];.  while(1){. 
14b90 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20 3e     if( p->iReg >
14ba0 3d 20 69 52 65 67 20 26 26 20 70 2d 3e 69 52 65  = iReg && p->iRe
14bb0 67 20 3c 20 69 52 65 67 2b 6e 52 65 67 20 29 20  g < iReg+nReg ) 
14bc0 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28  cacheEntryClear(
14bd0 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
14be0 69 66 28 20 70 3d 3d 70 50 61 72 73 65 2d 3e 61  if( p==pParse->a
14bf0 43 6f 6c 43 61 63 68 65 20 29 20 62 72 65 61 6b  ColCache ) break
14c00 3b 0a 20 20 20 20 70 2d 2d 3b 0a 20 20 7d 0a 7d  ;.    p--;.  }.}
14c10 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72  ../*.** Remember
14c20 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c   the current col
14c30 75 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74 65 78  umn cache contex
14c40 74 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e 74 72  t.  Any new entr
14c50 69 65 73 20 61 64 64 65 64 0a 2a 2a 20 61 64 64  ies added.** add
14c60 65 64 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e  ed to the column
14c70 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
14c80 73 20 63 61 6c 6c 20 61 72 65 20 72 65 6d 6f 76  s call are remov
14c90 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 63  ed when the.** c
14ca0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 70  orresponding pop
14cb0 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64   occurs..*/.void
14cc0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
14cd0 65 50 75 73 68 28 50 61 72 73 65 20 2a 70 50 61  ePush(Parse *pPa
14ce0 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e  rse){.  pParse->
14cf0 69 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a 23  iCacheLevel++;.#
14d00 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
14d10 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  UG.  if( pParse-
14d20 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
14d30 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61  ITE_VdbeAddopTra
14d40 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  ce ){.    printf
14d50 28 22 50 55 53 48 20 74 6f 20 25 64 5c 6e 22 2c  ("PUSH to %d\n",
14d60 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
14d70 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  evel);.  }.#endi
14d80 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  f.}../*.** Remov
14d90 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d  e from the colum
14da0 6e 20 63 61 63 68 65 20 61 6e 79 20 65 6e 74 72  n cache any entr
14db0 69 65 73 20 74 68 61 74 20 77 65 72 65 20 61 64  ies that were ad
14dc0 64 65 64 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a  ded since the.**
14dd0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 71   the previous sq
14de0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
14df0 73 68 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 49  sh operation.  I
14e00 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
14e10 65 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20 63 61  estore.** the ca
14e20 63 68 65 20 74 6f 20 74 68 65 20 73 74 61 74 65  che to the state
14e30 20 69 74 20 77 61 73 20 69 6e 20 70 72 69 6f 72   it was in prior
14e40 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
14e50 20 50 75 73 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73   Push..*/.void s
14e60 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
14e70 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  op(Parse *pParse
14e80 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
14e90 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
14ea0 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  p;.  assert( pPa
14eb0 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
14ec0 3e 3d 31 20 29 3b 0a 20 20 70 50 61 72 73 65 2d  >=1 );.  pParse-
14ed0 3e 69 43 61 63 68 65 4c 65 76 65 6c 2d 2d 3b 0a  >iCacheLevel--;.
14ee0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
14ef0 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65  BUG.  if( pParse
14f00 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
14f10 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72  LITE_VdbeAddopTr
14f20 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  ace ){.    print
14f30 66 28 22 50 4f 50 20 20 74 6f 20 25 64 5c 6e 22  f("POP  to %d\n"
14f40 2c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  , pParse->iCache
14f50 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64  Level);.  }.#end
14f60 69 66 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  if.  for(i=0, p=
14f70 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
14f80 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
14f90 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
14fa0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52  ){.    if( p->iR
14fb0 65 67 20 26 26 20 70 2d 3e 69 4c 65 76 65 6c 3e  eg && p->iLevel>
14fc0 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
14fd0 76 65 6c 20 29 7b 0a 20 20 20 20 20 20 63 61 63  vel ){.      cac
14fe0 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61  heEntryClear(pPa
14ff0 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20  rse, p);.    }. 
15000 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e   }.}../*.** When
15010 20 61 20 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e   a cached column
15020 20 69 73 20 72 65 75 73 65 64 2c 20 6d 61 6b 65   is reused, make
15030 20 73 75 72 65 20 74 68 61 74 20 69 74 73 20 72   sure that its r
15040 65 67 69 73 74 65 72 20 69 73 0a 2a 2a 20 6e 6f  egister is.** no
15050 20 6c 6f 6e 67 65 72 20 61 76 61 69 6c 61 62 6c   longer availabl
15060 65 20 61 73 20 61 20 74 65 6d 70 20 72 65 67 69  e as a temp regi
15070 73 74 65 72 2e 20 20 74 69 63 6b 65 74 20 23 33  ster.  ticket #3
15080 38 37 39 3a 20 20 74 68 61 74 20 73 61 6d 65 0a  879:  that same.
15090 2a 2a 20 72 65 67 69 73 74 65 72 20 6d 69 67 68  ** register migh
150a0 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  t be in the cach
150b0 65 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c  e in multiple pl
150c0 61 63 65 73 2c 20 73 6f 20 62 65 20 73 75 72 65  aces, so be sure
150d0 20 74 6f 0a 2a 2a 20 67 65 74 20 74 68 65 6d 20   to.** get them 
150e0 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  all..*/.static v
150f0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
15100 61 63 68 65 50 69 6e 52 65 67 69 73 74 65 72 28  achePinRegister(
15110 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
15120 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt iReg){.  int 
15130 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
15140 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28  Cache *p;.  for(
15150 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
15160 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
15170 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
15180 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
15190 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20  ( p->iReg==iReg 
151a0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70  ){.      p->temp
151b0 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Reg = 0;.    }. 
151c0 20 7d 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74   }.}../* Generat
151d0 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
151e0 20 6c 6f 61 64 20 69 6e 74 6f 20 72 65 67 69 73   load into regis
151f0 74 65 72 20 72 65 67 4f 75 74 20 61 20 76 61 6c  ter regOut a val
15200 75 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 70  ue that is.** ap
15210 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68  propriate for th
15220 65 20 69 49 64 78 43 6f 6c 2d 74 68 20 63 6f 6c  e iIdxCol-th col
15230 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49 64  umn of index pId
15240 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  x..*/.void sqlit
15250 65 33 45 78 70 72 43 6f 64 65 4c 6f 61 64 49 6e  e3ExprCodeLoadIn
15260 64 65 78 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72  dexColumn(.  Par
15270 73 65 20 2a 70 50 61 72 73 65 2c 20 20 2f 2a 20  se *pParse,  /* 
15280 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
15290 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ext */.  Index *
152a0 70 49 64 78 2c 20 20 20 20 2f 2a 20 54 68 65 20  pIdx,    /* The 
152b0 69 6e 64 65 78 20 77 68 6f 73 65 20 63 6f 6c 75  index whose colu
152c0 6d 6e 20 69 73 20 74 6f 20 62 65 20 6c 6f 61 64  mn is to be load
152d0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ed */.  int iTab
152e0 43 75 72 2c 20 20 20 20 2f 2a 20 43 75 72 73 6f  Cur,    /* Curso
152f0 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  r pointing to a 
15300 74 61 62 6c 65 20 72 6f 77 20 2a 2f 0a 20 20 69  table row */.  i
15310 6e 74 20 69 49 64 78 43 6f 6c 2c 20 20 20 20 2f  nt iIdxCol,    /
15320 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  * The column of 
15330 74 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  the index to be 
15340 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20  loaded */.  int 
15350 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 53  regOut      /* S
15360 74 6f 72 65 20 74 68 65 20 69 6e 64 65 78 20 63  tore the index c
15370 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 74  olumn value in t
15380 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  his register */.
15390 29 7b 0a 20 20 69 31 36 20 69 54 61 62 43 6f 6c  ){.  i16 iTabCol
153a0 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
153b0 6e 5b 69 49 64 78 43 6f 6c 5d 3b 0a 20 20 69 66  n[iIdxCol];.  if
153c0 28 20 69 54 61 62 43 6f 6c 3d 3d 58 4e 5f 45 58  ( iTabCol==XN_EX
153d0 50 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  PR ){.    assert
153e0 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72  ( pIdx->aColExpr
153f0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
15400 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e  pIdx->aColExpr->
15410 6e 45 78 70 72 3e 69 49 64 78 43 6f 6c 20 29 3b  nExpr>iIdxCol );
15420 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65  .    pParse->iSe
15430 6c 66 54 61 62 20 3d 20 69 54 61 62 43 75 72 3b  lfTab = iTabCur;
15440 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
15450 43 6f 64 65 43 6f 70 79 28 70 50 61 72 73 65 2c  CodeCopy(pParse,
15460 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d   pIdx->aColExpr-
15470 3e 61 5b 69 49 64 78 43 6f 6c 5d 2e 70 45 78 70  >a[iIdxCol].pExp
15480 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65  r, regOut);.  }e
15490 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
154a0 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
154b0 6e 4f 66 54 61 62 6c 65 28 70 50 61 72 73 65 2d  nOfTable(pParse-
154c0 3e 70 56 64 62 65 2c 20 70 49 64 78 2d 3e 70 54  >pVdbe, pIdx->pT
154d0 61 62 6c 65 2c 20 69 54 61 62 43 75 72 2c 0a 20  able, iTabCur,. 
154e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15500 20 20 20 69 54 61 62 43 6f 6c 2c 20 72 65 67 4f     iTabCol, regO
15510 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ut);.  }.}../*.*
15520 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
15530 74 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 76  to extract the v
15540 61 6c 75 65 20 6f 66 20 74 68 65 20 69 43 6f 6c  alue of the iCol
15550 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20  -th column of a 
15560 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  table..*/.void s
15570 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
15580 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 0a  tColumnOfTable(.
15590 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
155a0 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 75 6e    /* The VDBE un
155b0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
155c0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
155d0 62 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62  b,    /* The tab
155e0 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
155f0 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  e value */.  int
15600 20 69 54 61 62 43 75 72 2c 20 20 20 20 2f 2a 20   iTabCur,    /* 
15610 54 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72  The table cursor
15620 2e 20 20 4f 72 20 74 68 65 20 50 4b 20 63 75 72  .  Or the PK cur
15630 73 6f 72 20 66 6f 72 20 57 49 54 48 4f 55 54 20  sor for WITHOUT 
15640 52 4f 57 49 44 20 2a 2f 0a 20 20 69 6e 74 20 69  ROWID */.  int i
15650 43 6f 6c 2c 20 20 20 20 20 20 20 2f 2a 20 49 6e  Col,       /* In
15660 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  dex of the colum
15670 6e 20 74 6f 20 65 78 74 72 61 63 74 20 2a 2f 0a  n to extract */.
15680 20 20 69 6e 74 20 72 65 67 4f 75 74 20 20 20 20    int regOut    
15690 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65    /* Extract the
156a0 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 69 73   value into this
156b0 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a   register */.){.
156c0 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20    if( iCol<0 || 
156d0 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b 65  iCol==pTab->iPKe
156e0 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
156f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15700 5f 52 6f 77 69 64 2c 20 69 54 61 62 43 75 72 2c  _Rowid, iTabCur,
15710 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c 73   regOut);.  }els
15720 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  e{.    int op = 
15730 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
15740 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f  ? OP_VColumn : O
15750 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 6e  P_Column;.    in
15760 74 20 78 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  t x = iCol;.    
15770 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54  if( !HasRowid(pT
15780 61 62 29 20 29 7b 0a 20 20 20 20 20 20 78 20 3d  ab) ){.      x =
15790 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66   sqlite3ColumnOf
157a0 49 6e 64 65 78 28 73 71 6c 69 74 65 33 50 72 69  Index(sqlite3Pri
157b0 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
157c0 62 29 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 7d  b), iCol);.    }
157d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
157e0 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54  AddOp3(v, op, iT
157f0 61 62 43 75 72 2c 20 78 2c 20 72 65 67 4f 75 74  abCur, x, regOut
15800 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f  );.  }.  if( iCo
15810 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  l>=0 ){.    sqli
15820 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74  te3ColumnDefault
15830 28 76 2c 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20  (v, pTab, iCol, 
15840 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  regOut);.  }.}..
15850 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
15860 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 78  ode that will ex
15870 74 72 61 63 74 20 74 68 65 20 69 43 6f 6c 75 6d  tract the iColum
15880 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d  n-th column from
15890 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61 62 20 61  .** table pTab a
158a0 6e 64 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c  nd store the col
158b0 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 61 20 72  umn value in a r
158c0 65 67 69 73 74 65 72 2e 20 0a 2a 2a 0a 2a 2a 20  egister. .**.** 
158d0 41 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64  An effort is mad
158e0 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63  e to store the c
158f0 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72  olumn value in r
15900 65 67 69 73 74 65 72 20 69 52 65 67 2e 20 20 54  egister iReg.  T
15910 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 67 61  his.** is not ga
15920 72 61 6e 74 65 65 65 64 20 66 6f 72 20 47 65 74  ranteeed for Get
15930 43 6f 6c 75 6d 6e 28 29 20 2d 20 74 68 65 20 72  Column() - the r
15940 65 73 75 6c 74 20 63 61 6e 20 62 65 20 73 74 6f  esult can be sto
15950 72 65 64 20 69 6e 0a 2a 2a 20 61 6e 79 20 72 65  red in.** any re
15960 67 69 73 74 65 72 2e 20 20 42 75 74 20 74 68 65  gister.  But the
15970 20 72 65 73 75 6c 74 20 69 73 20 67 75 61 72 61   result is guara
15980 6e 74 65 65 64 20 74 6f 20 6c 61 6e 64 20 69 6e  nteed to land in
15990 20 72 65 67 69 73 74 65 72 20 69 52 65 67 0a 2a   register iReg.*
159a0 2a 20 66 6f 72 20 47 65 74 43 6f 6c 75 6d 6e 54  * for GetColumnT
159b0 6f 52 65 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  oReg()..**.** Th
159c0 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f  ere must be an o
159d0 70 65 6e 20 63 75 72 73 6f 72 20 74 6f 20 70 54  pen cursor to pT
159e0 61 62 20 69 6e 20 69 54 61 62 6c 65 20 77 68 65  ab in iTable whe
159f0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
15a00 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 49 66  * is called.  If
15a10 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20   iColumn<0 then 
15a20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65  code is generate
15a30 64 20 74 68 61 74 20 65 78 74 72 61 63 74 73 20  d that extracts 
15a40 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e  the rowid..*/.in
15a50 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
15a60 65 47 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61  eGetColumn(.  Pa
15a70 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f  rse *pParse,   /
15a80 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
15a90 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
15aa0 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65  ntext */.  Table
15ab0 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44   *pTab,     /* D
15ac0 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
15ad0 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 72  e table we are r
15ae0 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20  eading from */. 
15af0 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
15b00 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
15b10 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a  e table column *
15b20 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
15b30 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
15b40 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  or pointing to t
15b50 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  he table */.  in
15b60 74 20 69 52 65 67 2c 20 20 20 20 20 20 20 20 2f  t iReg,        /
15b70 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20  * Store results 
15b80 68 65 72 65 20 2a 2f 0a 20 20 75 38 20 70 35 20  here */.  u8 p5 
15b90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 35             /* P5
15ba0 20 76 61 6c 75 65 20 66 6f 72 20 4f 50 5f 43 6f   value for OP_Co
15bb0 6c 75 6d 6e 20 2b 20 46 4c 41 47 53 20 2a 2f 0a  lumn + FLAGS */.
15bc0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
15bd0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
15be0 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
15bf0 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20  yColCache *p;.. 
15c00 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
15c10 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
15c20 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
15c30 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
15c40 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3e 30     if( p->iReg>0
15c50 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69   && p->iTable==i
15c60 54 61 62 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c  Table && p->iCol
15c70 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a  umn==iColumn ){.
15c80 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70        p->lru = p
15c90 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74  Parse->iCacheCnt
15ca0 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
15cb0 33 45 78 70 72 43 61 63 68 65 50 69 6e 52 65 67  3ExprCachePinReg
15cc0 69 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 2d  ister(pParse, p-
15cd0 3e 69 52 65 67 29 3b 0a 20 20 20 20 20 20 72 65  >iReg);.      re
15ce0 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b 0a 20 20  turn p->iReg;.  
15cf0 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61 73 73 65    }.  }  .  asse
15d00 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71  rt( v!=0 );.  sq
15d10 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
15d20 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c  ColumnOfTable(v,
15d30 20 70 54 61 62 2c 20 69 54 61 62 6c 65 2c 20 69   pTab, iTable, i
15d40 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20  Column, iReg);. 
15d50 20 69 66 28 20 70 35 20 29 7b 0a 20 20 20 20 73   if( p5 ){.    s
15d60 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
15d70 50 35 28 76 2c 20 70 35 29 3b 0a 20 20 7d 65 6c  P5(v, p5);.  }el
15d80 73 65 7b 20 20 20 0a 20 20 20 20 73 71 6c 69 74  se{   .    sqlit
15d90 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65  e3ExprCacheStore
15da0 28 70 50 61 72 73 65 2c 20 69 54 61 62 6c 65 2c  (pParse, iTable,
15db0 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b   iColumn, iReg);
15dc0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52  .  }.  return iR
15dd0 65 67 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74  eg;.}.void sqlit
15de0 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
15df0 75 6d 6e 54 6f 52 65 67 28 0a 20 20 50 61 72 73  umnToReg(.  Pars
15e00 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
15e10 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
15e20 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
15e30 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ext */.  Table *
15e40 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73  pTab,     /* Des
15e50 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
15e60 74 61 62 6c 65 20 77 65 20 61 72 65 20 72 65 61  table we are rea
15e70 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  ding from */.  i
15e80 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
15e90 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
15ea0 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  table column */.
15eb0 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
15ec0 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
15ed0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
15ee0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
15ef0 69 52 65 67 20 20 20 20 20 20 20 20 20 2f 2a 20  iReg         /* 
15f00 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65  Store results he
15f10 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
15f20 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
15f30 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61  odeGetColumn(pPa
15f40 72 73 65 2c 20 70 54 61 62 2c 20 69 43 6f 6c 75  rse, pTab, iColu
15f50 6d 6e 2c 20 69 54 61 62 6c 65 2c 20 69 52 65 67  mn, iTable, iReg
15f60 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 31 21 3d  , 0);.  if( r1!=
15f70 69 52 65 67 20 29 20 73 71 6c 69 74 65 33 56 64  iReg ) sqlite3Vd
15f80 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d  beAddOp2(pParse-
15f90 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79  >pVdbe, OP_SCopy
15fa0 2c 20 72 31 2c 20 69 52 65 67 29 3b 0a 7d 0a 0a  , r1, iReg);.}..
15fb0 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 6c 6c  ./*.** Clear all
15fc0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 65 6e   column cache en
15fd0 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tries..*/.void s
15fe0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
15ff0 6c 65 61 72 28 50 61 72 73 65 20 2a 70 50 61 72  lear(Parse *pPar
16000 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  se){.  int i;.  
16010 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
16020 20 2a 70 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45   *p;..#if SQLITE
16030 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61  _DEBUG.  if( pPa
16040 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
16050 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f   SQLITE_VdbeAddo
16060 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72  pTrace ){.    pr
16070 69 6e 74 66 28 22 43 4c 45 41 52 5c 6e 22 29 3b  intf("CLEAR\n");
16080 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f  .  }.#endif.  fo
16090 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
160a0 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
160b0 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
160c0 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
160d0 69 66 28 20 70 2d 3e 69 52 65 67 20 29 7b 0a 20  if( p->iReg ){. 
160e0 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43       cacheEntryC
160f0 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b  lear(pParse, p);
16100 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
16110 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20 66  .** Record the f
16120 61 63 74 20 74 68 61 74 20 61 6e 20 61 66 66 69  act that an affi
16130 6e 69 74 79 20 63 68 61 6e 67 65 20 68 61 73 20  nity change has 
16140 6f 63 63 75 72 72 65 64 20 6f 6e 20 69 43 6f 75  occurred on iCou
16150 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20  nt.** registers 
16160 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 69 53  starting with iS
16170 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tart..*/.void sq
16180 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
16190 66 69 6e 69 74 79 43 68 61 6e 67 65 28 50 61 72  finityChange(Par
161a0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
161b0 69 53 74 61 72 74 2c 20 69 6e 74 20 69 43 6f 75  iStart, int iCou
161c0 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78  nt){.  sqlite3Ex
161d0 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50  prCacheRemove(pP
161e0 61 72 73 65 2c 20 69 53 74 61 72 74 2c 20 69 43  arse, iStart, iC
161f0 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ount);.}../*.** 
16200 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
16210 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74 20 66 72   move content fr
16220 6f 6d 20 72 65 67 69 73 74 65 72 73 20 69 46 72  om registers iFr
16230 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d  om...iFrom+nReg-
16240 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f  1.** over to iTo
16250 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65  ..iTo+nReg-1. Ke
16260 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  ep the column ca
16270 63 68 65 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a  che up-to-date..
16280 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
16290 78 70 72 43 6f 64 65 4d 6f 76 65 28 50 61 72 73  xprCodeMove(Pars
162a0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
162b0 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69  From, int iTo, i
162c0 6e 74 20 6e 52 65 67 29 7b 0a 20 20 61 73 73 65  nt nReg){.  asse
162d0 72 74 28 20 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e  rt( iFrom>=iTo+n
162e0 52 65 67 20 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65  Reg || iFrom+nRe
162f0 67 3c 3d 69 54 6f 20 29 3b 0a 20 20 73 71 6c 69  g<=iTo );.  sqli
16300 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 50  te3VdbeAddOp3(pP
16310 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
16320 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20 69 54 6f  Move, iFrom, iTo
16330 2c 20 6e 52 65 67 29 3b 0a 20 20 73 71 6c 69 74  , nReg);.  sqlit
16340 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
16350 65 28 70 50 61 72 73 65 2c 20 69 46 72 6f 6d 2c  e(pParse, iFrom,
16360 20 6e 52 65 67 29 3b 0a 7d 0a 0a 23 69 66 20 64   nReg);.}..#if d
16370 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
16380 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
16390 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f  SQLITE_COVERAGE_
163a0 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75  TEST)./*.** Retu
163b0 72 6e 20 74 72 75 65 20 69 66 20 61 6e 79 20 72  rn true if any r
163c0 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20 72  egister in the r
163d0 61 6e 67 65 20 69 46 72 6f 6d 2e 2e 69 54 6f 20  ange iFrom..iTo 
163e0 28 69 6e 63 6c 75 73 69 76 65 29 0a 2a 2a 20 69  (inclusive).** i
163f0 73 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  s used as part o
16400 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  f the column cac
16410 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  he..**.** This r
16420 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 77  outine is used w
16430 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 61  ithin assert() a
16440 6e 64 20 74 65 73 74 63 61 73 65 28 29 20 6d 61  nd testcase() ma
16450 63 72 6f 73 20 6f 6e 6c 79 0a 2a 2a 20 61 6e 64  cros only.** and
16460 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72   does not appear
16470 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20 62 75 69   in a normal bui
16480 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ld..*/.static in
16490 74 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61  t usedAsColumnCa
164a0 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  che(Parse *pPars
164b0 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  e, int iFrom, in
164c0 74 20 69 54 6f 29 7b 0a 20 20 69 6e 74 20 69 3b  t iTo){.  int i;
164d0 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
164e0 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d  che *p;.  for(i=
164f0 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
16500 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
16510 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
16520 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  , p++){.    int 
16530 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20  r = p->iReg;.   
16540 20 69 66 28 20 72 3e 3d 69 46 72 6f 6d 20 26 26   if( r>=iFrom &&
16550 20 72 3c 3d 69 54 6f 20 29 20 72 65 74 75 72 6e   r<=iTo ) return
16560 20 31 3b 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54   1;    /*NO_TEST
16570 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
16580 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  0;.}.#endif /* S
16590 51 4c 49 54 45 5f 44 45 42 55 47 20 7c 7c 20 53  QLITE_DEBUG || S
165a0 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54  QLITE_COVERAGE_T
165b0 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 43  EST */.../*.** C
165c0 6f 6e 76 65 72 74 20 61 6e 20 65 78 70 72 65 73  onvert an expres
165d0 73 69 6f 6e 20 6e 6f 64 65 20 74 6f 20 61 20 54  sion node to a T
165e0 4b 5f 52 45 47 49 53 54 45 52 0a 2a 2f 0a 73 74  K_REGISTER.*/.st
165f0 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 54 6f  atic void exprTo
16600 52 65 67 69 73 74 65 72 28 45 78 70 72 20 2a 70  Register(Expr *p
16610 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 70  , int iReg){.  p
16620 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f 70 3b 0a 20  ->op2 = p->op;. 
16630 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49   p->op = TK_REGI
16640 53 54 45 52 3b 0a 20 20 70 2d 3e 69 54 61 62 6c  STER;.  p->iTabl
16650 65 20 3d 20 69 52 65 67 3b 0a 20 20 45 78 70 72  e = iReg;.  Expr
16660 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 70 2c  ClearProperty(p,
16670 20 45 50 5f 53 6b 69 70 29 3b 0a 7d 0a 0a 2f 2a   EP_Skip);.}../*
16680 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
16690 65 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65  e into the curre
166a0 6e 74 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75  nt Vdbe to evalu
166b0 61 74 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  ate the given.**
166c0 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 41 74   expression.  At
166d0 74 65 6d 70 74 20 74 6f 20 73 74 6f 72 65 20 74  tempt to store t
166e0 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65  he results in re
166f0 67 69 73 74 65 72 20 22 74 61 72 67 65 74 22 2e  gister "target".
16700 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72  .** Return the r
16710 65 67 69 73 74 65 72 20 77 68 65 72 65 20 72 65  egister where re
16720 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64  sults are stored
16730 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 69  ..**.** With thi
16740 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 72 65  s routine, there
16750 20 69 73 20 6e 6f 20 67 75 61 72 61 6e 74 65 65   is no guarantee
16760 20 74 68 61 74 20 72 65 73 75 6c 74 73 20 77 69   that results wi
16770 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64 20  ll.** be stored 
16780 69 6e 20 74 61 72 67 65 74 2e 20 20 54 68 65 20  in target.  The 
16790 72 65 73 75 6c 74 20 6d 69 67 68 74 20 62 65 20  result might be 
167a0 73 74 6f 72 65 64 20 69 6e 20 73 6f 6d 65 20 6f  stored in some o
167b0 74 68 65 72 0a 2a 2a 20 72 65 67 69 73 74 65 72  ther.** register
167c0 20 69 66 20 69 74 20 69 73 20 63 6f 6e 76 65 6e   if it is conven
167d0 69 65 6e 74 20 74 6f 20 64 6f 20 73 6f 2e 20 20  ient to do so.  
167e0 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
167f0 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63 68 65  tion.** must che
16800 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  ck the return co
16810 64 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20  de and move the 
16820 72 65 73 75 6c 74 73 20 74 6f 20 74 68 65 20 64  results to the d
16830 65 73 69 72 65 64 0a 2a 2a 20 72 65 67 69 73 74  esired.** regist
16840 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
16850 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
16860 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
16870 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
16880 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65   target){.  Vdbe
16890 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
168a0 64 62 65 3b 20 20 2f 2a 20 54 68 65 20 56 4d 20  dbe;  /* The VM 
168b0 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
168c0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20  on */.  int op; 
168d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168e0 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20    /* The opcode 
168f0 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
16900 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 74 61 72   int inReg = tar
16910 67 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  get;       /* Re
16920 73 75 6c 74 73 20 73 74 6f 72 65 64 20 69 6e 20  sults stored in 
16930 72 65 67 69 73 74 65 72 20 69 6e 52 65 67 20 2a  register inReg *
16940 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31  /.  int regFree1
16950 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
16960 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65   If non-zero fre
16970 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79  e this temporary
16980 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
16990 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  nt regFree2 = 0;
169a0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e           /* If n
169b0 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69  on-zero free thi
169c0 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  s temporary regi
169d0 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 31  ster */.  int r1
169e0 2c 20 72 32 2c 20 72 33 2c 20 72 34 3b 20 20 20  , r2, r3, r4;   
169f0 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 72      /* Various r
16a00 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20  egister numbers 
16a10 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
16a20 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f   = pParse->db; /
16a30 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
16a40 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45  onnection */.  E
16a50 78 70 72 20 74 65 6d 70 58 3b 20 20 20 20 20 20  xpr tempX;      
16a60 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
16a70 6f 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e  orary expression
16a80 20 6e 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65   node */..  asse
16a90 72 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20  rt( target>0 && 
16aa0 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e  target<=pParse->
16ab0 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d  nMem );.  if( v=
16ac0 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
16ad0 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
16ae0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
16af0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
16b00 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
16b10 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e  ){.    op = TK_N
16b20 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ULL;.  }else{.  
16b30 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70    op = pExpr->op
16b40 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20  ;.  }.  switch( 
16b50 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
16b60 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  K_AGG_COLUMN: {.
16b70 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70        AggInfo *p
16b80 41 67 67 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d  AggInfo = pExpr-
16b90 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20  >pAggInfo;.     
16ba0 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
16bb0 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67  col *pCol = &pAg
16bc0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70  gInfo->aCol[pExp
16bd0 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20 20  r->iAgg];.      
16be0 69 66 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64  if( !pAggInfo->d
16bf0 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20  irectMode ){.   
16c00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f       assert( pCo
16c10 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20 20 20  l->iMem>0 );.   
16c20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 43 6f       inReg = pCo
16c30 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 20  l->iMem;.       
16c40 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65   break;.      }e
16c50 6c 73 65 20 69 66 28 20 70 41 67 67 49 6e 66 6f  lse if( pAggInfo
16c60 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20  ->useSortingIdx 
16c70 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
16c80 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
16c90 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49  OP_Column, pAggI
16ca0 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64 78 50  nfo->sortingIdxP
16cb0 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Tab,.           
16cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16cd0 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
16ce0 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b  Column, target);
16cf0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
16d00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
16d10 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c   Otherwise, fall
16d20 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54   thru into the T
16d30 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f  K_COLUMN case */
16d40 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
16d50 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
16d60 20 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 45     int iTab = pE
16d70 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  xpr->iTable;.   
16d80 20 20 20 69 66 28 20 69 54 61 62 3c 30 20 29 7b     if( iTab<0 ){
16d90 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
16da0 72 73 65 2d 3e 63 6b 42 61 73 65 3e 30 20 29 7b  rse->ckBase>0 ){
16db0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65  .          /* Ge
16dc0 6e 65 72 61 74 69 6e 67 20 43 48 45 43 4b 20 63  nerating CHECK c
16dd0 6f 6e 73 74 72 61 69 6e 74 73 20 6f 72 20 69 6e  onstraints or in
16de0 73 65 72 74 69 6e 67 20 69 6e 74 6f 20 70 61 72  serting into par
16df0 74 69 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20  tial index */.  
16e00 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20          inReg = 
16e10 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2b  pExpr->iColumn +
16e20 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3b   pParse->ckBase;
16e30 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
16e40 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
16e50 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  .          /* Co
16e60 64 69 6e 67 20 61 6e 20 65 78 70 72 65 73 73 69  ding an expressi
16e70 6f 6e 20 74 68 61 74 20 69 73 20 70 61 72 74 20  on that is part 
16e80 6f 66 20 61 6e 20 69 6e 64 65 78 20 77 68 65 72  of an index wher
16e90 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20  e column names. 
16ea0 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74           ** in t
16eb0 68 65 20 69 6e 64 65 78 20 72 65 66 65 72 20 74  he index refer t
16ec0 6f 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 77  o the table to w
16ed0 68 69 63 68 20 74 68 65 20 69 6e 64 65 78 20 62  hich the index b
16ee0 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 20 20 20 20  elongs */.      
16ef0 20 20 20 20 69 54 61 62 20 3d 20 70 50 61 72 73      iTab = pPars
16f00 65 2d 3e 69 53 65 6c 66 54 61 62 3b 0a 20 20 20  e->iSelfTab;.   
16f10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
16f20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
16f30 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
16f40 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 45  olumn(pParse, pE
16f50 78 70 72 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20  xpr->pTab,.     
16f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f70 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
16f80 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20  >iColumn, iTab, 
16f90 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20  target,.        
16fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fb0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
16fc0 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  2);.      break;
16fd0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
16fe0 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TK_INTEGER: {.  
16ff0 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28      codeInteger(
17000 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30  pParse, pExpr, 0
17010 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
17020 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
17030 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17040 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
17050 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
17060 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  AT: {.      asse
17070 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
17080 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
17090 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
170a0 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 45    codeReal(v, pE
170b0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30  xpr->u.zToken, 0
170c0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
170d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
170e0 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b  ndif.    case TK
170f0 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20  _STRING: {.     
17100 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
17110 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
17120 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
17130 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
17140 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20  beLoadString(v, 
17150 74 61 72 67 65 74 2c 20 70 45 78 70 72 2d 3e 75  target, pExpr->u
17160 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
17170 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
17180 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b   case TK_NULL: {
17190 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
171a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
171b0 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ull, 0, target);
171c0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
171d0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
171e0 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54  TE_OMIT_BLOB_LIT
171f0 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b  ERAL.    case TK
17200 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69  _BLOB: {.      i
17210 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73  nt n;.      cons
17220 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20  t char *z;.     
17230 20 63 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20   char *zBlob;.  
17240 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
17250 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
17260 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
17270 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
17280 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
17290 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78  n[0]=='x' || pEx
172a0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d  pr->u.zToken[0]=
172b0 3d 27 58 27 20 29 3b 0a 20 20 20 20 20 20 61 73  ='X' );.      as
172c0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
172d0 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29  Token[1]=='\'' )
172e0 3b 0a 20 20 20 20 20 20 7a 20 3d 20 26 70 45 78  ;.      z = &pEx
172f0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b  pr->u.zToken[2];
17300 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  .      n = sqlit
17310 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 2d 20  e3Strlen30(z) - 
17320 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
17330 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20   z[n]=='\'' );. 
17340 20 20 20 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c       zBlob = sql
17350 69 74 65 33 48 65 78 54 6f 42 6c 6f 62 28 73 71  ite3HexToBlob(sq
17360 6c 69 74 65 33 56 64 62 65 44 62 28 76 29 2c 20  lite3VdbeDb(v), 
17370 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  z, n);.      sql
17380 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
17390 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20  , OP_Blob, n/2, 
173a0 74 61 72 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62  target, 0, zBlob
173b0 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
173c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
173d0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
173e0 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b  e TK_VARIABLE: {
173f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
17400 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
17410 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
17420 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ue) );.      ass
17430 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ert( pExpr->u.zT
17440 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20 20 20 20 20  oken!=0 );.     
17450 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
17460 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29  u.zToken[0]!=0 )
17470 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
17480 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
17490 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d  Variable, pExpr-
174a0 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74  >iColumn, target
174b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
174c0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21  pr->u.zToken[1]!
174d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
174e0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
174f0 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20 0a 20  Token[0]=='?' . 
17500 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
17510 74 72 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a  trcmp(pExpr->u.z
17520 54 6f 6b 65 6e 2c 20 70 50 61 72 73 65 2d 3e 61  Token, pParse->a
17530 7a 56 61 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  zVar[pExpr->iCol
17540 75 6d 6e 2d 31 5d 29 3d 3d 30 20 29 3b 0a 20 20  umn-1])==0 );.  
17550 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17560 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
17570 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 70   pParse->azVar[p
17580 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d  Expr->iColumn-1]
17590 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P4_STATIC);.  
175a0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
175b0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
175c0 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b  e TK_REGISTER: {
175d0 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70  .      inReg = p
175e0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Expr->iTable;.  
175f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17600 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17610 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61  OMIT_CAST.    ca
17620 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20  se TK_CAST: {.  
17630 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
17640 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20  ns of the form: 
17650 20 20 43 41 53 54 28 70 4c 65 66 74 20 41 53 20    CAST(pLeft AS 
17660 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20  token) */.      
17670 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
17680 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
17690 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
176a0 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  ft, target);.   
176b0 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61     if( inReg!=ta
176c0 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  rget ){.        
176d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
176e0 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69  2(v, OP_SCopy, i
176f0 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20  nReg, target);. 
17700 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74         inReg = t
17710 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20  arget;.      }. 
17720 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17730 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 61 73  AddOp2(v, OP_Cas
17740 74 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20  t, target,.     
17750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17760 20 20 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69     sqlite3Affini
17770 74 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e  tyType(pExpr->u.
17780 7a 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20 20 20  zToken, 0));.   
17790 20 20 20 74 65 73 74 63 61 73 65 28 20 75 73 65     testcase( use
177a0 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70  dAsColumnCache(p
177b0 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 69 6e  Parse, inReg, in
177c0 52 65 67 29 20 29 3b 0a 20 20 20 20 20 20 73 71  Reg) );.      sq
177d0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
177e0 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
177f0 72 73 65 2c 20 69 6e 52 65 67 2c 20 31 29 3b 0a  rse, inReg, 1);.
17800 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17810 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
17820 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f  ITE_OMIT_CAST */
17830 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
17840 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
17850 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
17860 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
17870 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
17880 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
17890 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71   {.      r1 = sq
178a0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
178b0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
178c0 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
178d0 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
178e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
178f0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
17900 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
17910 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ee2);.      code
17920 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
17930 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
17940 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
17950 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17960 20 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65 67     r1, r2, inReg
17970 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32  , SQLITE_STOREP2
17980 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
17990 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74  TK_LT==OP_Lt); t
179a0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
179b0 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
179c0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  If(v,op==OP_Lt);
179d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
179e0 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73  _LE==OP_Le); tes
179f0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29  tcase(op==OP_Le)
17a00 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
17a10 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20  (v,op==OP_Le);. 
17a20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
17a30 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63  T==OP_Gt); testc
17a40 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20  ase(op==OP_Gt); 
17a50 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
17a60 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20  ,op==OP_Gt);.   
17a70 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d     assert(TK_GE=
17a80 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73  =OP_Ge); testcas
17a90 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64  e(op==OP_Ge); Vd
17aa0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
17ab0 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20  p==OP_Ge);.     
17ac0 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f   assert(TK_EQ==O
17ad0 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65 28  P_Eq); testcase(
17ae0 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65  op==OP_Eq); Vdbe
17af0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
17b00 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 61  =OP_Eq);.      a
17b10 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f  ssert(TK_NE==OP_
17b20 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ne); testcase(op
17b30 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ne); VdbeCo
17b40 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
17b50 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 74 65 73  P_Ne);.      tes
17b60 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
17b70 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
17b80 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
17b90 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
17ba0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
17bb0 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65   TK_IS:.    case
17bc0 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20   TK_ISNOT: {.   
17bd0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
17be0 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20  =TK_IS );.      
17bf0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
17c00 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  _ISNOT );.      
17c10 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
17c20 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
17c30 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
17c40 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
17c50 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
17c60 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
17c70 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
17c80 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
17c90 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f     op = (op==TK_
17ca0 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b  IS) ? TK_EQ : TK
17cb0 5f 4e 45 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  _NE;.      codeC
17cc0 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
17cd0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
17ce0 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
17cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d00 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c    r1, r2, inReg,
17d10 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20   SQLITE_STOREP2 
17d20 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  | SQLITE_NULLEQ)
17d30 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
17d40 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
17d50 5f 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _EQ);.      Vdbe
17d60 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
17d70 3d 3d 54 4b 5f 4e 45 29 3b 0a 20 20 20 20 20 20  ==TK_NE);.      
17d80 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
17d90 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
17da0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
17db0 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
17dc0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
17dd0 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20  ase TK_AND:.    
17de0 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20  case TK_OR:.    
17df0 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20  case TK_PLUS:.  
17e00 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a    case TK_STAR:.
17e10 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55      case TK_MINU
17e20 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  S:.    case TK_R
17e30 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  EM:.    case TK_
17e40 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65  BITAND:.    case
17e50 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63   TK_BITOR:.    c
17e60 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20  ase TK_SLASH:.  
17e70 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54    case TK_LSHIFT
17e80 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53  :.    case TK_RS
17e90 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20  HIFT: .    case 
17ea0 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20  TK_CONCAT: {.   
17eb0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e     assert( TK_AN
17ec0 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 20 20 20 20  D==OP_And );    
17ed0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
17ee0 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a  ( op==TK_AND );.
17ef0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
17f00 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 20 20 20  _OR==OP_Or );   
17f10 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
17f20 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29  ase( op==TK_OR )
17f30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
17f40 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20  TK_PLUS==OP_Add 
17f50 29 3b 20 20 20 20 20 20 20 20 20 20 20 74 65 73  );           tes
17f60 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c  tcase( op==TK_PL
17f70 55 53 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  US );.      asse
17f80 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50  rt( TK_MINUS==OP
17f90 5f 53 75 62 74 72 61 63 74 20 29 3b 20 20 20 20  _Subtract );    
17fa0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
17fb0 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20 20  K_MINUS );.     
17fc0 20 61 73 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d   assert( TK_REM=
17fd0 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b  =OP_Remainder );
17fe0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17ff0 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20  op==TK_REM );.  
18000 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
18010 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64  ITAND==OP_BitAnd
18020 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73   );      testcas
18030 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44  e( op==TK_BITAND
18040 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
18050 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42  ( TK_BITOR==OP_B
18060 69 74 4f 72 20 29 3b 20 20 20 20 20 20 20 20 74  itOr );        t
18070 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
18080 42 49 54 4f 52 20 29 3b 0a 20 20 20 20 20 20 61  BITOR );.      a
18090 73 73 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d  ssert( TK_SLASH=
180a0 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b 20 20 20  =OP_Divide );   
180b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
180c0 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20  ==TK_SLASH );.  
180d0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
180e0 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c  SHIFT==OP_ShiftL
180f0 65 66 74 20 29 3b 20 20 20 74 65 73 74 63 61 73  eft );   testcas
18100 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54  e( op==TK_LSHIFT
18110 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
18120 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f  ( TK_RSHIFT==OP_
18130 53 68 69 66 74 52 69 67 68 74 20 29 3b 20 20 74  ShiftRight );  t
18140 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
18150 52 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20  RSHIFT );.      
18160 61 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41  assert( TK_CONCA
18170 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 20  T==OP_Concat ); 
18180 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
18190 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a  p==TK_CONCAT );.
181a0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
181b0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
181c0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
181d0 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
181e0 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
181f0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
18200 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
18210 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
18220 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
18230 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70  VdbeAddOp3(v, op
18240 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74  , r2, r1, target
18250 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
18260 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
18270 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
18280 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
18290 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
182a0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
182b0 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
182c0 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
182d0 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
182e0 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20    assert( pLeft 
182f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  );.      if( pLe
18300 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47  ft->op==TK_INTEG
18310 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  ER ){.        co
18320 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65  deInteger(pParse
18330 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74 61 72 67  , pLeft, 1, targ
18340 65 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  et);.#ifndef SQL
18350 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
18360 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65  G_POINT.      }e
18370 6c 73 65 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f  lse if( pLeft->o
18380 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20  p==TK_FLOAT ){. 
18390 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
183a0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
183b0 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
183c0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 63  ue) );.        c
183d0 6f 64 65 52 65 61 6c 28 76 2c 20 70 4c 65 66 74  odeReal(v, pLeft
183e0 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74  ->u.zToken, 1, t
183f0 61 72 67 65 74 29 3b 0a 23 65 6e 64 69 66 0a 20  arget);.#endif. 
18400 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
18410 20 20 20 20 74 65 6d 70 58 2e 6f 70 20 3d 20 54      tempX.op = T
18420 4b 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20  K_INTEGER;.     
18430 20 20 20 74 65 6d 70 58 2e 66 6c 61 67 73 20 3d     tempX.flags =
18440 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f   EP_IntValue|EP_
18450 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 20  TokenOnly;.     
18460 20 20 20 74 65 6d 70 58 2e 75 2e 69 56 61 6c 75     tempX.u.iValu
18470 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  e = 0;.        r
18480 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
18490 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
184a0 26 74 65 6d 70 58 2c 20 26 72 65 67 46 72 65 65  &tempX, &regFree
184b0 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d  1);.        r2 =
184c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
184d0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
184e0 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
184f0 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20 73  ree2);.        s
18500 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
18510 28 76 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c  (v, OP_Subtract,
18520 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29   r2, r1, target)
18530 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
18540 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
18550 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
18560 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b   inReg = target;
18570 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
18580 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
18590 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65  BITNOT:.    case
185a0 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
185b0 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e   assert( TK_BITN
185c0 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b  OT==OP_BitNot );
185d0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
185e0 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20  =TK_BITNOT );.  
185f0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
18600 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 20 20 20  OT==OP_Not );   
18610 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
18620 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20  op==TK_NOT );.  
18630 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
18640 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
18650 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
18660 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
18670 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
18680 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
18690 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67      inReg = targ
186a0 65 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  et;.      sqlite
186b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
186c0 70 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20  p, r1, inReg);. 
186d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
186e0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
186f0 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
18700 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
18710 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
18720 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53     assert( TK_IS
18730 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  NULL==OP_IsNull 
18740 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  );   testcase( o
18750 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a  p==TK_ISNULL );.
18760 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
18770 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74  _NOTNULL==OP_Not
18780 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65  Null ); testcase
18790 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ( op==TK_NOTNULL
187a0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
187b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
187c0 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61  P_Integer, 1, ta
187d0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 31 20  rget);.      r1 
187e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
187f0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
18800 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
18810 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65  Free1);.      te
18820 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
18830 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64 64  ==0 );.      add
18840 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
18850 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31 29  ddOp1(v, op, r1)
18860 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
18870 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
18880 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  _ISNULL);.      
18890 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
188a0 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  , op==TK_NOTNULL
188b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
188c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
188d0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 74 61 72  _Integer, 0, tar
188e0 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  get);.      sqli
188f0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
18900 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20  v, addr);.      
18910 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
18920 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
18930 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41  CTION: {.      A
18940 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20  ggInfo *pInfo = 
18950 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b  pExpr->pAggInfo;
18960 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f  .      if( pInfo
18970 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
18980 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
18990 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
189a0 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
189b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
189c0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
189d0 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72 65 67  misuse of aggreg
189e0 61 74 65 3a 20 25 73 28 29 22 2c 20 70 45 78 70  ate: %s()", pExp
189f0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
18a00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18a10 20 20 20 69 6e 52 65 67 20 3d 20 70 49 6e 66 6f     inReg = pInfo
18a20 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69  ->aFunc[pExpr->i
18a30 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20  Agg].iMem;.     
18a40 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
18a50 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
18a60 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  K_FUNCTION: {.  
18a70 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46      ExprList *pF
18a80 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69  arg;       /* Li
18a90 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61  st of function a
18aa0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  rguments */.    
18ab0 20 20 69 6e 74 20 6e 46 61 72 67 3b 20 20 20 20    int nFarg;    
18ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
18ad0 65 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61  er of function a
18ae0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  rguments */.    
18af0 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b    FuncDef *pDef;
18b00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18b10 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74  function definit
18b20 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ion object */.  
18b30 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
18b40 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  zId;       /* Th
18b50 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  e function name 
18b60 2a 2f 0a 20 20 20 20 20 20 75 33 32 20 63 6f 6e  */.      u32 con
18b70 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20  stMask = 0;     
18b80 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63 74  /* Mask of funct
18b90 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 68  ion arguments th
18ba0 61 74 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 20  at are constant 
18bb0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20  */.      int i; 
18bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bd0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
18be0 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20  */.      u8 enc 
18bf0 3d 20 45 4e 43 28 64 62 29 3b 20 20 20 20 20 20  = ENC(db);      
18c00 2f 2a 20 54 68 65 20 74 65 78 74 20 65 6e 63 6f  /* The text enco
18c10 64 69 6e 67 20 75 73 65 64 20 62 79 20 74 68 69  ding used by thi
18c20 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  s database */.  
18c30 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
18c40 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41 20  ll = 0;    /* A 
18c50 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
18c60 63 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73  ce */..      ass
18c70 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
18c80 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
18c90 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
18ca0 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
18cb0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
18cc0 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a  P_TokenOnly) ){.
18cd0 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20          pFarg = 
18ce0 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
18cf0 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20          pFarg = 
18d00 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
18d10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46        }.      nF
18d20 61 72 67 20 3d 20 70 46 61 72 67 20 3f 20 70 46  arg = pFarg ? pF
18d30 61 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a  arg->nExpr : 0;.
18d40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
18d50 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
18d60 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
18d70 65 29 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20  e) );.      zId 
18d80 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  = pExpr->u.zToke
18d90 6e 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20  n;.      pDef = 
18da0 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
18db0 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 46 61  ion(db, zId, nFa
18dc0 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20  rg, enc, 0);.   
18dd0 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 7c     if( pDef==0 |
18de0 7c 20 70 44 65 66 2d 3e 78 46 69 6e 61 6c 69 7a  | pDef->xFinaliz
18df0 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=0 ){.        
18e00 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
18e10 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e  pParse, "unknown
18e20 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73 28 29 22   function: %s()"
18e30 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20  , zId);.        
18e40 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
18e50 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74        /* Attempt
18e60 20 61 20 64 69 72 65 63 74 20 69 6d 70 6c 65 6d   a direct implem
18e70 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
18e80 62 75 69 6c 74 2d 69 6e 20 43 4f 41 4c 45 53 43  built-in COALESC
18e90 45 28 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  E() and.      **
18ea0 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e 63 74 69   IFNULL() functi
18eb0 6f 6e 73 2e 20 20 54 68 69 73 20 61 76 6f 69 64  ons.  This avoid
18ec0 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 65 76  s unnecessary ev
18ed0 61 6c 75 61 74 69 6f 6e 20 6f 66 0a 20 20 20 20  aluation of.    
18ee0 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 70    ** arguments p
18ef0 61 73 74 20 74 68 65 20 66 69 72 73 74 20 6e 6f  ast the first no
18f00 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e  n-NULL argument.
18f10 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
18f20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c  if( pDef->funcFl
18f30 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
18f40 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b 0a 20 20  C_COALESCE ){.  
18f50 20 20 20 20 20 20 69 6e 74 20 65 6e 64 43 6f 61        int endCoa
18f60 6c 65 73 63 65 20 3d 20 73 71 6c 69 74 65 33 56  lesce = sqlite3V
18f70 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
18f80 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
18f90 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20 20 20   nFarg>=2 );.   
18fa0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
18fb0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61  Code(pParse, pFa
18fc0 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  rg->a[0].pExpr, 
18fd0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
18fe0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46 61 72   for(i=1; i<nFar
18ff0 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
19000 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19010 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  dOp2(v, OP_NotNu
19020 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e 64 43  ll, target, endC
19030 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20  oalesce);.      
19040 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
19050 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  (v);.          s
19060 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52  qlite3ExprCacheR
19070 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 74 61  emove(pParse, ta
19080 72 67 65 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  rget, 1);.      
19090 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
190a0 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
190b0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
190c0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
190d0 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e  se, pFarg->a[i].
190e0 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
190f0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
19100 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
19110 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  arse);.        }
19120 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
19130 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
19140 28 76 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29  (v, endCoalesce)
19150 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
19160 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
19170 2f 2a 20 54 68 65 20 55 4e 4c 49 4b 45 4c 59 28  /* The UNLIKELY(
19180 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  ) function is a 
19190 6e 6f 2d 6f 70 2e 20 20 54 68 65 20 72 65 73 75  no-op.  The resu
191a0 6c 74 20 69 73 20 74 68 65 20 76 61 6c 75 65 0a  lt is the value.
191b0 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
191c0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
191d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
191e0 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  f( pDef->funcFla
191f0 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
19200 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20 20 20  _UNLIKELY ){.   
19210 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61       assert( nFa
19220 72 67 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  rg>=1 );.       
19230 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
19240 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
19250 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b  Parse, pFarg->a[
19260 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  0].pExpr, target
19270 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
19280 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
19290 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 61 72   for(i=0; i<nFar
192a0 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
192b0 20 69 66 28 20 69 3c 33 32 20 26 26 20 73 71 6c   if( i<32 && sql
192c0 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
192d0 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70  nt(pFarg->a[i].p
192e0 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
192f0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d     testcase( i==
19300 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  31 );.          
19310 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 4d 41 53  constMask |= MAS
19320 4b 42 49 54 33 32 28 69 29 3b 0a 20 20 20 20 20  KBIT32(i);.     
19330 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
19340 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67   (pDef->funcFlag
19350 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
19360 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26 26 20  NEEDCOLL)!=0 && 
19370 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
19380 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
19390 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
193a0 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b  Parse, pFarg->a[
193b0 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
193c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
193d0 20 20 20 69 66 28 20 70 46 61 72 67 20 29 7b 0a     if( pFarg ){.
193e0 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6e 73          if( cons
193f0 74 4d 61 73 6b 20 29 7b 0a 20 20 20 20 20 20 20  tMask ){.       
19400 20 20 20 72 31 20 3d 20 70 50 61 72 73 65 2d 3e     r1 = pParse->
19410 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20  nMem+1;.        
19420 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
19430 3d 20 6e 46 61 72 67 3b 0a 20 20 20 20 20 20 20  = nFarg;.       
19440 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
19450 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
19460 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
19470 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20  e, nFarg);.     
19480 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
19490 20 46 6f 72 20 6c 65 6e 67 74 68 28 29 20 61 6e   For length() an
194a0 64 20 74 79 70 65 6f 66 28 29 20 66 75 6e 63 74  d typeof() funct
194b0 69 6f 6e 73 20 77 69 74 68 20 61 20 63 6f 6c 75  ions with a colu
194c0 6d 6e 20 61 72 67 75 6d 65 6e 74 2c 0a 20 20 20  mn argument,.   
194d0 20 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20       ** set the 
194e0 50 35 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  P5 parameter to 
194f0 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70  the OP_Column op
19500 63 6f 64 65 20 74 6f 20 4f 50 46 4c 41 47 5f 4c  code to OPFLAG_L
19510 45 4e 47 54 48 41 52 47 0a 20 20 20 20 20 20 20  ENGTHARG.       
19520 20 2a 2a 20 6f 72 20 4f 50 46 4c 41 47 5f 54 59   ** or OPFLAG_TY
19530 50 45 4f 46 41 52 47 20 72 65 73 70 65 63 74 69  PEOFARG respecti
19540 76 65 6c 79 2c 20 74 6f 20 61 76 6f 69 64 20 75  vely, to avoid u
19550 6e 6e 65 63 65 73 73 61 72 79 20 64 61 74 61 0a  nnecessary data.
19560 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 61 64 69          ** loadi
19570 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ng..        */. 
19580 20 20 20 20 20 20 20 69 66 28 20 28 70 44 65 66         if( (pDef
19590 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28 53  ->funcFlags & (S
195a0 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54  QLITE_FUNC_LENGT
195b0 48 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59  H|SQLITE_FUNC_TY
195c0 50 45 4f 46 29 29 21 3d 30 20 29 7b 0a 20 20 20  PEOF))!=0 ){.   
195d0 20 20 20 20 20 20 20 75 38 20 65 78 70 72 4f 70         u8 exprOp
195e0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
195f0 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b 0a  rt( nFarg==1 );.
19600 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
19610 28 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  ( pFarg->a[0].pE
19620 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  xpr!=0 );.      
19630 20 20 20 20 65 78 70 72 4f 70 20 3d 20 70 46 61      exprOp = pFa
19640 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  rg->a[0].pExpr->
19650 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  op;.          if
19660 28 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 43 4f 4c  ( exprOp==TK_COL
19670 55 4d 4e 20 7c 7c 20 65 78 70 72 4f 70 3d 3d 54  UMN || exprOp==T
19680 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  K_AGG_COLUMN ){.
19690 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
196a0 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  rt( SQLITE_FUNC_
196b0 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c 41 47 5f 4c  LENGTH==OPFLAG_L
196c0 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20  ENGTHARG );.    
196d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
196e0 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45  SQLITE_FUNC_TYPE
196f0 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54 59 50 45 4f  OF==OPFLAG_TYPEO
19700 46 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20  FARG );.        
19710 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 44      testcase( pD
19720 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
19730 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47  OPFLAG_LENGTHARG
19740 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
19750 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
19760 72 2d 3e 6f 70 32 20 3d 20 0a 20 20 20 20 20 20  r->op2 = .      
19770 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65 66              pDef
19780 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28 4f  ->funcFlags & (O
19790 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 7c  PFLAG_LENGTHARG|
197a0 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47  OPFLAG_TYPEOFARG
197b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
197c0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
197d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
197e0 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 20  hePush(pParse); 
197f0 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65      /* Ticket 2e
19800 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20  a2425d34be */.  
19810 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
19820 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
19830 61 72 73 65 2c 20 70 46 61 72 67 2c 20 72 31 2c  arse, pFarg, r1,
19840 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
19850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19860 20 20 20 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f      SQLITE_ECEL_
19870 44 55 50 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f  DUP|SQLITE_ECEL_
19880 46 41 43 54 4f 52 29 3b 0a 20 20 20 20 20 20 20  FACTOR);.       
19890 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
198a0 65 50 6f 70 28 70 50 61 72 73 65 29 3b 20 20 20  ePop(pParse);   
198b0 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65 61     /* Ticket 2ea
198c0 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20 20  2425d34be */.   
198d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
198e0 20 20 72 31 20 3d 20 30 3b 0a 20 20 20 20 20 20    r1 = 0;.      
198f0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
19900 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
19910 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73 73  LE.      /* Poss
19920 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74 68  ibly overload th
19930 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 74 68  e function if th
19940 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
19950 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 76   is.      ** a v
19960 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c  irtual table col
19970 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  umn..      **.  
19980 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78      ** For infix
19990 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45   functions (LIKE
199a0 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20  , GLOB, REGEXP, 
199b0 61 6e 64 20 4d 41 54 43 48 29 20 75 73 65 20 74  and MATCH) use t
199c0 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63 6f  he.      ** seco
199d0 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74  nd argument, not
199e0 20 74 68 65 20 66 69 72 73 74 2c 20 61 73 20 74   the first, as t
199f0 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  he argument to t
19a00 65 73 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  est to.      ** 
19a10 73 65 65 20 69 66 20 69 74 20 69 73 20 61 20 63  see if it is a c
19a20 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72 74 75  olumn in a virtu
19a30 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  al table.  This 
19a40 69 73 20 64 6f 6e 65 20 62 65 63 61 75 73 65 0a  is done because.
19a50 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 66        ** the lef
19a60 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 66  t operand of inf
19a70 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 74 68  ix functions (th
19a80 65 20 6f 70 65 72 61 6e 64 20 77 65 20 77 61 6e  e operand we wan
19a90 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f  t to.      ** co
19aa0 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e  ntrol overloadin
19ab0 67 29 20 65 6e 64 73 20 75 70 20 61 73 20 74 68  g) ends up as th
19ac0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
19ad0 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  t to the.      *
19ae0 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  * function.  The
19af0 20 65 78 70 72 65 73 73 69 6f 6e 20 22 41 20 67   expression "A g
19b00 6c 6f 62 20 42 22 20 69 73 20 65 71 75 69 76 61  lob B" is equiva
19b10 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a  lent to .      *
19b20 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57  * "glob(B,A).  W
19b30 65 20 77 61 6e 74 20 74 6f 20 75 73 65 20 74 68  e want to use th
19b40 65 20 41 20 69 6e 20 22 41 20 67 6c 6f 62 20 42  e A in "A glob B
19b50 22 20 74 6f 20 74 65 73 74 0a 20 20 20 20 20 20  " to test.      
19b60 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ** for function 
19b70 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75  overloading.  Bu
19b80 74 20 77 65 20 75 73 65 20 74 68 65 20 42 20 74  t we use the B t
19b90 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41  erm in "glob(B,A
19ba0 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  )"..      */.   
19bb0 20 20 20 69 66 28 20 6e 46 61 72 67 3e 3d 32 20     if( nFarg>=2 
19bc0 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73  && (pExpr->flags
19bd0 20 26 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 29   & EP_InfixFunc)
19be0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
19bf0 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76   = sqlite3VtabOv
19c00 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64  erloadFunction(d
19c10 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20  b, pDef, nFarg, 
19c20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78 70  pFarg->a[1].pExp
19c30 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r);.      }else 
19c40 69 66 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a 20  if( nFarg>0 ){. 
19c50 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71         pDef = sq
19c60 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61  lite3VtabOverloa
19c70 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44  dFunction(db, pD
19c80 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67  ef, nFarg, pFarg
19c90 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
19ca0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
19cb0 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75      if( pDef->fu
19cc0 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
19cd0 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29  _FUNC_NEEDCOLL )
19ce0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  {.        if( !p
19cf0 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64  Coll ) pColl = d
19d00 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20  b->pDfltColl; . 
19d10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
19d20 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
19d30 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c  ollSeq, 0, 0, 0,
19d40 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20   (char *)pColl, 
19d50 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
19d60 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
19d70 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
19d80 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 2c 20 63 6f  OP_Function0, co
19d90 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74 61 72  nstMask, r1, tar
19da0 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  get,.           
19db0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
19dc0 61 72 2a 29 70 44 65 66 2c 20 50 34 5f 46 55 4e  ar*)pDef, P4_FUN
19dd0 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73 71 6c  CDEF);.      sql
19de0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
19df0 28 76 2c 20 28 75 38 29 6e 46 61 72 67 29 3b 0a  (v, (u8)nFarg);.
19e00 20 20 20 20 20 20 69 66 28 20 6e 46 61 72 67 20        if( nFarg 
19e10 26 26 20 63 6f 6e 73 74 4d 61 73 6b 3d 3d 30 20  && constMask==0 
19e20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
19e30 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
19e40 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e  ge(pParse, r1, n
19e50 46 61 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Farg);.      }. 
19e60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19e70 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
19e80 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
19e90 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
19ea0 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
19eb0 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 74  ELECT: {.      t
19ec0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
19ed0 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20  EXISTS );.      
19ee0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
19ef0 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20  _SELECT );.     
19f00 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
19f10 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
19f20 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20  arse, pExpr, 0, 
19f30 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
19f40 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
19f50 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
19f60 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d  nt destIfFalse =
19f70 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
19f80 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
19f90 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d  int destIfNull =
19fa0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
19fb0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
19fc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19fd0 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
19fe0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
19ff0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
1a000 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  N(pParse, pExpr,
1a010 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65   destIfFalse, de
1a020 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
1a030 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a040 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1a050 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 1, target);.  
1a060 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
1a070 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
1a080 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20  estIfFalse);.   
1a090 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a0a0 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
1a0b0 6d 2c 20 74 61 72 67 65 74 2c 20 30 29 3b 0a 20  m, target, 0);. 
1a0c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1a0d0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1a0e0 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
1a0f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1a100 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1a110 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
1a120 2f 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  /...    /*.    *
1a130 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79  *    x BETWEEN y
1a140 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20   AND z.    **.  
1a150 20 20 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75    ** This is equ
1a160 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a  ivalent to.    *
1a170 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79  *.    **    x>=y
1a180 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a   AND x<=z.    **
1a190 0a 20 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f  .    ** X is sto
1a1a0 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
1a1b0 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73  eft..    ** Y is
1a1c0 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72   stored in pExpr
1a1d0 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  ->pList->a[0].pE
1a1e0 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73  xpr..    ** Z is
1a1f0 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72   stored in pExpr
1a200 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  ->pList->a[1].pE
1a210 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  xpr..    */.    
1a220 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
1a230 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70   {.      Expr *p
1a240 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
1a250 65 66 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63  eft;.      struc
1a260 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
1a270 2a 70 4c 49 74 65 6d 20 3d 20 70 45 78 70 72 2d  *pLItem = pExpr-
1a280 3e 78 2e 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  >x.pList->a;.   
1a290 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
1a2a0 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b  = pLItem->pExpr;
1a2b0 0a 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ..      r1 = sql
1a2c0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1a2d0 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
1a2e0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1a2f0 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
1a300 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1a310 65 2c 20 70 52 69 67 68 74 2c 20 26 72 65 67 46  e, pRight, &regF
1a320 72 65 65 32 29 3b 0a 20 20 20 20 20 20 74 65 73  ree2);.      tes
1a330 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1a340 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1a350 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
1a360 30 20 29 3b 0a 20 20 20 20 20 20 72 33 20 3d 20  0 );.      r3 = 
1a370 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
1a380 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
1a390 20 72 34 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r4 = sqlite3Get
1a3a0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
1a3b0 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
1a3c0 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  re(pParse, pLeft
1a3d0 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c  , pRight, OP_Ge,
1a3e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a3f0 20 20 20 72 31 2c 20 72 32 2c 20 72 33 2c 20 53     r1, r2, r3, S
1a400 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 20  QLITE_STOREP2); 
1a410 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1a420 3b 0a 20 20 20 20 20 20 70 4c 49 74 65 6d 2b 2b  ;.      pLItem++
1a430 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d  ;.      pRight =
1a440 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a   pLItem->pExpr;.
1a450 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
1a460 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1a470 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20  se, regFree2);. 
1a480 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
1a490 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1a4a0 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 26 72  arse, pRight, &r
1a4b0 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
1a4c0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1a4d0 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63  e2==0 );.      c
1a4e0 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
1a4f0 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
1a500 2c 20 4f 50 5f 4c 65 2c 20 72 31 2c 20 72 32 2c  , OP_Le, r1, r2,
1a510 20 72 34 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52   r4, SQLITE_STOR
1a520 45 50 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65  EP2);.      Vdbe
1a530 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1a540 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a550 64 4f 70 33 28 76 2c 20 4f 50 5f 41 6e 64 2c 20  dOp3(v, OP_And, 
1a560 72 33 2c 20 72 34 2c 20 74 61 72 67 65 74 29 3b  r3, r4, target);
1a570 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
1a580 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1a590 72 73 65 2c 20 72 33 29 3b 0a 20 20 20 20 20 20  rse, r3);.      
1a5a0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1a5b0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 34  mpReg(pParse, r4
1a5c0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1a5d0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1a5e0 4b 5f 53 50 41 4e 3a 0a 20 20 20 20 63 61 73 65  K_SPAN:.    case
1a5f0 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20 0a 20 20   TK_COLLATE: .  
1a600 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a    case TK_UPLUS:
1a610 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   {.      inReg =
1a620 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1a630 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
1a640 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72  Expr->pLeft, tar
1a650 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  get);.      brea
1a660 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  k;.    }..    ca
1a670 73 65 20 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b  se TK_TRIGGER: {
1a680 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
1a690 20 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f 54 52   opcode is TK_TR
1a6a0 49 47 47 45 52 2c 20 74 68 65 6e 20 74 68 65 20  IGGER, then the 
1a6b0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
1a6c0 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20  reference.      
1a6d0 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69  ** to a column i
1a6e0 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f  n the new.* or o
1a6f0 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ld.* pseudo-tabl
1a700 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a  es available to.
1a710 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72        ** trigger
1a720 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68   programs. In th
1a730 69 73 20 63 61 73 65 20 45 78 70 72 2e 69 54 61  is case Expr.iTa
1a740 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 31 20  ble is set to 1 
1a750 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  for the.      **
1a760 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61   new.* pseudo-ta
1a770 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20 74 68  ble, or 0 for th
1a780 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74  e old.* pseudo-t
1a790 61 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75  able. Expr.iColu
1a7a0 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  mn.      ** is s
1a7b0 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e  et to the column
1a7c0 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d 74   of the pseudo-t
1a7d0 61 62 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f 72  able to read, or
1a7e0 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20 20   to -1 to.      
1a7f0 2a 2a 20 72 65 61 64 20 74 68 65 20 72 6f 77 69  ** read the rowi
1a800 64 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a  d field..      *
1a810 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65  *.      ** The e
1a820 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69 6d 70  xpression is imp
1a830 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 61  lemented using a
1a840 6e 20 4f 50 5f 50 61 72 61 6d 20 6f 70 63 6f 64  n OP_Param opcod
1a850 65 2e 20 54 68 65 20 70 31 0a 20 20 20 20 20 20  e. The p1.      
1a860 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
1a870 73 65 74 20 74 6f 20 30 20 66 6f 72 20 61 6e 20  set to 0 for an 
1a880 6f 6c 64 2e 72 6f 77 69 64 20 72 65 66 65 72 65  old.rowid refere
1a890 6e 63 65 2c 20 6f 72 20 74 6f 20 28 69 2b 31 29  nce, or to (i+1)
1a8a0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 66  .      ** to ref
1a8b0 65 72 65 6e 63 65 20 61 6e 6f 74 68 65 72 20 63  erence another c
1a8c0 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 6f 6c 64  olumn of the old
1a8d0 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c  .* pseudo-table,
1a8e0 20 77 68 65 72 65 20 0a 20 20 20 20 20 20 2a 2a   where .      **
1a8f0 20 69 20 69 73 20 74 68 65 20 69 6e 64 65 78 20   i is the index 
1a900 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 46  of the column. F
1a910 6f 72 20 61 20 6e 65 77 2e 72 6f 77 69 64 20 72  or a new.rowid r
1a920 65 66 65 72 65 6e 63 65 2c 20 70 31 20 69 73 0a  eference, p1 is.
1a930 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20        ** set to 
1a940 28 6e 2b 31 29 2c 20 77 68 65 72 65 20 6e 20 69  (n+1), where n i
1a950 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1a960 63 6f 6c 75 6d 6e 73 20 69 6e 20 65 61 63 68 20  columns in each 
1a970 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 20 20  pseudo-table..  
1a980 20 20 20 20 2a 2a 20 46 6f 72 20 61 20 72 65 66      ** For a ref
1a990 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 6f 74  erence to any ot
1a9a0 68 65 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  her column in th
1a9b0 65 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74  e new.* pseudo-t
1a9c0 61 62 6c 65 2c 20 70 31 0a 20 20 20 20 20 20 2a  able, p1.      *
1a9d0 2a 20 69 73 20 73 65 74 20 74 6f 20 28 6e 2b 32  * is set to (n+2
1a9e0 2b 69 29 2c 20 77 68 65 72 65 20 6e 20 61 6e 64  +i), where n and
1a9f0 20 69 20 61 72 65 20 61 73 20 64 65 66 69 6e 65   i are as define
1aa00 64 20 70 72 65 76 69 6f 75 73 6c 79 2e 20 46 6f  d previously. Fo
1aa10 72 0a 20 20 20 20 20 20 2a 2a 20 65 78 61 6d 70  r.      ** examp
1aa20 6c 65 2c 20 69 66 20 74 68 65 20 74 61 62 6c 65  le, if the table
1aa30 20 6f 6e 20 77 68 69 63 68 20 74 72 69 67 67 65   on which trigge
1aa40 72 73 20 61 72 65 20 62 65 69 6e 67 20 66 69 72  rs are being fir
1aa50 65 64 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64  ed is.      ** d
1aa60 65 63 6c 61 72 65 64 20 61 73 3a 0a 20 20 20 20  eclared as:.    
1aa70 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
1aa80 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
1aa90 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 2a 2a 0a  a, b);.      **.
1aaa0 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 70 31        ** Then p1
1aab0 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
1aac0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
1aad0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
1aae0 70 31 3d 3d 30 20 20 20 2d 3e 20 20 20 20 6f 6c  p1==0   ->    ol
1aaf0 64 2e 72 6f 77 69 64 20 20 20 20 20 70 31 3d 3d  d.rowid     p1==
1ab00 33 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 72 6f  3   ->    new.ro
1ab10 77 69 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 70  wid.      **   p
1ab20 31 3d 3d 31 20 20 20 2d 3e 20 20 20 20 6f 6c 64  1==1   ->    old
1ab30 2e 61 20 20 20 20 20 20 20 20 20 70 31 3d 3d 34  .a         p1==4
1ab40 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 61 0a 20     ->    new.a. 
1ab50 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 32 20       **   p1==2 
1ab60 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 62 20 20 20    ->    old.b   
1ab70 20 20 20 20 20 20 70 31 3d 3d 35 20 20 20 2d 3e        p1==5   ->
1ab80 20 20 20 20 6e 65 77 2e 62 20 20 20 20 20 20 20      new.b       
1ab90 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1aba0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 45  Table *pTab = pE
1abb0 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
1abc0 20 69 6e 74 20 70 31 20 3d 20 70 45 78 70 72 2d   int p1 = pExpr-
1abd0 3e 69 54 61 62 6c 65 20 2a 20 28 70 54 61 62 2d  >iTable * (pTab-
1abe0 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31 20 2b 20 70  >nCol+1) + 1 + p
1abf0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a  Expr->iColumn;..
1ac00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1ac10 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c  xpr->iTable==0 |
1ac20 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  | pExpr->iTable=
1ac30 3d 31 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =1 );.      asse
1ac40 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  rt( pExpr->iColu
1ac50 6d 6e 3e 3d 2d 31 20 26 26 20 70 45 78 70 72 2d  mn>=-1 && pExpr-
1ac60 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e  >iColumn<pTab->n
1ac70 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Col );.      ass
1ac80 65 72 74 28 20 70 54 61 62 2d 3e 69 50 4b 65 79  ert( pTab->iPKey
1ac90 3c 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 43 6f  <0 || pExpr->iCo
1aca0 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 69 50 4b 65  lumn!=pTab->iPKe
1acb0 79 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  y );.      asser
1acc0 74 28 20 70 31 3e 3d 30 20 26 26 20 70 31 3c 28  t( p1>=0 && p1<(
1acd0 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b 32 29 20  pTab->nCol*2+2) 
1ace0 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
1acf0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1ad00 50 5f 50 61 72 61 6d 2c 20 70 31 2c 20 74 61 72  P_Param, p1, tar
1ad10 67 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  get);.      Vdbe
1ad20 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 2e  Comment((v, "%s.
1ad30 25 73 20 2d 3e 20 24 25 64 22 2c 0a 20 20 20 20  %s -> $%d",.    
1ad40 20 20 20 20 28 70 45 78 70 72 2d 3e 69 54 61 62      (pExpr->iTab
1ad50 6c 65 20 3f 20 22 6e 65 77 22 20 3a 20 22 6f 6c  le ? "new" : "ol
1ad60 64 22 29 2c 0a 20 20 20 20 20 20 20 20 28 70 45  d"),.        (pE
1ad70 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f  xpr->iColumn<0 ?
1ad80 20 22 72 6f 77 69 64 22 20 3a 20 70 45 78 70 72   "rowid" : pExpr
1ad90 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78  ->pTab->aCol[pEx
1ada0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61  pr->iColumn].zNa
1adb0 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 74 61 72  me),.        tar
1adc0 67 65 74 0a 20 20 20 20 20 20 29 29 3b 0a 0a 23  get.      ));..#
1add0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1ade0 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
1adf0 54 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  T.      /* If th
1ae00 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 52 45 41  e column has REA
1ae10 4c 20 61 66 66 69 6e 69 74 79 2c 20 69 74 20 6d  L affinity, it m
1ae20 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65 20  ay currently be 
1ae30 73 74 6f 72 65 64 20 61 73 20 61 6e 0a 20 20 20  stored as an.   
1ae40 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 55     ** integer. U
1ae50 73 65 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69  se OP_RealAffini
1ae60 74 79 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ty to make sure 
1ae70 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65 61  it is really rea
1ae80 6c 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  l..      **.    
1ae90 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    ** EVIDENCE-OF
1aea0 3a 20 52 2d 36 30 39 38 35 2d 35 37 36 36 32 20  : R-60985-57662 
1aeb0 53 51 4c 69 74 65 20 77 69 6c 6c 20 63 6f 6e 76  SQLite will conv
1aec0 65 72 74 20 74 68 65 20 76 61 6c 75 65 20 62 61  ert the value ba
1aed0 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 66  ck to.      ** f
1aee0 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 77 68  loating point wh
1aef0 65 6e 20 65 78 74 72 61 63 74 69 6e 67 20 69 74  en extracting it
1af00 20 66 72 6f 6d 20 74 68 65 20 72 65 63 6f 72 64   from the record
1af10 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
1af20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pExpr->iColumn>=
1af30 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 54 61  0 .       && pTa
1af40 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69  b->aCol[pExpr->i
1af50 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79  Column].affinity
1af60 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
1af70 4c 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  L.      ){.     
1af80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1af90 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41  dOp1(v, OP_RealA
1afa0 66 66 69 6e 69 74 79 2c 20 74 61 72 67 65 74 29  ffinity, target)
1afb0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
1afc0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1afd0 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20    }...    /*.   
1afe0 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20   ** Form A:.    
1aff0 2a 2a 20 20 20 43 41 53 45 20 78 20 57 48 45 4e  **   CASE x WHEN
1b000 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e   e1 THEN r1 WHEN
1b010 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20   e2 THEN r2 ... 
1b020 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20  WHEN eN THEN rN 
1b030 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a  ELSE y END.    *
1b040 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a  *.    ** Form B:
1b050 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57  .    **   CASE W
1b060 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57  HEN e1 THEN r1 W
1b070 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e  HEN e2 THEN r2 .
1b080 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20  .. WHEN eN THEN 
1b090 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20  rN ELSE y END.  
1b0a0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d    **.    ** Form
1b0b0 20 41 20 69 73 20 63 61 6e 20 62 65 20 74 72 61   A is can be tra
1b0c0 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68  nsformed into th
1b0d0 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72  e equivalent for
1b0e0 6d 20 42 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  m B as follows:.
1b0f0 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48      **   CASE WH
1b100 45 4e 20 78 3d 65 31 20 54 48 45 4e 20 72 31 20  EN x=e1 THEN r1 
1b110 57 48 45 4e 20 78 3d 65 32 20 54 48 45 4e 20 72  WHEN x=e2 THEN r
1b120 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20  2 ....    **    
1b130 20 20 20 20 57 48 45 4e 20 78 3d 65 4e 20 54 48      WHEN x=eN TH
1b140 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44  EN rN ELSE y END
1b150 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58  .    **.    ** X
1b160 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20   (if it exists) 
1b170 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65  is in pExpr->pLe
1b180 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20  ft..    ** Y is 
1b190 69 6e 20 74 68 65 20 6c 61 73 74 20 65 6c 65 6d  in the last elem
1b1a0 65 6e 74 20 6f 66 20 70 45 78 70 72 2d 3e 78 2e  ent of pExpr->x.
1b1b0 70 4c 69 73 74 20 69 66 20 70 45 78 70 72 2d 3e  pList if pExpr->
1b1c0 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 69  x.pList->nExpr i
1b1d0 73 0a 20 20 20 20 2a 2a 20 6f 64 64 2e 20 20 54  s.    ** odd.  T
1b1e0 68 65 20 59 20 69 73 20 61 6c 73 6f 20 6f 70 74  he Y is also opt
1b1f0 69 6f 6e 61 6c 2e 20 20 49 66 20 74 68 65 20 6e  ional.  If the n
1b200 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
1b210 73 20 69 6e 20 78 2e 70 4c 69 73 74 0a 20 20 20  s in x.pList.   
1b220 20 2a 2a 20 69 73 20 65 76 65 6e 2c 20 74 68 65   ** is even, the
1b230 6e 20 59 20 69 73 20 6f 6d 69 74 74 65 64 20 61  n Y is omitted a
1b240 6e 64 20 74 68 65 20 22 6f 74 68 65 72 77 69 73  nd the "otherwis
1b250 65 22 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c  e" result is NUL
1b260 4c 2e 0a 20 20 20 20 2a 2a 20 45 69 20 69 73 20  L..    ** Ei is 
1b270 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  in pExpr->pList-
1b280 3e 61 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20 69  >a[i*2] and Ri i
1b290 73 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  s pExpr->pList->
1b2a0 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a  a[i*2+1]..    **
1b2b0 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73 75  .    ** The resu
1b2c0 6c 74 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  lt of the expres
1b2d0 73 69 6f 6e 20 69 73 20 74 68 65 20 52 69 20 66  sion is the Ri f
1b2e0 6f 72 20 74 68 65 20 66 69 72 73 74 20 6d 61 74  or the first mat
1b2f0 63 68 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a  ching Ei,.    **
1b300 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 20   or if there is 
1b310 6e 6f 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 20  no matching Ei, 
1b320 74 68 65 20 45 4c 53 45 20 74 65 72 6d 20 59 2c  the ELSE term Y,
1b330 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 0a   or if there is.
1b340 20 20 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74      ** no ELSE t
1b350 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a  erm, NULL..    *
1b360 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61  /.    default: a
1b370 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 43 41  ssert( op==TK_CA
1b380 53 45 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e  SE ); {.      in
1b390 74 20 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20  t endLabel;     
1b3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b3b0 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f  /* GOTO label fo
1b3c0 72 20 65 6e 64 20 6f 66 20 43 41 53 45 20 73 74  r end of CASE st
1b3d0 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  mt */.      int 
1b3e0 6e 65 78 74 43 61 73 65 3b 20 20 20 20 20 20 20  nextCase;       
1b3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b400 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20   GOTO label for 
1b410 6e 65 78 74 20 57 48 45 4e 20 63 6c 61 75 73 65  next WHEN clause
1b420 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 45   */.      int nE
1b430 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  xpr;            
1b440 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32              /* 2
1b450 78 20 6e 75 6d 62 65 72 20 6f 66 20 57 48 45 4e  x number of WHEN
1b460 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
1b470 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
1b480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b490 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1b4a0 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c  r */.      ExprL
1b4b0 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
1b4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b4d0 4c 69 73 74 20 6f 66 20 57 48 45 4e 20 74 65 72  List of WHEN ter
1b4e0 6d 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75  ms */.      stru
1b4f0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
1b500 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a   *aListelem;  /*
1b510 20 41 72 72 61 79 20 6f 66 20 57 48 45 4e 20 74   Array of WHEN t
1b520 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45 78  erms */.      Ex
1b530 70 72 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20  pr opCompare;   
1b540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b550 2f 2a 20 54 68 65 20 58 3d 3d 45 69 20 65 78 70  /* The X==Ei exp
1b560 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ression */.     
1b570 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20   Expr *pX;      
1b580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b590 20 20 20 2f 2a 20 54 68 65 20 58 20 65 78 70 72     /* The X expr
1b5a0 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ession */.      
1b5b0 45 78 70 72 20 2a 70 54 65 73 74 20 3d 20 30 3b  Expr *pTest = 0;
1b5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5d0 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d    /* X==Ei (form
1b5e0 20 41 29 20 6f 72 20 6a 75 73 74 20 45 69 20 28   A) or just Ei (
1b5f0 66 6f 72 6d 20 42 29 20 2a 2f 0a 20 20 20 20 20  form B) */.     
1b600 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 69   VVA_ONLY( int i
1b610 43 61 63 68 65 4c 65 76 65 6c 20 3d 20 70 50 61  CacheLevel = pPa
1b620 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
1b630 3b 20 29 0a 0a 20 20 20 20 20 20 61 73 73 65 72  ; )..      asser
1b640 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1b650 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
1b660 73 53 65 6c 65 63 74 29 20 26 26 20 70 45 78 70  sSelect) && pExp
1b670 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20  r->x.pList );.  
1b680 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70 72      assert(pExpr
1b690 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
1b6a0 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c   > 0);.      pEL
1b6b0 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
1b6c0 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73  List;.      aLis
1b6d0 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e  telem = pEList->
1b6e0 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d  a;.      nExpr =
1b6f0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
1b700 20 20 20 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d        endLabel =
1b710 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1b720 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
1b730 69 66 28 20 28 70 58 20 3d 20 70 45 78 70 72 2d  if( (pX = pExpr-
1b740 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20  >pLeft)!=0 ){.  
1b750 20 20 20 20 20 20 74 65 6d 70 58 20 3d 20 2a 70        tempX = *p
1b760 58 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  X;.        testc
1b770 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  ase( pX->op==TK_
1b780 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
1b790 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72    exprToRegister
1b7a0 28 26 74 65 6d 70 58 2c 20 73 71 6c 69 74 65 33  (&tempX, sqlite3
1b7b0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1b7c0 72 73 65 2c 20 70 58 2c 20 26 72 65 67 46 72 65  rse, pX, &regFre
1b7d0 65 31 29 29 3b 0a 20 20 20 20 20 20 20 20 74 65  e1));.        te
1b7e0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1b7f0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 6f  ==0 );.        o
1b800 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b  pCompare.op = TK
1b810 5f 45 51 3b 0a 20 20 20 20 20 20 20 20 6f 70 43  _EQ;.        opC
1b820 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d 20 26  ompare.pLeft = &
1b830 74 65 6d 70 58 3b 0a 20 20 20 20 20 20 20 20 70  tempX;.        p
1b840 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72  Test = &opCompar
1b850 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 69  e;.        /* Ti
1b860 63 6b 65 74 20 62 33 35 31 64 39 35 66 39 63 64  cket b351d95f9cd
1b870 35 65 66 31 37 65 39 64 39 64 62 61 65 31 38 66  5ef17e9d9dbae18f
1b880 35 63 61 38 36 31 31 31 39 30 30 30 31 3a 0a 20  5ca8611190001:. 
1b890 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 76 61         ** The va
1b8a0 6c 75 65 20 69 6e 20 72 65 67 46 72 65 65 31 20  lue in regFree1 
1b8b0 6d 69 67 68 74 20 67 65 74 20 53 43 6f 70 79 2d  might get SCopy-
1b8c0 65 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  ed into the file
1b8d0 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 20 20 20   result..       
1b8e0 20 2a 2a 20 53 6f 20 6d 61 6b 65 20 73 75 72 65   ** So make sure
1b8f0 20 74 68 61 74 20 74 68 65 20 72 65 67 46 72 65   that the regFre
1b900 65 31 20 72 65 67 69 73 74 65 72 20 69 73 20 6e  e1 register is n
1b910 6f 74 20 72 65 75 73 65 64 20 66 6f 72 20 6f 74  ot reused for ot
1b920 68 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  her.        ** p
1b930 75 72 70 6f 73 65 73 20 61 6e 64 20 70 6f 73 73  urposes and poss
1b940 69 62 6c 79 20 6f 76 65 72 77 72 69 74 74 65 6e  ibly overwritten
1b950 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  .  */.        re
1b960 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 20 20  gFree1 = 0;.    
1b970 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d    }.      for(i=
1b980 30 3b 20 69 3c 6e 45 78 70 72 2d 31 3b 20 69 3d  0; i<nExpr-1; i=
1b990 69 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i+2){.        sq
1b9a0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
1b9b0 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
1b9c0 20 20 20 20 69 66 28 20 70 58 20 29 7b 0a 20 20      if( pX ){.  
1b9d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1b9e0 70 54 65 73 74 21 3d 30 20 29 3b 0a 20 20 20 20  pTest!=0 );.    
1b9f0 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e        opCompare.
1ba00 70 52 69 67 68 74 20 3d 20 61 4c 69 73 74 65 6c  pRight = aListel
1ba10 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  em[i].pExpr;.   
1ba20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1ba30 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 61 4c        pTest = aL
1ba40 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72  istelem[i].pExpr
1ba50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1ba60 20 20 20 20 6e 65 78 74 43 61 73 65 20 3d 20 73      nextCase = s
1ba70 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1ba80 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
1ba90 74 65 73 74 63 61 73 65 28 20 70 54 65 73 74 2d  testcase( pTest-
1baa0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
1bab0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1bac0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
1bad0 72 73 65 2c 20 70 54 65 73 74 2c 20 6e 65 78 74  rse, pTest, next
1bae0 43 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  Case, SQLITE_JUM
1baf0 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
1bb00 20 20 74 65 73 74 63 61 73 65 28 20 61 4c 69 73    testcase( aLis
1bb10 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72  telem[i+1].pExpr
1bb20 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
1bb30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1bb40 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
1bb50 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31  e, aListelem[i+1
1bb60 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
1bb70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1bb80 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 65 6e 64  3VdbeGoto(v, end
1bb90 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20  Label);.        
1bba0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1bbb0 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
1bbc0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1bbd0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1bbe0 6e 65 78 74 43 61 73 65 29 3b 0a 20 20 20 20 20  nextCase);.     
1bbf0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 6e 45   }.      if( (nE
1bc00 78 70 72 26 31 29 21 3d 30 20 29 7b 0a 20 20 20  xpr&1)!=0 ){.   
1bc10 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1bc20 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
1bc30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1bc40 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
1bc50 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6e 45 78  e, pEList->a[nEx
1bc60 70 72 2d 31 5d 2e 70 45 78 70 72 2c 20 74 61 72  pr-1].pExpr, tar
1bc70 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  get);.        sq
1bc80 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
1bc90 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
1bca0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1bcb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1bcc0 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
1bcd0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1bce0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
1bcf0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1bd00 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
1bd10 3e 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  >0 .           |
1bd20 7c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  | pParse->iCache
1bd30 4c 65 76 65 6c 3d 3d 69 43 61 63 68 65 4c 65 76  Level==iCacheLev
1bd40 65 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  el );.      sqli
1bd50 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1bd60 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29  bel(v, endLabel)
1bd70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1bd80 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1bd90 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
1bda0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49  .    case TK_RAI
1bdb0 53 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  SE: {.      asse
1bdc0 72 74 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  rt( pExpr->affin
1bdd0 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b  ity==OE_Rollback
1bde0 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
1bdf0 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
1be00 3d 4f 45 5f 41 62 6f 72 74 0a 20 20 20 20 20 20  =OE_Abort.      
1be10 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61       || pExpr->a
1be20 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c  ffinity==OE_Fail
1be30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
1be40 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
1be50 4f 45 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20 20  OE_Ignore.      
1be60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50  );.      if( !pP
1be70 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61  arse->pTriggerTa
1be80 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  b ){.        sql
1be90 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1bea0 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
1beb0 20 20 20 20 20 20 20 20 20 20 20 20 22 52 41 49              "RAI
1bec0 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65  SE() may only be
1bed0 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 74   used within a t
1bee0 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29  rigger-program")
1bef0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1bf00 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1bf10 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66    if( pExpr->aff
1bf20 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20  inity==OE_Abort 
1bf30 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1bf40 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73  e3MayAbort(pPars
1bf50 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1bf60 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1bf70 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1bf80 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
1bf90 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
1bfa0 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
1bfb0 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20  Ignore ){.      
1bfc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1bfd0 4f 70 34 28 0a 20 20 20 20 20 20 20 20 20 20 20  Op4(.           
1bfe0 20 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c   v, OP_Halt, SQL
1bff0 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72  ITE_OK, OE_Ignor
1c000 65 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  e, 0, pExpr->u.z
1c010 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20  Token,0);.      
1c020 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1c030 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1c040 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48          sqlite3H
1c050 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  altConstraint(pP
1c060 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e  arse, SQLITE_CON
1c070 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52 2c  STRAINT_TRIGGER,
1c080 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1c0a0 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 2c 20  Expr->affinity, 
1c0b0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
1c0c0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
1c0d0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1c0e0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
1c0f0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1c100 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
1c110 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69  egFree1);.  sqli
1c120 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1c130 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
1c140 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e  e2);.  return in
1c150 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61  Reg;.}../*.** Fa
1c160 63 74 6f 72 20 6f 75 74 20 74 68 65 20 63 6f 64  ctor out the cod
1c170 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65  e of the given e
1c180 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 69 6e 69  xpression to ini
1c190 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65  tialization time
1c1a0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1c1b0 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28  3ExprCodeAtInit(
1c1c0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1c1d0 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
1c1e0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
1c1f0 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f  r *pExpr,      /
1c200 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
1c210 20 74 6f 20 63 6f 64 65 20 77 68 65 6e 20 74 68   to code when th
1c220 65 20 56 44 42 45 20 69 6e 69 74 69 61 6c 69 7a  e VDBE initializ
1c230 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44  es */.  int regD
1c240 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f  est,      /* Sto
1c250 72 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  re the value in 
1c260 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f  this register */
1c270 0a 20 20 75 38 20 72 65 75 73 61 62 6c 65 20 20  .  u8 reusable  
1c280 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1c290 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  this expression 
1c2a0 69 73 20 72 65 75 73 61 62 6c 65 20 2a 2f 0a 29  is reusable */.)
1c2b0 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 3b  {.  ExprList *p;
1c2c0 0a 20 20 61 73 73 65 72 74 28 20 43 6f 6e 73 74  .  assert( Const
1c2d0 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29  FactorOk(pParse)
1c2e0 20 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65   );.  p = pParse
1c2f0 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20  ->pConstExpr;.  
1c300 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
1c310 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64  xprDup(pParse->d
1c320 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  b, pExpr, 0);.  
1c330 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  p = sqlite3ExprL
1c340 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
1c350 2c 20 70 2c 20 70 45 78 70 72 29 3b 0a 20 20 69  , p, pExpr);.  i
1c360 66 28 20 70 20 29 7b 0a 20 20 20 20 20 73 74 72  f( p ){.     str
1c370 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
1c380 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61  m *pItem = &p->a
1c390 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20  [p->nExpr-1];.  
1c3a0 20 20 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e     pItem->u.iCon
1c3b0 73 74 45 78 70 72 52 65 67 20 3d 20 72 65 67 44  stExprReg = regD
1c3c0 65 73 74 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d  est;.     pItem-
1c3d0 3e 72 65 75 73 61 62 6c 65 20 3d 20 72 65 75 73  >reusable = reus
1c3e0 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 70 50 61 72  able;.  }.  pPar
1c3f0 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 20 3d  se->pConstExpr =
1c400 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   p;.}../*.** Gen
1c410 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76  erate code to ev
1c420 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65 73  aluate an expres
1c430 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 74  sion and store t
1c440 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e  he results.** in
1c450 74 6f 20 61 20 72 65 67 69 73 74 65 72 2e 20 20  to a register.  
1c460 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73  Return the regis
1c470 74 65 72 20 6e 75 6d 62 65 72 20 77 68 65 72 65  ter number where
1c480 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20   the results.** 
1c490 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a  are stored..**.*
1c4a0 2a 20 49 66 20 74 68 65 20 72 65 67 69 73 74 65  * If the registe
1c4b0 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  r is a temporary
1c4c0 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20 63   register that c
1c4d0 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61 74 65  an be deallocate
1c4e0 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74 65  d,.** then write
1c4f0 20 69 74 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f   its number into
1c500 20 2a 70 52 65 67 2e 20 20 49 66 20 74 68 65 20   *pReg.  If the 
1c510 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 20  result register 
1c520 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70  is not.** a temp
1c530 6f 72 61 72 79 2c 20 74 68 65 6e 20 73 65 74 20  orary, then set 
1c540 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a  *pReg to zero..*
1c550 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73  *.** If pExpr is
1c560 20 61 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65   a constant, the
1c570 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  n this routine m
1c580 69 67 68 74 20 67 65 6e 65 72 61 74 65 20 74 68  ight generate th
1c590 69 73 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 66 69  is.** code to fi
1c5a0 6c 6c 20 74 68 65 20 72 65 67 69 73 74 65 72 20  ll the register 
1c5b0 69 6e 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  in the initializ
1c5c0 61 74 69 6f 6e 20 73 65 63 74 69 6f 6e 20 6f 66  ation section of
1c5d0 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f   the.** VDBE pro
1c5e0 67 72 61 6d 2c 20 69 6e 20 6f 72 64 65 72 20 74  gram, in order t
1c5f0 6f 20 66 61 63 74 6f 72 20 69 74 20 6f 75 74 20  o factor it out 
1c600 6f 66 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f  of the evaluatio
1c610 6e 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73  n loop..*/.int s
1c620 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1c630 6d 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  mp(Parse *pParse
1c640 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
1c650 6e 74 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74  nt *pReg){.  int
1c660 20 72 32 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   r2;.  pExpr = s
1c670 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
1c680 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
1c690 69 66 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f  if( ConstFactorO
1c6a0 6b 28 70 50 61 72 73 65 29 0a 20 20 20 26 26 20  k(pParse).   && 
1c6b0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45  pExpr->op!=TK_RE
1c6c0 47 49 53 54 45 52 0a 20 20 20 26 26 20 73 71 6c  GISTER.   && sql
1c6d0 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
1c6e0 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29  ntNotJoin(pExpr)
1c6f0 0a 20 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  .  ){.    ExprLi
1c700 73 74 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e  st *p = pParse->
1c710 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 20 20  pConstExpr;.    
1c720 69 6e 74 20 69 3b 0a 20 20 20 20 2a 70 52 65 67  int i;.    *pReg
1c730 20 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70    = 0;.    if( p
1c740 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74   ){.      struct
1c750 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
1c760 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72  pItem;.      for
1c770 28 70 49 74 65 6d 3d 70 2d 3e 61 2c 20 69 3d 70  (pItem=p->a, i=p
1c780 2d 3e 6e 45 78 70 72 3b 20 69 3e 30 3b 20 70 49  ->nExpr; i>0; pI
1c790 74 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20 20 20  tem++, i--){.   
1c7a0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
1c7b0 72 65 75 73 61 62 6c 65 20 26 26 20 73 71 6c 69  reusable && sqli
1c7c0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
1c7d0 49 74 65 6d 2d 3e 70 45 78 70 72 2c 70 45 78 70  Item->pExpr,pExp
1c7e0 72 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  r,-1)==0 ){.    
1c7f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 49 74        return pIt
1c800 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72  em->u.iConstExpr
1c810 52 65 67 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Reg;.        }. 
1c820 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1c830 20 72 32 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e   r2 = ++pParse->
1c840 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
1c850 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28  3ExprCodeAtInit(
1c860 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72  pParse, pExpr, r
1c870 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  2, 1);.  }else{.
1c880 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
1c890 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
1c8a0 50 61 72 73 65 29 3b 0a 20 20 20 20 72 32 20 3d  Parse);.    r2 =
1c8b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1c8c0 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
1c8d0 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20 20 69  Expr, r1);.    i
1c8e0 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20  f( r2==r1 ){.   
1c8f0 20 20 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20     *pReg = r1;. 
1c900 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c910 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1c920 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
1c930 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 67 20 3d  );.      *pReg =
1c940 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
1c950 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a  return r2;.}../*
1c960 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1c970 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c  e that will eval
1c980 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20  uate expression 
1c990 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20  pExpr and store 
1c9a0 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69  the.** results i
1c9b0 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
1c9c0 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73 20  t.  The results 
1c9d0 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74  are guaranteed t
1c9e0 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72  o appear.** in r
1c9f0 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a  egister target..
1ca00 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1ca10 78 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70  xprCode(Parse *p
1ca20 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
1ca30 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b  pr, int target){
1ca40 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20  .  int inReg;.. 
1ca50 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e   assert( target>
1ca60 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61  0 && target<=pPa
1ca70 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69  rse->nMem );.  i
1ca80 66 28 20 70 45 78 70 72 20 26 26 20 70 45 78 70  f( pExpr && pExp
1ca90 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  r->op==TK_REGIST
1caa0 45 52 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ER ){.    sqlite
1cab0 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72  3VdbeAddOp2(pPar
1cac0 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43 6f  se->pVdbe, OP_Co
1cad0 70 79 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  py, pExpr->iTabl
1cae0 65 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 65  e, target);.  }e
1caf0 6c 73 65 7b 0a 20 20 20 20 69 6e 52 65 67 20 3d  lse{.    inReg =
1cb00 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1cb10 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
1cb20 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
1cb30 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
1cb40 65 2d 3e 70 56 64 62 65 21 3d 30 20 7c 7c 20 70  e->pVdbe!=0 || p
1cb50 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
1cb60 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69  cFailed );.    i
1cb70 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74  f( inReg!=target
1cb80 20 26 26 20 70 50 61 72 73 65 2d 3e 70 56 64 62   && pParse->pVdb
1cb90 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
1cba0 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61  e3VdbeAddOp2(pPa
1cbb0 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53  rse->pVdbe, OP_S
1cbc0 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72  Copy, inReg, tar
1cbd0 67 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  get);.    }.  }.
1cbe0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20  }../*.** Make a 
1cbf0 74 72 61 6e 73 69 65 6e 74 20 63 6f 70 79 20 6f  transient copy o
1cc00 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  f expression pEx
1cc10 70 72 20 61 6e 64 20 74 68 65 6e 20 63 6f 64 65  pr and then code
1cc20 20 69 74 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c   it using.** sql
1cc30 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 2e 20  ite3ExprCode(). 
1cc40 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   This routine wo
1cc50 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 73 71  rks just like sq
1cc60 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 0a  lite3ExprCode().
1cc70 2a 2a 20 65 78 63 65 70 74 20 74 68 61 74 20 74  ** except that t
1cc80 68 65 20 69 6e 70 75 74 20 65 78 70 72 65 73 73  he input express
1cc90 69 6f 6e 20 69 73 20 67 75 61 72 61 6e 74 65 65  ion is guarantee
1cca0 64 20 74 6f 20 62 65 20 75 6e 63 68 61 6e 67 65  d to be unchange
1ccb0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
1ccc0 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28 50  e3ExprCodeCopy(P
1ccd0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
1cce0 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
1ccf0 61 72 67 65 74 29 7b 0a 20 20 73 71 6c 69 74 65  arget){.  sqlite
1cd00 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1cd10 64 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71  db;.  pExpr = sq
1cd20 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
1cd30 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 69 66   pExpr, 0);.  if
1cd40 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
1cd50 6c 65 64 20 29 20 73 71 6c 69 74 65 33 45 78 70  led ) sqlite3Exp
1cd60 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
1cd70 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
1cd80 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1cd90 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 7d 0a  e(db, pExpr);.}.
1cda0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1cdb0 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
1cdc0 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73 69  valuate expressi
1cdd0 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f  on pExpr and sto
1cde0 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74  re the.** result
1cdf0 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  s in register ta
1ce00 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c  rget.  The resul
1ce10 74 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  ts are guarantee
1ce20 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69  d to appear.** i
1ce30 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
1ce40 74 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65  t.  If the expre
1ce50 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
1ce60 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  t, then this rou
1ce70 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 63 68  tine.** might ch
1ce80 6f 6f 73 65 20 74 6f 20 63 6f 64 65 20 74 68 65  oose to code the
1ce90 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74 20 69   expression at i
1cea0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69  nitialization ti
1ceb0 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  me..*/.void sqli
1cec0 74 65 33 45 78 70 72 43 6f 64 65 46 61 63 74 6f  te3ExprCodeFacto
1ced0 72 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  rable(Parse *pPa
1cee0 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
1cef0 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
1cf00 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f 6b 43   if( pParse->okC
1cf10 6f 6e 73 74 46 61 63 74 6f 72 20 26 26 20 73 71  onstFactor && sq
1cf20 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
1cf30 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20  ant(pExpr) ){.  
1cf40 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1cf50 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20  eAtInit(pParse, 
1cf60 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20 30  pExpr, target, 0
1cf70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1cf80 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1cf90 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
1cfa0 61 72 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  arget);.  }.}../
1cfb0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1cfc0 64 65 20 74 68 61 74 20 65 76 61 6c 75 61 74 65  de that evaluate
1cfd0 73 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  s the given expr
1cfe0 65 73 73 69 6f 6e 20 61 6e 64 20 70 75 74 73 20  ession and puts 
1cff0 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  the result.** in
1d000 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
1d010 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b  ..**.** Also mak
1d020 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
1d030 65 78 70 72 65 73 73 69 6f 6e 20 72 65 73 75 6c  expression resul
1d040 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20  ts into another 
1d050 22 63 61 63 68 65 22 20 72 65 67 69 73 74 65 72  "cache" register
1d060 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20 74  .** and modify t
1d070 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73 6f  he expression so
1d080 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 74   that the next t
1d090 69 6d 65 20 69 74 20 69 73 20 65 76 61 6c 75 61  ime it is evalua
1d0a0 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75  ted,.** the resu
1d0b0 6c 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  lt is a copy of 
1d0c0 74 68 65 20 63 61 63 68 65 20 72 65 67 69 73 74  the cache regist
1d0d0 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
1d0e0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
1d0f0 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  or expressions t
1d100 68 61 74 20 61 72 65 20 75 73 65 64 20 6d 75 6c  hat are used mul
1d110 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e  tiple .** times.
1d120 20 20 54 68 65 79 20 61 72 65 20 65 76 61 6c 75    They are evalu
1d130 61 74 65 64 20 6f 6e 63 65 20 61 6e 64 20 74 68  ated once and th
1d140 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
1d150 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61   expression.** a
1d160 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 76 6f  re reused..*/.vo
1d170 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
1d180 64 65 41 6e 64 43 61 63 68 65 28 50 61 72 73 65  deAndCache(Parse
1d190 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
1d1a0 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65  pExpr, int targe
1d1b0 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  t){.  Vdbe *v = 
1d1c0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
1d1d0 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20 61 73   int iMem;..  as
1d1e0 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29  sert( target>0 )
1d1f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
1d200 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54  r->op!=TK_REGIST
1d210 45 52 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ER );.  sqlite3E
1d220 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
1d230 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
1d240 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73    iMem = ++pPars
1d250 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74  e->nMem;.  sqlit
1d260 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1d270 4f 50 5f 43 6f 70 79 2c 20 74 61 72 67 65 74 2c  OP_Copy, target,
1d280 20 69 4d 65 6d 29 3b 0a 20 20 65 78 70 72 54 6f   iMem);.  exprTo
1d290 52 65 67 69 73 74 65 72 28 70 45 78 70 72 2c 20  Register(pExpr, 
1d2a0 69 4d 65 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  iMem);.}../*.** 
1d2b0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
1d2c0 61 74 20 70 75 73 68 65 73 20 74 68 65 20 76 61  at pushes the va
1d2d0 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65  lue of every ele
1d2e0 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65  ment of the give
1d2f0 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
1d300 6c 69 73 74 20 69 6e 74 6f 20 61 20 73 65 71 75  list into a sequ
1d310 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72  ence of register
1d320 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 74  s beginning at t
1d330 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  arget..**.** Ret
1d340 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
1d350 66 20 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75  f elements evalu
1d360 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ated..**.** The 
1d370 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 20  SQLITE_ECEL_DUP 
1d380 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20 74 68  flag prevents th
1d390 65 20 61 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d  e arguments from
1d3a0 20 62 65 69 6e 67 0a 2a 2a 20 66 69 6c 6c 65 64   being.** filled
1d3b0 20 75 73 69 6e 67 20 4f 50 5f 53 43 6f 70 79 2e   using OP_SCopy.
1d3c0 20 20 4f 50 5f 43 6f 70 79 20 6d 75 73 74 20 62    OP_Copy must b
1d3d0 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  e used instead..
1d3e0 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  **.** The SQLITE
1d3f0 5f 45 43 45 4c 5f 46 41 43 54 4f 52 20 61 72 67  _ECEL_FACTOR arg
1d400 75 6d 65 6e 74 20 61 6c 6c 6f 77 73 20 63 6f 6e  ument allows con
1d410 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 20  stant arguments 
1d420 74 6f 20 62 65 0a 2a 2a 20 66 61 63 74 6f 72 65  to be.** factore
1d430 64 20 6f 75 74 20 69 6e 74 6f 20 69 6e 69 74 69  d out into initi
1d440 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 64 65 2e 0a  alization code..
1d450 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  **.** The SQLITE
1d460 5f 45 43 45 4c 5f 52 45 46 20 66 6c 61 67 20 6d  _ECEL_REF flag m
1d470 65 61 6e 73 20 74 68 61 74 20 65 78 70 72 65 73  eans that expres
1d480 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 6c 69 73  sions in the lis
1d490 74 20 77 69 74 68 0a 2a 2a 20 45 78 70 72 4c 69  t with.** ExprLi
1d4a0 73 74 2e 61 5b 5d 2e 75 2e 78 2e 69 4f 72 64 65  st.a[].u.x.iOrde
1d4b0 72 42 79 43 6f 6c 3e 30 20 68 61 76 65 20 61 6c  rByCol>0 have al
1d4c0 72 65 61 64 79 20 62 65 65 6e 20 65 76 61 6c 75  ready been evalu
1d4d0 61 74 65 64 20 61 6e 64 20 73 74 6f 72 65 64 0a  ated and stored.
1d4e0 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73 20  ** in registers 
1d4f0 61 74 20 73 72 63 52 65 67 2c 20 61 6e 64 20 73  at srcReg, and s
1d500 6f 20 74 68 65 20 76 61 6c 75 65 20 63 61 6e 20  o the value can 
1d510 62 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74  be copied from t
1d520 68 65 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  here..*/.int sql
1d530 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
1d540 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
1d550 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61  Parse,     /* Pa
1d560 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1d570 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
1d580 73 74 2c 20 20 20 2f 2a 20 54 68 65 20 65 78 70  st,   /* The exp
1d590 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20  ression list to 
1d5a0 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  be coded */.  in
1d5b0 74 20 74 61 72 67 65 74 2c 20 20 20 20 20 20 20  t target,       
1d5c0 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69   /* Where to wri
1d5d0 74 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  te results */.  
1d5e0 69 6e 74 20 73 72 63 52 65 67 2c 20 20 20 20 20  int srcReg,     
1d5f0 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 72 65 67     /* Source reg
1d600 69 73 74 65 72 73 20 69 66 20 53 51 4c 49 54 45  isters if SQLITE
1d610 5f 45 43 45 4c 5f 52 45 46 20 2a 2f 0a 20 20 75  _ECEL_REF */.  u
1d620 38 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  8 flags         
1d630 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 43 45 4c    /* SQLITE_ECEL
1d640 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  _* flags */.){. 
1d650 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1d660 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1d670 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 75  int i, j, n;.  u
1d680 38 20 63 6f 70 79 4f 70 20 3d 20 28 66 6c 61 67  8 copyOp = (flag
1d690 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  s & SQLITE_ECEL_
1d6a0 44 55 50 29 20 3f 20 4f 50 5f 43 6f 70 79 20 3a  DUP) ? OP_Copy :
1d6b0 20 4f 50 5f 53 43 6f 70 79 3b 0a 20 20 56 64 62   OP_SCopy;.  Vdb
1d6c0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1d6d0 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
1d6e0 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61 73  pList!=0 );.  as
1d6f0 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29  sert( target>0 )
1d700 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
1d710 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b 20  se->pVdbe!=0 ); 
1d720 20 2f 2a 20 4e 65 76 65 72 20 67 65 74 73 20 74   /* Never gets t
1d730 68 69 73 20 66 61 72 20 6f 74 68 65 72 77 69 73  his far otherwis
1d740 65 20 2a 2f 0a 20 20 6e 20 3d 20 70 4c 69 73 74  e */.  n = pList
1d750 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 21  ->nExpr;.  if( !
1d760 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50  ConstFactorOk(pP
1d770 61 72 73 65 29 20 29 20 66 6c 61 67 73 20 26 3d  arse) ) flags &=
1d780 20 7e 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41   ~SQLITE_ECEL_FA
1d790 43 54 4f 52 3b 0a 20 20 66 6f 72 28 70 49 74 65  CTOR;.  for(pIte
1d7a0 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
1d7b0 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d   i<n; i++, pItem
1d7c0 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
1d7d0 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45  Expr = pItem->pE
1d7e0 78 70 72 3b 0a 20 20 20 20 69 66 28 20 28 66 6c  xpr;.    if( (fl
1d7f0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45  ags & SQLITE_ECE
1d800 4c 5f 52 45 46 29 21 3d 30 20 26 26 20 28 6a 20  L_REF)!=0 && (j 
1d810 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 75 2e  = pList->a[i].u.
1d820 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29 3e 30  x.iOrderByCol)>0
1d830 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1d840 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 63  3VdbeAddOp2(v, c
1d850 6f 70 79 4f 70 2c 20 6a 2b 73 72 63 52 65 67 2d  opyOp, j+srcReg-
1d860 31 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20  1, target+i);.  
1d870 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61    }else if( (fla
1d880 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c  gs & SQLITE_ECEL
1d890 5f 46 41 43 54 4f 52 29 21 3d 30 20 26 26 20 73  _FACTOR)!=0 && s
1d8a0 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
1d8b0 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20  tant(pExpr) ){. 
1d8c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1d8d0 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73  CodeAtInit(pPars
1d8e0 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
1d8f0 2b 69 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  +i, 0);.    }els
1d900 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 6e 52  e{.      int inR
1d910 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
1d920 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
1d930 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
1d940 2b 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  +i);.      if( i
1d950 6e 52 65 67 21 3d 74 61 72 67 65 74 2b 69 20 29  nReg!=target+i )
1d960 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70  {.        VdbeOp
1d970 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 20 20 69   *pOp;.        i
1d980 66 28 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f 43 6f  f( copyOp==OP_Co
1d990 70 79 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  py.         && (
1d9a0 70 4f 70 3d 73 71 6c 69 74 65 33 56 64 62 65 47  pOp=sqlite3VdbeG
1d9b0 65 74 4f 70 28 76 2c 20 2d 31 29 29 2d 3e 6f 70  etOp(v, -1))->op
1d9c0 63 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20  code==OP_Copy.  
1d9d0 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70         && pOp->p
1d9e0 31 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69 6e 52  1+pOp->p3+1==inR
1d9f0 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  eg.         && p
1da00 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2b 31  Op->p2+pOp->p3+1
1da10 3d 3d 74 61 72 67 65 74 2b 69 0a 20 20 20 20 20  ==target+i.     
1da20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
1da30 70 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20 20  pOp->p3++;.     
1da40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1da50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1da60 64 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c  ddOp2(v, copyOp,
1da70 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 2b 69   inReg, target+i
1da80 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1da90 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1daa0 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
1dab0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1dac0 65 20 66 6f 72 20 61 20 42 45 54 57 45 45 4e 20  e for a BETWEEN 
1dad0 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  operator..**.** 
1dae0 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41     x BETWEEN y A
1daf0 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ND z.**.** The a
1db00 62 6f 76 65 20 69 73 20 65 71 75 69 76 61 6c 65  bove is equivale
1db10 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20  nt to .**.**    
1db20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a  x>=y AND x<=z.**
1db30 0a 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73  .** Code it as s
1db40 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65  uch, taking care
1db50 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f   to do the commo
1db60 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a  n subexpression.
1db70 2a 2a 20 65 6c 69 6d 69 6e 61 74 69 6f 6e 20 6f  ** elimination o
1db80 66 20 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  f x..*/.static v
1db90 6f 69 64 20 65 78 70 72 43 6f 64 65 42 65 74 77  oid exprCodeBetw
1dba0 65 65 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  een(.  Parse *pP
1dbb0 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
1dbc0 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
1dbd0 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
1dbe0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
1dbf0 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 45  ,      /* The BE
1dc00 54 57 45 45 4e 20 65 78 70 72 65 73 73 69 6f 6e  TWEEN expression
1dc10 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20   */.  int dest, 
1dc20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
1dc30 68 65 72 65 20 69 66 20 74 68 65 20 6a 75 6d 70  here if the jump
1dc40 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 69   is taken */.  i
1dc50 6e 74 20 6a 75 6d 70 49 66 54 72 75 65 2c 20 20  nt jumpIfTrue,  
1dc60 20 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a 75 6d   /* Take the jum
1dc70 70 20 69 66 20 74 68 65 20 42 45 54 57 45 45 4e  p if the BETWEEN
1dc80 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e   is true */.  in
1dc90 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20  t jumpIfNull    
1dca0 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70  /* Take the jump
1dcb0 20 69 66 20 74 68 65 20 42 45 54 57 45 45 4e 20   if the BETWEEN 
1dcc0 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  is NULL */.){.  
1dcd0 45 78 70 72 20 65 78 70 72 41 6e 64 3b 20 20 20  Expr exprAnd;   
1dce0 20 20 2f 2a 20 54 68 65 20 41 4e 44 20 6f 70 65    /* The AND ope
1dcf0 72 61 74 6f 72 20 69 6e 20 20 78 3e 3d 79 20 41  rator in  x>=y A
1dd00 4e 44 20 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78  ND x<=z  */.  Ex
1dd10 70 72 20 63 6f 6d 70 4c 65 66 74 3b 20 20 20 20  pr compLeft;    
1dd20 2f 2a 20 54 68 65 20 20 78 3e 3d 79 20 20 74 65  /* The  x>=y  te
1dd30 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d  rm */.  Expr com
1dd40 70 52 69 67 68 74 3b 20 20 20 2f 2a 20 54 68 65  pRight;   /* The
1dd50 20 20 78 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a    x<=z  term */.
1dd60 20 20 45 78 70 72 20 65 78 70 72 58 3b 20 20 20    Expr exprX;   
1dd70 20 20 20 20 2f 2a 20 54 68 65 20 20 78 20 20 73      /* The  x  s
1dd80 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  ubexpression */.
1dd90 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d    int regFree1 =
1dda0 20 30 3b 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79   0; /* Temporary
1ddb0 20 75 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f   use register */
1ddc0 0a 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  ..  assert( !Exp
1ddd0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1dde0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
1ddf0 29 20 29 3b 0a 20 20 65 78 70 72 58 20 3d 20 2a  ) );.  exprX = *
1de00 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
1de10 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f  exprAnd.op = TK_
1de20 41 4e 44 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70  AND;.  exprAnd.p
1de30 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74  Left = &compLeft
1de40 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 52 69 67  ;.  exprAnd.pRig
1de50 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b  ht = &compRight;
1de60 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d  .  compLeft.op =
1de70 20 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c 65   TK_GE;.  compLe
1de80 66 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72  ft.pLeft = &expr
1de90 58 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52  X;.  compLeft.pR
1dea0 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  ight = pExpr->x.
1deb0 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
1dec0 72 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f  r;.  compRight.o
1ded0 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d  p = TK_LE;.  com
1dee0 70 52 69 67 68 74 2e 70 4c 65 66 74 20 3d 20 26  pRight.pLeft = &
1def0 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 52 69 67  exprX;.  compRig
1df00 68 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70  ht.pRight = pExp
1df10 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d  r->x.pList->a[1]
1df20 2e 70 45 78 70 72 3b 0a 20 20 65 78 70 72 54 6f  .pExpr;.  exprTo
1df30 52 65 67 69 73 74 65 72 28 26 65 78 70 72 58 2c  Register(&exprX,
1df40 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1df50 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26 65 78  Temp(pParse, &ex
1df60 70 72 58 2c 20 26 72 65 67 46 72 65 65 31 29 29  prX, &regFree1))
1df70 3b 0a 20 20 69 66 28 20 6a 75 6d 70 49 66 54 72  ;.  if( jumpIfTr
1df80 75 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ue ){.    sqlite
1df90 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
1dfa0 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65  se, &exprAnd, de
1dfb0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1dfc0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
1dfd0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
1dfe0 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e  (pParse, &exprAn
1dff0 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  d, dest, jumpIfN
1e000 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ull);.  }.  sqli
1e010 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1e020 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
1e030 65 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72  e1);..  /* Ensur
1e040 65 20 61 64 65 71 75 61 74 65 20 74 65 73 74 20  e adequate test 
1e050 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 74 65  coverage */.  te
1e060 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72  stcase( jumpIfTr
1e070 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e  ue==0 && jumpIfN
1e080 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65  ull==0 && regFre
1e090 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1==0 );.  testc
1e0a0 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d  ase( jumpIfTrue=
1e0b0 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  =0 && jumpIfNull
1e0c0 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21  ==0 && regFree1!
1e0d0 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
1e0e0 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20  ( jumpIfTrue==0 
1e0f0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  && jumpIfNull!=0
1e100 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20   && regFree1==0 
1e110 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a  );.  testcase( j
1e120 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20  umpIfTrue==0 && 
1e130 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26  jumpIfNull!=0 &&
1e140 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a   regFree1!=0 );.
1e150 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1e160 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d  IfTrue!=0 && jum
1e170 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65  pIfNull==0 && re
1e180 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74  gFree1==0 );.  t
1e190 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54  estcase( jumpIfT
1e1a0 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66  rue!=0 && jumpIf
1e1b0 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72  Null==0 && regFr
1e1c0 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1!=0 );.  test
1e1d0 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65  case( jumpIfTrue
1e1e0 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  !=0 && jumpIfNul
1e1f0 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l!=0 && regFree1
1e200 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==0 );.  testcas
1e210 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30  e( jumpIfTrue!=0
1e220 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
1e230 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30  0 && regFree1!=0
1e240 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   );.}../*.** Gen
1e250 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
1e260 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73   boolean express
1e270 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20  ion such that a 
1e280 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20  jump is made.** 
1e290 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65  to the label "de
1e2a0 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65  st" if the expre
1e2b0 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62 75  ssion is true bu
1e2c0 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63  t execution.** c
1e2d0 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68  ontinues straigh
1e2e0 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78  t thru if the ex
1e2f0 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73  pression is fals
1e300 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
1e310 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
1e320 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65  ates to NULL (ne
1e330 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66  ither true nor f
1e340 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74  alse), then.** t
1e350 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20  ake the jump if 
1e360 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66  the jumpIfNull f
1e370 6c 61 67 20 69 73 20 53 51 4c 49 54 45 5f 4a 55  lag is SQLITE_JU
1e380 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  MPIFNULL..**.** 
1e390 54 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64  This code depend
1e3a0 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68  s on the fact th
1e3b0 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e  at certain token
1e3c0 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f   values (ex: TK_
1e3d0 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65 20 73  EQ).** are the s
1e3e0 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20 76 61  ame as opcode va
1e3f0 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45 71 29  lues (ex: OP_Eq)
1e400 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20   that implement 
1e410 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
1e420 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20  g.** operation. 
1e430 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74   Special comment
1e440 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e 64 20  s in vdbe.c and 
1e450 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77  the mkopcodeh.aw
1e460 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74  k script in.** t
1e470 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73 73 20  he make process 
1e480 63 61 75 73 65 20 74 68 65 73 65 20 76 61 6c 75  cause these valu
1e490 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73  es to align.  As
1e4a0 73 65 72 74 28 29 73 20 69 6e 20 74 68 65 20 63  sert()s in the c
1e4b0 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72  ode.** below ver
1e4c0 69 66 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d  ify that the num
1e4d0 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e 65 64  bers are aligned
1e4e0 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76   correctly..*/.v
1e4f0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49  oid sqlite3ExprI
1e500 66 54 72 75 65 28 50 61 72 73 65 20 2a 70 50 61  fTrue(Parse *pPa
1e510 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
1e520 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20  , int dest, int 
1e530 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56  jumpIfNull){.  V
1e540 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1e550 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70  >pVdbe;.  int op
1e560 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
1e570 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree1 = 0;.  int 
1e580 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20  regFree2 = 0;.  
1e590 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61  int r1, r2;..  a
1e5a0 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c  ssert( jumpIfNul
1e5b0 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  l==SQLITE_JUMPIF
1e5c0 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75  NULL || jumpIfNu
1e5d0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e  ll==0 );.  if( N
1e5e0 45 56 45 52 28 76 3d 3d 30 29 20 29 20 20 20 20  EVER(v==0) )    
1e5f0 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45 78 69   return;  /* Exi
1e600 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20 63  stence of VDBE c
1e610 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72  hecked by caller
1e620 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
1e630 70 45 78 70 72 3d 3d 30 29 20 29 20 72 65 74 75  pExpr==0) ) retu
1e640 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61 79 20 74  rn;  /* No way t
1e650 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 2a  his can happen *
1e660 2f 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e  /.  op = pExpr->
1e670 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  op;.  switch( op
1e680 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
1e690 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  AND: {.      int
1e6a0 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   d2 = sqlite3Vdb
1e6b0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1e6c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
1e6d0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1e6e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1e6f0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
1e700 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
1e710 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c  2,jumpIfNull^SQL
1e720 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
1e730 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1e740 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
1e750 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
1e760 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
1e770 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
1e780 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
1e790 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
1e7a0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1e7b0 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20  abel(v, d2);.   
1e7c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1e7d0 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
1e7e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e7f0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f   }.    case TK_O
1e800 52 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  R: {.      testc
1e810 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
1e820 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1e830 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
1e840 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1e850 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
1e860 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
1e870 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
1e880 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
1e890 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
1e8a0 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
1e8b0 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
1e8c0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
1e8d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1e8e0 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
1e8f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e900 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
1e910 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  OT: {.      test
1e920 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1e930 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
1e940 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
1e950 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1e960 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
1e970 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
1e980 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1e990 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20  case TK_IS:.    
1e9a0 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20  case TK_ISNOT:. 
1e9b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1e9c0 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20  p==TK_IS );.    
1e9d0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1e9e0 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20  TK_ISNOT );.    
1e9f0 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49    op = (op==TK_I
1ea00 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f  S) ? TK_EQ : TK_
1ea10 4e 45 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49 66  NE;.      jumpIf
1ea20 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55  Null = SQLITE_NU
1ea30 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46  LLEQ;.      /* F
1ea40 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20  all thru */.    
1ea50 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
1ea60 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
1ea70 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
1ea80 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
1ea90 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
1eaa0 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
1eab0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1eac0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1ead0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1eae0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1eaf0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1eb00 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1eb10 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
1eb20 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1eb30 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
1eb40 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
1eb50 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
1eb60 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
1eb70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
1eb80 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
1eb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1eba0 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d  1, r2, dest, jum
1ebb0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1ebc0 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50  assert(TK_LT==OP
1ebd0 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Lt); testcase(o
1ebe0 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43  p==OP_Lt); VdbeC
1ebf0 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
1ec00 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73  OP_Lt);.      as
1ec10 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c  sert(TK_LE==OP_L
1ec20 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
1ec30 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Le); VdbeCov
1ec40 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1ec50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Le);.      asse
1ec60 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29  rt(TK_GT==OP_Gt)
1ec70 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1ec80 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Gt); VdbeCover
1ec90 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
1eca0 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
1ecb0 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20  (TK_GE==OP_Ge); 
1ecc0 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1ecd0 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ge); VdbeCoverag
1ece0 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29  eIf(v,op==OP_Ge)
1ecf0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
1ed00 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65  K_EQ==OP_Eq); te
1ed10 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71  stcase(op==OP_Eq
1ed20 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
1ed30 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
1ed40 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Eq && jumpIfNu
1ed50 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll==SQLITE_NULLE
1ed60 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  Q);.      VdbeCo
1ed70 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
1ed80 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Eq && jumpIfN
1ed90 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull!=SQLITE_NULL
1eda0 45 51 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  EQ);.      asser
1edb0 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b  t(TK_NE==OP_Ne);
1edc0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1edd0 5f 4e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _Ne);.      Vdbe
1ede0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
1edf0 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49  ==OP_Ne && jumpI
1ee00 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55  fNull==SQLITE_NU
1ee10 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62  LLEQ);.      Vdb
1ee20 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
1ee30 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70  p==OP_Ne && jump
1ee40 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e  IfNull!=SQLITE_N
1ee50 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65  ULLEQ);.      te
1ee60 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1ee70 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
1ee80 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
1ee90 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
1eea0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1eeb0 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
1eec0 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
1eed0 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
1eee0 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f  ( TK_ISNULL==OP_
1eef0 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74  IsNull );   test
1ef00 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
1ef10 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ULL );.      ass
1ef20 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d  ert( TK_NOTNULL=
1ef30 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74  =OP_NotNull ); t
1ef40 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1ef50 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  NOTNULL );.     
1ef60 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1ef70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1ef80 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1ef90 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1efa0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1efb0 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64  Op2(v, op, r1, d
1efc0 65 73 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  est);.      Vdbe
1efd0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
1efe0 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20  ==TK_ISNULL);.  
1eff0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1f000 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  If(v, op==TK_NOT
1f010 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73  NULL);.      tes
1f020 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1f030 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
1f040 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1f050 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
1f060 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f070 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1f080 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42  .      exprCodeB
1f090 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70  etween(pParse, p
1f0a0 45 78 70 72 2c 20 64 65 73 74 2c 20 31 2c 20 6a  Expr, dest, 1, j
1f0b0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1f0c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1f0d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1f0e0 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
1f0f0 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
1f100 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61      int destIfFa
1f110 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  lse = sqlite3Vdb
1f120 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1f130 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e       int destIfN
1f140 75 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c  ull = jumpIfNull
1f150 20 3f 20 64 65 73 74 20 3a 20 64 65 73 74 49 66   ? dest : destIf
1f160 46 61 6c 73 65 3b 0a 20 20 20 20 20 20 73 71 6c  False;.      sql
1f170 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70  ite3ExprCodeIN(p
1f180 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
1f190 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49  stIfFalse, destI
1f1a0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
1f1b0 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
1f1c0 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71   dest);.      sq
1f1d0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1f1e0 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46  Label(v, destIfF
1f1f0 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65  alse);.      bre
1f200 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
1f210 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
1f220 20 20 20 20 20 20 69 66 28 20 65 78 70 72 41 6c        if( exprAl
1f230 77 61 79 73 54 72 75 65 28 70 45 78 70 72 29 20  waysTrue(pExpr) 
1f240 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1f250 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65  e3VdbeGoto(v, de
1f260 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st);.      }else
1f270 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 46   if( exprAlwaysF
1f280 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20  alse(pExpr) ){. 
1f290 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20         /* No-op 
1f2a0 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  */.      }else{.
1f2b0 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
1f2c0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1f2d0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1f2e0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1f2f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1f300 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp3(v, OP_If, 
1f310 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  r1, dest, jumpIf
1f320 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20  Null!=0);.      
1f330 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1f340 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1f350 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1f360 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
1f370 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1f380 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ==0 );.      }. 
1f390 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f3a0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  }.  }.  sqlite3R
1f3b0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1f3c0 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b  arse, regFree1);
1f3d0 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
1f3e0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1f3f0 20 72 65 67 46 72 65 65 32 29 3b 20 20 0a 7d 0a   regFree2);  .}.
1f400 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1f410 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65  code for a boole
1f420 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75  an expression su
1f430 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69  ch that a jump i
1f440 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65  s made.** to the
1f450 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66   label "dest" if
1f460 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1f470 69 73 20 66 61 6c 73 65 20 62 75 74 20 65 78 65  is false but exe
1f480 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e  cution.** contin
1f490 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72  ues straight thr
1f4a0 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  u if the express
1f4b0 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a  ion is true..**.
1f4c0 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
1f4d0 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74  sion evaluates t
1f4e0 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20  o NULL (neither 
1f4f0 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 20  true nor false) 
1f500 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20  then.** jump if 
1f510 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 53 51  jumpIfNull is SQ
1f520 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20  LITE_JUMPIFNULL 
1f530 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  or fall through 
1f540 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a  if jumpIfNull.**
1f550 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73   is 0..*/.void s
1f560 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
1f570 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1f580 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
1f590 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70  t dest, int jump
1f5a0 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20  IfNull){.  Vdbe 
1f5b0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1f5c0 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30  be;.  int op = 0
1f5d0 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31  ;.  int regFree1
1f5e0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
1f5f0 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree2 = 0;.  int 
1f600 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72  r1, r2;..  asser
1f610 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  t( jumpIfNull==S
1f620 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
1f630 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   || jumpIfNull==
1f640 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  0 );.  if( NEVER
1f650 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b  (v==0) ) return;
1f660 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66   /* Existence of
1f670 20 56 44 42 45 20 63 68 65 63 6b 65 64 20 62 79   VDBE checked by
1f680 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28   caller */.  if(
1f690 20 70 45 78 70 72 3d 3d 30 20 29 20 20 20 20 72   pExpr==0 )    r
1f6a0 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65  eturn;..  /* The
1f6b0 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70 72 2d   value of pExpr-
1f6c0 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72 65 20 72  >op and op are r
1f6d0 65 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77  elated as follow
1f6e0 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
1f6f0 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20     pExpr->op    
1f700 20 20 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20          op.  ** 
1f710 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20        --------- 
1f720 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d           -------
1f730 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  ---.  **       T
1f740 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20 20 20  K_ISNULL        
1f750 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a    OP_NotNull.  *
1f760 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55  *       TK_NOTNU
1f770 4c 4c 20 20 20 20 20 20 20 20 20 4f 50 5f 49 73  LL         OP_Is
1f780 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20  Null.  **       
1f790 54 4b 5f 4e 45 20 20 20 20 20 20 20 20 20 20 20  TK_NE           
1f7a0 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20     OP_Eq.  **   
1f7b0 20 20 20 20 54 4b 5f 45 51 20 20 20 20 20 20 20      TK_EQ       
1f7c0 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a         OP_Ne.  *
1f7d0 2a 20 20 20 20 20 20 20 54 4b 5f 47 54 20 20 20  *       TK_GT   
1f7e0 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 65             OP_Le
1f7f0 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c  .  **       TK_L
1f800 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  E              O
1f810 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Gt.  **       
1f820 54 4b 5f 47 45 20 20 20 20 20 20 20 20 20 20 20  TK_GE           
1f830 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20     OP_Lt.  **   
1f840 20 20 20 20 54 4b 5f 4c 54 20 20 20 20 20 20 20      TK_LT       
1f850 20 20 20 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a         OP_Ge.  *
1f860 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72  *.  ** For other
1f870 20 76 61 6c 75 65 73 20 6f 66 20 70 45 78 70 72   values of pExpr
1f880 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64 65  ->op, op is unde
1f890 66 69 6e 65 64 20 61 6e 64 20 75 6e 75 73 65 64  fined and unused
1f8a0 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65  ..  ** The value
1f8b0 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20   of TK_ and OP_ 
1f8c0 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20 61 72  constants are ar
1f8d0 72 61 6e 67 65 64 20 73 75 63 68 20 74 68 61 74  ranged such that
1f8e0 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d   we.  ** can com
1f8f0 70 75 74 65 20 74 68 65 20 6d 61 70 70 69 6e 67  pute the mapping
1f900 20 61 62 6f 76 65 20 75 73 69 6e 67 20 74 68 65   above using the
1f910 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65   following expre
1f920 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65  ssion..  ** Asse
1f930 72 74 28 29 73 20 76 65 72 69 66 79 20 74 68 61  rt()s verify tha
1f940 74 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f  t the computatio
1f950 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20  n is correct..  
1f960 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45 78 70  */.  op = ((pExp
1f970 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c  r->op+(TK_ISNULL
1f980 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55  &1))^1)-(TK_ISNU
1f990 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72  LL&1);..  /* Ver
1f9a0 69 66 79 20 63 6f 72 72 65 63 74 20 61 6c 69 67  ify correct alig
1f9b0 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64  nment of TK_ and
1f9c0 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20   OP_ constants. 
1f9d0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45   */.  assert( pE
1f9e0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55  xpr->op!=TK_ISNU
1f9f0 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74  LL || op==OP_Not
1fa00 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Null );.  assert
1fa10 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
1fa20 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f  NOTNULL || op==O
1fa30 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73  P_IsNull );.  as
1fa40 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
1fa50 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_NE || op==OP
1fa60 5f 45 71 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Eq );.  assert(
1fa70 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45   pExpr->op!=TK_E
1fa80 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29  Q || op==OP_Ne )
1fa90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
1faa0 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20  r->op!=TK_LT || 
1fab0 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61  op==OP_Ge );.  a
1fac0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
1fad0 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_LE || op==O
1fae0 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Gt );.  assert
1faf0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
1fb00 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20  GT || op==OP_Le 
1fb10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
1fb20 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c  pr->op!=TK_GE ||
1fb30 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20   op==OP_Lt );.. 
1fb40 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
1fb50 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
1fb60 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 74  K_AND: {.      t
1fb70 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1fb80 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1fb90 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
1fba0 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
1fbb0 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
1fbc0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1fbd0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1fbe0 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
1fbf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1fc00 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
1fc10 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1fc20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1fc30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1fc40 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
1fc50 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rse);.      brea
1fc60 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1fc70 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20  e TK_OR: {.     
1fc80 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65   int d2 = sqlite
1fc90 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1fca0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1fcb0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1fcc0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1fcd0 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
1fce0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1fcf0 2c 20 64 32 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  , d2, jumpIfNull
1fd00 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55  ^SQLITE_JUMPIFNU
1fd10 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  LL);.      sqlit
1fd20 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
1fd30 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
1fd40 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
1fd50 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1fd60 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
1fd70 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1fd80 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1fd90 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29  olveLabel(v, d2)
1fda0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1fdb0 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
1fdc0 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  se);.      break
1fdd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1fde0 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
1fdf0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1fe00 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1fe10 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
1fe20 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
1fe30 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
1fe40 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
1fe50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1fe60 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a      case TK_IS:.
1fe70 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
1fe80 54 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  T:.      testcas
1fe90 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
1fea0 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _IS );.      tes
1feb0 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
1fec0 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20  ==TK_ISNOT );.  
1fed0 20 20 20 20 6f 70 20 3d 20 28 70 45 78 70 72 2d      op = (pExpr-
1fee0 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b  >op==TK_IS) ? TK
1fef0 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a 20 20 20  _NE : TK_EQ;.   
1ff00 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20     jumpIfNull = 
1ff10 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20  SQLITE_NULLEQ;. 
1ff20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
1ff30 75 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  u */.    case TK
1ff40 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LT:.    case TK
1ff50 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LE:.    case TK
1ff60 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GT:.    case TK
1ff70 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GE:.    case TK
1ff80 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _NE:.    case TK
1ff90 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  _EQ: {.      tes
1ffa0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
1ffb0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31  l==0 );.      r1
1ffc0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1ffd0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1ffe0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1fff0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
20000 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
20010 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
20020 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
20030 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
20040 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
20050 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
20060 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
20070 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
20080 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
20090 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
200a0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
200b0 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74  TK_LT==OP_Lt); t
200c0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
200d0 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
200e0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  If(v,op==OP_Lt);
200f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
20100 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73  _LE==OP_Le); tes
20110 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29  tcase(op==OP_Le)
20120 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
20130 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20  (v,op==OP_Le);. 
20140 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
20150 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63  T==OP_Gt); testc
20160 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20  ase(op==OP_Gt); 
20170 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
20180 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20  ,op==OP_Gt);.   
20190 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d     assert(TK_GE=
201a0 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73  =OP_Ge); testcas
201b0 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64  e(op==OP_Ge); Vd
201c0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
201d0 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20  p==OP_Ge);.     
201e0 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f   assert(TK_EQ==O
201f0 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65 28  P_Eq); testcase(
20200 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20  op==OP_Eq);.    
20210 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
20220 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26  (v, op==OP_Eq &&
20230 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c   jumpIfNull!=SQL
20240 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
20250 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
20260 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26  f(v, op==OP_Eq &
20270 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  & jumpIfNull==SQ
20280 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
20290 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45      assert(TK_NE
202a0 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61  ==OP_Ne); testca
202b0 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20  se(op==OP_Ne);. 
202c0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
202d0 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65  eIf(v, op==OP_Ne
202e0 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
202f0 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
20300 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
20310 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e  geIf(v, op==OP_N
20320 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  e && jumpIfNull=
20330 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
20340 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
20350 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
20360 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20370 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
20380 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20390 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
203a0 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
203b0 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
203c0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
203d0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
203e0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
203f0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
20400 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20410 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c  ddOp2(v, op, r1,
20420 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65   dest);.      te
20430 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
20440 53 4e 55 4c 4c 20 29 3b 20 20 20 56 64 62 65 43  SNULL );   VdbeC
20450 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
20460 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20  =TK_ISNULL);.   
20470 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
20480 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 20 20  =TK_NOTNULL );  
20490 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
204a0 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  , op==TK_NOTNULL
204b0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
204c0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
204d0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
204e0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
204f0 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
20500 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
20510 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
20520 20 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65     exprCodeBetwe
20530 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  en(pParse, pExpr
20540 2c 20 64 65 73 74 2c 20 30 2c 20 6a 75 6d 70 49  , dest, 0, jumpI
20550 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
20560 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
20570 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
20580 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
20590 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
205a0 69 66 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 29  if( jumpIfNull )
205b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
205c0 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72  3ExprCodeIN(pPar
205d0 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c  se, pExpr, dest,
205e0 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65   dest);.      }e
205f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
20600 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71   destIfNull = sq
20610 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
20620 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  el(v);.        s
20630 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
20640 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
20650 64 65 73 74 2c 20 64 65 73 74 49 66 4e 75 6c 6c  dest, destIfNull
20660 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
20670 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
20680 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c  el(v, destIfNull
20690 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
206a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
206b0 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
206c0 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 65 78  : {.      if( ex
206d0 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45  prAlwaysFalse(pE
206e0 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
206f0 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
20700 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  v, dest);.      
20710 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c  }else if( exprAl
20720 77 61 79 73 54 72 75 65 28 70 45 78 70 72 29 20  waysTrue(pExpr) 
20730 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f  ){.        /* no
20740 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c  -op */.      }el
20750 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d  se{.        r1 =
20760 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
20770 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
20780 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  pr, &regFree1);.
20790 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
207a0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
207b0 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c  IfNot, r1, dest,
207c0 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b   jumpIfNull!=0);
207d0 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
207e0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
207f0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
20800 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
20810 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
20820 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
20830 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
20840 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  k;.    }.  }.  s
20850 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
20860 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
20870 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65  Free1);.  sqlite
20880 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
20890 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32  pParse, regFree2
208a0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65  );.}../*.** Like
208b0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
208c0 6c 73 65 28 29 20 65 78 63 65 70 74 20 74 68 61  lse() except tha
208d0 74 20 61 20 63 6f 70 79 20 69 73 20 6d 61 64 65  t a copy is made
208e0 20 6f 66 20 70 45 78 70 72 20 62 65 66 6f 72 65   of pExpr before
208f0 0a 2a 2a 20 63 6f 64 65 20 67 65 6e 65 72 61 74  .** code generat
20900 69 6f 6e 2c 20 61 6e 64 20 74 68 61 74 20 63 6f  ion, and that co
20910 70 79 20 69 73 20 64 65 6c 65 74 65 64 20 61 66  py is deleted af
20920 74 65 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74  ter code generat
20930 69 6f 6e 2e 20 54 68 69 73 0a 2a 2a 20 65 6e 73  ion. This.** ens
20940 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6f 72  ures that the or
20950 69 67 69 6e 61 6c 20 70 45 78 70 72 20 69 73 20  iginal pExpr is 
20960 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f  unchanged..*/.vo
20970 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  id sqlite3ExprIf
20980 46 61 6c 73 65 44 75 70 28 50 61 72 73 65 20 2a  FalseDup(Parse *
20990 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
209a0 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 69 6e  xpr, int dest,in
209b0 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
209c0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
209d0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70  Parse->db;.  Exp
209e0 72 20 2a 70 43 6f 70 79 20 3d 20 73 71 6c 69 74  r *pCopy = sqlit
209f0 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45  e3ExprDup(db, pE
20a00 78 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 64  xpr, 0);.  if( d
20a10 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
20a20 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
20a30 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
20a40 72 73 65 2c 20 70 43 6f 70 79 2c 20 64 65 73 74  rse, pCopy, dest
20a50 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
20a60 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
20a70 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 70 79  Delete(db, pCopy
20a80 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  );.}.../*.** Do 
20a90 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f  a deep compariso
20aa0 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73  n of two express
20ab0 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75  ion trees.  Retu
20ac0 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 0a  rn 0 if the two.
20ad0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  ** expressions a
20ae0 72 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69 64  re completely id
20af0 65 6e 74 69 63 61 6c 2e 20 20 52 65 74 75 72 6e  entical.  Return
20b00 20 31 20 69 66 20 74 68 65 79 20 64 69 66 66 65   1 if they diffe
20b10 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20 43  r only.** by a C
20b20 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20  OLLATE operator 
20b30 61 74 20 74 68 65 20 74 6f 70 20 6c 65 76 65 6c  at the top level
20b40 2e 20 20 52 65 74 75 72 6e 20 32 20 69 66 20 74  .  Return 2 if t
20b50 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65  here are differe
20b60 6e 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74 68  nces.** other th
20b70 61 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  an the top-level
20b80 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
20b90 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20  r..**.** If any 
20ba0 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42  subelement of pB
20bb0 20 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65   has Expr.iTable
20bc0 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69  ==(-1) then it i
20bd0 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
20be0 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f  compare equal to
20bf0 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65   an equivalent e
20c00 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74  lement in pA wit
20c10 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69  h Expr.iTable==i
20c20 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  Tab..**.** The p
20c30 41 20 73 69 64 65 20 6d 69 67 68 74 20 62 65 20  A side might be 
20c40 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45  using TK_REGISTE
20c50 52 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74  R.  If that is t
20c60 68 65 20 63 61 73 65 20 61 6e 64 20 70 42 20 69  he case and pB i
20c70 73 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e 67 20 54  s.** not using T
20c80 4b 5f 52 45 47 49 53 54 45 52 20 62 75 74 20 69  K_REGISTER but i
20c90 73 20 6f 74 68 65 72 77 69 73 65 20 65 71 75 69  s otherwise equi
20ca0 76 61 6c 65 6e 74 2c 20 74 68 65 6e 20 73 74 69  valent, then sti
20cb0 6c 6c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a  ll return 0..**.
20cc0 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69  ** Sometimes thi
20cd0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
20ce0 65 74 75 72 6e 20 32 20 65 76 65 6e 20 69 66 20  eturn 2 even if 
20cf0 74 68 65 20 74 77 6f 20 65 78 70 72 65 73 73 69  the two expressi
20d00 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72  ons.** really ar
20d10 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 49  e equivalent.  I
20d20 66 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76  f we cannot prov
20d30 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65  e that the expre
20d40 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64  ssions are.** id
20d50 65 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74 75  entical, we retu
20d60 72 6e 20 32 20 6a 75 73 74 20 74 6f 20 62 65 20  rn 2 just to be 
20d70 73 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68 69  safe.  So if thi
20d80 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
20d90 75 72 6e 73 20 32 2c 20 74 68 65 6e 20 79 6f 75  urns 2, then you
20da0 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b   do not really k
20db0 6e 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e 20  now for certain 
20dc0 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78  if the two.** ex
20dd0 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68  pressions are th
20de0 65 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66 20  e same.  But if 
20df0 79 6f 75 20 67 65 74 20 61 20 30 20 6f 72 20 31  you get a 0 or 1
20e00 20 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f   return, then yo
20e10 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72 65  u.** can be sure
20e20 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
20e30 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20   are the same.  
20e40 49 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77 68  In the places wh
20e50 65 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ere.** this rout
20e60 69 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74 20  ine is used, it 
20e70 64 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74 6f  does not hurt to
20e80 20 67 65 74 20 61 6e 20 65 78 74 72 61 20 32 20   get an extra 2 
20e90 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d  - that.** just m
20ea0 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 73  ight result in s
20eb0 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f  ome slightly slo
20ec0 77 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20 72  wer code.  But r
20ed0 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69  eturning.** an i
20ee0 6e 63 6f 72 72 65 63 74 20 30 20 6f 72 20 31 20  ncorrect 0 or 1 
20ef0 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20  could lead to a 
20f00 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  malfunction..*/.
20f10 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
20f20 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41 2c  ompare(Expr *pA,
20f30 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74 20 69   Expr *pB, int i
20f40 54 61 62 29 7b 0a 20 20 75 33 32 20 63 6f 6d 62  Tab){.  u32 comb
20f50 69 6e 65 64 46 6c 61 67 73 3b 0a 20 20 69 66 28  inedFlags;.  if(
20f60 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20   pA==0 || pB==0 
20f70 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42  ){.    return pB
20f80 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a 20 20  ==pA ? 0 : 2;.  
20f90 7d 0a 20 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67  }.  combinedFlag
20fa0 73 20 3d 20 70 41 2d 3e 66 6c 61 67 73 20 7c 20  s = pA->flags | 
20fb0 70 42 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28  pB->flags;.  if(
20fc0 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26   combinedFlags &
20fd0 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a   EP_IntValue ){.
20fe0 20 20 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61      if( (pA->fla
20ff0 67 73 26 70 42 2d 3e 66 6c 61 67 73 26 45 50 5f  gs&pB->flags&EP_
21000 49 6e 74 56 61 6c 75 65 29 21 3d 30 20 26 26 20  IntValue)!=0 && 
21010 70 41 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d 70 42  pA->u.iValue==pB
21020 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20 20  ->u.iValue ){.  
21030 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
21040 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32    }.    return 2
21050 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e  ;.  }.  if( pA->
21060 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 7b 0a 20 20  op!=pB->op ){.  
21070 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b    if( pA->op==TK
21080 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69  _COLLATE && sqli
21090 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
210a0 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2c 20 69 54  A->pLeft, pB, iT
210b0 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72  ab)<2 ){.      r
210c0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
210d0 20 20 20 69 66 28 20 70 42 2d 3e 6f 70 3d 3d 54     if( pB->op==T
210e0 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c  K_COLLATE && sql
210f0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
21100 70 41 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69  pA, pB->pLeft, i
21110 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20  Tab)<2 ){.      
21120 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
21130 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20      return 2;.  
21140 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d  }.  if( pA->op!=
21150 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d  TK_COLUMN && pA-
21160 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op!=TK_AGG_COLU
21170 4d 4e 20 26 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b  MN && pA->u.zTok
21180 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41  en ){.    if( pA
21190 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op==TK_FUNCTIO
211a0 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  N ){.      if( s
211b0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 41  qlite3StrICmp(pA
211c0 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75  ->u.zToken,pB->u
211d0 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 20 72 65  .zToken)!=0 ) re
211e0 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 65 6c 73  turn 2;.    }els
211f0 65 20 69 66 28 20 73 74 72 63 6d 70 28 70 41 2d  e if( strcmp(pA-
21200 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e  >u.zToken,pB->u.
21210 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20  zToken)!=0 ){.  
21220 20 20 20 20 72 65 74 75 72 6e 20 70 41 2d 3e 6f      return pA->o
21230 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 3f 20  p==TK_COLLATE ? 
21240 31 20 3a 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  1 : 2;.    }.  }
21250 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67  .  if( (pA->flag
21260 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29  s & EP_Distinct)
21270 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45  !=(pB->flags & E
21280 50 5f 44 69 73 74 69 6e 63 74 29 20 29 20 72 65  P_Distinct) ) re
21290 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 41 4c  turn 2;.  if( AL
212a0 57 41 59 53 28 28 63 6f 6d 62 69 6e 65 64 46 6c  WAYS((combinedFl
212b0 61 67 73 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ags & EP_TokenOn
212c0 6c 79 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 69  ly)==0) ){.    i
212d0 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  f( combinedFlags
212e0 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20   & EP_xIsSelect 
212f0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
21300 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
21310 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74  ompare(pA->pLeft
21320 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61  , pB->pLeft, iTa
21330 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  b) ) return 2;. 
21340 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
21350 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52  prCompare(pA->pR
21360 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74  ight, pB->pRight
21370 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e  , iTab) ) return
21380 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   2;.    if( sqli
21390 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
213a0 72 65 28 70 41 2d 3e 78 2e 70 4c 69 73 74 2c 20  re(pA->x.pList, 
213b0 70 42 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61  pB->x.pList, iTa
213c0 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  b) ) return 2;. 
213d0 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 28 63     if( ALWAYS((c
213e0 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45  ombinedFlags & E
213f0 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 29 20 26  P_Reduced)==0) &
21400 26 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52  & pA->op!=TK_STR
21410 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ING ){.      if(
21420 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42   pA->iColumn!=pB
21430 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75  ->iColumn ) retu
21440 72 6e 20 32 3b 0a 20 20 20 20 20 20 69 66 28 20  rn 2;.      if( 
21450 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e  pA->iTable!=pB->
21460 69 54 61 62 6c 65 20 0a 20 20 20 20 20 20 20 26  iTable .       &
21470 26 20 28 70 41 2d 3e 69 54 61 62 6c 65 21 3d 69  & (pA->iTable!=i
21480 54 61 62 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d  Tab || NEVER(pB-
21490 3e 69 54 61 62 6c 65 3e 3d 30 29 29 20 29 20 72  >iTable>=0)) ) r
214a0 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20  eturn 2;.    }. 
214b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
214c0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
214d0 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a  two ExprList obj
214e0 65 63 74 73 2e 20 20 52 65 74 75 72 6e 20 30 20  ects.  Return 0 
214f0 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65 6e  if they are iden
21500 74 69 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f  tical and .** no
21510 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 79 20 64  n-zero if they d
21520 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79  iffer in any way
21530 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73  ..**.** If any s
21540 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20  ubelement of pB 
21550 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d  has Expr.iTable=
21560 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73  =(-1) then it is
21570 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63   allowed.** to c
21580 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20  ompare equal to 
21590 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c  an equivalent el
215a0 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68  ement in pA with
215b0 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54   Expr.iTable==iT
215c0 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ab..**.** This r
215d0 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 74  outine might ret
215e0 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72  urn non-zero for
215f0 20 65 71 75 69 76 61 6c 65 6e 74 20 45 78 70 72   equivalent Expr
21600 4c 69 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f  Lists.  The.** o
21610 6e 6c 79 20 63 6f 6e 73 65 71 75 65 6e 63 65 20  nly consequence 
21620 77 69 6c 6c 20 62 65 20 64 69 73 61 62 6c 65 64  will be disabled
21630 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20   optimizations. 
21640 20 42 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e   But this routin
21650 65 0a 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72 20  e.** must never 
21660 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20  return 0 if the 
21670 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a  two ExprList obj
21680 65 63 74 73 20 61 72 65 20 64 69 66 66 65 72 65  ects are differe
21690 6e 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66  nt, or.** a malf
216a0 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73  unction will res
216b0 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e  ult..**.** Two N
216c0 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20 61 72 65  ULL pointers are
216d0 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
216e0 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74  e the same.  But
216f0 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a   a NULL pointer.
21700 2a 2a 20 61 6c 77 61 79 73 20 64 69 66 66 65 72  ** always differ
21710 73 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c  s from a non-NUL
21720 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e  L pointer..*/.in
21730 74 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  t sqlite3ExprLis
21740 74 43 6f 6d 70 61 72 65 28 45 78 70 72 4c 69 73  tCompare(ExprLis
21750 74 20 2a 70 41 2c 20 45 78 70 72 4c 69 73 74 20  t *pA, ExprList 
21760 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a  *pB, int iTab){.
21770 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
21780 41 3d 3d 30 20 26 26 20 70 42 3d 3d 30 20 29 20  A==0 && pB==0 ) 
21790 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
217a0 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29  pA==0 || pB==0 )
217b0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
217c0 20 70 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e   pA->nExpr!=pB->
217d0 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e 20 31  nExpr ) return 1
217e0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
217f0 41 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  A->nExpr; i++){.
21800 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 41      Expr *pExprA
21810 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70   = pA->a[i].pExp
21820 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  r;.    Expr *pEx
21830 70 72 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70  prB = pB->a[i].p
21840 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 41  Expr;.    if( pA
21850 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
21860 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  !=pB->a[i].sortO
21870 72 64 65 72 20 29 20 72 65 74 75 72 6e 20 31 3b  rder ) return 1;
21880 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
21890 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78 70  ExprCompare(pExp
218a0 72 41 2c 20 70 45 78 70 72 42 2c 20 69 54 61 62  rA, pExprB, iTab
218b0 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
218c0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
218d0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
218e0 75 65 20 69 66 20 77 65 20 63 61 6e 20 70 72 6f  ue if we can pro
218f0 76 65 20 74 68 65 20 70 45 32 20 77 69 6c 6c 20  ve the pE2 will 
21900 61 6c 77 61 79 73 20 62 65 20 74 72 75 65 20 69  always be true i
21910 66 20 70 45 31 20 69 73 0a 2a 2a 20 74 72 75 65  f pE1 is.** true
21920 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20  .  Return false 
21930 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d  if we cannot com
21940 70 6c 65 74 65 20 74 68 65 20 70 72 6f 6f 66 20  plete the proof 
21950 6f 72 20 69 66 20 70 45 32 20 6d 69 67 68 74 0a  or if pE2 might.
21960 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20 20 45 78  ** be false.  Ex
21970 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  amples:.**.**   
21980 20 20 70 45 31 3a 20 78 3d 3d 35 20 20 20 20 20    pE1: x==5     
21990 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20    pE2: x==5     
219a0 20 20 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20          Result: 
219b0 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a  true.**     pE1:
219c0 20 78 3e 30 20 20 20 20 20 20 20 20 70 45 32 3a   x>0        pE2:
219d0 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20   x==5           
219e0 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a    Result: false.
219f0 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 32 31  **     pE1: x=21
21a00 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d 32 31         pE2: x=21
21a10 20 4f 52 20 79 3d 34 33 20 20 20 20 20 52 65 73   OR y=43     Res
21a20 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20  ult: true.**    
21a30 20 70 45 31 3a 20 78 21 3d 31 32 33 20 20 20 20   pE1: x!=123    
21a40 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e   pE2: x IS NOT N
21a50 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74  ULL    Result: t
21a60 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  rue.**     pE1: 
21a70 78 21 3d 3f 31 20 20 20 20 20 20 70 45 32 3a 20  x!=?1      pE2: 
21a80 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20  x IS NOT NULL   
21a90 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a   Result: true.**
21aa0 20 20 20 20 20 70 45 31 3a 20 78 20 49 53 20 4e       pE1: x IS N
21ab0 55 4c 4c 20 20 70 45 32 3a 20 78 20 49 53 20 4e  ULL  pE2: x IS N
21ac0 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c  OT NULL    Resul
21ad0 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20  t: false.**     
21ae0 70 45 31 3a 20 78 20 49 53 20 3f 32 20 20 20 20  pE1: x IS ?2    
21af0 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55  pE2: x IS NOT NU
21b00 4c 4c 20 20 20 20 52 65 75 73 6c 74 3a 20 66 61  LL    Reuslt: fa
21b10 6c 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63  lse.**.** When c
21b20 6f 6d 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55  omparing TK_COLU
21b30 4d 4e 20 6e 6f 64 65 73 20 62 65 74 77 65 65 6e  MN nodes between
21b40 20 70 45 31 20 61 6e 64 20 70 45 32 2c 20 69 66   pE1 and pE2, if
21b50 20 70 45 32 20 68 61 73 0a 2a 2a 20 45 78 70 72   pE2 has.** Expr
21b60 2e 69 54 61 62 6c 65 3c 30 20 74 68 65 6e 20 61  .iTable<0 then a
21b70 73 73 75 6d 65 20 61 20 74 61 62 6c 65 20 6e 75  ssume a table nu
21b80 6d 62 65 72 20 67 69 76 65 6e 20 62 79 20 69 54  mber given by iT
21b90 61 62 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 69  ab..**.** When i
21ba0 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 20  n doubt, return 
21bb0 66 61 6c 73 65 2e 20 20 52 65 74 75 72 6e 69 6e  false.  Returnin
21bc0 67 20 74 72 75 65 20 6d 69 67 68 74 20 67 69 76  g true might giv
21bd0 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a  e a performance.
21be0 2a 2a 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e 20  ** improvement. 
21bf0 20 52 65 74 75 72 6e 69 6e 67 20 66 61 6c 73 65   Returning false
21c00 20 6d 69 67 68 74 20 63 61 75 73 65 20 61 20 70   might cause a p
21c10 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63  erformance reduc
21c20 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69 74 20  tion, but.** it 
21c30 77 69 6c 6c 20 61 6c 77 61 79 73 20 67 69 76 65  will always give
21c40 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73   the correct ans
21c50 77 65 72 20 61 6e 64 20 69 73 20 68 65 6e 63 65  wer and is hence
21c60 20 61 6c 77 61 79 73 20 73 61 66 65 2e 0a 2a 2f   always safe..*/
21c70 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
21c80 49 6d 70 6c 69 65 73 45 78 70 72 28 45 78 70 72  ImpliesExpr(Expr
21c90 20 2a 70 45 31 2c 20 45 78 70 72 20 2a 70 45 32   *pE1, Expr *pE2
21ca0 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69  , int iTab){.  i
21cb0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
21cc0 6d 70 61 72 65 28 70 45 31 2c 20 70 45 32 2c 20  mpare(pE1, pE2, 
21cd0 69 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20  iTab)==0 ){.    
21ce0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
21cf0 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f  if( pE2->op==TK_
21d00 4f 52 0a 20 20 20 26 26 20 28 73 71 6c 69 74 65  OR.   && (sqlite
21d10 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72  3ExprImpliesExpr
21d20 28 70 45 31 2c 20 70 45 32 2d 3e 70 4c 65 66 74  (pE1, pE2->pLeft
21d30 2c 20 69 54 61 62 29 0a 20 20 20 20 20 20 20 20  , iTab).        
21d40 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 45       || sqlite3E
21d50 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70  xprImpliesExpr(p
21d60 45 31 2c 20 70 45 32 2d 3e 70 52 69 67 68 74 2c  E1, pE2->pRight,
21d70 20 69 54 61 62 29 20 29 0a 20 20 29 7b 0a 20 20   iTab) ).  ){.  
21d80 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
21d90 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54    if( pE2->op==T
21da0 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20  K_NOTNULL.   && 
21db0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
21dc0 72 65 28 70 45 31 2d 3e 70 4c 65 66 74 2c 20 70  re(pE1->pLeft, p
21dd0 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29  E2->pLeft, iTab)
21de0 3d 3d 30 0a 20 20 20 26 26 20 28 70 45 31 2d 3e  ==0.   && (pE1->
21df0 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26 26  op!=TK_ISNULL &&
21e00 20 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 29   pE1->op!=TK_IS)
21e10 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
21e20 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
21e30 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20   0;.}../*.** An 
21e40 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
21e50 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
21e60 75 72 65 20 69 73 20 75 73 65 64 20 62 79 20 74  ure is used by t
21e70 68 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a  he tree walker.*
21e80 2a 20 74 6f 20 63 6f 75 6e 74 20 72 65 66 65 72  * to count refer
21e90 65 6e 63 65 73 20 74 6f 20 74 61 62 6c 65 20 63  ences to table c
21ea0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 61 72  olumns in the ar
21eb0 67 75 6d 65 6e 74 73 20 6f 66 20 61 6e 20 0a 2a  guments of an .*
21ec0 2a 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  * aggregate func
21ed0 74 69 6f 6e 2c 20 69 6e 20 6f 72 64 65 72 20 74  tion, in order t
21ee0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a  o implement the.
21ef0 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69  ** sqlite3Functi
21f00 6f 6e 54 68 69 73 53 72 63 28 29 20 72 6f 75 74  onThisSrc() rout
21f10 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53  ine..*/.struct S
21f20 72 63 43 6f 75 6e 74 20 7b 0a 20 20 53 72 63 4c  rcCount {.  SrcL
21f30 69 73 74 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20  ist *pSrc;   /* 
21f40 4f 6e 65 20 70 61 72 74 69 63 75 6c 61 72 20 46  One particular F
21f50 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 61 20  ROM clause in a 
21f60 6e 65 73 74 65 64 20 71 75 65 72 79 20 2a 2f 0a  nested query */.
21f70 20 20 69 6e 74 20 6e 54 68 69 73 3b 20 20 20 20    int nThis;    
21f80 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
21f90 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f  references to co
21fa0 6c 75 6d 6e 73 20 69 6e 20 70 53 72 63 4c 69 73  lumns in pSrcLis
21fb0 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74 68 65  t */.  int nOthe
21fc0 72 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  r;      /* Numbe
21fd0 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
21fe0 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74  to columns in ot
21ff0 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 73  her FROM clauses
22000 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f   */.};../*.** Co
22010 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
22020 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
22030 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74  columns..*/.stat
22040 69 63 20 69 6e 74 20 65 78 70 72 53 72 63 43 6f  ic int exprSrcCo
22050 75 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  unt(Walker *pWal
22060 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
22070 29 7b 0a 20 20 2f 2a 20 54 68 65 20 4e 45 56 45  ){.  /* The NEVE
22080 52 28 29 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e  R() on the secon
22090 64 20 74 65 72 6d 20 69 73 20 62 65 63 61 75 73  d term is becaus
220a0 65 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f  e sqlite3Functio
220b0 6e 55 73 65 73 54 68 69 73 53 72 63 28 29 0a 20  nUsesThisSrc(). 
220c0 20 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 63 61   ** is always ca
220d0 6c 6c 65 64 20 62 65 66 6f 72 65 20 73 71 6c 69  lled before sqli
220e0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
220f0 67 72 65 67 61 74 65 73 28 29 20 61 6e 64 20 73  gregates() and s
22100 6f 20 74 68 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f  o the.  ** TK_CO
22110 4c 55 4d 4e 73 20 68 61 76 65 20 6e 6f 74 20 79  LUMNs have not y
22120 65 74 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65  et been converte
22130 64 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f  d into TK_AGG_CO
22140 4c 55 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a 20 73  LUMN.  If.  ** s
22150 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73  qlite3FunctionUs
22160 65 73 54 68 69 73 53 72 63 28 29 20 69 73 20 75  esThisSrc() is u
22170 73 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  sed differently 
22180 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74  in the future, t
22190 68 65 0a 20 20 2a 2a 20 4e 45 56 45 52 28 29 20  he.  ** NEVER() 
221a0 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20  will need to be 
221b0 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66  removed. */.  if
221c0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
221d0 43 4f 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45 52 28  COLUMN || NEVER(
221e0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
221f0 47 5f 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20 20  G_COLUMN) ){.   
22200 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75   int i;.    stru
22210 63 74 20 53 72 63 43 6f 75 6e 74 20 2a 70 20 3d  ct SrcCount *p =
22220 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 72 63   pWalker->u.pSrc
22230 43 6f 75 6e 74 3b 0a 20 20 20 20 53 72 63 4c 69  Count;.    SrcLi
22240 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53  st *pSrc = p->pS
22250 72 63 3b 0a 20 20 20 20 69 6e 74 20 6e 53 72 63  rc;.    int nSrc
22260 20 3d 20 70 53 72 63 20 3f 20 70 53 72 63 2d 3e   = pSrc ? pSrc->
22270 6e 53 72 63 20 3a 20 30 3b 0a 20 20 20 20 66 6f  nSrc : 0;.    fo
22280 72 28 69 3d 30 3b 20 69 3c 6e 53 72 63 3b 20 69  r(i=0; i<nSrc; i
22290 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
222a0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53  Expr->iTable==pS
222b0 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  rc->a[i].iCursor
222c0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
222d0 20 20 20 20 69 66 28 20 69 3c 6e 53 72 63 20 29      if( i<nSrc )
222e0 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 54 68 69 73  {.      p->nThis
222f0 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ++;.    }else{. 
22300 20 20 20 20 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b       p->nOther++
22310 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
22320 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
22330 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65  e;.}../*.** Dete
22340 72 6d 69 6e 65 20 69 66 20 61 6e 79 20 6f 66 20  rmine if any of 
22350 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  the arguments to
22360 20 74 68 65 20 70 45 78 70 72 20 46 75 6e 63 74   the pExpr Funct
22370 69 6f 6e 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a  ion reference.**
22380 20 70 53 72 63 4c 69 73 74 2e 20 20 52 65 74 75   pSrcList.  Retu
22390 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 79 20  rn true if they 
223a0 64 6f 2e 20 20 41 6c 73 6f 20 72 65 74 75 72 6e  do.  Also return
223b0 20 74 72 75 65 20 69 66 20 74 68 65 20 66 75 6e   true if the fun
223c0 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20  ction.** has no 
223d0 61 72 67 75 6d 65 6e 74 73 20 6f 72 20 68 61 73  arguments or has
223e0 20 6f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20 61   only constant a
223f0 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72  rguments.  Retur
22400 6e 20 66 61 6c 73 65 20 69 66 20 70 45 78 70 72  n false if pExpr
22410 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 63  .** references c
22420 6f 6c 75 6d 6e 73 20 62 75 74 20 6e 6f 74 20 63  olumns but not c
22430 6f 6c 75 6d 6e 73 20 6f 66 20 74 61 62 6c 65 73  olumns of tables
22440 20 66 6f 75 6e 64 20 69 6e 20 70 53 72 63 4c 69   found in pSrcLi
22450 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  st..*/.int sqlit
22460 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68  e3FunctionUsesTh
22470 69 73 53 72 63 28 45 78 70 72 20 2a 70 45 78 70  isSrc(Expr *pExp
22480 72 2c 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  r, SrcList *pSrc
22490 4c 69 73 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20  List){.  Walker 
224a0 77 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 43  w;.  struct SrcC
224b0 6f 75 6e 74 20 63 6e 74 3b 0a 20 20 61 73 73 65  ount cnt;.  asse
224c0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
224d0 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
224e0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30  ;.  memset(&w, 0
224f0 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20  , sizeof(w));.  
22500 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
22510 3d 20 65 78 70 72 53 72 63 43 6f 75 6e 74 3b 0a  = exprSrcCount;.
22520 20 20 77 2e 75 2e 70 53 72 63 43 6f 75 6e 74 20    w.u.pSrcCount 
22530 3d 20 26 63 6e 74 3b 0a 20 20 63 6e 74 2e 70 53  = &cnt;.  cnt.pS
22540 72 63 20 3d 20 70 53 72 63 4c 69 73 74 3b 0a 20  rc = pSrcList;. 
22550 20 63 6e 74 2e 6e 54 68 69 73 20 3d 20 30 3b 0a   cnt.nThis = 0;.
22560 20 20 63 6e 74 2e 6e 4f 74 68 65 72 20 3d 20 30    cnt.nOther = 0
22570 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
22580 78 70 72 4c 69 73 74 28 26 77 2c 20 70 45 78 70  xprList(&w, pExp
22590 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 72  r->x.pList);.  r
225a0 65 74 75 72 6e 20 63 6e 74 2e 6e 54 68 69 73 3e  eturn cnt.nThis>
225b0 30 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68 65 72 3d  0 || cnt.nOther=
225c0 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  =0;.}../*.** Add
225d0 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
225e0 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e  o the pAggInfo->
225f0 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52  aCol[] array.  R
22600 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
22610 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c  of.** the new el
22620 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61  ement.  Return a
22630 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
22640 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
22650 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22660 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e  addAggInfoColumn
22670 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67  (sqlite3 *db, Ag
22680 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20  gInfo *pInfo){. 
22690 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d   int i;.  pInfo-
226a0 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 41  >aCol = sqlite3A
226b0 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20  rrayAllocate(.  
226c0 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20 20       db,.       
226d0 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20  pInfo->aCol,.   
226e0 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f      sizeof(pInfo
226f0 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20  ->aCol[0]),.    
22700 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75     &pInfo->nColu
22710 6d 6e 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20  mn,.       &i.  
22720 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  );.  return i;.}
22730 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20      ../*.** Add 
22740 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
22750 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61   the pAggInfo->a
22760 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20 52  Func[] array.  R
22770 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
22780 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c  of.** the new el
22790 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61  ement.  Return a
227a0 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
227b0 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
227c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
227d0 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 73  addAggInfoFunc(s
227e0 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49  qlite3 *db, AggI
227f0 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69  nfo *pInfo){.  i
22800 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61  nt i;.  pInfo->a
22810 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 41 72  Func = sqlite3Ar
22820 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20  rayAllocate(.   
22830 20 20 20 20 64 62 2c 20 0a 20 20 20 20 20 20 20      db, .       
22840 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20  pInfo->aFunc,.  
22850 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66       sizeof(pInf
22860 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20  o->aFunc[0]),.  
22870 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75       &pInfo->nFu
22880 6e 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20  nc,.       &i.  
22890 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  );.  return i;.}
228a0 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73      ../*.** This
228b0 20 69 73 20 74 68 65 20 78 45 78 70 72 43 61 6c   is the xExprCal
228c0 6c 62 61 63 6b 20 66 6f 72 20 61 20 74 72 65 65  lback for a tree
228d0 20 77 61 6c 6b 65 72 2e 20 20 49 74 20 69 73 20   walker.  It is 
228e0 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65  used to.** imple
228f0 6d 65 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  ment sqlite3Expr
22900 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
22910 73 28 29 2e 20 20 53 65 65 20 73 71 6c 69 74 65  s().  See sqlite
22920 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
22930 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64  egates.** for ad
22940 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
22950 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
22960 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  int analyzeAggre
22970 67 61 74 65 28 57 61 6c 6b 65 72 20 2a 70 57 61  gate(Walker *pWa
22980 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
22990 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e  r){.  int i;.  N
229a0 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20  ameContext *pNC 
229b0 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43  = pWalker->u.pNC
229c0 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  ;.  Parse *pPars
229d0 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
229e0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
229f0 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63  List = pNC->pSrc
22a00 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20  List;.  AggInfo 
22a10 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d  *pAggInfo = pNC-
22a20 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 73 77  >pAggInfo;..  sw
22a30 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
22a40 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
22a50 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63  GG_COLUMN:.    c
22a60 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
22a70 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
22a80 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
22a90 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  GG_COLUMN );.   
22aa0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
22ab0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
22ac0 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68  N );.      /* Ch
22ad0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
22ae0 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f  e column is in o
22af0 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73  ne of the tables
22b00 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20   in the FROM.   
22b10 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20     ** clause of 
22b20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75  the aggregate qu
22b30 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ery */.      if(
22b40 20 41 4c 57 41 59 53 28 70 53 72 63 4c 69 73 74   ALWAYS(pSrcList
22b50 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=0) ){.        
22b60 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
22b70 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72  tem *pItem = pSr
22b80 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  cList->a;.      
22b90 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
22ba0 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  cList->nSrc; i++
22bb0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
22bc0 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
22bd0 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a  Info_col *pCol;.
22be0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
22bf0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
22c00 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b  ty(pExpr, EP_Tok
22c10 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
22c20 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  d) );.          
22c30 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  if( pExpr->iTabl
22c40 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  e==pItem->iCurso
22c50 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r ){.           
22c60 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
22c70 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d  this point, it m
22c80 65 61 6e 73 20 74 68 61 74 20 70 45 78 70 72 20  eans that pExpr 
22c90 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c  refers to a tabl
22ca0 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
22cb0 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20   that is in the 
22cc0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
22cd0 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65  he aggregate que
22ce0 72 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20  ry.  .          
22cf0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20    **.           
22d00 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72   ** Make an entr
22d10 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  y for the column
22d20 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   in pAggInfo->aC
22d30 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20  ol[] if there.  
22d40 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20            ** is 
22d50 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65  not an entry the
22d60 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  re already..    
22d70 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
22d80 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20         int k;.  
22d90 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d            pCol =
22da0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b   pAggInfo->aCol;
22db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
22dc0 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f  (k=0; k<pAggInfo
22dd0 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20  ->nColumn; k++, 
22de0 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  pCol++){.       
22df0 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d         if( pCol-
22e00 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e  >iTable==pExpr->
22e10 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20  iTable &&.      
22e20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
22e30 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72  ->iColumn==pExpr
22e40 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->iColumn ){.   
22e50 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
22e60 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
22e70 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
22e80 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
22e90 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e  ( (k>=pAggInfo->
22ea0 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20  nColumn).       
22eb0 20 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61 64        && (k = ad
22ec0 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70  dAggInfoColumn(p
22ed0 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49  Parse->db, pAggI
22ee0 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20 20  nfo))>=0 .      
22ef0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
22f00 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70         pCol = &p
22f10 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d  AggInfo->aCol[k]
22f20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
22f30 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78  pCol->pTab = pEx
22f40 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  pr->pTab;.      
22f50 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54          pCol->iT
22f60 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54  able = pExpr->iT
22f70 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20  able;.          
22f80 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d      pCol->iColum
22f90 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  n = pExpr->iColu
22fa0 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  mn;.            
22fb0 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b    pCol->iMem = +
22fc0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
22fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
22fe0 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
22ff0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
23000 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72       pCol->pExpr
23010 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
23020 20 20 20 20 20 20 20 20 69 66 28 20 70 41 67 67          if( pAgg
23030 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29  Info->pGroupBy )
23040 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
23050 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20    int j, n;.    
23060 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
23070 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67 67  List *pGB = pAgg
23080 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a  Info->pGroupBy;.
23090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230a0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
230b0 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47  item *pTerm = pG
230c0 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20 20  B->a;.          
230d0 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e        n = pGB->n
230e0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
230f0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
23100 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b  <n; j++, pTerm++
23110 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
23120 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20       Expr *pE = 
23130 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
23140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23150 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43  if( pE->op==TK_C
23160 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61  OLUMN && pE->iTa
23170 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  ble==pExpr->iTab
23180 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  le &&.          
23190 20 20 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e              pE->
231a0 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e  iColumn==pExpr->
231b0 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
231c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
231d0 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
231e0 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  mn = j;.        
231f0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
23200 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
23210 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
23220 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23230 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23240 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d         if( pCol-
23250 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30  >iSorterColumn<0
23260 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23270 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65      pCol->iSorte
23280 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e  rColumn = pAggIn
23290 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  fo->nSortingColu
232a0 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  mn++;.          
232b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
232c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
232d0 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77 20  /* There is now 
232e0 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45 78  an entry for pEx
232f0 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e  pr in pAggInfo->
23300 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20  aCol[] (either. 
23310 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65             ** be
23320 63 61 75 73 65 20 69 74 20 77 61 73 20 74 68 65  cause it was the
23330 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65 63  re before or bec
23340 61 75 73 65 20 77 65 20 6a 75 73 74 20 63 72 65  ause we just cre
23350 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20 20  ated it)..      
23360 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74        ** Convert
23370 20 74 68 65 20 70 45 78 70 72 20 74 6f 20 62 65   the pExpr to be
23380 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e   a TK_AGG_COLUMN
23390 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68   referring to th
233a0 61 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  at.            *
233b0 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  * pAggInfo->aCol
233c0 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20 20  [] entry..      
233d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
233e0 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50       ExprSetVVAP
233f0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
23400 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20  P_NoReduce);.   
23410 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
23420 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49  pAggInfo = pAggI
23430 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nfo;.           
23440 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
23450 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20  AGG_COLUMN;.    
23460 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
23470 41 67 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20 20  Agg = (i16)k;.  
23480 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
23490 0a 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20  .          } /* 
234a0 65 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54 61  endif pExpr->iTa
234b0 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72  ble==pItem->iCur
234c0 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  sor */.        }
234d0 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65   /* end loop ove
234e0 72 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20  r pSrcList */.  
234f0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
23500 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
23510 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
23520 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a  AGG_FUNCTION: {.
23530 20 20 20 20 20 20 69 66 28 20 28 70 4e 43 2d 3e        if( (pNC->
23540 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 6e 41  ncFlags & NC_InA
23550 67 67 46 75 6e 63 29 3d 3d 30 0a 20 20 20 20 20  ggFunc)==0.     
23560 20 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 77 61    && pWalker->wa
23570 6c 6b 65 72 44 65 70 74 68 3d 3d 70 45 78 70 72  lkerDepth==pExpr
23580 2d 3e 6f 70 32 0a 20 20 20 20 20 20 29 7b 0a 20  ->op2.      ){. 
23590 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
235a0 74 6f 20 73 65 65 20 69 66 20 70 45 78 70 72 20  to see if pExpr 
235b0 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f  is a duplicate o
235c0 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65 67  f another aggreg
235d0 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ate .        ** 
235e0 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73  function that is
235f0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
23600 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75  pAggInfo structu
23610 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  re.        */.  
23620 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
23630 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d  Info_func *pItem
23640 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75   = pAggInfo->aFu
23650 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  nc;.        for(
23660 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
23670 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74  >nFunc; i++, pIt
23680 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  em++){.         
23690 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
236a0 43 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70  Compare(pItem->p
236b0 45 78 70 72 2c 20 70 45 78 70 72 2c 20 2d 31 29  Expr, pExpr, -1)
236c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
236d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
236e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
236f0 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70          if( i>=p
23700 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29  AggInfo->nFunc )
23710 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70  {.          /* p
23720 45 78 70 72 20 69 73 20 6f 72 69 67 69 6e 61 6c  Expr is original
23730 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e  .  Make a new en
23740 74 72 79 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  try in pAggInfo-
23750 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20  >aFunc[].       
23760 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
23770 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61  u8 enc = ENC(pPa
23780 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20  rse->db);.      
23790 20 20 20 20 69 20 3d 20 61 64 64 41 67 67 49 6e      i = addAggIn
237a0 66 6f 46 75 6e 63 28 70 50 61 72 73 65 2d 3e 64  foFunc(pParse->d
237b0 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20  b, pAggInfo);.  
237c0 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30          if( i>=0
237d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
237e0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
237f0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
23800 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
23810 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
23820 65 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  em = &pAggInfo->
23830 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20  aFunc[i];.      
23840 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78        pItem->pEx
23850 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  pr = pExpr;.    
23860 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
23870 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
23880 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  nMem;.          
23890 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
238a0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
238b0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
238c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
238d0 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c  tem->pFunc = sql
238e0 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
238f0 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20  (pParse->db,.   
23900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23910 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
23920 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
23930 20 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 4c       pExpr->x.pL
23940 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70  ist ? pExpr->x.p
23950 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c  List->nExpr : 0,
23960 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
23970 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
23980 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74  >flags & EP_Dist
23990 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  inct ){.        
239a0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69        pItem->iDi
239b0 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  stinct = pParse-
239c0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
239d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
239e0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
239f0 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b  >iDistinct = -1;
23a00 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
23a10 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23a20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
23a30 4d 61 6b 65 20 70 45 78 70 72 20 70 6f 69 6e 74  Make pExpr point
23a40 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69   to the appropri
23a50 61 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  ate pAggInfo->aF
23a60 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20  unc[] entry.    
23a70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
23a80 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
23a90 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
23aa0 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
23ab0 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20  educed) );.     
23ac0 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f     ExprSetVVAPro
23ad0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
23ae0 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20  NoReduce);.     
23af0 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d     pExpr->iAgg =
23b00 20 28 69 31 36 29 69 3b 0a 20 20 20 20 20 20 20   (i16)i;.       
23b10 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
23b20 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20   = pAggInfo;.   
23b30 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
23b40 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 65 6c  Prune;.      }el
23b50 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  se{.        retu
23b60 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
23b70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
23b80 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
23b90 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74  Continue;.}.stat
23ba0 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67  ic int analyzeAg
23bb0 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74  gregatesInSelect
23bc0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
23bd0 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
23be0 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t){.  UNUSED_PAR
23bf0 41 4d 45 54 45 52 28 70 57 61 6c 6b 65 72 29 3b  AMETER(pWalker);
23c00 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
23c10 54 45 52 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  TER(pSelect);.  
23c20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
23c30 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  nue;.}../*.** An
23c40 61 6c 79 7a 65 20 74 68 65 20 70 45 78 70 72 20  alyze the pExpr 
23c50 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69  expression looki
23c60 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  ng for aggregate
23c70 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a   functions and.*
23c80 2a 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20  * for variables 
23c90 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
23ca0 61 64 64 65 64 20 74 6f 20 41 67 67 49 6e 66 6f  added to AggInfo
23cb0 20 6f 62 6a 65 63 74 20 74 68 61 74 20 70 4e 43   object that pNC
23cc0 2d 3e 70 41 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f  ->pAggInfo.** po
23cd0 69 6e 74 73 20 74 6f 2e 20 20 41 64 64 69 74 69  ints to.  Additi
23ce0 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 61 72 65  onal entries are
23cf0 20 6d 61 64 65 20 6f 6e 20 74 68 65 20 41 67 67   made on the Agg
23d00 49 6e 66 6f 20 6f 62 6a 65 63 74 20 61 73 0a 2a  Info object as.*
23d10 2a 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a  * necessary..**.
23d20 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
23d30 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
23d40 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65 20  alled after the 
23d50 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62  expression has b
23d60 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20  een.** analyzed 
23d70 62 79 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  by sqlite3Resolv
23d80 65 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f  eExprNames()..*/
23d90 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
23da0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
23db0 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  es(NameContext *
23dc0 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72  pNC, Expr *pExpr
23dd0 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
23de0 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
23df0 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78  izeof(w));.  w.x
23e00 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61  ExprCallback = a
23e10 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 3b  nalyzeAggregate;
23e20 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
23e30 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67  back = analyzeAg
23e40 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74  gregatesInSelect
23e50 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e  ;.  w.u.pNC = pN
23e60 43 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43  C;.  assert( pNC
23e70 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b  ->pSrcList!=0 );
23e80 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
23e90 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d  pr(&w, pExpr);.}
23ea0 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c  ../*.** Call sql
23eb0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
23ec0 67 67 72 65 67 61 74 65 73 28 29 20 66 6f 72 20  ggregates() for 
23ed0 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  every expression
23ee0 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73   in an.** expres
23ef0 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74 75  sion list.  Retu
23f00 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
23f10 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49   errors..**.** I
23f20 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 66 6f  f an error is fo
23f30 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79 73 69  und, the analysi
23f40 73 20 69 73 20 63 75 74 20 73 68 6f 72 74 2e 0a  s is cut short..
23f50 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
23f60 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
23f70 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70  t(NameContext *p
23f80 4e 43 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  NC, ExprList *pL
23f90 69 73 74 29 7b 0a 20 20 73 74 72 75 63 74 20 45  ist){.  struct E
23fa0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
23fb0 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  tem;.  int i;.  
23fc0 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
23fd0 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
23fe0 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
23ff0 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  t->nExpr; i++, p
24000 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73  Item++){.      s
24010 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
24020 65 41 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c  eAggregates(pNC,
24030 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
24040 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
24050 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 73 69  ** Allocate a si
24060 6e 67 6c 65 20 6e 65 77 20 72 65 67 69 73 74 65  ngle new registe
24070 72 20 66 6f 72 20 75 73 65 20 74 6f 20 68 6f 6c  r for use to hol
24080 64 20 73 6f 6d 65 20 69 6e 74 65 72 6d 65 64 69  d some intermedi
24090 61 74 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69  ate result..*/.i
240a0 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d  nt sqlite3GetTem
240b0 70 52 65 67 28 50 61 72 73 65 20 2a 70 50 61 72  pReg(Parse *pPar
240c0 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  se){.  if( pPars
240d0 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29  e->nTempReg==0 )
240e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 2b 70  {.    return ++p
240f0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d  Parse->nMem;.  }
24100 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65  .  return pParse
24110 2d 3e 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61  ->aTempReg[--pPa
24120 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a  rse->nTempReg];.
24130 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
24140 61 74 65 20 61 20 72 65 67 69 73 74 65 72 2c 20  ate a register, 
24150 6d 61 6b 69 6e 67 20 61 76 61 69 6c 61 62 6c 65  making available
24160 20 66 6f 72 20 72 65 75 73 65 20 66 6f 72 20 73   for reuse for s
24170 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 75 72  ome other.** pur
24180 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  pose..**.** If a
24190 20 72 65 67 69 73 74 65 72 20 69 73 20 63 75 72   register is cur
241a0 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 75 73 65  rently being use
241b0 64 20 62 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d by the column 
241c0 63 61 63 68 65 2c 20 74 68 65 6e 0a 2a 2a 20 74  cache, then.** t
241d0 68 65 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20  he deallocation 
241e0 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
241f0 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  l the column cac
24200 68 65 20 6c 69 6e 65 20 74 68 61 74 20 75 73 65  he line that use
24210 73 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65  s.** the registe
24220 72 20 62 65 63 6f 6d 65 73 20 73 74 61 6c 65 2e  r becomes stale.
24230 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
24240 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 50  ReleaseTempReg(P
24250 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
24260 74 20 69 52 65 67 29 7b 0a 20 20 69 66 28 20 69  t iReg){.  if( i
24270 52 65 67 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  Reg && pParse->n
24280 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a  TempReg<ArraySiz
24290 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  e(pParse->aTempR
242a0 65 67 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  eg) ){.    int i
242b0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 79 43 6f  ;.    struct yCo
242c0 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 20 20 66  lCache *p;.    f
242d0 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
242e0 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
242f0 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
24300 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
24310 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d     if( p->iReg==
24320 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20  iReg ){.        
24330 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 31 3b 0a  p->tempReg = 1;.
24340 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
24350 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
24360 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52    pParse->aTempR
24370 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  eg[pParse->nTemp
24380 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20  Reg++] = iReg;. 
24390 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
243a0 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61  cate or dealloca
243b0 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52  te a block of nR
243c0 65 67 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72  eg consecutive r
243d0 65 67 69 73 74 65 72 73 0a 2a 2f 0a 69 6e 74 20  egisters.*/.int 
243e0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
243f0 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nge(Parse *pPars
24400 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  e, int nReg){.  
24410 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 20 3d 20  int i, n;.  i = 
24420 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
24430 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73 65 2d  g;.  n = pParse-
24440 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20 69 66  >nRangeReg;.  if
24450 28 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20  ( nReg<=n ){.   
24460 20 61 73 73 65 72 74 28 20 21 75 73 65 64 41 73   assert( !usedAs
24470 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72  ColumnCache(pPar
24480 73 65 2c 20 69 2c 20 69 2b 6e 2d 31 29 20 29 3b  se, i, i+n-1) );
24490 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61  .    pParse->iRa
244a0 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a  ngeReg += nReg;.
244b0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e      pParse->nRan
244c0 67 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20  geReg -= nReg;. 
244d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20   }else{.    i = 
244e0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
244f0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
24500 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20   += nReg;.  }.  
24510 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64  return i;.}.void
24520 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
24530 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a  empRange(Parse *
24540 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
24550 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 73  , int nReg){.  s
24560 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52  qlite3ExprCacheR
24570 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 52  emove(pParse, iR
24580 65 67 2c 20 6e 52 65 67 29 3b 0a 20 20 69 66 28  eg, nReg);.  if(
24590 20 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52   nReg>pParse->nR
245a0 61 6e 67 65 52 65 67 20 29 7b 0a 20 20 20 20 70  angeReg ){.    p
245b0 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
245c0 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61   = nReg;.    pPa
245d0 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d  rse->iRangeReg =
245e0 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   iReg;.  }.}../*
245f0 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d  .** Mark all tem
24600 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73  porary registers
24610 20 61 73 20 62 65 69 6e 67 20 75 6e 61 76 61 69   as being unavai
24620 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 2e  lable for reuse.
24630 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
24640 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68  ClearTempRegCach
24650 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
24660 7b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d  {.  pParse->nTem
24670 70 52 65 67 20 3d 20 30 3b 0a 20 20 70 50 61 72  pReg = 0;.  pPar
24680 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20  se->nRangeReg = 
24690 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 69  0;.}../*.** Vali
246a0 64 61 74 65 20 74 68 61 74 20 6e 6f 20 74 65 6d  date that no tem
246b0 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
246c0 66 61 6c 6c 73 20 77 69 74 68 69 6e 20 74 68 65  falls within the
246d0 20 72 61 6e 67 65 20 6f 66 0a 2a 2a 20 69 46 69   range of.** iFi
246e0 72 73 74 2e 2e 69 4c 61 73 74 2c 20 69 6e 63 6c  rst..iLast, incl
246f0 75 73 69 76 65 2e 20 20 54 68 69 73 20 72 6f 75  usive.  This rou
24700 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tine is only cal
24710 6c 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 73  l from within as
24720 73 65 72 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d  sert().** statem
24730 65 6e 74 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ents..*/.#ifdef 
24740 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e 74  SQLITE_DEBUG.int
24750 20 73 71 6c 69 74 65 33 4e 6f 54 65 6d 70 73 49   sqlite3NoTempsI
24760 6e 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50  nRange(Parse *pP
24770 61 72 73 65 2c 20 69 6e 74 20 69 46 69 72 73 74  arse, int iFirst
24780 2c 20 69 6e 74 20 69 4c 61 73 74 29 7b 0a 20 20  , int iLast){.  
24790 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 50 61  int i;.  if( pPa
247a0 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3e 30  rse->nRangeReg>0
247b0 0a 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e 69  .   && pParse->i
247c0 52 61 6e 67 65 52 65 67 2b 70 50 61 72 73 65 2d  RangeReg+pParse-
247d0 3e 6e 52 61 6e 67 65 52 65 67 3c 69 4c 61 73 74  >nRangeReg<iLast
247e0 0a 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e 69  .   && pParse->i
247f0 52 61 6e 67 65 52 65 67 3e 3d 69 46 69 72 73 74  RangeReg>=iFirst
24800 0a 20 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  .  ){.     retur
24810 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  n 0;.  }.  for(i
24820 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54  =0; i<pParse->nT
24830 65 6d 70 52 65 67 3b 20 69 2b 2b 29 7b 0a 20 20  empReg; i++){.  
24840 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 54    if( pParse->aT
24850 65 6d 70 52 65 67 5b 69 5d 3e 3d 69 46 69 72 73  empReg[i]>=iFirs
24860 74 20 26 26 20 70 50 61 72 73 65 2d 3e 61 54 65  t && pParse->aTe
24870 6d 70 52 65 67 5b 69 5d 3c 3d 69 4c 61 73 74 20  mpReg[i]<=iLast 
24880 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
24890 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
248a0 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
248b0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
248c0 47 20 2a 2f 0a                                   G */.