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 20 20 = 0;
1b20: 2f 2a 20 53 74 72 69 6e 67 20 6f 6e 20 52 48 53 /* String on RHS
1b30: 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f of LIKE operato
1b40: 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 r */. Expr *pRi
1b50: 67 68 74 2c 20 2a 70 4c 65 66 74 3b 20 20 20 20 ght, *pLeft;
1b60: 20 20 2f 2a 20 52 69 67 68 74 20 61 6e 64 20 6c /* Right and l
1b70: 65 66 74 20 73 69 7a 65 20 6f 66 20 4c 49 4b 45 eft size of LIKE
1b80: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45 operator */. E
1b90: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 xprList *pList;
1ba0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 /* Lis
1bb0: 74 20 6f 66 20 6f 70 65 72 61 6e 64 73 20 74 6f t of operands to
1bc0: 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 the LIKE operat
1bd0: 6f 72 20 2a 2f 0a 20 20 75 38 20 63 3b 20 20 20 or */. u8 c;
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1bf0: 20 20 20 2f 2a 20 4f 6e 65 20 63 68 61 72 61 63 /* One charac
1c00: 74 65 72 20 69 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 ter in z[] */.
1c10: 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 int cnt;
1c20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 /* Nu
1c30: 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 mber of non-wild
1c40: 63 61 72 64 20 70 72 65 66 69 78 20 63 68 61 72 card prefix char
1c50: 61 63 74 65 72 73 20 2a 2f 0a 20 20 75 38 20 77 acters */. u8 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 20 20 2f 2a 20 57 69 6c 64 63 61 /* Wildca
1c80: 72 64 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f rd characters */
1c90: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d . sqlite3 *db =
1ca0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a pParse->db; /*
1cb0: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 Database connec
1cc0: 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 tion */. sqlite
1cd0: 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 3_value *pVal =
1ce0: 30 3b 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 0;. int op;
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1d00: 2f 2a 20 4f 70 63 6f 64 65 20 6f 66 20 70 52 69 /* Opcode of pRi
1d10: 67 68 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b ght */. int rc;
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1d30: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f /* Result co
1d40: 64 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a de to return */.
1d50: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 . if( !sqlite3I
1d60: 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 64 62 sLikeFunction(db
1d70: 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43 61 73 65 , pExpr, pnoCase
1d80: 2c 20 28 63 68 61 72 2a 29 77 63 29 20 29 7b 0a , (char*)wc) ){.
1d90: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 return 0;.
1da0: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f }.#ifdef SQLITE_
1db0: 45 42 43 44 49 43 0a 20 20 69 66 28 20 2a 70 6e EBCDIC. if( *pn
1dc0: 6f 43 61 73 65 20 29 20 72 65 74 75 72 6e 20 30 oCase ) return 0
1dd0: 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4c 69 73 74 ;.#endif. pList
1de0: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 = pExpr->x.pLis
1df0: 74 3b 0a 20 20 70 4c 65 66 74 20 3d 20 70 4c 69 t;. pLeft = pLi
1e00: 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a st->a[1].pExpr;.
1e10: 0a 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69 . pRight = sqli
1e20: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 te3ExprSkipColla
1e30: 74 65 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 te(pList->a[0].p
1e40: 45 78 70 72 29 3b 0a 20 20 6f 70 20 3d 20 70 52 Expr);. op = pR
1e50: 69 67 68 74 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 ight->op;. if(
1e60: 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 op==TK_VARIABLE
1e70: 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 && (db->flags &
1e80: 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50 53 SQLITE_EnableQPS
1e90: 47 29 3d 3d 30 20 29 7b 0a 20 20 20 20 56 64 62 G)==0 ){. Vdb
1ea0: 65 20 2a 70 52 65 70 72 65 70 61 72 65 20 3d 20 e *pReprepare =
1eb0: 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61 pParse->pReprepa
1ec0: 72 65 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c re;. int iCol
1ed0: 20 3d 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 = pRight->iColu
1ee0: 6d 6e 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20 73 mn;. pVal = s
1ef0: 71 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f 75 qlite3VdbeGetBou
1f00: 6e 64 56 61 6c 75 65 28 70 52 65 70 72 65 70 61 ndValue(pReprepa
1f10: 72 65 2c 20 69 43 6f 6c 2c 20 53 51 4c 49 54 45 re, iCol, SQLITE
1f20: 5f 41 46 46 5f 42 4c 4f 42 29 3b 0a 20 20 20 20 _AFF_BLOB);.
1f30: 69 66 28 20 70 56 61 6c 20 26 26 20 73 71 6c 69 if( pVal && sqli
1f40: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 te3_value_type(p
1f50: 56 61 6c 29 3d 3d 53 51 4c 49 54 45 5f 54 45 58 Val)==SQLITE_TEX
1f60: 54 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 T ){. z = s
1f70: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 qlite3_value_tex
1f80: 74 28 70 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 t(pVal);. }.
1f90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 sqlite3VdbeSe
1fa0: 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65 2d tVarmask(pParse-
1fb0: 3e 70 56 64 62 65 2c 20 69 43 6f 6c 29 3b 0a 20 >pVdbe, iCol);.
1fc0: 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68 assert( pRigh
1fd0: 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 t->op==TK_VARIAB
1fe0: 4c 45 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70 LE || pRight->op
1ff0: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b ==TK_REGISTER );
2000: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d . }else if( op=
2010: 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 =TK_STRING ){.
2020: 20 20 7a 20 3d 20 28 75 38 2a 29 70 52 69 67 68 z = (u8*)pRigh
2030: 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 7d t->u.zToken;. }
2040: 0a 20 20 69 66 28 20 7a 20 29 7b 0a 0a 20 20 20 . if( z ){..
2050: 20 2f 2a 20 49 66 20 74 68 65 20 52 48 53 20 62 /* If the RHS b
2060: 65 67 69 6e 73 20 77 69 74 68 20 61 20 64 69 67 egins with a dig
2070: 69 74 20 6f 72 20 61 20 6d 69 6e 75 73 20 73 69 it or a minus si
2080: 67 6e 2c 20 74 68 65 6e 20 74 68 65 20 4c 48 53 gn, then the LHS
2090: 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 must. ** be
20a0: 61 6e 20 6f 72 64 69 6e 61 72 79 20 63 6f 6c 75 an ordinary colu
20b0: 6d 6e 20 28 6e 6f 74 20 61 20 76 69 72 74 75 61 mn (not a virtua
20c0: 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 29 20 l table column)
20d0: 77 69 74 68 20 54 45 58 54 20 61 66 66 69 6e 69 with TEXT affini
20e0: 74 79 2e 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72 ty.. ** Other
20f0: 77 69 73 65 20 74 68 65 20 4c 48 53 20 6d 69 67 wise the LHS mig
2100: 68 74 20 62 65 20 6e 75 6d 65 72 69 63 20 61 6e ht be numeric an
2110: 64 20 22 6c 68 73 20 3e 3d 20 72 68 73 22 20 77 d "lhs >= rhs" w
2120: 6f 75 6c 64 20 62 65 20 66 61 6c 73 65 0a 20 20 ould be false.
2130: 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 ** even though
2140: 20 22 6c 68 73 20 4c 49 4b 45 20 72 68 73 22 20 "lhs LIKE rhs"
2150: 69 73 20 74 72 75 65 2e 20 20 42 75 74 20 69 66 is true. But if
2160: 20 74 68 65 20 52 48 53 20 64 6f 65 73 20 6e 6f the RHS does no
2170: 74 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 77 t start. ** w
2180: 69 74 68 20 61 20 64 69 67 69 74 20 6f 72 20 27 ith a digit or '
2190: 2d 27 2c 20 74 68 65 6e 20 22 6c 68 73 20 4c 49 -', then "lhs LI
21a0: 4b 45 20 72 68 73 22 20 77 69 6c 6c 20 61 6c 77 KE rhs" will alw
21b0: 61 79 73 20 62 65 20 66 61 6c 73 65 20 69 66 0a ays be false if.
21c0: 20 20 20 20 2a 2a 20 74 68 65 20 4c 48 53 20 69 ** the LHS i
21d0: 73 20 6e 75 6d 65 72 69 63 20 61 6e 64 20 73 6f s numeric and so
21e0: 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f the optimizatio
21f0: 6e 20 73 74 69 6c 6c 20 77 6f 72 6b 73 2e 0a 20 n still works..
2200: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 */. if( sq
2210: 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 5b 30 lite3Isdigit(z[0
2220: 5d 29 20 7c 7c 20 7a 5b 30 5d 3d 3d 27 2d 27 20 ]) || z[0]=='-'
2230: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 ){. if( pLe
2240: 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d ft->op!=TK_COLUM
2250: 4e 20 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c N . || sql
2260: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 ite3ExprAffinity
2270: 28 70 4c 65 66 74 29 21 3d 53 51 4c 49 54 45 5f (pLeft)!=SQLITE_
2280: 41 46 46 5f 54 45 58 54 20 0a 20 20 20 20 20 20 AFF_TEXT .
2290: 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 4c || IsVirtual(pL
22a0: 65 66 74 2d 3e 70 54 61 62 29 20 20 2f 2a 20 56 eft->pTab) /* V
22b0: 61 6c 75 65 20 6d 69 67 68 74 20 62 65 20 6e 75 alue might be nu
22c0: 6d 65 72 69 63 20 2a 2f 0a 20 20 20 20 20 20 29 meric */. )
22d0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 {. sqlite
22e0: 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3ValueFree(pVal)
22f0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e ;. return
2300: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 0;. }.
2310: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 75 6e 74 20 }.. /* Count
2320: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 72 the number of pr
2330: 65 66 69 78 20 63 68 61 72 61 63 74 65 72 73 20 efix characters
2340: 70 72 69 6f 72 20 74 6f 20 74 68 65 20 66 69 72 prior to the fir
2350: 73 74 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 st wildcard */.
2360: 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 cnt = 0;.
2370: 77 68 69 6c 65 28 20 28 63 3d 7a 5b 63 6e 74 5d while( (c=z[cnt]
2380: 29 21 3d 30 20 26 26 20 63 21 3d 77 63 5b 30 5d )!=0 && c!=wc[0]
2390: 20 26 26 20 63 21 3d 77 63 5b 31 5d 20 26 26 20 && c!=wc[1] &&
23a0: 63 21 3d 77 63 5b 32 5d 20 29 7b 0a 20 20 20 20 c!=wc[2] ){.
23b0: 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 cnt++;. i
23c0: 66 28 20 63 3d 3d 77 63 5b 33 5d 20 26 26 20 7a f( c==wc[3] && z
23d0: 5b 63 6e 74 5d 21 3d 30 20 29 20 63 6e 74 2b 2b [cnt]!=0 ) cnt++
23e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
23f0: 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e The optimization
2400: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e 6c is possible onl
2410: 79 20 69 66 20 28 31 29 20 74 68 65 20 70 61 74 y if (1) the pat
2420: 74 65 72 6e 20 64 6f 65 73 20 6e 6f 74 20 62 65 tern does not be
2430: 67 69 6e 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 gin. ** with
2440: 61 20 77 69 6c 64 63 61 72 64 20 61 6e 64 20 69 a wildcard and i
2450: 66 20 28 32 29 20 74 68 65 20 6e 6f 6e 2d 77 69 f (2) the non-wi
2460: 6c 64 63 61 72 64 20 70 72 65 66 69 78 20 64 6f ldcard prefix do
2470: 65 73 20 6e 6f 74 20 65 6e 64 20 77 69 74 68 0a es not end with.
2480: 20 20 20 20 2a 2a 20 61 6e 20 28 69 6c 6c 65 67 ** an (illeg
2490: 61 6c 20 30 78 66 66 29 20 63 68 61 72 61 63 74 al 0xff) charact
24a0: 65 72 2c 20 6f 72 20 28 33 29 20 74 68 65 20 70 er, or (3) the p
24b0: 61 74 74 65 72 6e 20 64 6f 65 73 20 6e 6f 74 20 attern does not
24c0: 63 6f 6e 73 69 73 74 20 6f 66 0a 20 20 20 20 2a consist of. *
24d0: 2a 20 61 20 73 69 6e 67 6c 65 20 65 73 63 61 70 * a single escap
24e0: 65 20 63 68 61 72 61 63 74 65 72 2e 20 54 68 65 e character. The
24f0: 20 73 65 63 6f 6e 64 20 63 6f 6e 64 69 74 69 6f second conditio
2500: 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 73 n is necessary s
2510: 6f 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 o. ** that we
2520: 20 63 61 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 can increment t
2530: 68 65 20 70 72 65 66 69 78 20 6b 65 79 20 74 6f he prefix key to
2540: 20 66 69 6e 64 20 61 6e 20 75 70 70 65 72 20 62 find an upper b
2550: 6f 75 6e 64 20 66 6f 72 20 74 68 65 0a 20 20 20 ound for the.
2560: 20 2a 2a 20 72 61 6e 67 65 20 73 65 61 72 63 68 ** range search
2570: 2e 20 54 68 65 20 74 68 69 72 64 20 69 73 20 62 . The third is b
2580: 65 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c 65 ecause the calle
2590: 72 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 r assumes that t
25a0: 68 65 20 70 61 74 74 65 72 6e 0a 20 20 20 20 2a he pattern. *
25b0: 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 74 * consists of at
25c0: 20 6c 65 61 73 74 20 6f 6e 65 20 63 68 61 72 61 least one chara
25d0: 63 74 65 72 20 61 66 74 65 72 20 61 6c 6c 20 65 cter after all e
25e0: 73 63 61 70 65 73 20 68 61 76 65 20 62 65 65 6e scapes have been
25f0: 0a 20 20 20 20 2a 2a 20 72 65 6d 6f 76 65 64 2e . ** removed.
2600: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e 74 */. if( cnt
2610: 21 3d 30 20 26 26 20 32 35 35 21 3d 28 75 38 29 !=0 && 255!=(u8)
2620: 7a 5b 63 6e 74 2d 31 5d 20 26 26 20 28 63 6e 74 z[cnt-1] && (cnt
2630: 3e 31 20 7c 7c 20 7a 5b 30 5d 21 3d 77 63 5b 33 >1 || z[0]!=wc[3
2640: 5d 29 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 ]) ){. Expr
2650: 20 2a 70 50 72 65 66 69 78 3b 0a 0a 20 20 20 20 *pPrefix;..
2660: 20 20 2f 2a 20 41 20 22 63 6f 6d 70 6c 65 74 65 /* A "complete
2670: 22 20 6d 61 74 63 68 20 69 66 20 74 68 65 20 70 " match if the p
2680: 61 74 74 65 72 6e 20 65 6e 64 73 20 77 69 74 68 attern ends with
2690: 20 22 2a 22 20 6f 72 20 22 25 22 20 2a 2f 0a 20 "*" or "%" */.
26a0: 20 20 20 20 20 2a 70 69 73 43 6f 6d 70 6c 65 74 *pisComplet
26b0: 65 20 3d 20 63 3d 3d 77 63 5b 30 5d 20 26 26 20 e = c==wc[0] &&
26c0: 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b 0a 0a 20 20 z[cnt+1]==0;..
26d0: 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 70 /* Get the p
26e0: 61 74 74 65 72 6e 20 70 72 65 66 69 78 2e 20 20 attern prefix.
26f0: 52 65 6d 6f 76 65 20 61 6c 6c 20 65 73 63 61 70 Remove all escap
2700: 65 73 20 66 72 6f 6d 20 74 68 65 20 70 72 65 66 es from the pref
2710: 69 78 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50 72 ix. */. pPr
2720: 65 66 69 78 20 3d 20 73 71 6c 69 74 65 33 45 78 efix = sqlite3Ex
2730: 70 72 28 64 62 2c 20 54 4b 5f 53 54 52 49 4e 47 pr(db, TK_STRING
2740: 2c 20 28 63 68 61 72 2a 29 7a 29 3b 0a 20 20 20 , (char*)z);.
2750: 20 20 20 69 66 28 20 70 50 72 65 66 69 78 20 29 if( pPrefix )
2760: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 46 {. int iF
2770: 72 6f 6d 2c 20 69 54 6f 3b 0a 20 20 20 20 20 20 rom, iTo;.
2780: 20 20 63 68 61 72 20 2a 7a 4e 65 77 20 3d 20 70 char *zNew = p
2790: 50 72 65 66 69 78 2d 3e 75 2e 7a 54 6f 6b 65 6e Prefix->u.zToken
27a0: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 65 77 5b 63 ;. zNew[c
27b0: 6e 74 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 nt] = 0;.
27c0: 20 66 6f 72 28 69 46 72 6f 6d 3d 69 54 6f 3d 30 for(iFrom=iTo=0
27d0: 3b 20 69 46 72 6f 6d 3c 63 6e 74 3b 20 69 46 72 ; iFrom<cnt; iFr
27e0: 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 om++){.
27f0: 20 69 66 28 20 7a 4e 65 77 5b 69 46 72 6f 6d 5d if( zNew[iFrom]
2800: 3d 3d 77 63 5b 33 5d 20 29 20 69 46 72 6f 6d 2b ==wc[3] ) iFrom+
2810: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4e 65 +;. zNe
2820: 77 5b 69 54 6f 2b 2b 5d 20 3d 20 7a 4e 65 77 5b w[iTo++] = zNew[
2830: 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 20 20 20 20 iFrom];.
2840: 7d 0a 20 20 20 20 20 20 20 20 7a 4e 65 77 5b 69 }. zNew[i
2850: 54 6f 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d To] = 0;. }
2860: 0a 20 20 20 20 20 20 2a 70 70 50 72 65 66 69 78 . *ppPrefix
2870: 20 3d 20 70 50 72 65 66 69 78 3b 0a 0a 20 20 20 = pPrefix;..
2880: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 52 48 53 /* If the RHS
2890: 20 70 61 74 74 65 72 6e 20 69 73 20 61 20 62 6f pattern is a bo
28a0: 75 6e 64 20 70 61 72 61 6d 65 74 65 72 2c 20 6d und parameter, m
28b0: 61 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e 74 73 ake arrangements
28c0: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 70 to. ** rep
28d0: 72 65 70 61 72 65 20 74 68 65 20 73 74 61 74 65 repare the state
28e0: 6d 65 6e 74 20 77 68 65 6e 20 74 68 61 74 20 70 ment when that p
28f0: 61 72 61 6d 65 74 65 72 20 69 73 20 72 65 62 6f arameter is rebo
2900: 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 und */. if(
2910: 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 op==TK_VARIABLE
2920: 20 29 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 ){. Vdbe
2930: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 *v = pParse->pV
2940: 64 62 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c dbe;. sql
2950: 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61 ite3VdbeSetVarma
2960: 73 6b 28 76 2c 20 70 52 69 67 68 74 2d 3e 69 43 sk(v, pRight->iC
2970: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 olumn);.
2980: 69 66 28 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 if( *pisComplete
2990: 20 26 26 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54 && pRight->u.zT
29a0: 6f 6b 65 6e 5b 31 5d 20 29 7b 0a 20 20 20 20 20 oken[1] ){.
29b0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 /* If the r
29c0: 68 73 20 6f 66 20 74 68 65 20 4c 49 4b 45 20 65 hs of the LIKE e
29d0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 76 xpression is a v
29e0: 61 72 69 61 62 6c 65 2c 20 61 6e 64 20 74 68 65 ariable, and the
29f0: 20 63 75 72 72 65 6e 74 0a 20 20 20 20 20 20 20 current.
2a00: 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 ** value of t
2a10: 68 65 20 76 61 72 69 61 62 6c 65 20 6d 65 61 6e he variable mean
2a20: 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 s there is no ne
2a30: 65 64 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 ed to invoke the
2a40: 20 4c 49 4b 45 0a 20 20 20 20 20 20 20 20 20 20 LIKE.
2a50: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 ** function, the
2a60: 6e 20 6e 6f 20 4f 50 5f 56 61 72 69 61 62 6c 65 n no OP_Variable
2a70: 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74 will be added t
2a80: 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 20 o the program..
2a90: 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 ** This
2aa0: 20 63 61 75 73 65 73 20 70 72 6f 62 6c 65 6d 73 causes problems
2ab0: 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 for the sqlite3
2ac0: 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f _bind_parameter_
2ad0: 6e 61 6d 65 28 29 0a 20 20 20 20 20 20 20 20 20 name().
2ae0: 20 2a 2a 20 41 50 49 2e 20 54 6f 20 77 6f 72 6b ** API. To work
2af0: 20 61 72 6f 75 6e 64 20 74 68 65 6d 2c 20 61 64 around them, ad
2b00: 64 20 61 20 64 75 6d 6d 79 20 4f 50 5f 56 61 72 d a dummy OP_Var
2b10: 69 61 62 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 iable here..
2b20: 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20 */ .
2b30: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c int r1 = sql
2b40: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 ite3GetTempReg(p
2b50: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 Parse);.
2b60: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 sqlite3ExprCod
2b70: 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 eTarget(pParse,
2b80: 70 52 69 67 68 74 2c 20 72 31 29 3b 0a 20 20 20 pRight, r1);.
2b90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 sqlite3Vd
2ba0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 73 71 beChangeP3(v, sq
2bb0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 lite3VdbeCurrent
2bc0: 41 64 64 72 28 76 29 2d 31 2c 20 30 29 3b 0a 20 Addr(v)-1, 0);.
2bd0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 sqlite3
2be0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 ReleaseTempReg(p
2bf0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 Parse, r1);.
2c00: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 }. }.
2c10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a }else{. z
2c20: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a = 0;. }. }.
2c30: 0a 20 20 72 63 20 3d 20 28 7a 21 3d 30 29 3b 0a . rc = (z!=0);.
2c40: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 sqlite3ValueFr
2c50: 65 65 28 70 56 61 6c 29 3b 0a 20 20 72 65 74 75 ee(pVal);. retu
2c60: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 rn rc;.}.#endif
2c70: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c /* SQLITE_OMIT_L
2c80: 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e IKE_OPTIMIZATION
2c90: 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 */...#ifndef SQ
2ca0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 LITE_OMIT_VIRTUA
2cb0: 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 68 65 LTABLE./*.** Che
2cc0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 ck to see if the
2cd0: 20 70 45 78 70 72 20 65 78 70 72 65 73 73 69 6f pExpr expressio
2ce0: 6e 20 69 73 20 61 20 66 6f 72 6d 20 74 68 61 74 n is a form that
2cf0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61 73 needs to be pas
2d00: 73 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 78 42 sed.** to the xB
2d10: 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 20 estIndex method
2d20: 6f 66 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 of virtual table
2d30: 73 2e 20 20 46 6f 72 6d 73 20 6f 66 20 69 6e 74 s. Forms of int
2d40: 65 72 65 73 74 20 69 6e 63 6c 75 64 65 3a 0a 2a erest include:.*
2d50: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 45 78 *.** Ex
2d60: 70 72 65 73 73 69 6f 6e 20 20 20 20 20 20 20 20 pression
2d70: 20 20 20 20 20 20 20 20 20 20 20 56 69 72 74 75 Virtu
2d80: 61 6c 20 54 61 62 6c 65 20 4f 70 65 72 61 74 6f al Table Operato
2d90: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2d 2d r.** --
2da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2db0: 2d 2d 2d 2d 2d 20 20 20 20 20 20 2d 2d 2d 2d 2d ----- -----
2dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 ------------.**
2de0: 20 20 20 20 20 31 2e 20 20 63 6f 6c 75 6d 6e 20 1. column
2df0: 4d 41 54 43 48 20 65 78 70 72 20 20 20 20 20 20 MATCH expr
2e00: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 44 SQLITE_IND
2e10: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 EX_CONSTRAINT_MA
2e20: 54 43 48 0a 2a 2a 20 20 20 20 20 20 32 2e 20 20 TCH.** 2.
2e30: 63 6f 6c 75 6d 6e 20 47 4c 4f 42 20 65 78 70 72 column GLOB expr
2e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c SQL
2e50: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 ITE_INDEX_CONSTR
2e60: 41 49 4e 54 5f 47 4c 4f 42 0a 2a 2a 20 20 20 20 AINT_GLOB.**
2e70: 20 20 33 2e 20 20 63 6f 6c 75 6d 6e 20 4c 49 4b 3. column LIK
2e80: 45 20 65 78 70 72 20 20 20 20 20 20 20 20 20 20 E expr
2e90: 20 20 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f SQLITE_INDEX_
2ea0: 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 49 4b 45 0a CONSTRAINT_LIKE.
2eb0: 2a 2a 20 20 20 20 20 20 34 2e 20 20 63 6f 6c 75 ** 4. colu
2ec0: 6d 6e 20 52 45 47 45 58 50 20 65 78 70 72 20 20 mn REGEXP expr
2ed0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f SQLITE_
2ee0: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 INDEX_CONSTRAINT
2ef0: 5f 52 45 47 45 58 50 0a 2a 2a 20 20 20 20 20 20 _REGEXP.**
2f00: 35 2e 20 20 63 6f 6c 75 6d 6e 20 21 3d 20 65 78 5. column != ex
2f10: 70 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 pr
2f20: 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f SQLITE_INDEX_CO
2f30: 4e 53 54 52 41 49 4e 54 5f 4e 45 0a 2a 2a 20 20 NSTRAINT_NE.**
2f40: 20 20 20 20 36 2e 20 20 65 78 70 72 20 21 3d 20 6. expr !=
2f50: 63 6f 6c 75 6d 6e 20 20 20 20 20 20 20 20 20 20 column
2f60: 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 44 45 SQLITE_INDE
2f70: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 45 0a X_CONSTRAINT_NE.
2f80: 2a 2a 20 20 20 20 20 20 37 2e 20 20 63 6f 6c 75 ** 7. colu
2f90: 6d 6e 20 49 53 20 4e 4f 54 20 65 78 70 72 20 20 mn IS NOT expr
2fa0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f SQLITE_
2fb0: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 INDEX_CONSTRAINT
2fc0: 5f 49 53 4e 4f 54 0a 2a 2a 20 20 20 20 20 20 38 _ISNOT.** 8
2fd0: 2e 20 20 65 78 70 72 20 49 53 20 4e 4f 54 20 63 . expr IS NOT c
2fe0: 6f 6c 75 6d 6e 20 20 20 20 20 20 20 20 20 20 20 olumn
2ff0: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e SQLITE_INDEX_CON
3000: 53 54 52 41 49 4e 54 5f 49 53 4e 4f 54 0a 2a 2a STRAINT_ISNOT.**
3010: 20 20 20 20 20 20 39 2e 20 20 63 6f 6c 75 6d 6e 9. column
3020: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 IS NOT NULL
3030: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e SQLITE_IN
3040: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 49 DEX_CONSTRAINT_I
3050: 53 4e 4f 54 4e 55 4c 4c 0a 2a 2a 0a 2a 2a 20 49 SNOTNULL.**.** I
3060: 6e 20 65 76 65 72 79 20 63 61 73 65 2c 20 22 63 n every case, "c
3070: 6f 6c 75 6d 6e 22 20 6d 75 73 74 20 62 65 20 61 olumn" must be a
3080: 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 76 69 72 column of a vir
3090: 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 49 66 20 tual table. If
30a0: 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 6d 61 there.** is a ma
30b0: 74 63 68 2c 20 73 65 74 20 2a 70 70 4c 65 66 74 tch, set *ppLeft
30c0: 20 74 6f 20 74 68 65 20 22 63 6f 6c 75 6d 6e 22 to the "column"
30d0: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 73 65 74 expression, set
30e0: 20 2a 70 70 52 69 67 68 74 20 74 6f 20 74 68 65 *ppRight to the
30f0: 20 0a 2a 2a 20 22 65 78 70 72 22 20 65 78 70 72 .** "expr" expr
3100: 65 73 73 69 6f 6e 20 28 65 76 65 6e 20 74 68 6f ession (even tho
3110: 75 67 68 20 69 6e 20 66 6f 72 6d 73 20 28 36 29 ugh in forms (6)
3120: 20 61 6e 64 20 28 38 29 20 74 68 65 20 63 6f 6c and (8) the col
3130: 75 6d 6e 20 69 73 20 6f 6e 20 74 68 65 0a 2a 2a umn is on the.**
3140: 20 72 69 67 68 74 20 61 6e 64 20 74 68 65 20 65 right and the e
3150: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 6e 20 xpression is on
3160: 74 68 65 20 6c 65 66 74 29 2e 20 20 41 6c 73 6f the left). Also
3170: 20 73 65 74 20 2a 70 65 4f 70 32 20 74 6f 20 74 set *peOp2 to t
3180: 68 65 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 he.** appropriat
3190: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 e virtual table
31a0: 6f 70 65 72 61 74 6f 72 2e 20 20 54 68 65 20 72 operator. The r
31b0: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 31 eturn value is 1
31c0: 20 6f 72 20 32 20 69 66 20 74 68 65 72 65 0a 2a or 2 if there.*
31d0: 2a 20 69 73 20 61 20 6d 61 74 63 68 2e 20 20 54 * is a match. T
31e0: 68 65 20 75 73 75 61 6c 20 72 65 74 75 72 6e 20 he usual return
31f0: 69 73 20 31 2c 20 62 75 74 20 69 66 20 74 68 65 is 1, but if the
3200: 20 52 48 53 20 69 73 20 61 6c 73 6f 20 61 20 63 RHS is also a c
3210: 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 76 69 72 74 olumn.** of virt
3220: 75 61 6c 20 74 61 62 6c 65 20 69 6e 20 66 6f 72 ual table in for
3230: 6d 73 20 28 35 29 20 6f 72 20 28 37 29 20 74 68 ms (5) or (7) th
3240: 65 6e 20 72 65 74 75 72 6e 20 32 2e 0a 2a 2a 0a en return 2..**.
3250: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 ** If the expres
3260: 73 69 6f 6e 20 6d 61 74 63 68 65 73 20 6e 6f 6e sion matches non
3270: 65 20 6f 66 20 74 68 65 20 70 61 74 74 65 72 6e e of the pattern
3280: 73 20 61 62 6f 76 65 2c 20 72 65 74 75 72 6e 20 s above, return
3290: 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0..*/.static int
32a0: 20 69 73 41 75 78 69 6c 69 61 72 79 56 74 61 62 isAuxiliaryVtab
32b0: 4f 70 65 72 61 74 6f 72 28 0a 20 20 73 71 6c 69 Operator(. sqli
32c0: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 te3 *db,
32d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 /* P
32e0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a arsing context *
32f0: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c /. Expr *pExpr,
3300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3310: 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73 /* Test this
3320: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 expression */.
3330: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
3340: 70 65 4f 70 32 2c 20 20 20 20 20 20 20 20 20 20 peOp2,
3350: 20 2f 2a 20 4f 55 54 3a 20 30 20 66 6f 72 20 4d /* OUT: 0 for M
3360: 41 54 43 48 2c 20 6f 72 20 65 6c 73 65 20 61 6e ATCH, or else an
3370: 20 6f 70 32 20 76 61 6c 75 65 20 2a 2f 0a 20 20 op2 value */.
3380: 45 78 70 72 20 2a 2a 70 70 4c 65 66 74 2c 20 20 Expr **ppLeft,
3390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
33a0: 2f 2a 20 43 6f 6c 75 6d 6e 20 65 78 70 72 65 73 /* Column expres
33b0: 73 69 6f 6e 20 74 6f 20 6c 65 66 74 20 6f 66 20 sion to left of
33c0: 4d 41 54 43 48 2f 6f 70 32 20 2a 2f 0a 20 20 45 MATCH/op2 */. E
33d0: 78 70 72 20 2a 2a 70 70 52 69 67 68 74 20 20 20 xpr **ppRight
33e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
33f0: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 * Expression to
3400: 6c 65 66 74 20 6f 66 20 4d 41 54 43 48 2f 6f 70 left of MATCH/op
3410: 32 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45 2 */.){. if( pE
3420: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 xpr->op==TK_FUNC
3430: 54 49 4f 4e 20 29 7b 0a 20 20 20 20 73 74 61 74 TION ){. stat
3440: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 ic const struct
3450: 4f 70 32 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 Op2 {. cons
3460: 74 20 63 68 61 72 20 2a 7a 4f 70 3b 0a 20 20 20 t char *zOp;.
3470: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 unsigned char
3480: 20 65 4f 70 32 3b 0a 20 20 20 20 7d 20 61 4f 70 eOp2;. } aOp
3490: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 [] = {. { "
34a0: 6d 61 74 63 68 22 2c 20 20 53 51 4c 49 54 45 5f match", SQLITE_
34b0: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 INDEX_CONSTRAINT
34c0: 5f 4d 41 54 43 48 20 7d 2c 0a 20 20 20 20 20 20 _MATCH },.
34d0: 7b 20 22 67 6c 6f 62 22 2c 20 20 20 53 51 4c 49 { "glob", SQLI
34e0: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 TE_INDEX_CONSTRA
34f0: 49 4e 54 5f 47 4c 4f 42 20 7d 2c 0a 20 20 20 20 INT_GLOB },.
3500: 20 20 7b 20 22 6c 69 6b 65 22 2c 20 20 20 53 51 { "like", SQ
3510: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 LITE_INDEX_CONST
3520: 52 41 49 4e 54 5f 4c 49 4b 45 20 7d 2c 0a 20 20 RAINT_LIKE },.
3530: 20 20 20 20 7b 20 22 72 65 67 65 78 70 22 2c 20 { "regexp",
3540: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e SQLITE_INDEX_CON
3550: 53 54 52 41 49 4e 54 5f 52 45 47 45 58 50 20 7d STRAINT_REGEXP }
3560: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 45 78 70 72 . };. Expr
3570: 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20 20 List *pList;.
3580: 20 45 78 70 72 20 2a 70 43 6f 6c 3b 20 20 20 20 Expr *pCol;
3590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
35a0: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 72 65 66 65 72 /* Column refer
35b0: 65 6e 63 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 ence */. int
35c0: 69 3b 0a 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 i;.. pList =
35d0: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a pExpr->x.pList;.
35e0: 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 if( pList==0
35f0: 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 || pList->nExpr
3600: 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74 !=2 ){. ret
3610: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 urn 0;. }..
3620: 20 20 2f 2a 20 42 75 69 6c 74 2d 69 6e 20 6f 70 /* Built-in op
3630: 65 72 61 74 6f 72 73 20 4d 41 54 43 48 2c 20 47 erators MATCH, G
3640: 4c 4f 42 2c 20 4c 49 4b 45 2c 20 61 6e 64 20 52 LOB, LIKE, and R
3650: 45 47 45 58 50 20 61 74 74 61 63 68 20 74 6f 20 EGEXP attach to
3660: 61 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c a. ** virtual
3670: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 69 72 20 table on their
3680: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c second argument,
3690: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73 61 which is the sa
36a0: 6d 65 20 61 73 0a 20 20 20 20 2a 2a 20 74 68 65 me as. ** the
36b0: 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 left-hand side
36c0: 6f 70 65 72 61 6e 64 20 69 6e 20 74 68 65 69 72 operand in their
36d0: 20 69 6e 2d 66 69 78 20 66 6f 72 6d 2e 0a 20 20 in-fix form..
36e0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 **. **
36f0: 20 20 76 74 61 62 5f 63 6f 6c 75 6d 6e 20 4d 41 vtab_column MA
3700: 54 43 48 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 TCH expression.
3710: 20 20 20 2a 2a 20 20 20 20 20 20 20 4d 41 54 43 ** MATC
3720: 48 28 65 78 70 72 65 73 73 69 6f 6e 2c 76 74 61 H(expression,vta
3730: 62 5f 63 6f 6c 75 6d 6e 29 0a 20 20 20 20 2a 2f b_column). */
3740: 0a 20 20 20 20 70 43 6f 6c 20 3d 20 70 4c 69 73 . pCol = pLis
3750: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 t->a[1].pExpr;.
3760: 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 6f 70 3d if( pCol->op=
3770: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 49 73 =TK_COLUMN && Is
3780: 56 69 72 74 75 61 6c 28 70 43 6f 6c 2d 3e 70 54 Virtual(pCol->pT
3790: 61 62 29 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 ab) ){. for
37a0: 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a (i=0; i<ArraySiz
37b0: 65 28 61 4f 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 e(aOp); i++){.
37c0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 if( sqlite
37d0: 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 3StrICmp(pExpr->
37e0: 75 2e 7a 54 6f 6b 65 6e 2c 20 61 4f 70 5b 69 5d u.zToken, aOp[i]
37f0: 2e 7a 4f 70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 .zOp)==0 ){.
3800: 20 20 20 20 20 20 2a 70 65 4f 70 32 20 3d 20 61 *peOp2 = a
3810: 4f 70 5b 69 5d 2e 65 4f 70 32 3b 0a 20 20 20 20 Op[i].eOp2;.
3820: 20 20 20 20 20 20 2a 70 70 52 69 67 68 74 20 3d *ppRight =
3830: 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 pList->a[0].pEx
3840: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 pr;. *p
3850: 70 4c 65 66 74 20 3d 20 70 43 6f 6c 3b 0a 20 20 pLeft = pCol;.
3860: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 return 1
3870: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 ;. }.
3880: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f }. }.. /
3890: 2a 20 57 65 20 63 61 6e 20 61 6c 73 6f 20 6d 61 * We can also ma
38a0: 74 63 68 20 61 67 61 69 6e 73 74 20 74 68 65 20 tch against the
38b0: 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 first column of
38c0: 6f 76 65 72 6c 6f 61 64 65 64 0a 20 20 20 20 2a overloaded. *
38d0: 2a 20 66 75 6e 63 74 69 6f 6e 73 20 77 68 65 72 * functions wher
38e0: 65 20 78 46 69 6e 64 46 75 6e 63 74 69 6f 6e 20 e xFindFunction
38f0: 72 65 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 returns a value
3900: 6f 66 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20 of at least.
3910: 2a 2a 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f ** SQLITE_INDEX_
3920: 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43 54 CONSTRAINT_FUNCT
3930: 49 4f 4e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 ION.. **.
3940: 2a 2a 20 20 20 20 20 20 4f 56 45 52 4c 4f 41 44 ** OVERLOAD
3950: 45 44 28 76 74 61 62 5f 63 6f 6c 75 6d 6e 2c 65 ED(vtab_column,e
3960: 78 70 72 65 73 73 69 6f 6e 29 0a 20 20 20 20 2a xpression). *
3970: 2a 0a 20 20 20 20 2a 2a 20 48 69 73 74 6f 72 69 *. ** Histori
3980: 63 61 6c 6c 79 2c 20 78 46 69 6e 64 46 75 6e 63 cally, xFindFunc
3990: 74 69 6f 6e 20 65 78 70 65 63 74 65 64 20 74 6f tion expected to
39a0: 20 73 65 65 20 6c 6f 77 65 72 2d 63 61 73 65 20 see lower-case
39b0: 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 function. **
39c0: 6e 61 6d 65 73 2e 20 20 42 75 74 20 66 6f 72 20 names. But for
39d0: 74 68 69 73 20 75 73 65 20 63 61 73 65 2c 20 78 this use case, x
39e0: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 20 69 73 20 FindFunction is
39f0: 65 78 70 65 63 74 65 64 20 74 6f 20 64 65 61 6c expected to deal
3a00: 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 66 75 6e . ** with fun
3a10: 63 74 69 6f 6e 20 6e 61 6d 65 73 20 69 6e 20 61 ction names in a
3a20: 6e 20 61 72 62 69 74 72 61 72 79 20 63 61 73 65 n arbitrary case
3a30: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43 6f .. */. pCo
3a40: 6c 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e l = pList->a[0].
3a50: 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 pExpr;. if( p
3a60: 43 6f 6c 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 Col->op==TK_COLU
3a70: 4d 4e 20 26 26 20 49 73 56 69 72 74 75 61 6c 28 MN && IsVirtual(
3a80: 70 43 6f 6c 2d 3e 70 54 61 62 29 20 29 7b 0a 20 pCol->pTab) ){.
3a90: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 sqlite3_vta
3aa0: 62 20 2a 70 56 74 61 62 3b 0a 20 20 20 20 20 20 b *pVtab;.
3ab0: 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a sqlite3_module *
3ac0: 70 4d 6f 64 3b 0a 20 20 20 20 20 20 76 6f 69 64 pMod;. void
3ad0: 20 28 2a 78 4e 6f 74 55 73 65 64 29 28 73 71 6c (*xNotUsed)(sql
3ae0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e ite3_context*,in
3af0: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a t,sqlite3_value*
3b00: 2a 29 3b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a *);. void *
3b10: 70 4e 6f 74 55 73 65 64 3b 0a 20 20 20 20 20 20 pNotUsed;.
3b20: 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65 33 47 pVtab = sqlite3G
3b30: 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 43 6f etVTable(db, pCo
3b40: 6c 2d 3e 70 54 61 62 29 2d 3e 70 56 74 61 62 3b l->pTab)->pVtab;
3b50: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 . assert( p
3b60: 56 74 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20 Vtab!=0 );.
3b70: 20 61 73 73 65 72 74 28 20 70 56 74 61 62 2d 3e assert( pVtab->
3b80: 70 4d 6f 64 75 6c 65 21 3d 30 20 29 3b 0a 20 20 pModule!=0 );.
3b90: 20 20 20 20 70 4d 6f 64 20 3d 20 28 73 71 6c 69 pMod = (sqli
3ba0: 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 29 70 56 74 te3_module *)pVt
3bb0: 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 ab->pModule;.
3bc0: 20 20 20 69 66 28 20 70 4d 6f 64 2d 3e 78 46 69 if( pMod->xFi
3bd0: 6e 64 46 75 6e 63 74 69 6f 6e 21 3d 30 20 29 7b ndFunction!=0 ){
3be0: 0a 20 20 20 20 20 20 20 20 69 20 3d 20 70 4d 6f . i = pMo
3bf0: 64 2d 3e 78 46 69 6e 64 46 75 6e 63 74 69 6f 6e d->xFindFunction
3c00: 28 70 56 74 61 62 2c 32 2c 20 70 45 78 70 72 2d (pVtab,2, pExpr-
3c10: 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26 78 4e 6f 74 >u.zToken, &xNot
3c20: 55 73 65 64 2c 20 26 70 4e 6f 74 55 73 65 64 29 Used, &pNotUsed)
3c30: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e ;. if( i>
3c40: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f =SQLITE_INDEX_CO
3c50: 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f NSTRAINT_FUNCTIO
3c60: 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a N ){. *
3c70: 70 65 4f 70 32 20 3d 20 69 3b 0a 20 20 20 20 20 peOp2 = i;.
3c80: 20 20 20 20 20 2a 70 70 52 69 67 68 74 20 3d 20 *ppRight =
3c90: 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 pList->a[1].pExp
3ca0: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 70 r;. *pp
3cb0: 4c 65 66 74 20 3d 20 70 43 6f 6c 3b 0a 20 20 20 Left = pCol;.
3cc0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b return 1;
3cd0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 . }.
3ce0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 }. }. }else
3cf0: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d if( pExpr->op==
3d00: 54 4b 5f 4e 45 20 7c 7c 20 70 45 78 70 72 2d 3e TK_NE || pExpr->
3d10: 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 7c 7c 20 op==TK_ISNOT ||
3d20: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f pExpr->op==TK_NO
3d30: 54 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 6e 74 TNULL ){. int
3d40: 20 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 45 78 res = 0;. Ex
3d50: 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 pr *pLeft = pExp
3d60: 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 45 78 r->pLeft;. Ex
3d70: 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78 pr *pRight = pEx
3d80: 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 pr->pRight;.
3d90: 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 if( pLeft->op==T
3da0: 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 49 73 56 69 K_COLUMN && IsVi
3db0: 72 74 75 61 6c 28 70 4c 65 66 74 2d 3e 70 54 61 rtual(pLeft->pTa
3dc0: 62 29 20 29 7b 0a 20 20 20 20 20 20 72 65 73 2b b) ){. res+
3dd0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 +;. }. if(
3de0: 20 70 52 69 67 68 74 20 26 26 20 70 52 69 67 68 pRight && pRigh
3df0: 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e t->op==TK_COLUMN
3e00: 20 26 26 20 49 73 56 69 72 74 75 61 6c 28 70 52 && IsVirtual(pR
3e10: 69 67 68 74 2d 3e 70 54 61 62 29 20 29 7b 0a 20 ight->pTab) ){.
3e20: 20 20 20 20 20 72 65 73 2b 2b 3b 0a 20 20 20 20 res++;.
3e30: 20 20 53 57 41 50 28 45 78 70 72 2a 2c 20 70 4c SWAP(Expr*, pL
3e40: 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 eft, pRight);.
3e50: 20 20 7d 0a 20 20 20 20 2a 70 70 4c 65 66 74 20 }. *ppLeft
3e60: 3d 20 70 4c 65 66 74 3b 0a 20 20 20 20 2a 70 70 = pLeft;. *pp
3e70: 52 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a Right = pRight;.
3e80: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f if( pExpr->o
3e90: 70 3d 3d 54 4b 5f 4e 45 20 29 20 2a 70 65 4f 70 p==TK_NE ) *peOp
3ea0: 32 20 3d 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 2 = SQLITE_INDEX
3eb0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 45 3b 0a _CONSTRAINT_NE;.
3ec0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f if( pExpr->o
3ed0: 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 20 2a 70 p==TK_ISNOT ) *p
3ee0: 65 4f 70 32 20 3d 20 53 51 4c 49 54 45 5f 49 4e eOp2 = SQLITE_IN
3ef0: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 49 DEX_CONSTRAINT_I
3f00: 53 4e 4f 54 3b 0a 20 20 20 20 69 66 28 20 70 45 SNOT;. if( pE
3f10: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e xpr->op==TK_NOTN
3f20: 55 4c 4c 20 29 20 2a 70 65 4f 70 32 20 3d 20 53 ULL ) *peOp2 = S
3f30: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 QLITE_INDEX_CONS
3f40: 54 52 41 49 4e 54 5f 49 53 4e 4f 54 4e 55 4c 4c TRAINT_ISNOTNULL
3f50: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 ;. return res
3f60: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 ;. }. return 0
3f70: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 ;.}.#endif /* SQ
3f80: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 LITE_OMIT_VIRTUA
3f90: 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a LTABLE */../*.**
3fa0: 20 49 66 20 74 68 65 20 70 42 61 73 65 20 65 78 If the pBase ex
3fb0: 70 72 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 pression origina
3fc0: 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 ted in the ON or
3fd0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 USING clause of
3fe0: 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e .** a join, then
3ff0: 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 61 70 transfer the ap
4000: 70 72 6f 70 72 69 61 74 65 20 6d 61 72 6b 69 6e propriate markin
4010: 67 73 20 6f 76 65 72 20 74 6f 20 64 65 72 69 76 gs over to deriv
4020: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f ed..*/.static vo
4030: 69 64 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d id transferJoinM
4040: 61 72 6b 69 6e 67 73 28 45 78 70 72 20 2a 70 44 arkings(Expr *pD
4050: 65 72 69 76 65 64 2c 20 45 78 70 72 20 2a 70 42 erived, Expr *pB
4060: 61 73 65 29 7b 0a 20 20 69 66 28 20 70 44 65 72 ase){. if( pDer
4070: 69 76 65 64 20 29 7b 0a 20 20 20 20 70 44 65 72 ived ){. pDer
4080: 69 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 ived->flags |= p
4090: 42 61 73 65 2d 3e 66 6c 61 67 73 20 26 20 45 50 Base->flags & EP
40a0: 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 70 _FromJoin;. p
40b0: 44 65 72 69 76 65 64 2d 3e 69 52 69 67 68 74 4a Derived->iRightJ
40c0: 6f 69 6e 54 61 62 6c 65 20 3d 20 70 42 61 73 65 oinTable = pBase
40d0: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c ->iRightJoinTabl
40e0: 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 e;. }.}../*.**
40f0: 4d 61 72 6b 20 74 65 72 6d 20 69 43 68 69 6c 64 Mark term iChild
4100: 20 61 73 20 62 65 69 6e 67 20 61 20 63 68 69 6c as being a chil
4110: 64 20 6f 66 20 74 65 72 6d 20 69 50 61 72 65 6e d of term iParen
4120: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 t.*/.static void
4130: 20 6d 61 72 6b 54 65 72 6d 41 73 43 68 69 6c 64 markTermAsChild
4140: 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 (WhereClause *pW
4150: 43 2c 20 69 6e 74 20 69 43 68 69 6c 64 2c 20 69 C, int iChild, i
4160: 6e 74 20 69 50 61 72 65 6e 74 29 7b 0a 20 20 70 nt iParent){. p
4170: 57 43 2d 3e 61 5b 69 43 68 69 6c 64 5d 2e 69 50 WC->a[iChild].iP
4180: 61 72 65 6e 74 20 3d 20 69 50 61 72 65 6e 74 3b arent = iParent;
4190: 0a 20 20 70 57 43 2d 3e 61 5b 69 43 68 69 6c 64 . pWC->a[iChild
41a0: 5d 2e 74 72 75 74 68 50 72 6f 62 20 3d 20 70 57 ].truthProb = pW
41b0: 43 2d 3e 61 5b 69 50 61 72 65 6e 74 5d 2e 74 72 C->a[iParent].tr
41c0: 75 74 68 50 72 6f 62 3b 0a 20 20 70 57 43 2d 3e uthProb;. pWC->
41d0: 61 5b 69 50 61 72 65 6e 74 5d 2e 6e 43 68 69 6c a[iParent].nChil
41e0: 64 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 d++;.}../*.** Re
41f0: 74 75 72 6e 20 74 68 65 20 4e 2d 74 68 20 41 4e turn the N-th AN
4200: 44 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 74 D-connected subt
4210: 65 72 6d 20 6f 66 20 70 54 65 72 6d 2e 20 20 4f erm of pTerm. O
4220: 72 20 69 66 20 70 54 65 72 6d 20 69 73 20 6e 6f r if pTerm is no
4230: 74 0a 2a 2a 20 61 20 63 6f 6e 6a 75 6e 63 74 69 t.** a conjuncti
4240: 6f 6e 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 on, then return
4250: 6a 75 73 74 20 70 54 65 72 6d 20 77 68 65 6e 20 just pTerm when
4260: 4e 3d 3d 30 2e 20 20 49 66 20 4e 20 69 73 20 65 N==0. If N is e
4270: 78 63 65 65 64 73 0a 2a 2a 20 74 68 65 20 6e 75 xceeds.** the nu
4280: 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c mber of availabl
4290: 65 20 73 75 62 74 65 72 6d 73 2c 20 72 65 74 75 e subterms, retu
42a0: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 rn NULL..*/.stat
42b0: 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68 ic WhereTerm *wh
42c0: 65 72 65 4e 74 68 53 75 62 74 65 72 6d 28 57 68 ereNthSubterm(Wh
42d0: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 ereTerm *pTerm,
42e0: 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 54 int N){. if( pT
42f0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d erm->eOperator!=
4300: 57 4f 5f 41 4e 44 20 29 7b 0a 20 20 20 20 72 65 WO_AND ){. re
4310: 74 75 72 6e 20 4e 3d 3d 30 20 3f 20 70 54 65 72 turn N==0 ? pTer
4320: 6d 20 3a 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 m : 0;. }. if(
4330: 20 4e 3c 70 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 N<pTerm->u.pAnd
4340: 49 6e 66 6f 2d 3e 77 63 2e 6e 54 65 72 6d 20 29 Info->wc.nTerm )
4350: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70 54 {. return &pT
4360: 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d erm->u.pAndInfo-
4370: 3e 77 63 2e 61 5b 4e 5d 3b 0a 20 20 7d 0a 20 20 >wc.a[N];. }.
4380: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a return 0;.}../*.
4390: 2a 2a 20 53 75 62 74 65 72 6d 73 20 70 4f 6e 65 ** Subterms pOne
43a0: 20 61 6e 64 20 70 54 77 6f 20 61 72 65 20 63 6f and pTwo are co
43b0: 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 57 ntained within W
43c0: 48 45 52 45 20 63 6c 61 75 73 65 20 70 57 43 2e HERE clause pWC.
43d0: 20 20 54 68 65 0a 2a 2a 20 74 77 6f 20 73 75 62 The.** two sub
43e0: 74 65 72 6d 73 20 61 72 65 20 69 6e 20 64 69 73 terms are in dis
43f0: 6a 75 6e 63 74 69 6f 6e 20 2d 20 74 68 65 79 20 junction - they
4400: 61 72 65 20 4f 52 2d 65 64 20 74 6f 67 65 74 68 are OR-ed togeth
4410: 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 er..**.** If the
4420: 73 65 20 74 77 6f 20 74 65 72 6d 73 20 61 72 65 se two terms are
4430: 20 62 6f 74 68 20 6f 66 20 74 68 65 20 66 6f 72 both of the for
4440: 6d 3a 20 20 22 41 20 6f 70 20 42 22 20 77 69 74 m: "A op B" wit
4450: 68 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 41 20 h the same.** A
4460: 61 6e 64 20 42 20 76 61 6c 75 65 73 20 62 75 74 and B values but
4470: 20 64 69 66 66 65 72 65 6e 74 20 6f 70 65 72 61 different opera
4480: 74 6f 72 73 20 61 6e 64 20 69 66 20 74 68 65 20 tors and if the
4490: 6f 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a operators are.**
44a0: 20 63 6f 6d 70 61 74 69 62 6c 65 20 28 69 66 20 compatible (if
44b0: 6f 6e 65 20 69 73 20 3d 20 61 6e 64 20 74 68 65 one is = and the
44c0: 20 6f 74 68 65 72 20 69 73 20 3c 2c 20 66 6f 72 other is <, for
44d0: 20 65 78 61 6d 70 6c 65 29 20 74 68 65 6e 0a 2a example) then.*
44e0: 2a 20 61 64 64 20 61 20 6e 65 77 20 76 69 72 74 * add a new virt
44f0: 75 61 6c 20 41 4e 44 20 74 65 72 6d 20 74 6f 20 ual AND term to
4500: 70 57 43 20 74 68 61 74 20 69 73 20 74 68 65 20 pWC that is the
4510: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 combination of t
4520: 68 65 0a 2a 2a 20 74 77 6f 2e 0a 2a 2a 0a 2a 2a he.** two..**.**
4530: 20 53 6f 6d 65 20 65 78 61 6d 70 6c 65 73 3a 0a Some examples:.
4540: 2a 2a 0a 2a 2a 20 20 20 20 78 3c 79 20 4f 52 20 **.** x<y OR
4550: 78 3d 79 20 20 20 20 2d 2d 3e 20 20 20 20 20 78 x=y --> x
4560: 3c 3d 79 0a 2a 2a 20 20 20 20 78 3d 79 20 4f 52 <=y.** x=y OR
4570: 20 78 3d 79 20 20 20 20 2d 2d 3e 20 20 20 20 20 x=y -->
4580: 78 3d 79 0a 2a 2a 20 20 20 20 78 3c 3d 79 20 4f x=y.** x<=y O
4590: 52 20 78 3c 79 20 20 20 2d 2d 3e 20 20 20 20 20 R x<y -->
45a0: 78 3c 3d 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 x<=y.**.** The f
45b0: 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 4e 4f 54 20 ollowing is NOT
45c0: 67 65 6e 65 72 61 74 65 64 3a 0a 2a 2a 0a 2a 2a generated:.**.**
45d0: 20 20 20 20 78 3c 79 20 4f 52 20 78 3e 79 20 20 x<y OR x>y
45e0: 20 20 2d 2d 3e 20 20 20 20 20 78 21 3d 79 20 20 --> x!=y
45f0: 20 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f .*/.static vo
4600: 69 64 20 77 68 65 72 65 43 6f 6d 62 69 6e 65 44 id whereCombineD
4610: 69 73 6a 75 6e 63 74 73 28 0a 20 20 53 72 63 4c isjuncts(. SrcL
4620: 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 ist *pSrc,
4630: 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 /* the FROM c
4640: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 lause */. Where
4650: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 Clause *pWC,
4660: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 /* The complet
4670: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a e WHERE clause *
4680: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 /. WhereTerm *p
4690: 4f 6e 65 2c 20 20 20 20 20 20 20 2f 2a 20 46 69 One, /* Fi
46a0: 72 73 74 20 64 69 73 6a 75 6e 63 74 20 2a 2f 0a rst disjunct */.
46b0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 77 WhereTerm *pTw
46c0: 6f 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f o /* Seco
46d0: 6e 64 20 64 69 73 6a 75 6e 63 74 20 2a 2f 0a 29 nd disjunct */.)
46e0: 7b 0a 20 20 75 31 36 20 65 4f 70 20 3d 20 70 4f {. u16 eOp = pO
46f0: 6e 65 2d 3e 65 4f 70 65 72 61 74 6f 72 20 7c 20 ne->eOperator |
4700: 70 54 77 6f 2d 3e 65 4f 70 65 72 61 74 6f 72 3b pTwo->eOperator;
4710: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 . sqlite3 *db;
4720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 /* Dat
4730: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e abase connection
4740: 20 28 66 6f 72 20 6d 61 6c 6c 6f 63 29 20 2a 2f (for malloc) */
4750: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 20 20 . Expr *pNew;
4760: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 /* New
4770: 20 76 69 72 74 75 61 6c 20 65 78 70 72 65 73 73 virtual express
4780: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b ion */. int op;
4790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
47a0: 2f 2a 20 4f 70 65 72 61 74 6f 72 20 66 6f 72 20 /* Operator for
47b0: 74 68 65 20 63 6f 6d 62 69 6e 65 64 20 65 78 70 the combined exp
47c0: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 ression */. int
47d0: 20 69 64 78 4e 65 77 3b 20 20 20 20 20 20 20 20 idxNew;
47e0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 /* Index in
47f0: 70 57 43 20 6f 66 20 74 68 65 20 6e 65 78 74 20 pWC of the next
4800: 76 69 72 74 75 61 6c 20 74 65 72 6d 20 2a 2f 0a virtual term */.
4810: 0a 20 20 69 66 28 20 28 70 4f 6e 65 2d 3e 65 4f . if( (pOne->eO
4820: 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 perator & (WO_EQ
4830: 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f |WO_LT|WO_LE|WO_
4840: 47 54 7c 57 4f 5f 47 45 29 29 3d 3d 30 20 29 20 GT|WO_GE))==0 )
4850: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 70 return;. if( (p
4860: 54 77 6f 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 Two->eOperator &
4870: 20 28 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f (WO_EQ|WO_LT|WO
4880: 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 _LE|WO_GT|WO_GE)
4890: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 )==0 ) return;.
48a0: 20 69 66 28 20 28 65 4f 70 20 26 20 28 57 4f 5f if( (eOp & (WO_
48b0: 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29 EQ|WO_LT|WO_LE))
48c0: 21 3d 65 4f 70 0a 20 20 20 26 26 20 28 65 4f 70 !=eOp. && (eOp
48d0: 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 47 54 7c & (WO_EQ|WO_GT|
48e0: 57 4f 5f 47 45 29 29 21 3d 65 4f 70 20 29 20 72 WO_GE))!=eOp ) r
48f0: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 eturn;. assert(
4900: 20 70 4f 6e 65 2d 3e 70 45 78 70 72 2d 3e 70 4c pOne->pExpr->pL
4910: 65 66 74 21 3d 30 20 26 26 20 70 4f 6e 65 2d 3e eft!=0 && pOne->
4920: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 21 3d 30 pExpr->pRight!=0
4930: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 );. assert( pT
4940: 77 6f 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 wo->pExpr->pLeft
4950: 21 3d 30 20 26 26 20 70 54 77 6f 2d 3e 70 45 78 !=0 && pTwo->pEx
4960: 70 72 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b pr->pRight!=0 );
4970: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 . if( sqlite3Ex
4980: 70 72 43 6f 6d 70 61 72 65 28 30 2c 70 4f 6e 65 prCompare(0,pOne
4990: 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 ->pExpr->pLeft,
49a0: 70 54 77 6f 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 pTwo->pExpr->pLe
49b0: 66 74 2c 20 2d 31 29 20 29 20 72 65 74 75 72 6e ft, -1) ) return
49c0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 ;. if( sqlite3E
49d0: 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 70 4f 6e xprCompare(0,pOn
49e0: 65 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 e->pExpr->pRight
49f0: 2c 20 70 54 77 6f 2d 3e 70 45 78 70 72 2d 3e 70 , pTwo->pExpr->p
4a00: 52 69 67 68 74 2c 2d 31 29 20 29 72 65 74 75 72 Right,-1) )retur
4a10: 6e 3b 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 n;. /* If we re
4a20: 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 ach this point,
4a30: 69 74 20 6d 65 61 6e 73 20 74 68 65 20 74 77 6f it means the two
4a40: 20 73 75 62 74 65 72 6d 73 20 63 61 6e 20 62 65 subterms can be
4a50: 20 63 6f 6d 62 69 6e 65 64 20 2a 2f 0a 20 20 69 combined */. i
4a60: 66 28 20 28 65 4f 70 20 26 20 28 65 4f 70 2d 31 f( (eOp & (eOp-1
4a70: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 ))!=0 ){. if(
4a80: 20 65 4f 70 20 26 20 28 57 4f 5f 4c 54 7c 57 4f eOp & (WO_LT|WO
4a90: 5f 4c 45 29 20 29 7b 0a 20 20 20 20 20 20 65 4f _LE) ){. eO
4aa0: 70 20 3d 20 57 4f 5f 4c 45 3b 0a 20 20 20 20 7d p = WO_LE;. }
4ab0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 else{. asse
4ac0: 72 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 47 54 rt( eOp & (WO_GT
4ad0: 7c 57 4f 5f 47 45 29 20 29 3b 0a 20 20 20 20 20 |WO_GE) );.
4ae0: 20 65 4f 70 20 3d 20 57 4f 5f 47 45 3b 0a 20 20 eOp = WO_GE;.
4af0: 20 20 7d 0a 20 20 7d 0a 20 20 64 62 20 3d 20 70 }. }. db = p
4b00: 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 WC->pWInfo->pPar
4b10: 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d se->db;. pNew =
4b20: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 sqlite3ExprDup(
4b30: 64 62 2c 20 70 4f 6e 65 2d 3e 70 45 78 70 72 2c db, pOne->pExpr,
4b40: 20 30 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 0);. if( pNew=
4b50: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 =0 ) return;. f
4b60: 6f 72 28 6f 70 3d 54 4b 5f 45 51 3b 20 65 4f 70 or(op=TK_EQ; eOp
4b70: 21 3d 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b !=(WO_EQ<<(op-TK
4b80: 5f 45 51 29 29 3b 20 6f 70 2b 2b 29 7b 20 61 73 _EQ)); op++){ as
4b90: 73 65 72 74 28 20 6f 70 3c 54 4b 5f 47 45 20 29 sert( op<TK_GE )
4ba0: 3b 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d ; }. pNew->op =
4bb0: 20 6f 70 3b 0a 20 20 69 64 78 4e 65 77 20 3d 20 op;. idxNew =
4bc0: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 whereClauseInser
4bd0: 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45 52 t(pWC, pNew, TER
4be0: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 M_VIRTUAL|TERM_D
4bf0: 59 4e 41 4d 49 43 29 3b 0a 20 20 65 78 70 72 41 YNAMIC);. exprA
4c00: 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 nalyze(pSrc, pWC
4c10: 2c 20 69 64 78 4e 65 77 29 3b 0a 7d 0a 0a 23 69 , idxNew);.}..#i
4c20: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 f !defined(SQLIT
4c30: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 E_OMIT_OR_OPTIMI
4c40: 5a 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69 ZATION) && !defi
4c50: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f ned(SQLITE_OMIT_
4c60: 53 55 42 51 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20 SUBQUERY)./*.**
4c70: 41 6e 61 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 Analyze a term t
4c80: 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 hat consists of
4c90: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 two or more OR-c
4ca0: 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 73 75 62 74 onnected.** subt
4cb0: 65 72 6d 73 2e 20 20 53 6f 20 69 6e 3a 0a 2a 2a erms. So in:.**
4cc0: 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 57 48 45 52 .** ... WHER
4cd0: 45 20 20 28 61 3d 35 29 20 41 4e 44 20 28 62 3d E (a=5) AND (b=
4ce0: 37 20 4f 52 20 63 3d 39 20 4f 52 20 64 3d 31 33 7 OR c=9 OR d=13
4cf0: 29 20 41 4e 44 20 28 64 3d 31 33 29 0a 2a 2a 20 ) AND (d=13).**
4d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4d10: 20 20 20 20 20 20 20 20 20 5e 5e 5e 5e 5e 5e 5e ^^^^^^^
4d20: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a ^^^^^^^^^^^^^.**
4d30: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 .** This routine
4d40: 20 61 6e 61 6c 79 7a 65 73 20 74 65 72 6d 73 20 analyzes terms
4d50: 73 75 63 68 20 61 73 20 74 68 65 20 6d 69 64 64 such as the midd
4d60: 6c 65 20 74 65 72 6d 20 69 6e 20 74 68 65 20 61 le term in the a
4d70: 62 6f 76 65 20 65 78 61 6d 70 6c 65 2e 0a 2a 2a bove example..**
4d80: 20 41 20 57 68 65 72 65 4f 72 54 65 72 6d 20 6f A WhereOrTerm o
4d90: 62 6a 65 63 74 20 69 73 20 63 6f 6d 70 75 74 65 bject is compute
4da0: 64 20 61 6e 64 20 61 74 74 61 63 68 65 64 20 74 d and attached t
4db0: 6f 20 74 68 65 20 74 65 72 6d 20 75 6e 64 65 72 o the term under
4dc0: 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 2c 20 72 65 .** analysis, re
4dd0: 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 gardless of the
4de0: 6f 75 74 63 6f 6d 65 20 6f 66 20 74 68 65 20 61 outcome of the a
4df0: 6e 61 6c 79 73 69 73 2e 20 20 48 65 6e 63 65 3a nalysis. Hence:
4e00: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 .**.** Where
4e10: 54 65 72 6d 2e 77 74 46 6c 61 67 73 20 20 20 7c Term.wtFlags |
4e20: 3d 20 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 0a 2a = TERM_ORINFO.*
4e30: 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e * WhereTerm.
4e40: 75 2e 70 4f 72 49 6e 66 6f 20 20 3d 20 20 61 20 u.pOrInfo = a
4e50: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f dynamically allo
4e60: 63 61 74 65 64 20 57 68 65 72 65 4f 72 54 65 72 cated WhereOrTer
4e70: 6d 20 6f 62 6a 65 63 74 0a 2a 2a 0a 2a 2a 20 54 m object.**.** T
4e80: 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61 6e he term being an
4e90: 61 6c 79 7a 65 64 20 6d 75 73 74 20 68 61 76 65 alyzed must have
4ea0: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 66 20 two or more of
4eb0: 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 OR-connected sub
4ec0: 74 65 72 6d 73 2e 0a 2a 2a 20 41 20 73 69 6e 67 terms..** A sing
4ed0: 6c 65 20 73 75 62 74 65 72 6d 20 6d 69 67 68 74 le subterm might
4ee0: 20 62 65 20 61 20 73 65 74 20 6f 66 20 41 4e 44 be a set of AND
4ef0: 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 2d 73 -connected sub-s
4f00: 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 45 78 61 6d ubterms..** Exam
4f10: 70 6c 65 73 20 6f 66 20 74 65 72 6d 73 20 75 6e ples of terms un
4f20: 64 65 72 20 61 6e 61 6c 79 73 69 73 3a 0a 2a 2a der analysis:.**
4f30: 0a 2a 2a 20 20 20 20 20 28 41 29 20 20 20 20 20 .** (A)
4f40: 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20 74 31 2e t1.x=t2.y OR t1.
4f50: 78 3d 74 32 2e 7a 20 4f 52 20 74 31 2e 79 3d 31 x=t2.z OR t1.y=1
4f60: 35 20 4f 52 20 74 31 2e 7a 3d 74 33 2e 61 2b 35 5 OR t1.z=t3.a+5
4f70: 0a 2a 2a 20 20 20 20 20 28 42 29 20 20 20 20 20 .** (B)
4f80: 78 3d 65 78 70 72 31 20 4f 52 20 65 78 70 72 32 x=expr1 OR expr2
4f90: 3d 78 20 4f 52 20 78 3d 65 78 70 72 33 0a 2a 2a =x OR x=expr3.**
4fa0: 20 20 20 20 20 28 43 29 20 20 20 20 20 74 31 2e (C) t1.
4fb0: 78 3d 74 32 2e 79 20 4f 52 20 28 74 31 2e 78 3d x=t2.y OR (t1.x=
4fc0: 74 32 2e 7a 20 41 4e 44 20 74 31 2e 79 3d 31 35 t2.z AND t1.y=15
4fd0: 29 0a 2a 2a 20 20 20 20 20 28 44 29 20 20 20 20 ).** (D)
4fe0: 20 78 3d 65 78 70 72 31 20 4f 52 20 28 79 3e 31 x=expr1 OR (y>1
4ff0: 31 20 41 4e 44 20 79 3c 32 32 20 41 4e 44 20 7a 1 AND y<22 AND z
5000: 20 4c 49 4b 45 20 27 2a 68 65 6c 6c 6f 2a 27 29 LIKE '*hello*')
5010: 0a 2a 2a 20 20 20 20 20 28 45 29 20 20 20 20 20 .** (E)
5020: 28 70 2e 61 3d 31 20 41 4e 44 20 71 2e 62 3d 32 (p.a=1 AND q.b=2
5030: 20 41 4e 44 20 72 2e 63 3d 33 29 20 4f 52 20 28 AND r.c=3) OR (
5040: 70 2e 78 3d 34 20 41 4e 44 20 71 2e 79 3d 35 20 p.x=4 AND q.y=5
5050: 41 4e 44 20 72 2e 7a 3d 36 29 0a 2a 2a 20 20 20 AND r.z=6).**
5060: 20 20 28 46 29 20 20 20 20 20 78 3e 41 20 4f 52 (F) x>A OR
5070: 20 28 78 3d 41 20 41 4e 44 20 79 3e 3d 42 29 0a (x=A AND y>=B).
5080: 2a 2a 0a 2a 2a 20 43 41 53 45 20 31 3a 0a 2a 2a **.** CASE 1:.**
5090: 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65 .** If all subte
50a0: 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20 66 rms are of the f
50b0: 6f 72 6d 20 54 2e 43 3d 65 78 70 72 20 66 6f 72 orm T.C=expr for
50c0: 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 63 6f 6c some single col
50d0: 75 6d 6e 20 6f 66 20 43 20 61 6e 64 0a 2a 2a 20 umn of C and.**
50e0: 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 54 a single table T
50f0: 20 28 61 73 20 73 68 6f 77 6e 20 69 6e 20 65 78 (as shown in ex
5100: 61 6d 70 6c 65 20 42 20 61 62 6f 76 65 29 20 74 ample B above) t
5110: 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 hen create a new
5120: 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d virtual.** term
5130: 20 74 68 61 74 20 69 73 20 61 6e 20 65 71 75 69 that is an equi
5140: 76 61 6c 65 6e 74 20 49 4e 20 65 78 70 72 65 73 valent IN expres
5150: 73 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 sion. In other
5160: 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 74 65 words, if the te
5170: 72 6d 0a 2a 2a 20 62 65 69 6e 67 20 61 6e 61 6c rm.** being anal
5180: 79 7a 65 64 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 yzed is:.**.**
5190: 20 20 20 20 78 20 3d 20 65 78 70 72 31 20 20 4f x = expr1 O
51a0: 52 20 20 65 78 70 72 32 20 3d 20 78 20 20 4f 52 R expr2 = x OR
51b0: 20 20 78 20 3d 20 65 78 70 72 33 0a 2a 2a 0a 2a x = expr3.**.*
51c0: 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 * then create a
51d0: 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d new virtual term
51e0: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a like this:.**.*
51f0: 2a 20 20 20 20 20 20 78 20 49 4e 20 28 65 78 70 * x IN (exp
5200: 72 31 2c 65 78 70 72 32 2c 65 78 70 72 33 29 0a r1,expr2,expr3).
5210: 2a 2a 0a 2a 2a 20 43 41 53 45 20 32 3a 0a 2a 2a **.** CASE 2:.**
5220: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 .** If there are
5230: 20 65 78 61 63 74 6c 79 20 74 77 6f 20 64 69 73 exactly two dis
5240: 6a 75 6e 63 74 73 20 61 6e 64 20 6f 6e 65 20 73 juncts and one s
5250: 69 64 65 20 68 61 73 20 78 3e 41 20 61 6e 64 20 ide has x>A and
5260: 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 0a 2a the other side.*
5270: 2a 20 68 61 73 20 78 3d 41 20 28 66 6f 72 20 74 * has x=A (for t
5280: 68 65 20 73 61 6d 65 20 78 20 61 6e 64 20 41 29 he same x and A)
5290: 20 74 68 65 6e 20 61 64 64 20 61 20 6e 65 77 20 then add a new
52a0: 76 69 72 74 75 61 6c 20 63 6f 6e 6a 75 6e 63 74 virtual conjunct
52b0: 20 74 65 72 6d 20 74 6f 20 74 68 65 0a 2a 2a 20 term to the.**
52c0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 WHERE clause of
52d0: 74 68 65 20 66 6f 72 6d 20 22 78 3e 3d 41 22 2e the form "x>=A".
52e0: 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a Example:.**.**
52f0: 20 20 20 20 20 20 78 3e 41 20 4f 52 20 28 78 3d x>A OR (x=
5300: 41 20 41 4e 44 20 79 3e 42 29 20 20 20 20 61 64 A AND y>B) ad
5310: 64 73 3a 20 20 20 20 78 3e 3d 41 0a 2a 2a 0a 2a ds: x>=A.**.*
5320: 2a 20 54 68 65 20 61 64 64 65 64 20 63 6f 6e 6a * The added conj
5330: 75 6e 63 74 20 63 61 6e 20 73 6f 6d 65 74 69 6d unct can sometim
5340: 65 73 20 62 65 20 68 65 6c 70 66 75 6c 20 69 6e es be helpful in
5350: 20 71 75 65 72 79 20 70 6c 61 6e 6e 69 6e 67 2e query planning.
5360: 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 33 3a 0a 2a .**.** CASE 3:.*
5370: 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 *.** If all subt
5380: 65 72 6d 73 20 61 72 65 20 69 6e 64 65 78 61 62 erms are indexab
5390: 6c 65 20 62 79 20 61 20 73 69 6e 67 6c 65 20 74 le by a single t
53a0: 61 62 6c 65 20 54 2c 20 74 68 65 6e 20 73 65 74 able T, then set
53b0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 .**.** Where
53c0: 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f 72 20 20 Term.eOperator
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 20 57 = W
53e0: 4f 5f 4f 52 0a 2a 2a 20 20 20 20 20 57 68 65 72 O_OR.** Wher
53f0: 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 2d eTerm.u.pOrInfo-
5400: 3e 69 6e 64 65 78 61 62 6c 65 20 20 7c 3d 20 20 >indexable |=
5410: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 the cursor numbe
5420: 72 20 66 6f 72 20 74 61 62 6c 65 20 54 0a 2a 2a r for table T.**
5430: 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20 69 73 .** A subterm is
5440: 20 22 69 6e 64 65 78 61 62 6c 65 22 20 69 66 20 "indexable" if
5450: 69 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 it is of the for
5460: 6d 0a 2a 2a 20 22 54 2e 43 20 3c 6f 70 3e 20 3c m.** "T.C <op> <
5470: 65 78 70 72 3e 22 20 77 68 65 72 65 20 43 20 69 expr>" where C i
5480: 73 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 s any column of
5490: 74 61 62 6c 65 20 54 20 61 6e 64 20 0a 2a 2a 20 table T and .**
54a0: 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20 22 <op> is one of "
54b0: 3d 22 2c 20 22 3c 22 2c 20 22 3c 3d 22 2c 20 22 =", "<", "<=", "
54c0: 3e 22 2c 20 22 3e 3d 22 2c 20 22 49 53 20 4e 55 >", ">=", "IS NU
54d0: 4c 4c 22 2c 20 6f 72 20 22 49 4e 22 2e 0a 2a 2a LL", or "IN"..**
54e0: 20 41 20 73 75 62 74 65 72 6d 20 69 73 20 61 6c A subterm is al
54f0: 73 6f 20 69 6e 64 65 78 61 62 6c 65 20 69 66 20 so indexable if
5500: 69 74 20 69 73 20 61 6e 20 41 4e 44 20 6f 66 20 it is an AND of
5510: 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 73 two or more.** s
5520: 75 62 73 75 62 74 65 72 6d 73 20 61 74 20 6c 65 ubsubterms at le
5530: 61 73 74 20 6f 6e 65 20 6f 66 20 77 68 69 63 68 ast one of which
5540: 20 69 73 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 is indexable.
5550: 49 6e 64 65 78 61 62 6c 65 20 41 4e 44 20 0a 2a Indexable AND .*
5560: 2a 20 73 75 62 74 65 72 6d 73 20 68 61 76 65 20 * subterms have
5570: 74 68 65 69 72 20 65 4f 70 65 72 61 74 6f 72 20 their eOperator
5580: 73 65 74 20 74 6f 20 57 4f 5f 41 4e 44 20 61 6e set to WO_AND an
5590: 64 20 74 68 65 79 20 68 61 76 65 0a 2a 2a 20 75 d they have.** u
55a0: 2e 70 41 6e 64 49 6e 66 6f 20 73 65 74 20 74 6f .pAndInfo set to
55b0: 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 a dynamically a
55c0: 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65 41 6e llocated WhereAn
55d0: 64 54 65 72 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2a dTerm object..**
55e0: 0a 2a 2a 20 46 72 6f 6d 20 61 6e 6f 74 68 65 72 .** From another
55f0: 20 70 6f 69 6e 74 20 6f 66 20 76 69 65 77 2c 20 point of view,
5600: 22 69 6e 64 65 78 61 62 6c 65 22 20 6d 65 61 6e "indexable" mean
5610: 73 20 74 68 61 74 20 74 68 65 20 73 75 62 74 65 s that the subte
5620: 72 6d 20 63 6f 75 6c 64 0a 2a 2a 20 70 6f 74 65 rm could.** pote
5630: 6e 74 69 61 6c 6c 79 20 62 65 20 75 73 65 64 20 ntially be used
5640: 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20 69 66 with an index if
5650: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 an appropriate
5660: 69 6e 64 65 78 20 65 78 69 73 74 73 2e 0a 2a 2a index exists..**
5670: 20 54 68 69 73 20 61 6e 61 6c 79 73 69 73 20 64 This analysis d
5680: 6f 65 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 oes not consider
5690: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 whether or not
56a0: 74 68 65 20 69 6e 64 65 78 20 65 78 69 73 74 73 the index exists
56b0: 3b 20 74 68 61 74 0a 2a 2a 20 69 73 20 64 65 63 ; that.** is dec
56c0: 69 64 65 64 20 65 6c 73 65 77 68 65 72 65 2e 20 ided elsewhere.
56d0: 20 54 68 69 73 20 61 6e 61 6c 79 73 69 73 20 6f This analysis o
56e0: 6e 6c 79 20 6c 6f 6f 6b 73 20 61 74 20 77 68 65 nly looks at whe
56f0: 74 68 65 72 20 73 75 62 74 65 72 6d 73 0a 2a 2a ther subterms.**
5700: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 appropriate for
5710: 20 69 6e 64 65 78 69 6e 67 20 65 78 69 73 74 2e indexing exist.
5720: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65 78 61 6d 70 .**.** All examp
5730: 6c 65 73 20 41 20 74 68 72 6f 75 67 68 20 45 20 les A through E
5740: 61 62 6f 76 65 20 73 61 74 69 73 66 79 20 63 61 above satisfy ca
5750: 73 65 20 33 2e 20 20 42 75 74 20 69 66 20 61 20 se 3. But if a
5760: 74 65 72 6d 0a 2a 2a 20 61 6c 73 6f 20 73 61 74 term.** also sat
5770: 69 73 66 69 65 73 20 63 61 73 65 20 31 20 28 73 isfies case 1 (s
5780: 75 63 68 20 61 73 20 42 29 20 77 65 20 6b 6e 6f uch as B) we kno
5790: 77 20 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d w that the optim
57a0: 69 7a 65 72 20 77 69 6c 6c 0a 2a 2a 20 61 6c 77 izer will.** alw
57b0: 61 79 73 20 70 72 65 66 65 72 20 63 61 73 65 20 ays prefer case
57c0: 31 2c 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61 1, so in that ca
57d0: 73 65 20 77 65 20 70 72 65 74 65 6e 64 20 74 68 se we pretend th
57e0: 61 74 20 63 61 73 65 20 33 20 69 73 20 6e 6f 74 at case 3 is not
57f0: 0a 2a 2a 20 73 61 74 69 73 66 69 65 64 2e 0a 2a .** satisfied..*
5800: 2a 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 62 65 *.** It might be
5810: 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 6d the case that m
5820: 75 6c 74 69 70 6c 65 20 74 61 62 6c 65 73 20 61 ultiple tables a
5830: 72 65 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 46 re indexable. F
5840: 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 28 or example,.** (
5850: 45 29 20 61 62 6f 76 65 20 69 73 20 69 6e 64 65 E) above is inde
5860: 78 61 62 6c 65 20 6f 6e 20 74 61 62 6c 65 73 20 xable on tables
5870: 50 2c 20 51 2c 20 61 6e 64 20 52 2e 0a 2a 2a 0a P, Q, and R..**.
5880: 2a 2a 20 54 65 72 6d 73 20 74 68 61 74 20 73 61 ** Terms that sa
5890: 74 69 73 66 79 20 63 61 73 65 20 33 20 61 72 65 tisfy case 3 are
58a0: 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20 candidates for
58b0: 6c 6f 6f 6b 75 70 20 62 79 20 75 73 69 6e 67 0a lookup by using.
58c0: 2a 2a 20 73 65 70 61 72 61 74 65 20 69 6e 64 69 ** separate indi
58d0: 63 65 73 20 74 6f 20 66 69 6e 64 20 72 6f 77 69 ces to find rowi
58e0: 64 73 20 66 6f 72 20 65 61 63 68 20 73 75 62 74 ds for each subt
58f0: 65 72 6d 20 61 6e 64 20 63 6f 6d 70 6f 73 69 6e erm and composin
5900: 67 0a 2a 2a 20 74 68 65 20 75 6e 69 6f 6e 20 6f g.** the union o
5910: 66 20 61 6c 6c 20 72 6f 77 69 64 73 20 75 73 69 f all rowids usi
5920: 6e 67 20 61 20 52 6f 77 53 65 74 20 6f 62 6a 65 ng a RowSet obje
5930: 63 74 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d ct. This is sim
5940: 69 6c 61 72 0a 2a 2a 20 74 6f 20 22 62 69 74 6d ilar.** to "bitm
5950: 61 70 20 69 6e 64 69 63 65 73 22 20 69 6e 20 6f ap indices" in o
5960: 74 68 65 72 20 64 61 74 61 62 61 73 65 20 65 6e ther database en
5970: 67 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48 gines..**.** OTH
5980: 45 52 57 49 53 45 3a 0a 2a 2a 0a 2a 2a 20 49 66 ERWISE:.**.** If
5990: 20 6e 6f 6e 65 20 6f 66 20 63 61 73 65 73 20 31 none of cases 1
59a0: 2c 20 32 2c 20 6f 72 20 33 20 61 70 70 6c 79 2c , 2, or 3 apply,
59b0: 20 74 68 65 6e 20 6c 65 61 76 65 20 74 68 65 20 then leave the
59c0: 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f eOperator set to
59d0: 0a 2a 2a 20 7a 65 72 6f 2e 20 20 54 68 69 73 20 .** zero. This
59e0: 74 65 72 6d 20 69 73 20 6e 6f 74 20 75 73 65 66 term is not usef
59f0: 75 6c 20 66 6f 72 20 73 65 61 72 63 68 2e 0a 2a ul for search..*
5a00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 /.static void ex
5a10: 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 prAnalyzeOrTerm(
5a20: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 . SrcList *pSrc
5a30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 , /*
5a40: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 the FROM clause
5a50: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 */. WhereClause
5a60: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f *pWC, /
5a70: 2a 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 57 * the complete W
5a80: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 HERE clause */.
5a90: 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20 int idxTerm
5aa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e /* In
5ab0: 64 65 78 20 6f 66 20 74 68 65 20 4f 52 2d 74 65 dex of the OR-te
5ac0: 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 rm to be analyze
5ad0: 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 d */.){. WhereI
5ae0: 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 nfo *pWInfo = pW
5af0: 43 2d 3e 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 C->pWInfo;
5b00: 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 /* WHERE claus
5b10: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e e processing con
5b20: 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 text */. Parse
5b30: 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f *pParse = pWInfo
5b40: 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 ->pParse;
5b50: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 /* Parser cont
5b60: 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 ext */. sqlite3
5b70: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 *db = pParse->d
5b80: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 b;
5b90: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e /* Database con
5ba0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 nection */. Whe
5bb0: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 reTerm *pTerm =
5bc0: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d &pWC->a[idxTerm]
5bd0: 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d ; /* The term
5be0: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 to be analyzed
5bf0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 */. Expr *pExpr
5c00: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b = pTerm->pExpr;
5c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
5c20: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f The expression o
5c30: 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 f the term */.
5c40: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 int i;
5c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5c60: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 /* Loop
5c70: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 counters */. Wh
5c80: 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 ereClause *pOrWc
5c90: 3b 20 20 20 20 20 20 20 2f 2a 20 42 72 65 61 6b ; /* Break
5ca0: 75 70 20 6f 66 20 70 54 65 72 6d 20 69 6e 74 6f up of pTerm into
5cb0: 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20 57 subterms */. W
5cc0: 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 hereTerm *pOrTer
5cd0: 6d 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 53 75 m; /* A Su
5ce0: 62 2d 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 b-term within th
5cf0: 65 20 70 4f 72 57 63 20 2a 2f 0a 20 20 57 68 65 e pOrWc */. Whe
5d00: 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 reOrInfo *pOrInf
5d10: 6f 3b 20 20 20 20 20 2f 2a 20 41 64 64 69 74 69 o; /* Additi
5d20: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e onal information
5d30: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 associated with
5d40: 20 70 54 65 72 6d 20 2a 2f 0a 20 20 42 69 74 6d pTerm */. Bitm
5d50: 61 73 6b 20 63 68 6e 67 54 6f 49 4e 3b 20 20 20 ask chngToIN;
5d60: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 /* Tables
5d70: 74 68 61 74 20 6d 69 67 68 74 20 73 61 74 69 73 that might satis
5d80: 66 79 20 63 61 73 65 20 31 20 2a 2f 0a 20 20 42 fy case 1 */. B
5d90: 69 74 6d 61 73 6b 20 69 6e 64 65 78 61 62 6c 65 itmask indexable
5da0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c ; /* Tabl
5db0: 65 73 20 74 68 61 74 20 61 72 65 20 69 6e 64 65 es that are inde
5dc0: 78 61 62 6c 65 2c 20 73 61 74 69 73 66 79 69 6e xable, satisfyin
5dd0: 67 20 63 61 73 65 20 32 20 2a 2f 0a 0a 20 20 2f g case 2 */.. /
5de0: 2a 0a 20 20 2a 2a 20 42 72 65 61 6b 20 74 68 65 *. ** Break the
5df0: 20 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 OR clause into
5e00: 69 74 73 20 73 65 70 61 72 61 74 65 20 73 75 62 its separate sub
5e10: 74 65 72 6d 73 2e 20 20 54 68 65 20 73 75 62 74 terms. The subt
5e20: 65 72 6d 73 20 61 72 65 0a 20 20 2a 2a 20 73 74 erms are. ** st
5e30: 6f 72 65 64 20 69 6e 20 61 20 57 68 65 72 65 43 ored in a WhereC
5e40: 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 20 lause structure
5e50: 63 6f 6e 74 61 69 6e 69 6e 67 20 77 69 74 68 69 containing withi
5e60: 6e 20 74 68 65 20 57 68 65 72 65 4f 72 49 6e 66 n the WhereOrInf
5e70: 6f 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20 74 68 o. ** object th
5e80: 61 74 20 69 73 20 61 74 74 61 63 68 65 64 20 74 at is attached t
5e90: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4f o the original O
5ea0: 52 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 20 R clause term..
5eb0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 */. assert( (p
5ec0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 Term->wtFlags &
5ed0: 28 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45 (TERM_DYNAMIC|TE
5ee0: 52 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f 41 RM_ORINFO|TERM_A
5ef0: 4e 44 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 NDINFO))==0 );.
5f00: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e assert( pExpr->
5f10: 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 70 op==TK_OR );. p
5f20: 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 20 Term->u.pOrInfo
5f30: 3d 20 70 4f 72 49 6e 66 6f 20 3d 20 73 71 6c 69 = pOrInfo = sqli
5f40: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 te3DbMallocZero(
5f50: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4f 72 49 db, sizeof(*pOrI
5f60: 6e 66 6f 29 29 3b 0a 20 20 69 66 28 20 70 4f 72 nfo));. if( pOr
5f70: 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e Info==0 ) return
5f80: 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 ;. pTerm->wtFla
5f90: 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 49 4e 46 gs |= TERM_ORINF
5fa0: 4f 3b 0a 20 20 70 4f 72 57 63 20 3d 20 26 70 4f O;. pOrWc = &pO
5fb0: 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 6d 65 6d rInfo->wc;. mem
5fc0: 73 65 74 28 70 4f 72 57 63 2d 3e 61 53 74 61 74 set(pOrWc->aStat
5fd0: 69 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f ic, 0, sizeof(pO
5fe0: 72 57 63 2d 3e 61 53 74 61 74 69 63 29 29 3b 0a rWc->aStatic));.
5ff0: 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c sqlite3WhereCl
6000: 61 75 73 65 49 6e 69 74 28 70 4f 72 57 63 2c 20 auseInit(pOrWc,
6010: 70 57 49 6e 66 6f 29 3b 0a 20 20 73 71 6c 69 74 pWInfo);. sqlit
6020: 65 33 57 68 65 72 65 53 70 6c 69 74 28 70 4f 72 e3WhereSplit(pOr
6030: 57 63 2c 20 70 45 78 70 72 2c 20 54 4b 5f 4f 52 Wc, pExpr, TK_OR
6040: 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 );. sqlite3Wher
6050: 65 45 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 eExprAnalyze(pSr
6060: 63 2c 20 70 4f 72 57 63 29 3b 0a 20 20 69 66 28 c, pOrWc);. if(
6070: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 db->mallocFaile
6080: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 d ) return;. as
6090: 73 65 72 74 28 20 70 4f 72 57 63 2d 3e 6e 54 65 sert( pOrWc->nTe
60a0: 72 6d 3e 3d 32 20 29 3b 0a 0a 20 20 2f 2a 0a 20 rm>=2 );.. /*.
60b0: 20 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 ** Compute the
60c0: 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 set of tables th
60d0: 61 74 20 6d 69 67 68 74 20 73 61 74 69 73 66 79 at might satisfy
60e0: 20 63 61 73 65 73 20 31 20 6f 72 20 33 2e 0a 20 cases 1 or 3..
60f0: 20 2a 2f 0a 20 20 69 6e 64 65 78 61 62 6c 65 20 */. indexable
6100: 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 = ~(Bitmask)0;.
6110: 20 63 68 6e 67 54 6f 49 4e 20 3d 20 7e 28 42 69 chngToIN = ~(Bi
6120: 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 tmask)0;. for(i
6130: 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c =pOrWc->nTerm-1,
6140: 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e pOrTerm=pOrWc->
6150: 61 3b 20 69 3e 3d 30 20 26 26 20 69 6e 64 65 78 a; i>=0 && index
6160: 61 62 6c 65 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 able; i--, pOrTe
6170: 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 rm++){. if( (
6180: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 pOrTerm->eOperat
6190: 6f 72 20 26 20 57 4f 5f 53 49 4e 47 4c 45 29 3d or & WO_SINGLE)=
61a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 =0 ){. Wher
61b0: 65 41 6e 64 49 6e 66 6f 20 2a 70 41 6e 64 49 6e eAndInfo *pAndIn
61c0: 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 fo;. assert
61d0: 28 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c ( (pOrTerm->wtFl
61e0: 61 67 73 20 26 20 28 54 45 52 4d 5f 41 4e 44 49 ags & (TERM_ANDI
61f0: 4e 46 4f 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 NFO|TERM_ORINFO)
6200: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 68 )==0 );. ch
6210: 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 ngToIN = 0;.
6220: 20 20 70 41 6e 64 49 6e 66 6f 20 3d 20 73 71 6c pAndInfo = sql
6230: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e ite3DbMallocRawN
6240: 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 41 N(db, sizeof(*pA
6250: 6e 64 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 ndInfo));.
6260: 69 66 28 20 70 41 6e 64 49 6e 66 6f 20 29 7b 0a if( pAndInfo ){.
6270: 20 20 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 WhereCla
6280: 75 73 65 20 2a 70 41 6e 64 57 43 3b 0a 20 20 20 use *pAndWC;.
6290: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a WhereTerm *
62a0: 70 41 6e 64 54 65 72 6d 3b 0a 20 20 20 20 20 20 pAndTerm;.
62b0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 int j;.
62c0: 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 30 3b 0a Bitmask b = 0;.
62d0: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d pOrTerm-
62e0: 3e 75 2e 70 41 6e 64 49 6e 66 6f 20 3d 20 70 41 >u.pAndInfo = pA
62f0: 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 ndInfo;.
6300: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 pOrTerm->wtFlags
6310: 20 7c 3d 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f |= TERM_ANDINFO
6320: 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 ;. pOrTer
6330: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 m->eOperator = W
6340: 4f 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 70 O_AND;. p
6350: 41 6e 64 57 43 20 3d 20 26 70 41 6e 64 49 6e 66 AndWC = &pAndInf
6360: 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 6d o->wc;. m
6370: 65 6d 73 65 74 28 70 41 6e 64 57 43 2d 3e 61 53 emset(pAndWC->aS
6380: 74 61 74 69 63 2c 20 30 2c 20 73 69 7a 65 6f 66 tatic, 0, sizeof
6390: 28 70 41 6e 64 57 43 2d 3e 61 53 74 61 74 69 63 (pAndWC->aStatic
63a0: 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 ));. sqli
63b0: 74 65 33 57 68 65 72 65 43 6c 61 75 73 65 49 6e te3WhereClauseIn
63c0: 69 74 28 70 41 6e 64 57 43 2c 20 70 57 43 2d 3e it(pAndWC, pWC->
63d0: 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 pWInfo);.
63e0: 20 73 71 6c 69 74 65 33 57 68 65 72 65 53 70 6c sqlite3WhereSpl
63f0: 69 74 28 70 41 6e 64 57 43 2c 20 70 4f 72 54 65 it(pAndWC, pOrTe
6400: 72 6d 2d 3e 70 45 78 70 72 2c 20 54 4b 5f 41 4e rm->pExpr, TK_AN
6410: 44 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 D);. sqli
6420: 74 65 33 57 68 65 72 65 45 78 70 72 41 6e 61 6c te3WhereExprAnal
6430: 79 7a 65 28 70 53 72 63 2c 20 70 41 6e 64 57 43 yze(pSrc, pAndWC
6440: 29 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 57 );. pAndW
6450: 43 2d 3e 70 4f 75 74 65 72 20 3d 20 70 57 43 3b C->pOuter = pWC;
6460: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 64 62 . if( !db
6470: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 ->mallocFailed )
6480: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 {. for(
6490: 6a 3d 30 2c 20 70 41 6e 64 54 65 72 6d 3d 70 41 j=0, pAndTerm=pA
64a0: 6e 64 57 43 2d 3e 61 3b 20 6a 3c 70 41 6e 64 57 ndWC->a; j<pAndW
64b0: 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 C->nTerm; j++, p
64c0: 41 6e 64 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 AndTerm++){.
64d0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 assert(
64e0: 70 41 6e 64 54 65 72 6d 2d 3e 70 45 78 70 72 20 pAndTerm->pExpr
64f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 );. i
6500: 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 41 6e f( allowedOp(pAn
6510: 64 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 dTerm->pExpr->op
6520: 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ) .
6530: 7c 7c 20 70 41 6e 64 54 65 72 6d 2d 3e 65 4f 70 || pAndTerm->eOp
6540: 65 72 61 74 6f 72 3d 3d 57 4f 5f 41 55 58 0a 20 erator==WO_AUX.
6550: 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 ){.
6560: 20 20 20 20 20 20 20 20 20 20 20 20 62 20 7c 3d b |=
6570: 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65 74 sqlite3WhereGet
6580: 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d Mask(&pWInfo->sM
6590: 61 73 6b 53 65 74 2c 20 70 41 6e 64 54 65 72 6d askSet, pAndTerm
65a0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 ->leftCursor);.
65b0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 }.
65c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
65d0: 20 7d 0a 20 20 20 20 20 20 20 20 69 6e 64 65 78 }. index
65e0: 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20 20 20 20 able &= b;.
65f0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 }. }else if(
6600: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 pOrTerm->wtFlag
6610: 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 s & TERM_COPIED
6620: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 ){. /* Skip
6630: 20 74 68 69 73 20 74 65 72 6d 20 66 6f 72 20 6e this term for n
6640: 6f 77 2e 20 20 57 65 20 72 65 76 69 73 69 74 20 ow. We revisit
6650: 69 74 20 77 68 65 6e 20 77 65 20 70 72 6f 63 65 it when we proce
6660: 73 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 ss the. **
6670: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 54 45 corresponding TE
6680: 52 4d 5f 56 49 52 54 55 41 4c 20 74 65 72 6d 20 RM_VIRTUAL term
6690: 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 */. }else{.
66a0: 20 20 20 20 42 69 74 6d 61 73 6b 20 62 3b 0a 20 Bitmask b;.
66b0: 20 20 20 20 20 62 20 3d 20 73 71 6c 69 74 65 33 b = sqlite3
66c0: 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70 57 WhereGetMask(&pW
66d0: 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 Info->sMaskSet,
66e0: 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 pOrTerm->leftCur
66f0: 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 sor);. if(
6700: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 pOrTerm->wtFlags
6710: 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 & TERM_VIRTUAL
6720: 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 ){. Where
6730: 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 Term *pOther = &
6740: 70 4f 72 57 63 2d 3e 61 5b 70 4f 72 54 65 72 6d pOrWc->a[pOrTerm
6750: 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 ->iParent];.
6760: 20 20 20 20 62 20 7c 3d 20 73 71 6c 69 74 65 33 b |= sqlite3
6770: 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70 57 WhereGetMask(&pW
6780: 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 Info->sMaskSet,
6790: 70 4f 74 68 65 72 2d 3e 6c 65 66 74 43 75 72 73 pOther->leftCurs
67a0: 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 or);. }.
67b0: 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20 indexable &=
67c0: 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4f b;. if( (pO
67d0: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 rTerm->eOperator
67e0: 20 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29 7b 0a & WO_EQ)==0 ){.
67f0: 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e chngToIN
6800: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 = 0;. }els
6810: 65 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67 54 e{. chngT
6820: 6f 49 4e 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 oIN &= b;.
6830: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f }. }. }.. /
6840: 2a 0a 20 20 2a 2a 20 52 65 63 6f 72 64 20 74 68 *. ** Record th
6850: 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 e set of tables
6860: 74 68 61 74 20 73 61 74 69 73 66 79 20 63 61 73 that satisfy cas
6870: 65 20 33 2e 20 20 54 68 65 20 73 65 74 20 6d 69 e 3. The set mi
6880: 67 68 74 20 62 65 0a 20 20 2a 2a 20 65 6d 70 74 ght be. ** empt
6890: 79 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 49 6e 66 y.. */. pOrInf
68a0: 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 3d 20 69 o->indexable = i
68b0: 6e 64 65 78 61 62 6c 65 3b 0a 20 20 69 66 28 20 ndexable;. if(
68c0: 69 6e 64 65 78 61 62 6c 65 20 29 7b 0a 20 20 20 indexable ){.
68d0: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f pTerm->eOperato
68e0: 72 20 3d 20 57 4f 5f 4f 52 3b 0a 20 20 20 20 70 r = WO_OR;. p
68f0: 57 43 2d 3e 68 61 73 4f 72 20 3d 20 31 3b 0a 20 WC->hasOr = 1;.
6900: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 65 72 }else{. pTer
6910: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 m->eOperator = W
6920: 4f 5f 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 O_OR;. }.. /*
6930: 46 6f 72 20 61 20 74 77 6f 2d 77 61 79 20 4f 52 For a two-way OR
6940: 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 69 6d 70 , attempt to imp
6950: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 63 61 73 65 lementation case
6960: 20 32 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 2.. */. if( i
6970: 6e 64 65 78 61 62 6c 65 20 26 26 20 70 4f 72 57 ndexable && pOrW
6980: 63 2d 3e 6e 54 65 72 6d 3d 3d 32 20 29 7b 0a 20 c->nTerm==2 ){.
6990: 20 20 20 69 6e 74 20 69 4f 6e 65 20 3d 20 30 3b int iOne = 0;
69a0: 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a . WhereTerm *
69b0: 70 4f 6e 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 pOne;. while(
69c0: 20 28 70 4f 6e 65 20 3d 20 77 68 65 72 65 4e 74 (pOne = whereNt
69d0: 68 53 75 62 74 65 72 6d 28 26 70 4f 72 57 63 2d hSubterm(&pOrWc-
69e0: 3e 61 5b 30 5d 2c 69 4f 6e 65 2b 2b 29 29 21 3d >a[0],iOne++))!=
69f0: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 0 ){. int i
6a00: 54 77 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 57 Two = 0;. W
6a10: 68 65 72 65 54 65 72 6d 20 2a 70 54 77 6f 3b 0a hereTerm *pTwo;.
6a20: 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 70 54 while( (pT
6a30: 77 6f 20 3d 20 77 68 65 72 65 4e 74 68 53 75 62 wo = whereNthSub
6a40: 74 65 72 6d 28 26 70 4f 72 57 63 2d 3e 61 5b 31 term(&pOrWc->a[1
6a50: 5d 2c 69 54 77 6f 2b 2b 29 29 21 3d 30 20 29 7b ],iTwo++))!=0 ){
6a60: 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 43 6f . whereCo
6a70: 6d 62 69 6e 65 44 69 73 6a 75 6e 63 74 73 28 70 mbineDisjuncts(p
6a80: 53 72 63 2c 20 70 57 43 2c 20 70 4f 6e 65 2c 20 Src, pWC, pOne,
6a90: 70 54 77 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 pTwo);. }.
6aa0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 }. }.. /*.
6ab0: 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 68 6f 6c ** chngToIN hol
6ac0: 64 73 20 61 20 73 65 74 20 6f 66 20 74 61 62 6c ds a set of tabl
6ad0: 65 73 20 74 68 61 74 20 2a 6d 69 67 68 74 2a 20 es that *might*
6ae0: 73 61 74 69 73 66 79 20 63 61 73 65 20 31 2e 20 satisfy case 1.
6af0: 20 42 75 74 0a 20 20 2a 2a 20 77 65 20 68 61 76 But. ** we hav
6b00: 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 61 64 64 e to do some add
6b10: 69 74 69 6f 6e 61 6c 20 63 68 65 63 6b 69 6e 67 itional checking
6b20: 20 74 6f 20 73 65 65 20 69 66 20 63 61 73 65 20 to see if case
6b30: 31 20 72 65 61 6c 6c 79 0a 20 20 2a 2a 20 69 73 1 really. ** is
6b40: 20 73 61 74 69 73 66 69 65 64 2e 0a 20 20 2a 2a satisfied.. **
6b50: 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 77 . ** chngToIN w
6b60: 69 6c 6c 20 68 6f 6c 64 20 65 69 74 68 65 72 20 ill hold either
6b70: 30 2c 20 31 2c 20 6f 72 20 32 20 62 69 74 73 2e 0, 1, or 2 bits.
6b80: 20 20 54 68 65 20 30 2d 62 69 74 20 63 61 73 65 The 0-bit case
6b90: 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 means. ** that
6ba0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 73 there is no pos
6bb0: 73 69 62 69 6c 69 74 79 20 6f 66 20 74 72 61 6e sibility of tran
6bc0: 73 66 6f 72 6d 69 6e 67 20 74 68 65 20 4f 52 20 sforming the OR
6bd0: 63 6c 61 75 73 65 20 69 6e 74 6f 20 61 6e 0a 20 clause into an.
6be0: 20 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 ** IN operator
6bf0: 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 72 20 6d because one or m
6c00: 6f 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 ore terms in the
6c10: 20 4f 52 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 OR clause conta
6c20: 69 6e 0a 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e in. ** somethin
6c30: 67 20 6f 74 68 65 72 20 74 68 61 6e 20 3d 3d 20 g other than ==
6c40: 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 on a column in t
6c50: 68 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e he single table.
6c60: 20 20 54 68 65 20 31 2d 62 69 74 0a 20 20 2a 2a The 1-bit. **
6c70: 20 63 61 73 65 20 6d 65 61 6e 73 20 74 68 61 74 case means that
6c80: 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 every term of t
6c90: 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69 73 20 he OR clause is
6ca0: 6f 66 20 74 68 65 20 66 6f 72 6d 0a 20 20 2a 2a of the form. **
6cb0: 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 3d 65 "table.column=e
6cc0: 78 70 72 22 20 66 6f 72 20 73 6f 6d 65 20 73 69 xpr" for some si
6cd0: 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65 ngle table. The
6ce0: 20 6f 6e 65 20 62 69 74 20 74 68 61 74 20 69 73 one bit that is
6cf0: 20 73 65 74 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 set. ** will c
6d00: 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 orrespond to the
6d10: 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 2e 20 20 common table.
6d20: 57 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f We still need to
6d30: 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 0a 20 check to make.
6d40: 20 2a 2a 20 73 75 72 65 20 74 68 65 20 73 61 6d ** sure the sam
6d50: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 e column is used
6d60: 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 2e 20 20 on all terms.
6d70: 54 68 65 20 32 2d 62 69 74 20 63 61 73 65 20 69 The 2-bit case i
6d80: 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 s when. ** the
6d90: 61 6c 6c 20 74 65 72 6d 73 20 61 72 65 20 6f 66 all terms are of
6da0: 20 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 the form "table
6db0: 31 2e 63 6f 6c 75 6d 6e 3d 74 61 62 6c 65 32 2e 1.column=table2.
6dc0: 63 6f 6c 75 6d 6e 22 2e 20 20 49 74 0a 20 20 2a column". It. *
6dd0: 2a 20 6d 69 67 68 74 20 62 65 20 70 6f 73 73 69 * might be possi
6de0: 62 6c 65 20 74 6f 20 66 6f 72 6d 20 61 6e 20 49 ble to form an I
6df0: 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 N operator with
6e00: 65 69 74 68 65 72 20 74 61 62 6c 65 31 2e 63 6f either table1.co
6e10: 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 72 20 74 61 62 lumn. ** or tab
6e20: 6c 65 32 2e 63 6f 6c 75 6d 6e 20 61 73 20 74 68 le2.column as th
6e30: 65 20 4c 48 53 20 69 66 20 65 69 74 68 65 72 20 e LHS if either
6e40: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 is common to eve
6e50: 72 79 20 74 65 72 6d 20 6f 66 0a 20 20 2a 2a 20 ry term of. **
6e60: 74 68 65 20 4f 52 20 63 6c 61 75 73 65 2e 0a 20 the OR clause..
6e70: 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 **. ** Note th
6e80: 61 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 at terms of the
6e90: 66 6f 72 6d 20 22 74 61 62 6c 65 2e 63 6f 6c 75 form "table.colu
6ea0: 6d 6e 31 3d 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e mn1=table.column
6eb0: 32 22 20 28 74 68 65 0a 20 20 2a 2a 20 73 61 6d 2" (the. ** sam
6ec0: 65 20 74 61 62 6c 65 20 6f 6e 20 62 6f 74 68 20 e table on both
6ed0: 73 69 7a 65 73 20 6f 66 20 74 68 65 20 3d 3d 29 sizes of the ==)
6ee0: 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d cannot be optim
6ef0: 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 ized.. */. if(
6f00: 20 63 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 chngToIN ){.
6f10: 20 69 6e 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 int okToChngToI
6f20: 4e 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 N = 0; /* Tr
6f30: 75 65 20 69 66 20 74 68 65 20 63 6f 6e 76 65 72 ue if the conver
6f40: 73 69 6f 6e 20 74 6f 20 49 4e 20 69 73 20 76 61 sion to IN is va
6f50: 6c 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 lid */. int i
6f60: 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20 20 20 Column = -1;
6f70: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69 /* Column i
6f80: 6e 64 65 78 20 6f 6e 20 6c 68 73 20 6f 66 20 49 ndex on lhs of I
6f90: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 N operator */.
6fa0: 20 20 69 6e 74 20 69 43 75 72 73 6f 72 20 3d 20 int iCursor =
6fb0: 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 -1; /* T
6fc0: 61 62 6c 65 20 63 75 72 73 6f 72 20 63 6f 6d 6d able cursor comm
6fd0: 6f 6e 20 74 6f 20 61 6c 6c 20 74 65 72 6d 73 20 on to all terms
6fe0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 30 */. int j = 0
6ff0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
7000: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 /* Loop counter
7010: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 61 72 */.. /* Sear
7020: 63 68 20 66 6f 72 20 61 20 74 61 62 6c 65 20 61 ch for a table a
7030: 6e 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 61 nd column that a
7040: 70 70 65 61 72 73 20 6f 6e 20 6f 6e 65 20 73 69 ppears on one si
7050: 64 65 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a de or the. **
7060: 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 3d 3d other of the ==
7070: 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 65 76 65 operator in eve
7080: 72 79 20 73 75 62 74 65 72 6d 2e 20 20 54 68 61 ry subterm. Tha
7090: 74 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 t table and colu
70a0: 6d 6e 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 mn. ** will b
70b0: 65 20 72 65 63 6f 72 64 65 64 20 69 6e 20 69 43 e recorded in iC
70c0: 75 72 73 6f 72 20 61 6e 64 20 69 43 6f 6c 75 6d ursor and iColum
70d0: 6e 2e 20 20 54 68 65 72 65 20 6d 69 67 68 74 20 n. There might
70e0: 6e 6f 74 20 62 65 20 61 6e 79 0a 20 20 20 20 2a not be any. *
70f0: 2a 20 73 75 63 68 20 74 61 62 6c 65 20 61 6e 64 * such table and
7100: 20 63 6f 6c 75 6d 6e 2e 20 20 53 65 74 20 6f 6b column. Set ok
7110: 54 6f 43 68 6e 67 54 6f 49 4e 20 69 66 20 61 6e ToChngToIN if an
7120: 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 61 62 appropriate tab
7130: 6c 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f le. ** and co
7140: 6c 75 6d 6e 20 69 73 20 66 6f 75 6e 64 20 62 75 lumn is found bu
7150: 74 20 6c 65 61 76 65 20 6f 6b 54 6f 43 68 6e 67 t leave okToChng
7160: 54 6f 49 4e 20 66 61 6c 73 65 20 69 66 20 6e 6f ToIN false if no
7170: 74 20 66 6f 75 6e 64 2e 0a 20 20 20 20 2a 2f 0a t found.. */.
7180: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 32 for(j=0; j<2
7190: 20 26 26 20 21 6f 6b 54 6f 43 68 6e 67 54 6f 49 && !okToChngToI
71a0: 4e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70 N; j++){. p
71b0: 4f 72 54 65 72 6d 20 3d 20 70 4f 72 57 63 2d 3e OrTerm = pOrWc->
71c0: 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 a;. for(i=p
71d0: 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 OrWc->nTerm-1; i
71e0: 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 >=0; i--, pOrTer
71f0: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 m++){. as
7200: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 sert( pOrTerm->e
7210: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 Operator & WO_EQ
7220: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 );. pOrT
7230: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20 erm->wtFlags &=
7240: 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 ~TERM_OR_OK;.
7250: 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d if( pOrTerm
7260: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 ->leftCursor==iC
7270: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 ursor ){.
7280: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 /* This is th
7290: 65 20 32 2d 62 69 74 20 63 61 73 65 20 61 6e 64 e 2-bit case and
72a0: 20 77 65 20 61 72 65 20 6f 6e 20 74 68 65 20 73 we are on the s
72b0: 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 econd iteration
72c0: 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a and. **
72d0: 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73 current term is
72e0: 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20 from the first
72f0: 69 74 65 72 61 74 69 6f 6e 2e 20 20 53 6f 20 73 iteration. So s
7300: 6b 69 70 20 74 68 69 73 20 74 65 72 6d 2e 20 2a kip this term. *
7310: 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 /. asse
7320: 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 rt( j==1 );.
7330: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a continue;.
7340: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
7350: 20 20 69 66 28 20 28 63 68 6e 67 54 6f 49 4e 20 if( (chngToIN
7360: 26 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65 & sqlite3WhereGe
7370: 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 tMask(&pWInfo->s
7380: 4d 61 73 6b 53 65 74 2c 0a 20 20 20 20 20 20 20 MaskSet,.
7390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
73a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
73b0: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 pOrTerm->le
73c0: 66 74 43 75 72 73 6f 72 29 29 3d 3d 30 20 29 7b ftCursor))==0 ){
73d0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 . /* Th
73e0: 69 73 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20 is term must be
73f0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 74 31 2e 61 of the form t1.a
7400: 3d 3d 74 32 2e 62 20 77 68 65 72 65 20 74 32 20 ==t2.b where t2
7410: 69 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 is in the.
7420: 20 20 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 ** chngToIN
7430: 73 65 74 20 62 75 74 20 74 31 20 69 73 20 6e 6f set but t1 is no
7440: 74 2e 20 20 54 68 69 73 20 74 65 72 6d 20 77 69 t. This term wi
7450: 6c 6c 20 62 65 20 65 69 74 68 65 72 20 70 72 65 ll be either pre
7460: 63 65 64 65 64 0a 20 20 20 20 20 20 20 20 20 20 ceded.
7470: 2a 2a 20 6f 72 20 66 6f 6c 6c 77 65 64 20 62 79 ** or follwed by
7480: 20 61 6e 20 69 6e 76 65 72 74 65 64 20 63 6f 70 an inverted cop
7490: 79 20 28 74 32 2e 62 3d 3d 74 31 2e 61 29 2e 20 y (t2.b==t1.a).
74a0: 20 53 6b 69 70 20 74 68 69 73 20 74 65 72 6d 20 Skip this term
74b0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e . ** an
74c0: 64 20 75 73 65 20 69 74 73 20 69 6e 76 65 72 73 d use its invers
74d0: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 ion. */.
74e0: 20 20 74 65 73 74 63 61 73 65 28 20 70 4f 72 54 testcase( pOrT
74f0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 erm->wtFlags & T
7500: 45 52 4d 5f 43 4f 50 49 45 44 20 29 3b 0a 20 20 ERM_COPIED );.
7510: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 testcase
7520: 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 ( pOrTerm->wtFla
7530: 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 gs & TERM_VIRTUA
7540: 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 L );. a
7550: 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e ssert( pOrTerm->
7560: 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f wtFlags & (TERM_
7570: 43 4f 50 49 45 44 7c 54 45 52 4d 5f 56 49 52 54 COPIED|TERM_VIRT
7580: 55 41 4c 29 20 29 3b 0a 20 20 20 20 20 20 20 20 UAL) );.
7590: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 continue;.
75a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 43 }. iC
75b0: 6f 6c 75 6d 6e 20 3d 20 70 4f 72 54 65 72 6d 2d olumn = pOrTerm-
75c0: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 >u.leftColumn;.
75d0: 20 20 20 20 20 20 20 69 43 75 72 73 6f 72 20 3d iCursor =
75e0: 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 pOrTerm->leftCu
75f0: 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 62 72 rsor;. br
7600: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 eak;. }.
7610: 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 if( i<0 ){.
7620: 20 20 20 20 20 20 2f 2a 20 4e 6f 20 63 61 6e 64 /* No cand
7630: 69 64 61 74 65 20 74 61 62 6c 65 2b 63 6f 6c 75 idate table+colu
7640: 6d 6e 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 54 mn was found. T
7650: 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 his can only occ
7660: 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e ur. ** on
7670: 20 74 68 65 20 73 65 63 6f 6e 64 20 69 74 65 72 the second iter
7680: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 ation */.
7690: 20 61 73 73 65 72 74 28 20 6a 3d 3d 31 20 29 3b assert( j==1 );
76a0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 . assert(
76b0: 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 63 68 IsPowerOfTwo(ch
76c0: 6e 67 54 6f 49 4e 29 20 29 3b 0a 20 20 20 20 20 ngToIN) );.
76d0: 20 20 20 61 73 73 65 72 74 28 20 63 68 6e 67 54 assert( chngT
76e0: 6f 49 4e 3d 3d 73 71 6c 69 74 65 33 57 68 65 72 oIN==sqlite3Wher
76f0: 65 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f eGetMask(&pWInfo
7700: 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 ->sMaskSet, iCur
7710: 73 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 sor) );.
7720: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 break;. }.
7730: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a testcase( j
7740: 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a ==1 );.. /*
7750: 20 57 65 20 68 61 76 65 20 66 6f 75 6e 64 20 61 We have found a
7760: 20 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65 candidate table
7770: 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 43 68 and column. Ch
7780: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 eck to see if th
7790: 61 74 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c at. ** tabl
77a0: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73 20 e and column is
77b0: 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 common to every
77c0: 74 65 72 6d 20 69 6e 20 74 68 65 20 4f 52 20 63 term in the OR c
77d0: 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 6f lause */. o
77e0: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 31 3b kToChngToIN = 1;
77f0: 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 69 3e 3d . for(; i>=
7800: 30 20 26 26 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 0 && okToChngToI
7810: 4e 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b N; i--, pOrTerm+
7820: 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 +){. asse
7830: 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 rt( pOrTerm->eOp
7840: 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 erator & WO_EQ )
7850: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f ;. if( pO
7860: 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f rTerm->leftCurso
7870: 72 21 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 r!=iCursor ){.
7880: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d pOrTerm-
7890: 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 >wtFlags &= ~TER
78a0: 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 M_OR_OK;.
78b0: 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 }else if( pOrTe
78c0: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e rm->u.leftColumn
78d0: 21 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 !=iColumn ){.
78e0: 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 okToChngT
78f0: 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 oIN = 0;.
7900: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 }else{.
7910: 20 20 69 6e 74 20 61 66 66 4c 65 66 74 2c 20 61 int affLeft, a
7920: 66 66 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 ffRight;.
7930: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 69 67 /* If the rig
7940: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 ht-hand side is
7950: 61 6c 73 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 also a column, t
7960: 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 69 hen the affiniti
7970: 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 es. **
7980: 6f 66 20 62 6f 74 68 20 72 69 67 68 74 20 61 6e of both right an
7990: 64 20 6c 65 66 74 20 73 69 64 65 73 20 6d 75 73 d left sides mus
79a0: 74 20 62 65 20 73 75 63 68 20 74 68 61 74 20 6e t be such that n
79b0: 6f 20 74 79 70 65 0a 20 20 20 20 20 20 20 20 20 o type.
79c0: 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 ** conversions
79d0: 61 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e 20 are required on
79e0: 74 68 65 20 72 69 67 68 74 2e 20 20 28 54 69 63 the right. (Tic
79f0: 6b 65 74 20 23 32 32 34 39 29 0a 20 20 20 20 20 ket #2249).
7a00: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 */.
7a10: 20 20 61 66 66 52 69 67 68 74 20 3d 20 73 71 6c affRight = sql
7a20: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 ite3ExprAffinity
7a30: 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d (pOrTerm->pExpr-
7a40: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 >pRight);.
7a50: 20 20 20 20 61 66 66 4c 65 66 74 20 3d 20 73 71 affLeft = sq
7a60: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 lite3ExprAffinit
7a70: 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 y(pOrTerm->pExpr
7a80: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 ->pLeft);.
7a90: 20 20 20 20 69 66 28 20 61 66 66 52 69 67 68 74 if( affRight
7aa0: 21 3d 30 20 26 26 20 61 66 66 52 69 67 68 74 21 !=0 && affRight!
7ab0: 3d 61 66 66 4c 65 66 74 20 29 7b 0a 20 20 20 20 =affLeft ){.
7ac0: 20 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 okToChng
7ad0: 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 ToIN = 0;.
7ae0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
7af0: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e pOrTerm->
7b00: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f wtFlags |= TERM_
7b10: 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 OR_OK;.
7b20: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 }. }.
7b30: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 }. }..
7b40: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 /* At this point
7b50: 2c 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69 , okToChngToIN i
7b60: 73 20 74 72 75 65 20 69 66 20 6f 72 69 67 69 6e s true if origin
7b70: 61 6c 20 70 54 65 72 6d 20 73 61 74 69 73 66 69 al pTerm satisfi
7b80: 65 73 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 31 es. ** case 1
7b90: 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c . In that case,
7ba0: 20 63 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 construct a new
7bb0: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 74 68 virtual term th
7bc0: 61 74 20 69 73 20 0a 20 20 20 20 2a 2a 20 70 54 at is . ** pT
7bd0: 65 72 6d 20 63 6f 6e 76 65 72 74 65 64 20 69 6e erm converted in
7be0: 74 6f 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f to an IN operato
7bf0: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 r.. */. if
7c00: 28 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 29 ( okToChngToIN )
7c10: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44 {. Expr *pD
7c20: 75 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f up; /
7c30: 2a 20 41 20 74 72 61 6e 73 69 65 6e 74 20 64 75 * A transient du
7c40: 70 6c 69 63 61 74 65 20 65 78 70 72 65 73 73 69 plicate expressi
7c50: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 on */. Expr
7c60: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b List *pList = 0;
7c70: 20 20 20 2f 2a 20 54 68 65 20 52 48 53 20 6f 66 /* The RHS of
7c80: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 the IN operator
7c90: 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a */. Expr *
7ca0: 70 4c 65 66 74 20 3d 20 30 3b 20 20 20 20 20 20 pLeft = 0;
7cb0: 20 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66 20 74 /* The LHS of t
7cc0: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a he IN operator *
7cd0: 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e /. Expr *pN
7ce0: 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f ew; /
7cf0: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 49 * The complete I
7d00: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 0a 20 N operator */..
7d10: 20 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 for(i=pOrWc
7d20: 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 ->nTerm-1, pOrTe
7d30: 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d rm=pOrWc->a; i>=
7d40: 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 0; i--, pOrTerm+
7d50: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 +){. if(
7d60: 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 (pOrTerm->wtFlag
7d70: 73 20 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d s & TERM_OR_OK)=
7d80: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 =0 ) continue;.
7d90: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 assert( p
7da0: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f OrTerm->eOperato
7db0: 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 r & WO_EQ );.
7dc0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 assert( pOr
7dd0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 Term->leftCursor
7de0: 3d 3d 69 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 ==iCursor );.
7df0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 assert( pOr
7e00: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 Term->u.leftColu
7e10: 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 3b 0a 20 mn==iColumn );.
7e20: 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 pDup = sq
7e30: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c lite3ExprDup(db,
7e40: 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d pOrTerm->pExpr-
7e50: 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 >pRight, 0);.
7e60: 20 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c pList = sql
7e70: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 ite3ExprListAppe
7e80: 6e 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 nd(pWInfo->pPars
7e90: 65 2c 20 70 4c 69 73 74 2c 20 70 44 75 70 29 3b e, pList, pDup);
7ea0: 0a 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d . pLeft =
7eb0: 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d pOrTerm->pExpr-
7ec0: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d 0a >pLeft;. }.
7ed0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c assert( pL
7ee0: 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 eft!=0 );.
7ef0: 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 pDup = sqlite3Ex
7f00: 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c prDup(db, pLeft,
7f10: 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 0);. pNew
7f20: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 = sqlite3PExpr(p
7f30: 50 61 72 73 65 2c 20 54 4b 5f 49 4e 2c 20 70 44 Parse, TK_IN, pD
7f40: 75 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 up, 0);. if
7f50: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 ( pNew ){.
7f60: 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 int idxNew;.
7f70: 20 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f transferJo
7f80: 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c inMarkings(pNew,
7f90: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 pExpr);.
7fa0: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 assert( !ExprHa
7fb0: 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 sProperty(pNew,
7fc0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b EP_xIsSelect) );
7fd0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 . pNew->x
7fe0: 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a .pList = pList;.
7ff0: 20 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d idxNew =
8000: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 whereClauseInse
8010: 72 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45 rt(pWC, pNew, TE
8020: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f RM_VIRTUAL|TERM_
8030: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 DYNAMIC);.
8040: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e testcase( idxN
8050: 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 ew==0 );.
8060: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 exprAnalyze(pSr
8070: 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b c, pWC, idxNew);
8080: 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 54 65 72 . /* pTer
8090: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 m = &pWC->a[idxT
80a0: 65 72 6d 5d 3b 20 2f 2f 20 77 6f 75 6c 64 20 62 erm]; // would b
80b0: 65 20 6e 65 65 64 65 64 20 69 66 20 70 54 65 72 e needed if pTer
80c0: 6d 20 77 68 65 72 65 20 75 73 65 64 20 61 67 61 m where used aga
80d0: 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 61 in */. ma
80e0: 72 6b 54 65 72 6d 41 73 43 68 69 6c 64 28 70 57 rkTermAsChild(pW
80f0: 43 2c 20 69 64 78 4e 65 77 2c 20 69 64 78 54 65 C, idxNew, idxTe
8100: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 rm);. }else
8110: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 {. sqlite
8120: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 3ExprListDelete(
8130: 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 db, pList);.
8140: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a }. }. }.}.
8150: 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 #endif /* !SQLIT
8160: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 E_OMIT_OR_OPTIMI
8170: 5a 41 54 49 4f 4e 20 26 26 20 21 53 51 4c 49 54 ZATION && !SQLIT
8180: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 E_OMIT_SUBQUERY
8190: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 61 6c 72 */../*.** We alr
81a0: 65 61 64 79 20 6b 6e 6f 77 20 74 68 61 74 20 70 eady know that p
81b0: 45 78 70 72 20 69 73 20 61 20 62 69 6e 61 72 79 Expr is a binary
81c0: 20 6f 70 65 72 61 74 6f 72 20 77 68 65 72 65 20 operator where
81d0: 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 61 72 both operands ar
81e0: 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 72 65 66 65 e.** column refe
81f0: 72 65 6e 63 65 73 2e 20 20 54 68 69 73 20 72 6f rences. This ro
8200: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74 6f 20 utine checks to
8210: 73 65 65 20 69 66 20 70 45 78 70 72 20 69 73 20 see if pExpr is
8220: 61 6e 20 65 71 75 69 76 61 6c 65 6e 63 65 0a 2a an equivalence.*
8230: 2a 20 72 65 6c 61 74 69 6f 6e 3a 0a 2a 2a 20 20 * relation:.**
8240: 20 31 2e 20 20 54 68 65 20 53 51 4c 49 54 45 5f 1. The SQLITE_
8250: 54 72 61 6e 73 69 74 69 76 65 20 6f 70 74 69 6d Transitive optim
8260: 69 7a 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 ization must be
8270: 65 6e 61 62 6c 65 64 0a 2a 2a 20 20 20 32 2e 20 enabled.** 2.
8280: 20 4d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 Must be either
8290: 61 6e 20 3d 3d 20 6f 72 20 61 6e 20 49 53 20 6f an == or an IS o
82a0: 70 65 72 61 74 6f 72 0a 2a 2a 20 20 20 33 2e 20 perator.** 3.
82b0: 20 4e 6f 74 20 6f 72 69 67 69 6e 61 74 69 6e 67 Not originating
82c0: 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 in the ON claus
82d0: 65 20 6f 66 20 61 6e 20 4f 55 54 45 52 20 4a 4f e of an OUTER JO
82e0: 49 4e 0a 2a 2a 20 20 20 34 2e 20 20 54 68 65 20 IN.** 4. The
82f0: 61 66 66 69 6e 69 74 69 65 73 20 6f 66 20 41 20 affinities of A
8300: 61 6e 64 20 42 20 6d 75 73 74 20 62 65 20 63 6f and B must be co
8310: 6d 70 61 74 69 62 6c 65 0a 2a 2a 20 20 20 35 61 mpatible.** 5a
8320: 2e 20 42 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 . Both operands
8330: 75 73 65 20 74 68 65 20 73 61 6d 65 20 63 6f 6c use the same col
8340: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 lating sequence
8350: 4f 52 0a 2a 2a 20 20 20 35 62 2e 20 54 68 65 20 OR.** 5b. The
8360: 6f 76 65 72 61 6c 6c 20 63 6f 6c 6c 61 74 69 6e overall collatin
8370: 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 42 49 g sequence is BI
8380: 4e 41 52 59 0a 2a 2a 20 49 66 20 74 68 69 73 20 NARY.** If this
8390: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 routine returns
83a0: 54 52 55 45 2c 20 74 68 61 74 20 6d 65 61 6e 73 TRUE, that means
83b0: 20 74 68 61 74 20 74 68 65 20 52 48 53 20 63 61 that the RHS ca
83c0: 6e 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64 n be substituted
83d0: 0a 2a 2a 20 66 6f 72 20 74 68 65 20 4c 48 53 20 .** for the LHS
83e0: 61 6e 79 70 6c 61 63 65 20 65 6c 73 65 20 69 6e anyplace else in
83f0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 the WHERE claus
8400: 65 20 77 68 65 72 65 20 74 68 65 20 4c 48 53 20 e where the LHS
8410: 63 6f 6c 75 6d 6e 20 6f 63 63 75 72 73 2e 0a 2a column occurs..*
8420: 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 * This is an opt
8430: 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 4e 6f 20 68 imization. No h
8440: 61 72 6d 20 63 6f 6d 65 73 20 66 72 6f 6d 20 72 arm comes from r
8450: 65 74 75 72 6e 69 6e 67 20 30 2e 20 20 42 75 74 eturning 0. But
8460: 20 69 66 20 31 20 69 73 0a 2a 2a 20 72 65 74 75 if 1 is.** retu
8470: 72 6e 65 64 20 77 68 65 6e 20 69 74 20 73 68 6f rned when it sho
8480: 75 6c 64 20 6e 6f 74 20 62 65 2c 20 74 68 65 6e uld not be, then
8490: 20 69 6e 63 6f 72 72 65 63 74 20 61 6e 73 77 65 incorrect answe
84a0: 72 73 20 6d 69 67 68 74 20 72 65 73 75 6c 74 2e rs might result.
84b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 .*/.static int t
84c0: 65 72 6d 49 73 45 71 75 69 76 61 6c 65 6e 63 65 ermIsEquivalence
84d0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 (Parse *pParse,
84e0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 Expr *pExpr){.
84f0: 63 68 61 72 20 61 66 66 31 2c 20 61 66 66 32 3b char aff1, aff2;
8500: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c . CollSeq *pCol
8510: 6c 3b 0a 20 20 69 66 28 20 21 4f 70 74 69 6d 69 l;. if( !Optimi
8520: 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50 zationEnabled(pP
8530: 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 arse->db, SQLITE
8540: 5f 54 72 61 6e 73 69 74 69 76 65 29 20 29 20 72 _Transitive) ) r
8550: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 eturn 0;. if( p
8560: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 Expr->op!=TK_EQ
8570: 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b && pExpr->op!=TK
8580: 5f 49 53 20 29 20 72 65 74 75 72 6e 20 30 3b 0a _IS ) return 0;.
8590: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f if( ExprHasPro
85a0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f perty(pExpr, EP_
85b0: 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 FromJoin) ) retu
85c0: 72 6e 20 30 3b 0a 20 20 61 66 66 31 20 3d 20 73 rn 0;. aff1 = s
85d0: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 qlite3ExprAffini
85e0: 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 ty(pExpr->pLeft)
85f0: 3b 0a 20 20 61 66 66 32 20 3d 20 73 71 6c 69 74 ;. aff2 = sqlit
8600: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 e3ExprAffinity(p
8610: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 Expr->pRight);.
8620: 20 69 66 28 20 61 66 66 31 21 3d 61 66 66 32 0a if( aff1!=aff2.
8630: 20 20 20 26 26 20 28 21 73 71 6c 69 74 65 33 49 && (!sqlite3I
8640: 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 sNumericAffinity
8650: 28 61 66 66 31 29 20 7c 7c 20 21 73 71 6c 69 74 (aff1) || !sqlit
8660: 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e e3IsNumericAffin
8670: 69 74 79 28 61 66 66 32 29 29 0a 20 20 29 7b 0a ity(aff2)). ){.
8680: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 return 0;.
8690: 7d 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 }. pColl = sqli
86a0: 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 te3BinaryCompare
86b0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 CollSeq(pParse,
86c0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 pExpr->pLeft, pE
86d0: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 xpr->pRight);.
86e0: 69 66 28 20 73 71 6c 69 74 65 33 49 73 42 69 6e if( sqlite3IsBin
86f0: 61 72 79 28 70 43 6f 6c 6c 29 20 29 20 72 65 74 ary(pColl) ) ret
8700: 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 urn 1;. return
8710: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 sqlite3ExprCollS
8720: 65 71 4d 61 74 63 68 28 70 50 61 72 73 65 2c 20 eqMatch(pParse,
8730: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 pExpr->pLeft, pE
8740: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 7d 0a xpr->pRight);.}.
8750: 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 ./*.** Recursive
8760: 6c 79 20 77 61 6c 6b 20 74 68 65 20 65 78 70 72 ly walk the expr
8770: 65 73 73 69 6f 6e 73 20 6f 66 20 61 20 53 45 4c essions of a SEL
8780: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e ECT statement an
8790: 64 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 61 20 d generate.** a
87a0: 62 69 74 6d 61 73 6b 20 69 6e 64 69 63 61 74 69 bitmask indicati
87b0: 6e 67 20 77 68 69 63 68 20 74 61 62 6c 65 73 20 ng which tables
87c0: 61 72 65 20 75 73 65 64 20 69 6e 20 74 68 61 74 are used in that
87d0: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 expression.** t
87e0: 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 ree..*/.static B
87f0: 69 74 6d 61 73 6b 20 65 78 70 72 53 65 6c 65 63 itmask exprSelec
8800: 74 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b tUsage(WhereMask
8810: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 53 Set *pMaskSet, S
8820: 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42 69 elect *pS){. Bi
8830: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a tmask mask = 0;.
8840: 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b 0a 20 while( pS ){.
8850: 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 SrcList *pSrc
8860: 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 = pS->pSrc;.
8870: 20 6d 61 73 6b 20 7c 3d 20 73 71 6c 69 74 65 33 mask |= sqlite3
8880: 57 68 65 72 65 45 78 70 72 4c 69 73 74 55 73 61 WhereExprListUsa
8890: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d ge(pMaskSet, pS-
88a0: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 6d 61 >pEList);. ma
88b0: 73 6b 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 sk |= sqlite3Whe
88c0: 72 65 45 78 70 72 4c 69 73 74 55 73 61 67 65 28 reExprListUsage(
88d0: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 47 pMaskSet, pS->pG
88e0: 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 6d 61 73 roupBy);. mas
88f0: 6b 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 72 k |= sqlite3Wher
8900: 65 45 78 70 72 4c 69 73 74 55 73 61 67 65 28 70 eExprListUsage(p
8910: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 4f 72 MaskSet, pS->pOr
8920: 64 65 72 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b derBy);. mask
8930: 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 |= sqlite3Where
8940: 45 78 70 72 55 73 61 67 65 28 70 4d 61 73 6b 53 ExprUsage(pMaskS
8950: 65 74 2c 20 70 53 2d 3e 70 57 68 65 72 65 29 3b et, pS->pWhere);
8960: 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 73 71 6c . mask |= sql
8970: 69 74 65 33 57 68 65 72 65 45 78 70 72 55 73 61 ite3WhereExprUsa
8980: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d ge(pMaskSet, pS-
8990: 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 69 >pHaving);. i
89a0: 66 28 20 41 4c 57 41 59 53 28 70 53 72 63 21 3d f( ALWAYS(pSrc!=
89b0: 30 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 0) ){. int
89c0: 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 i;. for(i=0
89d0: 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 ; i<pSrc->nSrc;
89e0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 i++){. ma
89f0: 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 sk |= exprSelect
8a00: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 Usage(pMaskSet,
8a10: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 pSrc->a[i].pSele
8a20: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 6d 61 73 ct);. mas
8a30: 6b 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 72 k |= sqlite3Wher
8a40: 65 45 78 70 72 55 73 61 67 65 28 70 4d 61 73 6b eExprUsage(pMask
8a50: 53 65 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e Set, pSrc->a[i].
8a60: 70 4f 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 pOn);. if
8a70: 28 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 66 67 2e ( pSrc->a[i].fg.
8a80: 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 isTabFunc ){.
8a90: 20 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 73 mask |= s
8aa0: 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 4c qlite3WhereExprL
8ab0: 69 73 74 55 73 61 67 65 28 70 4d 61 73 6b 53 65 istUsage(pMaskSe
8ac0: 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 75 31 t, pSrc->a[i].u1
8ad0: 2e 70 46 75 6e 63 41 72 67 29 3b 0a 20 20 20 20 .pFuncArg);.
8ae0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 }. }.
8af0: 20 20 7d 0a 20 20 20 20 70 53 20 3d 20 70 53 2d }. pS = pS-
8b00: 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 72 >pPrior;. }. r
8b10: 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f eturn mask;.}../
8b20: 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 *.** Expression
8b30: 70 45 78 70 72 20 69 73 20 6f 6e 65 20 6f 70 65 pExpr is one ope
8b40: 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61 72 rand of a compar
8b50: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20 74 68 ison operator th
8b60: 61 74 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 75 at might.** be u
8b70: 73 65 66 75 6c 20 66 6f 72 20 69 6e 64 65 78 69 seful for indexi
8b80: 6e 67 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e ng. This routin
8b90: 65 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 e checks to see
8ba0: 69 66 20 70 45 78 70 72 20 61 70 70 65 61 72 73 if pExpr appears
8bb0: 0a 2a 2a 20 69 6e 20 61 6e 79 20 69 6e 64 65 78 .** in any index
8bc0: 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 28 . Return TRUE (
8bd0: 31 29 20 69 66 20 70 45 78 70 72 20 69 73 20 61 1) if pExpr is a
8be0: 6e 20 69 6e 64 65 78 65 64 20 74 65 72 6d 20 61 n indexed term a
8bf0: 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 46 41 4c nd return.** FAL
8c00: 53 45 20 28 30 29 20 69 66 20 6e 6f 74 2e 20 20 SE (0) if not.
8c10: 49 66 20 54 52 55 45 20 69 73 20 72 65 74 75 72 If TRUE is retur
8c20: 6e 65 64 2c 20 61 6c 73 6f 20 73 65 74 20 61 69 ned, also set ai
8c30: 43 75 72 43 6f 6c 5b 30 5d 20 74 6f 20 74 68 65 CurCol[0] to the
8c40: 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 cursor.** numbe
8c50: 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 r of the table t
8c60: 68 61 74 20 69 73 20 69 6e 64 65 78 65 64 20 61 hat is indexed a
8c70: 6e 64 20 61 69 43 75 72 43 6f 6c 5b 31 5d 20 74 nd aiCurCol[1] t
8c80: 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d o the column num
8c90: 62 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 63 6f ber.** of the co
8ca0: 6c 75 6d 6e 20 74 68 61 74 20 69 73 20 69 6e 64 lumn that is ind
8cb0: 65 78 65 64 2c 20 6f 72 20 58 4e 5f 45 58 50 52 exed, or XN_EXPR
8cc0: 20 28 2d 32 29 20 69 66 20 61 6e 20 65 78 70 72 (-2) if an expr
8cd0: 65 73 73 69 6f 6e 20 69 73 20 62 65 69 6e 67 0a ession is being.
8ce0: 2a 2a 20 69 6e 64 65 78 65 64 2e 0a 2a 2a 0a 2a ** indexed..**.*
8cf0: 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61 20 * If pExpr is a
8d00: 54 4b 5f 43 4f 4c 55 4d 4e 20 63 6f 6c 75 6d 6e TK_COLUMN column
8d10: 20 72 65 66 65 72 65 6e 63 65 2c 20 74 68 65 6e reference, then
8d20: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c this routine al
8d30: 77 61 79 73 20 72 65 74 75 72 6e 73 0a 2a 2a 20 ways returns.**
8d40: 74 72 75 65 20 65 76 65 6e 20 69 66 20 74 68 61 true even if tha
8d50: 74 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6c t particular col
8d60: 75 6d 6e 20 69 73 20 6e 6f 74 20 69 6e 64 65 78 umn is not index
8d70: 65 64 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 ed, because the
8d80: 63 6f 6c 75 6d 6e 0a 2a 2a 20 6d 69 67 68 74 20 column.** might
8d90: 62 65 20 61 64 64 65 64 20 74 6f 20 61 6e 20 61 be added to an a
8da0: 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6c utomatic index l
8db0: 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 ater..*/.static
8dc0: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 SQLITE_NOINLINE
8dd0: 69 6e 74 20 65 78 70 72 4d 69 67 68 74 42 65 49 int exprMightBeI
8de0: 6e 64 65 78 65 64 32 28 0a 20 20 53 72 63 4c 69 ndexed2(. SrcLi
8df0: 73 74 20 2a 70 46 72 6f 6d 2c 20 20 20 20 20 20 st *pFrom,
8e00: 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c /* The FROM cl
8e10: 61 75 73 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 ause */. Bitmas
8e20: 6b 20 6d 50 72 65 72 65 71 2c 20 20 20 20 20 20 k mPrereq,
8e30: 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 46 /* Bitmask of F
8e40: 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73 ROM clause terms
8e50: 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20 70 referenced by p
8e60: 45 78 70 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 Expr */. int *a
8e70: 69 43 75 72 43 6f 6c 2c 20 20 20 20 20 20 20 20 iCurCol,
8e80: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 /* Write the re
8e90: 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 20 63 ferenced table c
8ea0: 75 72 73 6f 72 20 61 6e 64 20 63 6f 6c 75 6d 6e ursor and column
8eb0: 20 68 65 72 65 20 2a 2f 0a 20 20 45 78 70 72 20 here */. Expr
8ec0: 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 *pExpr
8ed0: 20 20 2f 2a 20 41 6e 20 6f 70 65 72 61 6e 64 20 /* An operand
8ee0: 6f 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 of a comparison
8ef0: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 operator */.){.
8f00: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 Index *pIdx;.
8f10: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 43 75 int i;. int iCu
8f20: 72 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 6d 50 r;. for(i=0; mP
8f30: 72 65 72 65 71 3e 31 3b 20 69 2b 2b 2c 20 6d 50 rereq>1; i++, mP
8f40: 72 65 72 65 71 3e 3e 3d 31 29 7b 7d 0a 20 20 69 rereq>>=1){}. i
8f50: 43 75 72 20 3d 20 70 46 72 6f 6d 2d 3e 61 5b 69 Cur = pFrom->a[i
8f60: 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 66 6f 72 ].iCursor;. for
8f70: 28 70 49 64 78 3d 70 46 72 6f 6d 2d 3e 61 5b 69 (pIdx=pFrom->a[i
8f80: 5d 2e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 ].pTab->pIndex;
8f90: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d pIdx; pIdx=pIdx-
8fa0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 >pNext){. if(
8fb0: 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 3d pIdx->aColExpr=
8fc0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 =0 ) continue;.
8fd0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 for(i=0; i<pI
8fe0: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b dx->nKeyCol; i++
8ff0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 ){. if( pId
9000: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 21 3d x->aiColumn[i]!=
9010: 58 4e 5f 45 58 50 52 20 29 20 63 6f 6e 74 69 6e XN_EXPR ) contin
9020: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 ue;. if( sq
9030: 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 lite3ExprCompare
9040: 53 6b 69 70 28 70 45 78 70 72 2c 20 70 49 64 78 Skip(pExpr, pIdx
9050: 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 69 5d ->aColExpr->a[i]
9060: 2e 70 45 78 70 72 2c 20 69 43 75 72 29 3d 3d 30 .pExpr, iCur)==0
9070: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 69 43 75 ){. aiCu
9080: 72 43 6f 6c 5b 30 5d 20 3d 20 69 43 75 72 3b 0a rCol[0] = iCur;.
9090: 20 20 20 20 20 20 20 20 61 69 43 75 72 43 6f 6c aiCurCol
90a0: 5b 31 5d 20 3d 20 58 4e 5f 45 58 50 52 3b 0a 20 [1] = XN_EXPR;.
90b0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b return 1;
90c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 . }. }.
90d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d }. return 0;.}
90e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 .static int expr
90f0: 4d 69 67 68 74 42 65 49 6e 64 65 78 65 64 28 0a MightBeIndexed(.
9100: 20 20 53 72 63 4c 69 73 74 20 2a 70 46 72 6f 6d SrcList *pFrom
9110: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 , /* The
9120: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 FROM clause */.
9130: 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 72 65 71 Bitmask mPrereq
9140: 2c 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 , /* Bitma
9150: 73 6b 20 6f 66 20 46 52 4f 4d 20 63 6c 61 75 73 sk of FROM claus
9160: 65 20 74 65 72 6d 73 20 72 65 66 65 72 65 6e 63 e terms referenc
9170: 65 64 20 62 79 20 70 45 78 70 72 20 2a 2f 0a 20 ed by pExpr */.
9180: 20 69 6e 74 20 2a 61 69 43 75 72 43 6f 6c 2c 20 int *aiCurCol,
9190: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 /* Write
91a0: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 the referenced
91b0: 74 61 62 6c 65 20 63 75 72 73 6f 72 20 26 20 63 table cursor & c
91c0: 6f 6c 75 6d 6e 20 68 65 72 65 20 2a 2f 0a 20 20 olumn here */.
91d0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 Expr *pExpr,
91e0: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 70 65 /* An ope
91f0: 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61 72 rand of a compar
9200: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20 2a 2f ison operator */
9210: 0a 20 20 69 6e 74 20 6f 70 20 20 20 20 20 20 20 . int op
9220: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 /* The
9230: 20 73 70 65 63 69 66 69 63 20 63 6f 6d 70 61 72 specific compar
9240: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20 2a 2f ison operator */
9250: 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 .){. /* If this
9260: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 expression is a
9270: 20 76 65 63 74 6f 72 20 74 6f 20 74 68 65 20 6c vector to the l
9280: 65 66 74 20 6f 72 20 72 69 67 68 74 20 6f 66 20 eft or right of
9290: 61 20 0a 20 20 2a 2a 20 69 6e 65 71 75 61 6c 69 a . ** inequali
92a0: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 3e ty constraint (>
92b0: 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29 2c 20 , <, >= or <=),
92c0: 70 65 72 66 6f 72 6d 20 74 68 65 20 70 72 6f 63 perform the proc
92d0: 65 73 73 69 6e 67 20 0a 20 20 2a 2a 20 6f 6e 20 essing . ** on
92e0: 74 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e the first elemen
92f0: 74 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 2e t of the vector.
9300: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 54 */. assert( T
9310: 4b 5f 47 54 2b 31 3d 3d 54 4b 5f 4c 45 20 26 26 K_GT+1==TK_LE &&
9320: 20 54 4b 5f 47 54 2b 32 3d 3d 54 4b 5f 4c 54 20 TK_GT+2==TK_LT
9330: 26 26 20 54 4b 5f 47 54 2b 33 3d 3d 54 4b 5f 47 && TK_GT+3==TK_G
9340: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54 E );. assert( T
9350: 4b 5f 49 53 3c 54 4b 5f 47 45 20 26 26 20 54 4b K_IS<TK_GE && TK
9360: 5f 49 53 4e 55 4c 4c 3c 54 4b 5f 47 45 20 26 26 _ISNULL<TK_GE &&
9370: 20 54 4b 5f 49 4e 3c 54 4b 5f 47 45 20 29 3b 0a TK_IN<TK_GE );.
9380: 20 20 61 73 73 65 72 74 28 20 6f 70 3c 3d 54 4b assert( op<=TK
9390: 5f 47 45 20 29 3b 0a 20 20 69 66 28 20 70 45 78 _GE );. if( pEx
93a0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f pr->op==TK_VECTO
93b0: 52 20 26 26 20 28 6f 70 3e 3d 54 4b 5f 47 54 20 R && (op>=TK_GT
93c0: 26 26 20 41 4c 57 41 59 53 28 6f 70 3c 3d 54 4b && ALWAYS(op<=TK
93d0: 5f 47 45 29 29 20 29 7b 0a 20 20 20 20 70 45 78 _GE)) ){. pEx
93e0: 70 72 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c pr = pExpr->x.pL
93f0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b ist->a[0].pExpr;
9400: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 45 78 70 . }.. if( pExp
9410: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e r->op==TK_COLUMN
9420: 20 29 7b 0a 20 20 20 20 61 69 43 75 72 43 6f 6c ){. aiCurCol
9430: 5b 30 5d 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 [0] = pExpr->iTa
9440: 62 6c 65 3b 0a 20 20 20 20 61 69 43 75 72 43 6f ble;. aiCurCo
9450: 6c 5b 31 5d 20 3d 20 70 45 78 70 72 2d 3e 69 43 l[1] = pExpr->iC
9460: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 72 65 74 75 72 olumn;. retur
9470: 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d n 1;. }. if( m
9480: 50 72 65 72 65 71 3d 3d 30 20 29 20 72 65 74 75 Prereq==0 ) retu
9490: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 rn 0;
94a0: 20 20 20 20 20 20 2f 2a 20 4e 6f 20 74 61 62 6c /* No tabl
94b0: 65 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a e references */.
94c0: 20 20 69 66 28 20 28 6d 50 72 65 72 65 71 26 28 if( (mPrereq&(
94d0: 6d 50 72 65 72 65 71 2d 31 29 29 21 3d 30 20 29 mPrereq-1))!=0 )
94e0: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 return 0; /*
94f0: 52 65 66 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f Refs more than o
9500: 6e 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 72 65 ne table */. re
9510: 74 75 72 6e 20 65 78 70 72 4d 69 67 68 74 42 65 turn exprMightBe
9520: 49 6e 64 65 78 65 64 32 28 70 46 72 6f 6d 2c 6d Indexed2(pFrom,m
9530: 50 72 65 72 65 71 2c 61 69 43 75 72 43 6f 6c 2c Prereq,aiCurCol,
9540: 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a pExpr);.}../*.**
9550: 20 54 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 The input to th
9560: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e is routine is an
9570: 20 57 68 65 72 65 54 65 72 6d 20 73 74 72 75 63 WhereTerm struc
9580: 74 75 72 65 20 77 69 74 68 20 6f 6e 6c 79 20 74 ture with only t
9590: 68 65 0a 2a 2a 20 22 70 45 78 70 72 22 20 66 69 he.** "pExpr" fi
95a0: 65 6c 64 20 66 69 6c 6c 65 64 20 69 6e 2e 20 20 eld filled in.
95b0: 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 The job of this
95c0: 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 61 6e routine is to an
95d0: 61 6c 79 7a 65 20 74 68 65 0a 2a 2a 20 73 75 62 alyze the.** sub
95e0: 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 expression and p
95f0: 6f 70 75 6c 61 74 65 20 61 6c 6c 20 74 68 65 20 opulate all the
9600: 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20 other fields of
9610: 74 68 65 20 57 68 65 72 65 54 65 72 6d 0a 2a 2a the WhereTerm.**
9620: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a structure..**.*
9630: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 * If the express
9640: 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f ion is of the fo
9650: 72 6d 20 22 3c 65 78 70 72 3e 20 3c 6f 70 3e 20 rm "<expr> <op>
9660: 58 22 20 69 74 20 67 65 74 73 20 63 6f 6d 6d 75 X" it gets commu
9670: 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 ted.** to the st
9680: 61 6e 64 61 72 64 20 66 6f 72 6d 20 6f 66 20 22 andard form of "
9690: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 2e 0a X <op> <expr>"..
96a0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 **.** If the exp
96b0: 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 ression is of th
96c0: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 e form "X <op> Y
96d0: 22 20 77 68 65 72 65 20 62 6f 74 68 20 58 20 61 " where both X a
96e0: 6e 64 20 59 20 61 72 65 0a 2a 2a 20 63 6f 6c 75 nd Y are.** colu
96f0: 6d 6e 73 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 mns, then the or
9700: 69 67 69 6e 61 6c 20 65 78 70 72 65 73 73 69 6f iginal expressio
9710: 6e 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 n is unchanged a
9720: 6e 64 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c nd a new virtual
9730: 0a 2a 2a 20 74 65 72 6d 20 6f 66 20 74 68 65 20 .** term of the
9740: 66 6f 72 6d 20 22 59 20 3c 6f 70 3e 20 58 22 20 form "Y <op> X"
9750: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 is added to the
9760: 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64 WHERE clause and
9770: 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 73 65 70 .** analyzed sep
9780: 61 72 61 74 65 6c 79 2e 20 20 54 68 65 20 6f 72 arately. The or
9790: 69 67 69 6e 61 6c 20 74 65 72 6d 20 69 73 20 6d iginal term is m
97a0: 61 72 6b 65 64 20 77 69 74 68 20 54 45 52 4d 5f arked with TERM_
97b0: 43 4f 50 49 45 44 0a 2a 2a 20 61 6e 64 20 74 68 COPIED.** and th
97c0: 65 20 6e 65 77 20 74 65 72 6d 20 69 73 20 6d 61 e new term is ma
97d0: 72 6b 65 64 20 77 69 74 68 20 54 45 52 4d 5f 44 rked with TERM_D
97e0: 59 4e 41 4d 49 43 20 28 62 65 63 61 75 73 65 20 YNAMIC (because
97f0: 69 74 27 73 20 70 45 78 70 72 0a 2a 2a 20 6e 65 it's pExpr.** ne
9800: 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 eds to be freed
9810: 77 69 74 68 20 74 68 65 20 57 68 65 72 65 43 6c with the WhereCl
9820: 61 75 73 65 29 20 61 6e 64 20 54 45 52 4d 5f 56 ause) and TERM_V
9830: 49 52 54 55 41 4c 20 28 62 65 63 61 75 73 65 20 IRTUAL (because
9840: 69 74 0a 2a 2a 20 69 73 20 61 20 63 6f 6d 6d 75 it.** is a commu
9850: 74 65 64 20 63 6f 70 79 20 6f 66 20 61 20 70 72 ted copy of a pr
9860: 69 6f 72 20 74 65 72 6d 2e 29 20 20 54 68 65 20 ior term.) The
9870: 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 20 68 61 original term ha
9880: 73 20 6e 43 68 69 6c 64 3d 31 0a 2a 2a 20 61 6e s nChild=1.** an
9890: 64 20 74 68 65 20 63 6f 70 79 20 68 61 73 20 69 d the copy has i
98a0: 64 78 50 61 72 65 6e 74 20 73 65 74 20 74 6f 20 dxParent set to
98b0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 the index of the
98c0: 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 2e 0a original term..
98d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 */.static void e
98e0: 78 70 72 41 6e 61 6c 79 7a 65 28 0a 20 20 53 72 xprAnalyze(. Sr
98f0: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 cList *pSrc,
9900: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 /* the F
9910: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 ROM clause */.
9920: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 WhereClause *pWC
9930: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 , /* the
9940: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f WHERE clause */
9950: 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20 . int idxTerm
9960: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
9970: 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 65 72 Index of the ter
9980: 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 m to be analyzed
9990: 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e */.){. WhereIn
99a0: 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43 fo *pWInfo = pWC
99b0: 2d 3e 70 57 49 6e 66 6f 3b 20 2f 2a 20 57 48 45 ->pWInfo; /* WHE
99c0: 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 RE clause proces
99d0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a sing context */.
99e0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 WhereTerm *pTe
99f0: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 rm;
9a00: 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 74 /* The term t
9a10: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f o be analyzed */
9a20: 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 . WhereMaskSet
9a30: 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20 20 20 *pMaskSet;
9a40: 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 74 61 /* Set of ta
9a50: 62 6c 65 20 69 6e 64 65 78 20 6d 61 73 6b 73 20 ble index masks
9a60: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 */. Expr *pExpr
9a70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
9a80: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 /* The exp
9a90: 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e ression to be an
9aa0: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 42 69 74 6d alyzed */. Bitm
9ab0: 61 73 6b 20 70 72 65 72 65 71 4c 65 66 74 3b 20 ask prereqLeft;
9ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
9ad0: 50 72 65 72 65 71 75 65 73 69 74 65 73 20 6f 66 Prerequesites of
9ae0: 20 74 68 65 20 70 45 78 70 72 2d 3e 70 4c 65 66 the pExpr->pLef
9af0: 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 t */. Bitmask p
9b00: 72 65 72 65 71 41 6c 6c 3b 20 20 20 20 20 20 20 rereqAll;
9b10: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65 /* Prere
9b20: 71 75 65 73 69 74 65 73 20 6f 66 20 70 45 78 70 quesites of pExp
9b30: 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 r */. Bitmask e
9b40: 78 74 72 61 52 69 67 68 74 20 3d 20 30 3b 20 20 xtraRight = 0;
9b50: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 /* Extra
9b60: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e dependencies on
9b70: 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20 LEFT JOIN */.
9b80: 45 78 70 72 20 2a 70 53 74 72 31 20 3d 20 30 3b Expr *pStr1 = 0;
9b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9ba0: 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f /* RHS of LIKE/
9bb0: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f GLOB operator */
9bc0: 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74 . int isComplet
9bd0: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 e = 0;
9be0: 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49 /* RHS of LI
9bf0: 4b 45 2f 47 4c 4f 42 20 65 6e 64 73 20 77 69 74 KE/GLOB ends wit
9c00: 68 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20 h wildcard */.
9c10: 69 6e 74 20 6e 6f 43 61 73 65 20 3d 20 30 3b 20 int noCase = 0;
9c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9c30: 20 2f 2a 20 75 70 70 65 72 63 61 73 65 20 65 71 /* uppercase eq
9c40: 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c 6f 77 65 uivalent to lowe
9c50: 72 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f rcase */. int o
9c60: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 p;
9c70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 /* T
9c80: 6f 70 2d 6c 65 76 65 6c 20 6f 70 65 72 61 74 6f op-level operato
9c90: 72 2e 20 20 70 45 78 70 72 2d 3e 6f 70 20 2a 2f r. pExpr->op */
9ca0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 . Parse *pParse
9cb0: 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 = pWInfo->pPars
9cc0: 65 3b 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 e; /* Parsing c
9cd0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 ontext */. sqli
9ce0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 te3 *db = pParse
9cf0: 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 ->db; /*
9d00: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 Database connect
9d10: 69 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 ion */. unsigne
9d20: 64 20 63 68 61 72 20 65 4f 70 32 20 3d 20 30 3b d char eOp2 = 0;
9d30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 70 32 /* op2
9d40: 20 76 61 6c 75 65 20 66 6f 72 20 4c 49 4b 45 2f value for LIKE/
9d50: 52 45 47 45 58 50 2f 47 4c 4f 42 20 2a 2f 0a 20 REGEXP/GLOB */.
9d60: 20 69 6e 74 20 6e 4c 65 66 74 3b 20 20 20 20 20 int nLeft;
9d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9d80: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 /* Number of e
9d90: 6c 65 6d 65 6e 74 73 20 6f 6e 20 6c 65 66 74 20 lements on left
9da0: 73 69 64 65 20 76 65 63 74 6f 72 20 2a 2f 0a 0a side vector */..
9db0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 if( db->malloc
9dc0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 Failed ){. re
9dd0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 65 72 turn;. }. pTer
9de0: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 m = &pWC->a[idxT
9df0: 65 72 6d 5d 3b 0a 20 20 70 4d 61 73 6b 53 65 74 erm];. pMaskSet
9e00: 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 = &pWInfo->sMas
9e10: 6b 53 65 74 3b 0a 20 20 70 45 78 70 72 20 3d 20 kSet;. pExpr =
9e20: 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 pTerm->pExpr;.
9e30: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f assert( pExpr->o
9e40: 70 21 3d 54 4b 5f 41 53 20 26 26 20 70 45 78 70 p!=TK_AS && pExp
9e50: 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 4c 41 54 r->op!=TK_COLLAT
9e60: 45 20 29 3b 0a 20 20 70 72 65 72 65 71 4c 65 66 E );. prereqLef
9e70: 74 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 t = sqlite3Where
9e80: 45 78 70 72 55 73 61 67 65 28 70 4d 61 73 6b 53 ExprUsage(pMaskS
9e90: 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 et, pExpr->pLeft
9ea0: 29 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d );. op = pExpr-
9eb0: 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 >op;. if( op==T
9ec0: 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 K_IN ){. asse
9ed0: 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 rt( pExpr->pRigh
9ee0: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 t==0 );. if(
9ef0: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b sqlite3ExprCheck
9f00: 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 IN(pParse, pExpr
9f10: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 ) ) return;.
9f20: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 if( ExprHasPrope
9f30: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 rty(pExpr, EP_xI
9f40: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 sSelect) ){.
9f50: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 pTerm->prereqR
9f60: 69 67 68 74 20 3d 20 65 78 70 72 53 65 6c 65 63 ight = exprSelec
9f70: 74 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c tUsage(pMaskSet,
9f80: 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 pExpr->x.pSelec
9f90: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 t);. }else{.
9fa0: 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 pTerm->prer
9fb0: 65 71 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 eqRight = sqlite
9fc0: 33 57 68 65 72 65 45 78 70 72 4c 69 73 74 55 73 3WhereExprListUs
9fd0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 age(pMaskSet, pE
9fe0: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 xpr->x.pList);.
9ff0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 }. }else if(
a000: 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 op==TK_ISNULL )
a010: 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 {. pTerm->pre
a020: 72 65 71 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 reqRight = 0;.
a030: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 65 72 6d }else{. pTerm
a040: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 ->prereqRight =
a050: 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 sqlite3WhereExpr
a060: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 Usage(pMaskSet,
a070: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a pExpr->pRight);.
a080: 20 20 7d 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e }. pMaskSet->
a090: 62 56 61 72 53 65 6c 65 63 74 20 3d 20 30 3b 0a bVarSelect = 0;.
a0a0: 20 20 70 72 65 72 65 71 41 6c 6c 20 3d 20 73 71 prereqAll = sq
a0b0: 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 55 73 lite3WhereExprUs
a0c0: 61 67 65 4e 4e 28 70 4d 61 73 6b 53 65 74 2c 20 ageNN(pMaskSet,
a0d0: 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 70 4d pExpr);. if( pM
a0e0: 61 73 6b 53 65 74 2d 3e 62 56 61 72 53 65 6c 65 askSet->bVarSele
a0f0: 63 74 20 29 20 70 54 65 72 6d 2d 3e 77 74 46 6c ct ) pTerm->wtFl
a100: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 56 41 52 53 ags |= TERM_VARS
a110: 45 4c 45 43 54 3b 0a 20 20 69 66 28 20 45 78 70 ELECT;. if( Exp
a120: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 rHasProperty(pEx
a130: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 pr, EP_FromJoin)
a140: 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 ){. Bitmask
a150: 78 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 x = sqlite3Where
a160: 47 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 GetMask(pMaskSet
a170: 2c 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a , pExpr->iRightJ
a180: 6f 69 6e 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 oinTable);. p
a190: 72 65 72 65 71 41 6c 6c 20 7c 3d 20 78 3b 0a 20 rereqAll |= x;.
a1a0: 20 20 20 65 78 74 72 61 52 69 67 68 74 20 3d 20 extraRight =
a1b0: 78 2d 31 3b 20 20 2f 2a 20 4f 4e 20 63 6c 61 75 x-1; /* ON clau
a1c0: 73 65 20 74 65 72 6d 73 20 6d 61 79 20 6e 6f 74 se terms may not
a1d0: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e be used with an
a1e0: 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20 20 index.
a1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a **
a200: 20 6f 6e 20 6c 65 66 74 20 74 61 62 6c 65 20 6f on left table o
a210: 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 f a LEFT JOIN.
a220: 54 69 63 6b 65 74 20 23 33 30 31 35 20 2a 2f 0a Ticket #3015 */.
a230: 20 20 20 20 69 66 28 20 28 70 72 65 72 65 71 41 if( (prereqA
a240: 6c 6c 3e 3e 31 29 3e 3d 78 20 29 7b 0a 20 20 20 ll>>1)>=x ){.
a250: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d sqlite3ErrorM
a260: 73 67 28 70 50 61 72 73 65 2c 20 22 4f 4e 20 63 sg(pParse, "ON c
a270: 6c 61 75 73 65 20 72 65 66 65 72 65 6e 63 65 73 lause references
a280: 20 74 61 62 6c 65 73 20 74 6f 20 69 74 73 20 72 tables to its r
a290: 69 67 68 74 22 29 3b 0a 20 20 20 20 20 20 72 65 ight");. re
a2a0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a turn;. }. }.
a2b0: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 pTerm->prereqA
a2c0: 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a ll = prereqAll;.
a2d0: 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 pTerm->leftCur
a2e0: 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 sor = -1;. pTer
a2f0: 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b m->iParent = -1;
a300: 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 . pTerm->eOpera
a310: 74 6f 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 tor = 0;. if( a
a320: 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 7b 0a llowedOp(op) ){.
a330: 20 20 20 20 69 6e 74 20 61 69 43 75 72 43 6f 6c int aiCurCol
a340: 5b 32 5d 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 [2];. Expr *p
a350: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 Left = sqlite3Ex
a360: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 prSkipCollate(pE
a370: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 xpr->pLeft);.
a380: 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 Expr *pRight =
a390: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 sqlite3ExprSkipC
a3a0: 6f 6c 6c 61 74 65 28 70 45 78 70 72 2d 3e 70 52 ollate(pExpr->pR
a3b0: 69 67 68 74 29 3b 0a 20 20 20 20 75 31 36 20 6f ight);. u16 o
a3c0: 70 4d 61 73 6b 20 3d 20 28 70 54 65 72 6d 2d 3e pMask = (pTerm->
a3d0: 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70 72 prereqRight & pr
a3e0: 65 72 65 71 4c 65 66 74 29 3d 3d 30 20 3f 20 57 ereqLeft)==0 ? W
a3f0: 4f 5f 41 4c 4c 20 3a 20 57 4f 5f 45 51 55 49 56 O_ALL : WO_EQUIV
a400: 3b 0a 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d ;.. if( pTerm
a410: 2d 3e 69 46 69 65 6c 64 3e 30 20 29 7b 0a 20 20 ->iField>0 ){.
a420: 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d assert( op==
a430: 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 61 TK_IN );. a
a440: 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 6f 70 ssert( pLeft->op
a450: 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 29 3b 0a 20 ==TK_VECTOR );.
a460: 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4c 65 pLeft = pLe
a470: 66 74 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 70 ft->x.pList->a[p
a480: 54 65 72 6d 2d 3e 69 46 69 65 6c 64 2d 31 5d 2e Term->iField-1].
a490: 70 45 78 70 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 pExpr;. }..
a4a0: 20 20 69 66 28 20 65 78 70 72 4d 69 67 68 74 42 if( exprMightB
a4b0: 65 49 6e 64 65 78 65 64 28 70 53 72 63 2c 20 70 eIndexed(pSrc, p
a4c0: 72 65 72 65 71 4c 65 66 74 2c 20 61 69 43 75 72 rereqLeft, aiCur
a4d0: 43 6f 6c 2c 20 70 4c 65 66 74 2c 20 6f 70 29 20 Col, pLeft, op)
a4e0: 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e ){. pTerm->
a4f0: 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 61 69 43 leftCursor = aiC
a500: 75 72 43 6f 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 urCol[0];.
a510: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c pTerm->u.leftCol
a520: 75 6d 6e 20 3d 20 61 69 43 75 72 43 6f 6c 5b 31 umn = aiCurCol[1
a530: 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e ];. pTerm->
a540: 65 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72 eOperator = oper
a550: 61 74 6f 72 4d 61 73 6b 28 6f 70 29 20 26 20 6f atorMask(op) & o
a560: 70 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 pMask;. }.
a570: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 if( op==TK_IS )
a580: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 pTerm->wtFlags
a590: 7c 3d 20 54 45 52 4d 5f 49 53 3b 0a 20 20 20 20 |= TERM_IS;.
a5a0: 69 66 28 20 70 52 69 67 68 74 20 0a 20 20 20 20 if( pRight .
a5b0: 20 26 26 20 65 78 70 72 4d 69 67 68 74 42 65 49 && exprMightBeI
a5c0: 6e 64 65 78 65 64 28 70 53 72 63 2c 20 70 54 65 ndexed(pSrc, pTe
a5d0: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 2c rm->prereqRight,
a5e0: 20 61 69 43 75 72 43 6f 6c 2c 20 70 52 69 67 68 aiCurCol, pRigh
a5f0: 74 2c 20 6f 70 29 0a 20 20 20 20 29 7b 0a 20 20 t, op). ){.
a600: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 WhereTerm *p
a610: 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72 20 New;. Expr
a620: 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 75 31 36 *pDup;. u16
a630: 20 65 45 78 74 72 61 4f 70 20 3d 20 30 3b 20 20 eExtraOp = 0;
a640: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 /* Extra b
a650: 69 74 73 20 66 6f 72 20 70 4e 65 77 2d 3e 65 4f its for pNew->eO
a660: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 perator */.
a670: 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e assert( pTerm->
a680: 69 46 69 65 6c 64 3d 3d 30 20 29 3b 0a 20 20 20 iField==0 );.
a690: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 if( pTerm->le
a6a0: 66 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20 ftCursor>=0 ){.
a6b0: 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 int idxNe
a6c0: 77 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 w;. pDup
a6d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 = sqlite3ExprDup
a6e0: 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a (db, pExpr, 0);.
a6f0: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e if( db->
a700: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a mallocFailed ){.
a710: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 sqlite
a720: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 3ExprDelete(db,
a730: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20 pDup);.
a740: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 return;.
a750: 20 7d 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65 }. idxNe
a760: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 w = whereClauseI
a770: 6e 73 65 72 74 28 70 57 43 2c 20 70 44 75 70 2c nsert(pWC, pDup,
a780: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 TERM_VIRTUAL|TE
a790: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 RM_DYNAMIC);.
a7a0: 20 20 20 20 20 69 66 28 20 69 64 78 4e 65 77 3d if( idxNew=
a7b0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 =0 ) return;.
a7c0: 20 20 20 20 20 70 4e 65 77 20 3d 20 26 70 57 43 pNew = &pWC
a7d0: 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 ->a[idxNew];.
a7e0: 20 20 20 20 20 6d 61 72 6b 54 65 72 6d 41 73 43 markTermAsC
a7f0: 68 69 6c 64 28 70 57 43 2c 20 69 64 78 4e 65 77 hild(pWC, idxNew
a800: 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20 20 , idxTerm);.
a810: 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 if( op==TK_I
a820: 53 20 29 20 70 4e 65 77 2d 3e 77 74 46 6c 61 67 S ) pNew->wtFlag
a830: 73 20 7c 3d 20 54 45 52 4d 5f 49 53 3b 0a 20 20 s |= TERM_IS;.
a840: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 pTerm = &p
a850: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a WC->a[idxTerm];.
a860: 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 pTerm->w
a870: 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 tFlags |= TERM_C
a880: 4f 50 49 45 44 3b 0a 0a 20 20 20 20 20 20 20 20 OPIED;..
a890: 69 66 28 20 74 65 72 6d 49 73 45 71 75 69 76 61 if( termIsEquiva
a8a0: 6c 65 6e 63 65 28 70 50 61 72 73 65 2c 20 70 44 lence(pParse, pD
a8b0: 75 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 up) ){.
a8c0: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f pTerm->eOperato
a8d0: 72 20 7c 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 r |= WO_EQUIV;.
a8e0: 20 20 20 20 20 20 20 20 20 65 45 78 74 72 61 4f eExtraO
a8f0: 70 20 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 p = WO_EQUIV;.
a900: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 }. }e
a910: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 75 lse{. pDu
a920: 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 p = pExpr;.
a930: 20 20 20 70 4e 65 77 20 3d 20 70 54 65 72 6d 3b pNew = pTerm;
a940: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 . }. e
a950: 78 70 72 43 6f 6d 6d 75 74 65 28 70 50 61 72 73 xprCommute(pPars
a960: 65 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 e, pDup);.
a970: 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72 pNew->leftCursor
a980: 20 3d 20 61 69 43 75 72 43 6f 6c 5b 30 5d 3b 0a = aiCurCol[0];.
a990: 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 6c 65 pNew->u.le
a9a0: 66 74 43 6f 6c 75 6d 6e 20 3d 20 61 69 43 75 72 ftColumn = aiCur
a9b0: 43 6f 6c 5b 31 5d 3b 0a 20 20 20 20 20 20 74 65 Col[1];. te
a9c0: 73 74 63 61 73 65 28 20 28 70 72 65 72 65 71 4c stcase( (prereqL
a9d0: 65 66 74 20 7c 20 65 78 74 72 61 52 69 67 68 74 eft | extraRight
a9e0: 29 20 21 3d 20 70 72 65 72 65 71 4c 65 66 74 20 ) != prereqLeft
a9f0: 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 );. pNew->p
aa00: 72 65 72 65 71 52 69 67 68 74 20 3d 20 70 72 65 rereqRight = pre
aa10: 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72 61 52 reqLeft | extraR
aa20: 69 67 68 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 ight;. pNew
aa30: 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 ->prereqAll = pr
aa40: 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 20 20 70 ereqAll;. p
aa50: 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d New->eOperator =
aa60: 20 28 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 70 (operatorMask(p
aa70: 44 75 70 2d 3e 6f 70 29 20 2b 20 65 45 78 74 72 Dup->op) + eExtr
aa80: 61 4f 70 29 20 26 20 6f 70 4d 61 73 6b 3b 0a 20 aOp) & opMask;.
aa90: 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 }. }..#ifnde
aaa0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 f SQLITE_OMIT_BE
aab0: 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 TWEEN_OPTIMIZATI
aac0: 4f 4e 0a 20 20 2f 2a 20 49 66 20 61 20 74 65 72 ON. /* If a ter
aad0: 6d 20 69 73 20 74 68 65 20 42 45 54 57 45 45 4e m is the BETWEEN
aae0: 20 6f 70 65 72 61 74 6f 72 2c 20 63 72 65 61 74 operator, creat
aaf0: 65 20 74 77 6f 20 6e 65 77 20 76 69 72 74 75 61 e two new virtua
ab00: 6c 20 74 65 72 6d 73 0a 20 20 2a 2a 20 74 68 61 l terms. ** tha
ab10: 74 20 64 65 66 69 6e 65 20 74 68 65 20 72 61 6e t define the ran
ab20: 67 65 20 74 68 61 74 20 74 68 65 20 42 45 54 57 ge that the BETW
ab30: 45 45 4e 20 69 6d 70 6c 65 6d 65 6e 74 73 2e 20 EEN implements.
ab40: 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 For example:.
ab50: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 61 20 42 **. ** a B
ab60: 45 54 57 45 45 4e 20 62 20 41 4e 44 20 63 0a 20 ETWEEN b AND c.
ab70: 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 63 6f 6e 76 **. ** is conv
ab80: 65 72 74 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a erted into:. **
ab90: 0a 20 20 2a 2a 20 20 20 20 20 20 28 61 20 42 45 . ** (a BE
aba0: 54 57 45 45 4e 20 62 20 41 4e 44 20 63 29 20 41 TWEEN b AND c) A
abb0: 4e 44 20 28 61 3e 3d 62 29 20 41 4e 44 20 28 61 ND (a>=b) AND (a
abc0: 3c 3d 63 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 <=c). **. ** T
abd0: 68 65 20 74 77 6f 20 6e 65 77 20 74 65 72 6d 73 he two new terms
abe0: 20 61 72 65 20 61 64 64 65 64 20 6f 6e 74 6f 20 are added onto
abf0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 the end of the W
ac00: 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 hereClause objec
ac10: 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e 65 77 20 t.. ** The new
ac20: 74 65 72 6d 73 20 61 72 65 20 22 64 79 6e 61 6d terms are "dynam
ac30: 69 63 22 20 61 6e 64 20 61 72 65 20 63 68 69 6c ic" and are chil
ac40: 64 72 65 6e 20 6f 66 20 74 68 65 20 6f 72 69 67 dren of the orig
ac50: 69 6e 61 6c 20 42 45 54 57 45 45 4e 0a 20 20 2a inal BETWEEN. *
ac60: 2a 20 74 65 72 6d 2e 20 20 54 68 61 74 20 6d 65 * term. That me
ac70: 61 6e 73 20 74 68 61 74 20 69 66 20 74 68 65 20 ans that if the
ac80: 42 45 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20 BETWEEN term is
ac90: 63 6f 64 65 64 2c 20 74 68 65 20 63 68 69 6c 64 coded, the child
aca0: 72 65 6e 20 61 72 65 0a 20 20 2a 2a 20 73 6b 69 ren are. ** ski
acb0: 70 70 65 64 2e 20 20 4f 72 2c 20 69 66 20 74 68 pped. Or, if th
acc0: 65 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20 73 e children are s
acd0: 61 74 69 73 66 69 65 64 20 62 79 20 61 6e 20 69 atisfied by an i
ace0: 6e 64 65 78 2c 20 74 68 65 20 6f 72 69 67 69 6e ndex, the origin
acf0: 61 6c 0a 20 20 2a 2a 20 42 45 54 57 45 45 4e 20 al. ** BETWEEN
ad00: 74 65 72 6d 20 69 73 20 73 6b 69 70 70 65 64 2e term is skipped.
ad10: 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 . */. else if(
ad20: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 pExpr->op==TK_B
ad30: 45 54 57 45 45 4e 20 26 26 20 70 57 43 2d 3e 6f ETWEEN && pWC->o
ad40: 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 p==TK_AND ){.
ad50: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 ExprList *pList
ad60: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 = pExpr->x.pLis
ad70: 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 t;. int i;.
ad80: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 static const u
ad90: 38 20 6f 70 73 5b 5d 20 3d 20 7b 54 4b 5f 47 45 8 ops[] = {TK_GE
ada0: 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20 20 20 61 73 , TK_LE};. as
adb0: 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 sert( pList!=0 )
adc0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c ;. assert( pL
add0: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 32 20 29 3b ist->nExpr==2 );
ade0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c . for(i=0; i<
adf0: 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 2; i++){. E
ae00: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 xpr *pNewExpr;.
ae10: 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b int idxNew;
ae20: 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70 72 20 . pNewExpr
ae30: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 = sqlite3PExpr(p
ae40: 50 61 72 73 65 2c 20 6f 70 73 5b 69 5d 2c 20 0a Parse, ops[i], .
ae50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ae60: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c sql
ae70: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 ite3ExprDup(db,
ae80: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29 pExpr->pLeft, 0)
ae90: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
aea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 s
aeb0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 qlite3ExprDup(db
aec0: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 , pList->a[i].pE
aed0: 78 70 72 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 xpr, 0));.
aee0: 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b transferJoinMark
aef0: 69 6e 67 73 28 70 4e 65 77 45 78 70 72 2c 20 70 ings(pNewExpr, p
af00: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 64 78 Expr);. idx
af10: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 New = whereClaus
af20: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 eInsert(pWC, pNe
af30: 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 wExpr, TERM_VIRT
af40: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 UAL|TERM_DYNAMIC
af50: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 );. testcas
af60: 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a e( idxNew==0 );.
af70: 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a exprAnalyz
af80: 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 e(pSrc, pWC, idx
af90: 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 54 65 72 New);. pTer
afa0: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 m = &pWC->a[idxT
afb0: 65 72 6d 5d 3b 0a 20 20 20 20 20 20 6d 61 72 6b erm];. mark
afc0: 54 65 72 6d 41 73 43 68 69 6c 64 28 70 57 43 2c TermAsChild(pWC,
afd0: 20 69 64 78 4e 65 77 2c 20 69 64 78 54 65 72 6d idxNew, idxTerm
afe0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e );. }. }.#en
aff0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d dif /* SQLITE_OM
b000: 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d IT_BETWEEN_OPTIM
b010: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20 IZATION */..#if
b020: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f !defined(SQLITE_
b030: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 OMIT_OR_OPTIMIZA
b040: 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65 TION) && !define
b050: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 d(SQLITE_OMIT_SU
b060: 42 51 55 45 52 59 29 0a 20 20 2f 2a 20 41 6e 61 BQUERY). /* Ana
b070: 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74 lyze a term that
b080: 20 69 73 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20 is composed of
b090: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62 74 two or more subt
b0a0: 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 erms connected b
b0b0: 79 0a 20 20 2a 2a 20 61 6e 20 4f 52 20 6f 70 65 y. ** an OR ope
b0c0: 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 65 6c rator.. */. el
b0d0: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 se if( pExpr->op
b0e0: 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 61 ==TK_OR ){. a
b0f0: 73 73 65 72 74 28 20 70 57 43 2d 3e 6f 70 3d 3d ssert( pWC->op==
b100: 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 65 78 TK_AND );. ex
b110: 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 prAnalyzeOrTerm(
b120: 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 54 65 pSrc, pWC, idxTe
b130: 72 6d 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d rm);. pTerm =
b140: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d &pWC->a[idxTerm
b150: 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a ];. }.#endif /*
b160: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f SQLITE_OMIT_OR_
b170: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a OPTIMIZATION */.
b180: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f .#ifndef SQLITE_
b190: 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 OMIT_LIKE_OPTIMI
b1a0: 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41 64 64 20 ZATION. /* Add
b1b0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 72 constraints to r
b1c0: 65 64 75 63 65 20 74 68 65 20 73 65 61 72 63 68 educe the search
b1d0: 20 73 70 61 63 65 20 6f 6e 20 61 20 4c 49 4b 45 space on a LIKE
b1e0: 20 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70 or GLOB. ** op
b1f0: 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a erator.. **. *
b200: 2a 20 41 20 6c 69 6b 65 20 70 61 74 74 65 72 6e * A like pattern
b210: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 78 20 of the form "x
b220: 4c 49 4b 45 20 27 61 42 63 25 27 22 20 69 73 20 LIKE 'aBc%'" is
b230: 63 68 61 6e 67 65 64 20 69 6e 74 6f 20 63 6f 6e changed into con
b240: 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 0a 20 20 straints. **.
b250: 2a 2a 20 20 20 20 20 20 20 20 20 20 78 3e 3d 27 ** x>='
b260: 41 42 43 27 20 41 4e 44 20 78 3c 27 61 62 64 27 ABC' AND x<'abd'
b270: 20 41 4e 44 20 78 20 4c 49 4b 45 20 27 61 42 63 AND x LIKE 'aBc
b280: 25 27 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 %'. **. ** The
b290: 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20 last character
b2a0: 6f 66 20 74 68 65 20 70 72 65 66 69 78 20 22 61 of the prefix "a
b2b0: 62 63 22 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 bc" is increment
b2c0: 65 64 20 74 6f 20 66 6f 72 6d 20 74 68 65 0a 20 ed to form the.
b2d0: 20 2a 2a 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 ** termination
b2e0: 63 6f 6e 64 69 74 69 6f 6e 20 22 61 62 64 22 2e condition "abd".
b2f0: 20 20 49 66 20 63 61 73 65 20 69 73 20 6e 6f 74 If case is not
b300: 20 73 69 67 6e 69 66 69 63 61 6e 74 20 28 74 68 significant (th
b310: 65 20 64 65 66 61 75 6c 74 0a 20 20 2a 2a 20 66 e default. ** f
b320: 6f 72 20 4c 49 4b 45 29 20 74 68 65 6e 20 74 68 or LIKE) then th
b330: 65 20 6c 6f 77 65 72 2d 62 6f 75 6e 64 20 69 73 e lower-bound is
b340: 20 6d 61 64 65 20 61 6c 6c 20 75 70 70 65 72 63 made all upperc
b350: 61 73 65 20 61 6e 64 20 74 68 65 20 75 70 70 65 ase and the uppe
b360: 72 2d 0a 20 20 2a 2a 20 62 6f 75 6e 64 20 69 73 r-. ** bound is
b370: 20 6d 61 64 65 20 61 6c 6c 20 6c 6f 77 65 72 63 made all lowerc
b380: 61 73 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 ase so that the
b390: 62 6f 75 6e 64 73 20 61 6c 73 6f 20 77 6f 72 6b bounds also work
b3a0: 20 77 68 65 6e 20 63 6f 6d 70 61 72 69 6e 67 0a when comparing.
b3b0: 20 20 2a 2a 20 42 4c 4f 42 73 2e 0a 20 20 2a 2f ** BLOBs.. */
b3c0: 0a 20 20 69 66 28 20 70 57 43 2d 3e 6f 70 3d 3d . if( pWC->op==
b3d0: 54 4b 5f 41 4e 44 20 0a 20 20 20 26 26 20 69 73 TK_AND . && is
b3e0: 4c 69 6b 65 4f 72 47 6c 6f 62 28 70 50 61 72 73 LikeOrGlob(pPars
b3f0: 65 2c 20 70 45 78 70 72 2c 20 26 70 53 74 72 31 e, pExpr, &pStr1
b400: 2c 20 26 69 73 43 6f 6d 70 6c 65 74 65 2c 20 26 , &isComplete, &
b410: 6e 6f 43 61 73 65 29 0a 20 20 29 7b 0a 20 20 20 noCase). ){.
b420: 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 20 20 20 Expr *pLeft;
b430: 20 20 20 20 2f 2a 20 4c 48 53 20 6f 66 20 4c 49 /* LHS of LI
b440: 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 KE/GLOB operator
b450: 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 53 */. Expr *pS
b460: 74 72 32 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f tr2; /* Co
b470: 70 79 20 6f 66 20 70 53 74 72 31 20 2d 20 52 48 py of pStr1 - RH
b480: 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f S of LIKE/GLOB o
b490: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45 perator */. E
b4a0: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 31 3b 0a xpr *pNewExpr1;.
b4b0: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 Expr *pNewEx
b4c0: 70 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 pr2;. int idx
b4d0: 4e 65 77 31 3b 0a 20 20 20 20 69 6e 74 20 69 64 New1;. int id
b4e0: 78 4e 65 77 32 3b 0a 20 20 20 20 63 6f 6e 73 74 xNew2;. const
b4f0: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 53 65 71 4e char *zCollSeqN
b500: 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 ame; /* Name
b510: 20 6f 66 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 of collating se
b520: 71 75 65 6e 63 65 20 2a 2f 0a 20 20 20 20 63 6f quence */. co
b530: 6e 73 74 20 75 31 36 20 77 74 46 6c 61 67 73 20 nst u16 wtFlags
b540: 3d 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 7c = TERM_LIKEOPT |
b550: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 7c 20 TERM_VIRTUAL |
b560: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 3b 0a 0a 20 TERM_DYNAMIC;..
b570: 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 pLeft = pExpr
b580: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e ->x.pList->a[1].
b590: 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74 72 32 pExpr;. pStr2
b5a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 = sqlite3ExprDu
b5b0: 70 28 64 62 2c 20 70 53 74 72 31 2c 20 30 29 3b p(db, pStr1, 0);
b5c0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 .. /* Convert
b5d0: 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 the lower bound
b5e0: 20 74 6f 20 75 70 70 65 72 2d 63 61 73 65 20 61 to upper-case a
b5f0: 6e 64 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 nd the upper bou
b600: 6e 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6c 6f 77 nd to. ** low
b610: 65 72 2d 63 61 73 65 20 28 75 70 70 65 72 2d 63 er-case (upper-c
b620: 61 73 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e ase is less than
b630: 20 6c 6f 77 65 72 2d 63 61 73 65 20 69 6e 20 41 lower-case in A
b640: 53 43 49 49 29 20 73 6f 20 74 68 61 74 0a 20 20 SCII) so that.
b650: 20 20 2a 2a 20 74 68 65 20 72 61 6e 67 65 20 63 ** the range c
b660: 6f 6e 73 74 72 61 69 6e 74 73 20 61 6c 73 6f 20 onstraints also
b670: 77 6f 72 6b 20 66 6f 72 20 42 4c 4f 42 73 0a 20 work for BLOBs.
b680: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 6f */. if( no
b690: 43 61 73 65 20 26 26 20 21 70 50 61 72 73 65 2d Case && !pParse-
b6a0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 >db->mallocFaile
b6b0: 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 d ){. int i
b6c0: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63 3b 0a ;. char c;.
b6d0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 pTerm->wtF
b6e0: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4c 49 4b lags |= TERM_LIK
b6f0: 45 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 E;. for(i=0
b700: 3b 20 28 63 20 3d 20 70 53 74 72 31 2d 3e 75 2e ; (c = pStr1->u.
b710: 7a 54 6f 6b 65 6e 5b 69 5d 29 21 3d 30 3b 20 69 zToken[i])!=0; i
b720: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 53 74 ++){. pSt
b730: 72 31 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 69 5d 20 r1->u.zToken[i]
b740: 3d 20 73 71 6c 69 74 65 33 54 6f 75 70 70 65 72 = sqlite3Toupper
b750: 28 63 29 3b 0a 20 20 20 20 20 20 20 20 70 53 74 (c);. pSt
b760: 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 69 5d 20 r2->u.zToken[i]
b770: 3d 20 73 71 6c 69 74 65 33 54 6f 6c 6f 77 65 72 = sqlite3Tolower
b780: 28 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 (c);. }.
b790: 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 64 62 2d }.. if( !db-
b7a0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b >mallocFailed ){
b7b0: 0a 20 20 20 20 20 20 75 38 20 63 2c 20 2a 70 43 . u8 c, *pC
b7c0: 3b 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 ; /* Last
b7d0: 63 68 61 72 61 63 74 65 72 20 62 65 66 6f 72 65 character before
b7e0: 20 74 68 65 20 66 69 72 73 74 20 77 69 6c 64 63 the first wildc
b7f0: 61 72 64 20 2a 2f 0a 20 20 20 20 20 20 70 43 20 ard */. pC
b800: 3d 20 28 75 38 2a 29 26 70 53 74 72 32 2d 3e 75 = (u8*)&pStr2->u
b810: 2e 7a 54 6f 6b 65 6e 5b 73 71 6c 69 74 65 33 53 .zToken[sqlite3S
b820: 74 72 6c 65 6e 33 30 28 70 53 74 72 32 2d 3e 75 trlen30(pStr2->u
b830: 2e 7a 54 6f 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20 .zToken)-1];.
b840: 20 20 20 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20 c = *pC;.
b850: 20 20 69 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a if( noCase ){.
b860: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 /* The p
b870: 6f 69 6e 74 20 69 73 20 74 6f 20 69 6e 63 72 65 oint is to incre
b880: 6d 65 6e 74 20 74 68 65 20 6c 61 73 74 20 63 68 ment the last ch
b890: 61 72 61 63 74 65 72 20 62 65 66 6f 72 65 20 74 aracter before t
b8a0: 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 20 he first.
b8b0: 20 2a 2a 20 77 69 6c 64 63 61 72 64 2e 20 20 42 ** wildcard. B
b8c0: 75 74 20 69 66 20 77 65 20 69 6e 63 72 65 6d 65 ut if we increme
b8d0: 6e 74 20 27 40 27 2c 20 74 68 61 74 20 77 69 6c nt '@', that wil
b8e0: 6c 20 70 75 73 68 20 69 74 20 69 6e 74 6f 20 74 l push it into t
b8f0: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c he. ** al
b900: 70 68 61 62 65 74 69 63 20 72 61 6e 67 65 20 77 phabetic range w
b910: 68 65 72 65 20 63 61 73 65 20 63 6f 6e 76 65 72 here case conver
b920: 73 69 6f 6e 73 20 77 69 6c 6c 20 6d 65 73 73 20 sions will mess
b930: 75 70 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 up the .
b940: 2a 2a 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 ** inequality.
b950: 54 6f 20 61 76 6f 69 64 20 74 68 69 73 2c 20 6d To avoid this, m
b960: 61 6b 65 20 73 75 72 65 20 74 6f 20 61 6c 73 6f ake sure to also
b970: 20 72 75 6e 20 74 68 65 20 66 75 6c 6c 0a 20 20 run the full.
b980: 20 20 20 20 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e ** LIKE on
b990: 20 61 6c 6c 20 63 61 6e 64 69 64 61 74 65 20 65 all candidate e
b9a0: 78 70 72 65 73 73 69 6f 6e 73 20 62 79 20 63 6c xpressions by cl
b9b0: 65 61 72 69 6e 67 20 74 68 65 20 69 73 43 6f 6d earing the isCom
b9c0: 70 6c 65 74 65 20 66 6c 61 67 0a 20 20 20 20 20 plete flag.
b9d0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 */. if
b9e0: 28 20 63 3d 3d 27 41 27 2d 31 20 29 20 69 73 43 ( c=='A'-1 ) isC
b9f0: 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 0a 20 20 20 omplete = 0;.
ba00: 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 c = sqlite3
ba10: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b UpperToLower[c];
ba20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a . }. *
ba30: 70 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20 pC = c + 1;.
ba40: 7d 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 4e 61 }. zCollSeqNa
ba50: 6d 65 20 3d 20 6e 6f 43 61 73 65 20 3f 20 22 4e me = noCase ? "N
ba60: 4f 43 41 53 45 22 20 3a 20 73 71 6c 69 74 65 33 OCASE" : sqlite3
ba70: 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 70 StrBINARY;. p
ba80: 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 NewExpr1 = sqlit
ba90: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c e3ExprDup(db, pL
baa0: 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65 eft, 0);. pNe
bab0: 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33 wExpr1 = sqlite3
bac0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b PExpr(pParse, TK
bad0: 5f 47 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 _GE,.
bae0: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f sqlite3ExprAddCo
baf0: 6c 6c 61 74 65 53 74 72 69 6e 67 28 70 50 61 72 llateString(pPar
bb00: 73 65 2c 70 4e 65 77 45 78 70 72 31 2c 7a 43 6f se,pNewExpr1,zCo
bb10: 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20 llSeqName),.
bb20: 20 20 20 20 20 20 20 70 53 74 72 31 29 3b 0a 20 pStr1);.
bb30: 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d transferJoinM
bb40: 61 72 6b 69 6e 67 73 28 70 4e 65 77 45 78 70 72 arkings(pNewExpr
bb50: 31 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 69 1, pExpr);. i
bb60: 64 78 4e 65 77 31 20 3d 20 77 68 65 72 65 43 6c dxNew1 = whereCl
bb70: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 auseInsert(pWC,
bb80: 70 4e 65 77 45 78 70 72 31 2c 20 77 74 46 6c 61 pNewExpr1, wtFla
bb90: 67 73 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 gs);. testcas
bba0: 65 28 20 69 64 78 4e 65 77 31 3d 3d 30 20 29 3b e( idxNew1==0 );
bbb0: 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 . exprAnalyze
bbc0: 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e (pSrc, pWC, idxN
bbd0: 65 77 31 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 ew1);. pNewEx
bbe0: 70 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 pr2 = sqlite3Exp
bbf0: 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 rDup(db, pLeft,
bc00: 30 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72 0);. pNewExpr
bc10: 32 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 2 = sqlite3PExpr
bc20: 28 70 50 61 72 73 65 2c 20 54 4b 5f 4c 54 2c 0a (pParse, TK_LT,.
bc30: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 sqlit
bc40: 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 e3ExprAddCollate
bc50: 53 74 72 69 6e 67 28 70 50 61 72 73 65 2c 70 4e String(pParse,pN
bc60: 65 77 45 78 70 72 32 2c 7a 43 6f 6c 6c 53 65 71 ewExpr2,zCollSeq
bc70: 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 Name),.
bc80: 20 20 70 53 74 72 32 29 3b 0a 20 20 20 20 74 72 pStr2);. tr
bc90: 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e ansferJoinMarkin
bca0: 67 73 28 70 4e 65 77 45 78 70 72 32 2c 20 70 45 gs(pNewExpr2, pE
bcb0: 78 70 72 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 xpr);. idxNew
bcc0: 32 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 2 = whereClauseI
bcd0: 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 nsert(pWC, pNewE
bce0: 78 70 72 32 2c 20 77 74 46 6c 61 67 73 29 3b 0a xpr2, wtFlags);.
bcf0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64 testcase( id
bd00: 78 4e 65 77 32 3d 3d 30 20 29 3b 0a 20 20 20 20 xNew2==0 );.
bd10: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 exprAnalyze(pSrc
bd20: 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 32 29 3b , pWC, idxNew2);
bd30: 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 . pTerm = &pW
bd40: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 C->a[idxTerm];.
bd50: 20 20 20 69 66 28 20 69 73 43 6f 6d 70 6c 65 74 if( isComplet
bd60: 65 20 29 7b 0a 20 20 20 20 20 20 6d 61 72 6b 54 e ){. markT
bd70: 65 72 6d 41 73 43 68 69 6c 64 28 70 57 43 2c 20 ermAsChild(pWC,
bd80: 69 64 78 4e 65 77 31 2c 20 69 64 78 54 65 72 6d idxNew1, idxTerm
bd90: 29 3b 0a 20 20 20 20 20 20 6d 61 72 6b 54 65 72 );. markTer
bda0: 6d 41 73 43 68 69 6c 64 28 70 57 43 2c 20 69 64 mAsChild(pWC, id
bdb0: 78 4e 65 77 32 2c 20 69 64 78 54 65 72 6d 29 3b xNew2, idxTerm);
bdc0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 . }. }.#endi
bdd0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 f /* SQLITE_OMIT
bde0: 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 _LIKE_OPTIMIZATI
bdf0: 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 ON */..#ifndef S
be00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 QLITE_OMIT_VIRTU
be10: 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 41 64 64 ALTABLE. /* Add
be20: 20 61 20 57 4f 5f 41 55 58 20 61 75 78 69 6c 69 a WO_AUX auxili
be30: 61 72 79 20 74 65 72 6d 20 74 6f 20 74 68 65 20 ary term to the
be40: 63 6f 6e 73 74 72 61 69 6e 74 20 73 65 74 20 69 constraint set i
be50: 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 f the. ** curre
be60: 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 nt expression is
be70: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 63 6f of the form "co
be80: 6c 75 6d 6e 20 4f 50 20 65 78 70 72 22 20 77 68 lumn OP expr" wh
be90: 65 72 65 20 4f 50 0a 20 20 2a 2a 20 69 73 20 61 ere OP. ** is a
bea0: 6e 20 6f 70 65 72 61 74 6f 72 20 74 68 61 74 20 n operator that
beb0: 67 65 74 73 20 70 61 73 73 65 64 20 69 6e 74 6f gets passed into
bec0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 virtual tables
bed0: 62 75 74 20 77 68 69 63 68 20 69 73 0a 20 20 2a but which is. *
bee0: 2a 20 6e 6f 74 20 6e 6f 72 6d 61 6c 6c 79 20 6f * not normally o
bef0: 70 74 69 6d 69 7a 65 64 20 66 6f 72 20 6f 72 64 ptimized for ord
bf00: 69 6e 61 72 79 20 74 61 62 6c 65 73 2e 20 20 49 inary tables. I
bf10: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 4f n other words, O
bf20: 50 0a 20 20 2a 2a 20 69 73 20 6f 6e 65 20 6f 66 P. ** is one of
bf30: 20 4d 41 54 43 48 2c 20 4c 49 4b 45 2c 20 47 4c MATCH, LIKE, GL
bf40: 4f 42 2c 20 52 45 47 45 58 50 2c 20 21 3d 2c 20 OB, REGEXP, !=,
bf50: 49 53 2c 20 49 53 20 4e 4f 54 2c 20 6f 72 20 4e IS, IS NOT, or N
bf60: 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 20 54 68 OT NULL.. ** Th
bf70: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 is information i
bf80: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 78 42 s used by the xB
bf90: 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 73 estIndex methods
bfa0: 20 6f 66 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c of. ** virtual
bfb0: 20 74 61 62 6c 65 73 2e 20 20 54 68 65 20 6e 61 tables. The na
bfc0: 74 69 76 65 20 71 75 65 72 79 20 6f 70 74 69 6d tive query optim
bfd0: 69 7a 65 72 20 64 6f 65 73 20 6e 6f 74 20 61 74 izer does not at
bfe0: 74 65 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64 6f tempt. ** to do
bff0: 20 61 6e 79 74 68 69 6e 67 20 77 69 74 68 20 4d anything with M
c000: 41 54 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e 0a ATCH functions..
c010: 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 43 2d 3e */. if( pWC->
c020: 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 op==TK_AND ){.
c030: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d Expr *pRight =
c040: 20 30 2c 20 2a 70 4c 65 66 74 20 3d 20 30 3b 0a 0, *pLeft = 0;.
c050: 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 69 73 int res = is
c060: 41 75 78 69 6c 69 61 72 79 56 74 61 62 4f 70 65 AuxiliaryVtabOpe
c070: 72 61 74 6f 72 28 64 62 2c 20 70 45 78 70 72 2c rator(db, pExpr,
c080: 20 26 65 4f 70 32 2c 20 26 70 4c 65 66 74 2c 20 &eOp2, &pLeft,
c090: 26 70 52 69 67 68 74 29 3b 0a 20 20 20 20 77 68 &pRight);. wh
c0a0: 69 6c 65 28 20 72 65 73 2d 2d 20 3e 20 30 20 29 ile( res-- > 0 )
c0b0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e {. int idxN
c0c0: 65 77 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 ew;. WhereT
c0d0: 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 20 erm *pNewTerm;.
c0e0: 20 20 20 20 20 42 69 74 6d 61 73 6b 20 70 72 65 Bitmask pre
c0f0: 72 65 71 43 6f 6c 75 6d 6e 2c 20 70 72 65 72 65 reqColumn, prere
c100: 71 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 70 72 qExpr;.. pr
c110: 65 72 65 71 45 78 70 72 20 3d 20 73 71 6c 69 74 ereqExpr = sqlit
c120: 65 33 57 68 65 72 65 45 78 70 72 55 73 61 67 65 e3WhereExprUsage
c130: 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 69 67 68 (pMaskSet, pRigh
c140: 74 29 3b 0a 20 20 20 20 20 20 70 72 65 72 65 71 t);. prereq
c150: 43 6f 6c 75 6d 6e 20 3d 20 73 71 6c 69 74 65 33 Column = sqlite3
c160: 57 68 65 72 65 45 78 70 72 55 73 61 67 65 28 70 WhereExprUsage(p
c170: 4d 61 73 6b 53 65 74 2c 20 70 4c 65 66 74 29 3b MaskSet, pLeft);
c180: 0a 20 20 20 20 20 20 69 66 28 20 28 70 72 65 72 . if( (prer
c190: 65 71 45 78 70 72 20 26 20 70 72 65 72 65 71 43 eqExpr & prereqC
c1a0: 6f 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 olumn)==0 ){.
c1b0: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 Expr *pNewE
c1c0: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 xpr;. pNe
c1d0: 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 wExpr = sqlite3P
c1e0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f Expr(pParse, TK_
c1f0: 4d 41 54 43 48 2c 20 0a 20 20 20 20 20 20 20 20 MATCH, .
c200: 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33 45 78 0, sqlite3Ex
c210: 70 72 44 75 70 28 64 62 2c 20 70 52 69 67 68 74 prDup(db, pRight
c220: 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 20 20 69 , 0));. i
c230: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 f( ExprHasProper
c240: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f ty(pExpr, EP_Fro
c250: 6d 4a 6f 69 6e 29 20 26 26 20 70 4e 65 77 45 78 mJoin) && pNewEx
c260: 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 pr ){.
c270: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 ExprSetProperty(
c280: 70 4e 65 77 45 78 70 72 2c 20 45 50 5f 46 72 6f pNewExpr, EP_Fro
c290: 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 mJoin);.
c2a0: 7d 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65 77 }. idxNew
c2b0: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e = whereClauseIn
c2c0: 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 sert(pWC, pNewEx
c2d0: 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c pr, TERM_VIRTUAL
c2e0: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a |TERM_DYNAMIC);.
c2f0: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 testcase
c300: 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 ( idxNew==0 );.
c310: 20 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 20 pNewTerm
c320: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 = &pWC->a[idxNew
c330: 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 54 ];. pNewT
c340: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 erm->prereqRight
c350: 20 3d 20 70 72 65 72 65 71 45 78 70 72 3b 0a 20 = prereqExpr;.
c360: 20 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d pNewTerm-
c370: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c >leftCursor = pL
c380: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 eft->iTable;.
c390: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 pNewTerm->u
c3a0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c .leftColumn = pL
c3b0: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 eft->iColumn;.
c3c0: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e pNewTerm->
c3d0: 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 41 eOperator = WO_A
c3e0: 55 58 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 UX;. pNew
c3f0: 54 65 72 6d 2d 3e 65 4d 61 74 63 68 4f 70 20 3d Term->eMatchOp =
c400: 20 65 4f 70 32 3b 0a 20 20 20 20 20 20 20 20 6d eOp2;. m
c410: 61 72 6b 54 65 72 6d 41 73 43 68 69 6c 64 28 70 arkTermAsChild(p
c420: 57 43 2c 20 69 64 78 4e 65 77 2c 20 69 64 78 54 WC, idxNew, idxT
c430: 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 70 54 erm);. pT
c440: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 erm = &pWC->a[id
c450: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 xTerm];.
c460: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c pTerm->wtFlags |
c470: 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 = TERM_COPIED;.
c480: 20 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d pNewTerm-
c490: 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65 >prereqAll = pTe
c4a0: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20 rm->prereqAll;.
c4b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 53 57 41 }. SWA
c4c0: 50 28 45 78 70 72 2a 2c 20 70 4c 65 66 74 2c 20 P(Expr*, pLeft,
c4d0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 pRight);. }.
c4e0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c }.#endif /* SQL
c4f0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c ITE_OMIT_VIRTUAL
c500: 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 2f 2a 20 49 TABLE */.. /* I
c510: 66 20 74 68 65 72 65 20 69 73 20 61 20 76 65 63 f there is a vec
c520: 74 6f 72 20 3d 3d 20 6f 72 20 49 53 20 74 65 72 tor == or IS ter
c530: 6d 20 2d 20 65 2e 67 2e 20 22 28 61 2c 20 62 29 m - e.g. "(a, b)
c540: 20 3d 3d 20 28 3f 2c 20 3f 29 22 20 2d 20 63 72 == (?, ?)" - cr
c550: 65 61 74 65 0a 20 20 2a 2a 20 6e 65 77 20 74 65 eate. ** new te
c560: 72 6d 73 20 66 6f 72 20 65 61 63 68 20 63 6f 6d rms for each com
c570: 70 6f 6e 65 6e 74 20 63 6f 6d 70 61 72 69 73 6f ponent compariso
c580: 6e 20 2d 20 22 61 20 3d 20 3f 22 20 61 6e 64 20 n - "a = ?" and
c590: 22 62 20 3d 20 3f 22 2e 20 20 54 68 65 0a 20 20 "b = ?". The.
c5a0: 2a 2a 20 6e 65 77 20 74 65 72 6d 73 20 63 6f 6d ** new terms com
c5b0: 70 6c 65 74 65 6c 79 20 72 65 70 6c 61 63 65 20 pletely replace
c5c0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 76 65 63 the original vec
c5d0: 74 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 tor comparison,
c5e0: 77 68 69 63 68 20 69 73 0a 20 20 2a 2a 20 6e 6f which is. ** no
c5f0: 20 6c 6f 6e 67 65 72 20 75 73 65 64 2e 0a 20 20 longer used..
c600: 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 **. ** This is
c610: 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20 69 66 only required if
c620: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 73 69 at least one si
c630: 64 65 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 de of the compar
c640: 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 0a 20 ison operation.
c650: 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20 73 75 62 ** is not a sub
c660: 2d 73 65 6c 65 63 74 2e 20 20 2a 2f 0a 20 20 69 -select. */. i
c670: 66 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 f( pWC->op==TK_A
c680: 4e 44 20 0a 20 20 26 26 20 28 70 45 78 70 72 2d ND . && (pExpr-
c690: 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 >op==TK_EQ || pE
c6a0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29 0a xpr->op==TK_IS).
c6b0: 20 20 26 26 20 28 6e 4c 65 66 74 20 3d 20 73 71 && (nLeft = sq
c6c0: 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 lite3ExprVectorS
c6d0: 69 7a 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 ize(pExpr->pLeft
c6e0: 29 29 3e 31 0a 20 20 26 26 20 73 71 6c 69 74 65 ))>1. && sqlite
c6f0: 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 3ExprVectorSize(
c700: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3d 3d pExpr->pRight)==
c710: 6e 4c 65 66 74 0a 20 20 26 26 20 28 20 28 70 45 nLeft. && ( (pE
c720: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 xpr->pLeft->flag
c730: 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 s & EP_xIsSelect
c740: 29 3d 3d 30 20 0a 20 20 20 20 7c 7c 20 28 70 45 )==0 . || (pE
c750: 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 xpr->pRight->fla
c760: 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 gs & EP_xIsSelec
c770: 74 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 t)==0). ){.
c780: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 int i;. for(i
c790: 3d 30 3b 20 69 3c 6e 4c 65 66 74 3b 20 69 2b 2b =0; i<nLeft; i++
c7a0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 ){. int idx
c7b0: 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72 20 New;. Expr
c7c0: 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70 *pNew;. Exp
c7d0: 72 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 r *pLeft = sqlit
c7e0: 65 33 45 78 70 72 46 6f 72 56 65 63 74 6f 72 46 e3ExprForVectorF
c7f0: 69 65 6c 64 28 70 50 61 72 73 65 2c 20 70 45 78 ield(pParse, pEx
c800: 70 72 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 pr->pLeft, i);.
c810: 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 Expr *pRigh
c820: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 46 t = sqlite3ExprF
c830: 6f 72 56 65 63 74 6f 72 46 69 65 6c 64 28 70 50 orVectorField(pP
c840: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 arse, pExpr->pRi
c850: 67 68 74 2c 20 69 29 3b 0a 0a 20 20 20 20 20 20 ght, i);..
c860: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 50 45 pNew = sqlite3PE
c870: 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 xpr(pParse, pExp
c880: 72 2d 3e 6f 70 2c 20 70 4c 65 66 74 2c 20 70 52 r->op, pLeft, pR
c890: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 74 72 61 ight);. tra
c8a0: 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 nsferJoinMarking
c8b0: 73 28 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a s(pNew, pExpr);.
c8c0: 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 idxNew = w
c8d0: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 hereClauseInsert
c8e0: 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45 52 4d (pWC, pNew, TERM
c8f0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 _DYNAMIC);.
c900: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 exprAnalyze(pSr
c910: 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b c, pWC, idxNew);
c920: 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 65 72 6d . }. pTerm
c930: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 = &pWC->a[idxTe
c940: 72 6d 5d 3b 0a 20 20 20 20 70 54 65 72 6d 2d 3e rm];. pTerm->
c950: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f wtFlags |= TERM_
c960: 43 4f 44 45 44 7c 54 45 52 4d 5f 56 49 52 54 55 CODED|TERM_VIRTU
c970: 41 4c 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 AL; /* Disable
c980: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 2a 2f 0a the original */.
c990: 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 pTerm->eOper
c9a0: 61 74 6f 72 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 ator = 0;. }..
c9b0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 /* If there is
c9c0: 61 20 76 65 63 74 6f 72 20 49 4e 20 74 65 72 6d a vector IN term
c9d0: 20 2d 20 65 2e 67 2e 20 22 28 61 2c 20 62 29 20 - e.g. "(a, b)
c9e0: 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 IN (SELECT ...)"
c9f0: 20 2d 20 63 72 65 61 74 65 0a 20 20 2a 2a 20 61 - create. ** a
ca00: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 66 6f virtual term fo
ca10: 72 20 65 61 63 68 20 76 65 63 74 6f 72 20 63 6f r each vector co
ca20: 6d 70 6f 6e 65 6e 74 2e 20 54 68 65 20 65 78 70 mponent. The exp
ca30: 72 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 0a 20 ression object.
ca40: 20 2a 2a 20 75 73 65 64 20 62 79 20 65 61 63 68 ** used by each
ca50: 20 73 75 63 68 20 76 69 72 74 75 61 6c 20 74 65 such virtual te
ca60: 72 6d 20 69 73 20 70 45 78 70 72 20 28 74 68 65 rm is pExpr (the
ca70: 20 66 75 6c 6c 20 76 65 63 74 6f 72 20 49 4e 28 full vector IN(
ca80: 2e 2e 2e 29 20 0a 20 20 2a 2a 20 65 78 70 72 65 ...) . ** expre
ca90: 73 73 69 6f 6e 29 2e 20 54 68 65 20 57 68 65 72 ssion). The Wher
caa0: 65 54 65 72 6d 2e 69 46 69 65 6c 64 20 76 61 72 eTerm.iField var
cab0: 69 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65 73 iable identifies
cac0: 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 69 the index withi
cad0: 6e 0a 20 20 2a 2a 20 74 68 65 20 76 65 63 74 6f n. ** the vecto
cae0: 72 20 6f 6e 20 74 68 65 20 4c 48 53 20 74 68 61 r on the LHS tha
caf0: 74 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 65 t the virtual te
cb00: 72 6d 20 72 65 70 72 65 73 65 6e 74 73 2e 0a 20 rm represents..
cb10: 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6f 6e **. ** This on
cb20: 6c 79 20 77 6f 72 6b 73 20 69 66 20 74 68 65 20 ly works if the
cb30: 52 48 53 20 69 73 20 61 20 73 69 6d 70 6c 65 20 RHS is a simple
cb40: 53 45 4c 45 43 54 2c 20 6e 6f 74 20 61 20 63 6f SELECT, not a co
cb50: 6d 70 6f 75 6e 64 0a 20 20 2a 2f 0a 20 20 69 66 mpound. */. if
cb60: 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e ( pWC->op==TK_AN
cb70: 44 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d D && pExpr->op==
cb80: 54 4b 5f 49 4e 20 26 26 20 70 54 65 72 6d 2d 3e TK_IN && pTerm->
cb90: 69 46 69 65 6c 64 3d 3d 30 0a 20 20 20 26 26 20 iField==0. &&
cba0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 pExpr->pLeft->op
cbb0: 3d 3d 54 4b 5f 56 45 43 54 4f 52 0a 20 20 20 26 ==TK_VECTOR. &
cbc0: 26 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 & pExpr->x.pSele
cbd0: 63 74 2d 3e 70 50 72 69 6f 72 3d 3d 30 0a 20 20 ct->pPrior==0.
cbe0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 ){. int i;.
cbf0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 71 6c for(i=0; i<sql
cc00: 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 ite3ExprVectorSi
cc10: 7a 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 ze(pExpr->pLeft)
cc20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e ; i++){. in
cc30: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 t idxNew;.
cc40: 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c idxNew = whereCl
cc50: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 auseInsert(pWC,
cc60: 70 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 pExpr, TERM_VIRT
cc70: 55 41 4c 29 3b 0a 20 20 20 20 20 20 70 57 43 2d UAL);. pWC-
cc80: 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 46 69 65 6c >a[idxNew].iFiel
cc90: 64 20 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20 65 d = i+1;. e
cca0: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c xprAnalyze(pSrc,
ccb0: 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 pWC, idxNew);.
ccc0: 20 20 20 20 20 6d 61 72 6b 54 65 72 6d 41 73 43 markTermAsC
ccd0: 68 69 6c 64 28 70 57 43 2c 20 69 64 78 4e 65 77 hild(pWC, idxNew
cce0: 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20 20 , idxTerm);.
ccf0: 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 }. }..#ifdef SQ
cd00: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 LITE_ENABLE_STAT
cd10: 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 2f 2a 20 3_OR_STAT4. /*
cd20: 57 68 65 6e 20 73 71 6c 69 74 65 5f 73 74 61 74 When sqlite_stat
cd30: 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 3 histogram data
cd40: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 61 6e is available an
cd50: 20 6f 70 65 72 61 74 6f 72 20 6f 66 20 74 68 65 operator of the
cd60: 0a 20 20 2a 2a 20 66 6f 72 6d 20 22 78 20 49 53 . ** form "x IS
cd70: 20 4e 4f 54 20 4e 55 4c 4c 22 20 63 61 6e 20 73 NOT NULL" can s
cd80: 6f 6d 65 74 69 6d 65 73 20 62 65 20 65 76 61 6c ometimes be eval
cd90: 75 61 74 65 64 20 6d 6f 72 65 20 65 66 66 69 63 uated more effic
cda0: 69 65 6e 74 6c 79 0a 20 20 2a 2a 20 61 73 20 22 iently. ** as "
cdb0: 78 3e 4e 55 4c 4c 22 20 69 66 20 78 20 69 73 20 x>NULL" if x is
cdc0: 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 not an INTEGER P
cdd0: 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 53 6f 20 RIMARY KEY. So
cde0: 63 6f 6e 73 74 72 75 63 74 20 61 0a 20 20 2a 2a construct a. **
cdf0: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6f 66 virtual term of
ce00: 20 74 68 61 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a that form.. **
ce10: 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 . ** Note that
ce20: 74 68 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d the virtual term
ce30: 20 6d 75 73 74 20 62 65 20 74 61 67 67 65 64 20 must be tagged
ce40: 77 69 74 68 20 54 45 52 4d 5f 56 4e 55 4c 4c 2e with TERM_VNULL.
ce50: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 . */. if( pExp
ce60: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c r->op==TK_NOTNUL
ce70: 4c 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70 L. && pExpr->p
ce80: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c Left->op==TK_COL
ce90: 55 4d 4e 0a 20 20 20 26 26 20 70 45 78 70 72 2d UMN. && pExpr-
cea0: 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3e >pLeft->iColumn>
ceb0: 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a =0. && Optimiz
cec0: 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c ationEnabled(db,
ced0: 20 53 51 4c 49 54 45 5f 53 74 61 74 33 34 29 0a SQLITE_Stat34).
cee0: 20 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 ){. Expr *p
cef0: 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 45 78 70 NewExpr;. Exp
cf00: 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 r *pLeft = pExpr
cf10: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 69 6e 74 ->pLeft;. int
cf20: 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 57 68 65 idxNew;. Whe
cf30: 72 65 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d reTerm *pNewTerm
cf40: 3b 0a 0a 20 20 20 20 70 4e 65 77 45 78 70 72 20 ;.. pNewExpr
cf50: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 = sqlite3PExpr(p
cf60: 50 61 72 73 65 2c 20 54 4b 5f 47 54 2c 0a 20 20 Parse, TK_GT,.
cf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cf80: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 sqlite
cf90: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 3ExprDup(db, pLe
cfa0: 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 ft, 0),.
cfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cfc0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 sqlite3ExprA
cfd0: 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 4e 55 4c 4c lloc(db, TK_NULL
cfe0: 2c 20 30 2c 20 30 29 29 3b 0a 0a 20 20 20 20 69 , 0, 0));.. i
cff0: 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 dxNew = whereCla
d000: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 useInsert(pWC, p
d010: 4e 65 77 45 78 70 72 2c 0a 20 20 20 20 20 20 20 NewExpr,.
d020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
d030: 20 20 20 20 20 20 20 54 45 52 4d 5f 56 49 52 54 TERM_VIRT
d040: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 UAL|TERM_DYNAMIC
d050: 7c 54 45 52 4d 5f 56 4e 55 4c 4c 29 3b 0a 20 20 |TERM_VNULL);.
d060: 20 20 69 66 28 20 69 64 78 4e 65 77 20 29 7b 0a if( idxNew ){.
d070: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 20 3d pNewTerm =
d080: 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d &pWC->a[idxNew]
d090: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d ;. pNewTerm
d0a0: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 ->prereqRight =
d0b0: 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 0;. pNewTer
d0c0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 m->leftCursor =
d0d0: 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 pLeft->iTable;.
d0e0: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 pNewTerm->u
d0f0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c .leftColumn = pL
d100: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 eft->iColumn;.
d110: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f pNewTerm->eO
d120: 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 47 54 3b perator = WO_GT;
d130: 0a 20 20 20 20 20 20 6d 61 72 6b 54 65 72 6d 41 . markTermA
d140: 73 43 68 69 6c 64 28 70 57 43 2c 20 69 64 78 4e sChild(pWC, idxN
d150: 65 77 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 ew, idxTerm);.
d160: 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 pTerm = &pWC
d170: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 ->a[idxTerm];.
d180: 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 pTerm->wtFla
d190: 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 gs |= TERM_COPIE
d1a0: 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 D;. pNewTer
d1b0: 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 m->prereqAll = p
d1c0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b Term->prereqAll;
d1d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 . }. }.#endi
d1e0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 f /* SQLITE_ENAB
d1f0: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 LE_STAT3_OR_STAT
d200: 34 20 2a 2f 0a 0a 20 20 2f 2a 20 50 72 65 76 65 4 */.. /* Preve
d210: 6e 74 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 nt ON clause ter
d220: 6d 73 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 ms of a LEFT JOI
d230: 4e 20 66 72 6f 6d 20 62 65 69 6e 67 20 75 73 65 N from being use
d240: 64 20 74 6f 20 64 72 69 76 65 0a 20 20 2a 2a 20 d to drive. **
d250: 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 74 61 62 an index for tab
d260: 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 les to the left
d270: 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a of the join.. *
d280: 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54 /. testcase( pT
d290: 65 72 6d 21 3d 26 70 57 43 2d 3e 61 5b 69 64 78 erm!=&pWC->a[idx
d2a0: 54 65 72 6d 5d 20 29 3b 0a 20 20 70 54 65 72 6d Term] );. pTerm
d2b0: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 = &pWC->a[idxTe
d2c0: 72 6d 5d 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 72 rm];. pTerm->pr
d2d0: 65 72 65 71 52 69 67 68 74 20 7c 3d 20 65 78 74 ereqRight |= ext
d2e0: 72 61 52 69 67 68 74 3b 0a 7d 0a 0a 2f 2a 2a 2a raRight;.}../***
d2f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
d300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
d310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
d320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
d330: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 52 6f 75 74 ********.** Rout
d340: 69 6e 65 73 20 77 69 74 68 20 66 69 6c 65 20 73 ines with file s
d350: 63 6f 70 65 20 61 62 6f 76 65 2e 20 20 49 6e 74 cope above. Int
d360: 65 72 66 61 63 65 20 74 6f 20 74 68 65 20 72 65 erface to the re
d370: 73 74 20 6f 66 20 74 68 65 20 77 68 65 72 65 2e st of the where.
d380: 63 0a 2a 2a 20 73 75 62 73 79 73 74 65 6d 20 66 c.** subsystem f
d390: 6f 6c 6c 6f 77 73 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a ollows..********
d3a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
d3b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
d3c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
d3d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
d3e0: 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 ***/../*.** This
d3f0: 20 72 6f 75 74 69 6e 65 20 69 64 65 6e 74 69 66 routine identif
d400: 69 65 73 20 73 75 62 65 78 70 72 65 73 73 69 6f ies subexpressio
d410: 6e 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 ns in the WHERE
d420: 63 6c 61 75 73 65 20 77 68 65 72 65 0a 2a 2a 20 clause where.**
d430: 65 61 63 68 20 73 75 62 65 78 70 72 65 73 73 69 each subexpressi
d440: 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20 on is separated
d450: 62 79 20 74 68 65 20 41 4e 44 20 6f 70 65 72 61 by the AND opera
d460: 74 6f 72 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 tor or some othe
d470: 72 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 73 70 r.** operator sp
d480: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 6f ecified in the o
d490: 70 20 70 61 72 61 6d 65 74 65 72 2e 20 20 54 68 p parameter. Th
d4a0: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 e WhereClause st
d4b0: 72 75 63 74 75 72 65 0a 2a 2a 20 69 73 20 66 69 ructure.** is fi
d4c0: 6c 6c 65 64 20 77 69 74 68 20 70 6f 69 6e 74 65 lled with pointe
d4d0: 72 73 20 74 6f 20 73 75 62 65 78 70 72 65 73 73 rs to subexpress
d4e0: 69 6f 6e 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 ions. For examp
d4f0: 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 57 48 45 le:.**.** WHE
d500: 52 45 20 20 61 3d 3d 27 68 65 6c 6c 6f 27 20 41 RE a=='hello' A
d510: 4e 44 20 63 6f 61 6c 65 73 63 65 28 62 2c 31 31 ND coalesce(b,11
d520: 29 3c 31 30 20 41 4e 44 20 28 63 2b 31 32 21 3d )<10 AND (c+12!=
d530: 64 20 4f 52 20 63 3d 3d 32 32 29 0a 2a 2a 20 20 d OR c==22).**
d540: 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f \______
d550: 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f __/ \_______
d560: 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f ________/ \_
d570: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f _______________/
d580: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 73 .** s
d590: 6c 6f 74 5b 30 5d 20 20 20 20 20 20 20 20 20 20 lot[0]
d5a0: 20 20 73 6c 6f 74 5b 31 5d 20 20 20 20 20 20 20 slot[1]
d5b0: 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 32 5d 0a slot[2].
d5c0: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e **.** The origin
d5d0: 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 al WHERE clause
d5e0: 69 6e 20 70 45 78 70 72 20 69 73 20 75 6e 61 6c in pExpr is unal
d5f0: 74 65 72 65 64 2e 20 20 41 6c 6c 20 74 68 69 73 tered. All this
d600: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f 65 73 routine.** does
d610: 20 69 73 20 6d 61 6b 65 20 73 6c 6f 74 5b 5d 20 is make slot[]
d620: 65 6e 74 72 69 65 73 20 70 6f 69 6e 74 20 74 6f entries point to
d630: 20 73 75 62 73 74 72 75 63 74 75 72 65 20 77 69 substructure wi
d640: 74 68 69 6e 20 70 45 78 70 72 2e 0a 2a 2a 0a 2a thin pExpr..**.*
d650: 2a 20 49 6e 20 74 68 65 20 70 72 65 76 69 6f 75 * In the previou
d660: 73 20 73 65 6e 74 65 6e 63 65 20 61 6e 64 20 69 s sentence and i
d670: 6e 20 74 68 65 20 64 69 61 67 72 61 6d 2c 20 22 n the diagram, "
d680: 73 6c 6f 74 5b 5d 22 20 72 65 66 65 72 73 20 74 slot[]" refers t
d690: 6f 0a 2a 2a 20 74 68 65 20 57 68 65 72 65 43 6c o.** the WhereCl
d6a0: 61 75 73 65 2e 61 5b 5d 20 61 72 72 61 79 2e 20 ause.a[] array.
d6b0: 20 54 68 65 20 73 6c 6f 74 5b 5d 20 61 72 72 61 The slot[] arra
d6c0: 79 20 67 72 6f 77 73 20 61 73 20 6e 65 65 64 65 y grows as neede
d6d0: 64 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 d to contain.**
d6e0: 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 all terms of the
d6f0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a WHERE clause..*
d700: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68 /.void sqlite3Wh
d710: 65 72 65 53 70 6c 69 74 28 57 68 65 72 65 43 6c ereSplit(WhereCl
d720: 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 ause *pWC, Expr
d730: 2a 70 45 78 70 72 2c 20 75 38 20 6f 70 29 7b 0a *pExpr, u8 op){.
d740: 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20 73 71 Expr *pE2 = sq
d750: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c lite3ExprSkipCol
d760: 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20 70 late(pExpr);. p
d770: 57 43 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20 69 WC->op = op;. i
d780: 66 28 20 70 45 32 3d 3d 30 20 29 20 72 65 74 75 f( pE2==0 ) retu
d790: 72 6e 3b 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f rn;. if( pE2->o
d7a0: 70 21 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68 65 p!=op ){. whe
d7b0: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 reClauseInsert(p
d7c0: 57 43 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 WC, pExpr, 0);.
d7d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 }else{. sqli
d7e0: 74 65 33 57 68 65 72 65 53 70 6c 69 74 28 70 57 te3WhereSplit(pW
d7f0: 43 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 6f C, pE2->pLeft, o
d800: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 p);. sqlite3W
d810: 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70 hereSplit(pWC, p
d820: 45 32 2d 3e 70 52 69 67 68 74 2c 20 6f 70 29 3b E2->pRight, op);
d830: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e . }.}../*.** In
d840: 69 74 69 61 6c 69 7a 65 20 61 20 70 72 65 61 6c itialize a preal
d850: 6c 6f 63 61 74 65 64 20 57 68 65 72 65 43 6c 61 located WhereCla
d860: 75 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a use structure..*
d870: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68 /.void sqlite3Wh
d880: 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 0a 20 ereClauseInit(.
d890: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 WhereClause *pW
d8a0: 43 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 C, /* The
d8b0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 74 6f 20 WhereClause to
d8c0: 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a be initialized *
d8d0: 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 /. WhereInfo *p
d8e0: 57 49 6e 66 6f 20 20 20 20 20 20 20 20 2f 2a 20 WInfo /*
d8f0: 54 68 65 20 57 48 45 52 45 20 70 72 6f 63 65 73 The WHERE proces
d900: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a sing context */.
d910: 29 7b 0a 20 20 70 57 43 2d 3e 70 57 49 6e 66 6f ){. pWC->pWInfo
d920: 20 3d 20 70 57 49 6e 66 6f 3b 0a 20 20 70 57 43 = pWInfo;. pWC
d930: 2d 3e 68 61 73 4f 72 20 3d 20 30 3b 0a 20 20 70 ->hasOr = 0;. p
d940: 57 43 2d 3e 70 4f 75 74 65 72 20 3d 20 30 3b 0a WC->pOuter = 0;.
d950: 20 20 70 57 43 2d 3e 6e 54 65 72 6d 20 3d 20 30 pWC->nTerm = 0
d960: 3b 0a 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d ;. pWC->nSlot =
d970: 20 41 72 72 61 79 53 69 7a 65 28 70 57 43 2d 3e ArraySize(pWC->
d980: 61 53 74 61 74 69 63 29 3b 0a 20 20 70 57 43 2d aStatic);. pWC-
d990: 3e 61 20 3d 20 70 57 43 2d 3e 61 53 74 61 74 69 >a = pWC->aStati
d9a0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c c;.}../*.** Deal
d9b0: 6c 6f 63 61 74 65 20 61 20 57 68 65 72 65 43 6c locate a WhereCl
d9c0: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 ause structure.
d9d0: 20 54 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 The WhereClause
d9e0: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 structure.** it
d9f0: 73 65 6c 66 20 69 73 20 6e 6f 74 20 66 72 65 65 self is not free
da00: 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 d. This routine
da10: 20 69 73 20 74 68 65 20 69 6e 76 65 72 73 65 20 is the inverse
da20: 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 of.** sqlite3Whe
da30: 72 65 43 6c 61 75 73 65 49 6e 69 74 28 29 2e 0a reClauseInit()..
da40: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 */.void sqlite3W
da50: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 hereClauseClear(
da60: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 WhereClause *pWC
da70: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 ){. int i;. Wh
da80: 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20 20 73 71 ereTerm *a;. sq
da90: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 43 2d lite3 *db = pWC-
daa0: 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d >pWInfo->pParse-
dab0: 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 >db;. for(i=pWC
dac0: 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d 70 57 43 ->nTerm-1, a=pWC
dad0: 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 ->a; i>=0; i--,
dae0: 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 2d a++){. if( a-
daf0: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f >wtFlags & TERM_
db00: 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20 DYNAMIC ){.
db10: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 sqlite3ExprDele
db20: 74 65 28 64 62 2c 20 61 2d 3e 70 45 78 70 72 29 te(db, a->pExpr)
db30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 ;. }. if(
db40: 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 a->wtFlags & TER
db50: 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20 20 20 20 M_ORINFO ){.
db60: 20 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c whereOrInfoDel
db70: 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70 4f 72 ete(db, a->u.pOr
db80: 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 Info);. }else
db90: 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 if( a->wtFlags
dba0: 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 20 29 & TERM_ANDINFO )
dbb0: 7b 0a 20 20 20 20 20 20 77 68 65 72 65 41 6e 64 {. whereAnd
dbc0: 49 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c 20 61 InfoDelete(db, a
dbd0: 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29 3b 0a 20 ->u.pAndInfo);.
dbe0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 }. }. if( p
dbf0: 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61 53 74 61 WC->a!=pWC->aSta
dc00: 74 69 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 tic ){. sqlit
dc10: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 43 e3DbFree(db, pWC
dc20: 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a ->a);. }.}.../*
dc30: 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e .** These routin
dc40: 65 73 20 77 61 6c 6b 20 28 72 65 63 75 72 73 69 es walk (recursi
dc50: 76 65 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73 vely) an express
dc60: 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e ion tree and gen
dc70: 65 72 61 74 65 0a 2a 2a 20 61 20 62 69 74 6d 61 erate.** a bitma
dc80: 73 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 sk indicating wh
dc90: 69 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 75 ich tables are u
dca0: 73 65 64 20 69 6e 20 74 68 61 74 20 65 78 70 72 sed in that expr
dcb0: 65 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a ession.** tree..
dcc0: 2a 2f 0a 42 69 74 6d 61 73 6b 20 73 71 6c 69 74 */.Bitmask sqlit
dcd0: 65 33 57 68 65 72 65 45 78 70 72 55 73 61 67 65 e3WhereExprUsage
dce0: 4e 4e 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20 NN(WhereMaskSet
dcf0: 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72 20 *pMaskSet, Expr
dd00: 2a 70 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d *p){. Bitmask m
dd10: 61 73 6b 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 ask;. if( p->op
dd20: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 21 ==TK_COLUMN && !
dd30: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 ExprHasProperty(
dd40: 70 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c 29 20 p, EP_FixedCol)
dd50: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 ){. return sq
dd60: 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 lite3WhereGetMas
dd70: 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69 k(pMaskSet, p->i
dd80: 54 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 20 Table);. }else
dd90: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 if( ExprHasPrope
dda0: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f rty(p, EP_TokenO
ddb0: 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29 7b 0a nly|EP_Leaf) ){.
ddc0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f assert( p->o
ddd0: 70 21 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f p!=TK_IF_NULL_RO
dde0: 57 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 W );. return
ddf0: 30 3b 0a 20 20 7d 0a 20 20 6d 61 73 6b 20 3d 20 0;. }. mask =
de00: 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 46 5f 4e 55 (p->op==TK_IF_NU
de10: 4c 4c 5f 52 4f 57 29 20 3f 20 73 71 6c 69 74 65 LL_ROW) ? sqlite
de20: 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 70 4d 3WhereGetMask(pM
de30: 61 73 6b 53 65 74 2c 20 70 2d 3e 69 54 61 62 6c askSet, p->iTabl
de40: 65 29 20 3a 20 30 3b 0a 20 20 69 66 28 20 70 2d e) : 0;. if( p-
de50: 3e 70 4c 65 66 74 20 29 20 6d 61 73 6b 20 7c 3d >pLeft ) mask |=
de60: 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 sqlite3WhereExp
de70: 72 55 73 61 67 65 4e 4e 28 70 4d 61 73 6b 53 65 rUsageNN(pMaskSe
de80: 74 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 t, p->pLeft);.
de90: 69 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29 7b if( p->pRight ){
dea0: 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 73 71 6c . mask |= sql
deb0: 69 74 65 33 57 68 65 72 65 45 78 70 72 55 73 61 ite3WhereExprUsa
dec0: 67 65 4e 4e 28 70 4d 61 73 6b 53 65 74 2c 20 70 geNN(pMaskSet, p
ded0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 61 ->pRight);. a
dee0: 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 4c 69 73 ssert( p->x.pLis
def0: 74 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 20 t==0 );. }else
df00: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 if( ExprHasPrope
df10: 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c rty(p, EP_xIsSel
df20: 65 63 74 29 20 29 7b 0a 20 20 20 20 69 66 28 20 ect) ){. if(
df30: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 ExprHasProperty(
df40: 70 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29 p, EP_VarSelect)
df50: 20 29 20 70 4d 61 73 6b 53 65 74 2d 3e 62 56 61 ) pMaskSet->bVa
df60: 72 53 65 6c 65 63 74 20 3d 20 31 3b 0a 20 20 20 rSelect = 1;.
df70: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c mask |= exprSel
df80: 65 63 74 55 73 61 67 65 28 70 4d 61 73 6b 53 65 ectUsage(pMaskSe
df90: 74 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 t, p->x.pSelect)
dfa0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d ;. }else if( p-
dfb0: 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 >x.pList ){.
dfc0: 6d 61 73 6b 20 7c 3d 20 73 71 6c 69 74 65 33 57 mask |= sqlite3W
dfd0: 68 65 72 65 45 78 70 72 4c 69 73 74 55 73 61 67 hereExprListUsag
dfe0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 78 e(pMaskSet, p->x
dff0: 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 72 .pList);. }. r
e000: 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 42 69 eturn mask;.}.Bi
e010: 74 6d 61 73 6b 20 73 71 6c 69 74 65 33 57 68 65 tmask sqlite3Whe
e020: 72 65 45 78 70 72 55 73 61 67 65 28 57 68 65 72 reExprUsage(Wher
e030: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 eMaskSet *pMaskS
e040: 65 74 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 et, Expr *p){.
e050: 72 65 74 75 72 6e 20 70 20 3f 20 73 71 6c 69 74 return p ? sqlit
e060: 65 33 57 68 65 72 65 45 78 70 72 55 73 61 67 65 e3WhereExprUsage
e070: 4e 4e 28 70 4d 61 73 6b 53 65 74 2c 70 29 20 3a NN(pMaskSet,p) :
e080: 20 30 3b 0a 7d 0a 42 69 74 6d 61 73 6b 20 73 71 0;.}.Bitmask sq
e090: 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 4c 69 lite3WhereExprLi
e0a0: 73 74 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 stUsage(WhereMas
e0b0: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 kSet *pMaskSet,
e0c0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 ExprList *pList)
e0d0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42 69 74 {. int i;. Bit
e0e0: 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 mask mask = 0;.
e0f0: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 if( pList ){.
e100: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 for(i=0; i<pLi
e110: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b st->nExpr; i++){
e120: 0a 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 73 . mask |= s
e130: 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 55 qlite3WhereExprU
e140: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 sage(pMaskSet, p
e150: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 List->a[i].pExpr
e160: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 );. }. }. r
e170: 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 0a eturn mask;.}...
e180: 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41 /*.** Call exprA
e190: 6e 61 6c 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65 nalyze on all te
e1a0: 72 6d 73 20 69 6e 20 61 20 57 48 45 52 45 20 63 rms in a WHERE c
e1b0: 6c 61 75 73 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 4e lause. .**.** N
e1c0: 6f 74 65 20 74 68 61 74 20 65 78 70 72 41 6e 61 ote that exprAna
e1d0: 6c 79 7a 65 28 29 20 6d 69 67 68 74 20 61 64 64 lyze() might add
e1e0: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 new virtual ter
e1f0: 6d 73 20 6f 6e 74 6f 20 74 68 65 0a 2a 2a 20 65 ms onto the.** e
e200: 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 nd of the WHERE
e210: 63 6c 61 75 73 65 2e 20 20 57 65 20 64 6f 20 6e clause. We do n
e220: 6f 74 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79 ot want to analy
e230: 7a 65 20 74 68 65 73 65 20 6e 65 77 0a 2a 2a 20 ze these new.**
e240: 76 69 72 74 75 61 6c 20 74 65 72 6d 73 2c 20 73 virtual terms, s
e250: 6f 20 73 74 61 72 74 20 61 6e 61 6c 79 7a 69 6e o start analyzin
e260: 67 20 61 74 20 74 68 65 20 65 6e 64 20 61 6e 64 g at the end and
e270: 20 77 6f 72 6b 20 66 6f 72 77 61 72 64 0a 2a 2a work forward.**
e280: 20 73 6f 20 74 68 61 74 20 74 68 65 20 61 64 64 so that the add
e290: 65 64 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 ed virtual terms
e2a0: 20 61 72 65 20 6e 65 76 65 72 20 70 72 6f 63 65 are never proce
e2b0: 73 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 ssed..*/.void sq
e2c0: 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 41 6e lite3WhereExprAn
e2d0: 61 6c 79 7a 65 28 0a 20 20 53 72 63 4c 69 73 74 alyze(. SrcList
e2e0: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 *pTabList,
e2f0: 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c /* the FROM cl
e300: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 ause */. WhereC
e310: 6c 61 75 73 65 20 2a 70 57 43 20 20 20 20 20 20 lause *pWC
e320: 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 /* the WHERE
e330: 63 6c 61 75 73 65 20 74 6f 20 62 65 20 61 6e 61 clause to be ana
e340: 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e lyzed */.){. in
e350: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 t i;. for(i=pWC
e360: 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b ->nTerm-1; i>=0;
e370: 20 69 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72 41 i--){. exprA
e380: 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73 74 2c nalyze(pTabList,
e390: 20 70 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a pWC, i);. }.}.
e3a0: 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 61 62 6c 65 ./*.** For table
e3b0: 2d 76 61 6c 75 65 64 2d 66 75 6e 63 74 69 6f 6e -valued-function
e3c0: 73 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 65 s, transform the
e3d0: 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 function argume
e3e0: 6e 74 73 20 69 6e 74 6f 0a 2a 2a 20 6e 65 77 20 nts into.** new
e3f0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 WHERE clause ter
e400: 6d 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 45 61 63 68 ms. .**.** Each
e410: 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 function argume
e420: 6e 74 20 74 72 61 6e 73 6c 61 74 65 73 20 69 6e nt translates in
e430: 74 6f 20 61 6e 20 65 71 75 61 6c 69 74 79 20 63 to an equality c
e440: 6f 6e 73 74 72 61 69 6e 74 20 61 67 61 69 6e 73 onstraint agains
e450: 74 0a 2a 2a 20 61 20 48 49 44 44 45 4e 20 63 6f t.** a HIDDEN co
e460: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c lumn in the tabl
e470: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 e..*/.void sqlit
e480: 65 33 57 68 65 72 65 54 61 62 46 75 6e 63 41 72 e3WhereTabFuncAr
e490: 67 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 gs(. Parse *pPa
e4a0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 rse,
e4b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 /* Parsi
e4c0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 ng context */.
e4d0: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 struct SrcList_i
e4e0: 74 65 6d 20 2a 70 49 74 65 6d 2c 20 20 20 20 20 tem *pItem,
e4f0: 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c /* The FROM cl
e500: 61 75 73 65 20 74 65 72 6d 20 74 6f 20 70 72 6f ause term to pro
e510: 63 65 73 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 cess */. WhereC
e520: 6c 61 75 73 65 20 2a 70 57 43 20 20 20 20 20 20 lause *pWC
e530: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 58 /* X
e540: 66 65 72 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 fer function arg
e550: 75 6d 65 6e 74 73 20 74 6f 20 68 65 72 65 20 2a uments to here *
e560: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 /.){. Table *pT
e570: 61 62 3b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 0a ab;. int j, k;.
e580: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 41 72 67 ExprList *pArg
e590: 73 3b 0a 20 20 45 78 70 72 20 2a 70 43 6f 6c 52 s;. Expr *pColR
e5a0: 65 66 3b 0a 20 20 45 78 70 72 20 2a 70 54 65 72 ef;. Expr *pTer
e5b0: 6d 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e m;. if( pItem->
e5c0: 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 fg.isTabFunc==0
e5d0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 61 62 ) return;. pTab
e5e0: 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a = pItem->pTab;.
e5f0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d assert( pTab!=
e600: 30 20 29 3b 0a 20 20 70 41 72 67 73 20 3d 20 70 0 );. pArgs = p
e610: 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 Item->u1.pFuncAr
e620: 67 3b 0a 20 20 69 66 28 20 70 41 72 67 73 3d 3d g;. if( pArgs==
e630: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 0 ) return;. fo
e640: 72 28 6a 3d 6b 3d 30 3b 20 6a 3c 70 41 72 67 73 r(j=k=0; j<pArgs
e650: 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 ->nExpr; j++){.
e660: 20 20 20 77 68 69 6c 65 28 20 6b 3c 70 54 61 62 while( k<pTab
e670: 2d 3e 6e 43 6f 6c 20 26 26 20 28 70 54 61 62 2d ->nCol && (pTab-
e680: 3e 61 43 6f 6c 5b 6b 5d 2e 63 6f 6c 46 6c 61 67 >aCol[k].colFlag
e690: 73 20 26 20 43 4f 4c 46 4c 41 47 5f 48 49 44 44 s & COLFLAG_HIDD
e6a0: 45 4e 29 3d 3d 30 20 29 7b 6b 2b 2b 3b 7d 0a 20 EN)==0 ){k++;}.
e6b0: 20 20 20 69 66 28 20 6b 3e 3d 70 54 61 62 2d 3e if( k>=pTab->
e6c0: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 nCol ){. sq
e6d0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 lite3ErrorMsg(pP
e6e0: 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 arse, "too many
e6f0: 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20 25 73 28 arguments on %s(
e700: 29 20 2d 20 6d 61 78 20 25 64 22 2c 0a 20 20 20 ) - max %d",.
e710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
e720: 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 pTab->zName,
e730: 6a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e j);. return
e740: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c ;. }. pCol
e750: 52 65 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70 Ref = sqlite3Exp
e760: 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 rAlloc(pParse->d
e770: 62 2c 20 54 4b 5f 43 4f 4c 55 4d 4e 2c 20 30 2c b, TK_COLUMN, 0,
e780: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 0);. if( pCo
e790: 6c 52 65 66 3d 3d 30 20 29 20 72 65 74 75 72 6e lRef==0 ) return
e7a0: 3b 0a 20 20 20 20 70 43 6f 6c 52 65 66 2d 3e 69 ;. pColRef->i
e7b0: 54 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69 Table = pItem->i
e7c0: 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 43 6f 6c Cursor;. pCol
e7d0: 52 65 66 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6b Ref->iColumn = k
e7e0: 2b 2b 3b 0a 20 20 20 20 70 43 6f 6c 52 65 66 2d ++;. pColRef-
e7f0: 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 >pTab = pTab;.
e800: 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 pTerm = sqlite
e810: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 3PExpr(pParse, T
e820: 4b 5f 45 51 2c 20 70 43 6f 6c 52 65 66 2c 0a 20 K_EQ, pColRef,.
e830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
e840: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 sqlite3E
e850: 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 xprDup(pParse->d
e860: 62 2c 20 70 41 72 67 73 2d 3e 61 5b 6a 5d 2e 70 b, pArgs->a[j].p
e870: 45 78 70 72 2c 20 30 29 29 3b 0a 20 20 20 20 77 Expr, 0));. w
e880: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 hereClauseInsert
e890: 28 70 57 43 2c 20 70 54 65 72 6d 2c 20 54 45 52 (pWC, pTerm, TER
e8a0: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a M_DYNAMIC);. }.
e8b0: 7d 0a }.