extensions/sqlite/sqlite-source/where.c
author David Anderson <dvander@alliedmods.net>
Sun Jul 29 01:15:31 2007 +0000 (2007-07-29)
changeset 1203 633c25ce6405
child 1645 27307df4d711
permissions -rw-r--r--
initial import of sqlite extension
dvander@1203
     1
/*
dvander@1203
     2
** 2001 September 15
dvander@1203
     3
**
dvander@1203
     4
** The author disclaims copyright to this source code.  In place of
dvander@1203
     5
** a legal notice, here is a blessing:
dvander@1203
     6
**
dvander@1203
     7
**    May you do good and not evil.
dvander@1203
     8
**    May you find forgiveness for yourself and forgive others.
dvander@1203
     9
**    May you share freely, never taking more than you give.
dvander@1203
    10
**
dvander@1203
    11
*************************************************************************
dvander@1203
    12
** This module contains C code that generates VDBE code used to process
dvander@1203
    13
** the WHERE clause of SQL statements.  This module is reponsible for
dvander@1203
    14
** generating the code that loops through a table looking for applicable
dvander@1203
    15
** rows.  Indices are selected and used to speed the search when doing
dvander@1203
    16
** so is applicable.  Because this module is responsible for selecting
dvander@1203
    17
** indices, you might also think of this module as the "query optimizer".
dvander@1203
    18
**
dvander@1203
    19
** $Id$
dvander@1203
    20
*/
dvander@1203
    21
#include "sqliteInt.h"
dvander@1203
    22
dvander@1203
    23
/*
dvander@1203
    24
** The number of bits in a Bitmask.  "BMS" means "BitMask Size".
dvander@1203
    25
*/
dvander@1203
    26
#define BMS  (sizeof(Bitmask)*8)
dvander@1203
    27
dvander@1203
    28
/*
dvander@1203
    29
** Trace output macros
dvander@1203
    30
*/
dvander@1203
    31
#if defined(SQLITE_TEST) || defined(SQLITE_DEBUG)
dvander@1203
    32
int sqlite3_where_trace = 0;
dvander@1203
    33
# define WHERETRACE(X)  if(sqlite3_where_trace) sqlite3DebugPrintf X
dvander@1203
    34
#else
dvander@1203
    35
# define WHERETRACE(X)
dvander@1203
    36
#endif
dvander@1203
    37
dvander@1203
    38
/* Forward reference
dvander@1203
    39
*/
dvander@1203
    40
typedef struct WhereClause WhereClause;
dvander@1203
    41
typedef struct ExprMaskSet ExprMaskSet;
dvander@1203
    42
dvander@1203
    43
/*
dvander@1203
    44
** The query generator uses an array of instances of this structure to
dvander@1203
    45
** help it analyze the subexpressions of the WHERE clause.  Each WHERE
dvander@1203
    46
** clause subexpression is separated from the others by an AND operator.
dvander@1203
    47
**
dvander@1203
    48
** All WhereTerms are collected into a single WhereClause structure.  
dvander@1203
    49
** The following identity holds:
dvander@1203
    50
**
dvander@1203
    51
**        WhereTerm.pWC->a[WhereTerm.idx] == WhereTerm
dvander@1203
    52
**
dvander@1203
    53
** When a term is of the form:
dvander@1203
    54
**
dvander@1203
    55
**              X <op> <expr>
dvander@1203
    56
**
dvander@1203
    57
** where X is a column name and <op> is one of certain operators,
dvander@1203
    58
** then WhereTerm.leftCursor and WhereTerm.leftColumn record the
dvander@1203
    59
** cursor number and column number for X.  WhereTerm.operator records
dvander@1203
    60
** the <op> using a bitmask encoding defined by WO_xxx below.  The
dvander@1203
    61
** use of a bitmask encoding for the operator allows us to search
dvander@1203
    62
** quickly for terms that match any of several different operators.
dvander@1203
    63
**
dvander@1203
    64
** prereqRight and prereqAll record sets of cursor numbers,
dvander@1203
    65
** but they do so indirectly.  A single ExprMaskSet structure translates
dvander@1203
    66
** cursor number into bits and the translated bit is stored in the prereq
dvander@1203
    67
** fields.  The translation is used in order to maximize the number of
dvander@1203
    68
** bits that will fit in a Bitmask.  The VDBE cursor numbers might be
dvander@1203
    69
** spread out over the non-negative integers.  For example, the cursor
dvander@1203
    70
** numbers might be 3, 8, 9, 10, 20, 23, 41, and 45.  The ExprMaskSet
dvander@1203
    71
** translates these sparse cursor numbers into consecutive integers
dvander@1203
    72
** beginning with 0 in order to make the best possible use of the available
dvander@1203
    73
** bits in the Bitmask.  So, in the example above, the cursor numbers
dvander@1203
    74
** would be mapped into integers 0 through 7.
dvander@1203
    75
*/
dvander@1203
    76
typedef struct WhereTerm WhereTerm;
dvander@1203
    77
struct WhereTerm {
dvander@1203
    78
  Expr *pExpr;            /* Pointer to the subexpression */
dvander@1203
    79
  i16 iParent;            /* Disable pWC->a[iParent] when this term disabled */
dvander@1203
    80
  i16 leftCursor;         /* Cursor number of X in "X <op> <expr>" */
dvander@1203
    81
  i16 leftColumn;         /* Column number of X in "X <op> <expr>" */
dvander@1203
    82
  u16 eOperator;          /* A WO_xx value describing <op> */
dvander@1203
    83
  u8 flags;               /* Bit flags.  See below */
dvander@1203
    84
  u8 nChild;              /* Number of children that must disable us */
dvander@1203
    85
  WhereClause *pWC;       /* The clause this term is part of */
dvander@1203
    86
  Bitmask prereqRight;    /* Bitmask of tables used by pRight */
dvander@1203
    87
  Bitmask prereqAll;      /* Bitmask of tables referenced by p */
dvander@1203
    88
};
dvander@1203
    89
dvander@1203
    90
/*
dvander@1203
    91
** Allowed values of WhereTerm.flags
dvander@1203
    92
*/
dvander@1203
    93
#define TERM_DYNAMIC    0x01   /* Need to call sqlite3ExprDelete(pExpr) */
dvander@1203
    94
#define TERM_VIRTUAL    0x02   /* Added by the optimizer.  Do not code */
dvander@1203
    95
#define TERM_CODED      0x04   /* This term is already coded */
dvander@1203
    96
#define TERM_COPIED     0x08   /* Has a child */
dvander@1203
    97
#define TERM_OR_OK      0x10   /* Used during OR-clause processing */
dvander@1203
    98
dvander@1203
    99
/*
dvander@1203
   100
** An instance of the following structure holds all information about a
dvander@1203
   101
** WHERE clause.  Mostly this is a container for one or more WhereTerms.
dvander@1203
   102
*/
dvander@1203
   103
struct WhereClause {
dvander@1203
   104
  Parse *pParse;           /* The parser context */
dvander@1203
   105
  ExprMaskSet *pMaskSet;   /* Mapping of table indices to bitmasks */
dvander@1203
   106
  int nTerm;               /* Number of terms */
dvander@1203
   107
  int nSlot;               /* Number of entries in a[] */
dvander@1203
   108
  WhereTerm *a;            /* Each a[] describes a term of the WHERE cluase */
dvander@1203
   109
  WhereTerm aStatic[10];   /* Initial static space for a[] */
dvander@1203
   110
};
dvander@1203
   111
dvander@1203
   112
/*
dvander@1203
   113
** An instance of the following structure keeps track of a mapping
dvander@1203
   114
** between VDBE cursor numbers and bits of the bitmasks in WhereTerm.
dvander@1203
   115
**
dvander@1203
   116
** The VDBE cursor numbers are small integers contained in 
dvander@1203
   117
** SrcList_item.iCursor and Expr.iTable fields.  For any given WHERE 
dvander@1203
   118
** clause, the cursor numbers might not begin with 0 and they might
dvander@1203
   119
** contain gaps in the numbering sequence.  But we want to make maximum
dvander@1203
   120
** use of the bits in our bitmasks.  This structure provides a mapping
dvander@1203
   121
** from the sparse cursor numbers into consecutive integers beginning
dvander@1203
   122
** with 0.
dvander@1203
   123
**
dvander@1203
   124
** If ExprMaskSet.ix[A]==B it means that The A-th bit of a Bitmask
dvander@1203
   125
** corresponds VDBE cursor number B.  The A-th bit of a bitmask is 1<<A.
dvander@1203
   126
**
dvander@1203
   127
** For example, if the WHERE clause expression used these VDBE
dvander@1203
   128
** cursors:  4, 5, 8, 29, 57, 73.  Then the  ExprMaskSet structure
dvander@1203
   129
** would map those cursor numbers into bits 0 through 5.
dvander@1203
   130
**
dvander@1203
   131
** Note that the mapping is not necessarily ordered.  In the example
dvander@1203
   132
** above, the mapping might go like this:  4->3, 5->1, 8->2, 29->0,
dvander@1203
   133
** 57->5, 73->4.  Or one of 719 other combinations might be used. It
dvander@1203
   134
** does not really matter.  What is important is that sparse cursor
dvander@1203
   135
** numbers all get mapped into bit numbers that begin with 0 and contain
dvander@1203
   136
** no gaps.
dvander@1203
   137
*/
dvander@1203
   138
struct ExprMaskSet {
dvander@1203
   139
  int n;                        /* Number of assigned cursor values */
dvander@1203
   140
  int ix[sizeof(Bitmask)*8];    /* Cursor assigned to each bit */
dvander@1203
   141
};
dvander@1203
   142
dvander@1203
   143
dvander@1203
   144
/*
dvander@1203
   145
** Bitmasks for the operators that indices are able to exploit.  An
dvander@1203
   146
** OR-ed combination of these values can be used when searching for
dvander@1203
   147
** terms in the where clause.
dvander@1203
   148
*/
dvander@1203
   149
#define WO_IN     1
dvander@1203
   150
#define WO_EQ     2
dvander@1203
   151
#define WO_LT     (WO_EQ<<(TK_LT-TK_EQ))
dvander@1203
   152
#define WO_LE     (WO_EQ<<(TK_LE-TK_EQ))
dvander@1203
   153
#define WO_GT     (WO_EQ<<(TK_GT-TK_EQ))
dvander@1203
   154
#define WO_GE     (WO_EQ<<(TK_GE-TK_EQ))
dvander@1203
   155
#define WO_MATCH  64
dvander@1203
   156
#define WO_ISNULL 128
dvander@1203
   157
dvander@1203
   158
/*
dvander@1203
   159
** Value for flags returned by bestIndex().  
dvander@1203
   160
**
dvander@1203
   161
** The least significant byte is reserved as a mask for WO_ values above.
dvander@1203
   162
** The WhereLevel.flags field is usually set to WO_IN|WO_EQ|WO_ISNULL.
dvander@1203
   163
** But if the table is the right table of a left join, WhereLevel.flags
dvander@1203
   164
** is set to WO_IN|WO_EQ.  The WhereLevel.flags field can then be used as
dvander@1203
   165
** the "op" parameter to findTerm when we are resolving equality constraints.
dvander@1203
   166
** ISNULL constraints will then not be used on the right table of a left
dvander@1203
   167
** join.  Tickets #2177 and #2189.
dvander@1203
   168
*/
dvander@1203
   169
#define WHERE_ROWID_EQ     0x000100   /* rowid=EXPR or rowid IN (...) */
dvander@1203
   170
#define WHERE_ROWID_RANGE  0x000200   /* rowid<EXPR and/or rowid>EXPR */
dvander@1203
   171
#define WHERE_COLUMN_EQ    0x001000   /* x=EXPR or x IN (...) */
dvander@1203
   172
#define WHERE_COLUMN_RANGE 0x002000   /* x<EXPR and/or x>EXPR */
dvander@1203
   173
#define WHERE_COLUMN_IN    0x004000   /* x IN (...) */
dvander@1203
   174
#define WHERE_TOP_LIMIT    0x010000   /* x<EXPR or x<=EXPR constraint */
dvander@1203
   175
#define WHERE_BTM_LIMIT    0x020000   /* x>EXPR or x>=EXPR constraint */
dvander@1203
   176
#define WHERE_IDX_ONLY     0x080000   /* Use index only - omit table */
dvander@1203
   177
#define WHERE_ORDERBY      0x100000   /* Output will appear in correct order */
dvander@1203
   178
#define WHERE_REVERSE      0x200000   /* Scan in reverse order */
dvander@1203
   179
#define WHERE_UNIQUE       0x400000   /* Selects no more than one row */
dvander@1203
   180
#define WHERE_VIRTUALTABLE 0x800000   /* Use virtual-table processing */
dvander@1203
   181
dvander@1203
   182
/*
dvander@1203
   183
** Initialize a preallocated WhereClause structure.
dvander@1203
   184
*/
dvander@1203
   185
static void whereClauseInit(
dvander@1203
   186
  WhereClause *pWC,        /* The WhereClause to be initialized */
dvander@1203
   187
  Parse *pParse,           /* The parsing context */
dvander@1203
   188
  ExprMaskSet *pMaskSet    /* Mapping from table indices to bitmasks */
dvander@1203
   189
){
dvander@1203
   190
  pWC->pParse = pParse;
dvander@1203
   191
  pWC->pMaskSet = pMaskSet;
dvander@1203
   192
  pWC->nTerm = 0;
dvander@1203
   193
  pWC->nSlot = ArraySize(pWC->aStatic);
dvander@1203
   194
  pWC->a = pWC->aStatic;
dvander@1203
   195
}
dvander@1203
   196
dvander@1203
   197
/*
dvander@1203
   198
** Deallocate a WhereClause structure.  The WhereClause structure
dvander@1203
   199
** itself is not freed.  This routine is the inverse of whereClauseInit().
dvander@1203
   200
*/
dvander@1203
   201
static void whereClauseClear(WhereClause *pWC){
dvander@1203
   202
  int i;
dvander@1203
   203
  WhereTerm *a;
dvander@1203
   204
  for(i=pWC->nTerm-1, a=pWC->a; i>=0; i--, a++){
dvander@1203
   205
    if( a->flags & TERM_DYNAMIC ){
dvander@1203
   206
      sqlite3ExprDelete(a->pExpr);
dvander@1203
   207
    }
dvander@1203
   208
  }
dvander@1203
   209
  if( pWC->a!=pWC->aStatic ){
dvander@1203
   210
    sqliteFree(pWC->a);
dvander@1203
   211
  }
dvander@1203
   212
}
dvander@1203
   213
dvander@1203
   214
/*
dvander@1203
   215
** Add a new entries to the WhereClause structure.  Increase the allocated
dvander@1203
   216
** space as necessary.
dvander@1203
   217
**
dvander@1203
   218
** If the flags argument includes TERM_DYNAMIC, then responsibility
dvander@1203
   219
** for freeing the expression p is assumed by the WhereClause object.
dvander@1203
   220
**
dvander@1203
   221
** WARNING:  This routine might reallocate the space used to store
dvander@1203
   222
** WhereTerms.  All pointers to WhereTerms should be invalided after
dvander@1203
   223
** calling this routine.  Such pointers may be reinitialized by referencing
dvander@1203
   224
** the pWC->a[] array.
dvander@1203
   225
*/
dvander@1203
   226
static int whereClauseInsert(WhereClause *pWC, Expr *p, int flags){
dvander@1203
   227
  WhereTerm *pTerm;
dvander@1203
   228
  int idx;
dvander@1203
   229
  if( pWC->nTerm>=pWC->nSlot ){
dvander@1203
   230
    WhereTerm *pOld = pWC->a;
dvander@1203
   231
    pWC->a = sqliteMalloc( sizeof(pWC->a[0])*pWC->nSlot*2 );
dvander@1203
   232
    if( pWC->a==0 ){
dvander@1203
   233
      if( flags & TERM_DYNAMIC ){
dvander@1203
   234
        sqlite3ExprDelete(p);
dvander@1203
   235
      }
dvander@1203
   236
      return 0;
dvander@1203
   237
    }
dvander@1203
   238
    memcpy(pWC->a, pOld, sizeof(pWC->a[0])*pWC->nTerm);
dvander@1203
   239
    if( pOld!=pWC->aStatic ){
dvander@1203
   240
      sqliteFree(pOld);
dvander@1203
   241
    }
dvander@1203
   242
    pWC->nSlot *= 2;
dvander@1203
   243
  }
dvander@1203
   244
  pTerm = &pWC->a[idx = pWC->nTerm];
dvander@1203
   245
  pWC->nTerm++;
dvander@1203
   246
  pTerm->pExpr = p;
dvander@1203
   247
  pTerm->flags = flags;
dvander@1203
   248
  pTerm->pWC = pWC;
dvander@1203
   249
  pTerm->iParent = -1;
dvander@1203
   250
  return idx;
dvander@1203
   251
}
dvander@1203
   252
dvander@1203
   253
/*
dvander@1203
   254
** This routine identifies subexpressions in the WHERE clause where
dvander@1203
   255
** each subexpression is separated by the AND operator or some other
dvander@1203
   256
** operator specified in the op parameter.  The WhereClause structure
dvander@1203
   257
** is filled with pointers to subexpressions.  For example:
dvander@1203
   258
**
dvander@1203
   259
**    WHERE  a=='hello' AND coalesce(b,11)<10 AND (c+12!=d OR c==22)
dvander@1203
   260
**           \________/     \_______________/     \________________/
dvander@1203
   261
**            slot[0]            slot[1]               slot[2]
dvander@1203
   262
**
dvander@1203
   263
** The original WHERE clause in pExpr is unaltered.  All this routine
dvander@1203
   264
** does is make slot[] entries point to substructure within pExpr.
dvander@1203
   265
**
dvander@1203
   266
** In the previous sentence and in the diagram, "slot[]" refers to
dvander@1203
   267
** the WhereClause.a[] array.  This array grows as needed to contain
dvander@1203
   268
** all terms of the WHERE clause.
dvander@1203
   269
*/
dvander@1203
   270
static void whereSplit(WhereClause *pWC, Expr *pExpr, int op){
dvander@1203
   271
  if( pExpr==0 ) return;
dvander@1203
   272
  if( pExpr->op!=op ){
dvander@1203
   273
    whereClauseInsert(pWC, pExpr, 0);
dvander@1203
   274
  }else{
dvander@1203
   275
    whereSplit(pWC, pExpr->pLeft, op);
dvander@1203
   276
    whereSplit(pWC, pExpr->pRight, op);
dvander@1203
   277
  }
dvander@1203
   278
}
dvander@1203
   279
dvander@1203
   280
/*
dvander@1203
   281
** Initialize an expression mask set
dvander@1203
   282
*/
dvander@1203
   283
#define initMaskSet(P)  memset(P, 0, sizeof(*P))
dvander@1203
   284
dvander@1203
   285
/*
dvander@1203
   286
** Return the bitmask for the given cursor number.  Return 0 if
dvander@1203
   287
** iCursor is not in the set.
dvander@1203
   288
*/
dvander@1203
   289
static Bitmask getMask(ExprMaskSet *pMaskSet, int iCursor){
dvander@1203
   290
  int i;
dvander@1203
   291
  for(i=0; i<pMaskSet->n; i++){
dvander@1203
   292
    if( pMaskSet->ix[i]==iCursor ){
dvander@1203
   293
      return ((Bitmask)1)<<i;
dvander@1203
   294
    }
dvander@1203
   295
  }
dvander@1203
   296
  return 0;
dvander@1203
   297
}
dvander@1203
   298
dvander@1203
   299
/*
dvander@1203
   300
** Create a new mask for cursor iCursor.
dvander@1203
   301
**
dvander@1203
   302
** There is one cursor per table in the FROM clause.  The number of
dvander@1203
   303
** tables in the FROM clause is limited by a test early in the
dvander@1203
   304
** sqlite3WhereBegin() routine.  So we know that the pMaskSet->ix[]
dvander@1203
   305
** array will never overflow.
dvander@1203
   306
*/
dvander@1203
   307
static void createMask(ExprMaskSet *pMaskSet, int iCursor){
dvander@1203
   308
  assert( pMaskSet->n < ArraySize(pMaskSet->ix) );
dvander@1203
   309
  pMaskSet->ix[pMaskSet->n++] = iCursor;
dvander@1203
   310
}
dvander@1203
   311
dvander@1203
   312
/*
dvander@1203
   313
** This routine walks (recursively) an expression tree and generates
dvander@1203
   314
** a bitmask indicating which tables are used in that expression
dvander@1203
   315
** tree.
dvander@1203
   316
**
dvander@1203
   317
** In order for this routine to work, the calling function must have
dvander@1203
   318
** previously invoked sqlite3ExprResolveNames() on the expression.  See
dvander@1203
   319
** the header comment on that routine for additional information.
dvander@1203
   320
** The sqlite3ExprResolveNames() routines looks for column names and
dvander@1203
   321
** sets their opcodes to TK_COLUMN and their Expr.iTable fields to
dvander@1203
   322
** the VDBE cursor number of the table.  This routine just has to
dvander@1203
   323
** translate the cursor numbers into bitmask values and OR all
dvander@1203
   324
** the bitmasks together.
dvander@1203
   325
*/
dvander@1203
   326
static Bitmask exprListTableUsage(ExprMaskSet*, ExprList*);
dvander@1203
   327
static Bitmask exprSelectTableUsage(ExprMaskSet*, Select*);
dvander@1203
   328
static Bitmask exprTableUsage(ExprMaskSet *pMaskSet, Expr *p){
dvander@1203
   329
  Bitmask mask = 0;
dvander@1203
   330
  if( p==0 ) return 0;
dvander@1203
   331
  if( p->op==TK_COLUMN ){
dvander@1203
   332
    mask = getMask(pMaskSet, p->iTable);
dvander@1203
   333
    return mask;
dvander@1203
   334
  }
dvander@1203
   335
  mask = exprTableUsage(pMaskSet, p->pRight);
dvander@1203
   336
  mask |= exprTableUsage(pMaskSet, p->pLeft);
dvander@1203
   337
  mask |= exprListTableUsage(pMaskSet, p->pList);
dvander@1203
   338
  mask |= exprSelectTableUsage(pMaskSet, p->pSelect);
dvander@1203
   339
  return mask;
dvander@1203
   340
}
dvander@1203
   341
static Bitmask exprListTableUsage(ExprMaskSet *pMaskSet, ExprList *pList){
dvander@1203
   342
  int i;
dvander@1203
   343
  Bitmask mask = 0;
dvander@1203
   344
  if( pList ){
dvander@1203
   345
    for(i=0; i<pList->nExpr; i++){
dvander@1203
   346
      mask |= exprTableUsage(pMaskSet, pList->a[i].pExpr);
dvander@1203
   347
    }
dvander@1203
   348
  }
dvander@1203
   349
  return mask;
dvander@1203
   350
}
dvander@1203
   351
static Bitmask exprSelectTableUsage(ExprMaskSet *pMaskSet, Select *pS){
dvander@1203
   352
  Bitmask mask;
dvander@1203
   353
  if( pS==0 ){
dvander@1203
   354
    mask = 0;
dvander@1203
   355
  }else{
dvander@1203
   356
    mask = exprListTableUsage(pMaskSet, pS->pEList);
dvander@1203
   357
    mask |= exprListTableUsage(pMaskSet, pS->pGroupBy);
dvander@1203
   358
    mask |= exprListTableUsage(pMaskSet, pS->pOrderBy);
dvander@1203
   359
    mask |= exprTableUsage(pMaskSet, pS->pWhere);
dvander@1203
   360
    mask |= exprTableUsage(pMaskSet, pS->pHaving);
dvander@1203
   361
  }
dvander@1203
   362
  return mask;
dvander@1203
   363
}
dvander@1203
   364
