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

Artifact 92e6dfcd55bdffbed8c66627700d1b5c5f9889d3:


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 2a 0a 2a 2a  in SQLite..**.**
0200: 20 24 49 64 3a 20 65 78 70 72 2e 63 2c 76 20 31   $Id: expr.c,v 1
0210: 2e 34 31 33 20 32 30 30 39 2f 30 32 2f 32 30 20  .413 2009/02/20 
0220: 30 33 3a 35 35 3a 30 35 20 64 72 68 20 45 78 70  03:55:05 drh Exp
0230: 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22   $.*/.#include "
0240: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a  sqliteInt.h"../*
0250: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 27  .** Return the '
0260: 61 66 66 69 6e 69 74 79 27 20 6f 66 20 74 68 65  affinity' of the
0270: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
0280: 72 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20  r if any..**.** 
0290: 49 66 20 70 45 78 70 72 20 69 73 20 61 20 63 6f  If pExpr is a co
02a0: 6c 75 6d 6e 2c 20 61 20 72 65 66 65 72 65 6e 63  lumn, a referenc
02b0: 65 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 76 69  e to a column vi
02c0: 61 20 61 6e 20 27 41 53 27 20 61 6c 69 61 73 2c  a an 'AS' alias,
02d0: 0a 2a 2a 20 6f 72 20 61 20 73 75 62 2d 73 65 6c  .** or a sub-sel
02e0: 65 63 74 20 77 69 74 68 20 61 20 63 6f 6c 75 6d  ect with a colum
02f0: 6e 20 61 73 20 74 68 65 20 72 65 74 75 72 6e 20  n as the return 
0300: 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20  value, then the 
0310: 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20 6f 66 20  .** affinity of 
0320: 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69 73 20 72  that column is r
0330: 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
0340: 73 65 2c 20 30 78 30 30 20 69 73 20 72 65 74 75  se, 0x00 is retu
0350: 72 6e 65 64 2c 0a 2a 2a 20 69 6e 64 69 63 61 74  rned,.** indicat
0360: 69 6e 67 20 6e 6f 20 61 66 66 69 6e 69 74 79 20  ing no affinity 
0370: 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69  for the expressi
0380: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 2e 20 74  on..**.** i.e. t
0390: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
03a0: 65 78 70 72 65 73 73 73 69 6f 6e 73 20 69 6e 20  expresssions in 
03b0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
03c0: 61 74 65 6d 65 6e 74 73 20 61 6c 6c 0a 2a 2a 20  atements all.** 
03d0: 68 61 76 65 20 61 6e 20 61 66 66 69 6e 69 74 79  have an affinity
03e0: 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54  :.**.** CREATE T
03f0: 41 42 4c 45 20 74 31 28 61 29 3b 0a 2a 2a 20 53  ABLE t1(a);.** S
0400: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
0410: 57 48 45 52 45 20 61 3b 0a 2a 2a 20 53 45 4c 45  WHERE a;.** SELE
0420: 43 54 20 61 20 41 53 20 62 20 46 52 4f 4d 20 74  CT a AS b FROM t
0430: 31 20 57 48 45 52 45 20 62 3b 0a 2a 2a 20 53 45  1 WHERE b;.** SE
0440: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
0450: 48 45 52 45 20 28 73 65 6c 65 63 74 20 61 20 66  HERE (select a f
0460: 72 6f 6d 20 74 31 29 3b 0a 2a 2f 0a 63 68 61 72  rom t1);.*/.char
0470: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
0480: 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70 72  nity(Expr *pExpr
0490: 29 7b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 70 45  ){.  int op = pE
04a0: 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  xpr->op;.  if( o
04b0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
04c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
04d0: 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78 49 73 53  r->flags&EP_xIsS
04e0: 65 6c 65 63 74 20 29 3b 0a 20 20 20 20 72 65 74  elect );.    ret
04f0: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41  urn sqlite3ExprA
0500: 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 78  ffinity(pExpr->x
0510: 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
0520: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
0530: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
0540: 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 69 66  E_OMIT_CAST.  if
0550: 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 54 20 29 7b  ( op==TK_CAST ){
0560: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
0570: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
0580: 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 29 3b 0a  &pExpr->token);.
0590: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
05a0: 20 28 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c   (op==TK_AGG_COL
05b0: 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f  UMN || op==TK_CO
05c0: 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52  LUMN || op==TK_R
05d0: 45 47 49 53 54 45 52 29 20 0a 20 20 20 26 26 20  EGISTER) .   && 
05e0: 70 45 78 70 72 2d 3e 70 54 61 62 21 3d 30 0a 20  pExpr->pTab!=0. 
05f0: 20 29 7b 0a 20 20 20 20 2f 2a 20 6f 70 3d 3d 54   ){.    /* op==T
0600: 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 45  K_REGISTER && pE
0610: 78 70 72 2d 3e 70 54 61 62 21 3d 30 20 68 61 70  xpr->pTab!=0 hap
0620: 70 65 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20  pens when pExpr 
0630: 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20  was originally. 
0640: 20 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d     ** a TK_COLUM
0650: 4e 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f  N but was previo
0660: 75 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61  usly evaluated a
0670: 6e 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72  nd cached in a r
0680: 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 69  egister */.    i
0690: 6e 74 20 6a 20 3d 20 70 45 78 70 72 2d 3e 69 43  nt j = pExpr->iC
06a0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 66 28 20 6a  olumn;.    if( j
06b0: 3c 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  <0 ) return SQLI
06c0: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a  TE_AFF_INTEGER;.
06d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
06e0: 72 2d 3e 70 54 61 62 20 26 26 20 6a 3c 70 45 78  r->pTab && j<pEx
06f0: 70 72 2d 3e 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  pr->pTab->nCol )
0700: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 45 78  ;.    return pEx
0710: 70 72 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  pr->pTab->aCol[j
0720: 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 7d 0a  ].affinity;.  }.
0730: 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e    return pExpr->
0740: 61 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a  affinity;.}../*.
0750: 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61  ** Set the colla
0760: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
0770: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  r expression pEx
0780: 70 72 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c  pr to be the col
0790: 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e  lating.** sequen
07a0: 63 65 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b  ce named by pTok
07b0: 65 6e 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70  en.   Return a p
07c0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72 65  ointer to the re
07d0: 76 69 73 65 64 20 65 78 70 72 65 73 73 69 6f 6e  vised expression
07e0: 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69  ..** The collati
07f0: 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 6d  ng sequence is m
0800: 61 72 6b 65 64 20 61 73 20 22 65 78 70 6c 69 63  arked as "explic
0810: 69 74 22 20 75 73 69 6e 67 20 74 68 65 20 45 50  it" using the EP
0820: 5f 45 78 70 43 6f 6c 6c 61 74 65 0a 2a 2a 20 66  _ExpCollate.** f
0830: 6c 61 67 2e 20 20 41 6e 20 65 78 70 6c 69 63 69  lag.  An explici
0840: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
0850: 65 6e 63 65 20 77 69 6c 6c 20 6f 76 65 72 72 69  ence will overri
0860: 64 65 20 69 6d 70 6c 69 63 69 74 0a 2a 2a 20 63  de implicit.** c
0870: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
0880: 65 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  es..*/.Expr *sql
0890: 69 74 65 33 45 78 70 72 53 65 74 43 6f 6c 6c 28  ite3ExprSetColl(
08a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
08b0: 78 70 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65  xpr *pExpr, Toke
08c0: 6e 20 2a 70 43 6f 6c 6c 4e 61 6d 65 29 7b 0a 20  n *pCollName){. 
08d0: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 30   char *zColl = 0
08e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
08f0: 44 65 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66  Dequoted name of
0900: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
0910: 6e 63 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71  nce */.  CollSeq
0920: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 73 71 6c 69 74   *pColl;.  sqlit
0930: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
0940: 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73  >db;.  zColl = s
0950: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
0960: 6b 65 6e 28 64 62 2c 20 70 43 6f 6c 6c 4e 61 6d  ken(db, pCollNam
0970: 65 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20  e);.  if( pExpr 
0980: 26 26 20 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  && zColl ){.    
0990: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c  pColl = sqlite3L
09a0: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
09b0: 72 73 65 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 29 3b  rse, zColl, -1);
09c0: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29  .    if( pColl )
09d0: 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  {.      pExpr->p
09e0: 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20  Coll = pColl;.  
09f0: 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61 67 73      pExpr->flags
0a00: 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74   |= EP_ExpCollat
0a10: 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  e;.    }.  }.  s
0a20: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
0a30: 20 7a 43 6f 6c 6c 29 3b 0a 20 20 72 65 74 75 72   zColl);.  retur
0a40: 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pExpr;.}../*.*
0a50: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 66  * Return the def
0a60: 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  ault collation s
0a70: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
0a80: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
0a90: 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20 69 73  . If.** there is
0aa0: 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c   no default coll
0ab0: 61 74 69 6f 6e 20 74 79 70 65 2c 20 72 65 74 75  ation type, retu
0ac0: 72 6e 20 30 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71  rn 0..*/.CollSeq
0ad0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c   *sqlite3ExprCol
0ae0: 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
0af0: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
0b00: 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  {.  CollSeq *pCo
0b10: 6c 6c 20 3d 20 30 3b 0a 20 20 45 78 70 72 20 2a  ll = 0;.  Expr *
0b20: 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 77 68 69  p = pExpr;.  whi
0b30: 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74  le( p ){.    int
0b40: 20 6f 70 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d   op;.    pColl =
0b50: 20 70 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 69   p->pColl;.    i
0b60: 66 28 20 70 43 6f 6c 6c 20 29 20 62 72 65 61 6b  f( pColl ) break
0b70: 3b 0a 20 20 20 20 6f 70 20 3d 20 70 2d 3e 6f 70  ;.    op = p->op
0b80: 3b 0a 20 20 20 20 69 66 28 20 28 6f 70 3d 3d 54  ;.    if( (op==T
0b90: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  K_AGG_COLUMN || 
0ba0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op==TK_COLUMN ||
0bb0: 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
0bc0: 29 20 26 26 20 70 2d 3e 70 54 61 62 21 3d 30 20  ) && p->pTab!=0 
0bd0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d  ){.      /* op==
0be0: 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70  TK_REGISTER && p
0bf0: 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e  ->pTab!=0 happen
0c00: 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61 73  s when pExpr was
0c10: 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20   originally.    
0c20: 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e    ** a TK_COLUMN
0c30: 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f 75   but was previou
0c40: 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e  sly evaluated an
0c50: 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72 65  d cached in a re
0c60: 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  gister */.      
0c70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
0c80: 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d  l;.      int j =
0c90: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20   p->iColumn;.   
0ca0: 20 20 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20     if( j>=0 ){. 
0cb0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a         sqlite3 *
0cc0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
0cd0: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d  .        zColl =
0ce0: 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a   p->pTab->aCol[j
0cf0: 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  ].zColl;.       
0d00: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
0d10: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
0d20: 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20  ENC(db), zColl, 
0d30: 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  -1, 0);.        
0d40: 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70  pExpr->pColl = p
0d50: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
0d60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
0d70: 0a 20 20 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f  .    if( op!=TK_
0d80: 43 41 53 54 20 26 26 20 6f 70 21 3d 54 4b 5f 55  CAST && op!=TK_U
0d90: 50 4c 55 53 20 29 7b 0a 20 20 20 20 20 20 62 72  PLUS ){.      br
0da0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  eak;.    }.    p
0db0: 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d   = p->pLeft;.  }
0dc0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 68  .  if( sqlite3Ch
0dd0: 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  eckCollSeq(pPars
0de0: 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20  e, pColl) ){ .  
0df0: 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d    pColl = 0;.  }
0e00: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
0e10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20  .}../*.** pExpr 
0e20: 69 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66  is an operand of
0e30: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
0e40: 65 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73  erator.  aff2 is
0e50: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66   the.** type aff
0e60: 69 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68  inity of the oth
0e70: 65 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69  er operand.  Thi
0e80: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
0e90: 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66  s the.** type af
0ea0: 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75  finity that shou
0eb0: 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74  ld be used for t
0ec0: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  he comparison op
0ed0: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20  erator..*/.char 
0ee0: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
0ef0: 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78  finity(Expr *pEx
0f00: 70 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a  pr, char aff2){.
0f10: 20 20 63 68 61 72 20 61 66 66 31 20 3d 20 73 71    char aff1 = sq
0f20: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
0f30: 79 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  y(pExpr);.  if( 
0f40: 61 66 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a  aff1 && aff2 ){.
0f50: 20 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65      /* Both side
0f60: 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69  s of the compari
0f70: 73 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e  son are columns.
0f80: 20 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65   If one has nume
0f90: 72 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e  ric.    ** affin
0fa0: 69 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f  ity, use that. O
0fb0: 74 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20  therwise use no 
0fc0: 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f  affinity..    */
0fd0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
0fe0: 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
0ff0: 79 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74  y(aff1) || sqlit
1000: 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
1010: 69 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20  ity(aff2) ){.   
1020: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1030: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
1040: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1050: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
1060: 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _NONE;.    }.  }
1070: 65 6c 73 65 20 69 66 28 20 21 61 66 66 31 20 26  else if( !aff1 &
1080: 26 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f  & !aff2 ){.    /
1090: 2a 20 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f  * Neither side o
10a0: 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
10b0: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43   is a column.  C
10c0: 6f 6d 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a  ompare the.    *
10d0: 2a 20 72 65 73 75 6c 74 73 20 64 69 72 65 63 74  * results direct
10e0: 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ly..    */.    r
10f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
1100: 5f 4e 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _NONE;.  }else{.
1110: 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20      /* One side 
1120: 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  is a column, the
1130: 20 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55   other is not. U
1140: 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61  se the columns a
1150: 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20  ffinity. */.    
1160: 61 73 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20  assert( aff1==0 
1170: 7c 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20  || aff2==0 );.  
1180: 20 20 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b    return (aff1 +
1190: 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   aff2);.  }.}../
11a0: 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20  *.** pExpr is a 
11b0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
11c0: 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65  tor.  Return the
11d0: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74   type affinity t
11e0: 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  hat should.** be
11f0: 20 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68   applied to both
1200: 20 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20   operands prior 
1210: 74 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d  to doing the com
1220: 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  parison..*/.stat
1230: 69 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73  ic char comparis
1240: 6f 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20  onAffinity(Expr 
1250: 2a 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20  *pExpr){.  char 
1260: 61 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70  aff;.  assert( p
1270: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20  Expr->op==TK_EQ 
1280: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
1290: 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _IN || pExpr->op
12a0: 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20  ==TK_LT ||.     
12b0: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d       pExpr->op==
12c0: 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_GT || pExpr->
12d0: 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78  op==TK_GE || pEx
12e0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c  pr->op==TK_LE ||
12f0: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
1300: 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20  ->op==TK_NE );. 
1310: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1320: 70 4c 65 66 74 20 29 3b 0a 20 20 61 66 66 20 3d  pLeft );.  aff =
1330: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
1340: 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66  nity(pExpr->pLef
1350: 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  t);.  if( pExpr-
1360: 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 61  >pRight ){.    a
1370: 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  ff = sqlite3Comp
1380: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70  areAffinity(pExp
1390: 72 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 29 3b  r->pRight, aff);
13a0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 45 78 70  .  }else if( Exp
13b0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
13c0: 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
13d0: 29 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73  ) ){.    aff = s
13e0: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
13f0: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 78 2e 70  inity(pExpr->x.p
1400: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
1410: 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61 66 66 29  a[0].pExpr, aff)
1420: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 61  ;.  }else if( !a
1430: 66 66 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20  ff ){.    aff = 
1440: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
1450: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66  .  }.  return af
1460: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70  f;.}../*.** pExp
1470: 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f  r is a compariso
1480: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 65 67  n expression, eg
1490: 2e 20 27 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e  . '=', '<', IN(.
14a0: 2e 2e 29 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f  ..) etc..** idx_
14b0: 61 66 66 69 6e 69 74 79 20 69 73 20 74 68 65 20  affinity is the 
14c0: 61 66 66 69 6e 69 74 79 20 6f 66 20 61 6e 20 69  affinity of an i
14d0: 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52  ndexed column. R
14e0: 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66  eturn true.** if
14f0: 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20   the index with 
1500: 61 66 66 69 6e 69 74 79 20 69 64 78 5f 61 66 66  affinity idx_aff
1510: 69 6e 69 74 79 20 6d 61 79 20 62 65 20 75 73 65  inity may be use
1520: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a  d to implement.*
1530: 2a 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  * the comparison
1540: 20 69 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e   in pExpr..*/.in
1550: 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66  t sqlite3IndexAf
1560: 66 69 6e 69 74 79 4f 6b 28 45 78 70 72 20 2a 70  finityOk(Expr *p
1570: 45 78 70 72 2c 20 63 68 61 72 20 69 64 78 5f 61  Expr, char idx_a
1580: 66 66 69 6e 69 74 79 29 7b 0a 20 20 63 68 61 72  ffinity){.  char
1590: 20 61 66 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f   aff = compariso
15a0: 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  nAffinity(pExpr)
15b0: 3b 0a 20 20 73 77 69 74 63 68 28 20 61 66 66 20  ;.  switch( aff 
15c0: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
15d0: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3a 0a 20 20 20  TE_AFF_NONE:.   
15e0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
15f0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46   case SQLITE_AFF
1600: 5f 54 45 58 54 3a 0a 20 20 20 20 20 20 72 65 74  _TEXT:.      ret
1610: 75 72 6e 20 69 64 78 5f 61 66 66 69 6e 69 74 79  urn idx_affinity
1620: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  ==SQLITE_AFF_TEX
1630: 54 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  T;.    default:.
1640: 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
1650: 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66  ite3IsNumericAff
1660: 69 6e 69 74 79 28 69 64 78 5f 61 66 66 69 6e 69  inity(idx_affini
1670: 74 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ty);.  }.}../*.*
1680: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 35 20  * Return the P5 
1690: 76 61 6c 75 65 20 74 68 61 74 20 73 68 6f 75 6c  value that shoul
16a0: 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 61 20  d be used for a 
16b0: 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f  binary compariso
16c0: 6e 0a 2a 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f  n.** opcode (OP_
16d0: 45 71 2c 20 4f 50 5f 47 65 20 65 74 63 2e 29 20  Eq, OP_Ge etc.) 
16e0: 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20  used to compare 
16f0: 70 45 78 70 72 31 20 61 6e 64 20 70 45 78 70 72  pExpr1 and pExpr
1700: 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20  2..*/.static u8 
1710: 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28  binaryCompareP5(
1720: 45 78 70 72 20 2a 70 45 78 70 72 31 2c 20 45 78  Expr *pExpr1, Ex
1730: 70 72 20 2a 70 45 78 70 72 32 2c 20 69 6e 74 20  pr *pExpr2, int 
1740: 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 75  jumpIfNull){.  u
1750: 38 20 61 66 66 20 3d 20 28 63 68 61 72 29 73 71  8 aff = (char)sq
1760: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
1770: 79 28 70 45 78 70 72 32 29 3b 0a 20 20 61 66 66  y(pExpr2);.  aff
1780: 20 3d 20 28 75 38 29 73 71 6c 69 74 65 33 43 6f   = (u8)sqlite3Co
1790: 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45  mpareAffinity(pE
17a0: 78 70 72 31 2c 20 61 66 66 29 20 7c 20 28 75 38  xpr1, aff) | (u8
17b0: 29 6a 75 6d 70 49 66 4e 75 6c 6c 3b 0a 20 20 72  )jumpIfNull;.  r
17c0: 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a  eturn aff;.}../*
17d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
17e0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c  nter to the coll
17f0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74  ation sequence t
1800: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
1810: 65 64 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72  ed by.** a binar
1820: 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  y comparison ope
1830: 72 61 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20  rator comparing 
1840: 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74  pLeft and pRight
1850: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
1860: 65 66 74 20 68 61 6e 64 20 65 78 70 72 65 73 73  eft hand express
1870: 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74  ion has a collat
1880: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 79 70  ing sequence typ
1890: 65 2c 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a  e, then it is.**
18a0: 20 75 73 65 64 2e 20 4f 74 68 65 72 77 69 73 65   used. Otherwise
18b0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
18c0: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
18d0: 72 69 67 68 74 20 68 61 6e 64 20 65 78 70 72 65  right hand expre
18e0: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64  ssion.** is used
18f0: 2c 20 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74  , or the default
1900: 20 28 42 49 4e 41 52 59 29 20 69 66 20 6e 65 69   (BINARY) if nei
1910: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ther expression 
1920: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a  has a collating.
1930: 2a 2a 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41  ** type..**.** A
1940: 72 67 75 6d 65 6e 74 20 70 52 69 67 68 74 20 28  rgument pRight (
1950: 62 75 74 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d  but not pLeft) m
1960: 61 79 20 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69  ay be a null poi
1970: 6e 74 65 72 2e 20 49 6e 20 74 68 69 73 20 63 61  nter. In this ca
1980: 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74  se,.** it is not
1990: 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a   considered..*/.
19a0: 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33  CollSeq *sqlite3
19b0: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
19c0: 6c 53 65 71 28 0a 20 20 50 61 72 73 65 20 2a 70  lSeq(.  Parse *p
19d0: 50 61 72 73 65 2c 20 0a 20 20 45 78 70 72 20 2a  Parse, .  Expr *
19e0: 70 4c 65 66 74 2c 20 0a 20 20 45 78 70 72 20 2a  pLeft, .  Expr *
19f0: 70 52 69 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c  pRight.){.  Coll
1a00: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73  Seq *pColl;.  as
1a10: 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20  sert( pLeft );. 
1a20: 20 69 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67   if( pLeft->flag
1a30: 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74  s & EP_ExpCollat
1a40: 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
1a50: 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 20 29 3b   pLeft->pColl );
1a60: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 4c 65  .    pColl = pLe
1a70: 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 7d 65 6c  ft->pColl;.  }el
1a80: 73 65 20 69 66 28 20 70 52 69 67 68 74 20 26 26  se if( pRight &&
1a90: 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26   pRight->flags &
1aa0: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29   EP_ExpCollate )
1ab0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  {.    assert( pR
1ac0: 69 67 68 74 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20  ight->pColl );. 
1ad0: 20 20 20 70 43 6f 6c 6c 20 3d 20 70 52 69 67 68     pColl = pRigh
1ae0: 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 7d 65 6c 73  t->pColl;.  }els
1af0: 65 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  e{.    pColl = s
1b00: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
1b10: 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29  q(pParse, pLeft)
1b20: 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c  ;.    if( !pColl
1b30: 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20   ){.      pColl 
1b40: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
1b50: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 52 69  lSeq(pParse, pRi
1b60: 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ght);.    }.  }.
1b70: 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a    return pColl;.
1b80: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1b90: 65 20 74 68 65 20 6f 70 65 72 61 6e 64 73 20 66  e the operands f
1ba0: 6f 72 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  or a comparison 
1bb0: 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 65 66 6f  operation.  Befo
1bc0: 72 65 0a 2a 2a 20 67 65 6e 65 72 61 74 69 6e 67  re.** generating
1bd0: 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 65 61   the code for ea
1be0: 63 68 20 6f 70 65 72 61 6e 64 2c 20 73 65 74 20  ch operand, set 
1bf0: 74 68 65 20 45 50 5f 41 6e 79 41 66 66 0a 2a 2a  the EP_AnyAff.**
1c00: 20 66 6c 61 67 20 6f 6e 20 74 68 65 20 65 78 70   flag on the exp
1c10: 72 65 73 73 69 6f 6e 20 73 6f 20 74 68 61 74 20  ression so that 
1c20: 69 74 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20  it will be able 
1c30: 74 6f 20 75 73 65 64 20 61 0a 2a 2a 20 63 61 63  to used a.** cac
1c40: 68 65 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  hed column value
1c50: 20 74 68 61 74 20 68 61 73 20 70 72 65 76 69 6f   that has previo
1c60: 75 73 6c 79 20 75 6e 64 65 72 67 6f 6e 65 20 61  usly undergone a
1c70: 6e 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20 63 68  n.** affinity ch
1c80: 61 6e 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ange..*/.static 
1c90: 76 6f 69 64 20 63 6f 64 65 43 6f 6d 70 61 72 65  void codeCompare
1ca0: 4f 70 65 72 61 6e 64 73 28 0a 20 20 50 61 72 73  Operands(.  Pars
1cb0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
1cc0: 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
1cd0: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
1ce0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
1cf0: 70 4c 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54  pLeft,      /* T
1d00: 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20  he left operand 
1d10: 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 4c 65  */.  int *pRegLe
1d20: 66 74 2c 20 20 20 20 2f 2a 20 52 65 67 69 73 74  ft,    /* Regist
1d30: 65 72 20 77 68 65 72 65 20 6c 65 66 74 20 6f 70  er where left op
1d40: 65 72 61 6e 64 20 69 73 20 73 74 6f 72 65 64 20  erand is stored 
1d50: 2a 2f 0a 20 20 69 6e 74 20 2a 70 46 72 65 65 4c  */.  int *pFreeL
1d60: 65 66 74 2c 20 20 20 2f 2a 20 46 72 65 65 20 74  eft,   /* Free t
1d70: 68 69 73 20 72 65 67 69 73 74 65 72 20 77 68 65  his register whe
1d80: 6e 20 64 6f 6e 65 20 2a 2f 0a 20 20 45 78 70 72  n done */.  Expr
1d90: 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a   *pRight,     /*
1da0: 20 54 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   The right opera
1db0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  nd */.  int *pRe
1dc0: 67 52 69 67 68 74 2c 20 20 20 2f 2a 20 52 65 67  gRight,   /* Reg
1dd0: 69 73 74 65 72 20 77 68 65 72 65 20 72 69 67 68  ister where righ
1de0: 74 20 6f 70 65 72 61 6e 64 20 69 73 20 73 74 6f  t operand is sto
1df0: 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 46  red */.  int *pF
1e00: 72 65 65 52 69 67 68 74 20 20 20 2f 2a 20 57 72  reeRight   /* Wr
1e10: 69 74 65 20 74 65 6d 70 20 72 65 67 69 73 74 65  ite temp registe
1e20: 72 20 66 6f 72 20 72 69 67 68 74 20 6f 70 65 72  r for right oper
1e30: 61 6e 64 20 74 68 65 72 65 20 2a 2f 0a 29 7b 0a  and there */.){.
1e40: 20 20 77 68 69 6c 65 28 20 70 4c 65 66 74 2d 3e    while( pLeft->
1e50: 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 29 20 70  op==TK_UPLUS ) p
1e60: 4c 65 66 74 20 3d 20 70 4c 65 66 74 2d 3e 70 4c  Left = pLeft->pL
1e70: 65 66 74 3b 0a 20 20 70 4c 65 66 74 2d 3e 66 6c  eft;.  pLeft->fl
1e80: 61 67 73 20 7c 3d 20 45 50 5f 41 6e 79 41 66 66  ags |= EP_AnyAff
1e90: 3b 0a 20 20 2a 70 52 65 67 4c 65 66 74 20 3d 20  ;.  *pRegLeft = 
1ea0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1eb0: 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 65 66  emp(pParse, pLef
1ec0: 74 2c 20 70 46 72 65 65 4c 65 66 74 29 3b 0a 20  t, pFreeLeft);. 
1ed0: 20 77 68 69 6c 65 28 20 70 52 69 67 68 74 2d 3e   while( pRight->
1ee0: 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 29 20 70  op==TK_UPLUS ) p
1ef0: 52 69 67 68 74 20 3d 20 70 52 69 67 68 74 2d 3e  Right = pRight->
1f00: 70 4c 65 66 74 3b 0a 20 20 70 52 69 67 68 74 2d  pLeft;.  pRight-
1f10: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 41 6e 79  >flags |= EP_Any
1f20: 41 66 66 3b 0a 20 20 2a 70 52 65 67 52 69 67 68  Aff;.  *pRegRigh
1f30: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  t = sqlite3ExprC
1f40: 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1f50: 70 52 69 67 68 74 2c 20 70 46 72 65 65 52 69 67  pRight, pFreeRig
1f60: 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ht);.}../*.** Ge
1f70: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1f80: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
1f90: 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rator..*/.static
1fa0: 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72 65   int codeCompare
1fb0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1fc0: 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72  e,    /* The par
1fd0: 73 69 6e 67 20 28 61 6e 64 20 63 6f 64 65 20 67  sing (and code g
1fe0: 65 6e 65 72 61 74 69 6e 67 29 20 63 6f 6e 74 65  enerating) conte
1ff0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  xt */.  Expr *pL
2000: 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  eft,      /* The
2010: 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   left operand */
2020: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
2030: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
2040: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  t operand */.  i
2050: 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20 20 20 20  nt opcode,      
2060: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73   /* The comparis
2070: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69  on opcode */.  i
2080: 6e 74 20 69 6e 31 2c 20 69 6e 74 20 69 6e 32 2c  nt in1, int in2,
2090: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
20a0: 64 69 6e 67 20 6f 70 65 72 61 6e 64 73 20 2a 2f  ding operands */
20b0: 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20  .  int dest,    
20c0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
20d0: 65 20 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20  e if true.  */. 
20e0: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   int jumpIfNull 
20f0: 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a     /* If true, j
2100: 75 6d 70 20 69 66 20 65 69 74 68 65 72 20 6f 70  ump if either op
2110: 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f  erand is NULL */
2120: 0a 29 7b 0a 20 20 69 6e 74 20 70 35 3b 0a 20 20  .){.  int p5;.  
2130: 69 6e 74 20 61 64 64 72 3b 0a 20 20 43 6f 6c 6c  int addr;.  Coll
2140: 53 65 71 20 2a 70 34 3b 0a 0a 20 20 70 34 20 3d  Seq *p4;..  p4 =
2150: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
2160: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
2170: 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
2180: 68 74 29 3b 0a 20 20 70 35 20 3d 20 62 69 6e 61  ht);.  p5 = bina
2190: 72 79 43 6f 6d 70 61 72 65 50 35 28 70 4c 65 66  ryCompareP5(pLef
21a0: 74 2c 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49  t, pRight, jumpI
21b0: 66 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72 20 3d  fNull);.  addr =
21c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21d0: 70 34 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p4(pParse->pVdbe
21e0: 2c 20 6f 70 63 6f 64 65 2c 20 69 6e 32 2c 20 64  , opcode, in2, d
21f0: 65 73 74 2c 20 69 6e 31 2c 0a 20 20 20 20 20 20  est, in1,.      
2200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2210: 20 20 20 20 20 28 76 6f 69 64 2a 29 70 34 2c 20       (void*)p4, 
2220: 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 73  P4_COLLSEQ);.  s
2230: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2240: 50 35 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  P5(pParse->pVdbe
2250: 2c 20 28 75 38 29 70 35 29 3b 0a 20 20 69 66 28  , (u8)p5);.  if(
2260: 20 28 70 35 20 26 20 53 51 4c 49 54 45 5f 41 46   (p5 & SQLITE_AF
2270: 46 5f 4d 41 53 4b 29 21 3d 53 51 4c 49 54 45 5f  F_MASK)!=SQLITE_
2280: 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AFF_NONE ){.    
2290: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
22a0: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
22b0: 50 61 72 73 65 2c 20 69 6e 31 2c 20 31 29 3b 0a  Parse, in1, 1);.
22c0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
22d0: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
22e0: 67 65 28 70 50 61 72 73 65 2c 20 69 6e 32 2c 20  ge(pParse, in2, 
22f0: 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  1);.  }.  return
2300: 20 61 64 64 72 3b 0a 7d 0a 0a 23 69 66 20 53 51   addr;.}..#if SQ
2310: 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
2320: 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 65 63  PTH>0./*.** Chec
2330: 6b 20 74 68 61 74 20 61 72 67 75 6d 65 6e 74 20  k that argument 
2340: 6e 48 65 69 67 68 74 20 69 73 20 6c 65 73 73 20  nHeight is less 
2350: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
2360: 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20   the maximum.** 
2370: 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68  expression depth
2380: 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20 69 74 20   allowed. If it 
2390: 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65 20 61 6e  is not, leave an
23a0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
23b0: 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  n.** pParse..*/.
23c0: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
23d0: 68 65 63 6b 48 65 69 67 68 74 28 50 61 72 73 65  heckHeight(Parse
23e0: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 48   *pParse, int nH
23f0: 65 69 67 68 74 29 7b 0a 20 20 69 6e 74 20 72 63  eight){.  int rc
2400: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2410: 69 6e 74 20 6d 78 48 65 69 67 68 74 20 3d 20 70  int mxHeight = p
2420: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69  Parse->db->aLimi
2430: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45  t[SQLITE_LIMIT_E
2440: 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20 20 69 66  XPR_DEPTH];.  if
2450: 28 20 6e 48 65 69 67 68 74 3e 6d 78 48 65 69 67  ( nHeight>mxHeig
2460: 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ht ){.    sqlite
2470: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2480: 2c 20 0a 20 20 20 20 20 20 20 22 45 78 70 72 65  , .       "Expre
2490: 73 73 69 6f 6e 20 74 72 65 65 20 69 73 20 74 6f  ssion tree is to
24a0: 6f 20 6c 61 72 67 65 20 28 6d 61 78 69 6d 75 6d  o large (maximum
24b0: 20 64 65 70 74 68 20 25 64 29 22 2c 20 6d 78 48   depth %d)", mxH
24c0: 65 69 67 68 74 0a 20 20 20 20 29 3b 0a 20 20 20  eight.    );.   
24d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
24e0: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
24f0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 66   rc;.}../* The f
2500: 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 66  ollowing three f
2510: 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69 67 68 74  unctions, height
2520: 4f 66 45 78 70 72 28 29 2c 20 68 65 69 67 68 74  OfExpr(), height
2530: 4f 66 45 78 70 72 4c 69 73 74 28 29 0a 2a 2a 20  OfExprList().** 
2540: 61 6e 64 20 68 65 69 67 68 74 4f 66 53 65 6c 65  and heightOfSele
2550: 63 74 28 29 2c 20 61 72 65 20 75 73 65 64 20 74  ct(), are used t
2560: 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
2570: 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 0a 2a  maximum height.*
2580: 2a 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73  * of any express
2590: 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e  ion tree referen
25a0: 63 65 64 20 62 79 20 74 68 65 20 73 74 72 75 63  ced by the struc
25b0: 74 75 72 65 20 70 61 73 73 65 64 20 61 73 20 74  ture passed as t
25c0: 68 65 0a 2a 2a 20 66 69 72 73 74 20 61 72 67 75  he.** first argu
25d0: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ment..**.** If t
25e0: 68 69 73 20 6d 61 78 69 6d 75 6d 20 68 65 69 67  his maximum heig
25f0: 68 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ht is greater th
2600: 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  an the current v
2610: 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a 2a 2a 20  alue pointed.** 
2620: 74 6f 20 62 79 20 70 6e 48 65 69 67 68 74 2c 20  to by pnHeight, 
2630: 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
2640: 65 74 65 72 2c 20 74 68 65 6e 20 73 65 74 20 2a  eter, then set *
2650: 70 6e 48 65 69 67 68 74 20 74 6f 20 74 68 61 74  pnHeight to that
2660: 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  .** value..*/.st
2670: 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74  atic void height
2680: 4f 66 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20  OfExpr(Expr *p, 
2690: 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a  int *pnHeight){.
26a0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
26b0: 66 28 20 70 2d 3e 6e 48 65 69 67 68 74 3e 2a 70  f( p->nHeight>*p
26c0: 6e 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20 20  nHeight ){.     
26d0: 20 2a 70 6e 48 65 69 67 68 74 20 3d 20 70 2d 3e   *pnHeight = p->
26e0: 6e 48 65 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20  nHeight;.    }. 
26f0: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
2700: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
2710: 74 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69  t(ExprList *p, i
2720: 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20  nt *pnHeight){. 
2730: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e   if( p ){.    in
2740: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
2750: 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b  ; i<p->nExpr; i+
2760: 2b 29 7b 0a 20 20 20 20 20 20 68 65 69 67 68 74  +){.      height
2770: 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69 5d 2e 70  OfExpr(p->a[i].p
2780: 45 78 70 72 2c 20 70 6e 48 65 69 67 68 74 29 3b  Expr, pnHeight);
2790: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61  .    }.  }.}.sta
27a0: 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f  tic void heightO
27b0: 66 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a  fSelect(Select *
27c0: 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74  p, int *pnHeight
27d0: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
27e0: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
27f0: 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48 65 69 67  ->pWhere, pnHeig
2800: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
2810: 66 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67  fExpr(p->pHaving
2820: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
2830: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
2840: 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65 69 67 68  >pLimit, pnHeigh
2850: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
2860: 45 78 70 72 28 70 2d 3e 70 4f 66 66 73 65 74 2c  Expr(p->pOffset,
2870: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
2880: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
2890: 28 70 2d 3e 70 45 4c 69 73 74 2c 20 70 6e 48 65  (p->pEList, pnHe
28a0: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
28b0: 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  tOfExprList(p->p
28c0: 47 72 6f 75 70 42 79 2c 20 70 6e 48 65 69 67 68  GroupBy, pnHeigh
28d0: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
28e0: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64  ExprList(p->pOrd
28f0: 65 72 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b  erBy, pnHeight);
2900: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c  .    heightOfSel
2910: 65 63 74 28 70 2d 3e 70 50 72 69 6f 72 2c 20 70  ect(p->pPrior, p
2920: 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a  nHeight);.  }.}.
2930: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45  ./*.** Set the E
2940: 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72 69  xpr.nHeight vari
2950: 61 62 6c 65 20 69 6e 20 74 68 65 20 73 74 72 75  able in the stru
2960: 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73 20  cture passed as 
2970: 61 6e 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  an .** argument.
2980: 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 77   An expression w
2990: 69 74 68 20 6e 6f 20 63 68 69 6c 64 72 65 6e 2c  ith no children,
29a0: 20 45 78 70 72 2e 70 4c 69 73 74 20 6f 72 20 0a   Expr.pList or .
29b0: 2a 2a 20 45 78 70 72 2e 70 53 65 6c 65 63 74 20  ** Expr.pSelect 
29c0: 6d 65 6d 62 65 72 20 68 61 73 20 61 20 68 65 69  member has a hei
29d0: 67 68 74 20 6f 66 20 31 2e 20 41 6e 79 20 6f 74  ght of 1. Any ot
29e0: 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  her expression.*
29f0: 2a 20 68 61 73 20 61 20 68 65 69 67 68 74 20 65  * has a height e
2a00: 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78 69  qual to the maxi
2a10: 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e  mum height of an
2a20: 79 20 6f 74 68 65 72 20 0a 2a 2a 20 72 65 66 65  y other .** refe
2a30: 72 65 6e 63 65 64 20 45 78 70 72 20 70 6c 75 73  renced Expr plus
2a40: 20 6f 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   one..*/.static 
2a50: 76 6f 69 64 20 65 78 70 72 53 65 74 48 65 69 67  void exprSetHeig
2a60: 68 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  ht(Expr *p){.  i
2a70: 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a  nt nHeight = 0;.
2a80: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
2a90: 2d 3e 70 4c 65 66 74 2c 20 26 6e 48 65 69 67 68  ->pLeft, &nHeigh
2aa0: 74 29 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78  t);.  heightOfEx
2ab0: 70 72 28 70 2d 3e 70 52 69 67 68 74 2c 20 26 6e  pr(p->pRight, &n
2ac0: 48 65 69 67 68 74 29 3b 0a 20 20 69 66 28 20 45  Height);.  if( E
2ad0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2ae0: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
2af0: 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 53  ){.    heightOfS
2b00: 65 6c 65 63 74 28 70 2d 3e 78 2e 70 53 65 6c 65  elect(p->x.pSele
2b10: 63 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  ct, &nHeight);. 
2b20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 68 65 69 67   }else{.    heig
2b30: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
2b40: 78 2e 70 4c 69 73 74 2c 20 26 6e 48 65 69 67 68  x.pList, &nHeigh
2b50: 74 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48 65  t);.  }.  p->nHe
2b60: 69 67 68 74 20 3d 20 6e 48 65 69 67 68 74 20 2b  ight = nHeight +
2b70: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   1;.}../*.** Set
2b80: 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68   the Expr.nHeigh
2b90: 74 20 76 61 72 69 61 62 6c 65 20 75 73 69 6e 67  t variable using
2ba0: 20 74 68 65 20 65 78 70 72 53 65 74 48 65 69 67   the exprSetHeig
2bb0: 68 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 49  ht() function. I
2bc0: 66 0a 2a 2a 20 74 68 65 20 68 65 69 67 68 74 20  f.** the height 
2bd0: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
2be0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f  the maximum allo
2bf0: 77 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20 64  wed expression d
2c00: 65 70 74 68 2c 0a 2a 2a 20 6c 65 61 76 65 20 61  epth,.** leave a
2c10: 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73  n error in pPars
2c20: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
2c30: 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74 28  e3ExprSetHeight(
2c40: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
2c50: 78 70 72 20 2a 70 29 7b 0a 20 20 65 78 70 72 53  xpr *p){.  exprS
2c60: 65 74 48 65 69 67 68 74 28 70 29 3b 0a 20 20 73  etHeight(p);.  s
2c70: 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 48  qlite3ExprCheckH
2c80: 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70 2d  eight(pParse, p-
2c90: 3e 6e 48 65 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a  >nHeight);.}../*
2ca0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d  .** Return the m
2cb0: 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66  aximum height of
2cc0: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   any expression 
2cd0: 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64 0a  tree referenced.
2ce0: 2a 2a 20 62 79 20 74 68 65 20 73 65 6c 65 63 74  ** by the select
2cf0: 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65   statement passe
2d00: 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
2d10: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2d20: 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74  SelectExprHeight
2d30: 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69  (Select *p){.  i
2d40: 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a  nt nHeight = 0;.
2d50: 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74    heightOfSelect
2d60: 28 70 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  (p, &nHeight);. 
2d70: 20 72 65 74 75 72 6e 20 6e 48 65 69 67 68 74 3b   return nHeight;
2d80: 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69  .}.#else.  #defi
2d90: 6e 65 20 65 78 70 72 53 65 74 48 65 69 67 68 74  ne exprSetHeight
2da0: 28 79 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  (y).#endif /* SQ
2db0: 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
2dc0: 50 54 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  PTH>0 */../*.** 
2dd0: 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20  Construct a new 
2de0: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
2df0: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
2e00: 6e 74 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d  nter to it.  Mem
2e10: 6f 72 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20  ory.** for this 
2e20: 6e 6f 64 65 20 69 73 20 6f 62 74 61 69 6e 65 64  node is obtained
2e30: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
2e40: 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c  lloc().  The cal
2e50: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
2e60: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
2e70: 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20  for making sure 
2e80: 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74 75 61  the node eventua
2e90: 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a  lly gets freed..
2ea0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
2eb0: 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20  Expr(.  sqlite3 
2ec0: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
2ed0: 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 73 71  /* Handle for sq
2ee0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
2ef0: 6f 28 29 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c  o() (may be null
2f00: 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  ) */.  int op,  
2f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f20: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63  * Expression opc
2f30: 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ode */.  Expr *p
2f40: 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20  Left,           
2f50: 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e 64   /* Left operand
2f60: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67   */.  Expr *pRig
2f70: 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ht,           /*
2f80: 20 52 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a   Right operand *
2f90: 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  /.  const Token 
2fa0: 2a 70 54 6f 6b 65 6e 20 20 20 20 20 2f 2a 20 41  *pToken     /* A
2fb0: 72 67 75 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f  rgument token */
2fc0: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  .){.  Expr *pNew
2fd0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
2fe0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
2ff0: 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29  b, sizeof(Expr))
3000: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
3010: 29 7b 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 6d  ){.    /* When m
3020: 61 6c 6c 6f 63 20 66 61 69 6c 73 2c 20 64 65 6c  alloc fails, del
3030: 65 74 65 20 70 4c 65 66 74 20 61 6e 64 20 70 52  ete pLeft and pR
3040: 69 67 68 74 2e 20 45 78 70 72 65 73 73 69 6f 6e  ight. Expression
3050: 73 20 70 61 73 73 65 64 20 74 6f 20 0a 20 20 20  s passed to .   
3060: 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f   ** this functio
3070: 6e 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65  n must always be
3080: 20 61 6c 6c 6f 63 61 74 65 64 20 77 69 74 68 20   allocated with 
3090: 73 71 6c 69 74 65 33 45 78 70 72 28 29 20 66 6f  sqlite3Expr() fo
30a0: 72 20 74 68 69 73 20 0a 20 20 20 20 2a 2a 20 72  r this .    ** r
30b0: 65 61 73 6f 6e 2e 20 0a 20 20 20 20 2a 2f 0a 20  eason. .    */. 
30c0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
30d0: 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29 3b  lete(db, pLeft);
30e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
30f0: 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67 68  Delete(db, pRigh
3100: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  t);.    return 0
3110: 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70  ;.  }.  pNew->op
3120: 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 70 4e 65   = (u8)op;.  pNe
3130: 77 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66 74  w->pLeft = pLeft
3140: 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74  ;.  pNew->pRight
3150: 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 70 4e 65   = pRight;.  pNe
3160: 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20  w->iAgg = -1;.  
3170: 70 4e 65 77 2d 3e 73 70 61 6e 2e 7a 20 3d 20 28  pNew->span.z = (
3180: 75 38 2a 29 22 22 3b 0a 20 20 69 66 28 20 70 54  u8*)"";.  if( pT
3190: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65  oken ){.    asse
31a0: 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e 3d  rt( pToken->dyn=
31b0: 3d 30 20 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  =0 );.    pNew->
31c0: 73 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b  span = pNew->tok
31d0: 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20  en = *pToken;.  
31e0: 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74 20  }else if( pLeft 
31f0: 29 7b 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  ){.    if( pRigh
3200: 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  t ){.      if( p
3210: 52 69 67 68 74 2d 3e 73 70 61 6e 2e 64 79 6e 3d  Right->span.dyn=
3220: 3d 30 20 26 26 20 70 4c 65 66 74 2d 3e 73 70 61  =0 && pLeft->spa
3230: 6e 2e 64 79 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  n.dyn==0 ){.    
3240: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53      sqlite3ExprS
3250: 70 61 6e 28 70 4e 65 77 2c 20 26 70 4c 65 66 74  pan(pNew, &pLeft
3260: 2d 3e 73 70 61 6e 2c 20 26 70 52 69 67 68 74 2d  ->span, &pRight-
3270: 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  >span);.      }.
3280: 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74        if( pRight
3290: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70  ->flags & EP_Exp
32a0: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
32b0: 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c     pNew->flags |
32c0: 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b  = EP_ExpCollate;
32d0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
32e0: 43 6f 6c 6c 20 3d 20 70 52 69 67 68 74 2d 3e 70  Coll = pRight->p
32f0: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
3300: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 66    }.    if( pLef
3310: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78  t->flags & EP_Ex
3320: 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20  pCollate ){.    
3330: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
3340: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a   EP_ExpCollate;.
3350: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 43 6f 6c        pNew->pCol
3360: 6c 20 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c  l = pLeft->pColl
3370: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65  ;.    }.  }..  e
3380: 78 70 72 53 65 74 48 65 69 67 68 74 28 70 4e 65  xprSetHeight(pNe
3390: 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  w);.  return pNe
33a0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 6f 72 6b  w;.}../*.** Work
33b0: 73 20 6c 69 6b 65 20 73 71 6c 69 74 65 33 45 78  s like sqlite3Ex
33c0: 70 72 28 29 20 65 78 63 65 70 74 20 74 68 61 74  pr() except that
33d0: 20 69 74 20 74 61 6b 65 73 20 61 6e 20 65 78 74   it takes an ext
33e0: 72 61 20 50 61 72 73 65 2a 0a 2a 2a 20 61 72 67  ra Parse*.** arg
33f0: 75 6d 65 6e 74 20 61 6e 64 20 6e 6f 74 69 66 69  ument and notifi
3400: 65 73 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  es the associate
3410: 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 6a  d connection obj
3420: 65 63 74 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ect if malloc fa
3430: 69 6c 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ils..*/.Expr *sq
3440: 6c 69 74 65 33 50 45 78 70 72 28 0a 20 20 50 61  lite3PExpr(.  Pa
3450: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
3460: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
3470: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
3480: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
3490: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
34a0: 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ion opcode */.  
34b0: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20  Expr *pLeft,    
34c0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20          /* Left 
34d0: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70  operand */.  Exp
34e0: 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 20  r *pRight,      
34f0: 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70       /* Right op
3500: 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  erand */.  const
3510: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 20   Token *pToken  
3520: 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
3530: 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  oken */.){.  Exp
3540: 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78  r *p = sqlite3Ex
3550: 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6f  pr(pParse->db, o
3560: 70 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  p, pLeft, pRight
3570: 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28  , pToken);.  if(
3580: 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   p ){.    sqlite
3590: 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74  3ExprCheckHeight
35a0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69  (pParse, p->nHei
35b0: 67 68 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ght);.  }.  retu
35c0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  rn p;.}../*.** W
35d0: 68 65 6e 20 64 6f 69 6e 67 20 61 20 6e 65 73 74  hen doing a nest
35e0: 65 64 20 70 61 72 73 65 2c 20 79 6f 75 20 63 61  ed parse, you ca
35f0: 6e 20 69 6e 63 6c 75 64 65 20 74 65 72 6d 73 20  n include terms 
3600: 69 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  in an expression
3610: 0a 2a 2a 20 74 68 61 74 20 6c 6f 6f 6b 20 6c 69  .** that look li
3620: 6b 65 20 74 68 69 73 3a 20 20 20 23 31 20 23 32  ke this:   #1 #2
3630: 20 2e 2e 2e 20 20 54 68 65 73 65 20 74 65 72 6d   ...  These term
3640: 73 20 72 65 66 65 72 20 74 6f 20 72 65 67 69 73  s refer to regis
3650: 74 65 72 73 0a 2a 2a 20 69 6e 20 74 68 65 20 76  ters.** in the v
3660: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20  irtual machine. 
3670: 20 23 4e 20 69 73 20 74 68 65 20 4e 2d 74 68 20   #N is the N-th 
3680: 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  register..**.** 
3690: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
36a0: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
36b0: 72 73 65 72 20 74 6f 20 64 65 61 6c 20 77 69 74  rser to deal wit
36c0: 68 20 6f 6e 20 6f 66 20 74 68 6f 73 65 20 74 65  h on of those te
36d0: 72 6d 73 2e 0a 2a 2a 20 49 74 20 69 6d 6d 65 64  rms..** It immed
36e0: 69 61 74 65 6c 79 20 67 65 6e 65 72 61 74 65 73  iately generates
36f0: 20 63 6f 64 65 20 74 6f 20 73 74 6f 72 65 20 74   code to store t
3700: 68 65 20 76 61 6c 75 65 20 69 6e 20 61 20 6d 65  he value in a me
3710: 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  mory location..*
3720: 2a 20 54 68 65 20 72 65 74 75 72 6e 73 20 61 6e  * The returns an
3730: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
3740: 20 77 69 6c 6c 20 63 6f 64 65 20 74 6f 20 65 78   will code to ex
3750: 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20  tract the value 
3760: 66 72 6f 6d 0a 2a 2a 20 74 68 61 74 20 6d 65 6d  from.** that mem
3770: 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 61 73 20  ory location as 
3780: 6e 65 65 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 20  needed..*/.Expr 
3790: 2a 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72  *sqlite3Register
37a0: 45 78 70 72 28 50 61 72 73 65 20 2a 70 50 61 72  Expr(Parse *pPar
37b0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  se, Token *pToke
37c0: 6e 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  n){.  Vdbe *v = 
37d0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
37e0: 20 45 78 70 72 20 2a 70 3b 0a 20 20 69 66 28 20   Expr *p;.  if( 
37f0: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d  pParse->nested==
3800: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
3810: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3820: 20 22 6e 65 61 72 20 5c 22 25 54 5c 22 3a 20 73   "near \"%T\": s
3830: 79 6e 74 61 78 20 65 72 72 6f 72 22 2c 20 70 54  yntax error", pT
3840: 6f 6b 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72  oken);.    retur
3850: 6e 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  n sqlite3PExpr(p
3860: 50 61 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20  Parse, TK_NULL, 
3870: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  0, 0, 0);.  }.  
3880: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
3890: 6e 20 30 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74  n 0;.  p = sqlit
38a0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
38b0: 54 4b 5f 52 45 47 49 53 54 45 52 2c 20 30 2c 20  TK_REGISTER, 0, 
38c0: 30 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66  0, pToken);.  if
38d0: 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ( p==0 ){.    re
38e0: 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4d 61 6c 6c  turn 0;  /* Mall
38f0: 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d  oc failed */.  }
3900: 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 61  .  p->iTable = a
3910: 74 6f 69 28 28 63 68 61 72 2a 29 26 70 54 6f 6b  toi((char*)&pTok
3920: 65 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20 20 72 65 74  en->z[1]);.  ret
3930: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
3940: 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73  Join two express
3950: 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e  ions using an AN
3960: 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20  D operator.  If 
3970: 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69 6f  either expressio
3980: 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68  n is.** NULL, th
3990: 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74  en just return t
39a0: 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73  he other express
39b0: 69 6f 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ion..*/.Expr *sq
39c0: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 73 71 6c  lite3ExprAnd(sql
39d0: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a  ite3 *db, Expr *
39e0: 70 4c 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69  pLeft, Expr *pRi
39f0: 67 68 74 29 7b 0a 20 20 69 66 28 20 70 4c 65 66  ght){.  if( pLef
3a00: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  t==0 ){.    retu
3a10: 72 6e 20 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c  rn pRight;.  }el
3a20: 73 65 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30  se if( pRight==0
3a30: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
3a40: 4c 65 66 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Left;.  }else{. 
3a50: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
3a60: 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 41 4e 44  3Expr(db, TK_AND
3a70: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
3a80: 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   0);.  }.}../*.*
3a90: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 73  * Set the Expr.s
3aa0: 70 61 6e 20 66 69 65 6c 64 20 6f 66 20 74 68 65  pan field of the
3ab0: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
3ac0: 6e 20 74 6f 20 73 70 61 6e 20 61 6c 6c 0a 2a 2a  n to span all.**
3ad0: 20 74 65 78 74 20 62 65 74 77 65 65 6e 20 74 68   text between th
3ae0: 65 20 74 77 6f 20 67 69 76 65 6e 20 74 6f 6b 65  e two given toke
3af0: 6e 73 2e 20 20 42 6f 74 68 20 74 6f 6b 65 6e 73  ns.  Both tokens
3b00: 20 6d 75 73 74 20 62 65 20 70 6f 69 6e 74 69 6e   must be pointin
3b10: 67 0a 2a 2a 20 61 74 20 74 68 65 20 73 61 6d 65  g.** at the same
3b20: 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64   string..*/.void
3b30: 20 73 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e   sqlite3ExprSpan
3b40: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 54 6f  (Expr *pExpr, To
3b50: 6b 65 6e 20 2a 70 4c 65 66 74 2c 20 54 6f 6b 65  ken *pLeft, Toke
3b60: 6e 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 61 73  n *pRight){.  as
3b70: 73 65 72 74 28 20 70 52 69 67 68 74 21 3d 30 20  sert( pRight!=0 
3b80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65  );.  assert( pLe
3b90: 66 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ft!=0 );.  if( p
3ba0: 45 78 70 72 20 29 7b 0a 20 20 20 20 70 45 78 70  Expr ){.    pExp
3bb0: 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20 70 4c 65 66  r->span.z = pLef
3bc0: 74 2d 3e 7a 3b 0a 20 20 20 20 70 45 78 70 72 2d  t->z;.    pExpr-
3bd0: 3e 73 70 61 6e 2e 6e 20 3d 20 70 52 69 67 68 74  >span.n = pRight
3be0: 2d 3e 6e 20 2b 20 28 70 52 69 67 68 74 2d 3e 7a  ->n + (pRight->z
3bf0: 20 2d 20 70 4c 65 66 74 2d 3e 7a 29 3b 0a 20 20   - pLeft->z);.  
3c00: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  }.}../*.** Const
3c10: 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65  ruct a new expre
3c20: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61  ssion node for a
3c30: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d   function with m
3c40: 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d  ultiple.** argum
3c50: 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  ents..*/.Expr *s
3c60: 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69  qlite3ExprFuncti
3c70: 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
3c80: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
3c90: 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
3ca0: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  ){.  Expr *pNew;
3cb0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
3cc0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
3cd0: 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b  ssert( pToken );
3ce0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
3cf0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
3d00: 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 20 29  , sizeof(Expr) )
3d10: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
3d20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
3d30: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
3d40: 20 70 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69   pList); /* Avoi
3d50: 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79  d leaking memory
3d60: 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69   when malloc fai
3d70: 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ls */.    return
3d80: 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e   0;.  }.  pNew->
3d90: 6f 70 20 3d 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  op = TK_FUNCTION
3da0: 3b 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73  ;.  pNew->x.pLis
3db0: 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73 73  t = pList;.  ass
3dc0: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
3dd0: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78  perty(pNew, EP_x
3de0: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 61  IsSelect) );.  a
3df0: 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 64  ssert( pToken->d
3e00: 79 6e 3d 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d  yn==0 );.  pNew-
3e10: 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e  >token = *pToken
3e20: 3b 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d  ;.  pNew->span =
3e30: 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 3b 0a 0a 20   pNew->token;.. 
3e40: 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48   sqlite3ExprSetH
3e50: 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70 4e  eight(pParse, pN
3e60: 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  ew);.  return pN
3e70: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73  ew;.}../*.** Ass
3e80: 69 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e  ign a variable n
3e90: 75 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72  umber to an expr
3ea0: 65 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f  ession that enco
3eb0: 64 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a  des a wildcard.*
3ec0: 2a 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  * in the origina
3ed0: 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  l SQL statement.
3ee0: 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72    .**.** Wildcar
3ef0: 64 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66  ds consisting of
3f00: 20 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72   a single "?" ar
3f10: 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e  e assigned the n
3f20: 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a  ext sequential.*
3f30: 2a 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  * variable numbe
3f40: 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72  r..**.** Wildcar
3f50: 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ds of the form "
3f60: 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e  ?nnn" are assign
3f70: 65 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e  ed the number "n
3f80: 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a  nn".  We make.**
3f90: 20 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e   sure "nnn" is n
3fa0: 6f 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f  ot too be to avo
3fb0: 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73  id a denial of s
3fc0: 65 72 76 69 63 65 20 61 74 74 61 63 6b 20 77 68  ervice attack wh
3fd0: 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74  en.** the SQL st
3fe0: 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72  atement comes fr
3ff0: 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73  om an external s
4000: 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c  ource..**.** Wil
4010: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
4020: 72 6d 20 22 3a 61 61 61 22 20 6f 72 20 22 24 61  rm ":aaa" or "$a
4030: 61 61 22 20 61 72 65 20 61 73 73 69 67 6e 65 64  aa" are assigned
4040: 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
4050: 0a 2a 2a 20 61 73 20 74 68 65 20 70 72 65 76 69  .** as the previ
4060: 6f 75 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ous instance of 
4070: 74 68 65 20 73 61 6d 65 20 77 69 6c 64 63 61 72  the same wildcar
4080: 64 2e 20 20 4f 72 20 69 66 20 74 68 69 73 20 69  d.  Or if this i
4090: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69  s the first.** i
40a0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 77  nstance of the w
40b0: 69 6c 64 63 61 72 64 2c 20 74 68 65 20 6e 65 78  ildcard, the nex
40c0: 74 20 73 65 71 75 65 6e 69 61 6c 20 76 61 72 69  t sequenial vari
40d0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a  able number is.*
40e0: 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76  * assigned..*/.v
40f0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
4100: 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50  ssignVarNumber(P
4110: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
4120: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 54 6f  pr *pExpr){.  To
4130: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 73  ken *pToken;.  s
4140: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
4150: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
4160: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
4170: 6e 3b 0a 20 20 70 54 6f 6b 65 6e 20 3d 20 26 70  n;.  pToken = &p
4180: 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 61  Expr->token;.  a
4190: 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 6e  ssert( pToken->n
41a0: 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=1 );.  assert(
41b0: 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 29 3b   pToken->z!=0 );
41c0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65  .  assert( pToke
41d0: 6e 2d 3e 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20  n->z[0]!=0 );.  
41e0: 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 31  if( pToken->n==1
41f0: 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63   ){.    /* Wildc
4200: 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ard of the form 
4210: 22 3f 22 2e 20 20 41 73 73 69 67 6e 20 74 68 65  "?".  Assign the
4220: 20 6e 65 78 74 20 76 61 72 69 61 62 6c 65 20 6e   next variable n
4230: 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 70 45 78  umber */.    pEx
4240: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2b 2b 70  pr->iTable = ++p
4250: 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 7d  Parse->nVar;.  }
4260: 65 6c 73 65 20 69 66 28 20 70 54 6f 6b 65 6e 2d  else if( pToken-
4270: 3e 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20  >z[0]=='?' ){.  
4280: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66    /* Wildcard of
4290: 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22   the form "?nnn"
42a0: 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e 6e 6e 22  .  Convert "nnn"
42b0: 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 61   to an integer a
42c0: 6e 64 0a 20 20 20 20 2a 2a 20 75 73 65 20 69 74  nd.    ** use it
42d0: 20 61 73 20 74 68 65 20 76 61 72 69 61 62 6c 65   as the variable
42e0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 69   number */.    i
42f0: 6e 74 20 69 3b 0a 20 20 20 20 70 45 78 70 72 2d  nt i;.    pExpr-
4300: 3e 69 54 61 62 6c 65 20 3d 20 69 20 3d 20 61 74  >iTable = i = at
4310: 6f 69 28 28 63 68 61 72 2a 29 26 70 54 6f 6b 65  oi((char*)&pToke
4320: 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20 20 20 20 74 65  n->z[1]);.    te
4330: 73 74 63 61 73 65 28 20 69 3d 3d 30 20 29 3b 0a  stcase( i==0 );.
4340: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d      testcase( i=
4350: 3d 31 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =1 );.    testca
4360: 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69  se( i==db->aLimi
4370: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
4380: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d  ARIABLE_NUMBER]-
4390: 31 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  1 );.    testcas
43a0: 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74  e( i==db->aLimit
43b0: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
43c0: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29  RIABLE_NUMBER] )
43d0: 3b 0a 20 20 20 20 69 66 28 20 69 3c 31 20 7c 7c  ;.    if( i<1 ||
43e0: 20 69 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51   i>db->aLimit[SQ
43f0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
4400: 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20  BLE_NUMBER] ){. 
4410: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
4420: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 61  rMsg(pParse, "va
4430: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75  riable number mu
4440: 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31  st be between ?1
4450: 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20   and ?%d",.     
4460: 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b       db->aLimit[
4470: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
4480: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a  IABLE_NUMBER]);.
4490: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e      }.    if( i>
44a0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a  pParse->nVar ){.
44b0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56        pParse->nV
44c0: 61 72 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20  ar = i;.    }.  
44d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 69  }else{.    /* Wi
44e0: 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66  ldcards of the f
44f0: 6f 72 6d 20 22 3a 61 61 61 22 20 6f 72 20 22 24  orm ":aaa" or "$
4500: 61 61 61 22 2e 20 20 52 65 75 73 65 20 74 68 65  aaa".  Reuse the
4510: 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20   same variable. 
4520: 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20     ** number as 
4530: 74 68 65 20 70 72 69 6f 72 20 61 70 70 65 61 72  the prior appear
4540: 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65  ance of the same
4550: 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65   name, or if the
4560: 20 6e 61 6d 65 0a 20 20 20 20 2a 2a 20 68 61 73   name.    ** has
4570: 20 6e 65 76 65 72 20 61 70 70 65 61 72 65 64 20   never appeared 
4580: 62 65 66 6f 72 65 2c 20 72 65 75 73 65 20 74 68  before, reuse th
4590: 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 20  e same variable 
45a0: 6e 75 6d 62 65 72 0a 20 20 20 20 2a 2f 0a 20 20  number.    */.  
45b0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 75 33 32    int i;.    u32
45c0: 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 70 54 6f 6b   n;.    n = pTok
45d0: 65 6e 2d 3e 6e 3b 0a 20 20 20 20 66 6f 72 28 69  en->n;.    for(i
45e0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56  =0; i<pParse->nV
45f0: 61 72 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  arExpr; i++){.  
4600: 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20      Expr *pE;.  
4610: 20 20 20 20 69 66 28 20 28 70 45 20 3d 20 70 50      if( (pE = pP
4620: 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 5b  arse->apVarExpr[
4630: 69 5d 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  i])!=0.         
4640: 20 26 26 20 70 45 2d 3e 74 6f 6b 65 6e 2e 6e 3d   && pE->token.n=
4650: 3d 6e 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  =n.          && 
4660: 6d 65 6d 63 6d 70 28 70 45 2d 3e 74 6f 6b 65 6e  memcmp(pE->token
4670: 2e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 6e  .z, pToken->z, n
4680: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
4690: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
46a0: 70 45 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pE->iTable;.    
46b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
46c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
46d0: 20 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61 72   i>=pParse->nVar
46e0: 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 45  Expr ){.      pE
46f0: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2b 2b  xpr->iTable = ++
4700: 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20  pParse->nVar;.  
4710: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
4720: 6e 56 61 72 45 78 70 72 3e 3d 70 50 61 72 73 65  nVarExpr>=pParse
4730: 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 2d  ->nVarExprAlloc-
4740: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  1 ){.        pPa
4750: 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c  rse->nVarExprAll
4760: 6f 63 20 2b 3d 20 70 50 61 72 73 65 2d 3e 6e 56  oc += pParse->nV
4770: 61 72 45 78 70 72 41 6c 6c 6f 63 20 2b 20 31 30  arExprAlloc + 10
4780: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
4790: 2d 3e 61 70 56 61 72 45 78 70 72 20 3d 0a 20 20  ->apVarExpr =.  
47a0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
47b0: 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65  3DbReallocOrFree
47c0: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
47d0: 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
47e0: 20 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45    pParse->apVarE
47f0: 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
4800: 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45     pParse->nVarE
4810: 78 70 72 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28  xprAlloc*sizeof(
4820: 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70  pParse->apVarExp
4830: 72 5b 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20  r[0]).          
4840: 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20    );.      }.   
4850: 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c     if( !db->mall
4860: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
4870: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
4880: 73 65 2d 3e 61 70 56 61 72 45 78 70 72 21 3d 30  se->apVarExpr!=0
4890: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72   );.        pPar
48a0: 73 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 70 50  se->apVarExpr[pP
48b0: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 2b 2b  arse->nVarExpr++
48c0: 5d 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  ] = pExpr;.     
48d0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 20 20   }.    }.  } .  
48e0: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 45 72  if( !pParse->nEr
48f0: 72 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 56 61  r && pParse->nVa
4900: 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  r>db->aLimit[SQL
4910: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
4920: 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20  LE_NUMBER] ){.  
4930: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
4940: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
4950: 61 6e 79 20 53 51 4c 20 76 61 72 69 61 62 6c 65  any SQL variable
4960: 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  s");.  }.}../*.*
4970: 2a 20 43 6c 65 61 72 20 61 6e 20 65 78 70 72 65  * Clear an expre
4980: 73 73 69 6f 6e 20 73 74 72 75 63 74 75 72 65 20  ssion structure 
4990: 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67  without deleting
49a0: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 69   the structure i
49b0: 74 73 65 6c 66 2e 0a 2a 2a 20 53 75 62 73 74 72  tself..** Substr
49c0: 75 63 74 75 72 65 20 69 73 20 64 65 6c 65 74 65  ucture is delete
49d0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
49e0: 65 33 45 78 70 72 43 6c 65 61 72 28 73 71 6c 69  e3ExprClear(sqli
49f0: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
4a00: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65  ){.  if( p->toke
4a10: 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65 33 44  n.dyn ) sqlite3D
4a20: 62 46 72 65 65 28 64 62 2c 20 28 63 68 61 72 2a  bFree(db, (char*
4a30: 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20  )p->token.z);.  
4a40: 69 66 28 20 21 45 78 70 72 48 61 73 41 6e 79 50  if( !ExprHasAnyP
4a50: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f  roperty(p, EP_To
4a60: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53 70 61 6e 4f  kenOnly|EP_SpanO
4a70: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 69 66 28 20  nly) ){.    if( 
4a80: 70 2d 3e 73 70 61 6e 2e 64 79 6e 20 29 20 73 71  p->span.dyn ) sq
4a90: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4aa0: 28 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a  (char*)p->span.z
4ab0: 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48  );.    if( ExprH
4ac0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
4ad0: 5f 52 65 64 75 63 65 64 29 20 29 7b 0a 20 20 20  _Reduced) ){.   
4ae0: 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20     if( p->pLeft 
4af0: 29 20 73 71 6c 69 74 65 33 45 78 70 72 43 6c 65  ) sqlite3ExprCle
4b00: 61 72 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29  ar(db, p->pLeft)
4b10: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  ;.      if( p->p
4b20: 52 69 67 68 74 20 29 20 73 71 6c 69 74 65 33 45  Right ) sqlite3E
4b30: 78 70 72 43 6c 65 61 72 28 64 62 2c 20 70 2d 3e  xprClear(db, p->
4b40: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 65 6c  pRight);.    }el
4b50: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
4b60: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
4b70: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  p->pLeft);.     
4b80: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
4b90: 74 65 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74  te(db, p->pRight
4ba0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
4bb0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
4bc0: 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  (p, EP_xIsSelect
4bd0: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
4be0: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
4bf0: 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29  b, p->x.pSelect)
4c00: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
4c10: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
4c20: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
4c30: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a  x.pList);.    }.
4c40: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63    }.}../*.** Rec
4c50: 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20  ursively delete 
4c60: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
4c70: 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ee..*/.void sqli
4c80: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 73 71  te3ExprDelete(sq
4c90: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
4ca0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20  *p){.  if( p==0 
4cb0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
4cc0: 74 65 33 45 78 70 72 43 6c 65 61 72 28 64 62 2c  te3ExprClear(db,
4cd0: 20 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62   p);.  sqlite3Db
4ce0: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  Free(db, p);.}..
4cf0: 2f 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e 74  /*.** The Expr.t
4d00: 6f 6b 65 6e 20 66 69 65 6c 64 20 6d 69 67 68 74  oken field might
4d10: 20 62 65 20 61 20 73 74 72 69 6e 67 20 6c 69 74   be a string lit
4d20: 65 72 61 6c 20 74 68 61 74 20 69 73 20 71 75 6f  eral that is quo
4d30: 74 65 64 2e 0a 2a 2a 20 49 66 20 73 6f 2c 20 72  ted..** If so, r
4d40: 65 6d 6f 76 65 20 74 68 65 20 71 75 6f 74 61 74  emove the quotat
4d50: 69 6f 6e 20 6d 61 72 6b 73 2e 0a 2a 2f 0a 76 6f  ion marks..*/.vo
4d60: 69 64 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74  id sqlite3Dequot
4d70: 65 45 78 70 72 28 73 71 6c 69 74 65 33 20 2a 64  eExpr(sqlite3 *d
4d80: 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  b, Expr *p){.  i
4d90: 66 28 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f  f( ExprHasAnyPro
4da0: 70 65 72 74 79 28 70 2c 20 45 50 5f 44 65 71 75  perty(p, EP_Dequ
4db0: 6f 74 65 64 29 20 29 7b 0a 20 20 20 20 72 65 74  oted) ){.    ret
4dc0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 45 78 70 72 53  urn;.  }.  ExprS
4dd0: 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  etProperty(p, EP
4de0: 5f 44 65 71 75 6f 74 65 64 29 3b 0a 20 20 69 66  _Dequoted);.  if
4df0: 28 20 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 3d 3d  ( p->token.dyn==
4e00: 30 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f  0 && !ExprHasPro
4e10: 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75  perty(p, EP_Redu
4e20: 63 65 64 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ced) ){.    sqli
4e30: 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c  te3TokenCopy(db,
4e40: 20 26 70 2d 3e 74 6f 6b 65 6e 2c 20 26 70 2d 3e   &p->token, &p->
4e50: 74 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20 73 71  token);.  }.  sq
4e60: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 28 63 68  lite3Dequote((ch
4e70: 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b  ar*)p->token.z);
4e80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
4e90: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
4ea0: 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66  ytes allocated f
4eb0: 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  or the expressio
4ec0: 6e 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20  n structure .** 
4ed0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
4ee0: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  rst argument. Th
4ef0: 69 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65  is is always one
4f00: 20 6f 66 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a   of EXPR_FULLSIZ
4f10: 45 2c 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55 43  E,.** EXPR_REDUC
4f20: 45 44 53 49 5a 45 20 6f 72 20 45 58 50 52 5f 54  EDSIZE or EXPR_T
4f30: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f  OKENONLYSIZE..*/
4f40: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
4f50: 53 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20  StructSize(Expr 
4f60: 2a 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48  *p){.  if( ExprH
4f70: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
4f80: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65  _TokenOnly) ) re
4f90: 74 75 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f  turn EXPR_TOKENO
4fa0: 4e 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28 20 45  NLYSIZE;.  if( E
4fb0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
4fc0: 2c 20 45 50 5f 53 70 61 6e 4f 6e 6c 79 29 20 29  , EP_SpanOnly) )
4fd0: 20 72 65 74 75 72 6e 20 45 58 50 52 5f 53 50 41   return EXPR_SPA
4fe0: 4e 4f 4e 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28  NONLYSIZE;.  if(
4ff0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
5000: 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20  (p, EP_Reduced) 
5010: 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f 52 45  ) return EXPR_RE
5020: 44 55 43 45 44 53 49 5a 45 3b 0a 20 20 72 65 74  DUCEDSIZE;.  ret
5030: 75 72 6e 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a  urn EXPR_FULLSIZ
5040: 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69  E;.}../*.** sqli
5050: 74 65 33 45 78 70 72 44 75 70 28 29 20 68 61 73  te3ExprDup() has
5060: 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20   been called to 
5070: 63 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66  create a copy of
5080: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 77 69   expression p wi
5090: 74 68 0a 2a 2a 20 74 68 65 20 45 58 50 52 44 55  th.** the EXPRDU
50a0: 50 5f 58 58 58 20 66 6c 61 67 73 20 70 61 73 73  P_XXX flags pass
50b0: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
50c0: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 20   argument. This 
50d0: 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 72 65 74  function .** ret
50e0: 75 72 6e 73 20 74 68 65 20 73 70 61 63 65 20 72  urns the space r
50f0: 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 65 20  equired for the 
5100: 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72  copy of the Expr
5110: 20 73 74 72 75 63 74 75 72 65 20 6f 6e 6c 79 2e   structure only.
5120: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6c 77 61  .** This is alwa
5130: 79 73 20 6f 6e 65 20 6f 66 20 45 58 50 52 5f 46  ys one of EXPR_F
5140: 55 4c 4c 53 49 5a 45 2c 20 45 58 50 52 5f 52 45  ULLSIZE, EXPR_RE
5150: 44 55 43 45 44 53 49 5a 45 20 6f 72 20 45 58 50  DUCEDSIZE or EXP
5160: 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e  R_TOKENONLYSIZE.
5170: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
5180: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
5190: 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  ze(Expr *p, int 
51a0: 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 53  flags){.  int nS
51b0: 69 7a 65 3b 0a 20 20 69 66 28 20 30 3d 3d 28 66  ize;.  if( 0==(f
51c0: 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52 45 44  lags&EXPRDUP_RED
51d0: 55 43 45 29 20 29 7b 0a 20 20 20 20 6e 53 69 7a  UCE) ){.    nSiz
51e0: 65 20 3d 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a  e = EXPR_FULLSIZ
51f0: 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  E;.  }else if( p
5200: 2d 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e 70 52  ->pLeft || p->pR
5210: 69 67 68 74 20 7c 7c 20 70 2d 3e 70 43 6f 6c 6c  ight || p->pColl
5220: 20 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29   || p->x.pList )
5230: 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58  {.    nSize = EX
5240: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 3b 0a  PR_REDUCEDSIZE;.
5250: 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
5260: 73 26 45 58 50 52 44 55 50 5f 53 50 41 4e 20 29  s&EXPRDUP_SPAN )
5270: 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58  {.    nSize = EX
5280: 50 52 5f 53 50 41 4e 4f 4e 4c 59 53 49 5a 45 3b  PR_SPANONLYSIZE;
5290: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 53  .  }else{.    nS
52a0: 69 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45 4e  ize = EXPR_TOKEN
52b0: 4f 4e 4c 59 53 49 5a 45 3b 0a 20 20 7d 0a 20 20  ONLYSIZE;.  }.  
52c0: 72 65 74 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a  return nSize;.}.
52d0: 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78  ./*.** sqlite3Ex
52e0: 70 72 44 75 70 28 29 20 68 61 73 20 62 65 65 6e  prDup() has been
52f0: 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
5300: 65 20 61 20 63 6f 70 79 20 6f 66 20 65 78 70 72  e a copy of expr
5310: 65 73 73 69 6f 6e 20 70 20 77 69 74 68 0a 2a 2a  ession p with.**
5320: 20 74 68 65 20 45 58 50 52 44 55 50 5f 58 58 58   the EXPRDUP_XXX
5330: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
5340: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20  econd argument. 
5350: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
5360: 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 73 70 61  turns.** the spa
5370: 63 65 20 69 6e 20 62 79 74 65 73 20 72 65 71 75  ce in bytes requ
5380: 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  ired to store th
5390: 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78  e copy of the Ex
53a0: 70 72 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  pr structure.** 
53b0: 61 6e 64 20 74 68 65 20 63 6f 70 69 65 73 20 6f  and the copies o
53c0: 66 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e  f the Expr.token
53d0: 2e 7a 20 61 6e 64 20 45 78 70 72 2e 73 70 61 6e  .z and Expr.span
53e0: 2e 7a 20 28 69 66 20 61 70 70 6c 69 63 61 62 6c  .z (if applicabl
53f0: 65 29 0a 2a 2a 20 73 74 72 69 6e 67 20 62 75 66  e).** string buf
5400: 66 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  fers..*/.static 
5410: 69 6e 74 20 64 75 70 65 64 45 78 70 72 4e 6f 64  int dupedExprNod
5420: 65 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69  eSize(Expr *p, i
5430: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74  nt flags){.  int
5440: 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45 78   nByte = dupedEx
5450: 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c 20  prStructSize(p, 
5460: 66 6c 61 67 73 29 20 2b 20 28 70 2d 3e 74 6f 6b  flags) + (p->tok
5470: 65 6e 2e 7a 20 3f 20 70 2d 3e 74 6f 6b 65 6e 2e  en.z ? p->token.
5480: 6e 20 2b 20 31 20 3a 20 30 29 3b 0a 20 20 69 66  n + 1 : 0);.  if
5490: 28 20 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f  ( flags&EXPRDUP_
54a0: 53 50 41 4e 20 26 26 20 28 70 2d 3e 74 6f 6b 65  SPAN && (p->toke
54b0: 6e 2e 7a 21 3d 70 2d 3e 73 70 61 6e 2e 7a 20 7c  n.z!=p->span.z |
54c0: 7c 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 70 2d  | p->token.n!=p-
54d0: 3e 73 70 61 6e 2e 6e 29 20 29 7b 0a 20 20 20 20  >span.n) ){.    
54e0: 6e 42 79 74 65 20 2b 3d 20 70 2d 3e 73 70 61 6e  nByte += p->span
54f0: 2e 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  .n;.  }.  return
5500: 20 28 6e 42 79 74 65 2b 37 29 26 7e 37 3b 0a 7d   (nByte+7)&~7;.}
5510: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
5520: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
5530: 65 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 63  es required to c
5540: 72 65 61 74 65 20 61 20 64 75 70 6c 69 63 61 74  reate a duplicat
5550: 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 65 78 70  e of the .** exp
5560: 72 65 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61  ression passed a
5570: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
5580: 6d 65 6e 74 2e 20 54 68 65 20 73 65 63 6f 6e 64  ment. The second
5590: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a   argument is a.*
55a0: 2a 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 69 6e  * mask containin
55b0: 67 20 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c  g EXPRDUP_XXX fl
55c0: 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76  ags..**.** The v
55d0: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 6e  alue returned in
55e0: 63 6c 75 64 65 73 20 73 70 61 63 65 20 74 6f 20  cludes space to 
55f0: 63 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66  create a copy of
5600: 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74   the Expr struct
5610: 0a 2a 2a 20 69 74 73 65 6c 66 20 61 6e 64 20 74  .** itself and t
5620: 68 65 20 62 75 66 66 65 72 20 72 65 66 65 72 72  he buffer referr
5630: 65 64 20 74 6f 20 62 79 20 45 78 70 72 2e 74 6f  ed to by Expr.to
5640: 6b 65 6e 2c 20 69 66 20 61 6e 79 2e 20 49 66 20  ken, if any. If 
5650: 74 68 65 20 0a 2a 2a 20 45 58 50 52 44 55 50 5f  the .** EXPRDUP_
5660: 53 50 41 4e 20 66 6c 61 67 20 69 73 20 73 65 74  SPAN flag is set
5670: 2c 20 74 68 65 6e 20 73 70 61 63 65 20 74 6f 20  , then space to 
5680: 63 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66  create a copy of
5690: 20 74 68 65 20 62 75 66 66 65 72 0a 2a 2a 20 72   the buffer.** r
56a0: 65 66 65 72 65 64 20 74 6f 20 62 79 20 45 78 70  efered to by Exp
56b0: 72 2e 73 70 61 6e 20 69 73 20 61 6c 73 6f 20 69  r.span is also i
56c0: 6e 63 6c 75 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ncluded..**.** I
56d0: 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 52 45  f the EXPRDUP_RE
56e0: 44 55 43 45 20 66 6c 61 67 20 69 73 20 73 65 74  DUCE flag is set
56f0: 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72  , then the retur
5700: 6e 20 76 61 6c 75 65 20 69 6e 63 6c 75 64 65 73  n value includes
5710: 20 0a 2a 2a 20 73 70 61 63 65 20 74 6f 20 64 75   .** space to du
5720: 70 6c 69 63 61 74 65 20 61 6c 6c 20 45 78 70 72  plicate all Expr
5730: 20 6e 6f 64 65 73 20 69 6e 20 74 68 65 20 74 72   nodes in the tr
5740: 65 65 20 66 6f 72 6d 65 64 20 62 79 20 45 78 70  ee formed by Exp
5750: 72 2e 70 4c 65 66 74 20 0a 2a 2a 20 61 6e 64 20  r.pLeft .** and 
5760: 45 78 70 72 2e 70 52 69 67 68 74 20 76 61 72 69  Expr.pRight vari
5770: 61 62 6c 65 73 20 28 62 75 74 20 6e 6f 74 20 66  ables (but not f
5780: 6f 72 20 61 6e 79 20 73 74 72 75 63 74 75 72 65  or any structure
5790: 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 6f 72 20  s pointed to or 
57a0: 0a 2a 2a 20 64 65 73 63 65 6e 64 65 64 20 66 72  .** descended fr
57b0: 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c  om the Expr.x.pL
57c0: 69 73 74 20 6f 72 20 45 78 70 72 2e 78 2e 70 53  ist or Expr.x.pS
57d0: 65 6c 65 63 74 20 76 61 72 69 61 62 6c 65 73 29  elect variables)
57e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
57f0: 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 45 78  dupedExprSize(Ex
5800: 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  pr *p, int flags
5810: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  ){.  int nByte =
5820: 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20   0;.  if( p ){. 
5830: 20 20 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64     nByte = duped
5840: 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20  ExprNodeSize(p, 
5850: 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  flags);.    if( 
5860: 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52 45  flags&EXPRDUP_RE
5870: 44 55 43 45 20 29 7b 0a 20 20 20 20 20 20 69 6e  DUCE ){.      in
5880: 74 20 66 20 3d 20 66 6c 61 67 73 26 28 7e 45 58  t f = flags&(~EX
5890: 50 52 44 55 50 5f 53 50 41 4e 29 3b 0a 20 20 20  PRDUP_SPAN);.   
58a0: 20 20 20 6e 42 79 74 65 20 2b 3d 20 64 75 70 65     nByte += dupe
58b0: 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c 65  dExprSize(p->pLe
58c0: 66 74 2c 20 66 29 20 2b 20 64 75 70 65 64 45 78  ft, f) + dupedEx
58d0: 70 72 53 69 7a 65 28 70 2d 3e 70 52 69 67 68 74  prSize(p->pRight
58e0: 2c 20 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , f);.    }.  }.
58f0: 20 20 72 65 74 75 72 6e 20 6e 42 79 74 65 3b 0a    return nByte;.
5900: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
5910: 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61  nction is simila
5920: 72 20 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72  r to sqlite3Expr
5930: 44 75 70 28 29 2c 20 65 78 63 65 70 74 20 74 68  Dup(), except th
5940: 61 74 20 69 66 20 70 7a 42 75 66 66 65 72 20 0a  at if pzBuffer .
5950: 2a 2a 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  ** is not NULL t
5960: 68 65 6e 20 2a 70 7a 42 75 66 66 65 72 20 69 73  hen *pzBuffer is
5970: 20 61 73 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e   assumed to poin
5980: 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6c 61  t to a buffer la
5990: 72 67 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20 74  rge enough .** t
59a0: 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79  o store the copy
59b0: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70   of expression p
59c0: 2c 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20  , the copies of 
59d0: 70 2d 3e 74 6f 6b 65 6e 20 61 6e 64 20 70 2d 3e  p->token and p->
59e0: 73 70 61 6e 20 0a 2a 2a 20 28 69 66 20 61 70 70  span .** (if app
59f0: 6c 69 63 61 62 6c 65 29 2c 20 61 6e 64 20 74 68  licable), and th
5a00: 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  e copies of the 
5a10: 70 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e  p->pLeft and p->
5a20: 70 52 69 67 68 74 20 65 78 70 72 65 73 73 69 6f  pRight expressio
5a30: 6e 73 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42  ns,.** if any. B
5a40: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
5a50: 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20 73 65   *pzBuffer is se
5a60: 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62  t to the first b
5a70: 79 74 65 20 70 61 73 73 65 64 20 74 68 65 0a 2a  yte passed the.*
5a80: 2a 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  * portion of the
5a90: 20 62 75 66 66 65 72 20 63 6f 70 69 65 64 20 69   buffer copied i
5aa0: 6e 74 6f 20 62 79 20 74 68 69 73 20 66 75 6e 63  nto by this func
5ab0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
5ac0: 45 78 70 72 20 2a 65 78 70 72 44 75 70 28 73 71  Expr *exprDup(sq
5ad0: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
5ae0: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20 75  *p, int flags, u
5af0: 38 20 2a 2a 70 7a 42 75 66 66 65 72 29 7b 0a 20  8 **pzBuffer){. 
5b00: 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 30 3b   Expr *pNew = 0;
5b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b20: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
5b30: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 66  o return */.  if
5b40: 28 20 70 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ( p ){.    const
5b50: 20 69 6e 74 20 69 73 52 65 71 75 69 72 65 53 70   int isRequireSp
5b60: 61 6e 20 3d 20 28 66 6c 61 67 73 26 45 58 50 52  an = (flags&EXPR
5b70: 44 55 50 5f 53 50 41 4e 29 3b 0a 20 20 20 20 63  DUP_SPAN);.    c
5b80: 6f 6e 73 74 20 69 6e 74 20 69 73 52 65 64 75 63  onst int isReduc
5b90: 65 64 20 3d 20 28 66 6c 61 67 73 26 45 58 50 52  ed = (flags&EXPR
5ba0: 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20  DUP_REDUCE);.   
5bb0: 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 0a 0a 20 20   u8 *zAlloc;..  
5bc0: 20 20 61 73 73 65 72 74 28 20 70 7a 42 75 66 66    assert( pzBuff
5bd0: 65 72 3d 3d 30 20 7c 7c 20 69 73 52 65 64 75 63  er==0 || isReduc
5be0: 65 64 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69  ed );..    /* Fi
5bf0: 67 75 72 65 20 6f 75 74 20 77 68 65 72 65 20 74  gure out where t
5c00: 6f 20 77 72 69 74 65 20 74 68 65 20 6e 65 77 20  o write the new 
5c10: 45 78 70 72 20 73 74 72 75 63 74 75 72 65 2e 20  Expr structure. 
5c20: 2a 2f 0a 20 20 20 20 69 66 28 20 70 7a 42 75 66  */.    if( pzBuf
5c30: 66 65 72 20 29 7b 0a 20 20 20 20 20 20 7a 41 6c  fer ){.      zAl
5c40: 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65 72 3b  loc = *pzBuffer;
5c50: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5c60: 20 20 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74    zAlloc = sqlit
5c70: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
5c80: 2c 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28  , dupedExprSize(
5c90: 70 2c 20 66 6c 61 67 73 29 29 3b 0a 20 20 20 20  p, flags));.    
5ca0: 7d 0a 20 20 20 20 70 4e 65 77 20 3d 20 28 45 78  }.    pNew = (Ex
5cb0: 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20  pr *)zAlloc;..  
5cc0: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
5cd0: 20 20 20 20 2f 2a 20 53 65 74 20 6e 4e 65 77 53      /* Set nNewS
5ce0: 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20  ize to the size 
5cf0: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
5d00: 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e  e structure poin
5d10: 74 65 64 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ted to.      ** 
5d20: 62 79 20 70 4e 65 77 2e 20 54 68 69 73 20 69 73  by pNew. This is
5d30: 20 65 69 74 68 65 72 20 45 58 50 52 5f 46 55 4c   either EXPR_FUL
5d40: 4c 53 49 5a 45 2c 20 45 58 50 52 5f 52 45 44 55  LSIZE, EXPR_REDU
5d50: 43 45 44 53 49 5a 45 20 6f 72 0a 20 20 20 20 20  CEDSIZE or.     
5d60: 20 2a 2a 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e   ** EXPR_TOKENON
5d70: 4c 59 53 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20 69  LYSIZE. nToken i
5d80: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
5d90: 62 65 72 20 6f 66 20 62 79 74 65 73 20 63 6f 6e  ber of bytes con
5da0: 73 75 6d 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  sumed.      ** b
5db0: 79 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68  y the copy of th
5dc0: 65 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 20 73 74 72  e p->token.z str
5dd0: 69 6e 67 20 28 69 66 20 61 6e 79 29 2e 0a 20 20  ing (if any)..  
5de0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e      */.      con
5df0: 73 74 20 69 6e 74 20 6e 4e 65 77 53 69 7a 65 20  st int nNewSize 
5e00: 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63  = dupedExprStruc
5e10: 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b  tSize(p, flags);
5e20: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  .      const int
5e30: 20 6e 54 6f 6b 65 6e 20 3d 20 28 70 2d 3e 74 6f   nToken = (p->to
5e40: 6b 65 6e 2e 7a 20 3f 20 70 2d 3e 74 6f 6b 65 6e  ken.z ? p->token
5e50: 2e 6e 20 2b 20 31 20 3a 20 30 29 3b 0a 20 20 20  .n + 1 : 0);.   
5e60: 20 20 20 69 66 28 20 69 73 52 65 64 75 63 65 64     if( isReduced
5e70: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
5e80: 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  rt( ExprHasPrope
5e90: 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65  rty(p, EP_Reduce
5ea0: 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  d)==0 );.       
5eb0: 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20   memcpy(zAlloc, 
5ec0: 70 2c 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20 20  p, nNewSize);.  
5ed0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5ee0: 20 20 20 69 6e 74 20 6e 53 69 7a 65 20 3d 20 65     int nSize = e
5ef0: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 29  xprStructSize(p)
5f00: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
5f10: 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a  (zAlloc, p, nSiz
5f20: 65 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  e);.        mems
5f30: 65 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65  et(&zAlloc[nSize
5f40: 5d 2c 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c 53  ], 0, EXPR_FULLS
5f50: 49 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20 20  IZE-nSize);.    
5f60: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65    }..      /* Se
5f70: 74 20 74 68 65 20 45 50 5f 52 65 64 75 63 65 64  t the EP_Reduced
5f80: 20 61 6e 64 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c   and EP_TokenOnl
5f90: 79 20 66 6c 61 67 73 20 61 70 70 72 6f 70 72 69  y flags appropri
5fa0: 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20  ately. */.      
5fb0: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 26 3d 20 7e  pNew->flags &= ~
5fc0: 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54  (EP_Reduced|EP_T
5fd0: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53 70 61 6e  okenOnly|EP_Span
5fe0: 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 73 77 69  Only);.      swi
5ff0: 74 63 68 28 20 6e 4e 65 77 53 69 7a 65 20 29 7b  tch( nNewSize ){
6000: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 45 58  .        case EX
6010: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 3a 20  PR_REDUCEDSIZE: 
6020: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
6030: 20 45 50 5f 52 65 64 75 63 65 64 3b 20 62 72 65   EP_Reduced; bre
6040: 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
6050: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
6060: 49 5a 45 3a 20 70 4e 65 77 2d 3e 66 6c 61 67 73  IZE: pNew->flags
6070: 20 7c 3d 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79   |= EP_TokenOnly
6080: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ; break;.       
6090: 20 63 61 73 65 20 45 58 50 52 5f 53 50 41 4e 4f   case EXPR_SPANO
60a0: 4e 4c 59 53 49 5a 45 3a 20 20 70 4e 65 77 2d 3e  NLYSIZE:  pNew->
60b0: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 53 70 61 6e  flags |= EP_Span
60c0: 4f 6e 6c 79 3b 20 62 72 65 61 6b 3b 0a 20 20 20  Only; break;.   
60d0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
60e0: 6f 70 79 20 74 68 65 20 70 2d 3e 74 6f 6b 65 6e  opy the p->token
60f0: 20 73 74 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e   string, if any.
6100: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 54   */.      if( nT
6110: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  oken ){.        
6120: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
6130: 54 6f 6b 65 6e 20 3d 20 26 7a 41 6c 6c 6f 63 5b  Token = &zAlloc[
6140: 6e 4e 65 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20  nNewSize];.     
6150: 20 20 20 6d 65 6d 63 70 79 28 7a 54 6f 6b 65 6e     memcpy(zToken
6160: 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 6e 54  , p->token.z, nT
6170: 6f 6b 65 6e 2d 31 29 3b 0a 20 20 20 20 20 20 20  oken-1);.       
6180: 20 7a 54 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e 2d 31   zToken[nToken-1
6190: 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20  ] = '\0';.      
61a0: 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 64 79    pNew->token.dy
61b0: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  n = 0;.        p
61c0: 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 7a  New->token.z = z
61d0: 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 0a  Token;.      }..
61e0: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 28 70        if( 0==((p
61f0: 2d 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c  ->flags|pNew->fl
6200: 61 67 73 29 20 26 20 45 50 5f 54 6f 6b 65 6e 4f  ags) & EP_TokenO
6210: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nly) ){.        
6220: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  /* Fill in the p
6230: 4e 65 77 2d 3e 73 70 61 6e 20 74 6f 6b 65 6e 2c  New->span token,
6240: 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   if required. */
6250: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52  .        if( isR
6260: 65 71 75 69 72 65 53 70 61 6e 20 29 7b 0a 20 20  equireSpan ){.  
6270: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 74          if( p->t
6280: 6f 6b 65 6e 2e 7a 21 3d 70 2d 3e 73 70 61 6e 2e  oken.z!=p->span.
6290: 7a 20 7c 7c 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 21  z || p->token.n!
62a0: 3d 70 2d 3e 73 70 61 6e 2e 6e 20 29 7b 0a 20 20  =p->span.n ){.  
62b0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
62c0: 73 70 61 6e 2e 7a 20 3d 20 26 7a 41 6c 6c 6f 63  span.z = &zAlloc
62d0: 5b 6e 4e 65 77 53 69 7a 65 2b 6e 54 6f 6b 65 6e  [nNewSize+nToken
62e0: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ];.            m
62f0: 65 6d 63 70 79 28 28 63 68 61 72 20 2a 29 70 4e  emcpy((char *)pN
6300: 65 77 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73  ew->span.z, p->s
6310: 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e  pan.z, p->span.n
6320: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
6330: 4e 65 77 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20  New->span.dyn = 
6340: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
6350: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
6360: 70 4e 65 77 2d 3e 73 70 61 6e 2e 7a 20 3d 20 70  pNew->span.z = p
6370: 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20  New->token.z;.  
6380: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
6390: 73 70 61 6e 2e 6e 20 3d 20 70 4e 65 77 2d 3e 74  span.n = pNew->t
63a0: 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 20 20  oken.n;.        
63b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
63c0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  e{.          pNe
63d0: 77 2d 3e 73 70 61 6e 2e 7a 20 3d 20 30 3b 0a 20  w->span.z = 0;. 
63e0: 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 73           pNew->s
63f0: 70 61 6e 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20  pan.n = 0;.     
6400: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
6410: 20 20 20 20 69 66 28 20 30 3d 3d 28 28 70 2d 3e      if( 0==((p->
6420: 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c 61 67  flags|pNew->flag
6430: 73 29 20 26 20 28 45 50 5f 54 6f 6b 65 6e 4f 6e  s) & (EP_TokenOn
6440: 6c 79 7c 45 50 5f 53 70 61 6e 4f 6e 6c 79 29 29  ly|EP_SpanOnly))
6450: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
6460: 69 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65 77 2d  ill in the pNew-
6470: 3e 78 2e 70 53 65 6c 65 63 74 20 6f 72 20 70 4e  >x.pSelect or pN
6480: 65 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62  ew->x.pList memb
6490: 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  er. */.        i
64a0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
64b0: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
64c0: 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ct) ){.         
64d0: 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74   pNew->x.pSelect
64e0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
64f0: 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65  Dup(db, p->x.pSe
6500: 6c 65 63 74 2c 20 69 73 52 65 64 75 63 65 64 29  lect, isReduced)
6510: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
6520: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
6530: 3e 78 2e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  >x.pList = sqlit
6540: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
6550: 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 73  , p->x.pList, is
6560: 52 65 64 75 63 65 64 29 3b 0a 20 20 20 20 20 20  Reduced);.      
6570: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
6580: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e     /* Fill in pN
6590: 65 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e  ew->pLeft and pN
65a0: 65 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20  ew->pRight. */. 
65b0: 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
65c0: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 4e 65 77  AnyProperty(pNew
65d0: 2c 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f  , EP_Reduced|EP_
65e0: 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53 70 61  TokenOnly|EP_Spa
65f0: 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  nOnly) ){.      
6600: 20 20 7a 41 6c 6c 6f 63 20 2b 3d 20 64 75 70 65    zAlloc += dupe
6610: 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c  dExprNodeSize(p,
6620: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20   flags);.       
6630: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
6640: 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65  erty(pNew, EP_Re
6650: 64 75 63 65 64 29 20 29 7b 0a 20 20 20 20 20 20  duced) ){.      
6660: 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20      pNew->pLeft 
6670: 3d 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d  = exprDup(db, p-
6680: 3e 70 4c 65 66 74 2c 20 45 58 50 52 44 55 50 5f  >pLeft, EXPRDUP_
6690: 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29  REDUCE, &zAlloc)
66a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  ;.          pNew
66b0: 2d 3e 70 52 69 67 68 74 20 3d 20 65 78 70 72 44  ->pRight = exprD
66c0: 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74  up(db, p->pRight
66d0: 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  , EXPRDUP_REDUCE
66e0: 2c 20 26 7a 41 6c 6c 6f 63 29 3b 0a 20 20 20 20  , &zAlloc);.    
66f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
6700: 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20  ( pzBuffer ){.  
6710: 20 20 20 20 20 20 20 20 2a 70 7a 42 75 66 66 65          *pzBuffe
6720: 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20  r = zAlloc;.    
6730: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
6740: 65 20 69 66 28 20 21 45 78 70 72 48 61 73 41 6e  e if( !ExprHasAn
6750: 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  yProperty(p, EP_
6760: 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53 70 61  TokenOnly|EP_Spa
6770: 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  nOnly) ){.      
6780: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
6790: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
67a0: 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b  b, p->pLeft, 0);
67b0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
67c0: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
67d0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52  xprDup(db, p->pR
67e0: 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
67f0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
6800: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
6810: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
6820: 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69  g group of routi
6830: 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63 6f  nes make deep co
6840: 70 69 65 73 20 6f 66 20 65 78 70 72 65 73 73 69  pies of expressi
6850: 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69  ons,.** expressi
6860: 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69 73  on lists, ID lis
6870: 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20 73  ts, and select s
6880: 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20  tatements.  The 
6890: 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65  copies can.** be
68a0: 20 64 65 6c 65 74 65 64 20 28 62 79 20 62 65 69   deleted (by bei
68b0: 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  ng passed to the
68c0: 69 72 20 72 65 73 70 65 63 74 69 76 65 20 2e 2e  ir respective ..
68d0: 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69 6e  .Delete() routin
68e0: 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65  es).** without e
68f0: 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72 69  ffecting the ori
6900: 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ginals..**.** Th
6910: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
6920: 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72 63  t, ID, and sourc
6930: 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20 62  e lists return b
6940: 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  y sqlite3ExprLis
6950: 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74  tDup(),.** sqlit
6960: 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20 61  e3IdListDup(), a
6970: 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  nd sqlite3SrcLis
6980: 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62  tDup() can not b
6990: 65 20 66 75 72 74 68 65 72 20 65 78 70 61 6e 64  e further expand
69a0: 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65 71  ed .** by subseq
69b0: 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71  uent calls to sq
69c0: 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64 28  lite*ListAppend(
69d0: 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a  ) routines..**.*
69e0: 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68 61  * Any tables tha
69f0: 74 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d 69  t the SrcList mi
6a00: 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72 65  ght point to are
6a10: 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e   not duplicated.
6a20: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73  .**.** The flags
6a30: 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74 61   parameter conta
6a40: 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f  ins a combinatio
6a50: 6e 20 6f 66 20 74 68 65 20 45 58 50 52 44 55 50  n of the EXPRDUP
6a60: 5f 58 58 58 20 66 6c 61 67 73 2e 20 49 66 0a 2a  _XXX flags. If.*
6a70: 2a 20 74 68 65 20 45 58 50 52 44 55 50 5f 53 50  * the EXPRDUP_SP
6a80: 41 4e 20 66 6c 61 67 20 69 73 20 73 65 74 20 69  AN flag is set i
6a90: 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 70  n the argument p
6aa0: 61 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 74  arameter, then t
6ab0: 68 65 20 0a 2a 2a 20 45 78 70 72 2e 73 70 61 6e  he .** Expr.span
6ac0: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69 6e   field of the in
6ad0: 70 75 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69  put expression i
6ae0: 73 20 63 6f 70 69 65 64 2e 20 49 66 20 45 58 50  s copied. If EXP
6af0: 52 44 55 50 5f 53 50 41 4e 20 69 73 0a 2a 2a 20  RDUP_SPAN is.** 
6b00: 63 6c 65 61 72 2c 20 74 68 65 6e 20 74 68 65 20  clear, then the 
6b10: 45 78 70 72 2e 73 70 61 6e 20 66 69 65 6c 64 20  Expr.span field 
6b20: 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  of the returned 
6b30: 65 78 70 72 65 73 73 69 6f 6e 20 73 74 72 75 63  expression struc
6b40: 74 75 72 65 0a 2a 2a 20 69 73 20 7a 65 72 6f 65  ture.** is zeroe
6b50: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
6b60: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 66  EXPRDUP_REDUCE f
6b70: 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
6b80: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 72   the structure r
6b90: 65 74 75 72 6e 65 64 20 69 73 20 61 0a 2a 2a 20  eturned is a.** 
6ba0: 74 72 75 6e 63 61 74 65 64 20 76 65 72 73 69 6f  truncated versio
6bb0: 6e 20 6f 66 20 74 68 65 20 75 73 75 61 6c 20 45  n of the usual E
6bc0: 78 70 72 20 73 74 72 75 63 74 75 72 65 20 74 68  xpr structure th
6bd0: 61 74 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65  at will be store
6be0: 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20  d as.** part of 
6bf0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
6c00: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
6c10: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
6c20: 65 6d 61 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ema..*/.Expr *sq
6c30: 6c 69 74 65 33 45 78 70 72 44 75 70 28 73 71 6c  lite3ExprDup(sql
6c40: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a  ite3 *db, Expr *
6c50: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
6c60: 20 72 65 74 75 72 6e 20 65 78 70 72 44 75 70 28   return exprDup(
6c70: 64 62 2c 20 70 2c 20 66 6c 61 67 73 2c 20 30 29  db, p, flags, 0)
6c80: 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
6c90: 54 6f 6b 65 6e 43 6f 70 79 28 73 71 6c 69 74 65  TokenCopy(sqlite
6ca0: 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 54  3 *db, Token *pT
6cb0: 6f 2c 20 54 6f 6b 65 6e 20 2a 70 46 72 6f 6d 29  o, Token *pFrom)
6cc0: 7b 0a 20 20 69 66 28 20 70 54 6f 2d 3e 64 79 6e  {.  if( pTo->dyn
6cd0: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
6ce0: 28 64 62 2c 20 28 63 68 61 72 2a 29 70 54 6f 2d  (db, (char*)pTo-
6cf0: 3e 7a 29 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  >z);.  if( pFrom
6d00: 2d 3e 7a 20 29 7b 0a 20 20 20 20 70 54 6f 2d 3e  ->z ){.    pTo->
6d10: 6e 20 3d 20 70 46 72 6f 6d 2d 3e 6e 3b 0a 20 20  n = pFrom->n;.  
6d20: 20 20 70 54 6f 2d 3e 7a 20 3d 20 28 75 38 2a 29    pTo->z = (u8*)
6d30: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
6d40: 28 64 62 2c 20 28 63 68 61 72 2a 29 70 46 72 6f  (db, (char*)pFro
6d50: 6d 2d 3e 7a 2c 20 70 46 72 6f 6d 2d 3e 6e 29 3b  m->z, pFrom->n);
6d60: 0a 20 20 20 20 70 54 6f 2d 3e 64 79 6e 20 3d 20  .    pTo->dyn = 
6d70: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
6d80: 70 54 6f 2d 3e 7a 20 3d 20 30 3b 0a 20 20 7d 0a  pTo->z = 0;.  }.
6d90: 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69  }.ExprList *sqli
6da0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 73  te3ExprListDup(s
6db0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
6dc0: 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61  List *p, int fla
6dd0: 67 73 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  gs){.  ExprList 
6de0: 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20  *pNew;.  struct 
6df0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
6e00: 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b  Item, *pOldItem;
6e10: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
6e20: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
6e30: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
6e40: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
6e50: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
6e60: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
6e70: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
6e80: 65 77 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 30  ew->iECursor = 0
6e90: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20  ;.  pNew->nExpr 
6ea0: 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d  = pNew->nAlloc =
6eb0: 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 4e 65   p->nExpr;.  pNe
6ec0: 77 2d 3e 61 20 3d 20 70 49 74 65 6d 20 3d 20 73  w->a = pItem = s
6ed0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
6ee0: 77 28 64 62 2c 20 20 70 2d 3e 6e 45 78 70 72 2a  w(db,  p->nExpr*
6ef0: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
6f00: 29 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 3d 3d  );.  if( pItem==
6f10: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
6f20: 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29  DbFree(db, pNew)
6f30: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
6f40: 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65 6d 20    } .  pOldItem 
6f50: 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d  = p->a;.  for(i=
6f60: 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69  0; i<p->nExpr; i
6f70: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c  ++, pItem++, pOl
6f80: 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  dItem++){.    Ex
6f90: 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20  pr *pNewExpr;.  
6fa0: 20 20 45 78 70 72 20 2a 70 4f 6c 64 45 78 70 72    Expr *pOldExpr
6fb0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78   = pOldItem->pEx
6fc0: 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70  pr;.    pItem->p
6fd0: 45 78 70 72 20 3d 20 70 4e 65 77 45 78 70 72 20  Expr = pNewExpr 
6fe0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
6ff0: 28 64 62 2c 20 70 4f 6c 64 45 78 70 72 2c 20 66  (db, pOldExpr, f
7000: 6c 61 67 73 29 3b 0a 20 20 20 20 70 49 74 65 6d  lags);.    pItem
7010: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
7020: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
7030: 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ldItem->zName);.
7040: 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f      pItem->sortO
7050: 72 64 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  rder = pOldItem-
7060: 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  >sortOrder;.    
7070: 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b  pItem->done = 0;
7080: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 69 43 6f 6c  .    pItem->iCol
7090: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 6f   = pOldItem->iCo
70a0: 6c 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 69 41  l;.    pItem->iA
70b0: 6c 69 61 73 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  lias = pOldItem-
70c0: 3e 69 41 6c 69 61 73 3b 0a 20 20 7d 0a 20 20 72  >iAlias;.  }.  r
70d0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
70e0: 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 73 2c  *.** If cursors,
70f0: 20 74 72 69 67 67 65 72 73 2c 20 76 69 65 77 73   triggers, views
7100: 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20   and subqueries 
7110: 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20  are all omitted 
7120: 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c  from.** the buil
7130: 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20  d, then none of 
7140: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  the following ro
7150: 75 74 69 6e 65 73 2c 20 65 78 63 65 70 74 20 66  utines, except f
7160: 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65  or .** sqlite3Se
7170: 6c 65 63 74 44 75 70 28 29 2c 20 63 61 6e 20 62  lectDup(), can b
7180: 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65  e called. sqlite
7190: 33 53 65 6c 65 63 74 44 75 70 28 29 20 69 73 20  3SelectDup() is 
71a0: 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c  sometimes.** cal
71b0: 6c 65 64 20 77 69 74 68 20 61 20 4e 55 4c 4c 20  led with a NULL 
71c0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66  argument..*/.#if
71d0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
71e0: 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
71f0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
7200: 4d 49 54 5f 54 52 49 47 47 45 52 29 20 5c 0a 20  MIT_TRIGGER) \. 
7210: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
7220: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
7230: 29 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  ).SrcList *sqlit
7240: 65 33 53 72 63 4c 69 73 74 44 75 70 28 73 71 6c  e3SrcListDup(sql
7250: 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73  ite3 *db, SrcLis
7260: 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  t *p, int flags)
7270: 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65  {.  SrcList *pNe
7280: 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  w;.  int i;.  in
7290: 74 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70  t nByte;.  if( p
72a0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
72b0: 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
72c0: 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e  (*p) + (p->nSrc>
72d0: 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  0 ? sizeof(p->a[
72e0: 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31  0]) * (p->nSrc-1
72f0: 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d  ) : 0);.  pNew =
7300: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
7310: 52 61 77 28 64 62 2c 20 6e 42 79 74 65 20 29 3b  Raw(db, nByte );
7320: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
7330: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
7340: 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e  w->nSrc = pNew->
7350: 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63  nAlloc = p->nSrc
7360: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
7370: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
7380: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
7390: 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20  _item *pNewItem 
73a0: 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20  = &pNew->a[i];. 
73b0: 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
73c0: 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d  t_item *pOldItem
73d0: 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20   = &p->a[i];.   
73e0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
73f0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74    pNewItem->zDat
7400: 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 44  abase = sqlite3D
7410: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
7420: 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  Item->zDatabase)
7430: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
7440: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
7450: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
7460: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
7470: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69    pNewItem->zAli
7480: 61 73 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  as = sqlite3DbSt
7490: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
74a0: 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
74b0: 70 4e 65 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79  pNewItem->jointy
74c0: 70 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a  pe = pOldItem->j
74d0: 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 70 4e 65  ointype;.    pNe
74e0: 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d  wItem->iCursor =
74f0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73   pOldItem->iCurs
7500: 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  or;.    pNewItem
7510: 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 20 3d 20  ->isPopulated = 
7520: 70 4f 6c 64 49 74 65 6d 2d 3e 69 73 50 6f 70 75  pOldItem->isPopu
7530: 6c 61 74 65 64 3b 0a 20 20 20 20 70 4e 65 77 49  lated;.    pNewI
7540: 74 65 6d 2d 3e 7a 49 6e 64 65 78 20 3d 20 73 71  tem->zIndex = sq
7550: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
7560: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 49 6e 64  , pOldItem->zInd
7570: 65 78 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ex);.    pNewIte
7580: 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20  m->notIndexed = 
7590: 70 4f 6c 64 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64  pOldItem->notInd
75a0: 65 78 65 64 3b 0a 20 20 20 20 70 4e 65 77 49 74  exed;.    pNewIt
75b0: 65 6d 2d 3e 70 49 6e 64 65 78 20 3d 20 70 4f 6c  em->pIndex = pOl
75c0: 64 49 74 65 6d 2d 3e 70 49 6e 64 65 78 3b 0a 20  dItem->pIndex;. 
75d0: 20 20 20 70 54 61 62 20 3d 20 70 4e 65 77 49 74     pTab = pNewIt
75e0: 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49  em->pTab = pOldI
75f0: 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69  tem->pTab;.    i
7600: 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20  f( pTab ){.     
7610: 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20   pTab->nRef++;. 
7620: 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65     }.    pNewIte
7630: 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  m->pSelect = sql
7640: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
7650: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c  , pOldItem->pSel
7660: 65 63 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ect, flags);.   
7670: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d   pNewItem->pOn =
7680: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
7690: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f  db, pOldItem->pO
76a0: 6e 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  n, flags);.    p
76b0: 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20  NewItem->pUsing 
76c0: 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44  = sqlite3IdListD
76d0: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
76e0: 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e  >pUsing);.    pN
76f0: 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20  ewItem->colUsed 
7700: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55  = pOldItem->colU
7710: 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  sed;.  }.  retur
7720: 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74  n pNew;.}.IdList
7730: 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44   *sqlite3IdListD
7740: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
7750: 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64  IdList *p){.  Id
7760: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  List *pNew;.  in
7770: 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  t i;.  if( p==0 
7780: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
7790: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
77a0: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
77b0: 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69  of(*pNew) );.  i
77c0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
77d0: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  urn 0;.  pNew->n
77e0: 49 64 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f  Id = pNew->nAllo
77f0: 63 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e  c = p->nId;.  pN
7800: 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44  ew->a = sqlite3D
7810: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 70  bMallocRaw(db, p
7820: 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e  ->nId*sizeof(p->
7830: 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70  a[0]) );.  if( p
7840: 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20  New->a==0 ){.   
7850: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
7860: 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65  b, pNew);.    re
7870: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f  turn 0;.  }.  fo
7880: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b  r(i=0; i<p->nId;
7890: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
78a0: 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70  t IdList_item *p
78b0: 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d  NewItem = &pNew-
78c0: 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63  >a[i];.    struc
78d0: 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70  t IdList_item *p
78e0: 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b  OldItem = &p->a[
78f0: 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  i];.    pNewItem
7900: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
7910: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
7920: 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ldItem->zName);.
7930: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64      pNewItem->id
7940: 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64  x = pOldItem->id
7950: 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  x;.  }.  return 
7960: 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a  pNew;.}.Select *
7970: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
7980: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65  (sqlite3 *db, Se
7990: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61  lect *p, int fla
79a0: 67 73 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  gs){.  Select *p
79b0: 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  New;.  if( p==0 
79c0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
79d0: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
79e0: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
79f0: 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20  of(*p) );.  if( 
7a00: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
7a10: 20 30 3b 0a 20 20 2f 2a 20 41 6c 77 61 79 73 20   0;.  /* Always 
7a20: 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  make a copy of t
7a30: 68 65 20 73 70 61 6e 20 66 6f 72 20 74 6f 70 2d  he span for top-
7a40: 6c 65 76 65 6c 20 65 78 70 72 65 73 73 69 6f 6e  level expression
7a50: 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 65 78  s in the.  ** ex
7a60: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
7a70: 54 68 65 20 6c 6f 67 69 63 20 69 6e 20 53 45 4c  The logic in SEL
7a80: 45 43 54 20 70 72 6f 63 65 73 73 69 6e 67 20 74  ECT processing t
7a90: 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 0a 20  hat determines. 
7aa0: 20 2a 2a 20 74 68 65 20 6e 61 6d 65 73 20 6f 66   ** the names of
7ab0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
7ac0: 72 65 73 75 6c 74 20 73 65 74 20 6e 65 65 64 73  result set needs
7ad0: 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   this informatio
7ae0: 6e 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e 70 45 4c  n */.  pNew->pEL
7af0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
7b00: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
7b10: 70 45 4c 69 73 74 2c 20 66 6c 61 67 73 7c 45 58  pEList, flags|EX
7b20: 50 52 44 55 50 5f 53 50 41 4e 29 3b 0a 20 20 70  PRDUP_SPAN);.  p
7b30: 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69  New->pSrc = sqli
7b40: 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 64 62  te3SrcListDup(db
7b50: 2c 20 70 2d 3e 70 53 72 63 2c 20 66 6c 61 67 73  , p->pSrc, flags
7b60: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72  );.  pNew->pWher
7b70: 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  e = sqlite3ExprD
7b80: 75 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  up(db, p->pWhere
7b90: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
7ba0: 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
7bb0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
7bc0: 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c  db, p->pGroupBy,
7bd0: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
7be0: 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  >pHaving = sqlit
7bf0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
7c00: 3e 70 48 61 76 69 6e 67 2c 20 66 6c 61 67 73 29  >pHaving, flags)
7c10: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72  ;.  pNew->pOrder
7c20: 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
7c30: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
7c40: 4f 72 64 65 72 42 79 2c 20 66 6c 61 67 73 29 3b  OrderBy, flags);
7c50: 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d  .  pNew->op = p-
7c60: 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72  >op;.  pNew->pPr
7c70: 69 6f 72 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ior = sqlite3Sel
7c80: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 50  ectDup(db, p->pP
7c90: 72 69 6f 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20  rior, flags);.  
7ca0: 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73  pNew->pLimit = s
7cb0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
7cc0: 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61  , p->pLimit, fla
7cd0: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66  gs);.  pNew->pOf
7ce0: 66 73 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78  fset = sqlite3Ex
7cf0: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66  prDup(db, p->pOf
7d00: 66 73 65 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  fset, flags);.  
7d10: 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30  pNew->iLimit = 0
7d20: 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65  ;.  pNew->iOffse
7d30: 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 73  t = 0;.  pNew->s
7d40: 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c  elFlags = p->sel
7d50: 46 6c 61 67 73 20 26 20 7e 53 46 5f 55 73 65 73  Flags & ~SF_Uses
7d60: 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 70 4e 65  Ephemeral;.  pNe
7d70: 77 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20  w->pRightmost = 
7d80: 30 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f  0;.  pNew->addrO
7d90: 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b  penEphm[0] = -1;
7da0: 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65  .  pNew->addrOpe
7db0: 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20  nEphm[1] = -1;. 
7dc0: 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45   pNew->addrOpenE
7dd0: 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 72  phm[2] = -1;.  r
7de0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65  eturn pNew;.}.#e
7df0: 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  lse.Select *sqli
7e00: 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c  te3SelectDup(sql
7e10: 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74  ite3 *db, Select
7e20: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
7e30: 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
7e40: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
7e50: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
7e60: 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
7e70: 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  t to the end of 
7e80: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
7e90: 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73  st.  If pList is
7ea0: 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55  .** initially NU
7eb0: 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  LL, then create 
7ec0: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
7ed0: 20 6c 69 73 74 2e 0a 2a 2f 0a 45 78 70 72 4c 69   list..*/.ExprLi
7ee0: 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c  st *sqlite3ExprL
7ef0: 69 73 74 41 70 70 65 6e 64 28 0a 20 20 50 61 72  istAppend(.  Par
7f00: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
7f10: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
7f20: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
7f30: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
7f40: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
7f50: 77 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e  which to append.
7f60: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
7f70: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
7f80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
7f90: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20  xpression to be 
7fa0: 61 70 70 65 6e 64 65 64 20 2a 2f 0a 20 20 54 6f  appended */.  To
7fb0: 6b 65 6e 20 2a 70 4e 61 6d 65 20 20 20 20 20 20  ken *pName      
7fc0: 20 20 20 20 20 20 2f 2a 20 41 53 20 6b 65 79 77        /* AS keyw
7fd0: 6f 72 64 20 66 6f 72 20 74 68 65 20 65 78 70 72  ord for the expr
7fe0: 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 73  ession */.){.  s
7ff0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
8000: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  rse->db;.  if( p
8010: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
8020: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62  List = sqlite3Db
8030: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
8040: 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20  izeof(ExprList) 
8050: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
8060: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
8070: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a  o no_mem;.    }.
8080: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
8090: 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a  t->nAlloc==0 );.
80a0: 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d    }.  if( pList-
80b0: 3e 6e 41 6c 6c 6f 63 3c 3d 70 4c 69 73 74 2d 3e  >nAlloc<=pList->
80c0: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 74 72  nExpr ){.    str
80d0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
80e0: 6d 20 2a 61 3b 0a 20 20 20 20 69 6e 74 20 6e 20  m *a;.    int n 
80f0: 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a  = pList->nAlloc*
8100: 32 20 2b 20 34 3b 0a 20 20 20 20 61 20 3d 20 73  2 + 4;.    a = s
8110: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
8120: 64 62 2c 20 70 4c 69 73 74 2d 3e 61 2c 20 6e 2a  db, pList->a, n*
8130: 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
8140: 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 3d  0]));.    if( a=
8150: 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
8160: 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20   no_mem;.    }. 
8170: 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b     pList->a = a;
8180: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  .    pList->nAll
8190: 6f 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  oc = sqlite3DbMa
81a0: 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20 61 29 2f  llocSize(db, a)/
81b0: 73 69 7a 65 6f 66 28 61 5b 30 5d 29 3b 0a 20 20  sizeof(a[0]);.  
81c0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  }.  assert( pLis
81d0: 74 2d 3e 61 21 3d 30 20 29 3b 0a 20 20 69 66 28  t->a!=0 );.  if(
81e0: 20 70 45 78 70 72 20 7c 7c 20 70 4e 61 6d 65 20   pExpr || pName 
81f0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
8200: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
8210: 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
8220: 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a  List->nExpr++];.
8230: 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d      memset(pItem
8240: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74  , 0, sizeof(*pIt
8250: 65 6d 29 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  em));.    pItem-
8260: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
8270: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
8280: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49  , pName);.    pI
8290: 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  tem->pExpr = pEx
82a0: 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 69  pr;.    pItem->i
82b0: 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 7d 0a 20  Alias = 0;.  }. 
82c0: 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a   return pList;..
82d0: 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f  no_mem:     .  /
82e0: 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20  * Avoid leaking 
82f0: 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63  memory if malloc
8300: 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a   has failed. */.
8310: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
8320: 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a  ete(db, pExpr);.
8330: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
8340: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
8350: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  t);.  return 0;.
8360: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
8370: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
8380: 70 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20  pEList contains 
8390: 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d 69 74  more than iLimit
83a0: 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65   elements,.** le
83b0: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
83c0: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a  sage in pParse..
83d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
83e0: 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67  xprListCheckLeng
83f0: 74 68 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  th(.  Parse *pPa
8400: 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73 74 20  rse,.  ExprList 
8410: 2a 70 45 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74  *pEList,.  const
8420: 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29   char *zObject.)
8430: 7b 0a 20 20 69 6e 74 20 6d 78 20 3d 20 70 50 61  {.  int mx = pPa
8440: 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  rse->db->aLimit[
8450: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
8460: 55 4d 4e 5d 3b 0a 20 20 74 65 73 74 63 61 73 65  UMN];.  testcase
8470: 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69  ( pEList && pELi
8480: 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20 29 3b  st->nExpr==mx );
8490: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45 4c  .  testcase( pEL
84a0: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
84b0: 45 78 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20  Expr==mx+1 );.  
84c0: 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  if( pEList && pE
84d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 6d 78 20 29  List->nExpr>mx )
84e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
84f0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
8500: 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20  oo many columns 
8510: 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29  in %s", zObject)
8520: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
8530: 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
8540: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
8550: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
8560: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 73  ExprListDelete(s
8570: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
8580: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
8590: 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
85a0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
85b0: 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73  Item;.  if( pLis
85c0: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
85d0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
85e0: 61 21 3d 30 20 7c 7c 20 28 70 4c 69 73 74 2d 3e  a!=0 || (pList->
85f0: 6e 45 78 70 72 3d 3d 30 20 26 26 20 70 4c 69 73  nExpr==0 && pLis
8600: 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 29 20 29 3b  t->nAlloc==0) );
8610: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
8620: 2d 3e 6e 45 78 70 72 3c 3d 70 4c 69 73 74 2d 3e  ->nExpr<=pList->
8630: 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20 66 6f 72 28  nAlloc );.  for(
8640: 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
8650: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
8660: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
8670: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  +){.    sqlite3E
8680: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49  xprDelete(db, pI
8690: 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
86a0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
86b0: 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  b, pItem->zName)
86c0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
86d0: 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d  bFree(db, pList-
86e0: 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  >a);.  sqlite3Db
86f0: 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  Free(db, pList);
8700: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  .}../*.** These 
8710: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 57 61 6c  routines are Wal
8720: 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73 2e 20 20  ker callbacks.  
8730: 57 61 6c 6b 65 72 2e 75 2e 70 69 20 69 73 20 61  Walker.u.pi is a
8740: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61   pointer.** to a
8750: 6e 20 69 6e 74 65 67 65 72 2e 20 20 54 68 65 73  n integer.  Thes
8760: 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63  e routines are c
8770: 68 65 63 6b 69 6e 67 20 61 6e 20 65 78 70 72 65  hecking an expre
8780: 73 73 69 6f 6e 20 74 6f 20 73 65 65 0a 2a 2a 20  ssion to see.** 
8790: 69 66 20 69 74 20 69 73 20 61 20 63 6f 6e 73 74  if it is a const
87a0: 61 6e 74 2e 20 20 53 65 74 20 2a 57 61 6c 6b 65  ant.  Set *Walke
87b0: 72 2e 75 2e 70 69 20 74 6f 20 30 20 69 66 20 74  r.u.pi to 0 if t
87c0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
87d0: 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74  .** not constant
87e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61  ..**.** These ca
87f0: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20  llback routines 
8800: 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c  are used to impl
8810: 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77  ement the follow
8820: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73  ing:.**.**     s
8830: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
8840: 74 61 6e 74 28 29 0a 2a 2a 20 20 20 20 20 73 71  tant().**     sq
8850: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
8860: 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 0a 2a 2a 20  antNotJoin().** 
8870: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
8880: 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74  sConstantOrFunct
8890: 69 6f 6e 28 29 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  ion().**.*/.stat
88a0: 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49  ic int exprNodeI
88b0: 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72  sConstant(Walker
88c0: 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
88d0: 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49  *pExpr){..  /* I
88e0: 66 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 69  f pWalker->u.i i
88f0: 73 20 33 20 74 68 65 6e 20 61 6e 79 20 74 65 72  s 3 then any ter
8900: 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  m of the express
8910: 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66  ion that comes f
8920: 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20  rom.  ** the ON 
8930: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
8940: 20 6f 66 20 61 20 6a 6f 69 6e 20 64 69 73 71 75   of a join disqu
8950: 61 6c 69 66 69 65 73 20 74 68 65 20 65 78 70 72  alifies the expr
8960: 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d  ession.  ** from
8970: 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65   being considere
8980: 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20  d constant. */. 
8990: 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e   if( pWalker->u.
89a0: 69 3d 3d 33 20 26 26 20 45 78 70 72 48 61 73 41  i==3 && ExprHasA
89b0: 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  nyProperty(pExpr
89c0: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
89d0: 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 75  {.    pWalker->u
89e0: 2e 69 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  .i = 0;.    retu
89f0: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
8a00: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  }..  switch( pEx
8a10: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a  pr->op ){.    /*
8a20: 20 43 6f 6e 73 69 64 65 72 20 66 75 6e 63 74 69   Consider functi
8a30: 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73 74 61  ons to be consta
8a40: 6e 74 20 69 66 20 61 6c 6c 20 74 68 65 69 72 20  nt if all their 
8a50: 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 63 6f  arguments are co
8a60: 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e  nstant.    ** an
8a70: 64 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d  d pWalker->u.i==
8a80: 32 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  2 */.    case TK
8a90: 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20  _FUNCTION:.     
8aa0: 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e   if( pWalker->u.
8ab0: 69 3d 3d 32 20 29 20 72 65 74 75 72 6e 20 30 3b  i==2 ) return 0;
8ac0: 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74  .      /* Fall t
8ad0: 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61  hrough */.    ca
8ae0: 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61  se TK_ID:.    ca
8af0: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  se TK_COLUMN:.  
8b00: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
8b10: 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65  NCTION:.    case
8b20: 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a   TK_AGG_COLUMN:.
8b30: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8b40: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
8b50: 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
8b60: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49  .    case TK_EXI
8b70: 53 54 53 3a 0a 20 20 20 20 20 20 74 65 73 74 63  STS:.      testc
8b80: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
8b90: 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20  TK_SELECT );.   
8ba0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
8bb0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54  pr->op==TK_EXIST
8bc0: 53 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  S );.#endif.    
8bd0: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
8be0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a  r->op==TK_ID );.
8bf0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
8c00: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
8c10: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  LUMN );.      te
8c20: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
8c30: 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
8c40: 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ON );.      test
8c50: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
8c60: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
8c70: 3b 0a 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d  ;.      pWalker-
8c80: 3e 75 2e 69 20 3d 20 30 3b 0a 20 20 20 20 20 20  >u.i = 0;.      
8c90: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
8ca0: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
8cb0: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
8cc0: 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a  Continue;.  }.}.
8cd0: 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63  static int selec
8ce0: 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28  tNodeIsConstant(
8cf0: 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
8d00: 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64   Select *NotUsed
8d10: 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
8d20: 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
8d30: 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d    pWalker->u.i =
8d40: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43   0;.  return WRC
8d50: 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74 61 74 69 63  _Abort;.}.static
8d60: 20 69 6e 74 20 65 78 70 72 49 73 43 6f 6e 73 74   int exprIsConst
8d70: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 6e  (Expr *p, int in
8d80: 69 74 46 6c 61 67 29 7b 0a 20 20 57 61 6c 6b 65  itFlag){.  Walke
8d90: 72 20 77 3b 0a 20 20 77 2e 75 2e 69 20 3d 20 69  r w;.  w.u.i = i
8da0: 6e 69 74 46 6c 61 67 3b 0a 20 20 77 2e 78 45 78  nitFlag;.  w.xEx
8db0: 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70  prCallback = exp
8dc0: 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b  rNodeIsConstant;
8dd0: 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
8de0: 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64  back = selectNod
8df0: 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 73  eIsConstant;.  s
8e00: 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
8e10: 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  w, p);.  return 
8e20: 77 2e 75 2e 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  w.u.i;.}../*.** 
8e30: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
8e40: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
8e50: 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73   1 if the expres
8e60: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
8e70: 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20  .** and 0 if it 
8e80: 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c  involves variabl
8e90: 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63  es or function c
8ea0: 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  alls..**.** For 
8eb0: 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
8ec0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
8ed0: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73   double-quoted s
8ee0: 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22  tring (ex: "abc"
8ef0: 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  ).** is consider
8f00: 65 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75  ed a variable bu
8f10: 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65  t a single-quote
8f20: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61  d string (ex: 'a
8f30: 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e  bc') is.** a con
8f40: 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  stant..*/.int sq
8f50: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
8f60: 61 6e 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ant(Expr *p){.  
8f70: 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e  return exprIsCon
8f80: 73 74 28 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  st(p, 1);.}../*.
8f90: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
8fa0: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
8fb0: 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70  urn 1 if the exp
8fc0: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
8fd0: 61 6e 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73  ant.** that does
8fe0: 20 6e 6f 20 6f 72 69 67 69 6e 61 74 65 20 66 72   no originate fr
8ff0: 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  om the ON or USI
9000: 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20  NG clauses of a 
9010: 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  join..** Return 
9020: 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73  0 if it involves
9030: 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75   variables or fu
9040: 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72 20  nction calls or 
9050: 74 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e  terms from.** an
9060: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
9070: 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  use..*/.int sqli
9080: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
9090: 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70  tNotJoin(Expr *p
90a0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  ){.  return expr
90b0: 49 73 43 6f 6e 73 74 28 70 2c 20 33 29 3b 0a 7d  IsConst(p, 3);.}
90c0: 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
90d0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
90e0: 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
90f0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
9100: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61  constant.** or a
9110: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77   function call w
9120: 69 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67  ith constant arg
9130: 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20  uments.  Return 
9140: 61 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a  and 0 if there.*
9150: 2a 20 61 72 65 20 61 6e 79 20 76 61 72 69 61 62  * are any variab
9160: 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  les..**.** For t
9170: 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
9180: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
9190: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74  double-quoted st
91a0: 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29  ring (ex: "abc")
91b0: 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65  .** is considere
91c0: 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74  d a variable but
91d0: 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64   a single-quoted
91e0: 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62   string (ex: 'ab
91f0: 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73  c') is.** a cons
9200: 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tant..*/.int sql
9210: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
9220: 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70  ntOrFunction(Exp
9230: 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  r *p){.  return 
9240: 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 32  exprIsConst(p, 2
9250: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  );.}../*.** If t
9260: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20  he expression p 
9270: 63 6f 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74  codes a constant
9280: 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 69 73   integer that is
9290: 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a   small enough.**
92a0: 20 74 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d   to fit in a 32-
92b0: 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74  bit integer, ret
92c0: 75 72 6e 20 31 20 61 6e 64 20 70 75 74 20 74 68  urn 1 and put th
92d0: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69  e value of the i
92e0: 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56  nteger.** in *pV
92f0: 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20 65 78  alue.  If the ex
9300: 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20  pression is not 
9310: 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66  an integer or if
9320: 20 69 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a   it is too big.*
9330: 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69  * to fit in a si
9340: 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65  gned 32-bit inte
9350: 67 65 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e  ger, return 0 an
9360: 64 20 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20  d leave *pValue 
9370: 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  unchanged..*/.in
9380: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  t sqlite3ExprIsI
9390: 6e 74 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20  nteger(Expr *p, 
93a0: 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20  int *pValue){.  
93b0: 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 69 66  int rc = 0;.  if
93c0: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ( p->flags & EP_
93d0: 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  IntValue ){.    
93e0: 2a 70 56 61 6c 75 65 20 3d 20 70 2d 3e 69 54 61  *pValue = p->iTa
93f0: 62 6c 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ble;.    return 
9400: 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28  1;.  }.  switch(
9410: 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61   p->op ){.    ca
9420: 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b  se TK_INTEGER: {
9430: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
9440: 74 65 33 47 65 74 49 6e 74 33 32 28 28 63 68 61  te3GetInt32((cha
9450: 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  r*)p->token.z, p
9460: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72  Value);.      br
9470: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
9480: 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a  ase TK_UPLUS: {.
9490: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
94a0: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
94b0: 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65  p->pLeft, pValue
94c0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
94d0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
94e0: 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20  K_UMINUS: {.    
94f0: 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69    int v;.      i
9500: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
9510: 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74  Integer(p->pLeft
9520: 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20  , &v) ){.       
9530: 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20   *pValue = -v;. 
9540: 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
9550: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
9560: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
9570: 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20  fault: break;.  
9580: 7d 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  }.  if( rc ){.  
9590: 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 49 4e 54    p->op = TK_INT
95a0: 45 47 45 52 3b 0a 20 20 20 20 70 2d 3e 66 6c 61  EGER;.    p->fla
95b0: 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75  gs |= EP_IntValu
95c0: 65 3b 0a 20 20 20 20 70 2d 3e 69 54 61 62 6c 65  e;.    p->iTable
95d0: 20 3d 20 2a 70 56 61 6c 75 65 3b 0a 20 20 7d 0a   = *pValue;.  }.
95e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
95f0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
9600: 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 73  E if the given s
9610: 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69  tring is a row-i
9620: 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a  d column name..*
9630: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52  /.int sqlite3IsR
9640: 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20  owid(const char 
9650: 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  *z){.  if( sqlit
9660: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52  e3StrICmp(z, "_R
9670: 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74  OWID_")==0 ) ret
9680: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
9690: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
96a0: 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74  ROWID")==0 ) ret
96b0: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
96c0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
96d0: 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72  OID")==0 ) retur
96e0: 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  n 1;.  return 0;
96f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
9700: 20 74 72 75 65 20 69 66 20 74 68 65 20 49 4e 20   true if the IN 
9710: 6f 70 65 72 61 74 6f 72 20 6f 70 74 69 6d 69 7a  operator optimiz
9720: 61 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ation is enabled
9730: 20 61 6e 64 0a 2a 2a 20 74 68 65 20 53 45 4c 45   and.** the SELE
9740: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 20 65  CT statement p e
9750: 78 69 73 74 73 20 61 6e 64 20 69 73 20 6f 66 20  xists and is of 
9760: 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65 20 66 6f  the.** simple fo
9770: 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  rm:.**.**     SE
9780: 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52  LECT <column> FR
9790: 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a  OM <table>.**.**
97a0: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
97b0: 63 61 73 65 2c 20 69 74 20 6d 61 79 20 62 65 20  case, it may be 
97c0: 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20  possible to use 
97d0: 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c  an existing tabl
97e0: 65 0a 2a 2a 20 6f 72 20 69 6e 64 65 78 20 69 6e  e.** or index in
97f0: 73 74 65 61 64 20 6f 66 20 67 65 6e 65 72 61 74  stead of generat
9800: 69 6e 67 20 61 6e 20 65 70 68 65 72 65 6d 61 6c  ing an epheremal
9810: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64   table..*/.#ifnd
9820: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
9830: 55 42 51 55 45 52 59 0a 73 74 61 74 69 63 20 69  UBQUERY.static i
9840: 6e 74 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  nt isCandidateFo
9850: 72 49 6e 4f 70 74 28 53 65 6c 65 63 74 20 2a 70  rInOpt(Select *p
9860: 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  ){.  SrcList *pS
9870: 72 63 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  rc;.  ExprList *
9880: 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65 20  pEList;.  Table 
9890: 2a 70 54 61 62 3b 0a 20 20 69 66 28 20 70 3d 3d  *pTab;.  if( p==
98a0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  0 ) return 0;   
98b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98c0: 2f 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  /* right-hand si
98d0: 64 65 20 6f 66 20 49 4e 20 69 73 20 53 45 4c 45  de of IN is SELE
98e0: 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  CT */.  if( p->p
98f0: 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30  Prior ) return 0
9900: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
9910: 2a 20 4e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64  * Not a compound
9920: 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28   SELECT */.  if(
9930: 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28   p->selFlags & (
9940: 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
9950: 67 67 72 65 67 61 74 65 29 20 29 7b 0a 20 20 20  ggregate) ){.   
9960: 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20     return 0; /* 
9970: 4e 6f 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  No DISTINCT keyw
9980: 6f 72 64 20 61 6e 64 20 6e 6f 20 61 67 67 72 65  ord and no aggre
9990: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
99a0: 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  /.  }.  if( p->p
99b0: 47 72 6f 75 70 42 79 20 29 20 72 65 74 75 72 6e  GroupBy ) return
99c0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
99d0: 2a 20 48 61 73 20 6e 6f 20 47 52 4f 55 50 20 42  * Has no GROUP B
99e0: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66  Y clause */.  if
99f0: 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65  ( p->pLimit ) re
9a00: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
9a10: 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c       /* Has no L
9a20: 49 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20  IMIT clause */. 
9a30: 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20   if( p->pOffset 
9a40: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
9a50: 28 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65  ( p->pWhere ) re
9a60: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
9a70: 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 57       /* Has no W
9a80: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
9a90: 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
9aa0: 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 21  .  assert( pSrc!
9ab0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 53 72 63  =0 );.  if( pSrc
9ac0: 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75  ->nSrc!=1 ) retu
9ad0: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f  rn 0;          /
9ae0: 2a 20 53 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e  * Single term in
9af0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
9b00: 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d    if( pSrc->a[0]
9b10: 2e 70 53 65 6c 65 63 74 20 29 20 72 65 74 75 72  .pSelect ) retur
9b20: 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  n 0;     /* FROM
9b30: 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61   clause is not a
9b40: 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70   subquery */.  p
9b50: 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d  Tab = pSrc->a[0]
9b60: 2e 70 54 61 62 3b 0a 20 20 69 66 28 20 70 54 61  .pTab;.  if( pTa
9b70: 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  b==0 ) return 0;
9b80: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65  .  if( pTab->pSe
9b90: 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b  lect ) return 0;
9ba0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f            /* FRO
9bb0: 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20  M clause is not 
9bc0: 61 20 76 69 65 77 20 2a 2f 0a 20 20 69 66 28 20  a view */.  if( 
9bd0: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
9be0: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
9bf0: 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
9c00: 65 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20  e not a virtual 
9c10: 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73  table */.  pELis
9c20: 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
9c30: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78   if( pEList->nEx
9c40: 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  pr!=1 ) return 0
9c50: 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63  ;       /* One c
9c60: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73  olumn in the res
9c70: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 66 28  ult set */.  if(
9c80: 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
9c90: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
9ca0: 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f  MN ) return 0; /
9cb0: 2a 20 52 65 73 75 6c 74 20 69 73 20 61 20 63 6f  * Result is a co
9cc0: 6c 75 6d 6e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  lumn */.  return
9cd0: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
9ce0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
9cf0: 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  UERY */../*.** T
9d00: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
9d10: 75 73 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c  used by the impl
9d20: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
9d30: 65 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61  e IN (...) opera
9d40: 74 6f 72 2e 0a 2a 2a 20 49 74 27 73 20 6a 6f 62  tor..** It's job
9d50: 20 69 73 20 74 6f 20 66 69 6e 64 20 6f 72 20 63   is to find or c
9d60: 72 65 61 74 65 20 61 20 62 2d 74 72 65 65 20 73  reate a b-tree s
9d70: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 6d 61  tructure that ma
9d80: 79 20 62 65 20 75 73 65 64 0a 2a 2a 20 65 69 74  y be used.** eit
9d90: 68 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20  her to test for 
9da0: 6d 65 6d 62 65 72 73 68 69 70 20 6f 66 20 74 68  membership of th
9db0: 65 20 28 2e 2e 2e 29 20 73 65 74 20 6f 72 20 74  e (...) set or t
9dc0: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
9dd0: 68 0a 2a 2a 20 69 74 73 20 6d 65 6d 62 65 72 73  h.** its members
9de0: 2c 20 73 6b 69 70 70 69 6e 67 20 64 75 70 6c 69  , skipping dupli
9df0: 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  cates..**.** The
9e00: 20 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 6f   cursor opened o
9e10: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  n the structure 
9e20: 28 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c  (database table,
9e30: 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20   database index 
9e40: 0a 2a 2a 20 6f 72 20 65 70 68 65 72 6d 61 6c 20  .** or ephermal 
9e50: 74 61 62 6c 65 29 20 69 73 20 73 74 6f 72 65 64  table) is stored
9e60: 20 69 6e 20 70 58 2d 3e 69 54 61 62 6c 65 20 62   in pX->iTable b
9e70: 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74  efore this funct
9e80: 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 20  ion returns..** 
9e90: 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
9ea0: 75 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 65  ue indicates the
9eb0: 20 73 74 72 75 63 74 75 72 65 20 74 79 70 65 2c   structure type,
9ec0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
9ed0: 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f  **   IN_INDEX_RO
9ee0: 57 49 44 20 2d 20 54 68 65 20 63 75 72 73 6f 72  WID - The cursor
9ef0: 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
9f00: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e   database table.
9f10: 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49  .**   IN_INDEX_I
9f20: 4e 44 45 58 20 2d 20 54 68 65 20 63 75 72 73 6f  NDEX - The curso
9f30: 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
9f40: 61 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78  a database index
9f50: 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f  ..**   IN_INDEX_
9f60: 45 50 48 20 2d 20 20 20 54 68 65 20 63 75 72 73  EPH -   The curs
9f70: 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
9f80: 20 61 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65   a specially cre
9f90: 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20  ated and.**     
9fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
9fb0: 6f 70 75 6c 61 74 65 64 20 65 70 68 65 72 65 6d  opulated epherem
9fc0: 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
9fd0: 41 6e 20 65 78 69 73 74 69 6e 67 20 73 74 72 75  An existing stru
9fe0: 63 74 75 72 65 20 6d 61 79 20 6f 6e 6c 79 20 62  cture may only b
9ff0: 65 20 75 73 65 64 20 69 66 20 74 68 65 20 53 45  e used if the SE
a000: 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65 20 73  LECT is of the s
a010: 69 6d 70 6c 65 0a 2a 2a 20 66 6f 72 6d 3a 0a 2a  imple.** form:.*
a020: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
a030: 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f 4d 20 3c 74  <column> FROM <t
a040: 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  able>.**.** If p
a050: 72 4e 6f 74 46 6f 75 6e 64 20 70 61 72 61 6d 65  rNotFound parame
a060: 74 65 72 20 69 73 20 30 2c 20 74 68 65 6e 20 74  ter is 0, then t
a070: 68 65 20 73 74 72 75 63 74 75 72 65 20 77 69 6c  he structure wil
a080: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69 74 65  l be used to ite
a090: 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20  rate.** through 
a0a0: 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73 2c  the set members,
a0b0: 20 73 6b 69 70 70 69 6e 67 20 61 6e 79 20 64 75   skipping any du
a0c0: 70 6c 69 63 61 74 65 73 2e 20 49 6e 20 74 68 69  plicates. In thi
a0d0: 73 20 63 61 73 65 20 61 6e 0a 2a 2a 20 65 70 68  s case an.** eph
a0e0: 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73  eremal table mus
a0f0: 74 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73  t be used unless
a100: 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 3c 63   the selected <c
a110: 6f 6c 75 6d 6e 3e 20 69 73 20 67 75 61 72 61 6e  olumn> is guaran
a120: 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 75 6e  teed.** to be un
a130: 69 71 75 65 20 2d 20 65 69 74 68 65 72 20 62 65  ique - either be
a140: 63 61 75 73 65 20 69 74 20 69 73 20 61 6e 20 49  cause it is an I
a150: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
a160: 45 59 20 6f 72 20 69 74 0a 2a 2a 20 69 73 20 75  EY or it.** is u
a170: 6e 69 71 75 65 20 62 79 20 76 69 72 74 75 65 20  nique by virtue 
a180: 6f 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20  of a constraint 
a190: 6f 72 20 69 6d 70 6c 69 63 69 74 20 69 6e 64 65  or implicit inde
a1a0: 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  x..**.** If the 
a1b0: 70 72 4e 6f 74 46 6f 75 6e 64 20 70 61 72 61 6d  prNotFound param
a1c0: 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74  eter is not 0, t
a1d0: 68 65 6e 20 74 68 65 20 73 74 72 75 63 74 75 72  hen the structur
a1e0: 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a  e will be used .
a1f0: 2a 2a 20 66 6f 72 20 66 61 73 74 20 73 65 74 20  ** for fast set 
a200: 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73  membership tests
a210: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
a220: 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c  n epheremal tabl
a230: 65 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73  e must .** be us
a240: 65 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d  ed unless <colum
a250: 6e 3e 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52  n> is an INTEGER
a260: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
a270: 61 6e 20 69 6e 64 65 78 20 63 61 6e 20 0a 2a 2a  an index can .**
a280: 20 62 65 20 66 6f 75 6e 64 20 77 69 74 68 20 3c   be found with <
a290: 63 6f 6c 75 6d 6e 3e 20 61 73 20 69 74 73 20 6c  column> as its l
a2a0: 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2e  eft-most column.
a2b0: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20  .**.** When the 
a2c0: 73 74 72 75 63 74 75 72 65 20 69 73 20 62 65 69  structure is bei
a2d0: 6e 67 20 75 73 65 64 20 66 6f 72 20 73 65 74 20  ng used for set 
a2e0: 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73  membership tests
a2f0: 2c 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 6e 65  , the user.** ne
a300: 65 64 73 20 74 6f 20 6b 6e 6f 77 20 77 68 65 74  eds to know whet
a310: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 73  her or not the s
a320: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
a330: 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 20 0a 2a  s an SQL NULL .*
a340: 2a 20 76 61 6c 75 65 20 69 6e 20 6f 72 64 65 72  * value in order
a350: 20 74 6f 20 63 6f 72 72 65 63 74 6c 79 20 65 76   to correctly ev
a360: 61 6c 75 61 74 65 20 65 78 70 72 65 73 73 69 6f  aluate expressio
a370: 6e 73 20 6c 69 6b 65 20 22 58 20 49 4e 20 28 59  ns like "X IN (Y
a380: 2c 20 5a 29 22 2e 0a 2a 2a 20 49 66 20 74 68 65  , Z)"..** If the
a390: 72 65 20 69 73 20 61 20 63 68 61 6e 63 65 20 74  re is a chance t
a3a0: 68 61 74 20 74 68 65 20 73 74 72 75 63 74 75 72  hat the structur
a3b0: 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20  e may contain a 
a3c0: 4e 55 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a 2a  NULL value at.**
a3d0: 20 72 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20 61   runtime, then a
a3e0: 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c   register is all
a3f0: 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 72  ocated and the r
a400: 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77  egister number w
a410: 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72  ritten.** to *pr
a420: 4e 6f 74 46 6f 75 6e 64 2e 20 49 66 20 74 68 65  NotFound. If the
a430: 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
a440: 74 68 61 74 20 74 68 65 20 73 74 72 75 63 74 75  that the structu
a450: 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a  re contains a.**
a460: 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74 68 65   NULL value, the
a470: 6e 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 20 69 73  n *prNotFound is
a480: 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e   left unchanged.
a490: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69  .**.** If a regi
a4a0: 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65  ster is allocate
a4b0: 64 20 61 6e 64 20 69 74 73 20 6c 6f 63 61 74 69  d and its locati
a4c0: 6f 6e 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 72  on stored in *pr
a4d0: 4e 6f 74 46 6f 75 6e 64 2c 20 74 68 65 6e 0a 2a  NotFound, then.*
a4e0: 2a 20 69 74 73 20 69 6e 69 74 69 61 6c 20 76 61  * its initial va
a4f0: 6c 75 65 20 69 73 20 4e 55 4c 4c 2e 20 49 66 20  lue is NULL. If 
a500: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 64 6f  the structure do
a510: 65 73 20 6e 6f 74 20 72 65 6d 61 69 6e 20 63 6f  es not remain co
a520: 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20 74 68  nstant.** for th
a530: 65 20 64 75 72 61 74 69 6f 6e 20 6f 66 20 74 68  e duration of th
a540: 65 20 71 75 65 72 79 20 28 69 2e 65 2e 20 74 68  e query (i.e. th
a550: 65 20 73 65 74 20 69 73 20 61 20 63 6f 72 72 65  e set is a corre
a560: 6c 61 74 65 64 20 73 75 62 2d 73 65 6c 65 63 74  lated sub-select
a570: 29 2c 20 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  ), .** the value
a580: 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65   of the allocate
a590: 64 20 72 65 67 69 73 74 65 72 20 69 73 20 72 65  d register is re
a5a0: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 65 61 63 68  set to NULL each
a5b0: 20 74 69 6d 65 20 74 68 65 20 0a 2a 2a 20 73 74   time the .** st
a5c0: 72 75 63 74 75 72 65 20 69 73 20 72 65 70 6f 70  ructure is repop
a5d0: 75 6c 61 74 65 64 2e 20 54 68 69 73 20 61 6c 6c  ulated. This all
a5e0: 6f 77 73 20 74 68 65 20 63 61 6c 6c 65 72 20 74  ows the caller t
a5f0: 6f 20 75 73 65 20 76 64 62 65 20 63 6f 64 65 20  o use vdbe code 
a600: 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74  .** equivalent t
a610: 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  o the following:
a620: 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 72 65 67  .**.**   if( reg
a630: 69 73 74 65 72 3d 3d 4e 55 4c 4c 20 29 7b 0a 2a  ister==NULL ){.*
a640: 2a 20 20 20 20 20 68 61 73 5f 6e 75 6c 6c 20 3d  *     has_null =
a650: 20 3c 74 65 73 74 20 69 66 20 64 61 74 61 20 73   <test if data s
a660: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
a670: 73 20 6e 75 6c 6c 3e 0a 2a 2a 20 20 20 20 20 72  s null>.**     r
a680: 65 67 69 73 74 65 72 20 3d 20 31 0a 2a 2a 20 20  egister = 1.**  
a690: 20 7d 0a 2a 2a 0a 2a 2a 20 69 6e 20 6f 72 64 65   }.**.** in orde
a6a0: 72 20 74 6f 20 61 76 6f 69 64 20 72 75 6e 6e 69  r to avoid runni
a6b0: 6e 67 20 74 68 65 20 3c 74 65 73 74 20 69 66 20  ng the <test if 
a6c0: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 63  data structure c
a6d0: 6f 6e 74 61 69 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a  ontains null>.**
a6e0: 20 74 65 73 74 20 6d 6f 72 65 20 6f 66 74 65 6e   test more often
a6f0: 20 74 68 61 6e 20 69 73 20 6e 65 63 65 73 73 61   than is necessa
a700: 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ry..*/.#ifndef S
a710: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
a720: 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  ERY.int sqlite3F
a730: 69 6e 64 49 6e 49 6e 64 65 78 28 50 61 72 73 65  indInIndex(Parse
a740: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
a750: 70 58 2c 20 69 6e 74 20 2a 70 72 4e 6f 74 46 6f  pX, int *prNotFo
a760: 75 6e 64 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a  und){.  Select *
a770: 70 3b 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d  p;.  int eType =
a780: 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 20 3d   0;.  int iTab =
a790: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
a7a0: 0a 20 20 69 6e 74 20 6d 75 73 74 42 65 55 6e 69  .  int mustBeUni
a7b0: 71 75 65 20 3d 20 21 70 72 4e 6f 74 46 6f 75 6e  que = !prNotFoun
a7c0: 64 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  d;..  /* The fol
a7d0: 6c 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 65 78  lwing if(...) ex
a7e0: 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65  pression is true
a7f0: 20 69 66 20 74 68 65 20 53 45 4c 45 43 54 20 69   if the SELECT i
a800: 73 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 73  s of the .  ** s
a810: 69 6d 70 6c 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a  imple form:.  **
a820: 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
a830: 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f 4d 20 3c   <column> FROM <
a840: 74 61 62 6c 65 3e 0a 20 20 2a 2a 0a 20 20 2a 2a  table>.  **.  **
a850: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
a860: 63 61 73 65 2c 20 69 74 20 6d 61 79 20 62 65 20  case, it may be 
a870: 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20  possible to use 
a880: 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c  an existing tabl
a890: 65 0a 20 20 2a 2a 20 6f 72 20 69 6e 64 65 78 20  e.  ** or index 
a8a0: 69 6e 73 74 65 61 64 20 6f 66 20 67 65 6e 65 72  instead of gener
a8b0: 61 74 69 6e 67 20 61 6e 20 65 70 68 65 72 65 6d  ating an epherem
a8c0: 61 6c 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  al table..  */. 
a8d0: 20 70 20 3d 20 28 45 78 70 72 48 61 73 50 72 6f   p = (ExprHasPro
a8e0: 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73  perty(pX, EP_xIs
a8f0: 53 65 6c 65 63 74 29 20 3f 20 70 58 2d 3e 78 2e  Select) ? pX->x.
a900: 70 53 65 6c 65 63 74 20 3a 20 30 29 3b 0a 20 20  pSelect : 0);.  
a910: 69 66 28 20 69 73 43 61 6e 64 69 64 61 74 65 46  if( isCandidateF
a920: 6f 72 49 6e 4f 70 74 28 70 29 20 29 7b 0a 20 20  orInOpt(p) ){.  
a930: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
a940: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20  pParse->db;.    
a950: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
a960: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
a970: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
a980: 45 78 70 72 3b 0a 20 20 20 20 69 6e 74 20 69 43  Expr;.    int iC
a990: 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ol = pExpr->iCol
a9a0: 75 6d 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  umn;.    Vdbe *v
a9b0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
a9c0: 65 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20  e(pParse);..    
a9d0: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
a9e0: 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
a9f0: 66 72 6f 6d 20 74 77 6f 20 70 6c 61 63 65 73 2e  from two places.
aa00: 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73 20 74   In both cases t
aa10: 68 65 20 76 64 62 65 0a 20 20 20 20 2a 2a 20 68  he vdbe.    ** h
aa20: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
aa30: 61 6c 6c 6f 63 61 74 65 64 2e 20 53 6f 20 61 73  allocated. So as
aa40: 73 75 6d 65 20 73 71 6c 69 74 65 33 47 65 74 56  sume sqlite3GetV
aa50: 64 62 65 28 29 20 69 73 20 61 6c 77 61 79 73 0a  dbe() is always.
aa60: 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75      ** successfu
aa70: 6c 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  l here..    */. 
aa80: 20 20 20 61 73 73 65 72 74 28 76 29 3b 0a 20 20     assert(v);.  
aa90: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
aaa0: 20 20 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d        int iMem =
aab0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
aac0: 0a 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72  .      int iAddr
aad0: 3b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  ;.      Table *p
aae0: 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Tab = p->pSrc->a
aaf0: 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  [0].pTab;.      
ab00: 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
ab10: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
ab20: 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
ab30: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ab40: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
ab50: 20 69 44 62 29 3b 0a 0a 20 20 20 20 20 20 69 41   iDb);..      iA
ab60: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
ab70: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
ab80: 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73  , iMem);.      s
ab90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
aba0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
abb0: 31 2c 20 69 4d 65 6d 29 3b 0a 0a 20 20 20 20 20  1, iMem);..     
abc0: 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
abd0: 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20  e(pParse, iTab, 
abe0: 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70  iDb, pTab, OP_Op
abf0: 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20 65  enRead);.      e
ac00: 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
ac10: 52 4f 57 49 44 3b 0a 0a 20 20 20 20 20 20 73 71  ROWID;..      sq
ac20: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
ac30: 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20  e(v, iAddr);.   
ac40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
ac50: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   The collation s
ac60: 65 71 75 65 6e 63 65 20 75 73 65 64 20 62 79 20  equence used by 
ac70: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20  the comparison. 
ac80: 49 66 20 61 6e 20 69 6e 64 65 78 20 69 73 20 74  If an index is t
ac90: 6f 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 75  o .      ** be u
aca0: 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  sed in place of 
acb0: 61 20 74 65 6d 70 2d 74 61 62 6c 65 2c 20 69 74  a temp-table, it
acc0: 20 6d 75 73 74 20 62 65 20 6f 72 64 65 72 65 64   must be ordered
acd0: 20 61 63 63 6f 72 64 69 6e 67 0a 20 20 20 20 20   according.     
ace0: 20 2a 2a 20 74 6f 20 74 68 69 73 20 63 6f 6c 6c   ** to this coll
acf0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 0a  ation sequence..
ad00: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 43        */.      C
ad10: 6f 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d 20 73  ollSeq *pReq = s
ad20: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
ad30: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
ad40: 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 45  e, pX->pLeft, pE
ad50: 78 70 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  xpr);..      /* 
ad60: 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 61  Check that the a
ad70: 66 66 69 6e 69 74 79 20 74 68 61 74 20 77 69 6c  ffinity that wil
ad80: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 70 65 72  l be used to per
ad90: 66 6f 72 6d 20 74 68 65 20 0a 20 20 20 20 20 20  form the .      
ada0: 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  ** comparison is
adb0: 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
adc0: 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65   affinity of the
add0: 20 63 6f 6c 75 6d 6e 2e 20 49 66 0a 20 20 20 20   column. If.    
ade0: 20 20 2a 2a 20 69 74 20 69 73 20 6e 6f 74 2c 20    ** it is not, 
adf0: 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
ae00: 6c 65 20 74 6f 20 75 73 65 20 61 6e 79 20 69 6e  le to use any in
ae10: 64 65 78 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  dex..      */.  
ae20: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
ae30: 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  = p->pSrc->a[0].
ae40: 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61 72  pTab;.      char
ae50: 20 61 66 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f   aff = compariso
ae60: 6e 41 66 66 69 6e 69 74 79 28 70 58 29 3b 0a 20  nAffinity(pX);. 
ae70: 20 20 20 20 20 69 6e 74 20 61 66 66 69 6e 69 74       int affinit
ae80: 79 5f 6f 6b 20 3d 20 28 70 54 61 62 2d 3e 61 43  y_ok = (pTab->aC
ae90: 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e 69 74  ol[iCol].affinit
aea0: 79 3d 3d 61 66 66 7c 7c 61 66 66 3d 3d 53 51 4c  y==aff||aff==SQL
aeb0: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a 0a  ITE_AFF_NONE);..
aec0: 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70        for(pIdx=p
aed0: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
aee0: 78 20 26 26 20 65 54 79 70 65 3d 3d 30 20 26 26  x && eType==0 &&
aef0: 20 61 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 70 49   affinity_ok; pI
af00: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
af10: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 49  .        if( (pI
af20: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d  dx->aiColumn[0]=
af30: 3d 69 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 20  =iCol).         
af40: 26 26 20 28 70 52 65 71 3d 3d 73 71 6c 69 74 65  && (pReq==sqlite
af50: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
af60: 20 45 4e 43 28 64 62 29 2c 20 70 49 64 78 2d 3e   ENC(db), pIdx->
af70: 61 7a 43 6f 6c 6c 5b 30 5d 2c 20 2d 31 2c 20 30  azColl[0], -1, 0
af80: 29 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  )).         && (
af90: 21 6d 75 73 74 42 65 55 6e 69 71 75 65 20 7c 7c  !mustBeUnique ||
afa0: 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d   (pIdx->nColumn=
afb0: 3d 31 20 26 26 20 70 49 64 78 2d 3e 6f 6e 45 72  =1 && pIdx->onEr
afc0: 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 29 29 0a 20  ror!=OE_None)). 
afd0: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
afe0: 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20      int iDb;.   
aff0: 20 20 20 20 20 20 20 69 6e 74 20 69 4d 65 6d 20         int iMem 
b000: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
b010: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
b020: 69 41 64 64 72 3b 0a 20 20 20 20 20 20 20 20 20  iAddr;.         
b030: 20 63 68 61 72 20 2a 70 4b 65 79 3b 0a 20 20 0a   char *pKey;.  .
b040: 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 20 3d            pKey =
b050: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
b060: 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61  IndexKeyinfo(pPa
b070: 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  rse, pIdx);.    
b080: 20 20 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69        iDb = sqli
b090: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
b0a0: 28 64 62 2c 20 70 49 64 78 2d 3e 70 53 63 68 65  (db, pIdx->pSche
b0b0: 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ma);.          s
b0c0: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
b0d0: 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 0a 20 20  ree(v, iDb);..  
b0e0: 20 20 20 20 20 20 20 20 69 41 64 64 72 20 3d 20          iAddr = 
b0f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b100: 31 28 76 2c 20 4f 50 5f 49 66 2c 20 69 4d 65 6d  1(v, OP_If, iMem
b110: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
b120: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b130: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
b140: 20 69 4d 65 6d 29 3b 0a 20 20 0a 20 20 20 20 20   iMem);.  .     
b150: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b160: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 74  AddOp2(v, OP_Set
b170: 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20 70  NumColumns, 0, p
b180: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  Idx->nColumn);. 
b190: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b1a0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
b1b0: 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54 61 62 2c  _OpenRead, iTab,
b1c0: 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62   pIdx->tnum, iDb
b1d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1f0: 20 70 4b 65 79 2c 50 34 5f 4b 45 59 49 4e 46 4f   pKey,P4_KEYINFO
b200: 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20  _HANDOFF);.     
b210: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
b220: 28 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d  ((v, "%s", pIdx-
b230: 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
b240: 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
b250: 4e 44 45 58 5f 49 4e 44 45 58 3b 0a 0a 20 20 20  NDEX_INDEX;..   
b260: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b270: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41  beJumpHere(v, iA
b280: 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ddr);.          
b290: 69 66 28 20 70 72 4e 6f 74 46 6f 75 6e 64 20 26  if( prNotFound &
b2a0: 26 20 21 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  & !pTab->aCol[iC
b2b0: 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 7b 0a 20  ol].notNull ){. 
b2c0: 20 20 20 20 20 20 20 20 20 20 20 2a 70 72 4e 6f             *prNo
b2d0: 74 46 6f 75 6e 64 20 3d 20 2b 2b 70 50 61 72 73  tFound = ++pPars
b2e0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
b2f0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
b300: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
b310: 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30  ..  if( eType==0
b320: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 4d 61 79   ){.    int rMay
b330: 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20  HaveNull = 0;.  
b340: 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
b350: 45 58 5f 45 50 48 3b 0a 20 20 20 20 69 66 28 20  EX_EPH;.    if( 
b360: 70 72 4e 6f 74 46 6f 75 6e 64 20 29 7b 0a 20 20  prNotFound ){.  
b370: 20 20 20 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 20      *prNotFound 
b380: 3d 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d  = rMayHaveNull =
b390: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
b3a0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
b3b0: 58 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d  X->pLeft->iColum
b3c0: 6e 3c 30 20 26 26 20 21 45 78 70 72 48 61 73 41  n<0 && !ExprHasA
b3d0: 6e 79 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45  nyProperty(pX, E
b3e0: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
b3f0: 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e        eType = IN
b400: 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20  _INDEX_ROWID;.  
b410: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43    }.    sqlite3C
b420: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
b430: 72 73 65 2c 20 70 58 2c 20 72 4d 61 79 48 61 76  rse, pX, rMayHav
b440: 65 4e 75 6c 6c 2c 20 65 54 79 70 65 3d 3d 49 4e  eNull, eType==IN
b450: 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29 3b 0a 20  _INDEX_ROWID);. 
b460: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 58 2d 3e   }else{.    pX->
b470: 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20  iTable = iTab;. 
b480: 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70   }.  return eTyp
b490: 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e;.}.#endif../*.
b4a0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
b4b0: 20 66 6f 72 20 73 63 61 6c 61 72 20 73 75 62 71   for scalar subq
b4c0: 75 65 72 69 65 73 20 75 73 65 64 20 61 73 20 61  ueries used as a
b4d0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  n expression.** 
b4e0: 61 6e 64 20 49 4e 20 6f 70 65 72 61 74 6f 72 73  and IN operators
b4f0: 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a  .  Examples:.**.
b500: 2a 2a 20 20 20 20 20 28 53 45 4c 45 43 54 20 61  **     (SELECT a
b510: 20 46 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20   FROM b)        
b520: 20 20 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a    -- subquery.**
b530: 20 20 20 20 20 45 58 49 53 54 53 20 28 53 45 4c       EXISTS (SEL
b540: 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20  ECT a FROM b)   
b550: 2d 2d 20 45 58 49 53 54 53 20 73 75 62 71 75 65  -- EXISTS subque
b560: 72 79 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28  ry.**     x IN (
b570: 34 2c 35 2c 31 31 29 20 20 20 20 20 20 20 20 20  4,5,11)         
b580: 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61       -- IN opera
b590: 74 6f 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e  tor with list on
b5a0: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
b5b0: 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45  .**     x IN (SE
b5c0: 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20  LECT a FROM b)  
b5d0: 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f     -- IN operato
b5e0: 72 20 77 69 74 68 20 73 75 62 71 75 65 72 79 20  r with subquery 
b5f0: 6f 6e 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a  on the right.**.
b600: 2a 2a 20 54 68 65 20 70 45 78 70 72 20 70 61 72  ** The pExpr par
b610: 61 6d 65 74 65 72 20 64 65 73 63 72 69 62 65 73  ameter describes
b620: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
b630: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
b640: 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72  e IN.** operator
b650: 20 6f 72 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a   or subquery..**
b660: 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
b670: 20 69 73 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d   isRowid is non-
b680: 7a 65 72 6f 2c 20 74 68 65 6e 20 65 78 70 72 65  zero, then expre
b690: 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 67  ssion pExpr is g
b6a0: 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20  uaranteed.** to 
b6b0: 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  be of the form "
b6c0: 3c 72 6f 77 69 64 3e 20 49 4e 20 28 3f 2c 20 3f  <rowid> IN (?, ?
b6d0: 2c 20 3f 29 22 2c 20 77 68 65 72 65 20 3c 72 6f  , ?)", where <ro
b6e0: 77 69 64 3e 20 69 73 20 61 20 72 65 66 65 72 65  wid> is a refere
b6f0: 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20 69  nce.** to some i
b700: 6e 74 65 67 65 72 20 6b 65 79 20 63 6f 6c 75 6d  nteger key colum
b710: 6e 20 6f 66 20 61 20 74 61 62 6c 65 20 42 2d 54  n of a table B-T
b720: 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ree. In this cas
b730: 65 2c 20 75 73 65 20 61 6e 0a 2a 2a 20 69 6e 74  e, use an.** int
b740: 6b 65 79 20 42 2d 54 72 65 65 20 74 6f 20 73 74  key B-Tree to st
b750: 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 49  ore the set of I
b760: 4e 28 2e 2e 2e 29 20 76 61 6c 75 65 73 20 69 6e  N(...) values in
b770: 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73 75  stead of the usu
b780: 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65 72 29 20 76  al.** (slower) v
b790: 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b  ariable length k
b7a0: 65 79 73 20 42 2d 54 72 65 65 2e 0a 2a 2f 0a 23  eys B-Tree..*/.#
b7b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b7c0: 49 54 5f 53 55 42 51 55 45 52 59 0a 76 6f 69 64  IT_SUBQUERY.void
b7d0: 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
b7e0: 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
b7f0: 70 50 61 72 73 65 2c 20 0a 20 20 45 78 70 72 20  pParse, .  Expr 
b800: 2a 70 45 78 70 72 2c 20 0a 20 20 69 6e 74 20 72  *pExpr, .  int r
b810: 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 0a 20 20 69  MayHaveNull,.  i
b820: 6e 74 20 69 73 52 6f 77 69 64 0a 29 7b 0a 20 20  nt isRowid.){.  
b830: 69 6e 74 20 74 65 73 74 41 64 64 72 20 3d 20 30  int testAddr = 0
b840: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b850: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74          /* One-t
b860: 69 6d 65 20 74 65 73 74 20 61 64 64 72 65 73 73  ime test address
b870: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
b880: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
b890: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
b8a0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 0a 20  =0 ) return;... 
b8b0: 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 6d 75   /* This code mu
b8c0: 73 74 20 62 65 20 72 75 6e 20 69 6e 20 69 74 73  st be run in its
b8d0: 20 65 6e 74 69 72 65 74 79 20 65 76 65 72 79 20   entirety every 
b8e0: 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75  time it is encou
b8f0: 6e 74 65 72 65 64 0a 20 20 2a 2a 20 69 66 20 61  ntered.  ** if a
b900: 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
b910: 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a  ing is true:.  *
b920: 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65  *.  **    *  The
b930: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
b940: 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64   is a correlated
b950: 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20   subquery.  **  
b960: 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68    *  The right-h
b970: 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20 65  and side is an e
b980: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63  xpression list c
b990: 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62  ontaining variab
b9a0: 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57  les.  **    *  W
b9b0: 65 20 61 72 65 20 69 6e 73 69 64 65 20 61 20 74  e are inside a t
b9c0: 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a  rigger.  **.  **
b9d0: 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61   If all of the a
b9e0: 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20  bove are false, 
b9f0: 74 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e 20  then we can run 
ba00: 74 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20 6f  this code just o
ba10: 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74 68  nce.  ** save th
ba20: 65 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20 72  e results, and r
ba30: 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 65  euse the same re
ba40: 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65  sult on subseque
ba50: 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a  nt invocations..
ba60: 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72    */.  if( !Expr
ba70: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
ba80: 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65  Expr, EP_VarSele
ba90: 63 74 29 20 26 26 20 21 70 50 61 72 73 65 2d 3e  ct) && !pParse->
baa0: 74 72 69 67 53 74 61 63 6b 20 29 7b 0a 20 20 20  trigStack ){.   
bab0: 20 69 6e 74 20 6d 65 6d 20 3d 20 2b 2b 70 50 61   int mem = ++pPa
bac0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
bad0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
bae0: 28 76 2c 20 4f 50 5f 49 66 2c 20 6d 65 6d 29 3b  (v, OP_If, mem);
baf0: 0a 20 20 20 20 74 65 73 74 41 64 64 72 20 3d 20  .    testAddr = 
bb00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bb10: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
bb20: 20 31 2c 20 6d 65 6d 29 3b 0a 20 20 20 20 61 73   1, mem);.    as
bb30: 73 65 72 74 28 20 74 65 73 74 41 64 64 72 3e 30  sert( testAddr>0
bb40: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
bb50: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
bb60: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70    }..  switch( p
bb70: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
bb80: 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
bb90: 20 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74      char affinit
bba0: 79 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  y;.      KeyInfo
bbb0: 20 6b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20   keyInfo;.      
bbc0: 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20  int addr;       
bbd0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f   /* Address of O
bbe0: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
bbf0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  instruction */. 
bc00: 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
bc10: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
bc20: 0a 0a 20 20 20 20 20 20 69 66 28 20 72 4d 61 79  ..      if( rMay
bc30: 48 61 76 65 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  HaveNull ){.    
bc40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
bc50: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
bc60: 2c 20 30 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c  , 0, rMayHaveNul
bc70: 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  l);.      }..   
bc80: 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73 71     affinity = sq
bc90: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
bca0: 79 28 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20  y(pLeft);..     
bcb0: 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69 73   /* Whether this
bcc0: 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45 4c   is an 'x IN(SEL
bcd0: 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27  ECT...)' or an '
bce0: 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29  x IN(<exprlist>)
bcf0: 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65  '.      ** expre
bd00: 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e 64  ssion it is hand
bd10: 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77 61 79  led the same way
bd20: 2e 20 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c  . A virtual tabl
bd30: 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66  e is .      ** f
bd40: 69 6c 6c 65 64 20 77 69 74 68 20 73 69 6e 67 6c  illed with singl
bd50: 65 2d 66 69 65 6c 64 20 69 6e 64 65 78 20 6b 65  e-field index ke
bd60: 79 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  ys representing 
bd70: 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20  the results.    
bd80: 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 53 45    ** from the SE
bd90: 4c 45 43 54 20 6f 72 20 74 68 65 20 3c 65 78 70  LECT or the <exp
bda0: 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a  rlist>..      **
bdb0: 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65  .      ** If the
bdc0: 20 27 78 27 20 65 78 70 72 65 73 73 69 6f 6e 20   'x' expression 
bdd0: 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  is a column valu
bde0: 65 2c 20 6f 72 20 74 68 65 20 53 45 4c 45 43 54  e, or the SELECT
bdf0: 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ....      ** sta
be00: 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 61  tement returns a
be10: 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74   column value, t
be20: 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79  hen the affinity
be30: 20 6f 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a   of that.      *
be40: 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64  * column is used
be50: 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20 69 6e   to build the in
be60: 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62 6f 74  dex keys. If bot
be70: 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a 20 20  h 'x' and the.  
be80: 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e      ** SELECT...
be90: 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63   statement are c
bea0: 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d  olumns, then num
beb0: 65 72 69 63 20 61 66 66 69 6e 69 74 79 20 69 73  eric affinity is
bec0: 20 75 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 69   used.      ** i
bed0: 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20  f either column 
bee0: 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72 20 49  has NUMERIC or I
bef0: 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74 79 2e  NTEGER affinity.
bf00: 20 49 66 20 6e 65 69 74 68 65 72 0a 20 20 20 20   If neither.    
bf10: 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68 65    ** 'x' nor the
bf20: 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65   SELECT... state
bf30: 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73  ment are columns
bf40: 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61  , then numeric a
bf50: 66 66 69 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a  ffinity.      **
bf60: 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20   is used..      
bf70: 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  */.      pExpr->
bf80: 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d  iTable = pParse-
bf90: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61  >nTab++;.      a
bfa0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
bfb0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
bfc0: 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 45 78  enEphemeral, pEx
bfd0: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 21 69 73 52  pr->iTable, !isR
bfe0: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 6d 65 6d  owid);.      mem
bff0: 73 65 74 28 26 6b 65 79 49 6e 66 6f 2c 20 30 2c  set(&keyInfo, 0,
c000: 20 73 69 7a 65 6f 66 28 6b 65 79 49 6e 66 6f 29   sizeof(keyInfo)
c010: 29 3b 0a 20 20 20 20 20 20 6b 65 79 49 6e 66 6f  );.      keyInfo
c020: 2e 6e 46 69 65 6c 64 20 3d 20 31 3b 0a 0a 20 20  .nField = 1;..  
c030: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
c040: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
c050: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
c060: 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20          /* Case 
c070: 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28  1:     expr IN (
c080: 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20  SELECT ...).    
c090: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
c0a0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
c0b0: 74 6f 20 77 72 69 74 65 20 74 68 65 20 72 65 73  to write the res
c0c0: 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ults of the sele
c0d0: 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70  ct into the temp
c0e0: 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a 2a  orary.        **
c0f0: 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64   table allocated
c100: 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f 76   and opened abov
c110: 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
c120: 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
c130: 20 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20 45   dest;.        E
c140: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
c150: 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ..        assert
c160: 28 20 21 69 73 52 6f 77 69 64 20 29 3b 0a 20 20  ( !isRowid );.  
c170: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
c180: 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
c190: 74 2c 20 53 52 54 5f 53 65 74 2c 20 70 45 78 70  t, SRT_Set, pExp
c1a0: 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20  r->iTable);.    
c1b0: 20 20 20 20 64 65 73 74 2e 61 66 66 69 6e 69 74      dest.affinit
c1c0: 79 20 3d 20 28 75 38 29 61 66 66 69 6e 69 74 79  y = (u8)affinity
c1d0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
c1e0: 28 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  ( (pExpr->iTable
c1f0: 26 30 78 30 30 30 30 46 46 46 46 29 3d 3d 70 45  &0x0000FFFF)==pE
c200: 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20  xpr->iTable );. 
c210: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
c220: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
c230: 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
c240: 74 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20  t, &dest) ){.   
c250: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
c260: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c270: 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   pEList = pExpr-
c280: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
c290: 73 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  st;.        if( 
c2a0: 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
c2b0: 2d 3e 6e 45 78 70 72 3e 30 20 29 7b 20 0a 20 20  ->nExpr>0 ){ .  
c2c0: 20 20 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e          keyInfo.
c2d0: 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74  aColl[0] = sqlit
c2e0: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
c2f0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
c300: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20  Expr->pLeft,.   
c310: 20 20 20 20 20 20 20 20 20 20 20 70 45 4c 69 73             pELis
c320: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  t->a[0].pExpr);.
c330: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c340: 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d  }else if( pExpr-
c350: 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  >x.pList ){.    
c360: 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20      /* Case 2:  
c370: 20 20 20 65 78 70 72 20 49 4e 20 28 65 78 70 72     expr IN (expr
c380: 6c 69 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a  list).        **
c390: 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  .        ** For 
c3a0: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c  each expression,
c3b0: 20 62 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20   build an index 
c3c0: 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61  key from the eva
c3d0: 6c 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20  luation and.    
c3e0: 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20      ** store it 
c3f0: 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  in the temporary
c400: 20 74 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72   table. If <expr
c410: 3e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74  > is a column, t
c420: 68 65 6e 20 75 73 65 0a 20 20 20 20 20 20 20 20  hen use.        
c430: 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20  ** that columns 
c440: 61 66 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75  affinity when bu
c450: 69 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79  ilding index key
c460: 73 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20  s. If <expr> is 
c470: 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  not.        ** a
c480: 20 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d   column, use num
c490: 65 72 69 63 20 61 66 66 69 6e 69 74 79 2e 0a 20  eric affinity.. 
c4a0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
c4b0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
c4c0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
c4d0: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
c4e0: 74 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  t;.        struc
c4f0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
c500: 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20  *pItem;.        
c510: 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a  int r1, r2, r3;.
c520: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 61 66  .        if( !af
c530: 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20  finity ){.      
c540: 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53      affinity = S
c550: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
c560: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c570: 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b    keyInfo.aColl[
c580: 30 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  0] = sqlite3Expr
c590: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
c5a0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 0a  pExpr->pLeft);..
c5b0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
c5c0: 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70  through each exp
c5d0: 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72  ression in <expr
c5e0: 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20  list>. */.      
c5f0: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
c600: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
c610: 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73  ;.        r2 = s
c620: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
c630: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
c640: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c650: 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
c660: 30 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20  0, r2);.        
c670: 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78  for(i=pList->nEx
c680: 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  pr, pItem=pList-
c690: 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49  >a; i>0; i--, pI
c6a0: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
c6b0: 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70 49    Expr *pE2 = pI
c6c0: 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20  tem->pExpr;..   
c6d0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
c6e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e   expression is n
c6f0: 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e  ot constant then
c700: 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   we will need to
c710: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69  .          ** di
c720: 73 61 62 6c 65 20 74 68 65 20 74 65 73 74 20 74  sable the test t
c730: 68 61 74 20 77 61 73 20 67 65 6e 65 72 61 74 65  hat was generate
c740: 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b  d above that mak
c750: 65 73 20 73 75 72 65 0a 20 20 20 20 20 20 20 20  es sure.        
c760: 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f    ** this code o
c770: 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63  nly executes onc
c780: 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72 20  e.  Because for 
c790: 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20  a non-constant. 
c7a0: 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72           ** expr
c7b0: 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74  ession we need t
c7c0: 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64  o rerun this cod
c7d0: 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20  e each time..   
c7e0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
c7f0: 20 20 20 20 69 66 28 20 74 65 73 74 41 64 64 72      if( testAddr
c800: 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72   && !sqlite3Expr
c810: 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32 29 20  IsConstant(pE2) 
c820: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
c830: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
c840: 54 6f 4e 6f 6f 70 28 76 2c 20 74 65 73 74 41 64  ToNoop(v, testAd
c850: 64 72 2d 31 2c 20 32 29 3b 0a 20 20 20 20 20 20  dr-1, 2);.      
c860: 20 20 20 20 20 20 74 65 73 74 41 64 64 72 20 3d        testAddr =
c870: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
c880: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76  .          /* Ev
c890: 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65  aluate the expre
c8a0: 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74  ssion and insert
c8b0: 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d   it into the tem
c8c0: 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  p table */.     
c8d0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73       pParse->dis
c8e0: 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a  ableColCache++;.
c8f0: 20 20 20 20 20 20 20 20 20 20 72 33 20 3d 20 73            r3 = s
c900: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
c910: 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 32  rget(pParse, pE2
c920: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20  , r1);.         
c930: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
c940: 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
c950: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >0 );.          
c960: 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43  pParse->disableC
c970: 6f 6c 43 61 63 68 65 2d 2d 3b 0a 0a 20 20 20 20  olCache--;..    
c980: 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69        if( isRowi
c990: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d ){.           
c9a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c9b0: 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p2(v, OP_MustBeI
c9c0: 6e 74 2c 20 72 33 2c 20 73 71 6c 69 74 65 33 56  nt, r3, sqlite3V
c9d0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
c9e0: 29 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  )+2);.          
c9f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ca00: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
ca10: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
ca20: 20 72 32 2c 20 72 33 29 3b 0a 20 20 20 20 20 20   r2, r3);.      
ca30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ca40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ca50: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
ca60: 61 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c 20 31  akeRecord, r3, 1
ca70: 2c 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c  , r2, &affinity,
ca80: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   1);.           
ca90: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
caa0: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
cab0: 70 50 61 72 73 65 2c 20 72 33 2c 20 31 29 3b 0a  pParse, r3, 1);.
cac0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
cad0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
cae0: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
caf0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32  Expr->iTable, r2
cb00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
cb10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
cb20: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
cb30: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
cb40: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
cb50: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
cb60: 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20  g(pParse, r2);. 
cb70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
cb80: 20 21 69 73 52 6f 77 69 64 20 29 7b 0a 20 20 20   !isRowid ){.   
cb90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cba0: 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72  ChangeP4(v, addr
cbb0: 2c 20 28 76 6f 69 64 20 2a 29 26 6b 65 79 49 6e  , (void *)&keyIn
cbc0: 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
cbd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
cbe0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
cbf0: 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
cc00: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
cc10: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ECT: {.      /* 
cc20: 54 68 69 73 20 68 61 73 20 74 6f 20 62 65 20 61  This has to be a
cc30: 20 73 63 61 6c 61 72 20 53 45 4c 45 43 54 2e 20   scalar SELECT. 
cc40: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
cc50: 6f 20 70 75 74 20 74 68 65 0a 20 20 20 20 20 20  o put the.      
cc60: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  ** value of this
cc70: 20 73 65 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d   select in a mem
cc80: 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 63  ory cell and rec
cc90: 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 0a 20  ord the number. 
cca0: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d       ** of the m
ccb0: 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43  emory cell in iC
ccc0: 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  olumn..      */.
ccd0: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
cce0: 73 74 20 54 6f 6b 65 6e 20 6f 6e 65 20 3d 20 7b  st Token one = {
ccf0: 20 28 75 38 2a 29 22 31 22 2c 20 30 2c 20 31 20   (u8*)"1", 0, 1 
cd00: 7d 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  };.      Select 
cd10: 2a 70 53 65 6c 3b 0a 20 20 20 20 20 20 53 65 6c  *pSel;.      Sel
cd20: 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 0a 20  ectDest dest;.. 
cd30: 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70       assert( Exp
cd40: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
cd50: 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
cd60: 29 20 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 20  ) );.      pSel 
cd70: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  = pExpr->x.pSele
cd80: 63 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ct;.      sqlite
cd90: 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
cda0: 26 64 65 73 74 2c 20 30 2c 20 2b 2b 70 50 61 72  &dest, 0, ++pPar
cdb0: 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20  se->nMem);.     
cdc0: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
cdd0: 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20  TK_SELECT ){.   
cde0: 20 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20       dest.eDest 
cdf0: 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20  = SRT_Mem;.     
ce00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ce10: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
ce20: 20 30 2c 20 64 65 73 74 2e 69 50 61 72 6d 29 3b   0, dest.iParm);
ce30: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
ce40: 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 73  ment((v, "Init s
ce50: 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 22 29  ubquery result")
ce60: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
ce70: 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65          dest.eDe
ce80: 73 74 20 3d 20 53 52 54 5f 45 78 69 73 74 73 3b  st = SRT_Exists;
ce90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
cea0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
ceb0: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 64 65 73  _Integer, 0, des
cec0: 74 2e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  t.iParm);.      
ced0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
cee0: 2c 20 22 49 6e 69 74 20 45 58 49 53 54 53 20 72  , "Init EXISTS r
cef0: 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20  esult"));.      
cf00: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
cf10: 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
cf20: 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d  ->db, pSel->pLim
cf30: 69 74 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d  it);.      pSel-
cf40: 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65  >pLimit = sqlite
cf50: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
cf60: 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c  K_INTEGER, 0, 0,
cf70: 20 26 6f 6e 65 29 3b 0a 20 20 20 20 20 20 69 66   &one);.      if
cf80: 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  ( sqlite3Select(
cf90: 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 26 64  pParse, pSel, &d
cfa0: 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  est) ){.        
cfb0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
cfc0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
cfd0: 6c 75 6d 6e 20 3d 20 64 65 73 74 2e 69 50 61 72  lumn = dest.iPar
cfe0: 6d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  m;.      break;.
cff0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
d000: 20 74 65 73 74 41 64 64 72 20 29 7b 0a 20 20 20   testAddr ){.   
d010: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
d020: 48 65 72 65 28 76 2c 20 74 65 73 74 41 64 64 72  Here(v, testAddr
d030: 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  -1);.  }..  retu
d040: 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rn;.}.#endif /* 
d050: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
d060: 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44  UERY */../*.** D
d070: 75 70 6c 69 63 61 74 65 20 61 6e 20 38 2d 62 79  uplicate an 8-by
d080: 74 65 20 76 61 6c 75 65 0a 2a 2f 0a 73 74 61 74  te value.*/.stat
d090: 69 63 20 63 68 61 72 20 2a 64 75 70 38 62 79 74  ic char *dup8byt
d0a0: 65 73 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73  es(Vdbe *v, cons
d0b0: 74 20 63 68 61 72 20 2a 69 6e 29 7b 0a 20 20 63  t char *in){.  c
d0c0: 68 61 72 20 2a 6f 75 74 20 3d 20 73 71 6c 69 74  har *out = sqlit
d0d0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 73 71  e3DbMallocRaw(sq
d0e0: 6c 69 74 65 33 56 64 62 65 44 62 28 76 29 2c 20  lite3VdbeDb(v), 
d0f0: 38 29 3b 0a 20 20 69 66 28 20 6f 75 74 20 29 7b  8);.  if( out ){
d100: 0a 20 20 20 20 6d 65 6d 63 70 79 28 6f 75 74 2c  .    memcpy(out,
d110: 20 69 6e 2c 20 38 29 3b 0a 20 20 7d 0a 20 20 72   in, 8);.  }.  r
d120: 65 74 75 72 6e 20 6f 75 74 3b 0a 7d 0a 0a 2f 2a  eturn out;.}../*
d130: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20  .** Generate an 
d140: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
d150: 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 66 6c   will put the fl
d160: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20  oating point.** 
d170: 76 61 6c 75 65 20 64 65 73 63 72 69 62 65 64 20  value described 
d180: 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74  by z[0..n-1] int
d190: 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e  o register iMem.
d1a0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73  .**.** The z[] s
d1b0: 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61  tring will proba
d1c0: 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d  bly not be zero-
d1d0: 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74  terminated.  But
d1e0: 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68   the .** z[n] ch
d1f0: 61 72 61 63 74 65 72 20 69 73 20 67 75 61 72 61  aracter is guara
d200: 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65  nteed to be some
d210: 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20  thing that does 
d220: 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65  not look.** like
d230: 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f   the continuatio
d240: 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e  n of the number.
d250: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
d260: 63 6f 64 65 52 65 61 6c 28 56 64 62 65 20 2a 76  codeReal(Vdbe *v
d270: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  , const char *z,
d280: 20 69 6e 74 20 6e 2c 20 69 6e 74 20 6e 65 67 61   int n, int nega
d290: 74 65 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d  teFlag, int iMem
d2a0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 7a 20 7c  ){.  assert( z |
d2b0: 7c 20 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  | v==0 || sqlite
d2c0: 33 56 64 62 65 44 62 28 76 29 2d 3e 6d 61 6c 6c  3VdbeDb(v)->mall
d2d0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 61 73  ocFailed );.  as
d2e0: 73 65 72 74 28 20 21 7a 20 7c 7c 20 21 73 71 6c  sert( !z || !sql
d2f0: 69 74 65 33 49 73 64 69 67 69 74 28 7a 5b 6e 5d  ite3Isdigit(z[n]
d300: 29 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ) );.  UNUSED_PA
d310: 52 41 4d 45 54 45 52 28 6e 29 3b 0a 20 20 69 66  RAMETER(n);.  if
d320: 28 20 7a 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c  ( z ){.    doubl
d330: 65 20 76 61 6c 75 65 3b 0a 20 20 20 20 63 68 61  e value;.    cha
d340: 72 20 2a 7a 56 3b 0a 20 20 20 20 73 71 6c 69 74  r *zV;.    sqlit
d350: 65 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65  e3AtoF(z, &value
d360: 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
d370: 65 33 49 73 4e 61 4e 28 76 61 6c 75 65 29 20 29  e3IsNaN(value) )
d380: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
d390: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
d3a0: 4e 75 6c 6c 2c 20 30 2c 20 69 4d 65 6d 29 3b 0a  Null, 0, iMem);.
d3b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d3c0: 20 69 66 28 20 6e 65 67 61 74 65 46 6c 61 67 20   if( negateFlag 
d3d0: 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65  ) value = -value
d3e0: 3b 0a 20 20 20 20 20 20 7a 56 20 3d 20 64 75 70  ;.      zV = dup
d3f0: 38 62 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a  8bytes(v, (char*
d400: 29 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  )&value);.      
d410: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d420: 34 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c  4(v, OP_Real, 0,
d430: 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34   iMem, 0, zV, P4
d440: 5f 52 45 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  _REAL);.    }.  
d450: 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  }.}.../*.** Gene
d460: 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74  rate an instruct
d470: 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75  ion that will pu
d480: 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 64 65  t the integer de
d490: 73 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78  scribe by.** tex
d4a0: 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f  t z[0..n-1] into
d4b0: 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a   register iMem..
d4c0: 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74  **.** The z[] st
d4d0: 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61 62  ring will probab
d4e0: 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74  ly not be zero-t
d4f0: 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20  erminated.  But 
d500: 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61  the .** z[n] cha
d510: 72 61 63 74 65 72 20 69 73 20 67 75 61 72 61 6e  racter is guaran
d520: 74 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65 74  teed to be somet
d530: 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e  hing that does n
d540: 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20  ot look.** like 
d550: 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e  the continuation
d560: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a   of the number..
d570: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
d580: 6f 64 65 49 6e 74 65 67 65 72 28 56 64 62 65 20  odeInteger(Vdbe 
d590: 2a 76 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  *v, Expr *pExpr,
d5a0: 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e   int negFlag, in
d5b0: 74 20 69 4d 65 6d 29 7b 0a 20 20 63 6f 6e 73 74  t iMem){.  const
d5c0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20   char *z;.  if( 
d5d0: 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
d5e0: 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20  P_IntValue ){.  
d5f0: 20 20 69 6e 74 20 69 20 3d 20 70 45 78 70 72 2d    int i = pExpr-
d600: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 69 66 28  >iTable;.    if(
d610: 20 6e 65 67 46 6c 61 67 20 29 20 69 20 3d 20 2d   negFlag ) i = -
d620: 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  i;.    sqlite3Vd
d630: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
d640: 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29  nteger, i, iMem)
d650: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 7a  ;.  }else if( (z
d660: 20 3d 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d   = (char*)pExpr-
d670: 3e 74 6f 6b 65 6e 2e 7a 29 21 3d 30 20 29 7b 0a  >token.z)!=0 ){.
d680: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
d690: 6e 74 20 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f  nt n = pExpr->to
d6a0: 6b 65 6e 2e 6e 3b 0a 20 20 20 20 61 73 73 65 72  ken.n;.    asser
d6b0: 74 28 20 21 73 71 6c 69 74 65 33 49 73 64 69 67  t( !sqlite3Isdig
d6c0: 69 74 28 7a 5b 6e 5d 29 20 29 3b 0a 20 20 20 20  it(z[n]) );.    
d6d0: 69 66 28 20 73 71 6c 69 74 65 33 47 65 74 49 6e  if( sqlite3GetIn
d6e0: 74 33 32 28 7a 2c 20 26 69 29 20 29 7b 0a 20 20  t32(z, &i) ){.  
d6f0: 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20      if( negFlag 
d700: 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20 20 20  ) i = -i;.      
d710: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d720: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
d730: 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 7d   i, iMem);.    }
d740: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
d750: 46 69 74 73 49 6e 36 34 42 69 74 73 28 7a 2c 20  FitsIn64Bits(z, 
d760: 6e 65 67 46 6c 61 67 29 20 29 7b 0a 20 20 20 20  negFlag) ){.    
d770: 20 20 69 36 34 20 76 61 6c 75 65 3b 0a 20 20 20    i64 value;.   
d780: 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20 20 20     char *zV;.   
d790: 20 20 20 73 71 6c 69 74 65 33 41 74 6f 69 36 34     sqlite3Atoi64
d7a0: 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20 20  (z, &value);.   
d7b0: 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29     if( negFlag )
d7c0: 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b   value = -value;
d7d0: 0a 20 20 20 20 20 20 7a 56 20 3d 20 64 75 70 38  .      zV = dup8
d7e0: 62 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a 29  bytes(v, (char*)
d7f0: 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 73  &value);.      s
d800: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
d810: 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c  (v, OP_Int64, 0,
d820: 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34   iMem, 0, zV, P4
d830: 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c  _INT64);.    }el
d840: 73 65 7b 0a 20 20 20 20 20 20 63 6f 64 65 52 65  se{.      codeRe
d850: 61 6c 28 76 2c 20 7a 2c 20 6e 2c 20 6e 65 67 46  al(v, z, n, negF
d860: 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20  lag, iMem);.    
d870: 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  }.  }.}.../*.** 
d880: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
d890: 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20  at will extract 
d8a0: 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63  the iColumn-th c
d8b0: 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61  olumn from.** ta
d8c0: 62 6c 65 20 70 54 61 62 20 61 6e 64 20 73 74 6f  ble pTab and sto
d8d0: 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61  re the column va
d8e0: 6c 75 65 20 69 6e 20 61 20 72 65 67 69 73 74 65  lue in a registe
d8f0: 72 2e 20 20 41 6e 20 65 66 66 6f 72 74 0a 2a 2a  r.  An effort.**
d900: 20 69 73 20 6d 61 64 65 20 74 6f 20 73 74 6f 72   is made to stor
d910: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c  e the column val
d920: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ue in register i
d930: 52 65 67 2c 20 62 75 74 20 74 68 69 73 20 69 73  Reg, but this is
d940: 0a 2a 2a 20 6e 6f 74 20 67 75 61 72 61 6e 74 65  .** not guarante
d950: 65 64 2e 20 20 54 68 65 20 6c 6f 63 61 74 69 6f  ed.  The locatio
d960: 6e 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  n of the column 
d970: 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65  value is returne
d980: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d  d..**.** There m
d990: 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63  ust be an open c
d9a0: 75 72 73 6f 72 20 74 6f 20 70 54 61 62 20 69 6e  ursor to pTab in
d9b0: 20 69 54 61 62 6c 65 20 77 68 65 6e 20 74 68 69   iTable when thi
d9c0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
d9d0: 63 61 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c  called.  If iCol
d9e0: 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65 20  umn<0 then code 
d9f0: 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 68 61  is generated tha
da00: 74 20 65 78 74 72 61 63 74 73 20 74 68 65 20 72  t extracts the r
da10: 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  owid..**.** This
da20: 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 61   routine might a
da30: 74 74 65 6d 70 74 20 74 6f 20 72 65 75 73 65 20  ttempt to reuse 
da40: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
da50: 20 63 6f 6c 75 6d 6e 20 74 68 61 74 0a 2a 2a 20   column that.** 
da60: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
da70: 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 61 20 72   loaded into a r
da80: 65 67 69 73 74 65 72 2e 20 20 54 68 65 20 76 61  egister.  The va
da90: 6c 75 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 0a  lue will always.
daa0: 2a 2a 20 62 65 20 75 73 65 64 20 69 66 20 69 74  ** be used if it
dab0: 20 68 61 73 20 6e 6f 74 20 75 6e 64 65 72 67 6f   has not undergo
dac0: 6e 65 20 61 6e 79 20 61 66 66 69 6e 69 74 79 20  ne any affinity 
dad0: 63 68 61 6e 67 65 73 2e 20 20 42 75 74 20 69 66  changes.  But if
dae0: 0a 2a 2a 20 61 6e 20 61 66 66 69 6e 69 74 79 20  .** an affinity 
daf0: 63 68 61 6e 67 65 20 68 61 73 20 6f 63 63 75 72  change has occur
db00: 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63 61  red, then the ca
db10: 63 68 65 64 20 76 61 6c 75 65 20 77 69 6c 6c 20  ched value will 
db20: 6f 6e 6c 79 20 62 65 0a 2a 2a 20 75 73 65 64 20  only be.** used 
db30: 69 66 20 61 6c 6c 6f 77 41 66 66 43 68 6e 67 20  if allowAffChng 
db40: 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20  is true..*/.int 
db50: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
db60: 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73  etColumn(.  Pars
db70: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
db80: 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
db90: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
dba0: 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ext */.  Table *
dbb0: 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73  pTab,     /* Des
dbc0: 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
dbd0: 74 61 62 6c 65 20 77 65 20 61 72 65 20 72 65 61  table we are rea
dbe0: 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  ding from */.  i
dbf0: 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
dc00: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
dc10: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  table column */.
dc20: 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
dc30: 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
dc40: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
dc50: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
dc60: 69 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  iReg,        /* 
dc70: 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65  Store results he
dc80: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 61 6c 6c 6f  re */.  int allo
dc90: 77 41 66 66 43 68 6e 67 20 2f 2a 20 54 72 75 65  wAffChng /* True
dca0: 20 69 66 20 70 72 69 6f 72 20 61 66 66 69 6e 69   if prior affini
dcb0: 74 79 20 63 68 61 6e 67 65 73 20 61 72 65 20 4f  ty changes are O
dcc0: 4b 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  K */.){.  Vdbe *
dcd0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
dce0: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
dcf0: 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
dd00: 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  p;..  for(i=0, p
dd10: 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
dd20: 68 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43  he; i<pParse->nC
dd30: 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b  olCache; i++, p+
dd40: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
dd50: 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26  Table==iTable &&
dd60: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f   p->iColumn==iCo
dd70: 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20 20 20 20  lumn.           
dd80: 26 26 20 28 21 70 2d 3e 61 66 66 43 68 61 6e 67  && (!p->affChang
dd90: 65 20 7c 7c 20 61 6c 6c 6f 77 41 66 66 43 68 6e  e || allowAffChn
dda0: 67 29 20 29 7b 0a 23 69 66 20 30 0a 20 20 20 20  g) ){.#if 0.    
ddb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ddc0: 4f 70 30 28 76 2c 20 4f 50 5f 4e 6f 6f 70 29 3b  Op0(v, OP_Noop);
ddd0: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
dde0: 6e 74 28 28 76 2c 20 22 4f 50 54 3a 20 74 61 62  nt((v, "OPT: tab
ddf0: 25 64 2e 63 6f 6c 25 64 20 2d 3e 20 72 25 64 22  %d.col%d -> r%d"
de00: 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d  , iTable, iColum
de10: 6e 2c 20 70 2d 3e 69 52 65 67 29 29 3b 0a 23 65  n, p->iReg));.#e
de20: 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74 75 72  ndif.      retur
de30: 6e 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d  n p->iReg;.    }
de40: 0a 20 20 7d 20 20 0a 20 20 61 73 73 65 72 74 28  .  }  .  assert(
de50: 20 76 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69   v!=0 );.  if( i
de60: 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
de70: 69 6e 74 20 6f 70 20 3d 20 28 70 54 61 62 20 26  int op = (pTab &
de80: 26 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  & IsVirtual(pTab
de90: 29 29 20 3f 20 4f 50 5f 56 52 6f 77 69 64 20 3a  )) ? OP_VRowid :
dea0: 20 4f 50 5f 52 6f 77 69 64 3b 0a 20 20 20 20 73   OP_Rowid;.    s
deb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
dec0: 28 76 2c 20 6f 70 2c 20 69 54 61 62 6c 65 2c 20  (v, op, iTable, 
ded0: 69 52 65 67 29 3b 0a 20 20 7d 65 6c 73 65 20 69  iReg);.  }else i
dee0: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
def0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
df00: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
df10: 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d  , iTable, iColum
df20: 6e 2c 20 69 52 65 67 29 3b 0a 20 20 7d 65 6c 73  n, iReg);.  }els
df30: 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  e{.    int op = 
df40: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
df50: 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f  ? OP_VColumn : O
df60: 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71  P_Column;.    sq
df70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
df80: 76 2c 20 6f 70 2c 20 69 54 61 62 6c 65 2c 20 69  v, op, iTable, i
df90: 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20  Column, iReg);. 
dfa0: 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
dfb0: 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c  Default(v, pTab,
dfc0: 20 69 43 6f 6c 75 6d 6e 29 3b 0a 23 69 66 6e 64   iColumn);.#ifnd
dfd0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
dfe0: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
dff0: 20 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c    if( pTab->aCol
e000: 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69  [iColumn].affini
e010: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ty==SQLITE_AFF_R
e020: 45 41 4c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  EAL ){.      sql
e030: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
e040: 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74  , OP_RealAffinit
e050: 79 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 7d 0a  y, iReg);.    }.
e060: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66 28  #endif.  }.  if(
e070: 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65   pParse->disable
e080: 43 6f 6c 43 61 63 68 65 3d 3d 30 20 29 7b 0a 20  ColCache==0 ){. 
e090: 20 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 69     i = pParse->i
e0a0: 43 6f 6c 43 61 63 68 65 3b 0a 20 20 20 20 70 20  ColCache;.    p 
e0b0: 3d 20 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43  = &pParse->aColC
e0c0: 61 63 68 65 5b 69 5d 3b 0a 20 20 20 20 70 2d 3e  ache[i];.    p->
e0d0: 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b  iTable = iTable;
e0e0: 0a 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20  .    p->iColumn 
e0f0: 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70  = iColumn;.    p
e100: 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a 20  ->iReg = iReg;. 
e110: 20 20 20 70 2d 3e 61 66 66 43 68 61 6e 67 65 20     p->affChange 
e120: 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20  = 0;.    i++;.  
e130: 20 20 69 66 28 20 69 3e 3d 41 72 72 61 79 53 69    if( i>=ArraySi
e140: 7a 65 28 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43  ze(pParse->aColC
e150: 61 63 68 65 29 20 29 20 69 20 3d 20 30 3b 0a 20  ache) ) i = 0;. 
e160: 20 20 20 69 66 28 20 69 3e 70 50 61 72 73 65 2d     if( i>pParse-
e170: 3e 6e 43 6f 6c 43 61 63 68 65 20 29 20 70 50 61  >nColCache ) pPa
e180: 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 3d  rse->nColCache =
e190: 20 69 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   i;.    pParse->
e1a0: 69 43 6f 6c 43 61 63 68 65 20 3d 20 69 3b 0a 20  iColCache = i;. 
e1b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67   }.  return iReg
e1c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
e1d0: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63 68   all column cach
e1e0: 65 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69  e entries associ
e1f0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 76 64  ated with the vd
e200: 62 65 0a 2a 2a 20 63 75 72 73 6f 72 20 77 69 74  be.** cursor wit
e210: 68 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  h cursor number 
e220: 69 54 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20  iTable..*/.void 
e230: 73 71 6c 69 74 65 33 45 78 70 72 43 6c 65 61 72  sqlite3ExprClear
e240: 43 6f 6c 75 6d 6e 43 61 63 68 65 28 50 61 72 73  ColumnCache(Pars
e250: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
e260: 54 61 62 6c 65 29 7b 0a 20 20 69 66 28 20 69 54  Table){.  if( iT
e270: 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20 70 50  able<0 ){.    pP
e280: 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20  arse->nColCache 
e290: 3d 20 30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  = 0;.    pParse-
e2a0: 3e 69 43 6f 6c 43 61 63 68 65 20 3d 20 30 3b 0a  >iColCache = 0;.
e2b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
e2c0: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
e2d0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43   i<pParse->nColC
e2e0: 61 63 68 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ache; i++){.    
e2f0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 43    if( pParse->aC
e300: 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 54 61 62 6c  olCache[i].iTabl
e310: 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20  e==iTable ){.   
e320: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
e330: 3d 3d 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61  ==pParse->nColCa
e340: 63 68 65 2d 31 20 29 3b 0a 20 20 20 20 20 20 20  che-1 );.       
e350: 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63   pParse->aColCac
e360: 68 65 5b 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e  he[i] = pParse->
e370: 61 43 6f 6c 43 61 63 68 65 5b 2d 2d 70 50 61 72  aColCache[--pPar
e380: 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 5d 3b 0a  se->nColCache];.
e390: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
e3a0: 69 43 6f 6c 43 61 63 68 65 20 3d 20 70 50 61 72  iColCache = pPar
e3b0: 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 0a 20  se->nColCache;. 
e3c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
e3d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64  .}../*.** Record
e3e0: 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 61   the fact that a
e3f0: 6e 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67  n affinity chang
e400: 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 6f  e has occurred o
e410: 6e 20 69 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69  n iCount.** regi
e420: 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 77  sters starting w
e430: 69 74 68 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76  ith iStart..*/.v
e440: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
e450: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
e460: 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
e470: 2c 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69 6e  , int iStart, in
e480: 74 20 69 43 6f 75 6e 74 29 7b 0a 20 20 69 6e 74  t iCount){.  int
e490: 20 69 45 6e 64 20 3d 20 69 53 74 61 72 74 20 2b   iEnd = iStart +
e4a0: 20 69 43 6f 75 6e 74 20 2d 20 31 3b 0a 20 20 69   iCount - 1;.  i
e4b0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
e4c0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43   i<pParse->nColC
e4d0: 61 63 68 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ache; i++){.    
e4e0: 69 6e 74 20 72 20 3d 20 70 50 61 72 73 65 2d 3e  int r = pParse->
e4f0: 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65  aColCache[i].iRe
e500: 67 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 53  g;.    if( r>=iS
e510: 74 61 72 74 20 26 26 20 72 3c 3d 69 45 6e 64 20  tart && r<=iEnd 
e520: 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
e530: 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 61 66  >aColCache[i].af
e540: 66 43 68 61 6e 67 65 20 3d 20 31 3b 0a 20 20 20  fChange = 1;.   
e550: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
e560: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
e570: 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74 20 66 72   move content fr
e580: 6f 6d 20 72 65 67 69 73 74 65 72 73 20 69 46 72  om registers iFr
e590: 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d  om...iFrom+nReg-
e5a0: 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f  1.** over to iTo
e5b0: 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65  ..iTo+nReg-1. Ke
e5c0: 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  ep the column ca
e5d0: 63 68 65 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a  che up-to-date..
e5e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
e5f0: 78 70 72 43 6f 64 65 4d 6f 76 65 28 50 61 72 73  xprCodeMove(Pars
e600: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
e610: 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69  From, int iTo, i
e620: 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt nReg){.  int 
e630: 69 3b 0a 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d  i;.  if( iFrom==
e640: 69 54 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  iTo ) return;.  
e650: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e660: 33 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  3(pParse->pVdbe,
e670: 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c   OP_Move, iFrom,
e680: 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a 20 20 66   iTo, nReg);.  f
e690: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
e6a0: 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b  ->nColCache; i++
e6b0: 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 70  ){.    int x = p
e6c0: 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
e6d0: 5b 69 5d 2e 69 52 65 67 3b 0a 20 20 20 20 69 66  [i].iReg;.    if
e6e0: 28 20 78 3e 3d 69 46 72 6f 6d 20 26 26 20 78 3c  ( x>=iFrom && x<
e6f0: 69 46 72 6f 6d 2b 6e 52 65 67 20 29 7b 0a 20 20  iFrom+nReg ){.  
e700: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c      pParse->aCol
e710: 43 61 63 68 65 5b 69 5d 2e 69 52 65 67 20 2b 3d  Cache[i].iReg +=
e720: 20 69 54 6f 2d 69 46 72 6f 6d 3b 0a 20 20 20 20   iTo-iFrom;.    
e730: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
e740: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
e750: 63 6f 70 79 20 63 6f 6e 74 65 6e 74 20 66 72 6f  copy content fro
e760: 6d 20 72 65 67 69 73 74 65 72 73 20 69 46 72 6f  m registers iFro
e770: 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31  m...iFrom+nReg-1
e780: 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e  .** over to iTo.
e790: 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 0a 2a 2f 0a  .iTo+nReg-1..*/.
e7a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
e7b0: 43 6f 64 65 43 6f 70 79 28 50 61 72 73 65 20 2a  CodeCopy(Parse *
e7c0: 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f  pParse, int iFro
e7d0: 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20  m, int iTo, int 
e7e0: 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  nReg){.  int i;.
e7f0: 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 69 54 6f    if( iFrom==iTo
e800: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
e810: 28 69 3d 30 3b 20 69 3c 6e 52 65 67 3b 20 69 2b  (i=0; i<nReg; i+
e820: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +){.    sqlite3V
e830: 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65  dbeAddOp2(pParse
e840: 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79  ->pVdbe, OP_Copy
e850: 2c 20 69 46 72 6f 6d 2b 69 2c 20 69 54 6f 2b 69  , iFrom+i, iTo+i
e860: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
e870: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61  Return true if a
e880: 6e 79 20 72 65 67 69 73 74 65 72 20 69 6e 20 74  ny register in t
e890: 68 65 20 72 61 6e 67 65 20 69 46 72 6f 6d 2e 2e  he range iFrom..
e8a0: 69 54 6f 20 28 69 6e 63 6c 75 73 69 76 65 29 0a  iTo (inclusive).
e8b0: 2a 2a 20 69 73 20 75 73 65 64 20 61 73 20 70 61  ** is used as pa
e8c0: 72 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  rt of the column
e8d0: 20 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69   cache..*/.stati
e8e0: 63 20 69 6e 74 20 75 73 65 64 41 73 43 6f 6c 75  c int usedAsColu
e8f0: 6d 6e 43 61 63 68 65 28 50 61 72 73 65 20 2a 70  mnCache(Parse *p
e900: 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d  Parse, int iFrom
e910: 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69 6e  , int iTo){.  in
e920: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
e930: 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61  i<pParse->nColCa
e940: 63 68 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  che; i++){.    i
e950: 6e 74 20 72 20 3d 20 70 50 61 72 73 65 2d 3e 61  nt r = pParse->a
e960: 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67  ColCache[i].iReg
e970: 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 46 72  ;.    if( r>=iFr
e980: 6f 6d 20 26 26 20 72 3c 3d 69 54 6f 20 29 20 72  om && r<=iTo ) r
e990: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
e9a0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
e9b0: 2a 20 54 68 65 72 65 20 69 73 20 61 20 76 61 6c  * There is a val
e9c0: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ue in register i
e9d0: 52 65 67 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 72  Reg..**.** We ar
e9e0: 65 20 67 6f 69 6e 67 20 74 6f 20 6d 6f 64 69 66  e going to modif
e9f0: 79 20 74 68 65 20 76 61 6c 75 65 2c 20 73 6f 20  y the value, so 
ea00: 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20  we need to make 
ea10: 73 75 72 65 20 69 74 0a 2a 2a 20 69 73 20 6e 6f  sure it.** is no
ea20: 74 20 61 20 63 61 63 68 65 64 20 72 65 67 69 73  t a cached regis
ea30: 74 65 72 2e 20 20 49 66 20 69 52 65 67 20 69 73  ter.  If iReg is
ea40: 20 61 20 63 61 63 68 65 64 20 72 65 67 69 73 74   a cached regist
ea50: 65 72 2c 0a 2a 2a 20 74 68 65 6e 20 63 6c 65 61  er,.** then clea
ea60: 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  r the correspond
ea70: 69 6e 67 20 63 61 63 68 65 20 6c 69 6e 65 2e 0a  ing cache line..
ea80: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
ea90: 78 70 72 57 72 69 74 61 62 6c 65 52 65 67 69 73  xprWritableRegis
eaa0: 74 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ter(Parse *pPars
eab0: 65 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20  e, int iReg){.  
eac0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 75 73 65  int i;.  if( use
ead0: 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70  dAsColumnCache(p
eae0: 50 61 72 73 65 2c 20 69 52 65 67 2c 20 69 52 65  Parse, iReg, iRe
eaf0: 67 29 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  g) ){.    for(i=
eb00: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f  0; i<pParse->nCo
eb10: 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b 0a 20 20  lCache; i++){.  
eb20: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
eb30: 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65  aColCache[i].iRe
eb40: 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20 20  g==iReg ){.     
eb50: 20 20 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43     pParse->aColC
eb60: 61 63 68 65 5b 69 5d 20 3d 20 70 50 61 72 73 65  ache[i] = pParse
eb70: 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 2d 2d 70 50  ->aColCache[--pP
eb80: 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 5d  arse->nColCache]
eb90: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
eba0: 2d 3e 69 43 6f 6c 43 61 63 68 65 20 3d 20 70 50  ->iColCache = pP
ebb0: 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b  arse->nColCache;
ebc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
ebd0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74   }.}../*.** If t
ebe0: 68 65 20 6c 61 73 74 20 69 6e 73 74 72 75 63 74  he last instruct
ebf0: 69 6f 6e 20 63 6f 64 65 64 20 69 73 20 61 6e 20  ion coded is an 
ec00: 65 70 68 65 6d 65 72 61 6c 20 63 6f 70 79 20 6f  ephemeral copy o
ec10: 66 20 61 6e 79 20 6f 66 0a 2a 2a 20 74 68 65 20  f any of.** the 
ec20: 72 65 67 69 73 74 65 72 73 20 69 6e 20 74 68 65  registers in the
ec30: 20 6e 52 65 67 20 72 65 67 69 73 74 65 72 73 20   nReg registers 
ec40: 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 69  beginning with i
ec50: 52 65 67 2c 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e  Reg, then.** con
ec60: 76 65 72 74 20 74 68 65 20 6c 61 73 74 20 69 6e  vert the last in
ec70: 73 74 72 75 63 74 69 6f 6e 20 66 72 6f 6d 20 4f  struction from O
ec80: 50 5f 53 43 6f 70 79 20 74 6f 20 4f 50 5f 43 6f  P_SCopy to OP_Co
ec90: 70 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  py..*/.void sqli
eca0: 74 65 33 45 78 70 72 48 61 72 64 43 6f 70 79 28  te3ExprHardCopy(
ecb0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
ecc0: 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65  nt iReg, int nRe
ecd0: 67 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a  g){.  int addr;.
ece0: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
ecf0: 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 76 20 3d   Vdbe *v;..  v =
ed00: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
ed10: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
ed20: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
ed30: 76 29 3b 0a 20 20 70 4f 70 20 3d 20 73 71 6c 69  v);.  pOp = sqli
ed40: 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
ed50: 61 64 64 72 2d 31 29 3b 0a 20 20 61 73 73 65 72  addr-1);.  asser
ed60: 74 28 20 70 4f 70 20 7c 7c 20 70 50 61 72 73 65  t( pOp || pParse
ed70: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
ed80: 65 64 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 20  ed );.  if( pOp 
ed90: 26 26 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  && pOp->opcode==
eda0: 4f 50 5f 53 43 6f 70 79 20 26 26 20 70 4f 70 2d  OP_SCopy && pOp-
edb0: 3e 70 31 3e 3d 69 52 65 67 20 26 26 20 70 4f 70  >p1>=iReg && pOp
edc0: 2d 3e 70 31 3c 69 52 65 67 2b 6e 52 65 67 20 29  ->p1<iReg+nReg )
edd0: 7b 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64  {.    pOp->opcod
ede0: 65 20 3d 20 4f 50 5f 43 6f 70 79 3b 0a 20 20 7d  e = OP_Copy;.  }
edf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
ee00: 74 65 20 63 6f 64 65 20 74 6f 20 73 74 6f 72 65  te code to store
ee10: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
ee20: 65 20 69 41 6c 69 61 73 2d 74 68 20 61 6c 69 61  e iAlias-th alia
ee30: 73 20 69 6e 20 72 65 67 69 73 74 65 72 0a 2a 2a  s in register.**
ee40: 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 66 69   target.  The fi
ee50: 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 69 73  rst time this is
ee60: 20 63 61 6c 6c 65 64 2c 20 70 45 78 70 72 20 69   called, pExpr i
ee70: 73 20 65 76 61 6c 75 61 74 65 64 20 74 6f 20 63  s evaluated to c
ee80: 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20 76 61  ompute.** the va
ee90: 6c 75 65 20 6f 66 20 74 68 65 20 61 6c 69 61 73  lue of the alias
eea0: 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69 73 20  .  The value is 
eeb0: 73 74 6f 72 65 64 20 69 6e 20 61 6e 20 61 75 78  stored in an aux
eec0: 69 6c 69 61 72 79 20 72 65 67 69 73 74 65 72 0a  iliary register.
eed0: 2a 2a 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  ** and the numbe
eee0: 72 20 6f 66 20 74 68 61 74 20 72 65 67 69 73 74  r of that regist
eef0: 65 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  er is returned. 
ef00: 20 4f 6e 20 73 75 62 73 65 71 75 65 6e 74 20 63   On subsequent c
ef10: 61 6c 6c 73 2c 0a 2a 2a 20 74 68 65 20 72 65 67  alls,.** the reg
ef20: 69 73 74 65 72 20 6e 75 6d 62 65 72 20 69 73 20  ister number is 
ef30: 72 65 74 75 72 6e 65 64 20 77 69 74 68 6f 75 74  returned without
ef40: 20 67 65 6e 65 72 61 74 69 6e 67 20 61 6e 79 20   generating any 
ef50: 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  code..**.** Note
ef60: 20 74 68 61 74 20 69 6e 20 6f 72 64 65 72 20 66   that in order f
ef70: 6f 72 20 74 68 69 73 20 74 6f 20 77 6f 72 6b 2c  or this to work,
ef80: 20 63 6f 64 65 20 6d 75 73 74 20 62 65 20 67 65   code must be ge
ef90: 6e 65 72 61 74 65 64 20 69 6e 20 74 68 65 0a 2a  nerated in the.*
efa0: 2a 20 73 61 6d 65 20 6f 72 64 65 72 20 74 68 61  * same order tha
efb0: 74 20 69 74 20 69 73 20 65 78 65 63 75 74 65 64  t it is executed
efc0: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 69 61 73 65 73 20  ..**.** Aliases 
efd0: 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61  are numbered sta
efe0: 72 74 69 6e 67 20 77 69 74 68 20 31 2e 20 20 53  rting with 1.  S
eff0: 6f 20 69 41 6c 69 61 73 20 69 73 20 69 6e 20 74  o iAlias is in t
f000: 68 65 20 72 61 6e 67 65 0a 2a 2a 20 6f 66 20 31  he range.** of 1
f010: 20 74 6f 20 70 50 61 72 73 65 2d 3e 6e 41 6c 69   to pParse->nAli
f020: 61 73 20 69 6e 63 6c 75 73 69 76 65 2e 20 20 0a  as inclusive.  .
f030: 2a 2a 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 61 41  **.** pParse->aA
f040: 6c 69 61 73 5b 69 41 6c 69 61 73 2d 31 5d 20 72  lias[iAlias-1] r
f050: 65 63 6f 72 64 73 20 74 68 65 20 72 65 67 69 73  ecords the regis
f060: 74 65 72 20 6e 75 6d 62 65 72 20 77 68 65 72 65  ter number where
f070: 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66   the value.** of
f080: 20 74 68 65 20 69 41 6c 69 61 73 2d 74 68 20 61   the iAlias-th a
f090: 6c 69 61 73 20 69 73 20 73 74 6f 72 65 64 2e 20  lias is stored. 
f0a0: 20 49 66 20 7a 65 72 6f 2c 20 74 68 61 74 20 6d   If zero, that m
f0b0: 65 61 6e 73 20 74 68 61 74 20 74 68 65 0a 2a 2a  eans that the.**
f0c0: 20 61 6c 69 61 73 20 68 61 73 20 6e 6f 74 20 79   alias has not y
f0d0: 65 74 20 62 65 65 6e 20 63 6f 6d 70 75 74 65 64  et been computed
f0e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f0f0: 63 6f 64 65 41 6c 69 61 73 28 50 61 72 73 65 20  codeAlias(Parse 
f100: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 41 6c  *pParse, int iAl
f110: 69 61 73 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ias, Expr *pExpr
f120: 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
f130: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
f140: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
f150: 20 69 52 65 67 3b 0a 20 20 69 66 28 20 70 50 61   iReg;.  if( pPa
f160: 72 73 65 2d 3e 6e 41 6c 69 61 73 41 6c 6c 6f 63  rse->nAliasAlloc
f170: 3c 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73 20  <pParse->nAlias 
f180: 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61  ){.    pParse->a
f190: 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33 44  Alias = sqlite3D
f1a0: 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 64  bReallocOrFree(d
f1b0: 62 2c 20 70 50 61 72 73 65 2d 3e 61 41 6c 69 61  b, pParse->aAlia
f1c0: 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
f1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1e0: 20 20 20 20 73 69 7a 65 6f 66 28 70 50 61 72 73      sizeof(pPars
f1f0: 65 2d 3e 61 41 6c 69 61 73 5b 30 5d 29 2a 70 50  e->aAlias[0])*pP
f200: 61 72 73 65 2d 3e 6e 41 6c 69 61 73 20 29 3b 0a  arse->nAlias );.
f210: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64 62      testcase( db
f220: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
f230: 26 20 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73  & pParse->nAlias
f240: 41 6c 6c 6f 63 3e 30 20 29 3b 0a 20 20 20 20 69  Alloc>0 );.    i
f250: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
f260: 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  led ) return 0;.
f270: 20 20 20 20 6d 65 6d 73 65 74 28 26 70 50 61 72      memset(&pPar
f280: 73 65 2d 3e 61 41 6c 69 61 73 5b 70 50 61 72 73  se->aAlias[pPars
f290: 65 2d 3e 6e 41 6c 69 61 73 41 6c 6c 6f 63 5d 2c  e->nAliasAlloc],
f2a0: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28   0,.           (
f2b0: 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73 2d 70  pParse->nAlias-p
f2c0: 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73 41 6c 6c  Parse->nAliasAll
f2d0: 6f 63 29 2a 73 69 7a 65 6f 66 28 70 50 61 72 73  oc)*sizeof(pPars
f2e0: 65 2d 3e 61 41 6c 69 61 73 5b 30 5d 29 29 3b 0a  e->aAlias[0]));.
f2f0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 41 6c 69      pParse->nAli
f300: 61 73 41 6c 6c 6f 63 20 3d 20 70 50 61 72 73 65  asAlloc = pParse
f310: 2d 3e 6e 41 6c 69 61 73 3b 0a 20 20 7d 0a 20 20  ->nAlias;.  }.  
f320: 61 73 73 65 72 74 28 20 69 41 6c 69 61 73 3e 30  assert( iAlias>0
f330: 20 26 26 20 69 41 6c 69 61 73 3c 3d 70 50 61 72   && iAlias<=pPar
f340: 73 65 2d 3e 6e 41 6c 69 61 73 20 29 3b 0a 20 20  se->nAlias );.  
f350: 69 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 61  iReg = pParse->a
f360: 41 6c 69 61 73 5b 69 41 6c 69 61 73 2d 31 5d 3b  Alias[iAlias-1];
f370: 0a 20 20 69 66 28 20 69 52 65 67 3d 3d 30 20 29  .  if( iReg==0 )
f380: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  {.    if( pParse
f390: 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68  ->disableColCach
f3a0: 65 20 29 7b 0a 20 20 20 20 20 20 69 52 65 67 20  e ){.      iReg 
f3b0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
f3c0: 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
f3d0: 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
f3e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f3f0: 20 69 52 65 67 20 3d 20 2b 2b 70 50 61 72 73 65   iReg = ++pParse
f400: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71  ->nMem;.      sq
f410: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
f420: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 69 52 65  arse, pExpr, iRe
f430: 67 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  g);.      pParse
f440: 2d 3e 61 41 6c 69 61 73 5b 69 41 6c 69 61 73 2d  ->aAlias[iAlias-
f450: 31 5d 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 7d  1] = iReg;.    }
f460: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52  .  }.  return iR
f470: 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  eg;.}../*.** Gen
f480: 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
f490: 74 68 65 20 63 75 72 72 65 6e 74 20 56 64 62 65  the current Vdbe
f4a0: 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
f4b0: 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73   given.** expres
f4c0: 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74 20 74  sion.  Attempt t
f4d0: 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  o store the resu
f4e0: 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  lts in register 
f4f0: 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74  "target"..** Ret
f500: 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
f510: 20 77 68 65 72 65 20 72 65 73 75 6c 74 73 20 61   where results a
f520: 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  re stored..**.**
f530: 20 57 69 74 68 20 74 68 69 73 20 72 6f 75 74 69   With this routi
f540: 6e 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ne, there is no 
f550: 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 72  guarantee that r
f560: 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62  esults will.** b
f570: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 61 72 67  e stored in targ
f580: 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20  et.  The result 
f590: 6d 69 67 68 74 20 62 65 20 73 74 6f 72 65 64 20  might be stored 
f5a0: 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  in some other.**
f5b0: 20 72 65 67 69 73 74 65 72 20 69 66 20 69 74 20   register if it 
f5c0: 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f  is convenient to
f5d0: 20 64 6f 20 73 6f 2e 20 20 54 68 65 20 63 61 6c   do so.  The cal
f5e0: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
f5f0: 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65 20   must check the 
f600: 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20  return code and 
f610: 6d 6f 76 65 20 74 68 65 20 72 65 73 75 6c 74 73  move the results
f620: 20 74 6f 20 74 68 65 20 64 65 73 69 72 65 64 0a   to the desired.
f630: 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a  ** register..*/.
f640: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
f650: 6f 64 65 54 61 72 67 65 74 28 50 61 72 73 65 20  odeTarget(Parse 
f660: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
f670: 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
f680: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
f690: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f  Parse->pVdbe;  /
f6a0: 2a 20 54 68 65 20 56 4d 20 75 6e 64 65 72 20 63  * The VM under c
f6b0: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
f6c0: 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
f6d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
f6e0: 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20 63  e opcode being c
f6f0: 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  oded */.  int in
f700: 52 65 67 20 3d 20 74 61 72 67 65 74 3b 20 20 20  Reg = target;   
f710: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 73      /* Results s
f720: 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65  tored in registe
f730: 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74  r inReg */.  int
f740: 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 20   regFree1 = 0;  
f750: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e         /* If non
f760: 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20  -zero free this 
f770: 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
f780: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46  er */.  int regF
f790: 72 65 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20  ree2 = 0;       
f7a0: 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f    /* If non-zero
f7b0: 20 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f   free this tempo
f7c0: 72 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f  rary register */
f7d0: 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72  .  int r1, r2, r
f7e0: 33 2c 20 72 34 3b 20 20 20 20 20 20 20 2f 2a 20  3, r4;       /* 
f7f0: 56 61 72 69 6f 75 73 20 72 65 67 69 73 74 65 72  Various register
f800: 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20 73 71   numbers */.  sq
f810: 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 64 62  lite3 *db;..  db
f820: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
f830: 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 7c 7c   assert( v!=0 ||
f840: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
f850: 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  d );.  assert( t
f860: 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65  arget>0 && targe
f870: 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  t<=pParse->nMem 
f880: 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
f890: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 69 66 28  return 0;..  if(
f8a0: 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20   pExpr==0 ){.   
f8b0: 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20   op = TK_NULL;. 
f8c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d   }else{.    op =
f8d0: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a   pExpr->op;.  }.
f8e0: 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
f8f0: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
f900: 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
f910: 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
f920: 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49  o = pExpr->pAggI
f930: 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63  nfo;.      struc
f940: 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
f950: 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d  Col = &pAggInfo-
f960: 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67  >aCol[pExpr->iAg
f970: 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  g];.      if( !p
f980: 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
f990: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ode ){.        a
f9a0: 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65  ssert( pCol->iMe
f9b0: 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  m>0 );.        i
f9c0: 6e 52 65 67 20 3d 20 70 43 6f 6c 2d 3e 69 4d 65  nReg = pCol->iMe
f9d0: 6d 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  m;.        break
f9e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
f9f0: 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53  ( pAggInfo->useS
fa00: 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20  ortingIdx ){.   
fa10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fa20: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
fa30: 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73  umn, pAggInfo->s
fa40: 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20 20 20 20  ortingIdx,.     
fa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa60: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
fa70: 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61  SorterColumn, ta
fa80: 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62  rget);.        b
fa90: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
faa0: 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65      /* Otherwise
fab0: 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f  , fall thru into
fac0: 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63   the TK_COLUMN c
fad0: 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ase */.    }.   
fae0: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
faf0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   {.      if( pEx
fb00: 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20 29 7b 0a  pr->iTable<0 ){.
fb10: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
fb20: 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
fb30: 6e 20 63 6f 64 69 6e 67 20 63 68 65 63 6b 20 63  n coding check c
fb40: 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
fb50: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
fb60: 61 72 73 65 2d 3e 63 6b 42 61 73 65 3e 30 20 29  arse->ckBase>0 )
fb70: 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20  ;.        inReg 
fb80: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
fb90: 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73   + pParse->ckBas
fba0: 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
fbb0: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
fbc0: 28 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  ( (pExpr->flags 
fbd0: 26 20 45 50 5f 41 6e 79 41 66 66 29 21 3d 30 20  & EP_AnyAff)!=0 
fbe0: 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  );.        inReg
fbf0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
fc00: 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72  deGetColumn(pPar
fc10: 73 65 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c  se, pExpr->pTab,
fc20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc40: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
fc50: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
fc60: 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20   target,.       
fc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc80: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
fc90: 3e 66 6c 61 67 73 20 26 20 45 50 5f 41 6e 79 41  >flags & EP_AnyA
fca0: 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ff);.      }.   
fcb0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
fcc0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
fcd0: 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64  GER: {.      cod
fce0: 65 49 6e 74 65 67 65 72 28 76 2c 20 70 45 78 70  eInteger(v, pExp
fcf0: 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 0, target);. 
fd00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
fd10: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  }.    case TK_FL
fd20: 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64  OAT: {.      cod
fd30: 65 52 65 61 6c 28 76 2c 20 28 63 68 61 72 2a 29  eReal(v, (char*)
fd40: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pExpr->token.z, 
fd50: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20  pExpr->token.n, 
fd60: 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
fd70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
fd80: 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
fd90: 47 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  G: {.      sqlit
fda0: 65 33 44 65 71 75 6f 74 65 45 78 70 72 28 64 62  e3DequoteExpr(db
fdb0: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
fdc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fdd0: 34 28 76 2c 4f 50 5f 53 74 72 69 6e 67 38 2c 20  4(v,OP_String8, 
fde0: 30 2c 20 74 61 72 67 65 74 2c 20 30 2c 0a 20 20  0, target, 0,.  
fdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe00: 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 45 78        (char*)pEx
fe10: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
fe20: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20  pr->token.n);.  
fe30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
fe40: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c  .    case TK_NUL
fe50: 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
fe60: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
fe70: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67  OP_Null, 0, targ
fe80: 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  et);.      break
fe90: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
fea0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42  SQLITE_OMIT_BLOB
feb0: 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73  _LITERAL.    cas
fec0: 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  e TK_BLOB: {.   
fed0: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
fee0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
fef0: 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62       char *zBlob
ff00: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
ff10: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3e 3d  pExpr->token.n>=
ff20: 33 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  3 );.      asser
ff30: 74 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  t( pExpr->token.
ff40: 7a 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78  z[0]=='x' || pEx
ff50: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d 3d  pr->token.z[0]==
ff60: 27 58 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73  'X' );.      ass
ff70: 65 72 74 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65  ert( pExpr->toke
ff80: 6e 2e 7a 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a  n.z[1]=='\'' );.
ff90: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
ffa0: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 70 45 78  xpr->token.z[pEx
ffb0: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2d 31 5d 3d 3d  pr->token.n-1]==
ffc0: 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 6e 20  '\'' );.      n 
ffd0: 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  = pExpr->token.n
ffe0: 20 2d 20 33 3b 0a 20 20 20 20 20 20 7a 20 3d 20   - 3;.      z = 
fff0: 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
10000 6b 65 6e 2e 7a 20 2b 20 32 3b 0a 20 20 20 20 20  ken.z + 2;.     
10010 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   zBlob = sqlite3
10020 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65  HexToBlob(sqlite
10030 33 56 64 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e  3VdbeDb(v), z, n
10040 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10050 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
10060 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67  _Blob, n/2, targ
10070 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34  et, 0, zBlob, P4
10080 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
10090 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
100a0 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b  ndif.    case TK
100b0 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20  _VARIABLE: {.   
100c0 20 20 20 69 6e 74 20 69 50 72 69 6f 72 3b 0a 20     int iPrior;. 
100d0 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70       VdbeOp *pOp
100e0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
100f0 72 2d 3e 74 6f 6b 65 6e 2e 6e 3c 3d 31 0a 20 20  r->token.n<=1.  
10100 20 20 20 20 20 20 20 26 26 20 28 69 50 72 69 6f         && (iPrio
10110 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
10120 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 29  urrentAddr(v)-1)
10130 3e 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  >=0.         && 
10140 28 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  (pOp = sqlite3Vd
10150 62 65 47 65 74 4f 70 28 76 2c 20 69 50 72 69 6f  beGetOp(v, iPrio
10160 72 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  r))->opcode==OP_
10170 56 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20 20  Variable.       
10180 20 20 26 26 20 70 4f 70 2d 3e 70 31 2b 70 4f 70    && pOp->p1+pOp
10190 2d 3e 70 33 3d 3d 70 45 78 70 72 2d 3e 69 54 61  ->p3==pExpr->iTa
101a0 62 6c 65 0a 20 20 20 20 20 20 20 20 20 26 26 20  ble.         && 
101b0 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 3d  pOp->p2+pOp->p3=
101c0 3d 74 61 72 67 65 74 0a 20 20 20 20 20 20 20 20  =target.        
101d0 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 3d 3d 30   && pOp->p4.z==0
101e0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
101f0 20 20 2f 2a 20 49 66 20 74 68 65 20 70 72 65 76    /* If the prev
10200 69 6f 75 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  ious instruction
10210 20 77 61 73 20 61 20 63 6f 70 79 20 6f 66 20 74   was a copy of t
10220 68 65 20 70 72 65 76 69 6f 75 73 20 75 6e 6e 61  he previous unna
10230 6d 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  med.        ** p
10240 61 72 61 6d 65 74 65 72 20 69 6e 74 6f 20 74 68  arameter into th
10250 65 20 70 72 65 76 69 6f 75 73 20 72 65 67 69 73  e previous regis
10260 74 65 72 2c 20 74 68 65 6e 20 73 69 6d 70 6c 79  ter, then simply
10270 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 0a 20   increment the. 
10280 20 20 20 20 20 20 20 2a 2a 20 72 65 70 65 61 74         ** repeat
10290 20 63 6f 75 6e 74 20 6f 6e 20 74 68 65 20 70 72   count on the pr
102a0 69 6f 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ior instruction 
102b0 72 61 74 68 65 72 20 74 68 61 6e 20 6d 61 6b 69  rather than maki
102c0 6e 67 20 61 20 6e 65 77 0a 20 20 20 20 20 20 20  ng a new.       
102d0 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e   ** instruction.
102e0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
102f0 20 20 20 20 70 4f 70 2d 3e 70 33 2b 2b 3b 0a 20      pOp->p3++;. 
10300 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10310 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10320 64 64 4f 70 33 28 76 2c 20 4f 50 5f 56 61 72 69  ddOp3(v, OP_Vari
10330 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 54 61  able, pExpr->iTa
10340 62 6c 65 2c 20 74 61 72 67 65 74 2c 20 31 29 3b  ble, target, 1);
10350 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78  .        if( pEx
10360 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3e 31 20 29 7b  pr->token.n>1 ){
10370 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10380 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
10390 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 45 78  , -1, (char*)pEx
103a0 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
103b0 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20  pr->token.n);.  
103c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
103d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
103e0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52   }.    case TK_R
103f0 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20  EGISTER: {.     
10400 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e   inReg = pExpr->
10410 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 62 72  iTable;.      br
10420 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
10430 61 73 65 20 54 4b 5f 41 53 3a 20 7b 0a 20 20 20  ase TK_AS: {.   
10440 20 20 20 69 6e 52 65 67 20 3d 20 63 6f 64 65 41     inReg = codeA
10450 6c 69 61 73 28 70 50 61 72 73 65 2c 20 70 45 78  lias(pParse, pEx
10460 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78 70  pr->iTable, pExp
10470 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74  r->pLeft, target
10480 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
10490 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
104a0 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20  LITE_OMIT_CAST. 
104b0 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a     case TK_CAST:
104c0 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72   {.      /* Expr
104d0 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66  essions of the f
104e0 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66  orm:   CAST(pLef
104f0 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20  t AS token) */. 
10500 20 20 20 20 20 69 6e 74 20 61 66 66 2c 20 74 6f       int aff, to
10510 5f 6f 70 3b 0a 20 20 20 20 20 20 69 6e 52 65 67  _op;.      inReg
10520 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
10530 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
10540 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74   pExpr->pLeft, t
10550 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 61 66  arget);.      af
10560 66 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e  f = sqlite3Affin
10570 69 74 79 54 79 70 65 28 26 70 45 78 70 72 2d 3e  ityType(&pExpr->
10580 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 74 6f  token);.      to
10590 5f 6f 70 20 3d 20 61 66 66 20 2d 20 53 51 4c 49  _op = aff - SQLI
105a0 54 45 5f 41 46 46 5f 54 45 58 54 20 2b 20 4f 50  TE_AFF_TEXT + OP
105b0 5f 54 6f 54 65 78 74 3b 0a 20 20 20 20 20 20 61  _ToText;.      a
105c0 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50  ssert( to_op==OP
105d0 5f 54 6f 54 65 78 74 20 20 20 20 7c 7c 20 61 66  _ToText    || af
105e0 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  f!=SQLITE_AFF_TE
105f0 58 54 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61  XT    );.      a
10600 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50  ssert( to_op==OP
10610 5f 54 6f 42 6c 6f 62 20 20 20 20 7c 7c 20 61 66  _ToBlob    || af
10620 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  f!=SQLITE_AFF_NO
10630 4e 45 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61  NE    );.      a
10640 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50  ssert( to_op==OP
10650 5f 54 6f 4e 75 6d 65 72 69 63 20 7c 7c 20 61 66  _ToNumeric || af
10660 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f!=SQLITE_AFF_NU
10670 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 20 20 61  MERIC );.      a
10680 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50  ssert( to_op==OP
10690 5f 54 6f 49 6e 74 20 20 20 20 20 7c 7c 20 61 66  _ToInt     || af
106a0 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  f!=SQLITE_AFF_IN
106b0 54 45 47 45 52 20 29 3b 0a 20 20 20 20 20 20 61  TEGER );.      a
106c0 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50  ssert( to_op==OP
106d0 5f 54 6f 52 65 61 6c 20 20 20 20 7c 7c 20 61 66  _ToReal    || af
106e0 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  f!=SQLITE_AFF_RE
106f0 41 4c 20 20 20 20 29 3b 0a 20 20 20 20 20 20 74  AL    );.      t
10700 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d  estcase( to_op==
10710 4f 50 5f 54 6f 54 65 78 74 20 29 3b 0a 20 20 20  OP_ToText );.   
10720 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f     testcase( to_
10730 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20 29 3b  op==OP_ToBlob );
10740 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
10750 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d   to_op==OP_ToNum
10760 65 72 69 63 20 29 3b 0a 20 20 20 20 20 20 74 65  eric );.      te
10770 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f  stcase( to_op==O
10780 50 5f 54 6f 49 6e 74 20 29 3b 0a 20 20 20 20 20  P_ToInt );.     
10790 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70   testcase( to_op
107a0 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 29 3b 0a 20  ==OP_ToReal );. 
107b0 20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d       if( inReg!=
107c0 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20  target ){.      
107d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
107e0 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c  Op2(v, OP_SCopy,
107f0 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b   inReg, target);
10800 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d  .        inReg =
10810 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d   target;.      }
10820 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10830 62 65 41 64 64 4f 70 31 28 76 2c 20 74 6f 5f 6f  beAddOp1(v, to_o
10840 70 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20  p, inReg);.     
10850 20 74 65 73 74 63 61 73 65 28 20 75 73 65 64 41   testcase( usedA
10860 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61  sColumnCache(pPa
10870 72 73 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65  rse, inReg, inRe
10880 67 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g) );.      sqli
10890 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
108a0 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
108b0 65 2c 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20  e, inReg, 1);.  
108c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
108d0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
108e0 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20  E_OMIT_CAST */. 
108f0 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
10900 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
10910 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
10920 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
10930 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
10940 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
10950 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
10960 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20  K_LT==OP_Lt );. 
10970 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
10980 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20  LE==OP_Le );.   
10990 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54     assert( TK_GT
109a0 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20  ==OP_Gt );.     
109b0 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d   assert( TK_GE==
109c0 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61  OP_Ge );.      a
109d0 73 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50  ssert( TK_EQ==OP
109e0 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Eq );.      ass
109f0 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e  ert( TK_NE==OP_N
10a00 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
10a10 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29  ase( op==TK_LT )
10a20 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
10a30 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20  ( op==TK_LE );. 
10a40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
10a50 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20  p==TK_GT );.    
10a60 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
10a70 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74  TK_GE );.      t
10a80 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
10a90 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  EQ );.      test
10aa0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20  case( op==TK_NE 
10ab0 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
10ac0 70 61 72 65 4f 70 65 72 61 6e 64 73 28 70 50 61  pareOperands(pPa
10ad0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
10ae0 74 2c 20 26 72 31 2c 20 26 72 65 67 46 72 65 65  t, &r1, &regFree
10af0 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
10b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b10 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67       pExpr->pRig
10b20 68 74 2c 20 26 72 32 2c 20 26 72 65 67 46 72 65  ht, &r2, &regFre
10b30 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  e2);.      codeC
10b40 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
10b50 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
10b60 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
10b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b80 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c    r1, r2, inReg,
10b90 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29   SQLITE_STOREP2)
10ba0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
10bb0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
10bc0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
10bd0 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
10be0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10bf0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
10c00 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ND:.    case TK_
10c10 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OR:.    case TK_
10c20 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  PLUS:.    case T
10c30 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65  K_STAR:.    case
10c40 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63   TK_MINUS:.    c
10c50 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20  ase TK_REM:.    
10c60 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a  case TK_BITAND:.
10c70 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f      case TK_BITO
10c80 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  R:.    case TK_S
10c90 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54  LASH:.    case T
10ca0 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61  K_LSHIFT:.    ca
10cb0 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20  se TK_RSHIFT: . 
10cc0 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41     case TK_CONCA
10cd0 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T: {.      asser
10ce0 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e  t( TK_AND==OP_An
10cf0 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d );.      asser
10d00 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20  t( TK_OR==OP_Or 
10d10 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
10d20 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64   TK_PLUS==OP_Add
10d30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
10d40 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53  ( TK_MINUS==OP_S
10d50 75 62 74 72 61 63 74 20 29 3b 0a 20 20 20 20 20  ubtract );.     
10d60 20 61 73 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d   assert( TK_REM=
10d70 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b  =OP_Remainder );
10d80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
10d90 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74  K_BITAND==OP_Bit
10da0 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73  And );.      ass
10db0 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f  ert( TK_BITOR==O
10dc0 50 5f 42 69 74 4f 72 20 29 3b 0a 20 20 20 20 20  P_BitOr );.     
10dd0 20 61 73 73 65 72 74 28 20 54 4b 5f 53 4c 41 53   assert( TK_SLAS
10de0 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b 0a  H==OP_Divide );.
10df0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
10e00 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66  _LSHIFT==OP_Shif
10e10 74 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 61  tLeft );.      a
10e20 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49 46 54  ssert( TK_RSHIFT
10e30 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68 74 20  ==OP_ShiftRight 
10e40 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
10e50 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43   TK_CONCAT==OP_C
10e60 6f 6e 63 61 74 20 29 3b 0a 20 20 20 20 20 20 74  oncat );.      t
10e70 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
10e80 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73  AND );.      tes
10e90 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52  tcase( op==TK_OR
10ea0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
10eb0 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20  se( op==TK_PLUS 
10ec0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
10ed0 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20  e( op==TK_MINUS 
10ee0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
10ef0 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b  e( op==TK_REM );
10f00 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
10f10 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44 20 29   op==TK_BITAND )
10f20 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
10f30 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29  ( op==TK_BITOR )
10f40 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
10f50 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29  ( op==TK_SLASH )
10f60 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
10f70 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20  ( op==TK_LSHIFT 
10f80 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
10f90 65 28 20 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54  e( op==TK_RSHIFT
10fa0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
10fb0 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41  se( op==TK_CONCA
10fc0 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  T );.      r1 = 
10fd0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
10fe0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
10ff0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
11000 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
11010 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
11020 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
11030 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
11040 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 73 71  Free2);.      sq
11050 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
11060 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74  v, op, r2, r1, t
11070 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 74 65  arget);.      te
11080 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
11090 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
110a0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
110b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
110c0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
110d0 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20  e TK_UMINUS: {. 
110e0 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
110f0 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
11100 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
11110 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66  Left );.      if
11120 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
11130 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20  FLOAT ){.       
11140 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 28 63 68   codeReal(v, (ch
11150 61 72 2a 29 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e  ar*)pLeft->token
11160 2e 7a 2c 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e  .z, pLeft->token
11170 2e 6e 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a  .n, 1, target);.
11180 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
11190 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  pLeft->op==TK_IN
111a0 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20  TEGER ){.       
111b0 20 63 6f 64 65 49 6e 74 65 67 65 72 28 76 2c 20   codeInteger(v, 
111c0 70 4c 65 66 74 2c 20 31 2c 20 74 61 72 67 65 74  pLeft, 1, target
111d0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
111e0 20 20 20 20 20 20 20 20 72 65 67 46 72 65 65 31          regFree1
111f0 20 3d 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47   = r1 = sqlite3G
11200 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
11210 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
11220 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11230 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
11240 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d  1);.        r2 =
11250 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
11260 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
11270 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
11280 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20 73  ree2);.        s
11290 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
112a0 28 76 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c  (v, OP_Subtract,
112b0 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29   r2, r1, target)
112c0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
112d0 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
112e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
112f0 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b   inReg = target;
11300 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11310 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
11320 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65  BITNOT:.    case
11330 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
11340 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e   assert( TK_BITN
11350 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b  OT==OP_BitNot );
11360 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
11370 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b  K_NOT==OP_Not );
11380 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
11390 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29   op==TK_BITNOT )
113a0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
113b0 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a  ( op==TK_NOT );.
113c0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
113d0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
113e0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
113f0 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
11400 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
11410 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
11420 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61        inReg = ta
11430 72 67 65 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  rget;.      sqli
11440 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11450 20 6f 70 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b   op, r1, inReg);
11460 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11470 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
11480 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
11490 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
114a0 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
114b0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
114c0 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c  ISNULL==OP_IsNul
114d0 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  l );.      asser
114e0 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f  t( TK_NOTNULL==O
114f0 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20  P_NotNull );.   
11500 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
11510 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20  =TK_ISNULL );.  
11520 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
11530 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a  ==TK_NOTNULL );.
11540 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11550 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
11560 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74  teger, 1, target
11570 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
11580 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
11590 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
115a0 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
115b0 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1);.      testca
115c0 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
115d0 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
115e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
115f0 31 28 76 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20  1(v, op, r1);.  
11600 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11610 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
11620 6d 6d 2c 20 74 61 72 67 65 74 2c 20 2d 31 29 3b  mm, target, -1);
11630 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11640 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
11650 64 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  dr);.      break
11660 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
11670 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
11680 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66  : {.      AggInf
11690 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70 72  o *pInfo = pExpr
116a0 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20  ->pAggInfo;.    
116b0 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29    if( pInfo==0 )
116c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
116d0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
116e0 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67  , "misuse of agg
116f0 72 65 67 61 74 65 3a 20 25 54 22 2c 0a 20 20 20  regate: %T",.   
11700 20 20 20 20 20 20 20 20 20 26 70 45 78 70 72 2d           &pExpr-
11710 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d 65  >span);.      }e
11720 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 52  lse{.        inR
11730 65 67 20 3d 20 70 49 6e 66 6f 2d 3e 61 46 75 6e  eg = pInfo->aFun
11740 63 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69  c[pExpr->iAgg].i
11750 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Mem;.      }.   
11760 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
11770 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53      case TK_CONS
11780 54 5f 46 55 4e 43 3a 0a 20 20 20 20 63 61 73 65  T_FUNC:.    case
11790 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a   TK_FUNCTION: {.
117a0 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
117b0 70 4c 69 73 74 20 3d 20 28 0a 20 20 20 20 20 20  pList = (.      
117c0 20 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70    ExprHasAnyProp
117d0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54  erty(pExpr, EP_T
117e0 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53 70 61 6e  okenOnly|EP_Span
117f0 4f 6e 6c 79 29 20 3f 20 30 20 3a 20 70 45 78 70  Only) ? 0 : pExp
11800 72 2d 3e 78 2e 70 4c 69 73 74 0a 20 20 20 20 20  r->x.pList.     
11810 20 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45   );.      int nE
11820 78 70 72 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c  xpr = pList ? pL
11830 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a  ist->nExpr : 0;.
11840 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
11850 44 65 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  Def;.      int n
11860 49 64 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  Id;.      const 
11870 63 68 61 72 20 2a 7a 49 64 3b 0a 20 20 20 20 20  char *zId;.     
11880 20 69 6e 74 20 63 6f 6e 73 74 4d 61 73 6b 20 3d   int constMask =
11890 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   0;.      int i;
118a0 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20  .      u8 enc = 
118b0 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 20 20 43  ENC(db);.      C
118c0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
118d0 30 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  0;..      assert
118e0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
118f0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
11900 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
11910 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
11920 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 20 29 3b 0a  K_CONST_FUNC );.
11930 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
11940 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20  op==TK_FUNCTION 
11950 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 28  );.      zId = (
11960 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b  char*)pExpr->tok
11970 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 6e 49 64 20  en.z;.      nId 
11980 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  = pExpr->token.n
11990 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73  ;.      pDef = s
119a0 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
119b0 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c  on(db, zId, nId,
119c0 20 6e 45 78 70 72 2c 20 65 6e 63 2c 20 30 29 3b   nExpr, enc, 0);
119d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
119e0 44 65 66 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Def!=0 );.      
119f0 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
11a00 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70 4c 69       nExpr = pLi
11a10 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
11a20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
11a30 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
11a40 73 65 2c 20 6e 45 78 70 72 29 3b 0a 20 20 20 20  se, nExpr);.    
11a50 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
11a60 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
11a70 73 65 2c 20 70 4c 69 73 74 2c 20 72 31 2c 20 31  se, pList, r1, 1
11a80 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
11a90 20 20 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20          nExpr = 
11aa0 72 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  r1 = 0;.      }.
11ab0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11ac0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
11ad0 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62  .      /* Possib
11ae0 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74 68 65 20  ly overload the 
11af0 66 75 6e 63 74 69 6f 6e 20 69 66 20 74 68 65 20  function if the 
11b00 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
11b10 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 76 69 72  s.      ** a vir
11b20 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d  tual table colum
11b30 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  n..      **.    
11b40 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20 66    ** For infix f
11b50 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20  unctions (LIKE, 
11b60 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20 61 6e  GLOB, REGEXP, an
11b70 64 20 4d 41 54 43 48 29 20 75 73 65 20 74 68 65  d MATCH) use the
11b80 0a 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64  .      ** second
11b90 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74   argument, not t
11ba0 68 65 20 66 69 72 73 74 2c 20 61 73 20 74 68 65  he first, as the
11bb0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 65 73   argument to tes
11bc0 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65  t to.      ** se
11bd0 65 20 69 66 20 69 74 20 69 73 20 61 20 63 6f 6c  e if it is a col
11be0 75 6d 6e 20 69 6e 20 61 20 76 69 72 74 75 61 6c  umn in a virtual
11bf0 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73   table.  This is
11c00 20 64 6f 6e 65 20 62 65 63 61 75 73 65 0a 20 20   done because.  
11c10 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 20      ** the left 
11c20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 66 69 78  operand of infix
11c30 20 66 75 6e 63 74 69 6f 6e 73 20 28 74 68 65 20   functions (the 
11c40 6f 70 65 72 61 6e 64 20 77 65 20 77 61 6e 74 20  operand we want 
11c50 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  to.      ** cont
11c60 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29  rol overloading)
11c70 20 65 6e 64 73 20 75 70 20 61 73 20 74 68 65 20   ends up as the 
11c80 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
11c90 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  to the.      ** 
11ca0 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 65  function.  The e
11cb0 78 70 72 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f  xpression "A glo
11cc0 62 20 42 22 20 69 73 20 65 71 75 69 76 61 6c 65  b B" is equivale
11cd0 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  nt to .      ** 
11ce0 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65 20  "glob(B,A).  We 
11cf0 77 61 6e 74 20 74 6f 20 75 73 65 20 74 68 65 20  want to use the 
11d00 41 20 69 6e 20 22 41 20 67 6c 6f 62 20 42 22 20  A in "A glob B" 
11d10 74 6f 20 74 65 73 74 0a 20 20 20 20 20 20 2a 2a  to test.      **
11d20 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76   for function ov
11d30 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74 20  erloading.  But 
11d40 77 65 20 75 73 65 20 74 68 65 20 42 20 74 65 72  we use the B ter
11d50 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22  m in "glob(B,A)"
11d60 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
11d70 20 69 66 28 20 6e 45 78 70 72 3e 3d 32 20 26 26   if( nExpr>=2 &&
11d80 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26   (pExpr->flags &
11d90 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 29 20 29   EP_InfixFunc) )
11da0 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d  {.        pDef =
11db0 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72   sqlite3VtabOver
11dc0 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  loadFunction(db,
11dd0 20 70 44 65 66 2c 20 6e 45 78 70 72 2c 20 70 4c   pDef, nExpr, pL
11de0 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29  ist->a[1].pExpr)
11df0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
11e00 28 20 6e 45 78 70 72 3e 30 20 29 7b 0a 20 20 20  ( nExpr>0 ){.   
11e10 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
11e20 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46  te3VtabOverloadF
11e30 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66  unction(db, pDef
11e40 2c 20 6e 45 78 70 72 2c 20 70 4c 69 73 74 2d 3e  , nExpr, pList->
11e50 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[0].pExpr);.   
11e60 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
11e70 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78    for(i=0; i<nEx
11e80 70 72 20 26 26 20 69 3c 33 32 3b 20 69 2b 2b 29  pr && i<32; i++)
11e90 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
11ea0 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
11eb0 61 6e 74 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ant(pList->a[i].
11ec0 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
11ed0 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d      constMask |=
11ee0 20 28 31 3c 3c 69 29 3b 0a 20 20 20 20 20 20 20   (1<<i);.       
11ef0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28   }.        if( (
11f00 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51  pDef->flags & SQ
11f10 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
11f20 4c 4c 29 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c  LL)!=0 && !pColl
11f30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43   ){.          pC
11f40 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
11f50 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
11f60 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
11f70 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  pr);.        }. 
11f80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
11f90 20 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53   pDef->flags & S
11fa0 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43  QLITE_FUNC_NEEDC
11fb0 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 69  OLL ){.        i
11fc0 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
11fd0 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
11fe0 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l; .        sqli
11ff0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
12000 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20   OP_CollSeq, 0, 
12010 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43  0, 0, (char *)pC
12020 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
12030 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12040 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12050 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e  4(v, OP_Function
12060 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c  , constMask, r1,
12070 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20   target,.       
12080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12090 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34   (char*)pDef, P4
120a0 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20  _FUNCDEF);.     
120b0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
120c0 67 65 50 35 28 76 2c 20 28 75 38 29 6e 45 78 70  geP5(v, (u8)nExp
120d0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 45  r);.      if( nE
120e0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  xpr ){.        s
120f0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
12100 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
12110 31 2c 20 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  1, nExpr);.     
12120 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
12130 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
12140 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
12150 72 31 2c 20 6e 45 78 70 72 29 3b 0a 20 20 20 20  r1, nExpr);.    
12160 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
12170 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12180 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
12190 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a  case TK_EXISTS:.
121a0 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
121b0 43 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  CT: {.      test
121c0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 58 49  case( op==TK_EXI
121d0 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  STS );.      tes
121e0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 45  tcase( op==TK_SE
121f0 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 69 66  LECT );.      if
12200 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
12210 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
12220 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
12230 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  ect(pParse, pExp
12240 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  r, 0, 0);.      
12250 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  }.      inReg = 
12260 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
12270 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12280 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
12290 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  N: {.      int r
122a0 4e 6f 74 46 6f 75 6e 64 20 3d 20 30 3b 0a 20 20  NotFound = 0;.  
122b0 20 20 20 20 69 6e 74 20 72 4d 61 79 48 61 76 65      int rMayHave
122c0 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  Null = 0;.      
122d0 69 6e 74 20 6a 32 2c 20 6a 33 2c 20 6a 34 2c 20  int j2, j3, j4, 
122e0 6a 35 3b 0a 20 20 20 20 20 20 63 68 61 72 20 61  j5;.      char a
122f0 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 69  ffinity;.      i
12300 6e 74 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 20  nt eType;..     
12310 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
12320 28 28 76 2c 20 22 62 65 67 69 6e 20 49 4e 20 65  ((v, "begin IN e
12330 78 70 72 20 72 25 64 22 2c 20 74 61 72 67 65 74  xpr r%d", target
12340 29 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20  ));.      eType 
12350 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49  = sqlite3FindInI
12360 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 45 78  ndex(pParse, pEx
12370 70 72 2c 20 26 72 4d 61 79 48 61 76 65 4e 75 6c  pr, &rMayHaveNul
12380 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 4d  l);.      if( rM
12390 61 79 48 61 76 65 4e 75 6c 6c 20 29 7b 0a 20 20  ayHaveNull ){.  
123a0 20 20 20 20 20 20 72 4e 6f 74 46 6f 75 6e 64 20        rNotFound 
123b0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
123c0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
123d0 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74   /* Figure out t
123e0 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 75  he affinity to u
123f0 73 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 6b  se to create a k
12400 65 79 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75  ey from the resu
12410 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  lts.      ** of 
12420 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  the expression. 
12430 61 66 66 69 6e 69 74 79 53 74 72 20 73 74 6f 72  affinityStr stor
12440 65 73 20 61 20 73 74 61 74 69 63 20 73 74 72 69  es a static stri
12450 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0a  ng suitable for.
12460 20 20 20 20 20 20 2a 2a 20 50 34 20 6f 66 20 4f        ** P4 of O
12470 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20 20  P_MakeRecord..  
12480 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 66 66      */.      aff
12490 69 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72 69 73  inity = comparis
124a0 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  onAffinity(pExpr
124b0 29 3b 0a 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f  );...      /* Co
124c0 64 65 20 74 68 65 20 3c 65 78 70 72 3e 20 66 72  de the <expr> fr
124d0 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e  om "<expr> IN (.
124e0 2e 2e 29 22 2e 20 54 68 65 20 74 65 6d 70 6f 72  ..)". The tempor
124f0 61 72 79 20 74 61 62 6c 65 0a 20 20 20 20 20 20  ary table.      
12500 2a 2a 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  ** pExpr->iTable
12510 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
12520 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75  lues that make u
12530 70 20 74 68 65 20 28 2e 2e 2e 29 20 73 65 74 2e  p the (...) set.
12540 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
12550 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43  pParse->disableC
12560 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20 20 20 20 20  olCache++;.     
12570 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
12580 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
12590 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a  pLeft, target);.
125a0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69        pParse->di
125b0 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b  sableColCache--;
125c0 0a 20 20 20 20 20 20 6a 32 20 3d 20 73 71 6c 69  .      j2 = sqli
125d0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
125e0 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 74 61 72 67   OP_IsNull, targ
125f0 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65  et);.      if( e
12600 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52  Type==IN_INDEX_R
12610 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20  OWID ){.        
12620 6a 33 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j3 = sqlite3Vdbe
12630 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73  AddOp1(v, OP_Mus
12640 74 42 65 49 6e 74 2c 20 74 61 72 67 65 74 29 3b  tBeInt, target);
12650 0a 20 20 20 20 20 20 20 20 6a 34 20 3d 20 73 71  .        j4 = sq
12660 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
12670 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c  v, OP_NotExists,
12680 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
12690 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
126a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
126b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
126c0 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  ger, 1, target);
126d0 0a 20 20 20 20 20 20 20 20 6a 35 20 3d 20 73 71  .        j5 = sq
126e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
126f0 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20  v, OP_Goto);.   
12700 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12710 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 33 29 3b  JumpHere(v, j3);
12720 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12730 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
12740 6a 34 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  j4);.        sql
12750 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12760 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
12770 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
12780 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
12790 32 20 3d 20 72 65 67 46 72 65 65 32 20 3d 20 73  2 = regFree2 = s
127a0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
127b0 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20  (pParse);..     
127c0 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 72     /* Create a r
127d0 65 63 6f 72 64 20 61 6e 64 20 74 65 73 74 20 66  ecord and test f
127e0 6f 72 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69  or set membershi
127f0 70 2e 20 49 66 20 74 68 65 20 73 65 74 20 63 6f  p. If the set co
12800 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 20 20 2a  ntains.        *
12810 2a 20 74 68 65 20 76 61 6c 75 65 2c 20 74 68 65  * the value, the
12820 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e  n jump to the en
12830 64 20 6f 66 20 74 68 65 20 74 65 73 74 20 63 6f  d of the test co
12840 64 65 2e 20 54 68 65 20 74 61 72 67 65 74 0a 20  de. The target. 
12850 20 20 20 20 20 20 20 2a 2a 20 72 65 67 69 73 74         ** regist
12860 65 72 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e  er still contain
12870 73 20 74 68 65 20 74 72 75 65 20 28 31 29 20 76  s the true (1) v
12880 61 6c 75 65 20 77 72 69 74 74 65 6e 20 74 6f 20  alue written to 
12890 69 74 20 65 61 72 6c 69 65 72 2e 0a 20 20 20 20  it earlier..    
128a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
128b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
128c0 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
128d0 64 2c 20 74 61 72 67 65 74 2c 20 31 2c 20 72 32  d, target, 1, r2
128e0 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b  , &affinity, 1);
128f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12900 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12910 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72  _Integer, 1, tar
12920 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6a 35  get);.        j5
12930 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
12940 64 4f 70 33 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  dOp3(v, OP_Found
12950 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
12960 20 30 2c 20 72 32 29 3b 0a 0a 20 20 20 20 20 20   0, r2);..      
12970 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 74 20    /* If the set 
12980 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 20  membership test 
12990 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20  fails, then the 
129a0 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 0a 20  result of the . 
129b0 20 20 20 20 20 20 20 2a 2a 20 22 78 20 49 4e 20         ** "x IN 
129c0 28 2e 2e 2e 29 22 20 65 78 70 72 65 73 73 69 6f  (...)" expressio
129d0 6e 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  n must be either
129e0 20 30 20 6f 72 20 4e 55 4c 4c 2e 20 49 66 20 74   0 or NULL. If t
129f0 68 65 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a  he set.        *
12a00 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55  * contains no NU
12a10 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68 65 6e 20  LL values, then 
12a20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 30 2e  the result is 0.
12a30 20 49 66 20 74 68 65 20 73 65 74 20 0a 20 20 20   If the set .   
12a40 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73       ** contains
12a50 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c   one or more NUL
12a60 4c 20 76 61 6c 75 65 73 2c 20 74 68 65 6e 20 74  L values, then t
12a70 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
12a80 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72  .        ** expr
12a90 65 73 73 69 6f 6e 20 69 73 20 61 6c 73 6f 20 4e  ession is also N
12aa0 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ULL..        */.
12ab0 20 20 20 20 20 20 20 20 69 66 28 20 72 4e 6f 74          if( rNot
12ac0 46 6f 75 6e 64 3d 3d 30 20 29 7b 0a 20 20 20 20  Found==0 ){.    
12ad0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
12ae0 61 6e 63 68 20 72 75 6e 73 20 69 66 20 69 74 20  anch runs if it 
12af0 69 73 20 6b 6e 6f 77 6e 20 61 74 20 63 6f 6d 70  is known at comp
12b00 69 6c 65 20 74 69 6d 65 20 28 6e 6f 77 29 20 74  ile time (now) t
12b10 68 61 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a  hat .          *
12b20 2a 20 74 68 65 20 73 65 74 20 63 6f 6e 74 61 69  * the set contai
12b30 6e 73 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65  ns no NULL value
12b40 73 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  s. This happens 
12b50 61 73 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20  as the result.  
12b60 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20          ** of a 
12b70 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74  "NOT NULL" const
12b80 72 61 69 6e 74 20 69 6e 20 74 68 65 20 64 61 74  raint in the dat
12b90 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 4e 6f  abase schema. No
12ba0 20 6e 65 65 64 0a 20 20 20 20 20 20 20 20 20 20   need.          
12bb0 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 64  ** to test the d
12bc0 61 74 61 20 73 74 72 75 63 74 75 72 65 20 61 74  ata structure at
12bd0 20 72 75 6e 74 69 6d 65 20 69 6e 20 74 68 69 73   runtime in this
12be0 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20   case..         
12bf0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
12c00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12c10 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
12c20 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
12c30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12c40 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63      /* This bloc
12c50 6b 20 70 6f 70 75 6c 61 74 65 73 20 74 68 65 20  k populates the 
12c60 72 4e 6f 74 46 6f 75 6e 64 20 72 65 67 69 73 74  rNotFound regist
12c70 65 72 20 77 69 74 68 20 65 69 74 68 65 72 20 4e  er with either N
12c80 55 4c 4c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ULL.          **
12c90 20 6f 72 20 30 20 28 61 6e 20 69 6e 74 65 67 65   or 0 (an intege
12ca0 72 20 76 61 6c 75 65 29 2e 20 49 66 20 74 68 65  r value). If the
12cb0 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
12cc0 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 0a 20 20 20  contains one.   
12cd0 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 6d 6f 72         ** or mor
12ce0 65 20 4e 55 4c 4c 73 2c 20 74 68 65 6e 20 73 65  e NULLs, then se
12cf0 74 20 72 4e 6f 74 46 6f 75 6e 64 20 74 6f 20 4e  t rNotFound to N
12d00 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ULL. Otherwise, 
12d10 73 65 74 20 69 74 0a 20 20 20 20 20 20 20 20 20  set it.         
12d20 20 2a 2a 20 74 6f 20 30 2e 20 49 66 20 72 65 67   ** to 0. If reg
12d30 69 73 74 65 72 20 72 4d 61 79 48 61 76 65 4e 75  ister rMayHaveNu
12d40 6c 6c 20 69 73 20 61 6c 72 65 61 64 79 20 73 65  ll is already se
12d50 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75 65 0a  t to some value.
12d60 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 74 68            ** oth
12d70 65 72 20 74 68 61 6e 20 4e 55 4c 4c 2c 20 74 68  er than NULL, th
12d80 65 6e 20 74 68 65 20 74 65 73 74 20 68 61 73 20  en the test has 
12d90 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 75 6e  already been run
12da0 20 61 6e 64 20 0a 20 20 20 20 20 20 20 20 20 20   and .          
12db0 2a 2a 20 72 4e 6f 74 46 6f 75 6e 64 20 69 73 20  ** rNotFound is 
12dc0 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65  already populate
12dd0 64 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  d..          */.
12de0 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63            static
12df0 20 63 6f 6e 73 74 20 63 68 61 72 20 6e 75 6c 6c   const char null
12e00 52 65 63 6f 72 64 5b 5d 20 3d 20 7b 20 30 78 30  Record[] = { 0x0
12e10 32 2c 20 30 78 30 30 20 7d 3b 0a 20 20 20 20 20  2, 0x00 };.     
12e20 20 20 20 20 20 6a 33 20 3d 20 73 71 6c 69 74 65       j3 = sqlite
12e30 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
12e40 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 4d 61 79 48  P_NotNull, rMayH
12e50 61 76 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  aveNull);.      
12e60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12e70 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
12e80 2c 20 30 2c 20 72 4e 6f 74 46 6f 75 6e 64 29 3b  , 0, rNotFound);
12e90 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
12ea0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
12eb0 4f 50 5f 42 6c 6f 62 2c 20 32 2c 20 72 4d 61 79  OP_Blob, 2, rMay
12ec0 48 61 76 65 4e 75 6c 6c 2c 20 30 2c 20 0a 20 20  HaveNull, 0, .  
12ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ee0 20 20 20 20 20 20 20 20 20 20 20 6e 75 6c 6c 52             nullR
12ef0 65 63 6f 72 64 2c 20 50 34 5f 53 54 41 54 49 43  ecord, P4_STATIC
12f00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 34 20  );.          j4 
12f10 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
12f20 4f 70 33 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Op3(v, OP_Found,
12f30 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
12f40 30 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 29  0, rMayHaveNull)
12f50 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
12f60 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12f70 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
12f80 72 4e 6f 74 46 6f 75 6e 64 29 3b 0a 20 20 20 20  rNotFound);.    
12f90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12fa0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 34 29  eJumpHere(v, j4)
12fb0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
12fc0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
12fd0 76 2c 20 6a 33 29 3b 0a 0a 20 20 20 20 20 20 20  v, j3);..       
12fe0 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 76     /* Copy the v
12ff0 61 6c 75 65 20 6f 66 20 72 65 67 69 73 74 65 72  alue of register
13000 20 72 4e 6f 74 46 6f 75 6e 64 20 28 77 68 69 63   rNotFound (whic
13010 68 20 69 73 20 65 69 74 68 65 72 20 4e 55 4c 4c  h is either NULL
13020 20 6f 72 20 30 29 0a 20 20 20 20 20 20 20 20 20   or 0).         
13030 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 74 61 72   ** into the tar
13040 67 65 74 20 72 65 67 69 73 74 65 72 2e 20 54 68  get register. Th
13050 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 72  is will be the r
13060 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 20  esult of the.   
13070 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73         ** expres
13080 73 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 20 20  sion..          
13090 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  */.          sql
130a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
130b0 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 4e 6f 74 46  , OP_Copy, rNotF
130c0 6f 75 6e 64 2c 20 74 61 72 67 65 74 29 3b 0a 20  ound, target);. 
130d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
130e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
130f0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 32  beJumpHere(v, j2
13100 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13110 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
13120 6a 35 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  j5);.      VdbeC
13130 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20  omment((v, "end 
13140 49 4e 20 65 78 70 72 20 72 25 64 22 2c 20 74 61  IN expr r%d", ta
13150 72 67 65 74 29 29 3b 0a 20 20 20 20 20 20 62 72  rget));.      br
13160 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
13170 66 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  f.    /*.    ** 
13180 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41     x BETWEEN y A
13190 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ND z.    **.    
131a0 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75 69 76  ** This is equiv
131b0 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a  alent to.    **.
131c0 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41      **    x>=y A
131d0 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20  ND x<=z.    **. 
131e0 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65     ** X is store
131f0 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66  d in pExpr->pLef
13200 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73  t..    ** Y is s
13210 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
13220 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
13230 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73  r..    ** Z is s
13240 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
13250 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
13260 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  r..    */.    ca
13270 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
13280 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
13290 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
132a0 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  t;.      struct 
132b0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
132c0 4c 49 74 65 6d 20 3d 20 70 45 78 70 72 2d 3e 78  LItem = pExpr->x
132d0 2e 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20  .pList->a;.     
132e0 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
132f0 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a  pLItem->pExpr;..
13300 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
13310 65 4f 70 65 72 61 6e 64 73 28 70 50 61 72 73 65  eOperands(pParse
13320 2c 20 70 4c 65 66 74 2c 20 26 72 31 2c 20 26 72  , pLeft, &r1, &r
13330 65 67 46 72 65 65 31 2c 0a 20 20 20 20 20 20 20  egFree1,.       
13340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13350 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68             pRigh
13360 74 2c 20 26 72 32 2c 20 26 72 65 67 46 72 65 65  t, &r2, &regFree
13370 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  2);.      testca
13380 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
13390 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
133a0 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
133b0 3b 0a 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c  ;.      r3 = sql
133c0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
133d0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72 34  Parse);.      r4
133e0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
133f0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
13400 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
13410 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
13420 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c 0a 20 20  Right, OP_Ge,.  
13430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13440 72 31 2c 20 72 32 2c 20 72 33 2c 20 53 51 4c 49  r1, r2, r3, SQLI
13450 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20  TE_STOREP2);.   
13460 20 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20     pLItem++;.   
13470 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c 49 74     pRight = pLIt
13480 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  em->pExpr;.     
13490 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
134a0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
134b0 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
134c0 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
134d0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
134e0 20 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65   pRight, &regFre
134f0 65 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e2);.      testc
13500 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
13510 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f   );.      codeCo
13520 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c  mpare(pParse, pL
13530 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f  eft, pRight, OP_
13540 4c 65 2c 20 72 31 2c 20 72 32 2c 20 72 34 2c 20  Le, r1, r2, r4, 
13550 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b  SQLITE_STOREP2);
13560 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
13570 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41  beAddOp3(v, OP_A
13580 6e 64 2c 20 72 33 2c 20 72 34 2c 20 74 61 72 67  nd, r3, r4, targ
13590 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
135a0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
135b0 28 70 50 61 72 73 65 2c 20 72 33 29 3b 0a 20 20  (pParse, r3);.  
135c0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
135d0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
135e0 2c 20 72 34 29 3b 0a 20 20 20 20 20 20 62 72 65  , r4);.      bre
135f0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
13600 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20  se TK_UPLUS: {. 
13610 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
13620 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
13630 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
13640 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29  ->pLeft, target)
13650 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
13660 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
13670 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20   ** Form A:.    
13680 2a 2a 20 20 20 43 41 53 45 20 78 20 57 48 45 4e  **   CASE x WHEN
13690 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e   e1 THEN r1 WHEN
136a0 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20   e2 THEN r2 ... 
136b0 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20  WHEN eN THEN rN 
136c0 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a  ELSE y END.    *
136d0 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a  *.    ** Form B:
136e0 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57  .    **   CASE W
136f0 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57  HEN e1 THEN r1 W
13700 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e  HEN e2 THEN r2 .
13710 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20  .. WHEN eN THEN 
13720 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20  rN ELSE y END.  
13730 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d    **.    ** Form
13740 20 41 20 69 73 20 63 61 6e 20 62 65 20 74 72 61   A is can be tra
13750 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68  nsformed into th
13760 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72  e equivalent for
13770 6d 20 42 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  m B as follows:.
13780 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48      **   CASE WH
13790 45 4e 20 78 3d 65 31 20 54 48 45 4e 20 72 31 20  EN x=e1 THEN r1 
137a0 57 48 45 4e 20 78 3d 65 32 20 54 48 45 4e 20 72  WHEN x=e2 THEN r
137b0 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20  2 ....    **    
137c0 20 20 20 20 57 48 45 4e 20 78 3d 65 4e 20 54 48      WHEN x=eN TH
137d0 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44  EN rN ELSE y END
137e0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58  .    **.    ** X
137f0 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20   (if it exists) 
13800 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65  is in pExpr->pLe
13810 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20  ft..    ** Y is 
13820 69 6e 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  in pExpr->pRight
13830 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c 73 6f  .  The Y is also
13840 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74   optional.  If t
13850 68 65 72 65 20 69 73 20 6e 6f 0a 20 20 20 20 2a  here is no.    *
13860 2a 20 45 4c 53 45 20 63 6c 61 75 73 65 20 61 6e  * ELSE clause an
13870 64 20 6e 6f 20 6f 74 68 65 72 20 74 65 72 6d 20  d no other term 
13880 6d 61 74 63 68 65 73 2c 20 74 68 65 6e 20 74 68  matches, then th
13890 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a  e result of the.
138a0 20 20 20 20 2a 2a 20 65 78 70 72 73 73 69 6f 6e      ** exprssion
138b0 20 69 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a   is NULL..    **
138c0 20 45 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d   Ei is in pExpr-
138d0 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61  >pList->a[i*2] a
138e0 6e 64 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e  nd Ri is pExpr->
138f0 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e  pList->a[i*2+1].
13900 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
13910 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
13920 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
13930 68 65 20 52 69 20 66 6f 72 20 74 68 65 20 66 69  he Ri for the fi
13940 72 73 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c  rst matching Ei,
13950 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68  .    ** or if th
13960 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69  ere is no matchi
13970 6e 67 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20  ng Ei, the ELSE 
13980 74 65 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68  term Y, or if th
13990 65 72 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f  ere is.    ** no
139a0 20 45 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c   ELSE term, NULL
139b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
139c0 65 20 54 4b 5f 43 41 53 45 3a 20 7b 0a 20 20 20  e TK_CASE: {.   
139d0 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b     int endLabel;
139e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139f0 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62       /* GOTO lab
13a00 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41  el for end of CA
13a10 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20  SE stmt */.     
13a20 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20   int nextCase;  
13a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a40 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c     /* GOTO label
13a50 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63   for next WHEN c
13a60 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69  lause */.      i
13a70 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20  nt nExpr;       
13a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a90 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66   /* 2x number of
13aa0 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20   WHEN terms */. 
13ab0 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20       int i;     
13ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ad0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
13ae0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
13af0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
13b00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13b10 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45    /* List of WHE
13b20 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  N terms */.     
13b30 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
13b40 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d  _item *aListelem
13b50 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57  ;  /* Array of W
13b60 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  HEN terms */.   
13b70 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72     Expr opCompar
13b80 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
13b90 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45       /* The X==E
13ba0 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  i expression */.
13bb0 20 20 20 20 20 20 45 78 70 72 20 63 61 63 68 65        Expr cache
13bc0 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
13bd0 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63 68 65          /* Cache
13be0 64 20 65 78 70 72 65 73 73 69 6f 6e 20 58 20 2a  d expression X *
13bf0 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58  /.      Expr *pX
13c00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13c10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
13c20 20 58 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f   X expression */
13c30 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65  .      Expr *pTe
13c40 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
13c50 20 20 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45           /* X==E
13c60 69 20 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75  i (form A) or ju
13c70 73 74 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a  st Ei (form B) *
13c80 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  /..      assert(
13c90 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
13ca0 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
13cb0 65 6c 65 63 74 29 20 26 26 20 70 45 78 70 72 2d  elect) && pExpr-
13cc0 3e 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20 20 20  >x.pList );.    
13cd0 20 20 61 73 73 65 72 74 28 28 70 45 78 70 72 2d    assert((pExpr-
13ce0 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  >x.pList->nExpr 
13cf0 25 20 32 29 20 3d 3d 20 30 29 3b 0a 20 20 20 20  % 2) == 0);.    
13d00 20 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e    assert(pExpr->
13d10 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e  x.pList->nExpr >
13d20 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73   0);.      pELis
13d30 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
13d40 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65  st;.      aListe
13d50 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b  lem = pEList->a;
13d60 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70  .      nExpr = p
13d70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
13d80 20 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73      endLabel = s
13d90 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
13da0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66  bel(v);.      if
13db0 28 20 28 70 58 20 3d 20 70 45 78 70 72 2d 3e 70  ( (pX = pExpr->p
13dc0 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  Left)!=0 ){.    
13dd0 20 20 20 20 63 61 63 68 65 58 20 3d 20 2a 70 58      cacheX = *pX
13de0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
13df0 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43  se( pX->op==TK_C
13e00 4f 4c 55 4d 4e 20 7c 7c 20 70 58 2d 3e 6f 70 3d  OLUMN || pX->op=
13e10 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a  =TK_REGISTER );.
13e20 20 20 20 20 20 20 20 20 63 61 63 68 65 58 2e 69          cacheX.i
13e30 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 45  Table = sqlite3E
13e40 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
13e50 73 65 2c 20 70 58 2c 20 26 72 65 67 46 72 65 65  se, pX, &regFree
13e60 31 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  1);.        test
13e70 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
13e80 30 20 29 3b 0a 20 20 20 20 20 20 20 20 63 61 63  0 );.        cac
13e90 68 65 58 2e 6f 70 20 3d 20 54 4b 5f 52 45 47 49  heX.op = TK_REGI
13ea0 53 54 45 52 3b 0a 20 20 20 20 20 20 20 20 6f 70  STER;.        op
13eb0 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f  Compare.op = TK_
13ec0 45 51 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f  EQ;.        opCo
13ed0 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d 20 26 63  mpare.pLeft = &c
13ee0 61 63 68 65 58 3b 0a 20 20 20 20 20 20 20 20 70  acheX;.        p
13ef0 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72  Test = &opCompar
13f00 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
13f10 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65   pParse->disable
13f20 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20 20 20 20  ColCache++;.    
13f30 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78    for(i=0; i<nEx
13f40 70 72 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20  pr; i=i+2){.    
13f50 20 20 20 20 69 66 28 20 70 58 20 29 7b 0a 20 20      if( pX ){.  
13f60 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13f70 70 54 65 73 74 21 3d 30 20 29 3b 0a 20 20 20 20  pTest!=0 );.    
13f80 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e        opCompare.
13f90 70 52 69 67 68 74 20 3d 20 61 4c 69 73 74 65 6c  pRight = aListel
13fa0 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  em[i].pExpr;.   
13fb0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13fc0 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 61 4c        pTest = aL
13fd0 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72  istelem[i].pExpr
13fe0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13ff0 20 20 20 20 6e 65 78 74 43 61 73 65 20 3d 20 73      nextCase = s
14000 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
14010 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
14020 74 65 73 74 63 61 73 65 28 20 70 54 65 73 74 2d  testcase( pTest-
14030 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op==TK_COLUMN |
14040 7c 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f  | pTest->op==TK_
14050 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 20 20  REGISTER );.    
14060 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
14070 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
14080 54 65 73 74 2c 20 6e 65 78 74 43 61 73 65 2c 20  Test, nextCase, 
14090 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
140a0 4c 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  L);.        test
140b0 63 61 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b  case( aListelem[
140c0 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d  i+1].pExpr->op==
140d0 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
140e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
140f0 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45  Listelem[i+1].pE
14100 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49  xpr->op==TK_REGI
14110 53 54 45 52 20 29 3b 0a 20 20 20 20 20 20 20 20  STER );.        
14120 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
14130 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65  pParse, aListele
14140 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61  m[i+1].pExpr, ta
14150 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73  rget);.        s
14160 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14170 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
14180 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20  endLabel);.     
14190 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
141a0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65  solveLabel(v, ne
141b0 78 74 43 61 73 65 29 3b 0a 20 20 20 20 20 20 7d  xtCase);.      }
141c0 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
141d0 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ->pRight ){.    
141e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
141f0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
14200 72 2d 3e 70 52 69 67 68 74 2c 20 74 61 72 67 65  r->pRight, targe
14210 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
14220 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14230 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14240 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74  _Null, 0, target
14250 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
14260 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
14270 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4c  lveLabel(v, endL
14280 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 61 73 73  abel);.      ass
14290 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 69 73  ert( pParse->dis
142a0 61 62 6c 65 43 6f 6c 43 61 63 68 65 3e 30 20 29  ableColCache>0 )
142b0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
142c0 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d  disableColCache-
142d0 2d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  -;.      break;.
142e0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
142f0 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
14300 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41  R.    case TK_RA
14310 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ISE: {.      if(
14320 20 21 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74   !pParse->trigSt
14330 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ack ){.        s
14340 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
14350 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
14360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52                "R
14370 41 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20  AISE() may only 
14380 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 61  be used within a
14390 20 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d   trigger-program
143a0 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
143b0 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
143c0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61      if( pExpr->a
143d0 66 66 69 6e 69 74 79 21 3d 4f 45 5f 49 67 6e 6f  ffinity!=OE_Igno
143e0 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 61  re ){.         a
143f0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 61 66  ssert( pExpr->af
14400 66 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62  finity==OE_Rollb
14410 61 63 6b 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ack ||.         
14420 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61          pExpr->a
14430 66 66 69 6e 69 74 79 20 3d 3d 20 4f 45 5f 41 62  ffinity == OE_Ab
14440 6f 72 74 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ort ||.         
14450 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61          pExpr->a
14460 66 66 69 6e 69 74 79 20 3d 3d 20 4f 45 5f 46 61  ffinity == OE_Fa
14470 69 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 73  il );.         s
14480 71 6c 69 74 65 33 44 65 71 75 6f 74 65 45 78 70  qlite3DequoteExp
14490 72 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20  r(db, pExpr);.  
144a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
144b0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48  beAddOp4(v, OP_H
144c0 61 6c 74 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53  alt, SQLITE_CONS
144d0 54 52 41 49 4e 54 2c 20 70 45 78 70 72 2d 3e 61  TRAINT, pExpr->a
144e0 66 66 69 6e 69 74 79 2c 20 30 2c 0a 20 20 20 20  ffinity, 0,.    
144f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14500 20 20 20 20 28 63 68 61 72 2a 29 70 45 78 70 72      (char*)pExpr
14510 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72  ->token.z, pExpr
14520 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20  ->token.n);.    
14530 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
14540 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
14550 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 3d 20 4f  r->affinity == O
14560 45 5f 49 67 6e 6f 72 65 20 29 3b 0a 20 20 20 20  E_Ignore );.    
14570 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14580 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 6e  AddOp2(v, OP_Con
14590 74 65 78 74 50 6f 70 2c 20 30 2c 20 30 29 3b 0a  textPop, 0, 0);.
145a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
145b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
145c0 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73 65  _Goto, 0, pParse
145d0 2d 3e 74 72 69 67 53 74 61 63 6b 2d 3e 69 67 6e  ->trigStack->ign
145e0 6f 72 65 4a 75 6d 70 29 3b 0a 20 20 20 20 20 20  oreJump);.      
145f0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
14600 76 2c 20 22 72 61 69 73 65 28 49 47 4e 4f 52 45  v, "raise(IGNORE
14610 29 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  )"));.      }.  
14620 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
14630 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71  .#endif.  }.  sq
14640 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
14650 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
14660 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
14670 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
14680 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
14690 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67  ;.  return inReg
146a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
146b0 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c  ate code to eval
146c0 75 61 74 65 20 61 6e 20 65 78 70 72 65 73 73 69  uate an expressi
146d0 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  on and store the
146e0 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f   results.** into
146f0 20 61 20 72 65 67 69 73 74 65 72 2e 20 20 52 65   a register.  Re
14700 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65  turn the registe
14710 72 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74  r number where t
14720 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72  he results.** ar
14730 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  e stored..**.** 
14740 49 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20  If the register 
14750 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72  is a temporary r
14760 65 67 69 73 74 65 72 20 74 68 61 74 20 63 61 6e  egister that can
14770 20 62 65 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c   be deallocated,
14780 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 69  .** then write i
14790 74 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a  ts number into *
147a0 70 52 65 67 2e 20 20 49 66 20 74 68 65 20 72 65  pReg.  If the re
147b0 73 75 6c 74 20 72 65 67 69 73 74 65 72 20 69 73  sult register is
147c0 20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f 72   not.** a tempor
147d0 61 72 79 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  ary, then set *p
147e0 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a  Reg to zero..*/.
147f0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
14800 6f 64 65 54 65 6d 70 28 50 61 72 73 65 20 2a 70  odeTemp(Parse *p
14810 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
14820 70 72 2c 20 69 6e 74 20 2a 70 52 65 67 29 7b 0a  pr, int *pReg){.
14830 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
14840 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
14850 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 32 20 3d  rse);.  int r2 =
14860 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
14870 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
14880 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 69 66 28  Expr, r1);.  if(
14890 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20 20 2a   r2==r1 ){.    *
148a0 70 52 65 67 20 3d 20 72 31 3b 0a 20 20 7d 65 6c  pReg = r1;.  }el
148b0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  se{.    sqlite3R
148c0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
148d0 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 2a  arse, r1);.    *
148e0 70 52 65 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  pReg = 0;.  }.  
148f0 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a  return r2;.}../*
14900 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
14910 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c  e that will eval
14920 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20  uate expression 
14930 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20  pExpr and store 
14940 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69  the.** results i
14950 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
14960 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73 20  t.  The results 
14970 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74  are guaranteed t
14980 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72  o appear.** in r
14990 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a  egister target..
149a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
149b0 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50  prCode(Parse *pP
149c0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
149d0 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
149e0 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20    int inReg;..  
149f0 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30  assert( target>0
14a00 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72   && target<=pPar
14a10 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 6e  se->nMem );.  in
14a20 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
14a30 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
14a40 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
14a50 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  t);.  assert( pP
14a60 61 72 73 65 2d 3e 70 56 64 62 65 20 7c 7c 20 70  arse->pVdbe || p
14a70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
14a80 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
14a90 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 26   inReg!=target &
14aa0 26 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20  & pParse->pVdbe 
14ab0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
14ac0 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d  beAddOp2(pParse-
14ad0 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79  >pVdbe, OP_SCopy
14ae0 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29  , inReg, target)
14af0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 74  ;.  }.  return t
14b00 61 72 67 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  arget;.}../*.** 
14b10 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
14b20 61 74 20 65 76 61 6c 75 74 65 73 20 74 68 65 20  at evalutes the 
14b30 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
14b40 20 61 6e 64 20 70 75 74 73 20 74 68 65 20 72 65   and puts the re
14b50 73 75 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73  sult.** in regis
14b60 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a  ter target..**.*
14b70 2a 20 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f  * Also make a co
14b80 70 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  py of the expres
14b90 73 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 74  sion results int
14ba0 6f 20 61 6e 6f 74 68 65 72 20 22 63 61 63 68 65  o another "cache
14bb0 22 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e  " register.** an
14bc0 64 20 6d 6f 64 69 66 79 20 74 68 65 20 65 78 70  d modify the exp
14bd0 72 65 73 73 69 6f 6e 20 73 6f 20 74 68 61 74 20  ression so that 
14be0 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 69 74  the next time it
14bf0 20 69 73 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a   is evaluated,.*
14c00 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  * the result is 
14c10 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61  a copy of the ca
14c20 63 68 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a  che register..**
14c30 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
14c40 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 78 70   is used for exp
14c50 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72  ressions that ar
14c60 65 20 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20  e used multiple 
14c70 0a 2a 2a 20 74 69 6d 65 73 2e 20 20 54 68 65 79  .** times.  They
14c80 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 6f   are evaluated o
14c90 6e 63 65 20 61 6e 64 20 74 68 65 20 72 65 73 75  nce and the resu
14ca0 6c 74 73 20 6f 66 20 74 68 65 20 65 78 70 72 65  lts of the expre
14cb0 73 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75  ssion.** are reu
14cc0 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sed..*/.int sqli
14cd0 74 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61  te3ExprCodeAndCa
14ce0 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  che(Parse *pPars
14cf0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
14d00 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56  int target){.  V
14d10 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
14d20 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 6e  >pVdbe;.  int in
14d30 52 65 67 3b 0a 20 20 69 6e 52 65 67 20 3d 20 73  Reg;.  inReg = s
14d40 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
14d50 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
14d60 72 67 65 74 29 3b 0a 20 20 61 73 73 65 72 74 28  rget);.  assert(
14d70 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 69   target>0 );.  i
14d80 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
14d90 5f 52 45 47 49 53 54 45 52 20 29 7b 20 20 0a 20  _REGISTER ){  . 
14da0 20 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 20 20 20     int iMem;.   
14db0 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65   iMem = ++pParse
14dc0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
14dd0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14de0 20 4f 50 5f 43 6f 70 79 2c 20 69 6e 52 65 67 2c   OP_Copy, inReg,
14df0 20 69 4d 65 6d 29 3b 0a 20 20 20 20 70 45 78 70   iMem);.    pExp
14e00 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69 4d 65 6d  r->iTable = iMem
14e10 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20  ;.    pExpr->op 
14e20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20  = TK_REGISTER;. 
14e30 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65   }.  return inRe
14e40 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  g;.}../*.** Retu
14e50 72 6e 20 54 52 55 45 20 69 66 20 70 45 78 70 72  rn TRUE if pExpr
14e60 20 69 73 20 61 6e 20 63 6f 6e 73 74 61 6e 74 20   is an constant 
14e70 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
14e80 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a  is appropriate.*
14e90 2a 20 66 6f 72 20 66 61 63 74 6f 72 69 6e 67 20  * for factoring 
14ea0 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 20 20  out of a loop.  
14eb0 41 70 70 72 6f 70 72 69 61 74 65 20 65 78 70 72  Appropriate expr
14ec0 65 73 73 69 6f 6e 73 20 61 72 65 3a 0a 2a 2a 0a  essions are:.**.
14ed0 2a 2a 20 20 20 20 2a 20 20 41 6e 79 20 65 78 70  **    *  Any exp
14ee0 72 65 73 73 69 6f 6e 20 74 68 61 74 20 65 76 61  ression that eva
14ef0 6c 75 61 74 65 73 20 74 6f 20 74 77 6f 20 6f 72  luates to two or
14f00 20 6d 6f 72 65 20 6f 70 63 6f 64 65 73 2e 0a 2a   more opcodes..*
14f10 2a 0a 2a 2a 20 20 20 20 2a 20 20 41 6e 79 20 4f  *.**    *  Any O
14f20 50 5f 49 6e 74 65 67 65 72 2c 20 4f 50 5f 52 65  P_Integer, OP_Re
14f30 61 6c 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 4f  al, OP_String, O
14f40 50 5f 42 6c 6f 62 2c 20 4f 50 5f 4e 75 6c 6c 2c  P_Blob, OP_Null,
14f50 20 0a 2a 2a 20 20 20 20 20 20 20 6f 72 20 4f 50   .**       or OP
14f60 5f 56 61 72 69 61 62 6c 65 20 74 68 61 74 20 64  _Variable that d
14f70 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
14f80 62 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 0a  be placed in a .
14f90 2a 2a 20 20 20 20 20 20 20 73 70 65 63 69 66 69  **       specifi
14fa0 63 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a  c register..**.*
14fb0 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 70 6f  * There is no po
14fc0 69 6e 74 20 69 6e 20 66 61 63 74 6f 72 69 6e 67  int in factoring
14fd0 20 6f 75 74 20 73 69 6e 67 6c 65 2d 69 6e 73 74   out single-inst
14fe0 72 75 63 74 69 6f 6e 20 63 6f 6e 73 74 61 6e 74  ruction constant
14ff0 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
15000 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
15010 70 6c 61 63 65 64 20 69 6e 20 61 20 70 61 72 74  placed in a part
15020 69 63 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e  icular register.
15030 20 20 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 66    .** We could f
15040 61 63 74 6f 72 20 74 68 65 6d 20 6f 75 74 2c 20  actor them out, 
15050 62 75 74 20 74 68 65 6e 20 77 65 20 77 6f 75 6c  but then we woul
15060 64 20 65 6e 64 20 75 70 20 61 64 64 69 6e 67 20  d end up adding 
15070 61 6e 0a 2a 2a 20 4f 50 5f 53 43 6f 70 79 20 69  an.** OP_SCopy i
15080 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 6d 6f  nstruction to mo
15090 76 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 74  ve the value int
150a0 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 65  o the correct re
150b0 67 69 73 74 65 72 0a 2a 2a 20 6c 61 74 65 72 2e  gister.** later.
150c0 20 20 57 65 20 6d 69 67 68 74 20 61 73 20 77 65    We might as we
150d0 6c 6c 20 6a 75 73 74 20 75 73 65 20 74 68 65 20  ll just use the 
150e0 6f 72 69 67 69 6e 61 6c 20 69 6e 73 74 72 75 63  original instruc
150f0 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 61 76 6f 69  tion and.** avoi
15100 64 20 74 68 65 20 4f 50 5f 53 43 6f 70 79 2e 0a  d the OP_SCopy..
15110 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
15120 41 70 70 72 6f 70 72 69 61 74 65 46 6f 72 46 61  AppropriateForFa
15130 63 74 6f 72 69 6e 67 28 45 78 70 72 20 2a 70 29  ctoring(Expr *p)
15140 7b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  {.  if( !sqlite3
15150 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
15160 74 4a 6f 69 6e 28 70 29 20 29 7b 0a 20 20 20 20  tJoin(p) ){.    
15170 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4f 6e  return 0;  /* On
15180 6c 79 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72  ly constant expr
15190 65 73 73 69 6f 6e 73 20 61 72 65 20 61 70 70 72  essions are appr
151a0 6f 70 72 69 61 74 65 20 66 6f 72 20 66 61 63 74  opriate for fact
151b0 6f 72 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69  oring */.  }.  i
151c0 66 28 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45  f( (p->flags & E
151d0 50 5f 46 69 78 65 64 44 65 73 74 29 3d 3d 30 20  P_FixedDest)==0 
151e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
151f0 20 20 2f 2a 20 41 6e 79 20 63 6f 6e 73 74 61 6e    /* Any constan
15200 74 20 77 69 74 68 6f 75 74 20 61 20 66 69 78 65  t without a fixe
15210 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73  d destination is
15220 20 61 70 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a   appropriate */.
15230 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e    }.  while( p->
15240 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 29 20 70  op==TK_UPLUS ) p
15250 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 73   = p->pLeft;.  s
15260 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
15270 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15280 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c  MIT_BLOB_LITERAL
15290 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
152a0 42 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61  B:.#endif.    ca
152b0 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a  se TK_VARIABLE:.
152c0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
152d0 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  GER:.    case TK
152e0 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65  _FLOAT:.    case
152f0 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20 63 61   TK_NULL:.    ca
15300 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a  se TK_STRING: {.
15310 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15320 70 2d 3e 6f 70 3d 3d 54 4b 5f 42 4c 4f 42 20 29  p->op==TK_BLOB )
15330 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
15340 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49  ( p->op==TK_VARI
15350 41 42 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65  ABLE );.      te
15360 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
15370 4b 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20  K_INTEGER );.   
15380 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
15390 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 3b 0a  op==TK_FLOAT );.
153a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
153b0 70 2d 3e 6f 70 3d 3d 54 4b 5f 4e 55 4c 4c 20 29  p->op==TK_NULL )
153c0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
153d0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49  ( p->op==TK_STRI
153e0 4e 47 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 53  NG );.      /* S
153f0 69 6e 67 6c 65 2d 69 6e 73 74 72 75 63 74 69 6f  ingle-instructio
15400 6e 20 63 6f 6e 73 74 61 6e 74 73 20 77 69 74 68  n constants with
15410 20 61 20 66 69 78 65 64 20 64 65 73 74 69 6e 61   a fixed destina
15420 74 69 6f 6e 20 61 72 65 0a 20 20 20 20 20 20 2a  tion are.      *
15430 2a 20 62 65 74 74 65 72 20 64 6f 6e 65 20 69 6e  * better done in
15440 2d 6c 69 6e 65 2e 20 20 49 66 20 77 65 20 66 61  -line.  If we fa
15450 63 74 6f 72 20 74 68 65 6d 2c 20 74 68 65 79 20  ctor them, they 
15460 77 69 6c 6c 20 6a 75 73 74 20 65 6e 64 0a 20 20  will just end.  
15470 20 20 20 20 2a 2a 20 75 70 20 67 65 6e 65 72 61      ** up genera
15480 74 69 6e 67 20 61 6e 20 4f 50 5f 53 43 6f 70 79  ting an OP_SCopy
15490 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 76 61 6c   to move the val
154a0 75 65 20 74 6f 20 74 68 65 20 64 65 73 74 69 6e  ue to the destin
154b0 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72  ation.      ** r
154c0 65 67 69 73 74 65 72 2e 20 2a 2f 0a 20 20 20 20  egister. */.    
154d0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
154e0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d  }.    case TK_UM
154f0 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 20 69  INUS: {.       i
15500 66 28 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  f( p->pLeft->op=
15510 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70 2d 3e  =TK_FLOAT || p->
15520 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  pLeft->op==TK_IN
15530 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20  TEGER ){.       
15540 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
15550 20 20 20 7d 0a 20 20 20 20 20 20 20 62 72 65 61     }.       brea
15560 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
15570 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 62 72  ault: {.      br
15580 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
15590 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
155a0 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20  .** If pExpr is 
155b0 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65  a constant expre
155c0 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 61 70  ssion that is ap
155d0 70 72 6f 70 72 69 61 74 65 20 66 6f 72 0a 2a 2a  propriate for.**
155e0 20 66 61 63 74 6f 72 69 6e 67 20 6f 75 74 20 6f   factoring out o
155f0 66 20 61 20 6c 6f 6f 70 2c 20 74 68 65 6e 20 65  f a loop, then e
15600 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72  valuate the expr
15610 65 73 73 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 61  ession.** into a
15620 20 72 65 67 69 73 74 65 72 20 61 6e 64 20 63 6f   register and co
15630 6e 76 65 72 74 20 74 68 65 20 65 78 70 72 65 73  nvert the expres
15640 73 69 6f 6e 20 69 6e 74 6f 20 61 20 54 4b 5f 52  sion into a TK_R
15650 45 47 49 53 54 45 52 0a 2a 2a 20 65 78 70 72 65  EGISTER.** expre
15660 73 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssion..*/.static
15670 20 69 6e 74 20 65 76 61 6c 43 6f 6e 73 74 45 78   int evalConstEx
15680 70 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  pr(Walker *pWalk
15690 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
156a0 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
156b0 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
156c0 72 73 65 3b 0a 20 20 73 77 69 74 63 68 28 20 70  rse;.  switch( p
156d0 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
156e0 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52  case TK_REGISTER
156f0 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
15700 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   1;.    }.    ca
15710 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a  se TK_FUNCTION:.
15720 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
15730 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61  FUNCTION:.    ca
15740 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43  se TK_CONST_FUNC
15750 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
15760 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 20   arguments to a 
15770 66 75 6e 63 74 69 6f 6e 20 68 61 76 65 20 61 20  function have a 
15780 66 69 78 65 64 20 64 65 73 74 69 6e 61 74 69 6f  fixed destinatio
15790 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 4d 61 72 6b  n..      ** Mark
157a0 20 74 68 65 6d 20 74 68 69 73 20 77 61 79 20 74   them this way t
157b0 6f 20 61 76 6f 69 64 20 67 65 6e 65 72 61 74 65  o avoid generate
157c0 64 20 75 6e 6e 65 65 64 65 64 20 4f 50 5f 53 43  d unneeded OP_SC
157d0 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20 69 6e 73  opy.      ** ins
157e0 74 72 75 63 74 69 6f 6e 73 2e 20 0a 20 20 20 20  tructions. .    
157f0 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c    */.      ExprL
15800 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
15810 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
15820 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
15830 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
15840 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
15850 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
15860 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ist ){.        i
15870 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  nt i = pList->nE
15880 78 70 72 3b 0a 20 20 20 20 20 20 20 20 73 74 72  xpr;.        str
15890 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
158a0 6d 20 2a 70 49 74 65 6d 20 3d 20 70 4c 69 73 74  m *pItem = pList
158b0 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ->a;.        for
158c0 28 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74  (; i>0; i--, pIt
158d0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  em++){.         
158e0 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 45 78 70   if( pItem->pExp
158f0 72 20 29 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  r ) pItem->pExpr
15900 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 46 69  ->flags |= EP_Fi
15910 78 65 64 44 65 73 74 3b 0a 20 20 20 20 20 20 20  xedDest;.       
15920 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
15930 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
15940 7d 0a 20 20 69 66 28 20 69 73 41 70 70 72 6f 70  }.  if( isApprop
15950 72 69 61 74 65 46 6f 72 46 61 63 74 6f 72 69 6e  riateForFactorin
15960 67 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  g(pExpr) ){.    
15970 69 6e 74 20 72 31 20 3d 20 2b 2b 70 50 61 72 73  int r1 = ++pPars
15980 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 74  e->nMem;.    int
15990 20 72 32 3b 0a 20 20 20 20 72 32 20 3d 20 73 71   r2;.    r2 = sq
159a0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
159b0 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
159c0 72 2c 20 72 31 29 3b 0a 20 20 20 20 69 66 28 20  r, r1);.    if( 
159d0 72 31 21 3d 72 32 20 29 20 73 71 6c 69 74 65 33  r1!=r2 ) sqlite3
159e0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
159f0 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
15a00 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52  pExpr->op = TK_R
15a10 45 47 49 53 54 45 52 3b 0a 20 20 20 20 70 45 78  EGISTER;.    pEx
15a20 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 72 32 3b  pr->iTable = r2;
15a30 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
15a40 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 72 65 74  Prune;.  }.  ret
15a50 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
15a60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 65 76  ;.}../*.** Preev
15a70 61 6c 75 61 74 65 20 63 6f 6e 73 74 61 6e 74 20  aluate constant 
15a80 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77  subexpressions w
15a90 69 74 68 69 6e 20 70 45 78 70 72 20 61 6e 64 20  ithin pExpr and 
15aa0 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73  store the.** res
15ab0 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72  ults in register
15ac0 73 2e 20 20 4d 6f 64 69 66 79 20 70 45 78 70 72  s.  Modify pExpr
15ad0 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6e   so that the con
15ae0 73 74 61 6e 74 20 73 75 62 65 78 70 72 65 73 69  stant subexpresi
15af0 6f 6e 73 0a 2a 2a 20 61 72 65 20 54 4b 5f 52 45  ons.** are TK_RE
15b00 47 49 53 54 45 52 20 6f 70 63 6f 64 65 73 20 74  GISTER opcodes t
15b10 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65  hat refer to the
15b20 20 70 72 65 63 6f 6d 70 75 74 65 64 20 76 61 6c   precomputed val
15b30 75 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ues..*/.void sql
15b40 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 6e 73  ite3ExprCodeCons
15b50 74 61 6e 74 73 28 50 61 72 73 65 20 2a 70 50 61  tants(Parse *pPa
15b60 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
15b70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
15b80 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
15b90 20 3d 20 65 76 61 6c 43 6f 6e 73 74 45 78 70 72   = evalConstExpr
15ba0 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
15bb0 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e 70  lback = 0;.  w.p
15bc0 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
15bd0 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
15be0 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a  r(&w, pExpr);.}.
15bf0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
15c00 20 63 6f 64 65 20 74 68 61 74 20 70 75 73 68 65   code that pushe
15c10 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65  s the value of e
15c20 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20  very element of 
15c30 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70  the given.** exp
15c40 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e 74  ression list int
15c50 6f 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  o a sequence of 
15c60 72 65 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e  registers beginn
15c70 69 6e 67 20 61 74 20 74 61 72 67 65 74 2e 0a 2a  ing at target..*
15c80 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
15c90 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
15ca0 74 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2f  ts evaluated..*/
15cb0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
15cc0 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20  CodeExprList(.  
15cd0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
15ce0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
15cf0 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
15d00 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a  ist *pList,   /*
15d10 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
15d20 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64  list to be coded
15d30 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67 65 74   */.  int target
15d40 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72  ,        /* Wher
15d50 65 20 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c  e to write resul
15d60 74 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 48 61  ts */.  int doHa
15d70 72 64 43 6f 70 79 20 20 20 20 20 2f 2a 20 4d 61  rdCopy     /* Ma
15d80 6b 65 20 61 20 68 61 72 64 20 63 6f 70 79 20 6f  ke a hard copy o
15d90 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20  f every element 
15da0 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45  */.){.  struct E
15db0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
15dc0 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b  tem;.  int i, n;
15dd0 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
15de0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
15df0 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 6e   target>0 );.  n
15e00 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
15e10 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69  .  for(pItem=pLi
15e20 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b  st->a, i=0; i<n;
15e30 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
15e40 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69      if( pItem->i
15e50 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 69  Alias ){.      i
15e60 6e 74 20 69 52 65 67 20 3d 20 63 6f 64 65 41 6c  nt iReg = codeAl
15e70 69 61 73 28 70 50 61 72 73 65 2c 20 70 49 74 65  ias(pParse, pIte
15e80 6d 2d 3e 69 41 6c 69 61 73 2c 20 70 49 74 65 6d  m->iAlias, pItem
15e90 2d 3e 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b  ->pExpr, target+
15ea0 69 29 3b 0a 20 20 20 20 20 20 56 64 62 65 20 2a  i);.      Vdbe *
15eb0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
15ec0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
15ed0 20 20 69 66 28 20 69 52 65 67 21 3d 74 61 72 67    if( iReg!=targ
15ee0 65 74 2b 69 20 29 7b 0a 20 20 20 20 20 20 20 20  et+i ){.        
15ef0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15f00 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69  2(v, OP_SCopy, i
15f10 52 65 67 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a  Reg, target+i);.
15f20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
15f30 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
15f40 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
15f50 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 74   pItem->pExpr, t
15f60 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 7d 0a  arget+i);.    }.
15f70 20 20 20 20 69 66 28 20 64 6f 48 61 72 64 43 6f      if( doHardCo
15f80 70 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  py ){.      sqli
15f90 74 65 33 45 78 70 72 48 61 72 64 43 6f 70 79 28  te3ExprHardCopy(
15fa0 70 50 61 72 73 65 2c 20 74 61 72 67 65 74 2c 20  pParse, target, 
15fb0 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  n);.    }.  }.  
15fc0 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
15fd0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
15fe0 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65   for a boolean e
15ff0 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74  xpression such t
16000 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  hat a jump is ma
16010 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62  de.** to the lab
16020 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65  el "dest" if the
16030 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
16040 72 75 65 20 62 75 74 20 65 78 65 63 75 74 69 6f  rue but executio
16050 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73  n.** continues s
16060 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20  traight thru if 
16070 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
16080 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  s false..**.** I
16090 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
160a0 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
160b0 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65  LL (neither true
160c0 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65   nor false), the
160d0 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75  n.** take the ju
160e0 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66  mp if the jumpIf
160f0 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 53 51 4c  Null flag is SQL
16100 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a  ITE_JUMPIFNULL..
16110 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20  **.** This code 
16120 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66  depends on the f
16130 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69 6e  act that certain
16140 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65   token values (e
16150 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65  x: TK_EQ).** are
16160 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63   the same as opc
16170 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ode values (ex: 
16180 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c  OP_Eq) that impl
16190 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73  ement the corres
161a0 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61  ponding.** opera
161b0 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63  tion.  Special c
161c0 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e  omments in vdbe.
161d0 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f  c and the mkopco
161e0 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69  deh.awk script i
161f0 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72  n.** the make pr
16200 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65 73  ocess cause thes
16210 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67  e values to alig
16220 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69 6e  n.  Assert()s in
16230 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c   the code.** bel
16240 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20 74  ow verify that t
16250 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61  he numbers are a
16260 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79  ligned correctly
16270 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
16280 33 45 78 70 72 49 66 54 72 75 65 28 50 61 72 73  3ExprIfTrue(Pars
16290 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
162a0 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
162b0 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
162c0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
162d0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
162e0 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e  int op = 0;.  in
162f0 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a  t regFree1 = 0;.
16300 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d    int regFree2 =
16310 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32   0;.  int r1, r2
16320 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d  ;..  assert( jum
16330 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
16340 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75  JUMPIFNULL || ju
16350 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
16360 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78   if( v==0 || pEx
16370 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
16380 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70    op = pExpr->op
16390 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
163a0 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  {.    case TK_AN
163b0 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  D: {.      int d
163c0 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  2 = sqlite3VdbeM
163d0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
163e0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
163f0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
16400 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50      testcase( pP
16410 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c  arse->disableCol
16420 43 61 63 68 65 3d 3d 30 20 29 3b 0a 20 20 20 20  Cache==0 );.    
16430 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
16440 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
16450 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75  pr->pLeft, d2,ju
16460 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f  mpIfNull^SQLITE_
16470 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
16480 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62     pParse->disab
16490 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20 20  leColCache++;.  
164a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
164b0 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
164c0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
164d0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
164e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
164f0 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c  arse->disableCol
16500 43 61 63 68 65 3e 30 20 29 3b 0a 20 20 20 20 20  Cache>0 );.     
16510 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65   pParse->disable
16520 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20 20 20  ColCache--;.    
16530 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
16540 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29  olveLabel(v, d2)
16550 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
16560 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
16570 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  _OR: {.      tes
16580 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
16590 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  l==0 );.      te
165a0 73 74 63 61 73 65 28 20 70 50 61 72 73 65 2d 3e  stcase( pParse->
165b0 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3d  disableColCache=
165c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
165d0 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
165e0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
165f0 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
16600 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 70 50 61  Null);.      pPa
16610 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43  rse->disableColC
16620 61 63 68 65 2b 2b 3b 0a 20 20 20 20 20 20 73 71  ache++;.      sq
16630 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
16640 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
16650 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
16660 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
16670 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
16680 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3e  disableColCache>
16690 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  0 );.      pPars
166a0 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63  e->disableColCac
166b0 68 65 2d 2d 3b 0a 20 20 20 20 20 20 62 72 65 61  he--;.      brea
166c0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
166d0 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
166e0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
166f0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
16700 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
16710 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
16720 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
16730 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
16740 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16750 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  }.    case TK_LT
16760 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
16770 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
16780 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
16790 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
167a0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
167b0 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
167c0 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29  ( TK_LT==OP_Lt )
167d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
167e0 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a  TK_LE==OP_Le );.
167f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
16800 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20  _GT==OP_Gt );.  
16810 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
16820 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20  E==OP_Ge );.    
16830 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d    assert( TK_EQ=
16840 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20  =OP_Eq );.      
16850 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f  assert( TK_NE==O
16860 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 74 65  P_Ne );.      te
16870 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c  stcase( op==TK_L
16880 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
16890 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29  ase( op==TK_LE )
168a0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
168b0 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20  ( op==TK_GT );. 
168c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
168d0 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20  p==TK_GE );.    
168e0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
168f0 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 74  TK_EQ );.      t
16900 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
16910 4e 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  NE );.      test
16920 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
16930 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 64  ==0 );.      cod
16940 65 43 6f 6d 70 61 72 65 4f 70 65 72 61 6e 64 73  eCompareOperands
16950 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
16960 70 4c 65 66 74 2c 20 26 72 31 2c 20 26 72 65 67  pLeft, &r1, &reg
16970 46 72 65 65 31 2c 0a 20 20 20 20 20 20 20 20 20  Free1,.         
16980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16990 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
169a0 70 52 69 67 68 74 2c 20 26 72 32 2c 20 26 72 65  pRight, &r2, &re
169b0 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63  gFree2);.      c
169c0 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
169d0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
169e0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
169f0 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
16a00 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65        r1, r2, de
16a10 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
16a20 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
16a30 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
16a40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16a50 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
16a60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16a70 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
16a80 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
16a90 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
16aa0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53     assert( TK_IS
16ab0 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  NULL==OP_IsNull 
16ac0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
16ad0 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f   TK_NOTNULL==OP_
16ae0 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20  NotNull );.     
16af0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
16b00 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  K_ISNULL );.    
16b10 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
16b20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20  TK_NOTNULL );.  
16b30 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
16b40 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
16b50 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
16b60 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
16b70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16b80 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31  AddOp2(v, op, r1
16b90 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74  , dest);.      t
16ba0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
16bb0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  1==0 );.      br
16bc0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
16bd0 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
16be0 7b 0a 20 20 20 20 20 20 2f 2a 20 20 20 20 78 20  {.      /*    x 
16bf0 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a  BETWEEN y AND z.
16c00 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
16c10 2a 20 49 73 20 65 71 75 69 76 61 6c 65 6e 74 20  * Is equivalent 
16c20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  to .      **.   
16c30 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e     **    x>=y AN
16c40 44 20 78 3c 3d 7a 0a 20 20 20 20 20 20 2a 2a 0a  D x<=z.      **.
16c50 20 20 20 20 20 20 2a 2a 20 43 6f 64 65 20 69 74        ** Code it
16c60 20 61 73 20 73 75 63 68 2c 20 74 61 6b 69 6e 67   as such, taking
16c70 20 63 61 72 65 20 74 6f 20 64 6f 20 74 68 65 20   care to do the 
16c80 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65 73  common subexpres
16c90 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 65 6c  sion.      ** el
16ca0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 78 2e  ementation of x.
16cb0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
16cc0 45 78 70 72 20 65 78 70 72 41 6e 64 3b 0a 20 20  Expr exprAnd;.  
16cd0 20 20 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66      Expr compLef
16ce0 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 63 6f  t;.      Expr co
16cf0 6d 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 45  mpRight;.      E
16d00 78 70 72 20 65 78 70 72 58 3b 0a 0a 20 20 20 20  xpr exprX;..    
16d10 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
16d20 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
16d30 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
16d40 29 3b 0a 20 20 20 20 20 20 65 78 70 72 58 20 3d  );.      exprX =
16d50 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a   *pExpr->pLeft;.
16d60 20 20 20 20 20 20 65 78 70 72 41 6e 64 2e 6f 70        exprAnd.op
16d70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20   = TK_AND;.     
16d80 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d   exprAnd.pLeft =
16d90 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 20 20   &compLeft;.    
16da0 20 20 65 78 70 72 41 6e 64 2e 70 52 69 67 68 74    exprAnd.pRight
16db0 20 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20   = &compRight;. 
16dc0 20 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70       compLeft.op
16dd0 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 20 20 20 20   = TK_GE;.      
16de0 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d  compLeft.pLeft =
16df0 20 26 65 78 70 72 58 3b 0a 20 20 20 20 20 20 63   &exprX;.      c
16e00 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20 3d  ompLeft.pRight =
16e10 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
16e20 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
16e30 20 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20     compRight.op 
16e40 3d 20 54 4b 5f 4c 45 3b 0a 20 20 20 20 20 20 63  = TK_LE;.      c
16e50 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20 3d  ompRight.pLeft =
16e60 20 26 65 78 70 72 58 3b 0a 20 20 20 20 20 20 63   &exprX;.      c
16e70 6f 6d 70 52 69 67 68 74 2e 70 52 69 67 68 74 20  ompRight.pRight 
16e80 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
16e90 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
16ea0 20 20 20 20 65 78 70 72 58 2e 69 54 61 62 6c 65      exprX.iTable
16eb0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
16ec0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26  deTemp(pParse, &
16ed0 65 78 70 72 58 2c 20 26 72 65 67 46 72 65 65 31  exprX, &regFree1
16ee0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
16ef0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
16f00 3b 0a 20 20 20 20 20 20 65 78 70 72 58 2e 6f 70  ;.      exprX.op
16f10 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a   = TK_REGISTER;.
16f20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16f30 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
16f40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
16f50 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
16f60 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c   &exprAnd, dest,
16f70 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
16f80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
16f90 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
16fa0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
16fb0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
16fc0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72  Parse, pExpr, &r
16fd0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
16fe0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16ff0 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20  3(v, OP_If, r1, 
17000 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
17010 21 3d 30 29 3b 0a 20 20 20 20 20 20 74 65 73 74  !=0);.      test
17020 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
17030 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
17040 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
17050 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
17060 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  k;.    }.  }.  s
17070 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
17080 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
17090 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65  Free1);.  sqlite
170a0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
170b0 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32  pParse, regFree2
170c0 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  );  .}../*.** Ge
170d0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
170e0 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73  a boolean expres
170f0 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  sion such that a
17100 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a   jump is made.**
17110 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64   to the label "d
17120 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72  est" if the expr
17130 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20  ession is false 
17140 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  but execution.**
17150 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69   continues strai
17160 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20  ght thru if the 
17170 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72  expression is tr
17180 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ue..**.** If the
17190 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c   expression eval
171a0 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e  uates to NULL (n
171b0 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20  either true nor 
171c0 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a  false) then.** j
171d0 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c  ump if jumpIfNul
171e0 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50  l is SQLITE_JUMP
171f0 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74  IFNULL or fall t
17200 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66  hrough if jumpIf
17210 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f  Null.** is 0..*/
17220 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
17230 72 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a  rIfFalse(Parse *
17240 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
17250 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
17260 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
17270 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
17280 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
17290 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72   op = 0;.  int r
172a0 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69  egFree1 = 0;.  i
172b0 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  nt regFree2 = 0;
172c0 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a  .  int r1, r2;..
172d0 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66    assert( jumpIf
172e0 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d  Null==SQLITE_JUM
172f0 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49  PIFNULL || jumpI
17300 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  fNull==0 );.  if
17310 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d  ( v==0 || pExpr=
17320 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  =0 ) return;..  
17330 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  /* The value of 
17340 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70  pExpr->op and op
17350 20 61 72 65 20 72 65 6c 61 74 65 64 20 61 73 20   are related as 
17360 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20  follows:.  **.  
17370 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  **       pExpr->
17380 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 6f 70  op            op
17390 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d  .  **       ----
173a0 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d  -----          -
173b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20  ---------.  **  
173c0 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20       TK_ISNULL  
173d0 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75          OP_NotNu
173e0 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  ll.  **       TK
173f0 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20  _NOTNULL        
17400 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20   OP_IsNull.  ** 
17410 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20        TK_NE     
17420 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20           OP_Eq. 
17430 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20   **       TK_EQ 
17440 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
17450 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Ne.  **       TK
17460 5f 47 54 20 20 20 20 20 20 20 20 20 20 20 20 20  _GT             
17470 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20   OP_Le.  **     
17480 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20    TK_LE         
17490 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20       OP_Gt.  ** 
174a0 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20        TK_GE     
174b0 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20           OP_Lt. 
174c0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20   **       TK_LT 
174d0 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
174e0 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72  Ge.  **.  ** For
174f0 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66   other values of
17500 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69   pExpr->op, op i
17510 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20  s undefined and 
17520 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65  unused..  ** The
17530 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e   value of TK_ an
17540 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20  d OP_ constants 
17550 61 72 65 20 61 72 72 61 6e 67 65 64 20 73 75 63  are arranged suc
17560 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63  h that we.  ** c
17570 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d  an compute the m
17580 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69  apping above usi
17590 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
175a0 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a   expression..  *
175b0 2a 20 41 73 73 65 72 74 28 29 73 20 76 65 72 69  * Assert()s veri
175c0 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70  fy that the comp
175d0 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65  utation is corre
175e0 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20  ct..  */.  op = 
175f0 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f  ((pExpr->op+(TK_
17600 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54  ISNULL&1))^1)-(T
17610 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20  K_ISNULL&1);..  
17620 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65 63  /* Verify correc
17630 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54  t alignment of T
17640 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74  K_ and OP_ const
17650 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ants.  */.  asse
17660 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
17670 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d  K_ISNULL || op==
17680 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20  OP_NotNull );.  
17690 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
176a0 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c  p!=TK_NOTNULL ||
176b0 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29   op==OP_IsNull )
176c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
176d0 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20  r->op!=TK_NE || 
176e0 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61  op==OP_Eq );.  a
176f0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
17700 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_EQ || op==O
17710 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Ne );.  assert
17720 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
17730 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20  LT || op==OP_Ge 
17740 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
17750 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c  pr->op!=TK_LE ||
17760 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20   op==OP_Gt );.  
17770 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
17780 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d  p!=TK_GT || op==
17790 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Le );.  asser
177a0 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
177b0 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74  _GE || op==OP_Lt
177c0 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70   );..  switch( p
177d0 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
177e0 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20  case TK_AND: {. 
177f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
17800 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
17810 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17820 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43  pParse->disableC
17830 6f 6c 43 61 63 68 65 3d 3d 30 20 29 3b 0a 20 20  olCache==0 );.  
17840 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
17850 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
17860 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
17870 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
17880 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69        pParse->di
17890 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b  sableColCache++;
178a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
178b0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
178c0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
178d0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
178e0 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l);.      assert
178f0 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c  ( pParse->disabl
17900 65 43 6f 6c 43 61 63 68 65 3e 30 20 29 3b 0a 20  eColCache>0 );. 
17910 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73       pParse->dis
17920 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a  ableColCache--;.
17930 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17940 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f   }.    case TK_O
17950 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  R: {.      int d
17960 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  2 = sqlite3VdbeM
17970 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
17980 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
17990 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
179a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50      testcase( pP
179b0 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c  arse->disableCol
179c0 43 61 63 68 65 3d 3d 30 20 29 3b 0a 20 20 20 20  Cache==0 );.    
179d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
179e0 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
179f0 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 6a 75  r->pLeft, d2, ju
17a00 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f  mpIfNull^SQLITE_
17a10 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
17a20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62     pParse->disab
17a30 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20 20  leColCache++;.  
17a40 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
17a50 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
17a60 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
17a70 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
17a80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
17a90 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f  Parse->disableCo
17aa0 6c 43 61 63 68 65 3e 30 20 29 3b 0a 20 20 20 20  lCache>0 );.    
17ab0 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c    pParse->disabl
17ac0 65 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20 20  eColCache--;.   
17ad0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
17ae0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32  solveLabel(v, d2
17af0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
17b00 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
17b10 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73  K_NOT: {.      s
17b20 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
17b30 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
17b40 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
17b50 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
17b60 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
17b70 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
17b80 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
17b90 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
17ba0 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
17bb0 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
17bc0 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
17bd0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
17be0 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20  p==TK_LT );.    
17bf0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
17c00 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 74  TK_LE );.      t
17c10 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
17c20 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GT );.      test
17c30 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 45 20  case( op==TK_GE 
17c40 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
17c50 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a  e( op==TK_EQ );.
17c60 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17c70 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20  op==TK_NE );.   
17c80 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
17c90 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
17ca0 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 4f      codeCompareO
17cb0 70 65 72 61 6e 64 73 28 70 50 61 72 73 65 2c 20  perands(pParse, 
17cc0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
17cd0 31 2c 20 26 72 65 67 46 72 65 65 31 2c 0a 20 20  1, &regFree1,.  
17ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d00 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
17d10 72 32 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  r2, &regFree2);.
17d20 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
17d30 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
17d40 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
17d50 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
17d60 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
17d70 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49   r2, dest, jumpI
17d80 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 74 65  fNull);.      te
17d90 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
17da0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
17db0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
17dc0 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
17dd0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
17de0 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
17df0 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
17e00 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
17e10 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  se( op==TK_ISNUL
17e20 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  L );.      testc
17e30 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  ase( op==TK_NOTN
17e40 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72 31 20  ULL );.      r1 
17e50 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
17e60 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
17e70 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
17e80 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71  Free1);.      sq
17e90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17ea0 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29  v, op, r1, dest)
17eb0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
17ec0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
17ed0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
17ee0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
17ef0 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
17f00 20 2f 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e   /*    x BETWEEN
17f10 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 20 20 2a   y AND z.      *
17f20 2a 0a 20 20 20 20 20 20 2a 2a 20 49 73 20 65 71  *.      ** Is eq
17f30 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20  uivalent to .   
17f40 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
17f50 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a    x>=y AND x<=z.
17f60 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
17f70 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73 75 63  * Code it as suc
17f80 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65 20 74  h, taking care t
17f90 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  o do the common 
17fa0 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  subexpression.  
17fb0 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 61 74      ** elementat
17fc0 69 6f 6e 20 6f 66 20 78 2e 0a 20 20 20 20 20 20  ion of x..      
17fd0 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 65 78  */.      Expr ex
17fe0 70 72 41 6e 64 3b 0a 20 20 20 20 20 20 45 78 70  prAnd;.      Exp
17ff0 72 20 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 20 20  r compLeft;.    
18000 20 20 45 78 70 72 20 63 6f 6d 70 52 69 67 68 74    Expr compRight
18010 3b 0a 20 20 20 20 20 20 45 78 70 72 20 65 78 70  ;.      Expr exp
18020 72 58 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  rX;..      asser
18030 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
18040 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
18050 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
18060 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72    exprX = *pExpr
18070 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 65  ->pLeft;.      e
18080 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41  xprAnd.op = TK_A
18090 4e 44 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e  ND;.      exprAn
180a0 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c  d.pLeft = &compL
180b0 65 66 74 3b 0a 20 20 20 20 20 20 65 78 70 72 41  eft;.      exprA
180c0 6e 64 2e 70 52 69 67 68 74 20 3d 20 26 63 6f 6d  nd.pRight = &com
180d0 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 63 6f  pRight;.      co
180e0 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47  mpLeft.op = TK_G
180f0 45 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65 66  E;.      compLef
18100 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58  t.pLeft = &exprX
18110 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65 66 74  ;.      compLeft
18120 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  .pRight = pExpr-
18130 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  >x.pList->a[0].p
18140 45 78 70 72 3b 0a 20 20 20 20 20 20 63 6f 6d 70  Expr;.      comp
18150 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45  Right.op = TK_LE
18160 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52 69 67 68  ;.      compRigh
18170 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58  t.pLeft = &exprX
18180 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52 69 67 68  ;.      compRigh
18190 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72  t.pRight = pExpr
181a0 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  ->x.pList->a[1].
181b0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 65 78 70  pExpr;.      exp
181c0 72 58 2e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69  rX.iTable = sqli
181d0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
181e0 70 50 61 72 73 65 2c 20 26 65 78 70 72 58 2c 20  pParse, &exprX, 
181f0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
18200 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
18210 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
18220 20 65 78 70 72 58 2e 6f 70 20 3d 20 54 4b 5f 52   exprX.op = TK_R
18230 45 47 49 53 54 45 52 3b 0a 20 20 20 20 20 20 74  EGISTER;.      t
18240 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
18250 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
18260 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
18270 73 65 28 70 50 61 72 73 65 2c 20 26 65 78 70 72  se(pParse, &expr
18280 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  And, dest, jumpI
18290 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
182a0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
182b0 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
182c0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
182d0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
182e0 20 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65   pExpr, &regFree
182f0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
18300 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
18310 50 5f 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73  P_IfNot, r1, des
18320 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  t, jumpIfNull!=0
18330 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
18340 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
18350 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
18360 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
18370 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
18380 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
18390 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
183a0 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
183b0 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  e1);.  sqlite3Re
183c0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
183d0 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a  rse, regFree2);.
183e0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65  }../*.** Do a de
183f0 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66  ep comparison of
18400 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20   two expression 
18410 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20 54  trees.  Return T
18420 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a  RUE (non-zero).*
18430 2a 20 69 66 20 74 68 65 79 20 61 72 65 20 69 64  * if they are id
18440 65 6e 74 69 63 61 6c 20 61 6e 64 20 72 65 74 75  entical and retu
18450 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65 79  rn FALSE if they
18460 20 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77   differ in any w
18470 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  ay..**.** Someti
18480 6d 65 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  mes this routine
18490 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 46 41 4c   will return FAL
184a0 53 45 20 65 76 65 6e 20 69 66 20 74 68 65 20 74  SE even if the t
184b0 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  wo expressions.*
184c0 2a 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75  * really are equ
184d0 69 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20  ivalent.  If we 
184e0 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61  cannot prove tha
184f0 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
18500 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63  s are.** identic
18510 61 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 46 41  al, we return FA
18520 4c 53 45 20 6a 75 73 74 20 74 6f 20 62 65 20 73  LSE just to be s
18530 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73  afe.  So if this
18540 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
18550 72 6e 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20  rns false, then 
18560 79 6f 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c  you do not reall
18570 79 20 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74 61  y know for certa
18580 69 6e 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a  in if the two.**
18590 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
185a0 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20   the same.  But 
185b0 69 66 20 79 6f 75 20 67 65 74 20 61 20 54 52 55  if you get a TRU
185c0 45 20 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79  E return, then y
185d0 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72  ou.** can be sur
185e0 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
185f0 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20  s are the same. 
18600 20 49 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77   In the places w
18610 68 65 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  here.** this rou
18620 74 69 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74  tine is used, it
18630 20 64 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74   does not hurt t
18640 6f 20 67 65 74 20 61 6e 20 65 78 74 72 61 20 46  o get an extra F
18650 41 4c 53 45 20 2d 20 74 68 61 74 0a 2a 2a 20 6a  ALSE - that.** j
18660 75 73 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74  ust might result
18670 20 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c   in some slightl
18680 79 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20  y slower code.  
18690 42 75 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a  But returning.**
186a0 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 54 52   an incorrect TR
186b0 55 45 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f  UE could lead to
186c0 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a   a malfunction..
186d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
186e0 70 72 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a  prCompare(Expr *
186f0 70 41 2c 20 45 78 70 72 20 2a 70 42 29 7b 0a 20  pA, Expr *pB){. 
18700 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41   int i;.  if( pA
18710 3d 3d 30 7c 7c 70 42 3d 3d 30 20 29 7b 0a 20 20  ==0||pB==0 ){.  
18720 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 3b    return pB==pA;
18730 0a 20 20 7d 0a 20 20 69 66 28 20 45 78 70 72 48  .  }.  if( ExprH
18740 61 73 50 72 6f 70 65 72 74 79 28 70 41 2c 20 45  asProperty(pA, E
18750 50 5f 78 49 73 53 65 6c 65 63 74 29 20 7c 7c 20  P_xIsSelect) || 
18760 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
18770 70 42 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pB, EP_xIsSelect
18780 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
18790 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 41  0;.  }.  if( (pA
187a0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
187b0 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61  tinct)!=(pB->fla
187c0 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
187d0 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
187e0 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e  if( pA->op!=pB->
187f0 6f 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  op ) return 0;. 
18800 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
18810 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65  rCompare(pA->pLe
18820 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 29 20 29  ft, pB->pLeft) )
18830 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
18840 20 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d   !sqlite3ExprCom
18850 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c  pare(pA->pRight,
18860 20 70 42 2d 3e 70 52 69 67 68 74 29 20 29 20 72   pB->pRight) ) r
18870 65 74 75 72 6e 20 30 3b 0a 0a 20 20 69 66 28 20  eturn 0;..  if( 
18880 70 41 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 70  pA->x.pList && p
18890 42 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20  B->x.pList ){.  
188a0 20 20 69 66 28 20 70 41 2d 3e 78 2e 70 4c 69 73    if( pA->x.pLis
188b0 74 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 78 2e  t->nExpr!=pB->x.
188c0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 20 72  pList->nExpr ) r
188d0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72  eturn 0;.    for
188e0 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 78 2e 70 4c  (i=0; i<pA->x.pL
188f0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
18900 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
18910 78 70 72 41 20 3d 20 70 41 2d 3e 78 2e 70 4c 69  xprA = pA->x.pLi
18920 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
18930 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
18940 72 42 20 3d 20 70 42 2d 3e 78 2e 70 4c 69 73 74  rB = pB->x.pList
18950 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
18960 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
18970 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78 70  ExprCompare(pExp
18980 72 41 2c 20 70 45 78 70 72 42 29 20 29 20 72 65  rA, pExprB) ) re
18990 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
189a0 7d 65 6c 73 65 20 69 66 28 20 70 41 2d 3e 78 2e  }else if( pA->x.
189b0 70 4c 69 73 74 20 7c 7c 20 70 42 2d 3e 78 2e 70  pList || pB->x.p
189c0 4c 69 73 74 20 29 7b 0a 20 20 20 20 72 65 74 75  List ){.    retu
189d0 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  rn 0;.  }..  if(
189e0 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d   pA->iTable!=pB-
189f0 3e 69 54 61 62 6c 65 20 7c 7c 20 70 41 2d 3e 69  >iTable || pA->i
18a00 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c  Column!=pB->iCol
18a10 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  umn ) return 0;.
18a20 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b    if( pA->op!=TK
18a30 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 74  _COLUMN && pA->t
18a40 6f 6b 65 6e 2e 7a 20 29 7b 0a 20 20 20 20 69 66  oken.z ){.    if
18a50 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30  ( pB->token.z==0
18a60 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
18a70 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e   if( pB->token.n
18a80 21 3d 70 41 2d 3e 74 6f 6b 65 6e 2e 6e 20 29 20  !=pA->token.n ) 
18a90 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66  return 0;.    if
18aa0 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ( sqlite3StrNICm
18ab0 70 28 28 63 68 61 72 2a 29 70 41 2d 3e 74 6f 6b  p((char*)pA->tok
18ac0 65 6e 2e 7a 2c 28 63 68 61 72 2a 29 70 42 2d 3e  en.z,(char*)pB->
18ad0 74 6f 6b 65 6e 2e 7a 2c 70 42 2d 3e 74 6f 6b 65  token.z,pB->toke
18ae0 6e 2e 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  n.n)!=0 ){.     
18af0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
18b00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
18b10 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  .}.../*.** Add a
18b20 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
18b30 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43  the pAggInfo->aC
18b40 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74  ol[] array.  Ret
18b50 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
18b60 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d  .** the new elem
18b70 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e  ent.  Return a n
18b80 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69  egative number i
18b90 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a  f malloc fails..
18ba0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  */.static int ad
18bb0 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73  dAggInfoColumn(s
18bc0 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49  qlite3 *db, AggI
18bd0 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69  nfo *pInfo){.  i
18be0 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61  nt i;.  pInfo->a
18bf0 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 41 72 72  Col = sqlite3Arr
18c00 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20  ayAllocate(.    
18c10 20 20 20 64 62 2c 0a 20 20 20 20 20 20 20 70 49     db,.       pI
18c20 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20  nfo->aCol,.     
18c30 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e    sizeof(pInfo->
18c40 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20  aCol[0]),.      
18c50 20 33 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66   3,.       &pInf
18c60 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  o->nColumn,.    
18c70 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75     &pInfo->nColu
18c80 6d 6e 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 20  mnAlloc,.       
18c90 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  &i.  );.  return
18ca0 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a   i;.}    ../*.**
18cb0 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
18cc0 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e  nt to the pAggIn
18cd0 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61  fo->aFunc[] arra
18ce0 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69  y.  Return the i
18cf0 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ndex of.** the n
18d00 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74  ew element.  Ret
18d10 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e  urn a negative n
18d20 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20  umber if malloc 
18d30 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
18d40 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 46   int addAggInfoF
18d50 75 6e 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  unc(sqlite3 *db,
18d60 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29   AggInfo *pInfo)
18d70 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e  {.  int i;.  pIn
18d80 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69  fo->aFunc = sqli
18d90 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
18da0 28 0a 20 20 20 20 20 20 20 64 62 2c 20 0a 20 20  (.       db, .  
18db0 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e       pInfo->aFun
18dc0 63 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66  c,.       sizeof
18dd0 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d  (pInfo->aFunc[0]
18de0 29 2c 0a 20 20 20 20 20 20 20 33 2c 0a 20 20 20  ),.       3,.   
18df0 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e      &pInfo->nFun
18e00 63 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f  c,.       &pInfo
18e10 2d 3e 6e 46 75 6e 63 41 6c 6c 6f 63 2c 0a 20 20  ->nFuncAlloc,.  
18e20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72       &i.  );.  r
18e30 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a  eturn i;.}    ..
18e40 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
18e50 65 20 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  e xExprCallback 
18e60 66 6f 72 20 61 20 74 72 65 65 20 77 61 6c 6b 65  for a tree walke
18e70 72 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 74  r.  It is used t
18e80 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 73  o.** implement s
18e90 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
18ea0 65 41 67 67 72 65 67 61 74 65 73 28 29 2e 20 20  eAggregates().  
18eb0 53 65 65 20 73 71 6c 69 74 65 33 45 78 70 72 41  See sqlite3ExprA
18ec0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
18ed0 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .** for addition
18ee0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
18ef0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e  */.static int an
18f00 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 28 57  alyzeAggregate(W
18f10 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
18f20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
18f30 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e  int i;.  NameCon
18f40 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c  text *pNC = pWal
18f50 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50 61  ker->u.pNC;.  Pa
18f60 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e  rse *pParse = pN
18f70 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53 72 63  C->pParse;.  Src
18f80 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d  List *pSrcList =
18f90 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a   pNC->pSrcList;.
18fa0 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49    AggInfo *pAggI
18fb0 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67 67 49  nfo = pNC->pAggI
18fc0 6e 66 6f 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  nfo;..  switch( 
18fd0 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
18fe0 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
18ff0 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UMN:.    case TK
19000 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
19010 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
19020 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
19030 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  UMN );.      tes
19040 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
19050 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
19060 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
19070 20 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c 75   see if the colu
19080 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20  mn is in one of 
19090 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68  the tables in th
190a0 65 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20  e FROM.      ** 
190b0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67  clause of the ag
190c0 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f  gregate query */
190d0 0a 20 20 20 20 20 20 69 66 28 20 70 53 72 63 4c  .      if( pSrcL
190e0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ist ){.        s
190f0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
19100 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63  em *pItem = pSrc
19110 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20  List->a;.       
19120 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63   for(i=0; i<pSrc
19130 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
19140 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
19150 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
19160 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20  nfo_col *pCol;. 
19170 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
19180 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65  pr->iTable==pIte
19190 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  m->iCursor ){.  
191a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
191b0 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
191c0 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  int, it means th
191d0 61 74 20 70 45 78 70 72 20 72 65 66 65 72 73 20  at pExpr refers 
191e0 74 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20  to a table.     
191f0 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69         ** that i
19200 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
19210 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72  ause of the aggr
19220 65 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a 20  egate query.  . 
19230 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20             **.  
19240 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b            ** Mak
19250 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74  e an entry for t
19260 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67  he column in pAg
19270 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66  gInfo->aCol[] if
19280 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20 20   there.         
19290 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20     ** is not an 
192a0 65 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72 65  entry there alre
192b0 61 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ady..           
192c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
192d0 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20  int k;.         
192e0 20 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e     pCol = pAggIn
192f0 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20  fo->aCol;.      
19300 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
19310 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  <pAggInfo->nColu
19320 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  mn; k++, pCol++)
19330 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
19340 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65  if( pCol->iTable
19350 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
19360 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
19370 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75       pCol->iColu
19380 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75  mn==pExpr->iColu
19390 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
193a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
193b0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
193c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
193d0 20 20 20 20 20 20 20 69 66 28 20 28 6b 3e 3d 70         if( (k>=p
193e0 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
193f0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  ).             &
19400 26 20 28 6b 20 3d 20 61 64 64 41 67 67 49 6e 66  & (k = addAggInf
19410 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e  oColumn(pParse->
19420 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d  db, pAggInfo))>=
19430 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  0 .            )
19440 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
19450 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f  pCol = &pAggInfo
19460 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20  ->aCol[k];.     
19470 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70           pCol->p
19480 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61  Tab = pExpr->pTa
19490 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b;.             
194a0 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20   pCol->iTable = 
194b0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20  pExpr->iTable;. 
194c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
194d0 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78  l->iColumn = pEx
194e0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
194f0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
19500 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65  >iMem = ++pParse
19510 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
19520 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
19530 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a  terColumn = -1;.
19540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
19550 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  ol->pExpr = pExp
19560 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
19570 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70   if( pAggInfo->p
19580 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
19590 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a             int j
195a0 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  , n;.           
195b0 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
195c0 47 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70  GB = pAggInfo->p
195d0 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20  GroupBy;.       
195e0 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
195f0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
19600 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20  Term = pGB->a;. 
19610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
19620 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20   = pGB->nExpr;. 
19630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
19640 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b  or(j=0; j<n; j++
19650 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
19660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
19670 70 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e  pr *pE = pTerm->
19680 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
19690 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d           if( pE-
196a0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
196b0 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45  & pE->iTable==pE
196c0 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20  xpr->iTable &&. 
196d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196e0 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e       pE->iColumn
196f0 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ==pExpr->iColumn
19700 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
19710 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53          pCol->iS
19720 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b  orterColumn = j;
19730 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19740 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
19760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19770 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
19780 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
19790 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65  if( pCol->iSorte
197a0 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  rColumn<0 ){.   
197b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
197c0 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
197d0 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f   = pAggInfo->nSo
197e0 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20  rtingColumn++;. 
197f0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
19800 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
19810 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72           /* Ther
19820 65 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72  e is now an entr
19830 79 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20 70  y for pExpr in p
19840 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
19850 28 65 69 74 68 65 72 0a 20 20 20 20 20 20 20 20  (either.        
19860 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69      ** because i
19870 74 20 77 61 73 20 74 68 65 72 65 20 62 65 66 6f  t was there befo
19880 72 65 20 6f 72 20 62 65 63 61 75 73 65 20 77 65  re or because we
19890 20 6a 75 73 74 20 63 72 65 61 74 65 64 20 69 74   just created it
198a0 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  )..            *
198b0 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70 45  * Convert the pE
198c0 78 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f 41  xpr to be a TK_A
198d0 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72  GG_COLUMN referr
198e0 69 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20 20  ing to that.    
198f0 20 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67 49          ** pAggI
19900 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72  nfo->aCol[] entr
19910 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  y..            *
19920 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  /.            pE
19930 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20  xpr->pAggInfo = 
19940 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
19950 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
19960 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b  = TK_AGG_COLUMN;
19970 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
19980 70 72 2d 3e 69 41 67 67 20 3d 20 6b 3b 0a 20 20  pr->iAgg = k;.  
19990 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
199a0 0a 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20  .          } /* 
199b0 65 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54 61  endif pExpr->iTa
199c0 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72  ble==pItem->iCur
199d0 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  sor */.        }
199e0 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65   /* end loop ove
199f0 72 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20  r pSrcList */.  
19a00 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
19a10 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
19a20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
19a30 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a  AGG_FUNCTION: {.
19a40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 4e 43        /* The pNC
19a50 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 74 65 73 74  ->nDepth==0 test
19a60 20 63 61 75 73 65 73 20 61 67 67 72 65 67 61 74   causes aggregat
19a70 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 73  e functions in s
19a80 75 62 71 75 65 72 69 65 73 0a 20 20 20 20 20 20  ubqueries.      
19a90 2a 2a 20 74 6f 20 62 65 20 69 67 6e 6f 72 65 64  ** to be ignored
19aa0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4e   */.      if( pN
19ab0 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 29 7b 0a  C->nDepth==0 ){.
19ac0 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
19ad0 20 74 6f 20 73 65 65 20 69 66 20 70 45 78 70 72   to see if pExpr
19ae0 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20   is a duplicate 
19af0 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65  of another aggre
19b00 67 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  gate .        **
19b10 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69   function that i
19b20 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
19b30 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74   pAggInfo struct
19b40 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ure.        */. 
19b50 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
19b60 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65  gInfo_func *pIte
19b70 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  m = pAggInfo->aF
19b80 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  unc;.        for
19b90 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
19ba0 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49  ->nFunc; i++, pI
19bb0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
19bc0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
19bd0 72 43 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e  rCompare(pItem->
19be0 70 45 78 70 72 2c 20 70 45 78 70 72 29 20 29 7b  pExpr, pExpr) ){
19bf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
19c00 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
19c10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19c20 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66    if( i>=pAggInf
19c30 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20  o->nFunc ){.    
19c40 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69        /* pExpr i
19c50 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b  s original.  Mak
19c60 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  e a new entry in
19c70 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
19c80 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  [].          */.
19c90 20 20 20 20 20 20 20 20 20 20 75 38 20 65 6e 63            u8 enc
19ca0 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64   = ENC(pParse->d
19cb0 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  b);.          i 
19cc0 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63  = addAggInfoFunc
19cd0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67  (pParse->db, pAg
19ce0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  gInfo);.        
19cf0 20 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20    if( i>=0 ){.  
19d00 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
19d10 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
19d20 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
19d30 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
19d40 20 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20 26         pItem = &
19d50 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
19d60 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i];.            
19d70 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70  pItem->pExpr = p
19d80 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
19d90 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20    pItem->iMem = 
19da0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
19db0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
19dc0 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74  m->pFunc = sqlit
19dd0 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70  e3FindFunction(p
19de0 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20  Parse->db,.     
19df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
19e00 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65  har*)pExpr->toke
19e10 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
19e20 6e 2e 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  n.n,.           
19e30 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 78          pExpr->x
19e40 2e 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e  .pList ? pExpr->
19e50 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  x.pList->nExpr :
19e60 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20   0, enc, 0);.   
19e70 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
19e80 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44  pr->flags & EP_D
19e90 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20  istinct ){.     
19ea0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
19eb0 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72  iDistinct = pPar
19ec0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
19ed0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
19ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
19ef0 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20  em->iDistinct = 
19f00 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1;.            
19f10 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
19f20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
19f30 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20 70 6f  /* Make pExpr po
19f40 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70 72 6f  int to the appro
19f50 70 72 69 61 74 65 20 70 41 67 67 49 6e 66 6f 2d  priate pAggInfo-
19f60 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20  >aFunc[] entry. 
19f70 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
19f80 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20    pExpr->iAgg = 
19f90 69 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  i;.        pExpr
19fa0 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67  ->pAggInfo = pAg
19fb0 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 72  gInfo;.        r
19fc0 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
19fd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19fe0 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
19ff0 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74  Continue;.}.stat
1a000 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67  ic int analyzeAg
1a010 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74  gregatesInSelect
1a020 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
1a030 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
1a040 74 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  t){.  NameContex
1a050 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72  t *pNC = pWalker
1a060 2d 3e 75 2e 70 4e 43 3b 0a 20 20 69 66 28 20 70  ->u.pNC;.  if( p
1a070 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 29 7b  NC->nDepth==0 ){
1a080 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68  .    pNC->nDepth
1a090 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57  ++;.    sqlite3W
1a0a0 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
1a0b0 72 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  r, pSelect);.   
1a0c0 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2d 2d 3b 0a   pNC->nDepth--;.
1a0d0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
1a0e0 72 75 6e 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rune;.  }else{. 
1a0f0 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
1a100 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ntinue;.  }.}../
1a110 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65  *.** Analyze the
1a120 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
1a130 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67  n looking for ag
1a140 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
1a150 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72  s and.** for var
1a160 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64  iables that need
1a170 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
1a180 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67  the pParse->aAgg
1a190 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b  [] array..** Mak
1a1a0 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74  e additional ent
1a1b0 72 69 65 73 20 74 6f 20 74 68 65 20 70 50 61 72  ries to the pPar
1a1c0 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79  se->aAgg[] array
1a1d0 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   as necessary..*
1a1e0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1a1f0 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
1a200 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68   called after th
1a210 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73  e expression has
1a220 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65   been.** analyze
1a230 64 20 62 79 20 73 71 6c 69 74 65 33 52 65 73 6f  d by sqlite3Reso
1a240 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a  lveExprNames()..
1a250 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1a260 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
1a270 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74  ates(NameContext
1a280 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78   *pNC, Expr *pEx
1a290 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  pr){.  Walker w;
1a2a0 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
1a2b0 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72  ck = analyzeAggr
1a2c0 65 67 61 74 65 3b 0a 20 20 77 2e 78 53 65 6c 65  egate;.  w.xSele
1a2d0 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61  ctCallback = ana
1a2e0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e  lyzeAggregatesIn
1a2f0 53 65 6c 65 63 74 3b 0a 20 20 77 2e 75 2e 70 4e  Select;.  w.u.pN
1a300 43 20 3d 20 70 4e 43 3b 0a 20 20 73 71 6c 69 74  C = pNC;.  sqlit
1a310 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
1a320 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Expr);.}../*.** 
1a330 43 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72  Call sqlite3Expr
1a340 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
1a350 73 28 29 20 66 6f 72 20 65 76 65 72 79 20 65 78  s() for every ex
1a360 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a  pression in an.*
1a370 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
1a380 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  t.  Return the n
1a390 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
1a3a0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
1a3b0 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65  or is found, the
1a3c0 20 61 6e 61 6c 79 73 69 73 20 69 73 20 63 75 74   analysis is cut
1a3d0 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20   short..*/.void 
1a3e0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
1a3f0 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f  zeAggList(NameCo
1a400 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72  ntext *pNC, Expr
1a410 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
1a420 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
1a430 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
1a440 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
1a450 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74  t ){.    for(pIt
1a460 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
1a470 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
1a480 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
1a490 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1a4a0 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
1a4b0 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e  tes(pNC, pItem->
1a4c0 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
1a4d0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
1a4e0 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74  ate or deallocat
1a4f0 65 20 74 65 6d 70 6f 72 61 72 79 20 75 73 65 20  e temporary use 
1a500 72 65 67 69 73 74 65 72 73 20 64 75 72 69 6e 67  registers during
1a510 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e   code generation
1a520 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1a530 47 65 74 54 65 6d 70 52 65 67 28 50 61 72 73 65  GetTempReg(Parse
1a540 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28   *pParse){.  if(
1a550 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
1a560 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  g==0 ){.    retu
1a570 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65  rn ++pParse->nMe
1a580 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  m;.  }.  return 
1a590 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
1a5a0 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  [--pParse->nTemp
1a5b0 52 65 67 5d 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  Reg];.}.void sql
1a5c0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1a5d0 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eg(Parse *pParse
1a5e0 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69  , int iReg){.  i
1a5f0 66 28 20 69 52 65 67 20 26 26 20 70 50 61 72 73  f( iReg && pPars
1a600 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61  e->nTempReg<Arra
1a610 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54  ySize(pParse->aT
1a620 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20 73  empReg) ){.    s
1a630 71 6c 69 74 65 33 45 78 70 72 57 72 69 74 61 62  qlite3ExprWritab
1a640 6c 65 52 65 67 69 73 74 65 72 28 70 50 61 72 73  leRegister(pPars
1a650 65 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 70 50  e, iReg);.    pP
1a660 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70  arse->aTempReg[p
1a670 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b  Parse->nTempReg+
1a680 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d  +] = iReg;.  }.}
1a690 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
1a6a0 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 20 61   or deallocate a
1a6b0 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63   block of nReg c
1a6c0 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69 73  onsecutive regis
1a6d0 74 65 72 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ters.*/.int sqli
1a6e0 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
1a6f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1a700 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt nReg){.  int 
1a710 69 2c 20 6e 3b 0a 20 20 69 20 3d 20 70 50 61 72  i, n;.  i = pPar
1a720 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20  se->iRangeReg;. 
1a730 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61   n = pParse->nRa
1a740 6e 67 65 52 65 67 3b 0a 20 20 69 66 28 20 6e 52  ngeReg;.  if( nR
1a750 65 67 3c 3d 6e 20 26 26 20 21 75 73 65 64 41 73  eg<=n && !usedAs
1a760 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72  ColumnCache(pPar
1a770 73 65 2c 20 69 2c 20 69 2b 6e 2d 31 29 20 29 7b  se, i, i+n-1) ){
1a780 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61  .    pParse->iRa
1a790 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a  ngeReg += nReg;.
1a7a0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e      pParse->nRan
1a7b0 67 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20  geReg -= nReg;. 
1a7c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20   }else{.    i = 
1a7d0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
1a7e0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
1a7f0 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20   += nReg;.  }.  
1a800 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64  return i;.}.void
1a810 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1a820 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a  empRange(Parse *
1a830 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
1a840 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69  , int nReg){.  i
1a850 66 28 20 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e  f( nReg>pParse->
1a860 6e 52 61 6e 67 65 52 65 67 20 29 7b 0a 20 20 20  nRangeReg ){.   
1a870 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
1a880 65 67 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70  eg = nReg;.    p
1a890 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
1a8a0 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a      = iReg;.  }.}.