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

Artifact d48ae32513ba5d34f6a409d0a42731b4987cad25:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2a 0a 2a 2a  in SQLite..**.**
0200: 20 24 49 64 3a 20 65 78 70 72 2e 63 2c 76 20 31   $Id: expr.c,v 1
0210: 2e 34 30 31 20 32 30 30 38 2f 31 31 2f 30 36 20  .401 2008/11/06 
0220: 31 35 3a 33 33 3a 30 34 20 64 72 68 20 45 78 70  15:33:04 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 43 6c 65    }.}../*.** Cle
4890: 61 72 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  ar an expression
48a0: 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68 6f   structure witho
48b0: 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  ut deleting the 
48c0: 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66  structure itself
48d0: 2e 0a 2a 2a 20 53 75 62 73 74 72 75 63 74 75 72  ..** Substructur
48e0: 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2f  e is deleted..*/
48f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
4900: 72 43 6c 65 61 72 28 73 71 6c 69 74 65 33 20 2a  rClear(sqlite3 *
4910: 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  db, Expr *p){.  
4920: 69 66 28 20 70 2d 3e 73 70 61 6e 2e 64 79 6e 20  if( p->span.dyn 
4930: 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
4940: 64 62 2c 20 28 63 68 61 72 2a 29 70 2d 3e 73 70  db, (char*)p->sp
4950: 61 6e 2e 7a 29 3b 0a 20 20 69 66 28 20 70 2d 3e  an.z);.  if( p->
4960: 74 6f 6b 65 6e 2e 64 79 6e 20 29 20 73 71 6c 69  token.dyn ) sqli
4970: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 28 63  te3DbFree(db, (c
4980: 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 29  har*)p->token.z)
4990: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
49a0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 65  elete(db, p->pLe
49b0: 66 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ft);.  sqlite3Ex
49c0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
49d0: 70 52 69 67 68 74 29 3b 0a 20 20 73 71 6c 69 74  pRight);.  sqlit
49e0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
49f0: 28 64 62 2c 20 70 2d 3e 70 4c 69 73 74 29 3b 0a  (db, p->pList);.
4a00: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
4a10: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 53 65  elete(db, p->pSe
4a20: 6c 65 63 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  lect);.}../*.** 
4a30: 52 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65  Recursively dele
4a40: 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  te an expression
4a50: 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   tree..*/.void s
4a60: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
4a70: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
4a80: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d  pr *p){.  if( p=
4a90: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  =0 ) return;.  s
4aa0: 71 6c 69 74 65 33 45 78 70 72 43 6c 65 61 72 28  qlite3ExprClear(
4ab0: 64 62 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74 65  db, p);.  sqlite
4ac0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
4ad0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 45 78 70  }../*.** The Exp
4ae0: 72 2e 74 6f 6b 65 6e 20 66 69 65 6c 64 20 6d 69  r.token field mi
4af0: 67 68 74 20 62 65 20 61 20 73 74 72 69 6e 67 20  ght be a string 
4b00: 6c 69 74 65 72 61 6c 20 74 68 61 74 20 69 73 20  literal that is 
4b10: 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 73 6f  quoted..** If so
4b20: 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 71 75 6f  , remove the quo
4b30: 74 61 74 69 6f 6e 20 6d 61 72 6b 73 2e 0a 2a 2f  tation marks..*/
4b40: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 71  .void sqlite3Deq
4b50: 75 6f 74 65 45 78 70 72 28 73 71 6c 69 74 65 33  uoteExpr(sqlite3
4b60: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a   *db, Expr *p){.
4b70: 20 20 69 66 28 20 45 78 70 72 48 61 73 41 6e 79    if( ExprHasAny
4b80: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 44  Property(p, EP_D
4b90: 65 71 75 6f 74 65 64 29 20 29 7b 0a 20 20 20 20  equoted) ){.    
4ba0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 45 78  return;.  }.  Ex
4bb0: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c  prSetProperty(p,
4bc0: 20 45 50 5f 44 65 71 75 6f 74 65 64 29 3b 0a 20   EP_Dequoted);. 
4bd0: 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 64 79   if( p->token.dy
4be0: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  n==0 ){.    sqli
4bf0: 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c  te3TokenCopy(db,
4c00: 20 26 70 2d 3e 74 6f 6b 65 6e 2c 20 26 70 2d 3e   &p->token, &p->
4c10: 74 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20 73 71  token);.  }.  sq
4c20: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 28 63 68  lite3Dequote((ch
4c30: 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b  ar*)p->token.z);
4c40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
4c50: 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66  llowing group of
4c60: 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64   routines make d
4c70: 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78  eep copies of ex
4c80: 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78  pressions,.** ex
4c90: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20  pression lists, 
4ca0: 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65  ID lists, and se
4cb0: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e  lect statements.
4cc0: 20 20 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e    The copies can
4cd0: 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28  .** be deleted (
4ce0: 62 79 20 62 65 69 6e 67 20 70 61 73 73 65 64 20  by being passed 
4cf0: 74 6f 20 74 68 65 69 72 20 72 65 73 70 65 63 74  to their respect
4d00: 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20  ive ...Delete() 
4d10: 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74  routines).** wit
4d20: 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74  hout effecting t
4d30: 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a  he originals..**
4d40: 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69  .** The expressi
4d50: 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64  on list, ID, and
4d60: 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65   source lists re
4d70: 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45  turn by sqlite3E
4d80: 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a  xprListDup(),.**
4d90: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75   sqlite3IdListDu
4da0: 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33  p(), and sqlite3
4db0: 53 72 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e  SrcListDup() can
4dc0: 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72 20   not be further 
4dd0: 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20  expanded .** by 
4de0: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
4df0: 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41   to sqlite*ListA
4e00: 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73  ppend() routines
4e10: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c  ..**.** Any tabl
4e20: 65 73 20 74 68 61 74 20 74 68 65 20 53 72 63 4c  es that the SrcL
4e30: 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ist might point 
4e40: 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69  to are not dupli
4e50: 63 61 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  cated..*/.Expr *
4e60: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 73  sqlite3ExprDup(s
4e70: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
4e80: 20 2a 70 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e   *p){.  Expr *pN
4e90: 65 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  ew;.  if( p==0 )
4ea0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
4eb0: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
4ec0: 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
4ed0: 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
4ee0: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
4ef0: 30 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77  0;.  memcpy(pNew
4f00: 2c 20 70 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  , p, sizeof(*pNe
4f10: 77 29 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f  w));.  if( p->to
4f20: 6b 65 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20  ken.z!=0 ){.    
4f30: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20  pNew->token.z = 
4f40: 28 75 38 2a 29 73 71 6c 69 74 65 33 44 62 53 74  (u8*)sqlite3DbSt
4f50: 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a  rNDup(db, (char*
4f60: 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 2d 3e  )p->token.z, p->
4f70: 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 70 4e  token.n);.    pN
4f80: 65 77 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20  ew->token.dyn = 
4f90: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
4fa0: 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 74 6f  assert( pNew->to
4fb0: 6b 65 6e 2e 7a 3d 3d 30 20 29 3b 0a 20 20 7d 0a  ken.z==0 );.  }.
4fc0: 20 20 70 4e 65 77 2d 3e 73 70 61 6e 2e 7a 20 3d    pNew->span.z =
4fd0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65 66   0;.  pNew->pLef
4fe0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
4ff0: 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29  up(db, p->pLeft)
5000: 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74  ;.  pNew->pRight
5010: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
5020: 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 29  p(db, p->pRight)
5030: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20  ;.  pNew->pList 
5040: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
5050: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69 73  tDup(db, p->pLis
5060: 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 65 6c  t);.  pNew->pSel
5070: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
5080: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53  ectDup(db, p->pS
5090: 65 6c 65 63 74 29 3b 0a 20 20 72 65 74 75 72 6e  elect);.  return
50a0: 20 70 4e 65 77 3b 0a 7d 0a 76 6f 69 64 20 73 71   pNew;.}.void sq
50b0: 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 73  lite3TokenCopy(s
50c0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65  qlite3 *db, Toke
50d0: 6e 20 2a 70 54 6f 2c 20 54 6f 6b 65 6e 20 2a 70  n *pTo, Token *p
50e0: 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 54 6f  From){.  if( pTo
50f0: 2d 3e 64 79 6e 20 29 20 73 71 6c 69 74 65 33 44  ->dyn ) sqlite3D
5100: 62 46 72 65 65 28 64 62 2c 20 28 63 68 61 72 2a  bFree(db, (char*
5110: 29 70 54 6f 2d 3e 7a 29 3b 0a 20 20 69 66 28 20  )pTo->z);.  if( 
5120: 70 46 72 6f 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20  pFrom->z ){.    
5130: 70 54 6f 2d 3e 6e 20 3d 20 70 46 72 6f 6d 2d 3e  pTo->n = pFrom->
5140: 6e 3b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20 3d 20  n;.    pTo->z = 
5150: 28 75 38 2a 29 73 71 6c 69 74 65 33 44 62 53 74  (u8*)sqlite3DbSt
5160: 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a  rNDup(db, (char*
5170: 29 70 46 72 6f 6d 2d 3e 7a 2c 20 70 46 72 6f 6d  )pFrom->z, pFrom
5180: 2d 3e 6e 29 3b 0a 20 20 20 20 70 54 6f 2d 3e 64  ->n);.    pTo->d
5190: 79 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  yn = 1;.  }else{
51a0: 0a 20 20 20 20 70 54 6f 2d 3e 7a 20 3d 20 30 3b  .    pTo->z = 0;
51b0: 0a 20 20 7d 0a 7d 0a 45 78 70 72 4c 69 73 74 20  .  }.}.ExprList 
51c0: 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  *sqlite3ExprList
51d0: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
51e0: 20 45 78 70 72 4c 69 73 74 20 2a 70 29 7b 0a 20   ExprList *p){. 
51f0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b   ExprList *pNew;
5200: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
5210: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20  st_item *pItem, 
5220: 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74  *pOldItem;.  int
5230: 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   i;.  if( p==0 )
5240: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
5250: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
5260: 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
5270: 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
5280: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
5290: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 45  rn 0;.  pNew->iE
52a0: 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 70 4e  Cursor = 0;.  pN
52b0: 65 77 2d 3e 6e 45 78 70 72 20 3d 20 70 4e 65 77  ew->nExpr = pNew
52c0: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 45  ->nAlloc = p->nE
52d0: 78 70 72 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d  xpr;.  pNew->a =
52e0: 20 70 49 74 65 6d 20 3d 20 73 71 6c 69 74 65 33   pItem = sqlite3
52f0: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
5300: 20 70 2d 3e 6e 45 78 70 72 2a 73 69 7a 65 6f 66   p->nExpr*sizeof
5310: 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69  (p->a[0]) );.  i
5320: 66 28 20 70 49 74 65 6d 3d 3d 30 20 29 7b 0a 20  f( pItem==0 ){. 
5330: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
5340: 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  (db, pNew);.    
5350: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20 0a 20  return 0;.  } . 
5360: 20 70 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61   pOldItem = p->a
5370: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
5380: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  ->nExpr; i++, pI
5390: 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b  tem++, pOldItem+
53a0: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e  +){.    Expr *pN
53b0: 65 77 45 78 70 72 2c 20 2a 70 4f 6c 64 45 78 70  ewExpr, *pOldExp
53c0: 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45  r;.    pItem->pE
53d0: 78 70 72 20 3d 20 70 4e 65 77 45 78 70 72 20 3d  xpr = pNewExpr =
53e0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
53f0: 64 62 2c 20 70 4f 6c 64 45 78 70 72 20 3d 20 70  db, pOldExpr = p
5400: 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  OldItem->pExpr);
5410: 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 45 78 70  .    if( pOldExp
5420: 72 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 26 26 20  r->span.z!=0 && 
5430: 70 4e 65 77 45 78 70 72 20 29 7b 0a 20 20 20 20  pNewExpr ){.    
5440: 20 20 2f 2a 20 41 6c 77 61 79 73 20 6d 61 6b 65    /* Always make
5450: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73   a copy of the s
5460: 70 61 6e 20 66 6f 72 20 74 6f 70 2d 6c 65 76 65  pan for top-leve
5470: 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  l expressions in
5480: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65 78   the.      ** ex
5490: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
54a0: 54 68 65 20 6c 6f 67 69 63 20 69 6e 20 53 45 4c  The logic in SEL
54b0: 45 43 54 20 70 72 6f 63 65 73 73 69 6e 67 20 74  ECT processing t
54c0: 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 0a 20  hat determines. 
54d0: 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65       ** the name
54e0: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  s of columns in 
54f0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6e  the result set n
5500: 65 65 64 73 20 74 68 69 73 20 69 6e 66 6f 72 6d  eeds this inform
5510: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73  ation */.      s
5520: 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28  qlite3TokenCopy(
5530: 64 62 2c 20 26 70 4e 65 77 45 78 70 72 2d 3e 73  db, &pNewExpr->s
5540: 70 61 6e 2c 20 26 70 4f 6c 64 45 78 70 72 2d 3e  pan, &pOldExpr->
5550: 73 70 61 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  span);.    }.   
5560: 20 61 73 73 65 72 74 28 20 70 4e 65 77 45 78 70   assert( pNewExp
5570: 72 3d 3d 30 20 7c 7c 20 70 4e 65 77 45 78 70 72  r==0 || pNewExpr
5580: 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 0a 20 20 20  ->span.z!=0 .   
5590: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4f 6c 64           || pOld
55a0: 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 3d 3d 30 0a  Expr->span.z==0.
55b0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 64              || d
55c0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
55d0: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e  );.    pItem->zN
55e0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
55f0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
5600: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
5610: 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pItem->sortOrder
5620: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72   = pOldItem->sor
5630: 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65  tOrder;.    pIte
5640: 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20  m->done = 0;.   
5650: 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 20 3d 20 70   pItem->iCol = p
5660: 4f 6c 64 49 74 65 6d 2d 3e 69 43 6f 6c 3b 0a 20  OldItem->iCol;. 
5670: 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73     pItem->iAlias
5680: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 41 6c   = pOldItem->iAl
5690: 69 61 73 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ias;.  }.  retur
56a0: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
56b0: 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69   If cursors, tri
56c0: 67 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64  ggers, views and
56d0: 20 73 75 62 71 75 65 72 69 65 73 20 61 72 65 20   subqueries are 
56e0: 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d  all omitted from
56f0: 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74  .** the build, t
5700: 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  hen none of the 
5710: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
5720: 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a  es, except for .
5730: 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  ** sqlite3Select
5740: 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61  Dup(), can be ca
5750: 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c  lled. sqlite3Sel
5760: 65 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65  ectDup() is some
5770: 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20  times.** called 
5780: 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75  with a NULL argu
5790: 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  ment..*/.#if !de
57a0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
57b0: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
57c0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
57d0: 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21  TRIGGER) \. || !
57e0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
57f0: 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72  MIT_SUBQUERY).Sr
5800: 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
5810: 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33  cListDup(sqlite3
5820: 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70   *db, SrcList *p
5830: 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e  ){.  SrcList *pN
5840: 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ew;.  int i;.  i
5850: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20  nt nByte;.  if( 
5860: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
5870: 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  .  nByte = sizeo
5880: 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63  f(*p) + (p->nSrc
5890: 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61  >0 ? sizeof(p->a
58a0: 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d  [0]) * (p->nSrc-
58b0: 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20  1) : 0);.  pNew 
58c0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
58d0: 63 52 61 77 28 64 62 2c 20 6e 42 79 74 65 20 29  cRaw(db, nByte )
58e0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
58f0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
5900: 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d  ew->nSrc = pNew-
5910: 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72  >nAlloc = p->nSr
5920: 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  c;.  for(i=0; i<
5930: 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  p->nSrc; i++){. 
5940: 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
5950: 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d  t_item *pNewItem
5960: 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a   = &pNew->a[i];.
5970: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
5980: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65  st_item *pOldIte
5990: 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  m = &p->a[i];.  
59a0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
59b0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61     pNewItem->zDa
59c0: 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33  tabase = sqlite3
59d0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
59e0: 64 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  dItem->zDatabase
59f0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
5a00: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
5a10: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
5a20: 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  dItem->zName);. 
5a30: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c     pNewItem->zAl
5a40: 69 61 73 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ias = sqlite3DbS
5a50: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
5a60: 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
5a70: 20 70 4e 65 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74   pNewItem->joint
5a80: 79 70 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  ype = pOldItem->
5a90: 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 70 4e  jointype;.    pN
5aa0: 65 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  ewItem->iCursor 
5ab0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72  = pOldItem->iCur
5ac0: 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  sor;.    pNewIte
5ad0: 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 20 3d  m->isPopulated =
5ae0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 73 50 6f 70   pOldItem->isPop
5af0: 75 6c 61 74 65 64 3b 0a 20 20 20 20 70 4e 65 77  ulated;.    pNew
5b00: 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 20 3d 20 73  Item->zIndex = s
5b10: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
5b20: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 49 6e  b, pOldItem->zIn
5b30: 64 65 78 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  dex);.    pNewIt
5b40: 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20 3d  em->notIndexed =
5b50: 20 70 4f 6c 64 49 74 65 6d 2d 3e 6e 6f 74 49 6e   pOldItem->notIn
5b60: 64 65 78 65 64 3b 0a 20 20 20 20 70 4e 65 77 49  dexed;.    pNewI
5b70: 74 65 6d 2d 3e 70 49 6e 64 65 78 20 3d 20 70 4f  tem->pIndex = pO
5b80: 6c 64 49 74 65 6d 2d 3e 70 49 6e 64 65 78 3b 0a  ldItem->pIndex;.
5b90: 20 20 20 20 70 54 61 62 20 3d 20 70 4e 65 77 49      pTab = pNewI
5ba0: 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64  tem->pTab = pOld
5bb0: 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
5bc0: 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20  if( pTab ){.    
5bd0: 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a    pTab->nRef++;.
5be0: 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74      }.    pNewIt
5bf0: 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  em->pSelect = sq
5c00: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
5c10: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65  b, pOldItem->pSe
5c20: 6c 65 63 74 29 3b 0a 20 20 20 20 70 4e 65 77 49  lect);.    pNewI
5c30: 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74  tem->pOn = sqlit
5c40: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f  e3ExprDup(db, pO
5c50: 6c 64 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20  ldItem->pOn);.  
5c60: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69    pNewItem->pUsi
5c70: 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69  ng = sqlite3IdLi
5c80: 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  stDup(db, pOldIt
5c90: 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20  em->pUsing);.   
5ca0: 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73   pNewItem->colUs
5cb0: 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63  ed = pOldItem->c
5cc0: 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65  olUsed;.  }.  re
5cd0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c  turn pNew;.}.IdL
5ce0: 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69  ist *sqlite3IdLi
5cf0: 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  stDup(sqlite3 *d
5d00: 62 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20  b, IdList *p){. 
5d10: 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20   IdList *pNew;. 
5d20: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d   int i;.  if( p=
5d30: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
5d40: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
5d50: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
5d60: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a  izeof(*pNew) );.
5d70: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
5d80: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
5d90: 2d 3e 6e 49 64 20 3d 20 70 4e 65 77 2d 3e 6e 41  ->nId = pNew->nA
5da0: 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20  lloc = p->nId;. 
5db0: 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74   pNew->a = sqlit
5dc0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
5dd0: 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28  , p->nId*sizeof(
5de0: 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66  p->a[0]) );.  if
5df0: 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a  ( pNew->a==0 ){.
5e00: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
5e10: 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20  e(db, pNew);.   
5e20: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
5e30: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
5e40: 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  Id; i++){.    st
5e50: 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d  ruct IdList_item
5e60: 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e   *pNewItem = &pN
5e70: 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74  ew->a[i];.    st
5e80: 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d  ruct IdList_item
5e90: 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d   *pOldItem = &p-
5ea0: 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49  >a[i];.    pNewI
5eb0: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
5ec0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
5ed0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pOldItem->zName
5ee0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
5ef0: 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  >idx = pOldItem-
5f00: 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75  >idx;.  }.  retu
5f10: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63  rn pNew;.}.Selec
5f20: 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74  t *sqlite3Select
5f30: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
5f40: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53   Select *p){.  S
5f50: 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 69  elect *pNew;.  i
5f60: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
5f70: 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   0;.  pNew = sql
5f80: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
5f90: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  db, sizeof(*p) )
5fa0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
5fb0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
5fc0: 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c  ew->pEList = sql
5fd0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
5fe0: 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a  db, p->pEList);.
5ff0: 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73    pNew->pSrc = s
6000: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
6010: 28 64 62 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20  (db, p->pSrc);. 
6020: 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20   pNew->pWhere = 
6030: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
6040: 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  b, p->pWhere);. 
6050: 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20   pNew->pGroupBy 
6060: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
6070: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 47 72 6f  tDup(db, p->pGro
6080: 75 70 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  upBy);.  pNew->p
6090: 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  Having = sqlite3
60a0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
60b0: 48 61 76 69 6e 67 29 3b 0a 20 20 70 4e 65 77 2d  Having);.  pNew-
60c0: 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69  >pOrderBy = sqli
60d0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
60e0: 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  b, p->pOrderBy);
60f0: 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d  .  pNew->op = p-
6100: 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72  >op;.  pNew->pPr
6110: 69 6f 72 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ior = sqlite3Sel
6120: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 50  ectDup(db, p->pP
6130: 72 69 6f 72 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  rior);.  pNew->p
6140: 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45  Limit = sqlite3E
6150: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  xprDup(db, p->pL
6160: 69 6d 69 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  imit);.  pNew->p
6170: 4f 66 66 73 65 74 20 3d 20 73 71 6c 69 74 65 33  Offset = sqlite3
6180: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
6190: 4f 66 66 73 65 74 29 3b 0a 20 20 70 4e 65 77 2d  Offset);.  pNew-
61a0: 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70  >iLimit = 0;.  p
61b0: 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30  New->iOffset = 0
61c0: 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61  ;.  pNew->selFla
61d0: 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73  gs = p->selFlags
61e0: 20 26 20 7e 53 46 5f 55 73 65 73 45 70 68 65 6d   & ~SF_UsesEphem
61f0: 65 72 61 6c 3b 0a 20 20 70 4e 65 77 2d 3e 70 52  eral;.  pNew->pR
6200: 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20  ightmost = 0;.  
6210: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
6220: 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[0] = -1;.  pN
6230: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
6240: 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [1] = -1;.  pNew
6250: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32  ->addrOpenEphm[2
6260: 5d 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e  ] = -1;.  return
6270: 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53   pNew;.}.#else.S
6280: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
6290: 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20  lectDup(sqlite3 
62a0: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  *db, Select *p){
62b0: 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
62c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
62d0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
62e0: 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
62f0: 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  t to the end of 
6300: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
6310: 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73  st.  If pList is
6320: 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55  .** initially NU
6330: 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  LL, then create 
6340: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
6350: 20 6c 69 73 74 2e 0a 2a 2f 0a 45 78 70 72 4c 69   list..*/.ExprLi
6360: 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c  st *sqlite3ExprL
6370: 69 73 74 41 70 70 65 6e 64 28 0a 20 20 50 61 72  istAppend(.  Par
6380: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
6390: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
63a0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
63b0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
63c0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
63d0: 77 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e  which to append.
63e0: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
63f0: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
6400: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
6410: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20  xpression to be 
6420: 61 70 70 65 6e 64 65 64 20 2a 2f 0a 20 20 54 6f  appended */.  To
6430: 6b 65 6e 20 2a 70 4e 61 6d 65 20 20 20 20 20 20  ken *pName      
6440: 20 20 20 20 20 20 2f 2a 20 41 53 20 6b 65 79 77        /* AS keyw
6450: 6f 72 64 20 66 6f 72 20 74 68 65 20 65 78 70 72  ord for the expr
6460: 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 73  ession */.){.  s
6470: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
6480: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  rse->db;.  if( p
6490: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
64a0: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62  List = sqlite3Db
64b0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
64c0: 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20  izeof(ExprList) 
64d0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
64e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
64f0: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a  o no_mem;.    }.
6500: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
6510: 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a  t->nAlloc==0 );.
6520: 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d    }.  if( pList-
6530: 3e 6e 41 6c 6c 6f 63 3c 3d 70 4c 69 73 74 2d 3e  >nAlloc<=pList->
6540: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 74 72  nExpr ){.    str
6550: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
6560: 6d 20 2a 61 3b 0a 20 20 20 20 69 6e 74 20 6e 20  m *a;.    int n 
6570: 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a  = pList->nAlloc*
6580: 32 20 2b 20 34 3b 0a 20 20 20 20 61 20 3d 20 73  2 + 4;.    a = s
6590: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
65a0: 64 62 2c 20 70 4c 69 73 74 2d 3e 61 2c 20 6e 2a  db, pList->a, n*
65b0: 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
65c0: 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 3d  0]));.    if( a=
65d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
65e0: 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20   no_mem;.    }. 
65f0: 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b     pList->a = a;
6600: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  .    pList->nAll
6610: 6f 63 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 61 73  oc = n;.  }.  as
6620: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d  sert( pList->a!=
6630: 30 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72  0 );.  if( pExpr
6640: 20 7c 7c 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20   || pName ){.   
6650: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
6660: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
6670: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
6680: 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65  nExpr++];.    me
6690: 6d 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20 73  mset(pItem, 0, s
66a0: 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29 29 3b 0a  izeof(*pItem));.
66b0: 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65      pItem->zName
66c0: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
66d0: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d  omToken(db, pNam
66e0: 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70  e);.    pItem->p
66f0: 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
6700: 20 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20    pItem->iAlias 
6710: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
6720: 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d  n pList;..no_mem
6730: 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69  :     .  /* Avoi
6740: 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79  d leaking memory
6750: 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66   if malloc has f
6760: 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69  ailed. */.  sqli
6770: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
6780: 2c 20 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69  , pExpr);.  sqli
6790: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
67a0: 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  e(db, pList);.  
67b0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
67c0: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
67d0: 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74  sion list pEList
67e0: 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74   contains more t
67f0: 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65  han iLimit eleme
6800: 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e  nts,.** leave an
6810: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
6820: 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69  n pParse..*/.voi
6830: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
6840: 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20  tCheckLength(.  
6850: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20  Parse *pParse,. 
6860: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
6870: 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  t,.  const char 
6880: 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e  *zObject.){.  in
6890: 74 20 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e 64  t mx = pParse->d
68a0: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
68b0: 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a  _LIMIT_COLUMN];.
68c0: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69    testcase( pELi
68d0: 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
68e0: 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73  xpr==mx );.  tes
68f0: 74 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26  tcase( pEList &&
6900: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   pEList->nExpr==
6910: 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 45  mx+1 );.  if( pE
6920: 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
6930: 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20  nExpr>mx ){.    
6940: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
6950: 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
6960: 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22  y columns in %s"
6970: 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a  , zObject);.  }.
6980: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
6990: 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65 73  an entire expres
69a0: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f  sion list..*/.vo
69b0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
69c0: 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  stDelete(sqlite3
69d0: 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a   *db, ExprList *
69e0: 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
69f0: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
6a00: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
6a10: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
6a20: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
6a30: 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c  t( pList->a!=0 |
6a40: 7c 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  | (pList->nExpr=
6a50: 3d 30 20 26 26 20 70 4c 69 73 74 2d 3e 6e 41 6c  =0 && pList->nAl
6a60: 6c 6f 63 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73  loc==0) );.  ass
6a70: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
6a80: 72 3c 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  r<=pList->nAlloc
6a90: 20 29 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d   );.  for(pItem=
6aa0: 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
6ab0: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
6ac0: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
6ad0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
6ae0: 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ete(db, pItem->p
6af0: 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  Expr);.    sqlit
6b00: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
6b10: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  em->zName);.  }.
6b20: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
6b30: 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20  db, pList->a);. 
6b40: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
6b50: 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  b, pList);.}../*
6b60: 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
6b70: 65 73 20 61 72 65 20 57 61 6c 6b 65 72 20 63 61  es are Walker ca
6b80: 6c 6c 62 61 63 6b 73 2e 20 20 57 61 6c 6b 65 72  llbacks.  Walker
6b90: 2e 75 2e 70 69 20 69 73 20 61 20 70 6f 69 6e 74  .u.pi is a point
6ba0: 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 69 6e 74 65  er.** to an inte
6bb0: 67 65 72 2e 20 20 54 68 65 73 65 20 72 6f 75 74  ger.  These rout
6bc0: 69 6e 65 73 20 61 72 65 20 63 68 65 63 6b 69 6e  ines are checkin
6bd0: 67 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  g an expression 
6be0: 74 6f 20 73 65 65 0a 2a 2a 20 69 66 20 69 74 20  to see.** if it 
6bf0: 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 2e 20 20  is a constant.  
6c00: 53 65 74 20 2a 57 61 6c 6b 65 72 2e 75 2e 70 69  Set *Walker.u.pi
6c10: 20 74 6f 20 30 20 69 66 20 74 68 65 20 65 78 70   to 0 if the exp
6c20: 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 6e 6f  ression is.** no
6c30: 74 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a  t constant..**.*
6c40: 2a 20 54 68 65 73 65 20 63 61 6c 6c 62 61 63 6b  * These callback
6c50: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
6c60: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
6c70: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
6c80: 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  *.**     sqlite3
6c90: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 29  ExprIsConstant()
6ca0: 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45  .**     sqlite3E
6cb0: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
6cc0: 4a 6f 69 6e 28 29 0a 2a 2a 20 20 20 20 20 73 71  Join().**     sq
6cd0: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
6ce0: 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29 0a  antOrFunction().
6cf0: 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  **.*/.static int
6d00: 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
6d10: 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ant(Walker *pWal
6d20: 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
6d30: 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70 57 61 6c  ){..  /* If pWal
6d40: 6b 65 72 2d 3e 75 2e 69 20 69 73 20 33 20 74 68  ker->u.i is 3 th
6d50: 65 6e 20 61 6e 79 20 74 65 72 6d 20 6f 66 20 74  en any term of t
6d60: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
6d70: 61 74 20 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20  at comes from.  
6d80: 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  ** the ON or USI
6d90: 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20  NG clauses of a 
6da0: 6a 6f 69 6e 20 64 69 73 71 75 61 6c 69 66 69 65  join disqualifie
6db0: 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  s the expression
6dc0: 0a 20 20 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67  .  ** from being
6dd0: 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 6e 73   considered cons
6de0: 74 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70  tant. */.  if( p
6df0: 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 33 20 26  Walker->u.i==3 &
6e00: 26 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70  & ExprHasAnyProp
6e10: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
6e20: 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20  romJoin) ){.    
6e30: 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30  pWalker->u.i = 0
6e40: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  ;.    return WRC
6e50: 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73  _Abort;.  }..  s
6e60: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
6e70: 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69   ){.    /* Consi
6e80: 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f  der functions to
6e90: 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20   be constant if 
6ea0: 61 6c 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65  all their argume
6eb0: 6e 74 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74  nts are constant
6ec0: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 70 57 61 6c  .    ** and pWal
6ed0: 6b 65 72 2d 3e 75 2e 69 3d 3d 32 20 2a 2f 0a 20  ker->u.i==2 */. 
6ee0: 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
6ef0: 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70  ION:.      if( p
6f00: 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 32 20 29  Walker->u.i==2 )
6f10: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
6f20: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
6f30: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
6f40: 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ID:.    case TK_
6f50: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
6f60: 20 54 4b 5f 44 4f 54 3a 0a 20 20 20 20 63 61 73   TK_DOT:.    cas
6f70: 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  e TK_AGG_FUNCTIO
6f80: 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  N:.    case TK_A
6f90: 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 23 69 66 6e 64  GG_COLUMN:.#ifnd
6fa0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
6fb0: 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
6fc0: 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20   TK_SELECT:.    
6fd0: 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a  case TK_EXISTS:.
6fe0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
6ff0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
7000: 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 74 65  LECT );.      te
7010: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
7020: 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a  p==TK_EXISTS );.
7030: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 74 65 73  #endif.      tes
7040: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
7050: 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20 20  ==TK_ID );.     
7060: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
7070: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
7080: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
7090: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
70a0: 5f 44 4f 54 20 29 3b 0a 20 20 20 20 20 20 74 65  _DOT );.      te
70b0: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
70c0: 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
70d0: 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ON );.      test
70e0: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
70f0: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
7100: 3b 0a 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d  ;.      pWalker-
7110: 3e 75 2e 69 20 3d 20 30 3b 0a 20 20 20 20 20 20  >u.i = 0;.      
7120: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
7130: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
7140: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
7150: 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a  Continue;.  }.}.
7160: 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63  static int selec
7170: 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28  tNodeIsConstant(
7180: 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
7190: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
71a0: 29 7b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  ){.  pWalker->u.
71b0: 69 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  i = 0;.  return 
71c0: 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74 61  WRC_Abort;.}.sta
71d0: 74 69 63 20 69 6e 74 20 65 78 70 72 49 73 43 6f  tic int exprIsCo
71e0: 6e 73 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  nst(Expr *p, int
71f0: 20 69 6e 69 74 46 6c 61 67 29 7b 0a 20 20 57 61   initFlag){.  Wa
7200: 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 75 2e 69 20  lker w;.  w.u.i 
7210: 3d 20 69 6e 69 74 46 6c 61 67 3b 0a 20 20 77 2e  = initFlag;.  w.
7220: 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
7230: 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
7240: 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  nt;.  w.xSelectC
7250: 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74  allback = select
7260: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a  NodeIsConstant;.
7270: 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
7280: 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75  r(&w, p);.  retu
7290: 72 6e 20 77 2e 75 2e 69 3b 0a 7d 0a 0a 2f 2a 0a  rn w.u.i;.}../*.
72a0: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
72b0: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
72c0: 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70  urn 1 if the exp
72d0: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
72e0: 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20  ant.** and 0 if 
72f0: 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69  it involves vari
7300: 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f  ables or functio
7310: 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46  n calls..**.** F
7320: 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
7330: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
7340: 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65  , a double-quote
7350: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61  d string (ex: "a
7360: 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  bc").** is consi
7370: 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65  dered a variable
7380: 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75   but a single-qu
7390: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
73a0: 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20   'abc') is.** a 
73b0: 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74  constant..*/.int
73c0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
73d0: 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29 7b  nstant(Expr *p){
73e0: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
73f0: 43 6f 6e 73 74 28 70 2c 20 31 29 3b 0a 7d 0a 0a  Const(p, 1);.}..
7400: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
7410: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
7420: 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
7430: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
7440: 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 61 74 20 64  nstant.** that d
7450: 6f 65 73 20 6e 6f 20 6f 72 69 67 69 6e 61 74 65  oes no originate
7460: 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20   from the ON or 
7470: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66  USING clauses of
7480: 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75   a join..** Retu
7490: 72 6e 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c  rn 0 if it invol
74a0: 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72  ves variables or
74b0: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20   function calls 
74c0: 6f 72 20 74 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a  or terms from.**
74d0: 20 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20   an ON or USING 
74e0: 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  clause..*/.int s
74f0: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
7500: 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72  tantNotJoin(Expr
7510: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65   *p){.  return e
7520: 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 33 29  xprIsConst(p, 3)
7530: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  ;.}../*.** Walk 
7540: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
7550: 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66  ee.  Return 1 if
7560: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
7570: 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f  is constant.** o
7580: 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  r a function cal
7590: 6c 20 77 69 74 68 20 63 6f 6e 73 74 61 6e 74 20  l with constant 
75a0: 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75  arguments.  Retu
75b0: 72 6e 20 61 6e 64 20 30 20 69 66 20 74 68 65 72  rn and 0 if ther
75c0: 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20 76 61 72  e.** are any var
75d0: 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f  iables..**.** Fo
75e0: 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
75f0: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  f this function,
7600: 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64   a double-quoted
7610: 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62   string (ex: "ab
7620: 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64  c").** is consid
7630: 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65 20  ered a variable 
7640: 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f  but a single-quo
7650: 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
7660: 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63  'abc') is.** a c
7670: 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  onstant..*/.int 
7680: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
7690: 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28  stantOrFunction(
76a0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  Expr *p){.  retu
76b0: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
76c0: 2c 20 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  , 2);.}../*.** I
76d0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
76e0: 20 70 20 63 6f 64 65 73 20 61 20 63 6f 6e 73 74   p codes a const
76f0: 61 6e 74 20 69 6e 74 65 67 65 72 20 74 68 61 74  ant integer that
7700: 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
7710: 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20  .** to fit in a 
7720: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20  32-bit integer, 
7730: 72 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75 74  return 1 and put
7740: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
7750: 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20  e integer.** in 
7760: 2a 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68 65  *pValue.  If the
7770: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e   expression is n
7780: 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72  ot an integer or
7790: 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20 62 69   if it is too bi
77a0: 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61  g.** to fit in a
77b0: 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20 69   signed 32-bit i
77c0: 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 30  nteger, return 0
77d0: 20 61 6e 64 20 6c 65 61 76 65 20 2a 70 56 61 6c   and leave *pVal
77e0: 75 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f  ue unchanged..*/
77f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
7800: 49 73 49 6e 74 65 67 65 72 28 45 78 70 72 20 2a  IsInteger(Expr *
7810: 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b  p, int *pValue){
7820: 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20  .  int rc = 0;. 
7830: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
7840: 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20  EP_IntValue ){. 
7850: 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 70 2d 3e     *pValue = p->
7860: 69 54 61 62 6c 65 3b 0a 20 20 20 20 72 65 74 75  iTable;.    retu
7870: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74  rn 1;.  }.  swit
7880: 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
7890: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
78a0: 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  : {.      rc = s
78b0: 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 28  qlite3GetInt32((
78c0: 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a  char*)p->token.z
78d0: 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  , pValue);.     
78e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
78f0: 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a    case TK_UPLUS:
7900: 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
7910: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
7920: 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61  er(p->pLeft, pVa
7930: 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  lue);.      brea
7940: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
7950: 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20  e TK_UMINUS: {. 
7960: 20 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20       int v;.    
7970: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
7980: 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
7990: 65 66 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20  eft, &v) ){.    
79a0: 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76      *pValue = -v
79b0: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
79c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
79d0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
79e0: 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b   default: break;
79f0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 7b  .  }.  if( rc ){
7a00: 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f  .    p->op = TK_
7a10: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 2d 3e  INTEGER;.    p->
7a20: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56  flags |= EP_IntV
7a30: 61 6c 75 65 3b 0a 20 20 20 20 70 2d 3e 69 54 61  alue;.    p->iTa
7a40: 62 6c 65 20 3d 20 2a 70 56 61 6c 75 65 3b 0a 20  ble = *pValue;. 
7a50: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
7a60: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
7a70: 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65  TRUE if the give
7a80: 6e 20 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f  n string is a ro
7a90: 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  w-id column name
7aa0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
7ab0: 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68  IsRowid(const ch
7ac0: 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71  ar *z){.  if( sq
7ad0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
7ae0: 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20  "_ROWID_")==0 ) 
7af0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
7b00: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
7b10: 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20  , "ROWID")==0 ) 
7b20: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
7b30: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
7b40: 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65  , "OID")==0 ) re
7b50: 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e  turn 1;.  return
7b60: 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51   0;.}..#ifdef SQ
7b70: 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20  LITE_TEST.  int 
7b80: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 69  sqlite3_enable_i
7b90: 6e 5f 6f 70 74 20 3d 20 31 3b 0a 23 65 6c 73 65  n_opt = 1;.#else
7ba0: 0a 20 20 23 64 65 66 69 6e 65 20 73 71 6c 69 74  .  #define sqlit
7bb0: 65 33 5f 65 6e 61 62 6c 65 5f 69 6e 5f 6f 70 74  e3_enable_in_opt
7bc0: 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   1.#endif../*.**
7bd0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
7be0: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
7bf0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
7c00: 65 6e 61 62 6c 65 64 20 61 6e 64 0a 2a 2a 20 74  enabled and.** t
7c10: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
7c20: 65 6e 74 20 70 20 65 78 69 73 74 73 20 61 6e 64  ent p exists and
7c30: 20 69 73 20 6f 66 20 74 68 65 0a 2a 2a 20 73 69   is of the.** si
7c40: 6d 70 6c 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a  mple form:.**.**
7c50: 20 20 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c       SELECT <col
7c60: 75 6d 6e 3e 20 46 52 4f 4d 20 3c 74 61 62 6c 65  umn> FROM <table
7c70: 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  >.**.** If this 
7c80: 69 73 20 74 68 65 20 63 61 73 65 2c 20 69 74 20  is the case, it 
7c90: 6d 61 79 20 62 65 20 70 6f 73 73 69 62 6c 65 20  may be possible 
7ca0: 74 6f 20 75 73 65 20 61 6e 20 65 78 69 73 74 69  to use an existi
7cb0: 6e 67 20 74 61 62 6c 65 0a 2a 2a 20 6f 72 20 69  ng table.** or i
7cc0: 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20  ndex instead of 
7cd0: 67 65 6e 65 72 61 74 69 6e 67 20 61 6e 20 65 70  generating an ep
7ce0: 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a  heremal table..*
7cf0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
7d00: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 73  _OMIT_SUBQUERY.s
7d10: 74 61 74 69 63 20 69 6e 74 20 69 73 43 61 6e 64  tatic int isCand
7d20: 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 53 65  idateForInOpt(Se
7d30: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c  lect *p){.  SrcL
7d40: 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70  ist *pSrc;.  Exp
7d50: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
7d60: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
7d70: 69 66 28 20 21 73 71 6c 69 74 65 33 5f 65 6e 61  if( !sqlite3_ena
7d80: 62 6c 65 5f 69 6e 5f 6f 70 74 20 29 20 72 65 74  ble_in_opt ) ret
7d90: 75 72 6e 20 30 3b 20 2f 2a 20 49 4e 20 6f 70 74  urn 0; /* IN opt
7da0: 69 6d 69 7a 61 74 69 6f 6e 20 6d 75 73 74 20 62  imization must b
7db0: 65 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69  e enabled */.  i
7dc0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
7dd0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
7de0: 20 20 20 20 20 20 2f 2a 20 72 69 67 68 74 2d 68        /* right-h
7df0: 61 6e 64 20 73 69 64 65 20 6f 66 20 49 4e 20 69  and side of IN i
7e00: 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66  s SELECT */.  if
7e10: 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 20 72 65  ( p->pPrior ) re
7e20: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
7e30: 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f       /* Not a co
7e40: 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f  mpound SELECT */
7e50: 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
7e60: 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
7e70: 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 20  t|SF_Aggregate) 
7e80: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
7e90: 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54 49 4e 43  0; /* No DISTINC
7ea0: 54 20 6b 65 79 77 6f 72 64 20 61 6e 64 20 6e 6f  T keyword and no
7eb0: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
7ec0: 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  ions */.  }.  if
7ed0: 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 20  ( p->pGroupBy ) 
7ee0: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
7ef0: 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 47       /* Has no G
7f00: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a  ROUP BY clause *
7f10: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69  /.  if( p->pLimi
7f20: 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
7f30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
7f40: 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c 61 75 73  s no LIMIT claus
7f50: 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f  e */.  if( p->pO
7f60: 66 66 73 65 74 20 29 20 72 65 74 75 72 6e 20 30  ffset ) return 0
7f70: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72  ;.  if( p->pWher
7f80: 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  e ) return 0;   
7f90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
7fa0: 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  s no WHERE claus
7fb0: 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70 2d  e */.  pSrc = p-
7fc0: 3e 70 53 72 63 3b 0a 20 20 69 66 28 20 70 53 72  >pSrc;.  if( pSr
7fd0: 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  c==0 ) return 0;
7fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ff0: 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 61 62 6c  /* A single tabl
8000: 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
8010: 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 53  ause */.  if( pS
8020: 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65  rc->nSrc!=1 ) re
8030: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 53  turn 0;.  if( pS
8040: 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  rc->a[0].pSelect
8050: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
8060: 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
8070: 69 73 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72  is not a subquer
8080: 79 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70 53  y */.  pTab = pS
8090: 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20  rc->a[0].pTab;. 
80a0: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72   if( pTab==0 ) r
80b0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
80c0: 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 20 72  Tab->pSelect ) r
80d0: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
80e0: 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
80f0: 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20 2a   is not a view *
8100: 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  /.  if( IsVirtua
8110: 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
8120: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 52   0;        /* FR
8130: 4f 4d 20 63 6c 61 75 73 65 20 6e 6f 74 20 61 20  OM clause not a 
8140: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
8150: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
8160: 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c  EList;.  if( pEL
8170: 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20  ist->nExpr!=1 ) 
8180: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
8190: 2f 2a 20 4f 6e 65 20 63 6f 6c 75 6d 6e 20 69 6e  /* One column in
81a0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
81b0: 2a 2f 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d  */.  if( pEList-
81c0: 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 21  >a[0].pExpr->op!
81d0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74  =TK_COLUMN ) ret
81e0: 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 75 6c 74  urn 0; /* Result
81f0: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a   is a column */.
8200: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
8210: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
8220: 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
8230: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
8240: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20  tion is used by 
8250: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
8260: 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e  on of the IN (..
8270: 2e 29 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20  .) operator..** 
8280: 49 74 27 73 20 6a 6f 62 20 69 73 20 74 6f 20 66  It's job is to f
8290: 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61 20  ind or create a 
82a0: 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
82b0: 20 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 65   that may be use
82c0: 64 0a 2a 2a 20 65 69 74 68 65 72 20 74 6f 20 74  d.** either to t
82d0: 65 73 74 20 66 6f 72 20 6d 65 6d 62 65 72 73 68  est for membersh
82e0: 69 70 20 6f 66 20 74 68 65 20 28 2e 2e 2e 29 20  ip of the (...) 
82f0: 73 65 74 20 6f 72 20 74 6f 20 69 74 65 72 61 74  set or to iterat
8300: 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 69 74 73  e through.** its
8310: 20 6d 65 6d 62 65 72 73 2c 20 73 6b 69 70 70 69   members, skippi
8320: 6e 67 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a  ng duplicates..*
8330: 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20  *.** The cursor 
8340: 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 73 74  opened on the st
8350: 72 75 63 74 75 72 65 20 28 64 61 74 61 62 61 73  ructure (databas
8360: 65 20 74 61 62 6c 65 2c 20 64 61 74 61 62 61 73  e table, databas
8370: 65 20 69 6e 64 65 78 20 0a 2a 2a 20 6f 72 20 65  e index .** or e
8380: 70 68 65 72 6d 61 6c 20 74 61 62 6c 65 29 20 69  phermal table) i
8390: 73 20 73 74 6f 72 65 64 20 69 6e 20 70 58 2d 3e  s stored in pX->
83a0: 69 54 61 62 6c 65 20 62 65 66 6f 72 65 20 74 68  iTable before th
83b0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
83c0: 72 6e 73 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75  rns..** The retu
83d0: 72 6e 65 64 20 76 61 6c 75 65 20 69 6e 64 69 63  rned value indic
83e0: 61 74 65 73 20 74 68 65 20 73 74 72 75 63 74 75  ates the structu
83f0: 72 65 20 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c  re type, as foll
8400: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f  ows:.**.**   IN_
8410: 49 4e 44 45 58 5f 52 4f 57 49 44 20 2d 20 54 68  INDEX_ROWID - Th
8420: 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
8430: 6e 65 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73  ned on a databas
8440: 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e  e table..**   IN
8450: 5f 49 4e 44 45 58 5f 49 4e 44 45 58 20 2d 20 54  _INDEX_INDEX - T
8460: 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
8470: 65 6e 65 64 20 6f 6e 20 61 20 64 61 74 61 62 61  ened on a databa
8480: 73 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49  se index..**   I
8490: 4e 5f 49 4e 44 45 58 5f 45 50 48 20 2d 20 20 20  N_INDEX_EPH -   
84a0: 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
84b0: 70 65 6e 65 64 20 6f 6e 20 61 20 73 70 65 63 69  pened on a speci
84c0: 61 6c 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64  ally created and
84d0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
84e0: 20 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64         populated
84f0: 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65   epheremal table
8500: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74  ..**.** An exist
8510: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 6d 61  ing structure ma
8520: 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 69  y only be used i
8530: 66 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20  f the SELECT is 
8540: 6f 66 20 74 68 65 20 73 69 6d 70 6c 65 0a 2a 2a  of the simple.**
8550: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
8560: 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e   SELECT <column>
8570: 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a   FROM <table>.**
8580: 0a 2a 2a 20 49 66 20 70 72 4e 6f 74 46 6f 75 6e  .** If prNotFoun
8590: 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  d parameter is 0
85a0: 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72 75 63  , then the struc
85b0: 74 75 72 65 20 77 69 6c 6c 20 62 65 20 75 73 65  ture will be use
85c0: 64 20 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20  d to iterate.** 
85d0: 74 68 72 6f 75 67 68 20 74 68 65 20 73 65 74 20  through the set 
85e0: 6d 65 6d 62 65 72 73 2c 20 73 6b 69 70 70 69 6e  members, skippin
85f0: 67 20 61 6e 79 20 64 75 70 6c 69 63 61 74 65 73  g any duplicates
8600: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
8610: 6e 0a 2a 2a 20 65 70 68 65 72 65 6d 61 6c 20 74  n.** epheremal t
8620: 61 62 6c 65 20 6d 75 73 74 20 62 65 20 75 73 65  able must be use
8630: 64 20 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c  d unless the sel
8640: 65 63 74 65 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69  ected <column> i
8650: 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20  s guaranteed.** 
8660: 74 6f 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65  to be unique - e
8670: 69 74 68 65 72 20 62 65 63 61 75 73 65 20 69 74  ither because it
8680: 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50   is an INTEGER P
8690: 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 69 74  RIMARY KEY or it
86a0: 0a 2a 2a 20 69 73 20 75 6e 69 71 75 65 20 62 79  .** is unique by
86b0: 20 76 69 72 74 75 65 20 6f 66 20 61 20 63 6f 6e   virtue of a con
86c0: 73 74 72 61 69 6e 74 20 6f 72 20 69 6d 70 6c 69  straint or impli
86d0: 63 69 74 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  cit index..**.**
86e0: 20 49 66 20 74 68 65 20 70 72 4e 6f 74 46 6f 75   If the prNotFou
86f0: 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
8700: 6e 6f 74 20 30 2c 20 74 68 65 6e 20 74 68 65 20  not 0, then the 
8710: 73 74 72 75 63 74 75 72 65 20 77 69 6c 6c 20 62  structure will b
8720: 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66  e used .** for f
8730: 61 73 74 20 73 65 74 20 6d 65 6d 62 65 72 73 68  ast set membersh
8740: 69 70 20 74 65 73 74 73 2e 20 49 6e 20 74 68 69  ip tests. In thi
8750: 73 20 63 61 73 65 20 61 6e 20 65 70 68 65 72 65  s case an ephere
8760: 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 0a  mal table must .
8770: 2a 2a 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73  ** be used unles
8780: 73 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 61 6e  s <column> is an
8790: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
87a0: 20 4b 45 59 20 6f 72 20 61 6e 20 69 6e 64 65 78   KEY or an index
87b0: 20 63 61 6e 20 0a 2a 2a 20 62 65 20 66 6f 75 6e   can .** be foun
87c0: 64 20 77 69 74 68 20 3c 63 6f 6c 75 6d 6e 3e 20  d with <column> 
87d0: 61 73 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73 74  as its left-most
87e0: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 57   column..**.** W
87f0: 68 65 6e 20 74 68 65 20 73 74 72 75 63 74 75 72  hen the structur
8800: 65 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 20  e is being used 
8810: 66 6f 72 20 73 65 74 20 6d 65 6d 62 65 72 73 68  for set membersh
8820: 69 70 20 74 65 73 74 73 2c 20 74 68 65 20 75 73  ip tests, the us
8830: 65 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 6b  er.** needs to k
8840: 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e  now whether or n
8850: 6f 74 20 74 68 65 20 73 74 72 75 63 74 75 72 65  ot the structure
8860: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 53 51 4c   contains an SQL
8870: 20 4e 55 4c 4c 20 0a 2a 2a 20 76 61 6c 75 65 20   NULL .** value 
8880: 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 72 72  in order to corr
8890: 65 63 74 6c 79 20 65 76 61 6c 75 61 74 65 20 65  ectly evaluate e
88a0: 78 70 72 65 73 73 69 6f 6e 73 20 6c 69 6b 65 20  xpressions like 
88b0: 22 58 20 49 4e 20 28 59 2c 20 5a 29 22 2e 0a 2a  "X IN (Y, Z)"..*
88c0: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
88d0: 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  chance that the 
88e0: 73 74 72 75 63 74 75 72 65 20 6d 61 79 20 63 6f  structure may co
88f0: 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 76 61 6c  ntain a NULL val
8900: 75 65 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65  ue at.** runtime
8910: 2c 20 74 68 65 6e 20 61 20 72 65 67 69 73 74 65  , then a registe
8920: 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  r is allocated a
8930: 6e 64 20 74 68 65 20 72 65 67 69 73 74 65 72 20  nd the register 
8940: 6e 75 6d 62 65 72 20 77 72 69 74 74 65 6e 0a 2a  number written.*
8950: 2a 20 74 6f 20 2a 70 72 4e 6f 74 46 6f 75 6e 64  * to *prNotFound
8960: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  . If there is no
8970: 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
8980: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
8990: 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61  ins a.** NULL va
89a0: 6c 75 65 2c 20 74 68 65 6e 20 2a 70 72 4e 6f 74  lue, then *prNot
89b0: 46 6f 75 6e 64 20 69 73 20 6c 65 66 74 20 75 6e  Found is left un
89c0: 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  changed..**.** I
89d0: 66 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20  f a register is 
89e0: 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 74  allocated and it
89f0: 73 20 6c 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65  s location store
8a00: 64 20 69 6e 20 2a 70 72 4e 6f 74 46 6f 75 6e 64  d in *prNotFound
8a10: 2c 20 74 68 65 6e 0a 2a 2a 20 69 74 73 20 69 6e  , then.** its in
8a20: 69 74 69 61 6c 20 76 61 6c 75 65 20 69 73 20 4e  itial value is N
8a30: 55 4c 4c 2e 20 49 66 20 74 68 65 20 73 74 72 75  ULL. If the stru
8a40: 63 74 75 72 65 20 64 6f 65 73 20 6e 6f 74 20 72  cture does not r
8a50: 65 6d 61 69 6e 20 63 6f 6e 73 74 61 6e 74 0a 2a  emain constant.*
8a60: 2a 20 66 6f 72 20 74 68 65 20 64 75 72 61 74 69  * for the durati
8a70: 6f 6e 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  on of the query 
8a80: 28 69 2e 65 2e 20 74 68 65 20 73 65 74 20 69 73  (i.e. the set is
8a90: 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75   a correlated su
8aa0: 62 2d 73 65 6c 65 63 74 29 2c 20 0a 2a 2a 20 74  b-select), .** t
8ab0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
8ac0: 61 6c 6c 6f 63 61 74 65 64 20 72 65 67 69 73 74  allocated regist
8ad0: 65 72 20 69 73 20 72 65 73 65 74 20 74 6f 20 4e  er is reset to N
8ae0: 55 4c 4c 20 65 61 63 68 20 74 69 6d 65 20 74 68  ULL each time th
8af0: 65 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  e .** structure 
8b00: 69 73 20 72 65 70 6f 70 75 6c 61 74 65 64 2e 20  is repopulated. 
8b10: 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20  This allows the 
8b20: 63 61 6c 6c 65 72 20 74 6f 20 75 73 65 20 76 64  caller to use vd
8b30: 62 65 20 63 6f 64 65 20 0a 2a 2a 20 65 71 75 69  be code .** equi
8b40: 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 66 6f  valent to the fo
8b50: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
8b60: 20 69 66 28 20 72 65 67 69 73 74 65 72 3d 3d 4e   if( register==N
8b70: 55 4c 4c 20 29 7b 0a 2a 2a 20 20 20 20 20 68 61  ULL ){.**     ha
8b80: 73 5f 6e 75 6c 6c 20 3d 20 3c 74 65 73 74 20 69  s_null = <test i
8b90: 66 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  f data structure
8ba0: 20 63 6f 6e 74 61 69 6e 73 20 6e 75 6c 6c 3e 0a   contains null>.
8bb0: 2a 2a 20 20 20 20 20 72 65 67 69 73 74 65 72 20  **     register 
8bc0: 3d 20 31 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a  = 1.**   }.**.**
8bd0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   in order to avo
8be0: 69 64 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 3c  id running the <
8bf0: 74 65 73 74 20 69 66 20 64 61 74 61 20 73 74 72  test if data str
8c00: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20  ucture contains 
8c10: 6e 75 6c 6c 3e 0a 2a 2a 20 74 65 73 74 20 6d 6f  null>.** test mo
8c20: 72 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 69 73  re often than is
8c30: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 23   necessary..*/.#
8c40: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8c50: 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20  IT_SUBQUERY.int 
8c60: 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64  sqlite3FindInInd
8c70: 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
8c80: 2c 20 45 78 70 72 20 2a 70 58 2c 20 69 6e 74 20  , Expr *pX, int 
8c90: 2a 70 72 4e 6f 74 46 6f 75 6e 64 29 7b 0a 20 20  *prNotFound){.  
8ca0: 53 65 6c 65 63 74 20 2a 70 3b 0a 20 20 69 6e 74  Select *p;.  int
8cb0: 20 65 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e   eType = 0;.  in
8cc0: 74 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d  t iTab = pParse-
8cd0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 6e 74 20 6d  >nTab++;.  int m
8ce0: 75 73 74 42 65 55 6e 69 71 75 65 20 3d 20 21 70  ustBeUnique = !p
8cf0: 72 4e 6f 74 46 6f 75 6e 64 3b 0a 0a 20 20 2f 2a  rNotFound;..  /*
8d00: 20 54 68 65 20 66 6f 6c 6c 77 69 6e 67 20 69 66   The follwing if
8d10: 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e  (...) expression
8d20: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
8d30: 53 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65  SELECT is of the
8d40: 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 66 6f   .  ** simple fo
8d50: 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  rm:.  **.  **   
8d60: 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e    SELECT <column
8d70: 3e 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 20  > FROM <table>. 
8d80: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   **.  ** If this
8d90: 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 69 74   is the case, it
8da0: 20 6d 61 79 20 62 65 20 70 6f 73 73 69 62 6c 65   may be possible
8db0: 20 74 6f 20 75 73 65 20 61 6e 20 65 78 69 73 74   to use an exist
8dc0: 69 6e 67 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f  ing table.  ** o
8dd0: 72 20 69 6e 64 65 78 20 69 6e 73 74 65 61 64 20  r index instead 
8de0: 6f 66 20 67 65 6e 65 72 61 74 69 6e 67 20 61 6e  of generating an
8df0: 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65   epheremal table
8e00: 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 70 58 2d  ..  */.  p = pX-
8e10: 3e 70 53 65 6c 65 63 74 3b 0a 20 20 69 66 28 20  >pSelect;.  if( 
8e20: 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e  isCandidateForIn
8e30: 4f 70 74 28 70 29 20 29 7b 0a 20 20 20 20 73 71  Opt(p) ){.    sq
8e40: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
8e50: 73 65 2d 3e 64 62 3b 0a 20 20 20 20 49 6e 64 65  se->db;.    Inde
8e60: 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 45 78 70  x *pIdx;.    Exp
8e70: 72 20 2a 70 45 78 70 72 20 3d 20 70 2d 3e 70 45  r *pExpr = p->pE
8e80: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
8e90: 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  ;.    int iCol =
8ea0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
8eb0: 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73  .    Vdbe *v = s
8ec0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
8ed0: 61 72 73 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  arse);..    /* T
8ee0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
8ef0: 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d  only called from
8f00: 20 74 77 6f 20 70 6c 61 63 65 73 2e 20 49 6e 20   two places. In 
8f10: 62 6f 74 68 20 63 61 73 65 73 20 74 68 65 20 76  both cases the v
8f20: 64 62 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 61  dbe.    ** has a
8f30: 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
8f40: 63 61 74 65 64 2e 20 53 6f 20 61 73 73 75 6d 65  cated. So assume
8f50: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
8f60: 29 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20  ) is always.    
8f70: 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 68 65  ** successful he
8f80: 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  re..    */.    a
8f90: 73 73 65 72 74 28 76 29 3b 0a 20 20 20 20 69 66  ssert(v);.    if
8fa0: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
8fb0: 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70    int iMem = ++p
8fc0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
8fd0: 20 20 20 69 6e 74 20 69 41 64 64 72 3b 0a 20 20     int iAddr;.  
8fe0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
8ff0: 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  = p->pSrc->a[0].
9000: 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20  pTab;.      int 
9010: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
9020: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
9030: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
9040: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9050: 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62  UsesBtree(v, iDb
9060: 29 3b 0a 0a 20 20 20 20 20 20 69 41 64 64 72 20  );..      iAddr 
9070: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
9080: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 69 4d  Op1(v, OP_If, iM
9090: 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  em);.      sqlit
90a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
90b0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69  OP_Integer, 1, i
90c0: 4d 65 6d 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  Mem);..      sql
90d0: 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
90e0: 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c  arse, iTab, iDb,
90f0: 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65   pTab, OP_OpenRe
9100: 61 64 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65  ad);.      eType
9110: 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49   = IN_INDEX_ROWI
9120: 44 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  D;..      sqlite
9130: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
9140: 20 69 41 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c   iAddr);.    }el
9150: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  se{.      /* The
9160: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
9170: 6e 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20  nce used by the 
9180: 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 49 66 20 61  comparison. If a
9190: 6e 20 69 6e 64 65 78 20 69 73 20 74 6f 20 0a 20  n index is to . 
91a0: 20 20 20 20 20 2a 2a 20 62 65 20 75 73 65 64 20       ** be used 
91b0: 69 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74 65  in place of a te
91c0: 6d 70 2d 74 61 62 6c 65 2c 20 69 74 20 6d 75 73  mp-table, it mus
91d0: 74 20 62 65 20 6f 72 64 65 72 65 64 20 61 63 63  t be ordered acc
91e0: 6f 72 64 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  ording.      ** 
91f0: 74 6f 20 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f  to this collatio
9200: 6e 20 73 65 71 75 65 6e 63 65 2e 0a 20 20 20 20  n sequence..    
9210: 20 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53    */.      CollS
9220: 65 71 20 2a 70 52 65 71 20 3d 20 73 71 6c 69 74  eq *pReq = sqlit
9230: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
9240: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
9250: 58 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 29  X->pLeft, pExpr)
9260: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63  ;..      /* Chec
9270: 6b 20 74 68 61 74 20 74 68 65 20 61 66 66 69 6e  k that the affin
9280: 69 74 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ity that will be
9290: 20 75 73 65 64 20 74 6f 20 70 65 72 66 6f 72 6d   used to perform
92a0: 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 63   the .      ** c
92b0: 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 68 65  omparison is the
92c0: 20 73 61 6d 65 20 61 73 20 74 68 65 20 61 66 66   same as the aff
92d0: 69 6e 69 74 79 20 6f 66 20 74 68 65 20 63 6f 6c  inity of the col
92e0: 75 6d 6e 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a  umn. If.      **
92f0: 20 69 74 20 69 73 20 6e 6f 74 2c 20 69 74 20 69   it is not, it i
9300: 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
9310: 6f 20 75 73 65 20 61 6e 79 20 69 6e 64 65 78 2e  o use any index.
9320: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
9330: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 2d  Table *pTab = p-
9340: 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62  >pSrc->a[0].pTab
9350: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 61 66 66  ;.      char aff
9360: 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66   = comparisonAff
9370: 69 6e 69 74 79 28 70 58 29 3b 0a 20 20 20 20 20  inity(pX);.     
9380: 20 69 6e 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b   int affinity_ok
9390: 20 3d 20 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69   = (pTab->aCol[i
93a0: 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 61  Col].affinity==a
93b0: 66 66 7c 7c 61 66 66 3d 3d 53 51 4c 49 54 45 5f  ff||aff==SQLITE_
93c0: 41 46 46 5f 4e 4f 4e 45 29 3b 0a 0a 20 20 20 20  AFF_NONE);..    
93d0: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
93e0: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 20 26 26  >pIndex; pIdx &&
93f0: 20 65 54 79 70 65 3d 3d 30 20 26 26 20 61 66 66   eType==0 && aff
9400: 69 6e 69 74 79 5f 6f 6b 3b 20 70 49 64 78 3d 70  inity_ok; pIdx=p
9410: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
9420: 20 20 20 20 20 69 66 28 20 28 70 49 64 78 2d 3e       if( (pIdx->
9430: 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f  aiColumn[0]==iCo
9440: 6c 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  l).         && (
9450: 70 52 65 71 3d 3d 73 71 6c 69 74 65 33 46 69 6e  pReq==sqlite3Fin
9460: 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43  dCollSeq(db, ENC
9470: 28 64 62 29 2c 20 70 49 64 78 2d 3e 61 7a 43 6f  (db), pIdx->azCo
9480: 6c 6c 5b 30 5d 2c 20 2d 31 2c 20 30 29 29 0a 20  ll[0], -1, 0)). 
9490: 20 20 20 20 20 20 20 20 26 26 20 28 21 6d 75 73          && (!mus
94a0: 74 42 65 55 6e 69 71 75 65 20 7c 7c 20 28 70 49  tBeUnique || (pI
94b0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 26  dx->nColumn==1 &
94c0: 26 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  & pIdx->onError!
94d0: 3d 4f 45 5f 4e 6f 6e 65 29 29 0a 20 20 20 20 20  =OE_None)).     
94e0: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
94f0: 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20  int iDb;.       
9500: 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b     int iMem = ++
9510: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
9520: 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 64 64          int iAdd
9530: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  r;.          cha
9540: 72 20 2a 70 4b 65 79 3b 0a 20 20 0a 20 20 20 20  r *pKey;.  .    
9550: 20 20 20 20 20 20 70 4b 65 79 20 3d 20 28 63 68        pKey = (ch
9560: 61 72 20 2a 29 73 71 6c 69 74 65 33 49 6e 64 65  ar *)sqlite3Inde
9570: 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c  xKeyinfo(pParse,
9580: 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
9590: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
95a0: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
95b0: 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 29 3b   pIdx->pSchema);
95c0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
95d0: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
95e0: 76 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20 20 20  v, iDb);..      
95f0: 20 20 20 20 69 41 64 64 72 20 3d 20 73 71 6c 69      iAddr = sqli
9600: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
9610: 20 4f 50 5f 49 66 2c 20 69 4d 65 6d 29 3b 0a 20   OP_If, iMem);. 
9620: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9630: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
9640: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 4d 65  _Integer, 1, iMe
9650: 6d 29 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20  m);.  .         
9660: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9670: 70 32 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43  p2(v, OP_SetNumC
9680: 6f 6c 75 6d 6e 73 2c 20 30 2c 20 70 49 64 78 2d  olumns, 0, pIdx-
9690: 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  >nColumn);.     
96a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
96b0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
96c0: 6e 52 65 61 64 2c 20 69 54 61 62 2c 20 70 49 64  nRead, iTab, pId
96d0: 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20 20  x->tnum, iDb,.  
96e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4b 65               pKe
9700: 79 2c 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  y,P4_KEYINFO_HAN
9710: 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 20 20 20  DOFF);.         
9720: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
9730: 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61   "%s", pIdx->zNa
9740: 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  me));.          
9750: 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
9760: 5f 49 4e 44 45 58 3b 0a 0a 20 20 20 20 20 20 20  _INDEX;..       
9770: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
9780: 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29  mpHere(v, iAddr)
9790: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
97a0: 70 72 4e 6f 74 46 6f 75 6e 64 20 26 26 20 21 70  prNotFound && !p
97b0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
97c0: 6e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  notNull ){.     
97d0: 20 20 20 20 20 20 20 2a 70 72 4e 6f 74 46 6f 75         *prNotFou
97e0: 6e 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  nd = ++pParse->n
97f0: 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  Mem;.          }
9800: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9810: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
9820: 69 66 28 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a  if( eType==0 ){.
9830: 20 20 20 20 69 6e 74 20 72 4d 61 79 48 61 76 65      int rMayHave
9840: 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 65 54  Null = 0;.    eT
9850: 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 45  ype = IN_INDEX_E
9860: 50 48 3b 0a 20 20 20 20 69 66 28 20 70 72 4e 6f  PH;.    if( prNo
9870: 74 46 6f 75 6e 64 20 29 7b 0a 20 20 20 20 20 20  tFound ){.      
9880: 2a 70 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 72 4d  *prNotFound = rM
9890: 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70  ayHaveNull = ++p
98a0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
98b0: 20 7d 65 6c 73 65 20 69 66 28 20 70 58 2d 3e 70   }else if( pX->p
98c0: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  Left->iColumn<0 
98d0: 26 26 20 70 58 2d 3e 70 53 65 6c 65 63 74 3d 3d  && pX->pSelect==
98e0: 30 20 29 7b 0a 20 20 20 20 20 20 65 54 79 70 65  0 ){.      eType
98f0: 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49   = IN_INDEX_ROWI
9900: 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  D;.    }.    sql
9910: 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
9920: 74 28 70 50 61 72 73 65 2c 20 70 58 2c 20 72 4d  t(pParse, pX, rM
9930: 61 79 48 61 76 65 4e 75 6c 6c 2c 20 65 54 79 70  ayHaveNull, eTyp
9940: 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49  e==IN_INDEX_ROWI
9950: 44 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  D);.  }else{.   
9960: 20 70 58 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54   pX->iTable = iT
9970: 61 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ab;.  }.  return
9980: 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69 66   eType;.}.#endif
9990: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
99a0: 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61 72   code for scalar
99b0: 20 73 75 62 71 75 65 72 69 65 73 20 75 73 65 64   subqueries used
99c0: 20 61 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f   as an expressio
99d0: 6e 0a 2a 2a 20 61 6e 64 20 49 4e 20 6f 70 65 72  n.** and IN oper
99e0: 61 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65 73  ators.  Examples
99f0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c  :.**.**     (SEL
9a00: 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20  ECT a FROM b)   
9a10: 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65         -- subque
9a20: 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53  ry.**     EXISTS
9a30: 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
9a40: 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73  b)   -- EXISTS s
9a50: 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 78  ubquery.**     x
9a60: 20 49 4e 20 28 34 2c 35 2c 31 31 29 20 20 20 20   IN (4,5,11)    
9a70: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 49 4e 20            -- IN 
9a80: 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 6c 69  operator with li
9a90: 73 74 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64  st on right-hand
9aa0: 20 73 69 64 65 0a 2a 2a 20 20 20 20 20 78 20 49   side.**     x I
9ab0: 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  N (SELECT a FROM
9ac0: 20 62 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70   b)     -- IN op
9ad0: 65 72 61 74 6f 72 20 77 69 74 68 20 73 75 62 71  erator with subq
9ae0: 75 65 72 79 20 6f 6e 20 74 68 65 20 72 69 67 68  uery on the righ
9af0: 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70  t.**.** The pExp
9b00: 72 20 70 61 72 61 6d 65 74 65 72 20 64 65 73 63  r parameter desc
9b10: 72 69 62 65 73 20 74 68 65 20 65 78 70 72 65 73  ribes the expres
9b20: 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69  sion that contai
9b30: 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65  ns the IN.** ope
9b40: 72 61 74 6f 72 20 6f 72 20 73 75 62 71 75 65 72  rator or subquer
9b50: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  y..**.** If para
9b60: 6d 65 74 65 72 20 69 73 52 6f 77 69 64 20 69 73  meter isRowid is
9b70: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
9b80: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
9b90: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a   is guaranteed.*
9ba0: 2a 20 74 6f 20 62 65 20 6f 66 20 74 68 65 20 66  * to be of the f
9bb0: 6f 72 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e 20  orm "<rowid> IN 
9bc0: 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65 72  (?, ?, ?)", wher
9bd0: 65 20 3c 72 6f 77 69 64 3e 20 69 73 20 61 20 72  e <rowid> is a r
9be0: 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 73  eference.** to s
9bf0: 6f 6d 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20  ome integer key 
9c00: 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c  column of a tabl
9c10: 65 20 42 2d 54 72 65 65 2e 20 49 6e 20 74 68 69  e B-Tree. In thi
9c20: 73 20 63 61 73 65 2c 20 75 73 65 20 61 6e 0a 2a  s case, use an.*
9c30: 2a 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 20  * intkey B-Tree 
9c40: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74  to store the set
9c50: 20 6f 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c 75   of IN(...) valu
9c60: 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  es instead of th
9c70: 65 20 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77  e usual.** (slow
9c80: 65 72 29 20 76 61 72 69 61 62 6c 65 20 6c 65 6e  er) variable len
9c90: 67 74 68 20 6b 65 79 73 20 42 2d 54 72 65 65 2e  gth keys B-Tree.
9ca0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
9cb0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
9cc0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64  .void sqlite3Cod
9cd0: 65 53 75 62 73 65 6c 65 63 74 28 0a 20 20 50 61  eSubselect(.  Pa
9ce0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20  rse *pParse, .  
9cf0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 0a 20 20  Expr *pExpr, .  
9d00: 69 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c  int rMayHaveNull
9d10: 2c 0a 20 20 69 6e 74 20 69 73 52 6f 77 69 64 0a  ,.  int isRowid.
9d20: 29 7b 0a 20 20 69 6e 74 20 74 65 73 74 41 64 64  ){.  int testAdd
9d30: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
9d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9d50: 4f 6e 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64  One-time test ad
9d60: 64 72 65 73 73 20 2a 2f 0a 20 20 56 64 62 65 20  dress */.  Vdbe 
9d70: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
9d80: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
9d90: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
9da0: 3b 0a 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f  ;...  /* This co
9db0: 64 65 20 6d 75 73 74 20 62 65 20 72 75 6e 20 69  de must be run i
9dc0: 6e 20 69 74 73 20 65 6e 74 69 72 65 74 79 20 65  n its entirety e
9dd0: 76 65 72 79 20 74 69 6d 65 20 69 74 20 69 73 20  very time it is 
9de0: 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a  encountered.  **
9df0: 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   if any of the f
9e00: 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65  ollowing is true
9e10: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a  :.  **.  **    *
9e20: 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64    The right-hand
9e30: 20 73 69 64 65 20 69 73 20 61 20 63 6f 72 72 65   side is a corre
9e40: 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 0a 20  lated subquery. 
9e50: 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69   **    *  The ri
9e60: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
9e70: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
9e80: 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76  ist containing v
9e90: 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20  ariables.  **   
9ea0: 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69 64   *  We are insid
9eb0: 65 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a  e a trigger.  **
9ec0: 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20  .  ** If all of 
9ed0: 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 66 61  the above are fa
9ee0: 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e  lse, then we can
9ef0: 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a   run this code j
9f00: 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61  ust once.  ** sa
9f10: 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20  ve the results, 
9f20: 61 6e 64 20 72 65 75 73 65 20 74 68 65 20 73 61  and reuse the sa
9f30: 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62  me result on sub
9f40: 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69  sequent invocati
9f50: 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
9f60: 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65  !ExprHasAnyPrope
9f70: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61  rty(pExpr, EP_Va
9f80: 72 53 65 6c 65 63 74 29 20 26 26 20 21 70 50 61  rSelect) && !pPa
9f90: 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 29  rse->trigStack )
9fa0: 7b 0a 20 20 20 20 69 6e 74 20 6d 65 6d 20 3d 20  {.    int mem = 
9fb0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
9fc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9fd0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp1(v, OP_If, 
9fe0: 6d 65 6d 29 3b 0a 20 20 20 20 74 65 73 74 41 64  mem);.    testAd
9ff0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
a000: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
a010: 65 67 65 72 2c 20 31 2c 20 6d 65 6d 29 3b 0a 20  eger, 1, mem);. 
a020: 20 20 20 61 73 73 65 72 74 28 20 74 65 73 74 41     assert( testA
a030: 64 64 72 3e 30 20 7c 7c 20 70 50 61 72 73 65 2d  ddr>0 || pParse-
a040: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
a050: 64 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74  d );.  }..  swit
a060: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
a070: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
a080: 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 61 66   {.      char af
a090: 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 4b 65  finity;.      Ke
a0a0: 79 49 6e 66 6f 20 6b 65 79 49 6e 66 6f 3b 0a 20  yInfo keyInfo;. 
a0b0: 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 20 20       int addr;  
a0c0: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
a0d0: 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d   of OP_OpenEphem
a0e0: 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  eral instruction
a0f0: 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
a100: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
a110: 4c 65 66 74 3b 0a 0a 20 20 20 20 20 20 69 66 28  Left;..      if(
a120: 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 29 7b   rMayHaveNull ){
a130: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a140: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
a150: 5f 4e 75 6c 6c 2c 20 30 2c 20 72 4d 61 79 48 61  _Null, 0, rMayHa
a160: 76 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d  veNull);.      }
a170: 0a 0a 20 20 20 20 20 20 61 66 66 69 6e 69 74 79  ..      affinity
a180: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
a190: 66 69 6e 69 74 79 28 70 4c 65 66 74 29 3b 0a 0a  finity(pLeft);..
a1a0: 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72        /* Whether
a1b0: 20 74 68 69 73 20 69 73 20 61 6e 20 27 78 20 49   this is an 'x I
a1c0: 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72  N(SELECT...)' or
a1d0: 20 61 6e 20 27 78 20 49 4e 28 3c 65 78 70 72 6c   an 'x IN(<exprl
a1e0: 69 73 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20  ist>)'.      ** 
a1f0: 65 78 70 72 65 73 73 69 6f 6e 20 69 74 20 69 73  expression it is
a200: 20 68 61 6e 64 6c 65 64 20 74 68 65 20 73 61 6d   handled the sam
a210: 65 20 77 61 79 2e 20 41 20 76 69 72 74 75 61 6c  e way. A virtual
a220: 20 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20   table is .     
a230: 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20   ** filled with 
a240: 73 69 6e 67 6c 65 2d 66 69 65 6c 64 20 69 6e 64  single-field ind
a250: 65 78 20 6b 65 79 73 20 72 65 70 72 65 73 65 6e  ex keys represen
a260: 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73  ting the results
a270: 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74  .      ** from t
a280: 68 65 20 53 45 4c 45 43 54 20 6f 72 20 74 68 65  he SELECT or the
a290: 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20   <exprlist>..   
a2a0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
a2b0: 66 20 74 68 65 20 27 78 27 20 65 78 70 72 65 73  f the 'x' expres
a2c0: 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  sion is a column
a2d0: 20 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20 53   value, or the S
a2e0: 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a  ELECT....      *
a2f0: 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75  * statement retu
a300: 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c  rns a column val
a310: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66  ue, then the aff
a320: 69 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20 20  inity of that.  
a330: 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73      ** column is
a340: 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74   used to build t
a350: 68 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49  he index keys. I
a360: 66 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74  f both 'x' and t
a370: 68 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45  he.      ** SELE
a380: 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20  CT... statement 
a390: 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  are columns, the
a3a0: 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  n numeric affini
a3b0: 74 79 20 69 73 20 75 73 65 64 0a 20 20 20 20 20  ty is used.     
a3c0: 20 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f   ** if either co
a3d0: 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43  lumn has NUMERIC
a3e0: 20 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66 69   or INTEGER affi
a3f0: 6e 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72  nity. If neither
a400: 0a 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f  .      ** 'x' no
a410: 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20  r the SELECT... 
a420: 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f  statement are co
a430: 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65  lumns, then nume
a440: 72 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20 20  ric affinity.   
a450: 20 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20     ** is used.. 
a460: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45       */.      pE
a470: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50  xpr->iTable = pP
a480: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
a490: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
a4a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
a4b0: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
a4c0: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
a4d0: 20 21 69 73 52 6f 77 69 64 29 3b 0a 20 20 20 20   !isRowid);.    
a4e0: 20 20 6d 65 6d 73 65 74 28 26 6b 65 79 49 6e 66    memset(&keyInf
a4f0: 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79  o, 0, sizeof(key
a500: 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 6b 65  Info));.      ke
a510: 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 31  yInfo.nField = 1
a520: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  ;..      if( pEx
a530: 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  pr->pSelect ){. 
a540: 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31         /* Case 1
a550: 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 53  :     expr IN (S
a560: 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20  ELECT ...).     
a570: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
a580: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
a590: 6f 20 77 72 69 74 65 20 74 68 65 20 72 65 73 75  o write the resu
a5a0: 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  lts of the selec
a5b0: 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f  t into the tempo
a5c0: 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  rary.        ** 
a5d0: 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20  table allocated 
a5e0: 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f 76 65  and opened above
a5f0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
a600: 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
a610: 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20 45 78  dest;.        Ex
a620: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
a630: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
a640: 20 21 69 73 52 6f 77 69 64 20 29 3b 0a 20 20 20   !isRowid );.   
a650: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
a660: 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
a670: 2c 20 53 52 54 5f 53 65 74 2c 20 70 45 78 70 72  , SRT_Set, pExpr
a680: 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  ->iTable);.     
a690: 20 20 20 64 65 73 74 2e 61 66 66 69 6e 69 74 79     dest.affinity
a6a0: 20 3d 20 28 69 6e 74 29 61 66 66 69 6e 69 74 79   = (int)affinity
a6b0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
a6c0: 28 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  ( (pExpr->iTable
a6d0: 26 30 78 30 30 30 30 46 46 46 46 29 3d 3d 70 45  &0x0000FFFF)==pE
a6e0: 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20  xpr->iTable );. 
a6f0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
a700: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
a710: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c   pExpr->pSelect,
a720: 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20   &dest) ){.     
a730: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
a740: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
a750: 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70  EList = pExpr->p
a760: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a  Select->pEList;.
a770: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 4c 69          if( pELi
a780: 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
a790: 78 70 72 3e 30 20 29 7b 20 0a 20 20 20 20 20 20  xpr>0 ){ .      
a7a0: 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c      keyInfo.aCol
a7b0: 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 42 69  l[0] = sqlite3Bi
a7c0: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
a7d0: 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
a7e0: 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20 20 20  ->pLeft,.       
a7f0: 20 20 20 20 20 20 20 70 45 4c 69 73 74 2d 3e 61         pEList->a
a800: 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
a810: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
a820: 65 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 69  e if( pExpr->pLi
a830: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  st ){.        /*
a840: 20 43 61 73 65 20 32 3a 20 20 20 20 20 65 78 70   Case 2:     exp
a850: 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a  r IN (exprlist).
a860: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
a870: 20 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 65     ** For each e
a880: 78 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64  xpression, build
a890: 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72   an index key fr
a8a0: 6f 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f  om the evaluatio
a8b0: 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  n and.        **
a8c0: 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65   store it in the
a8d0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
a8e0: 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61  . If <expr> is a
a8f0: 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73   column, then us
a900: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  e.        ** tha
a910: 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69  t columns affini
a920: 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67  ty when building
a930: 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20   index keys. If 
a940: 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20  <expr> is not.  
a950: 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d        ** a colum
a960: 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61  n, use numeric a
a970: 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 20 20 20  ffinity..       
a980: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
a990: 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c  i;.        ExprL
a9a0: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
a9b0: 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20  pr->pList;.     
a9c0: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
a9d0: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
a9e0: 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20          int r1, 
a9f0: 72 32 2c 20 72 33 3b 0a 0a 20 20 20 20 20 20 20  r2, r3;..       
aa00: 20 69 66 28 20 21 61 66 66 69 6e 69 74 79 20 29   if( !affinity )
aa10: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 69  {.          affi
aa20: 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46  nity = SQLITE_AF
aa30: 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  F_NONE;.        
aa40: 7d 0a 20 20 20 20 20 20 20 20 6b 65 79 49 6e 66  }.        keyInf
aa50: 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c  o.aColl[0] = sql
aa60: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
aa70: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
aa80: 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20 20 20 20  Left);..        
aa90: 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
aaa0: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20  each expression 
aab0: 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a  in <exprlist>. *
aac0: 2f 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73  /.        r1 = s
aad0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
aae0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
aaf0: 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65    r2 = sqlite3Ge
ab00: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
ab10: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
ab20: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
ab30: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32 29 3b 0a  P_Null, 0, r2);.
ab40: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4c          for(i=pL
ab50: 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  ist->nExpr, pIte
ab60: 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b  m=pList->a; i>0;
ab70: 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
ab80: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
ab90: 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78  pE2 = pItem->pEx
aba0: 70 72 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f  pr;..          /
abb0: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
abc0: 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74  ion is not const
abd0: 61 6e 74 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  ant then we will
abe0: 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20   need to.       
abf0: 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68     ** disable th
ac00: 65 20 74 65 73 74 20 74 68 61 74 20 77 61 73 20  e test that was 
ac10: 67 65 6e 65 72 61 74 65 64 20 61 62 6f 76 65 20  generated above 
ac20: 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65 0a  that makes sure.
ac30: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69            ** thi
ac40: 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63  s code only exec
ac50: 75 74 65 73 20 6f 6e 63 65 2e 20 20 42 65 63 61  utes once.  Beca
ac60: 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f  use for a non-co
ac70: 6e 73 74 61 6e 74 0a 20 20 20 20 20 20 20 20 20  nstant.         
ac80: 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77   ** expression w
ac90: 65 20 6e 65 65 64 20 74 6f 20 72 65 72 75 6e 20  e need to rerun 
aca0: 74 68 69 73 20 63 6f 64 65 20 65 61 63 68 20 74  this code each t
acb0: 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ime..          *
acc0: 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
acd0: 74 65 73 74 41 64 64 72 20 26 26 20 21 73 71 6c  testAddr && !sql
ace0: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
acf0: 6e 74 28 70 45 32 29 20 29 7b 0a 20 20 20 20 20  nt(pE2) ){.     
ad00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ad10: 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
ad20: 2c 20 74 65 73 74 41 64 64 72 2d 31 2c 20 32 29  , testAddr-1, 2)
ad30: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ;.            te
ad40: 73 74 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20  stAddr = 0;.    
ad50: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
ad60: 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74     /* Evaluate t
ad70: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  he expression an
ad80: 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f  d insert it into
ad90: 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20   the temp table 
ada0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  */.          pPa
adb0: 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43  rse->disableColC
adc0: 61 63 68 65 2b 2b 3b 0a 20 20 20 20 20 20 20 20  ache++;.        
add0: 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33 45 78    r3 = sqlite3Ex
ade0: 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
adf0: 72 73 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a 20  rse, pE2, r1);. 
ae00: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
ae10: 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65   pParse->disable
ae20: 43 6f 6c 43 61 63 68 65 3e 30 20 29 3b 0a 20 20  ColCache>0 );.  
ae30: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
ae40: 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d  disableColCache-
ae50: 2d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66  -;..          if
ae60: 28 20 69 73 52 6f 77 69 64 20 29 7b 0a 20 20 20  ( isRowid ){.   
ae70: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ae80: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
ae90: 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 33 2c 20  _MustBeInt, r3, 
aea0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
aeb0: 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20  ntAddr(v)+2);.  
aec0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
aed0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
aee0: 50 5f 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d  P_Insert, pExpr-
aef0: 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 72 33 29  >iTable, r2, r3)
af00: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
af10: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
af20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
af30: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
af40: 64 2c 20 72 33 2c 20 31 2c 20 72 32 2c 20 26 61  d, r3, 1, r2, &a
af50: 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20  ffinity, 1);.   
af60: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
af70: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
af80: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
af90: 72 33 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  r3, 1);.        
afa0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
afb0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
afc0: 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54  nsert, pExpr->iT
afd0: 61 62 6c 65 2c 20 72 32 29 3b 0a 20 20 20 20 20  able, r2);.     
afe0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
aff0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b000: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
b010: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
b020: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
b030: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
b040: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , r2);.      }. 
b050: 20 20 20 20 20 69 66 28 20 21 69 73 52 6f 77 69       if( !isRowi
b060: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  d ){.        sql
b070: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
b080: 28 76 2c 20 61 64 64 72 2c 20 28 76 6f 69 64 20  (v, addr, (void 
b090: 2a 29 26 6b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)&keyInfo, P4_K
b0a0: 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d  EYINFO);.      }
b0b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b0c0: 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b    }..    case TK
b0d0: 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73  _EXISTS:.    cas
b0e0: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
b0f0: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 73       /* This has
b100: 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72 20   to be a scalar 
b110: 53 45 4c 45 43 54 2e 20 20 47 65 6e 65 72 61 74  SELECT.  Generat
b120: 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74 68  e code to put th
b130: 65 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65  e.      ** value
b140: 20 6f 66 20 74 68 69 73 20 73 65 6c 65 63 74 20   of this select 
b150: 69 6e 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  in a memory cell
b160: 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65 20   and record the 
b170: 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20  number.      ** 
b180: 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  of the memory ce
b190: 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20  ll in iColumn.. 
b1a0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74       */.      st
b1b0: 61 74 69 63 20 63 6f 6e 73 74 20 54 6f 6b 65 6e  atic const Token
b1c0: 20 6f 6e 65 20 3d 20 7b 20 28 75 38 2a 29 22 31   one = { (u8*)"1
b1d0: 22 2c 20 30 2c 20 31 20 7d 3b 0a 20 20 20 20 20  ", 0, 1 };.     
b1e0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20   Select *pSel;. 
b1f0: 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
b200: 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 70 53 65  dest;..      pSe
b210: 6c 20 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  l = pExpr->pSele
b220: 63 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ct;.      sqlite
b230: 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
b240: 26 64 65 73 74 2c 20 30 2c 20 2b 2b 70 50 61 72  &dest, 0, ++pPar
b250: 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20  se->nMem);.     
b260: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
b270: 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20  TK_SELECT ){.   
b280: 20 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20       dest.eDest 
b290: 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20  = SRT_Mem;.     
b2a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b2b0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
b2c0: 20 30 2c 20 64 65 73 74 2e 69 50 61 72 6d 29 3b   0, dest.iParm);
b2d0: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
b2e0: 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 73  ment((v, "Init s
b2f0: 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 22 29  ubquery result")
b300: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
b310: 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65          dest.eDe
b320: 73 74 20 3d 20 53 52 54 5f 45 78 69 73 74 73 3b  st = SRT_Exists;
b330: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b340: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
b350: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 64 65 73  _Integer, 0, des
b360: 74 2e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  t.iParm);.      
b370: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
b380: 2c 20 22 49 6e 69 74 20 45 58 49 53 54 53 20 72  , "Init EXISTS r
b390: 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20  esult"));.      
b3a0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
b3b0: 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
b3c0: 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d  ->db, pSel->pLim
b3d0: 69 74 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d  it);.      pSel-
b3e0: 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65  >pLimit = sqlite
b3f0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
b400: 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c  K_INTEGER, 0, 0,
b410: 20 26 6f 6e 65 29 3b 0a 20 20 20 20 20 20 69 66   &one);.      if
b420: 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  ( sqlite3Select(
b430: 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 26 64  pParse, pSel, &d
b440: 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  est) ){.        
b450: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
b460: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
b470: 6c 75 6d 6e 20 3d 20 64 65 73 74 2e 69 50 61 72  lumn = dest.iPar
b480: 6d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  m;.      break;.
b490: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
b4a0: 20 74 65 73 74 41 64 64 72 20 29 7b 0a 20 20 20   testAddr ){.   
b4b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
b4c0: 48 65 72 65 28 76 2c 20 74 65 73 74 41 64 64 72  Here(v, testAddr
b4d0: 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  -1);.  }..  retu
b4e0: 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rn;.}.#endif /* 
b4f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
b500: 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44  UERY */../*.** D
b510: 75 70 6c 69 63 61 74 65 20 61 6e 20 38 2d 62 79  uplicate an 8-by
b520: 74 65 20 76 61 6c 75 65 0a 2a 2f 0a 73 74 61 74  te value.*/.stat
b530: 69 63 20 63 68 61 72 20 2a 64 75 70 38 62 79 74  ic char *dup8byt
b540: 65 73 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73  es(Vdbe *v, cons
b550: 74 20 63 68 61 72 20 2a 69 6e 29 7b 0a 20 20 63  t char *in){.  c
b560: 68 61 72 20 2a 6f 75 74 20 3d 20 73 71 6c 69 74  har *out = sqlit
b570: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 73 71  e3DbMallocRaw(sq
b580: 6c 69 74 65 33 56 64 62 65 44 62 28 76 29 2c 20  lite3VdbeDb(v), 
b590: 38 29 3b 0a 20 20 69 66 28 20 6f 75 74 20 29 7b  8);.  if( out ){
b5a0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 6f 75 74 2c  .    memcpy(out,
b5b0: 20 69 6e 2c 20 38 29 3b 0a 20 20 7d 0a 20 20 72   in, 8);.  }.  r
b5c0: 65 74 75 72 6e 20 6f 75 74 3b 0a 7d 0a 0a 2f 2a  eturn out;.}../*
b5d0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20  .** Generate an 
b5e0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
b5f0: 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 66 6c   will put the fl
b600: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20  oating point.** 
b610: 76 61 6c 75 65 20 64 65 73 63 72 69 62 65 64 20  value described 
b620: 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74  by z[0..n-1] int
b630: 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e  o register iMem.
b640: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73  .**.** The z[] s
b650: 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61  tring will proba
b660: 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d  bly not be zero-
b670: 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74  terminated.  But
b680: 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68   the .** z[n] ch
b690: 61 72 61 63 74 65 72 20 69 73 20 67 75 61 72 61  aracter is guara
b6a0: 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65  nteed to be some
b6b0: 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20  thing that does 
b6c0: 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65  not look.** like
b6d0: 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f   the continuatio
b6e0: 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e  n of the number.
b6f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b700: 63 6f 64 65 52 65 61 6c 28 56 64 62 65 20 2a 76  codeReal(Vdbe *v
b710: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  , const char *z,
b720: 20 69 6e 74 20 6e 2c 20 69 6e 74 20 6e 65 67 61   int n, int nega
b730: 74 65 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d  teFlag, int iMem
b740: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 7a 20 7c  ){.  assert( z |
b750: 7c 20 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  | v==0 || sqlite
b760: 33 56 64 62 65 44 62 28 76 29 2d 3e 6d 61 6c 6c  3VdbeDb(v)->mall
b770: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
b780: 28 20 7a 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c  ( z ){.    doubl
b790: 65 20 76 61 6c 75 65 3b 0a 20 20 20 20 63 68 61  e value;.    cha
b7a0: 72 20 2a 7a 56 3b 0a 20 20 20 20 61 73 73 65 72  r *zV;.    asser
b7b0: 74 28 20 21 69 73 64 69 67 69 74 28 7a 5b 6e 5d  t( !isdigit(z[n]
b7c0: 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
b7d0: 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 29 3b  AtoF(z, &value);
b7e0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
b7f0: 49 73 4e 61 4e 28 76 61 6c 75 65 29 20 29 7b 0a  IsNaN(value) ){.
b800: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b810: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
b820: 6c 6c 2c 20 30 2c 20 69 4d 65 6d 29 3b 0a 20 20  ll, 0, iMem);.  
b830: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
b840: 66 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29 20  f( negateFlag ) 
b850: 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a  value = -value;.
b860: 20 20 20 20 20 20 7a 56 20 3d 20 64 75 70 38 62        zV = dup8b
b870: 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a 29 26  ytes(v, (char*)&
b880: 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 73 71  value);.      sq
b890: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
b8a0: 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69  v, OP_Real, 0, i
b8b0: 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 52  Mem, 0, zV, P4_R
b8c0: 45 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  EAL);.    }.  }.
b8d0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
b8e0: 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f  te an instructio
b8f0: 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20  n that will put 
b900: 74 68 65 20 69 6e 74 65 67 65 72 20 64 65 73 63  the integer desc
b910: 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74 20  ribe by.** text 
b920: 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72  z[0..n-1] into r
b930: 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a  egister iMem..**
b940: 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69  .** The z[] stri
b950: 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79  ng will probably
b960: 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72   not be zero-ter
b970: 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68  minated.  But th
b980: 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61  e .** z[n] chara
b990: 63 74 65 72 20 69 73 20 67 75 61 72 61 6e 74 65  cter is guarante
b9a0: 65 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69  ed to be somethi
b9b0: 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ng that does not
b9c0: 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68   look.** like th
b9d0: 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f  e continuation o
b9e0: 66 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f  f the number..*/
b9f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
ba00: 65 49 6e 74 65 67 65 72 28 56 64 62 65 20 2a 76  eInteger(Vdbe *v
ba10: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
ba20: 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20  nt negFlag, int 
ba30: 69 4d 65 6d 29 7b 0a 20 20 63 6f 6e 73 74 20 63  iMem){.  const c
ba40: 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 70 45  har *z;.  if( pE
ba50: 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
ba60: 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  IntValue ){.    
ba70: 69 6e 74 20 69 20 3d 20 70 45 78 70 72 2d 3e 69  int i = pExpr->i
ba80: 54 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 6e  Table;.    if( n
ba90: 65 67 46 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b  egFlag ) i = -i;
baa0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
bab0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
bac0: 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a  eger, i, iMem);.
bad0: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 7a 20 3d    }else if( (z =
bae0: 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74   (char*)pExpr->t
baf0: 6f 6b 65 6e 2e 7a 29 21 3d 30 20 29 7b 0a 20 20  oken.z)!=0 ){.  
bb00: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
bb10: 20 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65   n = pExpr->toke
bb20: 6e 2e 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28  n.n;.    assert(
bb30: 20 21 69 73 64 69 67 69 74 28 7a 5b 6e 5d 29 20   !isdigit(z[n]) 
bb40: 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
bb50: 65 33 47 65 74 49 6e 74 33 32 28 7a 2c 20 26 69  e3GetInt32(z, &i
bb60: 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  ) ){.      if( n
bb70: 65 67 46 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b  egFlag ) i = -i;
bb80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
bb90: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
bba0: 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29  nteger, i, iMem)
bbb0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
bbc0: 73 71 6c 69 74 65 33 46 69 74 73 49 6e 36 34 42  sqlite3FitsIn64B
bbd0: 69 74 73 28 7a 2c 20 6e 65 67 46 6c 61 67 29 20  its(z, negFlag) 
bbe0: 29 7b 0a 20 20 20 20 20 20 69 36 34 20 76 61 6c  ){.      i64 val
bbf0: 75 65 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  ue;.      char *
bc00: 7a 56 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  zV;.      sqlite
bc10: 33 41 74 6f 69 36 34 28 7a 2c 20 26 76 61 6c 75  3Atoi64(z, &valu
bc20: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  e);.      if( ne
bc30: 67 46 6c 61 67 20 29 20 76 61 6c 75 65 20 3d 20  gFlag ) value = 
bc40: 2d 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 7a 56  -value;.      zV
bc50: 20 3d 20 64 75 70 38 62 79 74 65 73 28 76 2c 20   = dup8bytes(v, 
bc60: 28 63 68 61 72 2a 29 26 76 61 6c 75 65 29 3b 0a  (char*)&value);.
bc70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
bc80: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 49 6e  eAddOp4(v, OP_In
bc90: 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c  t64, 0, iMem, 0,
bca0: 20 7a 56 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a   zV, P4_INT64);.
bcb0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
bcc0: 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a 2c 20   codeReal(v, z, 
bcd0: 6e 2c 20 6e 65 67 46 6c 61 67 2c 20 69 4d 65 6d  n, negFlag, iMem
bce0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
bcf0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
bd00: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
bd10: 78 74 72 61 63 74 20 74 68 65 20 69 43 6f 6c 75  xtract the iColu
bd20: 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f  mn-th column fro
bd30: 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61 62 20  m.** table pTab 
bd40: 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 63 6f  and store the co
bd50: 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 61 20  lumn value in a 
bd60: 72 65 67 69 73 74 65 72 2e 20 20 41 6e 20 65 66  register.  An ef
bd70: 66 6f 72 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20  fort.** is made 
bd80: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c  to store the col
bd90: 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72 65 67  umn value in reg
bda0: 69 73 74 65 72 20 69 52 65 67 2c 20 62 75 74 20  ister iReg, but 
bdb0: 74 68 69 73 20 69 73 0a 2a 2a 20 6e 6f 74 20 67  this is.** not g
bdc0: 75 61 72 61 6e 74 65 65 64 2e 20 20 54 68 65 20  uaranteed.  The 
bdd0: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  location of the 
bde0: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20  column value is 
bdf0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
be00: 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e  There must be an
be10: 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 6f 20   open cursor to 
be20: 70 54 61 62 20 69 6e 20 69 54 61 62 6c 65 20 77  pTab in iTable w
be30: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
be40: 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 20  .** is called.  
be50: 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68 65  If iColumn<0 the
be60: 6e 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61  n code is genera
be70: 74 65 64 20 74 68 61 74 20 65 78 74 72 61 63 74  ted that extract
be80: 73 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2a 0a  s the rowid..**.
be90: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
bea0: 6d 69 67 68 74 20 61 74 74 65 6d 70 74 20 74 6f  might attempt to
beb0: 20 72 65 75 73 65 20 74 68 65 20 76 61 6c 75 65   reuse the value
bec0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74   of the column t
bed0: 68 61 74 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61  hat.** has alrea
bee0: 64 79 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 69  dy been loaded i
bef0: 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 2e 20  nto a register. 
bf00: 20 54 68 65 20 76 61 6c 75 65 20 77 69 6c 6c 20   The value will 
bf10: 61 6c 77 61 79 73 0a 2a 2a 20 62 65 20 75 73 65  always.** be use
bf20: 64 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20  d if it has not 
bf30: 75 6e 64 65 72 67 6f 6e 65 20 61 6e 79 20 61 66  undergone any af
bf40: 66 69 6e 69 74 79 20 63 68 61 6e 67 65 73 2e 20  finity changes. 
bf50: 20 42 75 74 20 69 66 0a 2a 2a 20 61 6e 20 61 66   But if.** an af
bf60: 66 69 6e 69 74 79 20 63 68 61 6e 67 65 20 68 61  finity change ha
bf70: 73 20 6f 63 63 75 72 72 65 64 2c 20 74 68 65 6e  s occurred, then
bf80: 20 74 68 65 20 63 61 63 68 65 64 20 76 61 6c 75   the cached valu
bf90: 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65 0a 2a  e will only be.*
bfa0: 2a 20 75 73 65 64 20 69 66 20 61 6c 6c 6f 77 41  * used if allowA
bfb0: 66 66 43 68 6e 67 20 69 73 20 74 72 75 65 2e 0a  ffChng is true..
bfc0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
bfd0: 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
bfe0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
bff0: 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61  ,   /* Parsing a
c000: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
c010: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
c020: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
c030: 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
c040: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 65 20  of the table we 
c050: 61 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d  are reading from
c060: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
c070: 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20  n,     /* Index 
c080: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c  of the table col
c090: 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  umn */.  int iTa
c0a0: 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ble,      /* The
c0b0: 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   cursor pointing
c0c0: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   to the table */
c0d0: 0a 20 20 69 6e 74 20 69 52 65 67 2c 20 20 20 20  .  int iReg,    
c0e0: 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73      /* Store res
c0f0: 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 69  ults here */.  i
c100: 6e 74 20 61 6c 6c 6f 77 41 66 66 43 68 6e 67 20  nt allowAffChng 
c110: 2f 2a 20 54 72 75 65 20 69 66 20 70 72 69 6f 72  /* True if prior
c120: 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65   affinity change
c130: 73 20 61 72 65 20 4f 4b 20 2a 2f 0a 29 7b 0a 20  s are OK */.){. 
c140: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
c150: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
c160: 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
c170: 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72  Cache *p;..  for
c180: 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
c190: 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50 61  aColCache; i<pPa
c1a0: 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20  rse->nColCache; 
c1b0: 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
c1c0: 66 28 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  f( p->iTable==iT
c1d0: 61 62 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75  able && p->iColu
c1e0: 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20  mn==iColumn.    
c1f0: 20 20 20 20 20 20 20 26 26 20 28 21 70 2d 3e 61         && (!p->a
c200: 66 66 43 68 61 6e 67 65 20 7c 7c 20 61 6c 6c 6f  ffChange || allo
c210: 77 41 66 66 43 68 6e 67 29 20 29 7b 0a 23 69 66  wAffChng) ){.#if
c220: 20 30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   0.      sqlite3
c230: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
c240: 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 20 20 56 64  _Noop);.      Vd
c250: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f  beComment((v, "O
c260: 50 54 3a 20 74 61 62 25 64 2e 63 6f 6c 25 64 20  PT: tab%d.col%d 
c270: 2d 3e 20 72 25 64 22 2c 20 69 54 61 62 6c 65 2c  -> r%d", iTable,
c280: 20 69 43 6f 6c 75 6d 6e 2c 20 70 2d 3e 69 52 65   iColumn, p->iRe
c290: 67 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  g));.#endif.    
c2a0: 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 52 65 67    return p->iReg
c2b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20  ;.    }.  }  .  
c2c0: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
c2d0: 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20    if( iColumn<0 
c2e0: 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  ){.    int op = 
c2f0: 28 70 54 61 62 20 26 26 20 49 73 56 69 72 74 75  (pTab && IsVirtu
c300: 61 6c 28 70 54 61 62 29 29 20 3f 20 4f 50 5f 56  al(pTab)) ? OP_V
c310: 52 6f 77 69 64 20 3a 20 4f 50 5f 52 6f 77 69 64  Rowid : OP_Rowid
c320: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
c330: 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 69  eAddOp2(v, op, i
c340: 54 61 62 6c 65 2c 20 69 52 65 67 29 3b 0a 20 20  Table, iReg);.  
c350: 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62 3d 3d  }else if( pTab==
c360: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
c370: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
c380: 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 6c 65 2c  _Column, iTable,
c390: 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b   iColumn, iReg);
c3a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
c3b0: 74 20 6f 70 20 3d 20 49 73 56 69 72 74 75 61 6c  t op = IsVirtual
c3c0: 28 70 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c  (pTab) ? OP_VCol
c3d0: 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b  umn : OP_Column;
c3e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
c3f0: 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54  AddOp3(v, op, iT
c400: 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69  able, iColumn, i
c410: 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Reg);.    sqlite
c420: 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76  3ColumnDefault(v
c430: 2c 20 70 54 61 62 2c 20 69 43 6f 6c 75 6d 6e 29  , pTab, iColumn)
c440: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
c450: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
c460: 4f 49 4e 54 0a 20 20 20 20 69 66 28 20 70 54 61  OINT.    if( pTa
c470: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d  b->aCol[iColumn]
c480: 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  .affinity==SQLIT
c490: 45 5f 41 46 46 5f 52 45 41 4c 20 29 7b 0a 20 20  E_AFF_REAL ){.  
c4a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c4b0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c  ddOp1(v, OP_Real
c4c0: 41 66 66 69 6e 69 74 79 2c 20 69 52 65 67 29 3b  Affinity, iReg);
c4d0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
c4e0: 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  }.  if( pParse->
c4f0: 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3d  disableColCache=
c500: 3d 30 20 29 7b 0a 20 20 20 20 69 20 3d 20 70 50  =0 ){.    i = pP
c510: 61 72 73 65 2d 3e 69 43 6f 6c 43 61 63 68 65 3b  arse->iColCache;
c520: 0a 20 20 20 20 70 20 3d 20 26 70 50 61 72 73 65  .    p = &pParse
c530: 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 3b 0a  ->aColCache[i];.
c540: 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20      p->iTable = 
c550: 69 54 61 62 6c 65 3b 0a 20 20 20 20 70 2d 3e 69  iTable;.    p->i
c560: 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 75 6d 6e  Column = iColumn
c570: 3b 0a 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20  ;.    p->iReg = 
c580: 69 52 65 67 3b 0a 20 20 20 20 70 2d 3e 61 66 66  iReg;.    p->aff
c590: 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
c5a0: 69 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d  i++;.    if( i>=
c5b0: 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73 65  ArraySize(pParse
c5c0: 2d 3e 61 43 6f 6c 43 61 63 68 65 29 20 29 20 69  ->aColCache) ) i
c5d0: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69 3e   = 0;.    if( i>
c5e0: 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
c5f0: 65 20 29 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  e ) pParse->nCol
c600: 43 61 63 68 65 20 3d 20 69 3b 0a 20 20 20 20 70  Cache = i;.    p
c610: 50 61 72 73 65 2d 3e 69 43 6f 6c 43 61 63 68 65  Parse->iColCache
c620: 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = i;.  }.  retu
c630: 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn iReg;.}../*.*
c640: 2a 20 43 6c 65 61 72 20 61 6c 6c 20 63 6f 6c 75  * Clear all colu
c650: 6d 6e 20 63 61 63 68 65 20 65 6e 74 72 69 65 73  mn cache entries
c660: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
c670: 20 74 68 65 20 76 64 62 65 0a 2a 2a 20 63 75 72   the vdbe.** cur
c680: 73 6f 72 20 77 69 74 68 20 63 75 72 73 6f 72 20  sor with cursor 
c690: 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 2e 0a 2a  number iTable..*
c6a0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
c6b0: 70 72 43 6c 65 61 72 43 6f 6c 75 6d 6e 43 61 63  prClearColumnCac
c6c0: 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  he(Parse *pParse
c6d0: 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20  , int iTable){. 
c6e0: 20 69 66 28 20 69 54 61 62 6c 65 3c 30 20 29 7b   if( iTable<0 ){
c6f0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 43 6f  .    pParse->nCo
c700: 6c 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20  lCache = 0;.    
c710: 70 50 61 72 73 65 2d 3e 69 43 6f 6c 43 61 63 68  pParse->iColCach
c720: 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
c730: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
c740: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
c750: 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b  ->nColCache; i++
c760: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ){.      if( pPa
c770: 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69  rse->aColCache[i
c780: 5d 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65  ].iTable==iTable
c790: 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
c7a0: 63 61 73 65 28 20 69 3d 3d 70 50 61 72 73 65 2d  case( i==pParse-
c7b0: 3e 6e 43 6f 6c 43 61 63 68 65 2d 31 20 29 3b 0a  >nColCache-1 );.
c7c0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
c7d0: 61 43 6f 6c 43 61 63 68 65 5b 69 5d 20 3d 20 70  aColCache[i] = p
c7e0: 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
c7f0: 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43  [--pParse->nColC
c800: 61 63 68 65 5d 3b 0a 20 20 20 20 20 20 20 20 70  ache];.        p
c810: 50 61 72 73 65 2d 3e 69 43 6f 6c 43 61 63 68 65  Parse->iColCache
c820: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43   = pParse->nColC
c830: 61 63 68 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ache;.      }.  
c840: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
c850: 20 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74   Record the fact
c860: 20 74 68 61 74 20 61 6e 20 61 66 66 69 6e 69 74   that an affinit
c870: 79 20 63 68 61 6e 67 65 20 68 61 73 20 6f 63 63  y change has occ
c880: 75 72 72 65 64 20 6f 6e 20 69 43 6f 75 6e 74 0a  urred on iCount.
c890: 2a 2a 20 72 65 67 69 73 74 65 72 73 20 73 74 61  ** registers sta
c8a0: 72 74 69 6e 67 20 77 69 74 68 20 69 53 74 61 72  rting with iStar
c8b0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
c8c0: 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
c8d0: 69 74 79 43 68 61 6e 67 65 28 50 61 72 73 65 20  ityChange(Parse 
c8e0: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 53 74  *pParse, int iSt
c8f0: 61 72 74 2c 20 69 6e 74 20 69 43 6f 75 6e 74 29  art, int iCount)
c900: 7b 0a 20 20 69 6e 74 20 69 45 6e 64 20 3d 20 69  {.  int iEnd = i
c910: 53 74 61 72 74 20 2b 20 69 43 6f 75 6e 74 20 2d  Start + iCount -
c920: 20 31 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66   1;.  int i;.  f
c930: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
c940: 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b  ->nColCache; i++
c950: 29 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20 70  ){.    int r = p
c960: 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
c970: 5b 69 5d 2e 69 52 65 67 3b 0a 20 20 20 20 69 66  [i].iReg;.    if
c980: 28 20 72 3e 3d 69 53 74 61 72 74 20 26 26 20 72  ( r>=iStart && r
c990: 3c 3d 69 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  <=iEnd ){.      
c9a0: 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
c9b0: 65 5b 69 5d 2e 61 66 66 43 68 61 6e 67 65 20 3d  e[i].affChange =
c9c0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   1;.    }.  }.}.
c9d0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
c9e0: 63 6f 64 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e  code to move con
c9f0: 74 65 6e 74 20 66 72 6f 6d 20 72 65 67 69 73 74  tent from regist
ca00: 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f  ers iFrom...iFro
ca10: 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72  m+nReg-1.** over
ca20: 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65   to iTo..iTo+nRe
ca30: 67 2d 31 2e 20 4b 65 65 70 20 74 68 65 20 63 6f  g-1. Keep the co
ca40: 6c 75 6d 6e 20 63 61 63 68 65 20 75 70 2d 74 6f  lumn cache up-to
ca50: 2d 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  -date..*/.void s
ca60: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
ca70: 76 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ve(Parse *pParse
ca80: 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74  , int iFrom, int
ca90: 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b   iTo, int nReg){
caa0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
cab0: 69 46 72 6f 6d 3d 3d 69 54 6f 20 29 20 72 65 74  iFrom==iTo ) ret
cac0: 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  urn;.  sqlite3Vd
cad0: 62 65 41 64 64 4f 70 33 28 70 50 61 72 73 65 2d  beAddOp3(pParse-
cae0: 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c  >pVdbe, OP_Move,
caf0: 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65   iFrom, iTo, nRe
cb00: 67 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  g);.  for(i=0; i
cb10: 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  <pParse->nColCac
cb20: 68 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  he; i++){.    in
cb30: 74 20 78 20 3d 20 70 50 61 72 73 65 2d 3e 61 43  t x = pParse->aC
cb40: 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67 3b  olCache[i].iReg;
cb50: 0a 20 20 20 20 69 66 28 20 78 3e 3d 69 46 72 6f  .    if( x>=iFro
cb60: 6d 20 26 26 20 78 3c 69 46 72 6f 6d 2b 6e 52 65  m && x<iFrom+nRe
cb70: 67 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  g ){.      pPars
cb80: 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e  e->aColCache[i].
cb90: 69 52 65 67 20 2b 3d 20 69 54 6f 2d 69 46 72 6f  iReg += iTo-iFro
cba0: 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  m;.    }.  }.}..
cbb0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
cbc0: 6f 64 65 20 74 6f 20 63 6f 70 79 20 63 6f 6e 74  ode to copy cont
cbd0: 65 6e 74 20 66 72 6f 6d 20 72 65 67 69 73 74 65  ent from registe
cbe0: 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d  rs iFrom...iFrom
cbf0: 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20  +nReg-1.** over 
cc00: 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67  to iTo..iTo+nReg
cc10: 2d 31 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  -1..*/.void sqli
cc20: 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28  te3ExprCodeCopy(
cc30: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
cc40: 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54  nt iFrom, int iT
cc50: 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  o, int nReg){.  
cc60: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 69 46 72  int i;.  if( iFr
cc70: 6f 6d 3d 3d 69 54 6f 20 29 20 72 65 74 75 72 6e  om==iTo ) return
cc80: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
cc90: 52 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Reg; i++){.    s
cca0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
ccb0: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
ccc0: 4f 50 5f 43 6f 70 79 2c 20 69 46 72 6f 6d 2b 69  OP_Copy, iFrom+i
ccd0: 2c 20 69 54 6f 2b 69 29 3b 0a 20 20 7d 0a 7d 0a  , iTo+i);.  }.}.
cce0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
ccf0: 75 65 20 69 66 20 61 6e 79 20 72 65 67 69 73 74  ue if any regist
cd00: 65 72 20 69 6e 20 74 68 65 20 72 61 6e 67 65 20  er in the range 
cd10: 69 46 72 6f 6d 2e 2e 69 54 6f 20 28 69 6e 63 6c  iFrom..iTo (incl
cd20: 75 73 69 76 65 29 0a 2a 2a 20 69 73 20 75 73 65  usive).** is use
cd30: 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
cd40: 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a   column cache..*
cd50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 73 65  /.static int use
cd60: 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 50  dAsColumnCache(P
cd70: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
cd80: 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f  t iFrom, int iTo
cd90: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
cda0: 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d  r(i=0; i<pParse-
cdb0: 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 29  >nColCache; i++)
cdc0: 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20 70 50  {.    int r = pP
cdd0: 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
cde0: 69 5d 2e 69 52 65 67 3b 0a 20 20 20 20 69 66 28  i].iReg;.    if(
cdf0: 20 72 3e 3d 69 46 72 6f 6d 20 26 26 20 72 3c 3d   r>=iFrom && r<=
ce00: 69 54 6f 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  iTo ) return 1;.
ce10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
ce20: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 72 65 73 20  }../*.** Theres 
ce30: 69 73 20 61 20 76 61 6c 75 65 20 69 6e 20 72 65  is a value in re
ce40: 67 69 73 74 65 72 20 69 43 75 72 72 65 6e 74 2e  gister iCurrent.
ce50: 20 20 57 65 20 75 6c 74 69 6d 61 74 65 6c 79 20    We ultimately 
ce60: 77 61 6e 74 0a 2a 2a 20 74 68 65 20 76 61 6c 75  want.** the valu
ce70: 65 20 74 6f 20 62 65 20 69 6e 20 72 65 67 69 73  e to be in regis
ce80: 74 65 72 20 69 54 61 72 67 65 74 2e 20 20 49 74  ter iTarget.  It
ce90: 20 6d 69 67 68 74 20 62 65 20 74 68 61 74 0a 2a   might be that.*
cea0: 2a 20 69 43 75 72 72 65 6e 74 20 61 6e 64 20 69  * iCurrent and i
ceb0: 54 61 72 67 65 74 20 61 72 65 20 74 68 65 20 73  Target are the s
cec0: 61 6d 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a  ame register..**
ced0: 0a 2a 2a 20 57 65 20 61 72 65 20 67 6f 69 6e 67  .** We are going
cee0: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 76   to modify the v
cef0: 61 6c 75 65 2c 20 73 6f 20 77 65 20 6e 65 65 64  alue, so we need
cf00: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74   to make sure it
cf10: 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20 63 61 63  .** is not a cac
cf20: 68 65 64 20 72 65 67 69 73 74 65 72 2e 20 20 49  hed register.  I
cf30: 66 20 69 43 75 72 72 65 6e 74 20 69 73 20 61 20  f iCurrent is a 
cf40: 63 61 63 68 65 64 20 72 65 67 69 73 74 65 72 2c  cached register,
cf50: 0a 2a 2a 20 74 68 65 6e 20 74 72 79 20 74 6f 20  .** then try to 
cf60: 6d 6f 76 65 20 74 68 65 20 76 61 6c 75 65 20 6f  move the value o
cf70: 76 65 72 20 74 6f 20 69 54 61 72 67 65 74 2e 20  ver to iTarget. 
cf80: 20 49 66 20 69 54 61 72 67 65 74 20 69 73 20 61   If iTarget is a
cf90: 0a 2a 2a 20 63 61 63 68 65 64 20 72 65 67 69 73  .** cached regis
cfa0: 74 65 72 2c 20 74 68 65 6e 20 63 6c 65 61 72 20  ter, then clear 
cfb0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
cfc0: 67 20 63 61 63 68 65 20 6c 69 6e 65 2e 0a 2a 2a  g cache line..**
cfd0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72  .** Return the r
cfe0: 65 67 69 73 74 65 72 20 74 68 61 74 20 74 68 65  egister that the
cff0: 20 76 61 6c 75 65 20 65 6e 64 73 20 75 70 20 69   value ends up i
d000: 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
d010: 33 45 78 70 72 57 72 69 74 61 62 6c 65 52 65 67  3ExprWritableReg
d020: 69 73 74 65 72 28 50 61 72 73 65 20 2a 70 50 61  ister(Parse *pPa
d030: 72 73 65 2c 20 69 6e 74 20 69 43 75 72 72 65 6e  rse, int iCurren
d040: 74 2c 20 69 6e 74 20 69 54 61 72 67 65 74 29 7b  t, int iTarget){
d050: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
d060: 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62  rt( pParse->pVdb
d070: 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 75  e!=0 );.  if( !u
d080: 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65  sedAsColumnCache
d090: 28 70 50 61 72 73 65 2c 20 69 43 75 72 72 65 6e  (pParse, iCurren
d0a0: 74 2c 20 69 43 75 72 72 65 6e 74 29 20 29 7b 0a  t, iCurrent) ){.
d0b0: 20 20 20 20 72 65 74 75 72 6e 20 69 43 75 72 72      return iCurr
d0c0: 65 6e 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  ent;.  }.  if( i
d0d0: 43 75 72 72 65 6e 74 21 3d 69 54 61 72 67 65 74  Current!=iTarget
d0e0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
d0f0: 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65  dbeAddOp2(pParse
d100: 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70  ->pVdbe, OP_SCop
d110: 79 2c 20 69 43 75 72 72 65 6e 74 2c 20 69 54 61  y, iCurrent, iTa
d120: 72 67 65 74 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  rget);.  }.  for
d130: 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
d140: 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b  nColCache; i++){
d150: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
d160: 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52  >aColCache[i].iR
d170: 65 67 3d 3d 69 54 61 72 67 65 74 20 29 7b 0a 20  eg==iTarget ){. 
d180: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 43 6f       pParse->aCo
d190: 6c 43 61 63 68 65 5b 69 5d 20 3d 20 70 50 61 72  lCache[i] = pPar
d1a0: 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 2d 2d  se->aColCache[--
d1b0: 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
d1c0: 65 5d 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  e];.      pParse
d1d0: 2d 3e 69 43 6f 6c 43 61 63 68 65 20 3d 20 70 50  ->iColCache = pP
d1e0: 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b  arse->nColCache;
d1f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
d200: 75 72 6e 20 69 54 61 72 67 65 74 3b 0a 7d 0a 0a  urn iTarget;.}..
d210: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 61 73  /*.** If the las
d220: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 6f  t instruction co
d230: 64 65 64 20 69 73 20 61 6e 20 65 70 68 65 6d 65  ded is an epheme
d240: 72 61 6c 20 63 6f 70 79 20 6f 66 20 61 6e 79 20  ral copy of any 
d250: 6f 66 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74  of.** the regist
d260: 65 72 73 20 69 6e 20 74 68 65 20 6e 52 65 67 20  ers in the nReg 
d270: 72 65 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e  registers beginn
d280: 69 6e 67 20 77 69 74 68 20 69 52 65 67 2c 20 74  ing with iReg, t
d290: 68 65 6e 0a 2a 2a 20 63 6f 6e 76 65 72 74 20 74  hen.** convert t
d2a0: 68 65 20 6c 61 73 74 20 69 6e 73 74 72 75 63 74  he last instruct
d2b0: 69 6f 6e 20 66 72 6f 6d 20 4f 50 5f 53 43 6f 70  ion from OP_SCop
d2c0: 79 20 74 6f 20 4f 50 5f 43 6f 70 79 2e 0a 2a 2f  y to OP_Copy..*/
d2d0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
d2e0: 72 48 61 72 64 43 6f 70 79 28 50 61 72 73 65 20  rHardCopy(Parse 
d2f0: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
d300: 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  g, int nReg){.  
d310: 69 6e 74 20 61 64 64 72 3b 0a 20 20 56 64 62 65  int addr;.  Vdbe
d320: 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 20  Op *pOp;.  Vdbe 
d330: 2a 76 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73  *v;..  v = pPars
d340: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 64 64 72  e->pVdbe;.  addr
d350: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
d360: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
d370: 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
d380: 65 47 65 74 4f 70 28 76 2c 20 61 64 64 72 2d 31  eGetOp(v, addr-1
d390: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
d3a0: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
d3b0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
d3c0: 20 20 69 66 28 20 70 4f 70 20 26 26 20 70 4f 70    if( pOp && pOp
d3d0: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 43 6f  ->opcode==OP_SCo
d3e0: 70 79 20 26 26 20 70 4f 70 2d 3e 70 31 3e 3d 69  py && pOp->p1>=i
d3f0: 52 65 67 20 26 26 20 70 4f 70 2d 3e 70 31 3c 69  Reg && pOp->p1<i
d400: 52 65 67 2b 6e 52 65 67 20 29 7b 0a 20 20 20 20  Reg+nReg ){.    
d410: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
d420: 5f 43 6f 70 79 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  _Copy;.  }.}../*
d430: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
d440: 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 76  e to store the v
d450: 61 6c 75 65 20 6f 66 20 74 68 65 20 69 41 6c 69  alue of the iAli
d460: 61 73 2d 74 68 20 61 6c 69 61 73 20 69 6e 20 72  as-th alias in r
d470: 65 67 69 73 74 65 72 0a 2a 2a 20 74 61 72 67 65  egister.** targe
d480: 74 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69  t.  The first ti
d490: 6d 65 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  me this is calle
d4a0: 64 2c 20 70 45 78 70 72 20 69 73 20 65 76 61 6c  d, pExpr is eval
d4b0: 75 61 74 65 64 20 74 6f 20 63 6f 6d 70 75 74 65  uated to compute
d4c0: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
d4d0: 20 74 68 65 20 61 6c 69 61 73 2e 20 20 54 68 65   the alias.  The
d4e0: 20 76 61 6c 75 65 20 69 73 20 73 74 6f 72 65 64   value is stored
d4f0: 20 69 6e 20 61 6e 20 61 75 78 69 6c 69 61 72 79   in an auxiliary
d500: 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64   register.** and
d510: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
d520: 68 61 74 20 72 65 67 69 73 74 65 72 20 69 73 20  hat register is 
d530: 72 65 74 75 72 6e 65 64 2e 20 20 4f 6e 20 73 75  returned.  On su
d540: 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 2c 0a  bsequent calls,.
d550: 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65 72 20  ** the register 
d560: 6e 75 6d 62 65 72 20 69 73 20 72 65 74 75 72 6e  number is return
d570: 65 64 20 77 69 74 68 6f 75 74 20 67 65 6e 65 72  ed without gener
d580: 61 74 69 6e 67 20 61 6e 79 20 63 6f 64 65 2e 0a  ating any code..
d590: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
d5a0: 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69  in order for thi
d5b0: 73 20 74 6f 20 77 6f 72 6b 2c 20 63 6f 64 65 20  s to work, code 
d5c0: 6d 75 73 74 20 62 65 20 67 65 6e 65 72 61 74 65  must be generate
d5d0: 64 20 69 6e 20 74 68 65 0a 2a 2a 20 73 61 6d 65  d in the.** same
d5e0: 20 6f 72 64 65 72 20 74 68 61 74 20 69 74 20 69   order that it i
d5f0: 73 20 65 78 65 63 75 74 65 64 2e 0a 2a 2a 0a 2a  s executed..**.*
d600: 2a 20 41 6c 69 61 73 65 73 20 61 72 65 20 6e 75  * Aliases are nu
d610: 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67 20  mbered starting 
d620: 77 69 74 68 20 31 2e 20 20 53 6f 20 69 41 6c 69  with 1.  So iAli
d630: 61 73 20 69 73 20 69 6e 20 74 68 65 20 72 61 6e  as is in the ran
d640: 67 65 0a 2a 2a 20 6f 66 20 31 20 74 6f 20 70 50  ge.** of 1 to pP
d650: 61 72 73 65 2d 3e 6e 41 6c 69 61 73 20 69 6e 63  arse->nAlias inc
d660: 6c 75 73 69 76 65 2e 20 20 0a 2a 2a 0a 2a 2a 20  lusive.  .**.** 
d670: 70 50 61 72 73 65 2d 3e 61 41 6c 69 61 73 5b 69  pParse->aAlias[i
d680: 41 6c 69 61 73 2d 31 5d 20 72 65 63 6f 72 64 73  Alias-1] records
d690: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75   the register nu
d6a0: 6d 62 65 72 20 77 68 65 72 65 20 74 68 65 20 76  mber where the v
d6b0: 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20 69  alue.** of the i
d6c0: 41 6c 69 61 73 2d 74 68 20 61 6c 69 61 73 20 69  Alias-th alias i
d6d0: 73 20 73 74 6f 72 65 64 2e 20 20 49 66 20 7a 65  s stored.  If ze
d6e0: 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  ro, that means t
d6f0: 68 61 74 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73  hat the.** alias
d700: 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
d710: 6e 20 63 6f 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73  n computed..*/.s
d720: 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 41 6c  tatic int codeAl
d730: 69 61 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ias(Parse *pPars
d740: 65 2c 20 69 6e 74 20 69 41 6c 69 61 73 2c 20 45  e, int iAlias, E
d750: 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
d760: 74 61 72 67 65 74 29 7b 0a 20 20 73 71 6c 69 74  target){.  sqlit
d770: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
d780: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b  >db;.  int iReg;
d790: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61  .  if( pParse->a
d7a0: 41 6c 69 61 73 3d 3d 30 20 29 7b 0a 20 20 20 20  Alias==0 ){.    
d7b0: 70 50 61 72 73 65 2d 3e 61 41 6c 69 61 73 20 3d  pParse->aAlias =
d7c0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
d7d0: 5a 65 72 6f 28 64 62 2c 20 0a 20 20 20 20 20 20  Zero(db, .      
d7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7f0: 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
d800: 66 28 70 50 61 72 73 65 2d 3e 61 41 6c 69 61 73  f(pParse->aAlias
d810: 5b 30 5d 29 2a 70 50 61 72 73 65 2d 3e 6e 41 6c  [0])*pParse->nAl
d820: 69 61 73 20 29 3b 0a 20 20 20 20 69 66 28 20 64  ias );.    if( d
d830: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
d840: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
d850: 20 20 61 73 73 65 72 74 28 20 69 41 6c 69 61 73    assert( iAlias
d860: 3e 30 20 26 26 20 69 41 6c 69 61 73 3c 3d 70 50  >0 && iAlias<=pP
d870: 61 72 73 65 2d 3e 6e 41 6c 69 61 73 20 29 3b 0a  arse->nAlias );.
d880: 20 20 69 52 65 67 20 3d 20 70 50 61 72 73 65 2d    iReg = pParse-
d890: 3e 61 41 6c 69 61 73 5b 69 41 6c 69 61 73 2d 31  >aAlias[iAlias-1
d8a0: 5d 3b 0a 20 20 69 66 28 20 69 52 65 67 3d 3d 30  ];.  if( iReg==0
d8b0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72   ){.    if( pPar
d8c0: 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61  se->disableColCa
d8d0: 63 68 65 20 29 7b 0a 20 20 20 20 20 20 69 52 65  che ){.      iRe
d8e0: 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
d8f0: 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
d900: 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  , pExpr, target)
d910: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
d920: 20 20 20 69 52 65 67 20 3d 20 2b 2b 70 50 61 72     iReg = ++pPar
d930: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
d940: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
d950: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 69  pParse, pExpr, i
d960: 52 65 67 29 3b 0a 20 20 20 20 20 20 70 50 61 72  Reg);.      pPar
d970: 73 65 2d 3e 61 41 6c 69 61 73 5b 69 41 6c 69 61  se->aAlias[iAlia
d980: 73 2d 31 5d 20 3d 20 69 52 65 67 3b 0a 20 20 20  s-1] = iReg;.   
d990: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
d9a0: 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  iReg;.}../*.** G
d9b0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
d9c0: 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 56 64  o the current Vd
d9d0: 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  be to evaluate t
d9e0: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72  he given.** expr
d9f0: 65 73 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74  ession.  Attempt
da00: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65   to store the re
da10: 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65  sults in registe
da20: 72 20 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52  r "target"..** R
da30: 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74  eturn the regist
da40: 65 72 20 77 68 65 72 65 20 72 65 73 75 6c 74 73  er where results
da50: 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a   are stored..**.
da60: 2a 2a 20 57 69 74 68 20 74 68 69 73 20 72 6f 75  ** With this rou
da70: 74 69 6e 65 2c 20 74 68 65 72 65 20 69 73 20 6e  tine, there is n
da80: 6f 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  o guarantee that
da90: 20 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a   results will.**
daa0: 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 61   be stored in ta
dab0: 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c  rget.  The resul
dac0: 74 20 6d 69 67 68 74 20 62 65 20 73 74 6f 72 65  t might be store
dad0: 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a  d in some other.
dae0: 2a 2a 20 72 65 67 69 73 74 65 72 20 69 66 20 69  ** register if i
daf0: 74 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20  t is convenient 
db00: 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65 20 63  to do so.  The c
db10: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
db20: 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68  ** must check th
db30: 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e  e return code an
db40: 64 20 6d 6f 76 65 20 74 68 65 20 72 65 73 75 6c  d move the resul
db50: 74 73 20 74 6f 20 74 68 65 20 64 65 73 69 72 65  ts to the desire
db60: 64 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a  d.** register..*
db70: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
db80: 72 43 6f 64 65 54 61 72 67 65 74 28 50 61 72 73  rCodeTarget(Pars
db90: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
dba0: 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
dbb0: 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  et){.  Vdbe *v =
dbc0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
dbd0: 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64 65 72   /* The VM under
dbe0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
dbf0: 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dc10: 54 68 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67  The opcode being
dc20: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
dc30: 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 20  inReg = target; 
dc40: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73        /* Results
dc50: 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73   stored in regis
dc60: 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69  ter inReg */.  i
dc70: 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
dc80: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e           /* If n
dc90: 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69  on-zero free thi
dca0: 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  s temporary regi
dcb0: 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ster */.  int re
dcc0: 67 46 72 65 65 32 20 3d 20 30 3b 20 20 20 20 20  gFree2 = 0;     
dcd0: 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
dce0: 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d  ro free this tem
dcf0: 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
dd00: 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 2c  */.  int r1, r2,
dd10: 20 72 33 2c 20 72 34 3b 20 20 20 20 20 20 20 2f   r3, r4;       /
dd20: 2a 20 56 61 72 69 6f 75 73 20 72 65 67 69 73 74  * Various regist
dd30: 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20  er numbers */.  
dd40: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20  sqlite3 *db;..  
dd50: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
dd60: 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
dd70: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
dd80: 6c 65 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28  led );.  assert(
dd90: 20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72   target>0 && tar
dda0: 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65  get<=pParse->nMe
ddb0: 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  m );.  if( v==0 
ddc0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 69  ) return 0;..  i
ddd0: 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20  f( pExpr==0 ){. 
dde0: 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b     op = TK_NULL;
ddf0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70  .  }else{.    op
de00: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20   = pExpr->op;.  
de10: 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  }.  switch( op )
de20: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
de30: 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  G_COLUMN: {.    
de40: 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49    AggInfo *pAggI
de50: 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67  nfo = pExpr->pAg
de60: 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72  gInfo;.      str
de70: 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
de80: 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66  *pCol = &pAggInf
de90: 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69  o->aCol[pExpr->i
dea0: 41 67 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  Agg];.      if( 
deb0: 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63  !pAggInfo->direc
dec0: 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  tMode ){.       
ded0: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69   assert( pCol->i
dee0: 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  Mem>0 );.       
def0: 20 69 6e 52 65 67 20 3d 20 70 43 6f 6c 2d 3e 69   inReg = pCol->i
df00: 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 62 72 65  Mem;.        bre
df10: 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ak;.      }else 
df20: 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73  if( pAggInfo->us
df30: 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20  eSortingIdx ){. 
df40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
df50: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
df60: 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d  olumn, pAggInfo-
df70: 3e 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20 20  >sortingIdx,.   
df80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df90: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
dfa0: 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20  >iSorterColumn, 
dfb0: 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
dfc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
dfd0: 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69        /* Otherwi
dfe0: 73 65 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e  se, fall thru in
dff0: 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e  to the TK_COLUMN
e000: 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20   case */.    }. 
e010: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
e020: 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  N: {.      if( p
e030: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20 29  Expr->iTable<0 )
e040: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
e050: 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77  s only happens w
e060: 68 65 6e 20 63 6f 64 69 6e 67 20 63 68 65 63 6b  hen coding check
e070: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
e080: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
e090: 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3e 30  pParse->ckBase>0
e0a0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65   );.        inRe
e0b0: 67 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  g = pExpr->iColu
e0c0: 6d 6e 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b 42  mn + pParse->ckB
e0d0: 61 73 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ase;.      }else
e0e0: 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
e0f0: 73 65 28 20 28 70 45 78 70 72 2d 3e 66 6c 61 67  se( (pExpr->flag
e100: 73 20 26 20 45 50 5f 41 6e 79 41 66 66 29 21 3d  s & EP_AnyAff)!=
e110: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52  0 );.        inR
e120: 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
e130: 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50  CodeGetColumn(pP
e140: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 54 61  arse, pExpr->pTa
e150: 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
e160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e170: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
e180: 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  mn, pExpr->iTabl
e190: 65 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20  e, target,.     
e1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1b0: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
e1c0: 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 41 6e  r->flags & EP_An
e1d0: 79 41 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20  yAff);.      }. 
e1e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e1f0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
e200: 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63  TEGER: {.      c
e210: 6f 64 65 49 6e 74 65 67 65 72 28 76 2c 20 70 45  odeInteger(v, pE
e220: 78 70 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  xpr, 0, target);
e230: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
e240: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
e250: 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 63  FLOAT: {.      c
e260: 6f 64 65 52 65 61 6c 28 76 2c 20 28 63 68 61 72  odeReal(v, (char
e270: 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  *)pExpr->token.z
e280: 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  , pExpr->token.n
e290: 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
e2a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
e2b0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
e2c0: 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ING: {.      sql
e2d0: 69 74 65 33 44 65 71 75 6f 74 65 45 78 70 72 28  ite3DequoteExpr(
e2e0: 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  db, pExpr);.    
e2f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e300: 4f 70 34 28 76 2c 4f 50 5f 53 74 72 69 6e 67 38  Op4(v,OP_String8
e310: 2c 20 30 2c 20 74 61 72 67 65 74 2c 20 30 2c 0a  , 0, target, 0,.
e320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e330: 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
e340: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Expr->token.z, p
e350: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a  Expr->token.n);.
e360: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e370: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
e380: 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ULL: {.      sql
e390: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
e3a0: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
e3b0: 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65  rget);.      bre
e3c0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
e3d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c  f SQLITE_OMIT_BL
e3e0: 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63  OB_LITERAL.    c
e3f0: 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20  ase TK_BLOB: {. 
e400: 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
e410: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
e420: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c  .      char *zBl
e430: 6f 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ob;.      assert
e440: 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  ( pExpr->token.n
e450: 3e 3d 33 20 29 3b 0a 20 20 20 20 20 20 61 73 73  >=3 );.      ass
e460: 65 72 74 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65  ert( pExpr->toke
e470: 6e 2e 7a 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20 70  n.z[0]=='x' || p
e480: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d  Expr->token.z[0]
e490: 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20 20 20 61  =='X' );.      a
e4a0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 74 6f  ssert( pExpr->to
e4b0: 6b 65 6e 2e 7a 5b 31 5d 3d 3d 27 5c 27 27 20 29  ken.z[1]=='\'' )
e4c0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
e4d0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 70  pExpr->token.z[p
e4e0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2d 31 5d  Expr->token.n-1]
e4f0: 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20  =='\'' );.      
e500: 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  n = pExpr->token
e510: 2e 6e 20 2d 20 33 3b 0a 20 20 20 20 20 20 7a 20  .n - 3;.      z 
e520: 3d 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e  = (char*)pExpr->
e530: 74 6f 6b 65 6e 2e 7a 20 2b 20 32 3b 0a 20 20 20  token.z + 2;.   
e540: 20 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74     zBlob = sqlit
e550: 65 33 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69  e3HexToBlob(sqli
e560: 74 65 33 56 64 62 65 44 62 28 76 29 2c 20 7a 2c  te3VdbeDb(v), z,
e570: 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   n);.      sqlit
e580: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
e590: 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61  OP_Blob, n/2, ta
e5a0: 72 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20  rget, 0, zBlob, 
e5b0: 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P4_DYNAMIC);.   
e5c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
e5d0: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
e5e0: 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20  TK_VARIABLE: {. 
e5f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e600: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61 72  AddOp2(v, OP_Var
e610: 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 54  iable, pExpr->iT
e620: 61 62 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a 20  able, target);. 
e630: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
e640: 74 6f 6b 65 6e 2e 6e 3e 31 20 29 7b 0a 20 20 20  token.n>1 ){.   
e650: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e660: 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
e670: 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
e680: 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f  ken.z, pExpr->to
e690: 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  ken.n);.      }.
e6a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e6b0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52   }.    case TK_R
e6c0: 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20  EGISTER: {.     
e6d0: 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e   inReg = pExpr->
e6e0: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 62 72  iTable;.      br
e6f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
e700: 61 73 65 20 54 4b 5f 41 53 3a 20 7b 0a 20 20 20  ase TK_AS: {.   
e710: 20 20 20 69 6e 52 65 67 20 3d 20 63 6f 64 65 41     inReg = codeA
e720: 6c 69 61 73 28 70 50 61 72 73 65 2c 20 70 45 78  lias(pParse, pEx
e730: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78 70  pr->iTable, pExp
e740: 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74  r->pLeft, target
e750: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
e760: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
e770: 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20  LITE_OMIT_CAST. 
e780: 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a     case TK_CAST:
e790: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72   {.      /* Expr
e7a0: 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66  essions of the f
e7b0: 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66  orm:   CAST(pLef
e7c0: 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20  t AS token) */. 
e7d0: 20 20 20 20 20 69 6e 74 20 61 66 66 2c 20 74 6f       int aff, to
e7e0: 5f 6f 70 3b 0a 20 20 20 20 20 20 69 6e 52 65 67  _op;.      inReg
e7f0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
e800: 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
e810: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74   pExpr->pLeft, t
e820: 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 61 66  arget);.      af
e830: 66 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e  f = sqlite3Affin
e840: 69 74 79 54 79 70 65 28 26 70 45 78 70 72 2d 3e  ityType(&pExpr->
e850: 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 74 6f  token);.      to
e860: 5f 6f 70 20 3d 20 61 66 66 20 2d 20 53 51 4c 49  _op = aff - SQLI
e870: 54 45 5f 41 46 46 5f 54 45 58 54 20 2b 20 4f 50  TE_AFF_TEXT + OP
e880: 5f 54 6f 54 65 78 74 3b 0a 20 20 20 20 20 20 61  _ToText;.      a
e890: 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50  ssert( to_op==OP
e8a0: 5f 54 6f 54 65 78 74 20 20 20 20 7c 7c 20 61 66  _ToText    || af
e8b0: 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  f!=SQLITE_AFF_TE
e8c0: 58 54 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61  XT    );.      a
e8d0: 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50  ssert( to_op==OP
e8e0: 5f 54 6f 42 6c 6f 62 20 20 20 20 7c 7c 20 61 66  _ToBlob    || af
e8f0: 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  f!=SQLITE_AFF_NO
e900: 4e 45 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61  NE    );.      a
e910: 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50  ssert( to_op==OP
e920: 5f 54 6f 4e 75 6d 65 72 69 63 20 7c 7c 20 61 66  _ToNumeric || af
e930: 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f!=SQLITE_AFF_NU
e940: 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 20 20 61  MERIC );.      a
e950: 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50  ssert( to_op==OP
e960: 5f 54 6f 49 6e 74 20 20 20 20 20 7c 7c 20 61 66  _ToInt     || af
e970: 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  f!=SQLITE_AFF_IN
e980: 54 45 47 45 52 20 29 3b 0a 20 20 20 20 20 20 61  TEGER );.      a
e990: 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50  ssert( to_op==OP
e9a0: 5f 54 6f 52 65 61 6c 20 20 20 20 7c 7c 20 61 66  _ToReal    || af
e9b0: 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  f!=SQLITE_AFF_RE
e9c0: 41 4c 20 20 20 20 29 3b 0a 20 20 20 20 20 20 74  AL    );.      t
e9d0: 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d  estcase( to_op==
e9e0: 4f 50 5f 54 6f 54 65 78 74 20 29 3b 0a 20 20 20  OP_ToText );.   
e9f0: 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f     testcase( to_
ea00: 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20 29 3b  op==OP_ToBlob );
ea10: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
ea20: 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d   to_op==OP_ToNum
ea30: 65 72 69 63 20 29 3b 0a 20 20 20 20 20 20 74 65  eric );.      te
ea40: 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f  stcase( to_op==O
ea50: 50 5f 54 6f 49 6e 74 20 29 3b 0a 20 20 20 20 20  P_ToInt );.     
ea60: 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70   testcase( to_op
ea70: 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 29 3b 0a 20  ==OP_ToReal );. 
ea80: 20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d       if( inReg!=
ea90: 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20  target ){.      
eaa0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
eab0: 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c  Op2(v, OP_SCopy,
eac0: 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b   inReg, target);
ead0: 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d  .        inReg =
eae0: 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d   target;.      }
eaf0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
eb00: 62 65 41 64 64 4f 70 31 28 76 2c 20 74 6f 5f 6f  beAddOp1(v, to_o
eb10: 70 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20  p, inReg);.     
eb20: 20 74 65 73 74 63 61 73 65 28 20 75 73 65 64 41   testcase( usedA
eb30: 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61  sColumnCache(pPa
eb40: 72 73 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65  rse, inReg, inRe
eb50: 67 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g) );.      sqli
eb60: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
eb70: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
eb80: 65 2c 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20  e, inReg, 1);.  
eb90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
eba0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
ebb0: 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20  E_OMIT_CAST */. 
ebc0: 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
ebd0: 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
ebe0: 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
ebf0: 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
ec00: 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
ec10: 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
ec20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
ec30: 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20  K_LT==OP_Lt );. 
ec40: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
ec50: 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20  LE==OP_Le );.   
ec60: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54     assert( TK_GT
ec70: 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20  ==OP_Gt );.     
ec80: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d   assert( TK_GE==
ec90: 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61  OP_Ge );.      a
eca0: 73 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50  ssert( TK_EQ==OP
ecb0: 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Eq );.      ass
ecc0: 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e  ert( TK_NE==OP_N
ecd0: 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
ece0: 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29  ase( op==TK_LT )
ecf0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
ed00: 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20  ( op==TK_LE );. 
ed10: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
ed20: 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20  p==TK_GT );.    
ed30: 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
ed40: 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74  TK_GE );.      t
ed50: 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
ed60: 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  EQ );.      test
ed70: 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20  case( op==TK_NE 
ed80: 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
ed90: 70 61 72 65 4f 70 65 72 61 6e 64 73 28 70 50 61  pareOperands(pPa
eda0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
edb0: 74 2c 20 26 72 31 2c 20 26 72 65 67 46 72 65 65  t, &r1, &regFree
edc0: 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
edd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ede0: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67       pExpr->pRig
edf0: 68 74 2c 20 26 72 32 2c 20 26 72 65 67 46 72 65  ht, &r2, &regFre
ee00: 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  e2);.      codeC
ee10: 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
ee20: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
ee30: 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
ee40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee50: 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c    r1, r2, inReg,
ee60: 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29   SQLITE_STOREP2)
ee70: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
ee80: 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
ee90: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
eea0: 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
eeb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
eec0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
eed0: 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ND:.    case TK_
eee0: 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OR:.    case TK_
eef0: 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  PLUS:.    case T
ef00: 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65  K_STAR:.    case
ef10: 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63   TK_MINUS:.    c
ef20: 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20  ase TK_REM:.    
ef30: 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a  case TK_BITAND:.
ef40: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f      case TK_BITO
ef50: 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  R:.    case TK_S
ef60: 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54  LASH:.    case T
ef70: 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61  K_LSHIFT:.    ca
ef80: 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20  se TK_RSHIFT: . 
ef90: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41     case TK_CONCA
efa0: 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T: {.      asser
efb0: 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e  t( TK_AND==OP_An
efc0: 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d );.      asser
efd0: 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20  t( TK_OR==OP_Or 
efe0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
eff0: 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64   TK_PLUS==OP_Add
f000: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
f010: 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53  ( TK_MINUS==OP_S
f020: 75 62 74 72 61 63 74 20 29 3b 0a 20 20 20 20 20  ubtract );.     
f030: 20 61 73 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d   assert( TK_REM=
f040: 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b  =OP_Remainder );
f050: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
f060: 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74  K_BITAND==OP_Bit
f070: 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73  And );.      ass
f080: 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f  ert( TK_BITOR==O
f090: 50 5f 42 69 74 4f 72 20 29 3b 0a 20 20 20 20 20  P_BitOr );.     
f0a0: 20 61 73 73 65 72 74 28 20 54 4b 5f 53 4c 41 53   assert( TK_SLAS
f0b0: 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b 0a  H==OP_Divide );.
f0c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
f0d0: 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66  _LSHIFT==OP_Shif
f0e0: 74 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 61  tLeft );.      a
f0f0: 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49 46 54  ssert( TK_RSHIFT
f100: 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68 74 20  ==OP_ShiftRight 
f110: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
f120: 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43   TK_CONCAT==OP_C
f130: 6f 6e 63 61 74 20 29 3b 0a 20 20 20 20 20 20 74  oncat );.      t
f140: 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
f150: 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73  AND );.      tes
f160: 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52  tcase( op==TK_OR
f170: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
f180: 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20  se( op==TK_PLUS 
f190: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
f1a0: 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20  e( op==TK_MINUS 
f1b0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
f1c0: 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b  e( op==TK_REM );
f1d0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
f1e0: 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44 20 29   op==TK_BITAND )
f1f0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
f200: 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29  ( op==TK_BITOR )
f210: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
f220: 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29  ( op==TK_SLASH )
f230: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
f240: 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20  ( op==TK_LSHIFT 
f250: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
f260: 65 28 20 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54  e( op==TK_RSHIFT
f270: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
f280: 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41  se( op==TK_CONCA
f290: 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  T );.      r1 = 
f2a0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
f2b0: 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
f2c0: 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
f2d0: 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
f2e0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
f2f0: 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
f300: 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
f310: 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 73 71  Free2);.      sq
f320: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
f330: 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74  v, op, r2, r1, t
f340: 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 74 65  arget);.      te
f350: 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
f360: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
f370: 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
f380: 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
f390: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
f3a0: 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20  e TK_UMINUS: {. 
f3b0: 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
f3c0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
f3d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
f3e0: 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66  Left );.      if
f3f0: 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
f400: 46 4c 4f 41 54 20 7c 7c 20 70 4c 65 66 74 2d 3e  FLOAT || pLeft->
f410: 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29  op==TK_INTEGER )
f420: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c  {.        if( pL
f430: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41  eft->op==TK_FLOA
f440: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  T ){.          c
f450: 6f 64 65 52 65 61 6c 28 76 2c 20 28 63 68 61 72  odeReal(v, (char
f460: 2a 29 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a  *)pLeft->token.z
f470: 2c 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 6e  , pLeft->token.n
f480: 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 1, target);.  
f490: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f4a0: 20 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67         codeInteg
f4b0: 65 72 28 76 2c 20 70 4c 65 66 74 2c 20 31 2c 20  er(v, pLeft, 1, 
f4c0: 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
f4d0: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
f4e0: 20 20 20 20 20 20 20 20 72 65 67 46 72 65 65 31          regFree1
f4f0: 20 3d 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47   = r1 = sqlite3G
f500: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
f510: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
f520: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f530: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
f540: 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d  1);.        r2 =
f550: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
f560: 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
f570: 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
f580: 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20 73  ree2);.        s
f590: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
f5a0: 28 76 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c  (v, OP_Subtract,
f5b0: 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29   r2, r1, target)
f5c0: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
f5d0: 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
f5e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
f5f0: 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b   inReg = target;
f600: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f610: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
f620: 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65  BITNOT:.    case
f630: 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
f640: 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e   assert( TK_BITN
f650: 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b  OT==OP_BitNot );
f660: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
f670: 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b  K_NOT==OP_Not );
f680: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
f690: 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29   op==TK_BITNOT )
f6a0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
f6b0: 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a  ( op==TK_NOT );.
f6c0: 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71        inReg = sq
f6d0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
f6e0: 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
f6f0: 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74  r->pLeft, target
f700: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
f710: 65 28 20 69 6e 52 65 67 3d 3d 74 61 72 67 65 74  e( inReg==target
f720: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
f730: 73 65 28 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e  se( usedAsColumn
f740: 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 6e  Cache(pParse, in
f750: 52 65 67 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20  Reg, inReg) );. 
f760: 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
f770: 69 74 65 33 45 78 70 72 57 72 69 74 61 62 6c 65  ite3ExprWritable
f780: 52 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2c  Register(pParse,
f790: 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b   inReg, target);
f7a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f7b0: 62 65 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20  beAddOp1(v, op, 
f7c0: 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72  inReg);.      br
f7d0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
f7e0: 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
f7f0: 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
f800: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  LL: {.      int 
f810: 61 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65  addr;.      asse
f820: 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f  rt( TK_ISNULL==O
f830: 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20  P_IsNull );.    
f840: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
f850: 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c  NULL==OP_NotNull
f860: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
f870: 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  se( op==TK_ISNUL
f880: 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  L );.      testc
f890: 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  ase( op==TK_NOTN
f8a0: 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ULL );.      sql
f8b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f8c0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
f8d0: 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
f8e0: 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
f8f0: 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
f900: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
f910: 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
f920: 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
f930: 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
f940: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
f950: 62 65 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20  beAddOp1(v, op, 
f960: 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
f970: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f980: 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65  OP_AddImm, targe
f990: 74 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 73 71  t, -1);.      sq
f9a0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
f9b0: 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
f9c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
f9d0: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
f9e0: 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
f9f0: 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20   AggInfo *pInfo 
fa00: 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66  = pExpr->pAggInf
fa10: 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e  o;.      if( pIn
fa20: 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  fo==0 ){.       
fa30: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
fa40: 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65  (pParse, "misuse
fa50: 20 6f 66 20 61 67 67 72 65 67 61 74 65 3a 20 25   of aggregate: %
fa60: 54 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  T",.            
fa70: 26 70 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20  &pExpr->span);. 
fa80: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
fa90: 20 20 20 20 69 6e 52 65 67 20 3d 20 70 49 6e 66      inReg = pInf
faa0: 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e  o->aFunc[pExpr->
fab0: 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20  iAgg].iMem;.    
fac0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
fad0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
fae0: 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20  TK_CONST_FUNC:. 
faf0: 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
fb00: 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  ION: {.      Exp
fb10: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
fb20: 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20  Expr->pList;.   
fb30: 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70     int nExpr = p
fb40: 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45  List ? pList->nE
fb50: 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 46  xpr : 0;.      F
fb60: 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20  uncDef *pDef;.  
fb70: 20 20 20 20 69 6e 74 20 6e 49 64 3b 0a 20 20 20      int nId;.   
fb80: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
fb90: 49 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6f  Id;.      int co
fba0: 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20  nstMask = 0;.   
fbb0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
fbc0: 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  u8 enc = ENC(db)
fbd0: 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  ;.      CollSeq 
fbe0: 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 0a 20 20 20  *pColl = 0;..   
fbf0: 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
fc00: 3d 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 20 29  =TK_CONST_FUNC )
fc10: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
fc20: 28 20 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f  ( op==TK_FUNCTIO
fc30: 4e 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d  N );.      zId =
fc40: 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74   (char*)pExpr->t
fc50: 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 6e 49  oken.z;.      nI
fc60: 64 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  d = pExpr->token
fc70: 2e 6e 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d  .n;.      pDef =
fc80: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
fc90: 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 49  tion(db, zId, nI
fca0: 64 2c 20 6e 45 78 70 72 2c 20 65 6e 63 2c 20 30  d, nExpr, enc, 0
fcb0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
fcc0: 20 70 44 65 66 21 3d 30 20 29 3b 0a 20 20 20 20   pDef!=0 );.    
fcd0: 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
fce0: 20 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70         nExpr = p
fcf0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
fd00: 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
fd10: 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
fd20: 61 72 73 65 2c 20 6e 45 78 70 72 29 3b 0a 20 20  arse, nExpr);.  
fd30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
fd40: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
fd50: 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 31 2c  arse, pList, r1,
fd60: 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   1);.      }else
fd70: 7b 0a 20 20 20 20 20 20 20 20 6e 45 78 70 72 20  {.        nExpr 
fd80: 3d 20 72 31 20 3d 20 30 3b 0a 20 20 20 20 20 20  = r1 = 0;.      
fd90: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
fda0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
fdb0: 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73 73  LE.      /* Poss
fdc0: 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74 68  ibly overload th
fdd0: 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 74 68  e function if th
fde0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
fdf0: 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 76   is.      ** a v
fe00: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c  irtual table col
fe10: 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  umn..      **.  
fe20: 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78      ** For infix
fe30: 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45   functions (LIKE
fe40: 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20  , GLOB, REGEXP, 
fe50: 61 6e 64 20 4d 41 54 43 48 29 20 75 73 65 20 74  and MATCH) use t
fe60: 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63 6f  he.      ** seco
fe70: 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74  nd argument, not
fe80: 20 74 68 65 20 66 69 72 73 74 2c 20 61 73 20 74   the first, as t
fe90: 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  he argument to t
fea0: 65 73 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  est to.      ** 
feb0: 73 65 65 20 69 66 20 69 74 20 69 73 20 61 20 63  see if it is a c
fec0: 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72 74 75  olumn in a virtu
fed0: 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  al table.  This 
fee0: 69 73 20 64 6f 6e 65 20 62 65 63 61 75 73 65 0a  is done because.
fef0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 66        ** the lef
ff00: 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 66  t operand of inf
ff10: 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 74 68  ix functions (th
ff20: 65 20 6f 70 65 72 61 6e 64 20 77 65 20 77 61 6e  e operand we wan
ff30: 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f  t to.      ** co
ff40: 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e  ntrol overloadin
ff50: 67 29 20 65 6e 64 73 20 75 70 20 61 73 20 74 68  g) ends up as th
ff60: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
ff70: 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  t to the.      *
ff80: 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  * function.  The
ff90: 20 65 78 70 72 65 73 73 69 6f 6e 20 22 41 20 67   expression "A g
ffa0: 6c 6f 62 20 42 22 20 69 73 20 65 71 75 69 76 61  lob B" is equiva
ffb0: 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a  lent to .      *
ffc0: 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57  * "glob(B,A).  W
ffd0: 65 20 77 61 6e 74 20 74 6f 20 75 73 65 20 74 68  e want to use th
ffe0: 65 20 41 20 69 6e 20 22 41 20 67 6c 6f 62 20 42  e A in "A glob B
fff0: 22 20 74 6f 20 74 65 73 74 0a 20 20 20 20 20 20  " to test.      
10000 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ** for function 
10010 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75  overloading.  Bu
10020 74 20 77 65 20 75 73 65 20 74 68 65 20 42 20 74  t we use the B t
10030 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41  erm in "glob(B,A
10040 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  )"..      */.   
10050 20 20 20 69 66 28 20 6e 45 78 70 72 3e 3d 32 20     if( nExpr>=2 
10060 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73  && (pExpr->flags
10070 20 26 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 29   & EP_InfixFunc)
10080 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
10090 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76   = sqlite3VtabOv
100a0 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64  erloadFunction(d
100b0 62 2c 20 70 44 65 66 2c 20 6e 45 78 70 72 2c 20  b, pDef, nExpr, 
100c0 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
100d0 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r);.      }else 
100e0 69 66 28 20 6e 45 78 70 72 3e 30 20 29 7b 0a 20  if( nExpr>0 ){. 
100f0 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71         pDef = sq
10100 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61  lite3VtabOverloa
10110 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44  dFunction(db, pD
10120 65 66 2c 20 6e 45 78 70 72 2c 20 70 4c 69 73 74  ef, nExpr, pList
10130 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
10140 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
10150 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
10160 45 78 70 72 20 26 26 20 69 3c 33 32 3b 20 69 2b  Expr && i<32; i+
10170 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
10180 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
10190 73 74 61 6e 74 28 70 4c 69 73 74 2d 3e 61 5b 69  stant(pList->a[i
101a0 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
101b0 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20        constMask 
101c0 7c 3d 20 28 31 3c 3c 69 29 3b 0a 20 20 20 20 20  |= (1<<i);.     
101d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
101e0 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20   (pDef->flags & 
101f0 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44  SQLITE_FUNC_NEED
10200 43 4f 4c 4c 29 21 3d 30 20 26 26 20 21 70 43 6f  COLL)!=0 && !pCo
10210 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
10220 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
10230 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
10240 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  e, pList->a[i].p
10250 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Expr);.        }
10260 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
10270 66 28 20 70 44 65 66 2d 3e 66 6c 61 67 73 20 26  f( pDef->flags &
10280 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
10290 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  DCOLL ){.       
102a0 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43   if( !pColl ) pC
102b0 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
102c0 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71  oll; .        sq
102d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
102e0 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30  v, OP_CollSeq, 0
102f0 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29  , 0, 0, (char *)
10300 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
10310 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Q);.      }.    
10320 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10330 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69  Op4(v, OP_Functi
10340 6f 6e 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72  on, constMask, r
10350 31 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20  1, target,.     
10360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10370 20 20 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20     (char*)pDef, 
10380 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P4_FUNCDEF);.   
10390 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
103a0 61 6e 67 65 50 35 28 76 2c 20 6e 45 78 70 72 29  angeP5(v, nExpr)
103b0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78 70  ;.      if( nExp
103c0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
103d0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
103e0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c  ange(pParse, r1,
103f0 20 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d   nExpr);.      }
10400 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
10410 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
10420 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31  hange(pParse, r1
10430 2c 20 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , nExpr);.      
10440 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
10450 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10460 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
10470 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20  se TK_EXISTS:.  
10480 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
10490 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
104a0 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 58 49 53 54  se( op==TK_EXIST
104b0 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
104c0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45  ase( op==TK_SELE
104d0 43 54 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  CT );.      if( 
104e0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  pExpr->iColumn==
104f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
10500 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
10510 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
10520 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
10530 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45        inReg = pE
10540 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
10550 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
10560 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
10570 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 4e 6f   {.      int rNo
10580 74 46 6f 75 6e 64 20 3d 20 30 3b 0a 20 20 20 20  tFound = 0;.    
10590 20 20 69 6e 74 20 72 4d 61 79 48 61 76 65 4e 75    int rMayHaveNu
105a0 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  ll = 0;.      in
105b0 74 20 6a 32 2c 20 6a 33 2c 20 6a 34 2c 20 6a 35  t j2, j3, j4, j5
105c0 3b 0a 20 20 20 20 20 20 63 68 61 72 20 61 66 66  ;.      char aff
105d0 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 69 6e 74  inity;.      int
105e0 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 20 20 56   eType;..      V
105f0 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
10600 76 2c 20 22 62 65 67 69 6e 20 49 4e 20 65 78 70  v, "begin IN exp
10610 72 20 72 25 64 22 2c 20 74 61 72 67 65 74 29 29  r r%d", target))
10620 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d 20  ;.      eType = 
10630 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64  sqlite3FindInInd
10640 65 78 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ex(pParse, pExpr
10650 2c 20 26 72 4d 61 79 48 61 76 65 4e 75 6c 6c 29  , &rMayHaveNull)
10660 3b 0a 20 20 20 20 20 20 69 66 28 20 72 4d 61 79  ;.      if( rMay
10670 48 61 76 65 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  HaveNull ){.    
10680 20 20 20 20 72 4e 6f 74 46 6f 75 6e 64 20 3d 20      rNotFound = 
10690 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
106a0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
106b0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
106c0 20 61 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65   affinity to use
106d0 20 74 6f 20 63 72 65 61 74 65 20 61 20 6b 65 79   to create a key
106e0 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c 74   from the result
106f0 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  s.      ** of th
10700 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 61 66  e expression. af
10710 66 69 6e 69 74 79 53 74 72 20 73 74 6f 72 65 73  finityStr stores
10720 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67   a static string
10730 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0a 20 20   suitable for.  
10740 20 20 20 20 2a 2a 20 50 34 20 6f 66 20 4f 50 5f      ** P4 of OP_
10750 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20 20 20 20  MakeRecord..    
10760 20 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 69 6e    */.      affin
10770 69 74 79 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e  ity = comparison
10780 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b  Affinity(pExpr);
10790 0a 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  ...      /* Code
107a0 20 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d   the <expr> from
107b0 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e   "<expr> IN (...
107c0 29 22 2e 20 54 68 65 20 74 65 6d 70 6f 72 61 72  )". The temporar
107d0 79 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a  y table.      **
107e0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 63   pExpr->iTable c
107f0 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75  ontains the valu
10800 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  es that make up 
10810 74 68 65 20 28 2e 2e 2e 29 20 73 65 74 2e 0a 20  the (...) set.. 
10820 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50       */.      pP
10830 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c  arse->disableCol
10840 43 61 63 68 65 2b 2b 3b 0a 20 20 20 20 20 20 73  Cache++;.      s
10850 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
10860 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
10870 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  eft, target);.  
10880 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61      pParse->disa
10890 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20  bleColCache--;. 
108a0 20 20 20 20 20 6a 32 20 3d 20 73 71 6c 69 74 65       j2 = sqlite
108b0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
108c0 50 5f 49 73 4e 75 6c 6c 2c 20 74 61 72 67 65 74  P_IsNull, target
108d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  );.      if( eTy
108e0 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  pe==IN_INDEX_ROW
108f0 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 33  ID ){.        j3
10900 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
10910 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp1(v, OP_MustB
10920 65 49 6e 74 2c 20 74 61 72 67 65 74 29 3b 0a 20  eInt, target);. 
10930 20 20 20 20 20 20 20 6a 34 20 3d 20 73 71 6c 69         j4 = sqli
10940 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
10950 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 70   OP_NotExists, p
10960 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c  Expr->iTable, 0,
10970 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
10980 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10990 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
109a0 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 1, target);. 
109b0 20 20 20 20 20 20 20 6a 35 20 3d 20 73 71 6c 69         j5 = sqli
109c0 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
109d0 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 20   OP_Goto);.     
109e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
109f0 6d 70 48 65 72 65 28 76 2c 20 6a 33 29 3b 0a 20  mpHere(v, j3);. 
10a00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10a10 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 34  beJumpHere(v, j4
10a20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
10a30 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
10a40 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 74  OP_Integer, 0, t
10a50 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 65  arget);.      }e
10a60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 32 20  lse{.        r2 
10a70 3d 20 72 65 67 46 72 65 65 32 20 3d 20 73 71 6c  = regFree2 = sql
10a80 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
10a90 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 20  Parse);..       
10aa0 20 2f 2a 20 43 72 65 61 74 65 20 61 20 72 65 63   /* Create a rec
10ab0 6f 72 64 20 61 6e 64 20 74 65 73 74 20 66 6f 72  ord and test for
10ac0 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70 2e   set membership.
10ad0 20 49 66 20 74 68 65 20 73 65 74 20 63 6f 6e 74   If the set cont
10ae0 61 69 6e 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ains.        ** 
10af0 74 68 65 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  the value, then 
10b00 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20  jump to the end 
10b10 6f 66 20 74 68 65 20 74 65 73 74 20 63 6f 64 65  of the test code
10b20 2e 20 54 68 65 20 74 61 72 67 65 74 0a 20 20 20  . The target.   
10b30 20 20 20 20 20 2a 2a 20 72 65 67 69 73 74 65 72       ** register
10b40 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20   still contains 
10b50 74 68 65 20 74 72 75 65 20 28 31 29 20 76 61 6c  the true (1) val
10b60 75 65 20 77 72 69 74 74 65 6e 20 74 6f 20 69 74  ue written to it
10b70 20 65 61 72 6c 69 65 72 2e 0a 20 20 20 20 20 20   earlier..      
10b80 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c    */.        sql
10b90 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
10ba0 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
10bb0 20 74 61 72 67 65 74 2c 20 31 2c 20 72 32 2c 20   target, 1, r2, 
10bc0 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20  &affinity, 1);. 
10bd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10be0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
10bf0 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65  nteger, 1, targe
10c00 74 29 3b 0a 20 20 20 20 20 20 20 20 6a 35 20 3d  t);.        j5 =
10c10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10c20 70 33 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  p3(v, OP_Found, 
10c30 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30  pExpr->iTable, 0
10c40 2c 20 72 32 29 3b 0a 0a 20 20 20 20 20 20 20 20  , r2);..        
10c50 2f 2a 20 49 66 20 74 68 65 20 73 65 74 20 6d 65  /* If the set me
10c60 6d 62 65 72 73 68 69 70 20 74 65 73 74 20 66 61  mbership test fa
10c70 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65  ils, then the re
10c80 73 75 6c 74 20 6f 66 20 74 68 65 20 0a 20 20 20  sult of the .   
10c90 20 20 20 20 20 2a 2a 20 22 78 20 49 4e 20 28 2e       ** "x IN (.
10ca0 2e 2e 29 22 20 65 78 70 72 65 73 73 69 6f 6e 20  ..)" expression 
10cb0 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 30  must be either 0
10cc0 20 6f 72 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65   or NULL. If the
10cd0 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20   set.        ** 
10ce0 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c  contains no NULL
10cf0 20 76 61 6c 75 65 73 2c 20 74 68 65 6e 20 74 68   values, then th
10d00 65 20 72 65 73 75 6c 74 20 69 73 20 30 2e 20 49  e result is 0. I
10d10 66 20 74 68 65 20 73 65 74 20 0a 20 20 20 20 20  f the set .     
10d20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6f     ** contains o
10d30 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20  ne or more NULL 
10d40 76 61 6c 75 65 73 2c 20 74 68 65 6e 20 74 68 65  values, then the
10d50 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20   result of the. 
10d60 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73         ** expres
10d70 73 69 6f 6e 20 69 73 20 61 6c 73 6f 20 4e 55 4c  sion is also NUL
10d80 4c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  L..        */.  
10d90 20 20 20 20 20 20 69 66 28 20 72 4e 6f 74 46 6f        if( rNotFo
10da0 75 6e 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  und==0 ){.      
10db0 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
10dc0 63 68 20 72 75 6e 73 20 69 66 20 69 74 20 69 73  ch runs if it is
10dd0 20 6b 6e 6f 77 6e 20 61 74 20 63 6f 6d 70 69 6c   known at compil
10de0 65 20 74 69 6d 65 20 28 6e 6f 77 29 20 74 68 61  e time (now) tha
10df0 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  t .          ** 
10e00 74 68 65 20 73 65 74 20 63 6f 6e 74 61 69 6e 73  the set contains
10e10 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e   no NULL values.
10e20 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 61 73   This happens as
10e30 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20   the result.    
10e40 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 22 4e        ** of a "N
10e50 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61  OT NULL" constra
10e60 69 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  int in the datab
10e70 61 73 65 20 73 63 68 65 6d 61 2e 20 4e 6f 20 6e  ase schema. No n
10e80 65 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  eed.          **
10e90 20 74 6f 20 74 65 73 74 20 74 68 65 20 64 61 74   to test the dat
10ea0 61 20 73 74 72 75 63 74 75 72 65 20 61 74 20 72  a structure at r
10eb0 75 6e 74 69 6d 65 20 69 6e 20 74 68 69 73 20 63  untime in this c
10ec0 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ase..          *
10ed0 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  /.          sqli
10ee0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10ef0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
10f00 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
10f10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10f20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
10f30 70 6f 70 75 6c 61 74 65 73 20 74 68 65 20 72 4e  populates the rN
10f40 6f 74 46 6f 75 6e 64 20 72 65 67 69 73 74 65 72  otFound register
10f50 20 77 69 74 68 20 65 69 74 68 65 72 20 4e 55 4c   with either NUL
10f60 4c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f  L.          ** o
10f70 72 20 30 20 28 61 6e 20 69 6e 74 65 67 65 72 20  r 0 (an integer 
10f80 76 61 6c 75 65 29 2e 20 49 66 20 74 68 65 20 64  value). If the d
10f90 61 74 61 20 73 74 72 75 63 74 75 72 65 20 63 6f  ata structure co
10fa0 6e 74 61 69 6e 73 20 6f 6e 65 0a 20 20 20 20 20  ntains one.     
10fb0 20 20 20 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20       ** or more 
10fc0 4e 55 4c 4c 73 2c 20 74 68 65 6e 20 73 65 74 20  NULLs, then set 
10fd0 72 4e 6f 74 46 6f 75 6e 64 20 74 6f 20 4e 55 4c  rNotFound to NUL
10fe0 4c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65  L. Otherwise, se
10ff0 74 20 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a  t it.          *
11000 2a 20 74 6f 20 30 2e 20 49 66 20 72 65 67 69 73  * to 0. If regis
11010 74 65 72 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c  ter rMayHaveNull
11020 20 69 73 20 61 6c 72 65 61 64 79 20 73 65 74 20   is already set 
11030 74 6f 20 73 6f 6d 65 20 76 61 6c 75 65 0a 20 20  to some value.  
11040 20 20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72          ** other
11050 20 74 68 61 6e 20 4e 55 4c 4c 2c 20 74 68 65 6e   than NULL, then
11060 20 74 68 65 20 74 65 73 74 20 68 61 73 20 61 6c   the test has al
11070 72 65 61 64 79 20 62 65 65 6e 20 72 75 6e 20 61  ready been run a
11080 6e 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  nd .          **
11090 20 72 4e 6f 74 46 6f 75 6e 64 20 69 73 20 61 6c   rNotFound is al
110a0 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64 2e  ready populated.
110b0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
110c0 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63          static c
110d0 6f 6e 73 74 20 63 68 61 72 20 6e 75 6c 6c 52 65  onst char nullRe
110e0 63 6f 72 64 5b 5d 20 3d 20 7b 20 30 78 30 32 2c  cord[] = { 0x02,
110f0 20 30 78 30 30 20 7d 3b 0a 20 20 20 20 20 20 20   0x00 };.       
11100 20 20 20 6a 33 20 3d 20 73 71 6c 69 74 65 33 56     j3 = sqlite3V
11110 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
11120 4e 6f 74 4e 75 6c 6c 2c 20 72 4d 61 79 48 61 76  NotNull, rMayHav
11130 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  eNull);.        
11140 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11150 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
11160 30 2c 20 72 4e 6f 74 46 6f 75 6e 64 29 3b 0a 20  0, rNotFound);. 
11170 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11180 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
11190 5f 42 6c 6f 62 2c 20 32 2c 20 72 4d 61 79 48 61  _Blob, 2, rMayHa
111a0 76 65 4e 75 6c 6c 2c 20 30 2c 20 0a 20 20 20 20  veNull, 0, .    
111b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111c0 20 20 20 20 20 20 20 20 20 6e 75 6c 6c 52 65 63           nullRec
111d0 6f 72 64 2c 20 50 34 5f 53 54 41 54 49 43 29 3b  ord, P4_STATIC);
111e0 0a 20 20 20 20 20 20 20 20 20 20 6a 34 20 3d 20  .          j4 = 
111f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11200 33 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70  3(v, OP_Found, p
11210 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c  Expr->iTable, 0,
11220 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 29 3b 0a   rMayHaveNull);.
11230 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11240 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11250 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 4e  P_Integer, 0, rN
11260 6f 74 46 6f 75 6e 64 29 3b 0a 20 20 20 20 20 20  otFound);.      
11270 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
11280 75 6d 70 48 65 72 65 28 76 2c 20 6a 34 29 3b 0a  umpHere(v, j4);.
11290 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
112a0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
112b0 20 6a 33 29 3b 0a 0a 20 20 20 20 20 20 20 20 20   j3);..         
112c0 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 76 61 6c   /* Copy the val
112d0 75 65 20 6f 66 20 72 65 67 69 73 74 65 72 20 72  ue of register r
112e0 4e 6f 74 46 6f 75 6e 64 20 28 77 68 69 63 68 20  NotFound (which 
112f0 69 73 20 65 69 74 68 65 72 20 4e 55 4c 4c 20 6f  is either NULL o
11300 72 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 2a  r 0).          *
11310 2a 20 69 6e 74 6f 20 74 68 65 20 74 61 72 67 65  * into the targe
11320 74 20 72 65 67 69 73 74 65 72 2e 20 54 68 69 73  t register. This
11330 20 77 69 6c 6c 20 62 65 20 74 68 65 20 72 65 73   will be the res
11340 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20  ult of the.     
11350 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69       ** expressi
11360 6f 6e 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  on..          */
11370 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
11380 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11390 4f 50 5f 43 6f 70 79 2c 20 72 4e 6f 74 46 6f 75  OP_Copy, rNotFou
113a0 6e 64 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  nd, target);.   
113b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
113c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
113d0 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 32 29 3b  JumpHere(v, j2);
113e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
113f0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 35  beJumpHere(v, j5
11400 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
11410 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 49 4e  ment((v, "end IN
11420 20 65 78 70 72 20 72 25 64 22 2c 20 74 61 72 67   expr r%d", targ
11430 65 74 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61  et));.      brea
11440 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
11450 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20      /*.    **   
11460 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44   x BETWEEN y AND
11470 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a   z.    **.    **
11480 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61 6c   This is equival
11490 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20  ent to.    **.  
114a0 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44    **    x>=y AND
114b0 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20   x<=z.    **.   
114c0 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65 64 20   ** X is stored 
114d0 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e  in pExpr->pLeft.
114e0 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73 74 6f  .    ** Y is sto
114f0 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
11500 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e  ist->a[0].pExpr.
11510 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f  .    ** Z is sto
11520 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
11530 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e  ist->a[1].pExpr.
11540 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
11550 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
11560 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
11570 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
11580 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
11590 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 49  prList_item *pLI
115a0 74 65 6d 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  tem = pExpr->pLi
115b0 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 45 78 70  st->a;.      Exp
115c0 72 20 2a 70 52 69 67 68 74 20 3d 20 70 4c 49 74  r *pRight = pLIt
115d0 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20 20  em->pExpr;..    
115e0 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 4f 70 65    codeCompareOpe
115f0 72 61 6e 64 73 28 70 50 61 72 73 65 2c 20 70 4c  rands(pParse, pL
11600 65 66 74 2c 20 26 72 31 2c 20 26 72 65 67 46 72  eft, &r1, &regFr
11610 65 65 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ee1,.           
11620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11630 20 20 20 20 20 20 20 70 52 69 67 68 74 2c 20 26         pRight, &
11640 72 32 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  r2, &regFree2);.
11650 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
11660 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
11670 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
11680 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
11690 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33      r3 = sqlite3
116a0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
116b0 65 29 3b 0a 20 20 20 20 20 20 72 34 20 3d 20 73  e);.      r4 = s
116c0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
116d0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
116e0 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
116f0 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  se, pLeft, pRigh
11700 74 2c 20 4f 50 5f 47 65 2c 0a 20 20 20 20 20 20  t, OP_Ge,.      
11710 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
11720 72 32 2c 20 72 33 2c 20 53 51 4c 49 54 45 5f 53  r2, r3, SQLITE_S
11730 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20 70  TOREP2);.      p
11740 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70  LItem++;.      p
11750 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e  Right = pLItem->
11760 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  pExpr;.      sql
11770 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
11780 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
11790 65 65 32 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee2);.      r2 =
117a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
117b0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 52 69  Temp(pParse, pRi
117c0 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
117d0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
117e0 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
117f0 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
11800 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  e(pParse, pLeft,
11810 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20   pRight, OP_Le, 
11820 72 31 2c 20 72 32 2c 20 72 34 2c 20 53 51 4c 49  r1, r2, r4, SQLI
11830 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20  TE_STOREP2);.   
11840 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11850 64 4f 70 33 28 76 2c 20 4f 50 5f 41 6e 64 2c 20  dOp3(v, OP_And, 
11860 72 33 2c 20 72 34 2c 20 74 61 72 67 65 74 29 3b  r3, r4, target);
11870 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
11880 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
11890 72 73 65 2c 20 72 33 29 3b 0a 20 20 20 20 20 20  rse, r3);.      
118a0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
118b0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 34  mpReg(pParse, r4
118c0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
118d0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
118e0 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20  K_UPLUS: {.     
118f0 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
11900 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
11910 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
11920 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  eft, target);.  
11930 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11940 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
11950 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20  Form A:.    **  
11960 20 43 41 53 45 20 78 20 57 48 45 4e 20 65 31 20   CASE x WHEN e1 
11970 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20  THEN r1 WHEN e2 
11980 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e  THEN r2 ... WHEN
11990 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45   eN THEN rN ELSE
119a0 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20   y END.    **.  
119b0 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20    ** Form B:.   
119c0 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20   **   CASE WHEN 
119d0 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20  e1 THEN r1 WHEN 
119e0 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57  e2 THEN r2 ... W
119f0 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45  HEN eN THEN rN E
11a00 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a  LSE y END.    **
11a10 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69  .    ** Form A i
11a20 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66 6f  s can be transfo
11a30 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20 65 71  rmed into the eq
11a40 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20  uivalent form B 
11a50 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
11a60 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 78  **   CASE WHEN x
11a70 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e  =e1 THEN r1 WHEN
11a80 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20 2e 2e   x=e2 THEN r2 ..
11a90 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ..    **        
11aa0 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72  WHEN x=eN THEN r
11ab0 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20  N ELSE y END.   
11ac0 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69 66   **.    ** X (if
11ad0 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20 69   it exists) is i
11ae0 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a  n pExpr->pLeft..
11af0 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e 20 70      ** Y is in p
11b00 45 78 70 72 2d 3e 70 52 69 67 68 74 2e 20 20 54  Expr->pRight.  T
11b10 68 65 20 59 20 69 73 20 61 6c 73 6f 20 6f 70 74  he Y is also opt
11b20 69 6f 6e 61 6c 2e 20 20 49 66 20 74 68 65 72 65  ional.  If there
11b30 20 69 73 20 6e 6f 0a 20 20 20 20 2a 2a 20 45 4c   is no.    ** EL
11b40 53 45 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f  SE clause and no
11b50 20 6f 74 68 65 72 20 74 65 72 6d 20 6d 61 74 63   other term matc
11b60 68 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65  hes, then the re
11b70 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 20 20  sult of the.    
11b80 2a 2a 20 65 78 70 72 73 73 69 6f 6e 20 69 73 20  ** exprssion is 
11b90 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69 20  NULL..    ** Ei 
11ba0 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69  is in pExpr->pLi
11bb0 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20 52  st->a[i*2] and R
11bc0 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c 69 73  i is pExpr->pLis
11bd0 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20  t->a[i*2+1]..   
11be0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
11bf0 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65 78 70  esult of the exp
11c00 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20 52  ression is the R
11c10 69 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  i for the first 
11c20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20 20 20  matching Ei,.   
11c30 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72 65 20   ** or if there 
11c40 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 45  is no matching E
11c50 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65 72 6d  i, the ELSE term
11c60 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20   Y, or if there 
11c70 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c 53  is.    ** no ELS
11c80 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20  E term, NULL..  
11c90 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
11ca0 5f 43 41 53 45 3a 20 7b 0a 20 20 20 20 20 20 69  _CASE: {.      i
11cb0 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20  nt endLabel;    
11cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cd0 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66   /* GOTO label f
11ce0 6f 72 20 65 6e 64 20 6f 66 20 43 41 53 45 20 73  or end of CASE s
11cf0 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  tmt */.      int
11d00 20 6e 65 78 74 43 61 73 65 3b 20 20 20 20 20 20   nextCase;      
11d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11d20 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72  * GOTO label for
11d30 20 6e 65 78 74 20 57 48 45 4e 20 63 6c 61 75 73   next WHEN claus
11d40 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  e */.      int n
11d50 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20  Expr;           
11d60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11d70 32 78 20 6e 75 6d 62 65 72 20 6f 66 20 57 48 45  2x number of WHE
11d80 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  N terms */.     
11d90 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
11da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11db0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
11dc0 65 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  er */.      Expr
11dd0 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20  List *pEList;   
11de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11df0 20 4c 69 73 74 20 6f 66 20 57 48 45 4e 20 74 65   List of WHEN te
11e00 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72  rms */.      str
11e10 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
11e20 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f  m *aListelem;  /
11e30 2a 20 41 72 72 61 79 20 6f 66 20 57 48 45 4e 20  * Array of WHEN 
11e40 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45  terms */.      E
11e50 78 70 72 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20  xpr opCompare;  
11e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e70 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69 20 65 78   /* The X==Ei ex
11e80 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
11e90 20 20 45 78 70 72 20 63 61 63 68 65 58 3b 20 20    Expr cacheX;  
11ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11eb0 20 20 20 20 2f 2a 20 43 61 63 68 65 64 20 65 78      /* Cached ex
11ec0 70 72 65 73 73 69 6f 6e 20 58 20 2a 2f 0a 20 20  pression X */.  
11ed0 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20      Expr *pX;   
11ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ef0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 20 65        /* The X e
11f00 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
11f10 20 20 20 45 78 70 72 20 2a 70 54 65 73 74 3b 20     Expr *pTest; 
11f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f30 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66       /* X==Ei (f
11f40 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73 74 20 45  orm A) or just E
11f50 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 0a 20  i (form B) */.. 
11f60 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70       assert(pExp
11f70 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  r->pList);.     
11f80 20 61 73 73 65 72 74 28 28 70 45 78 70 72 2d 3e   assert((pExpr->
11f90 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 25 20 32  pList->nExpr % 2
11fa0 29 20 3d 3d 20 30 29 3b 0a 20 20 20 20 20 20 61  ) == 0);.      a
11fb0 73 73 65 72 74 28 70 45 78 70 72 2d 3e 70 4c 69  ssert(pExpr->pLi
11fc0 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a  st->nExpr > 0);.
11fd0 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70        pEList = p
11fe0 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20  Expr->pList;.   
11ff0 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70     aListelem = p
12000 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  EList->a;.      
12010 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e  nExpr = pEList->
12020 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64  nExpr;.      end
12030 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56  Label = sqlite3V
12040 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
12050 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 20 3d  .      if( (pX =
12060 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d   pExpr->pLeft)!=
12070 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 63  0 ){.        cac
12080 68 65 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20  heX = *pX;.     
12090 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d     testcase( pX-
120a0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op==TK_COLUMN |
120b0 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47  | pX->op==TK_REG
120c0 49 53 54 45 52 20 29 3b 0a 20 20 20 20 20 20 20  ISTER );.       
120d0 20 63 61 63 68 65 58 2e 69 54 61 62 6c 65 20 3d   cacheX.iTable =
120e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
120f0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2c  Temp(pParse, pX,
12100 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
12110 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
12120 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
12130 20 20 20 20 20 20 63 61 63 68 65 58 2e 6f 70 20        cacheX.op 
12140 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20  = TK_REGISTER;. 
12150 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65         opCompare
12160 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20  .op = TK_EQ;.   
12170 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70       opCompare.p
12180 4c 65 66 74 20 3d 20 26 63 61 63 68 65 58 3b 0a  Left = &cacheX;.
12190 20 20 20 20 20 20 20 20 70 54 65 73 74 20 3d 20          pTest = 
121a0 26 6f 70 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20  &opCompare;.    
121b0 20 20 7d 0a 20 20 20 20 20 20 70 50 61 72 73 65    }.      pParse
121c0 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68  ->disableColCach
121d0 65 2b 2b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  e++;.      for(i
121e0 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 3d 69  =0; i<nExpr; i=i
121f0 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  +2){.        if(
12200 20 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20   pX ){.         
12210 20 6f 70 43 6f 6d 70 61 72 65 2e 70 52 69 67 68   opCompare.pRigh
12220 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d  t = aListelem[i]
12230 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
12240 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
12250 20 70 54 65 73 74 20 3d 20 61 4c 69 73 74 65 6c   pTest = aListel
12260 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  em[i].pExpr;.   
12270 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e       }.        n
12280 65 78 74 43 61 73 65 20 3d 20 73 71 6c 69 74 65  extCase = sqlite
12290 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
122a0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
122b0 61 73 65 28 20 70 54 65 73 74 2d 3e 6f 70 3d 3d  ase( pTest->op==
122c0 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 54 65  TK_COLUMN || pTe
122d0 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  st->op==TK_REGIS
122e0 54 45 52 20 29 3b 0a 20 20 20 20 20 20 20 20 73  TER );.        s
122f0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
12300 65 28 70 50 61 72 73 65 2c 20 70 54 65 73 74 2c  e(pParse, pTest,
12310 20 6e 65 78 74 43 61 73 65 2c 20 53 51 4c 49 54   nextCase, SQLIT
12320 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
12330 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
12340 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e   aListelem[i+1].
12350 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
12360 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  LUMN );.        
12370 74 65 73 74 63 61 73 65 28 20 61 4c 69 73 74 65  testcase( aListe
12380 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e  lem[i+1].pExpr->
12390 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
123a0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
123b0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
123c0 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31  e, aListelem[i+1
123d0 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
123e0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
123f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12400 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 6e 64 4c 61  P_Goto, 0, endLa
12410 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  bel);.        sq
12420 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
12430 4c 61 62 65 6c 28 76 2c 20 6e 65 78 74 43 61 73  Label(v, nextCas
12440 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
12450 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69    if( pExpr->pRi
12460 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ght ){.        s
12470 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
12480 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
12490 69 67 68 74 2c 20 74 61 72 67 65 74 29 3b 0a 20  ight, target);. 
124a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
124b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
124c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
124d0 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
124e0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
124f0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
12500 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29  bel(v, endLabel)
12510 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
12520 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43  pParse->disableC
12530 6f 6c 43 61 63 68 65 3e 30 20 29 3b 0a 20 20 20  olCache>0 );.   
12540 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62     pParse->disab
12550 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20  leColCache--;.  
12560 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
12570 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12580 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20  OMIT_TRIGGER.   
12590 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20   case TK_RAISE: 
125a0 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  {.      if( !pPa
125b0 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 29  rse->trigStack )
125c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
125d0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
125e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
125f0 20 20 20 20 20 20 20 20 20 22 52 41 49 53 45 28           "RAISE(
12600 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73  ) may only be us
12610 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 69 67  ed within a trig
12620 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20  ger-program");. 
12630 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
12640 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
12650 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
12660 6e 21 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a  n!=OE_Ignore ){.
12670 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
12680 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d   pExpr->iColumn=
12690 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 7c 7c 0a  =OE_Rollback ||.
126a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126b0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
126c0 3d 3d 20 4f 45 5f 41 62 6f 72 74 20 7c 7c 0a 20  == OE_Abort ||. 
126d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126e0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
126f0 3d 20 4f 45 5f 46 61 69 6c 20 29 3b 0a 20 20 20  = OE_Fail );.   
12700 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71        sqlite3Deq
12710 75 6f 74 65 45 78 70 72 28 64 62 2c 20 70 45 78  uoteExpr(db, pEx
12720 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71  pr);.         sq
12730 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
12740 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49  v, OP_Halt, SQLI
12750 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 70  TE_CONSTRAINT, p
12760 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 30  Expr->iColumn, 0
12770 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12780 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
12790 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  )pExpr->token.z,
127a0 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29   pExpr->token.n)
127b0 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ;.      } else {
127c0 0a 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74  .         assert
127d0 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
127e0 20 3d 3d 20 4f 45 5f 49 67 6e 6f 72 65 20 29 3b   == OE_Ignore );
127f0 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
12800 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12810 50 5f 43 6f 6e 74 65 78 74 50 6f 70 2c 20 30 2c  P_ContextPop, 0,
12820 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71   0);.         sq
12830 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12840 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70  v, OP_Goto, 0, p
12850 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b  Parse->trigStack
12860 2d 3e 69 67 6e 6f 72 65 4a 75 6d 70 29 3b 0a 20  ->ignoreJump);. 
12870 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
12880 65 6e 74 28 28 76 2c 20 22 72 61 69 73 65 28 49  ent((v, "raise(I
12890 47 4e 4f 52 45 29 22 29 29 3b 0a 20 20 20 20 20  GNORE)"));.     
128a0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
128b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
128c0 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
128d0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
128e0 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
128f0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
12900 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
12910 72 65 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  ree2);.  return 
12920 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  inReg;.}../*.** 
12930 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
12940 20 65 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70   evaluate an exp
12950 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72  ression and stor
12960 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a  e the results.**
12970 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72   into a register
12980 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  .  Return the re
12990 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68  gister number wh
129a0 65 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ere the results.
129b0 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a  ** are stored..*
129c0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 67 69  *.** If the regi
129d0 73 74 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72  ster is a tempor
129e0 61 72 79 20 72 65 67 69 73 74 65 72 20 74 68 61  ary register tha
129f0 74 20 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63  t can be dealloc
12a00 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72  ated,.** then wr
12a10 69 74 65 20 69 74 73 20 6e 75 6d 62 65 72 20 69  ite its number i
12a20 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49 66 20 74  nto *pReg.  If t
12a30 68 65 20 72 65 73 75 6c 74 20 72 65 67 69 73 74  he result regist
12a40 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74  er is not.** a t
12a50 65 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e 20 73  emporary, then s
12a60 65 74 20 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f  et *pReg to zero
12a70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12a80 45 78 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72  ExprCodeTemp(Par
12a90 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
12aa0 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52   *pExpr, int *pR
12ab0 65 67 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20  eg){.  int r1 = 
12ac0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
12ad0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  g(pParse);.  int
12ae0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
12af0 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
12b00 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29 3b 0a  se, pExpr, r1);.
12b10 20 20 69 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a    if( r2==r1 ){.
12b20 20 20 20 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a      *pReg = r1;.
12b30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
12b40 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
12b50 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
12b60 20 20 20 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20      *pReg = 0;. 
12b70 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 32 3b 0a   }.  return r2;.
12b80 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
12b90 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
12ba0 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73   evaluate expres
12bb0 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73  sion pExpr and s
12bc0 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75  tore the.** resu
12bd0 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  lts in register 
12be0 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73  target.  The res
12bf0 75 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e 74  ults are guarant
12c00 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a  eed to appear.**
12c10 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72   in register tar
12c20 67 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  get..*/.int sqli
12c30 74 65 33 45 78 70 72 43 6f 64 65 28 50 61 72 73  te3ExprCode(Pars
12c40 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
12c50 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
12c60 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67  et){.  int inReg
12c70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72  ;..  assert( tar
12c80 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c  get>0 && target<
12c90 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b  =pParse->nMem );
12ca0 0a 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74  .  inReg = sqlit
12cb0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
12cc0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
12cd0 74 61 72 67 65 74 29 3b 0a 20 20 61 73 73 65 72  target);.  asser
12ce0 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  t( pParse->pVdbe
12cf0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
12d00 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
12d10 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72    if( inReg!=tar
12d20 67 65 74 20 26 26 20 70 50 61 72 73 65 2d 3e 70  get && pParse->p
12d30 56 64 62 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Vdbe ){.    sqli
12d40 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50  te3VdbeAddOp2(pP
12d50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
12d60 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61  SCopy, inReg, ta
12d70 72 67 65 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  rget);.  }.  ret
12d80 75 72 6e 20 74 61 72 67 65 74 3b 0a 7d 0a 0a 2f  urn target;.}../
12d90 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
12da0 64 65 20 74 68 61 74 20 65 76 61 6c 75 74 65 73  de that evalutes
12db0 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
12dc0 73 73 69 6f 6e 20 61 6e 64 20 70 75 74 73 20 74  ssion and puts t
12dd0 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20  he result.** in 
12de0 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
12df0 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65  .**.** Also make
12e00 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65   a copy of the e
12e10 78 70 72 65 73 73 69 6f 6e 20 72 65 73 75 6c 74  xpression result
12e20 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22  s into another "
12e30 63 61 63 68 65 22 20 72 65 67 69 73 74 65 72 0a  cache" register.
12e40 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68  ** and modify th
12e50 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73 6f 20  e expression so 
12e60 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 74 69  that the next ti
12e70 6d 65 20 69 74 20 69 73 20 65 76 61 6c 75 61 74  me it is evaluat
12e80 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  ed,.** the resul
12e90 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74  t is a copy of t
12ea0 68 65 20 63 61 63 68 65 20 72 65 67 69 73 74 65  he cache registe
12eb0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  r..**.** This ro
12ec0 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
12ed0 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  r expressions th
12ee0 61 74 20 61 72 65 20 75 73 65 64 20 6d 75 6c 74  at are used mult
12ef0 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20  iple .** times. 
12f00 20 54 68 65 79 20 61 72 65 20 65 76 61 6c 75 61   They are evalua
12f10 74 65 64 20 6f 6e 63 65 20 61 6e 64 20 74 68 65  ted once and the
12f20 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
12f30 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72  expression.** ar
12f40 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 69 6e 74  e reused..*/.int
12f50 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
12f60 41 6e 64 43 61 63 68 65 28 50 61 72 73 65 20 2a  AndCache(Parse *
12f70 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
12f80 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
12f90 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
12fa0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
12fb0 6e 74 20 69 6e 52 65 67 3b 0a 20 20 69 6e 52 65  nt inReg;.  inRe
12fc0 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
12fd0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
12fe0 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 61 73  r, target);.  as
12ff0 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29  sert( target>0 )
13000 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
13010 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p!=TK_REGISTER )
13020 7b 20 20 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d  {  .    int iMem
13030 3b 0a 20 20 20 20 69 4d 65 6d 20 3d 20 2b 2b 70  ;.    iMem = ++p
13040 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
13050 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13060 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 69  p2(v, OP_Copy, i
13070 6e 52 65 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  nReg, iMem);.   
13080 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
13090 20 69 4d 65 6d 3b 0a 20 20 20 20 70 45 78 70 72   iMem;.    pExpr
130a0 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54  ->op = TK_REGIST
130b0 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ER;.  }.  return
130c0 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   inReg;.}../*.**
130d0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
130e0 70 45 78 70 72 20 69 73 20 61 6e 20 63 6f 6e 73  pExpr is an cons
130f0 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  tant expression 
13100 74 68 61 74 20 69 73 20 61 70 70 72 6f 70 72 69  that is appropri
13110 61 74 65 0a 2a 2a 20 66 6f 72 20 66 61 63 74 6f  ate.** for facto
13120 72 69 6e 67 20 6f 75 74 20 6f 66 20 61 20 6c 6f  ring out of a lo
13130 6f 70 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65  op.  Appropriate
13140 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
13150 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 41 6e  :.**.**    *  An
13160 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  y expression tha
13170 74 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 74  t evaluates to t
13180 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 70 63 6f 64  wo or more opcod
13190 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20  es..**.**    *  
131a0 41 6e 79 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  Any OP_Integer, 
131b0 4f 50 5f 52 65 61 6c 2c 20 4f 50 5f 53 74 72 69  OP_Real, OP_Stri
131c0 6e 67 2c 20 4f 50 5f 42 6c 6f 62 2c 20 4f 50 5f  ng, OP_Blob, OP_
131d0 4e 75 6c 6c 2c 20 0a 2a 2a 20 20 20 20 20 20 20  Null, .**       
131e0 6f 72 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 74  or OP_Variable t
131f0 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
13200 64 20 74 6f 20 62 65 20 70 6c 61 63 65 64 20 69  d to be placed i
13210 6e 20 61 20 0a 2a 2a 20 20 20 20 20 20 20 73 70  n a .**       sp
13220 65 63 69 66 69 63 20 72 65 67 69 73 74 65 72 2e  ecific register.
13230 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
13240 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 66 61 63 74  no point in fact
13250 6f 72 69 6e 67 20 6f 75 74 20 73 69 6e 67 6c 65  oring out single
13260 2d 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 6f 6e  -instruction con
13270 73 74 61 6e 74 0a 2a 2a 20 65 78 70 72 65 73 73  stant.** express
13280 69 6f 6e 73 20 74 68 61 74 20 6e 65 65 64 20 74  ions that need t
13290 6f 20 62 65 20 70 6c 61 63 65 64 20 69 6e 20 61  o be placed in a
132a0 20 70 61 72 74 69 63 75 6c 61 72 20 72 65 67 69   particular regi
132b0 73 74 65 72 2e 20 20 0a 2a 2a 20 57 65 20 63 6f  ster.  .** We co
132c0 75 6c 64 20 66 61 63 74 6f 72 20 74 68 65 6d 20  uld factor them 
132d0 6f 75 74 2c 20 62 75 74 20 74 68 65 6e 20 77 65  out, but then we
132e0 20 77 6f 75 6c 64 20 65 6e 64 20 75 70 20 61 64   would end up ad
132f0 64 69 6e 67 20 61 6e 0a 2a 2a 20 4f 50 5f 53 43  ding an.** OP_SC
13300 6f 70 79 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  opy instruction 
13310 74 6f 20 6d 6f 76 65 20 74 68 65 20 76 61 6c 75  to move the valu
13320 65 20 69 6e 74 6f 20 74 68 65 20 63 6f 72 72 65  e into the corre
13330 63 74 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 6c  ct register.** l
13340 61 74 65 72 2e 20 20 57 65 20 6d 69 67 68 74 20  ater.  We might 
13350 61 73 20 77 65 6c 6c 20 6a 75 73 74 20 75 73 65  as well just use
13360 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e   the original in
13370 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a  struction and.**
13380 20 61 76 6f 69 64 20 74 68 65 20 4f 50 5f 53 43   avoid the OP_SC
13390 6f 70 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  opy..*/.static i
133a0 6e 74 20 69 73 41 70 70 72 6f 70 72 69 61 74 65  nt isAppropriate
133b0 46 6f 72 46 61 63 74 6f 72 69 6e 67 28 45 78 70  ForFactoring(Exp
133c0 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 21 73 71  r *p){.  if( !sq
133d0 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
133e0 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 29 20 29 7b  antNotJoin(p) ){
133f0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
13400 2f 2a 20 4f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74  /* Only constant
13410 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
13420 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
13430 20 66 61 63 74 6f 72 69 6e 67 20 2a 2f 0a 20 20   factoring */.  
13440 7d 0a 20 20 69 66 28 20 28 70 2d 3e 66 6c 61 67  }.  if( (p->flag
13450 73 20 26 20 45 50 5f 46 69 78 65 64 44 65 73 74  s & EP_FixedDest
13460 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
13470 72 6e 20 31 3b 20 20 2f 2a 20 41 6e 79 20 63 6f  rn 1;  /* Any co
13480 6e 73 74 61 6e 74 20 77 69 74 68 6f 75 74 20 61  nstant without a
13490 20 66 69 78 65 64 20 64 65 73 74 69 6e 61 74 69   fixed destinati
134a0 6f 6e 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  on is appropriat
134b0 65 20 2a 2f 0a 20 20 7d 0a 20 20 77 68 69 6c 65  e */.  }.  while
134c0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55  ( p->op==TK_UPLU
134d0 53 20 29 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74  S ) p = p->pLeft
134e0 3b 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  ;.  switch( p->o
134f0 70 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  p ){.#ifndef SQL
13500 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49  ITE_OMIT_BLOB_LI
13510 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54  TERAL.    case T
13520 4b 5f 42 4c 4f 42 3a 0a 23 65 6e 64 69 66 0a 20  K_BLOB:.#endif. 
13530 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41     case TK_VARIA
13540 42 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  BLE:.    case TK
13550 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61  _INTEGER:.    ca
13560 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20  se TK_FLOAT:.   
13570 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20   case TK_NULL:. 
13580 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
13590 47 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  G: {.      testc
135a0 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 42  ase( p->op==TK_B
135b0 4c 4f 42 20 29 3b 0a 20 20 20 20 20 20 74 65 73  LOB );.      tes
135c0 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
135d0 5f 56 41 52 49 41 42 4c 45 20 29 3b 0a 20 20 20  _VARIABLE );.   
135e0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
135f0 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29  op==TK_INTEGER )
13600 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
13610 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41  ( p->op==TK_FLOA
13620 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
13630 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 4e  ase( p->op==TK_N
13640 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ULL );.      tes
13650 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
13660 5f 53 54 52 49 4e 47 20 29 3b 0a 20 20 20 20 20  _STRING );.     
13670 20 2f 2a 20 53 69 6e 67 6c 65 2d 69 6e 73 74 72   /* Single-instr
13680 75 63 74 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 73  uction constants
13690 20 77 69 74 68 20 61 20 66 69 78 65 64 20 64 65   with a fixed de
136a0 73 74 69 6e 61 74 69 6f 6e 20 61 72 65 0a 20 20  stination are.  
136b0 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20 64 6f      ** better do
136c0 6e 65 20 69 6e 2d 6c 69 6e 65 2e 20 20 49 66 20  ne in-line.  If 
136d0 77 65 20 66 61 63 74 6f 72 20 74 68 65 6d 2c 20  we factor them, 
136e0 74 68 65 79 20 77 69 6c 6c 20 6a 75 73 74 20 65  they will just e
136f0 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75 70 20 67  nd.      ** up g
13700 65 6e 65 72 61 74 69 6e 67 20 61 6e 20 4f 50 5f  enerating an OP_
13710 53 43 6f 70 79 20 74 6f 20 6d 6f 76 65 20 74 68  SCopy to move th
13720 65 20 76 61 6c 75 65 20 74 6f 20 74 68 65 20 64  e value to the d
13730 65 73 74 69 6e 61 74 69 6f 6e 0a 20 20 20 20 20  estination.     
13740 20 2a 2a 20 72 65 67 69 73 74 65 72 2e 20 2a 2f   ** register. */
13750 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
13760 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
13770 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
13780 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74      if( p->pLeft
13790 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c  ->op==TK_FLOAT |
137a0 7c 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d  | p->pLeft->op==
137b0 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20  TK_INTEGER ){.  
137c0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
137d0 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  .       }.      
137e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
137f0 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
13800 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
13810 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
13820 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 45 78 70  }../*.** If pExp
13830 72 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  r is a constant 
13840 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
13850 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  is appropriate f
13860 6f 72 0a 2a 2a 20 66 61 63 74 6f 72 69 6e 67 20  or.** factoring 
13870 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2c 20 74  out of a loop, t
13880 68 65 6e 20 65 76 61 6c 75 61 74 65 20 74 68 65  hen evaluate the
13890 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
138a0 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 20 61  nto a register a
138b0 6e 64 20 63 6f 6e 76 65 72 74 20 74 68 65 20 65  nd convert the e
138c0 78 70 72 65 73 73 69 6f 6e 20 69 6e 74 6f 20 61  xpression into a
138d0 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 2a 2a 20   TK_REGISTER.** 
138e0 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73  expression..*/.s
138f0 74 61 74 69 63 20 69 6e 74 20 65 76 61 6c 43 6f  tatic int evalCo
13900 6e 73 74 45 78 70 72 28 57 61 6c 6b 65 72 20 2a  nstExpr(Walker *
13910 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
13920 45 78 70 72 29 7b 0a 20 20 50 61 72 73 65 20 2a  Expr){.  Parse *
13930 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
13940 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 77 69 74  ->pParse;.  swit
13950 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
13960 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47  .    case TK_REG
13970 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 72  ISTER: {.      r
13980 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
13990 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
139a0 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ION:.    case TK
139b0 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  _AGG_FUNCTION:. 
139c0 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54     case TK_CONST
139d0 5f 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20 20 2f  _FUNC: {.      /
139e0 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20  * The arguments 
139f0 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 68 61  to a function ha
13a00 76 65 20 61 20 66 69 78 65 64 20 64 65 73 74 69  ve a fixed desti
13a10 6e 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a  nation..      **
13a20 20 4d 61 72 6b 20 74 68 65 6d 20 74 68 69 73 20   Mark them this 
13a30 77 61 79 20 74 6f 20 61 76 6f 69 64 20 67 65 6e  way to avoid gen
13a40 65 72 61 74 65 64 20 75 6e 6e 65 65 64 65 64 20  erated unneeded 
13a50 4f 50 5f 53 43 6f 70 79 0a 20 20 20 20 20 20 2a  OP_SCopy.      *
13a60 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20  * instructions. 
13a70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
13a80 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
13a90 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a  = pExpr->pList;.
13aa0 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 20        if( pList 
13ab0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
13ac0 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
13ad0 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
13ae0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
13af0 49 74 65 6d 20 3d 20 70 4c 69 73 74 2d 3e 61 3b  Item = pList->a;
13b00 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20 69  .        for(; i
13b10 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; i--, pItem++
13b20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
13b30 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 29 20   pItem->pExpr ) 
13b40 70 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 66 6c  pItem->pExpr->fl
13b50 61 67 73 20 7c 3d 20 45 50 5f 46 69 78 65 64 44  ags |= EP_FixedD
13b60 65 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  est;.        }. 
13b70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
13b80 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
13b90 69 66 28 20 69 73 41 70 70 72 6f 70 72 69 61 74  if( isAppropriat
13ba0 65 46 6f 72 46 61 63 74 6f 72 69 6e 67 28 70 45  eForFactoring(pE
13bb0 78 70 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  xpr) ){.    int 
13bc0 72 31 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  r1 = ++pParse->n
13bd0 4d 65 6d 3b 0a 20 20 20 20 69 6e 74 20 72 32 3b  Mem;.    int r2;
13be0 0a 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65  .    r2 = sqlite
13bf0 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
13c00 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72  pParse, pExpr, r
13c10 31 29 3b 0a 20 20 20 20 69 66 28 20 72 31 21 3d  1);.    if( r1!=
13c20 72 32 20 29 20 73 71 6c 69 74 65 33 52 65 6c 65  r2 ) sqlite3Rele
13c30 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
13c40 65 2c 20 72 31 29 3b 0a 20 20 20 20 70 45 78 70  e, r1);.    pExp
13c50 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53  r->op = TK_REGIS
13c60 54 45 52 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  TER;.    pExpr->
13c70 69 54 61 62 6c 65 20 3d 20 72 32 3b 0a 20 20 20  iTable = r2;.   
13c80 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
13c90 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
13ca0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
13cb0 0a 2f 2a 0a 2a 2a 20 50 72 65 65 76 61 6c 75 61  ./*.** Preevalua
13cc0 74 65 20 63 6f 6e 73 74 61 6e 74 20 73 75 62 65  te constant sube
13cd0 78 70 72 65 73 73 69 6f 6e 73 20 77 69 74 68 69  xpressions withi
13ce0 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72  n pExpr and stor
13cf0 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73  e the.** results
13d00 20 69 6e 20 72 65 67 69 73 74 65 72 73 2e 20 20   in registers.  
13d10 4d 6f 64 69 66 79 20 70 45 78 70 72 20 73 6f 20  Modify pExpr so 
13d20 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61 6e  that the constan
13d30 74 20 73 75 62 65 78 70 72 65 73 69 6f 6e 73 0a  t subexpresions.
13d40 2a 2a 20 61 72 65 20 54 4b 5f 52 45 47 49 53 54  ** are TK_REGIST
13d50 45 52 20 6f 70 63 6f 64 65 73 20 74 68 61 74 20  ER opcodes that 
13d60 72 65 66 65 72 20 74 6f 20 74 68 65 20 70 72 65  refer to the pre
13d70 63 6f 6d 70 75 74 65 64 20 76 61 6c 75 65 73 2e  computed values.
13d80 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
13d90 45 78 70 72 43 6f 64 65 43 6f 6e 73 74 61 6e 74  ExprCodeConstant
13da0 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
13db0 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
13dc0 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78   Walker w;.  w.x
13dd0 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
13de0 76 61 6c 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20  valConstExpr;.  
13df0 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
13e00 6b 20 3d 20 30 3b 0a 20 20 77 2e 70 50 61 72 73  k = 0;.  w.pPars
13e10 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71  e = pParse;.  sq
13e20 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
13e30 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 0a 2f 2a  , pExpr);.}.../*
13e40 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
13e50 65 20 74 68 61 74 20 70 75 73 68 65 73 20 74 68  e that pushes th
13e60 65 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79  e value of every
13e70 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
13e80 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73  given.** express
13e90 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f 20 61 20  ion list into a 
13ea0 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69  sequence of regi
13eb0 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20  sters beginning 
13ec0 61 74 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a  at target..**.**
13ed0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
13ee0 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65  er of elements e
13ef0 76 61 6c 75 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74  valuated..*/.int
13f00 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
13f10 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73  ExprList(.  Pars
13f20 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
13f30 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
13f40 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
13f50 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68 65  *pList,   /* The
13f60 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
13f70 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
13f80 20 20 69 6e 74 20 74 61 72 67 65 74 2c 20 20 20    int target,   
13f90 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
13fa0 20 77 72 69 74 65 20 72 65 73 75 6c 74 73 20 2a   write results *
13fb0 2f 0a 20 20 69 6e 74 20 64 6f 48 61 72 64 43 6f  /.  int doHardCo
13fc0 70 79 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 61  py     /* Make a
13fd0 20 68 61 72 64 20 63 6f 70 79 20 6f 66 20 65 76   hard copy of ev
13fe0 65 72 79 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29  ery element */.)
13ff0 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  {.  struct ExprL
14000 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
14010 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 61  .  int i, n;.  a
14020 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
14030 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61 72  );.  assert( tar
14040 67 65 74 3e 30 20 29 3b 0a 20 20 6e 20 3d 20 70  get>0 );.  n = p
14050 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 66  List->nExpr;.  f
14060 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
14070 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  a, i=0; i<n; i++
14080 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
14090 69 66 28 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61  if( pItem->iAlia
140a0 73 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  s ){.      int i
140b0 52 65 67 20 3d 20 63 6f 64 65 41 6c 69 61 73 28  Reg = codeAlias(
140c0 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 69  pParse, pItem->i
140d0 41 6c 69 61 73 2c 20 70 49 74 65 6d 2d 3e 70 45  Alias, pItem->pE
140e0 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a  xpr, target+i);.
140f0 20 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20        Vdbe *v = 
14100 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
14110 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66  Parse);.      if
14120 28 20 69 52 65 67 21 3d 74 61 72 67 65 74 2b 69  ( iReg!=target+i
14130 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
14140 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14150 20 4f 50 5f 53 43 6f 70 79 2c 20 69 52 65 67 2c   OP_SCopy, iReg,
14160 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20   target+i);.    
14170 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
14180 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
14190 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 49 74  Code(pParse, pIt
141a0 65 6d 2d 3e 70 45 78 70 72 2c 20 74 61 72 67 65  em->pExpr, targe
141b0 74 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  t+i);.    }.    
141c0 69 66 28 20 64 6f 48 61 72 64 43 6f 70 79 20 29  if( doHardCopy )
141d0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
141e0 78 70 72 48 61 72 64 43 6f 70 79 28 70 50 61 72  xprHardCopy(pPar
141f0 73 65 2c 20 74 61 72 67 65 74 2c 20 6e 29 3b 0a  se, target, n);.
14200 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
14210 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn n;.}../*.** G
14220 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
14230 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65   a boolean expre
14240 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20  ssion such that 
14250 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a  a jump is made.*
14260 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22  * to the label "
14270 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70  dest" if the exp
14280 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20  ression is true 
14290 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  but execution.**
142a0 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69   continues strai
142b0 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20  ght thru if the 
142c0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61  expression is fa
142d0 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  lse..**.** If th
142e0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61  e expression eva
142f0 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28  luates to NULL (
14300 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72  neither true nor
14310 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a   false), then.**
14320 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   take the jump i
14330 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c  f the jumpIfNull
14340 20 66 6c 61 67 20 69 73 20 53 51 4c 49 54 45 5f   flag is SQLITE_
14350 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  JUMPIFNULL..**.*
14360 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70 65  * This code depe
14370 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20  nds on the fact 
14380 74 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b  that certain tok
14390 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54  en values (ex: T
143a0 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65  K_EQ).** are the
143b0 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20   same as opcode 
143c0 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45  values (ex: OP_E
143d0 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  q) that implemen
143e0 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  t the correspond
143f0 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  ing.** operation
14400 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65  .  Special comme
14410 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e  nts in vdbe.c an
14420 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  d the mkopcodeh.
14430 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a  awk script in.**
14440 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73   the make proces
14450 73 20 63 61 75 73 65 20 74 68 65 73 65 20 76 61  s cause these va
14460 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20  lues to align.  
14470 41 73 73 65 72 74 28 29 73 20 69 6e 20 74 68 65  Assert()s in the
14480 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76   code.** below v
14490 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e  erify that the n
144a0 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e  umbers are align
144b0 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f  ed correctly..*/
144c0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
144d0 72 49 66 54 72 75 65 28 50 61 72 73 65 20 2a 70  rIfTrue(Parse *p
144e0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
144f0 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e  pr, int dest, in
14500 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
14510 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
14520 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
14530 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  op = 0;.  int re
14540 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e  gFree1 = 0;.  in
14550 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a  t regFree2 = 0;.
14560 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20    int r1, r2;.. 
14570 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e   assert( jumpIfN
14580 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50  ull==SQLITE_JUMP
14590 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66  IFNULL || jumpIf
145a0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Null==0 );.  if(
145b0 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d   v==0 || pExpr==
145c0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6f 70  0 ) return;.  op
145d0 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20   = pExpr->op;.  
145e0 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
145f0 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b    case TK_AND: {
14600 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20  .      int d2 = 
14610 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
14620 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74  abel(v);.      t
14630 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
14640 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
14650 74 65 73 74 63 61 73 65 28 20 70 50 61 72 73 65  testcase( pParse
14660 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68  ->disableColCach
14670 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  e==0 );.      sq
14680 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
14690 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
146a0 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66  pLeft, d2,jumpIf
146b0 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50  Null^SQLITE_JUMP
146c0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70  IFNULL);.      p
146d0 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f  Parse->disableCo
146e0 6c 43 61 63 68 65 2b 2b 3b 0a 20 20 20 20 20 20  lCache++;.      
146f0 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
14700 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
14710 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
14720 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
14730 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
14740 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68  ->disableColCach
14750 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61  e>0 );.      pPa
14760 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43  rse->disableColC
14770 61 63 68 65 2d 2d 3b 0a 20 20 20 20 20 20 73 71  ache--;.      sq
14780 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
14790 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20  Label(v, d2);.  
147a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
147b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
147c0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
147d0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
147e0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
147f0 73 65 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61  se( pParse->disa
14800 62 6c 65 43 6f 6c 43 61 63 68 65 3d 3d 30 20 29  bleColCache==0 )
14810 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
14820 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
14830 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
14840 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
14850 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
14860 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
14870 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
14880 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
14890 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
148a0 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
148b0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ull);.      asse
148c0 72 74 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61  rt( pParse->disa
148d0 62 6c 65 43 6f 6c 43 61 63 68 65 3e 30 20 29 3b  bleColCache>0 );
148e0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  .      pParse->d
148f0 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d  isableColCache--
14900 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
14910 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
14920 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  _NOT: {.      te
14930 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
14940 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
14950 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
14960 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
14970 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
14980 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
14990 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
149a0 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
149b0 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
149c0 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
149d0 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
149e0 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
149f0 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
14a00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
14a10 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20  _LT==OP_Lt );.  
14a20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
14a30 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20  E==OP_Le );.    
14a40 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d    assert( TK_GT=
14a50 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20  =OP_Gt );.      
14a60 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f  assert( TK_GE==O
14a70 50 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Ge );.      as
14a80 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f  sert( TK_EQ==OP_
14a90 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Eq );.      asse
14aa0 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65  rt( TK_NE==OP_Ne
14ab0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14ac0 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b  se( op==TK_LT );
14ad0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14ae0 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20   op==TK_LE );.  
14af0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
14b00 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20  ==TK_GT );.     
14b10 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
14b20 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65  K_GE );.      te
14b30 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45  stcase( op==TK_E
14b40 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Q );.      testc
14b50 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29  ase( op==TK_NE )
14b60 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14b70 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
14b80 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
14b90 70 61 72 65 4f 70 65 72 61 6e 64 73 28 70 50 61  pareOperands(pPa
14ba0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
14bb0 74 2c 20 26 72 31 2c 20 26 72 65 67 46 72 65 65  t, &r1, &regFree
14bc0 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
14bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14be0 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67       pExpr->pRig
14bf0 68 74 2c 20 26 72 32 2c 20 26 72 65 67 46 72 65  ht, &r2, &regFre
14c00 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  e2);.      codeC
14c10 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
14c20 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
14c30 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
14c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c50 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20    r1, r2, dest, 
14c60 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
14c70 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
14c80 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
14c90 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
14ca0 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
14cb0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
14cc0 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
14cd0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
14ce0 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61  TNULL: {.      a
14cf0 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c  ssert( TK_ISNULL
14d00 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20  ==OP_IsNull );. 
14d10 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
14d20 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e  NOTNULL==OP_NotN
14d30 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ull );.      tes
14d40 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
14d50 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65  NULL );.      te
14d60 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
14d70 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  OTNULL );.      
14d80 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
14d90 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
14da0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
14db0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
14dc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14dd0 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65  p2(v, op, r1, de
14de0 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  st);.      testc
14df0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
14e00 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
14e10 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
14e20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20  TK_BETWEEN: {.  
14e30 20 20 20 20 2f 2a 20 20 20 20 78 20 42 45 54 57      /*    x BETW
14e40 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20  EEN y AND z.    
14e50 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 73    **.      ** Is
14e60 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a   equivalent to .
14e70 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
14e80 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c  *    x>=y AND x<
14e90 3d 7a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  =z.      **.    
14ea0 20 20 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20    ** Code it as 
14eb0 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72  such, taking car
14ec0 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d  e to do the comm
14ed0 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  on subexpression
14ee0 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e  .      ** elemen
14ef0 74 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 20 20 20  tation of x..   
14f00 20 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72     */.      Expr
14f10 20 65 78 70 72 41 6e 64 3b 0a 20 20 20 20 20 20   exprAnd;.      
14f20 45 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b 0a 20  Expr compLeft;. 
14f30 20 20 20 20 20 45 78 70 72 20 63 6f 6d 70 52 69       Expr compRi
14f40 67 68 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  ght;.      Expr 
14f50 65 78 70 72 58 3b 0a 0a 20 20 20 20 20 20 65 78  exprX;..      ex
14f60 70 72 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70 4c  prX = *pExpr->pL
14f70 65 66 74 3b 0a 20 20 20 20 20 20 65 78 70 72 41  eft;.      exprA
14f80 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a  nd.op = TK_AND;.
14f90 20 20 20 20 20 20 65 78 70 72 41 6e 64 2e 70 4c        exprAnd.pL
14fa0 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b  eft = &compLeft;
14fb0 0a 20 20 20 20 20 20 65 78 70 72 41 6e 64 2e 70  .      exprAnd.p
14fc0 52 69 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67  Right = &compRig
14fd0 68 74 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65  ht;.      compLe
14fe0 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20  ft.op = TK_GE;. 
14ff0 20 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c       compLeft.pL
15000 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20  eft = &exprX;.  
15010 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69      compLeft.pRi
15020 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ght = pExpr->pLi
15030 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
15040 20 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e        compRight.
15050 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 20 20  op = TK_LE;.    
15060 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66    compRight.pLef
15070 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 20 20  t = &exprX;.    
15080 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69 67    compRight.pRig
15090 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  ht = pExpr->pLis
150a0 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
150b0 20 20 20 20 20 65 78 70 72 58 2e 69 54 61 62 6c       exprX.iTabl
150c0 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  e = sqlite3ExprC
150d0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
150e0 26 65 78 70 72 58 2c 20 26 72 65 67 46 72 65 65  &exprX, &regFree
150f0 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1);.      testca
15100 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
15110 29 3b 0a 20 20 20 20 20 20 65 78 70 72 58 2e 6f  );.      exprX.o
15120 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b  p = TK_REGISTER;
15130 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
15140 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
15150 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
15160 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
15170 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74  , &exprAnd, dest
15180 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
15190 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
151a0 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
151b0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
151c0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
151d0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26  pParse, pExpr, &
151e0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
151f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15200 70 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c  p3(v, OP_If, r1,
15210 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
15220 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 74 65 73  l!=0);.      tes
15230 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
15240 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
15250 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
15260 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
15270 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
15280 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
15290 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
152a0 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74  gFree1);.  sqlit
152b0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
152c0 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
152d0 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  2);  .}../*.** G
152e0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
152f0 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65   a boolean expre
15300 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20  ssion such that 
15310 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a  a jump is made.*
15320 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22  * to the label "
15330 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70  dest" if the exp
15340 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65  ression is false
15350 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a   but execution.*
15360 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61  * continues stra
15370 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65  ight thru if the
15380 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
15390 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  rue..**.** If th
153a0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61  e expression eva
153b0 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28  luates to NULL (
153c0 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72  neither true nor
153d0 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20   false) then.** 
153e0 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75  jump if jumpIfNu
153f0 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d  ll is SQLITE_JUM
15400 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20  PIFNULL or fall 
15410 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49  through if jumpI
15420 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a  fNull.** is 0..*
15430 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
15440 70 72 49 66 46 61 6c 73 65 28 50 61 72 73 65 20  prIfFalse(Parse 
15450 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
15460 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20  Expr, int dest, 
15470 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b  int jumpIfNull){
15480 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
15490 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
154a0 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  t op = 0;.  int 
154b0 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20  regFree1 = 0;.  
154c0 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30  int regFree2 = 0
154d0 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a  ;.  int r1, r2;.
154e0 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49  .  assert( jumpI
154f0 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55  fNull==SQLITE_JU
15500 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70  MPIFNULL || jump
15510 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69  IfNull==0 );.  i
15520 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72  f( v==0 || pExpr
15530 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
15540 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66   /* The value of
15550 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f   pExpr->op and o
15560 70 20 61 72 65 20 72 65 6c 61 74 65 64 20 61 73  p are related as
15570 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20   follows:.  **. 
15580 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d   **       pExpr-
15590 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 6f  >op            o
155a0 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d  p.  **       ---
155b0 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20  ------          
155c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20  ----------.  ** 
155d0 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20        TK_ISNULL 
155e0 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e           OP_NotN
155f0 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  ull.  **       T
15600 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20  K_NOTNULL       
15610 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a    OP_IsNull.  **
15620 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20         TK_NE    
15630 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a            OP_Eq.
15640 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51    **       TK_EQ
15650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
15660 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Ne.  **       T
15670 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20 20 20  K_GT            
15680 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20    OP_Le.  **    
15690 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20     TK_LE        
156a0 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a        OP_Gt.  **
156b0 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20         TK_GE    
156c0 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a            OP_Lt.
156d0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54    **       TK_LT
156e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
156f0 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f  _Ge.  **.  ** Fo
15700 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f  r other values o
15710 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20  f pExpr->op, op 
15720 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64  is undefined and
15730 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68   unused..  ** Th
15740 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61  e value of TK_ a
15750 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73  nd OP_ constants
15760 20 61 72 65 20 61 72 72 61 6e 67 65 64 20 73 75   are arranged su
15770 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20  ch that we.  ** 
15780 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20  can compute the 
15790 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73  mapping above us
157a0 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
157b0 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20  g expression..  
157c0 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76 65 72  ** Assert()s ver
157d0 69 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d  ify that the com
157e0 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72  putation is corr
157f0 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d  ect..  */.  op =
15800 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b   ((pExpr->op+(TK
15810 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28  _ISNULL&1))^1)-(
15820 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20  TK_ISNULL&1);.. 
15830 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65   /* Verify corre
15840 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  ct alignment of 
15850 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73  TK_ and OP_ cons
15860 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73  tants.  */.  ass
15870 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
15880 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d  TK_ISNULL || op=
15890 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20  =OP_NotNull );. 
158a0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
158b0 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c  op!=TK_NOTNULL |
158c0 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  | op==OP_IsNull 
158d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
158e0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c  pr->op!=TK_NE ||
158f0 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20   op==OP_Eq );.  
15900 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
15910 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d  p!=TK_EQ || op==
15920 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Ne );.  asser
15930 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
15940 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65  _LT || op==OP_Ge
15950 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
15960 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c  xpr->op!=TK_LE |
15970 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20  | op==OP_Gt );. 
15980 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
15990 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d  op!=TK_GT || op=
159a0 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Le );.  asse
159b0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
159c0 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  K_GE || op==OP_L
159d0 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  t );..  switch( 
159e0 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
159f0 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a   case TK_AND: {.
15a00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15a10 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
15a20 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
15a30 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65   pParse->disable
15a40 43 6f 6c 43 61 63 68 65 3d 3d 30 20 29 3b 0a 20  ColCache==0 );. 
15a50 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
15a60 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
15a70 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
15a80 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
15a90 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  .      pParse->d
15aa0 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b  isableColCache++
15ab0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
15ac0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
15ad0 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
15ae0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
15af0 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ll);.      asser
15b00 74 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62  t( pParse->disab
15b10 6c 65 43 6f 6c 43 61 63 68 65 3e 30 20 29 3b 0a  leColCache>0 );.
15b20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69        pParse->di
15b30 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b  sableColCache--;
15b40 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
15b50 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
15b60 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  OR: {.      int 
15b70 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
15b80 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
15b90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
15ba0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
15bb0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
15bc0 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f  Parse->disableCo
15bd0 6c 43 61 63 68 65 3d 3d 30 20 29 3b 0a 20 20 20  lCache==0 );.   
15be0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
15bf0 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
15c00 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 6a  pr->pLeft, d2, j
15c10 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45  umpIfNull^SQLITE
15c20 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
15c30 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61      pParse->disa
15c40 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20  bleColCache++;. 
15c50 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
15c60 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
15c70 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
15c80 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
15c90 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
15ca0 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43  pParse->disableC
15cb0 6f 6c 43 61 63 68 65 3e 30 20 29 3b 0a 20 20 20  olCache>0 );.   
15cc0 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62     pParse->disab
15cd0 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20  leColCache--;.  
15ce0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
15cf0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
15d00 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  2);.      break;
15d10 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
15d20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
15d30 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
15d40 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
15d50 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
15d60 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
15d70 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
15d80 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
15d90 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
15da0 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
15db0 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
15dc0 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
15dd0 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
15de0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15df0 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20  op==TK_LT );.   
15e00 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
15e10 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20  =TK_LE );.      
15e20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
15e30 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _GT );.      tes
15e40 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 45  tcase( op==TK_GE
15e50 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
15e60 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b  se( op==TK_EQ );
15e70 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
15e80 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20   op==TK_NE );.  
15e90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
15ea0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
15eb0 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
15ec0 4f 70 65 72 61 6e 64 73 28 70 50 61 72 73 65 2c  Operands(pParse,
15ed0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
15ee0 72 31 2c 20 26 72 65 67 46 72 65 65 31 2c 0a 20  r1, &regFree1,. 
15ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f10 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
15f20 26 72 32 2c 20 26 72 65 67 46 72 65 65 32 29 3b  &r2, &regFree2);
15f30 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
15f40 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
15f50 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
15f60 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
15f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
15f80 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r2, dest, jump
15f90 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 74  IfNull);.      t
15fa0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
15fb0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
15fc0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
15fd0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
15fe0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
15ff0 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20  se TK_ISNULL:.  
16000 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
16010 4c 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  L: {.      testc
16020 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ase( op==TK_ISNU
16030 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LL );.      test
16040 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
16050 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72 31  NULL );.      r1
16060 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
16070 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
16080 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
16090 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73  gFree1);.      s
160a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
160b0 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74  (v, op, r1, dest
160c0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
160d0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
160e0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
160f0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
16100 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
16110 20 20 2f 2a 20 20 20 20 78 20 42 45 54 57 45 45    /*    x BETWEE
16120 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 20 20  N y AND z.      
16130 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 73 20 65  **.      ** Is e
16140 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20  quivalent to .  
16150 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
16160 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a     x>=y AND x<=z
16170 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
16180 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73 75  ** Code it as su
16190 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65 20  ch, taking care 
161a0 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e  to do the common
161b0 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 20   subexpression. 
161c0 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 61       ** elementa
161d0 74 69 6f 6e 20 6f 66 20 78 2e 0a 20 20 20 20 20  tion of x..     
161e0 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 65   */.      Expr e
161f0 78 70 72 41 6e 64 3b 0a 20 20 20 20 20 20 45 78  xprAnd;.      Ex
16200 70 72 20 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 20  pr compLeft;.   
16210 20 20 20 45 78 70 72 20 63 6f 6d 70 52 69 67 68     Expr compRigh
16220 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 65 78  t;.      Expr ex
16230 70 72 58 3b 0a 0a 20 20 20 20 20 20 65 78 70 72  prX;..      expr
16240 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66  X = *pExpr->pLef
16250 74 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e 64  t;.      exprAnd
16260 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20  .op = TK_AND;.  
16270 20 20 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66      exprAnd.pLef
16280 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20  t = &compLeft;. 
16290 20 20 20 20 20 65 78 70 72 41 6e 64 2e 70 52 69       exprAnd.pRi
162a0 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68 74  ght = &compRight
162b0 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65 66 74  ;.      compLeft
162c0 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 20  .op = TK_GE;.   
162d0 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66     compLeft.pLef
162e0 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 20 20  t = &exprX;.    
162f0 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68    compLeft.pRigh
16300 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
16310 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
16320 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70      compRight.op
16330 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 20 20 20 20   = TK_LE;.      
16340 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20  compRight.pLeft 
16350 3d 20 26 65 78 70 72 58 3b 0a 20 20 20 20 20 20  = &exprX;.      
16360 63 6f 6d 70 52 69 67 68 74 2e 70 52 69 67 68 74  compRight.pRight
16370 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
16380 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[1].pExpr;.   
16390 20 20 20 65 78 70 72 58 2e 69 54 61 62 6c 65 20     exprX.iTable 
163a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
163b0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26 65  eTemp(pParse, &e
163c0 78 70 72 58 2c 20 26 72 65 67 46 72 65 65 31 29  xprX, &regFree1)
163d0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
163e0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
163f0 0a 20 20 20 20 20 20 65 78 70 72 58 2e 6f 70 20  .      exprX.op 
16400 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20  = TK_REGISTER;. 
16410 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
16420 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
16430 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
16440 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
16450 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c   &exprAnd, dest,
16460 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
16470 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
16480 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
16490 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
164a0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
164b0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72  Parse, pExpr, &r
164c0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
164d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
164e0 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72  3(v, OP_IfNot, r
164f0 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  1, dest, jumpIfN
16500 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 74  ull!=0);.      t
16510 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
16520 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
16530 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
16540 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  ll==0 );.      b
16550 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
16560 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
16570 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
16580 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c  regFree1);.  sql
16590 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
165a0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
165b0 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ee2);.}../*.** D
165c0 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69  o a deep compari
165d0 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65  son of two expre
165e0 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65  ssion trees.  Re
165f0 74 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a  turn TRUE (non-z
16600 65 72 6f 29 0a 2a 2a 20 69 66 20 74 68 65 79 20  ero).** if they 
16610 61 72 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e  are identical an
16620 64 20 72 65 74 75 72 6e 20 46 41 4c 53 45 20 69  d return FALSE i
16630 66 20 74 68 65 79 20 64 69 66 66 65 72 20 69 6e  f they differ in
16640 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20   any way..**.** 
16650 53 6f 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72  Sometimes this r
16660 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
16670 72 6e 20 46 41 4c 53 45 20 65 76 65 6e 20 69 66  rn FALSE even if
16680 20 74 68 65 20 74 77 6f 20 65 78 70 72 65 73 73   the two express
16690 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61  ions.** really a
166a0 72 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20  re equivalent.  
166b0 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f  If we cannot pro
166c0 76 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72  ve that the expr
166d0 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69  essions are.** i
166e0 64 65 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74  dentical, we ret
166f0 75 72 6e 20 46 41 4c 53 45 20 6a 75 73 74 20 74  urn FALSE just t
16700 6f 20 62 65 20 73 61 66 65 2e 20 20 53 6f 20 69  o be safe.  So i
16710 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  f this routine.*
16720 2a 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 2c  * returns false,
16730 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74   then you do not
16740 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72   really know for
16750 20 63 65 72 74 61 69 6e 20 69 66 20 74 68 65 20   certain if the 
16760 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  two.** expressio
16770 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e  ns are the same.
16780 20 20 42 75 74 20 69 66 20 79 6f 75 20 67 65 74    But if you get
16790 20 61 20 54 52 55 45 20 72 65 74 75 72 6e 2c 20   a TRUE return, 
167a0 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20  then you.** can 
167b0 62 65 20 73 75 72 65 20 74 68 65 20 65 78 70 72  be sure the expr
167c0 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20  essions are the 
167d0 73 61 6d 65 2e 20 20 49 6e 20 74 68 65 20 70 6c  same.  In the pl
167e0 61 63 65 73 20 77 68 65 72 65 0a 2a 2a 20 74 68  aces where.** th
167f0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
16800 65 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  ed, it does not 
16810 68 75 72 74 20 74 6f 20 67 65 74 20 61 6e 20 65  hurt to get an e
16820 78 74 72 61 20 46 41 4c 53 45 20 2d 20 74 68 61  xtra FALSE - tha
16830 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20  t.** just might 
16840 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73  result in some s
16850 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63  lightly slower c
16860 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e  ode.  But return
16870 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72  ing.** an incorr
16880 65 63 74 20 54 52 55 45 20 63 6f 75 6c 64 20 6c  ect TRUE could l
16890 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63  ead to a malfunc
168a0 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
168b0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
168c0 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a  Expr *pA, Expr *
168d0 70 42 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  pB){.  int i;.  
168e0 69 66 28 20 70 41 3d 3d 30 7c 7c 70 42 3d 3d 30  if( pA==0||pB==0
168f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
16900 42 3d 3d 70 41 3b 0a 20 20 7d 0a 20 20 69 66 28  B==pA;.  }.  if(
16910 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20   pA->op!=pB->op 
16920 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
16930 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45  ( (pA->flags & E
16940 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42  P_Distinct)!=(pB
16950 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
16960 74 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20  tinct) ) return 
16970 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  0;.  if( !sqlite
16980 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d  3ExprCompare(pA-
16990 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66  >pLeft, pB->pLef
169a0 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  t) ) return 0;. 
169b0 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
169c0 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69  rCompare(pA->pRi
169d0 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 29  ght, pB->pRight)
169e0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
169f0 66 28 20 70 41 2d 3e 70 4c 69 73 74 20 29 7b 0a  f( pA->pList ){.
16a00 20 20 20 20 69 66 28 20 70 42 2d 3e 70 4c 69 73      if( pB->pLis
16a10 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
16a20 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 70 4c 69  .    if( pA->pLi
16a30 73 74 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 70  st->nExpr!=pB->p
16a40 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 20 72 65  List->nExpr ) re
16a50 74 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72 28  turn 0;.    for(
16a60 69 3d 30 3b 20 69 3c 70 41 2d 3e 70 4c 69 73 74  i=0; i<pA->pList
16a70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
16a80 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65       if( !sqlite
16a90 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d  3ExprCompare(pA-
16aa0 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  >pList->a[i].pEx
16ab0 70 72 2c 20 70 42 2d 3e 70 4c 69 73 74 2d 3e 61  pr, pB->pList->a
16ac0 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  [i].pExpr) ){.  
16ad0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
16ae0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16af0 7d 65 6c 73 65 20 69 66 28 20 70 42 2d 3e 70 4c  }else if( pB->pL
16b00 69 73 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ist ){.    retur
16b10 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 0;.  }.  if( p
16b20 41 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 70 42  A->pSelect || pB
16b30 2d 3e 70 53 65 6c 65 63 74 20 29 20 72 65 74 75  ->pSelect ) retu
16b40 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e  rn 0;.  if( pA->
16b50 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62  iTable!=pB->iTab
16b60 6c 65 20 7c 7c 20 70 41 2d 3e 69 43 6f 6c 75 6d  le || pA->iColum
16b70 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29  n!=pB->iColumn )
16b80 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
16b90 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55   pA->op!=TK_COLU
16ba0 4d 4e 20 26 26 20 70 41 2d 3e 74 6f 6b 65 6e 2e  MN && pA->token.
16bb0 7a 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 2d  z ){.    if( pB-
16bc0 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 20 72 65  >token.z==0 ) re
16bd0 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20  turn 0;.    if( 
16be0 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 70 41 2d  pB->token.n!=pA-
16bf0 3e 74 6f 6b 65 6e 2e 6e 20 29 20 72 65 74 75 72  >token.n ) retur
16c00 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  n 0;.    if( sql
16c10 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68  ite3StrNICmp((ch
16c20 61 72 2a 29 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 2c  ar*)pA->token.z,
16c30 28 63 68 61 72 2a 29 70 42 2d 3e 74 6f 6b 65 6e  (char*)pB->token
16c40 2e 7a 2c 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 29 21  .z,pB->token.n)!
16c50 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
16c60 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
16c70 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 0a    return 1;.}...
16c80 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
16c90 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70  element to the p
16ca0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
16cb0 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74  array.  Return t
16cc0 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74  he index of.** t
16cd0 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20  he new element. 
16ce0 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69   Return a negati
16cf0 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c  ve number if mal
16d00 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  loc fails..*/.st
16d10 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49  atic int addAggI
16d20 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65  nfoColumn(sqlite
16d30 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a  3 *db, AggInfo *
16d40 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b  pInfo){.  int i;
16d50 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d  .  pInfo->aCol =
16d60 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c   sqlite3ArrayAll
16d70 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64 62  ocate(.       db
16d80 2c 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  ,.       pInfo->
16d90 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a  aCol,.       siz
16da0 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  eof(pInfo->aCol[
16db0 30 5d 29 2c 0a 20 20 20 20 20 20 20 33 2c 0a 20  0]),.       3,. 
16dc0 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43        &pInfo->nC
16dd0 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26 70  olumn,.       &p
16de0 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 41 6c 6c  Info->nColumnAll
16df0 6f 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20  oc,.       &i.  
16e00 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  );.  return i;.}
16e10 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20      ../*.** Add 
16e20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
16e30 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61   the pAggInfo->a
16e40 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20 52  Func[] array.  R
16e50 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
16e60 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c  of.** the new el
16e70 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61  ement.  Return a
16e80 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
16e90 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
16ea0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16eb0 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 73  addAggInfoFunc(s
16ec0 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49  qlite3 *db, AggI
16ed0 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69  nfo *pInfo){.  i
16ee0 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61  nt i;.  pInfo->a
16ef0 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 41 72  Func = sqlite3Ar
16f00 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20  rayAllocate(.   
16f10 20 20 20 20 64 62 2c 20 0a 20 20 20 20 20 20 20      db, .       
16f20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20  pInfo->aFunc,.  
16f30 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66       sizeof(pInf
16f40 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20  o->aFunc[0]),.  
16f50 20 20 20 20 20 33 2c 0a 20 20 20 20 20 20 20 26       3,.       &
16f60 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20  pInfo->nFunc,.  
16f70 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75       &pInfo->nFu
16f80 6e 63 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 20  ncAlloc,.       
16f90 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  &i.  );.  return
16fa0 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a   i;.}    ../*.**
16fb0 20 54 68 69 73 20 69 73 20 74 68 65 20 78 45 78   This is the xEx
16fc0 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  prCallback for a
16fd0 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 20 20 49   tree walker.  I
16fe0 74 20 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20  t is used to.** 
16ff0 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65  implement sqlite
17000 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
17010 65 67 61 74 65 73 28 29 2e 20 20 53 65 65 20 73  egates().  See s
17020 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
17030 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66  eAggregates.** f
17040 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
17050 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  formation..*/.st
17060 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65  atic int analyze
17070 41 67 67 72 65 67 61 74 65 28 57 61 6c 6b 65 72  Aggregate(Walker
17080 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
17090 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69  *pExpr){.  int i
170a0 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
170b0 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  *pNC = pWalker->
170c0 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a  u.pNC;.  Parse *
170d0 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
170e0 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20  arse;.  SrcList 
170f0 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d  *pSrcList = pNC-
17100 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67  >pSrcList;.  Agg
17110 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d  Info *pAggInfo =
17120 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a   pNC->pAggInfo;.
17130 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
17140 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
17150 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a   TK_AGG_COLUMN:.
17160 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
17170 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  MN: {.      test
17180 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
17190 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
171a0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
171b0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
171c0 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
171d0 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
171e0 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  if the column is
171f0 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74   in one of the t
17200 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
17210 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73  M.      ** claus
17220 65 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61  e of the aggrega
17230 74 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  te query */.    
17240 20 20 69 66 28 20 70 53 72 63 4c 69 73 74 20 29    if( pSrcList )
17250 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
17260 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
17270 49 74 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d  Item = pSrcList-
17280 3e 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  >a;.        for(
17290 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d  i=0; i<pSrcList-
172a0 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
172b0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
172c0 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
172d0 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20  ol *pCol;.      
172e0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
172f0 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43  Table==pItem->iC
17300 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  ursor ){.       
17310 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65       /* If we re
17320 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
17330 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 70 45  it means that pE
17340 78 70 72 20 72 65 66 65 72 73 20 74 6f 20 61 20  xpr refers to a 
17350 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20  table.          
17360 20 20 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 20    ** that is in 
17370 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
17380 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  of the aggregate
17390 20 71 75 65 72 79 2e 20 20 0a 20 20 20 20 20 20   query.  .      
173a0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
173b0 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20       ** Make an 
173c0 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 63 6f  entry for the co
173d0 6c 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f  lumn in pAggInfo
173e0 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72  ->aCol[] if ther
173f0 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
17400 20 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79   is not an entry
17410 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a   there already..
17420 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
17430 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b             int k
17440 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ;.            pC
17450 6f 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61  ol = pAggInfo->a
17460 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Col;.           
17470 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67   for(k=0; k<pAgg
17480 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b  Info->nColumn; k
17490 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
174a0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
174b0 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78  Col->iTable==pEx
174c0 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20  pr->iTable &&.  
174d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174e0 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70  pCol->iColumn==p
174f0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b  Expr->iColumn ){
17500 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17510 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
17520 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17530 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
17540 20 20 69 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e    if( (k>=pAggIn
17550 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20  fo->nColumn).   
17560 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6b 20            && (k 
17570 3d 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75  = addAggInfoColu
17580 6d 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  mn(pParse->db, p
17590 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20  AggInfo))>=0 .  
175a0 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
175b0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20             pCol 
175c0 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  = &pAggInfo->aCo
175d0 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  l[k];.          
175e0 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d      pCol->pTab =
175f0 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20   pExpr->pTab;.  
17600 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
17610 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72  ->iTable = pExpr
17620 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
17630 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43          pCol->iC
17640 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69  olumn = pExpr->i
17650 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
17660 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d        pCol->iMem
17670 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
17680 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m;.             
17690 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
176a0 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
176b0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70           pCol->p
176c0 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
176d0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
176e0 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70  pAggInfo->pGroup
176f0 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  By ){.          
17700 20 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a        int j, n;.
17710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17720 45 78 70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20  ExprList *pGB = 
17730 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70  pAggInfo->pGroup
17740 42 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  By;.            
17750 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
17760 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20  ist_item *pTerm 
17770 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20  = pGB->a;.      
17780 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70 47            n = pG
17790 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  B->nExpr;.      
177a0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
177b0 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65  0; j<n; j++, pTe
177c0 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  rm++){.         
177d0 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
177e0 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  E = pTerm->pExpr
177f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
17800 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
17810 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d  TK_COLUMN && pE-
17820 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e  >iTable==pExpr->
17830 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20  iTable &&.      
17840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17850 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78  pE->iColumn==pEx
17860 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pr->iColumn ){. 
17870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17880 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
17890 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20  Column = j;.    
178a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178b0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
178c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
178d0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
178e0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
178f0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
17900 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
17910 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  mn<0 ){.        
17920 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53          pCol->iS
17930 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41  orterColumn = pA
17940 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67  ggInfo->nSorting
17950 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20  Column++;.      
17960 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17970 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17980 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20      /* There is 
17990 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20 66 6f 72  now an entry for
179a0 20 70 45 78 70 72 20 69 6e 20 70 41 67 67 49 6e   pExpr in pAggIn
179b0 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68  fo->aCol[] (eith
179c0 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  er.            *
179d0 2a 20 62 65 63 61 75 73 65 20 69 74 20 77 61 73  * because it was
179e0 20 74 68 65 72 65 20 62 65 66 6f 72 65 20 6f 72   there before or
179f0 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74   because we just
17a00 20 63 72 65 61 74 65 64 20 69 74 29 2e 0a 20 20   created it)..  
17a10 20 20 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e            ** Con
17a20 76 65 72 74 20 74 68 65 20 70 45 78 70 72 20 74  vert the pExpr t
17a30 6f 20 62 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f  o be a TK_AGG_CO
17a40 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e 67 20 74  LUMN referring t
17a50 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20  o that.         
17a60 20 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e     ** pAggInfo->
17a70 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20  aCol[] entry..  
17a80 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
17a90 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
17aa0 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49  pAggInfo = pAggI
17ab0 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nfo;.           
17ac0 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
17ad0 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20  AGG_COLUMN;.    
17ae0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
17af0 41 67 67 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20  Agg = k;.       
17b00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17b10 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66        } /* endif
17b20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
17b30 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a  pItem->iCursor *
17b40 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65  /.        } /* e
17b50 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72  nd loop over pSr
17b60 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d  cList */.      }
17b70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
17b80 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20  C_Prune;.    }. 
17b90 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
17ba0 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
17bb0 20 2f 2a 20 54 68 65 20 70 4e 43 2d 3e 6e 44 65   /* The pNC->nDe
17bc0 70 74 68 3d 3d 30 20 74 65 73 74 20 63 61 75 73  pth==0 test caus
17bd0 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  es aggregate fun
17be0 63 74 69 6f 6e 73 20 69 6e 20 73 75 62 71 75 65  ctions in subque
17bf0 72 69 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f  ries.      ** to
17c00 20 62 65 20 69 67 6e 6f 72 65 64 20 2a 2f 0a 20   be ignored */. 
17c10 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 6e 44       if( pNC->nD
17c20 65 70 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20  epth==0 ){.     
17c30 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
17c40 65 65 20 69 66 20 70 45 78 70 72 20 69 73 20 61  ee if pExpr is a
17c50 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e   duplicate of an
17c60 6f 74 68 65 72 20 61 67 67 72 65 67 61 74 65 20  other aggregate 
17c70 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  .        ** func
17c80 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6c 72  tion that is alr
17c90 65 61 64 79 20 69 6e 20 74 68 65 20 70 41 67 67  eady in the pAgg
17ca0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20  Info structure. 
17cb0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
17cc0 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
17cd0 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70  _func *pItem = p
17ce0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a  AggInfo->aFunc;.
17cf0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
17d00 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
17d10 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  nc; i++, pItem++
17d20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
17d30 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
17d40 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72  are(pItem->pExpr
17d50 2c 20 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  , pExpr) ){.    
17d60 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
17d70 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
17d80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
17d90 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46   i>=pAggInfo->nF
17da0 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unc ){.         
17db0 20 2f 2a 20 70 45 78 70 72 20 69 73 20 6f 72 69   /* pExpr is ori
17dc0 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e  ginal.  Make a n
17dd0 65 77 20 65 6e 74 72 79 20 69 6e 20 70 41 67 67  ew entry in pAgg
17de0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20  Info->aFunc[].  
17df0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
17e00 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e       u8 enc = EN
17e10 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20  C(pParse->db);. 
17e20 20 20 20 20 20 20 20 20 20 69 20 3d 20 61 64 64           i = add
17e30 41 67 67 49 6e 66 6f 46 75 6e 63 28 70 50 61 72  AggInfoFunc(pPar
17e40 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f  se->db, pAggInfo
17e50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
17e60 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   i>=0 ){.       
17e70 20 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 41       pItem = &pA
17e80 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d  ggInfo->aFunc[i]
17e90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
17ea0 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  tem->pExpr = pEx
17eb0 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
17ec0 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b  pItem->iMem = ++
17ed0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
17ee0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
17ef0 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33  >pFunc = sqlite3
17f00 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61  FindFunction(pPa
17f10 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  rse->db,.       
17f20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
17f30 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  r*)pExpr->token.
17f40 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  z, pExpr->token.
17f50 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
17f60 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 69        pExpr->pLi
17f70 73 74 20 3f 20 70 45 78 70 72 2d 3e 70 4c 69 73  st ? pExpr->pLis
17f80 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e  t->nExpr : 0, en
17f90 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  c, 0);.         
17fa0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c     if( pExpr->fl
17fb0 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63  ags & EP_Distinc
17fc0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
17fd0 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69     pItem->iDisti
17fe0 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
17ff0 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ab++;.          
18000 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
18010 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44         pItem->iD
18020 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20  istinct = -1;.  
18030 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
18040 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
18050 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b  }.        /* Mak
18060 65 20 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f  e pExpr point to
18070 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
18080 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
18090 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20  [] entry.       
180a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 45 78 70   */.        pExp
180b0 72 2d 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20  r->iAgg = i;.   
180c0 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67       pExpr->pAgg
180d0 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b  Info = pAggInfo;
180e0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
180f0 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20  WRC_Prune;.     
18100 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
18110 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
18120 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  ue;.}.static int
18130 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
18140 65 73 49 6e 53 65 6c 65 63 74 28 57 61 6c 6b 65  esInSelect(Walke
18150 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
18160 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
18170 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
18180 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e   = pWalker->u.pN
18190 43 3b 0a 20 20 69 66 28 20 70 4e 43 2d 3e 6e 44  C;.  if( pNC->nD
181a0 65 70 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 70  epth==0 ){.    p
181b0 4e 43 2d 3e 6e 44 65 70 74 68 2b 2b 3b 0a 20 20  NC->nDepth++;.  
181c0 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
181d0 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65  ect(pWalker, pSe
181e0 6c 65 63 74 29 3b 0a 20 20 20 20 70 4e 43 2d 3e  lect);.    pNC->
181f0 6e 44 65 70 74 68 2d 2d 3b 0a 20 20 20 20 72 65  nDepth--;.    re
18200 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
18210 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
18220 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
18230 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
18240 6e 61 6c 79 7a 65 20 74 68 65 20 67 69 76 65 6e  nalyze the given
18250 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b   expression look
18260 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74  ing for aggregat
18270 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a  e functions and.
18280 2a 2a 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73  ** for variables
18290 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
182a0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 50   added to the pP
182b0 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72  arse->aAgg[] arr
182c0 61 79 2e 0a 2a 2a 20 4d 61 6b 65 20 61 64 64 69  ay..** Make addi
182d0 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 74  tional entries t
182e0 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41  o the pParse->aA
182f0 67 67 5b 5d 20 61 72 72 61 79 20 61 73 20 6e 65  gg[] array as ne
18300 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  cessary..**.** T
18310 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
18320 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
18330 64 20 61 66 74 65 72 20 74 68 65 20 65 78 70 72  d after the expr
18340 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a  ession has been.
18350 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73  ** analyzed by s
18360 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
18370 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69  rNames()..*/.voi
18380 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  d sqlite3ExprAna
18390 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 4e  lyzeAggregates(N
183a0 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
183b0 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
183c0 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78   Walker w;.  w.x
183d0 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61  ExprCallback = a
183e0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 3b  nalyzeAggregate;
183f0 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
18400 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67  back = analyzeAg
18410 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74  gregatesInSelect
18420 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e  ;.  w.u.pNC = pN
18430 43 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  C;.  sqlite3Walk
18440 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b  Expr(&w, pExpr);
18450 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73  .}../*.** Call s
18460 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
18470 65 41 67 67 72 65 67 61 74 65 73 28 29 20 66 6f  eAggregates() fo
18480 72 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69  r every expressi
18490 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72  on in an.** expr
184a0 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65  ession list.  Re
184b0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
184c0 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  of errors..**.**
184d0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   If an error is 
184e0 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79  found, the analy
184f0 73 69 73 20 69 73 20 63 75 74 20 73 68 6f 72 74  sis is cut short
18500 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
18510 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
18520 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ist(NameContext 
18530 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73 74 20 2a  *pNC, ExprList *
18540 70 4c 69 73 74 29 7b 0a 20 20 73 74 72 75 63 74  pList){.  struct
18550 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
18560 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  pItem;.  int i;.
18570 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
18580 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69     for(pItem=pLi
18590 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c  st->a, i=0; i<pL
185a0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  ist->nExpr; i++,
185b0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
185c0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
185d0 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 4e  yzeAggregates(pN
185e0 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  C, pItem->pExpr)
185f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
18600 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72  *.** Allocate or
18610 20 64 65 61 6c 6c 6f 63 61 74 65 20 74 65 6d 70   deallocate temp
18620 6f 72 61 72 79 20 75 73 65 20 72 65 67 69 73 74  orary use regist
18630 65 72 73 20 64 75 72 69 6e 67 20 63 6f 64 65 20  ers during code 
18640 67 65 6e 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 69  generation..*/.i
18650 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d  nt sqlite3GetTem
18660 70 52 65 67 28 50 61 72 73 65 20 2a 70 50 61 72  pReg(Parse *pPar
18670 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  se){.  if( pPars
18680 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29  e->nTempReg==0 )
18690 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 2b 70  {.    return ++p
186a0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d  Parse->nMem;.  }
186b0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65  .  return pParse
186c0 2d 3e 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61  ->aTempReg[--pPa
186d0 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a  rse->nTempReg];.
186e0 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  }.void sqlite3Re
186f0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 50 61 72  leaseTempReg(Par
18700 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
18710 69 52 65 67 29 7b 0a 20 20 69 66 28 20 69 52 65  iReg){.  if( iRe
18720 67 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 65  g && pParse->nTe
18730 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28  mpReg<ArraySize(
18740 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
18750 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
18760 45 78 70 72 57 72 69 74 61 62 6c 65 52 65 67 69  ExprWritableRegi
18770 73 74 65 72 28 70 50 61 72 73 65 2c 20 69 52 65  ster(pParse, iRe
18780 67 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 70 50  g, iReg);.    pP
18790 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70  arse->aTempReg[p
187a0 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b  Parse->nTempReg+
187b0 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d  +] = iReg;.  }.}
187c0 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
187d0 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 20 61   or deallocate a
187e0 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63   block of nReg c
187f0 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69 73  onsecutive regis
18800 74 65 72 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ters.*/.int sqli
18810 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
18820 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
18830 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt nReg){.  int 
18840 69 2c 20 6e 3b 0a 20 20 69 20 3d 20 70 50 61 72  i, n;.  i = pPar
18850 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20  se->iRangeReg;. 
18860 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61   n = pParse->nRa
18870 6e 67 65 52 65 67 3b 0a 20 20 69 66 28 20 6e 52  ngeReg;.  if( nR
18880 65 67 3c 3d 6e 20 26 26 20 21 75 73 65 64 41 73  eg<=n && !usedAs
18890 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72  ColumnCache(pPar
188a0 73 65 2c 20 69 2c 20 69 2b 6e 2d 31 29 20 29 7b  se, i, i+n-1) ){
188b0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61  .    pParse->iRa
188c0 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a  ngeReg += nReg;.
188d0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e      pParse->nRan
188e0 67 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20  geReg -= nReg;. 
188f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20   }else{.    i = 
18900 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
18910 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
18920 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20   += nReg;.  }.  
18930 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64  return i;.}.void
18940 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
18950 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a  empRange(Parse *
18960 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
18970 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69  , int nReg){.  i
18980 66 28 20 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e  f( nReg>pParse->
18990 6e 52 61 6e 67 65 52 65 67 20 29 7b 0a 20 20 20  nRangeReg ){.   
189a0 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
189b0 65 67 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70  eg = nReg;.    p
189c0 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
189d0 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a      = iReg;.  }.}.