dvander@1203
   365
/*
dvander@1203
   366
** Return TRUE if the given operator is one of the operators that is
dvander@1203
   367
** allowed for an indexable WHERE clause term.  The allowed operators are
dvander@1203
   368
** "=", "<", ">", "<=", ">=", and "IN".
dvander@1203
   369
*/
dvander@1203
   370
static int allowedOp(int op){
dvander@1203
   371
  assert( TK_GT>TK_EQ && TK_GT<TK_GE );
dvander@1203
   372
  assert( TK_LT>TK_EQ && TK_LT<TK_GE );
dvander@1203
   373
  assert( TK_LE>TK_EQ && TK_LE<TK_GE );
dvander@1203
   374
  assert( TK_GE==TK_EQ+4 );
dvander@1203
   375
  return op==TK_IN || (op>=TK_EQ && op<=TK_GE) || op==TK_ISNULL;
dvander@1203
   376
}
dvander@1203
   377
dvander@1203
   378
/*
dvander@1203
   379
** Swap two objects of type T.
dvander@1203
   380
*/
dvander@1203
   381
#define SWAP(TYPE,A,B) {TYPE t=A; A=B; B=t;}
dvander@1203
   382
dvander@1203
   383
/*
dvander@1203
   384
** Commute a comparision operator.  Expressions of the form "X op Y"
dvander@1203
   385
** are converted into "Y op X".
dvander@1203
   386
*/
dvander@1203
   387
static void exprCommute(Expr *pExpr){
dvander@1203
   388
  assert( allowedOp(pExpr->op) && pExpr->op!=TK_IN );
dvander@1203
   389
  SWAP(CollSeq*,pExpr->pRight->pColl,pExpr->pLeft->pColl);
dvander@1203
   390
  SWAP(Expr*,pExpr->pRight,pExpr->pLeft);
dvander@1203
   391
  if( pExpr->op>=TK_GT ){
dvander@1203
   392
    assert( TK_LT==TK_GT+2 );
dvander@1203
   393
    assert( TK_GE==TK_LE+2 );
dvander@1203
   394
    assert( TK_GT>TK_EQ );
dvander@1203
   395
    assert( TK_GT<TK_LE );
dvander@1203
   396
    assert( pExpr->op>=TK_GT && pExpr->op<=TK_GE );
dvander@1203
   397
    pExpr->op = ((pExpr->op-TK_GT)^2)+TK_GT;
dvander@1203
   398
  }
dvander@1203
   399
}
dvander@1203
   400
dvander@1203
   401
/*
dvander@1203
   402
** Translate from TK_xx operator to WO_xx bitmask.
dvander@1203
   403
*/
dvander@1203
   404
static int operatorMask(int op){
dvander@1203
   405
  int c;
dvander@1203
   406
  assert( allowedOp(op) );
dvander@1203
   407
  if( op==TK_IN ){
dvander@1203
   408
    c = WO_IN;
dvander@1203
   409
  }else if( op==TK_ISNULL ){
dvander@1203
   410
    c = WO_ISNULL;
dvander@1203
   411
  }else{
dvander@1203
   412
    c = WO_EQ<<(op-TK_EQ);
dvander@1203
   413
  }
dvander@1203
   414
  assert( op!=TK_ISNULL || c==WO_ISNULL );
dvander@1203
   415
  assert( op!=TK_IN || c==WO_IN );
dvander@1203
   416
  assert( op!=TK_EQ || c==WO_EQ );
dvander@1203
   417
  assert( op!=TK_LT || c==WO_LT );
dvander@1203
   418
  assert( op!=TK_LE || c==WO_LE );
dvander@1203
   419
  assert( op!=TK_GT || c==WO_GT );
dvander@1203
   420
  assert( op!=TK_GE || c==WO_GE );
dvander@1203
   421
  return c;
dvander@1203
   422
}
dvander@1203
   423
dvander@1203
   424
/*
dvander@1203
   425
** Search for a term in the WHERE clause that is of the form "X <op> <expr>"
dvander@1203
   426
** where X is a reference to the iColumn of table iCur and <op> is one of
dvander@1203
   427
** the WO_xx operator codes specified by the op parameter.
dvander@1203
   428
** Return a pointer to the term.  Return 0 if not found.
dvander@1203
   429
*/
dvander@1203
   430
static WhereTerm *findTerm(
dvander@1203
   431
  WhereClause *pWC,     /* The WHERE clause to be searched */
dvander@1203
   432
  int iCur,             /* Cursor number of LHS */
dvander@1203
   433
  int iColumn,          /* Column number of LHS */
dvander@1203
   434
  Bitmask notReady,     /* RHS must not overlap with this mask */
dvander@1203
   435
  u16 op,               /* Mask of WO_xx values describing operator */
dvander@1203
   436
  Index *pIdx           /* Must be compatible with this index, if not NULL */
dvander@1203
   437
){
dvander@1203
   438
  WhereTerm *pTerm;
dvander@1203
   439
  int k;
dvander@1203
   440
  for(pTerm=pWC->a, k=pWC->nTerm; k; k--, pTerm++){
dvander@1203
   441
    if( pTerm->leftCursor==iCur
dvander@1203
   442
       && (pTerm->prereqRight & notReady)==0
dvander@1203
   443
       && pTerm->leftColumn==iColumn
dvander@1203
   444
       && (pTerm->eOperator & op)!=0
dvander@1203
   445
    ){
dvander@1203
   446
      if( iCur>=0 && pIdx && pTerm->eOperator!=WO_ISNULL ){
dvander@1203
   447
        Expr *pX = pTerm->pExpr;
dvander@1203
   448
        CollSeq *pColl;
dvander@1203
   449
        char idxaff;
dvander@1203
   450
        int j;
dvander@1203
   451
        Parse *pParse = pWC->pParse;
dvander@1203
   452
dvander@1203
   453
        idxaff = pIdx->pTable->aCol[iColumn].affinity;
dvander@1203
   454
        if( !sqlite3IndexAffinityOk(pX, idxaff) ) continue;
dvander@1203
   455
dvander@1203
   456
        /* Figure out the collation sequence required from an index for
dvander@1203
   457
        ** it to be useful for optimising expression pX. Store this
dvander@1203
   458
        ** value in variable pColl.
dvander@1203
   459
        */
dvander@1203
   460
        assert(pX->pLeft);
dvander@1203
   461
        pColl = sqlite3BinaryCompareCollSeq(pParse, pX->pLeft, pX->pRight);
dvander@1203
   462
        if( !pColl ){
dvander@1203
   463
          pColl = pParse->db->pDfltColl;
dvander@1203
   464
        }
dvander@1203
   465
dvander@1203
   466
        for(j=0; j<pIdx->nColumn && pIdx->aiColumn[j]!=iColumn; j++){}
dvander@1203
   467
        assert( j<pIdx->nColumn );
dvander@1203
   468
        if( sqlite3StrICmp(pColl->zName, pIdx->azColl[j]) ) continue;
dvander@1203
   469
      }
dvander@1203
   470
      return pTerm;
dvander@1203
   471
    }
dvander@1203
   472
  }
dvander@1203
   473
  return 0;
dvander@1203
   474
}
dvander@1203
   475
dvander@1203
   476
/* Forward reference */
dvander@1203
   477
static void exprAnalyze(SrcList*, WhereClause*, int);
dvander@1203
   478
dvander@1203
   479
/*
dvander@1203
   480
** Call exprAnalyze on all terms in a WHERE clause.  
dvander@1203
   481
**
dvander@1203
   482
**
dvander@1203
   483
*/
dvander@1203
   484
static void exprAnalyzeAll(
dvander@1203
   485
  SrcList *pTabList,       /* the FROM clause */
dvander@1203
   486
  WhereClause *pWC         /* the WHERE clause to be analyzed */
dvander@1203
   487
){
dvander@1203
   488
  int i;
dvander@1203
   489
  for(i=pWC->nTerm-1; i>=0; i--){
dvander@1203
   490
    exprAnalyze(pTabList, pWC, i);
dvander@1203
   491
  }
dvander@1203
   492
}
dvander@1203
   493
dvander@1203
   494
#ifndef SQLITE_OMIT_LIKE_OPTIMIZATION
dvander@1203
   495
/*
dvander@1203
   496
** Check to see if the given expression is a LIKE or GLOB operator that
dvander@1203
   497
** can be optimized using inequality constraints.  Return TRUE if it is
dvander@1203
   498
** so and false if not.
dvander@1203
   499
**
dvander@1203
   500
** In order for the operator to be optimizible, the RHS must be a string
dvander@1203
   501
** literal that does not begin with a wildcard.  
dvander@1203
   502
*/
dvander@1203
   503
static int isLikeOrGlob(
dvander@1203
   504
  sqlite3 *db,      /* The database */
dvander@1203
   505
  Expr *pExpr,      /* Test this expression */
dvander@1203
   506
  int *pnPattern,   /* Number of non-wildcard prefix characters */
dvander@1203
   507
  int *pisComplete  /* True if the only wildcard is % in the last character */
dvander@1203
   508
){
dvander@1203
   509
  const char *z;
dvander@1203
   510
  Expr *pRight, *pLeft;
dvander@1203
   511
  ExprList *pList;
dvander@1203
   512
  int c, cnt;
dvander@1203
   513
  int noCase;
dvander@1203
   514
  char wc[3];
dvander@1203
   515
  CollSeq *pColl;
dvander@1203
   516
dvander@1203
   517
  if( !sqlite3IsLikeFunction(db, pExpr, &noCase, wc) ){
dvander@1203
   518
    return 0;
dvander@1203
   519
  }
dvander@1203
   520
  pList = pExpr->pList;
dvander@1203
   521
  pRight = pList->a[0].pExpr;
dvander@1203
   522
  if( pRight->op!=TK_STRING ){
dvander@1203
   523
    return 0;
dvander@1203
   524
  }
dvander@1203
   525
  pLeft = pList->a[1].pExpr;
dvander@1203
   526
  if( pLeft->op!=TK_COLUMN ){
dvander@1203
   527
    return 0;
dvander@1203
   528
  }
dvander@1203
   529
  pColl = pLeft->pColl;
dvander@1203
   530
  if( pColl==0 ){
dvander@1203
   531
    /* TODO: Coverage testing doesn't get this case. Is it actually possible
dvander@1203
   532
    ** for an expression of type TK_COLUMN to not have an assigned collation 
dvander@1203
   533
    ** sequence at this point?
dvander@1203
   534
    */
dvander@1203
   535
    pColl = db->pDfltColl;
dvander@1203
   536
  }
dvander@1203
   537
  if( (pColl->type!=SQLITE_COLL_BINARY || noCase) &&
dvander@1203
   538
      (pColl->type!=SQLITE_COLL_NOCASE || !noCase) ){
dvander@1203
   539
    return 0;
dvander@1203
   540
  }
dvander@1203
   541
  sqlite3DequoteExpr(pRight);
dvander@1203
   542
  z = (char *)pRight->token.z;
dvander@1203
   543
  for(cnt=0; (c=z[cnt])!=0 && c!=wc[0] && c!=wc[1] && c!=wc[2]; cnt++){}
dvander@1203
   544
  if( cnt==0 || 255==(u8)z[cnt] ){
dvander@1203
   545
    return 0;
dvander@1203
   546
  }
dvander@1203
   547
  *pisComplete = z[cnt]==wc[0] && z[cnt+1]==0;
dvander@1203
   548
  *pnPattern = cnt;
dvander@1203
   549
  return 1;
dvander@1203
   550
}
dvander@1203
   551
#endif /* SQLITE_OMIT_LIKE_OPTIMIZATION */
dvander@1203
   552
dvander@1203
   553
dvander@1203
   554
#ifndef SQLITE_OMIT_VIRTUALTABLE
dvander@1203
   555
/*
dvander@1203
   556
** Check to see if the given expression is of the form
dvander@1203
   557
**
dvander@1203
   558
**         column MATCH expr
dvander@1203
   559
**
dvander@1203
   560
** If it is then return TRUE.  If not, return FALSE.
dvander@1203
   561
*/
dvander@1203
   562
static int isMatchOfColumn(
dvander@1203
   563
  Expr *pExpr      /* Test this expression */
dvander@1203
   564
){
dvander@1203
   565
  ExprList *pList;
dvander@1203
   566
dvander@1203
   567
  if( pExpr->op!=TK_FUNCTION ){
dvander@1203
   568
    return 0;
dvander@1203
   569
  }
dvander@1203
   570
  if( pExpr->token.n!=5 ||
dvander@1203
   571
       sqlite3StrNICmp((const char*)pExpr->token.z,"match",5)!=0 ){
dvander@1203
   572
    return 0;
dvander@1203
   573
  }
dvander@1203
   574
  pList = pExpr->pList;
dvander@1203
   575
  if( pList->nExpr!=2 ){
dvander@1203
   576
    return 0;
dvander@1203
   577
  }
dvander@1203
   578
  if( pList->a[1].pExpr->op != TK_COLUMN ){
dvander@1203
   579
    return 0;
dvander@1203
   580
  }
dvander@1203
   581
  return 1;
dvander@1203
   582
}
dvander@1203
   583
#endif /* SQLITE_OMIT_VIRTUALTABLE */
dvander@1203
   584
dvander@1203
   585
/*
dvander@1203
   586
** If the pBase expression originated in the ON or USING clause of
dvander@1203
   587
** a join, then transfer the appropriate markings over to derived.
dvander@1203
   588
*/
dvander@1203
   589
static void transferJoinMarkings(Expr *pDerived, Expr *pBase){
dvander@1203
   590
  pDerived->flags |= pBase->flags & EP_FromJoin;
dvander@1203
   591
  pDerived->iRightJoinTable = pBase->iRightJoinTable;
dvander@1203
   592
}
dvander@1203
   593
dvander@1203
   594
#if !defined(SQLITE_OMIT_OR_OPTIMIZATION) && !defined(SQLITE_OMIT_SUBQUERY)
dvander@1203
   595
/*
dvander@1203
   596
** Return TRUE if the given term of an OR clause can be converted
dvander@1203
   597
** into an IN clause.  The iCursor and iColumn define the left-hand
dvander@1203
   598
** side of the IN clause.
dvander@1203
   599
**
dvander@1203
   600
** The context is that we have multiple OR-connected equality terms
dvander@1203
   601
** like this:
dvander@1203
   602
**
dvander@1203
   603
**           a=<expr1> OR  a=<expr2> OR b=<expr3>  OR ...
dvander@1203
   604
**
dvander@1203
   605
** The pOrTerm input to this routine corresponds to a single term of
dvander@1203
   606
** this OR clause.  In order for the term to be a condidate for
dvander@1203
   607
** conversion to an IN operator, the following must be true:
dvander@1203
   608
**
dvander@1203
   609
**     *  The left-hand side of the term must be the column which
dvander@1203
   610
**        is identified by iCursor and iColumn.
dvander@1203
   611
**
dvander@1203
   612
**     *  If the right-hand side is also a column, then the affinities
dvander@1203
   613
**        of both right and left sides must be such that no type
dvander@1203
   614
**        conversions are required on the right.  (Ticket #2249)
dvander@1203
   615
**
dvander@1203
   616
** If both of these conditions are true, then return true.  Otherwise
dvander@1203
   617
** return false.
dvander@1203
   618
*/
dvander@1203
   619
static int orTermIsOptCandidate(WhereTerm *pOrTerm, int iCursor, int iColumn){
dvander@1203
   620
  int affLeft, affRight;
dvander@1203
   621
  assert( pOrTerm->eOperator==WO_EQ );
dvander@1203
   622
  if( pOrTerm->leftCursor!=iCursor ){
dvander@1203
   623
    return 0;
dvander@1203
   624
  }
dvander@1203
   625
  if( pOrTerm->leftColumn!=iColumn ){
dvander@1203
   626
    return 0;
dvander@1203
   627
  }
dvander@1203
   628
  affRight = sqlite3ExprAffinity(pOrTerm->pExpr->pRight);
dvander@1203
   629
  if( affRight==0 ){
dvander@1203
   630
    return 1;
dvander@1203
   631
  }
dvander@1203
   632
  affLeft = sqlite3ExprAffinity(pOrTerm->pExpr->pLeft);
dvander@1203
   633
  if( affRight!=affLeft ){
dvander@1203
   634
    return 0;
dvander@1203
   635
  }
dvander@1203
   636
  return 1;
dvander@1203
   637
}
dvander@1203
   638
dvander@1203
   639
/*
dvander@1203
   640
** Return true if the given term of an OR clause can be ignored during
dvander@1203
   641
** a check to make sure all OR terms are candidates for optimization.
dvander@1203
   642
** In other words, return true if a call to the orTermIsOptCandidate()
dvander@1203
   643
** above returned false but it is not necessary to disqualify the
dvander@1203
   644
** optimization.
dvander@1203
   645
**
dvander@1203
   646
** Suppose the original OR phrase was this:
dvander@1203
   647
**
dvander@1203
   648
**           a=4  OR  a=11  OR  a=b
dvander@1203
   649
**
dvander@1203
   650
** During analysis, the third term gets flipped around and duplicate
dvander@1203
   651
** so that we are left with this:
dvander@1203
   652
**
dvander@1203
   653
**           a=4  OR  a=11  OR  a=b  OR  b=a
dvander@1203
   654
**
dvander@1203
   655
** Since the last two terms are duplicates, only one of them
dvander@1203
   656
** has to qualify in order for the whole phrase to qualify.  When
dvander@1203
   657
** this routine is called, we know that pOrTerm did not qualify.
dvander@1203
   658
** This routine merely checks to see if pOrTerm has a duplicate that
dvander@1203
   659
** might qualify.  If there is a duplicate that has not yet been
dvander@1203
   660
** disqualified, then return true.  If there are no duplicates, or
dvander@1203
   661
** the duplicate has also been disqualifed, return false.
dvander@1203
   662
*/
dvander@1203
   663
static int orTermHasOkDuplicate(WhereClause *pOr, WhereTerm *pOrTerm){
dvander@1203
   664
  if( pOrTerm->flags & TERM_COPIED ){
dvander@1203
   665
    /* This is the original term.  The duplicate is to the left had
dvander@1203
   666
    ** has not yet been analyzed and thus has not yet been disqualified. */
dvander@1203
   667
    return 1;
dvander@1203
   668
  }
dvander@1203
   669
  if( (pOrTerm->flags & TERM_VIRTUAL)!=0
dvander@1203
   670
     && (pOr->a[pOrTerm->iParent].flags & TERM_OR_OK)!=0 ){
dvander@1203
   671
    /* This is a duplicate term.  The original qualified so this one
dvander@1203
   672
    ** does not have to. */
dvander@1203
   673
    return 1;
dvander@1203
   674
  }
dvander@1203
   675
  /* This is either a singleton term or else it is a duplicate for
dvander@1203
   676
  ** which the original did not qualify.  Either way we are done for. */
dvander@1203
   677
  return 0;
dvander@1203
   678
}
dvander@1203
   679
#endif /* !SQLITE_OMIT_OR_OPTIMIZATION && !SQLITE_OMIT_SUBQUERY */
dvander@1203
   680
dvander@1203
   681
/*
dvander@1203
   682
** The input to this routine is an WhereTerm structure with only the
dvander@1203
   683
** "pExpr" field filled in.  The job of this routine is to analyze the
dvander@1203
   684
** subexpression and populate all the other fields of the WhereTerm
dvander@1203
   685
** structure.
dvander@1203
   686
**
dvander@1203
   687
** If the expression is of the form "<expr> <op> X" it gets commuted
dvander@1203
   688
** to the standard form of "X <op> <expr>".  If the expression is of
dvander@1203
   689
** the form "X <op> Y" where both X and Y are columns, then the original
dvander@1203
   690
** expression is unchanged and a new virtual expression of the form
dvander@1203
   691
** "Y <op> X" is added to the WHERE clause and analyzed separately.
dvander@1203
   692
*/
dvander@1203
   693
