/ Hex Artifact Content
Login

Artifact 9033d8efb283311103a2859fc6aa9f85b894b6ba:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2a 0a 2a 2a  in SQLite..**.**
0200: 20 24 49 64 3a 20 65 78 70 72 2e 63 2c 76 20 31   $Id: expr.c,v 1
0210: 2e 33 39 30 20 32 30 30 38 2f 30 38 2f 32 32 20  .390 2008/08/22 
0220: 31 36 3a 32 39 3a 35 31 20 64 72 68 20 45 78 70  16:29:51 drh Exp
0230: 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22   $.*/.#include "
0240: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e  sqliteInt.h".#in
0250: 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a  clude <ctype.h>.
0260: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0270: 65 20 27 61 66 66 69 6e 69 74 79 27 20 6f 66 20  e 'affinity' of 
0280: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
0290: 45 78 70 72 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a  Expr if any..**.
02a0: 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61  ** If pExpr is a
02b0: 20 63 6f 6c 75 6d 6e 2c 20 61 20 72 65 66 65 72   column, a refer
02c0: 65 6e 63 65 20 74 6f 20 61 20 63 6f 6c 75 6d 6e  ence to a column
02d0: 20 76 69 61 20 61 6e 20 27 41 53 27 20 61 6c 69   via an 'AS' ali
02e0: 61 73 2c 0a 2a 2a 20 6f 72 20 61 20 73 75 62 2d  as,.** or a sub-
02f0: 73 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f  select with a co
0300: 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 65 74 75  lumn as the retu
0310: 72 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  rn value, then t
0320: 68 65 20 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20  he .** affinity 
0330: 6f 66 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69  of that column i
0340: 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
0350: 72 77 69 73 65 2c 20 30 78 30 30 20 69 73 20 72  rwise, 0x00 is r
0360: 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 69 6e 64 69  eturned,.** indi
0370: 63 61 74 69 6e 67 20 6e 6f 20 61 66 66 69 6e 69  cating no affini
0380: 74 79 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ty for the expre
0390: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65  ssion..**.** i.e
03a0: 2e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  . the WHERE clau
03b0: 73 65 20 65 78 70 72 65 73 73 73 69 6f 6e 73 20  se expresssions 
03c0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
03d0: 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6c 6c 0a   statements all.
03e0: 2a 2a 20 68 61 76 65 20 61 6e 20 61 66 66 69 6e  ** have an affin
03f0: 69 74 79 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  ity:.**.** CREAT
0400: 45 20 54 41 42 4c 45 20 74 31 28 61 29 3b 0a 2a  E TABLE t1(a);.*
0410: 2a 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  * SELECT * FROM 
0420: 74 31 20 57 48 45 52 45 20 61 3b 0a 2a 2a 20 53  t1 WHERE a;.** S
0430: 45 4c 45 43 54 20 61 20 41 53 20 62 20 46 52 4f  ELECT a AS b FRO
0440: 4d 20 74 31 20 57 48 45 52 45 20 62 3b 0a 2a 2a  M t1 WHERE b;.**
0450: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0460: 31 20 57 48 45 52 45 20 28 73 65 6c 65 63 74 20  1 WHERE (select 
0470: 61 20 66 72 6f 6d 20 74 31 29 3b 0a 2a 2f 0a 63  a from t1);.*/.c
0480: 68 61 72 20 73 71 6c 69 74 65 33 45 78 70 72 41  har sqlite3ExprA
0490: 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45  ffinity(Expr *pE
04a0: 78 70 72 29 7b 0a 20 20 69 6e 74 20 6f 70 20 3d  xpr){.  int op =
04b0: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
04c0: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
04d0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
04e0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
04f0: 79 28 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  y(pExpr->pSelect
0500: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
0510: 45 78 70 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  Expr);.  }.#ifnd
0520: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
0530: 41 53 54 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  AST.  if( op==TK
0540: 5f 43 41 53 54 20 29 7b 0a 20 20 20 20 72 65 74  _CAST ){.    ret
0550: 75 72 6e 20 73 71 6c 69 74 65 33 41 66 66 69 6e  urn sqlite3Affin
0560: 69 74 79 54 79 70 65 28 26 70 45 78 70 72 2d 3e  ityType(&pExpr->
0570: 74 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64  token);.  }.#end
0580: 69 66 0a 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b  if.  if( (op==TK
0590: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54  _COLUMN || op==T
05a0: 4b 5f 52 45 47 49 53 54 45 52 29 20 26 26 20 70  K_REGISTER) && p
05b0: 45 78 70 72 2d 3e 70 54 61 62 21 3d 30 20 29 7b  Expr->pTab!=0 ){
05c0: 0a 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52  .    /* op==TK_R
05d0: 45 47 49 53 54 45 52 20 26 26 20 70 45 78 70 72  EGISTER && pExpr
05e0: 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e  ->pTab!=0 happen
05f0: 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61 73  s when pExpr was
0600: 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20   originally.    
0610: 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62  ** a TK_COLUMN b
0620: 75 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  ut was previousl
0630: 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  y evaluated and 
0640: 63 61 63 68 65 64 20 69 6e 20 61 20 72 65 67 69  cached in a regi
0650: 73 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ster */.    int 
0660: 6a 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  j = pExpr->iColu
0670: 6d 6e 3b 0a 20 20 20 20 69 66 28 20 6a 3c 30 20  mn;.    if( j<0 
0680: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
0690: 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  AFF_INTEGER;.   
06a0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
06b0: 70 54 61 62 20 26 26 20 6a 3c 70 45 78 70 72 2d  pTab && j<pExpr-
06c0: 3e 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20  >pTab->nCol );. 
06d0: 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d     return pExpr-
06e0: 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61  >pTab->aCol[j].a
06f0: 66 66 69 6e 69 74 79 3b 0a 20 20 7d 0a 20 20 72  ffinity;.  }.  r
0700: 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61 66 66  eturn pExpr->aff
0710: 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  inity;.}../*.** 
0720: 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  Set the collatin
0730: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65  g sequence for e
0740: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
0750: 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c 61 74  to be the collat
0760: 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20  ing.** sequence 
0770: 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e 2e  named by pToken.
0780: 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e     Return a poin
0790: 74 65 72 20 74 6f 20 74 68 65 20 72 65 76 69 73  ter to the revis
07a0: 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  ed expression..*
07b0: 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * The collating 
07c0: 73 65 71 75 65 6e 63 65 20 69 73 20 6d 61 72 6b  sequence is mark
07d0: 65 64 20 61 73 20 22 65 78 70 6c 69 63 69 74 22  ed as "explicit"
07e0: 20 75 73 69 6e 67 20 74 68 65 20 45 50 5f 45 78   using the EP_Ex
07f0: 70 43 6f 6c 6c 61 74 65 0a 2a 2a 20 66 6c 61 67  pCollate.** flag
0800: 2e 20 20 41 6e 20 65 78 70 6c 69 63 69 74 20 63  .  An explicit c
0810: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
0820: 65 20 77 69 6c 6c 20 6f 76 65 72 72 69 64 65 20  e will override 
0830: 69 6d 70 6c 69 63 69 74 0a 2a 2a 20 63 6f 6c 6c  implicit.** coll
0840: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 2e  ating sequences.
0850: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
0860: 33 45 78 70 72 53 65 74 43 6f 6c 6c 28 50 61 72  3ExprSetColl(Par
0870: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
0880: 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a   *pExpr, Token *
0890: 70 43 6f 6c 6c 4e 61 6d 65 29 7b 0a 20 20 63 68  pCollName){.  ch
08a0: 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 30 3b 20 20  ar *zColl = 0;  
08b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 71            /* Deq
08c0: 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20 63 6f  uoted name of co
08d0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
08e0: 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70   */.  CollSeq *p
08f0: 43 6f 6c 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20  Coll;.  sqlite3 
0900: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
0910: 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69  ;.  zColl = sqli
0920: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
0930: 28 64 62 2c 20 70 43 6f 6c 6c 4e 61 6d 65 29 3b  (db, pCollName);
0940: 0a 20 20 69 66 28 20 70 45 78 70 72 20 26 26 20  .  if( pExpr && 
0950: 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 70 43 6f  zColl ){.    pCo
0960: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ll = sqlite3Loca
0970: 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
0980: 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 29 3b 0a 20 20  , zColl, -1);.  
0990: 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
09a0: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c       pExpr->pCol
09b0: 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  l = pColl;.     
09c0: 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 7c 3d   pExpr->flags |=
09d0: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a   EP_ExpCollate;.
09e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
09f0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43  te3DbFree(db, zC
0a00: 6f 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  oll);.  return p
0a10: 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Expr;.}../*.** R
0a20: 65 74 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c  eturn the defaul
0a30: 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  t collation sequ
0a40: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78 70  ence for the exp
0a50: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49  ression pExpr. I
0a60: 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f  f.** there is no
0a70: 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69   default collati
0a80: 6f 6e 20 74 79 70 65 2c 20 72 65 74 75 72 6e 20  on type, return 
0a90: 30 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73  0..*/.CollSeq *s
0aa0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
0ab0: 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
0ac0: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
0ad0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
0ae0: 3d 20 30 3b 0a 20 20 45 78 70 72 20 2a 70 20 3d  = 0;.  Expr *p =
0af0: 20 70 45 78 70 72 3b 0a 20 20 77 68 69 6c 65 28   pExpr;.  while(
0b00: 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70   p ){.    int op
0b10: 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 2d  ;.    pColl = p-
0b20: 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 66 28 20  >pColl;.    if( 
0b30: 70 43 6f 6c 6c 20 29 20 62 72 65 61 6b 3b 0a 20  pColl ) break;. 
0b40: 20 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20     op = p->op;. 
0b50: 20 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 43     if( (op==TK_C
0b60: 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  OLUMN || op==TK_
0b70: 52 45 47 49 53 54 45 52 29 20 26 26 20 70 2d 3e  REGISTER) && p->
0b80: 70 54 61 62 21 3d 30 20 29 7b 0a 20 20 20 20 20  pTab!=0 ){.     
0b90: 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53   /* op==TK_REGIS
0ba0: 54 45 52 20 26 26 20 70 2d 3e 70 54 61 62 21 3d  TER && p->pTab!=
0bb0: 30 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 70  0 happens when p
0bc0: 45 78 70 72 20 77 61 73 20 6f 72 69 67 69 6e 61  Expr was origina
0bd0: 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 61 20 54  lly.      ** a T
0be0: 4b 5f 43 4f 4c 55 4d 4e 20 62 75 74 20 77 61 73  K_COLUMN but was
0bf0: 20 70 72 65 76 69 6f 75 73 6c 79 20 65 76 61 6c   previously eval
0c00: 75 61 74 65 64 20 61 6e 64 20 63 61 63 68 65 64  uated and cached
0c10: 20 69 6e 20 61 20 72 65 67 69 73 74 65 72 20 2a   in a register *
0c20: 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  /.      const ch
0c30: 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  ar *zColl;.     
0c40: 20 69 6e 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c   int j = p->iCol
0c50: 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  umn;.      if( j
0c60: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  >=0 ){.        s
0c70: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
0c80: 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20  rse->db;.       
0c90: 20 7a 43 6f 6c 6c 20 3d 20 70 2d 3e 70 54 61 62   zColl = p->pTab
0ca0: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b  ->aCol[j].zColl;
0cb0: 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
0cc0: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
0cd0: 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c  Seq(db, ENC(db),
0ce0: 20 7a 43 6f 6c 6c 2c 20 2d 31 2c 20 30 29 3b 0a   zColl, -1, 0);.
0cf0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
0d00: 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20  Coll = pColl;.  
0d10: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
0d20: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
0d30: 20 6f 70 21 3d 54 4b 5f 43 41 53 54 20 26 26 20   op!=TK_CAST && 
0d40: 6f 70 21 3d 54 4b 5f 55 50 4c 55 53 20 29 7b 0a  op!=TK_UPLUS ){.
0d50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
0d60: 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c   }.    p = p->pL
0d70: 65 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  eft;.  }.  if( s
0d80: 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53  qlite3CheckCollS
0d90: 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c  eq(pParse, pColl
0da0: 29 20 29 7b 20 0a 20 20 20 20 70 43 6f 6c 6c 20  ) ){ .    pColl 
0db0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
0dc0: 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pColl;.}../*.*
0dd0: 2a 20 70 45 78 70 72 20 69 73 20 61 6e 20 6f 70  * pExpr is an op
0de0: 65 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61  erand of a compa
0df0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20  rison operator. 
0e00: 20 61 66 66 32 20 69 73 20 74 68 65 0a 2a 2a 20   aff2 is the.** 
0e10: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66  type affinity of
0e20: 20 74 68 65 20 6f 74 68 65 72 20 6f 70 65 72 61   the other opera
0e30: 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  nd.  This routin
0e40: 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a  e returns the.**
0e50: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74   type affinity t
0e60: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
0e70: 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 61  ed for the compa
0e80: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a  rison operator..
0e90: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 43  */.char sqlite3C
0ea0: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 45  ompareAffinity(E
0eb0: 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72  xpr *pExpr, char
0ec0: 20 61 66 66 32 29 7b 0a 20 20 63 68 61 72 20 61   aff2){.  char a
0ed0: 66 66 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ff1 = sqlite3Exp
0ee0: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  rAffinity(pExpr)
0ef0: 3b 0a 20 20 69 66 28 20 61 66 66 31 20 26 26 20  ;.  if( aff1 && 
0f00: 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 42  aff2 ){.    /* B
0f10: 6f 74 68 20 73 69 64 65 73 20 6f 66 20 74 68 65  oth sides of the
0f20: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65 20   comparison are 
0f30: 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e 65 20  columns. If one 
0f40: 68 61 73 20 6e 75 6d 65 72 69 63 0a 20 20 20 20  has numeric.    
0f50: 2a 2a 20 61 66 66 69 6e 69 74 79 2c 20 75 73 65  ** affinity, use
0f60: 20 74 68 61 74 2e 20 4f 74 68 65 72 77 69 73 65   that. Otherwise
0f70: 20 75 73 65 20 6e 6f 20 61 66 66 69 6e 69 74 79   use no affinity
0f80: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
0f90: 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69   sqlite3IsNumeri
0fa0: 63 41 66 66 69 6e 69 74 79 28 61 66 66 31 29 20  cAffinity(aff1) 
0fb0: 7c 7c 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65  || sqlite3IsNume
0fc0: 72 69 63 41 66 66 69 6e 69 74 79 28 61 66 66 32  ricAffinity(aff2
0fd0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
0fe0: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  n SQLITE_AFF_NUM
0ff0: 45 52 49 43 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ERIC;.    }else{
1000: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1010: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
1020: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
1030: 20 21 61 66 66 31 20 26 26 20 21 61 66 66 32 20   !aff1 && !aff2 
1040: 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 69 74 68 65  ){.    /* Neithe
1050: 72 20 73 69 64 65 20 6f 66 20 74 68 65 20 63 6f  r side of the co
1060: 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20 63 6f  mparison is a co
1070: 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61 72 65 20 74  lumn.  Compare t
1080: 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74  he.    ** result
1090: 73 20 64 69 72 65 63 74 6c 79 2e 0a 20 20 20 20  s directly..    
10a0: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
10b0: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
10c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f   }else{.    /* O
10d0: 6e 65 20 73 69 64 65 20 69 73 20 61 20 63 6f 6c  ne side is a col
10e0: 75 6d 6e 2c 20 74 68 65 20 6f 74 68 65 72 20 69  umn, the other i
10f0: 73 20 6e 6f 74 2e 20 55 73 65 20 74 68 65 20 63  s not. Use the c
1100: 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 2e  olumns affinity.
1110: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1120: 61 66 66 31 3d 3d 30 20 7c 7c 20 61 66 66 32 3d  aff1==0 || aff2=
1130: 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
1140: 20 28 61 66 66 31 20 2b 20 61 66 66 32 29 3b 0a   (aff1 + aff2);.
1150: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78    }.}../*.** pEx
1160: 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73  pr is a comparis
1170: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 52 65  on operator.  Re
1180: 74 75 72 6e 20 74 68 65 20 74 79 70 65 20 61 66  turn the type af
1190: 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75  finity that shou
11a0: 6c 64 0a 2a 2a 20 62 65 20 61 70 70 6c 69 65 64  ld.** be applied
11b0: 20 74 6f 20 62 6f 74 68 20 6f 70 65 72 61 6e 64   to both operand
11c0: 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67  s prior to doing
11d0: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   the comparison.
11e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
11f0: 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69  comparisonAffini
1200: 74 79 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b  ty(Expr *pExpr){
1210: 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20 61  .  char aff;.  a
1220: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
1230: 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72  ==TK_EQ || pExpr
1240: 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 70  ->op==TK_IN || p
1250: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20  Expr->op==TK_LT 
1260: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  ||.          pEx
1270: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c  pr->op==TK_GT ||
1280: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
1290: 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  E || pExpr->op==
12a0: 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20 20 20 20 20  TK_LE ||.       
12b0: 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b     pExpr->op==TK
12c0: 5f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _NE );.  assert(
12d0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b   pExpr->pLeft );
12e0: 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33  .  aff = sqlite3
12f0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78  ExprAffinity(pEx
1300: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66  pr->pLeft);.  if
1310: 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20  ( pExpr->pRight 
1320: 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c  ){.    aff = sql
1330: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
1340: 69 74 79 28 70 45 78 70 72 2d 3e 70 52 69 67 68  ity(pExpr->pRigh
1350: 74 2c 20 61 66 66 29 3b 0a 20 20 7d 0a 20 20 65  t, aff);.  }.  e
1360: 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 70  lse if( pExpr->p
1370: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 61 66  Select ){.    af
1380: 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  f = sqlite3Compa
1390: 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  reAffinity(pExpr
13a0: 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  ->pSelect->pELis
13b0: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61  t->a[0].pExpr, a
13c0: 66 66 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20  ff);.  }.  else 
13d0: 69 66 28 20 21 61 66 66 20 29 7b 0a 20 20 20 20  if( !aff ){.    
13e0: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
13f0: 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a 20 20 72 65 74  _NONE;.  }.  ret
1400: 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn aff;.}../*.*
1410: 2a 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d  * pExpr is a com
1420: 70 61 72 69 73 6f 6e 20 65 78 70 72 65 73 73 69  parison expressi
1430: 6f 6e 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27  on, eg. '=', '<'
1440: 2c 20 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a  , IN(...) etc..*
1450: 2a 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20 69  * idx_affinity i
1460: 73 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f  s the affinity o
1470: 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c  f an indexed col
1480: 75 6d 6e 2e 20 52 65 74 75 72 6e 20 74 72 75 65  umn. Return true
1490: 0a 2a 2a 20 69 66 20 74 68 65 20 69 6e 64 65 78  .** if the index
14a0: 20 77 69 74 68 20 61 66 66 69 6e 69 74 79 20 69   with affinity i
14b0: 64 78 5f 61 66 66 69 6e 69 74 79 20 6d 61 79 20  dx_affinity may 
14c0: 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  be used to imple
14d0: 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70  ment.** the comp
14e0: 61 72 69 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e  arison in pExpr.
14f0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
1500: 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 45  ndexAffinityOk(E
1510: 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72  xpr *pExpr, char
1520: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a   idx_affinity){.
1530: 20 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f 6d    char aff = com
1540: 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28  parisonAffinity(
1550: 70 45 78 70 72 29 3b 0a 20 20 73 77 69 74 63 68  pExpr);.  switch
1560: 28 20 61 66 66 20 29 7b 0a 20 20 20 20 63 61 73  ( aff ){.    cas
1570: 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  e SQLITE_AFF_NON
1580: 45 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  E:.      return 
1590: 31 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  1;.    case SQLI
15a0: 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20  TE_AFF_TEXT:.   
15b0: 20 20 20 72 65 74 75 72 6e 20 69 64 78 5f 61 66     return idx_af
15c0: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
15d0: 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 64 65 66  FF_TEXT;.    def
15e0: 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75  ault:.      retu
15f0: 72 6e 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65  rn sqlite3IsNume
1600: 72 69 63 41 66 66 69 6e 69 74 79 28 69 64 78 5f  ricAffinity(idx_
1610: 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d 0a 7d  affinity);.  }.}
1620: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1630: 68 65 20 50 35 20 76 61 6c 75 65 20 74 68 61 74  he P5 value that
1640: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
1650: 66 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f 6d  for a binary com
1660: 70 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64  parison.** opcod
1670: 65 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20  e (OP_Eq, OP_Ge 
1680: 65 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63 6f  etc.) used to co
1690: 6d 70 61 72 65 20 70 45 78 70 72 31 20 61 6e 64  mpare pExpr1 and
16a0: 20 70 45 78 70 72 32 2e 0a 2a 2f 0a 73 74 61 74   pExpr2..*/.stat
16b0: 69 63 20 75 38 20 62 69 6e 61 72 79 43 6f 6d 70  ic u8 binaryComp
16c0: 61 72 65 50 35 28 45 78 70 72 20 2a 70 45 78 70  areP5(Expr *pExp
16d0: 72 31 2c 20 45 78 70 72 20 2a 70 45 78 70 72 32  r1, Expr *pExpr2
16e0: 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
16f0: 29 7b 0a 20 20 75 38 20 61 66 66 20 3d 20 28 63  ){.  u8 aff = (c
1700: 68 61 72 29 73 71 6c 69 74 65 33 45 78 70 72 41  har)sqlite3ExprA
1710: 66 66 69 6e 69 74 79 28 70 45 78 70 72 32 29 3b  ffinity(pExpr2);
1720: 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33  .  aff = sqlite3
1730: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
1740: 70 45 78 70 72 31 2c 20 61 66 66 29 20 7c 20 6a  pExpr1, aff) | j
1750: 75 6d 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74  umpIfNull;.  ret
1760: 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn aff;.}../*.*
1770: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
1780: 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74  er to the collat
1790: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61  ion sequence tha
17a0: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
17b0: 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20   by.** a binary 
17c0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
17d0: 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c  tor comparing pL
17e0: 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a  eft and pRight..
17f0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66  **.** If the lef
1800: 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f  t hand expressio
1810: 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e  n has a collatin
1820: 67 20 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c  g sequence type,
1830: 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75   then it is.** u
1840: 73 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74  sed. Otherwise t
1850: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
1860: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69  uence for the ri
1870: 67 68 74 20 68 61 6e 64 20 65 78 70 72 65 73 73  ght hand express
1880: 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20  ion.** is used, 
1890: 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 28  or the default (
18a0: 42 49 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68  BINARY) if neith
18b0: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61  er expression ha
18c0: 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a  s a collating.**
18d0: 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67   type..**.** Arg
18e0: 75 6d 65 6e 74 20 70 52 69 67 68 74 20 28 62 75  ument pRight (bu
18f0: 74 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79  t not pLeft) may
1900: 20 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74   be a null point
1910: 65 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  er. In this case
1920: 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63  ,.** it is not c
1930: 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f  onsidered..*/.Co
1940: 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 42 69  llSeq *sqlite3Bi
1950: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
1960: 65 71 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  eq(.  Parse *pPa
1970: 72 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c  rse, .  Expr *pL
1980: 65 66 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52  eft, .  Expr *pR
1990: 69 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65  ight.){.  CollSe
19a0: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65  q *pColl;.  asse
19b0: 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69  rt( pLeft );.  i
19c0: 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20  f( pLeft->flags 
19d0: 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20  & EP_ExpCollate 
19e0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
19f0: 4c 65 66 74 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20  Left->pColl );. 
1a00: 20 20 20 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74     pColl = pLeft
1a10: 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 7d 65 6c 73 65  ->pColl;.  }else
1a20: 20 69 66 28 20 70 52 69 67 68 74 20 26 26 20 70   if( pRight && p
1a30: 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45  Right->flags & E
1a40: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a  P_ExpCollate ){.
1a50: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67      assert( pRig
1a60: 68 74 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20  ht->pColl );.   
1a70: 20 70 43 6f 6c 6c 20 3d 20 70 52 69 67 68 74 2d   pColl = pRight-
1a80: 3e 70 43 6f 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b  >pColl;.  }else{
1a90: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
1aa0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
1ab0: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a  pParse, pLeft);.
1ac0: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
1ad0: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  {.      pColl = 
1ae0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1af0: 65 71 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  eq(pParse, pRigh
1b00: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
1b10: 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a  return pColl;.}.
1b20: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1b30: 74 68 65 20 6f 70 65 72 61 6e 64 73 20 66 6f 72  the operands for
1b40: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
1b50: 65 72 61 74 69 6f 6e 2e 20 20 42 65 66 6f 72 65  eration.  Before
1b60: 0a 2a 2a 20 67 65 6e 65 72 61 74 69 6e 67 20 74  .** generating t
1b70: 68 65 20 63 6f 64 65 20 66 6f 72 20 65 61 63 68  he code for each
1b80: 20 6f 70 65 72 61 6e 64 2c 20 73 65 74 20 74 68   operand, set th
1b90: 65 20 45 50 5f 41 6e 79 41 66 66 0a 2a 2a 20 66  e EP_AnyAff.** f
1ba0: 6c 61 67 20 6f 6e 20 74 68 65 20 65 78 70 72 65  lag on the expre
1bb0: 73 73 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 74  ssion so that it
1bc0: 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f   will be able to
1bd0: 20 75 73 65 64 20 61 0a 2a 2a 20 63 61 63 68 65   used a.** cache
1be0: 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 74  d column value t
1bf0: 68 61 74 20 68 61 73 20 70 72 65 76 69 6f 75 73  hat has previous
1c00: 6c 79 20 75 6e 64 65 72 67 6f 6e 65 20 61 6e 0a  ly undergone an.
1c10: 2a 2a 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e  ** affinity chan
1c20: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
1c30: 69 64 20 63 6f 64 65 43 6f 6d 70 61 72 65 4f 70  id codeCompareOp
1c40: 65 72 61 6e 64 73 28 0a 20 20 50 61 72 73 65 20  erands(.  Parse 
1c50: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
1c60: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
1c70: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
1c80: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  xt */.  Expr *pL
1c90: 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  eft,      /* The
1ca0: 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   left operand */
1cb0: 0a 20 20 69 6e 74 20 2a 70 52 65 67 4c 65 66 74  .  int *pRegLeft
1cc0: 2c 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72  ,    /* Register
1cd0: 20 77 68 65 72 65 20 6c 65 66 74 20 6f 70 65 72   where left oper
1ce0: 61 6e 64 20 69 73 20 73 74 6f 72 65 64 20 2a 2f  and is stored */
1cf0: 0a 20 20 69 6e 74 20 2a 70 46 72 65 65 4c 65 66  .  int *pFreeLef
1d00: 74 2c 20 20 20 2f 2a 20 46 72 65 65 20 74 68 69  t,   /* Free thi
1d10: 73 20 72 65 67 69 73 74 65 72 20 77 68 65 6e 20  s register when 
1d20: 64 6f 6e 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  done */.  Expr *
1d30: 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20 54  pRight,     /* T
1d40: 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
1d50: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 52   */.  int *pRegR
1d60: 69 67 68 74 2c 20 20 20 2f 2a 20 52 65 67 69 73  ight,   /* Regis
1d70: 74 65 72 20 77 68 65 72 65 20 72 69 67 68 74 20  ter where right 
1d80: 6f 70 65 72 61 6e 64 20 69 73 20 73 74 6f 72 65  operand is store
1d90: 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 46 72 65  d */.  int *pFre
1da0: 65 52 69 67 68 74 20 20 20 2f 2a 20 57 72 69 74  eRight   /* Writ
1db0: 65 20 74 65 6d 70 20 72 65 67 69 73 74 65 72 20  e temp register 
1dc0: 66 6f 72 20 72 69 67 68 74 20 6f 70 65 72 61 6e  for right operan
1dd0: 64 20 74 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  d there */.){.  
1de0: 77 68 69 6c 65 28 20 70 4c 65 66 74 2d 3e 6f 70  while( pLeft->op
1df0: 3d 3d 54 4b 5f 55 50 4c 55 53 20 29 20 70 4c 65  ==TK_UPLUS ) pLe
1e00: 66 74 20 3d 20 70 4c 65 66 74 2d 3e 70 4c 65 66  ft = pLeft->pLef
1e10: 74 3b 0a 20 20 70 4c 65 66 74 2d 3e 66 6c 61 67  t;.  pLeft->flag
1e20: 73 20 7c 3d 20 45 50 5f 41 6e 79 41 66 66 3b 0a  s |= EP_AnyAff;.
1e30: 20 20 2a 70 52 65 67 4c 65 66 74 20 3d 20 73 71    *pRegLeft = sq
1e40: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1e50: 70 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  p(pParse, pLeft,
1e60: 20 70 46 72 65 65 4c 65 66 74 29 3b 0a 20 20 77   pFreeLeft);.  w
1e70: 68 69 6c 65 28 20 70 52 69 67 68 74 2d 3e 6f 70  hile( pRight->op
1e80: 3d 3d 54 4b 5f 55 50 4c 55 53 20 29 20 70 52 69  ==TK_UPLUS ) pRi
1e90: 67 68 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 4c  ght = pRight->pL
1ea0: 65 66 74 3b 0a 20 20 70 52 69 67 68 74 2d 3e 66  eft;.  pRight->f
1eb0: 6c 61 67 73 20 7c 3d 20 45 50 5f 41 6e 79 41 66  lags |= EP_AnyAf
1ec0: 66 3b 0a 20 20 2a 70 52 65 67 52 69 67 68 74 20  f;.  *pRegRight 
1ed0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1ee0: 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 52  eTemp(pParse, pR
1ef0: 69 67 68 74 2c 20 70 46 72 65 65 52 69 67 68 74  ight, pFreeRight
1f00: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
1f10: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
1f20: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
1f30: 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tor..*/.static i
1f40: 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 0a  nt codeCompare(.
1f50: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1f60: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
1f70: 6e 67 20 28 61 6e 64 20 63 6f 64 65 20 67 65 6e  ng (and code gen
1f80: 65 72 61 74 69 6e 67 29 20 63 6f 6e 74 65 78 74  erating) context
1f90: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
1fa0: 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c  t,      /* The l
1fb0: 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  eft operand */. 
1fc0: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20   Expr *pRight,  
1fd0: 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20     /* The right 
1fe0: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
1ff0: 20 6f 70 63 6f 64 65 2c 20 20 20 20 20 20 20 2f   opcode,       /
2000: 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  * The comparison
2010: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74   opcode */.  int
2020: 20 69 6e 31 2c 20 69 6e 74 20 69 6e 32 2c 20 2f   in1, int in2, /
2030: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
2040: 6e 67 20 6f 70 65 72 61 6e 64 73 20 2a 2f 0a 20  ng operands */. 
2050: 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20   int dest,      
2060: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
2070: 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20 69  if true.  */.  i
2080: 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20  nt jumpIfNull   
2090: 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a 75 6d   /* If true, jum
20a0: 70 20 69 66 20 65 69 74 68 65 72 20 6f 70 65 72  p if either oper
20b0: 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29  and is NULL */.)
20c0: 7b 0a 20 20 69 6e 74 20 70 35 3b 0a 20 20 69 6e  {.  int p5;.  in
20d0: 74 20 61 64 64 72 3b 0a 20 20 43 6f 6c 6c 53 65  t addr;.  CollSe
20e0: 71 20 2a 70 34 3b 0a 0a 20 20 70 34 20 3d 20 73  q *p4;..  p4 = s
20f0: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
2100: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
2110: 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
2120: 29 3b 0a 20 20 70 35 20 3d 20 62 69 6e 61 72 79  );.  p5 = binary
2130: 43 6f 6d 70 61 72 65 50 35 28 70 4c 65 66 74 2c  CompareP5(pLeft,
2140: 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49 66 4e   pRight, jumpIfN
2150: 75 6c 6c 29 3b 0a 20 20 61 64 64 72 20 3d 20 73  ull);.  addr = s
2160: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2170: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
2180: 6f 70 63 6f 64 65 2c 20 69 6e 32 2c 20 64 65 73  opcode, in2, des
2190: 74 2c 20 69 6e 31 2c 0a 20 20 20 20 20 20 20 20  t, in1,.        
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b0: 20 20 20 28 76 6f 69 64 2a 29 70 34 2c 20 50 34     (void*)p4, P4
21c0: 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 73 71 6c  _COLLSEQ);.  sql
21d0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
21e0: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
21f0: 70 35 29 3b 0a 20 20 69 66 28 20 28 70 35 20 26  p5);.  if( (p5 &
2200: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b   SQLITE_AFF_MASK
2210: 29 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  )!=SQLITE_AFF_NO
2220: 4e 45 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  NE ){.    sqlite
2230: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
2240: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
2250: 20 69 6e 31 2c 20 31 29 3b 0a 20 20 20 20 73 71   in1, 1);.    sq
2260: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
2270: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
2280: 72 73 65 2c 20 69 6e 32 2c 20 31 29 3b 0a 20 20  rse, in2, 1);.  
2290: 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  }.  return addr;
22a0: 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  .}..#if SQLITE_M
22b0: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a  AX_EXPR_DEPTH>0.
22c0: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74  /*.** Check that
22d0: 20 61 72 67 75 6d 65 6e 74 20 6e 48 65 69 67 68   argument nHeigh
22e0: 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  t is less than o
22f0: 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d  r equal to the m
2300: 61 78 69 6d 75 6d 0a 2a 2a 20 65 78 70 72 65 73  aximum.** expres
2310: 73 69 6f 6e 20 64 65 70 74 68 20 61 6c 6c 6f 77  sion depth allow
2320: 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74  ed. If it is not
2330: 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
2340: 20 6d 65 73 73 61 67 65 20 69 6e 0a 2a 2a 20 70   message in.** p
2350: 50 61 72 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  Parse..*/.int sq
2360: 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 48 65  lite3ExprCheckHe
2370: 69 67 68 74 28 50 61 72 73 65 20 2a 70 50 61 72  ight(Parse *pPar
2380: 73 65 2c 20 69 6e 74 20 6e 48 65 69 67 68 74 29  se, int nHeight)
2390: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
23a0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6d 78  ITE_OK;.  int mx
23b0: 48 65 69 67 68 74 20 3d 20 70 50 61 72 73 65 2d  Height = pParse-
23c0: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
23d0: 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45  TE_LIMIT_EXPR_DE
23e0: 50 54 48 5d 3b 0a 20 20 69 66 28 20 6e 48 65 69  PTH];.  if( nHei
23f0: 67 68 74 3e 6d 78 48 65 69 67 68 74 20 29 7b 0a  ght>mxHeight ){.
2400: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
2410: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
2420: 20 20 20 20 22 45 78 70 72 65 73 73 69 6f 6e 20      "Expression 
2430: 74 72 65 65 20 69 73 20 74 6f 6f 20 6c 61 72 67  tree is too larg
2440: 65 20 28 6d 61 78 69 6d 75 6d 20 64 65 70 74 68  e (maximum depth
2450: 20 25 64 29 22 2c 20 6d 78 48 65 69 67 68 74 0a   %d)", mxHeight.
2460: 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20      );.    rc = 
2470: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
2480: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2490: 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ../* The followi
24a0: 6e 67 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f  ng three functio
24b0: 6e 73 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72  ns, heightOfExpr
24c0: 28 29 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72  (), heightOfExpr
24d0: 4c 69 73 74 28 29 0a 2a 2a 20 61 6e 64 20 68 65  List().** and he
24e0: 69 67 68 74 4f 66 53 65 6c 65 63 74 28 29 2c 20  ightOfSelect(), 
24f0: 61 72 65 20 75 73 65 64 20 74 6f 20 64 65 74 65  are used to dete
2500: 72 6d 69 6e 65 20 74 68 65 20 6d 61 78 69 6d 75  rmine the maximu
2510: 6d 20 68 65 69 67 68 74 0a 2a 2a 20 6f 66 20 61  m height.** of a
2520: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  ny expression tr
2530: 65 65 20 72 65 66 65 72 65 6e 63 65 64 20 62 79  ee referenced by
2540: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70   the structure p
2550: 61 73 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20  assed as the.** 
2560: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
2570: 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 61  **.** If this ma
2580: 78 69 6d 75 6d 20 68 65 69 67 68 74 20 69 73 20  ximum height is 
2590: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
25a0: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 70   current value p
25b0: 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20  ointed.** to by 
25c0: 70 6e 48 65 69 67 68 74 2c 20 74 68 65 20 73 65  pnHeight, the se
25d0: 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 2c 20  cond parameter, 
25e0: 74 68 65 6e 20 73 65 74 20 2a 70 6e 48 65 69 67  then set *pnHeig
25f0: 68 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 76 61  ht to that.** va
2600: 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  lue..*/.static v
2610: 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72  oid heightOfExpr
2620: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70  (Expr *p, int *p
2630: 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20  nHeight){.  if( 
2640: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  p ){.    if( p->
2650: 6e 48 65 69 67 68 74 3e 2a 70 6e 48 65 69 67 68  nHeight>*pnHeigh
2660: 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e 48 65  t ){.      *pnHe
2670: 69 67 68 74 20 3d 20 70 2d 3e 6e 48 65 69 67 68  ight = p->nHeigh
2680: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73  t;.    }.  }.}.s
2690: 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68  tatic void heigh
26a0: 74 4f 66 45 78 70 72 4c 69 73 74 28 45 78 70 72  tOfExprList(Expr
26b0: 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e  List *p, int *pn
26c0: 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70  Height){.  if( p
26d0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
26e0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
26f0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
2700: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
2710: 28 70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  (p->a[i].pExpr, 
2720: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 7d  pnHeight);.    }
2730: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
2740: 69 64 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63  id heightOfSelec
2750: 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  t(Select *p, int
2760: 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69   *pnHeight){.  i
2770: 66 28 20 70 20 29 7b 0a 20 20 20 20 68 65 69 67  f( p ){.    heig
2780: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 57 68 65  htOfExpr(p->pWhe
2790: 72 65 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  re, pnHeight);. 
27a0: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28     heightOfExpr(
27b0: 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70 6e 48 65  p->pHaving, pnHe
27c0: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
27d0: 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 69 6d 69  tOfExpr(p->pLimi
27e0: 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  t, pnHeight);.  
27f0: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
2800: 2d 3e 70 4f 66 66 73 65 74 2c 20 70 6e 48 65 69  ->pOffset, pnHei
2810: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
2820: 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45  OfExprList(p->pE
2830: 4c 69 73 74 2c 20 70 6e 48 65 69 67 68 74 29 3b  List, pnHeight);
2840: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
2850: 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42  rList(p->pGroupB
2860: 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  y, pnHeight);.  
2870: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69    heightOfExprLi
2880: 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  st(p->pOrderBy, 
2890: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
28a0: 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d  eightOfSelect(p-
28b0: 3e 70 50 72 69 6f 72 2c 20 70 6e 48 65 69 67 68  >pPrior, pnHeigh
28c0: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
28d0: 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48   Set the Expr.nH
28e0: 65 69 67 68 74 20 76 61 72 69 61 62 6c 65 20 69  eight variable i
28f0: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  n the structure 
2900: 70 61 73 73 65 64 20 61 73 20 61 6e 20 0a 2a 2a  passed as an .**
2910: 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20 65 78   argument. An ex
2920: 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20 6e 6f  pression with no
2930: 20 63 68 69 6c 64 72 65 6e 2c 20 45 78 70 72 2e   children, Expr.
2940: 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45 78 70  pList or .** Exp
2950: 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62 65 72  r.pSelect member
2960: 20 68 61 73 20 61 20 68 65 69 67 68 74 20 6f 66   has a height of
2970: 20 31 2e 20 41 6e 79 20 6f 74 68 65 72 20 65 78   1. Any other ex
2980: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61 73 20  pression.** has 
2990: 61 20 68 65 69 67 68 74 20 65 71 75 61 6c 20 74  a height equal t
29a0: 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65  o the maximum he
29b0: 69 67 68 74 20 6f 66 20 61 6e 79 20 6f 74 68 65  ight of any othe
29c0: 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 64  r .** referenced
29d0: 20 45 78 70 72 20 70 6c 75 73 20 6f 6e 65 2e 0a   Expr plus one..
29e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
29f0: 78 70 72 53 65 74 48 65 69 67 68 74 28 45 78 70  xprSetHeight(Exp
2a00: 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65  r *p){.  int nHe
2a10: 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67  ight = 0;.  heig
2a20: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65 66  htOfExpr(p->pLef
2a30: 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20  t, &nHeight);.  
2a40: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
2a50: 70 52 69 67 68 74 2c 20 26 6e 48 65 69 67 68 74  pRight, &nHeight
2a60: 29 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70  );.  heightOfExp
2a70: 72 4c 69 73 74 28 70 2d 3e 70 4c 69 73 74 2c 20  rList(p->pList, 
2a80: 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 68 65 69  &nHeight);.  hei
2a90: 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 70  ghtOfSelect(p->p
2aa0: 53 65 6c 65 63 74 2c 20 26 6e 48 65 69 67 68 74  Select, &nHeight
2ab0: 29 3b 0a 20 20 70 2d 3e 6e 48 65 69 67 68 74 20  );.  p->nHeight 
2ac0: 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b 0a 7d  = nHeight + 1;.}
2ad0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
2ae0: 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72  Expr.nHeight var
2af0: 69 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65 20  iable using the 
2b00: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 29 20  exprSetHeight() 
2b10: 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20  function. If.** 
2b20: 74 68 65 20 68 65 69 67 68 74 20 69 73 20 67 72  the height is gr
2b30: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6d  eater than the m
2b40: 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 65  aximum allowed e
2b50: 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68 2c  xpression depth,
2b60: 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72  .** leave an err
2b70: 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f  or in pParse..*/
2b80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
2b90: 72 53 65 74 48 65 69 67 68 74 28 50 61 72 73 65  rSetHeight(Parse
2ba0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
2bb0: 70 29 7b 0a 20 20 65 78 70 72 53 65 74 48 65 69  p){.  exprSetHei
2bc0: 67 68 74 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ght(p);.  sqlite
2bd0: 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74  3ExprCheckHeight
2be0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69  (pParse, p->nHei
2bf0: 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ght);.}../*.** R
2c00: 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75  eturn the maximu
2c10: 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20  m height of any 
2c20: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
2c30: 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79  referenced.** by
2c40: 20 74 68 65 20 73 65 6c 65 63 74 20 73 74 61 74   the select stat
2c50: 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20  ement passed as 
2c60: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  an argument..*/.
2c70: 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
2c80: 74 45 78 70 72 48 65 69 67 68 74 28 53 65 6c 65  tExprHeight(Sele
2c90: 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48  ct *p){.  int nH
2ca0: 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69  eight = 0;.  hei
2cb0: 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2c 20 26  ghtOfSelect(p, &
2cc0: 6e 48 65 69 67 68 74 29 3b 0a 20 20 72 65 74 75  nHeight);.  retu
2cd0: 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65  rn nHeight;.}.#e
2ce0: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 65 78  lse.  #define ex
2cf0: 70 72 53 65 74 48 65 69 67 68 74 28 79 29 0a 23  prSetHeight(y).#
2d00: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2d10: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30  MAX_EXPR_DEPTH>0
2d20: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74   */../*.** Const
2d30: 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65  ruct a new expre
2d40: 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20 72  ssion node and r
2d50: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
2d60: 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a  to it.  Memory.*
2d70: 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65 20  * for this node 
2d80: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
2d90: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
2da0: 29 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  ).  The calling 
2db0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72  function.** is r
2dc0: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d  esponsible for m
2dd0: 61 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e  aking sure the n
2de0: 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67  ode eventually g
2df0: 65 74 73 20 66 72 65 65 64 2e 0a 2a 2f 0a 45 78  ets freed..*/.Ex
2e00: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28  pr *sqlite3Expr(
2e10: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
2e20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
2e30: 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ndle for sqlite3
2e40: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28  DbMallocZero() (
2e50: 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a  may be null) */.
2e60: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
2e70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
2e80: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
2e90: 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  /.  Expr *pLeft,
2ea0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2eb0: 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  eft operand */. 
2ec0: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20   Expr *pRight,  
2ed0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68           /* Righ
2ee0: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63  t operand */.  c
2ef0: 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  onst Token *pTok
2f00: 65 6e 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65  en     /* Argume
2f10: 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a 20  nt token */.){. 
2f20: 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 70   Expr *pNew;.  p
2f30: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
2f40: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
2f50: 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 69  zeof(Expr));.  i
2f60: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
2f70: 20 20 2f 2a 20 57 68 65 6e 20 6d 61 6c 6c 6f 63    /* When malloc
2f80: 20 66 61 69 6c 73 2c 20 64 65 6c 65 74 65 20 70   fails, delete p
2f90: 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e  Left and pRight.
2fa0: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 70 61 73   Expressions pas
2fb0: 73 65 64 20 74 6f 20 0a 20 20 20 20 2a 2a 20 74  sed to .    ** t
2fc0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  his function mus
2fd0: 74 20 61 6c 77 61 79 73 20 62 65 20 61 6c 6c 6f  t always be allo
2fe0: 63 61 74 65 64 20 77 69 74 68 20 73 71 6c 69 74  cated with sqlit
2ff0: 65 33 45 78 70 72 28 29 20 66 6f 72 20 74 68 69  e3Expr() for thi
3000: 73 20 0a 20 20 20 20 2a 2a 20 72 65 61 73 6f 6e  s .    ** reason
3010: 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  . .    */.    sq
3020: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
3030: 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20  db, pLeft);.    
3040: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
3050: 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20  e(db, pRight);. 
3060: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
3070: 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 6f 70  .  pNew->op = op
3080: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20  ;.  pNew->pLeft 
3090: 3d 20 70 4c 65 66 74 3b 0a 20 20 70 4e 65 77 2d  = pLeft;.  pNew-
30a0: 3e 70 52 69 67 68 74 20 3d 20 70 52 69 67 68 74  >pRight = pRight
30b0: 3b 0a 20 20 70 4e 65 77 2d 3e 69 41 67 67 20 3d  ;.  pNew->iAgg =
30c0: 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 73 70 61   -1;.  pNew->spa
30d0: 6e 2e 7a 20 3d 20 28 75 38 2a 29 22 22 3b 0a 20  n.z = (u8*)"";. 
30e0: 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20   if( pToken ){. 
30f0: 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65     assert( pToke
3100: 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20 20  n->dyn==0 );.   
3110: 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 70 4e   pNew->span = pN
3120: 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f  ew->token = *pTo
3130: 6b 65 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ken;.  }else if(
3140: 20 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 69 66   pLeft ){.    if
3150: 28 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( pRight ){.    
3160: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 73 70    if( pRight->sp
3170: 61 6e 2e 64 79 6e 3d 3d 30 20 26 26 20 70 4c 65  an.dyn==0 && pLe
3180: 66 74 2d 3e 73 70 61 6e 2e 64 79 6e 3d 3d 30 20  ft->span.dyn==0 
3190: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
31a0: 65 33 45 78 70 72 53 70 61 6e 28 70 4e 65 77 2c  e3ExprSpan(pNew,
31b0: 20 26 70 4c 65 66 74 2d 3e 73 70 61 6e 2c 20 26   &pLeft->span, &
31c0: 70 52 69 67 68 74 2d 3e 73 70 61 6e 29 3b 0a 20  pRight->span);. 
31d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
31e0: 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26   pRight->flags &
31f0: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29   EP_ExpCollate )
3200: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
3210: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78 70 43  flags |= EP_ExpC
3220: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 20 20  ollate;.        
3230: 70 4e 65 77 2d 3e 70 43 6f 6c 6c 20 3d 20 70 52  pNew->pColl = pR
3240: 69 67 68 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20  ight->pColl;.   
3250: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
3260: 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20  f( pLeft->flags 
3270: 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20  & EP_ExpCollate 
3280: 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  ){.      pNew->f
3290: 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f  lags |= EP_ExpCo
32a0: 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 70 4e 65  llate;.      pNe
32b0: 77 2d 3e 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74  w->pColl = pLeft
32c0: 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20  ->pColl;.    }. 
32d0: 20 7d 0a 0a 20 20 65 78 70 72 53 65 74 48 65 69   }..  exprSetHei
32e0: 67 68 74 28 70 4e 65 77 29 3b 0a 20 20 72 65 74  ght(pNew);.  ret
32f0: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
3300: 2a 2a 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73 71  ** Works like sq
3310: 6c 69 74 65 33 45 78 70 72 28 29 20 65 78 63 65  lite3Expr() exce
3320: 70 74 20 74 68 61 74 20 69 74 20 74 61 6b 65 73  pt that it takes
3330: 20 61 6e 20 65 78 74 72 61 20 50 61 72 73 65 2a   an extra Parse*
3340: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 61 6e 64  .** argument and
3350: 20 6e 6f 74 69 66 69 65 73 20 74 68 65 20 61 73   notifies the as
3360: 73 6f 63 69 61 74 65 64 20 63 6f 6e 6e 65 63 74  sociated connect
3370: 69 6f 6e 20 6f 62 6a 65 63 74 20 69 66 20 6d 61  ion object if ma
3380: 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 45  lloc fails..*/.E
3390: 78 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70  xpr *sqlite3PExp
33a0: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
33b0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
33c0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
33d0: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
33e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33f0: 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64  Expression opcod
3400: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65  e */.  Expr *pLe
3410: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ft,            /
3420: 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a  * Left operand *
3430: 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  /.  Expr *pRight
3440: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ,           /* R
3450: 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  ight operand */.
3460: 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70    const Token *p
3470: 54 6f 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72 67  Token     /* Arg
3480: 75 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29  ument token */.)
3490: 7b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71  {.  Expr *p = sq
34a0: 6c 69 74 65 33 45 78 70 72 28 70 50 61 72 73 65  lite3Expr(pParse
34b0: 2d 3e 64 62 2c 20 6f 70 2c 20 70 4c 65 66 74 2c  ->db, op, pLeft,
34c0: 20 70 52 69 67 68 74 2c 20 70 54 6f 6b 65 6e 29   pRight, pToken)
34d0: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
34e0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
34f0: 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20  kHeight(pParse, 
3500: 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d  p->nHeight);.  }
3510: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
3520: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64 6f 69 6e 67  /*.** When doing
3530: 20 61 20 6e 65 73 74 65 64 20 70 61 72 73 65 2c   a nested parse,
3540: 20 79 6f 75 20 63 61 6e 20 69 6e 63 6c 75 64 65   you can include
3550: 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 65 78 70   terms in an exp
3560: 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 68 61 74 20  ression.** that 
3570: 6c 6f 6f 6b 20 6c 69 6b 65 20 74 68 69 73 3a 20  look like this: 
3580: 20 20 23 31 20 23 32 20 2e 2e 2e 20 20 54 68 65    #1 #2 ...  The
3590: 73 65 20 74 65 72 6d 73 20 72 65 66 65 72 20 74  se terms refer t
35a0: 6f 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 69  o registers.** i
35b0: 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  n the virtual ma
35c0: 63 68 69 6e 65 2e 20 20 23 4e 20 69 73 20 74 68  chine.  #N is th
35d0: 65 20 4e 2d 74 68 20 72 65 67 69 73 74 65 72 2e  e N-th register.
35e0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
35f0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
3600: 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 64   the parser to d
3610: 65 61 6c 20 77 69 74 68 20 6f 6e 20 6f 66 20 74  eal with on of t
3620: 68 6f 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 49  hose terms..** I
3630: 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 67 65  t immediately ge
3640: 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20  nerates code to 
3650: 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20  store the value 
3660: 69 6e 20 61 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  in a memory loca
3670: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 72 65 74  tion..** The ret
3680: 75 72 6e 73 20 61 6e 20 65 78 70 72 65 73 73 69  urns an expressi
3690: 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 63 6f 64  on that will cod
36a0: 65 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65  e to extract the
36b0: 20 76 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20 74   value from.** t
36c0: 68 61 74 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  hat memory locat
36d0: 69 6f 6e 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a  ion as needed..*
36e0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 52  /.Expr *sqlite3R
36f0: 65 67 69 73 74 65 72 45 78 70 72 28 50 61 72 73  egisterExpr(Pars
3700: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
3710: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 56 64 62   *pToken){.  Vdb
3720: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
3730: 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70 3b  Vdbe;.  Expr *p;
3740: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
3750: 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ested==0 ){.    
3760: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
3770: 70 50 61 72 73 65 2c 20 22 6e 65 61 72 20 5c 22  pParse, "near \"
3780: 25 54 5c 22 3a 20 73 79 6e 74 61 78 20 65 72 72  %T\": syntax err
3790: 6f 72 22 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20  or", pToken);.  
37a0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
37b0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
37c0: 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20 30 29 3b  _NULL, 0, 0, 0);
37d0: 0a 20 20 7d 0a 20 20 69 66 28 20 76 3d 3d 30 20  .  }.  if( v==0 
37e0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 20  ) return 0;.  p 
37f0: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
3800: 50 61 72 73 65 2c 20 54 4b 5f 52 45 47 49 53 54  Parse, TK_REGIST
3810: 45 52 2c 20 30 2c 20 30 2c 20 70 54 6f 6b 65 6e  ER, 0, 0, pToken
3820: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  );.  if( p==0 ){
3830: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
3840: 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61 69 6c 65 64  /* Malloc failed
3850: 20 2a 2f 0a 20 20 7d 0a 20 20 70 2d 3e 69 54 61   */.  }.  p->iTa
3860: 62 6c 65 20 3d 20 61 74 6f 69 28 28 63 68 61 72  ble = atoi((char
3870: 2a 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29  *)&pToken->z[1])
3880: 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ;.  return p;.}.
3890: 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f 20  ./*.** Join two 
38a0: 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73 69 6e  expressions usin
38b0: 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  g an AND operato
38c0: 72 2e 20 20 49 66 20 65 69 74 68 65 72 20 65 78  r.  If either ex
38d0: 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 4e  pression is.** N
38e0: 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74 20 72  ULL, then just r
38f0: 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65 72 20  eturn the other 
3900: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 45  expression..*/.E
3910: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
3920: 41 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  And(sqlite3 *db,
3930: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78   Expr *pLeft, Ex
3940: 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69  pr *pRight){.  i
3950: 66 28 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20  f( pLeft==0 ){. 
3960: 20 20 20 72 65 74 75 72 6e 20 70 52 69 67 68 74     return pRight
3970: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52  ;.  }else if( pR
3980: 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ight==0 ){.    r
3990: 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d  eturn pLeft;.  }
39a0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
39b0: 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
39c0: 20 54 4b 5f 41 4e 44 2c 20 70 4c 65 66 74 2c 20   TK_AND, pLeft, 
39d0: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 7d 0a  pRight, 0);.  }.
39e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
39f0: 20 45 78 70 72 2e 73 70 61 6e 20 66 69 65 6c 64   Expr.span field
3a00: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   of the given ex
3a10: 70 72 65 73 73 69 6f 6e 20 74 6f 20 73 70 61 6e  pression to span
3a20: 20 61 6c 6c 0a 2a 2a 20 74 65 78 74 20 62 65 74   all.** text bet
3a30: 77 65 65 6e 20 74 68 65 20 74 77 6f 20 67 69 76  ween the two giv
3a40: 65 6e 20 74 6f 6b 65 6e 73 2e 20 20 42 6f 74 68  en tokens.  Both
3a50: 20 74 6f 6b 65 6e 73 20 6d 75 73 74 20 62 65 20   tokens must be 
3a60: 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 61 74 20 74  pointing.** at t
3a70: 68 65 20 73 61 6d 65 20 73 74 72 69 6e 67 2e 0a  he same string..
3a80: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
3a90: 78 70 72 53 70 61 6e 28 45 78 70 72 20 2a 70 45  xprSpan(Expr *pE
3aa0: 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4c 65 66  xpr, Token *pLef
3ab0: 74 2c 20 54 6f 6b 65 6e 20 2a 70 52 69 67 68 74  t, Token *pRight
3ac0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 52 69  ){.  assert( pRi
3ad0: 67 68 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ght!=0 );.  asse
3ae0: 72 74 28 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a  rt( pLeft!=0 );.
3af0: 20 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20    if( pExpr ){. 
3b00: 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a     pExpr->span.z
3b10: 20 3d 20 70 4c 65 66 74 2d 3e 7a 3b 0a 20 20 20   = pLeft->z;.   
3b20: 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 20 3d   pExpr->span.n =
3b30: 20 70 52 69 67 68 74 2d 3e 6e 20 2b 20 28 70 52   pRight->n + (pR
3b40: 69 67 68 74 2d 3e 7a 20 2d 20 70 4c 65 66 74 2d  ight->z - pLeft-
3b50: 3e 7a 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  >z);.  }.}../*.*
3b60: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65  * Construct a ne
3b70: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  w expression nod
3b80: 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e  e for a function
3b90: 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a   with multiple.*
3ba0: 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a  * arguments..*/.
3bb0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
3bc0: 72 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20  rFunction(Parse 
3bd0: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73  *pParse, ExprLis
3be0: 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
3bf0: 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72  *pToken){.  Expr
3c00: 20 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74 65   *pNew;.  sqlite
3c10: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
3c20: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  db;.  assert( pT
3c30: 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20 3d  oken );.  pNew =
3c40: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
3c50: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
3c60: 45 78 70 72 29 20 29 3b 0a 20 20 69 66 28 20 70  Expr) );.  if( p
3c70: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  New==0 ){.    sq
3c80: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
3c90: 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 20  ete(db, pList); 
3ca0: 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67  /* Avoid leaking
3cb0: 20 6d 65 6d 6f 72 79 20 77 68 65 6e 20 6d 61 6c   memory when mal
3cc0: 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20  loc fails */.   
3cd0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
3ce0: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 46   pNew->op = TK_F
3cf0: 55 4e 43 54 49 4f 4e 3b 0a 20 20 70 4e 65 77 2d  UNCTION;.  pNew-
3d00: 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a  >pList = pList;.
3d10: 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e    assert( pToken
3d20: 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20 70 4e  ->dyn==0 );.  pN
3d30: 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f  ew->token = *pTo
3d40: 6b 65 6e 3b 0a 20 20 70 4e 65 77 2d 3e 73 70 61  ken;.  pNew->spa
3d50: 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 3b  n = pNew->token;
3d60: 0a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 53  ..  sqlite3ExprS
3d70: 65 74 48 65 69 67 68 74 28 70 50 61 72 73 65 2c  etHeight(pParse,
3d80: 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e   pNew);.  return
3d90: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
3da0: 41 73 73 69 67 6e 20 61 20 76 61 72 69 61 62 6c  Assign a variabl
3db0: 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20 65  e number to an e
3dc0: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 65  xpression that e
3dd0: 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63 61 72  ncodes a wildcar
3de0: 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69 67  d.** in the orig
3df0: 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  inal SQL stateme
3e00: 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64  nt.  .**.** Wild
3e10: 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69 6e 67  cards consisting
3e20: 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22 3f 22   of a single "?"
3e30: 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68   are assigned th
3e40: 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69 61  e next sequentia
3e50: 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e 75  l.** variable nu
3e60: 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64  mber..**.** Wild
3e70: 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72  cards of the for
3e80: 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73  m "?nnn" are ass
3e90: 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62 65 72  igned the number
3ea0: 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65   "nnn".  We make
3eb0: 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20 69  .** sure "nnn" i
3ec0: 73 20 6e 6f 74 20 74 6f 6f 20 62 65 20 74 6f 20  s not too be to 
3ed0: 61 76 6f 69 64 20 61 20 64 65 6e 69 61 6c 20 6f  avoid a denial o
3ee0: 66 20 73 65 72 76 69 63 65 20 61 74 74 61 63 6b  f service attack
3ef0: 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c   when.** the SQL
3f00: 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73   statement comes
3f10: 20 66 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61   from an externa
3f20: 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20  l source..**.** 
3f30: 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65  Wildcards of the
3f40: 20 66 6f 72 6d 20 22 3a 61 61 61 22 20 6f 72 20   form ":aaa" or 
3f50: 22 24 61 61 61 22 20 61 72 65 20 61 73 73 69 67  "$aaa" are assig
3f60: 6e 65 64 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ned the same num
3f70: 62 65 72 0a 2a 2a 20 61 73 20 74 68 65 20 70 72  ber.** as the pr
3f80: 65 76 69 6f 75 73 20 69 6e 73 74 61 6e 63 65 20  evious instance 
3f90: 6f 66 20 74 68 65 20 73 61 6d 65 20 77 69 6c 64  of the same wild
3fa0: 63 61 72 64 2e 20 20 4f 72 20 69 66 20 74 68 69  card.  Or if thi
3fb0: 73 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a  s is the first.*
3fc0: 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  * instance of th
3fd0: 65 20 77 69 6c 64 63 61 72 64 2c 20 74 68 65 20  e wildcard, the 
3fe0: 6e 65 78 74 20 73 65 71 75 65 6e 69 61 6c 20 76  next sequenial v
3ff0: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 69  ariable number i
4000: 73 0a 2a 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a  s.** assigned..*
4010: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
4020: 70 72 41 73 73 69 67 6e 56 61 72 4e 75 6d 62 65  prAssignVarNumbe
4030: 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
4040: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
4050: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 3b 0a   Token *pToken;.
4060: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
4070: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
4080: 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
4090: 74 75 72 6e 3b 0a 20 20 70 54 6f 6b 65 6e 20 3d  turn;.  pToken =
40a0: 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a   &pExpr->token;.
40b0: 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e    assert( pToken
40c0: 2d 3e 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65  ->n>=1 );.  asse
40d0: 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30  rt( pToken->z!=0
40e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
40f0: 6f 6b 65 6e 2d 3e 7a 5b 30 5d 21 3d 30 20 29 3b  oken->z[0]!=0 );
4100: 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e  .  if( pToken->n
4110: 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69  ==1 ){.    /* Wi
4120: 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f  ldcard of the fo
4130: 72 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20  rm "?".  Assign 
4140: 74 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c  the next variabl
4150: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  e number */.    
4160: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
4170: 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a  ++pParse->nVar;.
4180: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 6b    }else if( pTok
4190: 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b  en->z[0]=='?' ){
41a0: 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64  .    /* Wildcard
41b0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e   of the form "?n
41c0: 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e  nn".  Convert "n
41d0: 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  nn" to an intege
41e0: 72 20 61 6e 64 0a 20 20 20 20 2a 2a 20 75 73 65  r and.    ** use
41f0: 20 69 74 20 61 73 20 74 68 65 20 76 61 72 69 61   it as the varia
4200: 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ble number */.  
4210: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 45 78    int i;.    pEx
4220: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69 20 3d  pr->iTable = i =
4230: 20 61 74 6f 69 28 28 63 68 61 72 2a 29 26 70 54   atoi((char*)&pT
4240: 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20 20 20  oken->z[1]);.   
4250: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 30 20   testcase( i==0 
4260: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
4270: 20 69 3d 3d 31 20 29 3b 0a 20 20 20 20 74 65 73   i==1 );.    tes
4280: 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c  tcase( i==db->aL
4290: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
42a0: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
42b0: 52 5d 2d 31 20 29 3b 0a 20 20 20 20 74 65 73 74  R]-1 );.    test
42c0: 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69  case( i==db->aLi
42d0: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
42e0: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
42f0: 5d 20 29 3b 0a 20 20 20 20 69 66 28 20 69 3c 31  ] );.    if( i<1
4300: 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69 74   || i>db->aLimit
4310: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
4320: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29  RIABLE_NUMBER] )
4330: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
4340: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
4350: 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72  "variable number
4360: 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
4370: 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20   ?1 and ?%d",.  
4380: 20 20 20 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d          db->aLim
4390: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
43a0: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
43b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
43c0: 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72 20   i>pParse->nVar 
43d0: 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
43e0: 3e 6e 56 61 72 20 3d 20 69 3b 0a 20 20 20 20 7d  >nVar = i;.    }
43f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
4400: 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68   Wildcards of th
4410: 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 20 6f 72  e form ":aaa" or
4420: 20 22 24 61 61 61 22 2e 20 20 52 65 75 73 65 20   "$aaa".  Reuse 
4430: 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c  the same variabl
4440: 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20  e.    ** number 
4450: 61 73 20 74 68 65 20 70 72 69 6f 72 20 61 70 70  as the prior app
4460: 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65 20 73  earance of the s
4470: 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20  ame name, or if 
4480: 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 2a 2a 20  the name.    ** 
4490: 68 61 73 20 6e 65 76 65 72 20 61 70 70 65 61 72  has never appear
44a0: 65 64 20 62 65 66 6f 72 65 2c 20 72 65 75 73 65  ed before, reuse
44b0: 20 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62   the same variab
44c0: 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 2a 2f  le number.    */
44d0: 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  .    int i, n;. 
44e0: 20 20 20 6e 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e     n = pToken->n
44f0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
4500: 3c 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70  <pParse->nVarExp
4510: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45  r; i++){.      E
4520: 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 20 20 69  xpr *pE;.      i
4530: 66 28 20 28 70 45 20 3d 20 70 50 61 72 73 65 2d  f( (pE = pParse-
4540: 3e 61 70 56 61 72 45 78 70 72 5b 69 5d 29 21 3d  >apVarExpr[i])!=
4550: 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 70  0.          && p
4560: 45 2d 3e 74 6f 6b 65 6e 2e 6e 3d 3d 6e 0a 20 20  E->token.n==n.  
4570: 20 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d          && memcm
4580: 70 28 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  p(pE->token.z, p
4590: 54 6f 6b 65 6e 2d 3e 7a 2c 20 6e 29 3d 3d 30 20  Token->z, n)==0 
45a0: 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  ){.        pExpr
45b0: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 2d 3e 69  ->iTable = pE->i
45c0: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 62  Table;.        b
45d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
45e0: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 70    }.    if( i>=p
45f0: 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 20  Parse->nVarExpr 
4600: 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  ){.      pExpr->
4610: 69 54 61 62 6c 65 20 3d 20 2b 2b 70 50 61 72 73  iTable = ++pPars
4620: 65 2d 3e 6e 56 61 72 3b 0a 20 20 20 20 20 20 69  e->nVar;.      i
4630: 66 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45  f( pParse->nVarE
4640: 78 70 72 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61  xpr>=pParse->nVa
4650: 72 45 78 70 72 41 6c 6c 6f 63 2d 31 20 29 7b 0a  rExprAlloc-1 ){.
4660: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
4670: 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 20 2b 3d  nVarExprAlloc +=
4680: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70   pParse->nVarExp
4690: 72 41 6c 6c 6f 63 20 2b 20 31 30 3b 0a 20 20 20  rAlloc + 10;.   
46a0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 70 56       pParse->apV
46b0: 61 72 45 78 70 72 20 3d 0a 20 20 20 20 20 20 20  arExpr =.       
46c0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52 65       sqlite3DbRe
46d0: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 0a 20 20 20  allocOrFree(.   
46e0: 20 20 20 20 20 20 20 20 20 20 20 64 62 2c 0a 20             db,. 
46f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
4700: 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 2c 0a  rse->apVarExpr,.
4710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
4720: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c  arse->nVarExprAl
4730: 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 50 61 72 73  loc*sizeof(pPars
4740: 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 30 5d 29  e->apVarExpr[0])
4750: 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a  .            );.
4760: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
4770: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
4780: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 61  led ){.        a
4790: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 61  ssert( pParse->a
47a0: 70 56 61 72 45 78 70 72 21 3d 30 20 29 3b 0a 20  pVarExpr!=0 );. 
47b0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
47c0: 70 56 61 72 45 78 70 72 5b 70 50 61 72 73 65 2d  pVarExpr[pParse-
47d0: 3e 6e 56 61 72 45 78 70 72 2b 2b 5d 20 3d 20 70  >nVarExpr++] = p
47e0: 45 78 70 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Expr;.      }.  
47f0: 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66 28 20 21    }.  } .  if( !
4800: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 26 26 20  pParse->nErr && 
4810: 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 64 62 2d  pParse->nVar>db-
4820: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
4830: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
4840: 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 73 71 6c  MBER] ){.    sql
4850: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
4860: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53  rse, "too many S
4870: 51 4c 20 76 61 72 69 61 62 6c 65 73 22 29 3b 0a  QL variables");.
4880: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63    }.}../*.** Rec
4890: 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20  ursively delete 
48a0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
48b0: 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ee..*/.void sqli
48c0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 73 71  te3ExprDelete(sq
48d0: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
48e0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20  *p){.  if( p==0 
48f0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
4900: 70 2d 3e 73 70 61 6e 2e 64 79 6e 20 29 20 73 71  p->span.dyn ) sq
4910: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4920: 28 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a  (char*)p->span.z
4930: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65  );.  if( p->toke
4940: 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65 33 44  n.dyn ) sqlite3D
4950: 62 46 72 65 65 28 64 62 2c 20 28 63 68 61 72 2a  bFree(db, (char*
4960: 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20  )p->token.z);.  
4970: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
4980: 65 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b  e(db, p->pLeft);
4990: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
49a0: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 52 69 67  lete(db, p->pRig
49b0: 68 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ht);.  sqlite3Ex
49c0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
49d0: 20 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 73 71   p->pList);.  sq
49e0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
49f0: 65 28 64 62 2c 20 70 2d 3e 70 53 65 6c 65 63 74  e(db, p->pSelect
4a00: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
4a10: 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
4a20: 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e 74 6f 6b  .** The Expr.tok
4a30: 65 6e 20 66 69 65 6c 64 20 6d 69 67 68 74 20 62  en field might b
4a40: 65 20 61 20 73 74 72 69 6e 67 20 6c 69 74 65 72  e a string liter
4a50: 61 6c 20 74 68 61 74 20 69 73 20 71 75 6f 74 65  al that is quote
4a60: 64 2e 0a 2a 2a 20 49 66 20 73 6f 2c 20 72 65 6d  d..** If so, rem
4a70: 6f 76 65 20 74 68 65 20 71 75 6f 74 61 74 69 6f  ove the quotatio
4a80: 6e 20 6d 61 72 6b 73 2e 0a 2a 2f 0a 76 6f 69 64  n marks..*/.void
4a90: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 45   sqlite3DequoteE
4aa0: 78 70 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  xpr(sqlite3 *db,
4ab0: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28   Expr *p){.  if(
4ac0: 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65   ExprHasAnyPrope
4ad0: 72 74 79 28 70 2c 20 45 50 5f 44 65 71 75 6f 74  rty(p, EP_Dequot
4ae0: 65 64 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ed) ){.    retur
4af0: 6e 3b 0a 20 20 7d 0a 20 20 45 78 70 72 53 65 74  n;.  }.  ExprSet
4b00: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 44  Property(p, EP_D
4b10: 65 71 75 6f 74 65 64 29 3b 0a 20 20 69 66 28 20  equoted);.  if( 
4b20: 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 3d 3d 30 20  p->token.dyn==0 
4b30: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 6f  ){.    sqlite3To
4b40: 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70 2d 3e  kenCopy(db, &p->
4b50: 74 6f 6b 65 6e 2c 20 26 70 2d 3e 74 6f 6b 65 6e  token, &p->token
4b60: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
4b70: 44 65 71 75 6f 74 65 28 28 63 68 61 72 2a 29 70  Dequote((char*)p
4b80: 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 7d 0a 0a 2f  ->token.z);.}../
4b90: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
4ba0: 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74  ng group of rout
4bb0: 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63  ines make deep c
4bc0: 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65 73 73  opies of express
4bd0: 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73  ions,.** express
4be0: 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69  ion lists, ID li
4bf0: 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20  sts, and select 
4c00: 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65  statements.  The
4c10: 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62   copies can.** b
4c20: 65 20 64 65 6c 65 74 65 64 20 28 62 79 20 62 65  e deleted (by be
4c30: 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74 68  ing passed to th
4c40: 65 69 72 20 72 65 73 70 65 63 74 69 76 65 20 2e  eir respective .
4c50: 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69  ..Delete() routi
4c60: 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20  nes).** without 
4c70: 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72  effecting the or
4c80: 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54  iginals..**.** T
4c90: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
4ca0: 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72  st, ID, and sour
4cb0: 63 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20  ce lists return 
4cc0: 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  by sqlite3ExprLi
4cd0: 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69  stDup(),.** sqli
4ce0: 74 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20  te3IdListDup(), 
4cf0: 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  and sqlite3SrcLi
4d00: 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20  stDup() can not 
4d10: 62 65 20 66 75 72 74 68 65 72 20 65 78 70 61 6e  be further expan
4d20: 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65  ded .** by subse
4d30: 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73  quent calls to s
4d40: 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64  qlite*ListAppend
4d50: 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a  () routines..**.
4d60: 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68  ** Any tables th
4d70: 61 74 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d  at the SrcList m
4d80: 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72  ight point to ar
4d90: 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64  e not duplicated
4da0: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
4db0: 65 33 45 78 70 72 44 75 70 28 73 71 6c 69 74 65  e3ExprDup(sqlite
4dc0: 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b  3 *db, Expr *p){
4dd0: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20  .  Expr *pNew;. 
4de0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
4df0: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
4e00: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
4e10: 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29  w(db, sizeof(*p)
4e20: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
4e30: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
4e40: 6d 65 6d 63 70 79 28 70 4e 65 77 2c 20 70 2c 20  memcpy(pNew, p, 
4e50: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a  sizeof(*pNew));.
4e60: 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a    if( p->token.z
4e70: 21 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d  !=0 ){.    pNew-
4e80: 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 28 75 38 2a 29  >token.z = (u8*)
4e90: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
4ea0: 28 64 62 2c 20 28 63 68 61 72 2a 29 70 2d 3e 74  (db, (char*)p->t
4eb0: 6f 6b 65 6e 2e 7a 2c 20 70 2d 3e 74 6f 6b 65 6e  oken.z, p->token
4ec0: 2e 6e 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 74  .n);.    pNew->t
4ed0: 6f 6b 65 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20 20  oken.dyn = 1;.  
4ee0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
4ef0: 74 28 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a  t( pNew->token.z
4f00: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70 4e 65  ==0 );.  }.  pNe
4f10: 77 2d 3e 73 70 61 6e 2e 7a 20 3d 20 30 3b 0a 20  w->span.z = 0;. 
4f20: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73   pNew->pLeft = s
4f30: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
4f40: 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70  , p->pLeft);.  p
4f50: 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 73 71  New->pRight = sq
4f60: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
4f70: 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 70   p->pRight);.  p
4f80: 4e 65 77 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c  New->pList = sql
4f90: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
4fa0: 64 62 2c 20 70 2d 3e 70 4c 69 73 74 29 3b 0a 20  db, p->pList);. 
4fb0: 20 70 4e 65 77 2d 3e 70 53 65 6c 65 63 74 20 3d   pNew->pSelect =
4fc0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
4fd0: 70 28 64 62 2c 20 70 2d 3e 70 53 65 6c 65 63 74  p(db, p->pSelect
4fe0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  );.  return pNew
4ff0: 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
5000: 54 6f 6b 65 6e 43 6f 70 79 28 73 71 6c 69 74 65  TokenCopy(sqlite
5010: 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 54  3 *db, Token *pT
5020: 6f 2c 20 54 6f 6b 65 6e 20 2a 70 46 72 6f 6d 29  o, Token *pFrom)
5030: 7b 0a 20 20 69 66 28 20 70 54 6f 2d 3e 64 79 6e  {.  if( pTo->dyn
5040: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
5050: 28 64 62 2c 20 28 63 68 61 72 2a 29 70 54 6f 2d  (db, (char*)pTo-
5060: 3e 7a 29 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  >z);.  if( pFrom
5070: 2d 3e 7a 20 29 7b 0a 20 20 20 20 70 54 6f 2d 3e  ->z ){.    pTo->
5080: 6e 20 3d 20 70 46 72 6f 6d 2d 3e 6e 3b 0a 20 20  n = pFrom->n;.  
5090: 20 20 70 54 6f 2d 3e 7a 20 3d 20 28 75 38 2a 29    pTo->z = (u8*)
50a0: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
50b0: 28 64 62 2c 20 28 63 68 61 72 2a 29 70 46 72 6f  (db, (char*)pFro
50c0: 6d 2d 3e 7a 2c 20 70 46 72 6f 6d 2d 3e 6e 29 3b  m->z, pFrom->n);
50d0: 0a 20 20 20 20 70 54 6f 2d 3e 64 79 6e 20 3d 20  .    pTo->dyn = 
50e0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
50f0: 70 54 6f 2d 3e 7a 20 3d 20 30 3b 0a 20 20 7d 0a  pTo->z = 0;.  }.
5100: 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69  }.ExprList *sqli
5110: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 73  te3ExprListDup(s
5120: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
5130: 4c 69 73 74 20 2a 70 29 7b 0a 20 20 45 78 70 72  List *p){.  Expr
5140: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74  List *pNew;.  st
5150: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
5160: 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64  em *pItem, *pOld
5170: 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Item;.  int i;. 
5180: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
5190: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
51a0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
51b0: 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e  w(db, sizeof(*pN
51c0: 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  ew) );.  if( pNe
51d0: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
51e0: 0a 20 20 70 4e 65 77 2d 3e 69 45 43 75 72 73 6f  .  pNew->iECurso
51f0: 72 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  r = 0;.  pNew->n
5200: 45 78 70 72 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c  Expr = pNew->nAl
5210: 6c 6f 63 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a  loc = p->nExpr;.
5220: 20 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65    pNew->a = pIte
5230: 6d 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  m = sqlite3DbMal
5240: 6c 6f 63 52 61 77 28 64 62 2c 20 20 70 2d 3e 6e  locRaw(db,  p->n
5250: 45 78 70 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  Expr*sizeof(p->a
5260: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 49  [0]) );.  if( pI
5270: 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  tem==0 ){.    sq
5280: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5290: 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72  pNew);.    retur
52a0: 6e 20 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64  n 0;.  } .  pOld
52b0: 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66  Item = p->a;.  f
52c0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78  or(i=0; i<p->nEx
52d0: 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
52e0: 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20  , pOldItem++){. 
52f0: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70     Expr *pNewExp
5300: 72 2c 20 2a 70 4f 6c 64 45 78 70 72 3b 0a 20 20  r, *pOldExpr;.  
5310: 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d    pItem->pExpr =
5320: 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69   pNewExpr = sqli
5330: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
5340: 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64 49 74  OldExpr = pOldIt
5350: 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
5360: 69 66 28 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70  if( pOldExpr->sp
5370: 61 6e 2e 7a 21 3d 30 20 26 26 20 70 4e 65 77 45  an.z!=0 && pNewE
5380: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  xpr ){.      /* 
5390: 41 6c 77 61 79 73 20 6d 61 6b 65 20 61 20 63 6f  Always make a co
53a0: 70 79 20 6f 66 20 74 68 65 20 73 70 61 6e 20 66  py of the span f
53b0: 6f 72 20 74 6f 70 2d 6c 65 76 65 6c 20 65 78 70  or top-level exp
53c0: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 0a  ressions in the.
53d0: 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73        ** express
53e0: 69 6f 6e 20 6c 69 73 74 2e 20 20 54 68 65 20 6c  ion list.  The l
53f0: 6f 67 69 63 20 69 6e 20 53 45 4c 45 43 54 20 70  ogic in SELECT p
5400: 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 64  rocessing that d
5410: 65 74 65 72 6d 69 6e 65 73 0a 20 20 20 20 20 20  etermines.      
5420: 2a 2a 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ** the names of 
5430: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
5440: 65 73 75 6c 74 20 73 65 74 20 6e 65 65 64 73 20  esult set needs 
5450: 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  this information
5460: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
5470: 33 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26  3TokenCopy(db, &
5480: 70 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e 2c 20  pNewExpr->span, 
5490: 26 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e 29  &pOldExpr->span)
54a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
54b0: 72 74 28 20 70 4e 65 77 45 78 70 72 3d 3d 30 20  rt( pNewExpr==0 
54c0: 7c 7c 20 70 4e 65 77 45 78 70 72 2d 3e 73 70 61  || pNewExpr->spa
54d0: 6e 2e 7a 21 3d 30 20 0a 20 20 20 20 20 20 20 20  n.z!=0 .        
54e0: 20 20 20 20 7c 7c 20 70 4f 6c 64 45 78 70 72 2d      || pOldExpr-
54f0: 3e 73 70 61 6e 2e 7a 3d 3d 30 0a 20 20 20 20 20  >span.z==0.     
5500: 20 20 20 20 20 20 20 7c 7c 20 64 62 2d 3e 6d 61         || db->ma
5510: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
5520: 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
5530: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
5540: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
5550: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d  Name);.    pItem
5560: 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f  ->sortOrder = pO
5570: 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65  ldItem->sortOrde
5580: 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f  r;.    pItem->do
5590: 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65  ne = 0;.    pIte
55a0: 6d 2d 3e 69 43 6f 6c 20 3d 20 70 4f 6c 64 49 74  m->iCol = pOldIt
55b0: 65 6d 2d 3e 69 43 6f 6c 3b 0a 20 20 7d 0a 20 20  em->iCol;.  }.  
55c0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
55d0: 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 73  /*.** If cursors
55e0: 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69 65 77  , triggers, view
55f0: 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73  s and subqueries
5600: 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64   are all omitted
5610: 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69   from.** the bui
5620: 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66  ld, then none of
5630: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   the following r
5640: 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70 74 20  outines, except 
5650: 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53  for .** sqlite3S
5660: 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61 6e 20  electDup(), can 
5670: 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74  be called. sqlit
5680: 65 33 53 65 6c 65 63 74 44 75 70 28 29 20 69 73  e3SelectDup() is
5690: 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61   sometimes.** ca
56a0: 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55 4c 4c  lled with a NULL
56b0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69   argument..*/.#i
56c0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
56d0: 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
56e0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
56f0: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 5c 0a  OMIT_TRIGGER) \.
5700: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
5710: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
5720: 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  Y).SrcList *sqli
5730: 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 73 71  te3SrcListDup(sq
5740: 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69  lite3 *db, SrcLi
5750: 73 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73  st *p){.  SrcLis
5760: 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69  t *pNew;.  int i
5770: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
5780: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
5790: 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20  rn 0;.  nByte = 
57a0: 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d  sizeof(*p) + (p-
57b0: 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66  >nSrc>0 ? sizeof
57c0: 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e  (p->a[0]) * (p->
57d0: 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20  nSrc-1) : 0);.  
57e0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
57f0: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 6e 42  MallocRaw(db, nB
5800: 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  yte );.  if( pNe
5810: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
5820: 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20  .  pNew->nSrc = 
5830: 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70  pNew->nAlloc = p
5840: 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d  ->nSrc;.  for(i=
5850: 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b  0; i<p->nSrc; i+
5860: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
5870: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65  rcList_item *pNe
5880: 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61  wItem = &pNew->a
5890: 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20  [i];.    struct 
58a0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f  SrcList_item *pO
58b0: 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69  ldItem = &p->a[i
58c0: 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ];.    Table *pT
58d0: 61 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  ab;.    pNewItem
58e0: 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71  ->zDatabase = sq
58f0: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
5900: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74  , pOldItem->zDat
5910: 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77  abase);.    pNew
5920: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
5930: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
5940: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  , pOldItem->zNam
5950: 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  e);.    pNewItem
5960: 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74  ->zAlias = sqlit
5970: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
5980: 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  OldItem->zAlias)
5990: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
59a0: 6a 6f 69 6e 74 79 70 65 20 3d 20 70 4f 6c 64 49  jointype = pOldI
59b0: 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20  tem->jointype;. 
59c0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75     pNewItem->iCu
59d0: 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  rsor = pOldItem-
59e0: 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e  >iCursor;.    pN
59f0: 65 77 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61  ewItem->isPopula
5a00: 74 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  ted = pOldItem->
5a10: 69 73 50 6f 70 75 6c 61 74 65 64 3b 0a 20 20 20  isPopulated;.   
5a20: 20 70 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d   pTab = pNewItem
5a30: 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65  ->pTab = pOldIte
5a40: 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28  m->pTab;.    if(
5a50: 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70   pTab ){.      p
5a60: 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  Tab->nRef++;.   
5a70: 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d   }.    pNewItem-
5a80: 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
5a90: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
5aa0: 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63  pOldItem->pSelec
5ab0: 74 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  t);.    pNewItem
5ac0: 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45  ->pOn = sqlite3E
5ad0: 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  xprDup(db, pOldI
5ae0: 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 70  tem->pOn);.    p
5af0: 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20  NewItem->pUsing 
5b00: 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44  = sqlite3IdListD
5b10: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
5b20: 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e  >pUsing);.    pN
5b30: 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20  ewItem->colUsed 
5b40: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55  = pOldItem->colU
5b50: 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  sed;.  }.  retur
5b60: 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74  n pNew;.}.IdList
5b70: 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44   *sqlite3IdListD
5b80: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
5b90: 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64  IdList *p){.  Id
5ba0: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  List *pNew;.  in
5bb0: 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  t i;.  if( p==0 
5bc0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
5bd0: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
5be0: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
5bf0: 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69  of(*pNew) );.  i
5c00: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
5c10: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  urn 0;.  pNew->n
5c20: 49 64 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f  Id = pNew->nAllo
5c30: 63 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e  c = p->nId;.  pN
5c40: 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44  ew->a = sqlite3D
5c50: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 70  bMallocRaw(db, p
5c60: 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e  ->nId*sizeof(p->
5c70: 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70  a[0]) );.  if( p
5c80: 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20  New->a==0 ){.   
5c90: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
5ca0: 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65  b, pNew);.    re
5cb0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f  turn 0;.  }.  fo
5cc0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b  r(i=0; i<p->nId;
5cd0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
5ce0: 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70  t IdList_item *p
5cf0: 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d  NewItem = &pNew-
5d00: 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63  >a[i];.    struc
5d10: 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70  t IdList_item *p
5d20: 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b  OldItem = &p->a[
5d30: 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  i];.    pNewItem
5d40: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
5d50: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
5d60: 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ldItem->zName);.
5d70: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64      pNewItem->id
5d80: 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64  x = pOldItem->id
5d90: 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  x;.  }.  return 
5da0: 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a  pNew;.}.Select *
5db0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
5dc0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65  (sqlite3 *db, Se
5dd0: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 65 6c 65  lect *p){.  Sele
5de0: 63 74 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20  ct *pNew;.  if( 
5df0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
5e00: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
5e10: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
5e20: 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
5e30: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
5e40: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
5e50: 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  >pEList = sqlite
5e60: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
5e70: 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70   p->pEList);.  p
5e80: 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69  New->pSrc = sqli
5e90: 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 64 62  te3SrcListDup(db
5ea0: 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 70 4e  , p->pSrc);.  pN
5eb0: 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c  ew->pWhere = sql
5ec0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
5ed0: 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 70 4e  p->pWhere);.  pN
5ee0: 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73  ew->pGroupBy = s
5ef0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
5f00: 70 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42  p(db, p->pGroupB
5f10: 79 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76  y);.  pNew->pHav
5f20: 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ing = sqlite3Exp
5f30: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 48 61 76  rDup(db, p->pHav
5f40: 69 6e 67 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f  ing);.  pNew->pO
5f50: 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33  rderBy = sqlite3
5f60: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
5f70: 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
5f80: 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70  pNew->op = p->op
5f90: 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  ;.  pNew->pPrior
5fa0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
5fb0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f  Dup(db, p->pPrio
5fc0: 72 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d  r);.  pNew->pLim
5fd0: 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  it = sqlite3Expr
5fe0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  Dup(db, p->pLimi
5ff0: 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66  t);.  pNew->pOff
6000: 73 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  set = sqlite3Exp
6010: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66 66  rDup(db, p->pOff
6020: 73 65 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c  set);.  pNew->iL
6030: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77  imit = 0;.  pNew
6040: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->iOffset = 0;. 
6050: 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20   pNew->selFlags 
6060: 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  = p->selFlags & 
6070: 7e 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61  ~SF_UsesEphemera
6080: 6c 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67 68  l;.  pNew->pRigh
6090: 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 70 4e 65  tmost = 0;.  pNe
60a0: 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  w->addrOpenEphm[
60b0: 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  0] = -1;.  pNew-
60c0: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
60d0: 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61   = -1;.  pNew->a
60e0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d  ddrOpenEphm[2] =
60f0: 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e   -1;.  return pN
6100: 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65  ew;.}.#else.Sele
6110: 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63  ct *sqlite3Selec
6120: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
6130: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
6140: 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a  assert( p==0 );.
6150: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
6160: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  ndif.../*.** Add
6170: 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
6180: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20  o the end of an 
6190: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
61a0: 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a    If pList is.**
61b0: 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c   initially NULL,
61c0: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e   then create a n
61d0: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ew expression li
61e0: 73 74 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20  st..*/.ExprList 
61f0: 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  *sqlite3ExprList
6200: 41 70 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20  Append(.  Parse 
6210: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
6220: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
6230: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
6240: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
6250: 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69    /* List to whi
6260: 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69  ch to append. Mi
6270: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
6280: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
6290: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
62a0: 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70  ession to be app
62b0: 65 6e 64 65 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ended */.  Token
62c0: 20 2a 70 4e 61 6d 65 20 20 20 20 20 20 20 20 20   *pName         
62d0: 20 20 20 2f 2a 20 41 53 20 6b 65 79 77 6f 72 64     /* AS keyword
62e0: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
62f0: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ion */.){.  sqli
6300: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
6310: 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 4c 69 73  ->db;.  if( pLis
6320: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
6330: 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
6340: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
6350: 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b 0a  of(ExprList) );.
6360: 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
6370: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e   ){.      goto n
6380: 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  o_mem;.    }.   
6390: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
63a0: 6e 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 7d  nAlloc==0 );.  }
63b0: 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 41  .  if( pList->nA
63c0: 6c 6c 6f 63 3c 3d 70 4c 69 73 74 2d 3e 6e 45 78  lloc<=pList->nEx
63d0: 70 72 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  pr ){.    struct
63e0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
63f0: 61 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70  a;.    int n = p
6400: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b  List->nAlloc*2 +
6410: 20 34 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69   4;.    a = sqli
6420: 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c  te3DbRealloc(db,
6430: 20 70 4c 69 73 74 2d 3e 61 2c 20 6e 2a 73 69 7a   pList->a, n*siz
6440: 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
6450: 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20  );.    if( a==0 
6460: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f  ){.      goto no
6470: 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _mem;.    }.    
6480: 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20  pList->a = a;.  
6490: 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20    pList->nAlloc 
64a0: 3d 20 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = n;.  }.  asser
64b0: 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29  t( pList->a!=0 )
64c0: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20 7c 7c  ;.  if( pExpr ||
64d0: 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 74   pName ){.    st
64e0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
64f0: 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69  em *pItem = &pLi
6500: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78  st->a[pList->nEx
6510: 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73 65  pr++];.    memse
6520: 74 28 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65  t(pItem, 0, size
6530: 6f 66 28 2a 70 49 74 65 6d 29 29 3b 0a 20 20 20  of(*pItem));.   
6540: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
6550: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
6560: 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b  oken(db, pName);
6570: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70  .    pItem->pExp
6580: 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d 0a 20  r = pExpr;.  }. 
6590: 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a   return pList;..
65a0: 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f  no_mem:     .  /
65b0: 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20  * Avoid leaking 
65c0: 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63  memory if malloc
65d0: 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a   has failed. */.
65e0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
65f0: 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a  ete(db, pExpr);.
6600: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
6610: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
6620: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  t);.  return 0;.
6630: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
6640: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
6650: 70 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20  pEList contains 
6660: 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d 69 74  more than iLimit
6670: 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65   elements,.** le
6680: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
6690: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a  sage in pParse..
66a0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
66b0: 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67  xprListCheckLeng
66c0: 74 68 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  th(.  Parse *pPa
66d0: 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73 74 20  rse,.  ExprList 
66e0: 2a 70 45 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74  *pEList,.  const
66f0: 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29   char *zObject.)
6700: 7b 0a 20 20 69 6e 74 20 6d 78 20 3d 20 70 50 61  {.  int mx = pPa
6710: 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  rse->db->aLimit[
6720: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
6730: 55 4d 4e 5d 3b 0a 20 20 74 65 73 74 63 61 73 65  UMN];.  testcase
6740: 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69  ( pEList && pELi
6750: 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20 29 3b  st->nExpr==mx );
6760: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45 4c  .  testcase( pEL
6770: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
6780: 45 78 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20  Expr==mx+1 );.  
6790: 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  if( pEList && pE
67a0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 6d 78 20 29  List->nExpr>mx )
67b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
67c0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
67d0: 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20  oo many columns 
67e0: 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29  in %s", zObject)
67f0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
6800: 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
6810: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
6820: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6830: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 73  ExprListDelete(s
6840: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
6850: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
6860: 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
6870: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
6880: 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73  Item;.  if( pLis
6890: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
68a0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
68b0: 61 21 3d 30 20 7c 7c 20 28 70 4c 69 73 74 2d 3e  a!=0 || (pList->
68c0: 6e 45 78 70 72 3d 3d 30 20 26 26 20 70 4c 69 73  nExpr==0 && pLis
68d0: 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 29 20 29 3b  t->nAlloc==0) );
68e0: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
68f0: 2d 3e 6e 45 78 70 72 3c 3d 70 4c 69 73 74 2d 3e  ->nExpr<=pList->
6900: 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20 66 6f 72 28  nAlloc );.  for(
6910: 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
6920: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
6930: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
6940: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  +){.    sqlite3E
6950: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49  xprDelete(db, pI
6960: 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
6970: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
6980: 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  b, pItem->zName)
6990: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
69a0: 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d  bFree(db, pList-
69b0: 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  >a);.  sqlite3Db
69c0: 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  Free(db, pList);
69d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  .}../*.** These 
69e0: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 57 61 6c  routines are Wal
69f0: 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73 2e 20 20  ker callbacks.  
6a00: 57 61 6c 6b 65 72 2e 75 2e 70 69 20 69 73 20 61  Walker.u.pi is a
6a10: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61   pointer.** to a
6a20: 6e 20 69 6e 74 65 67 65 72 2e 20 20 54 68 65 73  n integer.  Thes
6a30: 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63  e routines are c
6a40: 68 65 63 6b 69 6e 67 20 61 6e 20 65 78 70 72 65  hecking an expre
6a50: 73 73 69 6f 6e 20 74 6f 20 73 65 65 0a 2a 2a 20  ssion to see.** 
6a60: 69 66 20 69 74 20 69 73 20 61 20 63 6f 6e 73 74  if it is a const
6a70: 61 6e 74 2e 20 20 53 65 74 20 2a 57 61 6c 6b 65  ant.  Set *Walke
6a80: 72 2e 75 2e 70 69 20 74 6f 20 30 20 69 66 20 74  r.u.pi to 0 if t
6a90: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
6aa0: 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74  .** not constant
6ab0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61  ..**.** These ca
6ac0: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20  llback routines 
6ad0: 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c  are used to impl
6ae0: 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77  ement the follow
6af0: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73  ing:.**.**     s
6b00: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
6b10: 74 61 6e 74 28 29 0a 2a 2a 20 20 20 20 20 73 71  tant().**     sq
6b20: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
6b30: 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 0a 2a 2a 20  antNotJoin().** 
6b40: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
6b50: 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74  sConstantOrFunct
6b60: 69 6f 6e 28 29 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  ion().**.*/.stat
6b70: 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49  ic int exprNodeI
6b80: 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72  sConstant(Walker
6b90: 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
6ba0: 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49  *pExpr){..  /* I
6bb0: 66 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 69  f pWalker->u.i i
6bc0: 73 20 33 20 74 68 65 6e 20 61 6e 79 20 74 65 72  s 3 then any ter
6bd0: 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  m of the express
6be0: 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66  ion that comes f
6bf0: 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20  rom.  ** the ON 
6c00: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
6c10: 20 6f 66 20 61 20 6a 6f 69 6e 20 64 69 73 71 75   of a join disqu
6c20: 61 6c 69 66 69 65 73 20 74 68 65 20 65 78 70 72  alifies the expr
6c30: 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d  ession.  ** from
6c40: 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65   being considere
6c50: 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20  d constant. */. 
6c60: 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e   if( pWalker->u.
6c70: 69 3d 3d 33 20 26 26 20 45 78 70 72 48 61 73 41  i==3 && ExprHasA
6c80: 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  nyProperty(pExpr
6c90: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
6ca0: 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 75  {.    pWalker->u
6cb0: 2e 69 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  .i = 0;.    retu
6cc0: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
6cd0: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  }..  switch( pEx
6ce0: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a  pr->op ){.    /*
6cf0: 20 43 6f 6e 73 69 64 65 72 20 66 75 6e 63 74 69   Consider functi
6d00: 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73 74 61  ons to be consta
6d10: 6e 74 20 69 66 20 61 6c 6c 20 74 68 65 69 72 20  nt if all their 
6d20: 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 63 6f  arguments are co
6d30: 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e  nstant.    ** an
6d40: 64 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d  d pWalker->u.i==
6d50: 32 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  2 */.    case TK
6d60: 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20  _FUNCTION:.     
6d70: 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e   if( pWalker->u.
6d80: 69 3d 3d 32 20 29 20 72 65 74 75 72 6e 20 30 3b  i==2 ) return 0;
6d90: 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74  .      /* Fall t
6da0: 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61  hrough */.    ca
6db0: 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61  se TK_ID:.    ca
6dc0: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  se TK_COLUMN:.  
6dd0: 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a 0a 20    case TK_DOT:. 
6de0: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
6df0: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73  UNCTION:.    cas
6e00: 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
6e10: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6e20: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
6e30: 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
6e40: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  :.    case TK_EX
6e50: 49 53 54 53 3a 0a 20 20 20 20 20 20 74 65 73 74  ISTS:.      test
6e60: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
6e70: 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20  =TK_SELECT );.  
6e80: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
6e90: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53  xpr->op==TK_EXIS
6ea0: 54 53 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  TS );.#endif.   
6eb0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
6ec0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b  pr->op==TK_ID );
6ed0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
6ee0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
6ef0: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74  OLUMN );.      t
6f00: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
6f10: 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 3b 0a 20 20  op==TK_DOT );.  
6f20: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
6f30: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
6f40: 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20  FUNCTION );.    
6f50: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
6f60: 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
6f70: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 70 57  LUMN );.      pW
6f80: 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a  alker->u.i = 0;.
6f90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
6fa0: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 63 61 73 65  _Abort;.    case
6fb0: 20 54 4b 5f 49 4e 3a 0a 20 20 20 20 20 20 69 66   TK_IN:.      if
6fc0: 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  ( pExpr->pSelect
6fd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57 61 6c   ){.        pWal
6fe0: 6b 65 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20 20  ker->u.i = 0;.  
6ff0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
7000: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a  _Abort;.      }.
7010: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
7020: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
7030: 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74  ntinue;.  }.}.st
7040: 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 4e  atic int selectN
7050: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57 61  odeIsConstant(Wa
7060: 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
7070: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
7080: 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20  .  pWalker->u.i 
7090: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52  = 0;.  return WR
70a0: 43 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74 61 74 69  C_Abort;.}.stati
70b0: 63 20 69 6e 74 20 65 78 70 72 49 73 43 6f 6e 73  c int exprIsCons
70c0: 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69  t(Expr *p, int i
70d0: 6e 69 74 46 6c 61 67 29 7b 0a 20 20 57 61 6c 6b  nitFlag){.  Walk
70e0: 65 72 20 77 3b 0a 20 20 77 2e 75 2e 69 20 3d 20  er w;.  w.u.i = 
70f0: 69 6e 69 74 46 6c 61 67 3b 0a 20 20 77 2e 78 45  initFlag;.  w.xE
7100: 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78  xprCallback = ex
7110: 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  prNodeIsConstant
7120: 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
7130: 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f  lback = selectNo
7140: 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20  deIsConstant;.  
7150: 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
7160: 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e  &w, p);.  return
7170: 20 77 2e 75 2e 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   w.u.i;.}../*.**
7180: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
7190: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
71a0: 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65  n 1 if the expre
71b0: 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
71c0: 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74  t.** and 0 if it
71d0: 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62   involves variab
71e0: 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20  les or function 
71f0: 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  calls..**.** For
7200: 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66   the purposes of
7210: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
7220: 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20  a double-quoted 
7230: 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63  string (ex: "abc
7240: 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65  ").** is conside
7250: 72 65 64 20 61 20 76 61 72 69 61 62 6c 65 20 62  red a variable b
7260: 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74  ut a single-quot
7270: 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27  ed string (ex: '
7280: 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f  abc') is.** a co
7290: 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  nstant..*/.int s
72a0: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
72b0: 74 61 6e 74 28 45 78 70 72 20 2a 70 29 7b 0a 20  tant(Expr *p){. 
72c0: 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f   return exprIsCo
72d0: 6e 73 74 28 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a  nst(p, 1);.}../*
72e0: 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
72f0: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
7300: 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78  turn 1 if the ex
7310: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
7320: 74 61 6e 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65  tant.** that doe
7330: 73 20 6e 6f 20 6f 72 69 67 69 6e 61 74 65 20 66  s no originate f
7340: 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55 53  rom the ON or US
7350: 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61  ING clauses of a
7360: 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e   join..** Return
7370: 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65   0 if it involve
7380: 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66  s variables or f
7390: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72  unction calls or
73a0: 20 74 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61   terms from.** a
73b0: 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  n ON or USING cl
73c0: 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ause..*/.int sql
73d0: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
73e0: 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a  ntNotJoin(Expr *
73f0: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70  p){.  return exp
7400: 72 49 73 43 6f 6e 73 74 28 70 2c 20 33 29 3b 0a  rIsConst(p, 3);.
7410: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
7420: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
7430: 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
7440: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
7450: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20   constant.** or 
7460: 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  a function call 
7470: 77 69 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72  with constant ar
7480: 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e  guments.  Return
7490: 20 61 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a   and 0 if there.
74a0: 2a 2a 20 61 72 65 20 61 6e 79 20 76 61 72 69 61  ** are any varia
74b0: 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  bles..**.** For 
74c0: 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
74d0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
74e0: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73   double-quoted s
74f0: 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22  tring (ex: "abc"
7500: 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  ).** is consider
7510: 65 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75  ed a variable bu
7520: 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65  t a single-quote
7530: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61  d string (ex: 'a
7540: 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e  bc') is.** a con
7550: 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  stant..*/.int sq
7560: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
7570: 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78  antOrFunction(Ex
7580: 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  pr *p){.  return
7590: 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20   exprIsConst(p, 
75a0: 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  2);.}../*.** If 
75b0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
75c0: 20 63 6f 64 65 73 20 61 20 63 6f 6e 73 74 61 6e   codes a constan
75d0: 74 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 69  t integer that i
75e0: 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a  s small enough.*
75f0: 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 33 32  * to fit in a 32
7600: 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65  -bit integer, re
7610: 74 75 72 6e 20 31 20 61 6e 64 20 70 75 74 20 74  turn 1 and put t
7620: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
7630: 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70  integer.** in *p
7640: 56 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20 65  Value.  If the e
7650: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74  xpression is not
7660: 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 69   an integer or i
7670: 66 20 69 74 20 69 73 20 74 6f 6f 20 62 69 67 0a  f it is too big.
7680: 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 73  ** to fit in a s
7690: 69 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74  igned 32-bit int
76a0: 65 67 65 72 2c 20 72 65 74 75 72 6e 20 30 20 61  eger, return 0 a
76b0: 6e 64 20 6c 65 61 76 65 20 2a 70 56 61 6c 75 65  nd leave *pValue
76c0: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69   unchanged..*/.i
76d0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
76e0: 49 6e 74 65 67 65 72 28 45 78 70 72 20 2a 70 2c  Integer(Expr *p,
76f0: 20 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20   int *pValue){. 
7700: 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 69   int rc = 0;.  i
7710: 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50  f( p->flags & EP
7720: 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20  _IntValue ){.   
7730: 20 2a 70 56 61 6c 75 65 20 3d 20 70 2d 3e 69 54   *pValue = p->iT
7740: 61 62 6c 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  able;.    return
7750: 20 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68   1;.  }.  switch
7760: 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  ( p->op ){.    c
7770: 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20  ase TK_INTEGER: 
7780: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
7790: 69 74 65 33 47 65 74 49 6e 74 33 32 28 28 63 68  ite3GetInt32((ch
77a0: 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  ar*)p->token.z, 
77b0: 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62  pValue);.      b
77c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
77d0: 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b  case TK_UPLUS: {
77e0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
77f0: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
7800: 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75  (p->pLeft, pValu
7810: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
7820: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
7830: 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
7840: 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20     int v;.      
7850: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
7860: 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66  sInteger(p->pLef
7870: 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20  t, &v) ){.      
7880: 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a    *pValue = -v;.
7890: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
78a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
78b0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
78c0: 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20  efault: break;. 
78d0: 20 7d 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20   }.  if( rc ){. 
78e0: 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 49 4e     p->op = TK_IN
78f0: 54 45 47 45 52 3b 0a 20 20 20 20 70 2d 3e 66 6c  TEGER;.    p->fl
7900: 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c  ags |= EP_IntVal
7910: 75 65 3b 0a 20 20 20 20 70 2d 3e 69 54 61 62 6c  ue;.    p->iTabl
7920: 65 20 3d 20 2a 70 56 61 6c 75 65 3b 0a 20 20 7d  e = *pValue;.  }
7930: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
7940: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
7950: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
7960: 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d  string is a row-
7970: 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a  id column name..
7980: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73  */.int sqlite3Is
7990: 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72  Rowid(const char
79a0: 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69   *z){.  if( sqli
79b0: 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f  te3StrICmp(z, "_
79c0: 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65  ROWID_")==0 ) re
79d0: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
79e0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
79f0: 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65  "ROWID")==0 ) re
7a00: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
7a10: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
7a20: 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75  "OID")==0 ) retu
7a30: 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
7a40: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
7a50: 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 73 71  TE_TEST.  int sq
7a60: 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 69 6e 5f  lite3_enable_in_
7a70: 6f 70 74 20 3d 20 31 3b 0a 23 65 6c 73 65 0a 20  opt = 1;.#else. 
7a80: 20 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33   #define sqlite3
7a90: 5f 65 6e 61 62 6c 65 5f 69 6e 5f 6f 70 74 20 31  _enable_in_opt 1
7aa0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
7ab0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
7ac0: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 6f 70  e IN operator op
7ad0: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
7ae0: 61 62 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65  abled and.** the
7af0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
7b00: 74 20 70 20 65 78 69 73 74 73 20 61 6e 64 20 69  t p exists and i
7b10: 73 20 6f 66 20 74 68 65 0a 2a 2a 20 73 69 6d 70  s of the.** simp
7b20: 6c 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  le form:.**.**  
7b30: 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d     SELECT <colum
7b40: 6e 3e 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a  n> FROM <table>.
7b50: 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73  **.** If this is
7b60: 20 74 68 65 20 63 61 73 65 2c 20 69 74 20 6d 61   the case, it ma
7b70: 79 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  y be possible to
7b80: 20 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67   use an existing
7b90: 20 74 61 62 6c 65 0a 2a 2a 20 6f 72 20 69 6e 64   table.** or ind
7ba0: 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20 67 65  ex instead of ge
7bb0: 6e 65 72 61 74 69 6e 67 20 61 6e 20 65 70 68 65  nerating an ephe
7bc0: 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a  remal table..*/.
7bd0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7be0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 73 74 61  MIT_SUBQUERY.sta
7bf0: 74 69 63 20 69 6e 74 20 69 73 43 61 6e 64 69 64  tic int isCandid
7c00: 61 74 65 46 6f 72 49 6e 4f 70 74 28 53 65 6c 65  ateForInOpt(Sele
7c10: 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73  ct *p){.  SrcLis
7c20: 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70 72 4c  t *pSrc;.  ExprL
7c30: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54  ist *pEList;.  T
7c40: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 66  able *pTab;.  if
7c50: 28 20 21 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  ( !sqlite3_enabl
7c60: 65 5f 69 6e 5f 6f 70 74 20 29 20 72 65 74 75 72  e_in_opt ) retur
7c70: 6e 20 30 3b 20 2f 2a 20 49 4e 20 6f 70 74 69 6d  n 0; /* IN optim
7c80: 69 7a 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  ization must be 
7c90: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
7ca0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
7cb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7cc0: 20 20 20 20 2f 2a 20 72 69 67 68 74 2d 68 61 6e      /* right-han
7cd0: 64 20 73 69 64 65 20 6f 66 20 49 4e 20 69 73 20  d side of IN is 
7ce0: 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20  SELECT */.  if( 
7cf0: 70 2d 3e 70 50 72 69 6f 72 20 29 20 72 65 74 75  p->pPrior ) retu
7d00: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
7d10: 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d 70     /* Not a comp
7d20: 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20  ound SELECT */. 
7d30: 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
7d40: 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
7d50: 53 46 5f 41 67 67 72 65 67 61 74 65 29 20 29 7b  SF_Aggregate) ){
7d60: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
7d70: 20 2f 2a 20 4e 6f 20 44 49 53 54 49 4e 43 54 20   /* No DISTINCT 
7d80: 6b 65 79 77 6f 72 64 20 61 6e 64 20 6e 6f 20 61  keyword and no a
7d90: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
7da0: 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  ns */.  }.  if( 
7db0: 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 20 72 65  p->pGroupBy ) re
7dc0: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
7dd0: 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 47 52 4f     /* Has no GRO
7de0: 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  UP BY clause */.
7df0: 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20    if( p->pLimit 
7e00: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
7e10: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20           /* Has 
7e20: 6e 6f 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  no LIMIT clause 
7e30: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f 66 66  */.  if( p->pOff
7e40: 73 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  set ) return 0;.
7e50: 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20    if( p->pWhere 
7e60: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
7e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20           /* Has 
7e80: 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  no WHERE clause 
7e90: 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  */.  pSrc = p->p
7ea0: 53 72 63 3b 0a 20 20 69 66 28 20 70 53 72 63 3d  Src;.  if( pSrc=
7eb0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
7ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7ed0: 20 41 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   A single table 
7ee0: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
7ef0: 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63  se */.  if( pSrc
7f00: 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75  ->nSrc!=1 ) retu
7f10: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 53 72 63  rn 0;.  if( pSrc
7f20: 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29  ->a[0].pSelect )
7f30: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f   return 0;     /
7f40: 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  * FROM clause is
7f50: 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 20   not a subquery 
7f60: 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63  */.  pTab = pSrc
7f70: 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 69  ->a[0].pTab;.  i
7f80: 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74  f( pTab==0 ) ret
7f90: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 54 61  urn 0;.  if( pTa
7fa0: 62 2d 3e 70 53 65 6c 65 63 74 20 29 20 72 65 74  b->pSelect ) ret
7fb0: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
7fc0: 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  /* FROM clause i
7fd0: 73 20 6e 6f 74 20 61 20 76 69 65 77 20 2a 2f 0a  s not a view */.
7fe0: 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
7ff0: 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30  pTab) ) return 0
8000: 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d  ;        /* FROM
8010: 20 63 6c 61 75 73 65 20 6e 6f 74 20 61 20 76 69   clause not a vi
8020: 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20  rtual table */. 
8030: 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
8040: 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  ist;.  if( pELis
8050: 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65  t->nExpr!=1 ) re
8060: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 2f 2a  turn 0;       /*
8070: 20 4f 6e 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74   One column in t
8080: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
8090: 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61  .  if( pEList->a
80a0: 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 21 3d 54  [0].pExpr->op!=T
80b0: 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72  K_COLUMN ) retur
80c0: 6e 20 30 3b 20 2f 2a 20 52 65 73 75 6c 74 20 69  n 0; /* Result i
80d0: 73 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  s a column */.  
80e0: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
80f0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
8100: 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f  T_SUBQUERY */../
8110: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
8120: 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20 74 68  on is used by th
8130: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
8140: 20 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e 29   of the IN (...)
8150: 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 49 74   operator..** It
8160: 27 73 20 6a 6f 62 20 69 73 20 74 6f 20 66 69 6e  's job is to fin
8170: 64 20 6f 72 20 63 72 65 61 74 65 20 61 20 62 2d  d or create a b-
8180: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 74  tree structure t
8190: 68 61 74 20 6d 61 79 20 62 65 20 75 73 65 64 0a  hat may be used.
81a0: 2a 2a 20 65 69 74 68 65 72 20 74 6f 20 74 65 73  ** either to tes
81b0: 74 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70  t for membership
81c0: 20 6f 66 20 74 68 65 20 28 2e 2e 2e 29 20 73 65   of the (...) se
81d0: 74 20 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20  t or to iterate 
81e0: 74 68 72 6f 75 67 68 0a 2a 2a 20 69 74 73 20 6d  through.** its m
81f0: 65 6d 62 65 72 73 2c 20 73 6b 69 70 70 69 6e 67  embers, skipping
8200: 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a   duplicates..**.
8210: 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f 70  ** The cursor op
8220: 65 6e 65 64 20 6f 6e 20 74 68 65 20 73 74 72 75  ened on the stru
8230: 63 74 75 72 65 20 28 64 61 74 61 62 61 73 65 20  cture (database 
8240: 74 61 62 6c 65 2c 20 64 61 74 61 62 61 73 65 20  table, database 
8250: 69 6e 64 65 78 20 0a 2a 2a 20 6f 72 20 65 70 68  index .** or eph
8260: 65 72 6d 61 6c 20 74 61 62 6c 65 29 20 69 73 20  ermal table) is 
8270: 73 74 6f 72 65 64 20 69 6e 20 70 58 2d 3e 69 54  stored in pX->iT
8280: 61 62 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73  able before this
8290: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
82a0: 73 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  s..** The return
82b0: 65 64 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74  ed value indicat
82c0: 65 73 20 74 68 65 20 73 74 72 75 63 74 75 72 65  es the structure
82d0: 20 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f 77   type, as follow
82e0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e  s:.**.**   IN_IN
82f0: 44 45 58 5f 52 4f 57 49 44 20 2d 20 54 68 65 20  DEX_ROWID - The 
8300: 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65  cursor was opene
8310: 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20  d on a database 
8320: 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49  table..**   IN_I
8330: 4e 44 45 58 5f 49 4e 44 45 58 20 2d 20 54 68 65  NDEX_INDEX - The
8340: 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e   cursor was open
8350: 65 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  ed on a database
8360: 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f   index..**   IN_
8370: 49 4e 44 45 58 5f 45 50 48 20 2d 20 20 20 54 68  INDEX_EPH -   Th
8380: 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
8390: 6e 65 64 20 6f 6e 20 61 20 73 70 65 63 69 61 6c  ned on a special
83a0: 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a  ly created and.*
83b0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
83c0: 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20 65       populated e
83d0: 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a  pheremal table..
83e0: 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e  **.** An existin
83f0: 67 20 73 74 72 75 63 74 75 72 65 20 6d 61 79 20  g structure may 
8400: 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 69 66 20  only be used if 
8410: 74 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66  the SELECT is of
8420: 20 74 68 65 20 73 69 6d 70 6c 65 0a 2a 2a 20 66   the simple.** f
8430: 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  orm:.**.**     S
8440: 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46  ELECT <column> F
8450: 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a  ROM <table>.**.*
8460: 2a 20 49 66 20 70 72 4e 6f 74 46 6f 75 6e 64 20  * If prNotFound 
8470: 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20  parameter is 0, 
8480: 74 68 65 6e 20 74 68 65 20 73 74 72 75 63 74 75  then the structu
8490: 72 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  re will be used 
84a0: 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68  to iterate.** th
84b0: 72 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d 65  rough the set me
84c0: 6d 62 65 72 73 2c 20 73 6b 69 70 70 69 6e 67 20  mbers, skipping 
84d0: 61 6e 79 20 64 75 70 6c 69 63 61 74 65 73 2e 20  any duplicates. 
84e0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 0a  In this case an.
84f0: 2a 2a 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  ** epheremal tab
8500: 6c 65 20 6d 75 73 74 20 62 65 20 75 73 65 64 20  le must be used 
8510: 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63  unless the selec
8520: 74 65 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20  ted <column> is 
8530: 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f  guaranteed.** to
8540: 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74   be unique - eit
8550: 68 65 72 20 62 65 63 61 75 73 65 20 69 74 20 69  her because it i
8560: 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  s an INTEGER PRI
8570: 4d 41 52 59 20 4b 45 59 20 6f 72 20 69 74 0a 2a  MARY KEY or it.*
8580: 2a 20 69 73 20 75 6e 69 71 75 65 20 62 79 20 76  * is unique by v
8590: 69 72 74 75 65 20 6f 66 20 61 20 63 6f 6e 73 74  irtue of a const
85a0: 72 61 69 6e 74 20 6f 72 20 69 6d 70 6c 69 63 69  raint or implici
85b0: 74 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49  t index..**.** I
85c0: 66 20 74 68 65 20 70 72 4e 6f 74 46 6f 75 6e 64  f the prNotFound
85d0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
85e0: 74 20 30 2c 20 74 68 65 6e 20 74 68 65 20 73 74  t 0, then the st
85f0: 72 75 63 74 75 72 65 20 77 69 6c 6c 20 62 65 20  ructure will be 
8600: 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73  used .** for fas
8610: 74 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70  t set membership
8620: 20 74 65 73 74 73 2e 20 49 6e 20 74 68 69 73 20   tests. In this 
8630: 63 61 73 65 20 61 6e 20 65 70 68 65 72 65 6d 61  case an epherema
8640: 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a  l table must .**
8650: 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20   be used unless 
8660: 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 61 6e 20 49  <column> is an I
8670: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
8680: 45 59 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 63  EY or an index c
8690: 61 6e 20 0a 2a 2a 20 62 65 20 66 6f 75 6e 64 20  an .** be found 
86a0: 77 69 74 68 20 3c 63 6f 6c 75 6d 6e 3e 20 61 73  with <column> as
86b0: 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73 74 20 63   its left-most c
86c0: 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  olumn..**.** Whe
86d0: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  n the structure 
86e0: 69 73 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f  is being used fo
86f0: 72 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70  r set membership
8700: 20 74 65 73 74 73 2c 20 74 68 65 20 75 73 65 72   tests, the user
8710: 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 6b 6e 6f  .** needs to kno
8720: 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  w whether or not
8730: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 63   the structure c
8740: 6f 6e 74 61 69 6e 73 20 61 6e 20 53 51 4c 20 4e  ontains an SQL N
8750: 55 4c 4c 20 0a 2a 2a 20 76 61 6c 75 65 20 69 6e  ULL .** value in
8760: 20 6f 72 64 65 72 20 74 6f 20 63 6f 72 72 65 63   order to correc
8770: 74 6c 79 20 65 76 61 6c 75 61 74 65 20 65 78 70  tly evaluate exp
8780: 72 65 73 73 69 6f 6e 73 20 6c 69 6b 65 20 22 58  ressions like "X
8790: 20 49 4e 20 28 59 2c 20 5a 29 22 2e 0a 2a 2a 20   IN (Y, Z)"..** 
87a0: 49 66 20 74 68 65 72 65 20 69 73 20 61 20 63 68  If there is a ch
87b0: 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 73 74  ance that the st
87c0: 72 75 63 74 75 72 65 20 6d 61 79 20 63 6f 6e 74  ructure may cont
87d0: 61 69 6e 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65  ain a NULL value
87e0: 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20   at.** runtime, 
87f0: 74 68 65 6e 20 61 20 72 65 67 69 73 74 65 72 20  then a register 
8800: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
8810: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75   the register nu
8820: 6d 62 65 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20  mber written.** 
8830: 74 6f 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 2e 20  to *prNotFound. 
8840: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63  If there is no c
8850: 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 73  hance that the s
8860: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
8870: 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75  s a.** NULL valu
8880: 65 2c 20 74 68 65 6e 20 2a 70 72 4e 6f 74 46 6f  e, then *prNotFo
8890: 75 6e 64 20 69 73 20 6c 65 66 74 20 75 6e 63 68  und is left unch
88a0: 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  anged..**.** If 
88b0: 61 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c  a register is al
88c0: 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 74 73 20  located and its 
88d0: 6c 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65 64 20  location stored 
88e0: 69 6e 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 2c 20  in *prNotFound, 
88f0: 74 68 65 6e 0a 2a 2a 20 69 74 73 20 69 6e 69 74  then.** its init
8900: 69 61 6c 20 76 61 6c 75 65 20 69 73 20 4e 55 4c  ial value is NUL
8910: 4c 2e 20 49 66 20 74 68 65 20 73 74 72 75 63 74  L. If the struct
8920: 75 72 65 20 64 6f 65 73 20 6e 6f 74 20 72 65 6d  ure does not rem
8930: 61 69 6e 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20  ain constant.** 
8940: 66 6f 72 20 74 68 65 20 64 75 72 61 74 69 6f 6e  for the duration
8950: 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 28 69   of the query (i
8960: 2e 65 2e 20 74 68 65 20 73 65 74 20 69 73 20 61  .e. the set is a
8970: 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d   correlated sub-
8980: 73 65 6c 65 63 74 29 2c 20 0a 2a 2a 20 74 68 65  select), .** the
8990: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 61 6c   value of the al
89a0: 6c 6f 63 61 74 65 64 20 72 65 67 69 73 74 65 72  located register
89b0: 20 69 73 20 72 65 73 65 74 20 74 6f 20 4e 55 4c   is reset to NUL
89c0: 4c 20 65 61 63 68 20 74 69 6d 65 20 74 68 65 20  L each time the 
89d0: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 69 73  .** structure is
89e0: 20 72 65 70 6f 70 75 6c 61 74 65 64 2e 20 54 68   repopulated. Th
89f0: 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 61  is allows the ca
8a00: 6c 6c 65 72 20 74 6f 20 75 73 65 20 76 64 62 65  ller to use vdbe
8a10: 20 63 6f 64 65 20 0a 2a 2a 20 65 71 75 69 76 61   code .** equiva
8a20: 6c 65 6e 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c  lent to the foll
8a30: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 69  owing:.**.**   i
8a40: 66 28 20 72 65 67 69 73 74 65 72 3d 3d 4e 55 4c  f( register==NUL
8a50: 4c 20 29 7b 0a 2a 2a 20 20 20 20 20 68 61 73 5f  L ){.**     has_
8a60: 6e 75 6c 6c 20 3d 20 3c 74 65 73 74 20 69 66 20  null = <test if 
8a70: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 63  data structure c
8a80: 6f 6e 74 61 69 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a  ontains null>.**
8a90: 20 20 20 20 20 72 65 67 69 73 74 65 72 20 3d 20       register = 
8aa0: 31 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 69  1.**   }.**.** i
8ab0: 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64  n order to avoid
8ac0: 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 3c 74 65   running the <te
8ad0: 73 74 20 69 66 20 64 61 74 61 20 73 74 72 75 63  st if data struc
8ae0: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 6e 75  ture contains nu
8af0: 6c 6c 3e 0a 2a 2a 20 74 65 73 74 20 6d 6f 72 65  ll>.** test more
8b00: 20 6f 66 74 65 6e 20 74 68 61 6e 20 69 73 20 6e   often than is n
8b10: 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 23 69 66  ecessary..*/.#if
8b20: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8b30: 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71  _SUBQUERY.int sq
8b40: 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
8b50: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
8b60: 45 78 70 72 20 2a 70 58 2c 20 69 6e 74 20 2a 70  Expr *pX, int *p
8b70: 72 4e 6f 74 46 6f 75 6e 64 29 7b 0a 20 20 53 65  rNotFound){.  Se
8b80: 6c 65 63 74 20 2a 70 3b 0a 20 20 69 6e 74 20 65  lect *p;.  int e
8b90: 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Type = 0;.  int 
8ba0: 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iTab = pParse->n
8bb0: 54 61 62 2b 2b 3b 0a 20 20 69 6e 74 20 6d 75 73  Tab++;.  int mus
8bc0: 74 42 65 55 6e 69 71 75 65 20 3d 20 21 70 72 4e  tBeUnique = !prN
8bd0: 6f 74 46 6f 75 6e 64 3b 0a 0a 20 20 2f 2a 20 54  otFound;..  /* T
8be0: 68 65 20 66 6f 6c 6c 77 69 6e 67 20 69 66 28 2e  he follwing if(.
8bf0: 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ..) expression i
8c00: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 53 45  s true if the SE
8c10: 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65 20 0a  LECT is of the .
8c20: 20 20 2a 2a 20 73 69 6d 70 6c 65 20 66 6f 72 6d    ** simple form
8c30: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
8c40: 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20  SELECT <column> 
8c50: 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 20 20 2a  FROM <table>.  *
8c60: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69  *.  ** If this i
8c70: 73 20 74 68 65 20 63 61 73 65 2c 20 69 74 20 6d  s the case, it m
8c80: 61 79 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ay be possible t
8c90: 6f 20 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e  o use an existin
8ca0: 67 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 72 20  g table.  ** or 
8cb0: 69 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66  index instead of
8cc0: 20 67 65 6e 65 72 61 74 69 6e 67 20 61 6e 20 65   generating an e
8cd0: 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a  pheremal table..
8ce0: 20 20 2a 2f 0a 20 20 70 20 3d 20 70 58 2d 3e 70    */.  p = pX->p
8cf0: 53 65 6c 65 63 74 3b 0a 20 20 69 66 28 20 69 73  Select;.  if( is
8d00: 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
8d10: 74 28 70 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  t(p) ){.    sqli
8d20: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
8d30: 2d 3e 64 62 3b 0a 20 20 20 20 49 6e 64 65 78 20  ->db;.    Index 
8d40: 2a 70 49 64 78 3b 0a 20 20 20 20 45 78 70 72 20  *pIdx;.    Expr 
8d50: 2a 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69  *pExpr = p->pELi
8d60: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
8d70: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
8d80: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
8d90: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c     Vdbe *v = sql
8da0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
8db0: 73 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69  se);..    /* Thi
8dc0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
8dd0: 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 74  ly called from t
8de0: 77 6f 20 70 6c 61 63 65 73 2e 20 49 6e 20 62 6f  wo places. In bo
8df0: 74 68 20 63 61 73 65 73 20 74 68 65 20 76 64 62  th cases the vdb
8e00: 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 61 6c 72  e.    ** has alr
8e10: 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
8e20: 74 65 64 2e 20 53 6f 20 61 73 73 75 6d 65 20 73  ted. So assume s
8e30: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 29 20  qlite3GetVdbe() 
8e40: 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20 2a 2a  is always.    **
8e50: 20 73 75 63 63 65 73 73 66 75 6c 20 68 65 72 65   successful here
8e60: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
8e70: 65 72 74 28 76 29 3b 0a 20 20 20 20 69 66 28 20  ert(v);.    if( 
8e80: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
8e90: 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  int iMem = ++pPa
8ea0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
8eb0: 20 69 6e 74 20 69 41 64 64 72 3b 0a 20 20 20 20   int iAddr;.    
8ec0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
8ed0: 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54  p->pSrc->a[0].pT
8ee0: 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 44  ab;.      int iD
8ef0: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
8f00: 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
8f10: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
8f20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
8f30: 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b  esBtree(v, iDb);
8f40: 0a 0a 20 20 20 20 20 20 69 41 64 64 72 20 3d 20  ..      iAddr = 
8f50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8f60: 31 28 76 2c 20 4f 50 5f 49 66 2c 20 69 4d 65 6d  1(v, OP_If, iMem
8f70: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8f80: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
8f90: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 4d 65  _Integer, 1, iMe
8fa0: 6d 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  m);..      sqlit
8fb0: 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
8fc0: 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70  se, iTab, iDb, p
8fd0: 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  Tab, OP_OpenRead
8fe0: 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d  );.      eType =
8ff0: 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b   IN_INDEX_ROWID;
9000: 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ..      sqlite3V
9010: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69  dbeJumpHere(v, i
9020: 41 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Addr);.    }else
9030: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  {.      /* The c
9040: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
9050: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63 6f  e used by the co
9060: 6d 70 61 72 69 73 6f 6e 2e 20 49 66 20 61 6e 20  mparison. If an 
9070: 69 6e 64 65 78 20 69 73 20 74 6f 20 0a 20 20 20  index is to .   
9080: 20 20 20 2a 2a 20 62 65 20 75 73 65 64 20 69 6e     ** be used in
9090: 20 70 6c 61 63 65 20 6f 66 20 61 20 74 65 6d 70   place of a temp
90a0: 2d 74 61 62 6c 65 2c 20 69 74 20 6d 75 73 74 20  -table, it must 
90b0: 62 65 20 6f 72 64 65 72 65 64 20 61 63 63 6f 72  be ordered accor
90c0: 64 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 6f  ding.      ** to
90d0: 20 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20   this collation 
90e0: 73 65 71 75 65 6e 63 65 2e 0a 20 20 20 20 20 20  sequence..      
90f0: 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  */.      CollSeq
9100: 20 2a 70 52 65 71 20 3d 20 73 71 6c 69 74 65 33   *pReq = sqlite3
9110: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
9120: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d  lSeq(pParse, pX-
9130: 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 29 3b 0a  >pLeft, pExpr);.
9140: 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
9150: 74 68 61 74 20 74 68 65 20 61 66 66 69 6e 69 74  that the affinit
9160: 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75  y that will be u
9170: 73 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 74  sed to perform t
9180: 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d  he .      ** com
9190: 70 61 72 69 73 6f 6e 20 69 73 20 74 68 65 20 73  parison is the s
91a0: 61 6d 65 20 61 73 20 74 68 65 20 61 66 66 69 6e  ame as the affin
91b0: 69 74 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ity of the colum
91c0: 6e 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 69  n. If.      ** i
91d0: 74 20 69 73 20 6e 6f 74 2c 20 69 74 20 69 73 20  t is not, it is 
91e0: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
91f0: 75 73 65 20 61 6e 79 20 69 6e 64 65 78 2e 0a 20  use any index.. 
9200: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61       */.      Ta
9210: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 2d 3e 70  ble *pTab = p->p
9220: 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  Src->a[0].pTab;.
9230: 20 20 20 20 20 20 63 68 61 72 20 61 66 66 20 3d        char aff =
9240: 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e   comparisonAffin
9250: 69 74 79 28 70 58 29 3b 0a 20 20 20 20 20 20 69  ity(pX);.      i
9260: 6e 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d  nt affinity_ok =
9270: 20 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f   (pTab->aCol[iCo
9280: 6c 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 61 66 66  l].affinity==aff
9290: 7c 7c 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  ||aff==SQLITE_AF
92a0: 46 5f 4e 4f 4e 45 29 3b 0a 0a 20 20 20 20 20 20  F_NONE);..      
92b0: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
92c0: 49 6e 64 65 78 3b 20 70 49 64 78 20 26 26 20 65  Index; pIdx && e
92d0: 54 79 70 65 3d 3d 30 20 26 26 20 61 66 66 69 6e  Type==0 && affin
92e0: 69 74 79 5f 6f 6b 3b 20 70 49 64 78 3d 70 49 64  ity_ok; pIdx=pId
92f0: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
9300: 20 20 20 69 66 28 20 28 70 49 64 78 2d 3e 61 69     if( (pIdx->ai
9310: 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 29  Column[0]==iCol)
9320: 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 52  .         && (pR
9330: 65 71 3d 3d 73 71 6c 69 74 65 33 46 69 6e 64 43  eq==sqlite3FindC
9340: 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64  ollSeq(db, ENC(d
9350: 62 29 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  b), pIdx->azColl
9360: 5b 30 5d 2c 20 2d 31 2c 20 30 29 29 0a 20 20 20  [0], -1, 0)).   
9370: 20 20 20 20 20 20 26 26 20 28 21 6d 75 73 74 42        && (!mustB
9380: 65 55 6e 69 71 75 65 20 7c 7c 20 28 70 49 64 78  eUnique || (pIdx
9390: 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 26 26 20  ->nColumn==1 && 
93a0: 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  pIdx->onError!=O
93b0: 45 5f 4e 6f 6e 65 29 29 0a 20 20 20 20 20 20 20  E_None)).       
93c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
93d0: 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20  t iDb;.         
93e0: 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50   int iMem = ++pP
93f0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
9400: 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 3b        int iAddr;
9410: 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
9420: 2a 70 4b 65 79 3b 0a 20 20 0a 20 20 20 20 20 20  *pKey;.  .      
9430: 20 20 20 20 70 4b 65 79 20 3d 20 28 63 68 61 72      pKey = (char
9440: 20 2a 29 73 71 6c 69 74 65 33 49 6e 64 65 78 4b   *)sqlite3IndexK
9450: 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyinfo(pParse, p
9460: 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Idx);.          
9470: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
9480: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
9490: 49 64 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Idx->pSchema);. 
94a0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
94b0: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
94c0: 20 69 44 62 29 3b 0a 0a 20 20 20 20 20 20 20 20   iDb);..        
94d0: 20 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65    iAddr = sqlite
94e0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
94f0: 50 5f 49 66 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  P_If, iMem);.   
9500: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
9510: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
9520: 6e 74 65 67 65 72 2c 20 31 2c 20 69 4d 65 6d 29  nteger, 1, iMem)
9530: 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 73  ;.  .          s
9540: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
9550: 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c  (v, OP_SetNumCol
9560: 75 6d 6e 73 2c 20 30 2c 20 70 49 64 78 2d 3e 6e  umns, 0, pIdx->n
9570: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
9580: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9590: 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  dOp4(v, OP_OpenR
95a0: 65 61 64 2c 20 69 54 61 62 2c 20 70 49 64 78 2d  ead, iTab, pIdx-
95b0: 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20 20 20 20  >tnum, iDb,.    
95c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95d0: 20 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 2c             pKey,
95e0: 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
95f0: 46 46 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56  FF);.          V
9600: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
9610: 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  %s", pIdx->zName
9620: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 54  ));.          eT
9630: 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49  ype = IN_INDEX_I
9640: 4e 44 45 58 3b 0a 0a 20 20 20 20 20 20 20 20 20  NDEX;..         
9650: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
9660: 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a  Here(v, iAddr);.
9670: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 72            if( pr
9680: 4e 6f 74 46 6f 75 6e 64 20 26 26 20 21 70 54 61  NotFound && !pTa
9690: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f  b->aCol[iCol].no
96a0: 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  tNull ){.       
96b0: 20 20 20 20 20 2a 70 72 4e 6f 74 46 6f 75 6e 64       *prNotFound
96c0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
96d0: 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  m;.          }. 
96e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
96f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
9700: 28 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20  ( eType==0 ){.  
9710: 20 20 69 6e 74 20 72 4d 61 79 48 61 76 65 4e 75    int rMayHaveNu
9720: 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ll = 0;.    if( 
9730: 70 72 4e 6f 74 46 6f 75 6e 64 20 29 7b 0a 20 20  prNotFound ){.  
9740: 20 20 20 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 20      *prNotFound 
9750: 3d 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d  = rMayHaveNull =
9760: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
9770: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
9780: 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
9790: 70 50 61 72 73 65 2c 20 70 58 2c 20 72 4d 61 79  pParse, pX, rMay
97a0: 48 61 76 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 65  HaveNull);.    e
97b0: 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
97c0: 45 50 48 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  EPH;.  }else{.  
97d0: 20 20 70 58 2d 3e 69 54 61 62 6c 65 20 3d 20 69    pX->iTable = i
97e0: 54 61 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Tab;.  }.  retur
97f0: 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69  n eType;.}.#endi
9800: 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  f../*.** Generat
9810: 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61  e code for scala
9820: 72 20 73 75 62 71 75 65 72 69 65 73 20 75 73 65  r subqueries use
9830: 64 20 61 73 20 61 6e 20 65 78 70 72 65 73 73 69  d as an expressi
9840: 6f 6e 0a 2a 2a 20 61 6e 64 20 49 4e 20 6f 70 65  on.** and IN ope
9850: 72 61 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65  rators.  Example
9860: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45  s:.**.**     (SE
9870: 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20  LECT a FROM b)  
9880: 20 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75          -- subqu
9890: 65 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54  ery.**     EXIST
98a0: 53 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  S (SELECT a FROM
98b0: 20 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20   b)   -- EXISTS 
98c0: 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20  subquery.**     
98d0: 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20 20 20  x IN (4,5,11)   
98e0: 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 49 4e             -- IN
98f0: 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 6c   operator with l
9900: 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e  ist on right-han
9910: 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20 78 20  d side.**     x 
9920: 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f  IN (SELECT a FRO
9930: 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f  M b)     -- IN o
9940: 70 65 72 61 74 6f 72 20 77 69 74 68 20 73 75 62  perator with sub
9950: 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72 69 67  query on the rig
9960: 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78  ht.**.** The pEx
9970: 70 72 20 70 61 72 61 6d 65 74 65 72 20 64 65 73  pr parameter des
9980: 63 72 69 62 65 73 20 74 68 65 20 65 78 70 72 65  cribes the expre
9990: 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61  ssion that conta
99a0: 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70  ins the IN.** op
99b0: 65 72 61 74 6f 72 20 6f 72 20 73 75 62 71 75 65  erator or subque
99c0: 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ry..*/.#ifndef S
99d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
99e0: 45 52 59 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ERY.void sqlite3
99f0: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 50 61  CodeSubselect(Pa
9a00: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
9a10: 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 72 4d  r *pExpr, int rM
9a20: 61 79 48 61 76 65 4e 75 6c 6c 29 7b 0a 20 20 69  ayHaveNull){.  i
9a30: 6e 74 20 74 65 73 74 41 64 64 72 20 3d 20 30 3b  nt testAddr = 0;
9a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a50: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69         /* One-ti
9a60: 6d 65 20 74 65 73 74 20 61 64 64 72 65 73 73 20  me test address 
9a70: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  */.  Vdbe *v = s
9a80: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
9a90: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
9aa0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 0a 20 20  0 ) return;...  
9ab0: 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 6d 75 73  /* This code mus
9ac0: 74 20 62 65 20 72 75 6e 20 69 6e 20 69 74 73 20  t be run in its 
9ad0: 65 6e 74 69 72 65 74 79 20 65 76 65 72 79 20 74  entirety every t
9ae0: 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e  ime it is encoun
9af0: 74 65 72 65 64 0a 20 20 2a 2a 20 69 66 20 61 6e  tered.  ** if an
9b00: 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
9b10: 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a  ng is true:.  **
9b20: 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20  .  **    *  The 
9b30: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
9b40: 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20  is a correlated 
9b50: 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20 20  subquery.  **   
9b60: 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61   *  The right-ha
9b70: 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20 65 78  nd side is an ex
9b80: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f  pression list co
9b90: 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62 6c  ntaining variabl
9ba0: 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57 65  es.  **    *  We
9bb0: 20 61 72 65 20 69 6e 73 69 64 65 20 61 20 74 72   are inside a tr
9bc0: 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20  igger.  **.  ** 
9bd0: 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62  If all of the ab
9be0: 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20 74  ove are false, t
9bf0: 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e 20 74  hen we can run t
9c00: 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e  his code just on
9c10: 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74 68 65  ce.  ** save the
9c20: 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20 72 65   results, and re
9c30: 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 65 73  use the same res
9c40: 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65 6e  ult on subsequen
9c50: 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20  t invocations.. 
9c60: 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72 48   */.  if( !ExprH
9c70: 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45  asAnyProperty(pE
9c80: 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63  xpr, EP_VarSelec
9c90: 74 29 20 26 26 20 21 70 50 61 72 73 65 2d 3e 74  t) && !pParse->t
9ca0: 72 69 67 53 74 61 63 6b 20 29 7b 0a 20 20 20 20  rigStack ){.    
9cb0: 69 6e 74 20 6d 65 6d 20 3d 20 2b 2b 70 50 61 72  int mem = ++pPar
9cc0: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71  se->nMem;.    sq
9cd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
9ce0: 76 2c 20 4f 50 5f 49 66 2c 20 6d 65 6d 29 3b 0a  v, OP_If, mem);.
9cf0: 20 20 20 20 74 65 73 74 41 64 64 72 20 3d 20 73      testAddr = s
9d00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
9d10: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
9d20: 31 2c 20 6d 65 6d 29 3b 0a 20 20 20 20 61 73 73  1, mem);.    ass
9d30: 65 72 74 28 20 74 65 73 74 41 64 64 72 3e 30 20  ert( testAddr>0 
9d40: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
9d50: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
9d60: 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45   }..  switch( pE
9d70: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
9d80: 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
9d90: 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79     char affinity
9da0: 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  ;.      KeyInfo 
9db0: 6b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69  keyInfo;.      i
9dc0: 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20  nt addr;        
9dd0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
9de0: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69  _OpenEphemeral i
9df0: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20  nstruction */.. 
9e00: 20 20 20 20 20 69 66 28 20 72 4d 61 79 48 61 76       if( rMayHav
9e10: 65 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  eNull ){.       
9e20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9e30: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
9e40: 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 29 3b  , rMayHaveNull);
9e50: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
9e60: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
9e70: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
9e80: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 0a 20  Expr->pLeft);.. 
9e90: 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20       /* Whether 
9ea0: 74 68 69 73 20 69 73 20 61 6e 20 27 78 20 49 4e  this is an 'x IN
9eb0: 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20  (SELECT...)' or 
9ec0: 61 6e 20 27 78 20 49 4e 28 3c 65 78 70 72 6c 69  an 'x IN(<exprli
9ed0: 73 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20 65  st>)'.      ** e
9ee0: 78 70 72 65 73 73 69 6f 6e 20 69 74 20 69 73 20  xpression it is 
9ef0: 68 61 6e 64 6c 65 64 20 74 68 65 20 73 61 6d 65  handled the same
9f00: 20 77 61 79 2e 20 41 20 76 69 72 74 75 61 6c 20   way. A virtual 
9f10: 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20  table is .      
9f20: 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20 73  ** filled with s
9f30: 69 6e 67 6c 65 2d 66 69 65 6c 64 20 69 6e 64 65  ingle-field inde
9f40: 78 20 6b 65 79 73 20 72 65 70 72 65 73 65 6e 74  x keys represent
9f50: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ing the results.
9f60: 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68        ** from th
9f70: 65 20 53 45 4c 45 43 54 20 6f 72 20 74 68 65 20  e SELECT or the 
9f80: 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20  <exprlist>..    
9f90: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
9fa0: 20 74 68 65 20 27 78 27 20 65 78 70 72 65 73 73   the 'x' express
9fb0: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  ion is a column 
9fc0: 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 45  value, or the SE
9fd0: 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  LECT....      **
9fe0: 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72   statement retur
9ff0: 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  ns a column valu
a000: 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69  e, then the affi
a010: 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20 20 20  nity of that.   
a020: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20     ** column is 
a030: 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68  used to build th
a040: 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66  e index keys. If
a050: 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68   both 'x' and th
a060: 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43  e.      ** SELEC
a070: 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61  T... statement a
a080: 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  re columns, then
a090: 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
a0a0: 79 20 69 73 20 75 73 65 64 0a 20 20 20 20 20 20  y is used.      
a0b0: 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c  ** if either col
a0c0: 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20  umn has NUMERIC 
a0d0: 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e  or INTEGER affin
a0e0: 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a  ity. If neither.
a0f0: 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72        ** 'x' nor
a100: 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73   the SELECT... s
a110: 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c  tatement are col
a120: 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72  umns, then numer
a130: 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20  ic affinity.    
a140: 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20 20    ** is used..  
a150: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78      */.      pEx
a160: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61  pr->iTable = pPa
a170: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
a180: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
a190: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a1a0: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
a1b0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
a1c0: 31 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  1);.      memset
a1d0: 28 26 6b 65 79 49 6e 66 6f 2c 20 30 2c 20 73 69  (&keyInfo, 0, si
a1e0: 7a 65 6f 66 28 6b 65 79 49 6e 66 6f 29 29 3b 0a  zeof(keyInfo));.
a1f0: 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 6e 46        keyInfo.nF
a200: 69 65 6c 64 20 3d 20 31 3b 0a 0a 20 20 20 20 20  ield = 1;..     
a210: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c   if( pExpr->pSel
a220: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ect ){.        /
a230: 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20 65 78  * Case 1:     ex
a240: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
a250: 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  .).        **.  
a260: 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74        ** Generat
a270: 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20  e code to write 
a280: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
a290: 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 74  he select into t
a2a0: 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  he temporary.   
a2b0: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c       ** table al
a2c0: 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65 6e  located and open
a2d0: 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20  ed above..      
a2e0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c    */.        Sel
a2f0: 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20  ectDest dest;.  
a300: 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
a310: 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20 20 20 20  pEList;..       
a320: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
a330: 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
a340: 54 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 54  T_Set, pExpr->iT
a350: 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 64  able);.        d
a360: 65 73 74 2e 61 66 66 69 6e 69 74 79 20 3d 20 28  est.affinity = (
a370: 69 6e 74 29 61 66 66 69 6e 69 74 79 3b 0a 20 20  int)affinity;.  
a380: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
a390: 45 78 70 72 2d 3e 69 54 61 62 6c 65 26 30 78 30  Expr->iTable&0x0
a3a0: 30 30 30 46 46 46 46 29 3d 3d 70 45 78 70 72 2d  000FFFF)==pExpr-
a3b0: 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20  >iTable );.     
a3c0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65     if( sqlite3Se
a3d0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78  lect(pParse, pEx
a3e0: 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 26 64 65  pr->pSelect, &de
a3f0: 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  st) ){.         
a400: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
a410: 20 7d 0a 20 20 20 20 20 20 20 20 70 45 4c 69 73   }.        pELis
a420: 74 20 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  t = pExpr->pSele
a430: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  ct->pEList;.    
a440: 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26      if( pEList &
a450: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  & pEList->nExpr>
a460: 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  0 ){ .          
a470: 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d  keyInfo.aColl[0]
a480: 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
a490: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
a4a0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
a4b0: 65 66 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eft,.           
a4c0: 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e     pEList->a[0].
a4d0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
a4e0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
a4f0: 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29  ( pExpr->pList )
a500: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73  {.        /* Cas
a510: 65 20 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e  e 2:     expr IN
a520: 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20   (exprlist).    
a530: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
a540: 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70 72 65  * For each expre
a550: 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20  ssion, build an 
a560: 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74  index key from t
a570: 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e  he evaluation an
a580: 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f  d.        ** sto
a590: 72 65 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d  re it in the tem
a5a0: 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66  porary table. If
a5b0: 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c   <expr> is a col
a5c0: 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20  umn, then use.  
a5d0: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f        ** that co
a5e0: 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77  lumns affinity w
a5f0: 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64  hen building ind
a600: 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70  ex keys. If <exp
a610: 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20  r> is not.      
a620: 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75    ** a column, u
a630: 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  se numeric affin
a640: 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ity..        */.
a650: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
a660: 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20         ExprList 
a670: 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
a680: 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 73  pList;.        s
a690: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
a6a0: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
a6b0: 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20      int r1, r2, 
a6c0: 72 33 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28  r3;..        if(
a6d0: 20 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20   !affinity ){.  
a6e0: 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79          affinity
a6f0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
a700: 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
a710: 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43        keyInfo.aC
a720: 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33  oll[0] = sqlite3
a730: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
a740: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
a750: 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c  );..        /* L
a760: 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68  oop through each
a770: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c   expression in <
a780: 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20  exprlist>. */.  
a790: 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
a7a0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
a7b0: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 32  rse);.        r2
a7c0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
a7d0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
a7e0: 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73        for(i=pLis
a7f0: 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  t->nExpr, pItem=
a800: 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69  pList->a; i>0; i
a810: 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
a820: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
a830: 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  2 = pItem->pExpr
a840: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
a850: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
a860: 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e  n is not constan
a870: 74 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e  t then we will n
a880: 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20  eed to.         
a890: 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 65 20   ** disable the 
a8a0: 74 65 73 74 20 74 68 61 74 20 77 61 73 20 67 65  test that was ge
a8b0: 6e 65 72 61 74 65 64 20 61 62 6f 76 65 20 74 68  nerated above th
a8c0: 61 74 20 6d 61 6b 65 73 20 73 75 72 65 0a 20 20  at makes sure.  
a8d0: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
a8e0: 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63 75 74  code only execut
a8f0: 65 73 20 6f 6e 63 65 2e 20 20 42 65 63 61 75 73  es once.  Becaus
a900: 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73  e for a non-cons
a910: 74 61 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a  tant.          *
a920: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77 65 20  * expression we 
a930: 6e 65 65 64 20 74 6f 20 72 65 72 75 6e 20 74 68  need to rerun th
a940: 69 73 20 63 6f 64 65 20 65 61 63 68 20 74 69 6d  is code each tim
a950: 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
a960: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 74 65            if( te
a970: 73 74 41 64 64 72 20 26 26 20 21 73 71 6c 69 74  stAddr && !sqlit
a980: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
a990: 28 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20  (pE2) ){.       
a9a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a9b0: 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
a9c0: 74 65 73 74 41 64 64 72 2d 31 2c 20 32 29 3b 0a  testAddr-1, 2);.
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
a9e0: 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  Addr = 0;.      
a9f0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
aa00: 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
aa10: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
aa20: 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74  insert it into t
aa30: 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f  he temp table */
aa40: 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73  .          pPars
aa50: 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63  e->disableColCac
aa60: 68 65 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  he++;.          
aa70: 72 33 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r3 = sqlite3Expr
aa80: 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
aa90: 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a 20 20 20  e, pE2, r1);.   
aaa0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
aab0: 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f  Parse->disableCo
aac0: 6c 43 61 63 68 65 3e 30 20 29 3b 0a 20 20 20 20  lCache>0 );.    
aad0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69        pParse->di
aae0: 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b  sableColCache--;
aaf0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
ab00: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
ab10: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
ab20: 33 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e  3, 1, r2, &affin
ab30: 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ity, 1);.       
ab40: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
ab50: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
ab60: 65 28 70 50 61 72 73 65 2c 20 72 33 2c 20 31 29  e(pParse, r3, 1)
ab70: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
ab80: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
ab90: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
aba0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32  Expr->iTable, r2
abb0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
abc0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
abd0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
abe0: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  e, r1);.        
abf0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
ac00: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32  mpReg(pParse, r2
ac10: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
ac20: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
ac30: 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 76  geP4(v, addr, (v
ac40: 6f 69 64 20 2a 29 26 6b 65 79 49 6e 66 6f 2c 20  oid *)&keyInfo, 
ac50: 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
ac60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ac70: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49  .    case TK_EXI
ac80: 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  STS:.    case TK
ac90: 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
aca0: 20 2f 2a 20 54 68 69 73 20 68 61 73 20 74 6f 20   /* This has to 
acb0: 62 65 20 61 20 73 63 61 6c 61 72 20 53 45 4c 45  be a scalar SELE
acc0: 43 54 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  CT.  Generate co
acd0: 64 65 20 74 6f 20 70 75 74 20 74 68 65 0a 20 20  de to put the.  
ace0: 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20      ** value of 
acf0: 74 68 69 73 20 73 65 6c 65 63 74 20 69 6e 20 61  this select in a
ad00: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
ad10: 20 72 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62   record the numb
ad20: 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  er.      ** of t
ad30: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69  he memory cell i
ad40: 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20  n iColumn..     
ad50: 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63   */.      static
ad60: 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 6f 6e 65   const Token one
ad70: 20 3d 20 7b 20 28 75 38 2a 29 22 31 22 2c 20 30   = { (u8*)"1", 0
ad80: 2c 20 31 20 7d 3b 0a 20 20 20 20 20 20 53 65 6c  , 1 };.      Sel
ad90: 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20 20 20  ect *pSel;.     
ada0: 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
adb0: 3b 0a 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20  ;..      pSel = 
adc0: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 3b 0a  pExpr->pSelect;.
add0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
ade0: 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
adf0: 74 2c 20 30 2c 20 2b 2b 70 50 61 72 73 65 2d 3e  t, 0, ++pParse->
ae00: 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 69 66 28  nMem);.      if(
ae10: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
ae20: 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20  ELECT ){.       
ae30: 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52   dest.eDest = SR
ae40: 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 73  T_Mem;.        s
ae50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
ae60: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
ae70: 64 65 73 74 2e 69 50 61 72 6d 29 3b 0a 20 20 20  dest.iParm);.   
ae80: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
ae90: 28 28 76 2c 20 22 49 6e 69 74 20 73 75 62 71 75  ((v, "Init subqu
aea0: 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20  ery result"));. 
aeb0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
aec0: 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d      dest.eDest =
aed0: 20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20   SRT_Exists;.   
aee0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
aef0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
af00: 65 67 65 72 2c 20 30 2c 20 64 65 73 74 2e 69 50  eger, 0, dest.iP
af10: 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64  arm);.        Vd
af20: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49  beComment((v, "I
af30: 6e 69 74 20 45 58 49 53 54 53 20 72 65 73 75 6c  nit EXISTS resul
af40: 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t"));.      }.  
af50: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
af60: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
af70: 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b  , pSel->pLimit);
af80: 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69  .      pSel->pLi
af90: 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78  mit = sqlite3PEx
afa0: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e  pr(pParse, TK_IN
afb0: 54 45 47 45 52 2c 20 30 2c 20 30 2c 20 26 6f 6e  TEGER, 0, 0, &on
afc0: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  e);.      if( sq
afd0: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
afe0: 73 65 2c 20 70 53 65 6c 2c 20 26 64 65 73 74 29  se, pSel, &dest)
aff0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
b000: 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
b010: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
b020: 20 3d 20 64 65 73 74 2e 69 50 61 72 6d 3b 0a 20   = dest.iParm;. 
b030: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b040: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 74 65 73  }.  }..  if( tes
b050: 74 41 64 64 72 20 29 7b 0a 20 20 20 20 73 71 6c  tAddr ){.    sql
b060: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
b070: 28 76 2c 20 74 65 73 74 41 64 64 72 2d 31 29 3b  (v, testAddr-1);
b080: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 3b 0a  .  }..  return;.
b090: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
b0a0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
b0b0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 75 70 6c 69   */../*.** Dupli
b0c0: 63 61 74 65 20 61 6e 20 38 2d 62 79 74 65 20 76  cate an 8-byte v
b0d0: 61 6c 75 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63  alue.*/.static c
b0e0: 68 61 72 20 2a 64 75 70 38 62 79 74 65 73 28 56  har *dup8bytes(V
b0f0: 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68  dbe *v, const ch
b100: 61 72 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20  ar *in){.  char 
b110: 2a 6f 75 74 20 3d 20 73 71 6c 69 74 65 33 44 62  *out = sqlite3Db
b120: 4d 61 6c 6c 6f 63 52 61 77 28 73 71 6c 69 74 65  MallocRaw(sqlite
b130: 33 56 64 62 65 44 62 28 76 29 2c 20 38 29 3b 0a  3VdbeDb(v), 8);.
b140: 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20    if( out ){.   
b150: 20 6d 65 6d 63 70 79 28 6f 75 74 2c 20 69 6e 2c   memcpy(out, in,
b160: 20 38 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   8);.  }.  retur
b170: 6e 20 6f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n out;.}../*.** 
b180: 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74  Generate an inst
b190: 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  ruction that wil
b1a0: 6c 20 70 75 74 20 74 68 65 20 66 6c 6f 61 74 69  l put the floati
b1b0: 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75  ng point.** valu
b1c0: 65 20 64 65 73 63 72 69 62 65 64 20 62 79 20 7a  e described by z
b1d0: 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65  [0..n-1] into re
b1e0: 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a  gister iMem..**.
b1f0: 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e  ** The z[] strin
b200: 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20  g will probably 
b210: 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d  not be zero-term
b220: 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68 65  inated.  But the
b230: 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63   .** z[n] charac
b240: 74 65 72 20 69 73 20 67 75 61 72 61 6e 74 65 65  ter is guarantee
b250: 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e  d to be somethin
b260: 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  g that does not 
b270: 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65  look.** like the
b280: 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66   continuation of
b290: 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a   the number..*/.
b2a0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
b2b0: 52 65 61 6c 28 56 64 62 65 20 2a 76 2c 20 63 6f  Real(Vdbe *v, co
b2c0: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
b2d0: 20 6e 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c   n, int negateFl
b2e0: 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20  ag, int iMem){. 
b2f0: 20 61 73 73 65 72 74 28 20 7a 20 7c 7c 20 76 3d   assert( z || v=
b300: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62  =0 || sqlite3Vdb
b310: 65 44 62 28 76 29 2d 3e 6d 61 6c 6c 6f 63 46 61  eDb(v)->mallocFa
b320: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 7a 20  iled );.  if( z 
b330: 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61  ){.    double va
b340: 6c 75 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lue;.    char *z
b350: 56 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  V;.    assert( !
b360: 69 73 64 69 67 69 74 28 7a 5b 6e 5d 29 20 29 3b  isdigit(z[n]) );
b370: 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46  .    sqlite3AtoF
b380: 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20 20  (z, &value);.   
b390: 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 4e 61   if( sqlite3IsNa
b3a0: 4e 28 76 61 6c 75 65 29 20 29 7b 0a 20 20 20 20  N(value) ){.    
b3b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b3c0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
b3d0: 30 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 7d 65  0, iMem);.    }e
b3e0: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  lse{.      if( n
b3f0: 65 67 61 74 65 46 6c 61 67 20 29 20 76 61 6c 75  egateFlag ) valu
b400: 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20  e = -value;.    
b410: 20 20 7a 56 20 3d 20 64 75 70 38 62 79 74 65 73    zV = dup8bytes
b420: 28 76 2c 20 28 63 68 61 72 2a 29 26 76 61 6c 75  (v, (char*)&valu
b430: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
b440: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
b450: 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c  P_Real, 0, iMem,
b460: 20 30 2c 20 7a 56 2c 20 50 34 5f 52 45 41 4c 29   0, zV, P4_REAL)
b470: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a  ;.    }.  }.}...
b480: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
b490: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
b4a0: 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20  at will put the 
b4b0: 69 6e 74 65 67 65 72 20 64 65 73 63 72 69 62 65  integer describe
b4c0: 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e   by.** text z[0.
b4d0: 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73  .n-1] into regis
b4e0: 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20  ter iMem..**.** 
b4f0: 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77  The z[] string w
b500: 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74  ill probably not
b510: 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61   be zero-termina
b520: 74 65 64 2e 20 20 42 75 74 20 74 68 65 20 0a 2a  ted.  But the .*
b530: 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65 72  * z[n] character
b540: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
b550: 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 20 74  o be something t
b560: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f  hat does not loo
b570: 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f  k.** like the co
b580: 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68  ntinuation of th
b590: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61  e number..*/.sta
b5a0: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74  tic void codeInt
b5b0: 65 67 65 72 28 56 64 62 65 20 2a 76 2c 20 45 78  eger(Vdbe *v, Ex
b5c0: 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 6e  pr *pExpr, int n
b5d0: 65 67 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d  egFlag, int iMem
b5e0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
b5f0: 2a 7a 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  *z;.  if( pExpr-
b600: 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56  >flags & EP_IntV
b610: 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  alue ){.    int 
b620: 69 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  i = pExpr->iTabl
b630: 65 3b 0a 20 20 20 20 69 66 28 20 6e 65 67 46 6c  e;.    if( negFl
b640: 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20  ag ) i = -i;.   
b650: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b660: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
b670: 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 65  , i, iMem);.  }e
b680: 6c 73 65 20 69 66 28 20 28 7a 20 3d 20 28 63 68  lse if( (z = (ch
b690: 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  ar*)pExpr->token
b6a0: 2e 7a 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  .z)!=0 ){.    in
b6b0: 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  t i;.    int n =
b6c0: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b   pExpr->token.n;
b6d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
b6e0: 64 69 67 69 74 28 7a 5b 6e 5d 29 20 29 3b 0a 20  digit(z[n]) );. 
b6f0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 65     if( sqlite3Ge
b700: 74 49 6e 74 33 32 28 7a 2c 20 26 69 29 20 29 7b  tInt32(z, &i) ){
b710: 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c  .      if( negFl
b720: 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20  ag ) i = -i;.   
b730: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b740: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
b750: 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20  er, i, iMem);.  
b760: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
b770: 74 65 33 46 69 74 73 49 6e 36 34 42 69 74 73 28  te3FitsIn64Bits(
b780: 7a 2c 20 6e 65 67 46 6c 61 67 29 20 29 7b 0a 20  z, negFlag) ){. 
b790: 20 20 20 20 20 69 36 34 20 76 61 6c 75 65 3b 0a       i64 value;.
b7a0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a        char *zV;.
b7b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f        sqlite3Ato
b7c0: 69 36 34 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a  i64(z, &value);.
b7d0: 20 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61        if( negFla
b7e0: 67 20 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c  g ) value = -val
b7f0: 75 65 3b 0a 20 20 20 20 20 20 7a 56 20 3d 20 64  ue;.      zV = d
b800: 75 70 38 62 79 74 65 73 28 76 2c 20 28 63 68 61  up8bytes(v, (cha
b810: 72 2a 29 26 76 61 6c 75 65 29 3b 0a 20 20 20 20  r*)&value);.    
b820: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b830: 4f 70 34 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c  Op4(v, OP_Int64,
b840: 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c   0, iMem, 0, zV,
b850: 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20   P4_INT64);.    
b860: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 64  }else{.      cod
b870: 65 52 65 61 6c 28 76 2c 20 7a 2c 20 6e 2c 20 6e  eReal(v, z, n, n
b880: 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 20  egFlag, iMem);. 
b890: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a     }.  }.}.../*.
b8a0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
b8b0: 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61   that will extra
b8c0: 63 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74  ct the iColumn-t
b8d0: 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a  h column from.**
b8e0: 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20   table pTab and 
b8f0: 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e  store the column
b900: 20 76 61 6c 75 65 20 69 6e 20 61 20 72 65 67 69   value in a regi
b910: 73 74 65 72 2e 20 20 41 6e 20 65 66 66 6f 72 74  ster.  An effort
b920: 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 73  .** is made to s
b930: 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  tore the column 
b940: 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
b950: 72 20 69 52 65 67 2c 20 62 75 74 20 74 68 69 73  r iReg, but this
b960: 20 69 73 0a 2a 2a 20 6e 6f 74 20 67 75 61 72 61   is.** not guara
b970: 6e 74 65 65 64 2e 20 20 54 68 65 20 6c 6f 63 61  nteed.  The loca
b980: 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6c 75  tion of the colu
b990: 6d 6e 20 76 61 6c 75 65 20 69 73 20 72 65 74 75  mn value is retu
b9a0: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  rned..**.** Ther
b9b0: 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65  e must be an ope
b9c0: 6e 20 63 75 72 73 6f 72 20 74 6f 20 70 54 61 62  n cursor to pTab
b9d0: 20 69 6e 20 69 54 61 62 6c 65 20 77 68 65 6e 20   in iTable when 
b9e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
b9f0: 69 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 69  is called.  If i
ba00: 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f  Column<0 then co
ba10: 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  de is generated 
ba20: 74 68 61 74 20 65 78 74 72 61 63 74 73 20 74 68  that extracts th
ba30: 65 20 72 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 54  e rowid..**.** T
ba40: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
ba50: 74 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 75  t attempt to reu
ba60: 73 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  se the value of 
ba70: 74 68 65 20 63 6f 6c 75 6d 6e 20 74 68 61 74 0a  the column that.
ba80: 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ** has already b
ba90: 65 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20  een loaded into 
baa0: 61 20 72 65 67 69 73 74 65 72 2e 20 20 54 68 65  a register.  The
bab0: 20 76 61 6c 75 65 20 77 69 6c 6c 20 61 6c 77 61   value will alwa
bac0: 79 73 0a 2a 2a 20 62 65 20 75 73 65 64 20 69 66  ys.** be used if
bad0: 20 69 74 20 68 61 73 20 6e 6f 74 20 75 6e 64 65   it has not unde
bae0: 72 67 6f 6e 65 20 61 6e 79 20 61 66 66 69 6e 69  rgone any affini
baf0: 74 79 20 63 68 61 6e 67 65 73 2e 20 20 42 75 74  ty changes.  But
bb00: 20 69 66 0a 2a 2a 20 61 6e 20 61 66 66 69 6e 69   if.** an affini
bb10: 74 79 20 63 68 61 6e 67 65 20 68 61 73 20 6f 63  ty change has oc
bb20: 63 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65  curred, then the
bb30: 20 63 61 63 68 65 64 20 76 61 6c 75 65 20 77 69   cached value wi
bb40: 6c 6c 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 75 73  ll only be.** us
bb50: 65 64 20 69 66 20 61 6c 6c 6f 77 41 66 66 43 68  ed if allowAffCh
bb60: 6e 67 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 69  ng is true..*/.i
bb70: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
bb80: 64 65 47 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50  deGetColumn(.  P
bb90: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
bba0: 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
bbb0: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
bbc0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c  ontext */.  Tabl
bbd0: 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20  e *pTab,     /* 
bbe0: 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  Description of t
bbf0: 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20  he table we are 
bc00: 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a  reading from */.
bc10: 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20    int iColumn,  
bc20: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
bc30: 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20  he table column 
bc40: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
bc50: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
bc60: 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
bc70: 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  the table */.  i
bc80: 6e 74 20 69 52 65 67 2c 20 20 20 20 20 20 20 20  nt iReg,        
bc90: 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73  /* Store results
bca0: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 61   here */.  int a
bcb0: 6c 6c 6f 77 41 66 66 43 68 6e 67 20 2f 2a 20 54  llowAffChng /* T
bcc0: 72 75 65 20 69 66 20 70 72 69 6f 72 20 61 66 66  rue if prior aff
bcd0: 69 6e 69 74 79 20 63 68 61 6e 67 65 73 20 61 72  inity changes ar
bce0: 65 20 4f 4b 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  e OK */.){.  Vdb
bcf0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
bd00: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
bd10: 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
bd20: 65 20 2a 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  e *p;..  for(i=0
bd30: 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
bd40: 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73 65 2d  Cache; i<pParse-
bd50: 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c  >nColCache; i++,
bd60: 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   p++){.    if( p
bd70: 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65  ->iTable==iTable
bd80: 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d   && p->iColumn==
bd90: 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20  iColumn.        
bda0: 20 20 20 26 26 20 28 21 70 2d 3e 61 66 66 43 68     && (!p->affCh
bdb0: 61 6e 67 65 20 7c 7c 20 61 6c 6c 6f 77 41 66 66  ange || allowAff
bdc0: 43 68 6e 67 29 20 29 7b 0a 23 69 66 20 30 0a 20  Chng) ){.#if 0. 
bdd0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bde0: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4e 6f 6f  AddOp0(v, OP_Noo
bdf0: 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  p);.      VdbeCo
be00: 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 50 54 3a 20  mment((v, "OPT: 
be10: 74 61 62 25 64 2e 63 6f 6c 25 64 20 2d 3e 20 72  tab%d.col%d -> r
be20: 25 64 22 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f  %d", iTable, iCo
be30: 6c 75 6d 6e 2c 20 70 2d 3e 69 52 65 67 29 29 3b  lumn, p->iReg));
be40: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65  .#endif.      re
be50: 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b 0a 20 20  turn p->iReg;.  
be60: 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61 73 73 65    }.  }  .  asse
be70: 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 69 66  rt( v!=0 );.  if
be80: 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ( iColumn<0 ){. 
be90: 20 20 20 69 6e 74 20 6f 70 20 3d 20 28 70 54 61     int op = (pTa
bea0: 62 20 26 26 20 49 73 56 69 72 74 75 61 6c 28 70  b && IsVirtual(p
beb0: 54 61 62 29 29 20 3f 20 4f 50 5f 56 52 6f 77 69  Tab)) ? OP_VRowi
bec0: 64 20 3a 20 4f 50 5f 52 6f 77 69 64 3b 0a 20 20  d : OP_Rowid;.  
bed0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bee0: 4f 70 32 28 76 2c 20 6f 70 2c 20 69 54 61 62 6c  Op2(v, op, iTabl
bef0: 65 2c 20 69 52 65 67 29 3b 0a 20 20 7d 65 6c 73  e, iReg);.  }els
bf00: 65 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b  e if( pTab==0 ){
bf10: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
bf20: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
bf30: 75 6d 6e 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f  umn, iTable, iCo
bf40: 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 7d  lumn, iReg);.  }
bf50: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70  else{.    int op
bf60: 20 3d 20 49 73 56 69 72 74 75 61 6c 28 70 54 61   = IsVirtual(pTa
bf70: 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20  b) ? OP_VColumn 
bf80: 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20  : OP_Column;.   
bf90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bfa0: 70 33 28 76 2c 20 6f 70 2c 20 69 54 61 62 6c 65  p3(v, op, iTable
bfb0: 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29  , iColumn, iReg)
bfc0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c  ;.    sqlite3Col
bfd0: 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54  umnDefault(v, pT
bfe0: 61 62 2c 20 69 43 6f 6c 75 6d 6e 29 3b 0a 23 69  ab, iColumn);.#i
bff0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
c000: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
c010: 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 61  .    if( pTab->a
c020: 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66  Col[iColumn].aff
c030: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
c040: 46 5f 52 45 41 4c 20 29 7b 0a 20 20 20 20 20 20  F_REAL ){.      
c050: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c060: 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69  1(v, OP_RealAffi
c070: 6e 69 74 79 2c 20 69 52 65 67 29 3b 0a 20 20 20  nity, iReg);.   
c080: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
c090: 69 66 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61  if( pParse->disa
c0a0: 62 6c 65 43 6f 6c 43 61 63 68 65 3d 3d 30 20 29  bleColCache==0 )
c0b0: 7b 0a 20 20 20 20 69 20 3d 20 70 50 61 72 73 65  {.    i = pParse
c0c0: 2d 3e 69 43 6f 6c 43 61 63 68 65 3b 0a 20 20 20  ->iColCache;.   
c0d0: 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43   p = &pParse->aC
c0e0: 6f 6c 43 61 63 68 65 5b 69 5d 3b 0a 20 20 20 20  olCache[i];.    
c0f0: 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  p->iTable = iTab
c100: 6c 65 3b 0a 20 20 20 20 70 2d 3e 69 43 6f 6c 75  le;.    p->iColu
c110: 6d 6e 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20  mn = iColumn;.  
c120: 20 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67    p->iReg = iReg
c130: 3b 0a 20 20 20 20 70 2d 3e 61 66 66 43 68 61 6e  ;.    p->affChan
c140: 67 65 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b  ge = 0;.    i++;
c150: 0a 20 20 20 20 69 66 28 20 69 3e 3d 41 72 72 61  .    if( i>=Arra
c160: 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 43  ySize(pParse->aC
c170: 6f 6c 43 61 63 68 65 29 20 29 20 69 20 3d 20 30  olCache) ) i = 0
c180: 3b 0a 20 20 20 20 69 66 28 20 69 3e 70 50 61 72  ;.    if( i>pPar
c190: 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 29 20  se->nColCache ) 
c1a0: 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
c1b0: 65 20 3d 20 69 3b 0a 20 20 20 20 70 50 61 72 73  e = i;.    pPars
c1c0: 65 2d 3e 69 43 6f 6c 43 61 63 68 65 20 3d 20 69  e->iColCache = i
c1d0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
c1e0: 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  Reg;.}../*.** Cl
c1f0: 65 61 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63  ear all column c
c200: 61 63 68 65 20 65 6e 74 72 69 65 73 20 61 73 73  ache entries ass
c210: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
c220: 20 76 64 62 65 0a 2a 2a 20 63 75 72 73 6f 72 20   vdbe.** cursor 
c230: 77 69 74 68 20 63 75 72 73 6f 72 20 6e 75 6d 62  with cursor numb
c240: 65 72 20 69 54 61 62 6c 65 2e 0a 2a 2f 0a 76 6f  er iTable..*/.vo
c250: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6c  id sqlite3ExprCl
c260: 65 61 72 43 6f 6c 75 6d 6e 43 61 63 68 65 28 50  earColumnCache(P
c270: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
c280: 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 69 66 28  t iTable){.  if(
c290: 20 69 54 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20   iTable<0 ){.   
c2a0: 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63   pParse->nColCac
c2b0: 68 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 72  he = 0;.    pPar
c2c0: 73 65 2d 3e 69 43 6f 6c 43 61 63 68 65 20 3d 20  se->iColCache = 
c2d0: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
c2e0: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
c2f0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43  =0; i<pParse->nC
c300: 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b 0a 20  olCache; i++){. 
c310: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
c320: 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 54  >aColCache[i].iT
c330: 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a  able==iTable ){.
c340: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
c350: 28 20 69 3d 3d 70 50 61 72 73 65 2d 3e 6e 43 6f  ( i==pParse->nCo
c360: 6c 43 61 63 68 65 2d 31 20 29 3b 0a 20 20 20 20  lCache-1 );.    
c370: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c      pParse->aCol
c380: 43 61 63 68 65 5b 69 5d 20 3d 20 70 50 61 72 73  Cache[i] = pPars
c390: 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 2d 2d 70  e->aColCache[--p
c3a0: 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65  Parse->nColCache
c3b0: 5d 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  ];.        pPars
c3c0: 65 2d 3e 69 43 6f 6c 43 61 63 68 65 20 3d 20 70  e->iColCache = p
c3d0: 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65  Parse->nColCache
c3e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c3f0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63    }.}../*.** Rec
c400: 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
c410: 74 20 61 6e 20 61 66 66 69 6e 69 74 79 20 63 68  t an affinity ch
c420: 61 6e 67 65 20 68 61 73 20 6f 63 63 75 72 72 65  ange has occurre
c430: 64 20 6f 6e 20 69 43 6f 75 6e 74 0a 2a 2a 20 72  d on iCount.** r
c440: 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
c450: 67 20 77 69 74 68 20 69 53 74 61 72 74 2e 0a 2a  g with iStart..*
c460: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
c470: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
c480: 68 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61  hange(Parse *pPa
c490: 72 73 65 2c 20 69 6e 74 20 69 53 74 61 72 74 2c  rse, int iStart,
c4a0: 20 69 6e 74 20 69 43 6f 75 6e 74 29 7b 0a 20 20   int iCount){.  
c4b0: 69 6e 74 20 69 45 6e 64 20 3d 20 69 53 74 61 72  int iEnd = iStar
c4c0: 74 20 2b 20 69 43 6f 75 6e 74 20 2d 20 31 3b 0a  t + iCount - 1;.
c4d0: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
c4e0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43  =0; i<pParse->nC
c4f0: 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b 0a 20  olCache; i++){. 
c500: 20 20 20 69 6e 74 20 72 20 3d 20 70 50 61 72 73     int r = pPars
c510: 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e  e->aColCache[i].
c520: 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72 3e  iReg;.    if( r>
c530: 3d 69 53 74 61 72 74 20 26 26 20 72 3c 3d 69 45  =iStart && r<=iE
c540: 6e 64 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  nd ){.      pPar
c550: 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d  se->aColCache[i]
c560: 2e 61 66 66 43 68 61 6e 67 65 20 3d 20 31 3b 0a  .affChange = 1;.
c570: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
c580: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
c590: 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74   to move content
c5a0: 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20   from registers 
c5b0: 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52  iFrom...iFrom+nR
c5c0: 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20  eg-1.** over to 
c5d0: 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e  iTo..iTo+nReg-1.
c5e0: 20 4b 65 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e   Keep the column
c5f0: 20 63 61 63 68 65 20 75 70 2d 74 6f 2d 64 61 74   cache up-to-dat
c600: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
c610: 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 50  e3ExprCodeMove(P
c620: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
c630: 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f  t iFrom, int iTo
c640: 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69  , int nReg){.  i
c650: 6e 74 20 69 3b 0a 20 20 69 66 28 20 69 46 72 6f  nt i;.  if( iFro
c660: 6d 3d 3d 69 54 6f 20 29 20 72 65 74 75 72 6e 3b  m==iTo ) return;
c670: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
c680: 64 4f 70 33 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp3(pParse->pVd
c690: 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72  be, OP_Move, iFr
c6a0: 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a  om, iTo, nReg);.
c6b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
c6c0: 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20  rse->nColCache; 
c6d0: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 78 20  i++){.    int x 
c6e0: 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  = pParse->aColCa
c6f0: 63 68 65 5b 69 5d 2e 69 52 65 67 3b 0a 20 20 20  che[i].iReg;.   
c700: 20 69 66 28 20 78 3e 3d 69 46 72 6f 6d 20 26 26   if( x>=iFrom &&
c710: 20 78 3c 69 46 72 6f 6d 2b 6e 52 65 67 20 29 7b   x<iFrom+nReg ){
c720: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61  .      pParse->a
c730: 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67  ColCache[i].iReg
c740: 20 2b 3d 20 69 54 6f 2d 69 46 72 6f 6d 3b 0a 20   += iTo-iFrom;. 
c750: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
c760: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
c770: 74 6f 20 63 6f 70 79 20 63 6f 6e 74 65 6e 74 20  to copy content 
c780: 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20 69  from registers i
c790: 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65  From...iFrom+nRe
c7a0: 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69  g-1.** over to i
c7b0: 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 0a  To..iTo+nReg-1..
c7c0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
c7d0: 78 70 72 43 6f 64 65 43 6f 70 79 28 50 61 72 73  xprCodeCopy(Pars
c7e0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
c7f0: 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69  From, int iTo, i
c800: 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt nReg){.  int 
c810: 69 3b 0a 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d  i;.  if( iFrom==
c820: 69 54 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  iTo ) return;.  
c830: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 67 3b  for(i=0; i<nReg;
c840: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
c850: 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61  e3VdbeAddOp2(pPa
c860: 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43  rse->pVdbe, OP_C
c870: 6f 70 79 2c 20 69 46 72 6f 6d 2b 69 2c 20 69 54  opy, iFrom+i, iT
c880: 6f 2b 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  o+i);.  }.}../*.
c890: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
c8a0: 66 20 61 6e 79 20 72 65 67 69 73 74 65 72 20 69  f any register i
c8b0: 6e 20 74 68 65 20 72 61 6e 67 65 20 69 46 72 6f  n the range iFro
c8c0: 6d 2e 2e 69 54 6f 20 28 69 6e 63 6c 75 73 69 76  m..iTo (inclusiv
c8d0: 65 29 0a 2a 2a 20 69 73 20 75 73 65 64 20 61 73  e).** is used as
c8e0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6c   part of the col
c8f0: 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 73 74  umn cache..*/.st
c900: 61 74 69 63 20 69 6e 74 20 75 73 65 64 41 73 43  atic int usedAsC
c910: 6f 6c 75 6d 6e 43 61 63 68 65 28 50 61 72 73 65  olumnCache(Parse
c920: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46   *pParse, int iF
c930: 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20  rom, int iTo){. 
c940: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
c950: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f  0; i<pParse->nCo
c960: 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b 0a 20 20  lCache; i++){.  
c970: 20 20 69 6e 74 20 72 20 3d 20 70 50 61 72 73 65    int r = pParse
c980: 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69  ->aColCache[i].i
c990: 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d  Reg;.    if( r>=
c9a0: 69 46 72 6f 6d 20 26 26 20 72 3c 3d 69 54 6f 20  iFrom && r<=iTo 
c9b0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
c9c0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
c9d0: 2a 0a 2a 2a 20 54 68 65 72 65 73 20 69 73 20 61  *.** Theres is a
c9e0: 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
c9f0: 65 72 20 69 43 75 72 72 65 6e 74 2e 20 20 57 65  er iCurrent.  We
ca00: 20 75 6c 74 69 6d 61 74 65 6c 79 20 77 61 6e 74   ultimately want
ca10: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 74 6f  .** the value to
ca20: 20 62 65 20 69 6e 20 72 65 67 69 73 74 65 72 20   be in register 
ca30: 69 54 61 72 67 65 74 2e 20 20 49 74 20 6d 69 67  iTarget.  It mig
ca40: 68 74 20 62 65 20 74 68 61 74 0a 2a 2a 20 69 43  ht be that.** iC
ca50: 75 72 72 65 6e 74 20 61 6e 64 20 69 54 61 72 67  urrent and iTarg
ca60: 65 74 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  et are the same 
ca70: 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  register..**.** 
ca80: 57 65 20 61 72 65 20 67 6f 69 6e 67 20 74 6f 20  We are going to 
ca90: 6d 6f 64 69 66 79 20 74 68 65 20 76 61 6c 75 65  modify the value
caa0: 2c 20 73 6f 20 77 65 20 6e 65 65 64 20 74 6f 20  , so we need to 
cab0: 6d 61 6b 65 20 73 75 72 65 20 69 74 0a 2a 2a 20  make sure it.** 
cac0: 69 73 20 6e 6f 74 20 61 20 63 61 63 68 65 64 20  is not a cached 
cad0: 72 65 67 69 73 74 65 72 2e 20 20 49 66 20 69 43  register.  If iC
cae0: 75 72 72 65 6e 74 20 69 73 20 61 20 63 61 63 68  urrent is a cach
caf0: 65 64 20 72 65 67 69 73 74 65 72 2c 0a 2a 2a 20  ed register,.** 
cb00: 74 68 65 6e 20 74 72 79 20 74 6f 20 6d 6f 76 65  then try to move
cb10: 20 74 68 65 20 76 61 6c 75 65 20 6f 76 65 72 20   the value over 
cb20: 74 6f 20 69 54 61 72 67 65 74 2e 20 20 49 66 20  to iTarget.  If 
cb30: 69 54 61 72 67 65 74 20 69 73 20 61 0a 2a 2a 20  iTarget is a.** 
cb40: 63 61 63 68 65 64 20 72 65 67 69 73 74 65 72 2c  cached register,
cb50: 20 74 68 65 6e 20 63 6c 65 61 72 20 74 68 65 20   then clear the 
cb60: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 61  corresponding ca
cb70: 63 68 65 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20  che line..**.** 
cb80: 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73  Return the regis
cb90: 74 65 72 20 74 68 61 74 20 74 68 65 20 76 61 6c  ter that the val
cba0: 75 65 20 65 6e 64 73 20 75 70 20 69 6e 2e 0a 2a  ue ends up in..*
cbb0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
cbc0: 72 57 72 69 74 61 62 6c 65 52 65 67 69 73 74 65  rWritableRegiste
cbd0: 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
cbe0: 20 69 6e 74 20 69 43 75 72 72 65 6e 74 2c 20 69   int iCurrent, i
cbf0: 6e 74 20 69 54 61 72 67 65 74 29 7b 0a 20 20 69  nt iTarget){.  i
cc00: 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
cc10: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21 3d 30  pParse->pVdbe!=0
cc20: 20 29 3b 0a 20 20 69 66 28 20 21 75 73 65 64 41   );.  if( !usedA
cc30: 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61  sColumnCache(pPa
cc40: 72 73 65 2c 20 69 43 75 72 72 65 6e 74 2c 20 69  rse, iCurrent, i
cc50: 43 75 72 72 65 6e 74 29 20 29 7b 0a 20 20 20 20  Current) ){.    
cc60: 72 65 74 75 72 6e 20 69 43 75 72 72 65 6e 74 3b  return iCurrent;
cc70: 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 75 72 72  .  }.  if( iCurr
cc80: 65 6e 74 21 3d 69 54 61 72 67 65 74 20 29 7b 0a  ent!=iTarget ){.
cc90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
cca0: 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56  ddOp2(pParse->pV
ccb0: 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69  dbe, OP_SCopy, i
ccc0: 43 75 72 72 65 6e 74 2c 20 69 54 61 72 67 65 74  Current, iTarget
ccd0: 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
cce0: 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  ; i<pParse->nCol
ccf0: 43 61 63 68 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  Cache; i++){.   
cd00: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 43 6f   if( pParse->aCo
cd10: 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67 3d 3d  lCache[i].iReg==
cd20: 69 54 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20  iTarget ){.     
cd30: 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63   pParse->aColCac
cd40: 68 65 5b 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e  he[i] = pParse->
cd50: 61 43 6f 6c 43 61 63 68 65 5b 2d 2d 70 50 61 72  aColCache[--pPar
cd60: 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 5d 3b 0a  se->nColCache];.
cd70: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69 43        pParse->iC
cd80: 6f 6c 43 61 63 68 65 20 3d 20 70 50 61 72 73 65  olCache = pParse
cd90: 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 0a 20 20 20  ->nColCache;.   
cda0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
cdb0: 69 54 61 72 67 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  iTarget;.}../*.*
cdc0: 2a 20 49 66 20 74 68 65 20 6c 61 73 74 20 69 6e  * If the last in
cdd0: 73 74 72 75 63 74 69 6f 6e 20 63 6f 64 65 64 20  struction coded 
cde0: 69 73 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  is an ephemeral 
cdf0: 63 6f 70 79 20 6f 66 20 61 6e 79 20 6f 66 0a 2a  copy of any of.*
ce00: 2a 20 74 68 65 20 72 65 67 69 73 74 65 72 73 20  * the registers 
ce10: 69 6e 20 74 68 65 20 6e 52 65 67 20 72 65 67 69  in the nReg regi
ce20: 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20  sters beginning 
ce30: 77 69 74 68 20 69 52 65 67 2c 20 74 68 65 6e 0a  with iReg, then.
ce40: 2a 2a 20 63 6f 6e 76 65 72 74 20 74 68 65 20 6c  ** convert the l
ce50: 61 73 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ast instruction 
ce60: 66 72 6f 6d 20 4f 50 5f 53 43 6f 70 79 20 74 6f  from OP_SCopy to
ce70: 20 4f 50 5f 43 6f 70 79 2e 0a 2a 2f 0a 76 6f 69   OP_Copy..*/.voi
ce80: 64 20 73 71 6c 69 74 65 33 45 78 70 72 48 61 72  d sqlite3ExprHar
ce90: 64 43 6f 70 79 28 50 61 72 73 65 20 2a 70 50 61  dCopy(Parse *pPa
cea0: 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69  rse, int iReg, i
ceb0: 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt nReg){.  int 
cec0: 61 64 64 72 3b 0a 20 20 56 64 62 65 4f 70 20 2a  addr;.  VdbeOp *
ced0: 70 4f 70 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  pOp;.  Vdbe *v;.
cee0: 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
cef0: 56 64 62 65 3b 0a 20 20 61 64 64 72 20 3d 20 73  Vdbe;.  addr = s
cf00: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
cf10: 74 41 64 64 72 28 76 29 3b 0a 20 20 70 4f 70 20  tAddr(v);.  pOp 
cf20: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
cf30: 4f 70 28 76 2c 20 61 64 64 72 2d 31 29 3b 0a 20  Op(v, addr-1);. 
cf40: 20 61 73 73 65 72 74 28 20 70 4f 70 20 7c 7c 20   assert( pOp || 
cf50: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
cf60: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
cf70: 28 20 70 4f 70 20 26 26 20 70 4f 70 2d 3e 6f 70  ( pOp && pOp->op
cf80: 63 6f 64 65 3d 3d 4f 50 5f 53 43 6f 70 79 20 26  code==OP_SCopy &
cf90: 26 20 70 4f 70 2d 3e 70 31 3e 3d 69 52 65 67 20  & pOp->p1>=iReg 
cfa0: 26 26 20 70 4f 70 2d 3e 70 31 3c 69 52 65 67 2b  && pOp->p1<iReg+
cfb0: 6e 52 65 67 20 29 7b 0a 20 20 20 20 70 4f 70 2d  nReg ){.    pOp-
cfc0: 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 43 6f 70  >opcode = OP_Cop
cfd0: 79 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  y;.  }.}../*.** 
cfe0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
cff0: 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 56  to the current V
d000: 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  dbe to evaluate 
d010: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70  the given.** exp
d020: 72 65 73 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70  ression.  Attemp
d030: 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72  t to store the r
d040: 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74  esults in regist
d050: 65 72 20 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20  er "target"..** 
d060: 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73  Return the regis
d070: 74 65 72 20 77 68 65 72 65 20 72 65 73 75 6c 74  ter where result
d080: 73 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a  s are stored..**
d090: 0a 2a 2a 20 57 69 74 68 20 74 68 69 73 20 72 6f  .** With this ro
d0a0: 75 74 69 6e 65 2c 20 74 68 65 72 65 20 69 73 20  utine, there is 
d0b0: 6e 6f 20 67 75 61 72 61 6e 74 65 65 64 20 74 68  no guaranteed th
d0c0: 61 74 20 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a  at results will.
d0d0: 2a 2a 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ** be stored in 
d0e0: 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73  target.  The res
d0f0: 75 6c 74 20 6d 69 67 68 74 20 62 65 20 73 74 6f  ult might be sto
d100: 72 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65  red in some othe
d110: 72 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69 66  r.** register if
d120: 20 69 74 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e   it is convenien
d130: 74 20 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65  t to do so.  The
d140: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
d150: 6e 0a 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b 20  n.** must check 
d160: 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
d170: 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 72 65 73  and move the res
d180: 75 6c 74 73 20 74 6f 20 74 68 65 20 64 65 73 69  ults to the desi
d190: 72 65 64 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e  red.** register.
d1a0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
d1b0: 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 50 61  xprCodeTarget(Pa
d1c0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
d1d0: 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
d1e0: 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76  rget){.  Vdbe *v
d1f0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
d200: 3b 20 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64  ;  /* The VM und
d210: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
d220: 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20  */.  int op;    
d230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d240: 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 62 65 69  * The opcode bei
d250: 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  ng coded */.  in
d260: 74 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74  t inReg = target
d270: 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c  ;       /* Resul
d280: 74 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67  ts stored in reg
d290: 69 73 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20  ister inReg */. 
d2a0: 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
d2b0: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  0;         /* If
d2c0: 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74   non-zero free t
d2d0: 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65  his temporary re
d2e0: 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
d2f0: 72 65 67 46 72 65 65 32 20 3d 20 30 3b 20 20 20  regFree2 = 0;   
d300: 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d        /* If non-
d310: 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20 74  zero free this t
d320: 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
d330: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72  r */.  int r1, r
d340: 32 2c 20 72 33 2c 20 72 34 3b 20 20 20 20 20 20  2, r3, r4;      
d350: 20 2f 2a 20 56 61 72 69 6f 75 73 20 72 65 67 69   /* Various regi
d360: 73 74 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a  ster numbers */.
d370: 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
d380: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
d390: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
d3a0: 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e   assert( target>
d3b0: 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61  0 && target<=pPa
d3c0: 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69  rse->nMem );.  i
d3d0: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
d3e0: 20 30 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72   0;..  if( pExpr
d3f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20  ==0 ){.    op = 
d400: 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65  TK_NULL;.  }else
d410: 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72  {.    op = pExpr
d420: 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74  ->op;.  }.  swit
d430: 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
d440: 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
d450: 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66  : {.      AggInf
d460: 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45  o *pAggInfo = pE
d470: 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20  xpr->pAggInfo;. 
d480: 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
d490: 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20  nfo_col *pCol = 
d4a0: 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  &pAggInfo->aCol[
d4b0: 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20  pExpr->iAgg];.  
d4c0: 20 20 20 20 69 66 28 20 21 70 41 67 67 49 6e 66      if( !pAggInf
d4d0: 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b  o->directMode ){
d4e0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
d4f0: 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b   pCol->iMem>0 );
d500: 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d  .        inReg =
d510: 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20   pCol->iMem;.   
d520: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d530: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67    }else if( pAgg
d540: 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67  Info->useSorting
d550: 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Idx ){.        s
d560: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
d570: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70  (v, OP_Column, p
d580: 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67  AggInfo->sorting
d590: 49 64 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Idx,.           
d5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5b0: 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
d5c0: 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b  Column, target);
d5d0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
d5e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
d5f0: 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c   Otherwise, fall
d600: 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54   thru into the T
d610: 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f  K_COLUMN case */
d620: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
d630: 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
d640: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
d650: 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20 20  able<0 ){.      
d660: 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68    /* This only h
d670: 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 64 69  appens when codi
d680: 6e 67 20 63 68 65 63 6b 20 63 6f 6e 73 74 72 61  ng check constra
d690: 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ints */.        
d6a0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
d6b0: 63 6b 42 61 73 65 3e 30 20 29 3b 0a 20 20 20 20  ckBase>0 );.    
d6c0: 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70      inReg = pExp
d6d0: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2b 20 70 50 61  r->iColumn + pPa
d6e0: 72 73 65 2d 3e 63 6b 42 61 73 65 3b 0a 20 20 20  rse->ckBase;.   
d6f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d700: 20 20 74 65 73 74 63 61 73 65 28 20 28 70 45 78    testcase( (pEx
d710: 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 41  pr->flags & EP_A
d720: 6e 79 41 66 66 29 21 3d 30 20 29 3b 0a 20 20 20  nyAff)!=0 );.   
d730: 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
d740: 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
d750: 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 45  olumn(pParse, pE
d760: 78 70 72 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20  xpr->pTab,.     
d770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d780: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
d790: 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 45 78 70  r->iColumn, pExp
d7a0: 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65  r->iTable, targe
d7b0: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
d7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7d0: 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61 67 73      pExpr->flags
d7e0: 20 26 20 45 50 5f 41 6e 79 41 66 66 29 3b 0a 20   & EP_AnyAff);. 
d7f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
d800: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
d810: 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b  se TK_INTEGER: {
d820: 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67  .      codeInteg
d830: 65 72 28 76 2c 20 70 45 78 70 72 2c 20 30 2c 20  er(v, pExpr, 0, 
d840: 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62  target);.      b
d850: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
d860: 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b  case TK_FLOAT: {
d870: 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28  .      codeReal(
d880: 76 2c 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d  v, (char*)pExpr-
d890: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d  >token.z, pExpr-
d8a0: 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 2c 20 74 61 72  >token.n, 0, tar
d8b0: 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  get);.      brea
d8c0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
d8d0: 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20  e TK_STRING: {. 
d8e0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75       sqlite3Dequ
d8f0: 6f 74 65 45 78 70 72 28 70 50 61 72 73 65 2d 3e  oteExpr(pParse->
d900: 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  db, pExpr);.    
d910: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d920: 4f 70 34 28 76 2c 4f 50 5f 53 74 72 69 6e 67 38  Op4(v,OP_String8
d930: 2c 20 30 2c 20 74 61 72 67 65 74 2c 20 30 2c 0a  , 0, target, 0,.
d940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d950: 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
d960: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Expr->token.z, p
d970: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a  Expr->token.n);.
d980: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d990: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
d9a0: 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ULL: {.      sql
d9b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
d9c0: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
d9d0: 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65  rget);.      bre
d9e0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
d9f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c  f SQLITE_OMIT_BL
da00: 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63  OB_LITERAL.    c
da10: 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20  ase TK_BLOB: {. 
da20: 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
da30: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
da40: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c  .      char *zBl
da50: 6f 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ob;.      assert
da60: 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  ( pExpr->token.n
da70: 3e 3d 33 20 29 3b 0a 20 20 20 20 20 20 61 73 73  >=3 );.      ass
da80: 65 72 74 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65  ert( pExpr->toke
da90: 6e 2e 7a 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20 70  n.z[0]=='x' || p
daa0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d  Expr->token.z[0]
dab0: 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20 20 20 61  =='X' );.      a
dac0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 74 6f  ssert( pExpr->to
dad0: 6b 65 6e 2e 7a 5b 31 5d 3d 3d 27 5c 27 27 20 29  ken.z[1]=='\'' )
dae0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
daf0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 70  pExpr->token.z[p
db00: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2d 31 5d  Expr->token.n-1]
db10: 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20  =='\'' );.      
db20: 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  n = pExpr->token
db30: 2e 6e 20 2d 20 33 3b 0a 20 20 20 20 20 20 7a 20  .n - 3;.      z 
db40: 3d 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e  = (char*)pExpr->
db50: 74 6f 6b 65 6e 2e 7a 20 2b 20 32 3b 0a 20 20 20  token.z + 2;.   
db60: 20 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74     zBlob = sqlit
db70: 65 33 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69  e3HexToBlob(sqli
db80: 74 65 33 56 64 62 65 44 62 28 76 29 2c 20 7a 2c  te3VdbeDb(v), z,
db90: 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   n);.      sqlit
dba0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
dbb0: 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61  OP_Blob, n/2, ta
dbc0: 72 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20  rget, 0, zBlob, 
dbd0: 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P4_DYNAMIC);.   
dbe0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
dbf0: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
dc00: 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20  TK_VARIABLE: {. 
dc10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dc20: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61 72  AddOp2(v, OP_Var
dc30: 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 54  iable, pExpr->iT
dc40: 61 62 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a 20  able, target);. 
dc50: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
dc60: 74 6f 6b 65 6e 2e 6e 3e 31 20 29 7b 0a 20 20 20  token.n>1 ){.   
dc70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dc80: 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
dc90: 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
dca0: 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f  ken.z, pExpr->to
dcb0: 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  ken.n);.      }.
dcc0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
dcd0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52   }.    case TK_R
dce0: 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20  EGISTER: {.     
dcf0: 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e   inReg = pExpr->
dd00: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 62 72  iTable;.      br
dd10: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
dd20: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
dd30: 41 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AST.    case TK_
dd40: 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  CAST: {.      /*
dd50: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   Expressions of 
dd60: 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54  the form:   CAST
dd70: 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29  (pLeft AS token)
dd80: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66   */.      int af
dd90: 66 2c 20 74 6f 5f 6f 70 3b 0a 20 20 20 20 20 20  f, to_op;.      
dda0: 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
ddb0: 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
ddc0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
ddd0: 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  ft, target);.   
dde0: 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
ddf0: 41 66 66 69 6e 69 74 79 54 79 70 65 28 26 70 45  AffinityType(&pE
de00: 78 70 72 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20  xpr->token);.   
de10: 20 20 20 74 6f 5f 6f 70 20 3d 20 61 66 66 20 2d     to_op = aff -
de20: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
de30: 20 2b 20 4f 50 5f 54 6f 54 65 78 74 3b 0a 20 20   + OP_ToText;.  
de40: 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f      assert( to_o
de50: 70 3d 3d 4f 50 5f 54 6f 54 65 78 74 20 20 20 20  p==OP_ToText    
de60: 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41  || aff!=SQLITE_A
de70: 46 46 5f 54 45 58 54 20 20 20 20 29 3b 0a 20 20  FF_TEXT    );.  
de80: 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f      assert( to_o
de90: 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20 20 20 20  p==OP_ToBlob    
dea0: 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41  || aff!=SQLITE_A
deb0: 46 46 5f 4e 4f 4e 45 20 20 20 20 29 3b 0a 20 20  FF_NONE    );.  
dec0: 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f      assert( to_o
ded0: 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69 63 20  p==OP_ToNumeric 
dee0: 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41  || aff!=SQLITE_A
def0: 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20  FF_NUMERIC );.  
df00: 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f      assert( to_o
df10: 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20 20 20 20 20  p==OP_ToInt     
df20: 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41  || aff!=SQLITE_A
df30: 46 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20  FF_INTEGER );.  
df40: 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f      assert( to_o
df50: 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 20 20 20  p==OP_ToReal    
df60: 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41  || aff!=SQLITE_A
df70: 46 46 5f 52 45 41 4c 20 20 20 20 29 3b 0a 20 20  FF_REAL    );.  
df80: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f      testcase( to
df90: 5f 6f 70 3d 3d 4f 50 5f 54 6f 54 65 78 74 20 29  _op==OP_ToText )
dfa0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
dfb0: 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c  ( to_op==OP_ToBl
dfc0: 6f 62 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ob );.      test
dfd0: 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  case( to_op==OP_
dfe0: 54 6f 4e 75 6d 65 72 69 63 20 29 3b 0a 20 20 20  ToNumeric );.   
dff0: 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f     testcase( to_
e000: 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20 29 3b 0a  op==OP_ToInt );.
e010: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
e020: 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c  to_op==OP_ToReal
e030: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
e040: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 74  3VdbeAddOp1(v, t
e050: 6f 5f 6f 70 2c 20 69 6e 52 65 67 29 3b 0a 20 20  o_op, inReg);.  
e060: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 75 73      testcase( us
e070: 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28  edAsColumnCache(
e080: 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 69  pParse, inReg, i
e090: 6e 52 65 67 29 20 29 3b 0a 20 20 20 20 20 20 73  nReg) );.      s
e0a0: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
e0b0: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
e0c0: 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 31 29 3b  arse, inReg, 1);
e0d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
e0e0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
e0f0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a  LITE_OMIT_CAST *
e100: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  /.    case TK_LT
e110: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
e120: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
e130: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
e140: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
e150: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
e160: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
e170: 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29  ( TK_LT==OP_Lt )
e180: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
e190: 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a  TK_LE==OP_Le );.
e1a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
e1b0: 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20  _GT==OP_Gt );.  
e1c0: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
e1d0: 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20  E==OP_Ge );.    
e1e0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d    assert( TK_EQ=
e1f0: 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20  =OP_Eq );.      
e200: 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f  assert( TK_NE==O
e210: 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 74 65  P_Ne );.      te
e220: 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c  stcase( op==TK_L
e230: 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
e240: 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29  ase( op==TK_LE )
e250: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
e260: 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20  ( op==TK_GT );. 
e270: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
e280: 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20  p==TK_GE );.    
e290: 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
e2a0: 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 74  TK_EQ );.      t
e2b0: 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
e2c0: 4e 45 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  NE );.      code
e2d0: 43 6f 6d 70 61 72 65 4f 70 65 72 61 6e 64 73 28  CompareOperands(
e2e0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
e2f0: 4c 65 66 74 2c 20 26 72 31 2c 20 26 72 65 67 46  Left, &r1, &regF
e300: 72 65 65 31 2c 0a 20 20 20 20 20 20 20 20 20 20  ree1,.          
e310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e320: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
e330: 52 69 67 68 74 2c 20 26 72 32 2c 20 26 72 65 67  Right, &r2, &reg
e340: 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f  Free2);.      co
e350: 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
e360: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
e370: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
e380: 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
e390: 20 20 20 20 20 72 31 2c 20 72 32 2c 20 69 6e 52       r1, r2, inR
e3a0: 65 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  eg, SQLITE_STORE
e3b0: 50 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  P2);.      testc
e3c0: 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
e3d0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
e3e0: 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
e3f0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
e400: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
e410: 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20  K_AND:.    case 
e420: 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20  TK_OR:.    case 
e430: 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73  TK_PLUS:.    cas
e440: 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63  e TK_STAR:.    c
e450: 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20  ase TK_MINUS:.  
e460: 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20    case TK_REM:. 
e470: 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e     case TK_BITAN
e480: 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  D:.    case TK_B
e490: 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54  ITOR:.    case T
e4a0: 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63 61 73  K_SLASH:.    cas
e4b0: 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20  e TK_LSHIFT:.   
e4c0: 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a   case TK_RSHIFT:
e4d0: 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f   .    case TK_CO
e4e0: 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73  NCAT: {.      as
e4f0: 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50  sert( TK_AND==OP
e500: 5f 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61 73  _And );.      as
e510: 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f  sert( TK_OR==OP_
e520: 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Or );.      asse
e530: 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f  rt( TK_PLUS==OP_
e540: 41 64 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Add );.      ass
e550: 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f  ert( TK_MINUS==O
e560: 50 5f 53 75 62 74 72 61 63 74 20 29 3b 0a 20 20  P_Subtract );.  
e570: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52      assert( TK_R
e580: 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72  EM==OP_Remainder
e590: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
e5a0: 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f  ( TK_BITAND==OP_
e5b0: 42 69 74 41 6e 64 20 29 3b 0a 20 20 20 20 20 20  BitAnd );.      
e5c0: 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52  assert( TK_BITOR
e5d0: 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 0a 20 20  ==OP_BitOr );.  
e5e0: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53      assert( TK_S
e5f0: 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20  LASH==OP_Divide 
e600: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
e610: 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53   TK_LSHIFT==OP_S
e620: 68 69 66 74 4c 65 66 74 20 29 3b 0a 20 20 20 20  hiftLeft );.    
e630: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48    assert( TK_RSH
e640: 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67  IFT==OP_ShiftRig
e650: 68 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ht );.      asse
e660: 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f  rt( TK_CONCAT==O
e670: 50 5f 43 6f 6e 63 61 74 20 29 3b 0a 20 20 20 20  P_Concat );.    
e680: 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
e690: 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 20 20  TK_AND );.      
e6a0: 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
e6b0: 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _OR );.      tes
e6c0: 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c  tcase( op==TK_PL
e6d0: 55 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  US );.      test
e6e0: 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e  case( op==TK_MIN
e6f0: 55 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  US );.      test
e700: 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d  case( op==TK_REM
e710: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
e720: 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e  se( op==TK_BITAN
e730: 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  D );.      testc
e740: 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f  ase( op==TK_BITO
e750: 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  R );.      testc
e760: 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53  ase( op==TK_SLAS
e770: 48 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  H );.      testc
e780: 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49  ase( op==TK_LSHI
e790: 46 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  FT );.      test
e7a0: 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 53 48  case( op==TK_RSH
e7b0: 49 46 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  IFT );.      tes
e7c0: 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f  tcase( op==TK_CO
e7d0: 4e 43 41 54 20 29 3b 0a 20 20 20 20 20 20 72 31  NCAT );.      r1
e7e0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
e7f0: 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
e800: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
e810: 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
e820: 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
e830: 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
e840: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
e850: 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
e860: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e870: 70 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31  p3(v, op, r2, r1
e880: 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
e890: 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
e8a0: 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
e8b0: 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
e8c0: 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
e8d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
e8e0: 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
e8f0: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  {.      Expr *pL
e900: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
e910: 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ft;.      assert
e920: 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  ( pLeft );.     
e930: 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d   if( pLeft->op==
e940: 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70 4c 65 66  TK_FLOAT || pLef
e950: 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45  t->op==TK_INTEGE
e960: 52 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  R ){.        if(
e970: 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46   pLeft->op==TK_F
e980: 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LOAT ){.        
e990: 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 28 63    codeReal(v, (c
e9a0: 68 61 72 2a 29 70 4c 65 66 74 2d 3e 74 6f 6b 65  har*)pLeft->toke
e9b0: 6e 2e 7a 2c 20 70 4c 65 66 74 2d 3e 74 6f 6b 65  n.z, pLeft->toke
e9c0: 6e 2e 6e 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  n.n, 1, target);
e9d0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
e9e0: 20 20 20 20 20 20 20 20 20 20 63 6f 64 65 49 6e            codeIn
e9f0: 74 65 67 65 72 28 76 2c 20 70 4c 65 66 74 2c 20  teger(v, pLeft, 
ea00: 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
ea10: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
ea20: 65 7b 0a 20 20 20 20 20 20 20 20 72 65 67 46 72  e{.        regFr
ea30: 65 65 31 20 3d 20 72 31 20 3d 20 73 71 6c 69 74  ee1 = r1 = sqlit
ea40: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
ea50: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
ea60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
ea70: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
ea80: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 72  , r1);.        r
ea90: 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
eaa0: 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
eab0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
eac0: 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
ead0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
eae0: 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72 61  Op3(v, OP_Subtra
eaf0: 63 74 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67  ct, r2, r1, targ
eb00: 65 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  et);.        tes
eb10: 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
eb20: 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  =0 );.      }.  
eb30: 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67      inReg = targ
eb40: 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  et;.      break;
eb50: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
eb60: 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63  TK_BITNOT:.    c
eb70: 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
eb80: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
eb90: 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74  ITNOT==OP_BitNot
eba0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
ebb0: 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74  ( TK_NOT==OP_Not
ebc0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
ebd0: 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f  se( op==TK_BITNO
ebe0: 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
ebf0: 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20  ase( op==TK_NOT 
ec00: 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d  );.      inReg =
ec10: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
ec20: 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
ec30: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72  Expr->pLeft, tar
ec40: 67 65 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  get);.      test
ec50: 63 61 73 65 28 20 69 6e 52 65 67 3d 3d 74 61 72  case( inReg==tar
ec60: 67 65 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73  get );.      tes
ec70: 74 63 61 73 65 28 20 75 73 65 64 41 73 43 6f 6c  tcase( usedAsCol
ec80: 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c  umnCache(pParse,
ec90: 20 69 6e 52 65 67 2c 20 69 6e 52 65 67 29 20 29   inReg, inReg) )
eca0: 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  ;.      inReg = 
ecb0: 73 71 6c 69 74 65 33 45 78 70 72 57 72 69 74 61  sqlite3ExprWrita
ecc0: 62 6c 65 52 65 67 69 73 74 65 72 28 70 50 61 72  bleRegister(pPar
ecd0: 73 65 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65  se, inReg, targe
ece0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
ecf0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 6f  3VdbeAddOp1(v, o
ed00: 70 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20  p, inReg);.     
ed10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
ed20: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
ed30: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
ed40: 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69  TNULL: {.      i
ed50: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61  nt addr;.      a
ed60: 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c  ssert( TK_ISNULL
ed70: 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20  ==OP_IsNull );. 
ed80: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
ed90: 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e  NOTNULL==OP_NotN
eda0: 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ull );.      tes
edb0: 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
edc0: 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65  NULL );.      te
edd0: 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
ede0: 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  OTNULL );.      
edf0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ee00: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
ee10: 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
ee20: 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
ee30: 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
ee40: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
ee50: 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
ee60: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
ee70: 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
ee80: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
ee90: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 6f  3VdbeAddOp1(v, o
eea0: 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  p, r1);.      sq
eeb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
eec0: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61  v, OP_AddImm, ta
eed0: 72 67 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20 20  rget, -1);.     
eee0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
eef0: 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
ef00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ef10: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  }.    case TK_AG
ef20: 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  G_FUNCTION: {.  
ef30: 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e      AggInfo *pIn
ef40: 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67  fo = pExpr->pAgg
ef50: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  Info;.      if( 
ef60: 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  pInfo==0 ){.    
ef70: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
ef80: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73  Msg(pParse, "mis
ef90: 75 73 65 20 6f 66 20 61 67 67 72 65 67 61 74 65  use of aggregate
efa0: 3a 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20  : %T",.         
efb0: 20 20 20 26 70 45 78 70 72 2d 3e 73 70 61 6e 29     &pExpr->span)
efc0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
efd0: 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70         inReg = p
efe0: 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70  Info->aFunc[pExp
eff0: 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20  r->iAgg].iMem;. 
f000: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
f010: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
f020: 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43  se TK_CONST_FUNC
f030: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  :.    case TK_FU
f040: 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
f050: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
f060: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a  = pExpr->pList;.
f070: 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20        int nExpr 
f080: 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d  = pList ? pList-
f090: 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20  >nExpr : 0;.    
f0a0: 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b    FuncDef *pDef;
f0b0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 0a  .      int nId;.
f0c0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
f0d0: 20 2a 7a 49 64 3b 0a 20 20 20 20 20 20 69 6e 74   *zId;.      int
f0e0: 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 0a   constMask = 0;.
f0f0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
f100: 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
f110: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20   pParse->db;.   
f120: 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28     u8 enc = ENC(
f130: 64 62 29 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  db);.      CollS
f140: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 0a  eq *pColl = 0;..
f150: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
f160: 6f 70 3d 3d 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e  op==TK_CONST_FUN
f170: 43 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  C );.      testc
f180: 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 46 55 4e 43  ase( op==TK_FUNC
f190: 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 7a 49  TION );.      zI
f1a0: 64 20 3d 20 28 63 68 61 72 2a 29 70 45 78 70 72  d = (char*)pExpr
f1b0: 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20  ->token.z;.     
f1c0: 20 6e 49 64 20 3d 20 70 45 78 70 72 2d 3e 74 6f   nId = pExpr->to
f1d0: 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 70 44 65  ken.n;.      pDe
f1e0: 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
f1f0: 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e  unction(pParse->
f200: 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 45  db, zId, nId, nE
f210: 78 70 72 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20  xpr, enc, 0);.  
f220: 20 20 20 20 61 73 73 65 72 74 28 20 70 44 65 66      assert( pDef
f230: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
f240: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20   pList ){.      
f250: 20 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d    nExpr = pList-
f260: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
f270: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
f280: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
f290: 20 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   nExpr);.       
f2a0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
f2b0: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
f2c0: 20 70 4c 69 73 74 2c 20 72 31 2c 20 31 29 3b 0a   pList, r1, 1);.
f2d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f2e0: 20 20 20 20 20 6e 45 78 70 72 20 3d 20 72 31 20       nExpr = r1 
f2f0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  = 0;.      }.#if
f300: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f310: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
f320: 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20      /* Possibly 
f330: 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 66 75 6e  overload the fun
f340: 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66 69 72  ction if the fir
f350: 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 20  st argument is. 
f360: 20 20 20 20 20 2a 2a 20 61 20 76 69 72 74 75 61       ** a virtua
f370: 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a  l table column..
f380: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
f390: 2a 20 46 6f 72 20 69 6e 66 69 78 20 66 75 6e 63  * For infix func
f3a0: 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f  tions (LIKE, GLO
f3b0: 42 2c 20 52 45 47 45 58 50 2c 20 61 6e 64 20 4d  B, REGEXP, and M
f3c0: 41 54 43 48 29 20 75 73 65 20 74 68 65 0a 20 20  ATCH) use the.  
f3d0: 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72      ** second ar
f3e0: 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20  gument, not the 
f3f0: 66 69 72 73 74 2c 20 61 73 20 74 68 65 20 61 72  first, as the ar
f400: 67 75 6d 65 6e 74 20 74 6f 20 74 65 73 74 20 74  gument to test t
f410: 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69  o.      ** see i
f420: 66 20 69 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e  f it is a column
f430: 20 69 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61   in a virtual ta
f440: 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20 64 6f  ble.  This is do
f450: 6e 65 20 62 65 63 61 75 73 65 0a 20 20 20 20 20  ne because.     
f460: 20 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f 70 65   ** the left ope
f470: 72 61 6e 64 20 6f 66 20 69 6e 66 69 78 20 66 75  rand of infix fu
f480: 6e 63 74 69 6f 6e 73 20 28 74 68 65 20 6f 70 65  nctions (the ope
f490: 72 61 6e 64 20 77 65 20 77 61 6e 74 20 74 6f 0a  rand we want to.
f4a0: 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c        ** control
f4b0: 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e   overloading) en
f4c0: 64 73 20 75 70 20 61 73 20 74 68 65 20 73 65 63  ds up as the sec
f4d0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
f4e0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e  the.      ** fun
f4f0: 63 74 69 6f 6e 2e 20 20 54 68 65 20 65 78 70 72  ction.  The expr
f500: 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42  ession "A glob B
f510: 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  " is equivalent 
f520: 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c  to .      ** "gl
f530: 6f 62 28 42 2c 41 29 2e 20 20 57 65 20 77 61 6e  ob(B,A).  We wan
f540: 74 20 74 6f 20 75 73 65 20 74 68 65 20 41 20 69  t to use the A i
f550: 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 74 6f 20  n "A glob B" to 
f560: 74 65 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f  test.      ** fo
f570: 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c  r function overl
f580: 6f 61 64 69 6e 67 2e 20 20 42 75 74 20 77 65 20  oading.  But we 
f590: 75 73 65 20 74 68 65 20 42 20 74 65 72 6d 20 69  use the B term i
f5a0: 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20  n "glob(B,A)".. 
f5b0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
f5c0: 28 20 6e 45 78 70 72 3e 3d 32 20 26 26 20 28 70  ( nExpr>=2 && (p
f5d0: 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
f5e0: 5f 49 6e 66 69 78 46 75 6e 63 29 20 29 7b 0a 20  _InfixFunc) ){. 
f5f0: 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71         pDef = sq
f600: 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61  lite3VtabOverloa
f610: 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44  dFunction(db, pD
f620: 65 66 2c 20 6e 45 78 70 72 2c 20 70 4c 69 73 74  ef, nExpr, pList
f630: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[1].pExpr);. 
f640: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
f650: 45 78 70 72 3e 30 20 29 7b 0a 20 20 20 20 20 20  Expr>0 ){.      
f660: 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
f670: 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63  VtabOverloadFunc
f680: 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e  tion(db, pDef, n
f690: 45 78 70 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 30  Expr, pList->a[0
f6a0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
f6b0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66  }.#endif.      f
f6c0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 20  or(i=0; i<nExpr 
f6d0: 26 26 20 69 3c 33 32 3b 20 69 2b 2b 29 7b 0a 20  && i<32; i++){. 
f6e0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
f6f0: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
f700: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  (pList->a[i].pEx
f710: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pr) ){.         
f720: 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 28 31   constMask |= (1
f730: 3c 3c 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  <<i);.        }.
f740: 20 20 20 20 20 20 20 20 69 66 28 20 70 44 65 66          if( pDef
f750: 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 26 26  ->needCollSeq &&
f760: 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
f770: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
f780: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
f790: 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61  pParse, pList->a
f7a0: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
f7b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
f7c0: 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 6e 65      if( pDef->ne
f7d0: 65 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20  edCollSeq ){.   
f7e0: 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
f7f0: 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65  ) pColl = pParse
f800: 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
f810: 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
f820: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
f830: 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c  P_CollSeq, 0, 0,
f840: 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c   0, (char *)pCol
f850: 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
f860: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
f870: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
f880: 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20  v, OP_Function, 
f890: 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74  constMask, r1, t
f8a0: 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20  arget,.         
f8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
f8c0: 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34 5f 46  char*)pDef, P4_F
f8d0: 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73  UNCDEF);.      s
f8e0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
f8f0: 50 35 28 76 2c 20 6e 45 78 70 72 29 3b 0a 20 20  P5(v, nExpr);.  
f900: 20 20 20 20 69 66 28 20 6e 45 78 70 72 20 29 7b      if( nExpr ){
f910: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f920: 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
f930: 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 45 78  (pParse, r1, nEx
f940: 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
f950: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
f960: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
f970: 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 45  e(pParse, r1, nE
f980: 78 70 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61  xpr);.      brea
f990: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
f9a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
f9b0: 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
f9c0: 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61  K_EXISTS:.    ca
f9d0: 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a  se TK_SELECT: {.
f9e0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
f9f0: 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b  op==TK_EXISTS );
fa00: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
fa10: 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29   op==TK_SELECT )
fa20: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
fa30: 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b  r->iColumn==0 ){
fa40: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
fa50: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
fa60: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30 29 3b  arse, pExpr, 0);
fa70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
fa80: 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 43  nReg = pExpr->iC
fa90: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 62 72 65  olumn;.      bre
faa0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
fab0: 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
fac0: 20 20 69 6e 74 20 72 4e 6f 74 46 6f 75 6e 64 20    int rNotFound 
fad0: 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  = 0;.      int r
fae0: 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b  MayHaveNull = 0;
faf0: 0a 20 20 20 20 20 20 69 6e 74 20 6a 32 2c 20 6a  .      int j2, j
fb00: 33 2c 20 6a 34 2c 20 6a 35 3b 0a 20 20 20 20 20  3, j4, j5;.     
fb10: 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 0a   char affinity;.
fb20: 20 20 20 20 20 20 69 6e 74 20 65 54 79 70 65 3b        int eType;
fb30: 0a 0a 20 20 20 20 20 20 56 64 62 65 4e 6f 6f 70  ..      VdbeNoop
fb40: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67  Comment((v, "beg
fb50: 69 6e 20 49 4e 20 65 78 70 72 20 72 25 64 22 2c  in IN expr r%d",
fb60: 20 74 61 72 67 65 74 29 29 3b 0a 20 20 20 20 20   target));.     
fb70: 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   eType = sqlite3
fb80: 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72  FindInIndex(pPar
fb90: 73 65 2c 20 70 45 78 70 72 2c 20 26 72 4d 61 79  se, pExpr, &rMay
fba0: 48 61 76 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  HaveNull);.     
fbb0: 20 69 66 28 20 72 4d 61 79 48 61 76 65 4e 75 6c   if( rMayHaveNul
fbc0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 4e 6f  l ){.        rNo
fbd0: 74 46 6f 75 6e 64 20 3d 20 2b 2b 70 50 61 72 73  tFound = ++pPars
fbe0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 7d  e->nMem;.      }
fbf0: 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 67 75 72  ..      /* Figur
fc00: 65 20 6f 75 74 20 74 68 65 20 61 66 66 69 6e 69  e out the affini
fc10: 74 79 20 74 6f 20 75 73 65 20 74 6f 20 63 72 65  ty to use to cre
fc20: 61 74 65 20 61 20 6b 65 79 20 66 72 6f 6d 20 74  ate a key from t
fc30: 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20  he results.     
fc40: 20 2a 2a 20 6f 66 20 74 68 65 20 65 78 70 72 65   ** of the expre
fc50: 73 73 69 6f 6e 2e 20 61 66 66 69 6e 69 74 79 53  ssion. affinityS
fc60: 74 72 20 73 74 6f 72 65 73 20 61 20 73 74 61 74  tr stores a stat
fc70: 69 63 20 73 74 72 69 6e 67 20 73 75 69 74 61 62  ic string suitab
fc80: 6c 65 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20  le for.      ** 
fc90: 50 34 20 6f 66 20 4f 50 5f 4d 61 6b 65 52 65 63  P4 of OP_MakeRec
fca0: 6f 72 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ord..      */.  
fcb0: 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 63      affinity = c
fcc0: 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74  omparisonAffinit
fcd0: 79 28 70 45 78 70 72 29 3b 0a 0a 0a 20 20 20 20  y(pExpr);...    
fce0: 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 3c 65    /* Code the <e
fcf0: 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72  xpr> from "<expr
fd00: 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 54 68 65  > IN (...)". The
fd10: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
fd20: 0a 20 20 20 20 20 20 2a 2a 20 70 45 78 70 72 2d  .      ** pExpr-
fd30: 3e 69 54 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73  >iTable contains
fd40: 20 74 68 65 20 76 61 6c 75 65 73 20 74 68 61 74   the values that
fd50: 20 6d 61 6b 65 20 75 70 20 74 68 65 20 28 2e 2e   make up the (..
fd60: 2e 29 20 73 65 74 2e 0a 20 20 20 20 20 20 2a 2f  .) set..      */
fd70: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  .      pParse->d
fd80: 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b  isableColCache++
fd90: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
fda0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
fdb0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61  pExpr->pLeft, ta
fdc0: 72 67 65 74 29 3b 0a 20 20 20 20 20 20 70 50 61  rget);.      pPa
fdd0: 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43  rse->disableColC
fde0: 61 63 68 65 2d 2d 3b 0a 20 20 20 20 20 20 6a 32  ache--;.      j2
fdf0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
fe00: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp1(v, OP_IsNul
fe10: 6c 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  l, target);.    
fe20: 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f    if( eType==IN_
fe30: 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20  INDEX_ROWID ){. 
fe40: 20 20 20 20 20 20 20 6a 33 20 3d 20 73 71 6c 69         j3 = sqli
fe50: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
fe60: 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 74   OP_MustBeInt, t
fe70: 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
fe80: 6a 34 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j4 = sqlite3Vdbe
fe90: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp3(v, OP_Not
fea0: 45 78 69 73 74 73 2c 20 70 45 78 70 72 2d 3e 69  Exists, pExpr->i
feb0: 54 61 62 6c 65 2c 20 30 2c 20 74 61 72 67 65 74  Table, 0, target
fec0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
fed0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
fee0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74  OP_Integer, 1, t
fef0: 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
ff00: 6a 35 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j5 = sqlite3Vdbe
ff10: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74  AddOp0(v, OP_Got
ff20: 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  o);.        sqli
ff30: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
ff40: 76 2c 20 6a 33 29 3b 0a 20 20 20 20 20 20 20 20  v, j3);.        
ff50: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
ff60: 65 72 65 28 76 2c 20 6a 34 29 3b 0a 20 20 20 20  ere(v, j4);.    
ff70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ff80: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
ff90: 67 65 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ger, 0, target);
ffa0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ffb0: 20 20 20 20 20 20 72 32 20 3d 20 72 65 67 46 72        r2 = regFr
ffc0: 65 65 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ee2 = sqlite3Get
ffd0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
ffe0: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 72 65  ..        /* Cre
fff0: 61 74 65 20 61 20 72 65 63 6f 72 64 20 61 6e 64  ate a record and
10000 20 74 65 73 74 20 66 6f 72 20 73 65 74 20 6d 65   test for set me
10010 6d 62 65 72 73 68 69 70 2e 20 49 66 20 74 68 65  mbership. If the
10020 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20   set contains.  
10030 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c        ** the val
10040 75 65 2c 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f  ue, then jump to
10050 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
10060 74 65 73 74 20 63 6f 64 65 2e 20 54 68 65 20 74  test code. The t
10070 61 72 67 65 74 0a 20 20 20 20 20 20 20 20 2a 2a  arget.        **
10080 20 72 65 67 69 73 74 65 72 20 73 74 69 6c 6c 20   register still 
10090 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 72 75  contains the tru
100a0 65 20 28 31 29 20 76 61 6c 75 65 20 77 72 69 74  e (1) value writ
100b0 74 65 6e 20 74 6f 20 69 74 20 65 61 72 6c 69 65  ten to it earlie
100c0 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  r..        */.  
100d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
100e0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
100f0 6b 65 52 65 63 6f 72 64 2c 20 74 61 72 67 65 74  keRecord, target
10100 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69  , 1, r2, &affini
10110 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ty, 1);.        
10120 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10130 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
10140 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
10150 20 20 20 20 20 6a 35 20 3d 20 73 71 6c 69 74 65       j5 = sqlite
10160 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
10170 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e  P_Found, pExpr->
10180 69 54 61 62 6c 65 2c 20 30 2c 20 72 32 29 3b 0a  iTable, 0, r2);.
10190 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
101a0 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69  he set membershi
101b0 70 20 74 65 73 74 20 66 61 69 6c 73 2c 20 74 68  p test fails, th
101c0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  en the result of
101d0 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
101e0 20 22 78 20 49 4e 20 28 2e 2e 2e 29 22 20 65 78   "x IN (...)" ex
101f0 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65  pression must be
10200 20 65 69 74 68 65 72 20 30 20 6f 72 20 4e 55 4c   either 0 or NUL
10210 4c 2e 20 49 66 20 74 68 65 20 73 65 74 0a 20 20  L. If the set.  
10220 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
10230 73 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73  s no NULL values
10240 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
10250 74 20 69 73 20 30 2e 20 49 66 20 74 68 65 20 73  t is 0. If the s
10260 65 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  et .        ** c
10270 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
10280 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c  ore NULL values,
10290 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
102a0 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
102b0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  ** expression is
102c0 20 61 6c 73 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20   also NULL..    
102d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
102e0 66 28 20 72 4e 6f 74 46 6f 75 6e 64 3d 3d 30 20  f( rNotFound==0 
102f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
10300 54 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73  This branch runs
10310 20 69 66 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20   if it is known 
10320 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20  at compile time 
10330 28 6e 6f 77 29 20 74 68 61 74 20 0a 20 20 20 20  (now) that .    
10340 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 65 74        ** the set
10350 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c   contains no NUL
10360 4c 20 76 61 6c 75 65 73 2e 20 54 68 69 73 20 68  L values. This h
10370 61 70 70 65 6e 73 20 61 73 20 74 68 65 20 72 65  appens as the re
10380 73 75 6c 74 0a 20 20 20 20 20 20 20 20 20 20 2a  sult.          *
10390 2a 20 6f 66 20 61 20 22 4e 4f 54 20 4e 55 4c 4c  * of a "NOT NULL
103a0 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20  " constraint in 
103b0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
103c0 65 6d 61 2e 20 4e 6f 20 6e 65 65 64 0a 20 20 20  ema. No need.   
103d0 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73         ** to tes
103e0 74 20 74 68 65 20 64 61 74 61 20 73 74 72 75 63  t the data struc
103f0 74 75 72 65 20 61 74 20 72 75 6e 74 69 6d 65 20  ture at runtime 
10400 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
10410 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
10420 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10430 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
10440 65 67 65 72 2c 20 30 2c 20 74 61 72 67 65 74 29  eger, 0, target)
10450 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
10460 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
10470 69 73 20 62 6c 6f 63 6b 20 70 6f 70 75 6c 61 74  is block populat
10480 65 73 20 74 68 65 20 72 4e 6f 74 46 6f 75 6e 64  es the rNotFound
10490 20 72 65 67 69 73 74 65 72 20 77 69 74 68 20 65   register with e
104a0 69 74 68 65 72 20 4e 55 4c 4c 0a 20 20 20 20 20  ither NULL.     
104b0 20 20 20 20 20 2a 2a 20 6f 72 20 30 20 28 61 6e       ** or 0 (an
104c0 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 29 2e   integer value).
104d0 20 49 66 20 74 68 65 20 64 61 74 61 20 73 74 72   If the data str
104e0 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20  ucture contains 
104f0 6f 6e 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  one.          **
10500 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 73 2c 20   or more NULLs, 
10510 74 68 65 6e 20 73 65 74 20 72 4e 6f 74 46 6f 75  then set rNotFou
10520 6e 64 20 74 6f 20 4e 55 4c 4c 2e 20 4f 74 68 65  nd to NULL. Othe
10530 72 77 69 73 65 2c 20 73 65 74 20 69 74 0a 20 20  rwise, set it.  
10540 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 30 2e          ** to 0.
10550 20 49 66 20 72 65 67 69 73 74 65 72 20 72 4d 61   If register rMa
10560 79 48 61 76 65 4e 75 6c 6c 20 69 73 20 61 6c 72  yHaveNull is alr
10570 65 61 64 79 20 73 65 74 20 74 6f 20 73 6f 6d 65  eady set to some
10580 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 20   value.         
10590 20 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 4e   ** other than N
105a0 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 74 65  ULL, then the te
105b0 73 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  st has already b
105c0 65 65 6e 20 72 75 6e 20 61 6e 64 20 0a 20 20 20  een run and .   
105d0 20 20 20 20 20 20 20 2a 2a 20 72 4e 6f 74 46 6f         ** rNotFo
105e0 75 6e 64 20 69 73 20 61 6c 72 65 61 64 79 20 70  und is already p
105f0 6f 70 75 6c 61 74 65 64 2e 0a 20 20 20 20 20 20  opulated..      
10600 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
10610 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
10620 61 72 20 6e 75 6c 6c 52 65 63 6f 72 64 5b 5d 20  ar nullRecord[] 
10630 3d 20 7b 20 30 78 30 32 2c 20 30 78 30 30 20 7d  = { 0x02, 0x00 }
10640 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 33 20 3d  ;.          j3 =
10650 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10660 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  p1(v, OP_NotNull
10670 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 29 3b  , rMayHaveNull);
10680 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10690 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
106a0 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 4e 6f 74  OP_Null, 0, rNot
106b0 46 6f 75 6e 64 29 3b 0a 20 20 20 20 20 20 20 20  Found);.        
106c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
106d0 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20  Op4(v, OP_Blob, 
106e0 32 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c  2, rMayHaveNull,
106f0 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
10700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10710 20 20 6e 75 6c 6c 52 65 63 6f 72 64 2c 20 50 34    nullRecord, P4
10720 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
10730 20 20 20 20 6a 34 20 3d 20 73 71 6c 69 74 65 33      j4 = sqlite3
10740 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
10750 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69  _Found, pExpr->i
10760 54 61 62 6c 65 2c 20 30 2c 20 72 4d 61 79 48 61  Table, 0, rMayHa
10770 76 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20  veNull);.       
10780 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10790 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
107a0 65 72 2c 20 30 2c 20 72 4e 6f 74 46 6f 75 6e 64  er, 0, rNotFound
107b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
107c0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
107d0 28 76 2c 20 6a 34 29 3b 0a 20 20 20 20 20 20 20  (v, j4);.       
107e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
107f0 6d 70 48 65 72 65 28 76 2c 20 6a 33 29 3b 0a 0a  mpHere(v, j3);..
10800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70            /* Cop
10810 79 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 72  y the value of r
10820 65 67 69 73 74 65 72 20 72 4e 6f 74 46 6f 75 6e  egister rNotFoun
10830 64 20 28 77 68 69 63 68 20 69 73 20 65 69 74 68  d (which is eith
10840 65 72 20 4e 55 4c 4c 20 6f 72 20 30 29 0a 09 20  er NULL or 0).. 
10850 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 74 61 72   ** into the tar
10860 67 65 74 20 72 65 67 69 73 74 65 72 2e 20 54 68  get register. Th
10870 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 72  is will be the r
10880 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 20  esult of the.   
10890 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73         ** expres
108a0 73 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 20 20  sion..          
108b0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  */.          sql
108c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
108d0 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 4e 6f 74 46  , OP_Copy, rNotF
108e0 6f 75 6e 64 2c 20 74 61 72 67 65 74 29 3b 0a 20  ound, target);. 
108f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
10900 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10910 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 32  beJumpHere(v, j2
10920 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10930 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
10940 6a 35 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  j5);.      VdbeC
10950 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20  omment((v, "end 
10960 49 4e 20 65 78 70 72 20 72 25 64 22 2c 20 74 61  IN expr r%d", ta
10970 72 67 65 74 29 29 3b 0a 20 20 20 20 20 20 62 72  rget));.      br
10980 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
10990 66 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  f.    /*.    ** 
109a0 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41     x BETWEEN y A
109b0 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ND z.    **.    
109c0 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75 69 76  ** This is equiv
109d0 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a  alent to.    **.
109e0 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41      **    x>=y A
109f0 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20  ND x<=z.    **. 
10a00 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65     ** X is store
10a10 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66  d in pExpr->pLef
10a20 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73  t..    ** Y is s
10a30 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
10a40 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
10a50 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73  r..    ** Z is s
10a60 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
10a70 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
10a80 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  r..    */.    ca
10a90 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
10aa0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
10ab0 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
10ac0 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  t;.      struct 
10ad0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
10ae0 4c 49 74 65 6d 20 3d 20 70 45 78 70 72 2d 3e 70  LItem = pExpr->p
10af0 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 45  List->a;.      E
10b00 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 4c  xpr *pRight = pL
10b10 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20  Item->pExpr;..  
10b20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 4f      codeCompareO
10b30 70 65 72 61 6e 64 73 28 70 50 61 72 73 65 2c 20  perands(pParse, 
10b40 70 4c 65 66 74 2c 20 26 72 31 2c 20 26 72 65 67  pLeft, &r1, &reg
10b50 46 72 65 65 31 2c 0a 20 20 20 20 20 20 20 20 20  Free1,.         
10b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b70 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 2c           pRight,
10b80 20 26 72 32 2c 20 26 72 65 67 46 72 65 65 32 29   &r2, &regFree2)
10b90 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
10ba0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
10bb0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
10bc0 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
10bd0 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74        r3 = sqlit
10be0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
10bf0 72 73 65 29 3b 0a 20 20 20 20 20 20 72 34 20 3d  rse);.      r4 =
10c00 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
10c10 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
10c20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
10c30 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69  arse, pLeft, pRi
10c40 67 68 74 2c 20 4f 50 5f 47 65 2c 0a 20 20 20 20  ght, OP_Ge,.    
10c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
10c60 2c 20 72 32 2c 20 72 33 2c 20 53 51 4c 49 54 45  , r2, r3, SQLITE
10c70 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20  _STOREP2);.     
10c80 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20   pLItem++;.     
10c90 20 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d   pRight = pLItem
10ca0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ->pExpr;.      s
10cb0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
10cc0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
10cd0 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 72 32  Free2);.      r2
10ce0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
10cf0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
10d00 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
10d10 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
10d20 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
10d30 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
10d40 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  are(pParse, pLef
10d50 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65  t, pRight, OP_Le
10d60 2c 20 72 31 2c 20 72 32 2c 20 72 34 2c 20 53 51  , r1, r2, r4, SQ
10d70 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20  LITE_STOREP2);. 
10d80 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10d90 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 6e 64  AddOp3(v, OP_And
10da0 2c 20 72 33 2c 20 72 34 2c 20 74 61 72 67 65 74  , r3, r4, target
10db0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10dc0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
10dd0 50 61 72 73 65 2c 20 72 33 29 3b 0a 20 20 20 20  Parse, r3);.    
10de0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
10df0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
10e00 72 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  r4);.      break
10e10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
10e20 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20   TK_UPLUS: {.   
10e30 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
10e40 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
10e50 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
10e60 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a  pLeft, target);.
10e70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10e80 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
10e90 2a 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a  * Form A:.    **
10ea0 20 20 20 43 41 53 45 20 78 20 57 48 45 4e 20 65     CASE x WHEN e
10eb0 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65  1 THEN r1 WHEN e
10ec0 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48  2 THEN r2 ... WH
10ed0 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c  EN eN THEN rN EL
10ee0 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a  SE y END.    **.
10ef0 20 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20      ** Form B:. 
10f00 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45     **   CASE WHE
10f10 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45  N e1 THEN r1 WHE
10f20 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e  N e2 THEN r2 ...
10f30 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e   WHEN eN THEN rN
10f40 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20   ELSE y END.    
10f50 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41  **.    ** Form A
10f60 20 69 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73   is can be trans
10f70 66 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20  formed into the 
10f80 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20  equivalent form 
10f90 42 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  B as follows:.  
10fa0 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e    **   CASE WHEN
10fb0 20 78 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48   x=e1 THEN r1 WH
10fc0 45 4e 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20  EN x=e2 THEN r2 
10fd0 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ....    **      
10fe0 20 20 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e    WHEN x=eN THEN
10ff0 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20   rN ELSE y END. 
11000 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28     **.    ** X (
11010 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73  if it exists) is
11020 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   in pExpr->pLeft
11030 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e  ..    ** Y is in
11040 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2e 20   pExpr->pRight. 
11050 20 54 68 65 20 59 20 69 73 20 61 6c 73 6f 20 6f   The Y is also o
11060 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74 68 65  ptional.  If the
11070 72 65 20 69 73 20 6e 6f 0a 20 20 20 20 2a 2a 20  re is no.    ** 
11080 45 4c 53 45 20 63 6c 61 75 73 65 20 61 6e 64 20  ELSE clause and 
11090 6e 6f 20 6f 74 68 65 72 20 74 65 72 6d 20 6d 61  no other term ma
110a0 74 63 68 65 73 2c 20 74 68 65 6e 20 74 68 65 20  tches, then the 
110b0 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20  result of the.  
110c0 20 20 2a 2a 20 65 78 70 72 73 73 69 6f 6e 20 69    ** exprssion i
110d0 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45  s NULL..    ** E
110e0 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70  i is in pExpr->p
110f0 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64  List->a[i*2] and
11100 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c   Ri is pExpr->pL
11110 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20  ist->a[i*2+1].. 
11120 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
11130 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65   result of the e
11140 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65  xpression is the
11150 20 52 69 20 66 6f 72 20 74 68 65 20 66 69 72 73   Ri for the firs
11160 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20  t matching Ei,. 
11170 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72     ** or if ther
11180 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67  e is no matching
11190 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65   Ei, the ELSE te
111a0 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72  rm Y, or if ther
111b0 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45  e is.    ** no E
111c0 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a  LSE term, NULL..
111d0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
111e0 54 4b 5f 43 41 53 45 3a 20 7b 0a 20 20 20 20 20  TK_CASE: {.     
111f0 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20 20   int endLabel;  
11200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11210 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c     /* GOTO label
11220 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41 53 45   for end of CASE
11230 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69   stmt */.      i
11240 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20 20 20  nt nextCase;    
11250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11260 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66   /* GOTO label f
11270 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63 6c 61  or next WHEN cla
11280 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  use */.      int
11290 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20 20   nExpr;         
112a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
112b0 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66 20 57  * 2x number of W
112c0 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  HEN terms */.   
112d0 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
112e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112f0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
11300 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 45 78  nter */.      Ex
11310 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20  prList *pEList; 
11320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11330 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45 4e 20  /* List of WHEN 
11340 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 73  terms */.      s
11350 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
11360 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 20  tem *aListelem; 
11370 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57 48 45   /* Array of WHE
11380 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  N terms */.     
11390 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72 65 3b   Expr opCompare;
113a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113b0 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69 20     /* The X==Ei 
113c0 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
113d0 20 20 20 20 45 78 70 72 20 63 61 63 68 65 58 3b      Expr cacheX;
113e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113f0 20 20 20 20 20 20 2f 2a 20 43 61 63 68 65 64 20        /* Cached 
11400 65 78 70 72 65 73 73 69 6f 6e 20 58 20 2a 2f 0a  expression X */.
11410 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20        Expr *pX; 
11420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11430 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58          /* The X
11440 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
11450 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 73 74       Expr *pTest
11460 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11470 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20         /* X==Ei 
11480 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73 74  (form A) or just
11490 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a   Ei (form B) */.
114a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45  .      assert(pE
114b0 78 70 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20  xpr->pList);.   
114c0 20 20 20 61 73 73 65 72 74 28 28 70 45 78 70 72     assert((pExpr
114d0 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 25  ->pList->nExpr %
114e0 20 32 29 20 3d 3d 20 30 29 3b 0a 20 20 20 20 20   2) == 0);.     
114f0 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e 70   assert(pExpr->p
11500 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29  List->nExpr > 0)
11510 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d  ;.      pEList =
11520 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20   pExpr->pList;. 
11530 20 20 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d       aListelem =
11540 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20   pEList->a;.    
11550 20 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74    nExpr = pEList
11560 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65  ->nExpr;.      e
11570 6e 64 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65  ndLabel = sqlite
11580 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
11590 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58  );.      if( (pX
115a0 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29   = pExpr->pLeft)
115b0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  !=0 ){.        c
115c0 61 63 68 65 58 20 3d 20 2a 70 58 3b 0a 20 20 20  acheX = *pX;.   
115d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
115e0 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  X->op==TK_COLUMN
115f0 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 52   || pX->op==TK_R
11600 45 47 49 53 54 45 52 20 29 3b 0a 20 20 20 20 20  EGISTER );.     
11610 20 20 20 63 61 63 68 65 58 2e 69 54 61 62 6c 65     cacheX.iTable
11620 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
11630 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
11640 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  X, &regFree1);. 
11650 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
11660 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
11670 20 20 20 20 20 20 20 20 63 61 63 68 65 58 2e 6f          cacheX.o
11680 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b  p = TK_REGISTER;
11690 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61  .        opCompa
116a0 72 65 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20  re.op = TK_EQ;. 
116b0 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65         opCompare
116c0 2e 70 4c 65 66 74 20 3d 20 26 63 61 63 68 65 58  .pLeft = &cacheX
116d0 3b 0a 20 20 20 20 20 20 20 20 70 54 65 73 74 20  ;.        pTest 
116e0 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b 0a 20 20  = &opCompare;.  
116f0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 72      }.      pPar
11700 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61  se->disableColCa
11710 63 68 65 2b 2b 3b 0a 20 20 20 20 20 20 66 6f 72  che++;.      for
11720 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69  (i=0; i<nExpr; i
11730 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 69  =i+2){.        i
11740 66 28 20 70 58 20 29 7b 0a 20 20 20 20 20 20 20  f( pX ){.       
11750 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 52 69     opCompare.pRi
11760 67 68 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b  ght = aListelem[
11770 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
11780 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11790 20 20 20 70 54 65 73 74 20 3d 20 61 4c 69 73 74     pTest = aList
117a0 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  elem[i].pExpr;. 
117b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
117c0 20 6e 65 78 74 43 61 73 65 20 3d 20 73 71 6c 69   nextCase = sqli
117d0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
117e0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  (v);.        tes
117f0 74 63 61 73 65 28 20 70 54 65 73 74 2d 3e 6f 70  tcase( pTest->op
11800 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70  ==TK_COLUMN || p
11810 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47  Test->op==TK_REG
11820 49 53 54 45 52 20 29 3b 0a 20 20 20 20 20 20 20  ISTER );.       
11830 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
11840 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65 73  lse(pParse, pTes
11850 74 2c 20 6e 65 78 74 43 61 73 65 2c 20 53 51 4c  t, nextCase, SQL
11860 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
11870 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
11880 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31  e( aListelem[i+1
11890 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ].pExpr->op==TK_
118a0 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
118b0 20 20 74 65 73 74 63 61 73 65 28 20 61 4c 69 73    testcase( aLis
118c0 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72  telem[i+1].pExpr
118d0 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ->op==TK_REGISTE
118e0 52 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  R );.        sql
118f0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
11900 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69  rse, aListelem[i
11910 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65  +1].pExpr, targe
11920 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
11930 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11940 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 6e 64   OP_Goto, 0, end
11950 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20  Label);.        
11960 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
11970 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65 78 74 43  veLabel(v, nextC
11980 61 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ase);.      }.  
11990 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
119a0 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20  Right ){.       
119b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
119c0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
119d0 70 52 69 67 68 74 2c 20 74 61 72 67 65 74 29 3b  pRight, target);
119e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
119f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11a00 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
11a10 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
11a20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
11a30 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
11a40 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65  Label(v, endLabe
11a50 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l);.      assert
11a60 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c  ( pParse->disabl
11a70 65 43 6f 6c 43 61 63 68 65 3e 30 20 29 3b 0a 20  eColCache>0 );. 
11a80 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73       pParse->dis
11a90 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a  ableColCache--;.
11aa0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11ab0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
11ac0 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20  E_OMIT_TRIGGER. 
11ad0 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45     case TK_RAISE
11ae0 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70  : {.      if( !p
11af0 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b  Parse->trigStack
11b00 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
11b10 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
11b20 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
11b30 20 20 20 20 20 20 20 20 20 20 20 22 52 41 49 53             "RAIS
11b40 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  E() may only be 
11b50 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 74 72  used within a tr
11b60 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b  igger-program");
11b70 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
11b80 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
11b90 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
11ba0 75 6d 6e 21 3d 4f 45 5f 49 67 6e 6f 72 65 20 29  umn!=OE_Ignore )
11bb0 7b 0a 20 20 20 20 20 20 20 20 20 61 73 73 65 72  {.         asser
11bc0 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  t( pExpr->iColum
11bd0 6e 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 7c  n==OE_Rollback |
11be0 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
11bf0 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
11c00 6e 20 3d 3d 20 4f 45 5f 41 62 6f 72 74 20 7c 7c  n == OE_Abort ||
11c10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11c20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
11c30 20 3d 3d 20 4f 45 5f 46 61 69 6c 20 29 3b 0a 20   == OE_Fail );. 
11c40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
11c50 65 71 75 6f 74 65 45 78 70 72 28 70 50 61 72 73  equoteExpr(pPars
11c60 65 2d 3e 64 62 2c 20 70 45 78 70 72 29 3b 0a 20  e->db, pExpr);. 
11c70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
11c80 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
11c90 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 43 4f 4e  Halt, SQLITE_CON
11ca0 53 54 52 41 49 4e 54 2c 20 70 45 78 70 72 2d 3e  STRAINT, pExpr->
11cb0 69 43 6f 6c 75 6d 6e 2c 20 30 2c 0a 20 20 20 20  iColumn, 0,.    
11cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cd0 20 20 20 20 28 63 68 61 72 2a 29 70 45 78 70 72      (char*)pExpr
11ce0 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72  ->token.z, pExpr
11cf0 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20  ->token.n);.    
11d00 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
11d10 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
11d20 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45  r->iColumn == OE
11d30 5f 49 67 6e 6f 72 65 20 29 3b 0a 20 20 20 20 20  _Ignore );.     
11d40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11d50 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 6e 74  ddOp2(v, OP_Cont
11d60 65 78 74 50 6f 70 2c 20 30 2c 20 30 29 3b 0a 20  extPop, 0, 0);. 
11d70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
11d80 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11d90 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d  Goto, 0, pParse-
11da0 3e 74 72 69 67 53 74 61 63 6b 2d 3e 69 67 6e 6f  >trigStack->igno
11db0 72 65 4a 75 6d 70 29 3b 0a 20 20 20 20 20 20 20  reJump);.       
11dc0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
11dd0 2c 20 22 72 61 69 73 65 28 49 47 4e 4f 52 45 29  , "raise(IGNORE)
11de0 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  "));.      }.   
11df0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
11e00 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c  #endif.  }.  sql
11e10 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
11e20 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
11e30 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ee1);.  sqlite3R
11e40 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
11e50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b  arse, regFree2);
11e60 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b  .  return inReg;
11e70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
11e80 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
11e90 61 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ate an expressio
11ea0 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  n and store the 
11eb0 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20  results.** into 
11ec0 61 20 72 65 67 69 73 74 65 72 2e 20 20 52 65 74  a register.  Ret
11ed0 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
11ee0 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74 68   number where th
11ef0 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65  e results.** are
11f00 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   stored..**.** I
11f10 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69  f the register i
11f20 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65  s a temporary re
11f30 67 69 73 74 65 72 20 74 68 61 74 20 63 61 6e 20  gister that can 
11f40 62 65 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a  be deallocated,.
11f50 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 69 74  ** then write it
11f60 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70  s number into *p
11f70 52 65 67 2e 20 20 49 66 20 74 68 65 20 72 65 73  Reg.  If the res
11f80 75 6c 74 20 72 65 67 69 73 74 65 72 20 69 73 20  ult register is 
11f90 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61  not.** a tempora
11fa0 72 79 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ry, then set *pR
11fb0 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 69  eg to zero..*/.i
11fc0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
11fd0 64 65 54 65 6d 70 28 50 61 72 73 65 20 2a 70 50  deTemp(Parse *pP
11fe0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
11ff0 72 2c 20 69 6e 74 20 2a 70 52 65 67 29 7b 0a 20  r, int *pReg){. 
12000 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
12010 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
12020 73 65 29 3b 0a 20 20 69 6e 74 20 72 32 20 3d 20  se);.  int r2 = 
12030 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
12040 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
12050 78 70 72 2c 20 72 31 29 3b 0a 20 20 69 66 28 20  xpr, r1);.  if( 
12060 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20 20 2a 70  r2==r1 ){.    *p
12070 52 65 67 20 3d 20 72 31 3b 0a 20 20 7d 65 6c 73  Reg = r1;.  }els
12080 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  e{.    sqlite3Re
12090 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
120a0 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 2a 70  rse, r1);.    *p
120b0 52 65 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Reg = 0;.  }.  r
120c0 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a  eturn r2;.}../*.
120d0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
120e0 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75   that will evalu
120f0 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  ate expression p
12100 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74  Expr and store t
12110 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e  he.** results in
12120 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
12130 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  .  The results a
12140 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  re guaranteed to
12150 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65   appear.** in re
12160 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a  gister target..*
12170 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
12180 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61  rCode(Parse *pPa
12190 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
121a0 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
121b0 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61   int inReg;..  a
121c0 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
121d0 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73  && target<=pPars
121e0 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 6e 52  e->nMem );.  inR
121f0 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
12200 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
12210 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
12220 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
12230 72 73 65 2d 3e 70 56 64 62 65 20 7c 7c 20 70 50  rse->pVdbe || pP
12240 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
12250 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
12260 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 26 26  inReg!=target &&
12270 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29   pParse->pVdbe )
12280 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
12290 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e  eAddOp2(pParse->
122a0 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c  pVdbe, OP_SCopy,
122b0 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b   inReg, target);
122c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 74 61  .  }.  return ta
122d0 72 67 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rget;.}../*.** G
122e0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
122f0 74 20 65 76 61 6c 75 74 65 73 20 74 68 65 20 67  t evalutes the g
12300 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
12310 61 6e 64 20 70 75 74 73 20 74 68 65 20 72 65 73  and puts the res
12320 75 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74  ult.** in regist
12330 65 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a  er target..**.**
12340 20 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70   Also make a cop
12350 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  y of the express
12360 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 74 6f  ion results into
12370 20 61 6e 6f 74 68 65 72 20 22 63 61 63 68 65 22   another "cache"
12380 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64   register.** and
12390 20 6d 6f 64 69 66 79 20 74 68 65 20 65 78 70 72   modify the expr
123a0 65 73 73 69 6f 6e 20 73 6f 20 74 68 61 74 20 74  ession so that t
123b0 68 65 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20  he next time it 
123c0 69 73 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a  is evaluated,.**
123d0 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61   the result is a
123e0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 63   copy of the cac
123f0 68 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a  he register..**.
12400 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
12410 69 73 20 75 73 65 64 20 66 6f 72 20 65 78 70 72  is used for expr
12420 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65  essions that are
12430 20 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a   used multiple .
12440 2a 2a 20 74 69 6d 65 73 2e 20 20 54 68 65 79 20  ** times.  They 
12450 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 6f 6e  are evaluated on
12460 63 65 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c  ce and the resul
12470 74 73 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ts of the expres
12480 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73  sion.** are reus
12490 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
124a0 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63  e3ExprCodeAndCac
124b0 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  he(Parse *pParse
124c0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
124d0 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64  nt target){.  Vd
124e0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
124f0 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 6e 52  pVdbe;.  int inR
12500 65 67 3b 0a 20 20 69 6e 52 65 67 20 3d 20 73 71  eg;.  inReg = sq
12510 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
12520 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
12530 67 65 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  get);.  assert( 
12540 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 69 66  target>0 );.  if
12550 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
12560 52 45 47 49 53 54 45 52 20 29 7b 20 20 0a 20 20  REGISTER ){  .  
12570 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 20 20 20 20    int iMem;.    
12580 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
12590 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
125a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
125b0 4f 50 5f 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20  OP_Copy, inReg, 
125c0 69 4d 65 6d 29 3b 0a 20 20 20 20 70 45 78 70 72  iMem);.    pExpr
125d0 2d 3e 69 54 61 62 6c 65 20 3d 20 69 4d 65 6d 3b  ->iTable = iMem;
125e0 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d  .    pExpr->op =
125f0 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20   TK_REGISTER;.  
12600 7d 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67  }.  return inReg
12610 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
12620 6e 20 54 52 55 45 20 69 66 20 70 45 78 70 72 20  n TRUE if pExpr 
12630 69 73 20 61 6e 20 63 6f 6e 73 74 61 6e 74 20 65  is an constant e
12640 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69  xpression that i
12650 73 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a  s appropriate.**
12660 20 66 6f 72 20 66 61 63 74 6f 72 69 6e 67 20 6f   for factoring o
12670 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 20 20 41  ut of a loop.  A
12680 70 70 72 6f 70 72 69 61 74 65 20 65 78 70 72 65  ppropriate expre
12690 73 73 69 6f 6e 73 20 61 72 65 3a 0a 2a 2a 0a 2a  ssions are:.**.*
126a0 2a 20 20 20 20 2a 20 20 41 6e 79 20 65 78 70 72  *    *  Any expr
126b0 65 73 73 69 6f 6e 20 74 68 61 74 20 65 76 61 6c  ession that eval
126c0 75 61 74 65 73 20 74 6f 20 74 77 6f 20 6f 72 20  uates to two or 
126d0 6d 6f 72 65 20 6f 70 63 6f 64 65 73 2e 0a 2a 2a  more opcodes..**
126e0 0a 2a 2a 20 20 20 20 2a 20 20 41 6e 79 20 4f 50  .**    *  Any OP
126f0 5f 49 6e 74 65 67 65 72 2c 20 4f 50 5f 52 65 61  _Integer, OP_Rea
12700 6c 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 4f 50  l, OP_String, OP
12710 5f 42 6c 6f 62 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  _Blob, OP_Null, 
12720 0a 2a 2a 20 20 20 20 20 20 20 6f 72 20 4f 50 5f  .**       or OP_
12730 56 61 72 69 61 62 6c 65 20 74 68 61 74 20 64 6f  Variable that do
12740 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
12750 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 0a 2a  e placed in a .*
12760 2a 20 20 20 20 20 20 20 73 70 65 63 69 66 69 63  *       specific
12770 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a   register..**.**
12780 20 54 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69   There is no poi
12790 6e 74 20 69 6e 20 66 61 63 74 6f 72 69 6e 67 20  nt in factoring 
127a0 6f 75 74 20 73 69 6e 67 6c 65 2d 69 6e 73 74 72  out single-instr
127b0 75 63 74 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 0a  uction constant.
127c0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  ** expressions t
127d0 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 70  hat need to be p
127e0 6c 61 63 65 64 20 69 6e 20 61 20 70 61 72 74 69  laced in a parti
127f0 63 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e 20  cular register. 
12800 20 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 66 61   .** We could fa
12810 63 74 6f 72 20 74 68 65 6d 20 6f 75 74 2c 20 62  ctor them out, b
12820 75 74 20 74 68 65 6e 20 77 65 20 77 6f 75 6c 64  ut then we would
12830 20 65 6e 64 20 75 70 20 61 64 64 69 6e 67 20 61   end up adding a
12840 6e 0a 2a 2a 20 4f 50 5f 53 43 6f 70 79 20 69 6e  n.** OP_SCopy in
12850 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 6d 6f 76  struction to mov
12860 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 74 6f  e the value into
12870 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 65 67   the correct reg
12880 69 73 74 65 72 0a 2a 2a 20 6c 61 74 65 72 2e 20  ister.** later. 
12890 20 57 65 20 6d 69 67 68 74 20 61 73 20 77 65 6c   We might as wel
128a0 6c 20 6a 75 73 74 20 75 73 65 20 74 68 65 20 6f  l just use the o
128b0 72 69 67 69 6e 61 6c 20 69 6e 73 74 72 75 63 74  riginal instruct
128c0 69 6f 6e 20 61 6e 64 0a 2a 2a 20 61 76 6f 69 64  ion and.** avoid
128d0 20 74 68 65 20 4f 50 5f 53 43 6f 70 79 2e 0a 2a   the OP_SCopy..*
128e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 41  /.static int isA
128f0 70 70 72 6f 70 72 69 61 74 65 46 6f 72 46 61 63  ppropriateForFac
12900 74 6f 72 69 6e 67 28 45 78 70 72 20 2a 70 29 7b  toring(Expr *p){
12910 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45  .  if( !sqlite3E
12920 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
12930 4a 6f 69 6e 28 70 29 20 29 7b 0a 20 20 20 20 72  Join(p) ){.    r
12940 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4f 6e 6c  eturn 0;  /* Onl
12950 79 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65  y constant expre
12960 73 73 69 6f 6e 73 20 61 72 65 20 61 70 70 72 6f  ssions are appro
12970 70 72 69 61 74 65 20 66 6f 72 20 66 61 63 74 6f  priate for facto
12980 72 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  ring */.  }.  if
12990 28 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45 50  ( (p->flags & EP
129a0 5f 46 69 78 65 64 44 65 73 74 29 3d 3d 30 20 29  _FixedDest)==0 )
129b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 20  {.    return 1; 
129c0 20 2f 2a 20 41 6e 79 20 63 6f 6e 73 74 61 6e 74   /* Any constant
129d0 20 77 69 74 68 6f 75 74 20 61 20 66 69 78 65 64   without a fixed
129e0 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20   destination is 
129f0 61 70 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a 20  appropriate */. 
12a00 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f   }.  while( p->o
12a10 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 29 20 70 20  p==TK_UPLUS ) p 
12a20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 73 77  = p->pLeft;.  sw
12a30 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 23  itch( p->op ){.#
12a40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12a50 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a  IT_BLOB_LITERAL.
12a60 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42      case TK_BLOB
12a70 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  :.#endif.    cas
12a80 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20  e TK_VARIABLE:. 
12a90 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
12aa0 45 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ER:.    case TK_
12ab0 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20  FLOAT:.    case 
12ac0 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  TK_NULL:.    cas
12ad0 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20  e TK_STRING: {. 
12ae0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
12af0 2d 3e 6f 70 3d 3d 54 4b 5f 42 4c 4f 42 20 29 3b  ->op==TK_BLOB );
12b00 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
12b10 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41   p->op==TK_VARIA
12b20 42 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  BLE );.      tes
12b30 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
12b40 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20  _INTEGER );.    
12b50 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f    testcase( p->o
12b60 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 3b 0a 20  p==TK_FLOAT );. 
12b70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
12b80 2d 3e 6f 70 3d 3d 54 4b 5f 4e 55 4c 4c 20 29 3b  ->op==TK_NULL );
12b90 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
12ba0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e   p->op==TK_STRIN
12bb0 47 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 53 69  G );.      /* Si
12bc0 6e 67 6c 65 2d 69 6e 73 74 72 75 63 74 69 6f 6e  ngle-instruction
12bd0 20 63 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 20   constants with 
12be0 61 20 66 69 78 65 64 20 64 65 73 74 69 6e 61 74  a fixed destinat
12bf0 69 6f 6e 20 61 72 65 0a 20 20 20 20 20 20 2a 2a  ion are.      **
12c00 20 62 65 74 74 65 72 20 64 6f 6e 65 20 69 6e 2d   better done in-
12c10 6c 69 6e 65 2e 20 20 49 66 20 77 65 20 66 61 63  line.  If we fac
12c20 74 6f 72 20 74 68 65 6d 2c 20 74 68 65 79 20 77  tor them, they w
12c30 69 6c 6c 20 6a 75 73 74 20 65 6e 64 0a 20 20 20  ill just end.   
12c40 20 20 20 2a 2a 20 75 70 20 67 65 6e 65 72 61 74     ** up generat
12c50 69 6e 67 20 61 6e 20 4f 50 5f 53 43 6f 70 79 20  ing an OP_SCopy 
12c60 74 6f 20 6d 6f 76 65 20 74 68 65 20 76 61 6c 75  to move the valu
12c70 65 20 74 6f 20 74 68 65 20 64 65 73 74 69 6e 61  e to the destina
12c80 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72 65  tion.      ** re
12c90 67 69 73 74 65 72 2e 20 2a 2f 0a 20 20 20 20 20  gister. */.     
12ca0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
12cb0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
12cc0 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 20 69 66  NUS: {.       if
12cd0 28 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d  ( p->pLeft->op==
12ce0 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70 2d 3e 70  TK_FLOAT || p->p
12cf0 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54  Left->op==TK_INT
12d00 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20  EGER ){.        
12d10 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
12d20 20 20 7d 0a 20 20 20 20 20 20 20 62 72 65 61 6b    }.       break
12d30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
12d40 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 62 72 65  ult: {.      bre
12d50 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
12d60 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
12d70 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61  ** If pExpr is a
12d80 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73   constant expres
12d90 73 69 6f 6e 20 74 68 61 74 20 69 73 20 61 70 70  sion that is app
12da0 72 6f 70 72 69 61 74 65 20 66 6f 72 0a 2a 2a 20  ropriate for.** 
12db0 66 61 63 74 6f 72 69 6e 67 20 6f 75 74 20 6f 66  factoring out of
12dc0 20 61 20 6c 6f 6f 70 2c 20 74 68 65 6e 20 65 76   a loop, then ev
12dd0 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65  aluate the expre
12de0 73 73 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 61 20  ssion.** into a 
12df0 72 65 67 69 73 74 65 72 20 61 6e 64 20 63 6f 6e  register and con
12e00 76 65 72 74 20 74 68 65 20 65 78 70 72 65 73 73  vert the express
12e10 69 6f 6e 20 69 6e 74 6f 20 61 20 54 4b 5f 52 45  ion into a TK_RE
12e20 47 49 53 54 45 52 0a 2a 2a 20 65 78 70 72 65 73  GISTER.** expres
12e30 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sion..*/.static 
12e40 69 6e 74 20 65 76 61 6c 43 6f 6e 73 74 45 78 70  int evalConstExp
12e50 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  r(Walker *pWalke
12e60 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
12e70 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
12e80 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
12e90 73 65 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45  se;.  switch( pE
12ea0 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
12eb0 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a  ase TK_REGISTER:
12ec0 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
12ed0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  1;.    }.    cas
12ee0 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  e TK_FUNCTION:. 
12ef0 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
12f00 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73  UNCTION:.    cas
12f10 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a  e TK_CONST_FUNC:
12f20 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   {.      /* The 
12f30 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 20 66  arguments to a f
12f40 75 6e 63 74 69 6f 6e 20 68 61 76 65 20 61 20 66  unction have a f
12f50 69 78 65 64 20 64 65 73 74 69 6e 61 74 69 6f 6e  ixed destination
12f60 2e 0a 20 20 20 20 20 20 2a 2a 20 4d 61 72 6b 20  ..      ** Mark 
12f70 74 68 65 6d 20 74 68 69 73 20 77 61 79 20 74 6f  them this way to
12f80 20 61 76 6f 69 64 20 67 65 6e 65 72 61 74 65 64   avoid generated
12f90 20 75 6e 6e 65 65 64 65 64 20 4f 50 5f 53 43 6f   unneeded OP_SCo
12fa0 70 79 0a 20 20 20 20 20 20 2a 2a 20 69 6e 73 74  py.      ** inst
12fb0 72 75 63 74 69 6f 6e 73 2e 20 0a 20 20 20 20 20  ructions. .     
12fc0 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69   */.      ExprLi
12fd0 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
12fe0 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  r->pList;.      
12ff0 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
13000 20 20 20 20 20 69 6e 74 20 69 20 3d 20 70 4c 69       int i = pLi
13010 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
13020 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
13030 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
13040 20 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20   pList->a;.     
13050 20 20 20 66 6f 72 28 3b 20 69 3e 30 3b 20 69 2d     for(; i>0; i-
13060 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
13070 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
13080 2d 3e 70 45 78 70 72 20 29 20 70 49 74 65 6d 2d  ->pExpr ) pItem-
13090 3e 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 7c 3d  >pExpr->flags |=
130a0 20 45 50 5f 46 69 78 65 64 44 65 73 74 3b 0a 20   EP_FixedDest;. 
130b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
130c0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
130d0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 73    }.  }.  if( is
130e0 41 70 70 72 6f 70 72 69 61 74 65 46 6f 72 46 61  AppropriateForFa
130f0 63 74 6f 72 69 6e 67 28 70 45 78 70 72 29 20 29  ctoring(pExpr) )
13100 7b 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20 2b  {.    int r1 = +
13110 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
13120 20 20 20 69 6e 74 20 72 32 3b 0a 20 20 20 20 72     int r2;.    r
13130 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
13140 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
13150 2c 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20  , pExpr, r1);.  
13160 20 20 69 66 28 20 72 31 21 3d 72 32 20 29 20 73    if( r1!=r2 ) s
13170 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
13180 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
13190 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20  ;.    pExpr->op 
131a0 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20  = TK_REGISTER;. 
131b0 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
131c0 20 3d 20 72 32 3b 0a 20 20 20 20 72 65 74 75 72   = r2;.    retur
131d0 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d  n WRC_Prune;.  }
131e0 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
131f0 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
13200 20 50 72 65 65 76 61 6c 75 61 74 65 20 63 6f 6e   Preevaluate con
13210 73 74 61 6e 74 20 73 75 62 65 78 70 72 65 73 73  stant subexpress
13220 69 6f 6e 73 20 77 69 74 68 69 6e 20 70 45 78 70  ions within pExp
13230 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a  r and store the.
13240 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65  ** results in re
13250 67 69 73 74 65 72 73 2e 20 20 4d 6f 64 69 66 79  gisters.  Modify
13260 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 74   pExpr so that t
13270 68 65 20 63 6f 6e 73 74 61 6e 74 20 73 75 62 65  he constant sube
13280 78 70 72 65 73 69 6f 6e 73 0a 2a 2a 20 61 72 65  xpresions.** are
13290 20 54 4b 5f 52 45 47 49 53 54 45 52 20 6f 70 63   TK_REGISTER opc
132a0 6f 64 65 73 20 74 68 61 74 20 72 65 66 65 72 20  odes that refer 
132b0 74 6f 20 74 68 65 20 70 72 65 63 6f 6d 70 75 74  to the precomput
132c0 65 64 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 76 6f  ed values..*/.vo
132d0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
132e0 64 65 43 6f 6e 73 74 61 6e 74 73 28 50 61 72 73  deConstants(Pars
132f0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
13300 2a 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65  *pExpr){.  Walke
13310 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  r w;.  w.xExprCa
13320 6c 6c 62 61 63 6b 20 3d 20 65 76 61 6c 43 6f 6e  llback = evalCon
13330 73 74 45 78 70 72 3b 0a 20 20 77 2e 78 53 65 6c  stExpr;.  w.xSel
13340 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30 3b  ectCallback = 0;
13350 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50  .  w.pParse = pP
13360 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57  arse;.  sqlite3W
13370 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70  alkExpr(&w, pExp
13380 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  r);.}.../*.** Ge
13390 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
133a0 20 70 75 73 68 65 73 20 74 68 65 20 76 61 6c 75   pushes the valu
133b0 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65  e of every eleme
133c0 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a  nt of the given.
133d0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
133e0 73 74 20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e  st into a sequen
133f0 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ce of registers 
13400 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 74 61 72  beginning at tar
13410 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  get..**.** Retur
13420 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
13430 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75 61 74  elements evaluat
13440 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
13450 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
13460 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
13470 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73  rse,     /* Pars
13480 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
13490 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
134a0 2c 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65  ,   /* The expre
134b0 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65  ssion list to be
134c0 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
134d0 74 61 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f  target,        /
134e0 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65  * Where to write
134f0 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
13500 74 20 64 6f 48 61 72 64 43 6f 70 79 20 20 20 20  t doHardCopy    
13510 20 2f 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33   /* Call sqlite3
13520 45 78 70 72 48 61 72 64 43 6f 70 79 20 6f 6e 20  ExprHardCopy on 
13530 65 61 63 68 20 65 6c 65 6d 65 6e 74 20 69 66 20  each element if 
13540 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  true */.){.  str
13550 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
13560 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
13570 69 2c 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  i, n;.  assert( 
13580 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61 73  pList!=0 );.  as
13590 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29  sert( target>0 )
135a0 3b 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e  ;.  n = pList->n
135b0 45 78 70 72 3b 0a 20 20 66 6f 72 28 70 49 74 65  Expr;.  for(pIte
135c0 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
135d0 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d   i<n; i++, pItem
135e0 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
135f0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
13600 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 74   pItem->pExpr, t
13610 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 69 66  arget+i);.    if
13620 28 20 64 6f 48 61 72 64 43 6f 70 79 20 29 20 73  ( doHardCopy ) s
13630 71 6c 69 74 65 33 45 78 70 72 48 61 72 64 43 6f  qlite3ExprHardCo
13640 70 79 28 70 50 61 72 73 65 2c 20 74 61 72 67 65  py(pParse, targe
13650 74 2c 20 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74  t, n);.  }.  ret
13660 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
13670 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
13680 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72  r a boolean expr
13690 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74  ession such that
136a0 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a   a jump is made.
136b0 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20  ** to the label 
136c0 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78  "dest" if the ex
136d0 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65  pression is true
136e0 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a   but execution.*
136f0 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61  * continues stra
13700 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65  ight thru if the
13710 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
13720 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  alse..**.** If t
13730 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76  he expression ev
13740 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20  aluates to NULL 
13750 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f  (neither true no
13760 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a  r false), then.*
13770 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20  * take the jump 
13780 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c  if the jumpIfNul
13790 6c 20 66 6c 61 67 20 69 73 20 53 51 4c 49 54 45  l flag is SQLITE
137a0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a  _JUMPIFNULL..**.
137b0 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70  ** This code dep
137c0 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74  ends on the fact
137d0 20 74 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f   that certain to
137e0 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ken values (ex: 
137f0 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68  TK_EQ).** are th
13800 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65  e same as opcode
13810 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f   values (ex: OP_
13820 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  Eq) that impleme
13830 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  nt the correspon
13840 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  ding.** operatio
13850 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d  n.  Special comm
13860 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61  ents in vdbe.c a
13870 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68  nd the mkopcodeh
13880 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a  .awk script in.*
13890 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65  * the make proce
138a0 73 73 20 63 61 75 73 65 20 74 68 65 73 65 20 76  ss cause these v
138b0 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20  alues to align. 
138c0 20 41 73 73 65 72 74 28 29 73 20 69 6e 20 74 68   Assert()s in th
138d0 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20  e code.** below 
138e0 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
138f0 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67  numbers are alig
13900 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a  ned correctly..*
13910 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
13920 70 72 49 66 54 72 75 65 28 50 61 72 73 65 20 2a  prIfTrue(Parse *
13930 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
13940 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
13950 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
13960 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
13970 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
13980 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72   op = 0;.  int r
13990 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69  egFree1 = 0;.  i
139a0 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  nt regFree2 = 0;
139b0 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a  .  int r1, r2;..
139c0 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66    assert( jumpIf
139d0 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d  Null==SQLITE_JUM
139e0 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49  PIFNULL || jumpI
139f0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  fNull==0 );.  if
13a00 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d  ( v==0 || pExpr=
13a10 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6f  =0 ) return;.  o
13a20 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
13a30 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
13a40 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
13a50 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d  {.      int d2 =
13a60 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
13a70 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
13a80 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
13a90 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
13aa0 20 74 65 73 74 63 61 73 65 28 20 70 50 61 72 73   testcase( pPars
13ab0 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63  e->disableColCac
13ac0 68 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  he==0 );.      s
13ad0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
13ae0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
13af0 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49  >pLeft, d2,jumpI
13b00 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d  fNull^SQLITE_JUM
13b10 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
13b20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43  pParse->disableC
13b30 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20 20 20 20 20  olCache++;.     
13b40 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
13b50 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
13b60 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
13b70 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
13b80 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
13b90 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63  e->disableColCac
13ba0 68 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 50  he>0 );.      pP
13bb0 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c  arse->disableCol
13bc0 43 61 63 68 65 2d 2d 3b 0a 20 20 20 20 20 20 73  Cache--;.      s
13bd0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
13be0 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20  eLabel(v, d2);. 
13bf0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13c00 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  }.    case TK_OR
13c10 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
13c20 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
13c30 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
13c40 61 73 65 28 20 70 50 61 72 73 65 2d 3e 64 69 73  ase( pParse->dis
13c50 61 62 6c 65 43 6f 6c 43 61 63 68 65 3d 3d 30 20  ableColCache==0 
13c60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13c70 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
13c80 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
13c90 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
13ca0 6c 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  l);.      pParse
13cb0 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68  ->disableColCach
13cc0 65 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e++;.      sqlit
13cd0 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
13ce0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
13cf0 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
13d00 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73  Null);.      ass
13d10 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 69 73  ert( pParse->dis
13d20 61 62 6c 65 43 6f 6c 43 61 63 68 65 3e 30 20 29  ableColCache>0 )
13d30 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
13d40 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d  disableColCache-
13d50 2d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  -;.      break;.
13d60 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
13d70 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74  K_NOT: {.      t
13d80 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
13d90 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
13da0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
13db0 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
13dc0 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
13dd0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
13de0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
13df0 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
13e00 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
13e10 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
13e20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
13e30 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
13e40 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
13e50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
13e60 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20  K_LT==OP_Lt );. 
13e70 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
13e80 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20  LE==OP_Le );.   
13e90 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54     assert( TK_GT
13ea0 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20  ==OP_Gt );.     
13eb0 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d   assert( TK_GE==
13ec0 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61  OP_Ge );.      a
13ed0 73 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50  ssert( TK_EQ==OP
13ee0 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Eq );.      ass
13ef0 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e  ert( TK_NE==OP_N
13f00 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
13f10 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29  ase( op==TK_LT )
13f20 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
13f30 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20  ( op==TK_LE );. 
13f40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
13f50 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20  p==TK_GT );.    
13f60 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
13f70 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74  TK_GE );.      t
13f80 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
13f90 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  EQ );.      test
13fa0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20  case( op==TK_NE 
13fb0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
13fc0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
13fd0 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f   );.      codeCo
13fe0 6d 70 61 72 65 4f 70 65 72 61 6e 64 73 28 70 50  mpareOperands(pP
13ff0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
14000 66 74 2c 20 26 72 31 2c 20 26 72 65 67 46 72 65  ft, &r1, &regFre
14010 65 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e1,.            
14020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14030 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69        pExpr->pRi
14040 67 68 74 2c 20 26 72 32 2c 20 26 72 65 67 46 72  ght, &r2, &regFr
14050 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ee2);.      code
14060 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
14070 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
14080 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
14090 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
140a0 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c     r1, r2, dest,
140b0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
140c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
140d0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
140e0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
140f0 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
14100 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
14110 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
14120 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
14130 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
14140 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c  assert( TK_ISNUL
14150 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a  L==OP_IsNull );.
14160 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
14170 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74  _NOTNULL==OP_Not
14180 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 74 65  Null );.      te
14190 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
141a0 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74  SNULL );.      t
141b0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
141c0 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  NOTNULL );.     
141d0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
141e0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
141f0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
14200 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
14210 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14220 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64  Op2(v, op, r1, d
14230 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  est);.      test
14240 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
14250 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
14260 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
14270 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
14280 20 20 20 20 20 2f 2a 20 20 20 20 78 20 42 45 54       /*    x BET
14290 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20  WEEN y AND z.   
142a0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
142b0 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
142c0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
142d0 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78  **    x>=y AND x
142e0 3c 3d 7a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  <=z.      **.   
142f0 20 20 20 2a 2a 20 43 6f 64 65 20 69 74 20 61 73     ** Code it as
14300 20 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61   such, taking ca
14310 72 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d  re to do the com
14320 6d 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f  mon subexpressio
14330 6e 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65  n.      ** eleme
14340 6e 74 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 20 20  ntation of x..  
14350 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70      */.      Exp
14360 72 20 65 78 70 72 41 6e 64 3b 0a 20 20 20 20 20  r exprAnd;.     
14370 20 45 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b 0a   Expr compLeft;.
14380 20 20 20 20 20 20 45 78 70 72 20 63 6f 6d 70 52        Expr compR
14390 69 67 68 74 3b 0a 20 20 20 20 20 20 45 78 70 72  ight;.      Expr
143a0 20 65 78 70 72 58 3b 0a 0a 20 20 20 20 20 20 65   exprX;..      e
143b0 78 70 72 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70  xprX = *pExpr->p
143c0 4c 65 66 74 3b 0a 20 20 20 20 20 20 65 78 70 72  Left;.      expr
143d0 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b  And.op = TK_AND;
143e0 0a 20 20 20 20 20 20 65 78 70 72 41 6e 64 2e 70  .      exprAnd.p
143f0 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74  Left = &compLeft
14400 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e 64 2e  ;.      exprAnd.
14410 70 52 69 67 68 74 20 3d 20 26 63 6f 6d 70 52 69  pRight = &compRi
14420 67 68 74 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c  ght;.      compL
14430 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a  eft.op = TK_GE;.
14440 20 20 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70        compLeft.p
14450 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20  Left = &exprX;. 
14460 20 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52       compLeft.pR
14470 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  ight = pExpr->pL
14480 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
14490 0a 20 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74  .      compRight
144a0 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 20  .op = TK_LE;.   
144b0 20 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65     compRight.pLe
144c0 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 20  ft = &exprX;.   
144d0 20 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69     compRight.pRi
144e0 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ght = pExpr->pLi
144f0 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
14500 20 20 20 20 20 20 65 78 70 72 58 2e 69 54 61 62        exprX.iTab
14510 6c 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  le = sqlite3Expr
14520 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
14530 20 26 65 78 70 72 58 2c 20 26 72 65 67 46 72 65   &exprX, &regFre
14540 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e1);.      testc
14550 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
14560 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 58 2e   );.      exprX.
14570 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52  op = TK_REGISTER
14580 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14590 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
145a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
145b0 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
145c0 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73  e, &exprAnd, des
145d0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
145e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
145f0 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
14600 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  {.      r1 = sql
14610 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
14620 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
14630 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
14640 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14650 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31  Op3(v, OP_If, r1
14660 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
14670 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 74 65  ll!=0);.      te
14680 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
14690 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
146a0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
146b0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  l==0 );.      br
146c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
146d0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
146e0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
146f0 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69  egFree1);.  sqli
14700 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
14710 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
14720 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e2);  .}../*.** 
14730 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
14740 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72  r a boolean expr
14750 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74  ession such that
14760 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a   a jump is made.
14770 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20  ** to the label 
14780 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78  "dest" if the ex
14790 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73  pression is fals
147a0 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a  e but execution.
147b0 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72  ** continues str
147c0 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68  aight thru if th
147d0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
147e0 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  true..**.** If t
147f0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76  he expression ev
14800 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20  aluates to NULL 
14810 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f  (neither true no
14820 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a  r false) then.**
14830 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e   jump if jumpIfN
14840 75 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a 55  ull is SQLITE_JU
14850 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c  MPIFNULL or fall
14860 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70   through if jump
14870 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a  IfNull.** is 0..
14880 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
14890 78 70 72 49 66 46 61 6c 73 65 28 50 61 72 73 65  xprIfFalse(Parse
148a0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
148b0 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c  pExpr, int dest,
148c0 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
148d0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
148e0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
148f0 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74  nt op = 0;.  int
14900 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20   regFree1 = 0;. 
14910 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20   int regFree2 = 
14920 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b  0;.  int r1, r2;
14930 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70  ..  assert( jump
14940 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a  IfNull==SQLITE_J
14950 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d  UMPIFNULL || jum
14960 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
14970 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70  if( v==0 || pExp
14980 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  r==0 ) return;..
14990 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f    /* The value o
149a0 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20  f pExpr->op and 
149b0 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64 20 61  op are related a
149c0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a  s follows:.  **.
149d0 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72    **       pExpr
149e0 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20  ->op            
149f0 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d  op.  **       --
14a00 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20  -------         
14a10 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a   ----------.  **
14a20 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c         TK_ISNULL
14a30 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74            OP_Not
14a40 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20  Null.  **       
14a50 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20  TK_NOTNULL      
14a60 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a     OP_IsNull.  *
14a70 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20  *       TK_NE   
14a80 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71             OP_Eq
14a90 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45  .  **       TK_E
14aa0 51 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  Q              O
14ab0 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Ne.  **       
14ac0 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20 20  TK_GT           
14ad0 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20     OP_Le.  **   
14ae0 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20      TK_LE       
14af0 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a         OP_Gt.  *
14b00 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20  *       TK_GE   
14b10 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74             OP_Lt
14b20 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c  .  **       TK_L
14b30 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  T              O
14b40 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46  P_Ge.  **.  ** F
14b50 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20  or other values 
14b60 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70  of pExpr->op, op
14b70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e   is undefined an
14b80 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54  d unused..  ** T
14b90 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20  he value of TK_ 
14ba0 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74  and OP_ constant
14bb0 73 20 61 72 65 20 61 72 72 61 6e 67 65 64 20 73  s are arranged s
14bc0 75 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a  uch that we.  **
14bd0 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
14be0 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75   mapping above u
14bf0 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  sing the followi
14c00 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20  ng expression.. 
14c10 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76 65   ** Assert()s ve
14c20 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63 6f  rify that the co
14c30 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72  mputation is cor
14c40 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20  rect..  */.  op 
14c50 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54  = ((pExpr->op+(T
14c60 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d  K_ISNULL&1))^1)-
14c70 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a  (TK_ISNULL&1);..
14c80 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72    /* Verify corr
14c90 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  ect alignment of
14ca0 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e   TK_ and OP_ con
14cb0 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73  stants.  */.  as
14cc0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
14cd0 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70  =TK_ISNULL || op
14ce0 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a  ==OP_NotNull );.
14cf0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
14d00 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20  >op!=TK_NOTNULL 
14d10 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  || op==OP_IsNull
14d20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
14d30 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c  xpr->op!=TK_NE |
14d40 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20  | op==OP_Eq );. 
14d50 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
14d60 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d  op!=TK_EQ || op=
14d70 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Ne );.  asse
14d80 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
14d90 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47  K_LT || op==OP_G
14da0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
14db0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20  Expr->op!=TK_LE 
14dc0 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a  || op==OP_Gt );.
14dd0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
14de0 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70  >op!=TK_GT || op
14df0 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73  ==OP_Le );.  ass
14e00 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
14e10 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_GE || op==OP_
14e20 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28  Lt );..  switch(
14e30 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
14e40 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b    case TK_AND: {
14e50 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14e60 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
14e70 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14e80 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c  ( pParse->disabl
14e90 65 43 6f 6c 43 61 63 68 65 3d 3d 30 20 29 3b 0a  eColCache==0 );.
14ea0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
14eb0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
14ec0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
14ed0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
14ee0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
14ef0 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b  disableColCache+
14f00 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  +;.      sqlite3
14f10 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
14f20 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
14f30 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
14f40 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ull);.      asse
14f50 72 74 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61  rt( pParse->disa
14f60 62 6c 65 43 6f 6c 43 61 63 68 65 3e 30 20 29 3b  bleColCache>0 );
14f70 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  .      pParse->d
14f80 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d  isableColCache--
14f90 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
14fa0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
14fb0 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _OR: {.      int
14fc0 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   d2 = sqlite3Vdb
14fd0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
14fe0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
14ff0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
15000 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15010 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43  pParse->disableC
15020 6f 6c 43 61 63 68 65 3d 3d 30 20 29 3b 0a 20 20  olCache==0 );.  
15030 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
15040 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
15050 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20  xpr->pLeft, d2, 
15060 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54  jumpIfNull^SQLIT
15070 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
15080 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73       pParse->dis
15090 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a  ableColCache++;.
150a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
150b0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
150c0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
150d0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
150e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
150f0 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65   pParse->disable
15100 43 6f 6c 43 61 63 68 65 3e 30 20 29 3b 0a 20 20  ColCache>0 );.  
15110 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61      pParse->disa
15120 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20  bleColCache--;. 
15130 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15140 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
15150 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  d2);.      break
15160 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
15170 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
15180 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
15190 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
151a0 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
151b0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
151c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
151d0 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
151e0 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
151f0 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
15200 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
15210 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
15220 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
15230 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
15240 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20   op==TK_LT );.  
15250 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
15260 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20  ==TK_LE );.     
15270 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
15280 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65  K_GT );.      te
15290 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47  stcase( op==TK_G
152a0 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  E );.      testc
152b0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20 29  ase( op==TK_EQ )
152c0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
152d0 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20  ( op==TK_NE );. 
152e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
152f0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
15300 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
15310 65 4f 70 65 72 61 6e 64 73 28 70 50 61 72 73 65  eOperands(pParse
15320 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
15330 26 72 31 2c 20 26 72 65 67 46 72 65 65 31 2c 0a  &r1, &regFree1,.
15340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15360 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c    pExpr->pRight,
15370 20 26 72 32 2c 20 26 72 65 67 46 72 65 65 32 29   &r2, &regFree2)
15380 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
15390 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
153a0 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
153b0 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
153c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
153d0 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d  1, r2, dest, jum
153e0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
153f0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
15400 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
15410 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
15420 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
15430 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
15440 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
15450 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
15460 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  LL: {.      test
15470 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
15480 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ULL );.      tes
15490 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f  tcase( op==TK_NO
154a0 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72  TNULL );.      r
154b0 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
154c0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
154d0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
154e0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
154f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15500 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73  2(v, op, r1, des
15510 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
15520 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
15530 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
15540 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
15550 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
15560 20 20 20 2f 2a 20 20 20 20 78 20 42 45 54 57 45     /*    x BETWE
15570 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 20  EN y AND z.     
15580 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 73 20   **.      ** Is 
15590 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20  equivalent to . 
155a0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
155b0 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d      x>=y AND x<=
155c0 7a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  z.      **.     
155d0 20 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73   ** Code it as s
155e0 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65  uch, taking care
155f0 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f   to do the commo
15600 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a  n subexpression.
15610 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74        ** element
15620 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 20 20 20 20  ation of x..    
15630 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20    */.      Expr 
15640 65 78 70 72 41 6e 64 3b 0a 20 20 20 20 20 20 45  exprAnd;.      E
15650 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b 0a 20 20  xpr compLeft;.  
15660 20 20 20 20 45 78 70 72 20 63 6f 6d 70 52 69 67      Expr compRig
15670 68 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 65  ht;.      Expr e
15680 78 70 72 58 3b 0a 0a 20 20 20 20 20 20 65 78 70  xprX;..      exp
15690 72 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65  rX = *pExpr->pLe
156a0 66 74 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e  ft;.      exprAn
156b0 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20  d.op = TK_AND;. 
156c0 20 20 20 20 20 65 78 70 72 41 6e 64 2e 70 4c 65       exprAnd.pLe
156d0 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a  ft = &compLeft;.
156e0 20 20 20 20 20 20 65 78 70 72 41 6e 64 2e 70 52        exprAnd.pR
156f0 69 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68  ight = &compRigh
15700 74 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65 66  t;.      compLef
15710 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20  t.op = TK_GE;.  
15720 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65      compLeft.pLe
15730 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 20  ft = &exprX;.   
15740 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67     compLeft.pRig
15750 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  ht = pExpr->pLis
15760 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
15770 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f       compRight.o
15780 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 20 20 20  p = TK_LE;.     
15790 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66 74   compRight.pLeft
157a0 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 20 20 20   = &exprX;.     
157b0 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69 67 68   compRight.pRigh
157c0 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
157d0 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
157e0 20 20 20 20 65 78 70 72 58 2e 69 54 61 62 6c 65      exprX.iTable
157f0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
15800 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26  deTemp(pParse, &
15810 65 78 70 72 58 2c 20 26 72 65 67 46 72 65 65 31  exprX, &regFree1
15820 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
15830 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
15840 3b 0a 20 20 20 20 20 20 65 78 70 72 58 2e 6f 70  ;.      exprX.op
15850 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a   = TK_REGISTER;.
15860 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15870 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
15880 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
15890 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
158a0 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74  , &exprAnd, dest
158b0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
158c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
158d0 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
158e0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
158f0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
15900 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26  pParse, pExpr, &
15910 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
15920 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15930 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p3(v, OP_IfNot, 
15940 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  r1, dest, jumpIf
15950 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20  Null!=0);.      
15960 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
15970 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
15980 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
15990 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
159a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
159b0 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
159c0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
159d0 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
159e0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
159f0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
15a00 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ree2);.}../*.** 
15a10 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72  Do a deep compar
15a20 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72  ison of two expr
15a30 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52  ession trees.  R
15a40 65 74 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d  eturn TRUE (non-
15a50 7a 65 72 6f 29 0a 2a 2a 20 69 66 20 74 68 65 79  zero).** if they
15a60 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 20 61   are identical a
15a70 6e 64 20 72 65 74 75 72 6e 20 46 41 4c 53 45 20  nd return FALSE 
15a80 69 66 20 74 68 65 79 20 64 69 66 66 65 72 20 69  if they differ i
15a90 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a  n any way..**.**
15aa0 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69 73 20   Sometimes this 
15ab0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
15ac0 75 72 6e 20 46 41 4c 53 45 20 65 76 65 6e 20 69  urn FALSE even i
15ad0 66 20 74 68 65 20 74 77 6f 20 65 78 70 72 65 73  f the two expres
15ae0 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20  sions.** really 
15af0 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20  are equivalent. 
15b00 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 70 72   If we cannot pr
15b10 6f 76 65 20 74 68 61 74 20 74 68 65 20 65 78 70  ove that the exp
15b20 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20  ressions are.** 
15b30 69 64 65 6e 74 69 63 61 6c 2c 20 77 65 20 72 65  identical, we re
15b40 74 75 72 6e 20 46 41 4c 53 45 20 6a 75 73 74 20  turn FALSE just 
15b50 74 6f 20 62 65 20 73 61 66 65 2e 20 20 53 6f 20  to be safe.  So 
15b60 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  if this routine.
15b70 2a 2a 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  ** returns false
15b80 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f  , then you do no
15b90 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f  t really know fo
15ba0 72 20 63 65 72 74 61 69 6e 20 69 66 20 74 68 65  r certain if the
15bb0 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69   two.** expressi
15bc0 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  ons are the same
15bd0 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20 67 65  .  But if you ge
15be0 74 20 61 20 54 52 55 45 20 72 65 74 75 72 6e 2c  t a TRUE return,
15bf0 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e   then you.** can
15c00 20 62 65 20 73 75 72 65 20 74 68 65 20 65 78 70   be sure the exp
15c10 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65  ressions are the
15c20 20 73 61 6d 65 2e 20 20 49 6e 20 74 68 65 20 70   same.  In the p
15c30 6c 61 63 65 73 20 77 68 65 72 65 0a 2a 2a 20 74  laces where.** t
15c40 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
15c50 73 65 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  sed, it does not
15c60 20 68 75 72 74 20 74 6f 20 67 65 74 20 61 6e 20   hurt to get an 
15c70 65 78 74 72 61 20 46 41 4c 53 45 20 2d 20 74 68  extra FALSE - th
15c80 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74  at.** just might
15c90 20 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20   result in some 
15ca0 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20  slightly slower 
15cb0 63 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75 72  code.  But retur
15cc0 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72  ning.** an incor
15cd0 72 65 63 74 20 54 52 55 45 20 63 6f 75 6c 64 20  rect TRUE could 
15ce0 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e  lead to a malfun
15cf0 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
15d00 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
15d10 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20  (Expr *pA, Expr 
15d20 2a 70 42 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  *pB){.  int i;. 
15d30 20 69 66 28 20 70 41 3d 3d 30 7c 7c 70 42 3d 3d   if( pA==0||pB==
15d40 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
15d50 70 42 3d 3d 70 41 3b 0a 20 20 7d 0a 20 20 69 66  pB==pA;.  }.  if
15d60 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70  ( pA->op!=pB->op
15d70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
15d80 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20  f( (pA->flags & 
15d90 45 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70  EP_Distinct)!=(p
15da0 42 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  B->flags & EP_Di
15db0 73 74 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e  stinct) ) return
15dc0 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   0;.  if( !sqlit
15dd0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  e3ExprCompare(pA
15de0 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65  ->pLeft, pB->pLe
15df0 66 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ft) ) return 0;.
15e00 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
15e10 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52  prCompare(pA->pR
15e20 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74  ight, pB->pRight
15e30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
15e40 69 66 28 20 70 41 2d 3e 70 4c 69 73 74 20 29 7b  if( pA->pList ){
15e50 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 70 4c 69  .    if( pB->pLi
15e60 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
15e70 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 70 4c  ;.    if( pA->pL
15e80 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e  ist->nExpr!=pB->
15e90 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 20 72  pList->nExpr ) r
15ea0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72  eturn 0;.    for
15eb0 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 70 4c 69 73  (i=0; i<pA->pLis
15ec0 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
15ed0 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74        if( !sqlit
15ee0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  e3ExprCompare(pA
15ef0 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  ->pList->a[i].pE
15f00 78 70 72 2c 20 70 42 2d 3e 70 4c 69 73 74 2d 3e  xpr, pB->pList->
15f10 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  a[i].pExpr) ){. 
15f20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
15f30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15f40 20 7d 65 6c 73 65 20 69 66 28 20 70 42 2d 3e 70   }else if( pB->p
15f50 4c 69 73 74 20 29 7b 0a 20 20 20 20 72 65 74 75  List ){.    retu
15f60 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
15f70 70 41 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 70  pA->pSelect || p
15f80 42 2d 3e 70 53 65 6c 65 63 74 20 29 20 72 65 74  B->pSelect ) ret
15f90 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d  urn 0;.  if( pA-
15fa0 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61  >iTable!=pB->iTa
15fb0 62 6c 65 20 7c 7c 20 70 41 2d 3e 69 43 6f 6c 75  ble || pA->iColu
15fc0 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20  mn!=pB->iColumn 
15fd0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
15fe0 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  ( pA->op!=TK_COL
15ff0 55 4d 4e 20 26 26 20 70 41 2d 3e 74 6f 6b 65 6e  UMN && pA->token
16000 2e 7a 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  .z ){.    if( pB
16010 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 20 72  ->token.z==0 ) r
16020 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28  eturn 0;.    if(
16030 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 70 41   pB->token.n!=pA
16040 2d 3e 74 6f 6b 65 6e 2e 6e 20 29 20 72 65 74 75  ->token.n ) retu
16050 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71  rn 0;.    if( sq
16060 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63  lite3StrNICmp((c
16070 68 61 72 2a 29 70 41 2d 3e 74 6f 6b 65 6e 2e 7a  har*)pA->token.z
16080 2c 28 63 68 61 72 2a 29 70 42 2d 3e 74 6f 6b 65  ,(char*)pB->toke
16090 6e 2e 7a 2c 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 29  n.z,pB->token.n)
160a0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=0 ){.      ret
160b0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
160c0 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
160d0 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
160e0 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
160f0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
16100 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
16110 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20  the index of.** 
16120 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e  the new element.
16130 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74    Return a negat
16140 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61  ive number if ma
16150 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  lloc fails..*/.s
16160 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67  tatic int addAgg
16170 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74  InfoColumn(sqlit
16180 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20  e3 *db, AggInfo 
16190 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69  *pInfo){.  int i
161a0 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20  ;.  pInfo->aCol 
161b0 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c  = sqlite3ArrayAl
161c0 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64  locate(.       d
161d0 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d  b,.       pInfo-
161e0 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69  >aCol,.       si
161f0 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c  zeof(pInfo->aCol
16200 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 33 2c 0a  [0]),.       3,.
16210 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e         &pInfo->n
16220 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26  Column,.       &
16230 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 41 6c  pInfo->nColumnAl
16240 6c 6f 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20  loc,.       &i. 
16250 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a   );.  return i;.
16260 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  }    ../*.** Add
16270 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
16280 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e  o the pAggInfo->
16290 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20  aFunc[] array.  
162a0 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
162b0 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65   of.** the new e
162c0 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  lement.  Return 
162d0 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
162e0 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  r if malloc fail
162f0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
16300 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28   addAggInfoFunc(
16310 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67  sqlite3 *db, Agg
16320 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20  Info *pInfo){.  
16330 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e  int i;.  pInfo->
16340 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 41  aFunc = sqlite3A
16350 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20  rrayAllocate(.  
16360 20 20 20 20 20 64 62 2c 20 0a 20 20 20 20 20 20       db, .      
16370 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20   pInfo->aFunc,. 
16380 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e        sizeof(pIn
16390 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20  fo->aFunc[0]),. 
163a0 20 20 20 20 20 20 33 2c 0a 20 20 20 20 20 20 20        3,.       
163b0 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20  &pInfo->nFunc,. 
163c0 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46        &pInfo->nF
163d0 75 6e 63 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20  uncAlloc,.      
163e0 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72   &i.  );.  retur
163f0 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a  n i;.}    ../*.*
16400 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78 45  * This is the xE
16410 78 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20  xprCallback for 
16420 61 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 20 20  a tree walker.  
16430 49 74 20 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a  It is used to.**
16440 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74   implement sqlit
16450 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
16460 72 65 67 61 74 65 73 28 29 2e 20 20 53 65 65 20  regates().  See 
16470 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
16480 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20  zeAggregates.** 
16490 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
164a0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  nformation..*/.s
164b0 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a  tatic int analyz
164c0 65 41 67 67 72 65 67 61 74 65 28 57 61 6c 6b 65  eAggregate(Walke
164d0 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
164e0 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
164f0 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  i;.  NameContext
16500 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d   *pNC = pWalker-
16510 3e 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65 20  >u.pNC;.  Parse 
16520 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  *pParse = pNC->p
16530 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74  Parse;.  SrcList
16540 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43   *pSrcList = pNC
16550 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41 67  ->pSrcList;.  Ag
16560 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20  gInfo *pAggInfo 
16570 3d 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b  = pNC->pAggInfo;
16580 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
16590 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
165a0 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
165b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
165c0 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  UMN: {.      /* 
165d0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
165e0 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e  the column is in
165f0 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c   one of the tabl
16600 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20  es in the FROM. 
16610 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f       ** clause o
16620 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
16630 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69  query */.      i
16640 66 28 20 70 53 72 63 4c 69 73 74 20 29 7b 0a 20  f( pSrcList ){. 
16650 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72         struct Sr
16660 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
16670 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b  m = pSrcList->a;
16680 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
16690 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53  ; i<pSrcList->nS
166a0 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
166b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  ){.          str
166c0 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
166d0 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20  *pCol;.         
166e0 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
166f0 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73  le==pItem->iCurs
16700 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  or ){.          
16710 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
16720 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20   this point, it 
16730 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78 70 72  means that pExpr
16740 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
16750 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  le.            *
16760 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65  * that is in the
16770 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
16780 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75  the aggregate qu
16790 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20  ery.  .         
167a0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
167b0 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74    ** Make an ent
167c0 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ry for the colum
167d0 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  n in pAggInfo->a
167e0 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20  Col[] if there. 
167f0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73             ** is
16800 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68   not an entry th
16810 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20  ere already..   
16820 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
16830 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20          int k;. 
16840 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20             pCol 
16850 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  = pAggInfo->aCol
16860 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
16870 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66  r(k=0; k<pAggInf
16880 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c  o->nColumn; k++,
16890 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   pCol++){.      
168a0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
168b0 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d  ->iTable==pExpr-
168c0 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20  >iTable &&.     
168d0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
168e0 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70  l->iColumn==pExp
168f0 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  r->iColumn ){.  
16900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
16910 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
16920 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
16930 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
16940 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d  f( (k>=pAggInfo-
16950 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20  >nColumn).      
16960 20 20 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61         && (k = a
16970 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28  ddAggInfoColumn(
16980 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67  pParse->db, pAgg
16990 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20  Info))>=0 .     
169a0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
169b0 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26          pCol = &
169c0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b  pAggInfo->aCol[k
169d0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
169e0 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45   pCol->pTab = pE
169f0 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
16a00 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
16a10 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69  Table = pExpr->i
16a20 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
16a30 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75       pCol->iColu
16a40 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  mn = pExpr->iCol
16a50 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  umn;.           
16a60 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20     pCol->iMem = 
16a70 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
16a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
16a90 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
16aa0 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  n = -1;.        
16ab0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70        pCol->pExp
16ac0 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  r = pExpr;.     
16ad0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 41 67           if( pAg
16ae0 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20  gInfo->pGroupBy 
16af0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
16b00 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20     int j, n;.   
16b10 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
16b20 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67  rList *pGB = pAg
16b30 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b  gInfo->pGroupBy;
16b40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16b50 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
16b60 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70  _item *pTerm = p
16b70 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20  GB->a;.         
16b80 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e         n = pGB->
16b90 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  nExpr;.         
16ba0 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
16bb0 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b  j<n; j++, pTerm+
16bc0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
16bd0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
16be0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
16bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c00 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
16c10 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54  COLUMN && pE->iT
16c20 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61  able==pExpr->iTa
16c30 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20  ble &&.         
16c40 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 2d               pE-
16c50 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
16c60 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
16c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c80 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
16c90 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  umn = j;.       
16ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
16cb0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
16cc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16cd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16ce0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16cf0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
16d00 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c  ->iSorterColumn<
16d10 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
16d20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
16d30 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49  erColumn = pAggI
16d40 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c  nfo->nSortingCol
16d50 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  umn++;.         
16d60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
16d70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
16d80 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77   /* There is now
16d90 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45   an entry for pE
16da0 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  xpr in pAggInfo-
16db0 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a  >aCol[] (either.
16dc0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62              ** b
16dd0 65 63 61 75 73 65 20 69 74 20 77 61 73 20 74 68  ecause it was th
16de0 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65  ere before or be
16df0 63 61 75 73 65 20 77 65 20 6a 75 73 74 20 63 72  cause we just cr
16e00 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20  eated it)..     
16e10 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72         ** Conver
16e20 74 20 74 68 65 20 70 45 78 70 72 20 74 6f 20 62  t the pExpr to b
16e30 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  e a TK_AGG_COLUM
16e40 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74  N referring to t
16e50 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  hat.            
16e60 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  ** pAggInfo->aCo
16e70 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20  l[] entry..     
16e80 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
16e90 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67        pExpr->pAg
16ea0 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f  gInfo = pAggInfo
16eb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
16ec0 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47  xpr->op = TK_AGG
16ed0 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20  _COLUMN;.       
16ee0 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67       pExpr->iAgg
16ef0 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20   = k;.          
16f00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
16f10 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45     } /* endif pE
16f20 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74  xpr->iTable==pIt
16f30 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20  em->iCursor */. 
16f40 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20         } /* end 
16f50 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c 69  loop over pSrcLi
16f60 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  st */.      }.  
16f70 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
16f80 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rune;.    }.    
16f90 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
16fa0 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  TION: {.      /*
16fb0 20 54 68 65 20 70 4e 43 2d 3e 6e 44 65 70 74 68   The pNC->nDepth
16fc0 3d 3d 30 20 74 65 73 74 20 63 61 75 73 65 73 20  ==0 test causes 
16fd0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
16fe0 6f 6e 73 20 69 6e 20 73 75 62 71 75 65 72 69 65  ons in subquerie
16ff0 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65  s.      ** to be
17000 20 69 67 6e 6f 72 65 64 20 2a 2f 0a 20 20 20 20   ignored */.    
17010 20 20 69 66 28 20 70 4e 43 2d 3e 6e 44 65 70 74    if( pNC->nDept
17020 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  h==0 ){.        
17030 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
17040 69 66 20 70 45 78 70 72 20 69 73 20 61 20 64 75  if pExpr is a du
17050 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68  plicate of anoth
17060 65 72 20 61 67 67 72 65 67 61 74 65 20 0a 20 20  er aggregate .  
17070 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
17080 6e 20 74 68 61 74 20 69 73 20 61 6c 72 65 61 64  n that is alread
17090 79 20 69 6e 20 74 68 65 20 70 41 67 67 49 6e 66  y in the pAggInf
170a0 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20  o structure.    
170b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
170c0 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
170d0 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70 41 67 67  nc *pItem = pAgg
170e0 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20  Info->aFunc;.   
170f0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
17100 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
17110 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
17120 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
17130 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
17140 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70  (pItem->pExpr, p
17150 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
17160 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17170 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17180 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e  }.        if( i>
17190 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  =pAggInfo->nFunc
171a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
171b0 20 70 45 78 70 72 20 69 73 20 6f 72 69 67 69 6e   pExpr is origin
171c0 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77 20  al.  Make a new 
171d0 65 6e 74 72 79 20 69 6e 20 70 41 67 67 49 6e 66  entry in pAggInf
171e0 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20  o->aFunc[].     
171f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
17200 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70    u8 enc = ENC(p
17210 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20  Parse->db);.    
17220 20 20 20 20 20 20 69 20 3d 20 61 64 64 41 67 67        i = addAgg
17230 49 6e 66 6f 46 75 6e 63 28 70 50 61 72 73 65 2d  InfoFunc(pParse-
17240 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b 0a  >db, pAggInfo);.
17250 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
17260 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
17270 20 20 70 49 74 65 6d 20 3d 20 26 70 41 67 67 49    pItem = &pAggI
17280 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20  nfo->aFunc[i];. 
17290 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
172a0 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ->pExpr = pExpr;
172b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
172c0 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  em->iMem = ++pPa
172d0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
172e0 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 46         pItem->pF
172f0 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  unc = sqlite3Fin
17300 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  dFunction(pParse
17310 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ->db,.          
17320 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
17330 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pExpr->token.z, 
17340 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 0a  pExpr->token.n,.
17350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17360 20 20 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20     pExpr->pList 
17370 3f 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  ? pExpr->pList->
17380 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20  nExpr : 0, enc, 
17390 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
173a0 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
173b0 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29   & EP_Distinct )
173c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
173d0 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74  pItem->iDistinct
173e0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
173f0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  +;.            }
17400 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
17410 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74      pItem->iDist
17420 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  inct = -1;.     
17430 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17440 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
17450 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70         /* Make p
17460 45 78 70 72 20 70 6f 69 6e 74 20 74 6f 20 74 68  Expr point to th
17470 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 70 41  e appropriate pA
17480 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20  ggInfo->aFunc[] 
17490 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2f  entry.        */
174a0 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
174b0 69 41 67 67 20 3d 20 69 3b 0a 20 20 20 20 20 20  iAgg = i;.      
174c0 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66    pExpr->pAggInf
174d0 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20  o = pAggInfo;.  
174e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
174f0 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a  _Prune;.      }.
17500 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
17510 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
17520 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e  .}.static int an
17530 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 49  alyzeAggregatesI
17540 6e 53 65 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a  nSelect(Walker *
17550 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
17560 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 4e 61 6d  *pSelect){.  Nam
17570 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20  eContext *pNC = 
17580 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a  pWalker->u.pNC;.
17590 20 20 69 66 28 20 70 4e 43 2d 3e 6e 44 65 70 74    if( pNC->nDept
175a0 68 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 43 2d  h==0 ){.    pNC-
175b0 3e 6e 44 65 70 74 68 2b 2b 3b 0a 20 20 20 20 73  >nDepth++;.    s
175c0 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
175d0 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 65 63  (pWalker, pSelec
175e0 74 29 3b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65  t);.    pNC->nDe
175f0 70 74 68 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72  pth--;.    retur
17600 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d  n WRC_Prune;.  }
17610 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
17620 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
17630 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c   }.}../*.** Anal
17640 79 7a 65 20 74 68 65 20 67 69 76 65 6e 20 65 78  yze the given ex
17650 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67  pression looking
17660 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66   for aggregate f
17670 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20  unctions and.** 
17680 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74 68  for variables th
17690 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64  at need to be ad
176a0 64 65 64 20 74 6f 20 74 68 65 20 70 50 61 72 73  ded to the pPars
176b0 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 2e  e->aAgg[] array.
176c0 0a 2a 2a 20 4d 61 6b 65 20 61 64 64 69 74 69 6f  .** Make additio
176d0 6e 61 6c 20 65 6e 74 72 69 65 73 20 74 6f 20 74  nal entries to t
176e0 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b  he pParse->aAgg[
176f0 5d 20 61 72 72 61 79 20 61 73 20 6e 65 63 65 73  ] array as neces
17700 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  sary..**.** This
17710 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
17720 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61  only be called a
17730 66 74 65 72 20 74 68 65 20 65 78 70 72 65 73 73  fter the express
17740 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  ion has been.** 
17750 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69  analyzed by sqli
17760 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61  te3ResolveExprNa
17770 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  mes()..*/.void s
17780 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
17790 65 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d 65  eAggregates(Name
177a0 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78  Context *pNC, Ex
177b0 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 57 61  pr *pExpr){.  Wa
177c0 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70  lker w;.  w.xExp
177d0 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c  rCallback = anal
177e0 79 7a 65 41 67 67 72 65 67 61 74 65 3b 0a 20 20  yzeAggregate;.  
177f0 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
17800 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  k = analyzeAggre
17810 67 61 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20  gatesInSelect;. 
17820 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a   w.u.pNC = pNC;.
17830 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
17840 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a  r(&w, pExpr);.}.
17850 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69  ./*.** Call sqli
17860 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
17870 67 72 65 67 61 74 65 73 28 29 20 66 6f 72 20 65  gregates() for e
17880 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  very expression 
17890 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73  in an.** express
178a0 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74 75 72  ion list.  Retur
178b0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
178c0 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  errors..**.** If
178d0 20 61 6e 20 65 72 72 6f 72 20 69 73 20 66 6f 75   an error is fou
178e0 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73  nd, the analysis
178f0 20 69 73 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a   is cut short..*
17900 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
17910 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
17920 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e  (NameContext *pN
17930 43 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  C, ExprList *pLi
17940 73 74 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78  st){.  struct Ex
17950 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
17960 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  em;.  int i;.  i
17970 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
17980 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
17990 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74  >a, i=0; i<pList
179a0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  ->nExpr; i++, pI
179b0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  tem++){.      sq
179c0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
179d0 41 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c 20  Aggregates(pNC, 
179e0 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
179f0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
17a00 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65  * Allocate or de
17a10 61 6c 6c 6f 63 61 74 65 20 74 65 6d 70 6f 72 61  allocate tempora
17a20 72 79 20 75 73 65 20 72 65 67 69 73 74 65 72 73  ry use registers
17a30 20 64 75 72 69 6e 67 20 63 6f 64 65 20 67 65 6e   during code gen
17a40 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  eration..*/.int 
17a50 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
17a60 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  g(Parse *pParse)
17a70 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
17a80 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20  nTempReg==0 ){. 
17a90 20 20 20 72 65 74 75 72 6e 20 2b 2b 70 50 61 72     return ++pPar
17aa0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20  se->nMem;.  }.  
17ab0 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 61  return pParse->a
17ac0 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73 65  TempReg[--pParse
17ad0 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 76  ->nTempReg];.}.v
17ae0 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61  oid sqlite3Relea
17af0 73 65 54 65 6d 70 52 65 67 28 50 61 72 73 65 20  seTempReg(Parse 
17b00 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
17b10 67 29 7b 0a 20 20 69 66 28 20 69 52 65 67 20 26  g){.  if( iReg &
17b20 26 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  & pParse->nTempR
17b30 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61  eg<ArraySize(pPa
17b40 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29  rse->aTempReg) )
17b50 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
17b60 72 57 72 69 74 61 62 6c 65 52 65 67 69 73 74 65  rWritableRegiste
17b70 72 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20  r(pParse, iReg, 
17b80 69 52 65 67 29 3b 0a 20 20 20 20 70 50 61 72 73  iReg);.    pPars
17b90 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72  e->aTempReg[pPar
17ba0 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20  se->nTempReg++] 
17bb0 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = iReg;.  }.}../
17bc0 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72  *.** Allocate or
17bd0 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 20 62 6c   deallocate a bl
17be0 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e 73  ock of nReg cons
17bf0 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72  ecutive register
17c00 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  s.*/.int sqlite3
17c10 47 65 74 54 65 6d 70 52 61 6e 67 65 28 50 61 72  GetTempRange(Par
17c20 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
17c30 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c 20  nReg){.  int i, 
17c40 6e 3b 0a 20 20 69 20 3d 20 70 50 61 72 73 65 2d  n;.  i = pParse-
17c50 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e 20  >iRangeReg;.  n 
17c60 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65  = pParse->nRange
17c70 52 65 67 3b 0a 20 20 69 66 28 20 6e 52 65 67 3c  Reg;.  if( nReg<
17c80 3d 6e 20 26 26 20 21 75 73 65 64 41 73 43 6f 6c  =n && !usedAsCol
17c90 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c  umnCache(pParse,
17ca0 20 69 2c 20 69 2b 6e 2d 31 29 20 29 7b 0a 20 20   i, i+n-1) ){.  
17cb0 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65    pParse->iRange
17cc0 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20  Reg += nReg;.   
17cd0 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
17ce0 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65  eg -= nReg;.  }e
17cf0 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20 70 50 61  lse{.    i = pPa
17d00 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
17d10 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
17d20 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74   nReg;.  }.  ret
17d30 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71  urn i;.}.void sq
17d40 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
17d50 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61  Range(Parse *pPa
17d60 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69  rse, int iReg, i
17d70 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 66 28 20  nt nReg){.  if( 
17d80 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61  nReg>pParse->nRa
17d90 6e 67 65 52 65 67 20 29 7b 0a 20 20 20 20 70 50  ngeReg ){.    pP
17da0 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
17db0 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72  = nReg;.    pPar
17dc0 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d 20  se->iRangeReg = 
17dd0 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a              iReg;.  }.}.