/ Hex Artifact Content
Login

Artifact 0ceafeff3a4e0f460d6a7695a675ae12391e313d:


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 33 39 38 20 32 30 30 38 2f 31 30 2f 30 37 20  .398 2008/10/07 
0220: 31 39 3a 35 33 3a 31 34 20 64 72 68 20 45 78 70  19:53:14 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 23 69 6e  sqliteInt.h".#in
0250: 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a  clude <ctype.h>.
0260: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0270: 65 20 27 61 66 66 69 6e 69 74 79 27 20 6f 66 20  e 'affinity' of 
0280: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
0290: 45 78 70 72 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a  Expr if any..**.
02a0: 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61  ** If pExpr is a
02b0: 20 63 6f 6c 75 6d 6e 2c 20 61 20 72 65 66 65 72   column, a refer
02c0: 65 6e 63 65 20 74 6f 20 61 20 63 6f 6c 75 6d 6e  ence to a column
02d0: 20 76 69 61 20 61 6e 20 27 41 53 27 20 61 6c 69   via an 'AS' ali
02e0: 61 73 2c 0a 2a 2a 20 6f 72 20 61 20 73 75 62 2d  as,.** or a sub-
02f0: 73 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f  select with a co
0300: 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 65 74 75  lumn as the retu
0310: 72 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  rn value, then t
0320: 68 65 20 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20  he .** affinity 
0330: 6f 66 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69  of that column i
0340: 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
0350: 72 77 69 73 65 2c 20 30 78 30 30 20 69 73 20 72  rwise, 0x00 is r
0360: 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 69 6e 64 69  eturned,.** indi
0370: 63 61 74 69 6e 67 20 6e 6f 20 61 66 66 69 6e 69  cating no affini
0380: 74 79 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ty for the expre
0390: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65  ssion..**.** i.e
03a0: 2e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  . the WHERE clau
03b0: 73 65 20 65 78 70 72 65 73 73 73 69 6f 6e 73 20  se expresssions 
03c0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
03d0: 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6c 6c 0a   statements all.
03e0: 2a 2a 20 68 61 76 65 20 61 6e 20 61 66 66 69 6e  ** have an affin
03f0: 69 74 79 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  ity:.**.** CREAT
0400: 45 20 54 41 42 4c 45 20 74 31 28 61 29 3b 0a 2a  E TABLE t1(a);.*
0410: 2a 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  * SELECT * FROM 
0420: 74 31 20 57 48 45 52 45 20 61 3b 0a 2a 2a 20 53  t1 WHERE a;.** S
0430: 45 4c 45 43 54 20 61 20 41 53 20 62 20 46 52 4f  ELECT a AS b FRO
0440: 4d 20 74 31 20 57 48 45 52 45 20 62 3b 0a 2a 2a  M t1 WHERE b;.**
0450: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0460: 31 20 57 48 45 52 45 20 28 73 65 6c 65 63 74 20  1 WHERE (select 
0470: 61 20 66 72 6f 6d 20 74 31 29 3b 0a 2a 2f 0a 63  a from t1);.*/.c
0480: 68 61 72 20 73 71 6c 69 74 65 33 45 78 70 72 41  har sqlite3ExprA
0490: 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45  ffinity(Expr *pE
04a0: 78 70 72 29 7b 0a 20 20 69 6e 74 20 6f 70 20 3d  xpr){.  int op =
04b0: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
04c0: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
04d0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
04e0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
04f0: 79 28 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  y(pExpr->pSelect
0500: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
0510: 45 78 70 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  Expr);.  }.#ifnd
0520: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
0530: 41 53 54 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  AST.  if( op==TK
0540: 5f 43 41 53 54 20 29 7b 0a 20 20 20 20 72 65 74  _CAST ){.    ret
0550: 75 72 6e 20 73 71 6c 69 74 65 33 41 66 66 69 6e  urn sqlite3Affin
0560: 69 74 79 54 79 70 65 28 26 70 45 78 70 72 2d 3e  ityType(&pExpr->
0570: 74 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64  token);.  }.#end
0580: 69 66 0a 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b  if.  if( (op==TK
0590: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54  _COLUMN || op==T
05a0: 4b 5f 52 45 47 49 53 54 45 52 29 20 26 26 20 70  K_REGISTER) && p
05b0: 45 78 70 72 2d 3e 70 54 61 62 21 3d 30 20 29 7b  Expr->pTab!=0 ){
05c0: 0a 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52  .    /* op==TK_R
05d0: 45 47 49 53 54 45 52 20 26 26 20 70 45 78 70 72  EGISTER && pExpr
05e0: 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e  ->pTab!=0 happen
05f0: 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61 73  s when pExpr was
0600: 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20   originally.    
0610: 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62  ** a TK_COLUMN b
0620: 75 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  ut was previousl
0630: 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  y evaluated and 
0640: 63 61 63 68 65 64 20 69 6e 20 61 20 72 65 67 69  cached in a regi
0650: 73 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ster */.    int 
0660: 6a 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  j = pExpr->iColu
0670: 6d 6e 3b 0a 20 20 20 20 69 66 28 20 6a 3c 30 20  mn;.    if( j<0 
0680: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
0690: 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  AFF_INTEGER;.   
06a0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
06b0: 70 54 61 62 20 26 26 20 6a 3c 70 45 78 70 72 2d  pTab && j<pExpr-
06c0: 3e 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20  >pTab->nCol );. 
06d0: 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d     return pExpr-
06e0: 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61  >pTab->aCol[j].a
06f0: 66 66 69 6e 69 74 79 3b 0a 20 20 7d 0a 20 20 72  ffinity;.  }.  r
0700: 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61 66 66  eturn pExpr->aff
0710: 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  inity;.}../*.** 
0720: 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  Set the collatin
0730: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65  g sequence for e
0740: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
0750: 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c 61 74  to be the collat
0760: 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20  ing.** sequence 
0770: 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e 2e  named by pToken.
0780: 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e     Return a poin
0790: 74 65 72 20 74 6f 20 74 68 65 20 72 65 76 69 73  ter to the revis
07a0: 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  ed expression..*
07b0: 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * The collating 
07c0: 73 65 71 75 65 6e 63 65 20 69 73 20 6d 61 72 6b  sequence is mark
07d0: 65 64 20 61 73 20 22 65 78 70 6c 69 63 69 74 22  ed as "explicit"
07e0: 20 75 73 69 6e 67 20 74 68 65 20 45 50 5f 45 78   using the EP_Ex
07f0: 70 43 6f 6c 6c 61 74 65 0a 2a 2a 20 66 6c 61 67  pCollate.** flag
0800: 2e 20 20 41 6e 20 65 78 70 6c 69 63 69 74 20 63  .  An explicit c
0810: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
0820: 65 20 77 69 6c 6c 20 6f 76 65 72 72 69 64 65 20  e will override 
0830: 69 6d 70 6c 69 63 69 74 0a 2a 2a 20 63 6f 6c 6c  implicit.** coll
0840: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 2e  ating sequences.
0850: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
0860: 33 45 78 70 72 53 65 74 43 6f 6c 6c 28 50 61 72  3ExprSetColl(Par
0870: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
0880: 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a   *pExpr, Token *
0890: 70 43 6f 6c 6c 4e 61 6d 65 29 7b 0a 20 20 63 68  pCollName){.  ch
08a0: 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 30 3b 20 20  ar *zColl = 0;  
08b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 71            /* Deq
08c0: 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20 63 6f  uoted name of co
08d0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
08e0: 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70   */.  CollSeq *p
08f0: 43 6f 6c 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20  Coll;.  sqlite3 
0900: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
0910: 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69  ;.  zColl = sqli
0920: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
0930: 28 64 62 2c 20 70 43 6f 6c 6c 4e 61 6d 65 29 3b  (db, pCollName);
0940: 0a 20 20 69 66 28 20 70 45 78 70 72 20 26 26 20  .  if( pExpr && 
0950: 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 70 43 6f  zColl ){.    pCo
0960: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ll = sqlite3Loca
0970: 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
0980: 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 29 3b 0a 20 20  , zColl, -1);.  
0990: 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
09a0: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c       pExpr->pCol
09b0: 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  l = pColl;.     
09c0: 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 7c 3d   pExpr->flags |=
09d0: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a   EP_ExpCollate;.
09e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
09f0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43  te3DbFree(db, zC
0a00: 6f 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  oll);.  return p
0a10: 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Expr;.}../*.** R
0a20: 65 74 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c  eturn the defaul
0a30: 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  t collation sequ
0a40: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78 70  ence for the exp
0a50: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49  ression pExpr. I
0a60: 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f  f.** there is no
0a70: 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69   default collati
0a80: 6f 6e 20 74 79 70 65 2c 20 72 65 74 75 72 6e 20  on type, return 
0a90: 30 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73  0..*/.CollSeq *s
0aa0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
0ab0: 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
0ac0: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
0ad0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
0ae0: 3d 20 30 3b 0a 20 20 45 78 70 72 20 2a 70 20 3d  = 0;.  Expr *p =
0af0: 20 70 45 78 70 72 3b 0a 20 20 77 68 69 6c 65 28   pExpr;.  while(
0b00: 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70   p ){.    int op
0b10: 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 2d  ;.    pColl = p-
0b20: 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 66 28 20  >pColl;.    if( 
0b30: 70 43 6f 6c 6c 20 29 20 62 72 65 61 6b 3b 0a 20  pColl ) break;. 
0b40: 20 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20     op = p->op;. 
0b50: 20 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 43     if( (op==TK_C
0b60: 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  OLUMN || op==TK_
0b70: 52 45 47 49 53 54 45 52 29 20 26 26 20 70 2d 3e  REGISTER) && p->
0b80: 70 54 61 62 21 3d 30 20 29 7b 0a 20 20 20 20 20  pTab!=0 ){.     
0b90: 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53   /* op==TK_REGIS
0ba0: 54 45 52 20 26 26 20 70 2d 3e 70 54 61 62 21 3d  TER && p->pTab!=
0bb0: 30 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 70  0 happens when p
0bc0: 45 78 70 72 20 77 61 73 20 6f 72 69 67 69 6e 61  Expr was origina
0bd0: 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 61 20 54  lly.      ** a T
0be0: 4b 5f 43 4f 4c 55 4d 4e 20 62 75 74 20 77 61 73  K_COLUMN but was
0bf0: 20 70 72 65 76 69 6f 75 73 6c 79 20 65 76 61 6c   previously eval
0c00: 75 61 74 65 64 20 61 6e 64 20 63 61 63 68 65 64  uated and cached
0c10: 20 69 6e 20 61 20 72 65 67 69 73 74 65 72 20 2a   in a register *
0c20: 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  /.      const ch
0c30: 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  ar *zColl;.     
0c40: 20 69 6e 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c   int j = p->iCol
0c50: 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  umn;.      if( j
0c60: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  >=0 ){.        s
0c70: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
0c80: 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20  rse->db;.       
0c90: 20 7a 43 6f 6c 6c 20 3d 20 70 2d 3e 70 54 61 62   zColl = p->pTab
0ca0: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b  ->aCol[j].zColl;
0cb0: 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
0cc0: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
0cd0: 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c  Seq(db, ENC(db),
0ce0: 20 7a 43 6f 6c 6c 2c 20 2d 31 2c 20 30 29 3b 0a   zColl, -1, 0);.
0cf0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
0d00: 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20  Coll = pColl;.  
0d10: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
0d20: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
0d30: 20 6f 70 21 3d 54 4b 5f 43 41 53 54 20 26 26 20   op!=TK_CAST && 
0d40: 6f 70 21 3d 54 4b 5f 55 50 4c 55 53 20 29 7b 0a  op!=TK_UPLUS ){.
0d50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
0d60: 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c   }.    p = p->pL
0d70: 65 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  eft;.  }.  if( s
0d80: 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53  qlite3CheckCollS
0d90: 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c  eq(pParse, pColl
0da0: 29 20 29 7b 20 0a 20 20 20 20 70 43 6f 6c 6c 20  ) ){ .    pColl 
0db0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
0dc0: 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pColl;.}../*.*
0dd0: 2a 20 70 45 78 70 72 20 69 73 20 61 6e 20 6f 70  * pExpr is an op
0de0: 65 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61  erand of a compa
0df0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20  rison operator. 
0e00: 20 61 66 66 32 20 69 73 20 74 68 65 0a 2a 2a 20   aff2 is the.** 
0e10: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66  type affinity of
0e20: 20 74 68 65 20 6f 74 68 65 72 20 6f 70 65 72 61   the other opera
0e30: 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  nd.  This routin
0e40: 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a  e returns the.**
0e50: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74   type affinity t
0e60: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
0e70: 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 61  ed for the compa
0e80: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a  rison operator..
0e90: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 43  */.char sqlite3C
0ea0: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 45  ompareAffinity(E
0eb0: 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72  xpr *pExpr, char
0ec0: 20 61 66 66 32 29 7b 0a 20 20 63 68 61 72 20 61   aff2){.  char a
0ed0: 66 66 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ff1 = sqlite3Exp
0ee0: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  rAffinity(pExpr)
0ef0: 3b 0a 20 20 69 66 28 20 61 66 66 31 20 26 26 20  ;.  if( aff1 && 
0f00: 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 42  aff2 ){.    /* B
0f10: 6f 74 68 20 73 69 64 65 73 20 6f 66 20 74 68 65  oth sides of the
0f20: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65 20   comparison are 
0f30: 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e 65 20  columns. If one 
0f40: 68 61 73 20 6e 75 6d 65 72 69 63 0a 20 20 20 20  has numeric.    
0f50: 2a 2a 20 61 66 66 69 6e 69 74 79 2c 20 75 73 65  ** affinity, use
0f60: 20 74 68 61 74 2e 20 4f 74 68 65 72 77 69 73 65   that. Otherwise
0f70: 20 75 73 65 20 6e 6f 20 61 66 66 69 6e 69 74 79   use no affinity
0f80: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
0f90: 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69   sqlite3IsNumeri
0fa0: 63 41 66 66 69 6e 69 74 79 28 61 66 66 31 29 20  cAffinity(aff1) 
0fb0: 7c 7c 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65  || sqlite3IsNume
0fc0: 72 69 63 41 66 66 69 6e 69 74 79 28 61 66 66 32  ricAffinity(aff2
0fd0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
0fe0: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  n SQLITE_AFF_NUM
0ff0: 45 52 49 43 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ERIC;.    }else{
1000: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1010: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
1020: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
1030: 20 21 61 66 66 31 20 26 26 20 21 61 66 66 32 20   !aff1 && !aff2 
1040: 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 69 74 68 65  ){.    /* Neithe
1050: 72 20 73 69 64 65 20 6f 66 20 74 68 65 20 63 6f  r side of the co
1060: 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20 63 6f  mparison is a co
1070: 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61 72 65 20 74  lumn.  Compare t
1080: 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74  he.    ** result
1090: 73 20 64 69 72 65 63 74 6c 79 2e 0a 20 20 20 20  s directly..    
10a0: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
10b0: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
10c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f   }else{.    /* O
10d0: 6e 65 20 73 69 64 65 20 69 73 20 61 20 63 6f 6c  ne side is a col
10e0: 75 6d 6e 2c 20 74 68 65 20 6f 74 68 65 72 20 69  umn, the other i
10f0: 73 20 6e 6f 74 2e 20 55 73 65 20 74 68 65 20 63  s not. Use the c
1100: 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 2e  olumns affinity.
1110: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1120: 61 66 66 31 3d 3d 30 20 7c 7c 20 61 66 66 32 3d  aff1==0 || aff2=
1130: 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
1140: 20 28 61 66 66 31 20 2b 20 61 66 66 32 29 3b 0a   (aff1 + aff2);.
1150: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78    }.}../*.** pEx
1160: 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73  pr is a comparis
1170: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 52 65  on operator.  Re
1180: 74 75 72 6e 20 74 68 65 20 74 79 70 65 20 61 66  turn the type af
1190: 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75  finity that shou
11a0: 6c 64 0a 2a 2a 20 62 65 20 61 70 70 6c 69 65 64  ld.** be applied
11b0: 20 74 6f 20 62 6f 74 68 20 6f 70 65 72 61 6e 64   to both operand
11c0: 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67  s prior to doing
11d0: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   the comparison.
11e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
11f0: 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69  comparisonAffini
1200: 74 79 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b  ty(Expr *pExpr){
1210: 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20 61  .  char aff;.  a
1220: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
1230: 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72  ==TK_EQ || pExpr
1240: 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 70  ->op==TK_IN || p
1250: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20  Expr->op==TK_LT 
1260: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  ||.          pEx
1270: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c  pr->op==TK_GT ||
1280: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
1290: 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  E || pExpr->op==
12a0: 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20 20 20 20 20  TK_LE ||.       
12b0: 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b     pExpr->op==TK
12c0: 5f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _NE );.  assert(
12d0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b   pExpr->pLeft );
12e0: 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33  .  aff = sqlite3
12f0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78  ExprAffinity(pEx
1300: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66  pr->pLeft);.  if
1310: 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20  ( pExpr->pRight 
1320: 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c  ){.    aff = sql
1330: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
1340: 69 74 79 28 70 45 78 70 72 2d 3e 70 52 69 67 68  ity(pExpr->pRigh
1350: 74 2c 20 61 66 66 29 3b 0a 20 20 7d 0a 20 20 65  t, aff);.  }.  e
1360: 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 70  lse if( pExpr->p
1370: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 61 66  Select ){.    af
1380: 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  f = sqlite3Compa
1390: 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  reAffinity(pExpr
13a0: 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  ->pSelect->pELis
13b0: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61  t->a[0].pExpr, a
13c0: 66 66 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20  ff);.  }.  else 
13d0: 69 66 28 20 21 61 66 66 20 29 7b 0a 20 20 20 20  if( !aff ){.    
13e0: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
13f0: 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a 20 20 72 65 74  _NONE;.  }.  ret
1400: 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn aff;.}../*.*
1410: 2a 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d  * pExpr is a com
1420: 70 61 72 69 73 6f 6e 20 65 78 70 72 65 73 73 69  parison expressi
1430: 6f 6e 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27  on, eg. '=', '<'
1440: 2c 20 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a  , IN(...) etc..*
1450: 2a 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20 69  * idx_affinity i
1460: 73 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f  s the affinity o
1470: 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c  f an indexed col
1480: 75 6d 6e 2e 20 52 65 74 75 72 6e 20 74 72 75 65  umn. Return true
1490: 0a 2a 2a 20 69 66 20 74 68 65 20 69 6e 64 65 78  .** if the index
14a0: 20 77 69 74 68 20 61 66 66 69 6e 69 74 79 20 69   with affinity i
14b0: 64 78 5f 61 66 66 69 6e 69 74 79 20 6d 61 79 20  dx_affinity may 
14c0: 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  be used to imple
14d0: 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70  ment.** the comp
14e0: 61 72 69 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e  arison in pExpr.
14f0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
1500: 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 45  ndexAffinityOk(E
1510: 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72  xpr *pExpr, char
1520: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a   idx_affinity){.
1530: 20 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f 6d    char aff = com
1540: 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28  parisonAffinity(
1550: 70 45 78 70 72 29 3b 0a 20 20 73 77 69 74 63 68  pExpr);.  switch
1560: 28 20 61 66 66 20 29 7b 0a 20 20 20 20 63 61 73  ( aff ){.    cas
1570: 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  e SQLITE_AFF_NON
1580: 45 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  E:.      return 
1590: 31 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  1;.    case SQLI
15a0: 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20  TE_AFF_TEXT:.   
15b0: 20 20 20 72 65 74 75 72 6e 20 69 64 78 5f 61 66     return idx_af
15c0: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
15d0: 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 64 65 66  FF_TEXT;.    def
15e0: 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75  ault:.      retu
15f0: 72 6e 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65  rn sqlite3IsNume
1600: 72 69 63 41 66 66 69 6e 69 74 79 28 69 64 78 5f  ricAffinity(idx_
1610: 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d 0a 7d  affinity);.  }.}
1620: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1630: 68 65 20 50 35 20 76 61 6c 75 65 20 74 68 61 74  he P5 value that
1640: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
1650: 66 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f 6d  for a binary com
1660: 70 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64  parison.** opcod
1670: 65 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20  e (OP_Eq, OP_Ge 
1680: 65 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63 6f  etc.) used to co
1690: 6d 70 61 72 65 20 70 45 78 70 72 31 20 61 6e 64  mpare pExpr1 and
16a0: 20 70 45 78 70 72 32 2e 0a 2a 2f 0a 73 74 61 74   pExpr2..*/.stat
16b0: 69 63 20 75 38 20 62 69 6e 61 72 79 43 6f 6d 70  ic u8 binaryComp
16c0: 61 72 65 50 35 28 45 78 70 72 20 2a 70 45 78 70  areP5(Expr *pExp
16d0: 72 31 2c 20 45 78 70 72 20 2a 70 45 78 70 72 32  r1, Expr *pExpr2
16e0: 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
16f0: 29 7b 0a 20 20 75 38 20 61 66 66 20 3d 20 28 63  ){.  u8 aff = (c
1700: 68 61 72 29 73 71 6c 69 74 65 33 45 78 70 72 41  har)sqlite3ExprA
1710: 66 66 69 6e 69 74 79 28 70 45 78 70 72 32 29 3b  ffinity(pExpr2);
1720: 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33  .  aff = sqlite3
1730: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
1740: 70 45 78 70 72 31 2c 20 61 66 66 29 20 7c 20 6a  pExpr1, aff) | j
1750: 75 6d 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74  umpIfNull;.  ret
1760: 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn aff;.}../*.*
1770: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
1780: 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74  er to the collat
1790: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61  ion sequence tha
17a0: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
17b0: 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20   by.** a binary 
17c0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
17d0: 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c  tor comparing pL
17e0: 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a  eft and pRight..
17f0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66  **.** If the lef
1800: 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f  t hand expressio
1810: 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e  n has a collatin
1820: 67 20 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c  g sequence type,
1830: 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75   then it is.** u
1840: 73 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74  sed. Otherwise t
1850: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
1860: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69  uence for the ri
1870: 67 68 74 20 68 61 6e 64 20 65 78 70 72 65 73 73  ght hand express
1880: 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20  ion.** is used, 
1890: 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 28  or the default (
18a0: 42 49 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68  BINARY) if neith
18b0: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61  er expression ha
18c0: 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a  s a collating.**
18d0: 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67   type..**.** Arg
18e0: 75 6d 65 6e 74 20 70 52 69 67 68 74 20 28 62 75  ument pRight (bu
18f0: 74 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79  t not pLeft) may
1900: 20 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74   be a null point
1910: 65 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  er. In this case
1920: 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63  ,.** it is not c
1930: 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f  onsidered..*/.Co
1940: 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 42 69  llSeq *sqlite3Bi
1950: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
1960: 65 71 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  eq(.  Parse *pPa
1970: 72 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c  rse, .  Expr *pL
1980: 65 66 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52  eft, .  Expr *pR
1990: 69 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65  ight.){.  CollSe
19a0: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65  q *pColl;.  asse
19b0: 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69  rt( pLeft );.  i
19c0: 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20  f( pLeft->flags 
19d0: 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20  & EP_ExpCollate 
19e0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
19f0: 4c 65 66 74 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20  Left->pColl );. 
1a00: 20 20 20 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74     pColl = pLeft
1a10: 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 7d 65 6c 73 65  ->pColl;.  }else
1a20: 20 69 66 28 20 70 52 69 67 68 74 20 26 26 20 70   if( pRight && p
1a30: 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45  Right->flags & E
1a40: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a  P_ExpCollate ){.
1a50: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67      assert( pRig
1a60: 68 74 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20  ht->pColl );.   
1a70: 20 70 43 6f 6c 6c 20 3d 20 70 52 69 67 68 74 2d   pColl = pRight-
1a80: 3e 70 43 6f 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b  >pColl;.  }else{
1a90: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
1aa0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
1ab0: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a  pParse, pLeft);.
1ac0: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
1ad0: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  {.      pColl = 
1ae0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1af0: 65 71 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  eq(pParse, pRigh
1b00: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
1b10: 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a  return pColl;.}.
1b20: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1b30: 74 68 65 20 6f 70 65 72 61 6e 64 73 20 66 6f 72  the operands for
1b40: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
1b50: 65 72 61 74 69 6f 6e 2e 20 20 42 65 66 6f 72 65  eration.  Before
1b60: 0a 2a 2a 20 67 65 6e 65 72 61 74 69 6e 67 20 74  .** generating t
1b70: 68 65 20 63 6f 64 65 20 66 6f 72 20 65 61 63 68  he code for each
1b80: 20 6f 70 65 72 61 6e 64 2c 20 73 65 74 20 74 68   operand, set th
1b90: 65 20 45 50 5f 41 6e 79 41 66 66 0a 2a 2a 20 66  e EP_AnyAff.** f
1ba0: 6c 61 67 20 6f 6e 20 74 68 65 20 65 78 70 72 65  lag on the expre
1bb0: 73 73 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 74  ssion so that it
1bc0: 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f   will be able to
1bd0: 20 75 73 65 64 20 61 0a 2a 2a 20 63 61 63 68 65   used a.** cache
1be0: 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 74  d column value t
1bf0: 68 61 74 20 68 61 73 20 70 72 65 76 69 6f 75 73  hat has previous
1c00: 6c 79 20 75 6e 64 65 72 67 6f 6e 65 20 61 6e 0a  ly undergone an.
1c10: 2a 2a 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e  ** affinity chan
1c20: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
1c30: 69 64 20 63 6f 64 65 43 6f 6d 70 61 72 65 4f 70  id codeCompareOp
1c40: 65 72 61 6e 64 73 28 0a 20 20 50 61 72 73 65 20  erands(.  Parse 
1c50: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
1c60: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
1c70: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
1c80: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  xt */.  Expr *pL
1c90: 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  eft,      /* The
1ca0: 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   left operand */
1cb0: 0a 20 20 69 6e 74 20 2a 70 52 65 67 4c 65 66 74  .  int *pRegLeft
1cc0: 2c 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72  ,    /* Register
1cd0: 20 77 68 65 72 65 20 6c 65 66 74 20 6f 70 65 72   where left oper
1ce0: 61 6e 64 20 69 73 20 73 74 6f 72 65 64 20 2a 2f  and is stored */
1cf0: 0a 20 20 69 6e 74 20 2a 70 46 72 65 65 4c 65 66  .  int *pFreeLef
1d00: 74 2c 20 20 20 2f 2a 20 46 72 65 65 20 74 68 69  t,   /* Free thi
1d10: 73 20 72 65 67 69 73 74 65 72 20 77 68 65 6e 20  s register when 
1d20: 64 6f 6e 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  done */.  Expr *
1d30: 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20 54  pRight,     /* T
1d40: 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
1d50: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 52   */.  int *pRegR
1d60: 69 67 68 74 2c 20 20 20 2f 2a 20 52 65 67 69 73  ight,   /* Regis
1d70: 74 65 72 20 77 68 65 72 65 20 72 69 67 68 74 20  ter where right 
1d80: 6f 70 65 72 61 6e 64 20 69 73 20 73 74 6f 72 65  operand is store
1d90: 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 46 72 65  d */.  int *pFre
1da0: 65 52 69 67 68 74 20 20 20 2f 2a 20 57 72 69 74  eRight   /* Writ
1db0: 65 20 74 65 6d 70 20 72 65 67 69 73 74 65 72 20  e temp register 
1dc0: 66 6f 72 20 72 69 67 68 74 20 6f 70 65 72 61 6e  for right operan
1dd0: 64 20 74 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  d there */.){.  
1de0: 77 68 69 6c 65 28 20 70 4c 65 66 74 2d 3e 6f 70  while( pLeft->op
1df0: 3d 3d 54 4b 5f 55 50 4c 55 53 20 29 20 70 4c 65  ==TK_UPLUS ) pLe
1e00: 66 74 20 3d 20 70 4c 65 66 74 2d 3e 70 4c 65 66  ft = pLeft->pLef
1e10: 74 3b 0a 20 20 70 4c 65 66 74 2d 3e 66 6c 61 67  t;.  pLeft->flag
1e20: 73 20 7c 3d 20 45 50 5f 41 6e 79 41 66 66 3b 0a  s |= EP_AnyAff;.
1e30: 20 20 2a 70 52 65 67 4c 65 66 74 20 3d 20 73 71    *pRegLeft = sq
1e40: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1e50: 70 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  p(pParse, pLeft,
1e60: 20 70 46 72 65 65 4c 65 66 74 29 3b 0a 20 20 77   pFreeLeft);.  w
1e70: 68 69 6c 65 28 20 70 52 69 67 68 74 2d 3e 6f 70  hile( pRight->op
1e80: 3d 3d 54 4b 5f 55 50 4c 55 53 20 29 20 70 52 69  ==TK_UPLUS ) pRi
1e90: 67 68 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 4c  ght = pRight->pL
1ea0: 65 66 74 3b 0a 20 20 70 52 69 67 68 74 2d 3e 66  eft;.  pRight->f
1eb0: 6c 61 67 73 20 7c 3d 20 45 50 5f 41 6e 79 41 66  lags |= EP_AnyAf
1ec0: 66 3b 0a 20 20 2a 70 52 65 67 52 69 67 68 74 20  f;.  *pRegRight 
1ed0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1ee0: 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 52  eTemp(pParse, pR
1ef0: 69 67 68 74 2c 20 70 46 72 65 65 52 69 67 68 74  ight, pFreeRight
1f00: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
1f10: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
1f20: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
1f30: 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tor..*/.static i
1f40: 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 0a  nt codeCompare(.
1f50: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1f60: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
1f70: 6e 67 20 28 61 6e 64 20 63 6f 64 65 20 67 65 6e  ng (and code gen
1f80: 65 72 61 74 69 6e 67 29 20 63 6f 6e 74 65 78 74  erating) context
1f90: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
1fa0: 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c  t,      /* The l
1fb0: 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  eft operand */. 
1fc0: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20   Expr *pRight,  
1fd0: 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20     /* The right 
1fe0: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
1ff0: 20 6f 70 63 6f 64 65 2c 20 20 20 20 20 20 20 2f   opcode,       /
2000: 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  * The comparison
2010: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74   opcode */.  int
2020: 20 69 6e 31 2c 20 69 6e 74 20 69 6e 32 2c 20 2f   in1, int in2, /
2030: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
2040: 6e 67 20 6f 70 65 72 61 6e 64 73 20 2a 2f 0a 20  ng operands */. 
2050: 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20   int dest,      
2060: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
2070: 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20 69  if true.  */.  i
2080: 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20  nt jumpIfNull   
2090: 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a 75 6d   /* If true, jum
20a0: 70 20 69 66 20 65 69 74 68 65 72 20 6f 70 65 72  p if either oper
20b0: 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29  and is NULL */.)
20c0: 7b 0a 20 20 69 6e 74 20 70 35 3b 0a 20 20 69 6e  {.  int p5;.  in
20d0: 74 20 61 64 64 72 3b 0a 20 20 43 6f 6c 6c 53 65  t addr;.  CollSe
20e0: 71 20 2a 70 34 3b 0a 0a 20 20 70 34 20 3d 20 73  q *p4;..  p4 = s
20f0: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
2100: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
2110: 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
2120: 29 3b 0a 20 20 70 35 20 3d 20 62 69 6e 61 72 79  );.  p5 = binary
2130: 43 6f 6d 70 61 72 65 50 35 28 70 4c 65 66 74 2c  CompareP5(pLeft,
2140: 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49 66 4e   pRight, jumpIfN
2150: 75 6c 6c 29 3b 0a 20 20 61 64 64 72 20 3d 20 73  ull);.  addr = s
2160: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2170: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
2180: 6f 70 63 6f 64 65 2c 20 69 6e 32 2c 20 64 65 73  opcode, in2, des
2190: 74 2c 20 69 6e 31 2c 0a 20 20 20 20 20 20 20 20  t, in1,.        
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b0: 20 20 20 28 76 6f 69 64 2a 29 70 34 2c 20 50 34     (void*)p4, P4
21c0: 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 73 71 6c  _COLLSEQ);.  sql
21d0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
21e0: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
21f0: 70 35 29 3b 0a 20 20 69 66 28 20 28 70 35 20 26  p5);.  if( (p5 &
2200: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b   SQLITE_AFF_MASK
2210: 29 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  )!=SQLITE_AFF_NO
2220: 4e 45 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  NE ){.    sqlite
2230: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
2240: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
2250: 20 69 6e 31 2c 20 31 29 3b 0a 20 20 20 20 73 71   in1, 1);.    sq
2260: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
2270: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
2280: 72 73 65 2c 20 69 6e 32 2c 20 31 29 3b 0a 20 20  rse, in2, 1);.  
2290: 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  }.  return addr;
22a0: 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  .}..#if SQLITE_M
22b0: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a  AX_EXPR_DEPTH>0.
22c0: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74  /*.** Check that
22d0: 20 61 72 67 75 6d 65 6e 74 20 6e 48 65 69 67 68   argument nHeigh
22e0: 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  t is less than o
22f0: 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d  r equal to the m
2300: 61 78 69 6d 75 6d 0a 2a 2a 20 65 78 70 72 65 73  aximum.** expres
2310: 73 69 6f 6e 20 64 65 70 74 68 20 61 6c 6c 6f 77  sion depth allow
2320: 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74  ed. If it is not
2330: 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
2340: 20 6d 65 73 73 61 67 65 20 69 6e 0a 2a 2a 20 70   message in.** p
2350: 50 61 72 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  Parse..*/.int sq
2360: 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 48 65  lite3ExprCheckHe
2370: 69 67 68 74 28 50 61 72 73 65 20 2a 70 50 61 72  ight(Parse *pPar
2380: 73 65 2c 20 69 6e 74 20 6e 48 65 69 67 68 74 29  se, int nHeight)
2390: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
23a0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6d 78  ITE_OK;.  int mx
23b0: 48 65 69 67 68 74 20 3d 20 70 50 61 72 73 65 2d  Height = pParse-
23c0: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
23d0: 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45  TE_LIMIT_EXPR_DE
23e0: 50 54 48 5d 3b 0a 20 20 69 66 28 20 6e 48 65 69  PTH];.  if( nHei
23f0: 67 68 74 3e 6d 78 48 65 69 67 68 74 20 29 7b 0a  ght>mxHeight ){.
2400: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
2410: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
2420: 20 20 20 20 22 45 78 70 72 65 73 73 69 6f 6e 20      "Expression 
2430: 74 72 65 65 20 69 73 20 74 6f 6f 20 6c 61 72 67  tree is too larg
2440: 65 20 28 6d 61 78 69 6d 75 6d 20 64 65 70 74 68  e (maximum depth
2450: 20 25 64 29 22 2c 20 6d 78 48 65 69 67 68 74 0a   %d)", mxHeight.
2460: 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20      );.    rc = 
2470: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
2480: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2490: 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ../* The followi
24a0: 6e 67 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f  ng three functio
24b0: 6e 73 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72  ns, heightOfExpr
24c0: 28 29 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72  (), heightOfExpr
24d0: 4c 69 73 74 28 29 0a 2a 2a 20 61 6e 64 20 68 65  List().** and he
24e0: 69 67 68 74 4f 66 53 65 6c 65 63 74 28 29 2c 20  ightOfSelect(), 
24f0: 61 72 65 20 75 73 65 64 20 74 6f 20 64 65 74 65  are used to dete
2500: 72 6d 69 6e 65 20 74 68 65 20 6d 61 78 69 6d 75  rmine the maximu
2510: 6d 20 68 65 69 67 68 74 0a 2a 2a 20 6f 66 20 61  m height.** of a
2520: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  ny expression tr
2530: 65 65 20 72 65 66 65 72 65 6e 63 65 64 20 62 79  ee referenced by
2540: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70   the structure p
2550: 61 73 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20  assed as the.** 
2560: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
2570: 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 61  **.** If this ma
2580: 78 69 6d 75 6d 20 68 65 69 67 68 74 20 69 73 20  ximum height is 
2590: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
25a0: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 70   current value p
25b0: 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20  ointed.** to by 
25c0: 70 6e 48 65 69 67 68 74 2c 20 74 68 65 20 73 65  pnHeight, the se
25d0: 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 2c 20  cond parameter, 
25e0: 74 68 65 6e 20 73 65 74 20 2a 70 6e 48 65 69 67  then set *pnHeig
25f0: 68 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 76 61  ht to that.** va
2600: 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  lue..*/.static v
2610: 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72  oid heightOfExpr
2620: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70  (Expr *p, int *p
2630: 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20  nHeight){.  if( 
2640: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  p ){.    if( p->
2650: 6e 48 65 69 67 68 74 3e 2a 70 6e 48 65 69 67 68  nHeight>*pnHeigh
2660: 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e 48 65  t ){.      *pnHe
2670: 69 67 68 74 20 3d 20 70 2d 3e 6e 48 65 69 67 68  ight = p->nHeigh
2680: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73  t;.    }.  }.}.s
2690: 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68  tatic void heigh
26a0: 74 4f 66 45 78 70 72 4c 69 73 74 28 45 78 70 72  tOfExprList(Expr
26b0: 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e  List *p, int *pn
26c0: 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70  Height){.  if( p
26d0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
26e0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
26f0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
2700: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
2710: 28 70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  (p->a[i].pExpr, 
2720: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 7d  pnHeight);.    }
2730: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
2740: 69 64 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63  id heightOfSelec
2750: 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  t(Select *p, int
2760: 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69   *pnHeight){.  i
2770: 66 28 20 70 20 29 7b 0a 20 20 20 20 68 65 69 67  f( p ){.    heig
2780: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 57 68 65  htOfExpr(p->pWhe
2790: 72 65 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  re, pnHeight);. 
27a0: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28     heightOfExpr(
27b0: 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70 6e 48 65  p->pHaving, pnHe
27c0: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
27d0: 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 69 6d 69  tOfExpr(p->pLimi
27e0: 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  t, pnHeight);.  
27f0: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
2800: 2d 3e 70 4f 66 66 73 65 74 2c 20 70 6e 48 65 69  ->pOffset, pnHei
2810: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
2820: 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45  OfExprList(p->pE
2830: 4c 69 73 74 2c 20 70 6e 48 65 69 67 68 74 29 3b  List, pnHeight);
2840: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
2850: 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42  rList(p->pGroupB
2860: 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  y, pnHeight);.  
2870: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69    heightOfExprLi
2880: 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  st(p->pOrderBy, 
2890: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
28a0: 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d  eightOfSelect(p-
28b0: 3e 70 50 72 69 6f 72 2c 20 70 6e 48 65 69 67 68  >pPrior, pnHeigh
28c0: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
28d0: 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48   Set the Expr.nH
28e0: 65 69 67 68 74 20 76 61 72 69 61 62 6c 65 20 69  eight variable i
28f0: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  n the structure 
2900: 70 61 73 73 65 64 20 61 73 20 61 6e 20 0a 2a 2a  passed as an .**
2910: 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20 65 78   argument. An ex
2920: 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20 6e 6f  pression with no
2930: 20 63 68 69 6c 64 72 65 6e 2c 20 45 78 70 72 2e   children, Expr.
2940: 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45 78 70  pList or .** Exp
2950: 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62 65 72  r.pSelect member
2960: 20 68 61 73 20 61 20 68 65 69 67 68 74 20 6f 66   has a height of
2970: 20 31 2e 20 41 6e 79 20 6f 74 68 65 72 20 65 78   1. Any other ex
2980: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61 73 20  pression.** has 
2990: 61 20 68 65 69 67 68 74 20 65 71 75 61 6c 20 74  a height equal t
29a0: 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65  o the maximum he
29b0: 69 67 68 74 20 6f 66 20 61 6e 79 20 6f 74 68 65  ight of any othe
29c0: 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 64  r .** referenced
29d0: 20 45 78 70 72 20 70 6c 75 73 20 6f 6e 65 2e 0a   Expr plus one..
29e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
29f0: 78 70 72 53 65 74 48 65 69 67 68 74 28 45 78 70  xprSetHeight(Exp
2a00: 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65  r *p){.  int nHe
2a10: 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67  ight = 0;.  heig
2a20: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65 66  htOfExpr(p->pLef
2a30: 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20  t, &nHeight);.  
2a40: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
2a50: 70 52 69 67 68 74 2c 20 26 6e 48 65 69 67 68 74  pRight, &nHeight
2a60: 29 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70  );.  heightOfExp
2a70: 72 4c 69 73 74 28 70 2d 3e 70 4c 69 73 74 2c 20  rList(p->pList, 
2a80: 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 68 65 69  &nHeight);.  hei
2a90: 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 70  ghtOfSelect(p->p
2aa0: 53 65 6c 65 63 74 2c 20 26 6e 48 65 69 67 68 74  Select, &nHeight
2ab0: 29 3b 0a 20 20 70 2d 3e 6e 48 65 69 67 68 74 20  );.  p->nHeight 
2ac0: 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b 0a 7d  = nHeight + 1;.}
2ad0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
2ae0: 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72  Expr.nHeight var
2af0: 69 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65 20  iable using the 
2b00: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 29 20  exprSetHeight() 
2b10: 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20  function. If.** 
2b20: 74 68 65 20 68 65 69 67 68 74 20 69 73 20 67 72  the height is gr
2b30: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6d  eater than the m
2b40: 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 65  aximum allowed e
2b50: 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68 2c  xpression depth,
2b60: 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72  .** leave an err
2b70: 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f  or in pParse..*/
2b80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
2b90: 72 53 65 74 48 65 69 67 68 74 28 50 61 72 73 65  rSetHeight(Parse
2ba0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
2bb0: 70 29 7b 0a 20 20 65 78 70 72 53 65 74 48 65 69  p){.  exprSetHei
2bc0: 67 68 74 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ght(p);.  sqlite
2bd0: 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74  3ExprCheckHeight
2be0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69  (pParse, p->nHei
2bf0: 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ght);.}../*.** R
2c00: 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75  eturn the maximu
2c10: 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20  m height of any 
2c20: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
2c30: 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79  referenced.** by
2c40: 20 74 68 65 20 73 65 6c 65 63 74 20 73 74 61 74   the select stat
2c50: 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20  ement passed as 
2c60: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  an argument..*/.
2c70: 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
2c80: 74 45 78 70 72 48 65 69 67 68 74 28 53 65 6c 65  tExprHeight(Sele
2c90: 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48  ct *p){.  int nH
2ca0: 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69  eight = 0;.  hei
2cb0: 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2c 20 26  ghtOfSelect(p, &
2cc0: 6e 48 65 69 67 68 74 29 3b 0a 20 20 72 65 74 75  nHeight);.  retu
2cd0: 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65  rn nHeight;.}.#e
2ce0: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 65 78  lse.  #define ex
2cf0: 70 72 53 65 74 48 65 69 67 68 74 28 79 29 0a 23  prSetHeight(y).#
2d00: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2d10: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30  MAX_EXPR_DEPTH>0
2d20: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74   */../*.** Const
2d30: 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65  ruct a new expre
2d40: 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20 72  ssion node and r
2d50: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
2d60: 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a  to it.  Memory.*
2d70: 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65 20  * for this node 
2d80: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
2d90: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
2da0: 29 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  ).  The calling 
2db0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72  function.** is r
2dc0: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d  esponsible for m
2dd0: 61 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e  aking sure the n
2de0: 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67  ode eventually g
2df0: 65 74 73 20 66 72 65 65 64 2e 0a 2a 2f 0a 45 78  ets freed..*/.Ex
2e00: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28  pr *sqlite3Expr(
2e10: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
2e20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
2e30: 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ndle for sqlite3
2e40: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28  DbMallocZero() (
2e50: 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a  may be null) */.
2e60: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
2e70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
2e80: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
2e90: 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  /.  Expr *pLeft,
2ea0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2eb0: 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  eft operand */. 
2ec0: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20   Expr *pRight,  
2ed0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68           /* Righ
2ee0: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63  t operand */.  c
2ef0: 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  onst Token *pTok
2f00: 65 6e 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65  en     /* Argume
2f10: 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a 20  nt token */.){. 
2f20: 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 70   Expr *pNew;.  p
2f30: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
2f40: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
2f50: 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 69  zeof(Expr));.  i
2f60: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
2f70: 20 20 2f 2a 20 57 68 65 6e 20 6d 61 6c 6c 6f 63    /* When malloc
2f80: 20 66 61 69 6c 73 2c 20 64 65 6c 65 74 65 20 70   fails, delete p
2f90: 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e  Left and pRight.
2fa0: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 70 61 73   Expressions pas
2fb0: 73 65 64 20 74 6f 20 0a 20 20 20 20 2a 2a 20 74  sed to .    ** t
2fc0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  his function mus
2fd0: 74 20 61 6c 77 61 79 73 20 62 65 20 61 6c 6c 6f  t always be allo
2fe0: 63 61 74 65 64 20 77 69 74 68 20 73 71 6c 69 74  cated with sqlit
2ff0: 65 33 45 78 70 72 28 29 20 66 6f 72 20 74 68 69  e3Expr() for thi
3000: 73 20 0a 20 20 20 20 2a 2a 20 72 65 61 73 6f 6e  s .    ** reason
3010: 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  . .    */.    sq
3020: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
3030: 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20  db, pLeft);.    
3040: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
3050: 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20  e(db, pRight);. 
3060: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
3070: 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 6f 70  .  pNew->op = op
3080: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20  ;.  pNew->pLeft 
3090: 3d 20 70 4c 65 66 74 3b 0a 20 20 70 4e 65 77 2d  = pLeft;.  pNew-
30a0: 3e 70 52 69 67 68 74 20 3d 20 70 52 69 67 68 74  >pRight = pRight
30b0: 3b 0a 20 20 70 4e 65 77 2d 3e 69 41 67 67 20 3d  ;.  pNew->iAgg =
30c0: 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 73 70 61   -1;.  pNew->spa
30d0: 6e 2e 7a 20 3d 20 28 75 38 2a 29 22 22 3b 0a 20  n.z = (u8*)"";. 
30e0: 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20   if( pToken ){. 
30f0: 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65     assert( pToke
3100: 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20 20  n->dyn==0 );.   
3110: 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 70 4e   pNew->span = pN
3120: 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f  ew->token = *pTo
3130: 6b 65 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ken;.  }else if(
3140: 20 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 69 66   pLeft ){.    if
3150: 28 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( pRight ){.    
3160: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 73 70    if( pRight->sp
3170: 61 6e 2e 64 79 6e 3d 3d 30 20 26 26 20 70 4c 65  an.dyn==0 && pLe
3180: 66 74 2d 3e 73 70 61 6e 2e 64 79 6e 3d 3d 30 20  ft->span.dyn==0 
3190: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
31a0: 65 33 45 78 70 72 53 70 61 6e 28 70 4e 65 77 2c  e3ExprSpan(pNew,
31b0: 20 26 70 4c 65 66 74 2d 3e 73 70 61 6e 2c 20 26   &pLeft->span, &
31c0: 70 52 69 67 68 74 2d 3e 73 70 61 6e 29 3b 0a 20  pRight->span);. 
31d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
31e0: 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26   pRight->flags &
31f0: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29   EP_ExpCollate )
3200: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
3210: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78 70 43  flags |= EP_ExpC
3220: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 20 20  ollate;.        
3230: 70 4e 65 77 2d 3e 70 43 6f 6c 6c 20 3d 20 70 52  pNew->pColl = pR
3240: 69 67 68 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20  ight->pColl;.   
3250: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
3260: 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20  f( pLeft->flags 
3270: 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20  & EP_ExpCollate 
3280: 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  ){.      pNew->f
3290: 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f  lags |= EP_ExpCo
32a0: 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 70 4e 65  llate;.      pNe
32b0: 77 2d 3e 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74  w->pColl = pLeft
32c0: 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20  ->pColl;.    }. 
32d0: 20 7d 0a 0a 20 20 65 78 70 72 53 65 74 48 65 69   }..  exprSetHei
32e0: 67 68 74 28 70 4e 65 77 29 3b 0a 20 20 72 65 74  ght(pNew);.  ret
32f0: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
3300: 2a 2a 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73 71  ** Works like sq
3310: 6c 69 74 65 33 45 78 70 72 28 29 20 65 78 63 65  lite3Expr() exce
3320: 70 74 20 74 68 61 74 20 69 74 20 74 61 6b 65 73  pt that it takes
3330: 20 61 6e 20 65 78 74 72 61 20 50 61 72 73 65 2a   an extra Parse*
3340: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 61 6e 64  .** argument and
3350: 20 6e 6f 74 69 66 69 65 73 20 74 68 65 20 61 73   notifies the as
3360: 73 6f 63 69 61 74 65 64 20 63 6f 6e 6e 65 63 74  sociated connect
3370: 69 6f 6e 20 6f 62 6a 65 63 74 20 69 66 20 6d 61  ion object if ma
3380: 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 45  lloc fails..*/.E
3390: 78 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70  xpr *sqlite3PExp
33a0: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
33b0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
33c0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
33d0: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
33e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33f0: 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64  Expression opcod
3400: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65  e */.  Expr *pLe
3410: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ft,            /
3420: 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a  * Left operand *
3430: 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  /.  Expr *pRight
3440: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ,           /* R
3450: 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  ight operand */.
3460: 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70    const Token *p
3470: 54 6f 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72 67  Token     /* Arg
3480: 75 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29  ument token */.)
3490: 7b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71  {.  Expr *p = sq
34a0: 6c 69 74 65 33 45 78 70 72 28 70 50 61 72 73 65  lite3Expr(pParse
34b0: 2d 3e 64 62 2c 20 6f 70 2c 20 70 4c 65 66 74 2c  ->db, op, pLeft,
34c0: 20 70 52 69 67 68 74 2c 20 70 54 6f 6b 65 6e 29   pRight, pToken)
34d0: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
34e0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
34f0: 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20  kHeight(pParse, 
3500: 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d  p->nHeight);.  }
3510: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
3520: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64 6f 69 6e 67  /*.** When doing
3530: 20 61 20 6e 65 73 74 65 64 20 70 61 72 73 65 2c   a nested parse,
3540: 20 79 6f 75 20 63 61 6e 20 69 6e 63 6c 75 64 65   you can include
3550: 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 65 78 70   terms in an exp
3560: 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 68 61 74 20  ression.** that 
3570: 6c 6f 6f 6b 20 6c 69 6b 65 20 74 68 69 73 3a 20  look like this: 
3580: 20 20 23 31 20 23 32 20 2e 2e 2e 20 20 54 68 65    #1 #2 ...  The
3590: 73 65 20 74 65 72 6d 73 20 72 65 66 65 72 20 74  se terms refer t
35a0: 6f 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 69  o registers.** i
35b0: 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  n the virtual ma
35c0: 63 68 69 6e 65 2e 20 20 23 4e 20 69 73 20 74 68  chine.  #N is th
35d0: 65 20 4e 2d 74 68 20 72 65 67 69 73 74 65 72 2e  e N-th register.
35e0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
35f0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
3600: 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 64   the parser to d
3610: 65 61 6c 20 77 69 74 68 20 6f 6e 20 6f 66 20 74  eal with on of t
3620: 68 6f 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 49  hose terms..** I
3630: 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 67 65  t immediately ge
3640: 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20  nerates code to 
3650: 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20  store the value 
3660: 69 6e 20 61 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  in a memory loca
3670: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 72 65 74  tion..** The ret
3680: 75 72 6e 73 20 61 6e 20 65 78 70 72 65 73 73 69  urns an expressi
3690: 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 63 6f 64  on that will cod
36a0: 65 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65  e to extract the
36b0: 20 76 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20 74   value from.** t
36c0: 68 61 74 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  hat memory locat
36d0: 69 6f 6e 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a  ion as needed..*
36e0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 52  /.Expr *sqlite3R
36f0: 65 67 69 73 74 65 72 45 78 70 72 28 50 61 72 73  egisterExpr(Pars
3700: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
3710: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 56 64 62   *pToken){.  Vdb
3720: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
3730: 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70 3b  Vdbe;.  Expr *p;
3740: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
3750: 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ested==0 ){.    
3760: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
3770: 70 50 61 72 73 65 2c 20 22 6e 65 61 72 20 5c 22  pParse, "near \"
3780: 25 54 5c 22 3a 20 73 79 6e 74 61 78 20 65 72 72  %T\": syntax err
3790: 6f 72 22 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20  or", pToken);.  
37a0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
37b0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
37c0: 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20 30 29 3b  _NULL, 0, 0, 0);
37d0: 0a 20 20 7d 0a 20 20 69 66 28 20 76 3d 3d 30 20  .  }.  if( v==0 
37e0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 20  ) return 0;.  p 
37f0: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
3800: 50 61 72 73 65 2c 20 54 4b 5f 52 45 47 49 53 54  Parse, TK_REGIST
3810: 45 52 2c 20 30 2c 20 30 2c 20 70 54 6f 6b 65 6e  ER, 0, 0, pToken
3820: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  );.  if( p==0 ){
3830: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
3840: 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61 69 6c 65 64  /* Malloc failed
3850: 20 2a 2f 0a 20 20 7d 0a 20 20 70 2d 3e 69 54 61   */.  }.  p->iTa
3860: 62 6c 65 20 3d 20 61 74 6f 69 28 28 63 68 61 72  ble = atoi((char
3870: 2a 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29  *)&pToken->z[1])
3880: 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ;.  return p;.}.
3890: 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f 20  ./*.** Join two 
38a0: 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73 69 6e  expressions usin
38b0: 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  g an AND operato
38c0: 72 2e 20 20 49 66 20 65 69 74 68 65 72 20 65 78  r.  If either ex
38d0: 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 4e  pression is.** N
38e0: 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74 20 72  ULL, then just r
38f0: 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65 72 20  eturn the other 
3900: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 45  expression..*/.E
3910: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
3920: 41 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  And(sqlite3 *db,
3930: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78   Expr *pLeft, Ex
3940: 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69  pr *pRight){.  i
3950: 66 28 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20  f( pLeft==0 ){. 
3960: 20 20 20 72 65 74 75 72 6e 20 70 52 69 67 68 74     return pRight
3970: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52  ;.  }else if( pR
3980: 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ight==0 ){.    r
3990: 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d  eturn pLeft;.  }
39a0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
39b0: 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
39c0: 20 54 4b 5f 41 4e 44 2c 20 70 4c 65 66 74 2c 20   TK_AND, pLeft, 
39d0: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 7d 0a  pRight, 0);.  }.
39e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
39f0: 20 45 78 70 72 2e 73 70 61 6e 20 66 69 65 6c 64   Expr.span field
3a00: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   of the given ex
3a10: 70 72 65 73 73 69 6f 6e 20 74 6f 20 73 70 61 6e  pression to span
3a20: 20 61 6c 6c 0a 2a 2a 20 74 65 78 74 20 62 65 74   all.** text bet
3a30: 77 65 65 6e 20 74 68 65 20 74 77 6f 20 67 69 76  ween the two giv
3a40: 65 6e 20 74 6f 6b 65 6e 73 2e 20 20 42 6f 74 68  en tokens.  Both
3a50: 20 74 6f 6b 65 6e 73 20 6d 75 73 74 20 62 65 20   tokens must be 
3a60: 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 61 74 20 74  pointing.** at t
3a70: 68 65 20 73 61 6d 65 20 73 74 72 69 6e 67 2e 0a  he same string..
3a80: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
3a90: 78 70 72 53 70 61 6e 28 45 78 70 72 20 2a 70 45  xprSpan(Expr *pE
3aa0: 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4c 65 66  xpr, Token *pLef
3ab0: 74 2c 20 54 6f 6b 65 6e 20 2a 70 52 69 67 68 74  t, Token *pRight
3ac0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 52 69  ){.  assert( pRi
3ad0: 67 68 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ght!=0 );.  asse
3ae0: 72 74 28 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a  rt( pLeft!=0 );.
3af0: 20 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20    if( pExpr ){. 
3b00: 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a     pExpr->span.z
3b10: 20 3d 20 70 4c 65 66 74 2d 3e 7a 3b 0a 20 20 20   = pLeft->z;.   
3b20: 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 20 3d   pExpr->span.n =
3b30: 20 70 52 69 67 68 74 2d 3e 6e 20 2b 20 28 70 52   pRight->n + (pR
3b40: 69 67 68 74 2d 3e 7a 20 2d 20 70 4c 65 66 74 2d  ight->z - pLeft-
3b50: 3e 7a 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  >z);.  }.}../*.*
3b60: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65  * Construct a ne
3b70: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  w expression nod
3b80: 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e  e for a function
3b90: 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a   with multiple.*
3ba0: 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a  * arguments..*/.
3bb0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
3bc0: 72 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20  rFunction(Parse 
3bd0: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73  *pParse, ExprLis
3be0: 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
3bf0: 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72  *pToken){.  Expr
3c00: 20 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74 65   *pNew;.  sqlite
3c10: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
3c20: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  db;.  assert( pT
3c30: 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20 3d  oken );.  pNew =
3c40: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
3c50: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
3c60: 45 78 70 72 29 20 29 3b 0a 20 20 69 66 28 20 70  Expr) );.  if( p
3c70: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  New==0 ){.    sq
3c80: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
3c90: 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 20  ete(db, pList); 
3ca0: 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67  /* Avoid leaking
3cb0: 20 6d 65 6d 6f 72 79 20 77 68 65 6e 20 6d 61 6c   memory when mal
3cc0: 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20  loc fails */.   
3cd0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
3ce0: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 46   pNew->op = TK_F
3cf0: 55 4e 43 54 49 4f 4e 3b 0a 20 20 70 4e 65 77 2d  UNCTION;.  pNew-
3d00: 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a  >pList = pList;.
3d10: 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e    assert( pToken
3d20: 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20 70 4e  ->dyn==0 );.  pN
3d30: 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f  ew->token = *pTo
3d40: 6b 65 6e 3b 0a 20 20 70 4e 65 77 2d 3e 73 70 61  ken;.  pNew->spa
3d50: 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 3b  n = pNew->token;
3d60: 0a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 53  ..  sqlite3ExprS
3d70: 65 74 48 65 69 67 68 74 28 70 50 61 72 73 65 2c  etHeight(pParse,
3d80: 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e   pNew);.  return
3d90: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
3da0: 41 73 73 69 67 6e 20 61 20 76 61 72 69 61 62 6c  Assign a variabl
3db0: 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20 65  e number to an e
3dc0: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 65  xpression that e
3dd0: 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63 61 72  ncodes a wildcar
3de0: 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69 67  d.** in the orig
3df0: 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  inal SQL stateme
3e00: 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64  nt.  .**.** Wild
3e10: 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69 6e 67  cards consisting
3e20: 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22 3f 22   of a single "?"
3e30: 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68   are assigned th
3e40: 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69 61  e next sequentia
3e50: 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e 75  l.** variable nu
3e60: 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64  mber..**.** Wild
3e70: 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72  cards of the for
3e80: 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73  m "?nnn" are ass
3e90: 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62 65 72  igned the number
3ea0: 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65   "nnn".  We make
3eb0: 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20 69  .** sure "nnn" i
3ec0: 73 20 6e 6f 74 20 74 6f 6f 20 62 65 20 74 6f 20  s not too be to 
3ed0: 61 76 6f 69 64 20 61 20 64 65 6e 69 61 6c 20 6f  avoid a denial o
3ee0: 66 20 73 65 72 76 69 63 65 20 61 74 74 61 63 6b  f service attack
3ef0: 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c   when.** the SQL
3f00: 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73   statement comes
3f10: 20 66 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61   from an externa
3f20: 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20  l source..**.** 
3f30: 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65  Wildcards of the
3f40: 20 66 6f 72 6d 20 22 3a 61 61 61 22 20 6f 72 20   form ":aaa" or 
3f50: 22 24 61 61 61 22 20 61 72 65 20 61 73 73 69 67  "$aaa" are assig
3f60: 6e 65 64 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ned the same num
3f70: 62 65 72 0a 2a 2a 20 61 73 20 74 68 65 20 70 72  ber.** as the pr
3f80: 65 76 69 6f 75 73 20 69 6e 73 74 61 6e 63 65 20  evious instance 
3f90: 6f 66 20 74 68 65 20 73 61 6d 65 20 77 69 6c 64  of the same wild
3fa0: 63 61 72 64 2e 20 20 4f 72 20 69 66 20 74 68 69  card.  Or if thi
3fb0: 73 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a  s is the first.*
3fc0: 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  * instance of th
3fd0: 65 20 77 69 6c 64 63 61 72 64 2c 20 74 68 65 20  e wildcard, the 
3fe0: 6e 65 78 74 20 73 65 71 75 65 6e 69 61 6c 20 76  next sequenial v
3ff0: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 69  ariable number i
4000: 73 0a 2a 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a  s.** assigned..*
4010: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
4020: 70 72 41 73 73 69 67 6e 56 61 72 4e 75 6d 62 65  prAssignVarNumbe
4030: 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
4040: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
4050: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 3b 0a   Token *pToken;.
4060: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
4070: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
4080: 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
4090: 74 75 72 6e 3b 0a 20 20 70 54 6f 6b 65 6e 20 3d  turn;.  pToken =
40a0: 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a   &pExpr->token;.
40b0: 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e    assert( pToken
40c0: 2d 3e 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65  ->n>=1 );.  asse
40d0: 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30  rt( pToken->z!=0
40e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
40f0: 6f 6b 65 6e 2d 3e 7a 5b 30 5d 21 3d 30 20 29 3b  oken->z[0]!=0 );
4100: 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e  .  if( pToken->n
4110: 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69  ==1 ){.    /* Wi
4120: 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f  ldcard of the fo
4130: 72 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20  rm "?".  Assign 
4140: 74 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c  the next variabl
4150: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  e number */.    
4160: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
4170: 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a  ++pParse->nVar;.
4180: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 6b    }else if( pTok
4190: 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b  en->z[0]=='?' ){
41a0: 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64  .    /* Wildcard
41b0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e   of the form "?n
41c0: 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e  nn".  Convert "n
41d0: 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  nn" to an intege
41e0: 72 20 61 6e 64 0a 20 20 20 20 2a 2a 20 75 73 65  r and.    ** use
41f0: 20 69 74 20 61 73 20 74 68 65 20 76 61 72 69 61   it as the varia
4200: 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ble number */.  
4210: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 45 78    int i;.    pEx
4220: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69 20 3d  pr->iTable = i =
4230: 20 61 74 6f 69 28 28 63 68 61 72 2a 29 26 70 54   atoi((char*)&pT
4240: 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20 20 20  oken->z[1]);.   
4250: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 30 20   testcase( i==0 
4260: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
4270: 20 69 3d 3d 31 20 29 3b 0a 20 20 20 20 74 65 73   i==1 );.    tes
4280: 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c  tcase( i==db->aL
4290: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
42a0: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
42b0: 52 5d 2d 31 20 29 3b 0a 20 20 20 20 74 65 73 74  R]-1 );.    test
42c0: 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69  case( i==db->aLi
42d0: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
42e0: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
42f0: 5d 20 29 3b 0a 20 20 20 20 69 66 28 20 69 3c 31  ] );.    if( i<1
4300: 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69 74   || i>db->aLimit
4310: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
4320: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29  RIABLE_NUMBER] )
4330: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
4340: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
4350: 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72  "variable number
4360: 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
4370: 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20   ?1 and ?%d",.  
4380: 20 20 20 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d          db->aLim
4390: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
43a0: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
43b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
43c0: 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72 20   i>pParse->nVar 
43d0: 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
43e0: 3e 6e 56 61 72 20 3d 20 69 3b 0a 20 20 20 20 7d  >nVar = i;.    }
43f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
4400: 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68   Wildcards of th
4410: 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 20 6f 72  e form ":aaa" or
4420: 20 22 24 61 61 61 22 2e 20 20 52 65 75 73 65 20   "$aaa".  Reuse 
4430: 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c  the same variabl
4440: 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20  e.    ** number 
4450: 61 73 20 74 68 65 20 70 72 69 6f 72 20 61 70 70  as the prior app
4460: 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65 20 73  earance of the s
4470: 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20  ame name, or if 
4480: 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 2a 2a 20  the name.    ** 
4490: 68 61 73 20 6e 65 76 65 72 20 61 70 70 65 61 72  has never appear
44a0: 65 64 20 62 65 66 6f 72 65 2c 20 72 65 75 73 65  ed before, reuse
44b0: 20 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62   the same variab
44c0: 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 2a 2f  le number.    */
44d0: 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  .    int i, n;. 
44e0: 20 20 20 6e 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e     n = pToken->n
44f0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
4500: 3c 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70  <pParse->nVarExp
4510: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45  r; i++){.      E
4520: 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 20 20 69  xpr *pE;.      i
4530: 66 28 20 28 70 45 20 3d 20 70 50 61 72 73 65 2d  f( (pE = pParse-
4540: 3e 61 70 56 61 72 45 78 70 72 5b 69 5d 29 21 3d  >apVarExpr[i])!=
4550: 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 70  0.          && p
4560: 45 2d 3e 74 6f 6b 65 6e 2e 6e 3d 3d 6e 0a 20 20  E->token.n==n.  
4570: 20 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d          && memcm
4580: 70 28 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  p(pE->token.z, p
4590: 54 6f 6b 65 6e 2d 3e 7a 2c 20 6e 29 3d 3d 30 20  Token->z, n)==0 
45a0: 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  ){.        pExpr
45b0: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 2d 3e 69  ->iTable = pE->i
45c0: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 62  Table;.        b
45d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
45e0: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 70    }.    if( i>=p
45f0: 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 20  Parse->nVarExpr 
4600: 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  ){.      pExpr->
4610: 69 54 61 62 6c 65 20 3d 20 2b 2b 70 50 61 72 73  iTable = ++pPars
4620: 65 2d 3e 6e 56 61 72 3b 0a 20 20 20 20 20 20 69  e->nVar;.      i
4630: 66 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45  f( pParse->nVarE
4640: 78 70 72 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61  xpr>=pParse->nVa
4650: 72 45 78 70 72 41 6c 6c 6f 63 2d 31 20 29 7b 0a  rExprAlloc-1 ){.
4660: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
4670: 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 20 2b 3d  nVarExprAlloc +=
4680: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70   pParse->nVarExp
4690: 72 41 6c 6c 6f 63 20 2b 20 31 30 3b 0a 20 20 20  rAlloc + 10;.   
46a0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 70 56       pParse->apV
46b0: 61 72 45 78 70 72 20 3d 0a 20 20 20 20 20 20 20  arExpr =.       
46c0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52 65       sqlite3DbRe
46d0: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 0a 20 20 20  allocOrFree(.   
46e0: 20 20 20 20 20 20 20 20 20 20 20 64 62 2c 0a 20             db,. 
46f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
4700: 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 2c 0a  rse->apVarExpr,.
4710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
4720: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c  arse->nVarExprAl
4730: 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 50 61 72 73  loc*sizeof(pPars
4740: 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 30 5d 29  e->apVarExpr[0])
4750: 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a  .            );.
4760: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
4770: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
4780: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 61  led ){.        a
4790: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 61  ssert( pParse->a
47a0: 70 56 61 72 45 78 70 72 21 3d 30 20 29 3b 0a 20  pVarExpr!=0 );. 
47b0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
47c0: 70 56 61 72 45 78 70 72 5b 70 50 61 72 73 65 2d  pVarExpr[pParse-
47d0: 3e 6e 56 61 72 45 78 70 72 2b 2b 5d 20 3d 20 70  >nVarExpr++] = p
47e0: 45 78 70 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Expr;.      }.  
47f0: 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66 28 20 21    }.  } .  if( !
4800: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 26 26 20  pParse->nErr && 
4810: 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 64 62 2d  pParse->nVar>db-
4820: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
4830: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
4840: 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 73 71 6c  MBER] ){.    sql
4850: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
4860: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53  rse, "too many S
4870: 51 4c 20 76 61 72 69 61 62 6c 65 73 22 29 3b 0a  QL variables");.
4880: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63    }.}../*.** Rec
4890: 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20  ursively delete 
48a0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
48b0: 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ee..*/.void sqli
48c0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 73 71  te3ExprDelete(sq
48d0: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
48e0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20  *p){.  if( p==0 
48f0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
4900: 70 2d 3e 73 70 61 6e 2e 64 79 6e 20 29 20 73 71  p->span.dyn ) sq
4910: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4920: 28 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a  (char*)p->span.z
4930: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65  );.  if( p->toke
4940: 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65 33 44  n.dyn ) sqlite3D
4950: 62 46 72 65 65 28 64 62 2c 20 28 63 68 61 72 2a  bFree(db, (char*
4960: 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20  )p->token.z);.  
4970: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
4980: 65 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b  e(db, p->pLeft);
4990: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
49a0: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 52 69 67  lete(db, p->pRig
49b0: 68 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ht);.  sqlite3Ex
49c0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
49d0: 20 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 73 71   p->pList);.  sq
49e0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
49f0: 65 28 64 62 2c 20 70 2d 3e 70 53 65 6c 65 63 74  e(db, p->pSelect
4a00: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
4a10: 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
4a20: 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e 74 6f 6b  .** The Expr.tok
4a30: 65 6e 20 66 69 65 6c 64 20 6d 69 67 68 74 20 62  en field might b
4a40: 65 20 61 20 73 74 72 69 6e 67 20 6c 69 74 65 72  e a string liter
4a50: 61 6c 20 74 68 61 74 20 69 73 20 71 75 6f 74 65  al that is quote
4a60: 64 2e 0a 2a 2a 20 49 66 20 73 6f 2c 20 72 65 6d  d..** If so, rem
4a70: 6f 76 65 20 74 68 65 20 71 75 6f 74 61 74 69 6f  ove the quotatio
4a80: 6e 20 6d 61 72 6b 73 2e 0a 2a 2f 0a 76 6f 69 64  n marks..*/.void
4a90: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 45   sqlite3DequoteE
4aa0: 78 70 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  xpr(sqlite3 *db,
4ab0: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28   Expr *p){.  if(
4ac0: 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65   ExprHasAnyPrope
4ad0: 72 74 79 28 70 2c 20 45 50 5f 44 65 71 75 6f 74  rty(p, EP_Dequot
4ae0: 65 64 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ed) ){.    retur
4af0: 6e 3b 0a 20 20 7d 0a 20 20 45 78 70 72 53 65 74  n;.  }.  ExprSet
4b00: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 44  Property(p, EP_D
4b10: 65 71 75 6f 74 65 64 29 3b 0a 20 20 69 66 28 20  equoted);.  if( 
4b20: 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 3d 3d 30 20  p->token.dyn==0 
4b30: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 6f  ){.    sqlite3To
4b40: 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70 2d 3e  kenCopy(db, &p->
4b50: 74 6f 6b 65 6e 2c 20 26 70 2d 3e 74 6f 6b 65 6e  token, &p->token
4b60: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
4b70: 44 65 71 75 6f 74 65 28 28 63 68 61 72 2a 29 70  Dequote((char*)p
4b80: 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 7d 0a 0a 2f  ->token.z);.}../
4b90: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
4ba0: 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74  ng group of rout
4bb0: 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63  ines make deep c
4bc0: 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65 73 73  opies of express
4bd0: 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73  ions,.** express
4be0: 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69  ion lists, ID li
4bf0: 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20  sts, and select 
4c00: 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65  statements.  The
4c10: 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62   copies can.** b
4c20: 65 20 64 65 6c 65 74 65 64 20 28 62 79 20 62 65  e deleted (by be
4c30: 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74 68  ing passed to th
4c40: 65 69 72 20 72 65 73 70 65 63 74 69 76 65 20 2e  eir respective .
4c50: 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69  ..Delete() routi
4c60: 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20  nes).** without 
4c70: 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72  effecting the or
4c80: 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54  iginals..**.** T
4c90: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
4ca0: 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72  st, ID, and sour
4cb0: 63 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20  ce lists return 
4cc0: 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  by sqlite3ExprLi
4cd0: 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69  stDup(),.** sqli
4ce0: 74 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20  te3IdListDup(), 
4cf0: 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  and sqlite3SrcLi
4d00: 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20  stDup() can not 
4d10: 62 65 20 66 75 72 74 68 65 72 20 65 78 70 61 6e  be further expan
4d20: 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65  ded .** by subse
4d30: 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73  quent calls to s
4d40: 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64  qlite*ListAppend
4d50: 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a  () routines..**.
4d60: 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68  ** Any tables th
4d70: 61 74 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d  at the SrcList m
4d80: 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72  ight point to ar
4d90: 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64  e not duplicated
4da0: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
4db0: 65 33 45 78 70 72 44 75 70 28 73 71 6c 69 74 65  e3ExprDup(sqlite
4dc0: 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b  3 *db, Expr *p){
4dd0: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20  .  Expr *pNew;. 
4de0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
4df0: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
4e00: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
4e10: 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29  w(db, sizeof(*p)
4e20: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
4e30: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
4e40: 6d 65 6d 63 70 79 28 70 4e 65 77 2c 20 70 2c 20  memcpy(pNew, p, 
4e50: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a  sizeof(*pNew));.
4e60: 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a    if( p->token.z
4e70: 21 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d  !=0 ){.    pNew-
4e80: 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 28 75 38 2a 29  >token.z = (u8*)
4e90: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
4ea0: 28 64 62 2c 20 28 63 68 61 72 2a 29 70 2d 3e 74  (db, (char*)p->t
4eb0: 6f 6b 65 6e 2e 7a 2c 20 70 2d 3e 74 6f 6b 65 6e  oken.z, p->token
4ec0: 2e 6e 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 74  .n);.    pNew->t
4ed0: 6f 6b 65 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20 20  oken.dyn = 1;.  
4ee0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
4ef0: 74 28 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a  t( pNew->token.z
4f00: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70 4e 65  ==0 );.  }.  pNe
4f10: 77 2d 3e 73 70 61 6e 2e 7a 20 3d 20 30 3b 0a 20  w->span.z = 0;. 
4f20: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73   pNew->pLeft = s
4f30: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
4f40: 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70  , p->pLeft);.  p
4f50: 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 73 71  New->pRight = sq
4f60: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
4f70: 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 70   p->pRight);.  p
4f80: 4e 65 77 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c  New->pList = sql
4f90: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
4fa0: 64 62 2c 20 70 2d 3e 70 4c 69 73 74 29 3b 0a 20  db, p->pList);. 
4fb0: 20 70 4e 65 77 2d 3e 70 53 65 6c 65 63 74 20 3d   pNew->pSelect =
4fc0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
4fd0: 70 28 64 62 2c 20 70 2d 3e 70 53 65 6c 65 63 74  p(db, p->pSelect
4fe0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  );.  return pNew
4ff0: 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
5000: 54 6f 6b 65 6e 43 6f 70 79 28 73 71 6c 69 74 65  TokenCopy(sqlite
5010: 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 54  3 *db, Token *pT
5020: 6f 2c 20 54 6f 6b 65 6e 20 2a 70 46 72 6f 6d 29  o, Token *pFrom)
5030: 7b 0a 20 20 69 66 28 20 70 54 6f 2d 3e 64 79 6e  {.  if( pTo->dyn
5040: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
5050: 28 64 62 2c 20 28 63 68 61 72 2a 29 70 54 6f 2d  (db, (char*)pTo-
5060: 3e 7a 29 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  >z);.  if( pFrom
5070: 2d 3e 7a 20 29 7b 0a 20 20 20 20 70 54 6f 2d 3e  ->z ){.    pTo->
5080: 6e 20 3d 20 70 46 72 6f 6d 2d 3e 6e 3b 0a 20 20  n = pFrom->n;.  
5090: 20 20 70 54 6f 2d 3e 7a 20 3d 20 28 75 38 2a 29    pTo->z = (u8*)
50a0: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
50b0: 28 64 62 2c 20 28 63 68 61 72 2a 29 70 46 72 6f  (db, (char*)pFro
50c0: 6d 2d 3e 7a 2c 20 70 46 72 6f 6d 2d 3e 6e 29 3b  m->z, pFrom->n);
50d0: 0a 20 20 20 20 70 54 6f 2d 3e 64 79 6e 20 3d 20  .    pTo->dyn = 
50e0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
50f0: 70 54 6f 2d 3e 7a 20 3d 20 30 3b 0a 20 20 7d 0a  pTo->z = 0;.  }.
5100: 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69  }.ExprList *sqli
5110: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 73  te3ExprListDup(s
5120: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
5130: 4c 69 73 74 20 2a 70 29 7b 0a 20 20 45 78 70 72  List *p){.  Expr
5140: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74  List *pNew;.  st
5150: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
5160: 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64  em *pItem, *pOld
5170: 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Item;.  int i;. 
5180: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
5190: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
51a0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
51b0: 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e  w(db, sizeof(*pN
51c0: 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  ew) );.  if( pNe
51d0: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
51e0: 0a 20 20 70 4e 65 77 2d 3e 69 45 43 75 72 73 6f  .  pNew->iECurso
51f0: 72 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  r = 0;.  pNew->n
5200: 45 78 70 72 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c  Expr = pNew->nAl
5210: 6c 6f 63 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a  loc = p->nExpr;.
5220: 20 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65    pNew->a = pIte
5230: 6d 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  m = sqlite3DbMal
5240: 6c 6f 63 52 61 77 28 64 62 2c 20 20 70 2d 3e 6e  locRaw(db,  p->n
5250: 45 78 70 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  Expr*sizeof(p->a
5260: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 49  [0]) );.  if( pI
5270: 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  tem==0 ){.    sq
5280: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5290: 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72  pNew);.    retur
52a0: 6e 20 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64  n 0;.  } .  pOld
52b0: 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66  Item = p->a;.  f
52c0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78  or(i=0; i<p->nEx
52d0: 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
52e0: 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20  , pOldItem++){. 
52f0: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70     Expr *pNewExp
5300: 72 2c 20 2a 70 4f 6c 64 45 78 70 72 3b 0a 20 20  r, *pOldExpr;.  
5310: 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d    pItem->pExpr =
5320: 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69   pNewExpr = sqli
5330: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
5340: 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64 49 74  OldExpr = pOldIt
5350: 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
5360: 69 66 28 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70  if( pOldExpr->sp
5370: 61 6e 2e 7a 21 3d 30 20 26 26 20 70 4e 65 77 45  an.z!=0 && pNewE
5380: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  xpr ){.      /* 
5390: 41 6c 77 61 79 73 20 6d 61 6b 65 20 61 20 63 6f  Always make a co
53a0: 70 79 20 6f 66 20 74 68 65 20 73 70 61 6e 20 66  py of the span f
53b0: 6f 72 20 74 6f 70 2d 6c 65 76 65 6c 20 65 78 70  or top-level exp
53c0: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 0a  ressions in the.
53d0: 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73        ** express
53e0: 69 6f 6e 20 6c 69 73 74 2e 20 20 54 68 65 20 6c  ion list.  The l
53f0: 6f 67 69 63 20 69 6e 20 53 45 4c 45 43 54 20 70  ogic in SELECT p
5400: 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 64  rocessing that d
5410: 65 74 65 72 6d 69 6e 65 73 0a 20 20 20 20 20 20  etermines.      
5420: 2a 2a 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ** the names of 
5430: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
5440: 65 73 75 6c 74 20 73 65 74 20 6e 65 65 64 73 20  esult set needs 
5450: 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  this information
5460: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
5470: 33 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26  3TokenCopy(db, &
5480: 70 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e 2c 20  pNewExpr->span, 
5490: 26 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e 29  &pOldExpr->span)
54a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
54b0: 72 74 28 20 70 4e 65 77 45 78 70 72 3d 3d 30 20  rt( pNewExpr==0 
54c0: 7c 7c 20 70 4e 65 77 45 78 70 72 2d 3e 73 70 61  || pNewExpr->spa
54d0: 6e 2e 7a 21 3d 30 20 0a 20 20 20 20 20 20 20 20  n.z!=0 .        
54e0: 20 20 20 20 7c 7c 20 70 4f 6c 64 45 78 70 72 2d      || pOldExpr-
54f0: 3e 73 70 61 6e 2e 7a 3d 3d 30 0a 20 20 20 20 20  >span.z==0.     
5500: 20 20 20 20 20 20 20 7c 7c 20 64 62 2d 3e 6d 61         || db->ma
5510: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
5520: 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
5530: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
5540: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
5550: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d  Name);.    pItem
5560: 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f  ->sortOrder = pO
5570: 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65  ldItem->sortOrde
5580: 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f  r;.    pItem->do
5590: 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65  ne = 0;.    pIte
55a0: 6d 2d 3e 69 43 6f 6c 20 3d 20 70 4f 6c 64 49 74  m->iCol = pOldIt
55b0: 65 6d 2d 3e 69 43 6f 6c 3b 0a 20 20 20 20 70 49  em->iCol;.    pI
55c0: 74 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20 70 4f  tem->iAlias = pO
55d0: 6c 64 49 74 65 6d 2d 3e 69 41 6c 69 61 73 3b 0a  ldItem->iAlias;.
55e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
55f0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63  w;.}../*.** If c
5600: 75 72 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73  ursors, triggers
5610: 2c 20 76 69 65 77 73 20 61 6e 64 20 73 75 62 71  , views and subq
5620: 75 65 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f  ueries are all o
5630: 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74  mitted from.** t
5640: 68 65 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e  he build, then n
5650: 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
5660: 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65  wing routines, e
5670: 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71  xcept for .** sq
5680: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29  lite3SelectDup()
5690: 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e  , can be called.
56a0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
56b0: 70 28 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73  p() is sometimes
56c0: 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20  .** called with 
56d0: 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e  a NULL argument.
56e0: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
56f0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
5700: 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  W) || !defined(S
5710: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
5720: 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e  ER) \. || !defin
5730: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
5740: 55 42 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74  UBQUERY).SrcList
5750: 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
5760: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
5770: 20 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20   SrcList *p){.  
5780: 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  SrcList *pNew;. 
5790: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42   int i;.  int nB
57a0: 79 74 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  yte;.  if( p==0 
57b0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42  ) return 0;.  nB
57c0: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29  yte = sizeof(*p)
57d0: 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20   + (p->nSrc>0 ? 
57e0: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
57f0: 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20  * (p->nSrc-1) : 
5800: 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  0);.  pNew = sql
5810: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
5820: 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69  db, nByte );.  i
5830: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
5840: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  urn 0;.  pNew->n
5850: 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c  Src = pNew->nAll
5860: 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20  oc = p->nSrc;.  
5870: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53  for(i=0; i<p->nS
5880: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  rc; i++){.    st
5890: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
58a0: 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70  m *pNewItem = &p
58b0: 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73  New->a[i];.    s
58c0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
58d0: 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26  em *pOldItem = &
58e0: 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62  p->a[i];.    Tab
58f0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e  le *pTab;.    pN
5900: 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ewItem->zDatabas
5910: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
5920: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
5930: 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
5940: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
5950: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
5960: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
5970: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ->zName);.    pN
5980: 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d  ewItem->zAlias =
5990: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
59a0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
59b0: 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77  Alias);.    pNew
59c0: 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 3d  Item->jointype =
59d0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e 74   pOldItem->joint
59e0: 79 70 65 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ype;.    pNewIte
59f0: 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c  m->iCursor = pOl
5a00: 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  dItem->iCursor;.
5a10: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 73      pNewItem->is
5a20: 50 6f 70 75 6c 61 74 65 64 20 3d 20 70 4f 6c 64  Populated = pOld
5a30: 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65  Item->isPopulate
5a40: 64 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  d;.    pNewItem-
5a50: 3e 7a 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65  >zIndex = sqlite
5a60: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
5a70: 6c 64 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 29 3b  ldItem->zIndex);
5a80: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6e  .    pNewItem->n
5a90: 6f 74 49 6e 64 65 78 65 64 20 3d 20 70 4f 6c 64  otIndexed = pOld
5aa0: 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64  Item->notIndexed
5ab0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
5ac0: 70 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74 65  pIndex = pOldIte
5ad0: 6d 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 70  m->pIndex;.    p
5ae0: 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e  Tab = pNewItem->
5af0: 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  pTab = pOldItem-
5b00: 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70  >pTab;.    if( p
5b10: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54 61  Tab ){.      pTa
5b20: 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d  b->nRef++;.    }
5b30: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
5b40: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
5b50: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 4f  SelectDup(db, pO
5b60: 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29  ldItem->pSelect)
5b70: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
5b80: 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pOn = sqlite3Exp
5b90: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
5ba0: 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 70 4e 65  m->pOn);.    pNe
5bb0: 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20  wItem->pUsing = 
5bc0: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
5bd0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  (db, pOldItem->p
5be0: 55 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77  Using);.    pNew
5bf0: 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20  Item->colUsed = 
5c00: 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  pOldItem->colUse
5c10: 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  d;.  }.  return 
5c20: 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a  pNew;.}.IdList *
5c30: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
5c40: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64  (sqlite3 *db, Id
5c50: 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69  List *p){.  IdLi
5c60: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  st *pNew;.  int 
5c70: 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  i;.  if( p==0 ) 
5c80: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
5c90: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
5ca0: 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
5cb0: 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28  (*pNew) );.  if(
5cc0: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
5cd0: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64  n 0;.  pNew->nId
5ce0: 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20   = pNew->nAlloc 
5cf0: 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77  = p->nId;.  pNew
5d00: 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ->a = sqlite3DbM
5d10: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 70 2d 3e  allocRaw(db, p->
5d20: 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  nId*sizeof(p->a[
5d30: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  0]) );.  if( pNe
5d40: 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73  w->a==0 ){.    s
5d50: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
5d60: 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75   pNew);.    retu
5d70: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  rn 0;.  }.  for(
5d80: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69  i=0; i<p->nId; i
5d90: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
5da0: 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65  IdList_item *pNe
5db0: 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61  wItem = &pNew->a
5dc0: 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20  [i];.    struct 
5dd0: 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c  IdList_item *pOl
5de0: 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d  dItem = &p->a[i]
5df0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
5e00: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
5e10: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
5e20: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
5e30: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20    pNewItem->idx 
5e40: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b  = pOldItem->idx;
5e50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
5e60: 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71  ew;.}.Select *sq
5e70: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73  lite3SelectDup(s
5e80: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65  qlite3 *db, Sele
5e90: 63 74 20 2a 70 29 7b 0a 20 20 53 65 6c 65 63 74  ct *p){.  Select
5ea0: 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d   *pNew;.  if( p=
5eb0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
5ec0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
5ed0: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
5ee0: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
5ef0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
5f00: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  urn 0;.  pNew->p
5f10: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
5f20: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
5f30: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 4e 65  ->pEList);.  pNe
5f40: 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65  w->pSrc = sqlite
5f50: 33 53 72 63 4c 69 73 74 44 75 70 28 64 62 2c 20  3SrcListDup(db, 
5f60: 70 2d 3e 70 53 72 63 29 3b 0a 20 20 70 4e 65 77  p->pSrc);.  pNew
5f70: 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
5f80: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
5f90: 3e 70 57 68 65 72 65 29 3b 0a 20 20 70 4e 65 77  >pWhere);.  pNew
5fa0: 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
5fb0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
5fc0: 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 29  db, p->pGroupBy)
5fd0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e  ;.  pNew->pHavin
5fe0: 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  g = sqlite3ExprD
5ff0: 75 70 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e  up(db, p->pHavin
6000: 67 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64  g);.  pNew->pOrd
6010: 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
6020: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
6030: 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 4e  >pOrderBy);.  pN
6040: 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a  ew->op = p->op;.
6050: 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d    pNew->pPrior =
6060: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
6070: 70 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29  p(db, p->pPrior)
6080: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74  ;.  pNew->pLimit
6090: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
60a0: 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  p(db, p->pLimit)
60b0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65  ;.  pNew->pOffse
60c0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
60d0: 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65  up(db, p->pOffse
60e0: 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d  t);.  pNew->iLim
60f0: 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  it = 0;.  pNew->
6100: 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70  iOffset = 0;.  p
6110: 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20  New->selFlags = 
6120: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e 53  p->selFlags & ~S
6130: 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
6140: 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 6d  .  pNew->pRightm
6150: 6f 73 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ost = 0;.  pNew-
6160: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
6170: 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61   = -1;.  pNew->a
6180: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d  ddrOpenEphm[1] =
6190: 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64   -1;.  pNew->add
61a0: 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d  rOpenEphm[2] = -
61b0: 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  1;.  return pNew
61c0: 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74  ;.}.#else.Select
61d0: 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44   *sqlite3SelectD
61e0: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
61f0: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 61 73  Select *p){.  as
6200: 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20  sert( p==0 );.  
6210: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
6220: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  if.../*.** Add a
6230: 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
6240: 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65 78  the end of an ex
6250: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
6260: 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69  If pList is.** i
6270: 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74  nitially NULL, t
6280: 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77  hen create a new
6290: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
62a0: 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73  ..*/.ExprList *s
62b0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
62c0: 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70  pend(.  Parse *p
62d0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
62e0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
62f0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
6300: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
6310: 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68  /* List to which
6320: 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68   to append. Migh
6330: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  t be NULL */.  E
6340: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
6350: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
6360: 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e  sion to be appen
6370: 64 65 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ded */.  Token *
6380: 70 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20  pName           
6390: 20 2f 2a 20 41 53 20 6b 65 79 77 6f 72 64 20 66   /* AS keyword f
63a0: 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  or the expressio
63b0: 6e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  n */.){.  sqlite
63c0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
63d0: 64 62 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  db;.  if( pList=
63e0: 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
63f0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
6400: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
6410: 28 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20  (ExprList) );.  
6420: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
6430: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  {.      goto no_
6440: 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  mem;.    }.    a
6450: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 41  ssert( pList->nA
6460: 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20  lloc==0 );.  }. 
6470: 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c   if( pList->nAll
6480: 6f 63 3c 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72  oc<=pList->nExpr
6490: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
64a0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b  xprList_item *a;
64b0: 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c 69  .    int n = pLi
64c0: 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 34  st->nAlloc*2 + 4
64d0: 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65  ;.    a = sqlite
64e0: 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70  3DbRealloc(db, p
64f0: 4c 69 73 74 2d 3e 61 2c 20 6e 2a 73 69 7a 65 6f  List->a, n*sizeo
6500: 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b  f(pList->a[0]));
6510: 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b  .    if( a==0 ){
6520: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d  .      goto no_m
6530: 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  em;.    }.    pL
6540: 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 20 20  ist->a = a;.    
6550: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  pList->nAlloc = 
6560: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
6570: 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b 0a   pList->a!=0 );.
6580: 20 20 69 66 28 20 70 45 78 70 72 20 7c 7c 20 70    if( pExpr || p
6590: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 74 72 75  Name ){.    stru
65a0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
65b0: 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74   *pItem = &pList
65c0: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->a[pList->nExpr
65d0: 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ++];.    memset(
65e0: 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  pItem, 0, sizeof
65f0: 28 2a 70 49 74 65 6d 29 29 3b 0a 20 20 20 20 70  (*pItem));.    p
6600: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
6610: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
6620: 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20  en(db, pName);. 
6630: 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
6640: 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 70 49 74  = pExpr;.    pIt
6650: 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20 30 3b 0a  em->iAlias = 0;.
6660: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69    }.  return pLi
6670: 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20  st;..no_mem:    
6680: 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61   .  /* Avoid lea
6690: 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d  king memory if m
66a0: 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c 65 64  alloc has failed
66b0: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78  . */.  sqlite3Ex
66c0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
66d0: 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  pr);.  sqlite3Ex
66e0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
66f0: 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72   pList);.  retur
6700: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  n 0;.}../*.** If
6710: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
6720: 6c 69 73 74 20 70 45 4c 69 73 74 20 63 6f 6e 74  list pEList cont
6730: 61 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 69  ains more than i
6740: 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74 73 2c 0a  Limit elements,.
6750: 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  ** leave an erro
6760: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
6770: 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  rse..*/.void sql
6780: 69 74 65 33 45 78 70 72 4c 69 73 74 43 68 65 63  ite3ExprListChec
6790: 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61 72 73 65  kLength(.  Parse
67a0: 20 2a 70 50 61 72 73 65 2c 0a 20 20 45 78 70 72   *pParse,.  Expr
67b0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20  List *pEList,.  
67c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a  const char *zObj
67d0: 65 63 74 0a 29 7b 0a 20 20 69 6e 74 20 6d 78 20  ect.){.  int mx 
67e0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c  = pParse->db->aL
67f0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
6800: 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73  T_COLUMN];.  tes
6810: 74 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26  tcase( pEList &&
6820: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   pEList->nExpr==
6830: 6d 78 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  mx );.  testcase
6840: 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69  ( pEList && pELi
6850: 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31 20  st->nExpr==mx+1 
6860: 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20  );.  if( pEList 
6870: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
6880: 3e 6d 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >mx ){.    sqlit
6890: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
68a0: 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c  e, "too many col
68b0: 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a 4f 62  umns in %s", zOb
68c0: 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ject);.  }.}../*
68d0: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
68e0: 74 69 72 65 20 65 78 70 72 65 73 73 69 6f 6e 20  tire expression 
68f0: 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  list..*/.void sq
6900: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
6910: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
6920: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
6930: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
6940: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
6950: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28  em *pItem;.  if(
6960: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
6970: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  rn;.  assert( pL
6980: 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 28 70 4c  ist->a!=0 || (pL
6990: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 26 26  ist->nExpr==0 &&
69a0: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d   pList->nAlloc==
69b0: 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0) );.  assert( 
69c0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 70 4c  pList->nExpr<=pL
69d0: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 20  ist->nAlloc );. 
69e0: 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
69f0: 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
6a00: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  t->nExpr; i++, p
6a10: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Item++){.    sql
6a20: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
6a30: 62 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  b, pItem->pExpr)
6a40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
6a50: 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
6a60: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Name);.  }.  sql
6a70: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
6a80: 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69  List->a);.  sqli
6a90: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c  te3DbFree(db, pL
6aa0: 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ist);.}../*.** T
6ab0: 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
6ac0: 65 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63  e Walker callbac
6ad0: 6b 73 2e 20 20 57 61 6c 6b 65 72 2e 75 2e 70 69  ks.  Walker.u.pi
6ae0: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a   is a pointer.**
6af0: 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e 20   to an integer. 
6b00: 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
6b10: 61 72 65 20 63 68 65 63 6b 69 6e 67 20 61 6e 20  are checking an 
6b20: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 73 65  expression to se
6b30: 65 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 61 20  e.** if it is a 
6b40: 63 6f 6e 73 74 61 6e 74 2e 20 20 53 65 74 20 2a  constant.  Set *
6b50: 57 61 6c 6b 65 72 2e 75 2e 70 69 20 74 6f 20 30  Walker.u.pi to 0
6b60: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
6b70: 6f 6e 20 69 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e  on is.** not con
6b80: 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  stant..**.** The
6b90: 73 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  se callback rout
6ba0: 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
6bb0: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 66   implement the f
6bc0: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
6bd0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
6be0: 73 43 6f 6e 73 74 61 6e 74 28 29 0a 2a 2a 20 20  sConstant().**  
6bf0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73     sqlite3ExprIs
6c00: 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
6c10: 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ).**     sqlite3
6c20: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
6c30: 46 75 6e 63 74 69 6f 6e 28 29 0a 2a 2a 0a 2a 2f  Function().**.*/
6c40: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
6c50: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57  NodeIsConstant(W
6c60: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
6c70: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 0a 20  Expr *pExpr){.. 
6c80: 20 2f 2a 20 49 66 20 70 57 61 6c 6b 65 72 2d 3e   /* If pWalker->
6c90: 75 2e 69 20 69 73 20 33 20 74 68 65 6e 20 61 6e  u.i is 3 then an
6ca0: 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 65 78  y term of the ex
6cb0: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f  pression that co
6cc0: 6d 65 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68  mes from.  ** th
6cd0: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
6ce0: 61 75 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e 20  auses of a join 
6cf0: 64 69 73 71 75 61 6c 69 66 69 65 73 20 74 68 65  disqualifies the
6d00: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a   expression.  **
6d10: 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e 73   from being cons
6d20: 69 64 65 72 65 64 20 63 6f 6e 73 74 61 6e 74 2e  idered constant.
6d30: 20 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c 6b 65   */.  if( pWalke
6d40: 72 2d 3e 75 2e 69 3d 3d 33 20 26 26 20 45 78 70  r->u.i==3 && Exp
6d50: 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28  rHasAnyProperty(
6d60: 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
6d70: 69 6e 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b  in) ){.    pWalk
6d80: 65 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20 20 20  er->u.i = 0;.   
6d90: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
6da0: 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68  t;.  }..  switch
6db0: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
6dc0: 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66     /* Consider f
6dd0: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20 63  unctions to be c
6de0: 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20 74  onstant if all t
6df0: 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20 61  heir arguments a
6e00: 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20  re constant.    
6e10: 2a 2a 20 61 6e 64 20 70 57 61 6c 6b 65 72 2d 3e  ** and pWalker->
6e20: 75 2e 69 3d 3d 32 20 2a 2f 0a 20 20 20 20 63 61  u.i==2 */.    ca
6e30: 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a  se TK_FUNCTION:.
6e40: 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65        if( pWalke
6e50: 72 2d 3e 75 2e 69 3d 3d 32 20 29 20 72 65 74 75  r->u.i==2 ) retu
6e60: 72 6e 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 46  rn 0;.      /* F
6e70: 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  all through */. 
6e80: 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20     case TK_ID:. 
6e90: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
6ea0: 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44  N:.    case TK_D
6eb0: 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OT:.    case TK_
6ec0: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20  AGG_FUNCTION:.  
6ed0: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
6ee0: 4c 55 4d 4e 3a 0a 23 69 66 6e 64 65 66 20 53 51  LUMN:.#ifndef SQ
6ef0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
6f00: 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  RY.    case TK_S
6f10: 45 4c 45 43 54 3a 0a 20 20 20 20 63 61 73 65 20  ELECT:.    case 
6f20: 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20  TK_EXISTS:.     
6f30: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
6f40: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
6f50: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
6f60: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
6f70: 5f 45 58 49 53 54 53 20 29 3b 0a 23 65 6e 64 69  _EXISTS );.#endi
6f80: 66 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  f.      testcase
6f90: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
6fa0: 49 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ID );.      test
6fb0: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
6fc0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
6fd0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
6fe0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20  xpr->op==TK_DOT 
6ff0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
7000: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
7010: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b  _AGG_FUNCTION );
7020: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
7030: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
7040: 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  GG_COLUMN );.   
7050: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20     pWalker->u.i 
7060: 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
7070: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
7080: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
7090: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
70a0: 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  nue;.  }.}.stati
70b0: 63 20 69 6e 74 20 73 65 6c 65 63 74 4e 6f 64 65  c int selectNode
70c0: 49 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65  IsConstant(Walke
70d0: 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
70e0: 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
70f0: 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30  pWalker->u.i = 0
7100: 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41  ;.  return WRC_A
7110: 62 6f 72 74 3b 0a 7d 0a 73 74 61 74 69 63 20 69  bort;.}.static i
7120: 6e 74 20 65 78 70 72 49 73 43 6f 6e 73 74 28 45  nt exprIsConst(E
7130: 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 6e 69 74  xpr *p, int init
7140: 46 6c 61 67 29 7b 0a 20 20 57 61 6c 6b 65 72 20  Flag){.  Walker 
7150: 77 3b 0a 20 20 77 2e 75 2e 69 20 3d 20 69 6e 69  w;.  w.u.i = ini
7160: 74 46 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70 72  tFlag;.  w.xExpr
7170: 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e  Callback = exprN
7180: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20  odeIsConstant;. 
7190: 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
71a0: 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49  ck = selectNodeI
71b0: 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 73 71 6c  sConstant;.  sql
71c0: 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
71d0: 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e   p);.  return w.
71e0: 75 2e 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61  u.i;.}../*.** Wa
71f0: 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
7200: 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31   tree.  Return 1
7210: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
7220: 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a  on is constant.*
7230: 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e  * and 0 if it in
7240: 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73  volves variables
7250: 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c   or function cal
7260: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  ls..**.** For th
7270: 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
7280: 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64  is function, a d
7290: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
72a0: 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a  ing (ex: "abc").
72b0: 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
72c0: 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20   a variable but 
72d0: 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20  a single-quoted 
72e0: 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63  string (ex: 'abc
72f0: 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74  ') is.** a const
7300: 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ant..*/.int sqli
7310: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
7320: 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65  t(Expr *p){.  re
7330: 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74  turn exprIsConst
7340: 28 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (p, 1);.}../*.**
7350: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
7360: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
7370: 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65  n 1 if the expre
7380: 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
7390: 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e  t.** that does n
73a0: 6f 20 6f 72 69 67 69 6e 61 74 65 20 66 72 6f 6d  o originate from
73b0: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
73c0: 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f   clauses of a jo
73d0: 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  in..** Return 0 
73e0: 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76  if it involves v
73f0: 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63  ariables or func
7400: 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65  tion calls or te
7410: 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f  rms from.** an O
7420: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
7430: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
7440: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e  3ExprIsConstantN
7450: 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b  otJoin(Expr *p){
7460: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
7470: 43 6f 6e 73 74 28 70 2c 20 33 29 3b 0a 7d 0a 0a  Const(p, 3);.}..
7480: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
7490: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
74a0: 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
74b0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
74c0: 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66  nstant.** or a f
74d0: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74  unction call wit
74e0: 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d  h constant argum
74f0: 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61 6e  ents.  Return an
7500: 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a 20  d 0 if there.** 
7510: 61 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c 65  are any variable
7520: 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  s..**.** For the
7530: 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
7540: 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f  s function, a do
7550: 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  uble-quoted stri
7560: 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a  ng (ex: "abc").*
7570: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
7580: 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61  a variable but a
7590: 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73   single-quoted s
75a0: 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27  tring (ex: 'abc'
75b0: 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61  ) is.** a consta
75c0: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
75d0: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
75e0: 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 20  OrFunction(Expr 
75f0: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78  *p){.  return ex
7600: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 32 29 3b  prIsConst(p, 2);
7610: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
7620: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f   expression p co
7630: 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69  des a constant i
7640: 6e 74 65 67 65 72 20 74 68 61 74 20 69 73 20 73  nteger that is s
7650: 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74  mall enough.** t
7660: 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69  o fit in a 32-bi
7670: 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72  t integer, retur
7680: 6e 20 31 20 61 6e 64 20 70 75 74 20 74 68 65 20  n 1 and put the 
7690: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74  value of the int
76a0: 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c  eger.** in *pVal
76b0: 75 65 2e 20 20 49 66 20 74 68 65 20 65 78 70 72  ue.  If the expr
76c0: 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e  ession is not an
76d0: 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69   integer or if i
76e0: 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20  t is too big.** 
76f0: 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e  to fit in a sign
7700: 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65  ed 32-bit intege
7710: 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20  r, return 0 and 
7720: 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e  leave *pValue un
7730: 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20  changed..*/.int 
7740: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
7750: 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e  eger(Expr *p, in
7760: 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e  t *pValue){.  in
7770: 74 20 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20  t rc = 0;.  if( 
7780: 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  p->flags & EP_In
7790: 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70  tValue ){.    *p
77a0: 56 61 6c 75 65 20 3d 20 70 2d 3e 69 54 61 62 6c  Value = p->iTabl
77b0: 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  e;.    return 1;
77c0: 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70  .  }.  switch( p
77d0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
77e0: 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20   TK_INTEGER: {. 
77f0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
7800: 33 47 65 74 49 6e 74 33 32 28 28 63 68 61 72 2a  3GetInt32((char*
7810: 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 56 61  )p->token.z, pVa
7820: 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  lue);.      brea
7830: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
7840: 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20  e TK_UPLUS: {.  
7850: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7860: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d  ExprIsInteger(p-
7870: 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29 3b  >pLeft, pValue);
7880: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7890: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
78a0: 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
78b0: 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66 28  int v;.      if(
78c0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
78d0: 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20  teger(p->pLeft, 
78e0: 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  &v) ){.        *
78f0: 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20  pValue = -v;.   
7900: 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
7910: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
7920: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
7930: 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ult: break;.  }.
7940: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
7950: 70 2d 3e 6f 70 20 3d 20 54 4b 5f 49 4e 54 45 47  p->op = TK_INTEG
7960: 45 52 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73  ER;.    p->flags
7970: 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b   |= EP_IntValue;
7980: 0a 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d  .    p->iTable =
7990: 20 2a 70 56 61 6c 75 65 3b 0a 20 20 7d 0a 20 20   *pValue;.  }.  
79a0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
79b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
79c0: 69 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  if the given str
79d0: 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20  ing is a row-id 
79e0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a  column name..*/.
79f0: 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77  int sqlite3IsRow
7a00: 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  id(const char *z
7a10: 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
7a20: 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57  StrICmp(z, "_ROW
7a30: 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72  ID_")==0 ) retur
7a40: 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
7a50: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f  e3StrICmp(z, "RO
7a60: 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72  WID")==0 ) retur
7a70: 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
7a80: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49  e3StrICmp(z, "OI
7a90: 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  D")==0 ) return 
7aa0: 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  1;.  return 0;.}
7ab0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
7ac0: 54 45 53 54 0a 20 20 69 6e 74 20 73 71 6c 69 74  TEST.  int sqlit
7ad0: 65 33 5f 65 6e 61 62 6c 65 5f 69 6e 5f 6f 70 74  e3_enable_in_opt
7ae0: 20 3d 20 31 3b 0a 23 65 6c 73 65 0a 20 20 23 64   = 1;.#else.  #d
7af0: 65 66 69 6e 65 20 73 71 6c 69 74 65 33 5f 65 6e  efine sqlite3_en
7b00: 61 62 6c 65 5f 69 6e 5f 6f 70 74 20 31 0a 23 65  able_in_opt 1.#e
7b10: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
7b20: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 49  rn true if the I
7b30: 4e 20 6f 70 65 72 61 74 6f 72 20 6f 70 74 69 6d  N operator optim
7b40: 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c  ization is enabl
7b50: 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 53 45  ed and.** the SE
7b60: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70  LECT statement p
7b70: 20 65 78 69 73 74 73 20 61 6e 64 20 69 73 20 6f   exists and is o
7b80: 66 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65 20  f the.** simple 
7b90: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  form:.**.**     
7ba0: 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20  SELECT <column> 
7bb0: 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a  FROM <table>.**.
7bc0: 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  ** If this is th
7bd0: 65 20 63 61 73 65 2c 20 69 74 20 6d 61 79 20 62  e case, it may b
7be0: 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73  e possible to us
7bf0: 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61  e an existing ta
7c00: 62 6c 65 0a 2a 2a 20 6f 72 20 69 6e 64 65 78 20  ble.** or index 
7c10: 69 6e 73 74 65 61 64 20 6f 66 20 67 65 6e 65 72  instead of gener
7c20: 61 74 69 6e 67 20 61 6e 20 65 70 68 65 72 65 6d  ating an epherem
7c30: 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66  al table..*/.#if
7c40: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7c50: 5f 53 55 42 51 55 45 52 59 0a 73 74 61 74 69 63  _SUBQUERY.static
7c60: 20 69 6e 74 20 69 73 43 61 6e 64 69 64 61 74 65   int isCandidate
7c70: 46 6f 72 49 6e 4f 70 74 28 53 65 6c 65 63 74 20  ForInOpt(Select 
7c80: 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  *p){.  SrcList *
7c90: 70 53 72 63 3b 0a 20 20 45 78 70 72 4c 69 73 74  pSrc;.  ExprList
7ca0: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c   *pEList;.  Tabl
7cb0: 65 20 2a 70 54 61 62 3b 0a 20 20 69 66 28 20 21  e *pTab;.  if( !
7cc0: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 69  sqlite3_enable_i
7cd0: 6e 5f 6f 70 74 20 29 20 72 65 74 75 72 6e 20 30  n_opt ) return 0
7ce0: 3b 20 2f 2a 20 49 4e 20 6f 70 74 69 6d 69 7a 61  ; /* IN optimiza
7cf0: 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 6e 61  tion must be ena
7d00: 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 3d  bled */.  if( p=
7d10: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
7d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d30: 20 2f 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73   /* right-hand s
7d40: 69 64 65 20 6f 66 20 49 4e 20 69 73 20 53 45 4c  ide of IN is SEL
7d50: 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ECT */.  if( p->
7d60: 70 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20  pPrior ) return 
7d70: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
7d80: 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e  /* Not a compoun
7d90: 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66  d SELECT */.  if
7da0: 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
7db0: 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
7dc0: 41 67 67 72 65 67 61 74 65 29 20 29 7b 0a 20 20  Aggregate) ){.  
7dd0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a      return 0; /*
7de0: 20 4e 6f 20 44 49 53 54 49 4e 43 54 20 6b 65 79   No DISTINCT key
7df0: 77 6f 72 64 20 61 6e 64 20 6e 6f 20 61 67 67 72  word and no aggr
7e00: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
7e10: 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  */.  }.  if( p->
7e20: 70 47 72 6f 75 70 42 79 20 29 20 72 65 74 75 72  pGroupBy ) retur
7e30: 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
7e40: 2f 2a 20 48 61 73 20 6e 6f 20 47 52 4f 55 50 20  /* Has no GROUP 
7e50: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
7e60: 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72  f( p->pLimit ) r
7e70: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
7e80: 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20        /* Has no 
7e90: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a  LIMIT clause */.
7ea0: 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74    if( p->pOffset
7eb0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
7ec0: 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72  f( p->pWhere ) r
7ed0: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
7ee0: 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20        /* Has no 
7ef0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
7f00: 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
7f10: 3b 0a 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20  ;.  if( pSrc==0 
7f20: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
7f30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
7f40: 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20  single table in 
7f50: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
7f60: 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  */.  if( pSrc->n
7f70: 53 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20  Src!=1 ) return 
7f80: 30 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61  0;.  if( pSrc->a
7f90: 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29 20 72 65  [0].pSelect ) re
7fa0: 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46  turn 0;     /* F
7fb0: 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f  ROM clause is no
7fc0: 74 20 61 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  t a subquery */.
7fd0: 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61    pTab = pSrc->a
7fe0: 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 69 66 28 20  [0].pTab;.  if( 
7ff0: 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  pTab==0 ) return
8000: 20 30 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e   0;.  if( pTab->
8010: 70 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e  pSelect ) return
8020: 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
8030: 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6e  FROM clause is n
8040: 6f 74 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 69  ot a view */.  i
8050: 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
8060: 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  b) ) return 0;  
8070: 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c        /* FROM cl
8080: 61 75 73 65 20 6e 6f 74 20 61 20 76 69 72 74 75  ause not a virtu
8090: 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45  al table */.  pE
80a0: 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
80b0: 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e  ;.  if( pEList->
80c0: 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72  nExpr!=1 ) retur
80d0: 6e 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e  n 0;       /* On
80e0: 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  e column in the 
80f0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
8100: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  if( pEList->a[0]
8110: 2e 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43  .pExpr->op!=TK_C
8120: 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30  OLUMN ) return 0
8130: 3b 20 2f 2a 20 52 65 73 75 6c 74 20 69 73 20 61  ; /* Result is a
8140: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 72 65 74   column */.  ret
8150: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
8160: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
8170: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a  UBQUERY */../*.*
8180: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
8190: 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 69  is used by the i
81a0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
81b0: 20 74 68 65 20 49 4e 20 28 2e 2e 2e 29 20 6f 70   the IN (...) op
81c0: 65 72 61 74 6f 72 2e 0a 2a 2a 20 49 74 27 73 20  erator..** It's 
81d0: 6a 6f 62 20 69 73 20 74 6f 20 66 69 6e 64 20 6f  job is to find o
81e0: 72 20 63 72 65 61 74 65 20 61 20 62 2d 74 72 65  r create a b-tre
81f0: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
8200: 20 6d 61 79 20 62 65 20 75 73 65 64 0a 2a 2a 20   may be used.** 
8210: 65 69 74 68 65 72 20 74 6f 20 74 65 73 74 20 66  either to test f
8220: 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20 6f 66  or membership of
8230: 20 74 68 65 20 28 2e 2e 2e 29 20 73 65 74 20 6f   the (...) set o
8240: 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  r to iterate thr
8250: 6f 75 67 68 0a 2a 2a 20 69 74 73 20 6d 65 6d 62  ough.** its memb
8260: 65 72 73 2c 20 73 6b 69 70 70 69 6e 67 20 64 75  ers, skipping du
8270: 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  plicates..**.** 
8280: 54 68 65 20 63 75 72 73 6f 72 20 6f 70 65 6e 65  The cursor opene
8290: 64 20 6f 6e 20 74 68 65 20 73 74 72 75 63 74 75  d on the structu
82a0: 72 65 20 28 64 61 74 61 62 61 73 65 20 74 61 62  re (database tab
82b0: 6c 65 2c 20 64 61 74 61 62 61 73 65 20 69 6e 64  le, database ind
82c0: 65 78 20 0a 2a 2a 20 6f 72 20 65 70 68 65 72 6d  ex .** or epherm
82d0: 61 6c 20 74 61 62 6c 65 29 20 69 73 20 73 74 6f  al table) is sto
82e0: 72 65 64 20 69 6e 20 70 58 2d 3e 69 54 61 62 6c  red in pX->iTabl
82f0: 65 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75  e before this fu
8300: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a  nction returns..
8310: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
8320: 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 20  value indicates 
8330: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 74 79  the structure ty
8340: 70 65 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  pe, as follows:.
8350: 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  **.**   IN_INDEX
8360: 5f 52 4f 57 49 44 20 2d 20 54 68 65 20 63 75 72  _ROWID - The cur
8370: 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  sor was opened o
8380: 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62  n a database tab
8390: 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  le..**   IN_INDE
83a0: 58 5f 49 4e 44 45 58 20 2d 20 54 68 65 20 63 75  X_INDEX - The cu
83b0: 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
83c0: 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 69 6e  on a database in
83d0: 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  dex..**   IN_IND
83e0: 45 58 5f 45 50 48 20 2d 20 20 20 54 68 65 20 63  EX_EPH -   The c
83f0: 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  ursor was opened
8400: 20 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c 79 20   on a specially 
8410: 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20  created and.**  
8420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8430: 20 20 70 6f 70 75 6c 61 74 65 64 20 65 70 68 65    populated ephe
8440: 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a  remal table..**.
8450: 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 73  ** An existing s
8460: 74 72 75 63 74 75 72 65 20 6d 61 79 20 6f 6e 6c  tructure may onl
8470: 79 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65  y be used if the
8480: 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68   SELECT is of th
8490: 65 20 73 69 6d 70 6c 65 0a 2a 2a 20 66 6f 72 6d  e simple.** form
84a0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
84b0: 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f 4d  CT <column> FROM
84c0: 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49   <table>.**.** I
84d0: 66 20 70 72 4e 6f 74 46 6f 75 6e 64 20 70 61 72  f prNotFound par
84e0: 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68 65  ameter is 0, the
84f0: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  n the structure 
8500: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
8510: 69 74 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75  iterate.** throu
8520: 67 68 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65  gh the set membe
8530: 72 73 2c 20 73 6b 69 70 70 69 6e 67 20 61 6e 79  rs, skipping any
8540: 20 64 75 70 6c 69 63 61 74 65 73 2e 20 49 6e 20   duplicates. In 
8550: 74 68 69 73 20 63 61 73 65 20 61 6e 0a 2a 2a 20  this case an.** 
8560: 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20  epheremal table 
8570: 6d 75 73 74 20 62 65 20 75 73 65 64 20 75 6e 6c  must be used unl
8580: 65 73 73 20 74 68 65 20 73 65 6c 65 63 74 65 64  ess the selected
8590: 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 67 75 61   <column> is gua
85a0: 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ranteed.** to be
85b0: 20 75 6e 69 71 75 65 20 2d 20 65 69 74 68 65 72   unique - either
85c0: 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20 61   because it is a
85d0: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
85e0: 59 20 4b 45 59 20 6f 72 20 69 74 0a 2a 2a 20 69  Y KEY or it.** i
85f0: 73 20 75 6e 69 71 75 65 20 62 79 20 76 69 72 74  s unique by virt
8600: 75 65 20 6f 66 20 61 20 63 6f 6e 73 74 72 61 69  ue of a constrai
8610: 6e 74 20 6f 72 20 69 6d 70 6c 69 63 69 74 20 69  nt or implicit i
8620: 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ndex..**.** If t
8630: 68 65 20 70 72 4e 6f 74 46 6f 75 6e 64 20 70 61  he prNotFound pa
8640: 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30  rameter is not 0
8650: 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72 75 63  , then the struc
8660: 74 75 72 65 20 77 69 6c 6c 20 62 65 20 75 73 65  ture will be use
8670: 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74 20 73  d .** for fast s
8680: 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65  et membership te
8690: 73 74 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  sts. In this cas
86a0: 65 20 61 6e 20 65 70 68 65 72 65 6d 61 6c 20 74  e an epheremal t
86b0: 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a 20 62 65  able must .** be
86c0: 20 75 73 65 64 20 75 6e 6c 65 73 73 20 3c 63 6f   used unless <co
86d0: 6c 75 6d 6e 3e 20 69 73 20 61 6e 20 49 4e 54 45  lumn> is an INTE
86e0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
86f0: 6f 72 20 61 6e 20 69 6e 64 65 78 20 63 61 6e 20  or an index can 
8700: 0a 2a 2a 20 62 65 20 66 6f 75 6e 64 20 77 69 74  .** be found wit
8710: 68 20 3c 63 6f 6c 75 6d 6e 3e 20 61 73 20 69 74  h <column> as it
8720: 73 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75  s left-most colu
8730: 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  mn..**.** When t
8740: 68 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20  he structure is 
8750: 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 73  being used for s
8760: 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65  et membership te
8770: 73 74 73 2c 20 74 68 65 20 75 73 65 72 0a 2a 2a  sts, the user.**
8780: 20 6e 65 65 64 73 20 74 6f 20 6b 6e 6f 77 20 77   needs to know w
8790: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
87a0: 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  e structure cont
87b0: 61 69 6e 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c  ains an SQL NULL
87c0: 20 0a 2a 2a 20 76 61 6c 75 65 20 69 6e 20 6f 72   .** value in or
87d0: 64 65 72 20 74 6f 20 63 6f 72 72 65 63 74 6c 79  der to correctly
87e0: 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73   evaluate expres
87f0: 73 69 6f 6e 73 20 6c 69 6b 65 20 22 58 20 49 4e  sions like "X IN
8800: 20 28 59 2c 20 5a 29 22 2e 0a 2a 2a 20 49 66 20   (Y, Z)"..** If 
8810: 74 68 65 72 65 20 69 73 20 61 20 63 68 61 6e 63  there is a chanc
8820: 65 20 74 68 61 74 20 74 68 65 20 73 74 72 75 63  e that the struc
8830: 74 75 72 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e  ture may contain
8840: 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61 74   a NULL value at
8850: 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68 65  .** runtime, the
8860: 6e 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20  n a register is 
8870: 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
8880: 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  e register numbe
8890: 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20  r written.** to 
88a0: 2a 70 72 4e 6f 74 46 6f 75 6e 64 2e 20 49 66 20  *prNotFound. If 
88b0: 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e  there is no chan
88c0: 63 65 20 74 68 61 74 20 74 68 65 20 73 74 72 75  ce that the stru
88d0: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61  cture contains a
88e0: 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20  .** NULL value, 
88f0: 74 68 65 6e 20 2a 70 72 4e 6f 74 46 6f 75 6e 64  then *prNotFound
8900: 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67   is left unchang
8910: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72  ed..**.** If a r
8920: 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63  egister is alloc
8930: 61 74 65 64 20 61 6e 64 20 69 74 73 20 6c 6f 63  ated and its loc
8940: 61 74 69 6f 6e 20 73 74 6f 72 65 64 20 69 6e 20  ation stored in 
8950: 2a 70 72 4e 6f 74 46 6f 75 6e 64 2c 20 74 68 65  *prNotFound, the
8960: 6e 0a 2a 2a 20 69 74 73 20 69 6e 69 74 69 61 6c  n.** its initial
8970: 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2e 20   value is NULL. 
8980: 49 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65  If the structure
8990: 20 64 6f 65 73 20 6e 6f 74 20 72 65 6d 61 69 6e   does not remain
89a0: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72   constant.** for
89b0: 20 74 68 65 20 64 75 72 61 74 69 6f 6e 20 6f 66   the duration of
89c0: 20 74 68 65 20 71 75 65 72 79 20 28 69 2e 65 2e   the query (i.e.
89d0: 20 74 68 65 20 73 65 74 20 69 73 20 61 20 63 6f   the set is a co
89e0: 72 72 65 6c 61 74 65 64 20 73 75 62 2d 73 65 6c  rrelated sub-sel
89f0: 65 63 74 29 2c 20 0a 2a 2a 20 74 68 65 20 76 61  ect), .** the va
8a00: 6c 75 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63  lue of the alloc
8a10: 61 74 65 64 20 72 65 67 69 73 74 65 72 20 69 73  ated register is
8a20: 20 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20 65   reset to NULL e
8a30: 61 63 68 20 74 69 6d 65 20 74 68 65 20 0a 2a 2a  ach time the .**
8a40: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 72 65   structure is re
8a50: 70 6f 70 75 6c 61 74 65 64 2e 20 54 68 69 73 20  populated. This 
8a60: 61 6c 6c 6f 77 73 20 74 68 65 20 63 61 6c 6c 65  allows the calle
8a70: 72 20 74 6f 20 75 73 65 20 76 64 62 65 20 63 6f  r to use vdbe co
8a80: 64 65 20 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e  de .** equivalen
8a90: 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  t to the followi
8aa0: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20  ng:.**.**   if( 
8ab0: 72 65 67 69 73 74 65 72 3d 3d 4e 55 4c 4c 20 29  register==NULL )
8ac0: 7b 0a 2a 2a 20 20 20 20 20 68 61 73 5f 6e 75 6c  {.**     has_nul
8ad0: 6c 20 3d 20 3c 74 65 73 74 20 69 66 20 64 61 74  l = <test if dat
8ae0: 61 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  a structure cont
8af0: 61 69 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a 20 20 20  ains null>.**   
8b00: 20 20 72 65 67 69 73 74 65 72 20 3d 20 31 0a 2a    register = 1.*
8b10: 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 69 6e 20 6f  *   }.**.** in o
8b20: 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 72 75  rder to avoid ru
8b30: 6e 6e 69 6e 67 20 74 68 65 20 3c 74 65 73 74 20  nning the <test 
8b40: 69 66 20 64 61 74 61 20 73 74 72 75 63 74 75 72  if data structur
8b50: 65 20 63 6f 6e 74 61 69 6e 73 20 6e 75 6c 6c 3e  e contains null>
8b60: 0a 2a 2a 20 74 65 73 74 20 6d 6f 72 65 20 6f 66  .** test more of
8b70: 74 65 6e 20 74 68 61 6e 20 69 73 20 6e 65 63 65  ten than is nece
8b80: 73 73 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ssary..*/.#ifnde
8b90: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
8ba0: 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74  BQUERY.int sqlit
8bb0: 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 50 61  e3FindInIndex(Pa
8bc0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
8bd0: 72 20 2a 70 58 2c 20 69 6e 74 20 2a 70 72 4e 6f  r *pX, int *prNo
8be0: 74 46 6f 75 6e 64 29 7b 0a 20 20 53 65 6c 65 63  tFound){.  Selec
8bf0: 74 20 2a 70 3b 0a 20 20 69 6e 74 20 65 54 79 70  t *p;.  int eTyp
8c00: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61  e = 0;.  int iTa
8c10: 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
8c20: 2b 2b 3b 0a 20 20 69 6e 74 20 6d 75 73 74 42 65  ++;.  int mustBe
8c30: 55 6e 69 71 75 65 20 3d 20 21 70 72 4e 6f 74 46  Unique = !prNotF
8c40: 6f 75 6e 64 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ound;..  /* The 
8c50: 66 6f 6c 6c 77 69 6e 67 20 69 66 28 2e 2e 2e 29  follwing if(...)
8c60: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
8c70: 72 75 65 20 69 66 20 74 68 65 20 53 45 4c 45 43  rue if the SELEC
8c80: 54 20 69 73 20 6f 66 20 74 68 65 20 0a 20 20 2a  T is of the .  *
8c90: 2a 20 73 69 6d 70 6c 65 20 66 6f 72 6d 3a 0a 20  * simple form:. 
8ca0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
8cb0: 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f  ECT <column> FRO
8cc0: 4d 20 3c 74 61 62 6c 65 3e 0a 20 20 2a 2a 0a 20  M <table>.  **. 
8cd0: 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   ** If this is t
8ce0: 68 65 20 63 61 73 65 2c 20 69 74 20 6d 61 79 20  he case, it may 
8cf0: 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75  be possible to u
8d00: 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74  se an existing t
8d10: 61 62 6c 65 0a 20 20 2a 2a 20 6f 72 20 69 6e 64  able.  ** or ind
8d20: 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20 67 65  ex instead of ge
8d30: 6e 65 72 61 74 69 6e 67 20 61 6e 20 65 70 68 65  nerating an ephe
8d40: 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 20 20 2a  remal table..  *
8d50: 2f 0a 20 20 70 20 3d 20 70 58 2d 3e 70 53 65 6c  /.  p = pX->pSel
8d60: 65 63 74 3b 0a 20 20 69 66 28 20 69 73 43 61 6e  ect;.  if( isCan
8d70: 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
8d80: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
8d90: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
8da0: 62 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  b;.    Index *pI
8db0: 64 78 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  dx;.    Expr *pE
8dc0: 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
8dd0: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
8de0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70   int iCol = pExp
8df0: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
8e00: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
8e10: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
8e20: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 66  ;..    /* This f
8e30: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
8e40: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 74 77 6f 20  called from two 
8e50: 70 6c 61 63 65 73 2e 20 49 6e 20 62 6f 74 68 20  places. In both 
8e60: 63 61 73 65 73 20 74 68 65 20 76 64 62 65 0a 20  cases the vdbe. 
8e70: 20 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64     ** has alread
8e80: 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
8e90: 2e 20 53 6f 20 61 73 73 75 6d 65 20 73 71 6c 69  . So assume sqli
8ea0: 74 65 33 47 65 74 56 64 62 65 28 29 20 69 73 20  te3GetVdbe() is 
8eb0: 61 6c 77 61 79 73 0a 20 20 20 20 2a 2a 20 73 75  always.    ** su
8ec0: 63 63 65 73 73 66 75 6c 20 68 65 72 65 2e 0a 20  ccessful here.. 
8ed0: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
8ee0: 28 76 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f  (v);.    if( iCo
8ef0: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  l<0 ){.      int
8f00: 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65   iMem = ++pParse
8f10: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 6e  ->nMem;.      in
8f20: 74 20 69 41 64 64 72 3b 0a 20 20 20 20 20 20 54  t iAddr;.      T
8f30: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 2d 3e  able *pTab = p->
8f40: 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
8f50: 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d  .      int iDb =
8f60: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
8f70: 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
8f80: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
8f90: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
8fa0: 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 0a 20  tree(v, iDb);.. 
8fb0: 20 20 20 20 20 69 41 64 64 72 20 3d 20 73 71 6c       iAddr = sql
8fc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
8fd0: 2c 20 4f 50 5f 49 66 2c 20 69 4d 65 6d 29 3b 0a  , OP_If, iMem);.
8fe0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8ff0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
9000: 74 65 67 65 72 2c 20 31 2c 20 69 4d 65 6d 29 3b  teger, 1, iMem);
9010: 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ..      sqlite3O
9020: 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
9030: 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62   iTab, iDb, pTab
9040: 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a  , OP_OpenRead);.
9050: 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e        eType = IN
9060: 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 0a 20  _INDEX_ROWID;.. 
9070: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9080: 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64  JumpHere(v, iAdd
9090: 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
90a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c       /* The coll
90b0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75  ation sequence u
90c0: 73 65 64 20 62 79 20 74 68 65 20 63 6f 6d 70 61  sed by the compa
90d0: 72 69 73 6f 6e 2e 20 49 66 20 61 6e 20 69 6e 64  rison. If an ind
90e0: 65 78 20 69 73 20 74 6f 20 0a 20 20 20 20 20 20  ex is to .      
90f0: 2a 2a 20 62 65 20 75 73 65 64 20 69 6e 20 70 6c  ** be used in pl
9100: 61 63 65 20 6f 66 20 61 20 74 65 6d 70 2d 74 61  ace of a temp-ta
9110: 62 6c 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20  ble, it must be 
9120: 6f 72 64 65 72 65 64 20 61 63 63 6f 72 64 69 6e  ordered accordin
9130: 67 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68  g.      ** to th
9140: 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  is collation seq
9150: 75 65 6e 63 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  uence..      */.
9160: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
9170: 52 65 71 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  Req = sqlite3Bin
9180: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
9190: 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c  q(pParse, pX->pL
91a0: 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 0a 20 20  eft, pExpr);..  
91b0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
91c0: 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74  t the affinity t
91d0: 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64  hat will be used
91e0: 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 65 20   to perform the 
91f0: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72  .      ** compar
9200: 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d 65  ison is the same
9210: 20 61 73 20 74 68 65 20 61 66 66 69 6e 69 74 79   as the affinity
9220: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20   of the column. 
9230: 49 66 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69  If.      ** it i
9240: 73 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74  s not, it is not
9250: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65   possible to use
9260: 20 61 6e 79 20 69 6e 64 65 78 2e 0a 20 20 20 20   any index..    
9270: 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65    */.      Table
9280: 20 2a 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63   *pTab = p->pSrc
9290: 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 20  ->a[0].pTab;.   
92a0: 20 20 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f     char aff = co
92b0: 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79  mparisonAffinity
92c0: 28 70 58 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  (pX);.      int 
92d0: 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 28 70  affinity_ok = (p
92e0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
92f0: 61 66 66 69 6e 69 74 79 3d 3d 61 66 66 7c 7c 61  affinity==aff||a
9300: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
9310: 4f 4e 45 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72  ONE);..      for
9320: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
9330: 65 78 3b 20 70 49 64 78 20 26 26 20 65 54 79 70  ex; pIdx && eTyp
9340: 65 3d 3d 30 20 26 26 20 61 66 66 69 6e 69 74 79  e==0 && affinity
9350: 5f 6f 6b 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  _ok; pIdx=pIdx->
9360: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
9370: 69 66 28 20 28 70 49 64 78 2d 3e 61 69 43 6f 6c  if( (pIdx->aiCol
9380: 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 29 0a 20 20  umn[0]==iCol).  
9390: 20 20 20 20 20 20 20 26 26 20 28 70 52 65 71 3d         && (pReq=
93a0: 3d 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c  =sqlite3FindColl
93b0: 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c  Seq(db, ENC(db),
93c0: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d   pIdx->azColl[0]
93d0: 2c 20 2d 31 2c 20 30 29 29 0a 20 20 20 20 20 20  , -1, 0)).      
93e0: 20 20 20 26 26 20 28 21 6d 75 73 74 42 65 55 6e     && (!mustBeUn
93f0: 69 71 75 65 20 7c 7c 20 28 70 49 64 78 2d 3e 6e  ique || (pIdx->n
9400: 43 6f 6c 75 6d 6e 3d 3d 31 20 26 26 20 70 49 64  Column==1 && pId
9410: 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
9420: 6f 6e 65 29 29 0a 20 20 20 20 20 20 20 20 29 7b  one)).        ){
9430: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
9440: 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  Db;.          in
9450: 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  t iMem = ++pPars
9460: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
9470: 20 20 20 69 6e 74 20 69 41 64 64 72 3b 0a 20 20     int iAddr;.  
9480: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 4b          char *pK
9490: 65 79 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20  ey;.  .         
94a0: 20 70 4b 65 79 20 3d 20 28 63 68 61 72 20 2a 29   pKey = (char *)
94b0: 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69  sqlite3IndexKeyi
94c0: 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78  nfo(pParse, pIdx
94d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 44 62  );.          iDb
94e0: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
94f0: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 64 78  ToIndex(db, pIdx
9500: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
9510: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9520: 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44  eUsesBtree(v, iD
9530: 62 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69  b);..          i
9540: 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
9550: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
9560: 66 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  f, iMem);.      
9570: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9580: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
9590: 67 65 72 2c 20 31 2c 20 69 4d 65 6d 29 3b 0a 20  ger, 1, iMem);. 
95a0: 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69   .          sqli
95b0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
95c0: 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
95d0: 73 2c 20 30 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c  s, 0, pIdx->nCol
95e0: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  umn);.          
95f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9600: 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  4(v, OP_OpenRead
9610: 2c 20 69 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e  , iTab, pIdx->tn
9620: 75 6d 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20  um, iDb,.       
9630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9640: 20 20 20 20 20 20 20 20 70 4b 65 79 2c 50 34 5f          pKey,P4_
9650: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
9660: 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
9670: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
9680: 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b  , pIdx->zName));
9690: 0a 20 20 20 20 20 20 20 20 20 20 65 54 79 70 65  .          eType
96a0: 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45   = IN_INDEX_INDE
96b0: 58 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 73 71  X;..          sq
96c0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
96d0: 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20  e(v, iAddr);.   
96e0: 20 20 20 20 20 20 20 69 66 28 20 70 72 4e 6f 74         if( prNot
96f0: 46 6f 75 6e 64 20 26 26 20 21 70 54 61 62 2d 3e  Found && !pTab->
9700: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75  aCol[iCol].notNu
9710: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
9720: 20 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 20 3d 20    *prNotFound = 
9730: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
9740: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
9750: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
9760: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65    }.  }..  if( e
9770: 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Type==0 ){.    i
9780: 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  nt rMayHaveNull 
9790: 3d 20 30 3b 0a 20 20 20 20 65 54 79 70 65 20 3d  = 0;.    eType =
97a0: 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20   IN_INDEX_EPH;. 
97b0: 20 20 20 69 66 28 20 70 72 4e 6f 74 46 6f 75 6e     if( prNotFoun
97c0: 64 20 29 7b 0a 20 20 20 20 20 20 2a 70 72 4e 6f  d ){.      *prNo
97d0: 74 46 6f 75 6e 64 20 3d 20 72 4d 61 79 48 61 76  tFound = rMayHav
97e0: 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65  eNull = ++pParse
97f0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d 65 6c 73  ->nMem;.    }els
9800: 65 20 69 66 28 20 70 58 2d 3e 70 4c 65 66 74 2d  e if( pX->pLeft-
9810: 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 70 58  >iColumn<0 && pX
9820: 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  ->pSelect==0 ){.
9830: 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e        eType = IN
9840: 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20  _INDEX_ROWID;.  
9850: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43    }.    sqlite3C
9860: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
9870: 72 73 65 2c 20 70 58 2c 20 72 4d 61 79 48 61 76  rse, pX, rMayHav
9880: 65 4e 75 6c 6c 2c 20 65 54 79 70 65 3d 3d 49 4e  eNull, eType==IN
9890: 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29 3b 0a 20  _INDEX_ROWID);. 
98a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 58 2d 3e   }else{.    pX->
98b0: 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20  iTable = iTab;. 
98c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70   }.  return eTyp
98d0: 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e;.}.#endif../*.
98e0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
98f0: 20 66 6f 72 20 73 63 61 6c 61 72 20 73 75 62 71   for scalar subq
9900: 75 65 72 69 65 73 20 75 73 65 64 20 61 73 20 61  ueries used as a
9910: 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  n expression.** 
9920: 61 6e 64 20 49 4e 20 6f 70 65 72 61 74 6f 72 73  and IN operators
9930: 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a  .  Examples:.**.
9940: 2a 2a 20 20 20 20 20 28 53 45 4c 45 43 54 20 61  **     (SELECT a
9950: 20 46 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20   FROM b)        
9960: 20 20 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a    -- subquery.**
9970: 20 20 20 20 20 45 58 49 53 54 53 20 28 53 45 4c       EXISTS (SEL
9980: 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20  ECT a FROM b)   
9990: 2d 2d 20 45 58 49 53 54 53 20 73 75 62 71 75 65  -- EXISTS subque
99a0: 72 79 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28  ry.**     x IN (
99b0: 34 2c 35 2c 31 31 29 20 20 20 20 20 20 20 20 20  4,5,11)         
99c0: 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61       -- IN opera
99d0: 74 6f 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e  tor with list on
99e0: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
99f0: 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45  .**     x IN (SE
9a00: 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20  LECT a FROM b)  
9a10: 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f     -- IN operato
9a20: 72 20 77 69 74 68 20 73 75 62 71 75 65 72 79 20  r with subquery 
9a30: 6f 6e 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a  on the right.**.
9a40: 2a 2a 20 54 68 65 20 70 45 78 70 72 20 70 61 72  ** The pExpr par
9a50: 61 6d 65 74 65 72 20 64 65 73 63 72 69 62 65 73  ameter describes
9a60: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9a70: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
9a80: 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72  e IN.** operator
9a90: 20 6f 72 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a   or subquery..**
9aa0: 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
9ab0: 20 69 73 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d   isRowid is non-
9ac0: 7a 65 72 6f 2c 20 74 68 65 6e 20 65 78 70 72 65  zero, then expre
9ad0: 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 67  ssion pExpr is g
9ae0: 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20  uaranteed.** to 
9af0: 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  be of the form "
9b00: 3c 72 6f 77 69 64 3e 20 49 4e 20 28 3f 2c 20 3f  <rowid> IN (?, ?
9b10: 2c 20 3f 29 22 2c 20 77 68 65 72 65 20 3c 72 6f  , ?)", where <ro
9b20: 77 69 64 3e 20 69 73 20 61 20 72 65 66 65 72 65  wid> is a refere
9b30: 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20 69  nce.** to some i
9b40: 6e 74 65 67 65 72 20 6b 65 79 20 63 6f 6c 75 6d  nteger key colum
9b50: 6e 20 6f 66 20 61 20 74 61 62 6c 65 20 42 2d 54  n of a table B-T
9b60: 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ree. In this cas
9b70: 65 2c 20 75 73 65 20 61 6e 0a 2a 2a 20 69 6e 74  e, use an.** int
9b80: 6b 65 79 20 42 2d 54 72 65 65 20 74 6f 20 73 74  key B-Tree to st
9b90: 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 49  ore the set of I
9ba0: 4e 28 2e 2e 2e 29 20 76 61 6c 75 65 73 20 69 6e  N(...) values in
9bb0: 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73 75  stead of the usu
9bc0: 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65 72 29 20 76  al.** (slower) v
9bd0: 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b  ariable length k
9be0: 65 79 73 20 42 2d 54 72 65 65 2e 0a 2a 2f 0a 23  eys B-Tree..*/.#
9bf0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9c00: 49 54 5f 53 55 42 51 55 45 52 59 0a 76 6f 69 64  IT_SUBQUERY.void
9c10: 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
9c20: 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
9c30: 70 50 61 72 73 65 2c 20 0a 20 20 45 78 70 72 20  pParse, .  Expr 
9c40: 2a 70 45 78 70 72 2c 20 0a 20 20 69 6e 74 20 72  *pExpr, .  int r
9c50: 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 0a 20 20 69  MayHaveNull,.  i
9c60: 6e 74 20 69 73 52 6f 77 69 64 0a 29 7b 0a 20 20  nt isRowid.){.  
9c70: 69 6e 74 20 74 65 73 74 41 64 64 72 20 3d 20 30  int testAddr = 0
9c80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9c90: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74          /* One-t
9ca0: 69 6d 65 20 74 65 73 74 20 61 64 64 72 65 73 73  ime test address
9cb0: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
9cc0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
9cd0: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
9ce0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 0a 20  =0 ) return;... 
9cf0: 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 6d 75   /* This code mu
9d00: 73 74 20 62 65 20 72 75 6e 20 69 6e 20 69 74 73  st be run in its
9d10: 20 65 6e 74 69 72 65 74 79 20 65 76 65 72 79 20   entirety every 
9d20: 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75  time it is encou
9d30: 6e 74 65 72 65 64 0a 20 20 2a 2a 20 69 66 20 61  ntered.  ** if a
9d40: 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
9d50: 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a  ing is true:.  *
9d60: 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65  *.  **    *  The
9d70: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
9d80: 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64   is a correlated
9d90: 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20   subquery.  **  
9da0: 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68    *  The right-h
9db0: 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20 65  and side is an e
9dc0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63  xpression list c
9dd0: 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62  ontaining variab
9de0: 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57  les.  **    *  W
9df0: 65 20 61 72 65 20 69 6e 73 69 64 65 20 61 20 74  e are inside a t
9e00: 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a  rigger.  **.  **
9e10: 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61   If all of the a
9e20: 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20  bove are false, 
9e30: 74 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e 20  then we can run 
9e40: 74 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20 6f  this code just o
9e50: 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74 68  nce.  ** save th
9e60: 65 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20 72  e results, and r
9e70: 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 65  euse the same re
9e80: 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65  sult on subseque
9e90: 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a  nt invocations..
9ea0: 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72    */.  if( !Expr
9eb0: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
9ec0: 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65  Expr, EP_VarSele
9ed0: 63 74 29 20 26 26 20 21 70 50 61 72 73 65 2d 3e  ct) && !pParse->
9ee0: 74 72 69 67 53 74 61 63 6b 20 29 7b 0a 20 20 20  trigStack ){.   
9ef0: 20 69 6e 74 20 6d 65 6d 20 3d 20 2b 2b 70 50 61   int mem = ++pPa
9f00: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
9f10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
9f20: 28 76 2c 20 4f 50 5f 49 66 2c 20 6d 65 6d 29 3b  (v, OP_If, mem);
9f30: 0a 20 20 20 20 74 65 73 74 41 64 64 72 20 3d 20  .    testAddr = 
9f40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9f50: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
9f60: 20 31 2c 20 6d 65 6d 29 3b 0a 20 20 20 20 61 73   1, mem);.    as
9f70: 73 65 72 74 28 20 74 65 73 74 41 64 64 72 3e 30  sert( testAddr>0
9f80: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
9f90: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
9fa0: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70    }..  switch( p
9fb0: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
9fc0: 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
9fd0: 20 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74      char affinit
9fe0: 79 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  y;.      KeyInfo
9ff0: 20 6b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20   keyInfo;.      
a000: 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20  int addr;       
a010: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f   /* Address of O
a020: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
a030: 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  instruction */. 
a040: 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
a050: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
a060: 0a 0a 20 20 20 20 20 20 69 66 28 20 72 4d 61 79  ..      if( rMay
a070: 48 61 76 65 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  HaveNull ){.    
a080: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a090: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
a0a0: 2c 20 30 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c  , 0, rMayHaveNul
a0b0: 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  l);.      }..   
a0c0: 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73 71     affinity = sq
a0d0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
a0e0: 79 28 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20  y(pLeft);..     
a0f0: 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69 73   /* Whether this
a100: 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45 4c   is an 'x IN(SEL
a110: 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27  ECT...)' or an '
a120: 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29  x IN(<exprlist>)
a130: 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65  '.      ** expre
a140: 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e 64  ssion it is hand
a150: 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77 61 79  led the same way
a160: 2e 20 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c  . A virtual tabl
a170: 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66  e is .      ** f
a180: 69 6c 6c 65 64 20 77 69 74 68 20 73 69 6e 67 6c  illed with singl
a190: 65 2d 66 69 65 6c 64 20 69 6e 64 65 78 20 6b 65  e-field index ke
a1a0: 79 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  ys representing 
a1b0: 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20  the results.    
a1c0: 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 53 45    ** from the SE
a1d0: 4c 45 43 54 20 6f 72 20 74 68 65 20 3c 65 78 70  LECT or the <exp
a1e0: 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a  rlist>..      **
a1f0: 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65  .      ** If the
a200: 20 27 78 27 20 65 78 70 72 65 73 73 69 6f 6e 20   'x' expression 
a210: 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  is a column valu
a220: 65 2c 20 6f 72 20 74 68 65 20 53 45 4c 45 43 54  e, or the SELECT
a230: 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ....      ** sta
a240: 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 61  tement returns a
a250: 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74   column value, t
a260: 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79  hen the affinity
a270: 20 6f 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a   of that.      *
a280: 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64  * column is used
a290: 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20 69 6e   to build the in
a2a0: 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62 6f 74  dex keys. If bot
a2b0: 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a 20 20  h 'x' and the.  
a2c0: 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e      ** SELECT...
a2d0: 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63   statement are c
a2e0: 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d  olumns, then num
a2f0: 65 72 69 63 20 61 66 66 69 6e 69 74 79 20 69 73  eric affinity is
a300: 20 75 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 69   used.      ** i
a310: 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20  f either column 
a320: 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72 20 49  has NUMERIC or I
a330: 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74 79 2e  NTEGER affinity.
a340: 20 49 66 20 6e 65 69 74 68 65 72 0a 20 20 20 20   If neither.    
a350: 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68 65    ** 'x' nor the
a360: 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65   SELECT... state
a370: 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73  ment are columns
a380: 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61  , then numeric a
a390: 66 66 69 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a  ffinity.      **
a3a0: 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20   is used..      
a3b0: 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  */.      pExpr->
a3c0: 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d  iTable = pParse-
a3d0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61  >nTab++;.      a
a3e0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
a3f0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
a400: 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 45 78  enEphemeral, pEx
a410: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 21 69 73 52  pr->iTable, !isR
a420: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 6d 65 6d  owid);.      mem
a430: 73 65 74 28 26 6b 65 79 49 6e 66 6f 2c 20 30 2c  set(&keyInfo, 0,
a440: 20 73 69 7a 65 6f 66 28 6b 65 79 49 6e 66 6f 29   sizeof(keyInfo)
a450: 29 3b 0a 20 20 20 20 20 20 6b 65 79 49 6e 66 6f  );.      keyInfo
a460: 2e 6e 46 69 65 6c 64 20 3d 20 31 3b 0a 0a 20 20  .nField = 1;..  
a470: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
a480: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
a490: 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20    /* Case 1:    
a4a0: 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54   expr IN (SELECT
a4b0: 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a   ...).        **
a4c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65  .        ** Gene
a4d0: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69  rate code to wri
a4e0: 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  te the results o
a4f0: 66 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74  f the select int
a500: 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a  o the temporary.
a510: 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
a520: 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f   allocated and o
a530: 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20  pened above..   
a540: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
a550: 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
a560: 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
a570: 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20  t *pEList;..    
a580: 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 52      assert( !isR
a590: 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20  owid );.        
a5a0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
a5b0: 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54  tInit(&dest, SRT
a5c0: 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  _Set, pExpr->iTa
a5d0: 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 64 65  ble);.        de
a5e0: 73 74 2e 61 66 66 69 6e 69 74 79 20 3d 20 28 69  st.affinity = (i
a5f0: 6e 74 29 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  nt)affinity;.   
a600: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 45       assert( (pE
a610: 78 70 72 2d 3e 69 54 61 62 6c 65 26 30 78 30 30  xpr->iTable&0x00
a620: 30 30 46 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e  00FFFF)==pExpr->
a630: 69 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20  iTable );.      
a640: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
a650: 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  ect(pParse, pExp
a660: 72 2d 3e 70 53 65 6c 65 63 74 2c 20 26 64 65 73  r->pSelect, &des
a670: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
a680: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
a690: 7d 0a 20 20 20 20 20 20 20 20 70 45 4c 69 73 74  }.        pEList
a6a0: 20 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63   = pExpr->pSelec
a6b0: 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20  t->pEList;.     
a6c0: 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26     if( pEList &&
a6d0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30   pEList->nExpr>0
a6e0: 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 6b   ){ .          k
a6f0: 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20  eyInfo.aColl[0] 
a700: 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
a710: 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
a720: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
a730: 66 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ft,.            
a740: 20 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70    pEList->a[0].p
a750: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Expr);.        }
a760: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
a770: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b   pExpr->pList ){
a780: 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65  .        /* Case
a790: 20 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20   2:     expr IN 
a7a0: 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20 20  (exprlist).     
a7b0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
a7c0: 20 46 6f 72 20 65 61 63 68 20 65 78 70 72 65 73   For each expres
a7d0: 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69  sion, build an i
a7e0: 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74 68  ndex key from th
a7f0: 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64  e evaluation and
a800: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  .        ** stor
a810: 65 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70  e it in the temp
a820: 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20  orary table. If 
a830: 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75  <expr> is a colu
a840: 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20  mn, then use.   
a850: 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c       ** that col
a860: 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77 68  umns affinity wh
a870: 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64 65  en building inde
a880: 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70 72  x keys. If <expr
a890: 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20  > is not.       
a8a0: 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73   ** a column, us
a8b0: 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  e numeric affini
a8c0: 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ty..        */. 
a8d0: 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
a8e0: 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
a8f0: 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70  pList = pExpr->p
a900: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 73 74  List;.        st
a910: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
a920: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20  em *pItem;.     
a930: 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72     int r1, r2, r
a940: 33 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  3;..        if( 
a950: 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20  !affinity ){.   
a960: 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20         affinity 
a970: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
a980: 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
a990: 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f       keyInfo.aCo
a9a0: 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 45  ll[0] = sqlite3E
a9b0: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
a9c0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
a9d0: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  ;..        /* Lo
a9e0: 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  op through each 
a9f0: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65  expression in <e
aa00: 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20  xprlist>. */.   
aa10: 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
aa20: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
aa30: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20  se);.        r2 
aa40: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
aa50: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
aa60: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
aa70: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
aa80: 6c 2c 20 30 2c 20 72 32 29 3b 0a 20 20 20 20 20  l, 0, r2);.     
aa90: 20 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e     for(i=pList->
aaa0: 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69  nExpr, pItem=pLi
aab0: 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  st->a; i>0; i--,
aac0: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
aad0: 20 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d       Expr *pE2 =
aae0: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a   pItem->pExpr;..
aaf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
ab00: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
ab10: 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74  s not constant t
ab20: 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  hen we will need
ab30: 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   to.          **
ab40: 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 73   disable the tes
ab50: 74 20 74 68 61 74 20 77 61 73 20 67 65 6e 65 72  t that was gener
ab60: 61 74 65 64 20 61 62 6f 76 65 20 74 68 61 74 20  ated above that 
ab70: 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20  makes sure.     
ab80: 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64       ** this cod
ab90: 65 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20  e only executes 
aba0: 6f 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20 66  once.  Because f
abb0: 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e  or a non-constan
abc0: 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65  t.          ** e
abd0: 78 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65  xpression we nee
abe0: 64 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20  d to rerun this 
abf0: 63 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a  code each time..
ac00: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
ac10: 20 20 20 20 20 20 20 69 66 28 20 74 65 73 74 41         if( testA
ac20: 64 64 72 20 26 26 20 21 73 71 6c 69 74 65 33 45  ddr && !sqlite3E
ac30: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45  xprIsConstant(pE
ac40: 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  2) ){.          
ac50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
ac60: 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 74 65 73  ngeToNoop(v, tes
ac70: 74 41 64 64 72 2d 31 2c 20 32 29 3b 0a 20 20 20  tAddr-1, 2);.   
ac80: 20 20 20 20 20 20 20 20 20 74 65 73 74 41 64 64           testAdd
ac90: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  r = 0;.         
aca0: 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   }..          /*
acb0: 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 78   Evaluate the ex
acc0: 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73  pression and ins
acd0: 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20  ert it into the 
ace0: 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20  temp table */.  
acf0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
ad00: 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b  disableColCache+
ad10: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 72 33 20  +;.          r3 
ad20: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
ad30: 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
ad40: 70 45 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  pE2, r1);.      
ad50: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
ad60: 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61  se->disableColCa
ad70: 63 68 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  che>0 );.       
ad80: 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62     pParse->disab
ad90: 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 0a 20  leColCache--;.. 
ada0: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52           if( isR
adb0: 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
adc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
add0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp2(v, OP_Must
ade0: 42 65 49 6e 74 2c 20 72 33 2c 20 73 71 6c 69 74  BeInt, r3, sqlit
adf0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
ae00: 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20 20 20  r(v)+2);.       
ae10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ae20: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
ae30: 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  ert, pExpr->iTab
ae40: 6c 65 2c 20 72 32 2c 20 72 33 29 3b 0a 20 20 20  le, r2, r3);.   
ae50: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
ae60: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ae70: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
ae80: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 33  P_MakeRecord, r3
ae90: 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69  , 1, r2, &affini
aea0: 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ty, 1);.        
aeb0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
aec0: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
aed0: 67 65 28 70 50 61 72 73 65 2c 20 72 33 2c 20 31  ge(pParse, r3, 1
aee0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
aef0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
af00: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
af10: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
af20: 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r2);.          
af30: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
af40: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
af50: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
af60: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73  , r1);.        s
af70: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
af80: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29  pReg(pParse, r2)
af90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
afa0: 69 66 28 20 21 69 73 52 6f 77 69 64 20 29 7b 0a  if( !isRowid ){.
afb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
afc0: 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61  dbeChangeP4(v, a
afd0: 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 26 6b 65  ddr, (void *)&ke
afe0: 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
aff0: 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  O);.      }.    
b000: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
b010: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53      case TK_EXIS
b020: 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  TS:.    case TK_
b030: 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  SELECT: {.      
b040: 2f 2a 20 54 68 69 73 20 68 61 73 20 74 6f 20 62  /* This has to b
b050: 65 20 61 20 73 63 61 6c 61 72 20 53 45 4c 45 43  e a scalar SELEC
b060: 54 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64  T.  Generate cod
b070: 65 20 74 6f 20 70 75 74 20 74 68 65 0a 20 20 20  e to put the.   
b080: 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74     ** value of t
b090: 68 69 73 20 73 65 6c 65 63 74 20 69 6e 20 61 20  his select in a 
b0a0: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20  memory cell and 
b0b0: 72 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65  record the numbe
b0c0: 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  r.      ** of th
b0d0: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e  e memory cell in
b0e0: 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20   iColumn..      
b0f0: 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  */.      static 
b100: 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 6f 6e 65 20  const Token one 
b110: 3d 20 7b 20 28 75 38 2a 29 22 31 22 2c 20 30 2c  = { (u8*)"1", 0,
b120: 20 31 20 7d 3b 0a 20 20 20 20 20 20 53 65 6c 65   1 };.      Sele
b130: 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20 20 20 20  ct *pSel;.      
b140: 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
b150: 0a 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20 70  ..      pSel = p
b160: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  Expr->pSelect;. 
b170: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
b180: 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
b190: 2c 20 30 2c 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  , 0, ++pParse->n
b1a0: 4d 65 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Mem);.      if( 
b1b0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
b1c0: 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LECT ){.        
b1d0: 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
b1e0: 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 73 71  _Mem;.        sq
b1f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
b200: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64  v, OP_Null, 0, d
b210: 65 73 74 2e 69 50 61 72 6d 29 3b 0a 20 20 20 20  est.iParm);.    
b220: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
b230: 28 76 2c 20 22 49 6e 69 74 20 73 75 62 71 75 65  (v, "Init subque
b240: 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20  ry result"));.  
b250: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b260: 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20     dest.eDest = 
b270: 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20 20  SRT_Exists;.    
b280: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b290: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
b2a0: 67 65 72 2c 20 30 2c 20 64 65 73 74 2e 69 50 61  ger, 0, dest.iPa
b2b0: 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  rm);.        Vdb
b2c0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e  eComment((v, "In
b2d0: 69 74 20 45 58 49 53 54 53 20 72 65 73 75 6c 74  it EXISTS result
b2e0: 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  "));.      }.   
b2f0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
b300: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
b310: 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a   pSel->pLimit);.
b320: 20 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d        pSel->pLim
b330: 69 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  it = sqlite3PExp
b340: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 54  r(pParse, TK_INT
b350: 45 47 45 52 2c 20 30 2c 20 30 2c 20 26 6f 6e 65  EGER, 0, 0, &one
b360: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  );.      if( sql
b370: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
b380: 65 2c 20 70 53 65 6c 2c 20 26 64 65 73 74 29 20  e, pSel, &dest) 
b390: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
b3a0: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
b3b0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
b3c0: 3d 20 64 65 73 74 2e 69 50 61 72 6d 3b 0a 20 20  = dest.iParm;.  
b3d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b3e0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 74 65 73 74  .  }..  if( test
b3f0: 41 64 64 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  Addr ){.    sqli
b400: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
b410: 76 2c 20 74 65 73 74 41 64 64 72 2d 31 29 3b 0a  v, testAddr-1);.
b420: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 3b 0a 7d    }..  return;.}
b430: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
b440: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
b450: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 75 70 6c 69 63  */../*.** Duplic
b460: 61 74 65 20 61 6e 20 38 2d 62 79 74 65 20 76 61  ate an 8-byte va
b470: 6c 75 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  lue.*/.static ch
b480: 61 72 20 2a 64 75 70 38 62 79 74 65 73 28 56 64  ar *dup8bytes(Vd
b490: 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61  be *v, const cha
b4a0: 72 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a  r *in){.  char *
b4b0: 6f 75 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  out = sqlite3DbM
b4c0: 61 6c 6c 6f 63 52 61 77 28 73 71 6c 69 74 65 33  allocRaw(sqlite3
b4d0: 56 64 62 65 44 62 28 76 29 2c 20 38 29 3b 0a 20  VdbeDb(v), 8);. 
b4e0: 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20   if( out ){.    
b4f0: 6d 65 6d 63 70 79 28 6f 75 74 2c 20 69 6e 2c 20  memcpy(out, in, 
b500: 38 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  8);.  }.  return
b510: 20 6f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47   out;.}../*.** G
b520: 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72  enerate an instr
b530: 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  uction that will
b540: 20 70 75 74 20 74 68 65 20 66 6c 6f 61 74 69 6e   put the floatin
b550: 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65  g point.** value
b560: 20 64 65 73 63 72 69 62 65 64 20 62 79 20 7a 5b   described by z[
b570: 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67  0..n-1] into reg
b580: 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a  ister iMem..**.*
b590: 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67  * The z[] string
b5a0: 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e   will probably n
b5b0: 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69  ot be zero-termi
b5c0: 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68 65 20  nated.  But the 
b5d0: 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74  .** z[n] charact
b5e0: 65 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  er is guaranteed
b5f0: 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67   to be something
b600: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c   that does not l
b610: 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20  ook.** like the 
b620: 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20  continuation of 
b630: 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73  the number..*/.s
b640: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 52  tatic void codeR
b650: 65 61 6c 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e  eal(Vdbe *v, con
b660: 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
b670: 6e 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61  n, int negateFla
b680: 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20  g, int iMem){.  
b690: 61 73 73 65 72 74 28 20 7a 20 7c 7c 20 76 3d 3d  assert( z || v==
b6a0: 30 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65  0 || sqlite3Vdbe
b6b0: 44 62 28 76 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69  Db(v)->mallocFai
b6c0: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 7a 20 29  led );.  if( z )
b6d0: 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c  {.    double val
b6e0: 75 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 56  ue;.    char *zV
b6f0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69  ;.    assert( !i
b700: 73 64 69 67 69 74 28 7a 5b 6e 5d 29 20 29 3b 0a  sdigit(z[n]) );.
b710: 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46 28      sqlite3AtoF(
b720: 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20 20 20  z, &value);.    
b730: 69 66 28 20 73 71 6c 69 74 65 33 49 73 4e 61 4e  if( sqlite3IsNaN
b740: 28 76 61 6c 75 65 29 20 29 7b 0a 20 20 20 20 20  (value) ){.     
b750: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b760: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
b770: 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 7d 65 6c  , iMem);.    }el
b780: 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  se{.      if( ne
b790: 67 61 74 65 46 6c 61 67 20 29 20 76 61 6c 75 65  gateFlag ) value
b7a0: 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20 20   = -value;.     
b7b0: 20 7a 56 20 3d 20 64 75 70 38 62 79 74 65 73 28   zV = dup8bytes(
b7c0: 76 2c 20 28 63 68 61 72 2a 29 26 76 61 6c 75 65  v, (char*)&value
b7d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b7e0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
b7f0: 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20  _Real, 0, iMem, 
b800: 30 2c 20 7a 56 2c 20 50 34 5f 52 45 41 4c 29 3b  0, zV, P4_REAL);
b810: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f  .    }.  }.}.../
b820: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e  *.** Generate an
b830: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61   instruction tha
b840: 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 69  t will put the i
b850: 6e 74 65 67 65 72 20 64 65 73 63 72 69 62 65 20  nteger describe 
b860: 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e  by.** text z[0..
b870: 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74  n-1] into regist
b880: 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54  er iMem..**.** T
b890: 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69  he z[] string wi
b8a0: 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20  ll probably not 
b8b0: 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74  be zero-terminat
b8c0: 65 64 2e 20 20 42 75 74 20 74 68 65 20 0a 2a 2a  ed.  But the .**
b8d0: 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65 72 20   z[n] character 
b8e0: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
b8f0: 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 20 74 68   be something th
b900: 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b  at does not look
b910: 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e  .** like the con
b920: 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65  tinuation of the
b930: 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74   number..*/.stat
b940: 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65  ic void codeInte
b950: 67 65 72 28 56 64 62 65 20 2a 76 2c 20 45 78 70  ger(Vdbe *v, Exp
b960: 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 6e 65  r *pExpr, int ne
b970: 67 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29  gFlag, int iMem)
b980: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
b990: 7a 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  z;.  if( pExpr->
b9a0: 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61  flags & EP_IntVa
b9b0: 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  lue ){.    int i
b9c0: 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
b9d0: 3b 0a 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61  ;.    if( negFla
b9e0: 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20  g ) i = -i;.    
b9f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ba00: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
ba10: 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c   i, iMem);.  }el
ba20: 73 65 20 69 66 28 20 28 7a 20 3d 20 28 63 68 61  se if( (z = (cha
ba30: 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  r*)pExpr->token.
ba40: 7a 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  z)!=0 ){.    int
ba50: 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20   i;.    int n = 
ba60: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a  pExpr->token.n;.
ba70: 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 64      assert( !isd
ba80: 69 67 69 74 28 7a 5b 6e 5d 29 20 29 3b 0a 20 20  igit(z[n]) );.  
ba90: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 65 74    if( sqlite3Get
baa0: 49 6e 74 33 32 28 7a 2c 20 26 69 29 20 29 7b 0a  Int32(z, &i) ){.
bab0: 20 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61        if( negFla
bac0: 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20  g ) i = -i;.    
bad0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bae0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
baf0: 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  r, i, iMem);.   
bb00: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
bb10: 65 33 46 69 74 73 49 6e 36 34 42 69 74 73 28 7a  e3FitsIn64Bits(z
bb20: 2c 20 6e 65 67 46 6c 61 67 29 20 29 7b 0a 20 20  , negFlag) ){.  
bb30: 20 20 20 20 69 36 34 20 76 61 6c 75 65 3b 0a 20      i64 value;. 
bb40: 20 20 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20       char *zV;. 
bb50: 20 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f 69       sqlite3Atoi
bb60: 36 34 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20  64(z, &value);. 
bb70: 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67       if( negFlag
bb80: 20 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75   ) value = -valu
bb90: 65 3b 0a 20 20 20 20 20 20 7a 56 20 3d 20 64 75  e;.      zV = du
bba0: 70 38 62 79 74 65 73 28 76 2c 20 28 63 68 61 72  p8bytes(v, (char
bbb0: 2a 29 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 20  *)&value);.     
bbc0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bbd0: 70 34 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20  p4(v, OP_Int64, 
bbe0: 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20  0, iMem, 0, zV, 
bbf0: 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d  P4_INT64);.    }
bc00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 64 65  else{.      code
bc10: 52 65 61 6c 28 76 2c 20 7a 2c 20 6e 2c 20 6e 65  Real(v, z, n, ne
bc20: 67 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 20 20  gFlag, iMem);.  
bc30: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a    }.  }.}.../*.*
bc40: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
bc50: 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63  that will extrac
bc60: 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68  t the iColumn-th
bc70: 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20   column from.** 
bc80: 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 73  table pTab and s
bc90: 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  tore the column 
bca0: 76 61 6c 75 65 20 69 6e 20 61 20 72 65 67 69 73  value in a regis
bcb0: 74 65 72 2e 20 20 41 6e 20 65 66 66 6f 72 74 0a  ter.  An effort.
bcc0: 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 73 74  ** is made to st
bcd0: 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76  ore the column v
bce0: 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
bcf0: 20 69 52 65 67 2c 20 62 75 74 20 74 68 69 73 20   iReg, but this 
bd00: 69 73 0a 2a 2a 20 6e 6f 74 20 67 75 61 72 61 6e  is.** not guaran
bd10: 74 65 65 64 2e 20 20 54 68 65 20 6c 6f 63 61 74  teed.  The locat
bd20: 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ion of the colum
bd30: 6e 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72  n value is retur
bd40: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  ned..**.** There
bd50: 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e   must be an open
bd60: 20 63 75 72 73 6f 72 20 74 6f 20 70 54 61 62 20   cursor to pTab 
bd70: 69 6e 20 69 54 61 62 6c 65 20 77 68 65 6e 20 74  in iTable when t
bd80: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
bd90: 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 69 43  s called.  If iC
bda0: 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64  olumn<0 then cod
bdb0: 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74  e is generated t
bdc0: 68 61 74 20 65 78 74 72 61 63 74 73 20 74 68 65  hat extracts the
bdd0: 20 72 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   rowid..**.** Th
bde0: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
bdf0: 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 75 73   attempt to reus
be00: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
be10: 68 65 20 63 6f 6c 75 6d 6e 20 74 68 61 74 0a 2a  he column that.*
be20: 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  * has already be
be30: 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 61  en loaded into a
be40: 20 72 65 67 69 73 74 65 72 2e 20 20 54 68 65 20   register.  The 
be50: 76 61 6c 75 65 20 77 69 6c 6c 20 61 6c 77 61 79  value will alway
be60: 73 0a 2a 2a 20 62 65 20 75 73 65 64 20 69 66 20  s.** be used if 
be70: 69 74 20 68 61 73 20 6e 6f 74 20 75 6e 64 65 72  it has not under
be80: 67 6f 6e 65 20 61 6e 79 20 61 66 66 69 6e 69 74  gone any affinit
be90: 79 20 63 68 61 6e 67 65 73 2e 20 20 42 75 74 20  y changes.  But 
bea0: 69 66 0a 2a 2a 20 61 6e 20 61 66 66 69 6e 69 74  if.** an affinit
beb0: 79 20 63 68 61 6e 67 65 20 68 61 73 20 6f 63 63  y change has occ
bec0: 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20  urred, then the 
bed0: 63 61 63 68 65 64 20 76 61 6c 75 65 20 77 69 6c  cached value wil
bee0: 6c 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 75 73 65  l only be.** use
bef0: 64 20 69 66 20 61 6c 6c 6f 77 41 66 66 43 68 6e  d if allowAffChn
bf00: 67 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e  g is true..*/.in
bf10: 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
bf20: 65 47 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61  eGetColumn(.  Pa
bf30: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f  rse *pParse,   /
bf40: 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
bf50: 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
bf60: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65  ntext */.  Table
bf70: 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44   *pTab,     /* D
bf80: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
bf90: 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 72  e table we are r
bfa0: 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20  eading from */. 
bfb0: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
bfc0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
bfd0: 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a  e table column *
bfe0: 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
bff0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
c000: 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  or pointing to t
c010: 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  he table */.  in
c020: 74 20 69 52 65 67 2c 20 20 20 20 20 20 20 20 2f  t iReg,        /
c030: 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20  * Store results 
c040: 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 61 6c  here */.  int al
c050: 6c 6f 77 41 66 66 43 68 6e 67 20 2f 2a 20 54 72  lowAffChng /* Tr
c060: 75 65 20 69 66 20 70 72 69 6f 72 20 61 66 66 69  ue if prior affi
c070: 6e 69 74 79 20 63 68 61 6e 67 65 73 20 61 72 65  nity changes are
c080: 20 4f 4b 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65   OK */.){.  Vdbe
c090: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
c0a0: 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
c0b0: 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
c0c0: 20 2a 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c   *p;..  for(i=0,
c0d0: 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
c0e0: 61 63 68 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e  ache; i<pParse->
c0f0: 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20  nColCache; i++, 
c100: 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  p++){.    if( p-
c110: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20  >iTable==iTable 
c120: 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69  && p->iColumn==i
c130: 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20 20  Column.         
c140: 20 20 26 26 20 28 21 70 2d 3e 61 66 66 43 68 61    && (!p->affCha
c150: 6e 67 65 20 7c 7c 20 61 6c 6c 6f 77 41 66 66 43  nge || allowAffC
c160: 68 6e 67 29 20 29 7b 0a 23 69 66 20 30 0a 20 20  hng) ){.#if 0.  
c170: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c180: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4e 6f 6f 70  ddOp0(v, OP_Noop
c190: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
c1a0: 6d 65 6e 74 28 28 76 2c 20 22 4f 50 54 3a 20 74  ment((v, "OPT: t
c1b0: 61 62 25 64 2e 63 6f 6c 25 64 20 2d 3e 20 72 25  ab%d.col%d -> r%
c1c0: 64 22 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c  d", iTable, iCol
c1d0: 75 6d 6e 2c 20 70 2d 3e 69 52 65 67 29 29 3b 0a  umn, p->iReg));.
c1e0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74  #endif.      ret
c1f0: 75 72 6e 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20  urn p->iReg;.   
c200: 20 7d 0a 20 20 7d 20 20 0a 20 20 61 73 73 65 72   }.  }  .  asser
c210: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 69 66 28  t( v!=0 );.  if(
c220: 20 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20   iColumn<0 ){.  
c230: 20 20 69 6e 74 20 6f 70 20 3d 20 28 70 54 61 62    int op = (pTab
c240: 20 26 26 20 49 73 56 69 72 74 75 61 6c 28 70 54   && IsVirtual(pT
c250: 61 62 29 29 20 3f 20 4f 50 5f 56 52 6f 77 69 64  ab)) ? OP_VRowid
c260: 20 3a 20 4f 50 5f 52 6f 77 69 64 3b 0a 20 20 20   : OP_Rowid;.   
c270: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c280: 70 32 28 76 2c 20 6f 70 2c 20 69 54 61 62 6c 65  p2(v, op, iTable
c290: 2c 20 69 52 65 67 29 3b 0a 20 20 7d 65 6c 73 65  , iReg);.  }else
c2a0: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
c2b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c2c0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
c2d0: 6d 6e 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c  mn, iTable, iCol
c2e0: 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 7d 65  umn, iReg);.  }e
c2f0: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20  lse{.    int op 
c300: 3d 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  = IsVirtual(pTab
c310: 29 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a  ) ? OP_VColumn :
c320: 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20   OP_Column;.    
c330: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c340: 33 28 76 2c 20 6f 70 2c 20 69 54 61 62 6c 65 2c  3(v, op, iTable,
c350: 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b   iColumn, iReg);
c360: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75  .    sqlite3Colu
c370: 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61  mnDefault(v, pTa
c380: 62 2c 20 69 43 6f 6c 75 6d 6e 29 3b 0a 23 69 66  b, iColumn);.#if
c390: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c3a0: 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
c3b0: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 61 43      if( pTab->aC
c3c0: 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69  ol[iColumn].affi
c3d0: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
c3e0: 5f 52 45 41 4c 20 29 7b 0a 20 20 20 20 20 20 73  _REAL ){.      s
c3f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
c400: 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e  (v, OP_RealAffin
c410: 69 74 79 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  ity, iReg);.    
c420: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69  }.#endif.  }.  i
c430: 66 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62  f( pParse->disab
c440: 6c 65 43 6f 6c 43 61 63 68 65 3d 3d 30 20 29 7b  leColCache==0 ){
c450: 0a 20 20 20 20 69 20 3d 20 70 50 61 72 73 65 2d  .    i = pParse-
c460: 3e 69 43 6f 6c 43 61 63 68 65 3b 0a 20 20 20 20  >iColCache;.    
c470: 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43 6f  p = &pParse->aCo
c480: 6c 43 61 63 68 65 5b 69 5d 3b 0a 20 20 20 20 70  lCache[i];.    p
c490: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c  ->iTable = iTabl
c4a0: 65 3b 0a 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d  e;.    p->iColum
c4b0: 6e 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  n = iColumn;.   
c4c0: 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b   p->iReg = iReg;
c4d0: 0a 20 20 20 20 70 2d 3e 61 66 66 43 68 61 6e 67  .    p->affChang
c4e0: 65 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a  e = 0;.    i++;.
c4f0: 20 20 20 20 69 66 28 20 69 3e 3d 41 72 72 61 79      if( i>=Array
c500: 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 43 6f  Size(pParse->aCo
c510: 6c 43 61 63 68 65 29 20 29 20 69 20 3d 20 30 3b  lCache) ) i = 0;
c520: 0a 20 20 20 20 69 66 28 20 69 3e 70 50 61 72 73  .    if( i>pPars
c530: 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 29 20 70  e->nColCache ) p
c540: 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65  Parse->nColCache
c550: 20 3d 20 69 3b 0a 20 20 20 20 70 50 61 72 73 65   = i;.    pParse
c560: 2d 3e 69 43 6f 6c 43 61 63 68 65 20 3d 20 69 3b  ->iColCache = i;
c570: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52  .  }.  return iR
c580: 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  eg;.}../*.** Cle
c590: 61 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61  ar all column ca
c5a0: 63 68 65 20 65 6e 74 72 69 65 73 20 61 73 73 6f  che entries asso
c5b0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
c5c0: 76 64 62 65 0a 2a 2a 20 63 75 72 73 6f 72 20 77  vdbe.** cursor w
c5d0: 69 74 68 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  ith cursor numbe
c5e0: 72 20 69 54 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69  r iTable..*/.voi
c5f0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6c 65  d sqlite3ExprCle
c600: 61 72 43 6f 6c 75 6d 6e 43 61 63 68 65 28 50 61  arColumnCache(Pa
c610: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
c620: 20 69 54 61 62 6c 65 29 7b 0a 20 20 69 66 28 20   iTable){.  if( 
c630: 69 54 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20  iTable<0 ){.    
c640: 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
c650: 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 72 73  e = 0;.    pPars
c660: 65 2d 3e 69 43 6f 6c 43 61 63 68 65 20 3d 20 30  e->iColCache = 0
c670: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
c680: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
c690: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f  0; i<pParse->nCo
c6a0: 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b 0a 20 20  lCache; i++){.  
c6b0: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
c6c0: 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 54 61  aColCache[i].iTa
c6d0: 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20  ble==iTable ){. 
c6e0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
c6f0: 20 69 3d 3d 70 50 61 72 73 65 2d 3e 6e 43 6f 6c   i==pParse->nCol
c700: 43 61 63 68 65 2d 31 20 29 3b 0a 20 20 20 20 20  Cache-1 );.     
c710: 20 20 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43     pParse->aColC
c720: 61 63 68 65 5b 69 5d 20 3d 20 70 50 61 72 73 65  ache[i] = pParse
c730: 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 2d 2d 70 50  ->aColCache[--pP
c740: 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 5d  arse->nColCache]
c750: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
c760: 2d 3e 69 43 6f 6c 43 61 63 68 65 20 3d 20 70 50  ->iColCache = pP
c770: 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b  arse->nColCache;
c780: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
c790: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f   }.}../*.** Reco
c7a0: 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74  rd the fact that
c7b0: 20 61 6e 20 61 66 66 69 6e 69 74 79 20 63 68 61   an affinity cha
c7c0: 6e 67 65 20 68 61 73 20 6f 63 63 75 72 72 65 64  nge has occurred
c7d0: 20 6f 6e 20 69 43 6f 75 6e 74 0a 2a 2a 20 72 65   on iCount.** re
c7e0: 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
c7f0: 20 77 69 74 68 20 69 53 74 61 72 74 2e 0a 2a 2f   with iStart..*/
c800: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
c810: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
c820: 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  ange(Parse *pPar
c830: 73 65 2c 20 69 6e 74 20 69 53 74 61 72 74 2c 20  se, int iStart, 
c840: 69 6e 74 20 69 43 6f 75 6e 74 29 7b 0a 20 20 69  int iCount){.  i
c850: 6e 74 20 69 45 6e 64 20 3d 20 69 53 74 61 72 74  nt iEnd = iStart
c860: 20 2b 20 69 43 6f 75 6e 74 20 2d 20 31 3b 0a 20   + iCount - 1;. 
c870: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
c880: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f  0; i<pParse->nCo
c890: 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b 0a 20 20  lCache; i++){.  
c8a0: 20 20 69 6e 74 20 72 20 3d 20 70 50 61 72 73 65    int r = pParse
c8b0: 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69  ->aColCache[i].i
c8c0: 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d  Reg;.    if( r>=
c8d0: 69 53 74 61 72 74 20 26 26 20 72 3c 3d 69 45 6e  iStart && r<=iEn
c8e0: 64 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  d ){.      pPars
c8f0: 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e  e->aColCache[i].
c900: 61 66 66 43 68 61 6e 67 65 20 3d 20 31 3b 0a 20  affChange = 1;. 
c910: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
c920: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
c930: 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74 20  to move content 
c940: 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20 69  from registers i
c950: 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65  From...iFrom+nRe
c960: 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69  g-1.** over to i
c970: 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 20  To..iTo+nReg-1. 
c980: 4b 65 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e 20  Keep the column 
c990: 63 61 63 68 65 20 75 70 2d 74 6f 2d 64 61 74 65  cache up-to-date
c9a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
c9b0: 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 50 61  3ExprCodeMove(Pa
c9c0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
c9d0: 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c   iFrom, int iTo,
c9e0: 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e   int nReg){.  in
c9f0: 74 20 69 3b 0a 20 20 69 66 28 20 69 46 72 6f 6d  t i;.  if( iFrom
ca00: 3d 3d 69 54 6f 20 29 20 72 65 74 75 72 6e 3b 0a  ==iTo ) return;.
ca10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ca20: 4f 70 33 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op3(pParse->pVdb
ca30: 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f  e, OP_Move, iFro
ca40: 6d 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a 20  m, iTo, nReg);. 
ca50: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
ca60: 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69  se->nColCache; i
ca70: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d  ++){.    int x =
ca80: 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63   pParse->aColCac
ca90: 68 65 5b 69 5d 2e 69 52 65 67 3b 0a 20 20 20 20  he[i].iReg;.    
caa0: 69 66 28 20 78 3e 3d 69 46 72 6f 6d 20 26 26 20  if( x>=iFrom && 
cab0: 78 3c 69 46 72 6f 6d 2b 6e 52 65 67 20 29 7b 0a  x<iFrom+nReg ){.
cac0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 43        pParse->aC
cad0: 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67 20  olCache[i].iReg 
cae0: 2b 3d 20 69 54 6f 2d 69 46 72 6f 6d 3b 0a 20 20  += iTo-iFrom;.  
caf0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
cb00: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
cb10: 6f 20 63 6f 70 79 20 63 6f 6e 74 65 6e 74 20 66  o copy content f
cb20: 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20 69 46  rom registers iF
cb30: 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67  rom...iFrom+nReg
cb40: 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54  -1.** over to iT
cb50: 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 0a 2a  o..iTo+nReg-1..*
cb60: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
cb70: 70 72 43 6f 64 65 43 6f 70 79 28 50 61 72 73 65  prCodeCopy(Parse
cb80: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46   *pParse, int iF
cb90: 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e  rom, int iTo, in
cba0: 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t nReg){.  int i
cbb0: 3b 0a 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 69  ;.  if( iFrom==i
cbc0: 54 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  To ) return;.  f
cbd0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 67 3b 20  or(i=0; i<nReg; 
cbe0: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
cbf0: 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72  3VdbeAddOp2(pPar
cc00: 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43 6f  se->pVdbe, OP_Co
cc10: 70 79 2c 20 69 46 72 6f 6d 2b 69 2c 20 69 54 6f  py, iFrom+i, iTo
cc20: 2b 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  +i);.  }.}../*.*
cc30: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
cc40: 20 61 6e 79 20 72 65 67 69 73 74 65 72 20 69 6e   any register in
cc50: 20 74 68 65 20 72 61 6e 67 65 20 69 46 72 6f 6d   the range iFrom
cc60: 2e 2e 69 54 6f 20 28 69 6e 63 6c 75 73 69 76 65  ..iTo (inclusive
cc70: 29 0a 2a 2a 20 69 73 20 75 73 65 64 20 61 73 20  ).** is used as 
cc80: 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6c 75  part of the colu
cc90: 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61  mn cache..*/.sta
cca0: 74 69 63 20 69 6e 74 20 75 73 65 64 41 73 43 6f  tic int usedAsCo
ccb0: 6c 75 6d 6e 43 61 63 68 65 28 50 61 72 73 65 20  lumnCache(Parse 
ccc0: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72  *pParse, int iFr
ccd0: 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20  om, int iTo){.  
cce0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
ccf0: 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  ; i<pParse->nCol
cd00: 43 61 63 68 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  Cache; i++){.   
cd10: 20 69 6e 74 20 72 20 3d 20 70 50 61 72 73 65 2d   int r = pParse-
cd20: 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52  >aColCache[i].iR
cd30: 65 67 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 69  eg;.    if( r>=i
cd40: 46 72 6f 6d 20 26 26 20 72 3c 3d 69 54 6f 20 29  From && r<=iTo )
cd50: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
cd60: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
cd70: 0a 2a 2a 20 54 68 65 72 65 73 20 69 73 20 61 20  .** Theres is a 
cd80: 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
cd90: 72 20 69 43 75 72 72 65 6e 74 2e 20 20 57 65 20  r iCurrent.  We 
cda0: 75 6c 74 69 6d 61 74 65 6c 79 20 77 61 6e 74 0a  ultimately want.
cdb0: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20  ** the value to 
cdc0: 62 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  be in register i
cdd0: 54 61 72 67 65 74 2e 20 20 49 74 20 6d 69 67 68  Target.  It migh
cde0: 74 20 62 65 20 74 68 61 74 0a 2a 2a 20 69 43 75  t be that.** iCu
cdf0: 72 72 65 6e 74 20 61 6e 64 20 69 54 61 72 67 65  rrent and iTarge
ce00: 74 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 72  t are the same r
ce10: 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 57  egister..**.** W
ce20: 65 20 61 72 65 20 67 6f 69 6e 67 20 74 6f 20 6d  e are going to m
ce30: 6f 64 69 66 79 20 74 68 65 20 76 61 6c 75 65 2c  odify the value,
ce40: 20 73 6f 20 77 65 20 6e 65 65 64 20 74 6f 20 6d   so we need to m
ce50: 61 6b 65 20 73 75 72 65 20 69 74 0a 2a 2a 20 69  ake sure it.** i
ce60: 73 20 6e 6f 74 20 61 20 63 61 63 68 65 64 20 72  s not a cached r
ce70: 65 67 69 73 74 65 72 2e 20 20 49 66 20 69 43 75  egister.  If iCu
ce80: 72 72 65 6e 74 20 69 73 20 61 20 63 61 63 68 65  rrent is a cache
ce90: 64 20 72 65 67 69 73 74 65 72 2c 0a 2a 2a 20 74  d register,.** t
cea0: 68 65 6e 20 74 72 79 20 74 6f 20 6d 6f 76 65 20  hen try to move 
ceb0: 74 68 65 20 76 61 6c 75 65 20 6f 76 65 72 20 74  the value over t
cec0: 6f 20 69 54 61 72 67 65 74 2e 20 20 49 66 20 69  o iTarget.  If i
ced0: 54 61 72 67 65 74 20 69 73 20 61 0a 2a 2a 20 63  Target is a.** c
cee0: 61 63 68 65 64 20 72 65 67 69 73 74 65 72 2c 20  ached register, 
cef0: 74 68 65 6e 20 63 6c 65 61 72 20 74 68 65 20 63  then clear the c
cf00: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 61 63  orresponding cac
cf10: 68 65 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52  he line..**.** R
cf20: 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74  eturn the regist
cf30: 65 72 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  er that the valu
cf40: 65 20 65 6e 64 73 20 75 70 20 69 6e 2e 0a 2a 2f  e ends up in..*/
cf50: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
cf60: 57 72 69 74 61 62 6c 65 52 65 67 69 73 74 65 72  WritableRegister
cf70: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
cf80: 69 6e 74 20 69 43 75 72 72 65 6e 74 2c 20 69 6e  int iCurrent, in
cf90: 74 20 69 54 61 72 67 65 74 29 7b 0a 20 20 69 6e  t iTarget){.  in
cfa0: 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t i;.  assert( p
cfb0: 50 61 72 73 65 2d 3e 70 56 64 62 65 21 3d 30 20  Parse->pVdbe!=0 
cfc0: 29 3b 0a 20 20 69 66 28 20 21 75 73 65 64 41 73  );.  if( !usedAs
cfd0: 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72  ColumnCache(pPar
cfe0: 73 65 2c 20 69 43 75 72 72 65 6e 74 2c 20 69 43  se, iCurrent, iC
cff0: 75 72 72 65 6e 74 29 20 29 7b 0a 20 20 20 20 72  urrent) ){.    r
d000: 65 74 75 72 6e 20 69 43 75 72 72 65 6e 74 3b 0a  eturn iCurrent;.
d010: 20 20 7d 0a 20 20 69 66 28 20 69 43 75 72 72 65    }.  if( iCurre
d020: 6e 74 21 3d 69 54 61 72 67 65 74 20 29 7b 0a 20  nt!=iTarget ){. 
d030: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d040: 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp2(pParse->pVd
d050: 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 43  be, OP_SCopy, iC
d060: 75 72 72 65 6e 74 2c 20 69 54 61 72 67 65 74 29  urrent, iTarget)
d070: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
d080: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43   i<pParse->nColC
d090: 61 63 68 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ache; i++){.    
d0a0: 69 66 28 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c  if( pParse->aCol
d0b0: 43 61 63 68 65 5b 69 5d 2e 69 52 65 67 3d 3d 69  Cache[i].iReg==i
d0c0: 54 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20  Target ){.      
d0d0: 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
d0e0: 65 5b 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e 61  e[i] = pParse->a
d0f0: 43 6f 6c 43 61 63 68 65 5b 2d 2d 70 50 61 72 73  ColCache[--pPars
d100: 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 5d 3b 0a 20  e->nColCache];. 
d110: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69 43 6f       pParse->iCo
d120: 6c 43 61 63 68 65 20 3d 20 70 50 61 72 73 65 2d  lCache = pParse-
d130: 3e 6e 43 6f 6c 43 61 63 68 65 3b 0a 20 20 20 20  >nColCache;.    
d140: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  }.  }.  return i
d150: 54 61 72 67 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Target;.}../*.**
d160: 20 49 66 20 74 68 65 20 6c 61 73 74 20 69 6e 73   If the last ins
d170: 74 72 75 63 74 69 6f 6e 20 63 6f 64 65 64 20 69  truction coded i
d180: 73 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 63  s an ephemeral c
d190: 6f 70 79 20 6f 66 20 61 6e 79 20 6f 66 0a 2a 2a  opy of any of.**
d1a0: 20 74 68 65 20 72 65 67 69 73 74 65 72 73 20 69   the registers i
d1b0: 6e 20 74 68 65 20 6e 52 65 67 20 72 65 67 69 73  n the nReg regis
d1c0: 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 77  ters beginning w
d1d0: 69 74 68 20 69 52 65 67 2c 20 74 68 65 6e 0a 2a  ith iReg, then.*
d1e0: 2a 20 63 6f 6e 76 65 72 74 20 74 68 65 20 6c 61  * convert the la
d1f0: 73 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66  st instruction f
d200: 72 6f 6d 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20  rom OP_SCopy to 
d210: 4f 50 5f 43 6f 70 79 2e 0a 2a 2f 0a 76 6f 69 64  OP_Copy..*/.void
d220: 20 73 71 6c 69 74 65 33 45 78 70 72 48 61 72 64   sqlite3ExprHard
d230: 43 6f 70 79 28 50 61 72 73 65 20 2a 70 50 61 72  Copy(Parse *pPar
d240: 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e  se, int iReg, in
d250: 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 61  t nReg){.  int a
d260: 64 64 72 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70  ddr;.  VdbeOp *p
d270: 4f 70 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a  Op;.  Vdbe *v;..
d280: 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
d290: 64 62 65 3b 0a 20 20 61 64 64 72 20 3d 20 73 71  dbe;.  addr = sq
d2a0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
d2b0: 41 64 64 72 28 76 29 3b 0a 20 20 70 4f 70 20 3d  Addr(v);.  pOp =
d2c0: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
d2d0: 70 28 76 2c 20 61 64 64 72 2d 31 29 3b 0a 20 20  p(v, addr-1);.  
d2e0: 61 73 73 65 72 74 28 20 70 4f 70 20 7c 7c 20 70  assert( pOp || p
d2f0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
d300: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
d310: 20 70 4f 70 20 26 26 20 70 4f 70 2d 3e 6f 70 63   pOp && pOp->opc
d320: 6f 64 65 3d 3d 4f 50 5f 53 43 6f 70 79 20 26 26  ode==OP_SCopy &&
d330: 20 70 4f 70 2d 3e 70 31 3e 3d 69 52 65 67 20 26   pOp->p1>=iReg &
d340: 26 20 70 4f 70 2d 3e 70 31 3c 69 52 65 67 2b 6e  & pOp->p1<iReg+n
d350: 52 65 67 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  Reg ){.    pOp->
d360: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 43 6f 70 79  opcode = OP_Copy
d370: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
d380: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
d390: 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20  store the value 
d3a0: 6f 66 20 74 68 65 20 69 41 6c 69 61 73 2d 74 68  of the iAlias-th
d3b0: 20 61 6c 69 61 73 20 69 6e 20 72 65 67 69 73 74   alias in regist
d3c0: 65 72 0a 2a 2a 20 74 61 72 67 65 74 2e 20 20 54  er.** target.  T
d3d0: 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
d3e0: 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 70 45  is is called, pE
d3f0: 78 70 72 20 69 73 20 65 76 61 6c 75 61 74 65 64  xpr is evaluated
d400: 20 74 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74   to compute.** t
d410: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
d420: 61 6c 69 61 73 2e 20 20 54 68 65 20 76 61 6c 75  alias.  The valu
d430: 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61  e is stored in a
d440: 6e 20 61 75 78 69 6c 69 61 72 79 20 72 65 67 69  n auxiliary regi
d450: 73 74 65 72 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ster.** and the 
d460: 6e 75 6d 62 65 72 20 6f 66 20 74 68 61 74 20 72  number of that r
d470: 65 67 69 73 74 65 72 20 69 73 20 72 65 74 75 72  egister is retur
d480: 6e 65 64 2e 20 20 4f 6e 20 73 75 62 73 65 71 75  ned.  On subsequ
d490: 65 6e 74 20 63 61 6c 6c 73 2c 0a 2a 2a 20 74 68  ent calls,.** th
d4a0: 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  e register numbe
d4b0: 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 77 69  r is returned wi
d4c0: 74 68 6f 75 74 20 67 65 6e 65 72 61 74 69 6e 67  thout generating
d4d0: 20 61 6e 79 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a   any code..**.**
d4e0: 20 4e 6f 74 65 20 74 68 61 74 20 69 6e 20 6f 72   Note that in or
d4f0: 64 65 72 20 66 6f 72 20 74 68 69 73 20 74 6f 20  der for this to 
d500: 77 6f 72 6b 2c 20 63 6f 64 65 20 6d 75 73 74 20  work, code must 
d510: 62 65 20 67 65 6e 65 72 61 74 65 64 20 69 6e 20  be generated in 
d520: 74 68 65 0a 2a 2a 20 73 61 6d 65 20 6f 72 64 65  the.** same orde
d530: 72 20 74 68 61 74 20 69 74 20 69 73 20 65 78 65  r that it is exe
d540: 63 75 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6c 69  cuted..**.** Ali
d550: 61 73 65 73 20 61 72 65 20 6e 75 6d 62 65 72 65  ases are numbere
d560: 64 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  d starting with 
d570: 31 2e 20 20 53 6f 20 69 41 6c 69 61 73 20 69 73  1.  So iAlias is
d580: 20 69 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a   in the range.**
d590: 20 6f 66 20 31 20 74 6f 20 70 50 61 72 73 65 2d   of 1 to pParse-
d5a0: 3e 6e 41 6c 69 61 73 20 69 6e 63 6c 75 73 69 76  >nAlias inclusiv
d5b0: 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 70 50 61 72 73  e.  .**.** pPars
d5c0: 65 2d 3e 61 41 6c 69 61 73 5b 69 41 6c 69 61 73  e->aAlias[iAlias
d5d0: 2d 31 5d 20 72 65 63 6f 72 64 73 20 74 68 65 20  -1] records the 
d5e0: 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20  register number 
d5f0: 77 68 65 72 65 20 74 68 65 20 76 61 6c 75 65 0a  where the value.
d600: 2a 2a 20 6f 66 20 74 68 65 20 69 41 6c 69 61 73  ** of the iAlias
d610: 2d 74 68 20 61 6c 69 61 73 20 69 73 20 73 74 6f  -th alias is sto
d620: 72 65 64 2e 20 20 49 66 20 7a 65 72 6f 2c 20 74  red.  If zero, t
d630: 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74  hat means that t
d640: 68 65 0a 2a 2a 20 61 6c 69 61 73 20 68 61 73 20  he.** alias has 
d650: 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 6d  not yet been com
d660: 70 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  puted..*/.static
d670: 20 69 6e 74 20 63 6f 64 65 41 6c 69 61 73 28 50   int codeAlias(P
d680: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
d690: 74 20 69 41 6c 69 61 73 2c 20 45 78 70 72 20 2a  t iAlias, Expr *
d6a0: 70 45 78 70 72 29 7b 0a 20 20 73 71 6c 69 74 65  pExpr){.  sqlite
d6b0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
d6c0: 64 62 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b 0a  db;.  int iReg;.
d6d0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 41    if( pParse->aA
d6e0: 6c 69 61 73 3d 3d 30 20 29 7b 0a 20 20 20 20 70  lias==0 ){.    p
d6f0: 50 61 72 73 65 2d 3e 61 41 6c 69 61 73 20 3d 20  Parse->aAlias = 
d700: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
d710: 65 72 6f 28 64 62 2c 20 0a 20 20 20 20 20 20 20  ero(db, .       
d720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d730: 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
d740: 28 70 50 61 72 73 65 2d 3e 61 41 6c 69 61 73 5b  (pParse->aAlias[
d750: 30 5d 29 2a 70 50 61 72 73 65 2d 3e 6e 41 6c 69  0])*pParse->nAli
d760: 61 73 20 29 3b 0a 20 20 20 20 69 66 28 20 64 62  as );.    if( db
d770: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
d780: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
d790: 20 61 73 73 65 72 74 28 20 69 41 6c 69 61 73 3e   assert( iAlias>
d7a0: 30 20 26 26 20 69 41 6c 69 61 73 3c 3d 70 50 61  0 && iAlias<=pPa
d7b0: 72 73 65 2d 3e 6e 41 6c 69 61 73 20 29 3b 0a 20  rse->nAlias );. 
d7c0: 20 69 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e   iReg = pParse->
d7d0: 61 41 6c 69 61 73 5b 69 41 6c 69 61 73 2d 31 5d  aAlias[iAlias-1]
d7e0: 3b 0a 20 20 69 66 28 20 69 52 65 67 3d 3d 30 20  ;.  if( iReg==0 
d7f0: 29 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 2b 2b  ){.    iReg = ++
d800: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
d810: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
d820: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  e(pParse, pExpr,
d830: 20 69 52 65 67 29 3b 0a 20 20 20 20 70 50 61 72   iReg);.    pPar
d840: 73 65 2d 3e 61 41 6c 69 61 73 5b 69 41 6c 69 61  se->aAlias[iAlia
d850: 73 2d 31 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d  s-1] = iReg;.  }
d860: 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a  .  return iReg;.
d870: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
d880: 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20  e code into the 
d890: 63 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20  current Vdbe to 
d8a0: 65 76 61 6c 75 61 74 65 20 74 68 65 20 67 69 76  evaluate the giv
d8b0: 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  en.** expression
d8c0: 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74  .  Attempt to st
d8d0: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
d8e0: 69 6e 20 72 65 67 69 73 74 65 72 20 22 74 61 72  in register "tar
d8f0: 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  get"..** Return 
d900: 74 68 65 20 72 65 67 69 73 74 65 72 20 77 68 65  the register whe
d910: 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 73  re results are s
d920: 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  tored..**.** Wit
d930: 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  h this routine, 
d940: 74 68 65 72 65 20 69 73 20 6e 6f 20 67 75 61 72  there is no guar
d950: 61 6e 74 65 65 20 74 68 61 74 20 72 65 73 75 6c  antee that resul
d960: 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 74  ts will.** be st
d970: 6f 72 65 64 20 69 6e 20 74 61 72 67 65 74 2e 20  ored in target. 
d980: 20 54 68 65 20 72 65 73 75 6c 74 20 6d 69 67 68   The result migh
d990: 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 73  t be stored in s
d9a0: 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65 67  ome other.** reg
d9b0: 69 73 74 65 72 20 69 66 20 69 74 20 69 73 20 63  ister if it is c
d9c0: 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f 20  onvenient to do 
d9d0: 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  so.  The calling
d9e0: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73   function.** mus
d9f0: 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74 75  t check the retu
da00: 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76 65  rn code and move
da10: 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20   the results to 
da20: 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20 72  the desired.** r
da30: 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  egister..*/.int 
da40: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
da50: 61 72 67 65 74 28 50 61 72 73 65 20 2a 70 50 61  arget(Parse *pPa
da60: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
da70: 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
da80: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
da90: 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54 68  e->pVdbe;  /* Th
daa0: 65 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73 74  e VM under const
dab0: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
dac0: 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
dad0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70         /* The op
dae0: 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65 64  code being coded
daf0: 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67 20   */.  int inReg 
db00: 3d 20 74 61 72 67 65 74 3b 20 20 20 20 20 20 20  = target;       
db10: 2f 2a 20 52 65 73 75 6c 74 73 20 73 74 6f 72 65  /* Results store
db20: 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 6e  d in register in
db30: 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  Reg */.  int reg
db40: 46 72 65 65 31 20 3d 20 30 3b 20 20 20 20 20 20  Free1 = 0;      
db50: 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72     /* If non-zer
db60: 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d 70  o free this temp
db70: 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 2a  orary register *
db80: 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32  /.  int regFree2
db90: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
dba0: 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65   If non-zero fre
dbb0: 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79  e this temporary
dbc0: 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
dbd0: 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 2c 20 72  nt r1, r2, r3, r
dbe0: 34 3b 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69  4;       /* Vari
dbf0: 6f 75 73 20 72 65 67 69 73 74 65 72 20 6e 75 6d  ous register num
dc00: 62 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  bers */.  sqlite
dc10: 33 20 2a 64 62 3b 0a 0a 20 20 64 62 20 3d 20 70  3 *db;..  db = p
dc20: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73  Parse->db;.  ass
dc30: 65 72 74 28 20 76 21 3d 30 20 7c 7c 20 64 62 2d  ert( v!=0 || db-
dc40: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
dc50: 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
dc60: 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70  t>0 && target<=p
dc70: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20  Parse->nMem );. 
dc80: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
dc90: 72 6e 20 30 3b 0a 0a 20 20 69 66 28 20 70 45 78  rn 0;..  if( pEx
dca0: 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20  pr==0 ){.    op 
dcb0: 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c  = TK_NULL;.  }el
dcc0: 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78  se{.    op = pEx
dcd0: 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77  pr->op;.  }.  sw
dce0: 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
dcf0: 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
dd00: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49  MN: {.      AggI
dd10: 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20  nfo *pAggInfo = 
dd20: 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b  pExpr->pAggInfo;
dd30: 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67  .      struct Ag
dd40: 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20  gInfo_col *pCol 
dd50: 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  = &pAggInfo->aCo
dd60: 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a  l[pExpr->iAgg];.
dd70: 20 20 20 20 20 20 69 66 28 20 21 70 41 67 67 49        if( !pAggI
dd80: 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20  nfo->directMode 
dd90: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
dda0: 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20  t( pCol->iMem>0 
ddb0: 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  );.        inReg
ddc0: 20 3d 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20   = pCol->iMem;. 
ddd0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
dde0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41      }else if( pA
ddf0: 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69  ggInfo->useSorti
de00: 6e 67 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20  ngIdx ){.       
de10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
de20: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
de30: 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69   pAggInfo->sorti
de40: 6e 67 49 64 78 2c 0a 20 20 20 20 20 20 20 20 20  ngIdx,.         
de50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de60: 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
de70: 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74  erColumn, target
de80: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
de90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
dea0: 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61  /* Otherwise, fa
deb0: 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65  ll thru into the
dec0: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20   TK_COLUMN case 
ded0: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  */.    }.    cas
dee0: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
def0: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
df00: 69 54 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20  iTable<0 ){.    
df10: 20 20 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79      /* This only
df20: 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f   happens when co
df30: 64 69 6e 67 20 63 68 65 63 6b 20 63 6f 6e 73 74  ding check const
df40: 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  raints */.      
df50: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
df60: 2d 3e 63 6b 42 61 73 65 3e 30 20 29 3b 0a 20 20  ->ckBase>0 );.  
df70: 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45        inReg = pE
df80: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2b 20 70  xpr->iColumn + p
df90: 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3b 0a 20  Parse->ckBase;. 
dfa0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
dfb0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
dfc0: 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
dfd0: 5f 41 6e 79 41 66 66 29 21 3d 30 20 29 3b 0a 20  _AnyAff)!=0 );. 
dfe0: 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73         inReg = s
dff0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
e000: 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  tColumn(pParse, 
e010: 70 45 78 70 72 2d 3e 70 54 61 62 2c 0a 20 20 20  pExpr->pTab,.   
e020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
e040: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 45  xpr->iColumn, pE
e050: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72  xpr->iTable, tar
e060: 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  get,.           
e070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e080: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61        pExpr->fla
e090: 67 73 20 26 20 45 50 5f 41 6e 79 41 66 66 29 3b  gs & EP_AnyAff);
e0a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
e0b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
e0c0: 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
e0d0: 20 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74   {.      codeInt
e0e0: 65 67 65 72 28 76 2c 20 70 45 78 70 72 2c 20 30  eger(v, pExpr, 0
e0f0: 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
e100: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
e110: 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
e120: 20 7b 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61   {.      codeRea
e130: 6c 28 76 2c 20 28 63 68 61 72 2a 29 70 45 78 70  l(v, (char*)pExp
e140: 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70  r->token.z, pExp
e150: 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 2c 20 74  r->token.n, 0, t
e160: 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
e170: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
e180: 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b  ase TK_STRING: {
e190: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
e1a0: 71 75 6f 74 65 45 78 70 72 28 64 62 2c 20 70 45  quoteExpr(db, pE
e1b0: 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  xpr);.      sqli
e1c0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
e1d0: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 74  OP_String8, 0, t
e1e0: 61 72 67 65 74 2c 20 30 2c 0a 20 20 20 20 20 20  arget, 0,.      
e1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e200: 20 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e    (char*)pExpr->
e210: 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e  token.z, pExpr->
e220: 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20  token.n);.      
e230: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
e240: 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b   case TK_NULL: {
e250: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
e260: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
e270: 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ull, 0, target);
e280: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
e290: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
e2a0: 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54  TE_OMIT_BLOB_LIT
e2b0: 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b  ERAL.    case TK
e2c0: 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69  _BLOB: {.      i
e2d0: 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73  nt n;.      cons
e2e0: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20  t char *z;.     
e2f0: 20 63 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20   char *zBlob;.  
e300: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
e310: 72 2d 3e 74 6f 6b 65 6e 2e 6e 3e 3d 33 20 29 3b  r->token.n>=3 );
e320: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
e330: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d  Expr->token.z[0]
e340: 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e  =='x' || pExpr->
e350: 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d 3d 27 58 27 20  token.z[0]=='X' 
e360: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
e370: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b   pExpr->token.z[
e380: 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20  1]=='\'' );.    
e390: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
e3a0: 3e 74 6f 6b 65 6e 2e 7a 5b 70 45 78 70 72 2d 3e  >token.z[pExpr->
e3b0: 74 6f 6b 65 6e 2e 6e 2d 31 5d 3d 3d 27 5c 27 27  token.n-1]=='\''
e3c0: 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 70 45   );.      n = pE
e3d0: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 2d 20 33  xpr->token.n - 3
e3e0: 3b 0a 20 20 20 20 20 20 7a 20 3d 20 28 63 68 61  ;.      z = (cha
e3f0: 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  r*)pExpr->token.
e400: 7a 20 2b 20 32 3b 0a 20 20 20 20 20 20 7a 42 6c  z + 2;.      zBl
e410: 6f 62 20 3d 20 73 71 6c 69 74 65 33 48 65 78 54  ob = sqlite3HexT
e420: 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33 56 64 62  oBlob(sqlite3Vdb
e430: 65 44 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20  eDb(v), z, n);. 
e440: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e450: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f  AddOp4(v, OP_Blo
e460: 62 2c 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c 20  b, n/2, target, 
e470: 30 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59 4e  0, zBlob, P4_DYN
e480: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65  AMIC);.      bre
e490: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
e4a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52  .    case TK_VAR
e4b0: 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73  IABLE: {.      s
e4c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
e4d0: 28 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c  (v, OP_Variable,
e4e0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
e4f0: 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69  target);.      i
e500: 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  f( pExpr->token.
e510: 6e 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  n>1 ){.        s
e520: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
e530: 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a  P4(v, -1, (char*
e540: 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  )pExpr->token.z,
e550: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29   pExpr->token.n)
e560: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e570: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
e580: 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45   case TK_REGISTE
e590: 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67  R: {.      inReg
e5a0: 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
e5b0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
e5c0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
e5d0: 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52  _AS: {.      inR
e5e0: 65 67 20 3d 20 63 6f 64 65 41 6c 69 61 73 28 70  eg = codeAlias(p
e5f0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 69 54  Parse, pExpr->iT
e600: 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  able, pExpr->pLe
e610: 66 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ft);.      break
e620: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
e630: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
e640: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53  .    case TK_CAS
e650: 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78  T: {.      /* Ex
e660: 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
e670: 20 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c   form:   CAST(pL
e680: 65 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f  eft AS token) */
e690: 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66 2c 20  .      int aff, 
e6a0: 74 6f 5f 6f 70 3b 0a 20 20 20 20 20 20 69 6e 52  to_op;.      inR
e6b0: 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
e6c0: 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
e6d0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
e6e0: 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
e6f0: 61 66 66 20 3d 20 73 71 6c 69 74 65 33 41 66 66  aff = sqlite3Aff
e700: 69 6e 69 74 79 54 79 70 65 28 26 70 45 78 70 72  inityType(&pExpr
e710: 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  ->token);.      
e720: 74 6f 5f 6f 70 20 3d 20 61 66 66 20 2d 20 53 51  to_op = aff - SQ
e730: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 2b 20  LITE_AFF_TEXT + 
e740: 4f 50 5f 54 6f 54 65 78 74 3b 0a 20 20 20 20 20  OP_ToText;.     
e750: 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
e760: 4f 50 5f 54 6f 54 65 78 74 20 20 20 20 7c 7c 20  OP_ToText    || 
e770: 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
e780: 54 45 58 54 20 20 20 20 29 3b 0a 20 20 20 20 20  TEXT    );.     
e790: 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
e7a0: 4f 50 5f 54 6f 42 6c 6f 62 20 20 20 20 7c 7c 20  OP_ToBlob    || 
e7b0: 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
e7c0: 4e 4f 4e 45 20 20 20 20 29 3b 0a 20 20 20 20 20  NONE    );.     
e7d0: 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
e7e0: 4f 50 5f 54 6f 4e 75 6d 65 72 69 63 20 7c 7c 20  OP_ToNumeric || 
e7f0: 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
e800: 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 20  NUMERIC );.     
e810: 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
e820: 4f 50 5f 54 6f 49 6e 74 20 20 20 20 20 7c 7c 20  OP_ToInt     || 
e830: 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
e840: 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 20  INTEGER );.     
e850: 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
e860: 4f 50 5f 54 6f 52 65 61 6c 20 20 20 20 7c 7c 20  OP_ToReal    || 
e870: 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
e880: 52 45 41 4c 20 20 20 20 29 3b 0a 20 20 20 20 20  REAL    );.     
e890: 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70   testcase( to_op
e8a0: 3d 3d 4f 50 5f 54 6f 54 65 78 74 20 29 3b 0a 20  ==OP_ToText );. 
e8b0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74       testcase( t
e8c0: 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20  o_op==OP_ToBlob 
e8d0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
e8e0: 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e  e( to_op==OP_ToN
e8f0: 75 6d 65 72 69 63 20 29 3b 0a 20 20 20 20 20 20  umeric );.      
e900: 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d  testcase( to_op=
e910: 3d 4f 50 5f 54 6f 49 6e 74 20 29 3b 0a 20 20 20  =OP_ToInt );.   
e920: 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f     testcase( to_
e930: 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 29 3b  op==OP_ToReal );
e940: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
e950: 62 65 41 64 64 4f 70 31 28 76 2c 20 74 6f 5f 6f  beAddOp1(v, to_o
e960: 70 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20  p, inReg);.     
e970: 20 74 65 73 74 63 61 73 65 28 20 75 73 65 64 41   testcase( usedA
e980: 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61  sColumnCache(pPa
e990: 72 73 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65  rse, inReg, inRe
e9a0: 67 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g) );.      sqli
e9b0: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
e9c0: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
e9d0: 65 2c 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20  e, inReg, 1);.  
e9e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
e9f0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
ea00: 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20  E_OMIT_CAST */. 
ea10: 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
ea20: 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
ea30: 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
ea40: 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
ea50: 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
ea60: 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
ea70: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
ea80: 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20  K_LT==OP_Lt );. 
ea90: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
eaa0: 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20  LE==OP_Le );.   
eab0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54     assert( TK_GT
eac0: 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20  ==OP_Gt );.     
ead0: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d   assert( TK_GE==
eae0: 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61  OP_Ge );.      a
eaf0: 73 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50  ssert( TK_EQ==OP
eb00: 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Eq );.      ass
eb10: 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e  ert( TK_NE==OP_N
eb20: 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
eb30: 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29  ase( op==TK_LT )
eb40: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
eb50: 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20  ( op==TK_LE );. 
eb60: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
eb70: 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20  p==TK_GT );.    
eb80: 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
eb90: 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74  TK_GE );.      t
eba0: 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
ebb0: 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  EQ );.      test
ebc0: 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20  case( op==TK_NE 
ebd0: 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
ebe0: 70 61 72 65 4f 70 65 72 61 6e 64 73 28 70 50 61  pareOperands(pPa
ebf0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
ec00: 74 2c 20 26 72 31 2c 20 26 72 65 67 46 72 65 65  t, &r1, &regFree
ec10: 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
ec20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec30: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67       pExpr->pRig
ec40: 68 74 2c 20 26 72 32 2c 20 26 72 65 67 46 72 65  ht, &r2, &regFre
ec50: 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  e2);.      codeC
ec60: 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
ec70: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
ec80: 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
ec90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eca0: 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c    r1, r2, inReg,
ecb0: 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29   SQLITE_STOREP2)
ecc0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
ecd0: 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
ece0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
ecf0: 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
ed00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ed10: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
ed20: 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ND:.    case TK_
ed30: 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OR:.    case TK_
ed40: 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  PLUS:.    case T
ed50: 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65  K_STAR:.    case
ed60: 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63   TK_MINUS:.    c
ed70: 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20  ase TK_REM:.    
ed80: 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a  case TK_BITAND:.
ed90: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f      case TK_BITO
eda0: 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  R:.    case TK_S
edb0: 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54  LASH:.    case T
edc0: 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61  K_LSHIFT:.    ca
edd0: 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20  se TK_RSHIFT: . 
ede0: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41     case TK_CONCA
edf0: 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T: {.      asser
ee00: 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e  t( TK_AND==OP_An
ee10: 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d );.      asser
ee20: 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20  t( TK_OR==OP_Or 
ee30: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
ee40: 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64   TK_PLUS==OP_Add
ee50: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
ee60: 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53  ( TK_MINUS==OP_S
ee70: 75 62 74 72 61 63 74 20 29 3b 0a 20 20 20 20 20  ubtract );.     
ee80: 20 61 73 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d   assert( TK_REM=
ee90: 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b  =OP_Remainder );
eea0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
eeb0: 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74  K_BITAND==OP_Bit
eec0: 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73  And );.      ass
eed0: 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f  ert( TK_BITOR==O
eee0: 50 5f 42 69 74 4f 72 20 29 3b 0a 20 20 20 20 20  P_BitOr );.     
eef0: 20 61 73 73 65 72 74 28 20 54 4b 5f 53 4c 41 53   assert( TK_SLAS
ef00: 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b 0a  H==OP_Divide );.
ef10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
ef20: 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66  _LSHIFT==OP_Shif
ef30: 74 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 61  tLeft );.      a
ef40: 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49 46 54  ssert( TK_RSHIFT
ef50: 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68 74 20  ==OP_ShiftRight 
ef60: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
ef70: 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43   TK_CONCAT==OP_C
ef80: 6f 6e 63 61 74 20 29 3b 0a 20 20 20 20 20 20 74  oncat );.      t
ef90: 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
efa0: 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73  AND );.      tes
efb0: 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52  tcase( op==TK_OR
efc0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
efd0: 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20  se( op==TK_PLUS 
efe0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
eff0: 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20  e( op==TK_MINUS 
f000: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
f010: 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b  e( op==TK_REM );
f020: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
f030: 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44 20 29   op==TK_BITAND )
f040: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
f050: 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29  ( op==TK_BITOR )
f060: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
f070: 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29  ( op==TK_SLASH )
f080: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
f090: 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20  ( op==TK_LSHIFT 
f0a0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
f0b0: 65 28 20 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54  e( op==TK_RSHIFT
f0c0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
f0d0: 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41  se( op==TK_CONCA
f0e0: 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  T );.      r1 = 
f0f0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
f100: 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
f110: 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
f120: 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
f130: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
f140: 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
f150: 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
f160: 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 73 71  Free2);.      sq
f170: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
f180: 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74  v, op, r2, r1, t
f190: 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 74 65  arget);.      te
f1a0: 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
f1b0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
f1c0: 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
f1d0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
f1e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
f1f0: 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20  e TK_UMINUS: {. 
f200: 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
f210: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
f220: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
f230: 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66  Left );.      if
f240: 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
f250: 46 4c 4f 41 54 20 7c 7c 20 70 4c 65 66 74 2d 3e  FLOAT || pLeft->
f260: 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29  op==TK_INTEGER )
f270: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c  {.        if( pL
f280: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41  eft->op==TK_FLOA
f290: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  T ){.          c
f2a0: 6f 64 65 52 65 61 6c 28 76 2c 20 28 63 68 61 72  odeReal(v, (char
f2b0: 2a 29 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a  *)pLeft->token.z
f2c0: 2c 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 6e  , pLeft->token.n
f2d0: 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 1, target);.  
f2e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f2f0: 20 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67         codeInteg
f300: 65 72 28 76 2c 20 70 4c 65 66 74 2c 20 31 2c 20  er(v, pLeft, 1, 
f310: 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
f320: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
f330: 20 20 20 20 20 20 20 20 72 65 67 46 72 65 65 31          regFree1
f340: 20 3d 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47   = r1 = sqlite3G
f350: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
f360: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
f370: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f380: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
f390: 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d  1);.        r2 =
f3a0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
f3b0: 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
f3c0: 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
f3d0: 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20 73  ree2);.        s
f3e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
f3f0: 28 76 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c  (v, OP_Subtract,
f400: 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29   r2, r1, target)
f410: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
f420: 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
f430: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
f440: 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b   inReg = target;
f450: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f460: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
f470: 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65  BITNOT:.    case
f480: 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
f490: 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e   assert( TK_BITN
f4a0: 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b  OT==OP_BitNot );
f4b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
f4c0: 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b  K_NOT==OP_Not );
f4d0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
f4e0: 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29   op==TK_BITNOT )
f4f0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
f500: 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a  ( op==TK_NOT );.
f510: 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71        inReg = sq
f520: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
f530: 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
f540: 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74  r->pLeft, target
f550: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
f560: 65 28 20 69 6e 52 65 67 3d 3d 74 61 72 67 65 74  e( inReg==target
f570: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
f580: 73 65 28 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e  se( usedAsColumn
f590: 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 6e  Cache(pParse, in
f5a0: 52 65 67 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20  Reg, inReg) );. 
f5b0: 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
f5c0: 69 74 65 33 45 78 70 72 57 72 69 74 61 62 6c 65  ite3ExprWritable
f5d0: 52 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2c  Register(pParse,
f5e0: 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b   inReg, target);
f5f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f600: 62 65 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20  beAddOp1(v, op, 
f610: 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72  inReg);.      br
f620: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
f630: 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
f640: 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
f650: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  LL: {.      int 
f660: 61 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65  addr;.      asse
f670: 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f  rt( TK_ISNULL==O
f680: 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20  P_IsNull );.    
f690: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
f6a0: 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c  NULL==OP_NotNull
f6b0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
f6c0: 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  se( op==TK_ISNUL
f6d0: 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  L );.      testc
f6e0: 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  ase( op==TK_NOTN
f6f0: 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ULL );.      sql
f700: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f710: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
f720: 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
f730: 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
f740: 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
f750: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
f760: 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
f770: 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
f780: 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
f790: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
f7a0: 62 65 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20  beAddOp1(v, op, 
f7b0: 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
f7c0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f7d0: 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65  OP_AddImm, targe
f7e0: 74 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 73 71  t, -1);.      sq
f7f0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
f800: 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
f810: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
f820: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
f830: 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
f840: 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20   AggInfo *pInfo 
f850: 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66  = pExpr->pAggInf
f860: 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e  o;.      if( pIn
f870: 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  fo==0 ){.       
f880: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
f890: 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65  (pParse, "misuse
f8a0: 20 6f 66 20 61 67 67 72 65 67 61 74 65 3a 20 25   of aggregate: %
f8b0: 54 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  T",.            
f8c0: 26 70 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20  &pExpr->span);. 
f8d0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f8e0: 20 20 20 20 69 6e 52 65 67 20 3d 20 70 49 6e 66      inReg = pInf
f8f0: 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e  o->aFunc[pExpr->
f900: 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20  iAgg].iMem;.    
f910: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
f920: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
f930: 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20  TK_CONST_FUNC:. 
f940: 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
f950: 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  ION: {.      Exp
f960: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
f970: 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20  Expr->pList;.   
f980: 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70     int nExpr = p
f990: 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45  List ? pList->nE
f9a0: 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 46  xpr : 0;.      F
f9b0: 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20  uncDef *pDef;.  
f9c0: 20 20 20 20 69 6e 74 20 6e 49 64 3b 0a 20 20 20      int nId;.   
f9d0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
f9e0: 49 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6f  Id;.      int co
f9f0: 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20  nstMask = 0;.   
fa00: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
fa10: 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  u8 enc = ENC(db)
fa20: 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  ;.      CollSeq 
fa30: 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 0a 20 20 20  *pColl = 0;..   
fa40: 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
fa50: 3d 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 20 29  =TK_CONST_FUNC )
fa60: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
fa70: 28 20 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f  ( op==TK_FUNCTIO
fa80: 4e 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d  N );.      zId =
fa90: 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74   (char*)pExpr->t
faa0: 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 6e 49  oken.z;.      nI
fab0: 64 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  d = pExpr->token
fac0: 2e 6e 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d  .n;.      pDef =
fad0: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
fae0: 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 49  tion(db, zId, nI
faf0: 64 2c 20 6e 45 78 70 72 2c 20 65 6e 63 2c 20 30  d, nExpr, enc, 0
fb00: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
fb10: 20 70 44 65 66 21 3d 30 20 29 3b 0a 20 20 20 20   pDef!=0 );.    
fb20: 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
fb30: 20 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70         nExpr = p
fb40: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
fb50: 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
fb60: 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
fb70: 61 72 73 65 2c 20 6e 45 78 70 72 29 3b 0a 20 20  arse, nExpr);.  
fb80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
fb90: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
fba0: 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 31 2c  arse, pList, r1,
fbb0: 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   1);.      }else
fbc0: 7b 0a 20 20 20 20 20 20 20 20 6e 45 78 70 72 20  {.        nExpr 
fbd0: 3d 20 72 31 20 3d 20 30 3b 0a 20 20 20 20 20 20  = r1 = 0;.      
fbe0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
fbf0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
fc00: 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73 73  LE.      /* Poss
fc10: 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74 68  ibly overload th
fc20: 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 74 68  e function if th
fc30: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
fc40: 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 76   is.      ** a v
fc50: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c  irtual table col
fc60: 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  umn..      **.  
fc70: 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78      ** For infix
fc80: 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45   functions (LIKE
fc90: 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20  , GLOB, REGEXP, 
fca0: 61 6e 64 20 4d 41 54 43 48 29 20 75 73 65 20 74  and MATCH) use t
fcb0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63 6f  he.      ** seco
fcc0: 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74  nd argument, not
fcd0: 20 74 68 65 20 66 69 72 73 74 2c 20 61 73 20 74   the first, as t
fce0: 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  he argument to t
fcf0: 65 73 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  est to.      ** 
fd00: 73 65 65 20 69 66 20 69 74 20 69 73 20 61 20 63  see if it is a c
fd10: 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72 74 75  olumn in a virtu
fd20: 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  al table.  This 
fd30: 69 73 20 64 6f 6e 65 20 62 65 63 61 75 73 65 0a  is done because.
fd40: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 66        ** the lef
fd50: 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 66  t operand of inf
fd60: 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 74 68  ix functions (th
fd70: 65 20 6f 70 65 72 61 6e 64 20 77 65 20 77 61 6e  e operand we wan
fd80: 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f  t to.      ** co
fd90: 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e  ntrol overloadin
fda0: 67 29 20 65 6e 64 73 20 75 70 20 61 73 20 74 68  g) ends up as th
fdb0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
fdc0: 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  t to the.      *
fdd0: 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  * function.  The
fde0: 20 65 78 70 72 65 73 73 69 6f 6e 20 22 41 20 67   expression "A g
fdf0: 6c 6f 62 20 42 22 20 69 73 20 65 71 75 69 76 61  lob B" is equiva
fe00: 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a  lent to .      *
fe10: 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57  * "glob(B,A).  W
fe20: 65 20 77 61 6e 74 20 74 6f 20 75 73 65 20 74 68  e want to use th
fe30: 65 20 41 20 69 6e 20 22 41 20 67 6c 6f 62 20 42  e A in "A glob B
fe40: 22 20 74 6f 20 74 65 73 74 0a 20 20 20 20 20 20  " to test.      
fe50: 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ** for function 
fe60: 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75  overloading.  Bu
fe70: 74 20 77 65 20 75 73 65 20 74 68 65 20 42 20 74  t we use the B t
fe80: 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41  erm in "glob(B,A
fe90: 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  )"..      */.   
fea0: 20 20 20 69 66 28 20 6e 45 78 70 72 3e 3d 32 20     if( nExpr>=2 
feb0: 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73  && (pExpr->flags
fec0: 20 26 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 29   & EP_InfixFunc)
fed0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
fee0: 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76   = sqlite3VtabOv
fef0: 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64  erloadFunction(d
ff00: 62 2c 20 70 44 65 66 2c 20 6e 45 78 70 72 2c 20  b, pDef, nExpr, 
ff10: 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
ff20: 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r);.      }else 
ff30: 69 66 28 20 6e 45 78 70 72 3e 30 20 29 7b 0a 20  if( nExpr>0 ){. 
ff40: 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71         pDef = sq
ff50: 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61  lite3VtabOverloa
ff60: 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44  dFunction(db, pD
ff70: 65 66 2c 20 6e 45 78 70 72 2c 20 70 4c 69 73 74  ef, nExpr, pList
ff80: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
ff90: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
ffa0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
ffb0: 45 78 70 72 20 26 26 20 69 3c 33 32 3b 20 69 2b  Expr && i<32; i+
ffc0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
ffd0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
ffe0: 73 74 61 6e 74 28 70 4c 69 73 74 2d 3e 61 5b 69  stant(pList->a[i
fff0: 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
10000 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20        constMask 
10010 7c 3d 20 28 31 3c 3c 69 29 3b 0a 20 20 20 20 20  |= (1<<i);.     
10020 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
10030 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20   (pDef->flags & 
10040 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44  SQLITE_FUNC_NEED
10050 43 4f 4c 4c 29 21 3d 30 20 26 26 20 21 70 43 6f  COLL)!=0 && !pCo
10060 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
10070 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
10080 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
10090 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  e, pList->a[i].p
100a0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Expr);.        }
100b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
100c0 66 28 20 70 44 65 66 2d 3e 66 6c 61 67 73 20 26  f( pDef->flags &
100d0 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
100e0 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  DCOLL ){.       
100f0 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43   if( !pColl ) pC
10100 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
10110 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71  oll; .        sq
10120 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
10130 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30  v, OP_CollSeq, 0
10140 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29  , 0, 0, (char *)
10150 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
10160 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Q);.      }.    
10170 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10180 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69  Op4(v, OP_Functi
10190 6f 6e 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72  on, constMask, r
101a0 31 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20  1, target,.     
101b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101c0 20 20 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20     (char*)pDef, 
101d0 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P4_FUNCDEF);.   
101e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
101f0 61 6e 67 65 50 35 28 76 2c 20 6e 45 78 70 72 29  angeP5(v, nExpr)
10200 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78 70  ;.      if( nExp
10210 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
10220 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
10230 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c  ange(pParse, r1,
10240 20 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d   nExpr);.      }
10250 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
10260 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
10270 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31  hange(pParse, r1
10280 2c 20 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , nExpr);.      
10290 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
102a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
102b0 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
102c0 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20  se TK_EXISTS:.  
102d0 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
102e0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
102f0 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 58 49 53 54  se( op==TK_EXIST
10300 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
10310 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45  ase( op==TK_SELE
10320 43 54 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  CT );.      if( 
10330 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  pExpr->iColumn==
10340 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
10350 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
10360 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
10370 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
10380 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45        inReg = pE
10390 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
103a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
103b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
103c0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 4e 6f   {.      int rNo
103d0 74 46 6f 75 6e 64 20 3d 20 30 3b 0a 20 20 20 20  tFound = 0;.    
103e0 20 20 69 6e 74 20 72 4d 61 79 48 61 76 65 4e 75    int rMayHaveNu
103f0 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  ll = 0;.      in
10400 74 20 6a 32 2c 20 6a 33 2c 20 6a 34 2c 20 6a 35  t j2, j3, j4, j5
10410 3b 0a 20 20 20 20 20 20 63 68 61 72 20 61 66 66  ;.      char aff
10420 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 69 6e 74  inity;.      int
10430 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 20 20 56   eType;..      V
10440 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
10450 76 2c 20 22 62 65 67 69 6e 20 49 4e 20 65 78 70  v, "begin IN exp
10460 72 20 72 25 64 22 2c 20 74 61 72 67 65 74 29 29  r r%d", target))
10470 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d 20  ;.      eType = 
10480 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64  sqlite3FindInInd
10490 65 78 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ex(pParse, pExpr
104a0 2c 20 26 72 4d 61 79 48 61 76 65 4e 75 6c 6c 29  , &rMayHaveNull)
104b0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 4d 61 79  ;.      if( rMay
104c0 48 61 76 65 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  HaveNull ){.    
104d0 20 20 20 20 72 4e 6f 74 46 6f 75 6e 64 20 3d 20      rNotFound = 
104e0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
104f0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
10500 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
10510 20 61 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65   affinity to use
10520 20 74 6f 20 63 72 65 61 74 65 20 61 20 6b 65 79   to create a key
10530 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c 74   from the result
10540 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  s.      ** of th
10550 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 61 66  e expression. af
10560 66 69 6e 69 74 79 53 74 72 20 73 74 6f 72 65 73  finityStr stores
10570 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67   a static string
10580 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0a 20 20   suitable for.  
10590 20 20 20 20 2a 2a 20 50 34 20 6f 66 20 4f 50 5f      ** P4 of OP_
105a0 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20 20 20 20  MakeRecord..    
105b0 20 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 69 6e    */.      affin
105c0 69 74 79 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e  ity = comparison
105d0 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b  Affinity(pExpr);
105e0 0a 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  ...      /* Code
105f0 20 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d   the <expr> from
10600 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e   "<expr> IN (...
10610 29 22 2e 20 54 68 65 20 74 65 6d 70 6f 72 61 72  )". The temporar
10620 79 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a  y table.      **
10630 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 63   pExpr->iTable c
10640 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75  ontains the valu
10650 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  es that make up 
10660 74 68 65 20 28 2e 2e 2e 29 20 73 65 74 2e 0a 20  the (...) set.. 
10670 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50       */.      pP
10680 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c  arse->disableCol
10690 43 61 63 68 65 2b 2b 3b 0a 20 20 20 20 20 20 73  Cache++;.      s
106a0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
106b0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
106c0 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  eft, target);.  
106d0 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61      pParse->disa
106e0 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20  bleColCache--;. 
106f0 20 20 20 20 20 6a 32 20 3d 20 73 71 6c 69 74 65       j2 = sqlite
10700 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
10710 50 5f 49 73 4e 75 6c 6c 2c 20 74 61 72 67 65 74  P_IsNull, target
10720 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  );.      if( eTy
10730 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  pe==IN_INDEX_ROW
10740 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 33  ID ){.        j3
10750 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
10760 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp1(v, OP_MustB
10770 65 49 6e 74 2c 20 74 61 72 67 65 74 29 3b 0a 20  eInt, target);. 
10780 20 20 20 20 20 20 20 6a 34 20 3d 20 73 71 6c 69         j4 = sqli
10790 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
107a0 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 70   OP_NotExists, p
107b0 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c  Expr->iTable, 0,
107c0 20 74 61 72 67 65 74 29 3b 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 49 6e 74 65 67 65  Op2(v, OP_Intege
107f0 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 1, target);. 
10800 20 20 20 20 20 20 20 6a 35 20 3d 20 73 71 6c 69         j5 = sqli
10810 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
10820 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 20   OP_Goto);.     
10830 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
10840 6d 70 48 65 72 65 28 76 2c 20 6a 33 29 3b 0a 20  mpHere(v, j3);. 
10850 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10860 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 34  beJumpHere(v, j4
10870 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
10880 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
10890 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 74  OP_Integer, 0, t
108a0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 65  arget);.      }e
108b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 32 20  lse{.        r2 
108c0 3d 20 72 65 67 46 72 65 65 32 20 3d 20 73 71 6c  = regFree2 = sql
108d0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
108e0 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 20  Parse);..       
108f0 20 2f 2a 20 43 72 65 61 74 65 20 61 20 72 65 63   /* Create a rec
10900 6f 72 64 20 61 6e 64 20 74 65 73 74 20 66 6f 72  ord and test for
10910 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70 2e   set membership.
10920 20 49 66 20 74 68 65 20 73 65 74 20 63 6f 6e 74   If the set cont
10930 61 69 6e 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ains.        ** 
10940 74 68 65 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  the value, then 
10950 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20  jump to the end 
10960 6f 66 20 74 68 65 20 74 65 73 74 20 63 6f 64 65  of the test code
10970 2e 20 54 68 65 20 74 61 72 67 65 74 0a 20 20 20  . The target.   
10980 20 20 20 20 20 2a 2a 20 72 65 67 69 73 74 65 72       ** register
10990 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20   still contains 
109a0 74 68 65 20 74 72 75 65 20 28 31 29 20 76 61 6c  the true (1) val
109b0 75 65 20 77 72 69 74 74 65 6e 20 74 6f 20 69 74  ue written to it
109c0 20 65 61 72 6c 69 65 72 2e 0a 20 20 20 20 20 20   earlier..      
109d0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c    */.        sql
109e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
109f0 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
10a00 20 74 61 72 67 65 74 2c 20 31 2c 20 72 32 2c 20   target, 1, r2, 
10a10 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20  &affinity, 1);. 
10a20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10a30 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
10a40 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65  nteger, 1, targe
10a50 74 29 3b 0a 20 20 20 20 20 20 20 20 6a 35 20 3d  t);.        j5 =
10a60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10a70 70 33 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  p3(v, OP_Found, 
10a80 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30  pExpr->iTable, 0
10a90 2c 20 72 32 29 3b 0a 0a 20 20 20 20 20 20 20 20  , r2);..        
10aa0 2f 2a 20 49 66 20 74 68 65 20 73 65 74 20 6d 65  /* If the set me
10ab0 6d 62 65 72 73 68 69 70 20 74 65 73 74 20 66 61  mbership test fa
10ac0 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65  ils, then the re
10ad0 73 75 6c 74 20 6f 66 20 74 68 65 20 0a 20 20 20  sult of the .   
10ae0 20 20 20 20 20 2a 2a 20 22 78 20 49 4e 20 28 2e       ** "x IN (.
10af0 2e 2e 29 22 20 65 78 70 72 65 73 73 69 6f 6e 20  ..)" expression 
10b00 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 30  must be either 0
10b10 20 6f 72 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65   or NULL. If the
10b20 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20   set.        ** 
10b30 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c  contains no NULL
10b40 20 76 61 6c 75 65 73 2c 20 74 68 65 6e 20 74 68   values, then th
10b50 65 20 72 65 73 75 6c 74 20 69 73 20 30 2e 20 49  e result is 0. I
10b60 66 20 74 68 65 20 73 65 74 20 0a 20 20 20 20 20  f the set .     
10b70 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6f     ** contains o
10b80 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20  ne or more NULL 
10b90 76 61 6c 75 65 73 2c 20 74 68 65 6e 20 74 68 65  values, then the
10ba0 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20   result of the. 
10bb0 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73         ** expres
10bc0 73 69 6f 6e 20 69 73 20 61 6c 73 6f 20 4e 55 4c  sion is also NUL
10bd0 4c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  L..        */.  
10be0 20 20 20 20 20 20 69 66 28 20 72 4e 6f 74 46 6f        if( rNotFo
10bf0 75 6e 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  und==0 ){.      
10c00 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
10c10 63 68 20 72 75 6e 73 20 69 66 20 69 74 20 69 73  ch runs if it is
10c20 20 6b 6e 6f 77 6e 20 61 74 20 63 6f 6d 70 69 6c   known at compil
10c30 65 20 74 69 6d 65 20 28 6e 6f 77 29 20 74 68 61  e time (now) tha
10c40 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  t .          ** 
10c50 74 68 65 20 73 65 74 20 63 6f 6e 74 61 69 6e 73  the set contains
10c60 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e   no NULL values.
10c70 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 61 73   This happens as
10c80 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20   the result.    
10c90 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 22 4e        ** of a "N
10ca0 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61  OT NULL" constra
10cb0 69 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  int in the datab
10cc0 61 73 65 20 73 63 68 65 6d 61 2e 20 4e 6f 20 6e  ase schema. No n
10cd0 65 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  eed.          **
10ce0 20 74 6f 20 74 65 73 74 20 74 68 65 20 64 61 74   to test the dat
10cf0 61 20 73 74 72 75 63 74 75 72 65 20 61 74 20 72  a structure at r
10d00 75 6e 74 69 6d 65 20 69 6e 20 74 68 69 73 20 63  untime in this c
10d10 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ase..          *
10d20 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  /.          sqli
10d30 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10d40 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
10d50 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
10d60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10d70 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
10d80 70 6f 70 75 6c 61 74 65 73 20 74 68 65 20 72 4e  populates the rN
10d90 6f 74 46 6f 75 6e 64 20 72 65 67 69 73 74 65 72  otFound register
10da0 20 77 69 74 68 20 65 69 74 68 65 72 20 4e 55 4c   with either NUL
10db0 4c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f  L.          ** o
10dc0 72 20 30 20 28 61 6e 20 69 6e 74 65 67 65 72 20  r 0 (an integer 
10dd0 76 61 6c 75 65 29 2e 20 49 66 20 74 68 65 20 64  value). If the d
10de0 61 74 61 20 73 74 72 75 63 74 75 72 65 20 63 6f  ata structure co
10df0 6e 74 61 69 6e 73 20 6f 6e 65 0a 20 20 20 20 20  ntains one.     
10e00 20 20 20 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20       ** or more 
10e10 4e 55 4c 4c 73 2c 20 74 68 65 6e 20 73 65 74 20  NULLs, then set 
10e20 72 4e 6f 74 46 6f 75 6e 64 20 74 6f 20 4e 55 4c  rNotFound to NUL
10e30 4c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65  L. Otherwise, se
10e40 74 20 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a  t it.          *
10e50 2a 20 74 6f 20 30 2e 20 49 66 20 72 65 67 69 73  * to 0. If regis
10e60 74 65 72 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c  ter rMayHaveNull
10e70 20 69 73 20 61 6c 72 65 61 64 79 20 73 65 74 20   is already set 
10e80 74 6f 20 73 6f 6d 65 20 76 61 6c 75 65 0a 20 20  to some value.  
10e90 20 20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72          ** other
10ea0 20 74 68 61 6e 20 4e 55 4c 4c 2c 20 74 68 65 6e   than NULL, then
10eb0 20 74 68 65 20 74 65 73 74 20 68 61 73 20 61 6c   the test has al
10ec0 72 65 61 64 79 20 62 65 65 6e 20 72 75 6e 20 61  ready been run a
10ed0 6e 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  nd .          **
10ee0 20 72 4e 6f 74 46 6f 75 6e 64 20 69 73 20 61 6c   rNotFound is al
10ef0 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64 2e  ready populated.
10f00 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
10f10 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63          static c
10f20 6f 6e 73 74 20 63 68 61 72 20 6e 75 6c 6c 52 65  onst char nullRe
10f30 63 6f 72 64 5b 5d 20 3d 20 7b 20 30 78 30 32 2c  cord[] = { 0x02,
10f40 20 30 78 30 30 20 7d 3b 0a 20 20 20 20 20 20 20   0x00 };.       
10f50 20 20 20 6a 33 20 3d 20 73 71 6c 69 74 65 33 56     j3 = sqlite3V
10f60 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
10f70 4e 6f 74 4e 75 6c 6c 2c 20 72 4d 61 79 48 61 76  NotNull, rMayHav
10f80 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  eNull);.        
10f90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10fa0 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
10fb0 30 2c 20 72 4e 6f 74 46 6f 75 6e 64 29 3b 0a 20  0, rNotFound);. 
10fc0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10fd0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
10fe0 5f 42 6c 6f 62 2c 20 32 2c 20 72 4d 61 79 48 61  _Blob, 2, rMayHa
10ff0 76 65 4e 75 6c 6c 2c 20 30 2c 20 0a 20 20 20 20  veNull, 0, .    
11000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11010 20 20 20 20 20 20 20 20 20 6e 75 6c 6c 52 65 63           nullRec
11020 6f 72 64 2c 20 50 34 5f 53 54 41 54 49 43 29 3b  ord, P4_STATIC);
11030 0a 20 20 20 20 20 20 20 20 20 20 6a 34 20 3d 20  .          j4 = 
11040 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11050 33 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70  3(v, OP_Found, p
11060 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c  Expr->iTable, 0,
11070 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 29 3b 0a   rMayHaveNull);.
11080 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11090 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
110a0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 4e  P_Integer, 0, rN
110b0 6f 74 46 6f 75 6e 64 29 3b 0a 20 20 20 20 20 20  otFound);.      
110c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
110d0 75 6d 70 48 65 72 65 28 76 2c 20 6a 34 29 3b 0a  umpHere(v, j4);.
110e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
110f0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
11100 20 6a 33 29 3b 0a 0a 20 20 20 20 20 20 20 20 20   j3);..         
11110 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 76 61 6c   /* Copy the val
11120 75 65 20 6f 66 20 72 65 67 69 73 74 65 72 20 72  ue of register r
11130 4e 6f 74 46 6f 75 6e 64 20 28 77 68 69 63 68 20  NotFound (which 
11140 69 73 20 65 69 74 68 65 72 20 4e 55 4c 4c 20 6f  is either NULL o
11150 72 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 2a  r 0).          *
11160 2a 20 69 6e 74 6f 20 74 68 65 20 74 61 72 67 65  * into the targe
11170 74 20 72 65 67 69 73 74 65 72 2e 20 54 68 69 73  t register. This
11180 20 77 69 6c 6c 20 62 65 20 74 68 65 20 72 65 73   will be the res
11190 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20  ult of the.     
111a0 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69       ** expressi
111b0 6f 6e 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  on..          */
111c0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
111d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
111e0 4f 50 5f 43 6f 70 79 2c 20 72 4e 6f 74 46 6f 75  OP_Copy, rNotFou
111f0 6e 64 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  nd, target);.   
11200 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
11210 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11220 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 32 29 3b  JumpHere(v, j2);
11230 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11240 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 35  beJumpHere(v, j5
11250 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
11260 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 49 4e  ment((v, "end IN
11270 20 65 78 70 72 20 72 25 64 22 2c 20 74 61 72 67   expr r%d", targ
11280 65 74 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61  et));.      brea
11290 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
112a0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20      /*.    **   
112b0 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44   x BETWEEN y AND
112c0 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a   z.    **.    **
112d0 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61 6c   This is equival
112e0 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20  ent to.    **.  
112f0 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44    **    x>=y AND
11300 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20   x<=z.    **.   
11310 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65 64 20   ** X is stored 
11320 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e  in pExpr->pLeft.
11330 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73 74 6f  .    ** Y is sto
11340 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
11350 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e  ist->a[0].pExpr.
11360 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f  .    ** Z is sto
11370 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
11380 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e  ist->a[1].pExpr.
11390 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
113a0 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
113b0 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
113c0 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
113d0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
113e0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 49  prList_item *pLI
113f0 74 65 6d 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  tem = pExpr->pLi
11400 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 45 78 70  st->a;.      Exp
11410 72 20 2a 70 52 69 67 68 74 20 3d 20 70 4c 49 74  r *pRight = pLIt
11420 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20 20  em->pExpr;..    
11430 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 4f 70 65    codeCompareOpe
11440 72 61 6e 64 73 28 70 50 61 72 73 65 2c 20 70 4c  rands(pParse, pL
11450 65 66 74 2c 20 26 72 31 2c 20 26 72 65 67 46 72  eft, &r1, &regFr
11460 65 65 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ee1,.           
11470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11480 20 20 20 20 20 20 20 70 52 69 67 68 74 2c 20 26         pRight, &
11490 72 32 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  r2, &regFree2);.
114a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
114b0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
114c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
114d0 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
114e0 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33      r3 = sqlite3
114f0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
11500 65 29 3b 0a 20 20 20 20 20 20 72 34 20 3d 20 73  e);.      r4 = s
11510 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
11520 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
11530 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
11540 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  se, pLeft, pRigh
11550 74 2c 20 4f 50 5f 47 65 2c 0a 20 20 20 20 20 20  t, OP_Ge,.      
11560 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
11570 72 32 2c 20 72 33 2c 20 53 51 4c 49 54 45 5f 53  r2, r3, SQLITE_S
11580 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20 70  TOREP2);.      p
11590 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70  LItem++;.      p
115a0 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e  Right = pLItem->
115b0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  pExpr;.      sql
115c0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
115d0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
115e0 65 65 32 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee2);.      r2 =
115f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
11600 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 52 69  Temp(pParse, pRi
11610 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
11620 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
11630 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
11640 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
11650 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  e(pParse, pLeft,
11660 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20   pRight, OP_Le, 
11670 72 31 2c 20 72 32 2c 20 72 34 2c 20 53 51 4c 49  r1, r2, r4, SQLI
11680 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20  TE_STOREP2);.   
11690 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
116a0 64 4f 70 33 28 76 2c 20 4f 50 5f 41 6e 64 2c 20  dOp3(v, OP_And, 
116b0 72 33 2c 20 72 34 2c 20 74 61 72 67 65 74 29 3b  r3, r4, target);
116c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
116d0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
116e0 72 73 65 2c 20 72 33 29 3b 0a 20 20 20 20 20 20  rse, r3);.      
116f0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
11700 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 34  mpReg(pParse, r4
11710 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
11720 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
11730 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20  K_UPLUS: {.     
11740 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
11750 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
11760 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
11770 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  eft, target);.  
11780 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11790 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
117a0 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20  Form A:.    **  
117b0 20 43 41 53 45 20 78 20 57 48 45 4e 20 65 31 20   CASE x WHEN e1 
117c0 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20  THEN r1 WHEN e2 
117d0 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e  THEN r2 ... WHEN
117e0 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45   eN THEN rN ELSE
117f0 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20   y END.    **.  
11800 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20    ** Form B:.   
11810 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20   **   CASE WHEN 
11820 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20  e1 THEN r1 WHEN 
11830 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57  e2 THEN r2 ... W
11840 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45  HEN eN THEN rN E
11850 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a  LSE y END.    **
11860 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69  .    ** Form A i
11870 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66 6f  s can be transfo
11880 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20 65 71  rmed into the eq
11890 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20  uivalent form B 
118a0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
118b0 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 78  **   CASE WHEN x
118c0 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e  =e1 THEN r1 WHEN
118d0 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20 2e 2e   x=e2 THEN r2 ..
118e0 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ..    **        
118f0 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72  WHEN x=eN THEN r
11900 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20  N ELSE y END.   
11910 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69 66   **.    ** X (if
11920 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20 69   it exists) is i
11930 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a  n pExpr->pLeft..
11940 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e 20 70      ** Y is in p
11950 45 78 70 72 2d 3e 70 52 69 67 68 74 2e 20 20 54  Expr->pRight.  T
11960 68 65 20 59 20 69 73 20 61 6c 73 6f 20 6f 70 74  he Y is also opt
11970 69 6f 6e 61 6c 2e 20 20 49 66 20 74 68 65 72 65  ional.  If there
11980 20 69 73 20 6e 6f 0a 20 20 20 20 2a 2a 20 45 4c   is no.    ** EL
11990 53 45 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f  SE clause and no
119a0 20 6f 74 68 65 72 20 74 65 72 6d 20 6d 61 74 63   other term matc
119b0 68 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65  hes, then the re
119c0 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 20 20  sult of the.    
119d0 2a 2a 20 65 78 70 72 73 73 69 6f 6e 20 69 73 20  ** exprssion is 
119e0 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69 20  NULL..    ** Ei 
119f0 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69  is in pExpr->pLi
11a00 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20 52  st->a[i*2] and R
11a10 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c 69 73  i is pExpr->pLis
11a20 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20  t->a[i*2+1]..   
11a30 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
11a40 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65 78 70  esult of the exp
11a50 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20 52  ression is the R
11a60 69 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  i for the first 
11a70 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20 20 20  matching Ei,.   
11a80 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72 65 20   ** or if there 
11a90 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 45  is no matching E
11aa0 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65 72 6d  i, the ELSE term
11ab0 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20   Y, or if there 
11ac0 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c 53  is.    ** no ELS
11ad0 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20  E term, NULL..  
11ae0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
11af0 5f 43 41 53 45 3a 20 7b 0a 20 20 20 20 20 20 69  _CASE: {.      i
11b00 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20  nt endLabel;    
11b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66   /* GOTO label f
11b30 6f 72 20 65 6e 64 20 6f 66 20 43 41 53 45 20 73  or end of CASE s
11b40 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  tmt */.      int
11b50 20 6e 65 78 74 43 61 73 65 3b 20 20 20 20 20 20   nextCase;      
11b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11b70 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72  * GOTO label for
11b80 20 6e 65 78 74 20 57 48 45 4e 20 63 6c 61 75 73   next WHEN claus
11b90 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  e */.      int n
11ba0 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20  Expr;           
11bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11bc0 32 78 20 6e 75 6d 62 65 72 20 6f 66 20 57 48 45  2x number of WHE
11bd0 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  N terms */.     
11be0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
11bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c00 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
11c10 65 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  er */.      Expr
11c20 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20  List *pEList;   
11c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11c40 20 4c 69 73 74 20 6f 66 20 57 48 45 4e 20 74 65   List of WHEN te
11c50 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72  rms */.      str
11c60 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
11c70 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f  m *aListelem;  /
11c80 2a 20 41 72 72 61 79 20 6f 66 20 57 48 45 4e 20  * Array of WHEN 
11c90 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45  terms */.      E
11ca0 78 70 72 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20  xpr opCompare;  
11cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cc0 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69 20 65 78   /* The X==Ei ex
11cd0 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
11ce0 20 20 45 78 70 72 20 63 61 63 68 65 58 3b 20 20    Expr cacheX;  
11cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d00 20 20 20 20 2f 2a 20 43 61 63 68 65 64 20 65 78      /* Cached ex
11d10 70 72 65 73 73 69 6f 6e 20 58 20 2a 2f 0a 20 20  pression X */.  
11d20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20      Expr *pX;   
11d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 20 65        /* The X e
11d50 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
11d60 20 20 20 45 78 70 72 20 2a 70 54 65 73 74 3b 20     Expr *pTest; 
11d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d80 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66       /* X==Ei (f
11d90 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73 74 20 45  orm A) or just E
11da0 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 0a 20  i (form B) */.. 
11db0 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70       assert(pExp
11dc0 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  r->pList);.     
11dd0 20 61 73 73 65 72 74 28 28 70 45 78 70 72 2d 3e   assert((pExpr->
11de0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 25 20 32  pList->nExpr % 2
11df0 29 20 3d 3d 20 30 29 3b 0a 20 20 20 20 20 20 61  ) == 0);.      a
11e00 73 73 65 72 74 28 70 45 78 70 72 2d 3e 70 4c 69  ssert(pExpr->pLi
11e10 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a  st->nExpr > 0);.
11e20 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70        pEList = p
11e30 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20  Expr->pList;.   
11e40 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70     aListelem = p
11e50 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  EList->a;.      
11e60 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e  nExpr = pEList->
11e70 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64  nExpr;.      end
11e80 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56  Label = sqlite3V
11e90 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
11ea0 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 20 3d  .      if( (pX =
11eb0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d   pExpr->pLeft)!=
11ec0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 63  0 ){.        cac
11ed0 68 65 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20  heX = *pX;.     
11ee0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d     testcase( pX-
11ef0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op==TK_COLUMN |
11f00 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47  | pX->op==TK_REG
11f10 49 53 54 45 52 20 29 3b 0a 20 20 20 20 20 20 20  ISTER );.       
11f20 20 63 61 63 68 65 58 2e 69 54 61 62 6c 65 20 3d   cacheX.iTable =
11f30 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
11f40 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2c  Temp(pParse, pX,
11f50 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
11f60 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
11f70 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
11f80 20 20 20 20 20 20 63 61 63 68 65 58 2e 6f 70 20        cacheX.op 
11f90 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20  = TK_REGISTER;. 
11fa0 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65         opCompare
11fb0 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20  .op = TK_EQ;.   
11fc0 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70       opCompare.p
11fd0 4c 65 66 74 20 3d 20 26 63 61 63 68 65 58 3b 0a  Left = &cacheX;.
11fe0 20 20 20 20 20 20 20 20 70 54 65 73 74 20 3d 20          pTest = 
11ff0 26 6f 70 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20  &opCompare;.    
12000 20 20 7d 0a 20 20 20 20 20 20 70 50 61 72 73 65    }.      pParse
12010 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68  ->disableColCach
12020 65 2b 2b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  e++;.      for(i
12030 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 3d 69  =0; i<nExpr; i=i
12040 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  +2){.        if(
12050 20 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20   pX ){.         
12060 20 6f 70 43 6f 6d 70 61 72 65 2e 70 52 69 67 68   opCompare.pRigh
12070 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d  t = aListelem[i]
12080 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
12090 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
120a0 20 70 54 65 73 74 20 3d 20 61 4c 69 73 74 65 6c   pTest = aListel
120b0 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  em[i].pExpr;.   
120c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e       }.        n
120d0 65 78 74 43 61 73 65 20 3d 20 73 71 6c 69 74 65  extCase = sqlite
120e0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
120f0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
12100 61 73 65 28 20 70 54 65 73 74 2d 3e 6f 70 3d 3d  ase( pTest->op==
12110 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 54 65  TK_COLUMN || pTe
12120 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  st->op==TK_REGIS
12130 54 45 52 20 29 3b 0a 20 20 20 20 20 20 20 20 73  TER );.        s
12140 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
12150 65 28 70 50 61 72 73 65 2c 20 70 54 65 73 74 2c  e(pParse, pTest,
12160 20 6e 65 78 74 43 61 73 65 2c 20 53 51 4c 49 54   nextCase, SQLIT
12170 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
12180 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
12190 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e   aListelem[i+1].
121a0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
121b0 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  LUMN );.        
121c0 74 65 73 74 63 61 73 65 28 20 61 4c 69 73 74 65  testcase( aListe
121d0 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e  lem[i+1].pExpr->
121e0 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
121f0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
12200 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
12210 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31  e, aListelem[i+1
12220 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
12230 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
12240 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12250 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 6e 64 4c 61  P_Goto, 0, endLa
12260 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  bel);.        sq
12270 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
12280 4c 61 62 65 6c 28 76 2c 20 6e 65 78 74 43 61 73  Label(v, nextCas
12290 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
122a0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69    if( pExpr->pRi
122b0 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ght ){.        s
122c0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
122d0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
122e0 69 67 68 74 2c 20 74 61 72 67 65 74 29 3b 0a 20  ight, target);. 
122f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12300 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12310 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
12320 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
12330 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
12340 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
12350 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29  bel(v, endLabel)
12360 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
12370 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43  pParse->disableC
12380 6f 6c 43 61 63 68 65 3e 30 20 29 3b 0a 20 20 20  olCache>0 );.   
12390 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62     pParse->disab
123a0 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20  leColCache--;.  
123b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
123c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
123d0 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20  OMIT_TRIGGER.   
123e0 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20   case TK_RAISE: 
123f0 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  {.      if( !pPa
12400 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 29  rse->trigStack )
12410 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
12420 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
12430 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12440 20 20 20 20 20 20 20 20 20 22 52 41 49 53 45 28           "RAISE(
12450 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73  ) may only be us
12460 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 69 67  ed within a trig
12470 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20  ger-program");. 
12480 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
12490 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
124a0 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
124b0 6e 21 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a  n!=OE_Ignore ){.
124c0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
124d0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d   pExpr->iColumn=
124e0 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 7c 7c 0a  =OE_Rollback ||.
124f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12500 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
12510 3d 3d 20 4f 45 5f 41 62 6f 72 74 20 7c 7c 0a 20  == OE_Abort ||. 
12520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12530 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
12540 3d 20 4f 45 5f 46 61 69 6c 20 29 3b 0a 20 20 20  = OE_Fail );.   
12550 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71        sqlite3Deq
12560 75 6f 74 65 45 78 70 72 28 64 62 2c 20 70 45 78  uoteExpr(db, pEx
12570 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71  pr);.         sq
12580 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
12590 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49  v, OP_Halt, SQLI
125a0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 70  TE_CONSTRAINT, p
125b0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 30  Expr->iColumn, 0
125c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
125d0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
125e0 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  )pExpr->token.z,
125f0 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29   pExpr->token.n)
12600 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ;.      } else {
12610 0a 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74  .         assert
12620 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
12630 20 3d 3d 20 4f 45 5f 49 67 6e 6f 72 65 20 29 3b   == OE_Ignore );
12640 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
12650 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12660 50 5f 43 6f 6e 74 65 78 74 50 6f 70 2c 20 30 2c  P_ContextPop, 0,
12670 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71   0);.         sq
12680 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12690 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70  v, OP_Goto, 0, p
126a0 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b  Parse->trigStack
126b0 2d 3e 69 67 6e 6f 72 65 4a 75 6d 70 29 3b 0a 20  ->ignoreJump);. 
126c0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
126d0 65 6e 74 28 28 76 2c 20 22 72 61 69 73 65 28 49  ent((v, "raise(I
126e0 47 4e 4f 52 45 29 22 29 29 3b 0a 20 20 20 20 20  GNORE)"));.     
126f0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
12700 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
12710 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
12720 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
12730 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
12740 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
12750 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
12760 72 65 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  ree2);.  return 
12770 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  inReg;.}../*.** 
12780 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
12790 20 65 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70   evaluate an exp
127a0 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72  ression and stor
127b0 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a  e the results.**
127c0 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72   into a register
127d0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  .  Return the re
127e0 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68  gister number wh
127f0 65 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ere the results.
12800 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a  ** are stored..*
12810 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 67 69  *.** If the regi
12820 73 74 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72  ster is a tempor
12830 61 72 79 20 72 65 67 69 73 74 65 72 20 74 68 61  ary register tha
12840 74 20 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63  t can be dealloc
12850 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72  ated,.** then wr
12860 69 74 65 20 69 74 73 20 6e 75 6d 62 65 72 20 69  ite its number i
12870 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49 66 20 74  nto *pReg.  If t
12880 68 65 20 72 65 73 75 6c 74 20 72 65 67 69 73 74  he result regist
12890 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74  er is not.** a t
128a0 65 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e 20 73  emporary, then s
128b0 65 74 20 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f  et *pReg to zero
128c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
128d0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72  ExprCodeTemp(Par
128e0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
128f0 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52   *pExpr, int *pR
12900 65 67 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20  eg){.  int r1 = 
12910 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
12920 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  g(pParse);.  int
12930 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
12940 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
12950 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29 3b 0a  se, pExpr, r1);.
12960 20 20 69 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a    if( r2==r1 ){.
12970 20 20 20 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a      *pReg = r1;.
12980 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
12990 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
129a0 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
129b0 20 20 20 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20      *pReg = 0;. 
129c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 32 3b 0a   }.  return r2;.
129d0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
129e0 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
129f0 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73   evaluate expres
12a00 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73  sion pExpr and s
12a10 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75  tore the.** resu
12a20 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  lts in register 
12a30 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73  target.  The res
12a40 75 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e 74  ults are guarant
12a50 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a  eed to appear.**
12a60 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72   in register tar
12a70 67 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  get..*/.int sqli
12a80 74 65 33 45 78 70 72 43 6f 64 65 28 50 61 72 73  te3ExprCode(Pars
12a90 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
12aa0 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
12ab0 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67  et){.  int inReg
12ac0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72  ;..  assert( tar
12ad0 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c  get>0 && target<
12ae0 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b  =pParse->nMem );
12af0 0a 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74  .  inReg = sqlit
12b00 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
12b10 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
12b20 74 61 72 67 65 74 29 3b 0a 20 20 61 73 73 65 72  target);.  asser
12b30 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  t( pParse->pVdbe
12b40 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
12b50 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
12b60 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72    if( inReg!=tar
12b70 67 65 74 20 26 26 20 70 50 61 72 73 65 2d 3e 70  get && pParse->p
12b80 56 64 62 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Vdbe ){.    sqli
12b90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50  te3VdbeAddOp2(pP
12ba0 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
12bb0 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61  SCopy, inReg, ta
12bc0 72 67 65 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  rget);.  }.  ret
12bd0 75 72 6e 20 74 61 72 67 65 74 3b 0a 7d 0a 0a 2f  urn target;.}../
12be0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
12bf0 64 65 20 74 68 61 74 20 65 76 61 6c 75 74 65 73  de that evalutes
12c00 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
12c10 73 73 69 6f 6e 20 61 6e 64 20 70 75 74 73 20 74  ssion and puts t
12c20 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20  he result.** in 
12c30 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
12c40 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65  .**.** Also make
12c50 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65   a copy of the e
12c60 78 70 72 65 73 73 69 6f 6e 20 72 65 73 75 6c 74  xpression result
12c70 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22  s into another "
12c80 63 61 63 68 65 22 20 72 65 67 69 73 74 65 72 0a  cache" register.
12c90 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68  ** and modify th
12ca0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73 6f 20  e expression so 
12cb0 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 74 69  that the next ti
12cc0 6d 65 20 69 74 20 69 73 20 65 76 61 6c 75 61 74  me it is evaluat
12cd0 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  ed,.** the resul
12ce0 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74  t is a copy of t
12cf0 68 65 20 63 61 63 68 65 20 72 65 67 69 73 74 65  he cache registe
12d00 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  r..**.** This ro
12d10 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
12d20 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  r expressions th
12d30 61 74 20 61 72 65 20 75 73 65 64 20 6d 75 6c 74  at are used mult
12d40 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20  iple .** times. 
12d50 20 54 68 65 79 20 61 72 65 20 65 76 61 6c 75 61   They are evalua
12d60 74 65 64 20 6f 6e 63 65 20 61 6e 64 20 74 68 65  ted once and the
12d70 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
12d80 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72  expression.** ar
12d90 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 69 6e 74  e reused..*/.int
12da0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
12db0 41 6e 64 43 61 63 68 65 28 50 61 72 73 65 20 2a  AndCache(Parse *
12dc0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
12dd0 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
12de0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
12df0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
12e00 6e 74 20 69 6e 52 65 67 3b 0a 20 20 69 6e 52 65  nt inReg;.  inRe
12e10 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
12e20 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
12e30 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 61 73  r, target);.  as
12e40 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29  sert( target>0 )
12e50 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
12e60 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p!=TK_REGISTER )
12e70 7b 20 20 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d  {  .    int iMem
12e80 3b 0a 20 20 20 20 69 4d 65 6d 20 3d 20 2b 2b 70  ;.    iMem = ++p
12e90 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
12ea0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12eb0 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 69  p2(v, OP_Copy, i
12ec0 6e 52 65 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  nReg, iMem);.   
12ed0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
12ee0 20 69 4d 65 6d 3b 0a 20 20 20 20 70 45 78 70 72   iMem;.    pExpr
12ef0 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54  ->op = TK_REGIST
12f00 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ER;.  }.  return
12f10 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   inReg;.}../*.**
12f20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
12f30 70 45 78 70 72 20 69 73 20 61 6e 20 63 6f 6e 73  pExpr is an cons
12f40 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  tant expression 
12f50 74 68 61 74 20 69 73 20 61 70 70 72 6f 70 72 69  that is appropri
12f60 61 74 65 0a 2a 2a 20 66 6f 72 20 66 61 63 74 6f  ate.** for facto
12f70 72 69 6e 67 20 6f 75 74 20 6f 66 20 61 20 6c 6f  ring out of a lo
12f80 6f 70 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65  op.  Appropriate
12f90 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
12fa0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 41 6e  :.**.**    *  An
12fb0 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  y expression tha
12fc0 74 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 74  t evaluates to t
12fd0 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 70 63 6f 64  wo or more opcod
12fe0 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20  es..**.**    *  
12ff0 41 6e 79 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  Any OP_Integer, 
13000 4f 50 5f 52 65 61 6c 2c 20 4f 50 5f 53 74 72 69  OP_Real, OP_Stri
13010 6e 67 2c 20 4f 50 5f 42 6c 6f 62 2c 20 4f 50 5f  ng, OP_Blob, OP_
13020 4e 75 6c 6c 2c 20 0a 2a 2a 20 20 20 20 20 20 20  Null, .**       
13030 6f 72 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 74  or OP_Variable t
13040 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
13050 64 20 74 6f 20 62 65 20 70 6c 61 63 65 64 20 69  d to be placed i
13060 6e 20 61 20 0a 2a 2a 20 20 20 20 20 20 20 73 70  n a .**       sp
13070 65 63 69 66 69 63 20 72 65 67 69 73 74 65 72 2e  ecific register.
13080 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
13090 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 66 61 63 74  no point in fact
130a0 6f 72 69 6e 67 20 6f 75 74 20 73 69 6e 67 6c 65  oring out single
130b0 2d 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 6f 6e  -instruction con
130c0 73 74 61 6e 74 0a 2a 2a 20 65 78 70 72 65 73 73  stant.** express
130d0 69 6f 6e 73 20 74 68 61 74 20 6e 65 65 64 20 74  ions that need t
130e0 6f 20 62 65 20 70 6c 61 63 65 64 20 69 6e 20 61  o be placed in a
130f0 20 70 61 72 74 69 63 75 6c 61 72 20 72 65 67 69   particular regi
13100 73 74 65 72 2e 20 20 0a 2a 2a 20 57 65 20 63 6f  ster.  .** We co
13110 75 6c 64 20 66 61 63 74 6f 72 20 74 68 65 6d 20  uld factor them 
13120 6f 75 74 2c 20 62 75 74 20 74 68 65 6e 20 77 65  out, but then we
13130 20 77 6f 75 6c 64 20 65 6e 64 20 75 70 20 61 64   would end up ad
13140 64 69 6e 67 20 61 6e 0a 2a 2a 20 4f 50 5f 53 43  ding an.** OP_SC
13150 6f 70 79 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  opy instruction 
13160 74 6f 20 6d 6f 76 65 20 74 68 65 20 76 61 6c 75  to move the valu
13170 65 20 69 6e 74 6f 20 74 68 65 20 63 6f 72 72 65  e into the corre
13180 63 74 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 6c  ct register.** l
13190 61 74 65 72 2e 20 20 57 65 20 6d 69 67 68 74 20  ater.  We might 
131a0 61 73 20 77 65 6c 6c 20 6a 75 73 74 20 75 73 65  as well just use
131b0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e   the original in
131c0 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a  struction and.**
131d0 20 61 76 6f 69 64 20 74 68 65 20 4f 50 5f 53 43   avoid the OP_SC
131e0 6f 70 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  opy..*/.static i
131f0 6e 74 20 69 73 41 70 70 72 6f 70 72 69 61 74 65  nt isAppropriate
13200 46 6f 72 46 61 63 74 6f 72 69 6e 67 28 45 78 70  ForFactoring(Exp
13210 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 21 73 71  r *p){.  if( !sq
13220 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
13230 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 29 20 29 7b  antNotJoin(p) ){
13240 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
13250 2f 2a 20 4f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74  /* Only constant
13260 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
13270 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
13280 20 66 61 63 74 6f 72 69 6e 67 20 2a 2f 0a 20 20   factoring */.  
13290 7d 0a 20 20 69 66 28 20 28 70 2d 3e 66 6c 61 67  }.  if( (p->flag
132a0 73 20 26 20 45 50 5f 46 69 78 65 64 44 65 73 74  s & EP_FixedDest
132b0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
132c0 72 6e 20 31 3b 20 20 2f 2a 20 41 6e 79 20 63 6f  rn 1;  /* Any co
132d0 6e 73 74 61 6e 74 20 77 69 74 68 6f 75 74 20 61  nstant without a
132e0 20 66 69 78 65 64 20 64 65 73 74 69 6e 61 74 69   fixed destinati
132f0 6f 6e 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  on is appropriat
13300 65 20 2a 2f 0a 20 20 7d 0a 20 20 77 68 69 6c 65  e */.  }.  while
13310 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55  ( p->op==TK_UPLU
13320 53 20 29 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74  S ) p = p->pLeft
13330 3b 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  ;.  switch( p->o
13340 70 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  p ){.#ifndef SQL
13350 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49  ITE_OMIT_BLOB_LI
13360 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54  TERAL.    case T
13370 4b 5f 42 4c 4f 42 3a 0a 23 65 6e 64 69 66 0a 20  K_BLOB:.#endif. 
13380 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41     case TK_VARIA
13390 42 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  BLE:.    case TK
133a0 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61  _INTEGER:.    ca
133b0 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20  se TK_FLOAT:.   
133c0 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20   case TK_NULL:. 
133d0 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
133e0 47 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  G: {.      testc
133f0 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 42  ase( p->op==TK_B
13400 4c 4f 42 20 29 3b 0a 20 20 20 20 20 20 74 65 73  LOB );.      tes
13410 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
13420 5f 56 41 52 49 41 42 4c 45 20 29 3b 0a 20 20 20  _VARIABLE );.   
13430 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
13440 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29  op==TK_INTEGER )
13450 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
13460 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41  ( p->op==TK_FLOA
13470 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
13480 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 4e  ase( p->op==TK_N
13490 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ULL );.      tes
134a0 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
134b0 5f 53 54 52 49 4e 47 20 29 3b 0a 20 20 20 20 20  _STRING );.     
134c0 20 2f 2a 20 53 69 6e 67 6c 65 2d 69 6e 73 74 72   /* Single-instr
134d0 75 63 74 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 73  uction constants
134e0 20 77 69 74 68 20 61 20 66 69 78 65 64 20 64 65   with a fixed de
134f0 73 74 69 6e 61 74 69 6f 6e 20 61 72 65 0a 20 20  stination are.  
13500 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20 64 6f      ** better do
13510 6e 65 20 69 6e 2d 6c 69 6e 65 2e 20 20 49 66 20  ne in-line.  If 
13520 77 65 20 66 61 63 74 6f 72 20 74 68 65 6d 2c 20  we factor them, 
13530 74 68 65 79 20 77 69 6c 6c 20 6a 75 73 74 20 65  they will just e
13540 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75 70 20 67  nd.      ** up g
13550 65 6e 65 72 61 74 69 6e 67 20 61 6e 20 4f 50 5f  enerating an OP_
13560 53 43 6f 70 79 20 74 6f 20 6d 6f 76 65 20 74 68  SCopy to move th
13570 65 20 76 61 6c 75 65 20 74 6f 20 74 68 65 20 64  e value to the d
13580 65 73 74 69 6e 61 74 69 6f 6e 0a 20 20 20 20 20  estination.     
13590 20 2a 2a 20 72 65 67 69 73 74 65 72 2e 20 2a 2f   ** register. */
135a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
135b0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
135c0 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
135d0 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74      if( p->pLeft
135e0 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c  ->op==TK_FLOAT |
135f0 7c 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d  | p->pLeft->op==
13600 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20  TK_INTEGER ){.  
13610 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
13620 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  .       }.      
13630 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
13640 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
13650 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
13660 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
13670 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 45 78 70  }../*.** If pExp
13680 72 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  r is a constant 
13690 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
136a0 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  is appropriate f
136b0 6f 72 0a 2a 2a 20 66 61 63 74 6f 72 69 6e 67 20  or.** factoring 
136c0 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2c 20 74  out of a loop, t
136d0 68 65 6e 20 65 76 61 6c 75 61 74 65 20 74 68 65  hen evaluate the
136e0 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
136f0 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 20 61  nto a register a
13700 6e 64 20 63 6f 6e 76 65 72 74 20 74 68 65 20 65  nd convert the e
13710 78 70 72 65 73 73 69 6f 6e 20 69 6e 74 6f 20 61  xpression into a
13720 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 2a 2a 20   TK_REGISTER.** 
13730 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73  expression..*/.s
13740 74 61 74 69 63 20 69 6e 74 20 65 76 61 6c 43 6f  tatic int evalCo
13750 6e 73 74 45 78 70 72 28 57 61 6c 6b 65 72 20 2a  nstExpr(Walker *
13760 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
13770 45 78 70 72 29 7b 0a 20 20 50 61 72 73 65 20 2a  Expr){.  Parse *
13780 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
13790 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 77 69 74  ->pParse;.  swit
137a0 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
137b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47  .    case TK_REG
137c0 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 72  ISTER: {.      r
137d0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
137e0 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
137f0 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ION:.    case TK
13800 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  _AGG_FUNCTION:. 
13810 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54     case TK_CONST
13820 5f 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20 20 2f  _FUNC: {.      /
13830 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20  * The arguments 
13840 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 68 61  to a function ha
13850 76 65 20 61 20 66 69 78 65 64 20 64 65 73 74 69  ve a fixed desti
13860 6e 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a  nation..      **
13870 20 4d 61 72 6b 20 74 68 65 6d 20 74 68 69 73 20   Mark them this 
13880 77 61 79 20 74 6f 20 61 76 6f 69 64 20 67 65 6e  way to avoid gen
13890 65 72 61 74 65 64 20 75 6e 6e 65 65 64 65 64 20  erated unneeded 
138a0 4f 50 5f 53 43 6f 70 79 0a 20 20 20 20 20 20 2a  OP_SCopy.      *
138b0 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20  * instructions. 
138c0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
138d0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
138e0 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a  = pExpr->pList;.
138f0 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 20        if( pList 
13900 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
13910 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
13920 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
13930 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
13940 49 74 65 6d 20 3d 20 70 4c 69 73 74 2d 3e 61 3b  Item = pList->a;
13950 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20 69  .        for(; i
13960 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; i--, pItem++
13970 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
13980 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 29 20   pItem->pExpr ) 
13990 70 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 66 6c  pItem->pExpr->fl
139a0 61 67 73 20 7c 3d 20 45 50 5f 46 69 78 65 64 44  ags |= EP_FixedD
139b0 65 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  est;.        }. 
139c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
139d0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
139e0 69 66 28 20 69 73 41 70 70 72 6f 70 72 69 61 74  if( isAppropriat
139f0 65 46 6f 72 46 61 63 74 6f 72 69 6e 67 28 70 45  eForFactoring(pE
13a00 78 70 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  xpr) ){.    int 
13a10 72 31 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  r1 = ++pParse->n
13a20 4d 65 6d 3b 0a 20 20 20 20 69 6e 74 20 72 32 3b  Mem;.    int r2;
13a30 0a 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65  .    r2 = sqlite
13a40 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
13a50 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72  pParse, pExpr, r
13a60 31 29 3b 0a 20 20 20 20 69 66 28 20 72 31 21 3d  1);.    if( r1!=
13a70 72 32 20 29 20 73 71 6c 69 74 65 33 52 65 6c 65  r2 ) sqlite3Rele
13a80 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
13a90 65 2c 20 72 31 29 3b 0a 20 20 20 20 70 45 78 70  e, r1);.    pExp
13aa0 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53  r->op = TK_REGIS
13ab0 54 45 52 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  TER;.    pExpr->
13ac0 69 54 61 62 6c 65 20 3d 20 72 32 3b 0a 20 20 20  iTable = r2;.   
13ad0 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
13ae0 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
13af0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
13b00 0a 2f 2a 0a 2a 2a 20 50 72 65 65 76 61 6c 75 61  ./*.** Preevalua
13b10 74 65 20 63 6f 6e 73 74 61 6e 74 20 73 75 62 65  te constant sube
13b20 78 70 72 65 73 73 69 6f 6e 73 20 77 69 74 68 69  xpressions withi
13b30 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72  n pExpr and stor
13b40 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73  e the.** results
13b50 20 69 6e 20 72 65 67 69 73 74 65 72 73 2e 20 20   in registers.  
13b60 4d 6f 64 69 66 79 20 70 45 78 70 72 20 73 6f 20  Modify pExpr so 
13b70 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61 6e  that the constan
13b80 74 20 73 75 62 65 78 70 72 65 73 69 6f 6e 73 0a  t subexpresions.
13b90 2a 2a 20 61 72 65 20 54 4b 5f 52 45 47 49 53 54  ** are TK_REGIST
13ba0 45 52 20 6f 70 63 6f 64 65 73 20 74 68 61 74 20  ER opcodes that 
13bb0 72 65 66 65 72 20 74 6f 20 74 68 65 20 70 72 65  refer to the pre
13bc0 63 6f 6d 70 75 74 65 64 20 76 61 6c 75 65 73 2e  computed values.
13bd0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
13be0 45 78 70 72 43 6f 64 65 43 6f 6e 73 74 61 6e 74  ExprCodeConstant
13bf0 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
13c00 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
13c10 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78   Walker w;.  w.x
13c20 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
13c30 76 61 6c 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20  valConstExpr;.  
13c40 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
13c50 6b 20 3d 20 30 3b 0a 20 20 77 2e 70 50 61 72 73  k = 0;.  w.pPars
13c60 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71  e = pParse;.  sq
13c70 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
13c80 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 0a 2f 2a  , pExpr);.}.../*
13c90 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
13ca0 65 20 74 68 61 74 20 70 75 73 68 65 73 20 74 68  e that pushes th
13cb0 65 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79  e value of every
13cc0 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
13cd0 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73  given.** express
13ce0 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f 20 61 20  ion list into a 
13cf0 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69  sequence of regi
13d00 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20  sters beginning 
13d10 61 74 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a  at target..**.**
13d20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
13d30 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65  er of elements e
13d40 76 61 6c 75 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74  valuated..*/.int
13d50 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
13d60 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73  ExprList(.  Pars
13d70 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
13d80 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
13d90 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
13da0 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68 65  *pList,   /* The
13db0 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
13dc0 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
13dd0 20 20 69 6e 74 20 74 61 72 67 65 74 2c 20 20 20    int target,   
13de0 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
13df0 20 77 72 69 74 65 20 72 65 73 75 6c 74 73 20 2a   write results *
13e00 2f 0a 20 20 69 6e 74 20 64 6f 48 61 72 64 43 6f  /.  int doHardCo
13e10 70 79 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 61  py     /* Make a
13e20 20 68 61 72 64 20 63 6f 70 79 20 6f 66 20 65 76   hard copy of ev
13e30 65 72 79 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29  ery element */.)
13e40 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  {.  struct ExprL
13e50 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
13e60 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 61  .  int i, n;.  a
13e70 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
13e80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61 72  );.  assert( tar
13e90 67 65 74 3e 30 20 29 3b 0a 20 20 6e 20 3d 20 70  get>0 );.  n = p
13ea0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 66  List->nExpr;.  f
13eb0 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
13ec0 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  a, i=0; i<n; i++
13ed0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
13ee0 69 66 28 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61  if( pItem->iAlia
13ef0 73 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  s ){.      int i
13f00 52 65 67 20 3d 20 63 6f 64 65 41 6c 69 61 73 28  Reg = codeAlias(
13f10 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 69  pParse, pItem->i
13f20 41 6c 69 61 73 2c 20 70 49 74 65 6d 2d 3e 70 45  Alias, pItem->pE
13f30 78 70 72 29 3b 0a 20 20 20 20 20 20 56 64 62 65  xpr);.      Vdbe
13f40 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
13f50 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
13f60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13f70 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
13f80 79 2c 20 69 52 65 67 2c 20 74 61 72 67 65 74 2b  y, iReg, target+
13f90 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  i);.    }else{. 
13fa0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
13fb0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 49 74  Code(pParse, pIt
13fc0 65 6d 2d 3e 70 45 78 70 72 2c 20 74 61 72 67 65  em->pExpr, targe
13fd0 74 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  t+i);.    }.    
13fe0 69 66 28 20 64 6f 48 61 72 64 43 6f 70 79 20 29  if( doHardCopy )
13ff0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
14000 78 70 72 48 61 72 64 43 6f 70 79 28 70 50 61 72  xprHardCopy(pPar
14010 73 65 2c 20 74 61 72 67 65 74 2c 20 6e 29 3b 0a  se, target, n);.
14020 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
14030 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn n;.}../*.** G
14040 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
14050 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65   a boolean expre
14060 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20  ssion such that 
14070 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a  a jump is made.*
14080 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22  * to the label "
14090 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70  dest" if the exp
140a0 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20  ression is true 
140b0 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  but execution.**
140c0 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69   continues strai
140d0 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20  ght thru if the 
140e0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61  expression is fa
140f0 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  lse..**.** If th
14100 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61  e expression eva
14110 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28  luates to NULL (
14120 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72  neither true nor
14130 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a   false), then.**
14140 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   take the jump i
14150 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c  f the jumpIfNull
14160 20 66 6c 61 67 20 69 73 20 53 51 4c 49 54 45 5f   flag is SQLITE_
14170 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  JUMPIFNULL..**.*
14180 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70 65  * This code depe
14190 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20  nds on the fact 
141a0 74 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b  that certain tok
141b0 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54  en values (ex: T
141c0 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65  K_EQ).** are the
141d0 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20   same as opcode 
141e0 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45  values (ex: OP_E
141f0 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  q) that implemen
14200 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  t the correspond
14210 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  ing.** operation
14220 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65  .  Special comme
14230 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e  nts in vdbe.c an
14240 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  d the mkopcodeh.
14250 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a  awk script in.**
14260 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73   the make proces
14270 73 20 63 61 75 73 65 20 74 68 65 73 65 20 76 61  s cause these va
14280 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20  lues to align.  
14290 41 73 73 65 72 74 28 29 73 20 69 6e 20 74 68 65  Assert()s in the
142a0 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76   code.** below v
142b0 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e  erify that the n
142c0 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e  umbers are align
142d0 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f  ed correctly..*/
142e0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
142f0 72 49 66 54 72 75 65 28 50 61 72 73 65 20 2a 70  rIfTrue(Parse *p
14300 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
14310 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e  pr, int dest, in
14320 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
14330 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
14340 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
14350 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  op = 0;.  int re
14360 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e  gFree1 = 0;.  in
14370 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a  t regFree2 = 0;.
14380 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20    int r1, r2;.. 
14390 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e   assert( jumpIfN
143a0 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50  ull==SQLITE_JUMP
143b0 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66  IFNULL || jumpIf
143c0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Null==0 );.  if(
143d0 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d   v==0 || pExpr==
143e0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6f 70  0 ) return;.  op
143f0 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20   = pExpr->op;.  
14400 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
14410 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b    case TK_AND: {
14420 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20  .      int d2 = 
14430 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
14440 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74  abel(v);.      t
14450 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
14460 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
14470 74 65 73 74 63 61 73 65 28 20 70 50 61 72 73 65  testcase( pParse
14480 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68  ->disableColCach
14490 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  e==0 );.      sq
144a0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
144b0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
144c0 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66  pLeft, d2,jumpIf
144d0 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50  Null^SQLITE_JUMP
144e0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70  IFNULL);.      p
144f0 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f  Parse->disableCo
14500 6c 43 61 63 68 65 2b 2b 3b 0a 20 20 20 20 20 20  lCache++;.      
14510 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
14520 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
14530 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
14540 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
14550 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
14560 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68  ->disableColCach
14570 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61  e>0 );.      pPa
14580 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43  rse->disableColC
14590 61 63 68 65 2d 2d 3b 0a 20 20 20 20 20 20 73 71  ache--;.      sq
145a0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
145b0 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20  Label(v, d2);.  
145c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
145d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
145e0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
145f0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
14600 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14610 73 65 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61  se( pParse->disa
14620 62 6c 65 43 6f 6c 43 61 63 68 65 3d 3d 30 20 29  bleColCache==0 )
14630 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
14640 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
14650 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
14660 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
14670 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
14680 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
14690 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
146a0 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
146b0 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
146c0 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
146d0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ull);.      asse
146e0 72 74 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61  rt( pParse->disa
146f0 62 6c 65 43 6f 6c 43 61 63 68 65 3e 30 20 29 3b  bleColCache>0 );
14700 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  .      pParse->d
14710 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d  isableColCache--
14720 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
14730 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
14740 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  _NOT: {.      te
14750 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
14760 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
14770 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
14780 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
14790 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
147a0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
147b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
147c0 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
147d0 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
147e0 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
147f0 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
14800 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
14810 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
14820 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
14830 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20  _LT==OP_Lt );.  
14840 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
14850 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20  E==OP_Le );.    
14860 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d    assert( TK_GT=
14870 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20  =OP_Gt );.      
14880 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f  assert( TK_GE==O
14890 50 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Ge );.      as
148a0 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f  sert( TK_EQ==OP_
148b0 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Eq );.      asse
148c0 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65  rt( TK_NE==OP_Ne
148d0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
148e0 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b  se( op==TK_LT );
148f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14900 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20   op==TK_LE );.  
14910 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
14920 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20  ==TK_GT );.     
14930 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
14940 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65  K_GE );.      te
14950 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45  stcase( op==TK_E
14960 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Q );.      testc
14970 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29  ase( op==TK_NE )
14980 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14990 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
149a0 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
149b0 70 61 72 65 4f 70 65 72 61 6e 64 73 28 70 50 61  pareOperands(pPa
149c0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
149d0 74 2c 20 26 72 31 2c 20 26 72 65 67 46 72 65 65  t, &r1, &regFree
149e0 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
149f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a00 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67       pExpr->pRig
14a10 68 74 2c 20 26 72 32 2c 20 26 72 65 67 46 72 65  ht, &r2, &regFre
14a20 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  e2);.      codeC
14a30 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
14a40 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
14a50 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
14a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a70 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20    r1, r2, dest, 
14a80 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
14a90 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
14aa0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
14ab0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
14ac0 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
14ad0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
14ae0 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
14af0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
14b00 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61  TNULL: {.      a
14b10 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c  ssert( TK_ISNULL
14b20 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20  ==OP_IsNull );. 
14b30 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
14b40 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e  NOTNULL==OP_NotN
14b50 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ull );.      tes
14b60 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
14b70 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65  NULL );.      te
14b80 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
14b90 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  OTNULL );.      
14ba0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
14bb0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
14bc0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
14bd0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
14be0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14bf0 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65  p2(v, op, r1, de
14c00 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  st);.      testc
14c10 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
14c20 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
14c30 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
14c40 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20  TK_BETWEEN: {.  
14c50 20 20 20 20 2f 2a 20 20 20 20 78 20 42 45 54 57      /*    x BETW
14c60 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20  EEN y AND z.    
14c70 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 73    **.      ** Is
14c80 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a   equivalent to .
14c90 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
14ca0 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c  *    x>=y AND x<
14cb0 3d 7a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  =z.      **.    
14cc0 20 20 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20    ** Code it as 
14cd0 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72  such, taking car
14ce0 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d  e to do the comm
14cf0 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  on subexpression
14d00 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e  .      ** elemen
14d10 74 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 20 20 20  tation of x..   
14d20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72     */.      Expr
14d30 20 65 78 70 72 41 6e 64 3b 0a 20 20 20 20 20 20   exprAnd;.      
14d40 45 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b 0a 20  Expr compLeft;. 
14d50 20 20 20 20 20 45 78 70 72 20 63 6f 6d 70 52 69       Expr compRi
14d60 67 68 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  ght;.      Expr 
14d70 65 78 70 72 58 3b 0a 0a 20 20 20 20 20 20 65 78  exprX;..      ex
14d80 70 72 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70 4c  prX = *pExpr->pL
14d90 65 66 74 3b 0a 20 20 20 20 20 20 65 78 70 72 41  eft;.      exprA
14da0 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a  nd.op = TK_AND;.
14db0 20 20 20 20 20 20 65 78 70 72 41 6e 64 2e 70 4c        exprAnd.pL
14dc0 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b  eft = &compLeft;
14dd0 0a 20 20 20 20 20 20 65 78 70 72 41 6e 64 2e 70  .      exprAnd.p
14de0 52 69 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67  Right = &compRig
14df0 68 74 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65  ht;.      compLe
14e00 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20  ft.op = TK_GE;. 
14e10 20 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c       compLeft.pL
14e20 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20  eft = &exprX;.  
14e30 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69      compLeft.pRi
14e40 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ght = pExpr->pLi
14e50 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
14e60 20 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e        compRight.
14e70 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 20 20  op = TK_LE;.    
14e80 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66    compRight.pLef
14e90 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 20 20  t = &exprX;.    
14ea0 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69 67    compRight.pRig
14eb0 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  ht = pExpr->pLis
14ec0 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
14ed0 20 20 20 20 20 65 78 70 72 58 2e 69 54 61 62 6c       exprX.iTabl
14ee0 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  e = sqlite3ExprC
14ef0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
14f00 26 65 78 70 72 58 2c 20 26 72 65 67 46 72 65 65  &exprX, &regFree
14f10 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1);.      testca
14f20 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
14f30 29 3b 0a 20 20 20 20 20 20 65 78 70 72 58 2e 6f  );.      exprX.o
14f40 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b  p = TK_REGISTER;
14f50 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14f60 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
14f70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
14f80 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
14f90 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74  , &exprAnd, dest
14fa0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
14fb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14fc0 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
14fd0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
14fe0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
14ff0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26  pParse, pExpr, &
15000 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
15010 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15020 70 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c  p3(v, OP_If, r1,
15030 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
15040 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 74 65 73  l!=0);.      tes
15050 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
15060 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
15070 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
15080 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
15090 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
150a0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
150b0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
150c0 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74  gFree1);.  sqlit
150d0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
150e0 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
150f0 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  2);  .}../*.** G
15100 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
15110 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65   a boolean expre
15120 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20  ssion such that 
15130 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a  a jump is made.*
15140 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22  * to the label "
15150 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70  dest" if the exp
15160 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65  ression is false
15170 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a   but execution.*
15180 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61  * continues stra
15190 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65  ight thru if the
151a0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
151b0 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  rue..**.** If th
151c0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61  e expression eva
151d0 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28  luates to NULL (
151e0 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72  neither true nor
151f0 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20   false) then.** 
15200 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75  jump if jumpIfNu
15210 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d  ll is SQLITE_JUM
15220 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20  PIFNULL or fall 
15230 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49  through if jumpI
15240 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a  fNull.** is 0..*
15250 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
15260 70 72 49 66 46 61 6c 73 65 28 50 61 72 73 65 20  prIfFalse(Parse 
15270 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
15280 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20  Expr, int dest, 
15290 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b  int jumpIfNull){
152a0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
152b0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
152c0 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  t op = 0;.  int 
152d0 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20  regFree1 = 0;.  
152e0 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30  int regFree2 = 0
152f0 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a  ;.  int r1, r2;.
15300 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49  .  assert( jumpI
15310 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55  fNull==SQLITE_JU
15320 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70  MPIFNULL || jump
15330 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69  IfNull==0 );.  i
15340 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72  f( v==0 || pExpr
15350 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
15360 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66   /* The value of
15370 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f   pExpr->op and o
15380 70 20 61 72 65 20 72 65 6c 61 74 65 64 20 61 73  p are related as
15390 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20   follows:.  **. 
153a0 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d   **       pExpr-
153b0 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 6f  >op            o
153c0 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d  p.  **       ---
153d0 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20  ------          
153e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20  ----------.  ** 
153f0 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20        TK_ISNULL 
15400 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e           OP_NotN
15410 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  ull.  **       T
15420 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20  K_NOTNULL       
15430 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a    OP_IsNull.  **
15440 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20         TK_NE    
15450 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a            OP_Eq.
15460 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51    **       TK_EQ
15470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
15480 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Ne.  **       T
15490 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20 20 20  K_GT            
154a0 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20    OP_Le.  **    
154b0 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20     TK_LE        
154c0 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a        OP_Gt.  **
154d0 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20         TK_GE    
154e0 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a            OP_Lt.
154f0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54    **       TK_LT
15500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
15510 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f  _Ge.  **.  ** Fo
15520 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f  r other values o
15530 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20  f pExpr->op, op 
15540 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64  is undefined and
15550 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68   unused..  ** Th
15560 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61  e value of TK_ a
15570 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73  nd OP_ constants
15580 20 61 72 65 20 61 72 72 61 6e 67 65 64 20 73 75   are arranged su
15590 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20  ch that we.  ** 
155a0 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20  can compute the 
155b0 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73  mapping above us
155c0 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
155d0 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20  g expression..  
155e0 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76 65 72  ** Assert()s ver
155f0 69 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d  ify that the com
15600 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72  putation is corr
15610 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d  ect..  */.  op =
15620 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b   ((pExpr->op+(TK
15630 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28  _ISNULL&1))^1)-(
15640 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20  TK_ISNULL&1);.. 
15650 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65   /* Verify corre
15660 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  ct alignment of 
15670 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73  TK_ and OP_ cons
15680 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73  tants.  */.  ass
15690 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
156a0 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d  TK_ISNULL || op=
156b0 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20  =OP_NotNull );. 
156c0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
156d0 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c  op!=TK_NOTNULL |
156e0 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  | op==OP_IsNull 
156f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
15700 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c  pr->op!=TK_NE ||
15710 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20   op==OP_Eq );.  
15720 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
15730 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d  p!=TK_EQ || op==
15740 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Ne );.  asser
15750 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
15760 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65  _LT || op==OP_Ge
15770 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
15780 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c  xpr->op!=TK_LE |
15790 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20  | op==OP_Gt );. 
157a0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
157b0 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d  op!=TK_GT || op=
157c0 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Le );.  asse
157d0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
157e0 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  K_GE || op==OP_L
157f0 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  t );..  switch( 
15800 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
15810 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a   case TK_AND: {.
15820 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15830 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
15840 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
15850 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65   pParse->disable
15860 43 6f 6c 43 61 63 68 65 3d 3d 30 20 29 3b 0a 20  ColCache==0 );. 
15870 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
15880 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
15890 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
158a0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
158b0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  .      pParse->d
158c0 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b  isableColCache++
158d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
158e0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
158f0 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
15900 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
15910 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ll);.      asser
15920 74 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62  t( pParse->disab
15930 6c 65 43 6f 6c 43 61 63 68 65 3e 30 20 29 3b 0a  leColCache>0 );.
15940 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69        pParse->di
15950 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b  sableColCache--;
15960 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
15970 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
15980 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  OR: {.      int 
15990 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
159a0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
159b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
159c0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
159d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
159e0 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f  Parse->disableCo
159f0 6c 43 61 63 68 65 3d 3d 30 20 29 3b 0a 20 20 20  lCache==0 );.   
15a00 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
15a10 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
15a20 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 6a  pr->pLeft, d2, j
15a30 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45  umpIfNull^SQLITE
15a40 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
15a50 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61      pParse->disa
15a60 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20  bleColCache++;. 
15a70 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
15a80 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
15a90 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
15aa0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
15ab0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
15ac0 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43  pParse->disableC
15ad0 6f 6c 43 61 63 68 65 3e 30 20 29 3b 0a 20 20 20  olCache>0 );.   
15ae0 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62     pParse->disab
15af0 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20  leColCache--;.  
15b00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
15b10 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
15b20 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  2);.      break;
15b30 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
15b40 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
15b50 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
15b60 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
15b70 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
15b80 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
15b90 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
15ba0 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
15bb0 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
15bc0 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
15bd0 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
15be0 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
15bf0 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
15c00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15c10 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20  op==TK_LT );.   
15c20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
15c30 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20  =TK_LE );.      
15c40 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
15c50 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _GT );.      tes
15c60 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 45  tcase( op==TK_GE
15c70 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
15c80 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b  se( op==TK_EQ );
15c90 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
15ca0 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20   op==TK_NE );.  
15cb0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
15cc0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
15cd0 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
15ce0 4f 70 65 72 61 6e 64 73 28 70 50 61 72 73 65 2c  Operands(pParse,
15cf0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
15d00 72 31 2c 20 26 72 65 67 46 72 65 65 31 2c 0a 20  r1, &regFree1,. 
15d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d30 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
15d40 26 72 32 2c 20 26 72 65 67 46 72 65 65 32 29 3b  &r2, &regFree2);
15d50 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
15d60 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
15d70 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
15d80 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
15d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
15da0 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r2, dest, jump
15db0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 74  IfNull);.      t
15dc0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
15dd0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
15de0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
15df0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
15e00 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
15e10 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20  se TK_ISNULL:.  
15e20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
15e30 4c 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  L: {.      testc
15e40 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ase( op==TK_ISNU
15e50 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LL );.      test
15e60 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
15e70 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72 31  NULL );.      r1
15e80 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
15e90 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
15ea0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
15eb0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73  gFree1);.      s
15ec0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15ed0 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74  (v, op, r1, dest
15ee0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
15ef0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
15f00 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
15f10 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
15f20 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
15f30 20 20 2f 2a 20 20 20 20 78 20 42 45 54 57 45 45    /*    x BETWEE
15f40 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 20 20  N y AND z.      
15f50 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 73 20 65  **.      ** Is e
15f60 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20  quivalent to .  
15f70 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
15f80 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a     x>=y AND x<=z
15f90 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
15fa0 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73 75  ** Code it as su
15fb0 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65 20  ch, taking care 
15fc0 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e  to do the common
15fd0 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 20   subexpression. 
15fe0 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 61       ** elementa
15ff0 74 69 6f 6e 20 6f 66 20 78 2e 0a 20 20 20 20 20  tion of x..     
16000 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 65   */.      Expr e
16010 78 70 72 41 6e 64 3b 0a 20 20 20 20 20 20 45 78  xprAnd;.      Ex
16020 70 72 20 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 20  pr compLeft;.   
16030 20 20 20 45 78 70 72 20 63 6f 6d 70 52 69 67 68     Expr compRigh
16040 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 65 78  t;.      Expr ex
16050 70 72 58 3b 0a 0a 20 20 20 20 20 20 65 78 70 72  prX;..      expr
16060 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66  X = *pExpr->pLef
16070 74 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e 64  t;.      exprAnd
16080 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20  .op = TK_AND;.  
16090 20 20 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66      exprAnd.pLef
160a0 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20  t = &compLeft;. 
160b0 20 20 20 20 20 65 78 70 72 41 6e 64 2e 70 52 69       exprAnd.pRi
160c0 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68 74  ght = &compRight
160d0 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65 66 74  ;.      compLeft
160e0 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 20  .op = TK_GE;.   
160f0 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66     compLeft.pLef
16100 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 20 20  t = &exprX;.    
16110 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68    compLeft.pRigh
16120 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
16130 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
16140 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70      compRight.op
16150 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 20 20 20 20   = TK_LE;.      
16160 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20  compRight.pLeft 
16170 3d 20 26 65 78 70 72 58 3b 0a 20 20 20 20 20 20  = &exprX;.      
16180 63 6f 6d 70 52 69 67 68 74 2e 70 52 69 67 68 74  compRight.pRight
16190 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
161a0 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[1].pExpr;.   
161b0 20 20 20 65 78 70 72 58 2e 69 54 61 62 6c 65 20     exprX.iTable 
161c0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
161d0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26 65  eTemp(pParse, &e
161e0 78 70 72 58 2c 20 26 72 65 67 46 72 65 65 31 29  xprX, &regFree1)
161f0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
16200 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
16210 0a 20 20 20 20 20 20 65 78 70 72 58 2e 6f 70 20  .      exprX.op 
16220 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20  = TK_REGISTER;. 
16230 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
16240 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
16250 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
16260 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
16270 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c   &exprAnd, dest,
16280 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
16290 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
162a0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
162b0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
162c0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
162d0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72  Parse, pExpr, &r
162e0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
162f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16300 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72  3(v, OP_IfNot, r
16310 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  1, dest, jumpIfN
16320 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 74  ull!=0);.      t
16330 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
16340 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
16350 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
16360 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  ll==0 );.      b
16370 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
16380 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
16390 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
163a0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c  regFree1);.  sql
163b0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
163c0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
163d0 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ee2);.}../*.** D
163e0 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69  o a deep compari
163f0 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65  son of two expre
16400 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65  ssion trees.  Re
16410 74 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a  turn TRUE (non-z
16420 65 72 6f 29 0a 2a 2a 20 69 66 20 74 68 65 79 20  ero).** if they 
16430 61 72 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e  are identical an
16440 64 20 72 65 74 75 72 6e 20 46 41 4c 53 45 20 69  d return FALSE i
16450 66 20 74 68 65 79 20 64 69 66 66 65 72 20 69 6e  f they differ in
16460 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20   any way..**.** 
16470 53 6f 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72  Sometimes this r
16480 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
16490 72 6e 20 46 41 4c 53 45 20 65 76 65 6e 20 69 66  rn FALSE even if
164a0 20 74 68 65 20 74 77 6f 20 65 78 70 72 65 73 73   the two express
164b0 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61  ions.** really a
164c0 72 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20  re equivalent.  
164d0 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f  If we cannot pro
164e0 76 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72  ve that the expr
164f0 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69  essions are.** i
16500 64 65 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74  dentical, we ret
16510 75 72 6e 20 46 41 4c 53 45 20 6a 75 73 74 20 74  urn FALSE just t
16520 6f 20 62 65 20 73 61 66 65 2e 20 20 53 6f 20 69  o be safe.  So i
16530 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  f this routine.*
16540 2a 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 2c  * returns false,
16550 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74   then you do not
16560 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72   really know for
16570 20 63 65 72 74 61 69 6e 20 69 66 20 74 68 65 20   certain if the 
16580 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  two.** expressio
16590 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e  ns are the same.
165a0 20 20 42 75 74 20 69 66 20 79 6f 75 20 67 65 74    But if you get
165b0 20 61 20 54 52 55 45 20 72 65 74 75 72 6e 2c 20   a TRUE return, 
165c0 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20  then you.** can 
165d0 62 65 20 73 75 72 65 20 74 68 65 20 65 78 70 72  be sure the expr
165e0 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20  essions are the 
165f0 73 61 6d 65 2e 20 20 49 6e 20 74 68 65 20 70 6c  same.  In the pl
16600 61 63 65 73 20 77 68 65 72 65 0a 2a 2a 20 74 68  aces where.** th
16610 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
16620 65 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  ed, it does not 
16630 68 75 72 74 20 74 6f 20 67 65 74 20 61 6e 20 65  hurt to get an e
16640 78 74 72 61 20 46 41 4c 53 45 20 2d 20 74 68 61  xtra FALSE - tha
16650 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20  t.** just might 
16660 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73  result in some s
16670 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63  lightly slower c
16680 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e  ode.  But return
16690 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72  ing.** an incorr
166a0 65 63 74 20 54 52 55 45 20 63 6f 75 6c 64 20 6c  ect TRUE could l
166b0 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63  ead to a malfunc
166c0 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
166d0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
166e0 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a  Expr *pA, Expr *
166f0 70 42 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  pB){.  int i;.  
16700 69 66 28 20 70 41 3d 3d 30 7c 7c 70 42 3d 3d 30  if( pA==0||pB==0
16710 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
16720 42 3d 3d 70 41 3b 0a 20 20 7d 0a 20 20 69 66 28  B==pA;.  }.  if(
16730 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20   pA->op!=pB->op 
16740 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
16750 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45  ( (pA->flags & E
16760 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42  P_Distinct)!=(pB
16770 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
16780 74 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20  tinct) ) return 
16790 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  0;.  if( !sqlite
167a0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d  3ExprCompare(pA-
167b0 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66  >pLeft, pB->pLef
167c0 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  t) ) return 0;. 
167d0 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
167e0 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69  rCompare(pA->pRi
167f0 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 29  ght, pB->pRight)
16800 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
16810 66 28 20 70 41 2d 3e 70 4c 69 73 74 20 29 7b 0a  f( pA->pList ){.
16820 20 20 20 20 69 66 28 20 70 42 2d 3e 70 4c 69 73      if( pB->pLis
16830 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
16840 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 70 4c 69  .    if( pA->pLi
16850 73 74 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 70  st->nExpr!=pB->p
16860 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 20 72 65  List->nExpr ) re
16870 74 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72 28  turn 0;.    for(
16880 69 3d 30 3b 20 69 3c 70 41 2d 3e 70 4c 69 73 74  i=0; i<pA->pList
16890 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
168a0 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65       if( !sqlite
168b0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d  3ExprCompare(pA-
168c0 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  >pList->a[i].pEx
168d0 70 72 2c 20 70 42 2d 3e 70 4c 69 73 74 2d 3e 61  pr, pB->pList->a
168e0 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  [i].pExpr) ){.  
168f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
16900 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16910 7d 65 6c 73 65 20 69 66 28 20 70 42 2d 3e 70 4c  }else if( pB->pL
16920 69 73 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ist ){.    retur
16930 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 0;.  }.  if( p
16940 41 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 70 42  A->pSelect || pB
16950 2d 3e 70 53 65 6c 65 63 74 20 29 20 72 65 74 75  ->pSelect ) retu
16960 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e  rn 0;.  if( pA->
16970 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62  iTable!=pB->iTab
16980 6c 65 20 7c 7c 20 70 41 2d 3e 69 43 6f 6c 75 6d  le || pA->iColum
16990 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29  n!=pB->iColumn )
169a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
169b0 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55   pA->op!=TK_COLU
169c0 4d 4e 20 26 26 20 70 41 2d 3e 74 6f 6b 65 6e 2e  MN && pA->token.
169d0 7a 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 2d  z ){.    if( pB-
169e0 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 20 72 65  >token.z==0 ) re
169f0 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20  turn 0;.    if( 
16a00 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 70 41 2d  pB->token.n!=pA-
16a10 3e 74 6f 6b 65 6e 2e 6e 20 29 20 72 65 74 75 72  >token.n ) retur
16a20 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  n 0;.    if( sql
16a30 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68  ite3StrNICmp((ch
16a40 61 72 2a 29 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 2c  ar*)pA->token.z,
16a50 28 63 68 61 72 2a 29 70 42 2d 3e 74 6f 6b 65 6e  (char*)pB->token
16a60 2e 7a 2c 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 29 21  .z,pB->token.n)!
16a70 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
16a80 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
16a90 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 0a    return 1;.}...
16aa0 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
16ab0 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70  element to the p
16ac0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
16ad0 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74  array.  Return t
16ae0 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74  he index of.** t
16af0 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20  he new element. 
16b00 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69   Return a negati
16b10 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c  ve number if mal
16b20 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  loc fails..*/.st
16b30 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49  atic int addAggI
16b40 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65  nfoColumn(sqlite
16b50 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a  3 *db, AggInfo *
16b60 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b  pInfo){.  int i;
16b70 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d  .  pInfo->aCol =
16b80 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c   sqlite3ArrayAll
16b90 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64 62  ocate(.       db
16ba0 2c 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  ,.       pInfo->
16bb0 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a  aCol,.       siz
16bc0 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  eof(pInfo->aCol[
16bd0 30 5d 29 2c 0a 20 20 20 20 20 20 20 33 2c 0a 20  0]),.       3,. 
16be0 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43        &pInfo->nC
16bf0 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26 70  olumn,.       &p
16c00 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 41 6c 6c  Info->nColumnAll
16c10 6f 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20  oc,.       &i.  
16c20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  );.  return i;.}
16c30 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20      ../*.** Add 
16c40 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
16c50 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61   the pAggInfo->a
16c60 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20 52  Func[] array.  R
16c70 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
16c80 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c  of.** the new el
16c90 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61  ement.  Return a
16ca0 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
16cb0 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
16cc0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16cd0 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 73  addAggInfoFunc(s
16ce0 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49  qlite3 *db, AggI
16cf0 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69  nfo *pInfo){.  i
16d00 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61  nt i;.  pInfo->a
16d10 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 41 72  Func = sqlite3Ar
16d20 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20  rayAllocate(.   
16d30 20 20 20 20 64 62 2c 20 0a 20 20 20 20 20 20 20      db, .       
16d40 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20  pInfo->aFunc,.  
16d50 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66       sizeof(pInf
16d60 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20  o->aFunc[0]),.  
16d70 20 20 20 20 20 33 2c 0a 20 20 20 20 20 20 20 26       3,.       &
16d80 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20  pInfo->nFunc,.  
16d90 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75       &pInfo->nFu
16da0 6e 63 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 20  ncAlloc,.       
16db0 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  &i.  );.  return
16dc0 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a   i;.}    ../*.**
16dd0 20 54 68 69 73 20 69 73 20 74 68 65 20 78 45 78   This is the xEx
16de0 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  prCallback for a
16df0 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 20 20 49   tree walker.  I
16e00 74 20 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20  t is used to.** 
16e10 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65  implement sqlite
16e20 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
16e30 65 67 61 74 65 73 28 29 2e 20 20 53 65 65 20 73  egates().  See s
16e40 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
16e50 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66  eAggregates.** f
16e60 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
16e70 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  formation..*/.st
16e80 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65  atic int analyze
16e90 41 67 67 72 65 67 61 74 65 28 57 61 6c 6b 65 72  Aggregate(Walker
16ea0 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
16eb0 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69  *pExpr){.  int i
16ec0 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
16ed0 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  *pNC = pWalker->
16ee0 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a  u.pNC;.  Parse *
16ef0 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
16f00 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20  arse;.  SrcList 
16f10 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d  *pSrcList = pNC-
16f20 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67  >pSrcList;.  Agg
16f30 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d  Info *pAggInfo =
16f40 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a   pNC->pAggInfo;.
16f50 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
16f60 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
16f70 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a   TK_AGG_COLUMN:.
16f80 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
16f90 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  MN: {.      test
16fa0 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
16fb0 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
16fc0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
16fd0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
16fe0 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
16ff0 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
17000 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  if the column is
17010 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74   in one of the t
17020 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
17030 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73  M.      ** claus
17040 65 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61  e of the aggrega
17050 74 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  te query */.    
17060 20 20 69 66 28 20 70 53 72 63 4c 69 73 74 20 29    if( pSrcList )
17070 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
17080 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
17090 49 74 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d  Item = pSrcList-
170a0 3e 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  >a;.        for(
170b0 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d  i=0; i<pSrcList-
170c0 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
170d0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
170e0 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
170f0 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20  ol *pCol;.      
17100 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
17110 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43  Table==pItem->iC
17120 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  ursor ){.       
17130 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65       /* If we re
17140 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
17150 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 70 45  it means that pE
17160 78 70 72 20 72 65 66 65 72 73 20 74 6f 20 61 20  xpr refers to a 
17170 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20  table.          
17180 20 20 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 20    ** that is in 
17190 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
171a0 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  of the aggregate
171b0 20 71 75 65 72 79 2e 20 20 0a 20 20 20 20 20 20   query.  .      
171c0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
171d0 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20       ** Make an 
171e0 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 63 6f  entry for the co
171f0 6c 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f  lumn in pAggInfo
17200 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72  ->aCol[] if ther
17210 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
17220 20 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79   is not an entry
17230 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a   there already..
17240 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
17250 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b             int k
17260 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ;.            pC
17270 6f 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61  ol = pAggInfo->a
17280 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Col;.           
17290 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67   for(k=0; k<pAgg
172a0 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b  Info->nColumn; k
172b0 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
172c0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
172d0 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78  Col->iTable==pEx
172e0 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20  pr->iTable &&.  
172f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17300 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70  pCol->iColumn==p
17310 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b  Expr->iColumn ){
17320 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17330 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
17340 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17350 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
17360 20 20 69 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e    if( (k>=pAggIn
17370 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20  fo->nColumn).   
17380 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6b 20            && (k 
17390 3d 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75  = addAggInfoColu
173a0 6d 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  mn(pParse->db, p
173b0 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20  AggInfo))>=0 .  
173c0 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
173d0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20             pCol 
173e0 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  = &pAggInfo->aCo
173f0 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  l[k];.          
17400 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d      pCol->pTab =
17410 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20   pExpr->pTab;.  
17420 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
17430 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72  ->iTable = pExpr
17440 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
17450 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43          pCol->iC
17460 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69  olumn = pExpr->i
17470 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
17480 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d        pCol->iMem
17490 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
174a0 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m;.             
174b0 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
174c0 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
174d0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70           pCol->p
174e0 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
174f0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
17500 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70  pAggInfo->pGroup
17510 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  By ){.          
17520 20 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a        int j, n;.
17530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17540 45 78 70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20  ExprList *pGB = 
17550 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70  pAggInfo->pGroup
17560 42 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  By;.            
17570 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
17580 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20  ist_item *pTerm 
17590 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20  = pGB->a;.      
175a0 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70 47            n = pG
175b0 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  B->nExpr;.      
175c0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
175d0 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65  0; j<n; j++, pTe
175e0 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  rm++){.         
175f0 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
17600 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  E = pTerm->pExpr
17610 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
17620 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
17630 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d  TK_COLUMN && pE-
17640 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e  >iTable==pExpr->
17650 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20  iTable &&.      
17660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17670 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78  pE->iColumn==pEx
17680 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pr->iColumn ){. 
17690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176a0 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
176b0 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20  Column = j;.    
176c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176d0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
176e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
176f0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
17700 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
17710 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
17720 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
17730 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  mn<0 ){.        
17740 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53          pCol->iS
17750 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41  orterColumn = pA
17760 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67  ggInfo->nSorting
17770 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20  Column++;.      
17780 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17790 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
177a0 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20      /* There is 
177b0 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20 66 6f 72  now an entry for
177c0 20 70 45 78 70 72 20 69 6e 20 70 41 67 67 49 6e   pExpr in pAggIn
177d0 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68  fo->aCol[] (eith
177e0 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  er.            *
177f0 2a 20 62 65 63 61 75 73 65 20 69 74 20 77 61 73  * because it was
17800 20 74 68 65 72 65 20 62 65 66 6f 72 65 20 6f 72   there before or
17810 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74   because we just
17820 20 63 72 65 61 74 65 64 20 69 74 29 2e 0a 20 20   created it)..  
17830 20 20 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e            ** Con
17840 76 65 72 74 20 74 68 65 20 70 45 78 70 72 20 74  vert the pExpr t
17850 6f 20 62 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f  o be a TK_AGG_CO
17860 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e 67 20 74  LUMN referring t
17870 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20  o that.         
17880 20 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e     ** pAggInfo->
17890 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20  aCol[] entry..  
178a0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
178b0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
178c0 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49  pAggInfo = pAggI
178d0 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nfo;.           
178e0 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
178f0 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20  AGG_COLUMN;.    
17900 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
17910 41 67 67 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20  Agg = k;.       
17920 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17930 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66        } /* endif
17940 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
17950 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a  pItem->iCursor *
17960 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65  /.        } /* e
17970 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72  nd loop over pSr
17980 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d  cList */.      }
17990 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
179a0 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20  C_Prune;.    }. 
179b0 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
179c0 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
179d0 20 2f 2a 20 54 68 65 20 70 4e 43 2d 3e 6e 44 65   /* The pNC->nDe
179e0 70 74 68 3d 3d 30 20 74 65 73 74 20 63 61 75 73  pth==0 test caus
179f0 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  es aggregate fun
17a00 63 74 69 6f 6e 73 20 69 6e 20 73 75 62 71 75 65  ctions in subque
17a10 72 69 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f  ries.      ** to
17a20 20 62 65 20 69 67 6e 6f 72 65 64 20 2a 2f 0a 20   be ignored */. 
17a30 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 6e 44       if( pNC->nD
17a40 65 70 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20  epth==0 ){.     
17a50 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
17a60 65 65 20 69 66 20 70 45 78 70 72 20 69 73 20 61  ee if pExpr is a
17a70 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e   duplicate of an
17a80 6f 74 68 65 72 20 61 67 67 72 65 67 61 74 65 20  other aggregate 
17a90 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  .        ** func
17aa0 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6c 72  tion that is alr
17ab0 65 61 64 79 20 69 6e 20 74 68 65 20 70 41 67 67  eady in the pAgg
17ac0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20  Info structure. 
17ad0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
17ae0 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
17af0 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70  _func *pItem = p
17b00 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a  AggInfo->aFunc;.
17b10 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
17b20 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
17b30 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  nc; i++, pItem++
17b40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
17b50 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
17b60 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72  are(pItem->pExpr
17b70 2c 20 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  , pExpr) ){.    
17b80 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
17b90 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
17ba0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
17bb0 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46   i>=pAggInfo->nF
17bc0 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unc ){.         
17bd0 20 2f 2a 20 70 45 78 70 72 20 69 73 20 6f 72 69   /* pExpr is ori
17be0 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e  ginal.  Make a n
17bf0 65 77 20 65 6e 74 72 79 20 69 6e 20 70 41 67 67  ew entry in pAgg
17c00 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20  Info->aFunc[].  
17c10 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
17c20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e       u8 enc = EN
17c30 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20  C(pParse->db);. 
17c40 20 20 20 20 20 20 20 20 20 69 20 3d 20 61 64 64           i = add
17c50 41 67 67 49 6e 66 6f 46 75 6e 63 28 70 50 61 72  AggInfoFunc(pPar
17c60 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f  se->db, pAggInfo
17c70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
17c80 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   i>=0 ){.       
17c90 20 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 41       pItem = &pA
17ca0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d  ggInfo->aFunc[i]
17cb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
17cc0 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  tem->pExpr = pEx
17cd0 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
17ce0 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b  pItem->iMem = ++
17cf0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
17d00 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
17d10 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33  >pFunc = sqlite3
17d20 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61  FindFunction(pPa
17d30 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  rse->db,.       
17d40 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
17d50 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  r*)pExpr->token.
17d60 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  z, pExpr->token.
17d70 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
17d80 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 69        pExpr->pLi
17d90 73 74 20 3f 20 70 45 78 70 72 2d 3e 70 4c 69 73  st ? pExpr->pLis
17da0 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e  t->nExpr : 0, en
17db0 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  c, 0);.         
17dc0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c     if( pExpr->fl
17dd0 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63  ags & EP_Distinc
17de0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
17df0 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69     pItem->iDisti
17e00 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
17e10 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ab++;.          
17e20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17e30 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44         pItem->iD
17e40 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20  istinct = -1;.  
17e50 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
17e60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17e70 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b  }.        /* Mak
17e80 65 20 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f  e pExpr point to
17e90 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
17ea0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
17eb0 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20  [] entry.       
17ec0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 45 78 70   */.        pExp
17ed0 72 2d 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20  r->iAgg = i;.   
17ee0 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67       pExpr->pAgg
17ef0 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b  Info = pAggInfo;
17f00 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
17f10 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20  WRC_Prune;.     
17f20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
17f30 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
17f40 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  ue;.}.static int
17f50 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
17f60 65 73 49 6e 53 65 6c 65 63 74 28 57 61 6c 6b 65  esInSelect(Walke
17f70 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
17f80 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
17f90 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
17fa0 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e   = pWalker->u.pN
17fb0 43 3b 0a 20 20 69 66 28 20 70 4e 43 2d 3e 6e 44  C;.  if( pNC->nD
17fc0 65 70 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 70  epth==0 ){.    p
17fd0 4e 43 2d 3e 6e 44 65 70 74 68 2b 2b 3b 0a 20 20  NC->nDepth++;.  
17fe0 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
17ff0 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65  ect(pWalker, pSe
18000 6c 65 63 74 29 3b 0a 20 20 20 20 70 4e 43 2d 3e  lect);.    pNC->
18010 6e 44 65 70 74 68 2d 2d 3b 0a 20 20 20 20 72 65  nDepth--;.    re
18020 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
18030 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
18040 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
18050 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
18060 6e 61 6c 79 7a 65 20 74 68 65 20 67 69 76 65 6e  nalyze the given
18070 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b   expression look
18080 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74  ing for aggregat
18090 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a  e functions and.
180a0 2a 2a 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73  ** for variables
180b0 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
180c0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 50   added to the pP
180d0 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72  arse->aAgg[] arr
180e0 61 79 2e 0a 2a 2a 20 4d 61 6b 65 20 61 64 64 69  ay..** Make addi
180f0 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 74  tional entries t
18100 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41  o the pParse->aA
18110 67 67 5b 5d 20 61 72 72 61 79 20 61 73 20 6e 65  gg[] array as ne
18120 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  cessary..**.** T
18130 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
18140 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
18150 64 20 61 66 74 65 72 20 74 68 65 20 65 78 70 72  d after the expr
18160 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a  ession has been.
18170 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73  ** analyzed by s
18180 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
18190 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69  rNames()..*/.voi
181a0 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  d sqlite3ExprAna
181b0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 4e  lyzeAggregates(N
181c0 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
181d0 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
181e0 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78   Walker w;.  w.x
181f0 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61  ExprCallback = a
18200 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 3b  nalyzeAggregate;
18210 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
18220 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67  back = analyzeAg
18230 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74  gregatesInSelect
18240 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e  ;.  w.u.pNC = pN
18250 43 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  C;.  sqlite3Walk
18260 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b  Expr(&w, pExpr);
18270 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73  .}../*.** Call s
18280 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
18290 65 41 67 67 72 65 67 61 74 65 73 28 29 20 66 6f  eAggregates() fo
182a0 72 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69  r every expressi
182b0 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72  on in an.** expr
182c0 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65  ession list.  Re
182d0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
182e0 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  of errors..**.**
182f0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   If an error is 
18300 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79  found, the analy
18310 73 69 73 20 69 73 20 63 75 74 20 73 68 6f 72 74  sis is cut short
18320 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
18330 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
18340 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ist(NameContext 
18350 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73 74 20 2a  *pNC, ExprList *
18360 70 4c 69 73 74 29 7b 0a 20 20 73 74 72 75 63 74  pList){.  struct
18370 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
18380 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  pItem;.  int i;.
18390 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
183a0 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69     for(pItem=pLi
183b0 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c  st->a, i=0; i<pL
183c0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  ist->nExpr; i++,
183d0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
183e0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
183f0 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 4e  yzeAggregates(pN
18400 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  C, pItem->pExpr)
18410 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
18420 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72  *.** Allocate or
18430 20 64 65 61 6c 6c 6f 63 61 74 65 20 74 65 6d 70   deallocate temp
18440 6f 72 61 72 79 20 75 73 65 20 72 65 67 69 73 74  orary use regist
18450 65 72 73 20 64 75 72 69 6e 67 20 63 6f 64 65 20  ers during code 
18460 67 65 6e 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 69  generation..*/.i
18470 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d  nt sqlite3GetTem
18480 70 52 65 67 28 50 61 72 73 65 20 2a 70 50 61 72  pReg(Parse *pPar
18490 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  se){.  if( pPars
184a0 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29  e->nTempReg==0 )
184b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 2b 70  {.    return ++p
184c0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d  Parse->nMem;.  }
184d0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65  .  return pParse
184e0 2d 3e 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61  ->aTempReg[--pPa
184f0 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a  rse->nTempReg];.
18500 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  }.void sqlite3Re
18510 6c 65 61 73 65 54 65 6d 70 52 65 67 28 50 61 72  leaseTempReg(Par
18520 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
18530 69 52 65 67 29 7b 0a 20 20 69 66 28 20 69 52 65  iReg){.  if( iRe
18540 67 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 65  g && pParse->nTe
18550 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28  mpReg<ArraySize(
18560 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
18570 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
18580 45 78 70 72 57 72 69 74 61 62 6c 65 52 65 67 69  ExprWritableRegi
18590 73 74 65 72 28 70 50 61 72 73 65 2c 20 69 52 65  ster(pParse, iRe
185a0 67 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 70 50  g, iReg);.    pP
185b0 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70  arse->aTempReg[p
185c0 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b  Parse->nTempReg+
185d0 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d  +] = iReg;.  }.}
185e0 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
185f0 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 20 61   or deallocate a
18600 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63   block of nReg c
18610 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69 73  onsecutive regis
18620 74 65 72 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ters.*/.int sqli
18630 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
18640 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
18650 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt nReg){.  int 
18660 69 2c 20 6e 3b 0a 20 20 69 20 3d 20 70 50 61 72  i, n;.  i = pPar
18670 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20  se->iRangeReg;. 
18680 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61   n = pParse->nRa
18690 6e 67 65 52 65 67 3b 0a 20 20 69 66 28 20 6e 52  ngeReg;.  if( nR
186a0 65 67 3c 3d 6e 20 26 26 20 21 75 73 65 64 41 73  eg<=n && !usedAs
186b0 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72  ColumnCache(pPar
186c0 73 65 2c 20 69 2c 20 69 2b 6e 2d 31 29 20 29 7b  se, i, i+n-1) ){
186d0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61  .    pParse->iRa
186e0 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a  ngeReg += nReg;.
186f0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e      pParse->nRan
18700 67 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20  geReg -= nReg;. 
18710 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20   }else{.    i = 
18720 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
18730 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
18740 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20   += nReg;.  }.  
18750 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64  return i;.}.void
18760 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
18770 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a  empRange(Parse *
18780 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
18790 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69  , int nReg){.  i
187a0 66 28 20 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e  f( nReg>pParse->
187b0 6e 52 61 6e 67 65 52 65 67 20 29 7b 0a 20 20 20  nRangeReg ){.   
187c0 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
187d0 65 67 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70  eg = nReg;.    p
187e0 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
187f0 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a      = iReg;.  }.}.