static void exprAnalyze(
dvander@1203
   694
  SrcList *pSrc,            /* the FROM clause */
dvander@1203
   695
  WhereClause *pWC,         /* the WHERE clause */
dvander@1203
   696
  int idxTerm               /* Index of the term to be analyzed */
dvander@1203
   697
){
dvander@1203
   698
  WhereTerm *pTerm = &pWC->a[idxTerm];
dvander@1203
   699
  ExprMaskSet *pMaskSet = pWC->pMaskSet;
dvander@1203
   700
  Expr *pExpr = pTerm->pExpr;
dvander@1203
   701
  Bitmask prereqLeft;
dvander@1203
   702
  Bitmask prereqAll;
dvander@1203
   703
  int nPattern;
dvander@1203
   704
  int isComplete;
dvander@1203
   705
  int op;
dvander@1203
   706
dvander@1203
   707
  if( sqlite3MallocFailed() ) return;
dvander@1203
   708
  prereqLeft = exprTableUsage(pMaskSet, pExpr->pLeft);
dvander@1203
   709
  op = pExpr->op;
dvander@1203
   710
  if( op==TK_IN ){
dvander@1203
   711
    assert( pExpr->pRight==0 );
dvander@1203
   712
    pTerm->prereqRight = exprListTableUsage(pMaskSet, pExpr->pList)
dvander@1203
   713
                          | exprSelectTableUsage(pMaskSet, pExpr->pSelect);
dvander@1203
   714
  }else if( op==TK_ISNULL ){
dvander@1203
   715
    pTerm->prereqRight = 0;
dvander@1203
   716
  }else{
dvander@1203
   717
    pTerm->prereqRight = exprTableUsage(pMaskSet, pExpr->pRight);
dvander@1203
   718
  }
dvander@1203
   719
  prereqAll = exprTableUsage(pMaskSet, pExpr);
dvander@1203
   720
  if( ExprHasProperty(pExpr, EP_FromJoin) ){
dvander@1203
   721
    prereqAll |= getMask(pMaskSet, pExpr->iRightJoinTable);
dvander@1203
   722
  }
dvander@1203
   723
  pTerm->prereqAll = prereqAll;
dvander@1203
   724
  pTerm->leftCursor = -1;
dvander@1203
   725
  pTerm->iParent = -1;
dvander@1203
   726
  pTerm->eOperator = 0;
dvander@1203
   727
  if( allowedOp(op) && (pTerm->prereqRight & prereqLeft)==0 ){
dvander@1203
   728
    Expr *pLeft = pExpr->pLeft;
dvander@1203
   729
    Expr *pRight = pExpr->pRight;
dvander@1203
   730
    if( pLeft->op==TK_COLUMN ){
dvander@1203
   731
      pTerm->leftCursor = pLeft->iTable;
dvander@1203
   732
      pTerm->leftColumn = pLeft->iColumn;
dvander@1203
   733
      pTerm->eOperator = operatorMask(op);
dvander@1203
   734
    }
dvander@1203
   735
    if( pRight && pRight->op==TK_COLUMN ){
dvander@1203
   736
      WhereTerm *pNew;
dvander@1203
   737
      Expr *pDup;
dvander@1203
   738
      if( pTerm->leftCursor>=0 ){
dvander@1203
   739
        int idxNew;
dvander@1203
   740
        pDup = sqlite3ExprDup(pExpr);
dvander@1203
   741
        if( sqlite3MallocFailed() ){
dvander@1203
   742
          sqlite3ExprDelete(pDup);
dvander@1203
   743
          return;
dvander@1203
   744
        }
dvander@1203
   745
        idxNew = whereClauseInsert(pWC, pDup, TERM_VIRTUAL|TERM_DYNAMIC);
dvander@1203
   746
        if( idxNew==0 ) return;
dvander@1203
   747
        pNew = &pWC->a[idxNew];
dvander@1203
   748
        pNew->iParent = idxTerm;
dvander@1203
   749
        pTerm = &pWC->a[idxTerm];
dvander@1203
   750
        pTerm->nChild = 1;
dvander@1203
   751
        pTerm->flags |= TERM_COPIED;
dvander@1203
   752
      }else{
dvander@1203
   753
        pDup = pExpr;
dvander@1203
   754
        pNew = pTerm;
dvander@1203
   755
      }
dvander@1203
   756
      exprCommute(pDup);
dvander@1203
   757
      pLeft = pDup->pLeft;
dvander@1203
   758
      pNew->leftCursor = pLeft->iTable;
dvander@1203
   759
      pNew->leftColumn = pLeft->iColumn;
dvander@1203
   760
      pNew->prereqRight = prereqLeft;
dvander@1203
   761
      pNew->prereqAll = prereqAll;
dvander@1203
   762
      pNew->eOperator = operatorMask(pDup->op);
dvander@1203
   763
    }
dvander@1203
   764
  }
dvander@1203
   765
dvander@1203
   766
#ifndef SQLITE_OMIT_BETWEEN_OPTIMIZATION
dvander@1203
   767
  /* If a term is the BETWEEN operator, create two new virtual terms
dvander@1203
   768
  ** that define the range that the BETWEEN implements.
dvander@1203
   769
  */
dvander@1203
   770
  else if( pExpr->op==TK_BETWEEN ){
dvander@1203
   771
    ExprList *pList = pExpr->pList;
dvander@1203
   772
    int i;
dvander@1203
   773
    static const u8 ops[] = {TK_GE, TK_LE};
dvander@1203
   774
    assert( pList!=0 );
dvander@1203
   775
    assert( pList->nExpr==2 );
dvander@1203
   776
    for(i=0; i<2; i++){
dvander@1203
   777
      Expr *pNewExpr;
dvander@1203
   778
      int idxNew;
dvander@1203
   779
      pNewExpr = sqlite3Expr(ops[i], sqlite3ExprDup(pExpr->pLeft),
dvander@1203
   780
                             sqlite3ExprDup(pList->a[i].pExpr), 0);
dvander@1203
   781
      idxNew = whereClauseInsert(pWC, pNewExpr, TERM_VIRTUAL|TERM_DYNAMIC);
dvander@1203
   782
      exprAnalyze(pSrc, pWC, idxNew);
dvander@1203
   783
      pTerm = &pWC->a[idxTerm];
dvander@1203
   784
      pWC->a[idxNew].iParent = idxTerm;
dvander@1203
   785
    }
dvander@1203
   786
    pTerm->nChild = 2;
dvander@1203
   787
  }
dvander@1203
   788
#endif /* SQLITE_OMIT_BETWEEN_OPTIMIZATION */
dvander@1203
   789
dvander@1203
   790
#if !defined(SQLITE_OMIT_OR_OPTIMIZATION) && !defined(SQLITE_OMIT_SUBQUERY)
dvander@1203
   791
  /* Attempt to convert OR-connected terms into an IN operator so that
dvander@1203
   792
  ** they can make use of indices.  Example:
dvander@1203
   793
  **
dvander@1203
   794
  **      x = expr1  OR  expr2 = x  OR  x = expr3
dvander@1203
   795
  **
dvander@1203
   796
  ** is converted into
dvander@1203
   797
  **
dvander@1203
   798
  **      x IN (expr1,expr2,expr3)
dvander@1203
   799
  **
dvander@1203
   800
  ** This optimization must be omitted if OMIT_SUBQUERY is defined because
dvander@1203
   801
  ** the compiler for the the IN operator is part of sub-queries.
dvander@1203
   802
  */
dvander@1203
   803
  else if( pExpr->op==TK_OR ){
dvander@1203
   804
    int ok;
dvander@1203
   805
    int i, j;
dvander@1203
   806
    int iColumn, iCursor;
dvander@1203
   807
    WhereClause sOr;
dvander@1203
   808
    WhereTerm *pOrTerm;
dvander@1203
   809
dvander@1203
   810
    assert( (pTerm->flags & TERM_DYNAMIC)==0 );
dvander@1203
   811
    whereClauseInit(&sOr, pWC->pParse, pMaskSet);
dvander@1203
   812
    whereSplit(&sOr, pExpr, TK_OR);
dvander@1203
   813
    exprAnalyzeAll(pSrc, &sOr);
dvander@1203
   814
    assert( sOr.nTerm>=2 );
dvander@1203
   815
    j = 0;
dvander@1203
   816
    do{
dvander@1203
   817
      assert( j<sOr.nTerm );
dvander@1203
   818
      iColumn = sOr.a[j].leftColumn;
dvander@1203
   819
      iCursor = sOr.a[j].leftCursor;
dvander@1203
   820
      ok = iCursor>=0;
dvander@1203
   821
      for(i=sOr.nTerm-1, pOrTerm=sOr.a; i>=0 && ok; i--, pOrTerm++){
dvander@1203
   822
        if( pOrTerm->eOperator!=WO_EQ ){
dvander@1203
   823
          goto or_not_possible;
dvander@1203
   824
        }
dvander@1203
   825
        if( orTermIsOptCandidate(pOrTerm, iCursor, iColumn) ){
dvander@1203
   826
          pOrTerm->flags |= TERM_OR_OK;
dvander@1203
   827
        }else if( orTermHasOkDuplicate(&sOr, pOrTerm) ){
dvander@1203
   828
          pOrTerm->flags &= ~TERM_OR_OK;
dvander@1203
   829
        }else{
dvander@1203
   830
          ok = 0;
dvander@1203
   831
        }
dvander@1203
   832
      }
dvander@1203
   833
    }while( !ok && (sOr.a[j++].flags & TERM_COPIED)!=0 && j<2 );
dvander@1203
   834
    if( ok ){
dvander@1203
   835
      ExprList *pList = 0;
dvander@1203
   836
      Expr *pNew, *pDup;
dvander@1203
   837
      Expr *pLeft = 0;
dvander@1203
   838
      for(i=sOr.nTerm-1, pOrTerm=sOr.a; i>=0 && ok; i--, pOrTerm++){
dvander@1203
   839
        if( (pOrTerm->flags & TERM_OR_OK)==0 ) continue;
dvander@1203
   840
        pDup = sqlite3ExprDup(pOrTerm->pExpr->pRight);
dvander@1203
   841
        pList = sqlite3ExprListAppend(pList, pDup, 0);
dvander@1203
   842
        pLeft = pOrTerm->pExpr->pLeft;
dvander@1203
   843
      }
dvander@1203
   844
      assert( pLeft!=0 );
dvander@1203
   845
      pDup = sqlite3ExprDup(pLeft);
dvander@1203
   846
      pNew = sqlite3Expr(TK_IN, pDup, 0, 0);
dvander@1203
   847
      if( pNew ){
dvander@1203
   848
        int idxNew;
dvander@1203
   849
        transferJoinMarkings(pNew, pExpr);
dvander@1203
   850
        pNew->pList = pList;
dvander@1203
   851
        idxNew = whereClauseInsert(pWC, pNew, TERM_VIRTUAL|TERM_DYNAMIC);
dvander@1203
   852
        exprAnalyze(pSrc, pWC, idxNew);
dvander@1203
   853
        pTerm = &pWC->a[idxTerm];
dvander@1203
   854
        pWC->a[idxNew].iParent = idxTerm;
dvander@1203
   855
        pTerm->nChild = 1;
dvander@1203
   856
      }else{
dvander@1203
   857
        sqlite3ExprListDelete(pList);
dvander@1203
   858
      }
dvander@1203
   859
    }
dvander@1203
   860
or_not_possible:
dvander@1203
   861
    whereClauseClear(&sOr);
dvander@1203
   862
  }
dvander@1203
   863
#endif /* SQLITE_OMIT_OR_OPTIMIZATION */
dvander@1203
   864
dvander@1203
   865
#ifndef SQLITE_OMIT_LIKE_OPTIMIZATION
dvander@1203
   866
  /* Add constraints to reduce the search space on a LIKE or GLOB
dvander@1203
   867
  ** operator.
dvander@1203
   868
  */
dvander@1203
   869
  if( isLikeOrGlob(pWC->pParse->db, pExpr, &nPattern, &isComplete) ){
dvander@1203
   870
    Expr *pLeft, *pRight;
dvander@1203
   871
    Expr *pStr1, *pStr2;
dvander@1203
   872
    Expr *pNewExpr1, *pNewExpr2;
dvander@1203
   873
    int idxNew1, idxNew2;
dvander@1203
   874
dvander@1203
   875
    pLeft = pExpr->pList->a[1].pExpr;
dvander@1203
   876
    pRight = pExpr->pList->a[0].pExpr;
dvander@1203
   877
    pStr1 = sqlite3Expr(TK_STRING, 0, 0, 0);
dvander@1203
   878
    if( pStr1 ){
dvander@1203
   879
      sqlite3TokenCopy(&pStr1->token, &pRight->token);
dvander@1203
   880
      pStr1->token.n = nPattern;
dvander@1203
   881
      pStr1->flags = EP_Dequoted;
dvander@1203
   882
    }
dvander@1203
   883
    pStr2 = sqlite3ExprDup(pStr1);
dvander@1203
   884
    if( pStr2 ){
dvander@1203
   885
      assert( pStr2->token.dyn );
dvander@1203
   886
      ++*(u8*)&pStr2->token.z[nPattern-1];
dvander@1203
   887
    }
dvander@1203
   888
    pNewExpr1 = sqlite3Expr(TK_GE, sqlite3ExprDup(pLeft), pStr1, 0);
dvander@1203
   889
    idxNew1 = whereClauseInsert(pWC, pNewExpr1, TERM_VIRTUAL|TERM_DYNAMIC);
dvander@1203
   890
    exprAnalyze(pSrc, pWC, idxNew1);
dvander@1203
   891
    pNewExpr2 = sqlite3Expr(TK_LT, sqlite3ExprDup(pLeft), pStr2, 0);
dvander@1203
   892
    idxNew2 = whereClauseInsert(pWC, pNewExpr2, TERM_VIRTUAL|TERM_DYNAMIC);
dvander@1203
   893
    exprAnalyze(pSrc, pWC, idxNew2);
dvander@1203
   894
    pTerm = &pWC->a[idxTerm];
dvander@1203
   895
    if( isComplete ){
dvander@1203
   896
      pWC->a[idxNew1].iParent = idxTerm;
dvander@1203
   897
      pWC->a[idxNew2].iParent = idxTerm;
dvander@1203
   898
      pTerm->nChild = 2;
dvander@1203
   899
    }
dvander@1203
   900
  }
dvander@1203
   901
#endif /* SQLITE_OMIT_LIKE_OPTIMIZATION */
dvander@1203
   902
dvander@1203
   903
#ifndef SQLITE_OMIT_VIRTUALTABLE
dvander@1203
   904
  /* Add a WO_MATCH auxiliary term to the constraint set if the
dvander@1203
   905
  ** current expression is of the form:  column MATCH expr.
dvander@1203
   906
  ** This information is used by the xBestIndex methods of
dvander@1203
   907
  ** virtual tables.  The native query optimizer does not attempt
dvander@1203
   908
  ** to do anything with MATCH functions.
dvander@1203
   909
  */
dvander@1203
   910
  if( isMatchOfColumn(pExpr) ){
dvander@1203
   911
    int idxNew;
dvander@1203
   912
    Expr *pRight, *pLeft;
dvander@1203
   913
    WhereTerm *pNewTerm;
dvander@1203
   914
    Bitmask prereqColumn, prereqExpr;
dvander@1203
   915
dvander@1203
   916
    pRight = pExpr->pList->a[0].pExpr;
dvander@1203
   917
    pLeft = pExpr->pList->a[1].pExpr;
dvander@1203
   918
    prereqExpr = exprTableUsage(pMaskSet, pRight);
dvander@1203
   919
    prereqColumn = exprTableUsage(pMaskSet, pLeft);
dvander@1203
   920
    if( (prereqExpr & prereqColumn)==0 ){
dvander@1203
   921
      Expr *pNewExpr;
dvander@1203
   922
      pNewExpr = sqlite3Expr(TK_MATCH, 0, sqlite3ExprDup(pRight), 0);
dvander@1203
   923
      idxNew = whereClauseInsert(pWC, pNewExpr, TERM_VIRTUAL|TERM_DYNAMIC);
dvander@1203
   924
      pNewTerm = &pWC->a[idxNew];
dvander@1203
   925
      pNewTerm->prereqRight = prereqExpr;
dvander@1203
   926
      pNewTerm->leftCursor = pLeft->iTable;
dvander@1203
   927
      pNewTerm->leftColumn = pLeft->iColumn;
dvander@1203
   928
      pNewTerm->eOperator = WO_MATCH;
dvander@1203
   929
      pNewTerm->iParent = idxTerm;
dvander@1203
   930
      pTerm = &pWC->a[idxTerm];
dvander@1203
   931
      pTerm->nChild = 1;
dvander@1203
   932
      pTerm->flags |= TERM_COPIED;
dvander@1203
   933
      pNewTerm->prereqAll = pTerm->prereqAll;
dvander@1203
   934
    }
dvander@1203
   935
  }
dvander@1203
   936
#endif /* SQLITE_OMIT_VIRTUALTABLE */
dvander@1203
   937
}
dvander@1203
   938
dvander@1203
   939
/*
dvander@1203
   940
** Return TRUE if any of the expressions in pList->a[iFirst...] contain
dvander@1203
   941
** a reference to any table other than the iBase table.
dvander@1203
   942
*/
dvander@1203
   943
static int referencesOtherTables(
dvander@1203
   944
  ExprList *pList,          /* Search expressions in ths list */
dvander@1203
   945
  ExprMaskSet *pMaskSet,    /* Mapping from tables to bitmaps */
dvander@1203
   946
  int iFirst,               /* Be searching with the iFirst-th expression */
dvander@1203
   947
  int iBase                 /* Ignore references to this table */
dvander@1203
   948
){
dvander@1203
   949
  Bitmask allowed = ~getMask(pMaskSet, iBase);
dvander@1203
   950
  while( iFirst<pList->nExpr ){
dvander@1203
   951
    if( (exprTableUsage(pMaskSet, pList->a[iFirst++].pExpr)&allowed)!=0 ){
dvander@1203
   952
      return 1;
dvander@1203
   953
    }
dvander@1203
   954
  }
dvander@1203
   955
  return 0;
dvander@1203
   956
}
dvander@1203
   957
dvander@1203
   958
dvander@1203
   959
/*
dvander@1203
   960
** This routine decides if pIdx can be used to satisfy the ORDER BY
dvander@1203
   961
** clause.  If it can, it returns 1.  If pIdx cannot satisfy the
dvander@1203
   962
** ORDER BY clause, this routine returns 0.
dvander@1203
   963
**
dvander@1203
   964
** pOrderBy is an ORDER BY clause from a SELECT statement.  pTab is the
dvander@1203
   965
** left-most table in the FROM clause of that same SELECT statement and
dvander@1203
   966
** the table has a cursor number of "base".  pIdx is an index on pTab.
dvander@1203
   967
**
dvander@1203
   968
** nEqCol is the number of columns of pIdx that are used as equality
dvander@1203
   969
** constraints.  Any of these columns may be missing from the ORDER BY
dvander@1203
   970
** clause and the match can still be a success.
dvander@1203
   971
**
dvander@1203
   972
** All terms of the ORDER BY that match against the index must be either
dvander@1203
   973
** ASC or DESC.  (Terms of the ORDER BY clause past the end of a UNIQUE
dvander@1203
   974
** index do not need to satisfy this constraint.)  The *pbRev value is
dvander@1203
   975
** set to 1 if the ORDER BY clause is all DESC and it is set to 0 if
dvander@1203
   976
** the ORDER BY clause is all ASC.
dvander@1203
   977
*/
dvander@1203
   978
static int isSortingIndex(
dvander@1203
   979
  Parse *pParse,          /* Parsing context */
dvander@1203
   980
  ExprMaskSet *pMaskSet,  /* Mapping from table indices to bitmaps */
dvander@1203
   981
  Index *pIdx,            /* The index we are testing */
dvander@1203
   982
  int base,               /* Cursor number for the table to be sorted */
dvander@1203
   983
  ExprList *pOrderBy,     /* The ORDER BY clause */
dvander@1203
   984
  int nEqCol,             /* Number of index columns with == constraints */
dvander@1203
   985
  int *pbRev              /* Set to 1 if ORDER BY is DESC */
dvander@1203
   986
){
dvander@1203
   987
  int i, j;                       /* Loop counters */
dvander@1203
   988
  int sortOrder = 0;              /* XOR of index and ORDER BY sort direction */
dvander@1203
   989
  int nTerm;                      /* Number of ORDER BY terms */
dvander@1203
   990
  struct ExprList_item *pTerm;    /* A term of the ORDER BY clause */
dvander@1203
   991
  sqlite3 *db = pParse->db;
dvander@1203
   992
dvander@1203
   993
  assert( pOrderBy!=0 );
dvander@1203
   994
  nTerm = pOrderBy->nExpr;
dvander@1203
   995
  assert( nTerm>0 );
dvander@1203
   996
dvander@1203
   997
  /* Match terms of the ORDER BY clause against columns of
dvander@1203
   998
  ** the index.
dvander@1203
   999
  **
dvander@1203
  1000
  ** Note that indices have pIdx->nColumn regular columns plus
dvander@1203
  1001
  ** one additional column containing the rowid.  The rowid column
dvander@1203
  1002
  ** of the index is also allowed to match against the ORDER BY
dvander@1203
  1003
  ** clause.
dvander@1203
  1004
  */
dvander@1203
  1005
  for(i=j=0, pTerm=pOrderBy->a; j<nTerm && i<=pIdx->nColumn; i++){
dvander@1203
  1006
    Expr *pExpr;       /* The expression of the ORDER BY pTerm */
dvander@1203
  1007
    CollSeq *pColl;    /* The collating sequence of pExpr */
dvander@1203
  1008
    int termSortOrder; /* Sort order for this term */
dvander@1203
  1009
    int iColumn;       /* The i-th column of the index.  -1 for rowid */
dvander@1203
  1010
    int iSortOrder;    /* 1 for DESC, 0 for ASC on the i-th index term */
dvander@1203
  1011
    const char *zColl; /* Name of the collating sequence for i-th index term */
dvander@1203
  1012
dvander@1203
  1013
    pExpr = pTerm->pExpr;
dvander@1203
  1014
    if( pExpr->op!=TK_COLUMN || pExpr->iTable!=base ){
dvander@1203
  1015
      /* Can not use an index sort on anything that is not a column in the
dvander@1203
  1016
      ** left-most table of the FROM clause */
dvander@1203
  1017
      break;
dvander@1203
  1018
    }
dvander@1203
  1019
    pColl = sqlite3ExprCollSeq(pParse, pExpr);
dvander@1203
  1020
    if( !pColl ){
dvander@1203
  1021
      pColl = db->pDfltColl;
dvander@1203
  1022
    }
dvander@1203
  1023
    if( i<pIdx->nColumn ){
dvander@1203
  1024
      iColumn = pIdx->aiColumn[i];
dvander@1203
  1025
      if( iColumn==pIdx->pTable->iPKey ){
dvander@1203
  1026
        iColumn = -1;
dvander@1203
  1027
      }
dvander@1203
  1028
      iSortOrder = pIdx->aSortOrder[i];
dvander@1203
  1029
      zColl = pIdx->azColl[i];
dvander@1203
  1030
    }else{
dvander@1203
  1031
      iColumn = -1;
dvander@1203
  1032
      iSortOrder = 0;
dvander@1203
  1033
      zColl = pColl->zName;
dvander@1203
  1034
    }
dvander@1203
  1035
    if( pExpr->iColumn!=iColumn || sqlite3StrICmp(pColl->zName, zColl) ){
dvander@1203
  1036
      /* Term j of the ORDER BY clause does not match column i of the index */
dvander@1203
  1037
      if( i<nEqCol ){
dvander@1203
  1038
        /* If an index column that is constrained by == fails to match an
dvander@1203
  1039
        ** ORDER BY term, that is OK.  Just ignore that column of the index
dvander@1203
  1040
        */
dvander@1203
  1041
        continue;
dvander@1203
  1042
      }else{
dvander@1203
  1043
        /* If an index column fails to match and is not constrained by ==
dvander@1203
  1044
        ** then the index cannot satisfy the ORDER BY constraint.
dvander@1203
  1045
        */
dvander@1203
  1046
        return 0;
dvander@1203
  1047
      }
dvander@1203
  1048
    }
dvander@1203
  1049
    assert( pIdx->aSortOrder!=0 );
dvander@1203
  1050
    assert( pTerm->sortOrder==0 || pTerm->sortOrder==1 );
dvander@1203
  1051
    assert( iSortOrder==0 || iSortOrder==1 );
dvander@1203
  1052
    termSortOrder = iSortOrder ^ pTerm->sortOrder;
dvander@1203
  1053
    if( i>nEqCol ){
dvander@1203
  1054
      if( termSortOrder!=sortOrder ){
dvander@1203
  1055
        /* Indices can only be used if all ORDER BY terms past the
dvander@1203
  1056
        ** equality constraints are all either DESC or ASC. */
dvander@1203
  1057
        return 0;
dvander@1203
  1058
      }
dvander@1203
  1059
    }else{
dvander@1203
  1060
      sortOrder = termSortOrder;
dvander@1203
  1061
    }
dvander@1203
  1062
    j++;
dvander@1203
  1063
    pTerm++;
dvander@1203
  1064
    if( iColumn<0 && !referencesOtherTables(pOrderBy, pMaskSet, j, base) ){
dvander@1203
  1065
      /* If the indexed column is the primary key and everything matches
dvander@1203
  1066
      ** so far and none of the ORDER BY terms to the right reference other
dvander@1203
  1067
      ** tables in the join, then we are assured that the index can be used 
dvander@1203
  1068
      ** to sort because the primary key is unique and so none of the other
dvander@1203
  1069
      ** columns will make any difference
dvander@1203
  1070
      */
dvander@1203
  1071
      j = nTerm;
dvander@1203
  1072
    }
dvander@1203
  1073
  }
dvander@1203
  1074
dvander@1203
  1075
  *pbRev = sortOrder!=0;
dvander@1203
  1076
  if( j>=nTerm ){
dvander@1203
  1077
    /* All terms of the ORDER BY clause are covered by this index so
dvander@1203
  1078
    ** this index can be used for sorting. */
dvander@1203
  1079
    return 1;
dvander@1203
  1080
  }
dvander@1203
  1081
  if( pIdx->onError!=OE_None && i==pIdx->nColumn
dvander@1203
  1082
      && !referencesOtherTables(pOrderBy, pMaskSet, j, base) ){
dvander@1203
  1083
    /* All terms of this index match some prefix of the ORDER BY clause
dvander@1203
  1084
    ** and the index is UNIQUE and no terms on the tail of the ORDER BY
dvander@1203
  1085
    ** clause reference other tables in a join.  If this is all true then
dvander@1203
  1086
    ** the order by clause is superfluous. */
dvander@1203
  1087
    return 1;
dvander@1203
  1088
  }
dvander@1203
  1089
  return 0;
dvander@1203
  1090
}
dvander@1203
  1091
