0000: 2f 2a 0a 2a 2a 20 32 30 31 35 2d 30 36 2d 30 38 /*.** 2015-06-08
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 urce code. In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67 lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 al notice, here
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 *.** May you
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 do good and not
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20 evil..** May
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65 you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74 f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20 hers..** May
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79 you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76 ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a e..**.**********
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 0a ***************.
0170: 2a 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 63 ** This module c
0180: 6f 6e 74 61 69 6e 73 20 43 20 63 6f 64 65 20 74 ontains C code t
0190: 68 61 74 20 67 65 6e 65 72 61 74 65 73 20 56 44 hat generates VD
01a0: 42 45 20 63 6f 64 65 20 75 73 65 64 20 74 6f 20 BE code used to
01b0: 70 72 6f 63 65 73 73 0a 2a 2a 20 74 68 65 20 57 process.** the W
01c0: 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 53 HERE clause of S
01d0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a QL statements..*
01e0: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 77 *.** This file w
01f0: 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 70 61 as originally pa
0200: 72 74 20 6f 66 20 77 68 65 72 65 2e 63 20 62 75 rt of where.c bu
0210: 74 20 77 61 73 20 73 70 6c 69 74 20 6f 75 74 20 t was split out
0220: 74 6f 20 69 6d 70 72 6f 76 65 0a 2a 2a 20 72 65 to improve.** re
0230: 61 64 61 62 69 6c 69 74 79 20 61 6e 64 20 65 64 adability and ed
0240: 69 74 61 62 69 6c 69 69 74 79 2e 20 20 54 68 69 itabiliity. Thi
0250: 73 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 s file contains
0260: 75 74 69 6c 69 74 79 20 72 6f 75 74 69 6e 65 73 utility routines
0270: 20 66 6f 72 0a 2a 2a 20 61 6e 61 6c 79 7a 69 6e for.** analyzin
0280: 67 20 45 78 70 72 20 6f 62 6a 65 63 74 73 20 69 g Expr objects i
0290: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 n the WHERE clau
02a0: 73 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 se..*/.#include
02b0: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 "sqliteInt.h".#i
02c0: 6e 63 6c 75 64 65 20 22 77 68 65 72 65 49 6e 74 nclude "whereInt
02d0: 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 .h"../* Forward
02e0: 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a declarations */.
02f0: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 static void expr
0300: 41 6e 61 6c 79 7a 65 28 53 72 63 4c 69 73 74 2a Analyze(SrcList*
0310: 2c 20 57 68 65 72 65 43 6c 61 75 73 65 2a 2c 20 , WhereClause*,
0320: 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 int);../*.** Dea
0330: 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d 6f llocate all memo
0340: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 ry associated wi
0350: 74 68 20 61 20 57 68 65 72 65 4f 72 49 6e 66 6f th a WhereOrInfo
0360: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 object..*/.stat
0370: 69 63 20 76 6f 69 64 20 77 68 65 72 65 4f 72 49 ic void whereOrI
0380: 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c 69 74 65 nfoDelete(sqlite
0390: 33 20 2a 64 62 2c 20 57 68 65 72 65 4f 72 49 6e 3 *db, WhereOrIn
03a0: 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 fo *p){. sqlite
03b0: 33 57 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 3WhereClauseClea
03c0: 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c r(&p->wc);. sql
03d0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 ite3DbFree(db, p
03e0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c );.}../*.** Deal
03f0: 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d 6f 72 locate all memor
0400: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 y associated wit
0410: 68 20 61 20 57 68 65 72 65 41 6e 64 49 6e 66 6f h a WhereAndInfo
0420: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 object..*/.stat
0430: 69 63 20 76 6f 69 64 20 77 68 65 72 65 41 6e 64 ic void whereAnd
0440: 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c 69 74 InfoDelete(sqlit
0450: 65 33 20 2a 64 62 2c 20 57 68 65 72 65 41 6e 64 e3 *db, WhereAnd
0460: 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c 69 Info *p){. sqli
0470: 74 65 33 57 68 65 72 65 43 6c 61 75 73 65 43 6c te3WhereClauseCl
0480: 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73 ear(&p->wc);. s
0490: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c qlite3DbFree(db,
04a0: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 p);.}../*.** Ad
04b0: 64 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 57 d a single new W
04c0: 68 65 72 65 54 65 72 6d 20 65 6e 74 72 79 20 74 hereTerm entry t
04d0: 6f 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 o the WhereClaus
04e0: 65 20 6f 62 6a 65 63 74 20 70 57 43 2e 0a 2a 2a e object pWC..**
04f0: 20 54 68 65 20 6e 65 77 20 57 68 65 72 65 54 65 The new WhereTe
0500: 72 6d 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e rm object is con
0510: 73 74 72 75 63 74 65 64 20 66 72 6f 6d 20 45 78 structed from Ex
0520: 70 72 20 70 20 61 6e 64 20 77 69 74 68 20 77 74 pr p and with wt
0530: 46 6c 61 67 73 2e 0a 2a 2a 20 54 68 65 20 69 6e Flags..** The in
0540: 64 65 78 20 69 6e 20 70 57 43 2d 3e 61 5b 5d 20 dex in pWC->a[]
0550: 6f 66 20 74 68 65 20 6e 65 77 20 57 68 65 72 65 of the new Where
0560: 54 65 72 6d 20 69 73 20 72 65 74 75 72 6e 65 64 Term is returned
0570: 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 20 on success..**
0580: 30 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 0 is returned if
0590: 20 74 68 65 20 6e 65 77 20 57 68 65 72 65 54 65 the new WhereTe
05a0: 72 6d 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 rm could not be
05b0: 61 64 64 65 64 20 64 75 65 20 74 6f 20 61 20 6d added due to a m
05c0: 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 emory.** allocat
05d0: 69 6f 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 20 ion error. The
05e0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f memory allocatio
05f0: 6e 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 62 n failure will b
0600: 65 20 72 65 63 6f 72 64 65 64 20 69 6e 0a 2a 2a e recorded in.**
0610: 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 the db->mallocF
0620: 61 69 6c 65 64 20 66 6c 61 67 20 73 6f 20 74 68 ailed flag so th
0630: 61 74 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 at higher-level
0640: 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20 64 65 functions can de
0650: 74 65 63 74 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 tect it..**.** T
0660: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c his routine will
0670: 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 73 69 increase the si
0680: 7a 65 20 6f 66 20 74 68 65 20 70 57 43 2d 3e 61 ze of the pWC->a
0690: 5b 5d 20 61 72 72 61 79 20 61 73 20 6e 65 63 65 [] array as nece
06a0: 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 ssary..**.** If
06b0: 74 68 65 20 77 74 46 6c 61 67 73 20 61 72 67 75 the wtFlags argu
06c0: 6d 65 6e 74 20 69 6e 63 6c 75 64 65 73 20 54 45 ment includes TE
06d0: 52 4d 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e RM_DYNAMIC, then
06e0: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a responsibility.
06f0: 2a 2a 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74 ** for freeing t
0700: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 he expression p
0710: 69 73 20 61 73 73 75 6d 65 64 20 62 79 20 74 68 is assumed by th
0720: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62 e WhereClause ob
0730: 6a 65 63 74 20 70 57 43 2e 0a 2a 2a 20 54 68 69 ject pWC..** Thi
0740: 73 20 69 73 20 74 72 75 65 20 65 76 65 6e 20 69 s is true even i
0750: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 f this routine f
0760: 61 69 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 ails to allocate
0770: 20 61 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d a new WhereTerm
0780: 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a ..**.** WARNING:
0790: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d This routine m
07a0: 69 67 68 74 20 72 65 61 6c 6c 6f 63 61 74 65 20 ight reallocate
07b0: 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20 74 the space used t
07c0: 6f 20 73 74 6f 72 65 0a 2a 2a 20 57 68 65 72 65 o store.** Where
07d0: 54 65 72 6d 73 2e 20 20 41 6c 6c 20 70 6f 69 6e Terms. All poin
07e0: 74 65 72 73 20 74 6f 20 57 68 65 72 65 54 65 72 ters to WhereTer
07f0: 6d 73 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 ms should be inv
0800: 61 6c 69 64 61 74 65 64 20 61 66 74 65 72 0a 2a alidated after.*
0810: 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 * calling this r
0820: 6f 75 74 69 6e 65 2e 20 20 53 75 63 68 20 70 6f outine. Such po
0830: 69 6e 74 65 72 73 20 6d 61 79 20 62 65 20 72 65 inters may be re
0840: 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 72 initialized by r
0850: 65 66 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 74 68 eferencing.** th
0860: 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79 e pWC->a[] array
0870: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 ..*/.static int
0880: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 whereClauseInser
0890: 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 t(WhereClause *p
08a0: 57 43 2c 20 45 78 70 72 20 2a 70 2c 20 75 31 36 WC, Expr *p, u16
08b0: 20 77 74 46 6c 61 67 73 29 7b 0a 20 20 57 68 65 wtFlags){. Whe
08c0: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 reTerm *pTerm;.
08d0: 20 69 6e 74 20 69 64 78 3b 0a 20 20 74 65 73 74 int idx;. test
08e0: 63 61 73 65 28 20 77 74 46 6c 61 67 73 20 26 20 case( wtFlags &
08f0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a TERM_VIRTUAL );.
0900: 20 20 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d if( pWC->nTerm
0910: 3e 3d 70 57 43 2d 3e 6e 53 6c 6f 74 20 29 7b 0a >=pWC->nSlot ){.
0920: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 WhereTerm *p
0930: 4f 6c 64 20 3d 20 70 57 43 2d 3e 61 3b 0a 20 20 Old = pWC->a;.
0940: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 sqlite3 *db =
0950: 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 pWC->pWInfo->pPa
0960: 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 70 57 43 rse->db;. pWC
0970: 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d ->a = sqlite3DbM
0980: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 allocRawNN(db, s
0990: 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 izeof(pWC->a[0])
09a0: 2a 70 57 43 2d 3e 6e 53 6c 6f 74 2a 32 20 29 3b *pWC->nSlot*2 );
09b0: 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e 61 3d . if( pWC->a=
09c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 =0 ){. if(
09d0: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 wtFlags & TERM_D
09e0: 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 YNAMIC ){.
09f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c sqlite3ExprDel
0a00: 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 ete(db, p);.
0a10: 20 20 7d 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 }. pWC->a
0a20: 20 3d 20 70 4f 6c 64 3b 0a 20 20 20 20 20 20 72 = pOld;. r
0a30: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 eturn 0;. }.
0a40: 20 20 20 6d 65 6d 63 70 79 28 70 57 43 2d 3e 61 memcpy(pWC->a
0a50: 2c 20 70 4f 6c 64 2c 20 73 69 7a 65 6f 66 28 70 , pOld, sizeof(p
0a60: 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e WC->a[0])*pWC->n
0a70: 54 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 Term);. if( p
0a80: 4f 6c 64 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 Old!=pWC->aStati
0a90: 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 c ){. sqlit
0aa0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f 6c e3DbFree(db, pOl
0ab0: 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 d);. }. pW
0ac0: 43 2d 3e 6e 53 6c 6f 74 20 3d 20 73 71 6c 69 74 C->nSlot = sqlit
0ad0: 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 e3DbMallocSize(d
0ae0: 62 2c 20 70 57 43 2d 3e 61 29 2f 73 69 7a 65 6f b, pWC->a)/sizeo
0af0: 66 28 70 57 43 2d 3e 61 5b 30 5d 29 3b 0a 20 20 f(pWC->a[0]);.
0b00: 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 }. pTerm = &pWC
0b10: 2d 3e 61 5b 69 64 78 20 3d 20 70 57 43 2d 3e 6e ->a[idx = pWC->n
0b20: 54 65 72 6d 2b 2b 5d 3b 0a 20 20 69 66 28 20 70 Term++];. if( p
0b30: 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 && ExprHasPrope
0b40: 72 74 79 28 70 2c 20 45 50 5f 55 6e 6c 69 6b 65 rty(p, EP_Unlike
0b50: 6c 79 29 20 29 7b 0a 20 20 20 20 70 54 65 72 6d ly) ){. pTerm
0b60: 2d 3e 74 72 75 74 68 50 72 6f 62 20 3d 20 73 71 ->truthProb = sq
0b70: 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 2d 3e 69 lite3LogEst(p->i
0b80: 54 61 62 6c 65 29 20 2d 20 32 37 30 3b 0a 20 20 Table) - 270;.
0b90: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 65 72 6d }else{. pTerm
0ba0: 2d 3e 74 72 75 74 68 50 72 6f 62 20 3d 20 31 3b ->truthProb = 1;
0bb0: 0a 20 20 7d 0a 20 20 70 54 65 72 6d 2d 3e 70 45 . }. pTerm->pE
0bc0: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 xpr = sqlite3Exp
0bd0: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 29 3b rSkipCollate(p);
0be0: 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 . pTerm->wtFlag
0bf0: 73 20 3d 20 77 74 46 6c 61 67 73 3b 0a 20 20 70 s = wtFlags;. p
0c00: 54 65 72 6d 2d 3e 70 57 43 20 3d 20 70 57 43 3b Term->pWC = pWC;
0c10: 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e . pTerm->iParen
0c20: 74 20 3d 20 2d 31 3b 0a 20 20 6d 65 6d 73 65 74 t = -1;. memset
0c30: 28 26 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 (&pTerm->eOperat
0c40: 6f 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 or, 0,.
0c50: 73 69 7a 65 6f 66 28 57 68 65 72 65 54 65 72 6d sizeof(WhereTerm
0c60: 29 20 2d 20 6f 66 66 73 65 74 6f 66 28 57 68 65 ) - offsetof(Whe
0c70: 72 65 54 65 72 6d 2c 65 4f 70 65 72 61 74 6f 72 reTerm,eOperator
0c80: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 64 78 ));. return idx
0c90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 ;.}../*.** Retur
0ca0: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 n TRUE if the gi
0cb0: 76 65 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 ven operator is
0cc0: 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 one of the opera
0cd0: 74 6f 72 73 20 74 68 61 74 20 69 73 0a 2a 2a 20 tors that is.**
0ce0: 61 6c 6c 6f 77 65 64 20 66 6f 72 20 61 6e 20 69 allowed for an i
0cf0: 6e 64 65 78 61 62 6c 65 20 57 48 45 52 45 20 63 ndexable WHERE c
0d00: 6c 61 75 73 65 20 74 65 72 6d 2e 20 20 54 68 65 lause term. The
0d10: 20 61 6c 6c 6f 77 65 64 20 6f 70 65 72 61 74 6f allowed operato
0d20: 72 73 20 61 72 65 0a 2a 2a 20 22 3d 22 2c 20 22 rs are.** "=", "
0d30: 3c 22 2c 20 22 3e 22 2c 20 22 3c 3d 22 2c 20 22 <", ">", "<=", "
0d40: 3e 3d 22 2c 20 22 49 4e 22 2c 20 22 49 53 22 2c >=", "IN", "IS",
0d50: 20 61 6e 64 20 22 49 53 20 4e 55 4c 4c 22 0a 2a and "IS NULL".*
0d60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c /.static int all
0d70: 6f 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a owedOp(int op){.
0d80: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e assert( TK_GT>
0d90: 54 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54 TK_EQ && TK_GT<T
0da0: 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 K_GE );. assert
0db0: 28 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26 ( TK_LT>TK_EQ &&
0dc0: 20 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a TK_LT<TK_GE );.
0dd0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e assert( TK_LE>
0de0: 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54 TK_EQ && TK_LE<T
0df0: 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 K_GE );. assert
0e00: 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 ( TK_GE==TK_EQ+4
0e10: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d );. return op=
0e20: 3d 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 =TK_IN || (op>=T
0e30: 4b 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 K_EQ && op<=TK_G
0e40: 45 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e E) || op==TK_ISN
0e50: 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 ULL || op==TK_IS
0e60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75 ;.}../*.** Commu
0e70: 74 65 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 te a comparison
0e80: 6f 70 65 72 61 74 6f 72 2e 20 20 45 78 70 72 65 operator. Expre
0e90: 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f ssions of the fo
0ea0: 72 6d 20 22 58 20 6f 70 20 59 22 0a 2a 2a 20 61 rm "X op Y".** a
0eb0: 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 re converted int
0ec0: 6f 20 22 59 20 6f 70 20 58 22 2e 0a 2a 2a 0a 2a o "Y op X"..**.*
0ed0: 2a 20 49 66 20 6c 65 66 74 2f 72 69 67 68 74 20 * If left/right
0ee0: 70 72 65 63 65 64 65 6e 63 65 20 72 75 6c 65 73 precedence rules
0ef0: 20 63 6f 6d 65 20 69 6e 74 6f 20 70 6c 61 79 20 come into play
0f00: 77 68 65 6e 20 64 65 74 65 72 6d 69 6e 69 6e 67 when determining
0f10: 20 74 68 65 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e the.** collatin
0f20: 67 20 73 65 71 75 65 6e 63 65 2c 20 74 68 65 6e g sequence, then
0f30: 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f COLLATE operato
0f40: 72 73 20 61 72 65 20 61 64 6a 75 73 74 65 64 20 rs are adjusted
0f50: 74 6f 20 65 6e 73 75 72 65 0a 2a 2a 20 74 68 61 to ensure.** tha
0f60: 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 t the collating
0f70: 73 65 71 75 65 6e 63 65 20 64 6f 65 73 20 6e 6f sequence does no
0f80: 74 20 63 68 61 6e 67 65 2e 20 20 46 6f 72 20 65 t change. For e
0f90: 78 61 6d 70 6c 65 3a 0a 2a 2a 20 22 59 20 63 6f xample:.** "Y co
0fa0: 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f 70 20 llate NOCASE op
0fb0: 58 22 20 62 65 63 6f 6d 65 73 20 22 58 20 6f 70 X" becomes "X op
0fc0: 20 59 22 20 62 65 63 61 75 73 65 20 61 6e 79 20 Y" because any
0fd0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e collation sequen
0fe0: 63 65 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c 65 66 ce on.** the lef
0ff0: 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61 t hand side of a
1000: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 76 65 72 comparison over
1010: 72 69 64 65 73 20 61 6e 79 20 63 6f 6c 6c 61 74 rides any collat
1020: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 0a 2a 2a ion sequence .**
1030: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 attached to the
1040: 20 72 69 67 68 74 2e 20 46 6f 72 20 74 68 65 20 right. For the
1050: 73 61 6d 65 20 72 65 61 73 6f 6e 20 74 68 65 20 same reason the
1060: 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c 61 67 0a EP_Collate flag.
1070: 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d 6d 75 74 ** is not commut
1080: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f ed..*/.static vo
1090: 69 64 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 50 id exprCommute(P
10a0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 arse *pParse, Ex
10b0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 75 31 pr *pExpr){. u1
10c0: 36 20 65 78 70 52 69 67 68 74 20 3d 20 28 70 45 6 expRight = (pE
10d0: 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 xpr->pRight->fla
10e0: 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 gs & EP_Collate)
10f0: 3b 0a 20 20 75 31 36 20 65 78 70 4c 65 66 74 20 ;. u16 expLeft
1100: 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d = (pExpr->pLeft-
1110: 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c >flags & EP_Coll
1120: 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 ate);. assert(
1130: 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78 70 72 2d allowedOp(pExpr-
1140: 3e 6f 70 29 20 26 26 20 70 45 78 70 72 2d 3e 6f >op) && pExpr->o
1150: 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 69 66 p!=TK_IN );. if
1160: 28 20 65 78 70 52 69 67 68 74 3d 3d 65 78 70 4c ( expRight==expL
1170: 65 66 74 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 eft ){. /* Ei
1180: 74 68 65 72 20 58 20 61 6e 64 20 59 20 62 6f 74 ther X and Y bot
1190: 68 20 68 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f h have COLLATE o
11a0: 70 65 72 61 74 6f 72 20 6f 72 20 6e 65 69 74 68 perator or neith
11b0: 65 72 20 64 6f 20 2a 2f 0a 20 20 20 20 69 66 28 er do */. if(
11c0: 20 65 78 70 52 69 67 68 74 20 29 7b 0a 20 20 20 expRight ){.
11d0: 20 20 20 2f 2a 20 42 6f 74 68 20 58 20 61 6e 64 /* Both X and
11e0: 20 59 20 68 61 76 65 20 43 4f 4c 4c 41 54 45 20 Y have COLLATE
11f0: 6f 70 65 72 61 74 6f 72 73 2e 20 20 4d 61 6b 65 operators. Make
1200: 20 73 75 72 65 20 58 20 69 73 20 61 6c 77 61 79 sure X is alway
1210: 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 64 20 s. ** used
1220: 62 79 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 by clearing the
1230: 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c 61 67 20 EP_Collate flag
1240: 66 72 6f 6d 20 59 2e 20 2a 2f 0a 20 20 20 20 20 from Y. */.
1250: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e pExpr->pRight->
1260: 66 6c 61 67 73 20 26 3d 20 7e 45 50 5f 43 6f 6c flags &= ~EP_Col
1270: 6c 61 74 65 3b 0a 20 20 20 20 7d 65 6c 73 65 20 late;. }else
1280: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 if( sqlite3ExprC
1290: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 ollSeq(pParse, p
12a0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 Expr->pLeft)!=0
12b0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 65 69 74 ){. /* Neit
12c0: 68 65 72 20 58 20 6e 6f 72 20 59 20 68 61 76 65 her X nor Y have
12d0: 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f COLLATE operato
12e0: 72 73 2c 20 62 75 74 20 58 20 68 61 73 20 61 20 rs, but X has a
12f0: 6e 6f 6e 2d 64 65 66 61 75 6c 74 0a 20 20 20 20 non-default.
1300: 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73 ** collating s
1310: 65 71 75 65 6e 63 65 2e 20 20 53 6f 20 61 64 64 equence. So add
1320: 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 the EP_Collate
1330: 6d 61 72 6b 65 72 20 6f 6e 20 58 20 74 6f 20 63 marker on X to c
1340: 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 69 74 ause. ** it
1350: 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 to be searched
1360: 66 69 72 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20 first. */.
1370: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c pExpr->pLeft->fl
1380: 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 ags |= EP_Collat
1390: 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 53 e;. }. }. S
13a0: 57 41 50 28 45 78 70 72 2a 2c 70 45 78 70 72 2d WAP(Expr*,pExpr-
13b0: 3e 70 52 69 67 68 74 2c 70 45 78 70 72 2d 3e 70 >pRight,pExpr->p
13c0: 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78 Left);. if( pEx
13d0: 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b pr->op>=TK_GT ){
13e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f . assert( TK_
13f0: 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 0a 20 LT==TK_GT+2 );.
1400: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 assert( TK_GE
1410: 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20 20 20 ==TK_LE+2 );.
1420: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 assert( TK_GT>T
1430: 4b 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 K_EQ );. asse
1440: 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20 rt( TK_GT<TK_LE
1450: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 );. assert( p
1460: 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 Expr->op>=TK_GT
1470: 26 26 20 70 45 78 70 72 2d 3e 6f 70 3c 3d 54 4b && pExpr->op<=TK
1480: 5f 47 45 20 29 3b 0a 20 20 20 20 70 45 78 70 72 _GE );. pExpr
1490: 2d 3e 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e ->op = ((pExpr->
14a0: 6f 70 2d 54 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f op-TK_GT)^2)+TK_
14b0: 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a GT;. }.}../*.**
14c0: 20 54 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20 Translate from
14d0: 54 4b 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 74 TK_xx operator t
14e0: 6f 20 57 4f 5f 78 78 20 62 69 74 6d 61 73 6b 2e o WO_xx bitmask.
14f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 6f .*/.static u16 o
1500: 70 65 72 61 74 6f 72 4d 61 73 6b 28 69 6e 74 20 peratorMask(int
1510: 6f 70 29 7b 0a 20 20 75 31 36 20 63 3b 0a 20 20 op){. u16 c;.
1520: 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f assert( allowedO
1530: 70 28 6f 70 29 20 29 3b 0a 20 20 69 66 28 20 6f p(op) );. if( o
1540: 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 p==TK_IN ){.
1550: 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c c = WO_IN;. }el
1560: 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 se if( op==TK_IS
1570: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 63 20 3d 20 NULL ){. c =
1580: 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d 65 6c WO_ISNULL;. }el
1590: 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 se if( op==TK_IS
15a0: 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 ){. c = WO_I
15b0: 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 S;. }else{.
15c0: 61 73 73 65 72 74 28 20 28 57 4f 5f 45 51 3c 3c assert( (WO_EQ<<
15d0: 28 6f 70 2d 54 4b 5f 45 51 29 29 20 3c 20 30 78 (op-TK_EQ)) < 0x
15e0: 37 66 66 66 20 29 3b 0a 20 20 20 20 63 20 3d 20 7fff );. c =
15f0: 28 75 31 36 29 28 57 4f 5f 45 51 3c 3c 28 6f 70 (u16)(WO_EQ<<(op
1600: 2d 54 4b 5f 45 51 29 29 3b 0a 20 20 7d 0a 20 20 -TK_EQ));. }.
1610: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49 assert( op!=TK_I
1620: 53 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f 5f 49 SNULL || c==WO_I
1630: 53 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72 SNULL );. asser
1640: 74 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c 20 t( op!=TK_IN ||
1650: 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 61 73 c==WO_IN );. as
1660: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45 51 20 sert( op!=TK_EQ
1670: 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 || c==WO_EQ );.
1680: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f assert( op!=TK_
1690: 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20 29 LT || c==WO_LT )
16a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d ;. assert( op!=
16b0: 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f 4c TK_LE || c==WO_L
16c0: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f E );. assert( o
16d0: 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d 57 p!=TK_GT || c==W
16e0: 4f 5f 47 54 20 29 3b 0a 20 20 61 73 73 65 72 74 O_GT );. assert
16f0: 28 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 63 ( op!=TK_GE || c
1700: 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 61 73 73 ==WO_GE );. ass
1710: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49 53 20 7c ert( op!=TK_IS |
1720: 7c 20 63 3d 3d 57 4f 5f 49 53 20 29 3b 0a 20 20 | c==WO_IS );.
1730: 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 0a 23 69 return c;.}...#i
1740: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 fndef SQLITE_OMI
1750: 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 T_LIKE_OPTIMIZAT
1760: 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 ION./*.** Check
1770: 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 67 69 to see if the gi
1780: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 ven expression i
1790: 73 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 s a LIKE or GLOB
17a0: 20 6f 70 65 72 61 74 6f 72 20 74 68 61 74 0a 2a operator that.*
17b0: 2a 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a * can be optimiz
17c0: 65 64 20 75 73 69 6e 67 20 69 6e 65 71 75 61 6c ed using inequal
17d0: 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e ity constraints.
17e0: 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 Return TRUE if
17f0: 20 69 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e 64 it is.** so and
1800: 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a false if not..*
1810: 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f *.** In order fo
1820: 72 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 74 r the operator t
1830: 6f 20 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c 65 o be optimizible
1840: 2c 20 74 68 65 20 52 48 53 20 6d 75 73 74 20 62 , the RHS must b
1850: 65 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c 69 e a string.** li
1860: 74 65 72 61 6c 20 74 68 61 74 20 64 6f 65 73 20 teral that does
1870: 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 not begin with a
1880: 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 wildcard. The
1890: 4c 48 53 20 6d 75 73 74 20 62 65 20 61 20 63 6f LHS must be a co
18a0: 6c 75 6d 6e 0a 2a 2a 20 74 68 61 74 20 6d 61 79 lumn.** that may
18b0: 20 6f 6e 6c 79 20 62 65 20 4e 55 4c 4c 2c 20 61 only be NULL, a
18c0: 20 73 74 72 69 6e 67 2c 20 6f 72 20 61 20 42 4c string, or a BL
18d0: 4f 42 2c 20 6e 65 76 65 72 20 61 20 6e 75 6d 62 OB, never a numb
18e0: 65 72 2e 20 28 54 68 69 73 20 6d 65 61 6e 73 0a er. (This means.
18f0: 2a 2a 20 74 68 61 74 20 76 69 72 74 75 61 6c 20 ** that virtual
1900: 74 61 62 6c 65 73 20 63 61 6e 6e 6f 74 20 70 61 tables cannot pa
1910: 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 rticipate in the
1920: 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 LIKE optimizati
1930: 6f 6e 2e 29 20 20 54 68 65 0a 2a 2a 20 63 6f 6c on.) The.** col
1940: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 lating sequence
1950: 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f for the column o
1960: 6e 20 74 68 65 20 4c 48 53 20 6d 75 73 74 20 62 n the LHS must b
1970: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f e appropriate fo
1980: 72 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 6f r.** the operato
1990: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 r..*/.static int
19a0: 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a 20 isLikeOrGlob(.
19b0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 Parse *pParse,
19c0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e /* Parsing an
19d0: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e d code generatin
19e0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 g context */. E
19f0: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 xpr *pExpr,
1a00: 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 /* Test this ex
1a10: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 45 78 pression */. Ex
1a20: 70 72 20 2a 2a 70 70 50 72 65 66 69 78 2c 20 20 pr **ppPrefix,
1a30: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 54 4b /* Pointer to TK
1a40: 5f 53 54 52 49 4e 47 20 65 78 70 72 65 73 73 69 _STRING expressi
1a50: 6f 6e 20 77 69 74 68 20 70 61 74 74 65 72 6e 20 on with pattern
1a60: 70 72 65 66 69 78 20 2a 2f 0a 20 20 69 6e 74 20 prefix */. int
1a70: 2a 70 69 73 43 6f 6d 70 6c 65 74 65 2c 20 2f 2a *pisComplete, /*
1a80: 20 54 72 75 65 20 69 66 20 74 68 65 20 6f 6e 6c True if the onl
1a90: 79 20 77 69 6c 64 63 61 72 64 20 69 73 20 25 20 y wildcard is %
1aa0: 69 6e 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 in the last char
1ab0: 61 63 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a acter */. int *
1ac0: 70 6e 6f 43 61 73 65 20 20 20 20 20 20 2f 2a 20 pnoCase /*
1ad0: 54 72 75 65 20 69 66 20 75 70 70 65 72 63 61 73 True if uppercas
1ae0: 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 e is equivalent
1af0: 74 6f 20 6c 6f 77 65 72 63 61 73 65 20 2a 2f 0a to lowercase */.
1b00: 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a ){. const u8 *z
1b10: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a = 0; /*
1b20: 20 53 74 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f String on RHS o
1b30: 66 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 f LIKE operator
1b40: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 */. Expr *pRigh
1b50: 74 2c 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 t, *pLeft;
1b60: 2f 2a 20 52 69 67 68 74 20 61 6e 64 20 6c 65 66 /* Right and lef
1b70: 74 20 73 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f t size of LIKE o
1b80: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 perator */. Exp
1b90: 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 rList *pList;
1ba0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 /* List
1bb0: 6f 66 20 6f 70 65 72 61 6e 64 73 20 74 6f 20 74 of operands to t
1bc0: 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 he LIKE operator
1bd0: 20 2a 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20 20 */. int c;
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1bf0: 20 2f 2a 20 4f 6e 65 20 63 68 61 72 61 63 74 65 /* One characte
1c00: 72 20 69 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e r in z[] */. in
1c10: 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 t cnt;
1c20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 /* Numb
1c30: 65 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 er of non-wildca
1c40: 72 64 20 70 72 65 66 69 78 20 63 68 61 72 61 63 rd prefix charac
1c50: 74 65 72 73 20 2a 2f 0a 20 20 63 68 61 72 20 77 ters */. char w
1c60: 63 5b 34 5d 3b 20 20 20 20 20 20 20 20 20 20 20 c[4];
1c70: 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 /* Wildcard
1c80: 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 characters */.
1c90: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 sqlite3 *db = p
1ca0: 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 Parse->db; /* D
1cb0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 atabase connecti
1cc0: 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f on */. sqlite3_
1cd0: 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b value *pVal = 0;
1ce0: 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 . int op;
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1d00: 20 4f 70 63 6f 64 65 20 6f 66 20 70 52 69 67 68 Opcode of pRigh
1d10: 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 t */. int rc;
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1d30: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 /* Result code
1d40: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 to return */..
1d50: 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 73 4c if( !sqlite3IsL
1d60: 69 6b 65 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 ikeFunction(db,
1d70: 70 45 78 70 72 2c 20 70 6e 6f 43 61 73 65 2c 20 pExpr, pnoCase,
1d80: 77 63 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 wc) ){. retur
1d90: 6e 20 30 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 n 0;. }.#ifdef
1da0: 53 51 4c 49 54 45 5f 45 42 43 44 49 43 0a 20 20 SQLITE_EBCDIC.
1db0: 69 66 28 20 2a 70 6e 6f 43 61 73 65 20 29 20 72 if( *pnoCase ) r
1dc0: 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a eturn 0;.#endif.
1dd0: 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d pList = pExpr-
1de0: 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 70 4c 65 66 >x.pList;. pLef
1df0: 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e t = pList->a[1].
1e00: 70 45 78 70 72 3b 0a 0a 20 20 70 52 69 67 68 74 pExpr;.. pRight
1e10: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b = sqlite3ExprSk
1e20: 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d ipCollate(pList-
1e30: 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 >a[0].pExpr);.
1e40: 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e 6f 70 3b op = pRight->op;
1e50: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 . if( op==TK_VA
1e60: 52 49 41 42 4c 45 20 26 26 20 28 64 62 2d 3e 66 RIABLE && (db->f
1e70: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 6e lags & SQLITE_En
1e80: 61 62 6c 65 51 50 53 47 29 3d 3d 30 20 29 7b 0a ableQPSG)==0 ){.
1e90: 20 20 20 20 56 64 62 65 20 2a 70 52 65 70 72 65 Vdbe *pRepre
1ea0: 70 61 72 65 20 3d 20 70 50 61 72 73 65 2d 3e 70 pare = pParse->p
1eb0: 52 65 70 72 65 70 61 72 65 3b 0a 20 20 20 20 69 Reprepare;. i
1ec0: 6e 74 20 69 43 6f 6c 20 3d 20 70 52 69 67 68 74 nt iCol = pRight
1ed0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 ->iColumn;. p
1ee0: 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 Val = sqlite3Vdb
1ef0: 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 70 eGetBoundValue(p
1f00: 52 65 70 72 65 70 61 72 65 2c 20 69 43 6f 6c 2c Reprepare, iCol,
1f10: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 SQLITE_AFF_BLOB
1f20: 29 3b 0a 20 20 20 20 69 66 28 20 70 56 61 6c 20 );. if( pVal
1f30: 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 && sqlite3_value
1f40: 5f 74 79 70 65 28 70 56 61 6c 29 3d 3d 53 51 4c _type(pVal)==SQL
1f50: 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 ITE_TEXT ){.
1f60: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 z = sqlite3_va
1f70: 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29 3b 0a lue_text(pVal);.
1f80: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 }. sqlite
1f90: 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 3VdbeSetVarmask(
1fa0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 69 pParse->pVdbe, i
1fb0: 43 6f 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 Col);. assert
1fc0: 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b ( pRight->op==TK
1fd0: 5f 56 41 52 49 41 42 4c 45 20 7c 7c 20 70 52 69 _VARIABLE || pRi
1fe0: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 ght->op==TK_REGI
1ff0: 53 54 45 52 20 29 3b 0a 20 20 7d 65 6c 73 65 20 STER );. }else
2000: 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e if( op==TK_STRIN
2010: 47 20 29 7b 0a 20 20 20 20 7a 20 3d 20 28 75 38 G ){. z = (u8
2020: 2a 29 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b *)pRight->u.zTok
2030: 65 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20 en;. }. if( z
2040: 29 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 ){.. /* If th
2050: 65 20 52 48 53 20 62 65 67 69 6e 73 20 77 69 74 e RHS begins wit
2060: 68 20 61 20 64 69 67 69 74 20 6f 72 20 61 20 6d h a digit or a m
2070: 69 6e 75 73 20 73 69 67 6e 2c 20 74 68 65 6e 20 inus sign, then
2080: 74 68 65 20 4c 48 53 20 6d 75 73 74 0a 20 20 20 the LHS must.
2090: 20 2a 2a 20 62 65 20 61 6e 20 6f 72 64 69 6e 61 ** be an ordina
20a0: 72 79 20 63 6f 6c 75 6d 6e 20 28 6e 6f 74 20 61 ry column (not a
20b0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 virtual table c
20c0: 6f 6c 75 6d 6e 29 20 77 69 74 68 20 54 45 58 54 olumn) with TEXT
20d0: 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a affinity.. *
20e0: 2a 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 * Otherwise the
20f0: 4c 48 53 20 6d 69 67 68 74 20 62 65 20 6e 75 6d LHS might be num
2100: 65 72 69 63 20 61 6e 64 20 22 6c 68 73 20 3e 3d eric and "lhs >=
2110: 20 72 68 73 22 20 77 6f 75 6c 64 20 62 65 20 66 rhs" would be f
2120: 61 6c 73 65 0a 20 20 20 20 2a 2a 20 65 76 65 6e alse. ** even
2130: 20 74 68 6f 75 67 68 20 22 6c 68 73 20 4c 49 4b though "lhs LIK
2140: 45 20 72 68 73 22 20 69 73 20 74 72 75 65 2e 20 E rhs" is true.
2150: 20 42 75 74 20 69 66 20 74 68 65 20 52 48 53 20 But if the RHS
2160: 64 6f 65 73 20 6e 6f 74 20 73 74 61 72 74 0a 20 does not start.
2170: 20 20 20 2a 2a 20 77 69 74 68 20 61 20 64 69 67 ** with a dig
2180: 69 74 20 6f 72 20 27 2d 27 2c 20 74 68 65 6e 20 it or '-', then
2190: 22 6c 68 73 20 4c 49 4b 45 20 72 68 73 22 20 77 "lhs LIKE rhs" w
21a0: 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 66 61 ill always be fa
21b0: 6c 73 65 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 lse if. ** th
21c0: 65 20 4c 48 53 20 69 73 20 6e 75 6d 65 72 69 63 e LHS is numeric
21d0: 20 61 6e 64 20 73 6f 20 74 68 65 20 6f 70 74 69 and so the opti
21e0: 6d 69 7a 61 74 69 6f 6e 20 73 74 69 6c 6c 20 77 mization still w
21f0: 6f 72 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 orks.. */.
2200: 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 64 69 if( sqlite3Isdi
2210: 67 69 74 28 7a 5b 30 5d 29 20 7c 7c 20 7a 5b 30 git(z[0]) || z[0
2220: 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 ]=='-' ){.
2230: 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 if( pLeft->op!=T
2240: 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20 20 20 20 20 K_COLUMN .
2250: 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 41 || sqlite3ExprA
2260: 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29 21 3d ffinity(pLeft)!=
2270: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 SQLITE_AFF_TEXT
2280: 0a 20 20 20 20 20 20 20 7c 7c 20 49 73 56 69 72 . || IsVir
2290: 74 75 61 6c 28 70 4c 65 66 74 2d 3e 70 54 61 62 tual(pLeft->pTab
22a0: 29 20 20 2f 2a 20 56 61 6c 75 65 20 6d 69 67 68 ) /* Value migh
22b0: 74 20 62 65 20 6e 75 6d 65 72 69 63 20 2a 2f 0a t be numeric */.
22c0: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 ){.
22d0: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 sqlite3ValueFre
22e0: 65 28 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 e(pVal);.
22f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 return 0;.
2300: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a }. }.. /*
2310: 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 Count the numbe
2320: 72 20 6f 66 20 70 72 65 66 69 78 20 63 68 61 72 r of prefix char
2330: 61 63 74 65 72 73 20 70 72 69 6f 72 20 74 6f 20 acters prior to
2340: 74 68 65 20 66 69 72 73 74 20 77 69 6c 64 63 61 the first wildca
2350: 72 64 20 2a 2f 0a 20 20 20 20 63 6e 74 20 3d 20 rd */. cnt =
2360: 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63 0;. while( (c
2370: 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20 26 26 20 63 =z[cnt])!=0 && c
2380: 21 3d 77 63 5b 30 5d 20 26 26 20 63 21 3d 77 63 !=wc[0] && c!=wc
2390: 5b 31 5d 20 26 26 20 63 21 3d 77 63 5b 32 5d 20 [1] && c!=wc[2]
23a0: 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a ){. cnt++;.
23b0: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 77 63 5b if( c==wc[
23c0: 33 5d 20 26 26 20 7a 5b 63 6e 74 5d 21 3d 30 20 3] && z[cnt]!=0
23d0: 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 0a ) cnt++;. }..
23e0: 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d /* The optim
23f0: 69 7a 61 74 69 6f 6e 20 69 73 20 70 6f 73 73 69 ization is possi
2400: 62 6c 65 20 6f 6e 6c 79 20 69 66 20 28 31 29 20 ble only if (1)
2410: 74 68 65 20 70 61 74 74 65 72 6e 20 64 6f 65 73 the pattern does
2420: 20 6e 6f 74 20 62 65 67 69 6e 0a 20 20 20 20 2a not begin. *
2430: 2a 20 77 69 74 68 20 61 20 77 69 6c 64 63 61 72 * with a wildcar
2440: 64 20 61 6e 64 20 69 66 20 28 32 29 20 74 68 65 d and if (2) the
2450: 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64 20 70 72 non-wildcard pr
2460: 65 66 69 78 20 64 6f 65 73 20 6e 6f 74 20 65 6e efix does not en
2470: 64 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 61 6e d with. ** an
2480: 20 28 69 6c 6c 65 67 61 6c 20 30 78 66 66 29 20 (illegal 0xff)
2490: 63 68 61 72 61 63 74 65 72 2e 20 20 54 68 65 20 character. The
24a0: 73 65 63 6f 6e 64 20 63 6f 6e 64 69 74 69 6f 6e second condition
24b0: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 73 6f is necessary so
24c0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 . ** that we
24d0: 63 61 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 can increment th
24e0: 65 20 70 72 65 66 69 78 20 6b 65 79 20 74 6f 20 e prefix key to
24f0: 66 69 6e 64 20 61 6e 20 75 70 70 65 72 20 62 6f find an upper bo
2500: 75 6e 64 20 66 6f 72 20 74 68 65 0a 20 20 20 20 und for the.
2510: 2a 2a 20 72 61 6e 67 65 20 73 65 61 72 63 68 2e ** range search.
2520: 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 . */. if(
2530: 20 63 6e 74 21 3d 30 20 26 26 20 32 35 35 21 3d cnt!=0 && 255!=
2540: 28 75 38 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b 0a (u8)z[cnt-1] ){.
2550: 20 20 20 20 20 20 45 78 70 72 20 2a 70 50 72 65 Expr *pPre
2560: 66 69 78 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 41 fix;.. /* A
2570: 20 22 63 6f 6d 70 6c 65 74 65 22 20 6d 61 74 63 "complete" matc
2580: 68 20 69 66 20 74 68 65 20 70 61 74 74 65 72 6e h if the pattern
2590: 20 65 6e 64 73 20 77 69 74 68 20 22 2a 22 20 6f ends with "*" o
25a0: 72 20 22 25 22 20 2a 2f 0a 20 20 20 20 20 20 2a r "%" */. *
25b0: 70 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 63 3d pisComplete = c=
25c0: 3d 77 63 5b 30 5d 20 26 26 20 7a 5b 63 6e 74 2b =wc[0] && z[cnt+
25d0: 31 5d 3d 3d 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 1]==0;.. /*
25e0: 20 47 65 74 20 74 68 65 20 70 61 74 74 65 72 6e Get the pattern
25f0: 20 70 72 65 66 69 78 2e 20 20 52 65 6d 6f 76 65 prefix. Remove
2600: 20 61 6c 6c 20 65 73 63 61 70 65 73 20 66 72 6f all escapes fro
2610: 6d 20 74 68 65 20 70 72 65 66 69 78 2e 20 2a 2f m the prefix. */
2620: 0a 20 20 20 20 20 20 70 50 72 65 66 69 78 20 3d . pPrefix =
2630: 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c sqlite3Expr(db,
2640: 20 54 4b 5f 53 54 52 49 4e 47 2c 20 28 63 68 61 TK_STRING, (cha
2650: 72 2a 29 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 r*)z);. if(
2660: 20 70 50 72 65 66 69 78 20 29 7b 0a 20 20 20 20 pPrefix ){.
2670: 20 20 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 int iFrom, i
2680: 54 6f 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 To;. char
2690: 20 2a 7a 4e 65 77 20 3d 20 70 50 72 65 66 69 78 *zNew = pPrefix
26a0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 ->u.zToken;.
26b0: 20 20 20 20 7a 4e 65 77 5b 63 6e 74 5d 20 3d 20 zNew[cnt] =
26c0: 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 0;. for(i
26d0: 46 72 6f 6d 3d 69 54 6f 3d 30 3b 20 69 46 72 6f From=iTo=0; iFro
26e0: 6d 3c 63 6e 74 3b 20 69 46 72 6f 6d 2b 2b 29 7b m<cnt; iFrom++){
26f0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a . if( z
2700: 4e 65 77 5b 69 46 72 6f 6d 5d 3d 3d 77 63 5b 33 New[iFrom]==wc[3
2710: 5d 20 29 20 69 46 72 6f 6d 2b 2b 3b 0a 20 20 20 ] ) iFrom++;.
2720: 20 20 20 20 20 20 20 7a 4e 65 77 5b 69 54 6f 2b zNew[iTo+
2730: 2b 5d 20 3d 20 7a 4e 65 77 5b 69 46 72 6f 6d 5d +] = zNew[iFrom]
2740: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 ;. }.
2750: 20 20 20 20 7a 4e 65 77 5b 69 54 6f 5d 20 3d 20 zNew[iTo] =
2760: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 0;. }.
2770: 20 2a 70 70 50 72 65 66 69 78 20 3d 20 70 50 72 *ppPrefix = pPr
2780: 65 66 69 78 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 efix;.. /*
2790: 49 66 20 74 68 65 20 52 48 53 20 70 61 74 74 65 If the RHS patte
27a0: 72 6e 20 69 73 20 61 20 62 6f 75 6e 64 20 70 61 rn is a bound pa
27b0: 72 61 6d 65 74 65 72 2c 20 6d 61 6b 65 20 61 72 rameter, make ar
27c0: 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 0a 20 20 rangements to.
27d0: 20 20 20 20 2a 2a 20 72 65 70 72 65 70 61 72 65 ** reprepare
27e0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 77 the statement w
27f0: 68 65 6e 20 74 68 61 74 20 70 61 72 61 6d 65 74 hen that paramet
2800: 65 72 20 69 73 20 72 65 62 6f 75 6e 64 20 2a 2f er is rebound */
2810: 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 . if( op==T
2820: 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a 20 20 K_VARIABLE ){.
2830: 20 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 Vdbe *v =
2840: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 pParse->pVdbe;.
2850: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 sqlite3Vd
2860: 62 65 53 65 74 56 61 72 6d 61 73 6b 28 76 2c 20 beSetVarmask(v,
2870: 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29 pRight->iColumn)
2880: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 70 ;. if( *p
2890: 69 73 43 6f 6d 70 6c 65 74 65 20 26 26 20 70 52 isComplete && pR
28a0: 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 ight->u.zToken[1
28b0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f ] ){. /
28c0: 2a 20 49 66 20 74 68 65 20 72 68 73 20 6f 66 20 * If the rhs of
28d0: 74 68 65 20 4c 49 4b 45 20 65 78 70 72 65 73 73 the LIKE express
28e0: 69 6f 6e 20 69 73 20 61 20 76 61 72 69 61 62 6c ion is a variabl
28f0: 65 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 e, and the curre
2900: 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 nt. **
2910: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 76 61 72 value of the var
2920: 69 61 62 6c 65 20 6d 65 61 6e 73 20 74 68 65 72 iable means ther
2930: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 e is no need to
2940: 69 6e 76 6f 6b 65 20 74 68 65 20 4c 49 4b 45 0a invoke the LIKE.
2950: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e ** fun
2960: 63 74 69 6f 6e 2c 20 74 68 65 6e 20 6e 6f 20 4f ction, then no O
2970: 50 5f 56 61 72 69 61 62 6c 65 20 77 69 6c 6c 20 P_Variable will
2980: 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 be added to the
2990: 70 72 6f 67 72 61 6d 2e 0a 20 20 20 20 20 20 20 program..
29a0: 20 20 20 2a 2a 20 54 68 69 73 20 63 61 75 73 65 ** This cause
29b0: 73 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 74 s problems for t
29c0: 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f he sqlite3_bind_
29d0: 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 29 parameter_name()
29e0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 41 50 . ** AP
29f0: 49 2e 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e I. To work aroun
2a00: 64 20 74 68 65 6d 2c 20 61 64 64 20 61 20 64 75 d them, add a du
2a10: 6d 6d 79 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 mmy OP_Variable
2a20: 68 65 72 65 2e 0a 20 20 20 20 20 20 20 20 20 20 here..
2a30: 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 69 6e */ . in
2a40: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 t r1 = sqlite3Ge
2a50: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 tTempReg(pParse)
2a60: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 ;. sqli
2a70: 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 te3ExprCodeTarge
2a80: 74 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 t(pParse, pRight
2a90: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 , r1);.
2aa0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e sqlite3VdbeChan
2ab0: 67 65 50 33 28 76 2c 20 73 71 6c 69 74 65 33 56 geP3(v, sqlite3V
2ac0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 dbeCurrentAddr(v
2ad0: 29 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 )-1, 0);.
2ae0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 sqlite3Releas
2af0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c eTempReg(pParse,
2b00: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a r1);. }.
2b10: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 }. }els
2b20: 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 30 3b 0a e{. z = 0;.
2b30: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 63 20 }. }.. rc
2b40: 3d 20 28 7a 21 3d 30 29 3b 0a 20 20 73 71 6c 69 = (z!=0);. sqli
2b50: 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 te3ValueFree(pVa
2b60: 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b l);. return rc;
2b70: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c .}.#endif /* SQL
2b80: 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 ITE_OMIT_LIKE_OP
2b90: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 0a TIMIZATION */...
2ba0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f #ifndef SQLITE_O
2bb0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 MIT_VIRTUALTABLE
2bc0: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 ./*.** Check to
2bd0: 73 65 65 20 69 66 20 74 68 65 20 70 45 78 70 72 see if the pExpr
2be0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 expression is a
2bf0: 20 66 6f 72 6d 20 74 68 61 74 20 6e 65 65 64 73 form that needs
2c00: 20 74 6f 20 62 65 20 70 61 73 73 65 64 0a 2a 2a to be passed.**
2c10: 20 74 6f 20 74 68 65 20 78 42 65 73 74 49 6e 64 to the xBestInd
2c20: 65 78 20 6d 65 74 68 6f 64 20 6f 66 20 76 69 72 ex method of vir
2c30: 74 75 61 6c 20 74 61 62 6c 65 73 2e 20 20 46 6f tual tables. Fo
2c40: 72 6d 73 20 6f 66 20 69 6e 74 65 72 65 73 74 20 rms of interest
2c50: 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 include:.**.**
2c60: 20 20 20 20 20 20 20 20 45 78 70 72 65 73 73 69 Expressi
2c70: 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 on
2c80: 20 20 20 20 20 56 69 72 74 75 61 6c 20 54 61 62 Virtual Tab
2c90: 6c 65 20 4f 70 65 72 61 74 6f 72 0a 2a 2a 20 20 le Operator.**
2ca0: 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d --------
2cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 ---------------
2cc0: 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d -----------
2cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ce0: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 31 ------.** 1
2cf0: 2e 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 . column MATCH
2d00: 65 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20 expr
2d10: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e SQLITE_INDEX_CON
2d20: 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 0a 2a 2a STRAINT_MATCH.**
2d30: 20 20 20 20 20 20 32 2e 20 20 63 6f 6c 75 6d 6e 2. column
2d40: 20 47 4c 4f 42 20 65 78 70 72 20 20 20 20 20 20 GLOB expr
2d50: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e SQLITE_IN
2d60: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 DEX_CONSTRAINT_G
2d70: 4c 4f 42 0a 2a 2a 20 20 20 20 20 20 33 2e 20 20 LOB.** 3.
2d80: 63 6f 6c 75 6d 6e 20 4c 49 4b 45 20 65 78 70 72 column LIKE expr
2d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c SQL
2da0: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 ITE_INDEX_CONSTR
2db0: 41 49 4e 54 5f 4c 49 4b 45 0a 2a 2a 20 20 20 20 AINT_LIKE.**
2dc0: 20 20 34 2e 20 20 63 6f 6c 75 6d 6e 20 52 45 47 4. column REG
2dd0: 45 58 50 20 65 78 70 72 20 20 20 20 20 20 20 20 EXP expr
2de0: 20 20 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f SQLITE_INDEX_
2df0: 43 4f 4e 53 54 52 41 49 4e 54 5f 52 45 47 45 58 CONSTRAINT_REGEX
2e00: 50 0a 2a 2a 20 20 20 20 20 20 35 2e 20 20 63 6f P.** 5. co
2e10: 6c 75 6d 6e 20 21 3d 20 65 78 70 72 20 20 20 20 lumn != expr
2e20: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 SQLIT
2e30: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 E_INDEX_CONSTRAI
2e40: 4e 54 5f 4e 45 0a 2a 2a 20 20 20 20 20 20 36 2e NT_NE.** 6.
2e50: 20 20 65 78 70 72 20 21 3d 20 63 6f 6c 75 6d 6e expr != column
2e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 S
2e70: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 QLITE_INDEX_CONS
2e80: 54 52 41 49 4e 54 5f 4e 45 0a 2a 2a 20 20 20 20 TRAINT_NE.**
2e90: 20 20 37 2e 20 20 63 6f 6c 75 6d 6e 20 49 53 20 7. column IS
2ea0: 4e 4f 54 20 65 78 70 72 20 20 20 20 20 20 20 20 NOT expr
2eb0: 20 20 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f SQLITE_INDEX_
2ec0: 43 4f 4e 53 54 52 41 49 4e 54 5f 49 53 4e 4f 54 CONSTRAINT_ISNOT
2ed0: 0a 2a 2a 20 20 20 20 20 20 38 2e 20 20 65 78 70 .** 8. exp
2ee0: 72 20 49 53 20 4e 4f 54 20 63 6f 6c 75 6d 6e 20 r IS NOT column
2ef0: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 SQLITE
2f00: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e _INDEX_CONSTRAIN
2f10: 54 5f 49 53 4e 4f 54 0a 2a 2a 20 20 20 20 20 20 T_ISNOT.**
2f20: 39 2e 20 20 63 6f 6c 75 6d 6e 20 49 53 20 4e 4f 9. column IS NO
2f30: 54 20 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 20 T NULL
2f40: 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f SQLITE_INDEX_CO
2f50: 4e 53 54 52 41 49 4e 54 5f 49 53 4e 4f 54 4e 55 NSTRAINT_ISNOTNU
2f60: 4c 4c 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 76 65 72 LL.**.** In ever
2f70: 79 20 63 61 73 65 2c 20 22 63 6f 6c 75 6d 6e 22 y case, "column"
2f80: 20 6d 75 73 74 20 62 65 20 61 20 63 6f 6c 75 6d must be a colum
2f90: 6e 20 6f 66 20 61 20 76 69 72 74 75 61 6c 20 74 n of a virtual t
2fa0: 61 62 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a able. If there.
2fb0: 2a 2a 20 69 73 20 61 20 6d 61 74 63 68 2c 20 73 ** is a match, s
2fc0: 65 74 20 2a 70 70 4c 65 66 74 20 74 6f 20 74 68 et *ppLeft to th
2fd0: 65 20 22 63 6f 6c 75 6d 6e 22 20 65 78 70 72 65 e "column" expre
2fe0: 73 73 69 6f 6e 2c 20 73 65 74 20 2a 70 70 52 69 ssion, set *ppRi
2ff0: 67 68 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 22 ght to the .** "
3000: 65 78 70 72 22 20 65 78 70 72 65 73 73 69 6f 6e expr" expression
3010: 20 28 65 76 65 6e 20 74 68 6f 75 67 68 20 69 6e (even though in
3020: 20 66 6f 72 6d 73 20 28 36 29 20 61 6e 64 20 28 forms (6) and (
3030: 38 29 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 8) the column is
3040: 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 on the.** right
3050: 20 61 6e 64 20 74 68 65 20 65 78 70 72 65 73 73 and the express
3060: 69 6f 6e 20 69 73 20 6f 6e 20 74 68 65 20 6c 65 ion is on the le
3070: 66 74 29 2e 20 20 41 6c 73 6f 20 73 65 74 20 2a ft). Also set *
3080: 70 65 4f 70 32 20 74 6f 20 74 68 65 0a 2a 2a 20 peOp2 to the.**
3090: 61 70 70 72 6f 70 72 69 61 74 65 20 76 69 72 74 appropriate virt
30a0: 75 61 6c 20 74 61 62 6c 65 20 6f 70 65 72 61 74 ual table operat
30b0: 6f 72 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 or. The return
30c0: 76 61 6c 75 65 20 69 73 20 31 20 6f 72 20 32 20 value is 1 or 2
30d0: 69 66 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 if there.** is a
30e0: 20 6d 61 74 63 68 2e 20 20 54 68 65 20 75 73 75 match. The usu
30f0: 61 6c 20 72 65 74 75 72 6e 20 69 73 20 31 2c 20 al return is 1,
3100: 62 75 74 20 69 66 20 74 68 65 20 52 48 53 20 69 but if the RHS i
3110: 73 20 61 6c 73 6f 20 61 20 63 6f 6c 75 6d 6e 0a s also a column.
3120: 2a 2a 20 6f 66 20 76 69 72 74 75 61 6c 20 74 61 ** of virtual ta
3130: 62 6c 65 20 69 6e 20 66 6f 72 6d 73 20 28 35 29 ble in forms (5)
3140: 20 6f 72 20 28 37 29 20 74 68 65 6e 20 72 65 74 or (7) then ret
3150: 75 72 6e 20 32 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 urn 2..**.** If
3160: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d the expression m
3170: 61 74 63 68 65 73 20 6e 6f 6e 65 20 6f 66 20 74 atches none of t
3180: 68 65 20 70 61 74 74 65 72 6e 73 20 61 62 6f 76 he patterns abov
3190: 65 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a e, return 0..*/.
31a0: 73 74 61 74 69 63 20 69 6e 74 20 69 73 41 75 78 static int isAux
31b0: 69 6c 69 61 72 79 56 74 61 62 4f 70 65 72 61 74 iliaryVtabOperat
31c0: 6f 72 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70 or(. Expr *pExp
31d0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 r,
31e0: 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68 /* Test th
31f0: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f is expression */
3200: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 . unsigned char
3210: 20 2a 70 65 4f 70 32 2c 20 20 20 20 20 20 20 20 *peOp2,
3220: 20 20 20 2f 2a 20 4f 55 54 3a 20 30 20 66 6f 72 /* OUT: 0 for
3230: 20 4d 41 54 43 48 2c 20 6f 72 20 65 6c 73 65 20 MATCH, or else
3240: 61 6e 20 6f 70 32 20 76 61 6c 75 65 20 2a 2f 0a an op2 value */.
3250: 20 20 45 78 70 72 20 2a 2a 70 70 4c 65 66 74 2c Expr **ppLeft,
3260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3270: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 65 78 70 72 /* Column expr
3280: 65 73 73 69 6f 6e 20 74 6f 20 6c 65 66 74 20 6f ession to left o
3290: 66 20 4d 41 54 43 48 2f 6f 70 32 20 2a 2f 0a 20 f MATCH/op2 */.
32a0: 20 45 78 70 72 20 2a 2a 70 70 52 69 67 68 74 20 Expr **ppRight
32b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
32c0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74 /* Expression t
32d0: 6f 20 6c 65 66 74 20 6f 66 20 4d 41 54 43 48 2f o left of MATCH/
32e0: 6f 70 32 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 op2 */.){. if(
32f0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 pExpr->op==TK_FU
3300: 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 73 74 NCTION ){. st
3310: 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 atic const struc
3320: 74 20 4f 70 32 20 7b 0a 20 20 20 20 20 20 63 6f t Op2 {. co
3330: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 3b 0a 20 nst char *zOp;.
3340: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 unsigned ch
3350: 61 72 20 65 4f 70 32 3b 0a 20 20 20 20 7d 20 61 ar eOp2;. } a
3360: 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b Op[] = {. {
3370: 20 22 6d 61 74 63 68 22 2c 20 20 53 51 4c 49 54 "match", SQLIT
3380: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 E_INDEX_CONSTRAI
3390: 4e 54 5f 4d 41 54 43 48 20 7d 2c 0a 20 20 20 20 NT_MATCH },.
33a0: 20 20 7b 20 22 67 6c 6f 62 22 2c 20 20 20 53 51 { "glob", SQ
33b0: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 LITE_INDEX_CONST
33c0: 52 41 49 4e 54 5f 47 4c 4f 42 20 7d 2c 0a 20 20 RAINT_GLOB },.
33d0: 20 20 20 20 7b 20 22 6c 69 6b 65 22 2c 20 20 20 { "like",
33e0: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e SQLITE_INDEX_CON
33f0: 53 54 52 41 49 4e 54 5f 4c 49 4b 45 20 7d 2c 0a STRAINT_LIKE },.
3400: 20 20 20 20 20 20 7b 20 22 72 65 67 65 78 70 22 { "regexp"
3410: 2c 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 , SQLITE_INDEX_C
3420: 4f 4e 53 54 52 41 49 4e 54 5f 52 45 47 45 58 50 ONSTRAINT_REGEXP
3430: 20 7d 0a 20 20 20 20 7d 3b 0a 20 20 20 20 45 78 }. };. Ex
3440: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20 prList *pList;.
3450: 20 20 20 45 78 70 72 20 2a 70 43 6f 6c 3b 20 20 Expr *pCol;
3460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3470: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 72 65 66 /* Column ref
3480: 65 72 65 6e 63 65 20 2a 2f 0a 20 20 20 20 69 6e erence */. in
3490: 74 20 69 3b 0a 0a 20 20 20 20 70 4c 69 73 74 20 t i;.. pList
34a0: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 = pExpr->x.pList
34b0: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d ;. if( pList=
34c0: 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 =0 || pList->nEx
34d0: 70 72 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72 pr!=2 ){. r
34e0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 eturn 0;. }.
34f0: 20 20 20 70 43 6f 6c 20 3d 20 70 4c 69 73 74 2d pCol = pList-
3500: 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 >a[1].pExpr;.
3510: 20 69 66 28 20 70 43 6f 6c 2d 3e 6f 70 21 3d 54 if( pCol->op!=T
3520: 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 21 49 73 56 K_COLUMN || !IsV
3530: 69 72 74 75 61 6c 28 70 43 6f 6c 2d 3e 70 54 61 irtual(pCol->pTa
3540: 62 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 b) ){. retu
3550: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 rn 0;. }.
3560: 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 for(i=0; i<Array
3570: 53 69 7a 65 28 61 4f 70 29 3b 20 69 2b 2b 29 7b Size(aOp); i++){
3580: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 . if( sqlit
3590: 65 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d e3StrICmp(pExpr-
35a0: 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 61 4f 70 5b 69 >u.zToken, aOp[i
35b0: 5d 2e 7a 4f 70 29 3d 3d 30 20 29 7b 0a 20 20 20 ].zOp)==0 ){.
35c0: 20 20 20 20 20 2a 70 65 4f 70 32 20 3d 20 61 4f *peOp2 = aO
35d0: 70 5b 69 5d 2e 65 4f 70 32 3b 0a 20 20 20 20 20 p[i].eOp2;.
35e0: 20 20 20 2a 70 70 52 69 67 68 74 20 3d 20 70 4c *ppRight = pL
35f0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b ist->a[0].pExpr;
3600: 0a 20 20 20 20 20 20 20 20 2a 70 70 4c 65 66 74 . *ppLeft
3610: 20 3d 20 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 = pCol;.
3620: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 return 1;.
3630: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 }. }. }else
3640: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d if( pExpr->op==
3650: 54 4b 5f 4e 45 20 7c 7c 20 70 45 78 70 72 2d 3e TK_NE || pExpr->
3660: 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 7c 7c 20 op==TK_ISNOT ||
3670: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f pExpr->op==TK_NO
3680: 54 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 6e 74 TNULL ){. int
3690: 20 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 45 78 res = 0;. Ex
36a0: 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 pr *pLeft = pExp
36b0: 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 45 78 r->pLeft;. Ex
36c0: 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78 pr *pRight = pEx
36d0: 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 pr->pRight;.
36e0: 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 if( pLeft->op==T
36f0: 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 49 73 56 69 K_COLUMN && IsVi
3700: 72 74 75 61 6c 28 70 4c 65 66 74 2d 3e 70 54 61 rtual(pLeft->pTa
3710: 62 29 20 29 7b 0a 20 20 20 20 20 20 72 65 73 2b b) ){. res+
3720: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 +;. }. if(
3730: 20 70 52 69 67 68 74 20 26 26 20 70 52 69 67 68 pRight && pRigh
3740: 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e t->op==TK_COLUMN
3750: 20 26 26 20 49 73 56 69 72 74 75 61 6c 28 70 52 && IsVirtual(pR
3760: 69 67 68 74 2d 3e 70 54 61 62 29 20 29 7b 0a 20 ight->pTab) ){.
3770: 20 20 20 20 20 72 65 73 2b 2b 3b 0a 20 20 20 20 res++;.
3780: 20 20 53 57 41 50 28 45 78 70 72 2a 2c 20 70 4c SWAP(Expr*, pL
3790: 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 eft, pRight);.
37a0: 20 20 7d 0a 20 20 20 20 2a 70 70 4c 65 66 74 20 }. *ppLeft
37b0: 3d 20 70 4c 65 66 74 3b 0a 20 20 20 20 2a 70 70 = pLeft;. *pp
37c0: 52 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a Right = pRight;.
37d0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f if( pExpr->o
37e0: 70 3d 3d 54 4b 5f 4e 45 20 29 20 2a 70 65 4f 70 p==TK_NE ) *peOp
37f0: 32 20 3d 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 2 = SQLITE_INDEX
3800: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 45 3b 0a _CONSTRAINT_NE;.
3810: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f if( pExpr->o
3820: 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 20 2a 70 p==TK_ISNOT ) *p
3830: 65 4f 70 32 20 3d 20 53 51 4c 49 54 45 5f 49 4e eOp2 = SQLITE_IN
3840: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 49 DEX_CONSTRAINT_I
3850: 53 4e 4f 54 3b 0a 20 20 20 20 69 66 28 20 70 45 SNOT;. if( pE
3860: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e xpr->op==TK_NOTN
3870: 55 4c 4c 20 29 20 2a 70 65 4f 70 32 20 3d 20 53 ULL ) *peOp2 = S
3880: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 QLITE_INDEX_CONS
3890: 54 52 41 49 4e 54 5f 49 53 4e 4f 54 4e 55 4c 4c TRAINT_ISNOTNULL
38a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 ;. return res
38b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 ;. }. return 0
38c0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 ;.}.#endif /* SQ
38d0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 LITE_OMIT_VIRTUA
38e0: 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a LTABLE */../*.**
38f0: 20 49 66 20 74 68 65 20 70 42 61 73 65 20 65 78 If the pBase ex
3900: 70 72 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 pression origina
3910: 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 ted in the ON or
3920: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 USING clause of
3930: 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e .** a join, then
3940: 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 61 70 transfer the ap
3950: 70 72 6f 70 72 69 61 74 65 20 6d 61 72 6b 69 6e propriate markin
3960: 67 73 20 6f 76 65 72 20 74 6f 20 64 65 72 69 76 gs over to deriv
3970: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f ed..*/.static vo
3980: 69 64 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d id transferJoinM
3990: 61 72 6b 69 6e 67 73 28 45 78 70 72 20 2a 70 44 arkings(Expr *pD
39a0: 65 72 69 76 65 64 2c 20 45 78 70 72 20 2a 70 42 erived, Expr *pB
39b0: 61 73 65 29 7b 0a 20 20 69 66 28 20 70 44 65 72 ase){. if( pDer
39c0: 69 76 65 64 20 29 7b 0a 20 20 20 20 70 44 65 72 ived ){. pDer
39d0: 69 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 ived->flags |= p
39e0: 42 61 73 65 2d 3e 66 6c 61 67 73 20 26 20 45 50 Base->flags & EP
39f0: 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 70 _FromJoin;. p
3a00: 44 65 72 69 76 65 64 2d 3e 69 52 69 67 68 74 4a Derived->iRightJ
3a10: 6f 69 6e 54 61 62 6c 65 20 3d 20 70 42 61 73 65 oinTable = pBase
3a20: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c ->iRightJoinTabl
3a30: 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 e;. }.}../*.**
3a40: 4d 61 72 6b 20 74 65 72 6d 20 69 43 68 69 6c 64 Mark term iChild
3a50: 20 61 73 20 62 65 69 6e 67 20 61 20 63 68 69 6c as being a chil
3a60: 64 20 6f 66 20 74 65 72 6d 20 69 50 61 72 65 6e d of term iParen
3a70: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 t.*/.static void
3a80: 20 6d 61 72 6b 54 65 72 6d 41 73 43 68 69 6c 64 markTermAsChild
3a90: 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 (WhereClause *pW
3aa0: 43 2c 20 69 6e 74 20 69 43 68 69 6c 64 2c 20 69 C, int iChild, i
3ab0: 6e 74 20 69 50 61 72 65 6e 74 29 7b 0a 20 20 70 nt iParent){. p
3ac0: 57 43 2d 3e 61 5b 69 43 68 69 6c 64 5d 2e 69 50 WC->a[iChild].iP
3ad0: 61 72 65 6e 74 20 3d 20 69 50 61 72 65 6e 74 3b arent = iParent;
3ae0: 0a 20 20 70 57 43 2d 3e 61 5b 69 43 68 69 6c 64 . pWC->a[iChild
3af0: 5d 2e 74 72 75 74 68 50 72 6f 62 20 3d 20 70 57 ].truthProb = pW
3b00: 43 2d 3e 61 5b 69 50 61 72 65 6e 74 5d 2e 74 72 C->a[iParent].tr
3b10: 75 74 68 50 72 6f 62 3b 0a 20 20 70 57 43 2d 3e uthProb;. pWC->
3b20: 61 5b 69 50 61 72 65 6e 74 5d 2e 6e 43 68 69 6c a[iParent].nChil
3b30: 64 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 d++;.}../*.** Re
3b40: 74 75 72 6e 20 74 68 65 20 4e 2d 74 68 20 41 4e turn the N-th AN
3b50: 44 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 74 D-connected subt
3b60: 65 72 6d 20 6f 66 20 70 54 65 72 6d 2e 20 20 4f erm of pTerm. O
3b70: 72 20 69 66 20 70 54 65 72 6d 20 69 73 20 6e 6f r if pTerm is no
3b80: 74 0a 2a 2a 20 61 20 63 6f 6e 6a 75 6e 63 74 69 t.** a conjuncti
3b90: 6f 6e 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 on, then return
3ba0: 6a 75 73 74 20 70 54 65 72 6d 20 77 68 65 6e 20 just pTerm when
3bb0: 4e 3d 3d 30 2e 20 20 49 66 20 4e 20 69 73 20 65 N==0. If N is e
3bc0: 78 63 65 65 64 73 0a 2a 2a 20 74 68 65 20 6e 75 xceeds.** the nu
3bd0: 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c mber of availabl
3be0: 65 20 73 75 62 74 65 72 6d 73 2c 20 72 65 74 75 e subterms, retu
3bf0: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 rn NULL..*/.stat
3c00: 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68 ic WhereTerm *wh
3c10: 65 72 65 4e 74 68 53 75 62 74 65 72 6d 28 57 68 ereNthSubterm(Wh
3c20: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 ereTerm *pTerm,
3c30: 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 54 int N){. if( pT
3c40: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d erm->eOperator!=
3c50: 57 4f 5f 41 4e 44 20 29 7b 0a 20 20 20 20 72 65 WO_AND ){. re
3c60: 74 75 72 6e 20 4e 3d 3d 30 20 3f 20 70 54 65 72 turn N==0 ? pTer
3c70: 6d 20 3a 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 m : 0;. }. if(
3c80: 20 4e 3c 70 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 N<pTerm->u.pAnd
3c90: 49 6e 66 6f 2d 3e 77 63 2e 6e 54 65 72 6d 20 29 Info->wc.nTerm )
3ca0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70 54 {. return &pT
3cb0: 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d erm->u.pAndInfo-
3cc0: 3e 77 63 2e 61 5b 4e 5d 3b 0a 20 20 7d 0a 20 20 >wc.a[N];. }.
3cd0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a return 0;.}../*.
3ce0: 2a 2a 20 53 75 62 74 65 72 6d 73 20 70 4f 6e 65 ** Subterms pOne
3cf0: 20 61 6e 64 20 70 54 77 6f 20 61 72 65 20 63 6f and pTwo are co
3d00: 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 57 ntained within W
3d10: 48 45 52 45 20 63 6c 61 75 73 65 20 70 57 43 2e HERE clause pWC.
3d20: 20 20 54 68 65 0a 2a 2a 20 74 77 6f 20 73 75 62 The.** two sub
3d30: 74 65 72 6d 73 20 61 72 65 20 69 6e 20 64 69 73 terms are in dis
3d40: 6a 75 6e 63 74 69 6f 6e 20 2d 20 74 68 65 79 20 junction - they
3d50: 61 72 65 20 4f 52 2d 65 64 20 74 6f 67 65 74 68 are OR-ed togeth
3d60: 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 er..**.** If the
3d70: 73 65 20 74 77 6f 20 74 65 72 6d 73 20 61 72 65 se two terms are
3d80: 20 62 6f 74 68 20 6f 66 20 74 68 65 20 66 6f 72 both of the for
3d90: 6d 3a 20 20 22 41 20 6f 70 20 42 22 20 77 69 74 m: "A op B" wit
3da0: 68 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 41 20 h the same.** A
3db0: 61 6e 64 20 42 20 76 61 6c 75 65 73 20 62 75 74 and B values but
3dc0: 20 64 69 66 66 65 72 65 6e 74 20 6f 70 65 72 61 different opera
3dd0: 74 6f 72 73 20 61 6e 64 20 69 66 20 74 68 65 20 tors and if the
3de0: 6f 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a operators are.**
3df0: 20 63 6f 6d 70 61 74 69 62 6c 65 20 28 69 66 20 compatible (if
3e00: 6f 6e 65 20 69 73 20 3d 20 61 6e 64 20 74 68 65 one is = and the
3e10: 20 6f 74 68 65 72 20 69 73 20 3c 2c 20 66 6f 72 other is <, for
3e20: 20 65 78 61 6d 70 6c 65 29 20 74 68 65 6e 0a 2a example) then.*
3e30: 2a 20 61 64 64 20 61 20 6e 65 77 20 76 69 72 74 * add a new virt
3e40: 75 61 6c 20 41 4e 44 20 74 65 72 6d 20 74 6f 20 ual AND term to
3e50: 70 57 43 20 74 68 61 74 20 69 73 20 74 68 65 20 pWC that is the
3e60: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 combination of t
3e70: 68 65 0a 2a 2a 20 74 77 6f 2e 0a 2a 2a 0a 2a 2a he.** two..**.**
3e80: 20 53 6f 6d 65 20 65 78 61 6d 70 6c 65 73 3a 0a Some examples:.
3e90: 2a 2a 0a 2a 2a 20 20 20 20 78 3c 79 20 4f 52 20 **.** x<y OR
3ea0: 78 3d 79 20 20 20 20 2d 2d 3e 20 20 20 20 20 78 x=y --> x
3eb0: 3c 3d 79 0a 2a 2a 20 20 20 20 78 3d 79 20 4f 52 <=y.** x=y OR
3ec0: 20 78 3d 79 20 20 20 20 2d 2d 3e 20 20 20 20 20 x=y -->
3ed0: 78 3d 79 0a 2a 2a 20 20 20 20 78 3c 3d 79 20 4f x=y.** x<=y O
3ee0: 52 20 78 3c 79 20 20 20 2d 2d 3e 20 20 20 20 20 R x<y -->
3ef0: 78 3c 3d 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 x<=y.**.** The f
3f00: 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 4e 4f 54 20 ollowing is NOT
3f10: 67 65 6e 65 72 61 74 65 64 3a 0a 2a 2a 0a 2a 2a generated:.**.**
3f20: 20 20 20 20 78 3c 79 20 4f 52 20 78 3e 79 20 20 x<y OR x>y
3f30: 20 20 2d 2d 3e 20 20 20 20 20 78 21 3d 79 20 20 --> x!=y
3f40: 20 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f .*/.static vo
3f50: 69 64 20 77 68 65 72 65 43 6f 6d 62 69 6e 65 44 id whereCombineD
3f60: 69 73 6a 75 6e 63 74 73 28 0a 20 20 53 72 63 4c isjuncts(. SrcL
3f70: 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 ist *pSrc,
3f80: 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 /* the FROM c
3f90: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 lause */. Where
3fa0: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 Clause *pWC,
3fb0: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 /* The complet
3fc0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a e WHERE clause *
3fd0: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 /. WhereTerm *p
3fe0: 4f 6e 65 2c 20 20 20 20 20 20 20 2f 2a 20 46 69 One, /* Fi
3ff0: 72 73 74 20 64 69 73 6a 75 6e 63 74 20 2a 2f 0a rst disjunct */.
4000: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 77 WhereTerm *pTw
4010: 6f 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f o /* Seco
4020: 6e 64 20 64 69 73 6a 75 6e 63 74 20 2a 2f 0a 29 nd disjunct */.)
4030: 7b 0a 20 20 75 31 36 20 65 4f 70 20 3d 20 70 4f {. u16 eOp = pO
4040: 6e 65 2d 3e 65 4f 70 65 72 61 74 6f 72 20 7c 20 ne->eOperator |
4050: 70 54 77 6f 2d 3e 65 4f 70 65 72 61 74 6f 72 3b pTwo->eOperator;
4060: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 . sqlite3 *db;
4070: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 /* Dat
4080: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e abase connection
4090: 20 28 66 6f 72 20 6d 61 6c 6c 6f 63 29 20 2a 2f (for malloc) */
40a0: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 20 20 . Expr *pNew;
40b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 /* New
40c0: 20 76 69 72 74 75 61 6c 20 65 78 70 72 65 73 73 virtual express
40d0: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b ion */. int op;
40e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
40f0: 2f 2a 20 4f 70 65 72 61 74 6f 72 20 66 6f 72 20 /* Operator for
4100: 74 68 65 20 63 6f 6d 62 69 6e 65 64 20 65 78 70 the combined exp
4110: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 ression */. int
4120: 20 69 64 78 4e 65 77 3b 20 20 20 20 20 20 20 20 idxNew;
4130: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 /* Index in
4140: 70 57 43 20 6f 66 20 74 68 65 20 6e 65 78 74 20 pWC of the next
4150: 76 69 72 74 75 61 6c 20 74 65 72 6d 20 2a 2f 0a virtual term */.
4160: 0a 20 20 69 66 28 20 28 70 4f 6e 65 2d 3e 65 4f . if( (pOne->eO
4170: 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 perator & (WO_EQ
4180: 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f |WO_LT|WO_LE|WO_
4190: 47 54 7c 57 4f 5f 47 45 29 29 3d 3d 30 20 29 20 GT|WO_GE))==0 )
41a0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 70 return;. if( (p
41b0: 54 77 6f 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 Two->eOperator &
41c0: 20 28 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f (WO_EQ|WO_LT|WO
41d0: 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 _LE|WO_GT|WO_GE)
41e0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 )==0 ) return;.
41f0: 20 69 66 28 20 28 65 4f 70 20 26 20 28 57 4f 5f if( (eOp & (WO_
4200: 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29 EQ|WO_LT|WO_LE))
4210: 21 3d 65 4f 70 0a 20 20 20 26 26 20 28 65 4f 70 !=eOp. && (eOp
4220: 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 47 54 7c & (WO_EQ|WO_GT|
4230: 57 4f 5f 47 45 29 29 21 3d 65 4f 70 20 29 20 72 WO_GE))!=eOp ) r
4240: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 eturn;. assert(
4250: 20 70 4f 6e 65 2d 3e 70 45 78 70 72 2d 3e 70 4c pOne->pExpr->pL
4260: 65 66 74 21 3d 30 20 26 26 20 70 4f 6e 65 2d 3e eft!=0 && pOne->
4270: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 21 3d 30 pExpr->pRight!=0
4280: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 );. assert( pT
4290: 77 6f 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 wo->pExpr->pLeft
42a0: 21 3d 30 20 26 26 20 70 54 77 6f 2d 3e 70 45 78 !=0 && pTwo->pEx
42b0: 70 72 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b pr->pRight!=0 );
42c0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 . if( sqlite3Ex
42d0: 70 72 43 6f 6d 70 61 72 65 28 30 2c 70 4f 6e 65 prCompare(0,pOne
42e0: 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 ->pExpr->pLeft,
42f0: 70 54 77 6f 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 pTwo->pExpr->pLe
4300: 66 74 2c 20 2d 31 29 20 29 20 72 65 74 75 72 6e ft, -1) ) return
4310: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 ;. if( sqlite3E
4320: 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 70 4f 6e xprCompare(0,pOn
4330: 65 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 e->pExpr->pRight
4340: 2c 20 70 54 77 6f 2d 3e 70 45 78 70 72 2d 3e 70 , pTwo->pExpr->p
4350: 52 69 67 68 74 2c 2d 31 29 20 29 72 65 74 75 72 Right,-1) )retur
4360: 6e 3b 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 n;. /* If we re
4370: 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 ach this point,
4380: 69 74 20 6d 65 61 6e 73 20 74 68 65 20 74 77 6f it means the two
4390: 20 73 75 62 74 65 72 6d 73 20 63 61 6e 20 62 65 subterms can be
43a0: 20 63 6f 6d 62 69 6e 65 64 20 2a 2f 0a 20 20 69 combined */. i
43b0: 66 28 20 28 65 4f 70 20 26 20 28 65 4f 70 2d 31 f( (eOp & (eOp-1
43c0: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 ))!=0 ){. if(
43d0: 20 65 4f 70 20 26 20 28 57 4f 5f 4c 54 7c 57 4f eOp & (WO_LT|WO
43e0: 5f 4c 45 29 20 29 7b 0a 20 20 20 20 20 20 65 4f _LE) ){. eO
43f0: 70 20 3d 20 57 4f 5f 4c 45 3b 0a 20 20 20 20 7d p = WO_LE;. }
4400: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 else{. asse
4410: 72 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 47 54 rt( eOp & (WO_GT
4420: 7c 57 4f 5f 47 45 29 20 29 3b 0a 20 20 20 20 20 |WO_GE) );.
4430: 20 65 4f 70 20 3d 20 57 4f 5f 47 45 3b 0a 20 20 eOp = WO_GE;.
4440: 20 20 7d 0a 20 20 7d 0a 20 20 64 62 20 3d 20 70 }. }. db = p
4450: 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 WC->pWInfo->pPar
4460: 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d se->db;. pNew =
4470: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 sqlite3ExprDup(
4480: 64 62 2c 20 70 4f 6e 65 2d 3e 70 45 78 70 72 2c db, pOne->pExpr,
4490: 20 30 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 0);. if( pNew=
44a0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 =0 ) return;. f
44b0: 6f 72 28 6f 70 3d 54 4b 5f 45 51 3b 20 65 4f 70 or(op=TK_EQ; eOp
44c0: 21 3d 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b !=(WO_EQ<<(op-TK
44d0: 5f 45 51 29 29 3b 20 6f 70 2b 2b 29 7b 20 61 73 _EQ)); op++){ as
44e0: 73 65 72 74 28 20 6f 70 3c 54 4b 5f 47 45 20 29 sert( op<TK_GE )
44f0: 3b 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d ; }. pNew->op =
4500: 20 6f 70 3b 0a 20 20 69 64 78 4e 65 77 20 3d 20 op;. idxNew =
4510: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 whereClauseInser
4520: 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45 52 t(pWC, pNew, TER
4530: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 M_VIRTUAL|TERM_D
4540: 59 4e 41 4d 49 43 29 3b 0a 20 20 65 78 70 72 41 YNAMIC);. exprA
4550: 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 nalyze(pSrc, pWC
4560: 2c 20 69 64 78 4e 65 77 29 3b 0a 7d 0a 0a 23 69 , idxNew);.}..#i
4570: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 f !defined(SQLIT
4580: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 E_OMIT_OR_OPTIMI
4590: 5a 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69 ZATION) && !defi
45a0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f ned(SQLITE_OMIT_
45b0: 53 55 42 51 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20 SUBQUERY)./*.**
45c0: 41 6e 61 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 Analyze a term t
45d0: 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 hat consists of
45e0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 two or more OR-c
45f0: 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 73 75 62 74 onnected.** subt
4600: 65 72 6d 73 2e 20 20 53 6f 20 69 6e 3a 0a 2a 2a erms. So in:.**
4610: 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 57 48 45 52 .** ... WHER
4620: 45 20 20 28 61 3d 35 29 20 41 4e 44 20 28 62 3d E (a=5) AND (b=
4630: 37 20 4f 52 20 63 3d 39 20 4f 52 20 64 3d 31 33 7 OR c=9 OR d=13
4640: 29 20 41 4e 44 20 28 64 3d 31 33 29 0a 2a 2a 20 ) AND (d=13).**
4650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4660: 20 20 20 20 20 20 20 20 20 5e 5e 5e 5e 5e 5e 5e ^^^^^^^
4670: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a ^^^^^^^^^^^^^.**
4680: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 .** This routine
4690: 20 61 6e 61 6c 79 7a 65 73 20 74 65 72 6d 73 20 analyzes terms
46a0: 73 75 63 68 20 61 73 20 74 68 65 20 6d 69 64 64 such as the midd
46b0: 6c 65 20 74 65 72 6d 20 69 6e 20 74 68 65 20 61 le term in the a
46c0: 62 6f 76 65 20 65 78 61 6d 70 6c 65 2e 0a 2a 2a bove example..**
46d0: 20 41 20 57 68 65 72 65 4f 72 54 65 72 6d 20 6f A WhereOrTerm o
46e0: 62 6a 65 63 74 20 69 73 20 63 6f 6d 70 75 74 65 bject is compute
46f0: 64 20 61 6e 64 20 61 74 74 61 63 68 65 64 20 74 d and attached t
4700: 6f 20 74 68 65 20 74 65 72 6d 20 75 6e 64 65 72 o the term under
4710: 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 2c 20 72 65 .** analysis, re
4720: 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 gardless of the
4730: 6f 75 74 63 6f 6d 65 20 6f 66 20 74 68 65 20 61 outcome of the a
4740: 6e 61 6c 79 73 69 73 2e 20 20 48 65 6e 63 65 3a nalysis. Hence:
4750: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 .**.** Where
4760: 54 65 72 6d 2e 77 74 46 6c 61 67 73 20 20 20 7c Term.wtFlags |
4770: 3d 20 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 0a 2a = TERM_ORINFO.*
4780: 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e * WhereTerm.
4790: 75 2e 70 4f 72 49 6e 66 6f 20 20 3d 20 20 61 20 u.pOrInfo = a
47a0: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f dynamically allo
47b0: 63 61 74 65 64 20 57 68 65 72 65 4f 72 54 65 72 cated WhereOrTer
47c0: 6d 20 6f 62 6a 65 63 74 0a 2a 2a 0a 2a 2a 20 54 m object.**.** T
47d0: 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61 6e he term being an
47e0: 61 6c 79 7a 65 64 20 6d 75 73 74 20 68 61 76 65 alyzed must have
47f0: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 66 20 two or more of
4800: 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 OR-connected sub
4810: 74 65 72 6d 73 2e 0a 2a 2a 20 41 20 73 69 6e 67 terms..** A sing
4820: 6c 65 20 73 75 62 74 65 72 6d 20 6d 69 67 68 74 le subterm might
4830: 20 62 65 20 61 20 73 65 74 20 6f 66 20 41 4e 44 be a set of AND
4840: 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 2d 73 -connected sub-s
4850: 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 45 78 61 6d ubterms..** Exam
4860: 70 6c 65 73 20 6f 66 20 74 65 72 6d 73 20 75 6e ples of terms un
4870: 64 65 72 20 61 6e 61 6c 79 73 69 73 3a 0a 2a 2a der analysis:.**
4880: 0a 2a 2a 20 20 20 20 20 28 41 29 20 20 20 20 20 .** (A)
4890: 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20 74 31 2e t1.x=t2.y OR t1.
48a0: 78 3d 74 32 2e 7a 20 4f 52 20 74 31 2e 79 3d 31 x=t2.z OR t1.y=1
48b0: 35 20 4f 52 20 74 31 2e 7a 3d 74 33 2e 61 2b 35 5 OR t1.z=t3.a+5
48c0: 0a 2a 2a 20 20 20 20 20 28 42 29 20 20 20 20 20 .** (B)
48d0: 78 3d 65 78 70 72 31 20 4f 52 20 65 78 70 72 32 x=expr1 OR expr2
48e0: 3d 78 20 4f 52 20 78 3d 65 78 70 72 33 0a 2a 2a =x OR x=expr3.**
48f0: 20 20 20 20 20 28 43 29 20 20 20 20 20 74 31 2e (C) t1.
4900: 78 3d 74 32 2e 79 20 4f 52 20 28 74 31 2e 78 3d x=t2.y OR (t1.x=
4910: 74 32 2e 7a 20 41 4e 44 20 74 31 2e 79 3d 31 35 t2.z AND t1.y=15
4920: 29 0a 2a 2a 20 20 20 20 20 28 44 29 20 20 20 20 ).** (D)
4930: 20 78 3d 65 78 70 72 31 20 4f 52 20 28 79 3e 31 x=expr1 OR (y>1
4940: 31 20 41 4e 44 20 79 3c 32 32 20 41 4e 44 20 7a 1 AND y<22 AND z
4950: 20 4c 49 4b 45 20 27 2a 68 65 6c 6c 6f 2a 27 29 LIKE '*hello*')
4960: 0a 2a 2a 20 20 20 20 20 28 45 29 20 20 20 20 20 .** (E)
4970: 28 70 2e 61 3d 31 20 41 4e 44 20 71 2e 62 3d 32 (p.a=1 AND q.b=2
4980: 20 41 4e 44 20 72 2e 63 3d 33 29 20 4f 52 20 28 AND r.c=3) OR (
4990: 70 2e 78 3d 34 20 41 4e 44 20 71 2e 79 3d 35 20 p.x=4 AND q.y=5
49a0: 41 4e 44 20 72 2e 7a 3d 36 29 0a 2a 2a 20 20 20 AND r.z=6).**
49b0: 20 20 28 46 29 20 20 20 20 20 78 3e 41 20 4f 52 (F) x>A OR
49c0: 20 28 78 3d 41 20 41 4e 44 20 79 3e 3d 42 29 0a (x=A AND y>=B).
49d0: 2a 2a 0a 2a 2a 20 43 41 53 45 20 31 3a 0a 2a 2a **.** CASE 1:.**
49e0: 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65 .** If all subte
49f0: 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20 66 rms are of the f
4a00: 6f 72 6d 20 54 2e 43 3d 65 78 70 72 20 66 6f 72 orm T.C=expr for
4a10: 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 63 6f 6c some single col
4a20: 75 6d 6e 20 6f 66 20 43 20 61 6e 64 0a 2a 2a 20 umn of C and.**
4a30: 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 54 a single table T
4a40: 20 28 61 73 20 73 68 6f 77 6e 20 69 6e 20 65 78 (as shown in ex
4a50: 61 6d 70 6c 65 20 42 20 61 62 6f 76 65 29 20 74 ample B above) t
4a60: 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 hen create a new
4a70: 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d virtual.** term
4a80: 20 74 68 61 74 20 69 73 20 61 6e 20 65 71 75 69 that is an equi
4a90: 76 61 6c 65 6e 74 20 49 4e 20 65 78 70 72 65 73 valent IN expres
4aa0: 73 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 sion. In other
4ab0: 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 74 65 words, if the te
4ac0: 72 6d 0a 2a 2a 20 62 65 69 6e 67 20 61 6e 61 6c rm.** being anal
4ad0: 79 7a 65 64 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 yzed is:.**.**
4ae0: 20 20 20 20 78 20 3d 20 65 78 70 72 31 20 20 4f x = expr1 O
4af0: 52 20 20 65 78 70 72 32 20 3d 20 78 20 20 4f 52 R expr2 = x OR
4b00: 20 20 78 20 3d 20 65 78 70 72 33 0a 2a 2a 0a 2a x = expr3.**.*
4b10: 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 * then create a
4b20: 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d new virtual term
4b30: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a like this:.**.*
4b40: 2a 20 20 20 20 20 20 78 20 49 4e 20 28 65 78 70 * x IN (exp
4b50: 72 31 2c 65 78 70 72 32 2c 65 78 70 72 33 29 0a r1,expr2,expr3).
4b60: 2a 2a 0a 2a 2a 20 43 41 53 45 20 32 3a 0a 2a 2a **.** CASE 2:.**
4b70: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 .** If there are
4b80: 20 65 78 61 63 74 6c 79 20 74 77 6f 20 64 69 73 exactly two dis
4b90: 6a 75 6e 63 74 73 20 61 6e 64 20 6f 6e 65 20 73 juncts and one s
4ba0: 69 64 65 20 68 61 73 20 78 3e 41 20 61 6e 64 20 ide has x>A and
4bb0: 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 0a 2a the other side.*
4bc0: 2a 20 68 61 73 20 78 3d 41 20 28 66 6f 72 20 74 * has x=A (for t
4bd0: 68 65 20 73 61 6d 65 20 78 20 61 6e 64 20 41 29 he same x and A)
4be0: 20 74 68 65 6e 20 61 64 64 20 61 20 6e 65 77 20 then add a new
4bf0: 76 69 72 74 75 61 6c 20 63 6f 6e 6a 75 6e 63 74 virtual conjunct
4c00: 20 74 65 72 6d 20 74 6f 20 74 68 65 0a 2a 2a 20 term to the.**
4c10: 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 WHERE clause of
4c20: 74 68 65 20 66 6f 72 6d 20 22 78 3e 3d 41 22 2e the form "x>=A".
4c30: 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a Example:.**.**
4c40: 20 20 20 20 20 20 78 3e 41 20 4f 52 20 28 78 3d x>A OR (x=
4c50: 41 20 41 4e 44 20 79 3e 42 29 20 20 20 20 61 64 A AND y>B) ad
4c60: 64 73 3a 20 20 20 20 78 3e 3d 41 0a 2a 2a 0a 2a ds: x>=A.**.*
4c70: 2a 20 54 68 65 20 61 64 64 65 64 20 63 6f 6e 6a * The added conj
4c80: 75 6e 63 74 20 63 61 6e 20 73 6f 6d 65 74 69 6d unct can sometim
4c90: 65 73 20 62 65 20 68 65 6c 70 66 75 6c 20 69 6e es be helpful in
4ca0: 20 71 75 65 72 79 20 70 6c 61 6e 6e 69 6e 67 2e query planning.
4cb0: 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 33 3a 0a 2a .**.** CASE 3:.*
4cc0: 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 *.** If all subt
4cd0: 65 72 6d 73 20 61 72 65 20 69 6e 64 65 78 61 62 erms are indexab
4ce0: 6c 65 20 62 79 20 61 20 73 69 6e 67 6c 65 20 74 le by a single t
4cf0: 61 62 6c 65 20 54 2c 20 74 68 65 6e 20 73 65 74 able T, then set
4d00: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 .**.** Where
4d10: 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f 72 20 20 Term.eOperator
4d20: 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 20 57 = W
4d30: 4f 5f 4f 52 0a 2a 2a 20 20 20 20 20 57 68 65 72 O_OR.** Wher
4d40: 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 2d eTerm.u.pOrInfo-
4d50: 3e 69 6e 64 65 78 61 62 6c 65 20 20 7c 3d 20 20 >indexable |=
4d60: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 the cursor numbe
4d70: 72 20 66 6f 72 20 74 61 62 6c 65 20 54 0a 2a 2a r for table T.**
4d80: 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20 69 73 .** A subterm is
4d90: 20 22 69 6e 64 65 78 61 62 6c 65 22 20 69 66 20 "indexable" if
4da0: 69 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 it is of the for
4db0: 6d 0a 2a 2a 20 22 54 2e 43 20 3c 6f 70 3e 20 3c m.** "T.C <op> <
4dc0: 65 78 70 72 3e 22 20 77 68 65 72 65 20 43 20 69 expr>" where C i
4dd0: 73 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 s any column of
4de0: 74 61 62 6c 65 20 54 20 61 6e 64 20 0a 2a 2a 20 table T and .**
4df0: 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20 22 <op> is one of "
4e00: 3d 22 2c 20 22 3c 22 2c 20 22 3c 3d 22 2c 20 22 =", "<", "<=", "
4e10: 3e 22 2c 20 22 3e 3d 22 2c 20 22 49 53 20 4e 55 >", ">=", "IS NU
4e20: 4c 4c 22 2c 20 6f 72 20 22 49 4e 22 2e 0a 2a 2a LL", or "IN"..**
4e30: 20 41 20 73 75 62 74 65 72 6d 20 69 73 20 61 6c A subterm is al
4e40: 73 6f 20 69 6e 64 65 78 61 62 6c 65 20 69 66 20 so indexable if
4e50: 69 74 20 69 73 20 61 6e 20 41 4e 44 20 6f 66 20 it is an AND of
4e60: 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 73 two or more.** s
4e70: 75 62 73 75 62 74 65 72 6d 73 20 61 74 20 6c 65 ubsubterms at le
4e80: 61 73 74 20 6f 6e 65 20 6f 66 20 77 68 69 63 68 ast one of which
4e90: 20 69 73 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 is indexable.
4ea0: 49 6e 64 65 78 61 62 6c 65 20 41 4e 44 20 0a 2a Indexable AND .*
4eb0: 2a 20 73 75 62 74 65 72 6d 73 20 68 61 76 65 20 * subterms have
4ec0: 74 68 65 69 72 20 65 4f 70 65 72 61 74 6f 72 20 their eOperator
4ed0: 73 65 74 20 74 6f 20 57 4f 5f 41 4e 44 20 61 6e set to WO_AND an
4ee0: 64 20 74 68 65 79 20 68 61 76 65 0a 2a 2a 20 75 d they have.** u
4ef0: 2e 70 41 6e 64 49 6e 66 6f 20 73 65 74 20 74 6f .pAndInfo set to
4f00: 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 a dynamically a
4f10: 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65 41 6e llocated WhereAn
4f20: 64 54 65 72 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2a dTerm object..**
4f30: 0a 2a 2a 20 46 72 6f 6d 20 61 6e 6f 74 68 65 72 .** From another
4f40: 20 70 6f 69 6e 74 20 6f 66 20 76 69 65 77 2c 20 point of view,
4f50: 22 69 6e 64 65 78 61 62 6c 65 22 20 6d 65 61 6e "indexable" mean
4f60: 73 20 74 68 61 74 20 74 68 65 20 73 75 62 74 65 s that the subte
4f70: 72 6d 20 63 6f 75 6c 64 0a 2a 2a 20 70 6f 74 65 rm could.** pote
4f80: 6e 74 69 61 6c 6c 79 20 62 65 20 75 73 65 64 20 ntially be used
4f90: 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20 69 66 with an index if
4fa0: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 an appropriate
4fb0: 69 6e 64 65 78 20 65 78 69 73 74 73 2e 0a 2a 2a index exists..**
4fc0: 20 54 68 69 73 20 61 6e 61 6c 79 73 69 73 20 64 This analysis d
4fd0: 6f 65 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 oes not consider
4fe0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 whether or not
4ff0: 74 68 65 20 69 6e 64 65 78 20 65 78 69 73 74 73 the index exists
5000: 3b 20 74 68 61 74 0a 2a 2a 20 69 73 20 64 65 63 ; that.** is dec
5010: 69 64 65 64 20 65 6c 73 65 77 68 65 72 65 2e 20 ided elsewhere.
5020: 20 54 68 69 73 20 61 6e 61 6c 79 73 69 73 20 6f This analysis o
5030: 6e 6c 79 20 6c 6f 6f 6b 73 20 61 74 20 77 68 65 nly looks at whe
5040: 74 68 65 72 20 73 75 62 74 65 72 6d 73 0a 2a 2a ther subterms.**
5050: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 appropriate for
5060: 20 69 6e 64 65 78 69 6e 67 20 65 78 69 73 74 2e indexing exist.
5070: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65 78 61 6d 70 .**.** All examp
5080: 6c 65 73 20 41 20 74 68 72 6f 75 67 68 20 45 20 les A through E
5090: 61 62 6f 76 65 20 73 61 74 69 73 66 79 20 63 61 above satisfy ca
50a0: 73 65 20 33 2e 20 20 42 75 74 20 69 66 20 61 20 se 3. But if a
50b0: 74 65 72 6d 0a 2a 2a 20 61 6c 73 6f 20 73 61 74 term.** also sat
50c0: 69 73 66 69 65 73 20 63 61 73 65 20 31 20 28 73 isfies case 1 (s
50d0: 75 63 68 20 61 73 20 42 29 20 77 65 20 6b 6e 6f uch as B) we kno
50e0: 77 20 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d w that the optim
50f0: 69 7a 65 72 20 77 69 6c 6c 0a 2a 2a 20 61 6c 77 izer will.** alw
5100: 61 79 73 20 70 72 65 66 65 72 20 63 61 73 65 20 ays prefer case
5110: 31 2c 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61 1, so in that ca
5120: 73 65 20 77 65 20 70 72 65 74 65 6e 64 20 74 68 se we pretend th
5130: 61 74 20 63 61 73 65 20 33 20 69 73 20 6e 6f 74 at case 3 is not
5140: 0a 2a 2a 20 73 61 74 69 73 66 69 65 64 2e 0a 2a .** satisfied..*
5150: 2a 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 62 65 *.** It might be
5160: 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 6d the case that m
5170: 75 6c 74 69 70 6c 65 20 74 61 62 6c 65 73 20 61 ultiple tables a
5180: 72 65 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 46 re indexable. F
5190: 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 28 or example,.** (
51a0: 45 29 20 61 62 6f 76 65 20 69 73 20 69 6e 64 65 E) above is inde
51b0: 78 61 62 6c 65 20 6f 6e 20 74 61 62 6c 65 73 20 xable on tables
51c0: 50 2c 20 51 2c 20 61 6e 64 20 52 2e 0a 2a 2a 0a P, Q, and R..**.
51d0: 2a 2a 20 54 65 72 6d 73 20 74 68 61 74 20 73 61 ** Terms that sa
51e0: 74 69 73 66 79 20 63 61 73 65 20 33 20 61 72 65 tisfy case 3 are
51f0: 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20 candidates for
5200: 6c 6f 6f 6b 75 70 20 62 79 20 75 73 69 6e 67 0a lookup by using.
5210: 2a 2a 20 73 65 70 61 72 61 74 65 20 69 6e 64 69 ** separate indi
5220: 63 65 73 20 74 6f 20 66 69 6e 64 20 72 6f 77 69 ces to find rowi
5230: 64 73 20 66 6f 72 20 65 61 63 68 20 73 75 62 74 ds for each subt
5240: 65 72 6d 20 61 6e 64 20 63 6f 6d 70 6f 73 69 6e erm and composin
5250: 67 0a 2a 2a 20 74 68 65 20 75 6e 69 6f 6e 20 6f g.** the union o
5260: 66 20 61 6c 6c 20 72 6f 77 69 64 73 20 75 73 69 f all rowids usi
5270: 6e 67 20 61 20 52 6f 77 53 65 74 20 6f 62 6a 65 ng a RowSet obje
5280: 63 74 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d ct. This is sim
5290: 69 6c 61 72 0a 2a 2a 20 74 6f 20 22 62 69 74 6d ilar.** to "bitm
52a0: 61 70 20 69 6e 64 69 63 65 73 22 20 69 6e 20 6f ap indices" in o
52b0: 74 68 65 72 20 64 61 74 61 62 61 73 65 20 65 6e ther database en
52c0: 67 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48 gines..**.** OTH
52d0: 45 52 57 49 53 45 3a 0a 2a 2a 0a 2a 2a 20 49 66 ERWISE:.**.** If
52e0: 20 6e 6f 6e 65 20 6f 66 20 63 61 73 65 73 20 31 none of cases 1
52f0: 2c 20 32 2c 20 6f 72 20 33 20 61 70 70 6c 79 2c , 2, or 3 apply,
5300: 20 74 68 65 6e 20 6c 65 61 76 65 20 74 68 65 20 then leave the
5310: 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f eOperator set to
5320: 0a 2a 2a 20 7a 65 72 6f 2e 20 20 54 68 69 73 20 .** zero. This
5330: 74 65 72 6d 20 69 73 20 6e 6f 74 20 75 73 65 66 term is not usef
5340: 75 6c 20 66 6f 72 20 73 65 61 72 63 68 2e 0a 2a ul for search..*
5350: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 /.static void ex
5360: 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 prAnalyzeOrTerm(
5370: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 . SrcList *pSrc
5380: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 , /*
5390: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 the FROM clause
53a0: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 */. WhereClause
53b0: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f *pWC, /
53c0: 2a 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 57 * the complete W
53d0: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 HERE clause */.
53e0: 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20 int idxTerm
53f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e /* In
5400: 64 65 78 20 6f 66 20 74 68 65 20 4f 52 2d 74 65 dex of the OR-te
5410: 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 rm to be analyze
5420: 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 d */.){. WhereI
5430: 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 nfo *pWInfo = pW
5440: 43 2d 3e 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 C->pWInfo;
5450: 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 /* WHERE claus
5460: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e e processing con
5470: 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 text */. Parse
5480: 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f *pParse = pWInfo
5490: 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 ->pParse;
54a0: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 /* Parser cont
54b0: 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 ext */. sqlite3
54c0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 *db = pParse->d
54d0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 b;
54e0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e /* Database con
54f0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 nection */. Whe
5500: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 reTerm *pTerm =
5510: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d &pWC->a[idxTerm]
5520: 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d ; /* The term
5530: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 to be analyzed
5540: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 */. Expr *pExpr
5550: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b = pTerm->pExpr;
5560: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
5570: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f The expression o
5580: 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 f the term */.
5590: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 int i;
55a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
55b0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 /* Loop
55c0: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 counters */. Wh
55d0: 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 ereClause *pOrWc
55e0: 3b 20 20 20 20 20 20 20 2f 2a 20 42 72 65 61 6b ; /* Break
55f0: 75 70 20 6f 66 20 70 54 65 72 6d 20 69 6e 74 6f up of pTerm into
5600: 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20 57 subterms */. W
5610: 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 hereTerm *pOrTer
5620: 6d 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 53 75 m; /* A Su
5630: 62 2d 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 b-term within th
5640: 65 20 70 4f 72 57 63 20 2a 2f 0a 20 20 57 68 65 e pOrWc */. Whe
5650: 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 reOrInfo *pOrInf
5660: 6f 3b 20 20 20 20 20 2f 2a 20 41 64 64 69 74 69 o; /* Additi
5670: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e onal information
5680: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 associated with
5690: 20 70 54 65 72 6d 20 2a 2f 0a 20 20 42 69 74 6d pTerm */. Bitm
56a0: 61 73 6b 20 63 68 6e 67 54 6f 49 4e 3b 20 20 20 ask chngToIN;
56b0: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 /* Tables
56c0: 74 68 61 74 20 6d 69 67 68 74 20 73 61 74 69 73 that might satis
56d0: 66 79 20 63 61 73 65 20 31 20 2a 2f 0a 20 20 42 fy case 1 */. B
56e0: 69 74 6d 61 73 6b 20 69 6e 64 65 78 61 62 6c 65 itmask indexable
56f0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c ; /* Tabl
5700: 65 73 20 74 68 61 74 20 61 72 65 20 69 6e 64 65 es that are inde
5710: 78 61 62 6c 65 2c 20 73 61 74 69 73 66 79 69 6e xable, satisfyin
5720: 67 20 63 61 73 65 20 32 20 2a 2f 0a 0a 20 20 2f g case 2 */.. /
5730: 2a 0a 20 20 2a 2a 20 42 72 65 61 6b 20 74 68 65 *. ** Break the
5740: 20 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 OR clause into
5750: 69 74 73 20 73 65 70 61 72 61 74 65 20 73 75 62 its separate sub
5760: 74 65 72 6d 73 2e 20 20 54 68 65 20 73 75 62 74 terms. The subt
5770: 65 72 6d 73 20 61 72 65 0a 20 20 2a 2a 20 73 74 erms are. ** st
5780: 6f 72 65 64 20 69 6e 20 61 20 57 68 65 72 65 43 ored in a WhereC
5790: 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 20 lause structure
57a0: 63 6f 6e 74 61 69 6e 69 6e 67 20 77 69 74 68 69 containing withi
57b0: 6e 20 74 68 65 20 57 68 65 72 65 4f 72 49 6e 66 n the WhereOrInf
57c0: 6f 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20 74 68 o. ** object th
57d0: 61 74 20 69 73 20 61 74 74 61 63 68 65 64 20 74 at is attached t
57e0: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4f o the original O
57f0: 52 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 20 R clause term..
5800: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 */. assert( (p
5810: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 Term->wtFlags &
5820: 28 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45 (TERM_DYNAMIC|TE
5830: 52 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f 41 RM_ORINFO|TERM_A
5840: 4e 44 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 NDINFO))==0 );.
5850: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e assert( pExpr->
5860: 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 70 op==TK_OR );. p
5870: 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 20 Term->u.pOrInfo
5880: 3d 20 70 4f 72 49 6e 66 6f 20 3d 20 73 71 6c 69 = pOrInfo = sqli
5890: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 te3DbMallocZero(
58a0: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4f 72 49 db, sizeof(*pOrI
58b0: 6e 66 6f 29 29 3b 0a 20 20 69 66 28 20 70 4f 72 nfo));. if( pOr
58c0: 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e Info==0 ) return
58d0: 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 ;. pTerm->wtFla
58e0: 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 49 4e 46 gs |= TERM_ORINF
58f0: 4f 3b 0a 20 20 70 4f 72 57 63 20 3d 20 26 70 4f O;. pOrWc = &pO
5900: 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 6d 65 6d rInfo->wc;. mem
5910: 73 65 74 28 70 4f 72 57 63 2d 3e 61 53 74 61 74 set(pOrWc->aStat
5920: 69 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f ic, 0, sizeof(pO
5930: 72 57 63 2d 3e 61 53 74 61 74 69 63 29 29 3b 0a rWc->aStatic));.
5940: 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c sqlite3WhereCl
5950: 61 75 73 65 49 6e 69 74 28 70 4f 72 57 63 2c 20 auseInit(pOrWc,
5960: 70 57 49 6e 66 6f 29 3b 0a 20 20 73 71 6c 69 74 pWInfo);. sqlit
5970: 65 33 57 68 65 72 65 53 70 6c 69 74 28 70 4f 72 e3WhereSplit(pOr
5980: 57 63 2c 20 70 45 78 70 72 2c 20 54 4b 5f 4f 52 Wc, pExpr, TK_OR
5990: 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 );. sqlite3Wher
59a0: 65 45 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 eExprAnalyze(pSr
59b0: 63 2c 20 70 4f 72 57 63 29 3b 0a 20 20 69 66 28 c, pOrWc);. if(
59c0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 db->mallocFaile
59d0: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 d ) return;. as
59e0: 73 65 72 74 28 20 70 4f 72 57 63 2d 3e 6e 54 65 sert( pOrWc->nTe
59f0: 72 6d 3e 3d 32 20 29 3b 0a 0a 20 20 2f 2a 0a 20 rm>=2 );.. /*.
5a00: 20 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 ** Compute the
5a10: 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 set of tables th
5a20: 61 74 20 6d 69 67 68 74 20 73 61 74 69 73 66 79 at might satisfy
5a30: 20 63 61 73 65 73 20 31 20 6f 72 20 33 2e 0a 20 cases 1 or 3..
5a40: 20 2a 2f 0a 20 20 69 6e 64 65 78 61 62 6c 65 20 */. indexable
5a50: 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 = ~(Bitmask)0;.
5a60: 20 63 68 6e 67 54 6f 49 4e 20 3d 20 7e 28 42 69 chngToIN = ~(Bi
5a70: 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 tmask)0;. for(i
5a80: 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c =pOrWc->nTerm-1,
5a90: 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e pOrTerm=pOrWc->
5aa0: 61 3b 20 69 3e 3d 30 20 26 26 20 69 6e 64 65 78 a; i>=0 && index
5ab0: 61 62 6c 65 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 able; i--, pOrTe
5ac0: 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 rm++){. if( (
5ad0: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 pOrTerm->eOperat
5ae0: 6f 72 20 26 20 57 4f 5f 53 49 4e 47 4c 45 29 3d or & WO_SINGLE)=
5af0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 =0 ){. Wher
5b00: 65 41 6e 64 49 6e 66 6f 20 2a 70 41 6e 64 49 6e eAndInfo *pAndIn
5b10: 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 fo;. assert
5b20: 28 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c ( (pOrTerm->wtFl
5b30: 61 67 73 20 26 20 28 54 45 52 4d 5f 41 4e 44 49 ags & (TERM_ANDI
5b40: 4e 46 4f 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 NFO|TERM_ORINFO)
5b50: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 68 )==0 );. ch
5b60: 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 ngToIN = 0;.
5b70: 20 20 70 41 6e 64 49 6e 66 6f 20 3d 20 73 71 6c pAndInfo = sql
5b80: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e ite3DbMallocRawN
5b90: 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 41 N(db, sizeof(*pA
5ba0: 6e 64 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 ndInfo));.
5bb0: 69 66 28 20 70 41 6e 64 49 6e 66 6f 20 29 7b 0a if( pAndInfo ){.
5bc0: 20 20 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 WhereCla
5bd0: 75 73 65 20 2a 70 41 6e 64 57 43 3b 0a 20 20 20 use *pAndWC;.
5be0: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a WhereTerm *
5bf0: 70 41 6e 64 54 65 72 6d 3b 0a 20 20 20 20 20 20 pAndTerm;.
5c00: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 int j;.
5c10: 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 30 3b 0a Bitmask b = 0;.
5c20: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d pOrTerm-
5c30: 3e 75 2e 70 41 6e 64 49 6e 66 6f 20 3d 20 70 41 >u.pAndInfo = pA
5c40: 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 ndInfo;.
5c50: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 pOrTerm->wtFlags
5c60: 20 7c 3d 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f |= TERM_ANDINFO
5c70: 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 ;. pOrTer
5c80: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 m->eOperator = W
5c90: 4f 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 70 O_AND;. p
5ca0: 41 6e 64 57 43 20 3d 20 26 70 41 6e 64 49 6e 66 AndWC = &pAndInf
5cb0: 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 6d o->wc;. m
5cc0: 65 6d 73 65 74 28 70 41 6e 64 57 43 2d 3e 61 53 emset(pAndWC->aS
5cd0: 74 61 74 69 63 2c 20 30 2c 20 73 69 7a 65 6f 66 tatic, 0, sizeof
5ce0: 28 70 41 6e 64 57 43 2d 3e 61 53 74 61 74 69 63 (pAndWC->aStatic
5cf0: 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 ));. sqli
5d00: 74 65 33 57 68 65 72 65 43 6c 61 75 73 65 49 6e te3WhereClauseIn
5d10: 69 74 28 70 41 6e 64 57 43 2c 20 70 57 43 2d 3e it(pAndWC, pWC->
5d20: 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 pWInfo);.
5d30: 20 73 71 6c 69 74 65 33 57 68 65 72 65 53 70 6c sqlite3WhereSpl
5d40: 69 74 28 70 41 6e 64 57 43 2c 20 70 4f 72 54 65 it(pAndWC, pOrTe
5d50: 72 6d 2d 3e 70 45 78 70 72 2c 20 54 4b 5f 41 4e rm->pExpr, TK_AN
5d60: 44 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 D);. sqli
5d70: 74 65 33 57 68 65 72 65 45 78 70 72 41 6e 61 6c te3WhereExprAnal
5d80: 79 7a 65 28 70 53 72 63 2c 20 70 41 6e 64 57 43 yze(pSrc, pAndWC
5d90: 29 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 57 );. pAndW
5da0: 43 2d 3e 70 4f 75 74 65 72 20 3d 20 70 57 43 3b C->pOuter = pWC;
5db0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 64 62 . if( !db
5dc0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 ->mallocFailed )
5dd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 {. for(
5de0: 6a 3d 30 2c 20 70 41 6e 64 54 65 72 6d 3d 70 41 j=0, pAndTerm=pA
5df0: 6e 64 57 43 2d 3e 61 3b 20 6a 3c 70 41 6e 64 57 ndWC->a; j<pAndW
5e00: 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 C->nTerm; j++, p
5e10: 41 6e 64 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 AndTerm++){.
5e20: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 assert(
5e30: 70 41 6e 64 54 65 72 6d 2d 3e 70 45 78 70 72 20 pAndTerm->pExpr
5e40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 );. i
5e50: 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 41 6e f( allowedOp(pAn
5e60: 64 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 dTerm->pExpr->op
5e70: 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ) .
5e80: 7c 7c 20 70 41 6e 64 54 65 72 6d 2d 3e 65 4f 70 || pAndTerm->eOp
5e90: 65 72 61 74 6f 72 3d 3d 57 4f 5f 41 55 58 0a 20 erator==WO_AUX.
5ea0: 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 ){.
5eb0: 20 20 20 20 20 20 20 20 20 20 20 20 62 20 7c 3d b |=
5ec0: 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65 74 sqlite3WhereGet
5ed0: 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d Mask(&pWInfo->sM
5ee0: 61 73 6b 53 65 74 2c 20 70 41 6e 64 54 65 72 6d askSet, pAndTerm
5ef0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 ->leftCursor);.
5f00: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 }.
5f10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
5f20: 20 7d 0a 20 20 20 20 20 20 20 20 69 6e 64 65 78 }. index
5f30: 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20 20 20 20 able &= b;.
5f40: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 }. }else if(
5f50: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 pOrTerm->wtFlag
5f60: 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 s & TERM_COPIED
5f70: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 ){. /* Skip
5f80: 20 74 68 69 73 20 74 65 72 6d 20 66 6f 72 20 6e this term for n
5f90: 6f 77 2e 20 20 57 65 20 72 65 76 69 73 69 74 20 ow. We revisit
5fa0: 69 74 20 77 68 65 6e 20 77 65 20 70 72 6f 63 65 it when we proce
5fb0: 73 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 ss the. **
5fc0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 54 45 corresponding TE
5fd0: 52 4d 5f 56 49 52 54 55 41 4c 20 74 65 72 6d 20 RM_VIRTUAL term
5fe0: 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 */. }else{.
5ff0: 20 20 20 20 42 69 74 6d 61 73 6b 20 62 3b 0a 20 Bitmask b;.
6000: 20 20 20 20 20 62 20 3d 20 73 71 6c 69 74 65 33 b = sqlite3
6010: 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70 57 WhereGetMask(&pW
6020: 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 Info->sMaskSet,
6030: 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 pOrTerm->leftCur
6040: 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 sor);. if(
6050: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 pOrTerm->wtFlags
6060: 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 & TERM_VIRTUAL
6070: 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 ){. Where
6080: 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 Term *pOther = &
6090: 70 4f 72 57 63 2d 3e 61 5b 70 4f 72 54 65 72 6d pOrWc->a[pOrTerm
60a0: 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 ->iParent];.
60b0: 20 20 20 20 62 20 7c 3d 20 73 71 6c 69 74 65 33 b |= sqlite3
60c0: 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70 57 WhereGetMask(&pW
60d0: 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 Info->sMaskSet,
60e0: 70 4f 74 68 65 72 2d 3e 6c 65 66 74 43 75 72 73 pOther->leftCurs
60f0: 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 or);. }.
6100: 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20 indexable &=
6110: 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4f b;. if( (pO
6120: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 rTerm->eOperator
6130: 20 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29 7b 0a & WO_EQ)==0 ){.
6140: 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e chngToIN
6150: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 = 0;. }els
6160: 65 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67 54 e{. chngT
6170: 6f 49 4e 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 oIN &= b;.
6180: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f }. }. }.. /
6190: 2a 0a 20 20 2a 2a 20 52 65 63 6f 72 64 20 74 68 *. ** Record th
61a0: 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 e set of tables
61b0: 74 68 61 74 20 73 61 74 69 73 66 79 20 63 61 73 that satisfy cas
61c0: 65 20 33 2e 20 20 54 68 65 20 73 65 74 20 6d 69 e 3. The set mi
61d0: 67 68 74 20 62 65 0a 20 20 2a 2a 20 65 6d 70 74 ght be. ** empt
61e0: 79 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 49 6e 66 y.. */. pOrInf
61f0: 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 3d 20 69 o->indexable = i
6200: 6e 64 65 78 61 62 6c 65 3b 0a 20 20 70 54 65 72 ndexable;. pTer
6210: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 69 m->eOperator = i
6220: 6e 64 65 78 61 62 6c 65 3d 3d 30 20 3f 20 30 20 ndexable==0 ? 0
6230: 3a 20 57 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a 20 46 : WO_OR;.. /* F
6240: 6f 72 20 61 20 74 77 6f 2d 77 61 79 20 4f 52 2c or a two-way OR,
6250: 20 61 74 74 65 6d 70 74 20 74 6f 20 69 6d 70 6c attempt to impl
6260: 65 6d 65 6e 74 61 74 69 6f 6e 20 63 61 73 65 20 ementation case
6270: 32 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 6e 2.. */. if( in
6280: 64 65 78 61 62 6c 65 20 26 26 20 70 4f 72 57 63 dexable && pOrWc
6290: 2d 3e 6e 54 65 72 6d 3d 3d 32 20 29 7b 0a 20 20 ->nTerm==2 ){.
62a0: 20 20 69 6e 74 20 69 4f 6e 65 20 3d 20 30 3b 0a int iOne = 0;.
62b0: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 WhereTerm *p
62c0: 4f 6e 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 One;. while(
62d0: 28 70 4f 6e 65 20 3d 20 77 68 65 72 65 4e 74 68 (pOne = whereNth
62e0: 53 75 62 74 65 72 6d 28 26 70 4f 72 57 63 2d 3e Subterm(&pOrWc->
62f0: 61 5b 30 5d 2c 69 4f 6e 65 2b 2b 29 29 21 3d 30 a[0],iOne++))!=0
6300: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54 ){. int iT
6310: 77 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 57 68 wo = 0;. Wh
6320: 65 72 65 54 65 72 6d 20 2a 70 54 77 6f 3b 0a 20 ereTerm *pTwo;.
6330: 20 20 20 20 20 77 68 69 6c 65 28 20 28 70 54 77 while( (pTw
6340: 6f 20 3d 20 77 68 65 72 65 4e 74 68 53 75 62 74 o = whereNthSubt
6350: 65 72 6d 28 26 70 4f 72 57 63 2d 3e 61 5b 31 5d erm(&pOrWc->a[1]
6360: 2c 69 54 77 6f 2b 2b 29 29 21 3d 30 20 29 7b 0a ,iTwo++))!=0 ){.
6370: 20 20 20 20 20 20 20 20 77 68 65 72 65 43 6f 6d whereCom
6380: 62 69 6e 65 44 69 73 6a 75 6e 63 74 73 28 70 53 bineDisjuncts(pS
6390: 72 63 2c 20 70 57 43 2c 20 70 4f 6e 65 2c 20 70 rc, pWC, pOne, p
63a0: 54 77 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 Two);. }.
63b0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 }. }.. /*.
63c0: 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 68 6f 6c 64 ** chngToIN hold
63d0: 73 20 61 20 73 65 74 20 6f 66 20 74 61 62 6c 65 s a set of table
63e0: 73 20 74 68 61 74 20 2a 6d 69 67 68 74 2a 20 73 s that *might* s
63f0: 61 74 69 73 66 79 20 63 61 73 65 20 31 2e 20 20 atisfy case 1.
6400: 42 75 74 0a 20 20 2a 2a 20 77 65 20 68 61 76 65 But. ** we have
6410: 20 74 6f 20 64 6f 20 73 6f 6d 65 20 61 64 64 69 to do some addi
6420: 74 69 6f 6e 61 6c 20 63 68 65 63 6b 69 6e 67 20 tional checking
6430: 74 6f 20 73 65 65 20 69 66 20 63 61 73 65 20 31 to see if case 1
6440: 20 72 65 61 6c 6c 79 0a 20 20 2a 2a 20 69 73 20 really. ** is
6450: 73 61 74 69 73 66 69 65 64 2e 0a 20 20 2a 2a 0a satisfied.. **.
6460: 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 77 69 ** chngToIN wi
6470: 6c 6c 20 68 6f 6c 64 20 65 69 74 68 65 72 20 30 ll hold either 0
6480: 2c 20 31 2c 20 6f 72 20 32 20 62 69 74 73 2e 20 , 1, or 2 bits.
6490: 20 54 68 65 20 30 2d 62 69 74 20 63 61 73 65 20 The 0-bit case
64a0: 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 means. ** that
64b0: 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 73 73 there is no poss
64c0: 69 62 69 6c 69 74 79 20 6f 66 20 74 72 61 6e 73 ibility of trans
64d0: 66 6f 72 6d 69 6e 67 20 74 68 65 20 4f 52 20 63 forming the OR c
64e0: 6c 61 75 73 65 20 69 6e 74 6f 20 61 6e 0a 20 20 lause into an.
64f0: 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 62 ** IN operator b
6500: 65 63 61 75 73 65 20 6f 6e 65 20 6f 72 20 6d 6f ecause one or mo
6510: 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 re terms in the
6520: 4f 52 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 OR clause contai
6530: 6e 0a 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 n. ** something
6540: 20 6f 74 68 65 72 20 74 68 61 6e 20 3d 3d 20 6f other than == o
6550: 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 n a column in th
6560: 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20 e single table.
6570: 20 54 68 65 20 31 2d 62 69 74 0a 20 20 2a 2a 20 The 1-bit. **
6580: 63 61 73 65 20 6d 65 61 6e 73 20 74 68 61 74 20 case means that
6590: 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68 every term of th
65a0: 65 20 4f 52 20 63 6c 61 75 73 65 20 69 73 20 6f e OR clause is o
65b0: 66 20 74 68 65 20 66 6f 72 6d 0a 20 20 2a 2a 20 f the form. **
65c0: 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 3d 65 78 "table.column=ex
65d0: 70 72 22 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e pr" for some sin
65e0: 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 gle table. The
65f0: 6f 6e 65 20 62 69 74 20 74 68 61 74 20 69 73 20 one bit that is
6600: 73 65 74 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 6f set. ** will co
6610: 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 rrespond to the
6620: 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 2e 20 20 57 common table. W
6630: 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 e still need to
6640: 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 0a 20 20 check to make.
6650: 2a 2a 20 73 75 72 65 20 74 68 65 20 73 61 6d 65 ** sure the same
6660: 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 column is used
6670: 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 2e 20 20 54 on all terms. T
6680: 68 65 20 32 2d 62 69 74 20 63 61 73 65 20 69 73 he 2-bit case is
6690: 20 77 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 61 when. ** the a
66a0: 6c 6c 20 74 65 72 6d 73 20 61 72 65 20 6f 66 20 ll terms are of
66b0: 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 31 the form "table1
66c0: 2e 63 6f 6c 75 6d 6e 3d 74 61 62 6c 65 32 2e 63 .column=table2.c
66d0: 6f 6c 75 6d 6e 22 2e 20 20 49 74 0a 20 20 2a 2a olumn". It. **
66e0: 20 6d 69 67 68 74 20 62 65 20 70 6f 73 73 69 62 might be possib
66f0: 6c 65 20 74 6f 20 66 6f 72 6d 20 61 6e 20 49 4e le to form an IN
6700: 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 65 operator with e
6710: 69 74 68 65 72 20 74 61 62 6c 65 31 2e 63 6f 6c ither table1.col
6720: 75 6d 6e 0a 20 20 2a 2a 20 6f 72 20 74 61 62 6c umn. ** or tabl
6730: 65 32 2e 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 e2.column as the
6740: 20 4c 48 53 20 69 66 20 65 69 74 68 65 72 20 69 LHS if either i
6750: 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 s common to ever
6760: 79 20 74 65 72 6d 20 6f 66 0a 20 20 2a 2a 20 74 y term of. ** t
6770: 68 65 20 4f 52 20 63 6c 61 75 73 65 2e 0a 20 20 he OR clause..
6780: 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 **. ** Note tha
6790: 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 t terms of the f
67a0: 6f 72 6d 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d orm "table.colum
67b0: 6e 31 3d 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 32 n1=table.column2
67c0: 22 20 28 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 " (the. ** same
67d0: 20 74 61 62 6c 65 20 6f 6e 20 62 6f 74 68 20 73 table on both s
67e0: 69 7a 65 73 20 6f 66 20 74 68 65 20 3d 3d 29 20 izes of the ==)
67f0: 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69 cannot be optimi
6800: 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 zed.. */. if(
6810: 63 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 chngToIN ){.
6820: 69 6e 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e int okToChngToIN
6830: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 = 0; /* Tru
6840: 65 20 69 66 20 74 68 65 20 63 6f 6e 76 65 72 73 e if the convers
6850: 69 6f 6e 20 74 6f 20 49 4e 20 69 73 20 76 61 6c ion to IN is val
6860: 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 id */. int iC
6870: 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20 20 20 20 olumn = -1;
6880: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e /* Column in
6890: 64 65 78 20 6f 6e 20 6c 68 73 20 6f 66 20 49 4e dex on lhs of IN
68a0: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 operator */.
68b0: 20 69 6e 74 20 69 43 75 72 73 6f 72 20 3d 20 2d int iCursor = -
68c0: 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 1; /* Ta
68d0: 62 6c 65 20 63 75 72 73 6f 72 20 63 6f 6d 6d 6f ble cursor commo
68e0: 6e 20 74 6f 20 61 6c 6c 20 74 65 72 6d 73 20 2a n to all terms *
68f0: 2f 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 30 3b /. int j = 0;
6900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6910: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 /* Loop counter
6920: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 */.. /* Searc
6930: 68 20 66 6f 72 20 61 20 74 61 62 6c 65 20 61 6e h for a table an
6940: 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 61 70 d column that ap
6950: 70 65 61 72 73 20 6f 6e 20 6f 6e 65 20 73 69 64 pears on one sid
6960: 65 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 e or the. **
6970: 6f 74 68 65 72 20 6f 66 20 74 68 65 20 3d 3d 20 other of the ==
6980: 6f 70 65 72 61 74 6f 72 20 69 6e 20 65 76 65 72 operator in ever
6990: 79 20 73 75 62 74 65 72 6d 2e 20 20 54 68 61 74 y subterm. That
69a0: 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d table and colum
69b0: 6e 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 n. ** will be
69c0: 20 72 65 63 6f 72 64 65 64 20 69 6e 20 69 43 75 recorded in iCu
69d0: 72 73 6f 72 20 61 6e 64 20 69 43 6f 6c 75 6d 6e rsor and iColumn
69e0: 2e 20 20 54 68 65 72 65 20 6d 69 67 68 74 20 6e . There might n
69f0: 6f 74 20 62 65 20 61 6e 79 0a 20 20 20 20 2a 2a ot be any. **
6a00: 20 73 75 63 68 20 74 61 62 6c 65 20 61 6e 64 20 such table and
6a10: 63 6f 6c 75 6d 6e 2e 20 20 53 65 74 20 6f 6b 54 column. Set okT
6a20: 6f 43 68 6e 67 54 6f 49 4e 20 69 66 20 61 6e 20 oChngToIN if an
6a30: 61 70 70 72 6f 70 72 69 61 74 65 20 74 61 62 6c appropriate tabl
6a40: 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f 6c e. ** and col
6a50: 75 6d 6e 20 69 73 20 66 6f 75 6e 64 20 62 75 74 umn is found but
6a60: 20 6c 65 61 76 65 20 6f 6b 54 6f 43 68 6e 67 54 leave okToChngT
6a70: 6f 49 4e 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 oIN false if not
6a80: 20 66 6f 75 6e 64 2e 0a 20 20 20 20 2a 2f 0a 20 found.. */.
6a90: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 32 20 for(j=0; j<2
6aa0: 26 26 20 21 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e && !okToChngToIN
6ab0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4f ; j++){. pO
6ac0: 72 54 65 72 6d 20 3d 20 70 4f 72 57 63 2d 3e 61 rTerm = pOrWc->a
6ad0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4f ;. for(i=pO
6ae0: 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e rWc->nTerm-1; i>
6af0: 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d =0; i--, pOrTerm
6b00: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 ++){. ass
6b10: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f ert( pOrTerm->eO
6b20: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 perator & WO_EQ
6b30: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 );. pOrTe
6b40: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e rm->wtFlags &= ~
6b50: 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 TERM_OR_OK;.
6b60: 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d if( pOrTerm-
6b70: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 >leftCursor==iCu
6b80: 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 rsor ){.
6b90: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 /* This is the
6ba0: 20 32 2d 62 69 74 20 63 61 73 65 20 61 6e 64 20 2-bit case and
6bb0: 77 65 20 61 72 65 20 6f 6e 20 74 68 65 20 73 65 we are on the se
6bc0: 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 61 cond iteration a
6bd0: 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 nd. **
6be0: 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73 20 current term is
6bf0: 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20 69 from the first i
6c00: 74 65 72 61 74 69 6f 6e 2e 20 20 53 6f 20 73 6b teration. So sk
6c10: 69 70 20 74 68 69 73 20 74 65 72 6d 2e 20 2a 2f ip this term. */
6c20: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 . asser
6c30: 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 t( j==1 );.
6c40: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 continue;.
6c50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
6c60: 20 69 66 28 20 28 63 68 6e 67 54 6f 49 4e 20 26 if( (chngToIN &
6c70: 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65 74 sqlite3WhereGet
6c80: 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d Mask(&pWInfo->sM
6c90: 61 73 6b 53 65 74 2c 0a 20 20 20 20 20 20 20 20 askSet,.
6ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6cc0: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 pOrTerm->lef
6cd0: 74 43 75 72 73 6f 72 29 29 3d 3d 30 20 29 7b 0a tCursor))==0 ){.
6ce0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 /* Thi
6cf0: 73 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20 6f s term must be o
6d00: 66 20 74 68 65 20 66 6f 72 6d 20 74 31 2e 61 3d f the form t1.a=
6d10: 3d 74 32 2e 62 20 77 68 65 72 65 20 74 32 20 69 =t2.b where t2 i
6d20: 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 s in the.
6d30: 20 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 73 ** chngToIN s
6d40: 65 74 20 62 75 74 20 74 31 20 69 73 20 6e 6f 74 et but t1 is not
6d50: 2e 20 20 54 68 69 73 20 74 65 72 6d 20 77 69 6c . This term wil
6d60: 6c 20 62 65 20 65 69 74 68 65 72 20 70 72 65 63 l be either prec
6d70: 65 64 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a eded. *
6d80: 2a 20 6f 72 20 66 6f 6c 6c 77 65 64 20 62 79 20 * or follwed by
6d90: 61 6e 20 69 6e 76 65 72 74 65 64 20 63 6f 70 79 an inverted copy
6da0: 20 28 74 32 2e 62 3d 3d 74 31 2e 61 29 2e 20 20 (t2.b==t1.a).
6db0: 53 6b 69 70 20 74 68 69 73 20 74 65 72 6d 20 0a Skip this term .
6dc0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 ** and
6dd0: 20 75 73 65 20 69 74 73 20 69 6e 76 65 72 73 69 use its inversi
6de0: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 on. */.
6df0: 20 74 65 73 74 63 61 73 65 28 20 70 4f 72 54 65 testcase( pOrTe
6e00: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 rm->wtFlags & TE
6e10: 52 4d 5f 43 4f 50 49 45 44 20 29 3b 0a 20 20 20 RM_COPIED );.
6e20: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 testcase(
6e30: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 pOrTerm->wtFlag
6e40: 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c s & TERM_VIRTUAL
6e50: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 );. as
6e60: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 77 sert( pOrTerm->w
6e70: 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 43 tFlags & (TERM_C
6e80: 4f 50 49 45 44 7c 54 45 52 4d 5f 56 49 52 54 55 OPIED|TERM_VIRTU
6e90: 41 4c 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 AL) );.
6ea0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 continue;.
6eb0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 43 6f }. iCo
6ec0: 6c 75 6d 6e 20 3d 20 70 4f 72 54 65 72 6d 2d 3e lumn = pOrTerm->
6ed0: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 u.leftColumn;.
6ee0: 20 20 20 20 20 20 69 43 75 72 73 6f 72 20 3d 20 iCursor =
6ef0: 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 pOrTerm->leftCur
6f00: 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65 sor;. bre
6f10: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 ak;. }.
6f20: 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 if( i<0 ){.
6f30: 20 20 20 20 20 2f 2a 20 4e 6f 20 63 61 6e 64 69 /* No candi
6f40: 64 61 74 65 20 74 61 62 6c 65 2b 63 6f 6c 75 6d date table+colum
6f50: 6e 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 54 68 n was found. Th
6f60: 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 is can only occu
6f70: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 r. ** on
6f80: 74 68 65 20 73 65 63 6f 6e 64 20 69 74 65 72 61 the second itera
6f90: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 tion */.
6fa0: 61 73 73 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a assert( j==1 );.
6fb0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 assert(
6fc0: 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 63 68 6e IsPowerOfTwo(chn
6fd0: 67 54 6f 49 4e 29 20 29 3b 0a 20 20 20 20 20 20 gToIN) );.
6fe0: 20 20 61 73 73 65 72 74 28 20 63 68 6e 67 54 6f assert( chngTo
6ff0: 49 4e 3d 3d 73 71 6c 69 74 65 33 57 68 65 72 65 IN==sqlite3Where
7000: 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d GetMask(&pWInfo-
7010: 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 73 >sMaskSet, iCurs
7020: 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 62 or) );. b
7030: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 reak;. }.
7040: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d testcase( j=
7050: 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 =1 );.. /*
7060: 57 65 20 68 61 76 65 20 66 6f 75 6e 64 20 61 20 We have found a
7070: 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65 20 candidate table
7080: 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 43 68 65 and column. Che
7090: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 61 ck to see if tha
70a0: 74 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 t. ** table
70b0: 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73 20 63 and column is c
70c0: 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 ommon to every t
70d0: 65 72 6d 20 69 6e 20 74 68 65 20 4f 52 20 63 6c erm in the OR cl
70e0: 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 6f 6b ause */. ok
70f0: 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 31 3b 0a ToChngToIN = 1;.
7100: 20 20 20 20 20 20 66 6f 72 28 3b 20 69 3e 3d 30 for(; i>=0
7110: 20 26 26 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e && okToChngToIN
7120: 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b ; i--, pOrTerm++
7130: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 ){. asser
7140: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 t( pOrTerm->eOpe
7150: 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b rator & WO_EQ );
7160: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 . if( pOr
7170: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 Term->leftCursor
7180: 21 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 !=iCursor ){.
7190: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e pOrTerm->
71a0: 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d wtFlags &= ~TERM
71b0: 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 _OR_OK;.
71c0: 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 }else if( pOrTer
71d0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 21 m->u.leftColumn!
71e0: 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 =iColumn ){.
71f0: 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f okToChngTo
7200: 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 IN = 0;.
7210: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 }else{.
7220: 20 69 6e 74 20 61 66 66 4c 65 66 74 2c 20 61 66 int affLeft, af
7230: 66 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 fRight;.
7240: 20 20 2f 2a 20 49 66 20 74 68 65 20 72 69 67 68 /* If the righ
7250: 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 t-hand side is a
7260: 6c 73 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 lso a column, th
7270: 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 69 65 en the affinitie
7280: 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f s. ** o
7290: 66 20 62 6f 74 68 20 72 69 67 68 74 20 61 6e 64 f both right and
72a0: 20 6c 65 66 74 20 73 69 64 65 73 20 6d 75 73 74 left sides must
72b0: 20 62 65 20 73 75 63 68 20 74 68 61 74 20 6e 6f be such that no
72c0: 20 74 79 70 65 0a 20 20 20 20 20 20 20 20 20 20 type.
72d0: 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61 ** conversions a
72e0: 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e 20 74 re required on t
72f0: 68 65 20 72 69 67 68 74 2e 20 20 28 54 69 63 6b he right. (Tick
7300: 65 74 20 23 32 32 34 39 29 0a 20 20 20 20 20 20 et #2249).
7310: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 */.
7320: 20 61 66 66 52 69 67 68 74 20 3d 20 73 71 6c 69 affRight = sqli
7330: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 te3ExprAffinity(
7340: 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e pOrTerm->pExpr->
7350: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 pRight);.
7360: 20 20 20 61 66 66 4c 65 66 74 20 3d 20 73 71 6c affLeft = sql
7370: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 ite3ExprAffinity
7380: 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d (pOrTerm->pExpr-
7390: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 >pLeft);.
73a0: 20 20 20 69 66 28 20 61 66 66 52 69 67 68 74 21 if( affRight!
73b0: 3d 30 20 26 26 20 61 66 66 52 69 67 68 74 21 3d =0 && affRight!=
73c0: 61 66 66 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 affLeft ){.
73d0: 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 okToChngT
73e0: 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 oIN = 0;.
73f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
7400: 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 pOrTerm->w
7410: 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f tFlags |= TERM_O
7420: 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 R_OK;.
7430: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 }. }.
7440: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f }. }.. /
7450: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c * At this point,
7460: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69 73 okToChngToIN is
7470: 20 74 72 75 65 20 69 66 20 6f 72 69 67 69 6e 61 true if origina
7480: 6c 20 70 54 65 72 6d 20 73 61 74 69 73 66 69 65 l pTerm satisfie
7490: 73 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 31 2e s. ** case 1.
74a0: 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 In that case,
74b0: 63 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 construct a new
74c0: 76 69 72 74 75 61 6c 20 74 65 72 6d 20 74 68 61 virtual term tha
74d0: 74 20 69 73 20 0a 20 20 20 20 2a 2a 20 70 54 65 t is . ** pTe
74e0: 72 6d 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 rm converted int
74f0: 6f 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 o an IN operator
7500: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 .. */. if(
7510: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 29 7b okToChngToIN ){
7520: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44 75 . Expr *pDu
7530: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a p; /*
7540: 20 41 20 74 72 61 6e 73 69 65 6e 74 20 64 75 70 A transient dup
7550: 6c 69 63 61 74 65 20 65 78 70 72 65 73 73 69 6f licate expressio
7560: 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c n */. ExprL
7570: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b 20 ist *pList = 0;
7580: 20 20 2f 2a 20 54 68 65 20 52 48 53 20 6f 66 20 /* The RHS of
7590: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 the IN operator
75a0: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 */. Expr *p
75b0: 4c 65 66 74 20 3d 20 30 3b 20 20 20 20 20 20 20 Left = 0;
75c0: 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66 20 74 68 /* The LHS of th
75d0: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f e IN operator */
75e0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 . Expr *pNe
75f0: 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a w; /*
7600: 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 49 4e The complete IN
7610: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 operator */..
7620: 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d for(i=pOrWc-
7630: 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 >nTerm-1, pOrTer
7640: 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 m=pOrWc->a; i>=0
7650: 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b ; i--, pOrTerm++
7660: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 ){. if( (
7670: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 pOrTerm->wtFlags
7680: 20 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d & TERM_OR_OK)==
7690: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 0 ) continue;.
76a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f assert( pO
76b0: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 rTerm->eOperator
76c0: 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 & WO_EQ );.
76d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 assert( pOrT
76e0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d erm->leftCursor=
76f0: 3d 69 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 =iCursor );.
7700: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 assert( pOrT
7710: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d erm->u.leftColum
7720: 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 n==iColumn );.
7730: 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c pDup = sql
7740: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 ite3ExprDup(db,
7750: 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e pOrTerm->pExpr->
7760: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 pRight, 0);.
7770: 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 pList = sqli
7780: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e te3ExprListAppen
7790: 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 d(pWInfo->pParse
77a0: 2c 20 70 4c 69 73 74 2c 20 70 44 75 70 29 3b 0a , pList, pDup);.
77b0: 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 pLeft =
77c0: 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e pOrTerm->pExpr->
77d0: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d 0a 20 pLeft;. }.
77e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 assert( pLe
77f0: 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 ft!=0 );. p
7800: 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 Dup = sqlite3Exp
7810: 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 rDup(db, pLeft,
7820: 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 0);. pNew =
7830: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 sqlite3PExpr(pP
7840: 61 72 73 65 2c 20 54 4b 5f 49 4e 2c 20 70 44 75 arse, TK_IN, pDu
7850: 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 p, 0);. if(
7860: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 pNew ){.
7870: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 int idxNew;.
7880: 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 transferJoi
7890: 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20 nMarkings(pNew,
78a0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 pExpr);.
78b0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 assert( !ExprHas
78c0: 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 Property(pNew, E
78d0: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a P_xIsSelect) );.
78e0: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e pNew->x.
78f0: 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 pList = pList;.
7900: 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 idxNew =
7910: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 whereClauseInser
7920: 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45 52 t(pWC, pNew, TER
7930: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 M_VIRTUAL|TERM_D
7940: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 YNAMIC);.
7950: 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 testcase( idxNe
7960: 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 w==0 );.
7970: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 exprAnalyze(pSrc
7980: 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a , pWC, idxNew);.
7990: 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 pTerm =
79a0: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d &pWC->a[idxTerm]
79b0: 3b 0a 20 20 20 20 20 20 20 20 6d 61 72 6b 54 65 ;. markTe
79c0: 72 6d 41 73 43 68 69 6c 64 28 70 57 43 2c 20 69 rmAsChild(pWC, i
79d0: 64 78 4e 65 77 2c 20 69 64 78 54 65 72 6d 29 3b dxNew, idxTerm);
79e0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 . }else{.
79f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 sqlite3Exp
7a00: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 rListDelete(db,
7a10: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a pList);. }.
7a20: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 pTerm->eOp
7a30: 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4e 4f 4f 50 erator = WO_NOOP
7a40: 3b 20 20 2f 2a 20 63 61 73 65 20 31 20 74 72 75 ; /* case 1 tru
7a50: 6d 70 73 20 63 61 73 65 20 33 20 2a 2f 0a 20 20 mps case 3 */.
7a60: 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 }. }.}.#endif
7a70: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 /* !SQLITE_OMIT
7a80: 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e _OR_OPTIMIZATION
7a90: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 && !SQLITE_OMIT
7aa0: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a _SUBQUERY */../*
7ab0: 0a 2a 2a 20 57 65 20 61 6c 72 65 61 64 79 20 6b .** We already k
7ac0: 6e 6f 77 20 74 68 61 74 20 70 45 78 70 72 20 69 now that pExpr i
7ad0: 73 20 61 20 62 69 6e 61 72 79 20 6f 70 65 72 61 s a binary opera
7ae0: 74 6f 72 20 77 68 65 72 65 20 62 6f 74 68 20 6f tor where both o
7af0: 70 65 72 61 6e 64 73 20 61 72 65 0a 2a 2a 20 63 perands are.** c
7b00: 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 73 olumn references
7b10: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 . This routine
7b20: 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 checks to see if
7b30: 20 70 45 78 70 72 20 69 73 20 61 6e 20 65 71 75 pExpr is an equ
7b40: 69 76 61 6c 65 6e 63 65 0a 2a 2a 20 72 65 6c 61 ivalence.** rela
7b50: 74 69 6f 6e 3a 0a 2a 2a 20 20 20 31 2e 20 20 54 tion:.** 1. T
7b60: 68 65 20 53 51 4c 49 54 45 5f 54 72 61 6e 73 69 he SQLITE_Transi
7b70: 74 69 76 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f tive optimizatio
7b80: 6e 20 6d 75 73 74 20 62 65 20 65 6e 61 62 6c 65 n must be enable
7b90: 64 0a 2a 2a 20 20 20 32 2e 20 20 4d 75 73 74 20 d.** 2. Must
7ba0: 62 65 20 65 69 74 68 65 72 20 61 6e 20 3d 3d 20 be either an ==
7bb0: 6f 72 20 61 6e 20 49 53 20 6f 70 65 72 61 74 6f or an IS operato
7bc0: 72 0a 2a 2a 20 20 20 33 2e 20 20 4e 6f 74 20 6f r.** 3. Not o
7bd0: 72 69 67 69 6e 61 74 69 6e 67 20 69 6e 20 74 68 riginating in th
7be0: 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 e ON clause of a
7bf0: 6e 20 4f 55 54 45 52 20 4a 4f 49 4e 0a 2a 2a 20 n OUTER JOIN.**
7c00: 20 20 34 2e 20 20 54 68 65 20 61 66 66 69 6e 69 4. The affini
7c10: 74 69 65 73 20 6f 66 20 41 20 61 6e 64 20 42 20 ties of A and B
7c20: 6d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 must be compatib
7c30: 6c 65 0a 2a 2a 20 20 20 35 61 2e 20 42 6f 74 68 le.** 5a. Both
7c40: 20 6f 70 65 72 61 6e 64 73 20 75 73 65 20 74 68 operands use th
7c50: 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 e same collating
7c60: 20 73 65 71 75 65 6e 63 65 20 4f 52 0a 2a 2a 20 sequence OR.**
7c70: 20 20 35 62 2e 20 54 68 65 20 6f 76 65 72 61 6c 5b. The overal
7c80: 6c 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 l collating sequ
7c90: 65 6e 63 65 20 69 73 20 42 49 4e 41 52 59 0a 2a ence is BINARY.*
7ca0: 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e * If this routin
7cb0: 65 20 72 65 74 75 72 6e 73 20 54 52 55 45 2c 20 e returns TRUE,
7cc0: 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 that means that
7cd0: 74 68 65 20 52 48 53 20 63 61 6e 20 62 65 20 73 the RHS can be s
7ce0: 75 62 73 74 69 74 75 74 65 64 0a 2a 2a 20 66 6f ubstituted.** fo
7cf0: 72 20 74 68 65 20 4c 48 53 20 61 6e 79 70 6c 61 r the LHS anypla
7d00: 63 65 20 65 6c 73 65 20 69 6e 20 74 68 65 20 57 ce else in the W
7d10: 48 45 52 45 20 63 6c 61 75 73 65 20 77 68 65 72 HERE clause wher
7d20: 65 20 74 68 65 20 4c 48 53 20 63 6f 6c 75 6d 6e e the LHS column
7d30: 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 54 68 69 73 occurs..** This
7d40: 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 is an optimizat
7d50: 69 6f 6e 2e 20 20 4e 6f 20 68 61 72 6d 20 63 6f ion. No harm co
7d60: 6d 65 73 20 66 72 6f 6d 20 72 65 74 75 72 6e 69 mes from returni
7d70: 6e 67 20 30 2e 20 20 42 75 74 20 69 66 20 31 20 ng 0. But if 1
7d80: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 is.** returned w
7d90: 68 65 6e 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f hen it should no
7da0: 74 20 62 65 2c 20 74 68 65 6e 20 69 6e 63 6f 72 t be, then incor
7db0: 72 65 63 74 20 61 6e 73 77 65 72 73 20 6d 69 67 rect answers mig
7dc0: 68 74 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 ht result..*/.st
7dd0: 61 74 69 63 20 69 6e 74 20 74 65 72 6d 49 73 45 atic int termIsE
7de0: 71 75 69 76 61 6c 65 6e 63 65 28 50 61 72 73 65 quivalence(Parse
7df0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a *pParse, Expr *
7e00: 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20 61 pExpr){. char a
7e10: 66 66 31 2c 20 61 66 66 32 3b 0a 20 20 43 6f 6c ff1, aff2;. Col
7e20: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 lSeq *pColl;. i
7e30: 66 28 20 21 4f 70 74 69 6d 69 7a 61 74 69 6f 6e f( !Optimization
7e40: 45 6e 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e Enabled(pParse->
7e50: 64 62 2c 20 53 51 4c 49 54 45 5f 54 72 61 6e 73 db, SQLITE_Trans
7e60: 69 74 69 76 65 29 20 29 20 72 65 74 75 72 6e 20 itive) ) return
7e70: 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 0;. if( pExpr->
7e80: 6f 70 21 3d 54 4b 5f 45 51 20 26 26 20 70 45 78 op!=TK_EQ && pEx
7e90: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 20 29 20 pr->op!=TK_IS )
7ea0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 return 0;. if(
7eb0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 ExprHasProperty(
7ec0: 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f pExpr, EP_FromJo
7ed0: 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a in) ) return 0;.
7ee0: 20 20 61 66 66 31 20 3d 20 73 71 6c 69 74 65 33 aff1 = sqlite3
7ef0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 ExprAffinity(pEx
7f00: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 61 66 pr->pLeft);. af
7f10: 66 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 f2 = sqlite3Expr
7f20: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e Affinity(pExpr->
7f30: 70 52 69 67 68 74 29 3b 0a 20 20 69 66 28 20 61 pRight);. if( a
7f40: 66 66 31 21 3d 61 66 66 32 0a 20 20 20 26 26 20 ff1!=aff2. &&
7f50: 28 21 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 (!sqlite3IsNumer
7f60: 69 63 41 66 66 69 6e 69 74 79 28 61 66 66 31 29 icAffinity(aff1)
7f70: 20 7c 7c 20 21 73 71 6c 69 74 65 33 49 73 4e 75 || !sqlite3IsNu
7f80: 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 61 66 mericAffinity(af
7f90: 66 32 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 f2)). ){. re
7fa0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 43 turn 0;. }. pC
7fb0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e oll = sqlite3Bin
7fc0: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 aryCompareCollSe
7fd0: 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d q(pParse, pExpr-
7fe0: 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 >pLeft, pExpr->p
7ff0: 52 69 67 68 74 29 3b 0a 20 20 69 66 28 20 70 43 Right);. if( pC
8000: 6f 6c 6c 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 oll==0 || sqlite
8010: 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 3StrICmp(pColl->
8020: 7a 4e 61 6d 65 2c 20 22 42 49 4e 41 52 59 22 29 zName, "BINARY")
8030: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a ==0 ) return 1;.
8040: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 return sqlite3
8050: 45 78 70 72 43 6f 6c 6c 53 65 71 4d 61 74 63 68 ExprCollSeqMatch
8060: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e (pParse, pExpr->
8070: 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 pLeft, pExpr->pR
8080: 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 ight);.}../*.**
8090: 52 65 63 75 72 73 69 76 65 6c 79 20 77 61 6c 6b Recursively walk
80a0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 the expressions
80b0: 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 of a SELECT sta
80c0: 74 65 6d 65 6e 74 20 61 6e 64 20 67 65 6e 65 72 tement and gener
80d0: 61 74 65 0a 2a 2a 20 61 20 62 69 74 6d 61 73 6b ate.** a bitmask
80e0: 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 69 63 indicating whic
80f0: 68 20 74 61 62 6c 65 73 20 61 72 65 20 75 73 65 h tables are use
8100: 64 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73 d in that expres
8110: 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2f sion.** tree..*/
8120: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 .static Bitmask
8130: 65 78 70 72 53 65 6c 65 63 74 55 73 61 67 65 28 exprSelectUsage(
8140: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d WhereMaskSet *pM
8150: 61 73 6b 53 65 74 2c 20 53 65 6c 65 63 74 20 2a askSet, Select *
8160: 70 53 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d pS){. Bitmask m
8170: 61 73 6b 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 ask = 0;. while
8180: 28 20 70 53 20 29 7b 0a 20 20 20 20 53 72 63 4c ( pS ){. SrcL
8190: 69 73 74 20 2a 70 53 72 63 20 3d 20 70 53 2d 3e ist *pSrc = pS->
81a0: 70 53 72 63 3b 0a 20 20 20 20 6d 61 73 6b 20 7c pSrc;. mask |
81b0: 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 = sqlite3WhereEx
81c0: 70 72 4c 69 73 74 55 73 61 67 65 28 70 4d 61 73 prListUsage(pMas
81d0: 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73 74 kSet, pS->pEList
81e0: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 73 );. mask |= s
81f0: 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 4c qlite3WhereExprL
8200: 69 73 74 55 73 61 67 65 28 70 4d 61 73 6b 53 65 istUsage(pMaskSe
8210: 74 2c 20 70 53 2d 3e 70 47 72 6f 75 70 42 79 29 t, pS->pGroupBy)
8220: 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 73 71 ;. mask |= sq
8230: 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 4c 69 lite3WhereExprLi
8240: 73 74 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 stUsage(pMaskSet
8250: 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42 79 29 3b , pS->pOrderBy);
8260: 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 73 71 6c . mask |= sql
8270: 69 74 65 33 57 68 65 72 65 45 78 70 72 55 73 61 ite3WhereExprUsa
8280: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d ge(pMaskSet, pS-
8290: 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 6d 61 >pWhere);. ma
82a0: 73 6b 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 sk |= sqlite3Whe
82b0: 72 65 45 78 70 72 55 73 61 67 65 28 70 4d 61 73 reExprUsage(pMas
82c0: 6b 53 65 74 2c 20 70 53 2d 3e 70 48 61 76 69 6e kSet, pS->pHavin
82d0: 67 29 3b 0a 20 20 20 20 69 66 28 20 41 4c 57 41 g);. if( ALWA
82e0: 59 53 28 70 53 72 63 21 3d 30 29 20 29 7b 0a 20 YS(pSrc!=0) ){.
82f0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 int i;.
8300: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 for(i=0; i<pSr
8310: 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 c->nSrc; i++){.
8320: 20 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 mask |= e
8330: 78 70 72 53 65 6c 65 63 74 55 73 61 67 65 28 70 xprSelectUsage(p
8340: 4d 61 73 6b 53 65 74 2c 20 70 53 72 63 2d 3e 61 MaskSet, pSrc->a
8350: 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 [i].pSelect);.
8360: 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 73 71 mask |= sq
8370: 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 55 73 lite3WhereExprUs
8380: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 age(pMaskSet, pS
8390: 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b 0a 20 rc->a[i].pOn);.
83a0: 20 20 20 20 20 20 20 69 66 28 20 70 53 72 63 2d if( pSrc-
83b0: 3e 61 5b 69 5d 2e 66 67 2e 69 73 54 61 62 46 75 >a[i].fg.isTabFu
83c0: 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 nc ){.
83d0: 6d 61 73 6b 20 7c 3d 20 73 71 6c 69 74 65 33 57 mask |= sqlite3W
83e0: 68 65 72 65 45 78 70 72 4c 69 73 74 55 73 61 67 hereExprListUsag
83f0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 72 63 e(pMaskSet, pSrc
8400: 2d 3e 61 5b 69 5d 2e 75 31 2e 70 46 75 6e 63 41 ->a[i].u1.pFuncA
8410: 72 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 rg);. }.
8420: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 }. }.
8430: 20 70 53 20 3d 20 70 53 2d 3e 70 50 72 69 6f 72 pS = pS->pPrior
8440: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d ;. }. return m
8450: 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 ask;.}../*.** Ex
8460: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 pression pExpr i
8470: 73 20 6f 6e 65 20 6f 70 65 72 61 6e 64 20 6f 66 s one operand of
8480: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 a comparison op
8490: 65 72 61 74 6f 72 20 74 68 61 74 20 6d 69 67 68 erator that migh
84a0: 74 0a 2a 2a 20 62 65 20 75 73 65 66 75 6c 20 66 t.** be useful f
84b0: 6f 72 20 69 6e 64 65 78 69 6e 67 2e 20 20 54 68 or indexing. Th
84c0: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b is routine check
84d0: 73 20 74 6f 20 73 65 65 20 69 66 20 70 45 78 70 s to see if pExp
84e0: 72 20 61 70 70 65 61 72 73 0a 2a 2a 20 69 6e 20 r appears.** in
84f0: 61 6e 79 20 69 6e 64 65 78 2e 20 20 52 65 74 75 any index. Retu
8500: 72 6e 20 54 52 55 45 20 28 31 29 20 69 66 20 70 rn TRUE (1) if p
8510: 45 78 70 72 20 69 73 20 61 6e 20 69 6e 64 65 78 Expr is an index
8520: 65 64 20 74 65 72 6d 20 61 6e 64 20 72 65 74 75 ed term and retu
8530: 72 6e 0a 2a 2a 20 46 41 4c 53 45 20 28 30 29 20 rn.** FALSE (0)
8540: 69 66 20 6e 6f 74 2e 20 20 49 66 20 54 52 55 45 if not. If TRUE
8550: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 61 6c is returned, al
8560: 73 6f 20 73 65 74 20 61 69 43 75 72 43 6f 6c 5b so set aiCurCol[
8570: 30 5d 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72 0] to the cursor
8580: 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 .** number of th
8590: 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 e table that is
85a0: 69 6e 64 65 78 65 64 20 61 6e 64 20 61 69 43 75 indexed and aiCu
85b0: 72 43 6f 6c 5b 31 5d 20 74 6f 20 74 68 65 20 63 rCol[1] to the c
85c0: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 0a 2a 2a 20 olumn number.**
85d0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 68 of the column th
85e0: 61 74 20 69 73 20 69 6e 64 65 78 65 64 2c 20 6f at is indexed, o
85f0: 72 20 58 4e 5f 45 58 50 52 20 28 2d 32 29 20 69 r XN_EXPR (-2) i
8600: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 f an expression
8610: 69 73 20 62 65 69 6e 67 0a 2a 2a 20 69 6e 64 65 is being.** inde
8620: 78 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 xed..**.** If pE
8630: 78 70 72 20 69 73 20 61 20 54 4b 5f 43 4f 4c 55 xpr is a TK_COLU
8640: 4d 4e 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72 65 MN column refere
8650: 6e 63 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 nce, then this r
8660: 6f 75 74 69 6e 65 20 61 6c 77 61 79 73 20 72 65 outine always re
8670: 74 75 72 6e 73 0a 2a 2a 20 74 72 75 65 20 65 76 turns.** true ev
8680: 65 6e 20 69 66 20 74 68 61 74 20 70 61 72 74 69 en if that parti
8690: 63 75 6c 61 72 20 63 6f 6c 75 6d 6e 20 69 73 20 cular column is
86a0: 6e 6f 74 20 69 6e 64 65 78 65 64 2c 20 62 65 63 not indexed, bec
86b0: 61 75 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 0a ause the column.
86c0: 2a 2a 20 6d 69 67 68 74 20 62 65 20 61 64 64 65 ** might be adde
86d0: 64 20 74 6f 20 61 6e 20 61 75 74 6f 6d 61 74 69 d to an automati
86e0: 63 20 69 6e 64 65 78 20 6c 61 74 65 72 2e 0a 2a c index later..*
86f0: 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f /.static SQLITE_
8700: 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 65 78 70 NOINLINE int exp
8710: 72 4d 69 67 68 74 42 65 49 6e 64 65 78 65 64 32 rMightBeIndexed2
8720: 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 46 72 (. SrcList *pFr
8730: 6f 6d 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 om, /* Th
8740: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f e FROM clause */
8750: 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 72 . Bitmask mPrer
8760: 65 71 2c 20 20 20 20 20 20 20 2f 2a 20 42 69 74 eq, /* Bit
8770: 6d 61 73 6b 20 6f 66 20 46 52 4f 4d 20 63 6c 61 mask of FROM cla
8780: 75 73 65 20 74 65 72 6d 73 20 72 65 66 65 72 65 use terms refere
8790: 6e 63 65 64 20 62 79 20 70 45 78 70 72 20 2a 2f nced by pExpr */
87a0: 0a 20 20 69 6e 74 20 2a 61 69 43 75 72 43 6f 6c . int *aiCurCol
87b0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 , /* Wri
87c0: 74 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 te the reference
87d0: 64 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 61 d table cursor a
87e0: 6e 64 20 63 6f 6c 75 6d 6e 20 68 65 72 65 20 2a nd column here *
87f0: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 /. Expr *pExpr
8800: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e /* An
8810: 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 63 6f operand of a co
8820: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f mparison operato
8830: 72 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 r */.){. Index
8840: 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b 0a *pIdx;. int i;.
8850: 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 66 6f int iCur;. fo
8860: 72 28 69 3d 30 3b 20 6d 50 72 65 72 65 71 3e 31 r(i=0; mPrereq>1
8870: 3b 20 69 2b 2b 2c 20 6d 50 72 65 72 65 71 3e 3e ; i++, mPrereq>>
8880: 3d 31 29 7b 7d 0a 20 20 69 43 75 72 20 3d 20 70 =1){}. iCur = p
8890: 46 72 6f 6d 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 From->a[i].iCurs
88a0: 6f 72 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 or;. for(pIdx=p
88b0: 46 72 6f 6d 2d 3e 61 5b 69 5d 2e 70 54 61 62 2d From->a[i].pTab-
88c0: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 >pIndex; pIdx; p
88d0: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 Idx=pIdx->pNext)
88e0: 7b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e {. if( pIdx->
88f0: 61 43 6f 6c 45 78 70 72 3d 3d 30 20 29 20 63 6f aColExpr==0 ) co
8900: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 ntinue;. for(
8910: 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 4b 65 i=0; i<pIdx->nKe
8920: 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 yCol; i++){.
8930: 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f if( pIdx->aiCo
8940: 6c 75 6d 6e 5b 69 5d 21 3d 58 4e 5f 45 58 50 52 lumn[i]!=XN_EXPR
8950: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 ) continue;.
8960: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 if( sqlite3Ex
8970: 70 72 43 6f 6d 70 61 72 65 53 6b 69 70 28 70 45 prCompareSkip(pE
8980: 78 70 72 2c 20 70 49 64 78 2d 3e 61 43 6f 6c 45 xpr, pIdx->aColE
8990: 78 70 72 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c xpr->a[i].pExpr,
89a0: 20 69 43 75 72 29 3d 3d 30 20 29 7b 0a 20 20 20 iCur)==0 ){.
89b0: 20 20 20 20 20 61 69 43 75 72 43 6f 6c 5b 30 5d aiCurCol[0]
89c0: 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 20 20 20 = iCur;.
89d0: 20 61 69 43 75 72 43 6f 6c 5b 31 5d 20 3d 20 58 aiCurCol[1] = X
89e0: 4e 5f 45 58 50 52 3b 0a 20 20 20 20 20 20 20 20 N_EXPR;.
89f0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 return 1;.
8a00: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 }. }. }. re
8a10: 74 75 72 6e 20 30 3b 0a 7d 0a 73 74 61 74 69 63 turn 0;.}.static
8a20: 20 69 6e 74 20 65 78 70 72 4d 69 67 68 74 42 65 int exprMightBe
8a30: 49 6e 64 65 78 65 64 28 0a 20 20 53 72 63 4c 69 Indexed(. SrcLi
8a40: 73 74 20 2a 70 46 72 6f 6d 2c 20 20 20 20 20 20 st *pFrom,
8a50: 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c /* The FROM cl
8a60: 61 75 73 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 ause */. Bitmas
8a70: 6b 20 6d 50 72 65 72 65 71 2c 20 20 20 20 20 20 k mPrereq,
8a80: 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 46 /* Bitmask of F
8a90: 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73 ROM clause terms
8aa0: 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20 70 referenced by p
8ab0: 45 78 70 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 Expr */. int *a
8ac0: 69 43 75 72 43 6f 6c 2c 20 20 20 20 20 20 20 20 iCurCol,
8ad0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 /* Write the re
8ae0: 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 20 63 ferenced table c
8af0: 75 72 73 6f 72 20 26 20 63 6f 6c 75 6d 6e 20 68 ursor & column h
8b00: 65 72 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 ere */. Expr *p
8b10: 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 Expr,
8b20: 2f 2a 20 41 6e 20 6f 70 65 72 61 6e 64 20 6f 66 /* An operand of
8b30: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 a comparison op
8b40: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 erator */. int
8b50: 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 op
8b60: 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66 /* The specif
8b70: 69 63 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 ic comparison op
8b80: 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 2f erator */.){. /
8b90: 2a 20 49 66 20 74 68 69 73 20 65 78 70 72 65 73 * If this expres
8ba0: 73 69 6f 6e 20 69 73 20 61 20 76 65 63 74 6f 72 sion is a vector
8bb0: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 72 20 to the left or
8bc0: 72 69 67 68 74 20 6f 66 20 61 20 0a 20 20 2a 2a right of a . **
8bd0: 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 inequality cons
8be0: 74 72 61 69 6e 74 20 28 3e 2c 20 3c 2c 20 3e 3d traint (>, <, >=
8bf0: 20 6f 72 20 3c 3d 29 2c 20 70 65 72 66 6f 72 6d or <=), perform
8c00: 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 the processing
8c10: 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 66 69 72 . ** on the fir
8c20: 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 st element of th
8c30: 65 20 76 65 63 74 6f 72 2e 20 20 2a 2f 0a 20 20 e vector. */.
8c40: 61 73 73 65 72 74 28 20 54 4b 5f 47 54 2b 31 3d assert( TK_GT+1=
8c50: 3d 54 4b 5f 4c 45 20 26 26 20 54 4b 5f 47 54 2b =TK_LE && TK_GT+
8c60: 32 3d 3d 54 4b 5f 4c 54 20 26 26 20 54 4b 5f 47 2==TK_LT && TK_G
8c70: 54 2b 33 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 T+3==TK_GE );.
8c80: 61 73 73 65 72 74 28 20 54 4b 5f 49 53 3c 54 4b assert( TK_IS<TK
8c90: 5f 47 45 20 26 26 20 54 4b 5f 49 53 4e 55 4c 4c _GE && TK_ISNULL
8ca0: 3c 54 4b 5f 47 45 20 26 26 20 54 4b 5f 49 4e 3c <TK_GE && TK_IN<
8cb0: 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 TK_GE );. asser
8cc0: 74 28 20 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a t( op<=TK_GE );.
8cd0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d if( pExpr->op=
8ce0: 3d 54 4b 5f 56 45 43 54 4f 52 20 26 26 20 28 6f =TK_VECTOR && (o
8cf0: 70 3e 3d 54 4b 5f 47 54 20 26 26 20 41 4c 57 41 p>=TK_GT && ALWA
8d00: 59 53 28 6f 70 3c 3d 54 4b 5f 47 45 29 29 20 29 YS(op<=TK_GE)) )
8d10: 7b 0a 20 20 20 20 70 45 78 70 72 20 3d 20 70 45 {. pExpr = pE
8d20: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b xpr->x.pList->a[
8d30: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 7d 0a 0a 20 0].pExpr;. }..
8d40: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d if( pExpr->op==
8d50: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 TK_COLUMN ){.
8d60: 20 61 69 43 75 72 43 6f 6c 5b 30 5d 20 3d 20 70 aiCurCol[0] = p
8d70: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 Expr->iTable;.
8d80: 20 20 61 69 43 75 72 43 6f 6c 5b 31 5d 20 3d 20 aiCurCol[1] =
8d90: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a pExpr->iColumn;.
8da0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 return 1;.
8db0: 7d 0a 20 20 69 66 28 20 6d 50 72 65 72 65 71 3d }. if( mPrereq=
8dc0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 =0 ) return 0;
8dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
8de0: 2a 20 4e 6f 20 74 61 62 6c 65 20 72 65 66 65 72 * No table refer
8df0: 65 6e 63 65 73 20 2a 2f 0a 20 20 69 66 28 20 28 ences */. if( (
8e00: 6d 50 72 65 72 65 71 26 28 6d 50 72 65 72 65 71 mPrereq&(mPrereq
8e10: 2d 31 29 29 21 3d 30 20 29 20 72 65 74 75 72 6e -1))!=0 ) return
8e20: 20 30 3b 20 20 20 2f 2a 20 52 65 66 73 20 6d 6f 0; /* Refs mo
8e30: 72 65 20 74 68 61 6e 20 6f 6e 65 20 74 61 62 6c re than one tabl
8e40: 65 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 65 78 e */. return ex
8e50: 70 72 4d 69 67 68 74 42 65 49 6e 64 65 78 65 64 prMightBeIndexed
8e60: 32 28 70 46 72 6f 6d 2c 6d 50 72 65 72 65 71 2c 2(pFrom,mPrereq,
8e70: 61 69 43 75 72 43 6f 6c 2c 70 45 78 70 72 29 3b aiCurCol,pExpr);
8e80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e .}../*.** The in
8e90: 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74 put to this rout
8ea0: 69 6e 65 20 69 73 20 61 6e 20 57 68 65 72 65 54 ine is an WhereT
8eb0: 65 72 6d 20 73 74 72 75 63 74 75 72 65 20 77 69 erm structure wi
8ec0: 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22 th only the.** "
8ed0: 70 45 78 70 72 22 20 66 69 65 6c 64 20 66 69 6c pExpr" field fil
8ee0: 6c 65 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62 led in. The job
8ef0: 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 of this routine
8f00: 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 is to analyze t
8f10: 68 65 0a 2a 2a 20 73 75 62 65 78 70 72 65 73 73 he.** subexpress
8f20: 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 ion and populate
8f30: 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 66 all the other f
8f40: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 57 68 65 ields of the Whe
8f50: 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74 reTerm.** struct
8f60: 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 ure..**.** If th
8f70: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 e expression is
8f80: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 65 78 of the form "<ex
8f90: 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20 67 pr> <op> X" it g
8fa0: 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20 ets commuted.**
8fb0: 74 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 to the standard
8fc0: 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20 form of "X <op>
8fd0: 3c 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 <expr>"..**.** I
8fe0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e f the expression
8ff0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 is of the form
9000: 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 "X <op> Y" where
9010: 20 62 6f 74 68 20 58 20 61 6e 64 20 59 20 61 72 both X and Y ar
9020: 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 e.** columns, th
9030: 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 en the original
9040: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e expression is un
9050: 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 6e 65 changed and a ne
9060: 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 w virtual.** ter
9070: 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 59 m of the form "Y
9080: 20 3c 6f 70 3e 20 58 22 20 69 73 20 61 64 64 65 <op> X" is adde
9090: 64 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 d to the WHERE c
90a0: 6c 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61 lause and.** ana
90b0: 6c 79 7a 65 64 20 73 65 70 61 72 61 74 65 6c 79 lyzed separately
90c0: 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 . The original
90d0: 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 term is marked w
90e0: 69 74 68 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a ith TERM_COPIED.
90f0: 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20 74 ** and the new t
9100: 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69 erm is marked wi
9110: 74 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 th TERM_DYNAMIC
9120: 28 62 65 63 61 75 73 65 20 69 74 27 73 20 70 45 (because it's pE
9130: 78 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 xpr.** needs to
9140: 62 65 20 66 72 65 65 64 20 77 69 74 68 20 74 68 be freed with th
9150: 65 20 57 68 65 72 65 43 6c 61 75 73 65 29 20 61 e WhereClause) a
9160: 6e 64 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 nd TERM_VIRTUAL
9170: 28 62 65 63 61 75 73 65 20 69 74 0a 2a 2a 20 69 (because it.** i
9180: 73 20 61 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70 s a commuted cop
9190: 79 20 6f 66 20 61 20 70 72 69 6f 72 20 74 65 72 y of a prior ter
91a0: 6d 2e 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61 m.) The origina
91b0: 6c 20 74 65 72 6d 20 68 61 73 20 6e 43 68 69 6c l term has nChil
91c0: 64 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 d=1.** and the c
91d0: 6f 70 79 20 68 61 73 20 69 64 78 50 61 72 65 6e opy has idxParen
91e0: 74 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 t set to the ind
91f0: 65 78 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e ex of the origin
9200: 61 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 al term..*/.stat
9210: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c ic void exprAnal
9220: 79 7a 65 28 0a 20 20 53 72 63 4c 69 73 74 20 2a yze(. SrcList *
9230: 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 pSrc,
9240: 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 /* the FROM cla
9250: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c use */. WhereCl
9260: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 ause *pWC,
9270: 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 /* the WHERE
9280: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 clause */. int
9290: 69 64 78 54 65 72 6d 20 20 20 20 20 20 20 20 20 idxTerm
92a0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f /* Index o
92b0: 66 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 f the term to be
92c0: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a analyzed */.){.
92d0: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 WhereInfo *pWI
92e0: 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 nfo = pWC->pWInf
92f0: 6f 3b 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 o; /* WHERE clau
9300: 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f se processing co
9310: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 ntext */. Where
9320: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 Term *pTerm;
9330: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 /* T
9340: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e he term to be an
9350: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 alyzed */. Wher
9360: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 eMaskSet *pMaskS
9370: 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 et; /*
9380: 53 65 74 20 6f 66 20 74 61 62 6c 65 20 69 6e 64 Set of table ind
9390: 65 78 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 45 78 ex masks */. Ex
93a0: 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20 pr *pExpr;
93b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
93c0: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e * The expression
93d0: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 to be analyzed
93e0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 */. Bitmask pre
93f0: 72 65 71 4c 65 66 74 3b 20 20 20 20 20 20 20 20 reqLeft;
9400: 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75 /* Prerequ
9410: 65 73 69 74 65 73 20 6f 66 20 74 68 65 20 70 45 esites of the pE
9420: 78 70 72 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20 xpr->pLeft */.
9430: 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c Bitmask prereqAl
9440: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 l;
9450: 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74 65 /* Prerequesite
9460: 73 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20 s of pExpr */.
9470: 42 69 74 6d 61 73 6b 20 65 78 74 72 61 52 69 67 Bitmask extraRig
9480: 68 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 ht = 0;
9490: 20 2f 2a 20 45 78 74 72 61 20 64 65 70 65 6e 64 /* Extra depend
94a0: 65 6e 63 69 65 73 20 6f 6e 20 4c 45 46 54 20 4a encies on LEFT J
94b0: 4f 49 4e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 OIN */. Expr *p
94c0: 53 74 72 31 20 3d 20 30 3b 20 20 20 20 20 20 20 Str1 = 0;
94d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53 /* RHS
94e0: 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 of LIKE/GLOB op
94f0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 erator */. int
9500: 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20 isComplete = 0;
9510: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
9520: 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 RHS of LIKE/GLOB
9530: 20 65 6e 64 73 20 77 69 74 68 20 77 69 6c 64 63 ends with wildc
9540: 61 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 ard */. int noC
9550: 61 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 ase = 0;
9560: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 75 70 70 /* upp
9570: 65 72 63 61 73 65 20 65 71 75 69 76 61 6c 65 6e ercase equivalen
9580: 74 20 74 6f 20 6c 6f 77 65 72 63 61 73 65 20 2a t to lowercase *
9590: 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 /. int op;
95a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
95b0: 20 20 20 20 20 2f 2a 20 54 6f 70 2d 6c 65 76 65 /* Top-leve
95c0: 6c 20 6f 70 65 72 61 74 6f 72 2e 20 20 70 45 78 l operator. pEx
95d0: 70 72 2d 3e 6f 70 20 2a 2f 0a 20 20 50 61 72 73 pr->op */. Pars
95e0: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e e *pParse = pWIn
95f0: 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 2f 2a 20 fo->pParse; /*
9600: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 Parsing context
9610: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 */. sqlite3 *db
9620: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 = pParse->db;
9630: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 /* Databas
9640: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a e connection */.
9650: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 unsigned char
9660: 65 4f 70 32 20 3d 20 30 3b 20 20 20 20 20 20 20 eOp2 = 0;
9670: 20 20 20 2f 2a 20 6f 70 32 20 76 61 6c 75 65 20 /* op2 value
9680: 66 6f 72 20 4c 49 4b 45 2f 52 45 47 45 58 50 2f for LIKE/REGEXP/
9690: 47 4c 4f 42 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c GLOB */. int nL
96a0: 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 eft;
96b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 /* Nu
96c0: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 mber of elements
96d0: 20 6f 6e 20 6c 65 66 74 20 73 69 64 65 20 76 65 on left side ve
96e0: 63 74 6f 72 20 2a 2f 0a 0a 20 20 69 66 28 20 64 ctor */.. if( d
96f0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 b->mallocFailed
9700: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 ){. return;.
9710: 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57 }. pTerm = &pW
9720: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 C->a[idxTerm];.
9730: 20 70 4d 61 73 6b 53 65 74 20 3d 20 26 70 57 49 pMaskSet = &pWI
9740: 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20 nfo->sMaskSet;.
9750: 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e pExpr = pTerm->
9760: 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 pExpr;. assert(
9770: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 pExpr->op!=TK_A
9780: 53 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d S && pExpr->op!=
9790: 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 TK_COLLATE );.
97a0: 70 72 65 72 65 71 4c 65 66 74 20 3d 20 73 71 6c prereqLeft = sql
97b0: 69 74 65 33 57 68 65 72 65 45 78 70 72 55 73 61 ite3WhereExprUsa
97c0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 ge(pMaskSet, pEx
97d0: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6f 70 pr->pLeft);. op
97e0: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 = pExpr->op;.
97f0: 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b if( op==TK_IN ){
9800: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 . assert( pEx
9810: 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b pr->pRight==0 );
9820: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 . if( sqlite3
9830: 45 78 70 72 43 68 65 63 6b 49 4e 28 70 50 61 72 ExprCheckIN(pPar
9840: 73 65 2c 20 70 45 78 70 72 29 20 29 20 72 65 74 se, pExpr) ) ret
9850: 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 45 78 70 urn;. if( Exp
9860: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 rHasProperty(pEx
9870: 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 pr, EP_xIsSelect
9880: 29 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d ) ){. pTerm
9890: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 ->prereqRight =
98a0: 65 78 70 72 53 65 6c 65 63 74 55 73 61 67 65 28 exprSelectUsage(
98b0: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d pMaskSet, pExpr-
98c0: 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 >x.pSelect);.
98d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 }else{. pT
98e0: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 erm->prereqRight
98f0: 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 = sqlite3WhereE
9900: 78 70 72 4c 69 73 74 55 73 61 67 65 28 70 4d 61 xprListUsage(pMa
9910: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e skSet, pExpr->x.
9920: 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 pList);. }.
9930: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b }else if( op==TK
9940: 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70 _ISNULL ){. p
9950: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 Term->prereqRigh
9960: 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a t = 0;. }else{.
9970: 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 pTerm->prere
9980: 71 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 qRight = sqlite3
9990: 57 68 65 72 65 45 78 70 72 55 73 61 67 65 28 70 WhereExprUsage(p
99a0: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e MaskSet, pExpr->
99b0: 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 pRight);. }. p
99c0: 4d 61 73 6b 53 65 74 2d 3e 62 56 61 72 53 65 6c MaskSet->bVarSel
99d0: 65 63 74 20 3d 20 30 3b 0a 20 20 70 72 65 72 65 ect = 0;. prere
99e0: 71 41 6c 6c 20 3d 20 73 71 6c 69 74 65 33 57 68 qAll = sqlite3Wh
99f0: 65 72 65 45 78 70 72 55 73 61 67 65 28 70 4d 61 ereExprUsage(pMa
9a00: 73 6b 53 65 74 2c 20 70 45 78 70 72 29 3b 0a 20 skSet, pExpr);.
9a10: 20 69 66 28 20 70 4d 61 73 6b 53 65 74 2d 3e 62 if( pMaskSet->b
9a20: 56 61 72 53 65 6c 65 63 74 20 29 20 70 54 65 72 VarSelect ) pTer
9a30: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 m->wtFlags |= TE
9a40: 52 4d 5f 56 41 52 53 45 4c 45 43 54 3b 0a 20 20 RM_VARSELECT;.
9a50: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 if( ExprHasPrope
9a60: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 rty(pExpr, EP_Fr
9a70: 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 42 omJoin) ){. B
9a80: 69 74 6d 61 73 6b 20 78 20 3d 20 73 71 6c 69 74 itmask x = sqlit
9a90: 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 70 e3WhereGetMask(p
9aa0: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e MaskSet, pExpr->
9ab0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 29 iRightJoinTable)
9ac0: 3b 0a 20 20 20 20 70 72 65 72 65 71 41 6c 6c 20 ;. prereqAll
9ad0: 7c 3d 20 78 3b 0a 20 20 20 20 65 78 74 72 61 52 |= x;. extraR
9ae0: 69 67 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a 20 ight = x-1; /*
9af0: 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 ON clause terms
9b00: 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64 20 may not be used
9b10: 77 69 74 68 20 61 6e 20 69 6e 64 65 78 0a 20 20 with an index.
9b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9b30: 20 20 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74 20 ** on left
9b40: 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 table of a LEFT
9b50: 4a 4f 49 4e 2e 20 20 54 69 63 6b 65 74 20 23 33 JOIN. Ticket #3
9b60: 30 31 35 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 015 */. if( (
9b70: 70 72 65 72 65 71 41 6c 6c 3e 3e 31 29 3e 3d 78 prereqAll>>1)>=x
9b80: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 ){. sqlite
9b90: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 3ErrorMsg(pParse
9ba0: 2c 20 22 4f 4e 20 63 6c 61 75 73 65 20 72 65 66 , "ON clause ref
9bb0: 65 72 65 6e 63 65 73 20 74 61 62 6c 65 73 20 74 erences tables t
9bc0: 6f 20 69 74 73 20 72 69 67 68 74 22 29 3b 0a 20 o its right");.
9bd0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 return;.
9be0: 20 7d 0a 20 20 7d 0a 20 20 70 54 65 72 6d 2d 3e }. }. pTerm->
9bf0: 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 prereqAll = prer
9c00: 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d 2d 3e eqAll;. pTerm->
9c10: 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 2d 31 3b leftCursor = -1;
9c20: 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e . pTerm->iParen
9c30: 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d t = -1;. pTerm-
9c40: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 30 3b 0a >eOperator = 0;.
9c50: 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 if( allowedOp(
9c60: 6f 70 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 op) ){. int a
9c70: 69 43 75 72 43 6f 6c 5b 32 5d 3b 0a 20 20 20 20 iCurCol[2];.
9c80: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 73 71 Expr *pLeft = sq
9c90: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c lite3ExprSkipCol
9ca0: 6c 61 74 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 late(pExpr->pLef
9cb0: 74 29 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 t);. Expr *pR
9cc0: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 ight = sqlite3Ex
9cd0: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 prSkipCollate(pE
9ce0: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 xpr->pRight);.
9cf0: 20 20 75 31 36 20 6f 70 4d 61 73 6b 20 3d 20 28 u16 opMask = (
9d00: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 pTerm->prereqRig
9d10: 68 74 20 26 20 70 72 65 72 65 71 4c 65 66 74 29 ht & prereqLeft)
9d20: 3d 3d 30 20 3f 20 57 4f 5f 41 4c 4c 20 3a 20 57 ==0 ? WO_ALL : W
9d30: 4f 5f 45 51 55 49 56 3b 0a 0a 20 20 20 20 69 66 O_EQUIV;.. if
9d40: 28 20 70 54 65 72 6d 2d 3e 69 46 69 65 6c 64 3e ( pTerm->iField>
9d50: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 0 ){. asser
9d60: 74 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a t( op==TK_IN );.
9d70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c assert( pL
9d80: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 45 43 54 eft->op==TK_VECT
9d90: 4f 52 20 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 OR );. pLef
9da0: 74 20 3d 20 70 4c 65 66 74 2d 3e 78 2e 70 4c 69 t = pLeft->x.pLi
9db0: 73 74 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69 46 69 st->a[pTerm->iFi
9dc0: 65 6c 64 2d 31 5d 2e 70 45 78 70 72 3b 0a 20 20 eld-1].pExpr;.
9dd0: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 78 70 }.. if( exp
9de0: 72 4d 69 67 68 74 42 65 49 6e 64 65 78 65 64 28 rMightBeIndexed(
9df0: 70 53 72 63 2c 20 70 72 65 72 65 71 4c 65 66 74 pSrc, prereqLeft
9e00: 2c 20 61 69 43 75 72 43 6f 6c 2c 20 70 4c 65 66 , aiCurCol, pLef
9e10: 74 2c 20 6f 70 29 20 29 7b 0a 20 20 20 20 20 20 t, op) ){.
9e20: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f pTerm->leftCurso
9e30: 72 20 3d 20 61 69 43 75 72 43 6f 6c 5b 30 5d 3b r = aiCurCol[0];
9e40: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 75 2e . pTerm->u.
9e50: 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 61 69 43 leftColumn = aiC
9e60: 75 72 43 6f 6c 5b 31 5d 3b 0a 20 20 20 20 20 20 urCol[1];.
9e70: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 pTerm->eOperator
9e80: 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 = operatorMask(
9e90: 6f 70 29 20 26 20 6f 70 4d 61 73 6b 3b 0a 20 20 op) & opMask;.
9ea0: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d }. if( op==
9eb0: 54 4b 5f 49 53 20 29 20 70 54 65 72 6d 2d 3e 77 TK_IS ) pTerm->w
9ec0: 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 49 tFlags |= TERM_I
9ed0: 53 3b 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 S;. if( pRigh
9ee0: 74 20 0a 20 20 20 20 20 26 26 20 65 78 70 72 4d t . && exprM
9ef0: 69 67 68 74 42 65 49 6e 64 65 78 65 64 28 70 53 ightBeIndexed(pS
9f00: 72 63 2c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 rc, pTerm->prere
9f10: 71 52 69 67 68 74 2c 20 61 69 43 75 72 43 6f 6c qRight, aiCurCol
9f20: 2c 20 70 52 69 67 68 74 2c 20 6f 70 29 0a 20 20 , pRight, op).
9f30: 20 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 ){. Where
9f40: 54 65 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20 Term *pNew;.
9f50: 20 20 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20 Expr *pDup;.
9f60: 20 20 20 20 75 31 36 20 65 45 78 74 72 61 4f 70 u16 eExtraOp
9f70: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 = 0; /*
9f80: 45 78 74 72 61 20 62 69 74 73 20 66 6f 72 20 70 Extra bits for p
9f90: 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a New->eOperator *
9fa0: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 /. assert(
9fb0: 70 54 65 72 6d 2d 3e 69 46 69 65 6c 64 3d 3d 30 pTerm->iField==0
9fc0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 );. if( pT
9fd0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3e erm->leftCursor>
9fe0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e =0 ){. in
9ff0: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 t idxNew;.
a000: 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 pDup = sqlite3
a010: 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 ExprDup(db, pExp
a020: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 r, 0);. i
a030: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 f( db->mallocFai
a040: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 led ){.
a050: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 sqlite3ExprDele
a060: 74 65 28 64 62 2c 20 70 44 75 70 29 3b 0a 20 20 te(db, pDup);.
a070: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a return;.
a080: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
a090: 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 idxNew = where
a0a0: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 ClauseInsert(pWC
a0b0: 2c 20 70 44 75 70 2c 20 54 45 52 4d 5f 56 49 52 , pDup, TERM_VIR
a0c0: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 TUAL|TERM_DYNAMI
a0d0: 43 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 C);. if(
a0e0: 69 64 78 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 idxNew==0 ) retu
a0f0: 72 6e 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 rn;. pNew
a100: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 = &pWC->a[idxNe
a110: 77 5d 3b 0a 20 20 20 20 20 20 20 20 6d 61 72 6b w];. mark
a120: 54 65 72 6d 41 73 43 68 69 6c 64 28 70 57 43 2c TermAsChild(pWC,
a130: 20 69 64 78 4e 65 77 2c 20 69 64 78 54 65 72 6d idxNew, idxTerm
a140: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f );. if( o
a150: 70 3d 3d 54 4b 5f 49 53 20 29 20 70 4e 65 77 2d p==TK_IS ) pNew-
a160: 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d >wtFlags |= TERM
a170: 5f 49 53 3b 0a 20 20 20 20 20 20 20 20 70 54 65 _IS;. pTe
a180: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 rm = &pWC->a[idx
a190: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70 Term];. p
a1a0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d Term->wtFlags |=
a1b0: 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 0a 20 TERM_COPIED;..
a1c0: 20 20 20 20 20 20 20 69 66 28 20 74 65 72 6d 49 if( termI
a1d0: 73 45 71 75 69 76 61 6c 65 6e 63 65 28 70 50 61 sEquivalence(pPa
a1e0: 72 73 65 2c 20 70 44 75 70 29 20 29 7b 0a 20 20 rse, pDup) ){.
a1f0: 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 pTerm->e
a200: 4f 70 65 72 61 74 6f 72 20 7c 3d 20 57 4f 5f 45 Operator |= WO_E
a210: 51 55 49 56 3b 0a 20 20 20 20 20 20 20 20 20 20 QUIV;.
a220: 65 45 78 74 72 61 4f 70 20 3d 20 57 4f 5f 45 51 eExtraOp = WO_EQ
a230: 55 49 56 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 UIV;. }.
a240: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 }else{.
a250: 20 20 20 20 70 44 75 70 20 3d 20 70 45 78 70 72 pDup = pExpr
a260: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d ;. pNew =
a270: 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a pTerm;. }.
a280: 20 20 20 20 20 20 65 78 70 72 43 6f 6d 6d 75 74 exprCommut
a290: 65 28 70 50 61 72 73 65 2c 20 70 44 75 70 29 3b e(pParse, pDup);
a2a0: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66 . pNew->lef
a2b0: 74 43 75 72 73 6f 72 20 3d 20 61 69 43 75 72 43 tCursor = aiCurC
a2c0: 6f 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 70 4e 65 ol[0];. pNe
a2d0: 77 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 w->u.leftColumn
a2e0: 3d 20 61 69 43 75 72 43 6f 6c 5b 31 5d 3b 0a 20 = aiCurCol[1];.
a2f0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 testcase( (
a300: 70 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74 prereqLeft | ext
a310: 72 61 52 69 67 68 74 29 20 21 3d 20 70 72 65 72 raRight) != prer
a320: 65 71 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 eqLeft );.
a330: 70 4e 65 77 2d 3e 70 72 65 72 65 71 52 69 67 68 pNew->prereqRigh
a340: 74 20 3d 20 70 72 65 72 65 71 4c 65 66 74 20 7c t = prereqLeft |
a350: 20 65 78 74 72 61 52 69 67 68 74 3b 0a 20 20 20 extraRight;.
a360: 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 41 pNew->prereqA
a370: 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a ll = prereqAll;.
a380: 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 4f 70 65 pNew->eOpe
a390: 72 61 74 6f 72 20 3d 20 28 6f 70 65 72 61 74 6f rator = (operato
a3a0: 72 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29 20 rMask(pDup->op)
a3b0: 2b 20 65 45 78 74 72 61 4f 70 29 20 26 20 6f 70 + eExtraOp) & op
a3c0: 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a Mask;. }. }.
a3d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f .#ifndef SQLITE_
a3e0: 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 OMIT_BETWEEN_OPT
a3f0: 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 IMIZATION. /* I
a400: 66 20 61 20 74 65 72 6d 20 69 73 20 74 68 65 20 f a term is the
a410: 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 BETWEEN operator
a420: 2c 20 63 72 65 61 74 65 20 74 77 6f 20 6e 65 77 , create two new
a430: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 0a 20 virtual terms.
a440: 20 2a 2a 20 74 68 61 74 20 64 65 66 69 6e 65 20 ** that define
a450: 74 68 65 20 72 61 6e 67 65 20 74 68 61 74 20 74 the range that t
a460: 68 65 20 42 45 54 57 45 45 4e 20 69 6d 70 6c 65 he BETWEEN imple
a470: 6d 65 6e 74 73 2e 20 20 46 6f 72 20 65 78 61 6d ments. For exam
a480: 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 ple:. **. **
a490: 20 20 20 20 61 20 42 45 54 57 45 45 4e 20 62 20 a BETWEEN b
a4a0: 41 4e 44 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a 20 AND c. **. **
a4b0: 69 73 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 is converted int
a4c0: 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 o:. **. **
a4d0: 20 20 28 61 20 42 45 54 57 45 45 4e 20 62 20 41 (a BETWEEN b A
a4e0: 4e 44 20 63 29 20 41 4e 44 20 28 61 3e 3d 62 29 ND c) AND (a>=b)
a4f0: 20 41 4e 44 20 28 61 3c 3d 63 29 0a 20 20 2a 2a AND (a<=c). **
a500: 0a 20 20 2a 2a 20 54 68 65 20 74 77 6f 20 6e 65 . ** The two ne
a510: 77 20 74 65 72 6d 73 20 61 72 65 20 61 64 64 65 w terms are adde
a520: 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f d onto the end o
a530: 66 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 f the WhereClaus
a540: 65 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 e object.. ** T
a550: 68 65 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65 he new terms are
a560: 20 22 64 79 6e 61 6d 69 63 22 20 61 6e 64 20 61 "dynamic" and a
a570: 72 65 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 74 re children of t
a580: 68 65 20 6f 72 69 67 69 6e 61 6c 20 42 45 54 57 he original BETW
a590: 45 45 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 20 EEN. ** term.
a5a0: 54 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 That means that
a5b0: 69 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 74 if the BETWEEN t
a5c0: 65 72 6d 20 69 73 20 63 6f 64 65 64 2c 20 74 68 erm is coded, th
a5d0: 65 20 63 68 69 6c 64 72 65 6e 20 61 72 65 0a 20 e children are.
a5e0: 20 2a 2a 20 73 6b 69 70 70 65 64 2e 20 20 4f 72 ** skipped. Or
a5f0: 2c 20 69 66 20 74 68 65 20 63 68 69 6c 64 72 65 , if the childre
a600: 6e 20 61 72 65 20 73 61 74 69 73 66 69 65 64 20 n are satisfied
a610: 62 79 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65 by an index, the
a620: 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 42 original. ** B
a630: 45 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20 73 ETWEEN term is s
a640: 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 kipped.. */. e
a650: 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f lse if( pExpr->o
a660: 70 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20 26 26 p==TK_BETWEEN &&
a670: 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 pWC->op==TK_AND
a680: 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 ){. ExprList
a690: 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d *pList = pExpr-
a6a0: 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e >x.pList;. in
a6b0: 74 20 69 3b 0a 20 20 20 20 73 74 61 74 69 63 20 t i;. static
a6c0: 63 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d const u8 ops[] =
a6d0: 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b {TK_GE, TK_LE};
a6e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 . assert( pLi
a6f0: 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 st!=0 );. ass
a700: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 ert( pList->nExp
a710: 72 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72 28 r==2 );. for(
a720: 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a i=0; i<2; i++){.
a730: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 Expr *pNew
a740: 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 Expr;. int
a750: 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e idxNew;. pN
a760: 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 ewExpr = sqlite3
a770: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 6f 70 PExpr(pParse, op
a780: 73 5b 69 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 s[i], .
a790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
a7a0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 sqlite3ExprD
a7b0: 75 70 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c up(db, pExpr->pL
a7c0: 65 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 eft, 0),.
a7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
a7e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 sqlite3Exp
a7f0: 72 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e rDup(db, pList->
a800: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29 29 3b a[i].pExpr, 0));
a810: 0a 20 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a . transferJ
a820: 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 oinMarkings(pNew
a830: 45 78 70 72 2c 20 70 45 78 70 72 29 3b 0a 20 20 Expr, pExpr);.
a840: 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 idxNew = whe
a850: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 reClauseInsert(p
a860: 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45 WC, pNewExpr, TE
a870: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f RM_VIRTUAL|TERM_
a880: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 DYNAMIC);.
a890: 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 testcase( idxNew
a8a0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 ==0 );. exp
a8b0: 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 rAnalyze(pSrc, p
a8c0: 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 WC, idxNew);.
a8d0: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d pTerm = &pWC-
a8e0: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 >a[idxTerm];.
a8f0: 20 20 20 6d 61 72 6b 54 65 72 6d 41 73 43 68 69 markTermAsChi
a900: 6c 64 28 70 57 43 2c 20 69 64 78 4e 65 77 2c 20 ld(pWC, idxNew,
a910: 69 64 78 54 65 72 6d 29 3b 0a 20 20 20 20 7d 0a idxTerm);. }.
a920: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 }.#endif /* SQ
a930: 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 LITE_OMIT_BETWEE
a940: 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a N_OPTIMIZATION *
a950: 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 /..#if !defined(
a960: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f SQLITE_OMIT_OR_O
a970: 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20 PTIMIZATION) &&
a980: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f !defined(SQLITE_
a990: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 20 OMIT_SUBQUERY).
a9a0: 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74 65 /* Analyze a te
a9b0: 72 6d 20 74 68 61 74 20 69 73 20 63 6f 6d 70 6f rm that is compo
a9c0: 73 65 64 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f sed of two or mo
a9d0: 72 65 20 73 75 62 74 65 72 6d 73 20 63 6f 6e 6e re subterms conn
a9e0: 65 63 74 65 64 20 62 79 0a 20 20 2a 2a 20 61 6e ected by. ** an
a9f0: 20 4f 52 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 OR operator..
aa00: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 */. else if( pE
aa10: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 xpr->op==TK_OR )
aa20: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57 {. assert( pW
aa30: 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b C->op==TK_AND );
aa40: 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 . exprAnalyze
aa50: 4f 72 54 65 72 6d 28 70 53 72 63 2c 20 70 57 43 OrTerm(pSrc, pWC
aa60: 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20 20 , idxTerm);.
aa70: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b pTerm = &pWC->a[
aa80: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 7d 0a 23 65 idxTerm];. }.#e
aa90: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f ndif /* SQLITE_O
aaa0: 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 MIT_OR_OPTIMIZAT
aab0: 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 ION */..#ifndef
aac0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 SQLITE_OMIT_LIKE
aad0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 _OPTIMIZATION.
aae0: 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72 61 69 6e /* Add constrain
aaf0: 74 73 20 74 6f 20 72 65 64 75 63 65 20 74 68 65 ts to reduce the
ab00: 20 73 65 61 72 63 68 20 73 70 61 63 65 20 6f 6e search space on
ab10: 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 0a a LIKE or GLOB.
ab20: 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 20 ** operator..
ab30: 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c 69 6b 65 20 **. ** A like
ab40: 70 61 74 74 65 72 6e 20 6f 66 20 74 68 65 20 66 pattern of the f
ab50: 6f 72 6d 20 22 78 20 4c 49 4b 45 20 27 61 42 63 orm "x LIKE 'aBc
ab60: 25 27 22 20 69 73 20 63 68 61 6e 67 65 64 20 69 %'" is changed i
ab70: 6e 74 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a nto constraints.
ab80: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 **. **
ab90: 20 20 20 78 3e 3d 27 41 42 43 27 20 41 4e 44 20 x>='ABC' AND
aba0: 78 3c 27 61 62 64 27 20 41 4e 44 20 78 20 4c 49 x<'abd' AND x LI
abb0: 4b 45 20 27 61 42 63 25 27 0a 20 20 2a 2a 0a 20 KE 'aBc%'. **.
abc0: 20 2a 2a 20 54 68 65 20 6c 61 73 74 20 63 68 61 ** The last cha
abd0: 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 70 72 racter of the pr
abe0: 65 66 69 78 20 22 61 62 63 22 20 69 73 20 69 6e efix "abc" is in
abf0: 63 72 65 6d 65 6e 74 65 64 20 74 6f 20 66 6f 72 cremented to for
ac00: 6d 20 74 68 65 0a 20 20 2a 2a 20 74 65 72 6d 69 m the. ** termi
ac10: 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e nation condition
ac20: 20 22 61 62 64 22 2e 20 20 49 66 20 63 61 73 65 "abd". If case
ac30: 20 69 73 20 6e 6f 74 20 73 69 67 6e 69 66 69 63 is not signific
ac40: 61 6e 74 20 28 74 68 65 20 64 65 66 61 75 6c 74 ant (the default
ac50: 0a 20 20 2a 2a 20 66 6f 72 20 4c 49 4b 45 29 20 . ** for LIKE)
ac60: 74 68 65 6e 20 74 68 65 20 6c 6f 77 65 72 2d 62 then the lower-b
ac70: 6f 75 6e 64 20 69 73 20 6d 61 64 65 20 61 6c 6c ound is made all
ac80: 20 75 70 70 65 72 63 61 73 65 20 61 6e 64 20 74 uppercase and t
ac90: 68 65 20 75 70 70 65 72 2d 0a 20 20 2a 2a 20 62 he upper-. ** b
aca0: 6f 75 6e 64 20 69 73 20 6d 61 64 65 20 61 6c 6c ound is made all
acb0: 20 6c 6f 77 65 72 63 61 73 65 20 73 6f 20 74 68 lowercase so th
acc0: 61 74 20 74 68 65 20 62 6f 75 6e 64 73 20 61 6c at the bounds al
acd0: 73 6f 20 77 6f 72 6b 20 77 68 65 6e 20 63 6f 6d so work when com
ace0: 70 61 72 69 6e 67 0a 20 20 2a 2a 20 42 4c 4f 42 paring. ** BLOB
acf0: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 s.. */. if( pW
ad00: 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 0a 20 C->op==TK_AND .
ad10: 20 20 26 26 20 69 73 4c 69 6b 65 4f 72 47 6c 6f && isLikeOrGlo
ad20: 62 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c b(pParse, pExpr,
ad30: 20 26 70 53 74 72 31 2c 20 26 69 73 43 6f 6d 70 &pStr1, &isComp
ad40: 6c 65 74 65 2c 20 26 6e 6f 43 61 73 65 29 0a 20 lete, &noCase).
ad50: 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c ){. Expr *pL
ad60: 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c 48 eft; /* LH
ad70: 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f S of LIKE/GLOB o
ad80: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45 perator */. E
ad90: 78 70 72 20 2a 70 53 74 72 32 3b 20 20 20 20 20 xpr *pStr2;
ada0: 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 53 74 /* Copy of pSt
adb0: 72 31 20 2d 20 52 48 53 20 6f 66 20 4c 49 4b 45 r1 - RHS of LIKE
adc0: 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a /GLOB operator *
add0: 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 /. Expr *pNew
ade0: 45 78 70 72 31 3b 0a 20 20 20 20 45 78 70 72 20 Expr1;. Expr
adf0: 2a 70 4e 65 77 45 78 70 72 32 3b 0a 20 20 20 20 *pNewExpr2;.
ae00: 69 6e 74 20 69 64 78 4e 65 77 31 3b 0a 20 20 20 int idxNew1;.
ae10: 20 69 6e 74 20 69 64 78 4e 65 77 32 3b 0a 20 20 int idxNew2;.
ae20: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 const char *zC
ae30: 6f 6c 6c 53 65 71 4e 61 6d 65 3b 20 20 20 20 20 ollSeqName;
ae40: 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 /* Name of colla
ae50: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f ting sequence */
ae60: 0a 20 20 20 20 63 6f 6e 73 74 20 75 31 36 20 77 . const u16 w
ae70: 74 46 6c 61 67 73 20 3d 20 54 45 52 4d 5f 4c 49 tFlags = TERM_LI
ae80: 4b 45 4f 50 54 20 7c 20 54 45 52 4d 5f 56 49 52 KEOPT | TERM_VIR
ae90: 54 55 41 4c 20 7c 20 54 45 52 4d 5f 44 59 4e 41 TUAL | TERM_DYNA
aea0: 4d 49 43 3b 0a 0a 20 20 20 20 70 4c 65 66 74 20 MIC;.. pLeft
aeb0: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 = pExpr->x.pList
aec0: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 ->a[1].pExpr;.
aed0: 20 20 70 53 74 72 32 20 3d 20 73 71 6c 69 74 65 pStr2 = sqlite
aee0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 74 3ExprDup(db, pSt
aef0: 72 31 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 r1, 0);.. /*
af00: 43 6f 6e 76 65 72 74 20 74 68 65 20 6c 6f 77 65 Convert the lowe
af10: 72 20 62 6f 75 6e 64 20 74 6f 20 75 70 70 65 72 r bound to upper
af20: 2d 63 61 73 65 20 61 6e 64 20 74 68 65 20 75 70 -case and the up
af30: 70 65 72 20 62 6f 75 6e 64 20 74 6f 0a 20 20 20 per bound to.
af40: 20 2a 2a 20 6c 6f 77 65 72 2d 63 61 73 65 20 28 ** lower-case (
af50: 75 70 70 65 72 2d 63 61 73 65 20 69 73 20 6c 65 upper-case is le
af60: 73 73 20 74 68 61 6e 20 6c 6f 77 65 72 2d 63 61 ss than lower-ca
af70: 73 65 20 69 6e 20 41 53 43 49 49 29 20 73 6f 20 se in ASCII) so
af80: 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 that. ** the
af90: 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 range constraint
afa0: 73 20 61 6c 73 6f 20 77 6f 72 6b 20 66 6f 72 20 s also work for
afb0: 42 4c 4f 42 73 0a 20 20 20 20 2a 2f 0a 20 20 20 BLOBs. */.
afc0: 20 69 66 28 20 6e 6f 43 61 73 65 20 26 26 20 21 if( noCase && !
afd0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c pParse->db->mall
afe0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 ocFailed ){.
aff0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 63 int i;. c
b000: 68 61 72 20 63 3b 0a 20 20 20 20 20 20 70 54 65 har c;. pTe
b010: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 rm->wtFlags |= T
b020: 45 52 4d 5f 4c 49 4b 45 3b 0a 20 20 20 20 20 20 ERM_LIKE;.
b030: 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 70 53 for(i=0; (c = pS
b040: 74 72 31 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 69 5d tr1->u.zToken[i]
b050: 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 )!=0; i++){.
b060: 20 20 20 20 70 53 74 72 31 2d 3e 75 2e 7a 54 6f pStr1->u.zTo
b070: 6b 65 6e 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 ken[i] = sqlite3
b080: 54 6f 75 70 70 65 72 28 63 29 3b 0a 20 20 20 20 Toupper(c);.
b090: 20 20 20 20 70 53 74 72 32 2d 3e 75 2e 7a 54 6f pStr2->u.zTo
b0a0: 6b 65 6e 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 ken[i] = sqlite3
b0b0: 54 6f 6c 6f 77 65 72 28 63 29 3b 0a 20 20 20 20 Tolower(c);.
b0c0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 }. }.. i
b0d0: 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 f( !db->mallocFa
b0e0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 75 38 iled ){. u8
b0f0: 20 63 2c 20 2a 70 43 3b 20 20 20 20 20 20 20 2f c, *pC; /
b100: 2a 20 4c 61 73 74 20 63 68 61 72 61 63 74 65 72 * Last character
b110: 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 before the firs
b120: 74 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20 t wildcard */.
b130: 20 20 20 20 70 43 20 3d 20 28 75 38 2a 29 26 70 pC = (u8*)&p
b140: 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 73 Str2->u.zToken[s
b150: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 qlite3Strlen30(p
b160: 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2d Str2->u.zToken)-
b170: 31 5d 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 70 1];. c = *p
b180: 43 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 C;. if( noC
b190: 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f ase ){. /
b1a0: 2a 20 54 68 65 20 70 6f 69 6e 74 20 69 73 20 74 * The point is t
b1b0: 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 o increment the
b1c0: 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20 62 last character b
b1d0: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a efore the first.
b1e0: 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 64 63 ** wildc
b1f0: 61 72 64 2e 20 20 42 75 74 20 69 66 20 77 65 20 ard. But if we
b200: 69 6e 63 72 65 6d 65 6e 74 20 27 40 27 2c 20 74 increment '@', t
b210: 68 61 74 20 77 69 6c 6c 20 70 75 73 68 20 69 74 hat will push it
b220: 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 into the.
b230: 20 20 2a 2a 20 61 6c 70 68 61 62 65 74 69 63 20 ** alphabetic
b240: 72 61 6e 67 65 20 77 68 65 72 65 20 63 61 73 65 range where case
b250: 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 77 69 6c conversions wil
b260: 6c 20 6d 65 73 73 20 75 70 20 74 68 65 20 0a 20 l mess up the .
b270: 20 20 20 20 20 20 20 2a 2a 20 69 6e 65 71 75 61 ** inequa
b280: 6c 69 74 79 2e 20 20 54 6f 20 61 76 6f 69 64 20 lity. To avoid
b290: 74 68 69 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 this, make sure
b2a0: 74 6f 20 61 6c 73 6f 20 72 75 6e 20 74 68 65 20 to also run the
b2b0: 66 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 full. **
b2c0: 4c 49 4b 45 20 6f 6e 20 61 6c 6c 20 63 61 6e 64 LIKE on all cand
b2d0: 69 64 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e idate expression
b2e0: 73 20 62 79 20 63 6c 65 61 72 69 6e 67 20 74 68 s by clearing th
b2f0: 65 20 69 73 43 6f 6d 70 6c 65 74 65 20 66 6c 61 e isComplete fla
b300: 67 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 g. */.
b310: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 41 27 2d if( c=='A'-
b320: 31 20 29 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 1 ) isComplete =
b330: 20 30 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 0;. c =
b340: 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f sqlite3UpperToLo
b350: 77 65 72 5b 63 5d 3b 0a 20 20 20 20 20 20 7d 0a wer[c];. }.
b360: 20 20 20 20 20 20 2a 70 43 20 3d 20 63 20 2b 20 *pC = c +
b370: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f 1;. }. zCo
b380: 6c 6c 53 65 71 4e 61 6d 65 20 3d 20 6e 6f 43 61 llSeqName = noCa
b390: 73 65 20 3f 20 22 4e 4f 43 41 53 45 22 20 3a 20 se ? "NOCASE" :
b3a0: 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 70 4e "BINARY";. pN
b3b0: 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65 ewExpr1 = sqlite
b3c0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 3ExprDup(db, pLe
b3d0: 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65 77 ft, 0);. pNew
b3e0: 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33 50 Expr1 = sqlite3P
b3f0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f Expr(pParse, TK_
b400: 47 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 GE,. s
b410: 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c qlite3ExprAddCol
b420: 6c 61 74 65 53 74 72 69 6e 67 28 70 50 61 72 73 lateString(pPars
b430: 65 2c 70 4e 65 77 45 78 70 72 31 2c 7a 43 6f 6c e,pNewExpr1,zCol
b440: 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20 20 lSeqName),.
b450: 20 20 20 20 20 20 70 53 74 72 31 29 3b 0a 20 20 pStr1);.
b460: 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 transferJoinMa
b470: 72 6b 69 6e 67 73 28 70 4e 65 77 45 78 70 72 31 rkings(pNewExpr1
b480: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 69 64 , pExpr);. id
b490: 78 4e 65 77 31 20 3d 20 77 68 65 72 65 43 6c 61 xNew1 = whereCla
b4a0: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 useInsert(pWC, p
b4b0: 4e 65 77 45 78 70 72 31 2c 20 77 74 46 6c 61 67 NewExpr1, wtFlag
b4c0: 73 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 s);. testcase
b4d0: 28 20 69 64 78 4e 65 77 31 3d 3d 30 20 29 3b 0a ( idxNew1==0 );.
b4e0: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 exprAnalyze(
b4f0: 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 pSrc, pWC, idxNe
b500: 77 31 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 w1);. pNewExp
b510: 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 r2 = sqlite3Expr
b520: 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 Dup(db, pLeft, 0
b530: 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32 );. pNewExpr2
b540: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 = sqlite3PExpr(
b550: 70 50 61 72 73 65 2c 20 54 4b 5f 4c 54 2c 0a 20 pParse, TK_LT,.
b560: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 sqlite
b570: 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 3ExprAddCollateS
b580: 74 72 69 6e 67 28 70 50 61 72 73 65 2c 70 4e 65 tring(pParse,pNe
b590: 77 45 78 70 72 32 2c 7a 43 6f 6c 6c 53 65 71 4e wExpr2,zCollSeqN
b5a0: 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 ame),.
b5b0: 20 70 53 74 72 32 29 3b 0a 20 20 20 20 74 72 61 pStr2);. tra
b5c0: 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 nsferJoinMarking
b5d0: 73 28 70 4e 65 77 45 78 70 72 32 2c 20 70 45 78 s(pNewExpr2, pEx
b5e0: 70 72 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 32 pr);. idxNew2
b5f0: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e = whereClauseIn
b600: 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 sert(pWC, pNewEx
b610: 70 72 32 2c 20 77 74 46 6c 61 67 73 29 3b 0a 20 pr2, wtFlags);.
b620: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 testcase( idx
b630: 4e 65 77 32 3d 3d 30 20 29 3b 0a 20 20 20 20 65 New2==0 );. e
b640: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c xprAnalyze(pSrc,
b650: 20 70 57 43 2c 20 69 64 78 4e 65 77 32 29 3b 0a pWC, idxNew2);.
b660: 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 pTerm = &pWC
b670: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 ->a[idxTerm];.
b680: 20 20 69 66 28 20 69 73 43 6f 6d 70 6c 65 74 65 if( isComplete
b690: 20 29 7b 0a 20 20 20 20 20 20 6d 61 72 6b 54 65 ){. markTe
b6a0: 72 6d 41 73 43 68 69 6c 64 28 70 57 43 2c 20 69 rmAsChild(pWC, i
b6b0: 64 78 4e 65 77 31 2c 20 69 64 78 54 65 72 6d 29 dxNew1, idxTerm)
b6c0: 3b 0a 20 20 20 20 20 20 6d 61 72 6b 54 65 72 6d ;. markTerm
b6d0: 41 73 43 68 69 6c 64 28 70 57 43 2c 20 69 64 78 AsChild(pWC, idx
b6e0: 4e 65 77 32 2c 20 69 64 78 54 65 72 6d 29 3b 0a New2, idxTerm);.
b6f0: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 }. }.#endif
b700: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f /* SQLITE_OMIT_
b710: 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f LIKE_OPTIMIZATIO
b720: 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 N */..#ifndef SQ
b730: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 LITE_OMIT_VIRTUA
b740: 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 41 64 64 20 LTABLE. /* Add
b750: 61 20 57 4f 5f 41 55 58 20 61 75 78 69 6c 69 61 a WO_AUX auxilia
b760: 72 79 20 74 65 72 6d 20 74 6f 20 74 68 65 20 63 ry term to the c
b770: 6f 6e 73 74 72 61 69 6e 74 20 73 65 74 20 69 66 onstraint set if
b780: 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e the. ** curren
b790: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 t expression is
b7a0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 63 6f 6c of the form "col
b7b0: 75 6d 6e 20 4f 50 20 65 78 70 72 22 20 77 68 65 umn OP expr" whe
b7c0: 72 65 20 4f 50 0a 20 20 2a 2a 20 69 73 20 61 6e re OP. ** is an
b7d0: 20 6f 70 65 72 61 74 6f 72 20 74 68 61 74 20 67 operator that g
b7e0: 65 74 73 20 70 61 73 73 65 64 20 69 6e 74 6f 20 ets passed into
b7f0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 62 virtual tables b
b800: 75 74 20 77 68 69 63 68 20 69 73 0a 20 20 2a 2a ut which is. **
b810: 20 6e 6f 74 20 6e 6f 72 6d 61 6c 6c 79 20 6f 70 not normally op
b820: 74 69 6d 69 7a 65 64 20 66 6f 72 20 6f 72 64 69 timized for ordi
b830: 6e 61 72 79 20 74 61 62 6c 65 73 2e 20 20 49 6e nary tables. In
b840: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 4f 50 other words, OP
b850: 0a 20 20 2a 2a 20 69 73 20 6f 6e 65 20 6f 66 20 . ** is one of
b860: 4d 41 54 43 48 2c 20 4c 49 4b 45 2c 20 47 4c 4f MATCH, LIKE, GLO
b870: 42 2c 20 52 45 47 45 58 50 2c 20 21 3d 2c 20 49 B, REGEXP, !=, I
b880: 53 2c 20 49 53 20 4e 4f 54 2c 20 6f 72 20 4e 4f S, IS NOT, or NO
b890: 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 20 54 68 69 T NULL.. ** Thi
b8a0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 s information is
b8b0: 20 75 73 65 64 20 62 79 20 74 68 65 20 78 42 65 used by the xBe
b8c0: 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 73 20 stIndex methods
b8d0: 6f 66 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 of. ** virtual
b8e0: 74 61 62 6c 65 73 2e 20 20 54 68 65 20 6e 61 74 tables. The nat
b8f0: 69 76 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 ive query optimi
b900: 7a 65 72 20 64 6f 65 73 20 6e 6f 74 20 61 74 74 zer does not att
b910: 65 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 empt. ** to do
b920: 61 6e 79 74 68 69 6e 67 20 77 69 74 68 20 4d 41 anything with MA
b930: 54 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 TCH functions..
b940: 20 2a 2f 0a 20 20 69 66 28 20 70 57 43 2d 3e 6f */. if( pWC->o
b950: 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 p==TK_AND ){.
b960: 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 Expr *pRight =
b970: 30 2c 20 2a 70 4c 65 66 74 20 3d 20 30 3b 0a 20 0, *pLeft = 0;.
b980: 20 20 20 69 6e 74 20 72 65 73 20 3d 20 69 73 41 int res = isA
b990: 75 78 69 6c 69 61 72 79 56 74 61 62 4f 70 65 72 uxiliaryVtabOper
b9a0: 61 74 6f 72 28 70 45 78 70 72 2c 20 26 65 4f 70 ator(pExpr, &eOp
b9b0: 32 2c 20 26 70 4c 65 66 74 2c 20 26 70 52 69 67 2, &pLeft, &pRig
b9c0: 68 74 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 ht);. while(
b9d0: 72 65 73 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 res-- > 0 ){.
b9e0: 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 int idxNew;.
b9f0: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a WhereTerm *
ba00: 70 4e 65 77 54 65 72 6d 3b 0a 20 20 20 20 20 20 pNewTerm;.
ba10: 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 43 6f Bitmask prereqCo
ba20: 6c 75 6d 6e 2c 20 70 72 65 72 65 71 45 78 70 72 lumn, prereqExpr
ba30: 3b 0a 0a 20 20 20 20 20 20 70 72 65 72 65 71 45 ;.. prereqE
ba40: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 57 68 65 xpr = sqlite3Whe
ba50: 72 65 45 78 70 72 55 73 61 67 65 28 70 4d 61 73 reExprUsage(pMas
ba60: 6b 53 65 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 kSet, pRight);.
ba70: 20 20 20 20 20 70 72 65 72 65 71 43 6f 6c 75 6d prereqColum
ba80: 6e 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 n = sqlite3Where
ba90: 45 78 70 72 55 73 61 67 65 28 70 4d 61 73 6b 53 ExprUsage(pMaskS
baa0: 65 74 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 et, pLeft);.
bab0: 20 20 69 66 28 20 28 70 72 65 72 65 71 45 78 70 if( (prereqExp
bac0: 72 20 26 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e r & prereqColumn
bad0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 )==0 ){.
bae0: 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a Expr *pNewExpr;.
baf0: 20 20 20 20 20 20 20 20 70 4e 65 77 45 78 70 72 pNewExpr
bb00: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 = sqlite3PExpr(
bb10: 70 50 61 72 73 65 2c 20 54 4b 5f 4d 41 54 43 48 pParse, TK_MATCH
bb20: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 30 , . 0
bb30: 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 , sqlite3ExprDup
bb40: 28 64 62 2c 20 70 52 69 67 68 74 2c 20 30 29 29 (db, pRight, 0))
bb50: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 45 78 ;. if( Ex
bb60: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 prHasProperty(pE
bb70: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e xpr, EP_FromJoin
bb80: 29 20 26 26 20 70 4e 65 77 45 78 70 72 20 29 7b ) && pNewExpr ){
bb90: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 53 . ExprS
bba0: 65 74 50 72 6f 70 65 72 74 79 28 70 4e 65 77 45 etProperty(pNewE
bbb0: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e xpr, EP_FromJoin
bbc0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 );. }.
bbd0: 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 idxNew = wh
bbe0: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 ereClauseInsert(
bbf0: 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 pWC, pNewExpr, T
bc00: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d ERM_VIRTUAL|TERM
bc10: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 _DYNAMIC);.
bc20: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 testcase( idx
bc30: 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 New==0 );.
bc40: 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26 70 57 pNewTerm = &pW
bc50: 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 C->a[idxNew];.
bc60: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e pNewTerm->
bc70: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 70 72 prereqRight = pr
bc80: 65 72 65 71 45 78 70 72 3b 0a 20 20 20 20 20 20 ereqExpr;.
bc90: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74 pNewTerm->left
bca0: 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e Cursor = pLeft->
bcb0: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 iTable;.
bcc0: 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 pNewTerm->u.left
bcd0: 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e Column = pLeft->
bce0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 iColumn;.
bcf0: 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72 pNewTerm->eOper
bd00: 61 74 6f 72 20 3d 20 57 4f 5f 41 55 58 3b 0a 20 ator = WO_AUX;.
bd10: 20 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d pNewTerm-
bd20: 3e 65 4d 61 74 63 68 4f 70 20 3d 20 65 4f 70 32 >eMatchOp = eOp2
bd30: 3b 0a 20 20 20 20 20 20 20 20 6d 61 72 6b 54 65 ;. markTe
bd40: 72 6d 41 73 43 68 69 6c 64 28 70 57 43 2c 20 69 rmAsChild(pWC, i
bd50: 64 78 4e 65 77 2c 20 69 64 78 54 65 72 6d 29 3b dxNew, idxTerm);
bd60: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d . pTerm =
bd70: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d &pWC->a[idxTerm
bd80: 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d ];. pTerm
bd90: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 ->wtFlags |= TER
bda0: 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 M_COPIED;.
bdb0: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 pNewTerm->prer
bdc0: 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 eqAll = pTerm->p
bdd0: 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 20 20 rereqAll;.
bde0: 7d 0a 20 20 20 20 20 20 53 57 41 50 28 45 78 70 }. SWAP(Exp
bdf0: 72 2a 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 r*, pLeft, pRigh
be00: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 t);. }. }.#e
be10: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f ndif /* SQLITE_O
be20: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 MIT_VIRTUALTABLE
be30: 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 */.. /* If the
be40: 72 65 20 69 73 20 61 20 76 65 63 74 6f 72 20 3d re is a vector =
be50: 3d 20 6f 72 20 49 53 20 74 65 72 6d 20 2d 20 65 = or IS term - e
be60: 2e 67 2e 20 22 28 61 2c 20 62 29 20 3d 3d 20 28 .g. "(a, b) == (
be70: 3f 2c 20 3f 29 22 20 2d 20 63 72 65 61 74 65 0a ?, ?)" - create.
be80: 20 20 2a 2a 20 6e 65 77 20 74 65 72 6d 73 20 66 ** new terms f
be90: 6f 72 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e or each componen
bea0: 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2d 20 22 t comparison - "
beb0: 61 20 3d 20 3f 22 20 61 6e 64 20 22 62 20 3d 20 a = ?" and "b =
bec0: 3f 22 2e 20 20 54 68 65 0a 20 20 2a 2a 20 6e 65 ?". The. ** ne
bed0: 77 20 74 65 72 6d 73 20 63 6f 6d 70 6c 65 74 65 w terms complete
bee0: 6c 79 20 72 65 70 6c 61 63 65 20 74 68 65 20 6f ly replace the o
bef0: 72 69 67 69 6e 61 6c 20 76 65 63 74 6f 72 20 63 riginal vector c
bf00: 6f 6d 70 61 72 69 73 6f 6e 2c 20 77 68 69 63 68 omparison, which
bf10: 20 69 73 0a 20 20 2a 2a 20 6e 6f 20 6c 6f 6e 67 is. ** no long
bf20: 65 72 20 75 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 er used.. **.
bf30: 2a 2a 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 ** This is only
bf40: 72 65 71 75 69 72 65 64 20 69 66 20 61 74 20 6c required if at l
bf50: 65 61 73 74 20 6f 6e 65 20 73 69 64 65 20 6f 66 east one side of
bf60: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 the comparison
bf70: 6f 70 65 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 69 operation. ** i
bf80: 73 20 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c 65 s not a sub-sele
bf90: 63 74 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 ct. */. if( pW
bfa0: 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 0a 20 C->op==TK_AND .
bfb0: 20 26 26 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d && (pExpr->op==
bfc0: 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e TK_EQ || pExpr->
bfd0: 6f 70 3d 3d 54 4b 5f 49 53 29 0a 20 20 26 26 20 op==TK_IS). &&
bfe0: 28 6e 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 (nLeft = sqlite3
bff0: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 ExprVectorSize(p
c000: 45 78 70 72 2d 3e 70 4c 65 66 74 29 29 3e 31 0a Expr->pLeft))>1.
c010: 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 && sqlite3Expr
c020: 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 VectorSize(pExpr
c030: 2d 3e 70 52 69 67 68 74 29 3d 3d 6e 4c 65 66 74 ->pRight)==nLeft
c040: 0a 20 20 26 26 20 28 20 28 70 45 78 70 72 2d 3e . && ( (pExpr->
c050: 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 pLeft->flags & E
c060: 50 5f 78 49 73 53 65 6c 65 63 74 29 3d 3d 30 20 P_xIsSelect)==0
c070: 0a 20 20 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e . || (pExpr->
c080: 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 pRight->flags &
c090: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 3d 3d 30 EP_xIsSelect)==0
c0a0: 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 ). ){. int i
c0b0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 ;. for(i=0; i
c0c0: 3c 6e 4c 65 66 74 3b 20 69 2b 2b 29 7b 0a 20 20 <nLeft; i++){.
c0d0: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a int idxNew;.
c0e0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 Expr *pNew
c0f0: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c ;. Expr *pL
c100: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 eft = sqlite3Exp
c110: 72 46 6f 72 56 65 63 74 6f 72 46 69 65 6c 64 28 rForVectorField(
c120: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 pParse, pExpr->p
c130: 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 Left, i);.
c140: 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 73 Expr *pRight = s
c150: 71 6c 69 74 65 33 45 78 70 72 46 6f 72 56 65 63 qlite3ExprForVec
c160: 74 6f 72 46 69 65 6c 64 28 70 50 61 72 73 65 2c torField(pParse,
c170: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 pExpr->pRight,
c180: 69 29 3b 0a 0a 20 20 20 20 20 20 70 4e 65 77 20 i);.. pNew
c190: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 = sqlite3PExpr(p
c1a0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 6f 70 Parse, pExpr->op
c1b0: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 , pLeft, pRight)
c1c0: 3b 0a 20 20 20 20 20 20 74 72 61 6e 73 66 65 72 ;. transfer
c1d0: 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 JoinMarkings(pNe
c1e0: 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 w, pExpr);.
c1f0: 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 idxNew = whereC
c200: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c lauseInsert(pWC,
c210: 20 70 4e 65 77 2c 20 54 45 52 4d 5f 44 59 4e 41 pNew, TERM_DYNA
c220: 4d 49 43 29 3b 0a 20 20 20 20 20 20 65 78 70 72 MIC);. expr
c230: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 Analyze(pSrc, pW
c240: 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 C, idxNew);.
c250: 7d 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 }. pTerm = &p
c260: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a WC->a[idxTerm];.
c270: 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 pTerm->wtFla
c280: 67 73 20 3d 20 54 45 52 4d 5f 43 4f 44 45 44 7c gs = TERM_CODED|
c290: 54 45 52 4d 5f 56 49 52 54 55 41 4c 3b 20 20 2f TERM_VIRTUAL; /
c2a0: 2a 20 44 69 73 61 62 6c 65 20 74 68 65 20 6f 72 * Disable the or
c2b0: 69 67 69 6e 61 6c 20 2a 2f 0a 20 20 20 20 70 54 iginal */. pT
c2c0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d erm->eOperator =
c2d0: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 0;. }.. /* If
c2e0: 20 74 68 65 72 65 20 69 73 20 61 20 76 65 63 74 there is a vect
c2f0: 6f 72 20 49 4e 20 74 65 72 6d 20 2d 20 65 2e 67 or IN term - e.g
c300: 2e 20 22 28 61 2c 20 62 29 20 49 4e 20 28 53 45 . "(a, b) IN (SE
c310: 4c 45 43 54 20 2e 2e 2e 29 22 20 2d 20 63 72 65 LECT ...)" - cre
c320: 61 74 65 0a 20 20 2a 2a 20 61 20 76 69 72 74 75 ate. ** a virtu
c330: 61 6c 20 74 65 72 6d 20 66 6f 72 20 65 61 63 68 al term for each
c340: 20 76 65 63 74 6f 72 20 63 6f 6d 70 6f 6e 65 6e vector componen
c350: 74 2e 20 54 68 65 20 65 78 70 72 65 73 73 69 6f t. The expressio
c360: 6e 20 6f 62 6a 65 63 74 0a 20 20 2a 2a 20 75 73 n object. ** us
c370: 65 64 20 62 79 20 65 61 63 68 20 73 75 63 68 20 ed by each such
c380: 76 69 72 74 75 61 6c 20 74 65 72 6d 20 69 73 20 virtual term is
c390: 70 45 78 70 72 20 28 74 68 65 20 66 75 6c 6c 20 pExpr (the full
c3a0: 76 65 63 74 6f 72 20 49 4e 28 2e 2e 2e 29 20 0a vector IN(...) .
c3b0: 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 29 ** expression)
c3c0: 2e 20 54 68 65 20 57 68 65 72 65 54 65 72 6d 2e . The WhereTerm.
c3d0: 69 46 69 65 6c 64 20 76 61 72 69 61 62 6c 65 20 iField variable
c3e0: 69 64 65 6e 74 69 66 69 65 73 20 74 68 65 20 69 identifies the i
c3f0: 6e 64 65 78 20 77 69 74 68 69 6e 0a 20 20 2a 2a ndex within. **
c400: 20 74 68 65 20 76 65 63 74 6f 72 20 6f 6e 20 74 the vector on t
c410: 68 65 20 4c 48 53 20 74 68 61 74 20 74 68 65 20 he LHS that the
c420: 76 69 72 74 75 61 6c 20 74 65 72 6d 20 72 65 70 virtual term rep
c430: 72 65 73 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 resents.. **.
c440: 2a 2a 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 ** This only wor
c450: 6b 73 20 69 66 20 74 68 65 20 52 48 53 20 69 73 ks if the RHS is
c460: 20 61 20 73 69 6d 70 6c 65 20 53 45 4c 45 43 54 a simple SELECT
c470: 2c 20 6e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 , not a compound
c480: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 43 2d . */. if( pWC-
c490: 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 26 26 20 70 >op==TK_AND && p
c4a0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 Expr->op==TK_IN
c4b0: 26 26 20 70 54 65 72 6d 2d 3e 69 46 69 65 6c 64 && pTerm->iField
c4c0: 3d 3d 30 0a 20 20 20 26 26 20 70 45 78 70 72 2d ==0. && pExpr-
c4d0: 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 >pLeft->op==TK_V
c4e0: 45 43 54 4f 52 0a 20 20 20 26 26 20 70 45 78 70 ECTOR. && pExp
c4f0: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 50 r->x.pSelect->pP
c500: 72 69 6f 72 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 rior==0. ){.
c510: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 int i;. for(
c520: 69 3d 30 3b 20 69 3c 73 71 6c 69 74 65 33 45 78 i=0; i<sqlite3Ex
c530: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 prVectorSize(pEx
c540: 70 72 2d 3e 70 4c 65 66 74 29 3b 20 69 2b 2b 29 pr->pLeft); i++)
c550: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e {. int idxN
c560: 65 77 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77 ew;. idxNew
c570: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e = whereClauseIn
c580: 73 65 72 74 28 70 57 43 2c 20 70 45 78 70 72 2c sert(pWC, pExpr,
c590: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 3b 0a TERM_VIRTUAL);.
c5a0: 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 pWC->a[idx
c5b0: 4e 65 77 5d 2e 69 46 69 65 6c 64 20 3d 20 69 2b New].iField = i+
c5c0: 31 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e 61 1;. exprAna
c5d0: 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 lyze(pSrc, pWC,
c5e0: 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 6d idxNew);. m
c5f0: 61 72 6b 54 65 72 6d 41 73 43 68 69 6c 64 28 70 arkTermAsChild(p
c600: 57 43 2c 20 69 64 78 4e 65 77 2c 20 69 64 78 54 WC, idxNew, idxT
c610: 65 72 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a erm);. }. }.
c620: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 .#ifdef SQLITE_E
c630: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 NABLE_STAT3_OR_S
c640: 54 41 54 34 0a 20 20 2f 2a 20 57 68 65 6e 20 73 TAT4. /* When s
c650: 71 6c 69 74 65 5f 73 74 61 74 33 20 68 69 73 74 qlite_stat3 hist
c660: 6f 67 72 61 6d 20 64 61 74 61 20 69 73 20 61 76 ogram data is av
c670: 61 69 6c 61 62 6c 65 20 61 6e 20 6f 70 65 72 61 ailable an opera
c680: 74 6f 72 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 tor of the. **
c690: 66 6f 72 6d 20 22 78 20 49 53 20 4e 4f 54 20 4e form "x IS NOT N
c6a0: 55 4c 4c 22 20 63 61 6e 20 73 6f 6d 65 74 69 6d ULL" can sometim
c6b0: 65 73 20 62 65 20 65 76 61 6c 75 61 74 65 64 20 es be evaluated
c6c0: 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 6c 79 more efficiently
c6d0: 0a 20 20 2a 2a 20 61 73 20 22 78 3e 4e 55 4c 4c . ** as "x>NULL
c6e0: 22 20 69 66 20 78 20 69 73 20 6e 6f 74 20 61 6e " if x is not an
c6f0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY
c700: 20 4b 45 59 2e 20 20 53 6f 20 63 6f 6e 73 74 72 KEY. So constr
c710: 75 63 74 20 61 0a 20 20 2a 2a 20 76 69 72 74 75 uct a. ** virtu
c720: 61 6c 20 74 65 72 6d 20 6f 66 20 74 68 61 74 20 al term of that
c730: 66 6f 72 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 form.. **. **
c740: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 76 69 Note that the vi
c750: 72 74 75 61 6c 20 74 65 72 6d 20 6d 75 73 74 20 rtual term must
c760: 62 65 20 74 61 67 67 65 64 20 77 69 74 68 20 54 be tagged with T
c770: 45 52 4d 5f 56 4e 55 4c 4c 2e 0a 20 20 2a 2f 0a ERM_VNULL.. */.
c780: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d if( pExpr->op=
c790: 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 =TK_NOTNULL. &
c7a0: 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e & pExpr->pLeft->
c7b0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 op==TK_COLUMN.
c7c0: 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 && pExpr->pLeft
c7d0: 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 ->iColumn>=0.
c7e0: 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 && OptimizationE
c7f0: 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 nabled(db, SQLIT
c800: 45 5f 53 74 61 74 33 34 29 0a 20 20 29 7b 0a 20 E_Stat34). ){.
c810: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 Expr *pNewExp
c820: 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 r;. Expr *pLe
c830: 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 ft = pExpr->pLef
c840: 74 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 t;. int idxNe
c850: 77 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d w;. WhereTerm
c860: 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 0a 20 20 20 *pNewTerm;..
c870: 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 pNewExpr = sqli
c880: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c te3PExpr(pParse,
c890: 20 54 4b 5f 47 54 2c 0a 20 20 20 20 20 20 20 20 TK_GT,.
c8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
c8b0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 sqlite3ExprD
c8c0: 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 up(db, pLeft, 0)
c8d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
c8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 sq
c8f0: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 lite3ExprAlloc(d
c900: 62 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 b, TK_NULL, 0, 0
c910: 29 29 3b 0a 0a 20 20 20 20 69 64 78 4e 65 77 20 ));.. idxNew
c920: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 = whereClauseIns
c930: 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 ert(pWC, pNewExp
c940: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 r,.
c950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
c960: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 TERM_VIRTUAL|TE
c970: 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f RM_DYNAMIC|TERM_
c980: 56 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 28 20 VNULL);. if(
c990: 69 64 78 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 idxNew ){.
c9a0: 70 4e 65 77 54 65 72 6d 20 3d 20 26 70 57 43 2d pNewTerm = &pWC-
c9b0: 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 >a[idxNew];.
c9c0: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 pNewTerm->prer
c9d0: 65 71 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 eqRight = 0;.
c9e0: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 pNewTerm->lef
c9f0: 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d tCursor = pLeft-
ca00: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 >iTable;. p
ca10: 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 NewTerm->u.leftC
ca20: 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 olumn = pLeft->i
ca30: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e Column;. pN
ca40: 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f ewTerm->eOperato
ca50: 72 20 3d 20 57 4f 5f 47 54 3b 0a 20 20 20 20 20 r = WO_GT;.
ca60: 20 6d 61 72 6b 54 65 72 6d 41 73 43 68 69 6c 64 markTermAsChild
ca70: 28 70 57 43 2c 20 69 64 78 4e 65 77 2c 20 69 64 (pWC, idxNew, id
ca80: 78 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 70 54 xTerm);. pT
ca90: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 erm = &pWC->a[id
caa0: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 xTerm];. pT
cab0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 erm->wtFlags |=
cac0: 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 TERM_COPIED;.
cad0: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 pNewTerm->pre
cae0: 72 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e reqAll = pTerm->
caf0: 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d prereqAll;. }
cb00: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 . }.#endif /* S
cb10: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 QLITE_ENABLE_STA
cb20: 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a T3_OR_STAT4 */..
cb30: 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 4f 4e 20 /* Prevent ON
cb40: 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20 clause terms of
cb50: 61 20 4c 45 46 54 20 4a 4f 49 4e 20 66 72 6f 6d a LEFT JOIN from
cb60: 20 62 65 69 6e 67 20 75 73 65 64 20 74 6f 20 64 being used to d
cb70: 72 69 76 65 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 rive. ** an ind
cb80: 65 78 20 66 6f 72 20 74 61 62 6c 65 73 20 74 6f ex for tables to
cb90: 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 the left of the
cba0: 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 74 65 join.. */. te
cbb0: 73 74 63 61 73 65 28 20 70 54 65 72 6d 21 3d 26 stcase( pTerm!=&
cbc0: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 20 pWC->a[idxTerm]
cbd0: 29 3b 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57 );. pTerm = &pW
cbe0: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 C->a[idxTerm];.
cbf0: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 pTerm->prereqRi
cc00: 67 68 74 20 7c 3d 20 65 78 74 72 61 52 69 67 68 ght |= extraRigh
cc10: 74 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a t;.}../*********
cc20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
cc30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
cc40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
cc50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
cc60: 2a 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 77 **.** Routines w
cc70: 69 74 68 20 66 69 6c 65 20 73 63 6f 70 65 20 61 ith file scope a
cc80: 62 6f 76 65 2e 20 20 49 6e 74 65 72 66 61 63 65 bove. Interface
cc90: 20 74 6f 20 74 68 65 20 72 65 73 74 20 6f 66 20 to the rest of
cca0: 74 68 65 20 77 68 65 72 65 2e 63 0a 2a 2a 20 73 the where.c.** s
ccb0: 75 62 73 79 73 74 65 6d 20 66 6f 6c 6c 6f 77 73 ubsystem follows
ccc0: 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ..**************
ccd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
cce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
ccf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
cd00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a *************/..
cd10: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 /*.** This routi
cd20: 6e 65 20 69 64 65 6e 74 69 66 69 65 73 20 73 75 ne identifies su
cd30: 62 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 bexpressions in
cd40: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 the WHERE clause
cd50: 20 77 68 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 where.** each s
cd60: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 ubexpression is
cd70: 73 65 70 61 72 61 74 65 64 20 62 79 20 74 68 65 separated by the
cd80: 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 6f 72 AND operator or
cd90: 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f some other.** o
cda0: 70 65 72 61 74 6f 72 20 73 70 65 63 69 66 69 65 perator specifie
cdb0: 64 20 69 6e 20 74 68 65 20 6f 70 20 70 61 72 61 d in the op para
cdc0: 6d 65 74 65 72 2e 20 20 54 68 65 20 57 68 65 72 meter. The Wher
cdd0: 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 eClause structur
cde0: 65 0a 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20 77 e.** is filled w
cdf0: 69 74 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 ith pointers to
ce00: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 subexpressions.
ce10: 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a For example:.**
ce20: 0a 2a 2a 20 20 20 20 57 48 45 52 45 20 20 61 3d .** WHERE a=
ce30: 3d 27 68 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 ='hello' AND coa
ce40: 6c 65 73 63 65 28 62 2c 31 31 29 3c 31 30 20 41 lesce(b,11)<10 A
ce50: 4e 44 20 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 ND (c+12!=d OR c
ce60: 3d 3d 32 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 ==22).**
ce70: 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 \________/
ce80: 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f \_____________
ce90: 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f __/ \_______
cea0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 _________/.**
ceb0: 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d slot[0]
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 slot
ced0: 5b 31 5d 20 20 20 20 20 20 20 20 20 20 20 20 20 [1]
cee0: 20 20 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 slot[2].**.**
cef0: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 The original WHE
cf00: 52 45 20 63 6c 61 75 73 65 20 69 6e 20 70 45 78 RE clause in pEx
cf10: 70 72 20 69 73 20 75 6e 61 6c 74 65 72 65 64 2e pr is unaltered.
cf20: 20 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 All this routi
cf30: 6e 65 0a 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 ne.** does is ma
cf40: 6b 65 20 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 ke slot[] entrie
cf50: 73 20 70 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 s point to subst
cf60: 72 75 63 74 75 72 65 20 77 69 74 68 69 6e 20 70 ructure within p
cf70: 45 78 70 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 Expr..**.** In t
cf80: 68 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 he previous sent
cf90: 65 6e 63 65 20 61 6e 64 20 69 6e 20 74 68 65 20 ence and in the
cfa0: 64 69 61 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d diagram, "slot[]
cfb0: 22 20 72 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 " refers to.** t
cfc0: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 2e 61 he WhereClause.a
cfd0: 5b 5d 20 61 72 72 61 79 2e 20 20 54 68 65 20 73 [] array. The s
cfe0: 6c 6f 74 5b 5d 20 61 72 72 61 79 20 67 72 6f 77 lot[] array grow
cff0: 73 20 61 73 20 6e 65 65 64 65 64 20 74 6f 20 63 s as needed to c
d000: 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65 ontain.** all te
d010: 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 rms of the WHERE
d020: 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 76 6f 69 64 clause..*/.void
d030: 20 73 71 6c 69 74 65 33 57 68 65 72 65 53 70 6c sqlite3WhereSpl
d040: 69 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a it(WhereClause *
d050: 70 57 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 pWC, Expr *pExpr
d060: 2c 20 75 38 20 6f 70 29 7b 0a 20 20 45 78 70 72 , u8 op){. Expr
d070: 20 2a 70 45 32 20 3d 20 73 71 6c 69 74 65 33 45 *pE2 = sqlite3E
d080: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 xprSkipCollate(p
d090: 45 78 70 72 29 3b 0a 20 20 70 57 43 2d 3e 6f 70 Expr);. pWC->op
d0a0: 20 3d 20 6f 70 3b 0a 20 20 69 66 28 20 70 45 32 = op;. if( pE2
d0b0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 ==0 ) return;.
d0c0: 69 66 28 20 70 45 32 2d 3e 6f 70 21 3d 6f 70 20 if( pE2->op!=op
d0d0: 29 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 ){. whereClau
d0e0: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 45 seInsert(pWC, pE
d0f0: 78 70 72 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 xpr, 0);. }else
d100: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 {. sqlite3Whe
d110: 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45 32 reSplit(pWC, pE2
d120: 2d 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20 20 ->pLeft, op);.
d130: 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 53 70 sqlite3WhereSp
d140: 6c 69 74 28 70 57 43 2c 20 70 45 32 2d 3e 70 52 lit(pWC, pE2->pR
d150: 69 67 68 74 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d ight, op);. }.}
d160: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 ../*.** Initiali
d170: 7a 65 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 ze a preallocate
d180: 64 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 d WhereClause st
d190: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 ructure..*/.void
d1a0: 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61 sqlite3WhereCla
d1b0: 75 73 65 49 6e 69 74 28 0a 20 20 57 68 65 72 65 useInit(. Where
d1c0: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 Clause *pWC,
d1d0: 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 /* The Where
d1e0: 43 6c 61 75 73 65 20 74 6f 20 62 65 20 69 6e 69 Clause to be ini
d1f0: 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 tialized */. Wh
d200: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 ereInfo *pWInfo
d210: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 /* The WH
d220: 45 52 45 20 70 72 6f 63 65 73 73 69 6e 67 20 63 ERE processing c
d230: 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 70 ontext */.){. p
d240: 57 43 2d 3e 70 57 49 6e 66 6f 20 3d 20 70 57 49 WC->pWInfo = pWI
d250: 6e 66 6f 3b 0a 20 20 70 57 43 2d 3e 70 4f 75 74 nfo;. pWC->pOut
d260: 65 72 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e er = 0;. pWC->n
d270: 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 57 43 2d Term = 0;. pWC-
d280: 3e 6e 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 >nSlot = ArraySi
d290: 7a 65 28 70 57 43 2d 3e 61 53 74 61 74 69 63 29 ze(pWC->aStatic)
d2a0: 3b 0a 20 20 70 57 43 2d 3e 61 20 3d 20 70 57 43 ;. pWC->a = pWC
d2b0: 2d 3e 61 53 74 61 74 69 63 3b 0a 7d 0a 0a 2f 2a ->aStatic;.}../*
d2c0: 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 .** Deallocate a
d2d0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 WhereClause str
d2e0: 75 63 74 75 72 65 2e 20 20 54 68 65 20 57 68 65 ucture. The Whe
d2f0: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 reClause structu
d300: 72 65 0a 2a 2a 20 69 74 73 65 6c 66 20 69 73 20 re.** itself is
d310: 6e 6f 74 20 66 72 65 65 64 2e 20 20 54 68 69 73 not freed. This
d320: 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 routine is the
d330: 69 6e 76 65 72 73 65 20 6f 66 0a 2a 2a 20 73 71 inverse of.** sq
d340: 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75 73 65 lite3WhereClause
d350: 49 6e 69 74 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 Init()..*/.void
d360: 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75 sqlite3WhereClau
d370: 73 65 43 6c 65 61 72 28 57 68 65 72 65 43 6c 61 seClear(WhereCla
d380: 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 69 6e 74 use *pWC){. int
d390: 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 i;. WhereTerm
d3a0: 2a 61 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 *a;. sqlite3 *d
d3b0: 62 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d b = pWC->pWInfo-
d3c0: 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 66 >pParse->db;. f
d3d0: 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d or(i=pWC->nTerm-
d3e0: 31 2c 20 61 3d 70 57 43 2d 3e 61 3b 20 69 3e 3d 1, a=pWC->a; i>=
d3f0: 30 3b 20 69 2d 2d 2c 20 61 2b 2b 29 7b 0a 20 20 0; i--, a++){.
d400: 20 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 if( a->wtFlags
d410: 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 & TERM_DYNAMIC
d420: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 ){. sqlite3
d430: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 61 ExprDelete(db, a
d440: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a ->pExpr);. }.
d450: 20 20 20 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 if( a->wtFla
d460: 67 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f gs & TERM_ORINFO
d470: 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4f ){. whereO
d480: 72 49 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c 20 rInfoDelete(db,
d490: 61 2d 3e 75 2e 70 4f 72 49 6e 66 6f 29 3b 0a 20 a->u.pOrInfo);.
d4a0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 2d 3e }else if( a->
d4b0: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 41 wtFlags & TERM_A
d4c0: 4e 44 49 4e 46 4f 20 29 7b 0a 20 20 20 20 20 20 NDINFO ){.
d4d0: 77 68 65 72 65 41 6e 64 49 6e 66 6f 44 65 6c 65 whereAndInfoDele
d4e0: 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70 41 6e 64 te(db, a->u.pAnd
d4f0: 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d Info);. }. }
d500: 0a 20 20 69 66 28 20 70 57 43 2d 3e 61 21 3d 70 . if( pWC->a!=p
d510: 57 43 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a 20 WC->aStatic ){.
d520: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 sqlite3DbFree
d530: 28 64 62 2c 20 70 57 43 2d 3e 61 29 3b 0a 20 20 (db, pWC->a);.
d540: 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 }.}.../*.** Thes
d550: 65 20 72 6f 75 74 69 6e 65 73 20 77 61 6c 6b 20 e routines walk
d560: 28 72 65 63 75 72 73 69 76 65 6c 79 29 20 61 6e (recursively) an
d570: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 expression tree
d580: 20 61 6e 64 20 67 65 6e 65 72 61 74 65 0a 2a 2a and generate.**
d590: 20 61 20 62 69 74 6d 61 73 6b 20 69 6e 64 69 63 a bitmask indic
d5a0: 61 74 69 6e 67 20 77 68 69 63 68 20 74 61 62 6c ating which tabl
d5b0: 65 73 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 es are used in t
d5c0: 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a hat expression.*
d5d0: 2a 20 74 72 65 65 2e 0a 2a 2f 0a 42 69 74 6d 61 * tree..*/.Bitma
d5e0: 73 6b 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 sk sqlite3WhereE
d5f0: 78 70 72 55 73 61 67 65 28 57 68 65 72 65 4d 61 xprUsage(WhereMa
d600: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c skSet *pMaskSet,
d610: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69 74 Expr *p){. Bit
d620: 6d 61 73 6b 20 6d 61 73 6b 3b 0a 20 20 69 66 28 mask mask;. if(
d630: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 p==0 ) return 0
d640: 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 ;. if( p->op==T
d650: 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 K_COLUMN ){.
d660: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 57 68 return sqlite3Wh
d670: 65 72 65 47 65 74 4d 61 73 6b 28 70 4d 61 73 6b ereGetMask(pMask
d680: 53 65 74 2c 20 70 2d 3e 69 54 61 62 6c 65 29 3b Set, p->iTable);
d690: 0a 20 20 7d 0a 20 20 6d 61 73 6b 20 3d 20 28 70 . }. mask = (p
d6a0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c ->op==TK_IF_NULL
d6b0: 5f 52 4f 57 29 20 3f 20 73 71 6c 69 74 65 33 57 _ROW) ? sqlite3W
d6c0: 68 65 72 65 47 65 74 4d 61 73 6b 28 70 4d 61 73 hereGetMask(pMas
d6d0: 6b 53 65 74 2c 20 70 2d 3e 69 54 61 62 6c 65 29 kSet, p->iTable)
d6e0: 20 3a 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 : 0;. assert(
d6f0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 !ExprHasProperty
d700: 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 (p, EP_TokenOnly
d710: 29 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c ) );. if( p->pL
d720: 65 66 74 20 29 20 6d 61 73 6b 20 7c 3d 20 73 71 eft ) mask |= sq
d730: 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 55 73 lite3WhereExprUs
d740: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d age(pMaskSet, p-
d750: 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70 >pLeft);. if( p
d760: 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 ->pRight ){.
d770: 6d 61 73 6b 20 7c 3d 20 73 71 6c 69 74 65 33 57 mask |= sqlite3W
d780: 68 65 72 65 45 78 70 72 55 73 61 67 65 28 70 4d hereExprUsage(pM
d790: 61 73 6b 53 65 74 2c 20 70 2d 3e 70 52 69 67 68 askSet, p->pRigh
d7a0: 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 t);. assert(
d7b0: 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 29 3b p->x.pList==0 );
d7c0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 45 78 70 . }else if( Exp
d7d0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 rHasProperty(p,
d7e0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b EP_xIsSelect) ){
d7f0: 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 . if( ExprHas
d800: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 56 Property(p, EP_V
d810: 61 72 53 65 6c 65 63 74 29 20 29 20 70 4d 61 73 arSelect) ) pMas
d820: 6b 53 65 74 2d 3e 62 56 61 72 53 65 6c 65 63 74 kSet->bVarSelect
d830: 20 3d 20 31 3b 0a 20 20 20 20 6d 61 73 6b 20 7c = 1;. mask |
d840: 3d 20 65 78 70 72 53 65 6c 65 63 74 55 73 61 67 = exprSelectUsag
d850: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 78 e(pMaskSet, p->x
d860: 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 65 6c .pSelect);. }el
d870: 73 65 20 69 66 28 20 70 2d 3e 78 2e 70 4c 69 73 se if( p->x.pLis
d880: 74 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d t ){. mask |=
d890: 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 sqlite3WhereExp
d8a0: 72 4c 69 73 74 55 73 61 67 65 28 70 4d 61 73 6b rListUsage(pMask
d8b0: 53 65 74 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 Set, p->x.pList)
d8c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d ;. }. return m
d8d0: 61 73 6b 3b 0a 7d 0a 42 69 74 6d 61 73 6b 20 73 ask;.}.Bitmask s
d8e0: 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 4c qlite3WhereExprL
d8f0: 69 73 74 55 73 61 67 65 28 57 68 65 72 65 4d 61 istUsage(WhereMa
d900: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c skSet *pMaskSet,
d910: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 ExprList *pList
d920: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42 69 ){. int i;. Bi
d930: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a tmask mask = 0;.
d940: 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 if( pList ){.
d950: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c for(i=0; i<pL
d960: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 ist->nExpr; i++)
d970: 7b 0a 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 {. mask |=
d980: 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 sqlite3WhereExpr
d990: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 Usage(pMaskSet,
d9a0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 pList->a[i].pExp
d9b0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 r);. }. }.
d9c0: 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a return mask;.}..
d9d0: 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 65 78 70 72 ./*.** Call expr
d9e0: 41 6e 61 6c 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 Analyze on all t
d9f0: 65 72 6d 73 20 69 6e 20 61 20 57 48 45 52 45 20 erms in a WHERE
da00: 63 6c 61 75 73 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 clause. .**.**
da10: 4e 6f 74 65 20 74 68 61 74 20 65 78 70 72 41 6e Note that exprAn
da20: 61 6c 79 7a 65 28 29 20 6d 69 67 68 74 20 61 64 alyze() might ad
da30: 64 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 d new virtual te
da40: 72 6d 73 20 6f 6e 74 6f 20 74 68 65 0a 2a 2a 20 rms onto the.**
da50: 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 end of the WHERE
da60: 20 63 6c 61 75 73 65 2e 20 20 57 65 20 64 6f 20 clause. We do
da70: 6e 6f 74 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c not want to anal
da80: 79 7a 65 20 74 68 65 73 65 20 6e 65 77 0a 2a 2a yze these new.**
da90: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 2c 20 virtual terms,
daa0: 73 6f 20 73 74 61 72 74 20 61 6e 61 6c 79 7a 69 so start analyzi
dab0: 6e 67 20 61 74 20 74 68 65 20 65 6e 64 20 61 6e ng at the end an
dac0: 64 20 77 6f 72 6b 20 66 6f 72 77 61 72 64 0a 2a d work forward.*
dad0: 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 61 64 * so that the ad
dae0: 64 65 64 20 76 69 72 74 75 61 6c 20 74 65 72 6d ded virtual term
daf0: 73 20 61 72 65 20 6e 65 76 65 72 20 70 72 6f 63 s are never proc
db00: 65 73 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 essed..*/.void s
db10: 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 41 qlite3WhereExprA
db20: 6e 61 6c 79 7a 65 28 0a 20 20 53 72 63 4c 69 73 nalyze(. SrcLis
db30: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 t *pTabList,
db40: 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 /* the FROM c
db50: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 lause */. Where
db60: 43 6c 61 75 73 65 20 2a 70 57 43 20 20 20 20 20 Clause *pWC
db70: 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 /* the WHERE
db80: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 61 6e clause to be an
db90: 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 alyzed */.){. i
dba0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57 nt i;. for(i=pW
dbb0: 43 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 C->nTerm-1; i>=0
dbc0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72 ; i--){. expr
dbd0: 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73 74 Analyze(pTabList
dbe0: 2c 20 70 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d , pWC, i);. }.}
dbf0: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 61 62 6c ../*.** For tabl
dc00: 65 2d 76 61 6c 75 65 64 2d 66 75 6e 63 74 69 6f e-valued-functio
dc10: 6e 73 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 ns, transform th
dc20: 65 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d e function argum
dc30: 65 6e 74 73 20 69 6e 74 6f 0a 2a 2a 20 6e 65 77 ents into.** new
dc40: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 WHERE clause te
dc50: 72 6d 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 45 61 63 rms. .**.** Eac
dc60: 68 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d h function argum
dc70: 65 6e 74 20 74 72 61 6e 73 6c 61 74 65 73 20 69 ent translates i
dc80: 6e 74 6f 20 61 6e 20 65 71 75 61 6c 69 74 79 20 nto an equality
dc90: 63 6f 6e 73 74 72 61 69 6e 74 20 61 67 61 69 6e constraint again
dca0: 73 74 0a 2a 2a 20 61 20 48 49 44 44 45 4e 20 63 st.** a HIDDEN c
dcb0: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 olumn in the tab
dcc0: 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 le..*/.void sqli
dcd0: 74 65 33 57 68 65 72 65 54 61 62 46 75 6e 63 41 te3WhereTabFuncA
dce0: 72 67 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 rgs(. Parse *pP
dcf0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 arse,
dd00: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 /* Pars
dd10: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 ing context */.
dd20: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f struct SrcList_
dd30: 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 20 20 20 item *pItem,
dd40: 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 /* The FROM c
dd50: 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 70 72 lause term to pr
dd60: 6f 63 65 73 73 20 2a 2f 0a 20 20 57 68 65 72 65 ocess */. Where
dd70: 43 6c 61 75 73 65 20 2a 70 57 43 20 20 20 20 20 Clause *pWC
dd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
dd90: 58 66 65 72 20 66 75 6e 63 74 69 6f 6e 20 61 72 Xfer function ar
dda0: 67 75 6d 65 6e 74 73 20 74 6f 20 68 65 72 65 20 guments to here
ddb0: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 */.){. Table *p
ddc0: 54 61 62 3b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b Tab;. int j, k;
ddd0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 41 72 . ExprList *pAr
dde0: 67 73 3b 0a 20 20 45 78 70 72 20 2a 70 43 6f 6c gs;. Expr *pCol
ddf0: 52 65 66 3b 0a 20 20 45 78 70 72 20 2a 70 54 65 Ref;. Expr *pTe
de00: 72 6d 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d rm;. if( pItem-
de10: 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 >fg.isTabFunc==0
de20: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 61 ) return;. pTa
de30: 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b b = pItem->pTab;
de40: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21 . assert( pTab!
de50: 3d 30 20 29 3b 0a 20 20 70 41 72 67 73 20 3d 20 =0 );. pArgs =
de60: 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 pItem->u1.pFuncA
de70: 72 67 3b 0a 20 20 69 66 28 20 70 41 72 67 73 3d rg;. if( pArgs=
de80: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 =0 ) return;. f
de90: 6f 72 28 6a 3d 6b 3d 30 3b 20 6a 3c 70 41 72 67 or(j=k=0; j<pArg
dea0: 73 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a s->nExpr; j++){.
deb0: 20 20 20 20 77 68 69 6c 65 28 20 6b 3c 70 54 61 while( k<pTa
dec0: 62 2d 3e 6e 43 6f 6c 20 26 26 20 28 70 54 61 62 b->nCol && (pTab
ded0: 2d 3e 61 43 6f 6c 5b 6b 5d 2e 63 6f 6c 46 6c 61 ->aCol[k].colFla
dee0: 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 48 49 44 gs & COLFLAG_HID
def0: 44 45 4e 29 3d 3d 30 20 29 7b 6b 2b 2b 3b 7d 0a DEN)==0 ){k++;}.
df00: 20 20 20 20 69 66 28 20 6b 3e 3d 70 54 61 62 2d if( k>=pTab-
df10: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 >nCol ){. s
df20: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 qlite3ErrorMsg(p
df30: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 Parse, "too many
df40: 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20 25 73 arguments on %s
df50: 28 29 20 2d 20 6d 61 78 20 25 64 22 2c 0a 20 20 () - max %d",.
df60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
df70: 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c pTab->zName,
df80: 20 6a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 j);. retur
df90: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f n;. }. pCo
dfa0: 6c 52 65 66 20 3d 20 73 71 6c 69 74 65 33 45 78 lRef = sqlite3Ex
dfb0: 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e prAlloc(pParse->
dfc0: 64 62 2c 20 54 4b 5f 43 4f 4c 55 4d 4e 2c 20 30 db, TK_COLUMN, 0
dfd0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 , 0);. if( pC
dfe0: 6f 6c 52 65 66 3d 3d 30 20 29 20 72 65 74 75 72 olRef==0 ) retur
dff0: 6e 3b 0a 20 20 20 20 70 43 6f 6c 52 65 66 2d 3e n;. pColRef->
e000: 69 54 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e iTable = pItem->
e010: 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 43 6f iCursor;. pCo
e020: 6c 52 65 66 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 lRef->iColumn =
e030: 6b 2b 2b 3b 0a 20 20 20 20 70 43 6f 6c 52 65 66 k++;. pColRef
e040: 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 ->pTab = pTab;.
e050: 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 pTerm = sqlit
e060: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 e3PExpr(pParse,
e070: 54 4b 5f 45 51 2c 20 70 43 6f 6c 52 65 66 2c 0a TK_EQ, pColRef,.
e080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
e090: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 sqlite3
e0a0: 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e ExprDup(pParse->
e0b0: 64 62 2c 20 70 41 72 67 73 2d 3e 61 5b 6a 5d 2e db, pArgs->a[j].
e0c0: 70 45 78 70 72 2c 20 30 29 29 3b 0a 20 20 20 20 pExpr, 0));.
e0d0: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 whereClauseInser
e0e0: 74 28 70 57 43 2c 20 70 54 65 72 6d 2c 20 54 45 t(pWC, pTerm, TE
e0f0: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d RM_DYNAMIC);. }
e100: 0a 7d 0a .}.