dvander@1203
  1092
/*
dvander@1203
  1093
** Check table to see if the ORDER BY clause in pOrderBy can be satisfied
dvander@1203
  1094
** by sorting in order of ROWID.  Return true if so and set *pbRev to be
dvander@1203
  1095
** true for reverse ROWID and false for forward ROWID order.
dvander@1203
  1096
*/
dvander@1203
  1097
static int sortableByRowid(
dvander@1203
  1098
  int base,               /* Cursor number for table to be sorted */
dvander@1203
  1099
  ExprList *pOrderBy,     /* The ORDER BY clause */
dvander@1203
  1100
  ExprMaskSet *pMaskSet,  /* Mapping from tables to bitmaps */
dvander@1203
  1101
  int *pbRev              /* Set to 1 if ORDER BY is DESC */
dvander@1203
  1102
){
dvander@1203
  1103
  Expr *p;
dvander@1203
  1104
dvander@1203
  1105
  assert( pOrderBy!=0 );
dvander@1203
  1106
  assert( pOrderBy->nExpr>0 );
dvander@1203
  1107
  p = pOrderBy->a[0].pExpr;
dvander@1203
  1108
  if( p->op==TK_COLUMN && p->iTable==base && p->iColumn==-1
dvander@1203
  1109
    && !referencesOtherTables(pOrderBy, pMaskSet, 1, base) ){
dvander@1203
  1110
    *pbRev = pOrderBy->a[0].sortOrder;
dvander@1203
  1111
    return 1;
dvander@1203
  1112
  }
dvander@1203
  1113
  return 0;
dvander@1203
  1114
}
dvander@1203
  1115
dvander@1203
  1116
/*
dvander@1203
  1117
** Prepare a crude estimate of the logarithm of the input value.
dvander@1203
  1118
** The results need not be exact.  This is only used for estimating
dvander@1203
  1119
** the total cost of performing operatings with O(logN) or O(NlogN)
dvander@1203
  1120
** complexity.  Because N is just a guess, it is no great tragedy if
dvander@1203
  1121
** logN is a little off.
dvander@1203
  1122
*/
dvander@1203
  1123
static double estLog(double N){
dvander@1203
  1124
  double logN = 1;
dvander@1203
  1125
  double x = 10;
dvander@1203
  1126
  while( N>x ){
dvander@1203
  1127
    logN += 1;
dvander@1203
  1128
    x *= 10;
dvander@1203
  1129
  }
dvander@1203
  1130
  return logN;
dvander@1203
  1131
}
dvander@1203
  1132
dvander@1203
  1133
/*
dvander@1203
  1134
** Two routines for printing the content of an sqlite3_index_info
dvander@1203
  1135
** structure.  Used for testing and debugging only.  If neither
dvander@1203
  1136
** SQLITE_TEST or SQLITE_DEBUG are defined, then these routines
dvander@1203
  1137
** are no-ops.
dvander@1203
  1138
*/
dvander@1203
  1139
#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_DEBUG)
dvander@1203
  1140
static void TRACE_IDX_INPUTS(sqlite3_index_info *p){
dvander@1203
  1141
  int i;
dvander@1203
  1142
  if( !sqlite3_where_trace ) return;
dvander@1203
  1143
  for(i=0; i<p->nConstraint; i++){
dvander@1203
  1144
    sqlite3DebugPrintf("  constraint[%d]: col=%d termid=%d op=%d usabled=%d\n",
dvander@1203
  1145
       i,
dvander@1203
  1146
       p->aConstraint[i].iColumn,
dvander@1203
  1147
       p->aConstraint[i].iTermOffset,
dvander@1203
  1148
       p->aConstraint[i].op,
dvander@1203
  1149
       p->aConstraint[i].usable);
dvander@1203
  1150
  }
dvander@1203
  1151
  for(i=0; i<p->nOrderBy; i++){
dvander@1203
  1152
    sqlite3DebugPrintf("  orderby[%d]: col=%d desc=%d\n",
dvander@1203
  1153
       i,
dvander@1203
  1154
       p->aOrderBy[i].iColumn,
dvander@1203
  1155
       p->aOrderBy[i].desc);
dvander@1203
  1156
  }
dvander@1203
  1157
}
dvander@1203
  1158
static void TRACE_IDX_OUTPUTS(sqlite3_index_info *p){
dvander@1203
  1159
  int i;
dvander@1203
  1160
  if( !sqlite3_where_trace ) return;
dvander@1203
  1161
  for(i=0; i<p->nConstraint; i++){
dvander@1203
  1162
    sqlite3DebugPrintf("  usage[%d]: argvIdx=%d omit=%d\n",
dvander@1203
  1163
       i,
dvander@1203
  1164
       p->aConstraintUsage[i].argvIndex,
dvander@1203
  1165
       p->aConstraintUsage[i].omit);
dvander@1203
  1166
  }
dvander@1203
  1167
  sqlite3DebugPrintf("  idxNum=%d\n", p->idxNum);
dvander@1203
  1168
  sqlite3DebugPrintf("  idxStr=%s\n", p->idxStr);
dvander@1203
  1169
  sqlite3DebugPrintf("  orderByConsumed=%d\n", p->orderByConsumed);
dvander@1203
  1170
  sqlite3DebugPrintf("  estimatedCost=%g\n", p->estimatedCost);
dvander@1203
  1171
}
dvander@1203
  1172
#else
dvander@1203
  1173
#define TRACE_IDX_INPUTS(A)
dvander@1203
  1174
#define TRACE_IDX_OUTPUTS(A)
dvander@1203
  1175
#endif
dvander@1203
  1176
dvander@1203
  1177
#ifndef SQLITE_OMIT_VIRTUALTABLE
dvander@1203
  1178
/*
dvander@1203
  1179
** Compute the best index for a virtual table.
dvander@1203
  1180
**
dvander@1203
  1181
** The best index is computed by the xBestIndex method of the virtual
dvander@1203
  1182
** table module.  This routine is really just a wrapper that sets up
dvander@1203
  1183
** the sqlite3_index_info structure that is used to communicate with
dvander@1203
  1184
** xBestIndex.
dvander@1203
  1185
**
dvander@1203
  1186
** In a join, this routine might be called multiple times for the
dvander@1203
  1187
** same virtual table.  The sqlite3_index_info structure is created
dvander@1203
  1188
** and initialized on the first invocation and reused on all subsequent
dvander@1203
  1189
** invocations.  The sqlite3_index_info structure is also used when
dvander@1203
  1190
** code is generated to access the virtual table.  The whereInfoDelete() 
dvander@1203
  1191
** routine takes care of freeing the sqlite3_index_info structure after
dvander@1203
  1192
** everybody has finished with it.
dvander@1203
  1193
*/
dvander@1203
  1194
static double bestVirtualIndex(
dvander@1203
  1195
  Parse *pParse,                 /* The parsing context */
dvander@1203
  1196
  WhereClause *pWC,              /* The WHERE clause */
dvander@1203
  1197
  struct SrcList_item *pSrc,     /* The FROM clause term to search */
dvander@1203
  1198
  Bitmask notReady,              /* Mask of cursors that are not available */
dvander@1203
  1199
  ExprList *pOrderBy,            /* The order by clause */
dvander@1203
  1200
  int orderByUsable,             /* True if we can potential sort */
dvander@1203
  1201
  sqlite3_index_info **ppIdxInfo /* Index information passed to xBestIndex */
dvander@1203
  1202
){
dvander@1203
  1203
  Table *pTab = pSrc->pTab;
dvander@1203
  1204
  sqlite3_index_info *pIdxInfo;
dvander@1203
  1205
  struct sqlite3_index_constraint *pIdxCons;
dvander@1203
  1206
  struct sqlite3_index_orderby *pIdxOrderBy;
dvander@1203
  1207
  struct sqlite3_index_constraint_usage *pUsage;
dvander@1203
  1208
  WhereTerm *pTerm;
dvander@1203
  1209
  int i, j;
dvander@1203
  1210
  int nOrderBy;
dvander@1203
  1211
  int rc;
dvander@1203
  1212
dvander@1203
  1213
  /* If the sqlite3_index_info structure has not been previously
dvander@1203
  1214
  ** allocated and initialized for this virtual table, then allocate
dvander@1203
  1215
  ** and initialize it now
dvander@1203
  1216
  */
dvander@1203
  1217
  pIdxInfo = *ppIdxInfo;
dvander@1203
  1218
  if( pIdxInfo==0 ){
dvander@1203
  1219
    WhereTerm *pTerm;
dvander@1203
  1220
    int nTerm;
dvander@1203
  1221
    WHERETRACE(("Recomputing index info for %s...\n", pTab->zName));
dvander@1203
  1222
dvander@1203
  1223
    /* Count the number of possible WHERE clause constraints referring
dvander@1203
  1224
    ** to this virtual table */
dvander@1203
  1225
    for(i=nTerm=0, pTerm=pWC->a; i<pWC->nTerm; i++, pTerm++){
dvander@1203
  1226
      if( pTerm->leftCursor != pSrc->iCursor ) continue;
dvander@1203
  1227
      if( pTerm->eOperator==WO_IN ) continue;
dvander@1203
  1228
      nTerm++;
dvander@1203
  1229
    }
dvander@1203
  1230
dvander@1203
  1231
    /* If the ORDER BY clause contains only columns in the current 
dvander@1203
  1232
    ** virtual table then allocate space for the aOrderBy part of
dvander@1203
  1233
    ** the sqlite3_index_info structure.
dvander@1203
  1234
    */
dvander@1203
  1235
    nOrderBy = 0;
dvander@1203
  1236
    if( pOrderBy ){
dvander@1203
  1237
      for(i=0; i<pOrderBy->nExpr; i++){
dvander@1203
  1238
        Expr *pExpr = pOrderBy->a[i].pExpr;
dvander@1203
  1239
        if( pExpr->op!=TK_COLUMN || pExpr->iTable!=pSrc->iCursor ) break;
dvander@1203
  1240
      }
dvander@1203
  1241
      if( i==pOrderBy->nExpr ){
dvander@1203
  1242
        nOrderBy = pOrderBy->nExpr;
dvander@1203
  1243
      }
dvander@1203
  1244
    }
dvander@1203
  1245
dvander@1203
  1246
    /* Allocate the sqlite3_index_info structure
dvander@1203
  1247
    */
dvander@1203
  1248
    pIdxInfo = sqliteMalloc( sizeof(*pIdxInfo)
dvander@1203
  1249
                             + (sizeof(*pIdxCons) + sizeof(*pUsage))*nTerm
dvander@1203
  1250
                             + sizeof(*pIdxOrderBy)*nOrderBy );
dvander@1203
  1251
    if( pIdxInfo==0 ){
dvander@1203
  1252
      sqlite3ErrorMsg(pParse, "out of memory");
dvander@1203
  1253
      return 0.0;
dvander@1203
  1254
    }
dvander@1203
  1255
    *ppIdxInfo = pIdxInfo;
dvander@1203
  1256
dvander@1203
  1257
    /* Initialize the structure.  The sqlite3_index_info structure contains
dvander@1203
  1258
    ** many fields that are declared "const" to prevent xBestIndex from
dvander@1203
  1259
    ** changing them.  We have to do some funky casting in order to
dvander@1203
  1260
    ** initialize those fields.
dvander@1203
  1261
    */
dvander@1203
  1262
    pIdxCons = (struct sqlite3_index_constraint*)&pIdxInfo[1];
dvander@1203
  1263
    pIdxOrderBy = (struct sqlite3_index_orderby*)&pIdxCons[nTerm];
dvander@1203
  1264
    pUsage = (struct sqlite3_index_constraint_usage*)&pIdxOrderBy[nOrderBy];
dvander@1203
  1265
    *(int*)&pIdxInfo->nConstraint = nTerm;
dvander@1203
  1266
    *(int*)&pIdxInfo->nOrderBy = nOrderBy;
dvander@1203
  1267
    *(struct sqlite3_index_constraint**)&pIdxInfo->aConstraint = pIdxCons;
dvander@1203
  1268
    *(struct sqlite3_index_orderby**)&pIdxInfo->aOrderBy = pIdxOrderBy;
dvander@1203
  1269
    *(struct sqlite3_index_constraint_usage**)&pIdxInfo->aConstraintUsage =
dvander@1203
  1270
                                                                     pUsage;
dvander@1203
  1271
dvander@1203
  1272
    for(i=j=0, pTerm=pWC->a; i<pWC->nTerm; i++, pTerm++){
dvander@1203
  1273
      if( pTerm->leftCursor != pSrc->iCursor ) continue;
dvander@1203
  1274
      if( pTerm->eOperator==WO_IN ) continue;
dvander@1203
  1275
      pIdxCons[j].iColumn = pTerm->leftColumn;
dvander@1203
  1276
      pIdxCons[j].iTermOffset = i;
dvander@1203
  1277
      pIdxCons[j].op = (unsigned char)pTerm->eOperator;
dvander@1203
  1278
      /* The direct assignment in the previous line is possible only because
dvander@1203
  1279
      ** the WO_ and SQLITE_INDEX_CONSTRAINT_ codes are identical.  The
dvander@1203
  1280
      ** following asserts verify this fact. */
dvander@1203
  1281
      assert( WO_EQ==SQLITE_INDEX_CONSTRAINT_EQ );
dvander@1203
  1282
      assert( WO_LT==SQLITE_INDEX_CONSTRAINT_LT );
dvander@1203
  1283
      assert( WO_LE==SQLITE_INDEX_CONSTRAINT_LE );
dvander@1203
  1284
      assert( WO_GT==SQLITE_INDEX_CONSTRAINT_GT );
dvander@1203
  1285
      assert( WO_GE==SQLITE_INDEX_CONSTRAINT_GE );
dvander@1203
  1286
      assert( WO_MATCH==SQLITE_INDEX_CONSTRAINT_MATCH );
dvander@1203
  1287
      assert( pTerm->eOperator & (WO_EQ|WO_LT|WO_LE|WO_GT|WO_GE|WO_MATCH) );
dvander@1203
  1288
      j++;
dvander@1203
  1289
    }
dvander@1203
  1290
    for(i=0; i<nOrderBy; i++){
dvander@1203
  1291
      Expr *pExpr = pOrderBy->a[i].pExpr;
dvander@1203
  1292
      pIdxOrderBy[i].iColumn = pExpr->iColumn;
dvander@1203
  1293
      pIdxOrderBy[i].desc = pOrderBy->a[i].sortOrder;
dvander@1203
  1294
    }
dvander@1203
  1295
  }
dvander@1203
  1296
dvander@1203
  1297
  /* At this point, the sqlite3_index_info structure that pIdxInfo points
dvander@1203
  1298
  ** to will have been initialized, either during the current invocation or
dvander@1203
  1299
  ** during some prior invocation.  Now we just have to customize the
dvander@1203
  1300
  ** details of pIdxInfo for the current invocation and pass it to
dvander@1203
  1301
  ** xBestIndex.
dvander@1203
  1302
  */
dvander@1203
  1303
dvander@1203
  1304
  /* The module name must be defined. Also, by this point there must
dvander@1203
  1305
  ** be a pointer to an sqlite3_vtab structure. Otherwise
dvander@1203
  1306
  ** sqlite3ViewGetColumnNames() would have picked up the error. 
dvander@1203
  1307
  */
dvander@1203
  1308
  assert( pTab->azModuleArg && pTab->azModuleArg[0] );
dvander@1203
  1309
  assert( pTab->pVtab );
dvander@1203
  1310
#if 0
dvander@1203
  1311
  if( pTab->pVtab==0 ){
dvander@1203
  1312
    sqlite3ErrorMsg(pParse, "undefined module %s for table %s",
dvander@1203
  1313
        pTab->azModuleArg[0], pTab->zName);
dvander@1203
  1314
    return 0.0;
dvander@1203
  1315
  }
dvander@1203
  1316
#endif
dvander@1203
  1317
dvander@1203
  1318
  /* Set the aConstraint[].usable fields and initialize all 
dvander@1203
  1319
  ** output variables to zero.
dvander@1203
  1320
  **
dvander@1203
  1321
  ** aConstraint[].usable is true for constraints where the right-hand
dvander@1203
  1322
  ** side contains only references to tables to the left of the current
dvander@1203
  1323
  ** table.  In other words, if the constraint is of the form:
dvander@1203
  1324
  **
dvander@1203
  1325
  **           column = expr
dvander@1203
  1326
  **
dvander@1203
  1327
  ** and we are evaluating a join, then the constraint on column is 
dvander@1203
  1328
  ** only valid if all tables referenced in expr occur to the left
dvander@1203
  1329
  ** of the table containing column.
dvander@1203
  1330
  **
dvander@1203
  1331
  ** The aConstraints[] array contains entries for all constraints
dvander@1203
  1332
  ** on the current table.  That way we only have to compute it once
dvander@1203
  1333
  ** even though we might try to pick the best index multiple times.
dvander@1203
  1334
  ** For each attempt at picking an index, the order of tables in the
dvander@1203
  1335
  ** join might be different so we have to recompute the usable flag
dvander@1203
  1336
  ** each time.
dvander@1203
  1337
  */
dvander@1203
  1338
  pIdxCons = *(struct sqlite3_index_constraint**)&pIdxInfo->aConstraint;
dvander@1203
  1339
  pUsage = pIdxInfo->aConstraintUsage;
dvander@1203
  1340
  for(i=0; i<pIdxInfo->nConstraint; i++, pIdxCons++){
dvander@1203
  1341
    j = pIdxCons->iTermOffset;
dvander@1203
  1342
    pTerm = &pWC->a[j];
dvander@1203
  1343
    pIdxCons->usable =  (pTerm->prereqRight & notReady)==0;
dvander@1203
  1344
  }
dvander@1203
  1345
  memset(pUsage, 0, sizeof(pUsage[0])*pIdxInfo->nConstraint);
dvander@1203
  1346
  if( pIdxInfo->needToFreeIdxStr ){
dvander@1203
  1347
    sqlite3_free(pIdxInfo->idxStr);
dvander@1203
  1348
  }
dvander@1203
  1349
  pIdxInfo->idxStr = 0;
dvander@1203
  1350
  pIdxInfo->idxNum = 0;
dvander@1203
  1351
  pIdxInfo->needToFreeIdxStr = 0;
dvander@1203
  1352
  pIdxInfo->orderByConsumed = 0;
dvander@1203
  1353
  pIdxInfo->estimatedCost = SQLITE_BIG_DBL / 2.0;
dvander@1203
  1354
  nOrderBy = pIdxInfo->nOrderBy;
dvander@1203
  1355
  if( pIdxInfo->nOrderBy && !orderByUsable ){
dvander@1203
  1356
    *(int*)&pIdxInfo->nOrderBy = 0;
dvander@1203
  1357
  }
dvander@1203
  1358
dvander@1203
  1359
  sqlite3SafetyOff(pParse->db);
dvander@1203
  1360
  WHERETRACE(("xBestIndex for %s\n", pTab->zName));
dvander@1203
  1361
  TRACE_IDX_INPUTS(pIdxInfo);
dvander@1203
  1362
  rc = pTab->pVtab->pModule->xBestIndex(pTab->pVtab, pIdxInfo);
dvander@1203
  1363
  TRACE_IDX_OUTPUTS(pIdxInfo);
dvander@1203
  1364
  if( rc!=SQLITE_OK ){
dvander@1203
  1365
    if( rc==SQLITE_NOMEM ){
dvander@1203
  1366
      sqlite3FailedMalloc();
dvander@1203
  1367
    }else {
dvander@1203
  1368
      sqlite3ErrorMsg(pParse, "%s", sqlite3ErrStr(rc));
dvander@1203
  1369
    }
dvander@1203
  1370
    sqlite3SafetyOn(pParse->db);
dvander@1203
  1371
  }else{
dvander@1203
  1372
    rc = sqlite3SafetyOn(pParse->db);
dvander@1203
  1373
  }
dvander@1203
  1374
  *(int*)&pIdxInfo->nOrderBy = nOrderBy;
dvander@1203
  1375
dvander@1203
  1376
  return pIdxInfo->estimatedCost;
dvander@1203
  1377
}
dvander@1203
  1378
#endif /* SQLITE_OMIT_VIRTUALTABLE */
dvander@1203
  1379
dvander@1203
  1380
/*
dvander@1203
  1381
** Find the best index for accessing a particular table.  Return a pointer
dvander@1203
  1382
** to the index, flags that describe how the index should be used, the
dvander@1203
  1383
** number of equality constraints, and the "cost" for this index.
dvander@1203
  1384
**
dvander@1203
  1385
** The lowest cost index wins.  The cost is an estimate of the amount of
dvander@1203
  1386
** CPU and disk I/O need to process the request using the selected index.
dvander@1203
  1387
** Factors that influence cost include:
dvander@1203
  1388
**
dvander@1203
  1389
**    *  The estimated number of rows that will be retrieved.  (The
dvander@1203
  1390
**       fewer the better.)
dvander@1203
  1391
**
dvander@1203
  1392
**    *  Whether or not sorting must occur.
dvander@1203
  1393
**
dvander@1203
  1394
**    *  Whether or not there must be separate lookups in the
dvander@1203
  1395
**       index and in the main table.
dvander@1203
  1396
**
dvander@1203
  1397
*/
dvander@1203
  1398
static double bestIndex(
dvander@1203
  1399
  Parse *pParse,              /* The parsing context */
dvander@1203
  1400
  WhereClause *pWC,           /* The WHERE clause */
dvander@1203
  1401
  struct SrcList_item *pSrc,  /* The FROM clause term to search */
dvander@1203
  1402
  Bitmask notReady,           /* Mask of cursors that are not available */
dvander@1203
  1403
  ExprList *pOrderBy,         /* The order by clause */
dvander@1203
  1404
  Index **ppIndex,            /* Make *ppIndex point to the best index */
dvander@1203
  1405
  int *pFlags,                /* Put flags describing this choice in *pFlags */
dvander@1203
  1406
  int *pnEq                   /* Put the number of == or IN constraints here */
dvander@1203
  1407
){
dvander@1203
  1408
  WhereTerm *pTerm;
dvander@1203
  1409
  Index *bestIdx = 0;         /* Index that gives the lowest cost */
dvander@1203
  1410
  double lowestCost;          /* The cost of using bestIdx */
dvander@1203
  1411
  int bestFlags = 0;          /* Flags associated with bestIdx */
dvander@1203
  1412
  int bestNEq = 0;            /* Best value for nEq */
dvander@1203
  1413
  int iCur = pSrc->iCursor;   /* The cursor of the table to be accessed */
dvander@1203
  1414
  Index *pProbe;              /* An index we are evaluating */
dvander@1203
  1415
  int rev;                    /* True to scan in reverse order */
dvander@1203
  1416
  int flags;                  /* Flags associated with pProbe */
dvander@1203
  1417
  int nEq;                    /* Number of == or IN constraints */
dvander@1203
  1418
  int eqTermMask;             /* Mask of valid equality operators */
dvander@1203
  1419
  double cost;                /* Cost of using pProbe */
dvander@1203
  1420
dvander@1203
  1421
  WHERETRACE(("bestIndex: tbl=%s notReady=%x\n", pSrc->pTab->zName, notReady));
dvander@1203
  1422
  lowestCost = SQLITE_BIG_DBL;
dvander@1203
  1423
  pProbe = pSrc->pTab->pIndex;
dvander@1203
  1424
dvander@1203
  1425
  /* If the table has no indices and there are no terms in the where
dvander@1203
  1426
  ** clause that refer to the ROWID, then we will never be able to do
dvander@1203
  1427
  ** anything other than a full table scan on this table.  We might as
dvander@1203
  1428
  ** well put it first in the join order.  That way, perhaps it can be
dvander@1203
  1429
  ** referenced by other tables in the join.
dvander@1203
  1430
  */
dvander@1203
  1431
  if( pProbe==0 &&
dvander@1203
  1432
     findTerm(pWC, iCur, -1, 0, WO_EQ|WO_IN|WO_LT|WO_LE|WO_GT|WO_GE,0)==0 &&
dvander@1203
  1433
     (pOrderBy==0 || !sortableByRowid(iCur, pOrderBy, pWC->pMaskSet, &rev)) ){
dvander@1203
  1434
    *pFlags = 0;
dvander@1203
  1435
    *ppIndex = 0;
dvander@1203
  1436
    *pnEq = 0;
dvander@1203
  1437
    return 0.0;
dvander@1203
  1438
  }
dvander@1203
  1439
dvander@1203
  1440
  /* Check for a rowid=EXPR or rowid IN (...) constraints
dvander@1203
  1441
  */
dvander@1203
  1442
  pTerm = findTerm(pWC, iCur, -1, notReady, WO_EQ|WO_IN, 0);
dvander@1203
  1443
  if( pTerm ){
dvander@1203
  1444
    Expr *pExpr;
dvander@1203
  1445
    *ppIndex = 0;
dvander@1203
  1446
    bestFlags = WHERE_ROWID_EQ;
dvander@1203
  1447
    if( pTerm->eOperator & WO_EQ ){
dvander@1203
  1448
      /* Rowid== is always the best pick.  Look no further.  Because only
dvander@1203
  1449
      ** a single row is generated, output is always in sorted order */
dvander@1203
  1450
      *pFlags = WHERE_ROWID_EQ | WHERE_UNIQUE;
dvander@1203
  1451
      *pnEq = 1;
dvander@1203
  1452
      WHERETRACE(("... best is rowid\n"));
dvander@1203
  1453
      return 0.0;
dvander@1203
  1454
    }else if( (pExpr = pTerm->pExpr)->pList!=0 ){
dvander@1203
  1455
      /* Rowid IN (LIST): cost is NlogN where N is the number of list
dvander@1203
  1456
      ** elements.  */
dvander@1203
  1457
      lowestCost = pExpr->pList->nExpr;
dvander@1203
  1458
      lowestCost *= estLog(lowestCost);
dvander@1203
  1459
    }else{
dvander@1203
  1460
      /* Rowid IN (SELECT): cost is NlogN where N is the number of rows
dvander@1203
  1461
      ** in the result of the inner select.  We have no way to estimate
dvander@1203
  1462
      ** that value so make a wild guess. */
dvander@1203
  1463
      lowestCost = 200;
dvander@1203
  1464
    }
dvander@1203
  1465
    WHERETRACE(("... rowid IN cost: %.9g\n", lowestCost));
dvander@1203
  1466
  }
dvander@1203
  1467
dvander@1203
  1468
  /* Estimate the cost of a table scan.  If we do not know how many
dvander@1203
  1469
  ** entries are in the table, use 1 million as a guess.
dvander@1203
  1470
  */
dvander@1203
  1471
  cost = pProbe ? pProbe->aiRowEst[0] : 1000000;
dvander@1203
  1472
  WHERETRACE(("... table scan base cost: %.9g\n", cost));
dvander@1203
  1473
  flags = WHERE_ROWID_RANGE;
dvander@1203
  1474
dvander@1203
  1475
  /* Check for constraints on a range of rowids in a table scan.
dvander@1203
  1476
  */
dvander@1203
  1477
  pTerm = findTerm(pWC, iCur, -1, notReady, WO_LT|WO_LE|WO_GT|WO_GE, 0);
dvander@1203
  1478
  if( pTerm ){
dvander@1203
  1479
    if( findTerm(pWC, iCur, -1, notReady, WO_LT|WO_LE, 0) ){
dvander@1203
  1480
      flags |= WHERE_TOP_LIMIT;
dvander@1203
  1481
      cost /= 3;  /* Guess that rowid<EXPR eliminates two-thirds or rows */
dvander@1203
  1482
    }
dvander@1203
  1483
    if( findTerm(pWC, iCur, -1, notReady, WO_GT|WO_GE, 0) ){
dvander@1203
  1484
      flags |= WHERE_BTM_LIMIT;
dvander@1203
  1485
      cost /= 3;  /* Guess that rowid>EXPR eliminates two-thirds of rows */
dvander@1203
  1486
    }
dvander@1203
  1487
    WHERETRACE(("... rowid range reduces cost to %.9g\n", cost));
dvander@1203
  1488
  }else{
dvander@1203
  1489
    flags = 0;
dvander@1203
  1490
  }
dvander@1203
  1491
dvander@1203
  1492
  /* If the table scan does not satisfy the ORDER BY clause, increase
dvander@1203
  1493
  ** the cost by NlogN to cover the expense of sorting. */
dvander@1203
  1494
  if( pOrderBy ){
dvander@1203
  1495
    if( sortableByRowid(iCur, pOrderBy, pWC->pMaskSet, &rev) ){
dvander@1203
  1496
      flags |= WHERE_ORDERBY|WHERE_ROWID_RANGE;
dvander@1203
  1497
      if( rev ){
dvander@1203
  1498
        flags |= WHERE_REVERSE;
dvander@1203
  1499
      }
dvander@1203
  1500
    }else{
dvander@1203
  1501
      cost += cost*estLog(cost);
dvander@1203
  1502
      WHERETRACE(("... sorting increases cost to %.9g\n", cost));
dvander@1203
  1503
    }
dvander@1203
  1504
  }
dvander@1203
  1505
  if( cost<lowestCost ){
dvander@1203
  1506
    lowestCost = cost;
dvander@1203
  1507
    bestFlags = flags;
dvander@1203
  1508
  }
dvander@1203
  1509
dvander@1203
  1510
  /* If the pSrc table is the right table of a LEFT JOIN then we may not
dvander@1203
  1511
  ** use an index to satisfy IS NULL constraints on that table.  This is
dvander@1203
  1512
  ** because columns might end up being NULL if the table does not match -
dvander@1203
  1513
  ** a circumstance which the index cannot help us discover.  Ticket #2177.
dvander@1203
  1514
  */
dvander@1203
  1515
  if( (pSrc->jointype & JT_LEFT)!=0 ){
dvander@1203
  1516
    eqTermMask = WO_EQ|WO_IN;
dvander@1203
  1517
  }else{
dvander@1203
  1518
    eqTermMask = WO_EQ|WO_IN|WO_ISNULL;
dvander@1203
  1519
  }
dvander@1203
  1520
dvander@1203
  1521
  /* Look at each index.
dvander@1203
  1522
  */
dvander@1203
  1523
  for(; pProbe; pProbe=pProbe->pNext){
dvander@1203
  1524
    int i;                       /* Loop counter */
dvander@1203
  1525
    double inMultiplier = 1;
dvander@1203
  1526
dvander@1203
  1527
    WHERETRACE(("... index %s:\n", pProbe->zName));
dvander@1203
  1528
dvander@1203
  1529
    /* Count the number of columns in the index that are satisfied
dvander@1203
  1530
    ** by x=EXPR constraints or x IN (...) constraints.
dvander@1203
  1531
    */
dvander@1203
  1532
    flags = 0;
dvander@1203
  1533
    for(i=0; i<pProbe->nColumn; i++){
dvander@1203
  1534
      int j = pProbe->aiColumn[i];
dvander@1203
  1535
      pTerm = findTerm(pWC, iCur, j, notReady, eqTermMask, pProbe);
dvander@1203
  1536
      if( pTerm==0 ) break;
dvander@1203
  1537
      flags |= WHERE_COLUMN_EQ;
dvander@1203
  1538
      if( pTerm->eOperator & WO_IN ){
dvander@1203
  1539
        Expr *pExpr = pTerm->pExpr;
dvander@1203
  1540
        flags |= WHERE_COLUMN_IN;
dvander@1203
  1541
        if( pExpr->pSelect!=0 ){
dvander@1203
  1542
          inMultiplier *= 25;
dvander@1203
  1543
        }else if( pExpr->pList!=0 ){
dvander@1203
  1544
          inMultiplier *= pExpr->pList->nExpr + 1;
dvander@1203
  1545
        }
dvander@1203
  1546
      }
dvander@1203
  1547
    }
dvander@1203
  1548
    cost = pProbe->aiRowEst[i] * inMultiplier * estLog(inMultiplier);
dvander@1203
  1549
    nEq = i;
dvander@1203
  1550
    if( pProbe->onError!=OE_None && (flags & WHERE_COLUMN_IN)==0
dvander@1203
  1551
         && nEq==pProbe->nColumn ){
dvander@1203
  1552
      flags |= WHERE_UNIQUE;
dvander@1203
  1553
    }
dvander@1203
  1554
    WHERETRACE(("...... nEq=%d inMult=%.9g cost=%.9g\n", nEq, inMultiplier, cost));
dvander@1203
  1555
dvander@1203
  1556
    /* Look for range constraints
dvander@1203
  1557
    */
dvander@1203
  1558
    if( nEq<pProbe->nColumn ){
dvander@1203
  1559
      int j = pProbe->aiColumn[nEq];
dvander@1203
  1560
      pTerm = findTerm(pWC, iCur, j, notReady, WO_LT|WO_LE|WO_GT|WO_GE, pProbe);
dvander@1203
  1561
      if( pTerm ){
dvander@1203
  1562
        flags |= WHERE_COLUMN_RANGE;
dvander@1203
  1563
        if( findTerm(pWC, iCur, j, notReady, WO_LT|WO_LE, pProbe) ){
dvander@1203
  1564
          flags |= WHERE_TOP_LIMIT;
dvander@1203
  1565
          cost /= 3;
dvander@1203
  1566
        }
dvander@1203
  1567
        if( findTerm(pWC, iCur, j, notReady, WO_GT|WO_GE, pProbe) ){
dvander@1203
  1568
          flags |= WHERE_BTM_LIMIT;
dvander@1203
  1569
          cost /= 3;
dvander@1203
  1570
        }
dvander@1203
  1571
        WHERETRACE(("...... range reduces cost to %.9g\n", cost));
dvander@1203
  1572
      }
dvander@1203
  1573
    }
dvander@1203
  1574
dvander@1203
  1575
    /* Add the additional cost of sorting if that is a factor.
dvander@1203
  1576
    */
dvander@1203
  1577
    if( pOrderBy ){
dvander@1203
  1578
      if( (flags & WHERE_COLUMN_IN)==0 &&
dvander@1203
  1579
           isSortingIndex(pParse,pWC->pMaskSet,pProbe,iCur,pOrderBy,nEq,&rev) ){
dvander@1203
  1580
        if( flags==0 ){
dvander@1203
  1581
          flags = WHERE_COLUMN_RANGE;
dvander@1203
  1582
        }
dvander@1203
  1583
        flags |= WHERE_ORDERBY;
dvander@1203
  1584
        if( rev ){
dvander@1203
  1585
          flags |= WHERE_REVERSE;
dvander@1203
  1586
        }
dvander@1203
  1587
      }else{
dvander@1203
  1588
        cost += cost*estLog(cost);
dvander@1203
  1589
        WHERETRACE(("...... orderby increases cost to %.9g\n", cost));
dvander@1203
  1590
      }
dvander@1203
  1591
    }
dvander@1203
  1592
dvander@1203
  1593
    /* Check to see if we can get away with using just the index without
dvander@1203
  1594
    ** ever reading the table.  If that is the case, then halve the
dvander@1203
  1595
    ** cost of this index.
dvander@1203
  1596
    */
dvander@1203
  1597
    if( flags && pSrc->colUsed < (((Bitmask)1)<<(BMS-1)) ){
dvander@1203
  1598
      Bitmask m = pSrc->colUsed;
dvander@1203
  1599
      int j;
dvander@1203
  1600
      for(j=0; j<pProbe->nColumn; j++){
dvander@1203
  1601
        int x = pProbe->aiColumn[j];
dvander@1203
  1602
        if( x<BMS-1 ){
dvander@1203
  1603
          m &= ~(((Bitmask)1)<<x);
dvander@1203
  1604
        }
dvander@1203
  1605
      }
dvander@1203
  1606
      if( m==0 ){
dvander@1203
  1607
        flags |= WHERE_IDX_ONLY;
dvander@1203
  1608
        cost /= 2;
dvander@1203
  1609
        WHERETRACE(("...... idx-only reduces cost to %.9g\n", cost));
dvander@1203
  1610
      }
dvander@1203
  1611
    }
dvander@1203
  1612
dvander@1203
  1613
    /* If this index has achieved the lowest cost so far, then use it.
dvander@1203
  1614
    */
dvander@1203
  1615
    if( cost < lowestCost ){
dvander@1203
  1616
      bestIdx = pProbe;
dvander@1203
  1617
      lowestCost = cost;
dvander@1203
  1618
      assert( flags!=0 );
dvander@1203
  1619
      bestFlags = flags;
dvander@1203
  1620
      bestNEq = nEq;
dvander@1203
  1621
    }
dvander@1203
  1622
  }
dvander@1203
  1623
dvander@1203
  1624
  /* Report the best result
dvander@1203
  1625
  */
dvander@1203
  1626
  *ppIndex = bestIdx;
dvander@1203
  1627
  WHERETRACE(("best index is %s, cost=%.9g, flags=%x, nEq=%d\n",
dvander@1203
  1628
        bestIdx ? bestIdx->zName : "(none)", lowestCost, bestFlags, bestNEq));
dvander@1203
  1629
  *pFlags = bestFlags | eqTermMask;
dvander@1203
  1630
  *pnEq = bestNEq;
dvander@1203
  1631
  return lowestCost;
dvander@1203
  1632
}
dvander@1203
  1633
dvander@1203
  1634
dvander@1203
  1635
/*
dvander@1203
  1636
** Disable a term in the WHERE clause.  Except, do not disable the term
dvander@1203
  1637
** if it controls a LEFT OUTER JOIN and it did not originate in the ON
dvander@1203
  1638
** or USING clause of that join.
dvander@1203
  1639
**
dvander@1203
  1640
** Consider the term t2.z='ok' in the following queries:
dvander@1203
  1641
**
dvander@1203
  1642
**   (1)  SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.x WHERE t2.z='ok'
dvander@1203
  1643
**   (2)  SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.x AND t2.z='ok'
dvander@1203
  1644
**   (3)  SELECT * FROM t1, t2 WHERE t1.a=t2.x AND t2.z='ok'
dvander@1203
  1645
**
dvander@1203
  1646
** The t2.z='ok' is disabled in the in (2) because it originates
dvander@1203
  1647
** in the ON clause.  The term is disabled in (3) because it is not part
dvander@1203
  1648
** of a LEFT OUTER JOIN.  In (1), the term is not disabled.
dvander@1203
  1649
**
dvander@1203
  1650
** Disabling a term causes that term to not be tested in the inner loop
dvander@1203
  1651
** of the join.  Disabling is an optimization.  When terms are satisfied
dvander@1203
  1652
** by indices, we disable them to prevent redundant tests in the inner
dvander@1203
  1653
** loop.  We would get the correct results if nothing were ever disabled,
dvander@1203
  1654
** but joins might run a little slower.  The trick is to disable as much
dvander@1203
  1655
** as we can without disabling too much.  If we disabled in (1), we'd get
dvander@1203
  1656
** the wrong answer.  See ticket #813.
dvander@1203
  1657
*/
dvander@1203
  1658
static void disableTerm(WhereLevel *pLevel, WhereTerm *pTerm){
dvander@1203
  1659
  if( pTerm
dvander@1203
  1660
      && (pTerm->flags & TERM_CODED)==0
dvander@1203
  1661
      && (pLevel->iLeftJoin==0 || ExprHasProperty(pTerm->pExpr, EP_FromJoin))
dvander@1203
  1662
  ){
dvander@1203
  1663
    pTerm->flags |= TERM_CODED;
dvander@1203
  1664
    if( pTerm->iParent>=0 ){
dvander@1203
  1665
      WhereTerm *pOther = &pTerm->pWC->a[pTerm->iParent];
dvander@1203
  1666
      if( (--pOther->nChild)==0 ){
dvander@1203
  1667
        disableTerm(pLevel, pOther);
dvander@1203
  1668
      }
dvander@1203
  1669
    }
dvander@1203
  1670
  }
dvander@1203
  1671
}
dvander@1203
  1672
dvander@1203
  1673
/*
dvander@1203
  1674
** Generate code that builds a probe for an index.
dvander@1203
  1675
**
dvander@1203
  1676
** There should be nColumn values on the stack.  The index
dvander@1203
  1677
** to be probed is pIdx.  Pop the values from the stack and
dvander@1203
  1678
** replace them all with a single record that is the index
dvander@1203
  1679
** problem.
dvander@1203
  1680
*/
dvander@1203
  1681
static void buildIndexProbe(
dvander@1203
  1682
  Vdbe *v,        /* Generate code into this VM */
dvander@1203
  1683
  int nColumn,    /* The number of columns to check for NULL */
dvander@1203
  1684
  Index *pIdx     /* Index that we will be searching */
dvander@1203
  1685
){
dvander@1203
  1686
  sqlite3VdbeAddOp(v, OP_MakeRecord, nColumn, 0);
dvander@1203
  1687
  sqlite3IndexAffinityStr(v, pIdx);
dvander@1203
  1688
}
dvander@1203
  1689
dvander@1203
  1690
dvander@1203
  1691
/*
dvander@1203
  1692
** Generate code for a single equality term of the WHERE clause.  An equality
dvander@1203
  1693
** term can be either X=expr or X IN (...).   pTerm is the term to be 
dvander@1203
  1694
** coded.
dvander@1203
  1695
**
dvander@1203
  1696
** The current value for the constraint is left on the top of the stack.
dvander@1203
  1697
**
dvander@1203
  1698
** For a constraint of the form X=expr, the expression is evaluated and its
dvander@1203
  1699
** result is left on the stack.  For constraints of the form X IN (...)
dvander@1203
  1700
** this routine sets up a loop that will iterate over all values of X.
dvander@1203
  1701
*/
dvander@1203
  1702
static void codeEqualityTerm(
dvander@1203
  1703
  Parse *pParse,      /* The parsing context */
dvander@1203
  1704
  WhereTerm *pTerm,   /* The term of the WHERE clause to be coded */
dvander@1203
  1705
  WhereLevel *pLevel  /* When level of the FROM clause we are working on */
dvander@1203
  1706
){
dvander@1203
  1707
  Expr *pX = pTerm->pExpr;
dvander@1203
  1708
  Vdbe *v = pParse->pVdbe;
dvander@1203
  1709
  if( pX->op==TK_EQ ){
dvander@1203
  1710
    sqlite3ExprCode(pParse, pX->pRight);
dvander@1203
  1711
  }else if( pX->op==TK_ISNULL ){
dvander@1203
  1712
    sqlite3VdbeAddOp(v, OP_Null, 0, 0);
dvander@1203
  1713
#ifndef SQLITE_OMIT_SUBQUERY
dvander@1203
  1714
  }else{
dvander@1203
  1715
    int iTab;
dvander@1203
  1716
    struct InLoop *pIn;
dvander@1203
  1717
dvander@1203
  1718
    assert( pX->op==TK_IN );
dvander@1203
  1719
    sqlite3CodeSubselect(pParse, pX);
dvander@1203
  1720
    iTab = pX->iTable;
dvander@1203
  1721
    sqlite3VdbeAddOp(v, OP_Rewind, iTab, 0);
dvander@1203
  1722
    VdbeComment((v, "# %.*s", pX->span.n, pX->span.z));
dvander@1203
  1723
    if( pLevel->nIn==0 ){
dvander@1203
  1724
      pLevel->nxt = sqlite3VdbeMakeLabel(v);
dvander@1203
  1725
    }
dvander@1203
  1726
    pLevel->nIn++;
dvander@1203
  1727
    pLevel->aInLoop = sqliteReallocOrFree(pLevel->aInLoop,
dvander@1203
  1728
                                    sizeof(pLevel->aInLoop[0])*pLevel->nIn);
dvander@1203
  1729
    pIn = pLevel->aInLoop;
dvander@1203
  1730
    if( pIn ){
dvander@1203
  1731
      pIn += pLevel->nIn - 1;
dvander@1203
  1732
      pIn->iCur = iTab;
dvander@1203
  1733
      pIn->topAddr = sqlite3VdbeAddOp(v, OP_Column, iTab, 0);
dvander@1203
  1734
      sqlite3VdbeAddOp(v, OP_IsNull, -1, 0);
dvander@1203
  1735
    }else{
dvander@1203
  1736
      pLevel->nIn = 0;
dvander@1203
  1737
    }
dvander@1203
  1738
#endif
dvander@1203
  1739
  }
dvander@1203
  1740
  disableTerm(pLevel, pTerm);
dvander@1203
  1741
}
dvander@1203
  1742
dvander@1203
  1743
/*
dvander@1203
  1744
** Generate code that will evaluate all == and IN constraints for an
dvander@1203
  1745
** index.  The values for all constraints are left on the stack.
dvander@1203
  1746
**
dvander@1203
  1747
** For example, consider table t1(a,b,c,d,e,f) with index i1(a,b,c).
dvander@1203
  1748
** Suppose the WHERE clause is this:  a==5 AND b IN (1,2,3) AND c>5 AND c<10
dvander@1203
  1749
** The index has as many as three equality constraints, but in this
dvander@1203
  1750
** example, the third "c" value is an inequality.  So only two 
dvander@1203
  1751
** constraints are coded.  This routine will generate code to evaluate
dvander@1203
  1752
** a==5 and b IN (1,2,3).  The current values for a and b will be left
dvander@1203
  1753
** on the stack - a is the deepest and b the shallowest.
dvander@1203
  1754
**
dvander@1203
  1755
** In the example above nEq==2.  But this subroutine works for any value
dvander@1203
  1756
** of nEq including 0.  If nEq==0, this routine is nearly a no-op.
dvander@1203
  1757
** The only thing it does is allocate the pLevel->iMem memory cell.
dvander@1203
  1758
**
dvander@1203
  1759
** This routine always allocates at least one memory cell and puts
dvander@1203
  1760
** the address of that memory cell in pLevel->iMem.  The code that
dvander@1203
  1761
** calls this routine will use pLevel->iMem to store the termination
dvander@1203
  1762
** key value of the loop.  If one or more IN operators appear, then
dvander@1203
  1763
** this routine allocates an additional nEq memory cells for internal
dvander@1203
  1764
** use.
dvander@1203
  1765
*/
dvander@1203
  1766
static void codeAllEqualityTerms(
dvander@1203
  1767
  Parse *pParse,        /* Parsing context */
dvander@1203
  1768
  WhereLevel *pLevel,   /* Which nested loop of the FROM we are coding */
dvander@1203
  1769
  WhereClause *pWC,     /* The WHERE clause */
dvander@1203
  1770
  Bitmask notReady      /* Which parts of FROM have not yet been coded */
dvander@1203
  1771
){
dvander@1203
  1772
  int nEq = pLevel->nEq;        /* The number of == or IN constraints to code */
dvander@1203
  1773
  int termsInMem = 0;           /* If true, store value in mem[] cells */
dvander@1203
  1774
  Vdbe *v = pParse->pVdbe;      /* The virtual machine under construction */
dvander@1203
  1775
  Index *pIdx = pLevel->pIdx;   /* The index being used for this loop */
dvander@1203
  1776
  int iCur = pLevel->iTabCur;   /* The cursor of the table */
dvander@1203
  1777
  WhereTerm *pTerm;             /* A single constraint term */
dvander@1203
  1778
  int j;                        /* Loop counter */
dvander@1203
  1779
dvander@1203
  1780
  /* Figure out how many memory cells we will need then allocate them.
dvander@1203
  1781
  ** We always need at least one used to store the loop terminator
dvander@1203
  1782
  ** value.  If there are IN operators we'll need one for each == or
dvander@1203
  1783
  ** IN constraint.
dvander@1203
  1784
  */
dvander@1203
  1785
  pLevel->iMem = pParse->nMem++;
dvander@1203
  1786
  if( pLevel->flags & WHERE_COLUMN_IN ){
dvander@1203
  1787
    pParse->nMem += pLevel->nEq;
dvander@1203
  1788
    termsInMem = 1;
dvander@1203
  1789
  }
dvander@1203
  1790
dvander@1203
  1791
  /* Evaluate the equality constraints
dvander@1203
  1792
  */
dvander@1203
  1793
  assert( pIdx->nColumn>=nEq );
dvander@1203
  1794
  for(j=0; j<nEq; j++){
dvander@1203
  1795
    int k = pIdx->aiColumn[j];
dvander@1203
  1796
    pTerm = findTerm(pWC, iCur, k, notReady, pLevel->flags, pIdx);
dvander@1203
  1797
    if( pTerm==0 ) break;
dvander@1203
  1798
    assert( (pTerm->flags & TERM_CODED)==0 );
dvander@1203
  1799
    codeEqualityTerm(pParse, pTerm, pLevel);
dvander@1203
  1800
    if( (pTerm->eOperator & (WO_ISNULL|WO_IN))==0 ){
dvander@1203
  1801
      sqlite3VdbeAddOp(v, OP_IsNull, termsInMem ? -1 : -(j+1), pLevel->brk);
dvander@1203
  1802
    }
dvander@1203
  1803
    if( termsInMem ){
dvander@1203
  1804
      sqlite3VdbeAddOp(v, OP_MemStore, pLevel->iMem+j+1, 1);
dvander@1203
  1805
    }
dvander@1203
  1806
  }
dvander@1203
  1807
dvander@1203
  1808
  /* Make sure all the constraint values are on the top of the stack
dvander@1203
  1809
  */
dvander@1203
  1810
  if( termsInMem ){
dvander@1203
  1811
    for(j=0; j<nEq; j++){
dvander@1203
  1812
      sqlite3VdbeAddOp(v, OP_MemLoad, pLevel->iMem+j+1, 0);
dvander@1203
  1813
    }
dvander@1203
  1814
  }
dvander@1203
  1815
}
dvander@1203
  1816
dvander@1203
  1817
#if defined(SQLITE_TEST)
dvander@1203
  1818
/*
dvander@1203
  1819
** The following variable holds a text description of query plan generated
dvander@1203
  1820
** by the most recent call to sqlite3WhereBegin().  Each call to WhereBegin
dvander@1203
  1821
** overwrites the previous.  This information is used for testing and
dvander@1203
  1822
** analysis only.
dvander@1203
  1823
*/
dvander@1203
  1824
char sqlite3_query_plan[BMS*2*40];  /* Text of the join */
dvander@1203
  1825
static int nQPlan = 0;              /* Next free slow in _query_plan[] */
dvander@1203
  1826
dvander@1203
  1827
#endif /* SQLITE_TEST */
dvander@1203
  1828
dvander@1203
  1829
dvander@1203
  1830
/*
dvander@1203
  1831
** Free a WhereInfo structure
dvander@1203
  1832
*/
dvander@1203
  1833
static void whereInfoFree(WhereInfo *pWInfo){
dvander@1203
  1834
  if( pWInfo ){
dvander@1203
  1835
    int i;
dvander@1203
  1836
    for(i=0; i<pWInfo->nLevel; i++){
dvander@1203
  1837
      sqlite3_index_info *pInfo = pWInfo->a[i].pIdxInfo;
dvander@1203
  1838
      if( pInfo ){
dvander@1203
  1839
        if( pInfo->needToFreeIdxStr ){
dvander@1203
  1840
          /* Coverage: Don't think this can be reached. By the time this
dvander@1203
  1841
          ** function is called, the index-strings have been passed
dvander@1203
  1842
          ** to the vdbe layer for deletion.
dvander@1203
  1843
          */
dvander@1203
  1844
          sqlite3_free(pInfo->idxStr);
dvander@1203
  1845
        }
dvander@1203
  1846
        sqliteFree(pInfo);
dvander@1203
  1847
      }
dvander@1203
  1848
    }
dvander@1203
  1849
    sqliteFree(pWInfo);
dvander@1203
  1850
  }
dvander@1203
  1851
}
dvander@1203
  1852
dvander@1203
  1853
dvander@1203
  1854
/*
dvander@1203
  1855
** Generate the beginning of the loop used for WHERE clause processing.
dvander@1203
  1856
** The return value is a pointer to an opaque structure that contains
dvander@1203
  1857
** information needed to terminate the loop.  Later, the calling routine
dvander@1203
  1858
** should invoke sqlite3WhereEnd() with the return value of this function
dvander@1203
  1859
** in order to complete the WHERE clause processing.
dvander@1203
  1860
**
dvander@1203
  1861
** If an error occurs, this routine returns NULL.
dvander@1203
  1862
**
dvander@1203
  1863
** The basic idea is to do a nested loop, one loop for each table in
dvander@1203
  1864
** the FROM clause of a select.  (INSERT and UPDATE statements are the
dvander@1203
  1865
** same as a SELECT with only a single table in the FROM clause.)  For
dvander@1203
  1866
** example, if the SQL is this:
dvander@1203
  1867
**
dvander@1203
  1868
**       SELECT * FROM t1, t2, t3 WHERE ...;
dvander@1203
  1869
**
dvander@1203
  1870
** Then the code generated is conceptually like the following:
dvander@1203
  1871
**
dvander@1203
  1872
**      foreach row1 in t1 do       \    Code generated
dvander@1203
  1873
**        foreach row2 in t2 do      |-- by sqlite3WhereBegin()
dvander@1203
  1874
**          foreach row3 in t3 do   /
dvander@1203
  1875
**            ...
dvander@1203
  1876
**          end                     \    Code generated
dvander@1203
  1877
**        end                        |-- by sqlite3WhereEnd()
dvander@1203
  1878
**      end                         /
dvander@1203
  1879
**
dvander@1203
  1880
** Note that the loops might not be nested in the order in which they
dvander@1203
  1881
** appear in the FROM clause if a different order is better able to make
dvander@1203
  1882
** use of indices.  Note also that when the IN operator appears in
dvander@1203
  1883
** the WHERE clause, it might result in additional nested loops for
dvander@1203
  1884
** scanning through all values on the right-hand side of the IN.
dvander@1203
  1885
**
dvander@1203
  1886
** There are Btree cursors associated with each table.  t1 uses cursor
dvander@1203
  1887
** number pTabList->a[0].iCursor.  t2 uses the cursor pTabList->a[1].iCursor.
dvander@1203
  1888
** And so forth.  This routine generates code to open those VDBE cursors
dvander@1203
  1889
** and sqlite3WhereEnd() generates the code to close them.
dvander@1203
  1890
**
dvander@1203
  1891
** The code that sqlite3WhereBegin() generates leaves the cursors named
dvander@1203
  1892
** in pTabList pointing at their appropriate entries.  The [...] code
dvander@1203
  1893
** can use OP_Column and OP_Rowid opcodes on these cursors to extract
dvander@1203
  1894
** data from the various tables of the loop.
dvander@1203
  1895
**
dvander@1203
  1896
** If the WHERE clause is empty, the foreach loops must each scan their
dvander@1203
  1897
** entire tables.  Thus a three-way join is an O(N^3) operation.  But if
dvander@1203
  1898
** the tables have indices and there are terms in the WHERE clause that
dvander@1203
  1899
** refer to those indices, a complete table scan can be avoided and the
dvander@1203
  1900
** code will run much faster.  Most of the work of this routine is checking
dvander@1203
  1901
** to see if there are indices that can be used to speed up the loop.
dvander@1203
  1902
**
dvander@1203
  1903
** Terms of the WHERE clause are also used to limit which rows actually
dvander@1203
  1904
** make it to the "..." in the middle of the loop.  After each "foreach",
dvander@1203
  1905
** terms of the WHERE clause that use only terms in that loop and outer
dvander@1203
  1906
** loops are evaluated and if false a jump is made around all subsequent
dvander@1203
  1907
** inner loops (or around the "..." if the test occurs within the inner-
dvander@1203
  1908
** most loop)
dvander@1203
  1909
**
dvander@1203
  1910
** OUTER JOINS
dvander@1203
  1911
**
dvander@1203
  1912
** An outer join of tables t1 and t2 is conceptally coded as follows:
dvander@1203
  1913
**
dvander@1203
  1914
**    foreach row1 in t1 do
dvander@1203
  1915
**      flag = 0
dvander@1203
  1916
**      foreach row2 in t2 do
dvander@1203
  1917
**        start:
dvander@1203
  1918
**          ...
dvander@1203
  1919
**          flag = 1
dvander@1203
  1920
**      end
dvander@1203
  1921
**      if flag==0 then
dvander@1203
  1922
**        move the row2 cursor to a null row
dvander@1203
  1923
**        goto start
dvander@1203
  1924
**      fi
dvander@1203
  1925
**    end
dvander@1203
  1926
**
dvander@1203
  1927
** ORDER BY CLAUSE PROCESSING
dvander@1203
  1928
**
dvander@1203
  1929
** *ppOrderBy is a pointer to the ORDER BY clause of a SELECT statement,
dvander@1203
  1930
** if there is one.  If there is no ORDER BY clause or if this routine
dvander@1203
  1931
** is called from an UPDATE or DELETE statement, then ppOrderBy is NULL.
dvander@1203
  1932
**
dvander@1203
  1933
** If an index can be used so that the natural output order of the table
dvander@1203
  1934
** scan is correct for the ORDER BY clause, then that index is used and
dvander@1203
  1935
** *ppOrderBy is set to NULL.  This is an optimization that prevents an
dvander@1203
  1936
** unnecessary sort of the result set if an index appropriate for the
dvander@1203
  1937
** ORDER BY clause already exists.
dvander@1203
  1938
**
dvander@1203
  1939
** If the where clause loops cannot be arranged to provide the correct
dvander@1203
  1940
** output order, then the *ppOrderBy is unchanged.
dvander@1203
  1941
*/
dvander@1203
  1942
WhereInfo *sqlite3WhereBegin(
dvander@1203
  1943
  Parse *pParse,        /* The parser context */
dvander@1203
  1944
  SrcList *pTabList,    /* A list of all tables to be scanned */
dvander@1203
  1945
  Expr *pWhere,         /* The WHERE clause */
dvander@1203
  1946
  ExprList **ppOrderBy  /* An ORDER BY clause, or NULL */
dvander@1203
  1947
){
dvander@1203
  1948
  int i;                     /* Loop counter */
dvander@1203
  1949
  WhereInfo *pWInfo;         /* Will become the return value of this function */
dvander@1203
  1950
  Vdbe *v = pParse->pVdbe;   /* The virtual database engine */
dvander@1203
  1951
  int brk, cont = 0;         /* Addresses used during code generation */
dvander@1203
  1952
  Bitmask notReady;          /* Cursors that are not yet positioned */
dvander@1203
  1953
  WhereTerm *pTerm;          /* A single term in the WHERE clause */
dvander@1203
  1954
  ExprMaskSet maskSet;       /* The expression mask set */
dvander@1203
  1955
  WhereClause wc;            /* The WHERE clause is divided into these terms */
dvander@1203
  1956
  struct SrcList_item *pTabItem;  /* A single entry from pTabList */
dvander@1203
  1957
  WhereLevel *pLevel;             /* A single level in the pWInfo list */
dvander@1203
  1958
  int iFrom;                      /* First unused FROM clause element */
dvander@1203
  1959
  int andFlags;              /* AND-ed combination of all wc.a[].flags */
dvander@1203
  1960
dvander@1203
  1961
  /* The number of tables in the FROM clause is limited by the number of
dvander@1203
  1962
  ** bits in a Bitmask 
dvander@1203
  1963
  */
dvander@1203
  1964
  if( pTabList->nSrc>BMS ){
dvander@1203
  1965
    sqlite3ErrorMsg(pParse, "at most %d tables in a join", BMS);
dvander@1203
  1966
    return 0;
dvander@1203
  1967
  }
dvander@1203
  1968
dvander@1203
  1969
  /* Split the WHERE clause into separate subexpressions where each
dvander@1203
  1970
  ** subexpression is separated by an AND operator.
dvander@1203
  1971
  */
dvander@1203
  1972
  initMaskSet(&maskSet);
dvander@1203
  1973
  whereClauseInit(&wc, pParse, &maskSet);
dvander@1203
  1974
  whereSplit(&wc, pWhere, TK_AND);
dvander@1203
  1975
    
dvander@1203
  1976
  /* Allocate and initialize the WhereInfo structure that will become the
dvander@1203
  1977
  ** return value.
dvander@1203
  1978
  */
dvander@1203
  1979
  pWInfo = sqliteMalloc( sizeof(WhereInfo) + pTabList->nSrc*sizeof(WhereLevel));
dvander@1203
  1980
  if( sqlite3MallocFailed() ){
dvander@1203
  1981
    goto whereBeginNoMem;
dvander@1203
  1982
  }
dvander@1203
  1983
  pWInfo->nLevel = pTabList->nSrc;
dvander@1203
  1984
  pWInfo->pParse = pParse;
dvander@1203
  1985
  pWInfo->pTabList = pTabList;
dvander@1203
  1986
  pWInfo->iBreak = sqlite3VdbeMakeLabel(v);
dvander@1203
  1987
dvander@1203
  1988
  /* Special case: a WHERE clause that is constant.  Evaluate the
dvander@1203
  1989
  ** expression and either jump over all of the code or fall thru.
dvander@1203
  1990
  */
dvander@1203
  1991
  if( pWhere && (pTabList->nSrc==0 || sqlite3ExprIsConstantNotJoin(pWhere)) ){
dvander@1203
  1992
    sqlite3ExprIfFalse(pParse, pWhere, pWInfo->iBreak, 1);
dvander@1203
  1993
    pWhere = 0;
dvander@1203
  1994
  }
dvander@1203
  1995
dvander@1203
  1996
  /* Analyze all of the subexpressions.  Note that exprAnalyze() might
dvander@1203
  1997
  ** add new virtual terms onto the end of the WHERE clause.  We do not
dvander@1203
  1998
  ** want to analyze these virtual terms, so start analyzing at the end
dvander@1203
  1999
  ** and work forward so that the added virtual terms are never processed.
dvander@1203
  2000
  */
dvander@1203
  2001
  for(i=0; i<pTabList->nSrc; i++){
dvander@1203
  2002
    createMask(&maskSet, pTabList->a[i].iCursor);
dvander@1203
  2003
  }
dvander@1203
  2004
  exprAnalyzeAll(pTabList, &wc);
dvander@1203
  2005
  if( sqlite3MallocFailed() ){
dvander@1203
  2006
    goto whereBeginNoMem;
dvander@1203
  2007
  }
dvander@1203
  2008
dvander@1203
  2009
  /* Chose the best index to use for each table in the FROM clause.
dvander@1203
  2010
  **
dvander@1203
  2011
  ** This loop fills in the following fields:
dvander@1203
  2012
  **
dvander@1203
  2013
  **   pWInfo->a[].pIdx      The index to use for this level of the loop.
dvander@1203
  2014
  **   pWInfo->a[].flags     WHERE_xxx flags associated with pIdx
dvander@1203
  2015
  **   pWInfo->a[].nEq       The number of == and IN constraints
dvander@1203
  2016
  **   pWInfo->a[].iFrom     When term of the FROM clause is being coded
dvander@1203
  2017
  **   pWInfo->a[].iTabCur   The VDBE cursor for the database table
dvander@1203
  2018
  **   pWInfo->a[].iIdxCur   The VDBE cursor for the index
dvander@1203
  2019
  **
dvander@1203
  2020
  ** This loop also figures out the nesting order of tables in the FROM
dvander@1203
  2021
  ** clause.
dvander@1203
  2022
  */
dvander@1203
  2023
  notReady = ~(Bitmask)0;
dvander@1203
  2024
  pTabItem = pTabList->a;
dvander@1203
  2025
  pLevel = pWInfo->a;
dvander@1203
  2026
  andFlags = ~0;
dvander@1203
  2027
  WHERETRACE(("*** Optimizer Start ***\n"));
dvander@1203
  2028
  for(i=iFrom=0, pLevel=pWInfo->a; i<pTabList->nSrc; i++, pLevel++){
dvander@1203
  2029
    Index *pIdx;                /* Index for FROM table at pTabItem */
dvander@1203
  2030
    int flags;                  /* Flags asssociated with pIdx */
dvander@1203
  2031
    int nEq;                    /* Number of == or IN constraints */
dvander@1203
  2032
    double cost;                /* The cost for pIdx */
dvander@1203
  2033
    int j;                      /* For looping over FROM tables */
dvander@1203
  2034
    Index *pBest = 0;           /* The best index seen so far */
dvander@1203
  2035
    int bestFlags = 0;          /* Flags associated with pBest */
dvander@1203
  2036
    int bestNEq = 0;            /* nEq associated with pBest */
dvander@1203
  2037
    double lowestCost;          /* Cost of the pBest */
dvander@1203
  2038
    int bestJ = 0;              /* The value of j */
dvander@1203
  2039
    Bitmask m;                  /* Bitmask value for j or bestJ */
dvander@1203
  2040
    int once = 0;               /* True when first table is seen */
dvander@1203
  2041
    sqlite3_index_info *pIndex; /* Current virtual index */
dvander@1203
  2042
dvander@1203
  2043
    lowestCost = SQLITE_BIG_DBL;
dvander@1203
  2044
    for(j=iFrom, pTabItem=&pTabList->a[j]; j<pTabList->nSrc; j++, pTabItem++){
dvander@1203
  2045
      int doNotReorder;  /* True if this table should not be reordered */
dvander@1203
  2046
dvander@1203
  2047
      doNotReorder =  (pTabItem->jointype & (JT_LEFT|JT_CROSS))!=0;
dvander@1203
  2048
      if( once && doNotReorder ) break;
dvander@1203
  2049
      m = getMask(&maskSet, pTabItem->iCursor);
dvander@1203
  2050
      if( (m & notReady)==0 ){
dvander@1203
  2051
        if( j==iFrom ) iFrom++;
dvander@1203
  2052
        continue;
dvander@1203
  2053
      }
dvander@1203
  2054
      assert( pTabItem->pTab );
dvander@1203
  2055
#ifndef SQLITE_OMIT_VIRTUALTABLE
dvander@1203
  2056
      if( IsVirtual(pTabItem->pTab) ){
dvander@1203
  2057
        sqlite3_index_info **ppIdxInfo = &pWInfo->a[j].pIdxInfo;
dvander@1203
  2058
        cost = bestVirtualIndex(pParse, &wc, pTabItem, notReady,
dvander@1203
  2059
                                ppOrderBy ? *ppOrderBy : 0, i==0,
dvander@1203
  2060
                                ppIdxInfo);
dvander@1203
  2061
        flags = WHERE_VIRTUALTABLE;
dvander@1203
  2062
        pIndex = *ppIdxInfo;
dvander@1203
  2063
        if( pIndex && pIndex->orderByConsumed ){
dvander@1203
  2064
          flags = WHERE_VIRTUALTABLE | WHERE_ORDERBY;
dvander@1203
  2065
        }
dvander@1203
  2066
        pIdx = 0;
dvander@1203
  2067
        nEq = 0;
dvander@1203
  2068
        if( (SQLITE_BIG_DBL/2.0)<cost ){
dvander@1203
  2069
          /* The cost is not allowed to be larger than SQLITE_BIG_DBL (the
dvander@1203
  2070
          ** inital value of lowestCost in this loop. If it is, then
dvander@1203
  2071
          ** the (cost<lowestCost) test below will never be true and
dvander@1203
  2072
          ** pLevel->pBestIdx never set.
dvander@1203
  2073
          */ 
dvander@1203
  2074
          cost = (SQLITE_BIG_DBL/2.0);
dvander@1203
  2075
        }
dvander@1203
  2076
      }else 
dvander@1203
  2077
#endif
dvander@1203
  2078
      {
dvander@1203
  2079
        cost = bestIndex(pParse, &wc, pTabItem, notReady,
dvander@1203
  2080
                         (i==0 && ppOrderBy) ? *ppOrderBy : 0,
dvander@1203
  2081
                         &pIdx, &flags, &nEq);
dvander@1203
  2082
        pIndex = 0;
dvander@1203
  2083
      }
dvander@1203
  2084
      if( cost<lowestCost ){
dvander@1203
  2085
        once = 1;
dvander@1203
  2086
        lowestCost = cost;
dvander@1203
  2087
        pBest = pIdx;
dvander@1203
  2088
        bestFlags = flags;
dvander@1203
  2089
        bestNEq = nEq;
dvander@1203
  2090
        bestJ = j;
dvander@1203
  2091
        pLevel->pBestIdx = pIndex;
dvander@1203
  2092
      }
dvander@1203
  2093
      if( doNotReorder ) break;
dvander@1203
  2094
    }
dvander@1203
  2095
    WHERETRACE(("*** Optimizer choose table %d for loop %d\n", bestJ,
dvander@1203
  2096
           pLevel-pWInfo->a));
dvander@1203
  2097
    if( (bestFlags & WHERE_ORDERBY)!=0 ){
dvander@1203
  2098
      *ppOrderBy = 0;
dvander@1203
  2099
    }
dvander@1203
  2100
    andFlags &= bestFlags;
dvander@1203
  2101
    pLevel->flags = bestFlags;
dvander@1203
  2102
    pLevel->pIdx = pBest;
dvander@1203
  2103
    pLevel->nEq = bestNEq;
dvander@1203
  2104
    pLevel->aInLoop = 0;
dvander@1203
  2105
    pLevel->nIn = 0;
dvander@1203
  2106
    if( pBest ){
dvander@1203
  2107
      pLevel->iIdxCur = pParse->nTab++;
dvander@1203
  2108
    }else{
dvander@1203
  2109
      pLevel->iIdxCur = -1;
dvander@1203
  2110
    }
dvander@1203
  2111
    notReady &= ~getMask(&maskSet, pTabList->a[bestJ].iCursor);
dvander@1203
  2112
    pLevel->iFrom = bestJ;
dvander@1203
  2113
  }
dvander@1203
  2114
  WHERETRACE(("*** Optimizer Finished ***\n"));
dvander@1203
  2115
dvander@1203
  2116
  /* If the total query only selects a single row, then the ORDER BY
dvander@1203
  2117
  ** clause is irrelevant.
dvander@1203
  2118
  */
dvander@1203
  2119
  if( (andFlags & WHERE_UNIQUE)!=0 && ppOrderBy ){
dvander@1203
  2120
    *ppOrderBy = 0;
dvander@1203
  2121
  }
dvander@1203
  2122
dvander@1203
  2123
  /* Open all tables in the pTabList and any indices selected for
dvander@1203
  2124
  ** searching those tables.
dvander@1203
  2125
  */
dvander@1203
  2126
  sqlite3CodeVerifySchema(pParse, -1); /* Insert the cookie verifier Goto */
dvander@1203
  2127
  for(i=0, pLevel=pWInfo->a; i<pTabList->nSrc; i++, pLevel++){
dvander@1203
  2128
    Table *pTab;     /* Table to open */
dvander@1203
  2129
    Index *pIx;      /* Index used to access pTab (if any) */
dvander@1203
  2130
    int iDb;         /* Index of database containing table/index */
dvander@1203
  2131
    int iIdxCur = pLevel->iIdxCur;
dvander@1203
  2132
dvander@1203
  2133
#ifndef SQLITE_OMIT_EXPLAIN
dvander@1203
  2134
    if( pParse->explain==2 ){
dvander@1203
  2135
      char *zMsg;
dvander@1203
  2136
      struct SrcList_item *pItem = &pTabList->a[pLevel->iFrom];
dvander@1203
  2137
      zMsg = sqlite3MPrintf("TABLE %s", pItem->zName);
dvander@1203
  2138
      if( pItem->zAlias ){
dvander@1203
  2139
        zMsg = sqlite3MPrintf("%z AS %s", zMsg, pItem->zAlias);
dvander@1203
  2140
      }
dvander@1203
  2141
      if( (pIx = pLevel->pIdx)!=0 ){
dvander@1203
  2142
        zMsg = sqlite3MPrintf("%z WITH INDEX %s", zMsg, pIx->zName);
dvander@1203
  2143
      }else if( pLevel->flags & (WHERE_ROWID_EQ|WHERE_ROWID_RANGE) ){
dvander@1203
  2144
        zMsg = sqlite3MPrintf("%z USING PRIMARY KEY", zMsg);
dvander@1203
  2145
      }
dvander@1203
  2146
#ifndef SQLITE_OMIT_VIRTUALTABLE
dvander@1203
  2147
      else if( pLevel->pBestIdx ){
dvander@1203
  2148
        sqlite3_index_info *pBestIdx = pLevel->pBestIdx;
dvander@1203
  2149
        zMsg = sqlite3MPrintf("%z VIRTUAL TABLE INDEX %d:%s", zMsg,
dvander@1203
  2150
                    pBestIdx->idxNum, pBestIdx->idxStr);
dvander@1203
  2151
      }
dvander@1203
  2152
#endif
dvander@1203
  2153
      if( pLevel->flags & WHERE_ORDERBY ){
dvander@1203
  2154
        zMsg = sqlite3MPrintf("%z ORDER BY", zMsg);
dvander@1203
  2155
      }
dvander@1203
  2156
      sqlite3VdbeOp3(v, OP_Explain, i, pLevel->iFrom, zMsg, P3_DYNAMIC);
dvander@1203
  2157
    }
dvander@1203
  2158
#endif /* SQLITE_OMIT_EXPLAIN */
dvander@1203
  2159
    pTabItem = &pTabList->a[pLevel->iFrom];
dvander@1203
  2160
    pTab = pTabItem->pTab;
dvander@1203
  2161
    iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
dvander@1203
  2162
    if( pTab->isEphem || pTab->pSelect ) continue;
dvander@1203
  2163
#ifndef SQLITE_OMIT_VIRTUALTABLE
dvander@1203
  2164
    if( pLevel->pBestIdx ){
dvander@1203
  2165
      int iCur = pTabItem->iCursor;
dvander@1203
  2166
      sqlite3VdbeOp3(v, OP_VOpen, iCur, 0, (const char*)pTab->pVtab, P3_VTAB);
dvander@1203
  2167
    }else
dvander@1203
  2168
#endif
dvander@1203
  2169
    if( (pLevel->flags & WHERE_IDX_ONLY)==0 ){
dvander@1203
  2170
      sqlite3OpenTable(pParse, pTabItem->iCursor, iDb, pTab, OP_OpenRead);
dvander@1203
  2171
      if( pTab->nCol<(sizeof(Bitmask)*8) ){
dvander@1203
  2172
        Bitmask b = pTabItem->colUsed;
dvander@1203
  2173
        int n = 0;
dvander@1203
  2174
        for(; b; b=b>>1, n++){}
dvander@1203
  2175
        sqlite3VdbeChangeP2(v, sqlite3VdbeCurrentAddr(v)-1, n);
dvander@1203
  2176
        assert( n<=pTab->nCol );
dvander@1203
  2177
      }
dvander@1203
  2178
    }else{
dvander@1203
  2179
      sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName);
dvander@1203
  2180
    }
dvander@1203
  2181
    pLevel->iTabCur = pTabItem->iCursor;
dvander@1203
  2182
    if( (pIx = pLevel->pIdx)!=0 ){
dvander@1203
  2183
      KeyInfo *pKey = sqlite3IndexKeyinfo(pParse, pIx);
dvander@1203
  2184
      assert( pIx->pSchema==pTab->pSchema );
dvander@1203
  2185
      sqlite3VdbeAddOp(v, OP_Integer, iDb, 0);
dvander@1203
  2186
      VdbeComment((v, "# %s", pIx->zName));
dvander@1203
  2187
      sqlite3VdbeOp3(v, OP_OpenRead, iIdxCur, pIx->tnum,
dvander@1203
  2188
                     (char*)pKey, P3_KEYINFO_HANDOFF);
dvander@1203
  2189
    }
dvander@1203
  2190
    if( (pLevel->flags & (WHERE_IDX_ONLY|WHERE_COLUMN_RANGE))!=0 ){
dvander@1203
  2191
      /* Only call OP_SetNumColumns on the index if we might later use
dvander@1203
  2192
      ** OP_Column on the index. */
dvander@1203
  2193
      sqlite3VdbeAddOp(v, OP_SetNumColumns, iIdxCur, pIx->nColumn+1);
dvander@1203
  2194
    }
dvander@1203
  2195
    sqlite3CodeVerifySchema(pParse, iDb);
dvander@1203
  2196
  }
dvander@1203
  2197
  pWInfo->iTop = sqlite3VdbeCurrentAddr(v);
dvander@1203
  2198
dvander@1203
  2199
  /* Generate the code to do the search.  Each iteration of the for
dvander@1203
  2200
  ** loop below generates code for a single nested loop of the VM
dvander@1203
  2201
  ** program.
dvander@1203
  2202
  */
dvander@1203
  2203
  notReady = ~(Bitmask)0;
dvander@1203
  2204
  for(i=0, pLevel=pWInfo->a; i<pTabList->nSrc; i++, pLevel++){
dvander@1203
  2205
    int j;
dvander@1203
  2206
    int iCur = pTabItem->iCursor;  /* The VDBE cursor for the table */
dvander@1203
  2207
    Index *pIdx;       /* The index we will be using */
dvander@1203
  2208
    int nxt;           /* Where to jump to continue with the next IN case */
dvander@1203
  2209
    int iIdxCur;       /* The VDBE cursor for the index */
dvander@1203
  2210
    int omitTable;     /* True if we use the index only */
dvander@1203
  2211
    int bRev;          /* True if we need to scan in reverse order */
dvander@1203
  2212
dvander@1203
  2213
    pTabItem = &pTabList->a[pLevel->iFrom];
dvander@1203
  2214
    iCur = pTabItem->iCursor;
dvander@1203
  2215
    pIdx = pLevel->pIdx;
dvander@1203
  2216
    iIdxCur = pLevel->iIdxCur;
dvander@1203
  2217
    bRev = (pLevel->flags & WHERE_REVERSE)!=0;
dvander@1203
  2218
    omitTable = (pLevel->flags & WHERE_IDX_ONLY)!=0;
dvander@1203
  2219
dvander@1203
  2220
    /* Create labels for the "break" and "continue" instructions
dvander@1203
  2221
    ** for the current loop.  Jump to brk to break out of a loop.
dvander@1203
  2222
    ** Jump to cont to go immediately to the next iteration of the
dvander@1203
  2223
    ** loop.
dvander@1203
  2224
    **
dvander@1203
  2225
    ** When there is an IN operator, we also have a "nxt" label that
dvander@1203
  2226
    ** means to continue with the next IN value combination.  When
dvander@1203
  2227
    ** there are no IN operators in the constraints, the "nxt" label
dvander@1203
  2228
    ** is the same as "brk".
dvander@1203
  2229
    */
dvander@1203
  2230
    brk = pLevel->brk = pLevel->nxt = sqlite3VdbeMakeLabel(v);
dvander@1203
  2231
    cont = pLevel->cont = sqlite3VdbeMakeLabel(v);
dvander@1203
  2232
dvander@1203
  2233
    /* If this is the right table of a LEFT OUTER JOIN, allocate and
dvander@1203
  2234
    ** initialize a memory cell that records if this table matches any
dvander@1203
  2235
    ** row of the left table of the join.
dvander@1203
  2236
    */
dvander@1203
  2237
    if( pLevel->iFrom>0 && (pTabItem[0].jointype & JT_LEFT)!=0 ){
dvander@1203
  2238
      if( !pParse->nMem ) pParse->nMem++;
dvander@1203
  2239
      pLevel->iLeftJoin = pParse->nMem++;
dvander@1203
  2240
      sqlite3VdbeAddOp(v, OP_MemInt, 0, pLevel->iLeftJoin);
dvander@1203
  2241
      VdbeComment((v, "# init LEFT JOIN no-match flag"));
dvander@1203
  2242
    }
dvander@1203
  2243
dvander@1203
  2244
#ifndef SQLITE_OMIT_VIRTUALTABLE
dvander@1203
  2245
    if( pLevel->pBestIdx ){
dvander@1203
  2246
      /* Case 0:  The table is a virtual-table.  Use the VFilter and VNext
dvander@1203
  2247
      **          to access the data.
dvander@1203
  2248
      */
dvander@1203
  2249
      int j;
dvander@1203
  2250
      sqlite3_index_info *pBestIdx = pLevel->pBestIdx;
dvander@1203
  2251
      int nConstraint = pBestIdx->nConstraint;
dvander@1203
  2252
      struct sqlite3_index_constraint_usage *aUsage =
dvander@1203
  2253
                                                  pBestIdx->aConstraintUsage;
dvander@1203
  2254
      const struct sqlite3_index_constraint *aConstraint =
dvander@1203
  2255
                                                  pBestIdx->aConstraint;
dvander@1203
  2256
dvander@1203
  2257
      for(j=1; j<=nConstraint; j++){
dvander@1203
  2258
        int k;
dvander@1203
  2259
        for(k=0; k<nConstraint; k++){
dvander@1203
  2260
          if( aUsage[k].argvIndex==j ){
dvander@1203
  2261
            int iTerm = aConstraint[k].iTermOffset;
dvander@1203
  2262
            sqlite3ExprCode(pParse, wc.a[iTerm].pExpr->pRight);
dvander@1203
  2263
            break;
dvander@1203
  2264
          }
dvander@1203
  2265
        }
dvander@1203
  2266
        if( k==nConstraint ) break;
dvander@1203
  2267
      }
dvander@1203
  2268
      sqlite3VdbeAddOp(v, OP_Integer, j-1, 0);
dvander@1203
  2269
      sqlite3VdbeAddOp(v, OP_Integer, pBestIdx->idxNum, 0);
dvander@1203
  2270
      sqlite3VdbeOp3(v, OP_VFilter, iCur, brk, pBestIdx->idxStr,
dvander@1203
  2271
                      pBestIdx->needToFreeIdxStr ? P3_MPRINTF : P3_STATIC);
dvander@1203
  2272
      pBestIdx->needToFreeIdxStr = 0;
dvander@1203
  2273
      for(j=0; j<pBestIdx->nConstraint; j++){
dvander@1203
  2274
        if( aUsage[j].omit ){
dvander@1203
  2275
          int iTerm = aConstraint[j].iTermOffset;
dvander@1203
  2276
          disableTerm(pLevel, &wc.a[iTerm]);
dvander@1203
  2277
        }
dvander@1203
  2278
      }
dvander@1203
  2279
      pLevel->op = OP_VNext;
dvander@1203
  2280
      pLevel->p1 = iCur;
dvander@1203
  2281
      pLevel->p2 = sqlite3VdbeCurrentAddr(v);
dvander@1203
  2282
    }else
dvander@1203
  2283
#endif /* SQLITE_OMIT_VIRTUALTABLE */
dvander@1203
  2284
dvander@1203
  2285
    if( pLevel->flags & WHERE_ROWID_EQ ){
dvander@1203
  2286
      /* Case 1:  We can directly reference a single row using an
dvander@1203
  2287
      **          equality comparison against the ROWID field.  Or
dvander@1203
  2288
      **          we reference multiple rows using a "rowid IN (...)"
dvander@1203
  2289
      **          construct.
dvander@1203
  2290
      */
dvander@1203
  2291
      pTerm = findTerm(&wc, iCur, -1, notReady, WO_EQ|WO_IN, 0);
dvander@1203
  2292
      assert( pTerm!=0 );
dvander@1203
  2293
      assert( pTerm->pExpr!=0 );
dvander@1203
  2294
      assert( pTerm->leftCursor==iCur );
dvander@1203
  2295
      assert( omitTable==0 );
dvander@1203
  2296
      codeEqualityTerm(pParse, pTerm, pLevel);
dvander@1203
  2297
      nxt = pLevel->nxt;
dvander@1203
  2298
      sqlite3VdbeAddOp(v, OP_MustBeInt, 1, nxt);
dvander@1203
  2299
      sqlite3VdbeAddOp(v, OP_NotExists, iCur, nxt);
dvander@1203
  2300
      VdbeComment((v, "pk"));
dvander@1203
  2301
      pLevel->op = OP_Noop;
dvander@1203
  2302
    }else if( pLevel->flags & WHERE_ROWID_RANGE ){
dvander@1203
  2303
      /* Case 2:  We have an inequality comparison against the ROWID field.
dvander@1203
  2304
      */
dvander@1203
  2305
      int testOp = OP_Noop;
dvander@1203
  2306
      int start;
dvander@1203
  2307
      WhereTerm *pStart, *pEnd;
dvander@1203
  2308
dvander@1203
  2309
      assert( omitTable==0 );
dvander@1203
  2310
      pStart = findTerm(&wc, iCur, -1, notReady, WO_GT|WO_GE, 0);
dvander@1203
  2311
      pEnd = findTerm(&wc, iCur, -1, notReady, WO_LT|WO_LE, 0);
dvander@1203
  2312
      if( bRev ){
dvander@1203
  2313
        pTerm = pStart;
dvander@1203
  2314
        pStart = pEnd;
dvander@1203
  2315
        pEnd = pTerm;
dvander@1203
  2316
      }
dvander@1203
  2317
      if( pStart ){
dvander@1203
  2318
        Expr *pX;
dvander@1203
  2319
        pX = pStart->pExpr;
dvander@1203
  2320
        assert( pX!=0 );
dvander@1203
  2321
        assert( pStart->leftCursor==iCur );
dvander@1203
  2322
        sqlite3ExprCode(pParse, pX->pRight);
dvander@1203
  2323
        sqlite3VdbeAddOp(v, OP_ForceInt, pX->op==TK_LE || pX->op==TK_GT, brk);
dvander@1203
  2324
        sqlite3VdbeAddOp(v, bRev ? OP_MoveLt : OP_MoveGe, iCur, brk);
dvander@1203
  2325
        VdbeComment((v, "pk"));
dvander@1203
  2326
        disableTerm(pLevel, pStart);
dvander@1203
  2327
      }else{
dvander@1203
  2328
        sqlite3VdbeAddOp(v, bRev ? OP_Last : OP_Rewind, iCur, brk);
dvander@1203
  2329
      }
dvander@1203
  2330
      if( pEnd ){
dvander@1203
  2331
        Expr *pX;
dvander@1203
  2332
        pX = pEnd->pExpr;
dvander@1203
  2333
        assert( pX!=0 );
dvander@1203
  2334
        assert( pEnd->leftCursor==iCur );
dvander@1203
  2335
        sqlite3ExprCode(pParse, pX->pRight);
dvander@1203
  2336
        pLevel->iMem = pParse->nMem++;
dvander@1203
  2337
        sqlite3VdbeAddOp(v, OP_MemStore, pLevel->iMem, 1);
dvander@1203
  2338
        if( pX->op==TK_LT || pX->op==TK_GT ){
dvander@1203
  2339
          testOp = bRev ? OP_Le : OP_Ge;
dvander@1203
  2340
        }else{
dvander@1203
  2341
          testOp = bRev ? OP_Lt : OP_Gt;
dvander@1203
  2342
        }
dvander@1203
  2343
        disableTerm(pLevel, pEnd);
dvander@1203
  2344
      }
dvander@1203
  2345
      start = sqlite3VdbeCurrentAddr(v);
dvander@1203
  2346
      pLevel->op = bRev ? OP_Prev : OP_Next;
dvander@1203
  2347
      pLevel->p1 = iCur;
dvander@1203
  2348
      pLevel->p2 = start;
dvander@1203
  2349
      if( testOp!=OP_Noop ){
dvander@1203
  2350
        sqlite3VdbeAddOp(v, OP_Rowid, iCur, 0);
dvander@1203
  2351
        sqlite3VdbeAddOp(v, OP_MemLoad, pLevel->iMem, 0);
dvander@1203
  2352
        sqlite3VdbeAddOp(v, testOp, SQLITE_AFF_NUMERIC|0x100, brk);
dvander@1203
  2353
      }
dvander@1203
  2354
    }else if( pLevel->flags & WHERE_COLUMN_RANGE ){
dvander@1203
  2355
      /* Case 3: The WHERE clause term that refers to the right-most
dvander@1203
  2356
      **         column of the index is an inequality.  For example, if
dvander@1203
  2357
      **         the index is on (x,y,z) and the WHERE clause is of the
dvander@1203
  2358
      **         form "x=5 AND y<10" then this case is used.  Only the
dvander@1203
  2359
      **         right-most column can be an inequality - the rest must
dvander@1203
  2360
      **         use the "==" and "IN" operators.
dvander@1203
  2361
      **
dvander@1203
  2362
      **         This case is also used when there are no WHERE clause
dvander@1203
  2363
      **         constraints but an index is selected anyway, in order
dvander@1203
  2364
      **         to force the output order to conform to an ORDER BY.
dvander@1203
  2365
      */
dvander@1203
  2366
      int start;
dvander@1203
  2367
      int nEq = pLevel->nEq;
dvander@1203
  2368
      int topEq=0;        /* True if top limit uses ==. False is strictly < */
dvander@1203
  2369
      int btmEq=0;        /* True if btm limit uses ==. False if strictly > */
dvander@1203
  2370
      int topOp, btmOp;   /* Operators for the top and bottom search bounds */
dvander@1203
  2371
      int testOp;
dvander@1203
  2372
      int topLimit = (pLevel->flags & WHERE_TOP_LIMIT)!=0;
dvander@1203
  2373
      int btmLimit = (pLevel->flags & WHERE_BTM_LIMIT)!=0;
dvander@1203
  2374
dvander@1203
  2375
      /* Generate code to evaluate all constraint terms using == or IN
dvander@1203
  2376
      ** and level the values of those terms on the stack.
dvander@1203
  2377
      */
dvander@1203
  2378
      codeAllEqualityTerms(pParse, pLevel, &wc, notReady);
dvander@1203
  2379
dvander@1203
  2380
      /* Duplicate the equality term values because they will all be
dvander@1203
  2381
      ** used twice: once to make the termination key and once to make the
dvander@1203
  2382
      ** start key.
dvander@1203
  2383
      */
dvander@1203
  2384
      for(j=0; j<nEq; j++){
dvander@1203
  2385
        sqlite3VdbeAddOp(v, OP_Dup, nEq-1, 0);
dvander@1203
  2386
      }
dvander@1203
  2387
dvander@1203
  2388
      /* Figure out what comparison operators to use for top and bottom 
dvander@1203
  2389
      ** search bounds. For an ascending index, the bottom bound is a > or >=
dvander@1203
  2390
      ** operator and the top bound is a < or <= operator.  For a descending
dvander@1203
  2391
      ** index the operators are reversed.
dvander@1203
  2392
      */
dvander@1203
  2393
      if( pIdx->aSortOrder[nEq]==SQLITE_SO_ASC ){
dvander@1203
  2394
        topOp = WO_LT|WO_LE;
dvander@1203
  2395
        btmOp = WO_GT|WO_GE;
dvander@1203
  2396
      }else{
dvander@1203
  2397
        topOp = WO_GT|WO_GE;
dvander@1203
  2398
        btmOp = WO_LT|WO_LE;
dvander@1203
  2399
        SWAP(int, topLimit, btmLimit);
dvander@1203
  2400
      }
dvander@1203
  2401
dvander@1203
  2402
      /* Generate the termination key.  This is the key value that
dvander@1203
  2403
      ** will end the search.  There is no termination key if there
dvander@1203
  2404
      ** are no equality terms and no "X<..." term.
dvander@1203
  2405
      **
dvander@1203
  2406
      ** 2002-Dec-04: On a reverse-order scan, the so-called "termination"
dvander@1203
  2407
      ** key computed here really ends up being the start key.
dvander@1203
  2408
      */
dvander@1203
  2409
      nxt = pLevel->nxt;
dvander@1203
  2410
      if( topLimit ){
dvander@1203
  2411
        Expr *pX;
dvander@1203
  2412
        int k = pIdx->aiColumn[j];
dvander@1203
  2413
        pTerm = findTerm(&wc, iCur, k, notReady, topOp, pIdx);
dvander@1203
  2414
        assert( pTerm!=0 );
dvander@1203
  2415
        pX = pTerm->pExpr;
dvander@1203
  2416
        assert( (pTerm->flags & TERM_CODED)==0 );
dvander@1203
  2417
        sqlite3ExprCode(pParse, pX->pRight);
dvander@1203
  2418
        sqlite3VdbeAddOp(v, OP_IsNull, -(nEq*2+1), nxt);
dvander@1203
  2419
        topEq = pTerm->eOperator & (WO_LE|WO_GE);
dvander@1203
  2420
        disableTerm(pLevel, pTerm);
dvander@1203
  2421
        testOp = OP_IdxGE;
dvander@1203
  2422
      }else{
dvander@1203
  2423
        testOp = nEq>0 ? OP_IdxGE : OP_Noop;
dvander@1203
  2424
        topEq = 1;
dvander@1203
  2425
      }
dvander@1203
  2426
      if( testOp!=OP_Noop ){
dvander@1203
  2427
        int nCol = nEq + topLimit;
dvander@1203
  2428
        pLevel->iMem = pParse->nMem++;
dvander@1203
  2429
        buildIndexProbe(v, nCol, pIdx);
dvander@1203
  2430
        if( bRev ){
dvander@1203
  2431
          int op = topEq ? OP_MoveLe : OP_MoveLt;
dvander@1203
  2432
          sqlite3VdbeAddOp(v, op, iIdxCur, nxt);
dvander@1203
  2433
        }else{
dvander@1203
  2434
          sqlite3VdbeAddOp(v, OP_MemStore, pLevel->iMem, 1);
dvander@1203
  2435
        }
dvander@1203
  2436
      }else if( bRev ){
dvander@1203
  2437
        sqlite3VdbeAddOp(v, OP_Last, iIdxCur, brk);
dvander@1203
  2438
      }
dvander@1203
  2439
dvander@1203
  2440
      /* Generate the start key.  This is the key that defines the lower
dvander@1203
  2441
      ** bound on the search.  There is no start key if there are no
dvander@1203
  2442
      ** equality terms and if there is no "X>..." term.  In
dvander@1203
  2443
      ** that case, generate a "Rewind" instruction in place of the
dvander@1203
  2444
      ** start key search.
dvander@1203
  2445
      **
dvander@1203
  2446
      ** 2002-Dec-04: In the case of a reverse-order search, the so-called
dvander@1203
  2447
      ** "start" key really ends up being used as the termination key.
dvander@1203
  2448
      */
dvander@1203
  2449
      if( btmLimit ){
dvander@1203
  2450
        Expr *pX;
dvander@1203
  2451
        int k = pIdx->aiColumn[j];
dvander@1203
  2452
        pTerm = findTerm(&wc, iCur, k, notReady, btmOp, pIdx);
dvander@1203
  2453
        assert( pTerm!=0 );
dvander@1203
  2454
        pX = pTerm->pExpr;
dvander@1203
  2455
        assert( (pTerm->flags & TERM_CODED)==0 );
dvander@1203
  2456
        sqlite3ExprCode(pParse, pX->pRight);
dvander@1203
  2457
        sqlite3VdbeAddOp(v, OP_IsNull, -(nEq+1), nxt);
dvander@1203
  2458
        btmEq = pTerm->eOperator & (WO_LE|WO_GE);
dvander@1203
  2459
        disableTerm(pLevel, pTerm);
dvander@1203
  2460
      }else{
dvander@1203
  2461
        btmEq = 1;
dvander@1203
  2462
      }
dvander@1203
  2463
      if( nEq>0 || btmLimit ){
dvander@1203
  2464
        int nCol = nEq + btmLimit;
dvander@1203
  2465
        buildIndexProbe(v, nCol, pIdx);
dvander@1203
  2466
        if( bRev ){
dvander@1203
  2467
          pLevel->iMem = pParse->nMem++;
dvander@1203
  2468
          sqlite3VdbeAddOp(v, OP_MemStore, pLevel->iMem, 1);
dvander@1203
  2469
          testOp = OP_IdxLT;
dvander@1203
  2470
        }else{
dvander@1203
  2471
          int op = btmEq ? OP_MoveGe : OP_MoveGt;
dvander@1203
  2472
          sqlite3VdbeAddOp(v, op, iIdxCur, nxt);
dvander@1203
  2473
        }
dvander@1203
  2474
      }else if( bRev ){
dvander@1203
  2475
        testOp = OP_Noop;
dvander@1203
  2476
      }else{
dvander@1203
  2477
        sqlite3VdbeAddOp(v, OP_Rewind, iIdxCur, brk);
dvander@1203
  2478
      }
dvander@1203
  2479
dvander@1203
  2480
      /* Generate the the top of the loop.  If there is a termination
dvander@1203
  2481
      ** key we have to test for that key and abort at the top of the
dvander@1203
  2482
      ** loop.
dvander@1203
  2483
      */
dvander@1203
  2484
      start = sqlite3VdbeCurrentAddr(v);
dvander@1203
  2485
      if( testOp!=OP_Noop ){
dvander@1203
  2486
        sqlite3VdbeAddOp(v, OP_MemLoad, pLevel->iMem, 0);
dvander@1203
  2487
        sqlite3VdbeAddOp(v, testOp, iIdxCur, nxt);
dvander@1203
  2488
        if( (topEq && !bRev) || (!btmEq && bRev) ){
dvander@1203
  2489
          sqlite3VdbeChangeP3(v, -1, "+", P3_STATIC);
dvander@1203
  2490
        }
dvander@1203
  2491
      }
dvander@1203
  2492
      if( topLimit | btmLimit ){
dvander@1203
  2493
        sqlite3VdbeAddOp(v, OP_Column, iIdxCur, nEq);
dvander@1203
  2494
        sqlite3VdbeAddOp(v, OP_IsNull, 1, cont);
dvander@1203
  2495
      }
dvander@1203
  2496
      if( !omitTable ){
dvander@1203
  2497
        sqlite3VdbeAddOp(v, OP_IdxRowid, iIdxCur, 0);
dvander@1203
  2498
        sqlite3VdbeAddOp(v, OP_MoveGe, iCur, 0);
dvander@1203
  2499
      }
dvander@1203
  2500
dvander@1203
  2501
      /* Record the instruction used to terminate the loop.
dvander@1203
  2502
      */
dvander@1203
  2503
      pLevel->op = bRev ? OP_Prev : OP_Next;
dvander@1203
  2504
      pLevel->p1 = iIdxCur;
dvander@1203
  2505
      pLevel->p2 = start;
dvander@1203
  2506
    }else if( pLevel->flags & WHERE_COLUMN_EQ ){
dvander@1203
  2507
      /* Case 4:  There is an index and all terms of the WHERE clause that
dvander@1203
  2508
      **          refer to the index using the "==" or "IN" operators.
dvander@1203
  2509
      */
dvander@1203
  2510
      int start;
dvander@1203
  2511
      int nEq = pLevel->nEq;
dvander@1203
  2512
dvander@1203
  2513
      /* Generate code to evaluate all constraint terms using == or IN
dvander@1203
  2514
      ** and leave the values of those terms on the stack.
dvander@1203
  2515
      */
dvander@1203
  2516
      codeAllEqualityTerms(pParse, pLevel, &wc, notReady);
dvander@1203
  2517
      nxt = pLevel->nxt;
dvander@1203
  2518
dvander@1203
  2519
      /* Generate a single key that will be used to both start and terminate
dvander@1203
  2520
      ** the search
dvander@1203
  2521
      */
dvander@1203
  2522
      buildIndexProbe(v, nEq, pIdx);
dvander@1203
  2523
      sqlite3VdbeAddOp(v, OP_MemStore, pLevel->iMem, 0);
dvander@1203
  2524
dvander@1203
  2525
      /* Generate code (1) to move to the first matching element of the table.
dvander@1203
  2526
      ** Then generate code (2) that jumps to "nxt" after the cursor is past
dvander@1203
  2527
      ** the last matching element of the table.  The code (1) is executed
dvander@1203
  2528
      ** once to initialize the search, the code (2) is executed before each
dvander@1203
  2529
      ** iteration of the scan to see if the scan has finished. */
dvander@1203
  2530
      if( bRev ){
dvander@1203
  2531
        /* Scan in reverse order */
dvander@1203
  2532
        sqlite3VdbeAddOp(v, OP_MoveLe, iIdxCur, nxt);
dvander@1203
  2533
        start = sqlite3VdbeAddOp(v, OP_MemLoad, pLevel->iMem, 0);
dvander@1203
  2534
        sqlite3VdbeAddOp(v, OP_IdxLT, iIdxCur, nxt);
dvander@1203
  2535
        pLevel->op = OP_Prev;
dvander@1203
  2536
      }else{
dvander@1203
  2537
        /* Scan in the forward order */
dvander@1203
  2538
        sqlite3VdbeAddOp(v, OP_MoveGe, iIdxCur, nxt);
dvander@1203
  2539
        start = sqlite3VdbeAddOp(v, OP_MemLoad, pLevel->iMem, 0);
dvander@1203
  2540
        sqlite3VdbeOp3(v, OP_IdxGE, iIdxCur, nxt, "+", P3_STATIC);
dvander@1203
  2541
        pLevel->op = OP_Next;
dvander@1203
  2542
      }
dvander@1203
  2543
      if( !omitTable ){
dvander@1203
  2544
        sqlite3VdbeAddOp(v, OP_IdxRowid, iIdxCur, 0);
dvander@1203
  2545
        sqlite3VdbeAddOp(v, OP_MoveGe, iCur, 0);
dvander@1203
  2546
      }
dvander@1203
  2547
      pLevel->p1 = iIdxCur;
dvander@1203
  2548
      pLevel->p2 = start;
dvander@1203
  2549
    }else{
dvander@1203
  2550
      /* Case 5:  There is no usable index.  We must do a complete
dvander@1203
  2551
      **          scan of the entire table.
dvander@1203
  2552
      */
dvander@1203
  2553
      assert( omitTable==0 );
dvander@1203
  2554
      assert( bRev==0 );
dvander@1203
  2555
      pLevel->op = OP_Next;
dvander@1203
  2556
      pLevel->p1 = iCur;
dvander@1203
  2557
      pLevel->p2 = 1 + sqlite3VdbeAddOp(v, OP_Rewind, iCur, brk);
dvander@1203
  2558
    }
dvander@1203
  2559
    notReady &= ~getMask(&maskSet, iCur);
dvander@1203
  2560
dvander@1203
  2561
    /* Insert code to test every subexpression that can be completely
dvander@1203
  2562
    ** computed using the current set of tables.
dvander@1203
  2563
    */
dvander@1203
  2564
    for(pTerm=wc.a, j=wc.nTerm; j>0; j--, pTerm++){
dvander@1203
  2565
      Expr *pE;
dvander@1203
  2566
      if( pTerm->flags & (TERM_VIRTUAL|TERM_CODED) ) continue;
dvander@1203
  2567
      if( (pTerm->prereqAll & notReady)!=0 ) continue;
dvander@1203
  2568
      pE = pTerm->pExpr;
dvander@1203
  2569
      assert( pE!=0 );
dvander@1203
  2570
      if( pLevel->iLeftJoin && !ExprHasProperty(pE, EP_FromJoin) ){
dvander@1203
  2571
        continue;
dvander@1203
  2572
      }
dvander@1203
  2573
      sqlite3ExprIfFalse(pParse, pE, cont, 1);
dvander@1203
  2574
      pTerm->flags |= TERM_CODED;
dvander@1203
  2575
    }
dvander@1203
  2576
dvander@1203
  2577
    /* For a LEFT OUTER JOIN, generate code that will record the fact that
dvander@1203
  2578
    ** at least one row of the right table has matched the left table.  
dvander@1203
  2579
    */
dvander@1203
  2580
    if( pLevel->iLeftJoin ){
dvander@1203
  2581
      pLevel->top = sqlite3VdbeCurrentAddr(v);
dvander@1203
  2582
      sqlite3VdbeAddOp(v, OP_MemInt, 1, pLevel->iLeftJoin);
dvander@1203
  2583
      VdbeComment((v, "# record LEFT JOIN hit"));
dvander@1203
  2584
      for(pTerm=wc.a, j=0; j<wc.nTerm; j++, pTerm++){
dvander@1203
  2585
        if( pTerm->flags & (TERM_VIRTUAL|TERM_CODED) ) continue;
dvander@1203
  2586
        if( (pTerm->prereqAll & notReady)!=0 ) continue;
dvander@1203
  2587
        assert( pTerm->pExpr );
dvander@1203
  2588
        sqlite3ExprIfFalse(pParse, pTerm->pExpr, cont, 1);
dvander@1203
  2589
        pTerm->flags |= TERM_CODED;
dvander@1203
  2590
      }
dvander@1203
  2591
    }
dvander@1203
  2592
  }
dvander@1203
  2593
dvander@1203
  2594
#ifdef SQLITE_TEST  /* For testing and debugging use only */
dvander@1203
  2595
  /* Record in the query plan information about the current table
dvander@1203
  2596
  ** and the index used to access it (if any).  If the table itself
dvander@1203
  2597
  ** is not used, its name is just '{}'.  If no index is used
dvander@1203
  2598
  ** the index is listed as "{}".  If the primary key is used the
dvander@1203
  2599
  ** index name is '*'.
dvander@1203
  2600
  */
dvander@1203
  2601
  for(i=0; i<pTabList->nSrc; i++){
dvander@1203
  2602
    char *z;
dvander@1203
  2603
    int n;
dvander@1203
  2604
    pLevel = &pWInfo->a[i];
dvander@1203
  2605
    pTabItem = &pTabList->a[pLevel->iFrom];
dvander@1203
  2606
    z = pTabItem->zAlias;
dvander@1203
  2607
    if( z==0 ) z = pTabItem->pTab->zName;
dvander@1203
  2608
    n = strlen(z);
dvander@1203
  2609
    if( n+nQPlan < sizeof(sqlite3_query_plan)-10 ){
dvander@1203
  2610
      if( pLevel->flags & WHERE_IDX_ONLY ){
dvander@1203
  2611
        memcpy(&sqlite3_query_plan[nQPlan], "{}", 2);
dvander@1203
  2612
        nQPlan += 2;
dvander@1203
  2613
      }else{
dvander@1203
  2614
        memcpy(&sqlite3_query_plan[nQPlan], z, n);
dvander@1203
  2615
        nQPlan += n;
dvander@1203
  2616
      }
dvander@1203
  2617
      sqlite3_query_plan[nQPlan++] = ' ';
dvander@1203
  2618
    }
dvander@1203
  2619
    if( pLevel->flags & (WHERE_ROWID_EQ|WHERE_ROWID_RANGE) ){
dvander@1203
  2620
      memcpy(&sqlite3_query_plan[nQPlan], "* ", 2);
dvander@1203
  2621
      nQPlan += 2;
dvander@1203
  2622
    }else if( pLevel->pIdx==0 ){
dvander@1203
  2623
      memcpy(&sqlite3_query_plan[nQPlan], "{} ", 3);
dvander@1203
  2624
      nQPlan += 3;
dvander@1203
  2625
    }else{
dvander@1203
  2626
      n = strlen(pLevel->pIdx->zName);
dvander@1203
  2627
      if( n+nQPlan < sizeof(sqlite3_query_plan)-2 ){
dvander@1203
  2628
        memcpy(&sqlite3_query_plan[nQPlan], pLevel->pIdx->zName, n);
dvander@1203
  2629
        nQPlan += n;
dvander@1203
  2630
        sqlite3_query_plan[nQPlan++] = ' ';
dvander@1203
  2631
      }
dvander@1203
  2632
    }
dvander@1203
  2633
  }
dvander@1203
  2634
  while( nQPlan>0 && sqlite3_query_plan[nQPlan-1]==' ' ){
dvander@1203
  2635
    sqlite3_query_plan[--nQPlan] = 0;
dvander@1203
  2636
  }
dvander@1203
  2637
  sqlite3_query_plan[nQPlan] = 0;
dvander@1203
  2638
  nQPlan = 0;
dvander@1203
  2639
#endif /* SQLITE_TEST // Testing and debugging use only */
dvander@1203
  2640
dvander@1203
  2641
  /* Record the continuation address in the WhereInfo structure.  Then
dvander@1203
  2642
  ** clean up and return.
dvander@1203
  2643
  */
dvander@1203
  2644
  pWInfo->iContinue = cont;
dvander@1203
  2645
  whereClauseClear(&wc);
dvander@1203
  2646
  return pWInfo;
dvander@1203
  2647
dvander@1203
  2648
  /* Jump here if malloc fails */
dvander@1203
  2649
whereBeginNoMem:
dvander@1203
  2650
  whereClauseClear(&wc);
dvander@1203
  2651
  whereInfoFree(pWInfo);
dvander@1203
  2652
  return 0;
dvander@1203
  2653
}
dvander@1203
  2654
dvander@1203
  2655
/*
dvander@1203
  2656
** Generate the end of the WHERE loop.  See comments on 
dvander@1203
  2657
** sqlite3WhereBegin() for additional information.
dvander@1203
  2658
*/
dvander@1203
  2659
void sqlite3WhereEnd(WhereInfo *pWInfo){
dvander@1203
  2660
  Vdbe *v = pWInfo->pParse->pVdbe;
dvander@1203
  2661
  int i;
dvander@1203
  2662
  WhereLevel *pLevel;
dvander@1203
  2663
  SrcList *pTabList = pWInfo->pTabList;
dvander@1203
  2664
dvander@1203
  2665
  /* Generate loop termination code.
dvander@1203
  2666
  */
dvander@1203
  2667
  for(i=pTabList->nSrc-1; i>=0; i--){
dvander@1203
  2668
    pLevel = &pWInfo->a[i];
dvander@1203
  2669
    sqlite3VdbeResolveLabel(v, pLevel->cont);
dvander@1203
  2670
    if( pLevel->op!=OP_Noop ){
dvander@1203
  2671
      sqlite3VdbeAddOp(v, pLevel->op, pLevel->p1, pLevel->p2);
dvander@1203
  2672
    }
dvander@1203
  2673
    if( pLevel->nIn ){
dvander@1203
  2674
      struct InLoop *pIn;
dvander@1203
  2675
      int j;
dvander@1203
  2676
      sqlite3VdbeResolveLabel(v, pLevel->nxt);
dvander@1203
  2677
      for(j=pLevel->nIn, pIn=&pLevel->aInLoop[j-1]; j>0; j--, pIn--){
dvander@1203
  2678
        sqlite3VdbeJumpHere(v, pIn->topAddr+1);
dvander@1203
  2679
        sqlite3VdbeAddOp(v, OP_Next, pIn->iCur, pIn->topAddr);
dvander@1203
  2680
        sqlite3VdbeJumpHere(v, pIn->topAddr-1);
dvander@1203
  2681
      }
dvander@1203
  2682
      sqliteFree(pLevel->aInLoop);
dvander@1203
  2683
    }
dvander@1203
  2684
    sqlite3VdbeResolveLabel(v, pLevel->brk);
dvander@1203
  2685
    if( pLevel->iLeftJoin ){
dvander@1203
  2686
      int addr;
dvander@1203
  2687
      addr = sqlite3VdbeAddOp(v, OP_IfMemPos, pLevel->iLeftJoin, 0);
dvander@1203
  2688
      sqlite3VdbeAddOp(v, OP_NullRow, pTabList->a[i].iCursor, 0);
dvander@1203
  2689
      if( pLevel->iIdxCur>=0 ){
dvander@1203
  2690
        sqlite3VdbeAddOp(v, OP_NullRow, pLevel->iIdxCur, 0);
dvander@1203
  2691
      }
dvander@1203
  2692
      sqlite3VdbeAddOp(v, OP_Goto, 0, pLevel->top);
dvander@1203
  2693
      sqlite3VdbeJumpHere(v, addr);
dvander@1203
  2694
    }
dvander@1203
  2695
  }
dvander@1203
  2696
dvander@1203
  2697
  /* The "break" point is here, just past the end of the outer loop.
dvander@1203
  2698
  ** Set it.
dvander@1203
  2699
  */
dvander@1203
  2700
  sqlite3VdbeResolveLabel(v, pWInfo->iBreak);
dvander@1203
  2701
dvander@1203
  2702
  /* Close all of the cursors that were opened by sqlite3WhereBegin.
dvander@1203
  2703
  */
dvander@1203
  2704
  for(i=0, pLevel=pWInfo->a; i<pTabList->nSrc; i++, pLevel++){
dvander@1203
  2705
    struct SrcList_item *pTabItem = &pTabList->a[pLevel->iFrom];
dvander@1203
  2706
    Table *pTab = pTabItem->pTab;
dvander@1203
  2707
    assert( pTab!=0 );
dvander@1203
  2708
    if( pTab->isEphem || pTab->pSelect ) continue;
dvander@1203
  2709
    if( (pLevel->flags & WHERE_IDX_ONLY)==0 ){
dvander@1203
  2710
      sqlite3VdbeAddOp(v, OP_Close, pTabItem->iCursor, 0);
dvander@1203
  2711
    }
dvander@1203
  2712
    if( pLevel->pIdx!=0 ){
dvander@1203
  2713
      sqlite3VdbeAddOp(v, OP_Close, pLevel->iIdxCur, 0);
dvander@1203
  2714
    }
dvander@1203
  2715
dvander@1203
  2716
    /* Make cursor substitutions for cases where we want to use
dvander@1203
  2717
    ** just the index and never reference the table.
dvander@1203
  2718
    ** 
dvander@1203
  2719
    ** Calls to the code generator in between sqlite3WhereBegin and
dvander@1203
  2720
    ** sqlite3WhereEnd will have created code that references the table
dvander@1203
  2721
    ** directly.  This loop scans all that code looking for opcodes
dvander@1203
  2722
    ** that reference the table and converts them into opcodes that
dvander@1203
  2723
    ** reference the index.
dvander@1203
  2724
    */
dvander@1203
  2725
    if( pLevel->flags & WHERE_IDX_ONLY ){
dvander@1203
  2726
      int k, j, last;
dvander@1203
  2727
      VdbeOp *pOp;
dvander@1203
  2728
      Index *pIdx = pLevel->pIdx;
dvander@1203
  2729
dvander@1203
  2730
      assert( pIdx!=0 );
dvander@1203
  2731
      pOp = sqlite3VdbeGetOp(v, pWInfo->iTop);
dvander@1203
  2732
      last = sqlite3VdbeCurrentAddr(v);
dvander@1203
  2733
      for(k=pWInfo->iTop; k<last; k++, pOp++){
dvander@1203
  2734
        if( pOp->p1!=pLevel->iTabCur ) continue;
dvander@1203
  2735
        if( pOp->opcode==OP_Column ){
dvander@1203
  2736
          pOp->p1 = pLevel->iIdxCur;
dvander@1203
  2737
          for(j=0; j<pIdx->nColumn; j++){
dvander@1203
  2738
            if( pOp->p2==pIdx->aiColumn[j] ){
dvander@1203
  2739
              pOp->p2 = j;
dvander@1203
  2740
              break;
dvander@1203
  2741
            }
dvander@1203
  2742
          }
dvander@1203
  2743
        }else if( pOp->opcode==OP_Rowid ){
dvander@1203
  2744
          pOp->p1 = pLevel->iIdxCur;
dvander@1203
  2745
          pOp->opcode = OP_IdxRowid;
dvander@1203
  2746
        }else if( pOp->opcode==OP_NullRow ){
dvander@1203
  2747
          pOp->opcode = OP_Noop;
dvander@1203
  2748
        }
dvander@1203
  2749
      }
dvander@1203
  2750
    }
dvander@1203
  2751
  }
dvander@1203
  2752
dvander@1203
  2753
  /* Final cleanup
dvander@1203
  2754
  */
dvander@1203
  2755
  whereInfoFree(pWInfo);
dvander@1203
  2756
  return;
dvander@1203
  2757
}