OpenCoverage

select.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/sqlite/src/src/select.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/*-
2** 2001 September 15-
3**-
4** The author disclaims copyright to this source code. In place of-
5** a legal notice, here is a blessing:-
6**-
7** May you do good and not evil.-
8** May you find forgiveness for yourself and forgive others.-
9** May you share freely, never taking more than you give.-
10**-
11*************************************************************************-
12** This file contains C code routines that are called by the parser-
13** to handle SELECT statements in SQLite.-
14*/-
15#include "sqliteInt.h"-
16-
17/*-
18** Trace output macros-
19*/-
20#if SELECTTRACE_ENABLED-
21/***/ int sqlite3SelectTrace = 0;-
22# define SELECTTRACE(K,P,S,X) \-
23 if(sqlite3SelectTrace&(K)) \-
24 sqlite3DebugPrintf("%u/%d/%p: ",(S)->selId,(P)->addrExplain,(S)),\-
25 sqlite3DebugPrintf X-
26#else-
27# define SELECTTRACE(K,P,S,X)-
28#endif-
29-
30-
31/*-
32** An instance of the following object is used to record information about-
33** how to process the DISTINCT keyword, to simplify passing that information-
34** into the selectInnerLoop() routine.-
35*/-
36typedef struct DistinctCtx DistinctCtx;-
37struct DistinctCtx {-
38 u8 isTnct; /* True if the DISTINCT keyword is present */-
39 u8 eTnctType; /* One of the WHERE_DISTINCT_* operators */-
40 int tabTnct; /* Ephemeral table used for DISTINCT processing */-
41 int addrTnct; /* Address of OP_OpenEphemeral opcode for tabTnct */-
42};-
43-
44/*-
45** An instance of the following object is used to record information about-
46** the ORDER BY (or GROUP BY) clause of query is being coded.-
47**-
48** The aDefer[] array is used by the sorter-references optimization. For-
49** example, assuming there is no index that can be used for the ORDER BY,-
50** for the query:-
51**-
52** SELECT a, bigblob FROM t1 ORDER BY a LIMIT 10;-
53**-
54** it may be more efficient to add just the "a" values to the sorter, and-
55** retrieve the associated "bigblob" values directly from table t1 as the-
56** 10 smallest "a" values are extracted from the sorter.-
57**-
58** When the sorter-reference optimization is used, there is one entry in the-
59** aDefer[] array for each database table that may be read as values are-
60** extracted from the sorter.-
61*/-
62typedef struct SortCtx SortCtx;-
63struct SortCtx {-
64 ExprList *pOrderBy; /* The ORDER BY (or GROUP BY clause) */-
65 int nOBSat; /* Number of ORDER BY terms satisfied by indices */-
66 int iECursor; /* Cursor number for the sorter */-
67 int regReturn; /* Register holding block-output return address */-
68 int labelBkOut; /* Start label for the block-output subroutine */-
69 int addrSortIndex; /* Address of the OP_SorterOpen or OP_OpenEphemeral */-
70 int labelDone; /* Jump here when done, ex: LIMIT reached */-
71 int labelOBLopt; /* Jump here when sorter is full */-
72 u8 sortFlags; /* Zero or more SORTFLAG_* bits */-
73#ifdef SQLITE_ENABLE_SORTER_REFERENCES-
74 u8 nDefer; /* Number of valid entries in aDefer[] */-
75 struct DeferredCsr {-
76 Table *pTab; /* Table definition */-
77 int iCsr; /* Cursor number for table */-
78 int nKey; /* Number of PK columns for table pTab (>=1) */-
79 } aDefer[4];-
80#endif-
81 struct RowLoadInfo *pDeferredRowLoad; /* Deferred row loading info or NULL */-
82};-
83#define SORTFLAG_UseSorter 0x01 /* Use SorterOpen instead of OpenEphemeral */-
84-
85/*-
86** Delete all the content of a Select structure. Deallocate the structure-
87** itself only if bFree is true.-
88*/-
89static void clearSelect(sqlite3 *db, Select *p, int bFree){-
90 while( p ){
pDescription
TRUEevaluated 1123277 times by 436 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 646948 times by 436 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
646948-1123277
91 Select *pPrior = p->pPrior;-
92 sqlite3ExprListDelete(db, p->pEList);-
93 sqlite3SrcListDelete(db, p->pSrc);-
94 sqlite3ExprDelete(db, p->pWhere);-
95 sqlite3ExprListDelete(db, p->pGroupBy);-
96 sqlite3ExprDelete(db, p->pHaving);-
97 sqlite3ExprListDelete(db, p->pOrderBy);-
98 sqlite3ExprDelete(db, p->pLimit);-
99#ifndef SQLITE_OMIT_WINDOWFUNC-
100 if( OK_IF_ALWAYS_TRUE(p->pWinDefn) ){
(p->pWinDefn)Description
TRUEevaluated 125 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1123152 times by 436 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
125-1123152
101 sqlite3WindowListDelete(db, p->pWinDefn);-
102 }
executed 125 times by 1 test: end of block
Executed by:
  • Self test (438)
125
103#endif-
104 if( OK_IF_ALWAYS_TRUE(p->pWith) ) sqlite3WithDelete(db, p->pWith);
executed 1847 times by 1 test: sqlite3WithDelete(db, p->pWith);
Executed by:
  • Self test (438)
(p->pWith)Description
TRUEevaluated 1847 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1121430 times by 436 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
1847-1121430
105 if( bFree ) sqlite3DbFreeNN(db, p);
executed 1123125 times by 436 tests: sqlite3DbFreeNN(db, p);
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
bFreeDescription
TRUEevaluated 1123125 times by 436 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 152 times by 1 test
Evaluated by:
  • Self test (438)
152-1123125
106 p = pPrior;-
107 bFree = 1;-
108 }
executed 1123277 times by 436 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
1123277
109}
executed 646948 times by 436 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
646948
110-
111/*-
112** Initialize a SelectDest structure.-
113*/-
114void sqlite3SelectDestInit(SelectDest *pDest, int eDest, int iParm){-
115 pDest->eDest = (u8)eDest;-
116 pDest->iSDParm = iParm;-
117 pDest->zAffSdst = 0;-
118 pDest->iSdst = 0;-
119 pDest->nSdst = 0;-
120}
executed 97671 times by 9 tests: end of block
Executed by:
  • Self test
  • Self test (101)
  • Self test (32)
  • Self test (33)
  • Self test (34)
  • Self test (438)
  • Self test (57)
  • Self test (58)
  • Self test (64)
97671
121-
122-
123/*-
124** Allocate a new Select structure and return a pointer to that-
125** structure.-
126*/-
127Select *sqlite3SelectNew(-
128 Parse *pParse, /* Parsing context */-
129 ExprList *pEList, /* which columns to include in the result */-
130 SrcList *pSrc, /* the FROM clause -- which tables to scan */-
131 Expr *pWhere, /* the WHERE clause */-
132 ExprList *pGroupBy, /* the GROUP BY clause */-
133 Expr *pHaving, /* the HAVING clause */-
134 ExprList *pOrderBy, /* the ORDER BY clause */-
135 u32 selFlags, /* Flag parameters, such as SF_Distinct */-
136 Expr *pLimit /* LIMIT value. NULL means not used */-
137){-
138 Select *pNew;-
139 Select standin;-
140 pNew = sqlite3DbMallocRawNN(pParse->db, sizeof(*pNew) );-
141 if( pNew==0 ){
pNew==0Description
TRUEevaluated 152 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 599397 times by 436 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
152-599397
142 assert( pParse->db->mallocFailed );-
143 pNew = &standin;-
144 }
executed 152 times by 1 test: end of block
Executed by:
  • Self test (438)
152
145 if( pEList==0 ){
pEList==0Description
TRUEevaluated 1197 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 598352 times by 436 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
1197-598352
146 pEList = sqlite3ExprListAppend(pParse, 0,-
147 sqlite3Expr(pParse->db,TK_ASTERISK,0));-
148 }
executed 1197 times by 1 test: end of block
Executed by:
  • Self test (438)
1197
149 pNew->pEList = pEList;-
150 pNew->op = TK_SELECT;-
151 pNew->selFlags = selFlags;-
152 pNew->iLimit = 0;-
153 pNew->iOffset = 0;-
154 pNew->selId = ++pParse->nSelect;-
155 pNew->addrOpenEphm[0] = -1;-
156 pNew->addrOpenEphm[1] = -1;-
157 pNew->nSelectRow = 0;-
158 if( pSrc==0 ) pSrc = sqlite3DbMallocZero(pParse->db, sizeof(*pSrc));
executed 376566 times by 59 tests: pSrc = sqlite3DbMallocZero(pParse->db, sizeof(*pSrc));
Executed by:
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (24)
  • Self test (26)
  • Self test (27)
  • Self test (28)
  • Self test (29)
  • Self test (3)
  • Self test (31)
  • Self test (32)
  • Self test (33)
  • ...
pSrc==0Description
TRUEevaluated 376566 times by 59 tests
Evaluated by:
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (24)
  • Self test (26)
  • Self test (27)
  • Self test (28)
  • Self test (29)
  • Self test (3)
  • Self test (31)
  • Self test (32)
  • Self test (33)
  • ...
FALSEevaluated 222983 times by 436 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
222983-376566
159 pNew->pSrc = pSrc;-
160 pNew->pWhere = pWhere;-
161 pNew->pGroupBy = pGroupBy;-
162 pNew->pHaving = pHaving;-
163 pNew->pOrderBy = pOrderBy;-
164 pNew->pPrior = 0;-
165 pNew->pNext = 0;-
166 pNew->pLimit = pLimit;-
167 pNew->pWith = 0;-
168#ifndef SQLITE_OMIT_WINDOWFUNC-
169 pNew->pWin = 0;-
170 pNew->pWinDefn = 0;-
171#endif-
172 if( pParse->db->mallocFailed ) {
pParse->db->mallocFailedDescription
TRUEevaluated 160 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 599389 times by 436 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
160-599389
173 clearSelect(pParse->db, pNew, pNew!=&standin);-
174 pNew = 0;-
175 }else{
executed 160 times by 1 test: end of block
Executed by:
  • Self test (438)
160
176 assert( pNew->pSrc!=0 || pParse->nErr>0 );-
177 }
executed 599389 times by 436 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
599389
178 assert( pNew!=&standin );-
179 return pNew;
executed 599549 times by 436 tests: return pNew;
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
599549
180}-
181-
182-
183/*-
184** Delete the given Select structure and all of its substructures.-
185*/-
186void sqlite3SelectDelete(sqlite3 *db, Select *p){-
187 if( OK_IF_ALWAYS_TRUE(p) ) clearSelect(db, p, 1);
executed 646788 times by 436 tests: clearSelect(db, p, 1);
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
(p)Description
TRUEevaluated 646788 times by 436 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 1010929 times by 436 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
646788-1010929
188}
executed 1657717 times by 436 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
1657717
189-
190/*-
191** Return a pointer to the right-most SELECT statement in a compound.-
192*/-
193static Select *findRightmost(Select *p){-
194 while( p->pNext ) p = p->pNext;
executed 489 times by 1 test: p = p->pNext;
Executed by:
  • Self test (438)
p->pNextDescription
TRUEevaluated 489 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 38059 times by 1 test
Evaluated by:
  • Self test (438)
489-38059
195 return p;
executed 38059 times by 1 test: return p;
Executed by:
  • Self test (438)
38059
196}-
197-
198/*-
199** Given 1 to 3 identifiers preceding the JOIN keyword, determine the-
200** type of join. Return an integer constant that expresses that type-
201** in terms of the following bit values:-
202**-
203** JT_INNER-
204** JT_CROSS-
205** JT_OUTER-
206** JT_NATURAL-
207** JT_LEFT-
208** JT_RIGHT-
209**-
210** A full outer join is the combination of JT_LEFT and JT_RIGHT.-
211**-
212** If an illegal or unsupported join type is seen, then still return-
213** a join type, but put an error in the pParse structure.-
214*/-
215int sqlite3JoinType(Parse *pParse, Token *pA, Token *pB, Token *pC){-
216 int jointype = 0;-
217 Token *apAll[3];-
218 Token *p;-
219 /* 0123456789 123456789 123456789 123 */-
220 static const char zKeyText[] = "naturaleftouterightfullinnercross";-
221 static const struct {-
222 u8 i; /* Beginning of keyword text in zKeyText[] */-
223 u8 nChar; /* Length of the keyword in characters */-
224 u8 code; /* Join type mask */-
225 } aKeyword[] = {-
226 /* natural */ { 0, 7, JT_NATURAL },-
227 /* left */ { 6, 4, JT_LEFT|JT_OUTER },-
228 /* outer */ { 10, 5, JT_OUTER },-
229 /* right */ { 14, 5, JT_RIGHT|JT_OUTER },-
230 /* full */ { 19, 4, JT_LEFT|JT_RIGHT|JT_OUTER },-
231 /* inner */ { 23, 5, JT_INNER },-
232 /* cross */ { 28, 5, JT_INNER|JT_CROSS },-
233 };-
234 int i, j;-
235 apAll[0] = pA;-
236 apAll[1] = pB;-
237 apAll[2] = pC;-
238 for(i=0; i<3 && apAll[i]; i++){
i<3Description
TRUEevaluated 2694 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 18 times by 1 test
Evaluated by:
  • Self test (438)
apAll[i]Description
TRUEevaluated 1445 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1249 times by 1 test
Evaluated by:
  • Self test (438)
18-2694
239 p = apAll[i];-
240 for(j=0; j<ArraySize(aKeyword); j++){
j<((int)(sizeo...aKeyword[0])))Description
TRUEevaluated 3720 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 4 times by 1 test
Evaluated by:
  • Self test (438)
4-3720
241 if( p->n==aKeyword[j].nChar
p->n==aKeyword[j].nCharDescription
TRUEevaluated 2214 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1506 times by 1 test
Evaluated by:
  • Self test (438)
1506-2214
242 && sqlite3StrNICmp((char*)p->z, &zKeyText[aKeyword[j].i], p->n)==0 ){
sqlite3_strnic...].i], p->n)==0Description
TRUEevaluated 1441 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 773 times by 1 test
Evaluated by:
  • Self test (438)
773-1441
243 jointype |= aKeyword[j].code;-
244 break;
executed 1441 times by 1 test: break;
Executed by:
  • Self test (438)
1441
245 }-
246 }
executed 2279 times by 1 test: end of block
Executed by:
  • Self test (438)
2279
247 testcase( j==0 || j==1 || j==2 || j==3 || j==4 || j==5 || j==6 );-
248 if( j>=ArraySize(aKeyword) ){
j>=((int)(size...aKeyword[0])))Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1441 times by 1 test
Evaluated by:
  • Self test (438)
4-1441
249 jointype |= JT_ERROR;-
250 break;
executed 4 times by 1 test: break;
Executed by:
  • Self test (438)
4
251 }-
252 }
executed 1441 times by 1 test: end of block
Executed by:
  • Self test (438)
1441
253 if(-
254 (jointype & (JT_INNER|JT_OUTER))==(JT_INNER|JT_OUTER) ||
(jointype & (0...0x0001|0x0020)Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1267 times by 1 test
Evaluated by:
  • Self test (438)
4-1267
255 (jointype & JT_ERROR)!=0
(jointype & 0x0040)!=0Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1263 times by 1 test
Evaluated by:
  • Self test (438)
4-1263
256 ){-
257 const char *zSp = " ";-
258 assert( pB!=0 );-
259 if( pC==0 ){ zSp++; }
executed 4 times by 1 test: end of block
Executed by:
  • Self test (438)
pC==0Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 4 times by 1 test
Evaluated by:
  • Self test (438)
4
260 sqlite3ErrorMsg(pParse, "unknown or unsupported join type: "-
261 "%T %T%s%T", pA, pB, zSp, pC);-
262 jointype = JT_INNER;-
263 }else if( (jointype & JT_OUTER)!=0
executed 8 times by 1 test: end of block
Executed by:
  • Self test (438)
(jointype & 0x0020)!=0Description
TRUEevaluated 499 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 764 times by 1 test
Evaluated by:
  • Self test (438)
8-764
264 && (jointype & (JT_LEFT|JT_RIGHT))!=JT_LEFT ){
(jointype & (0...0010))!=0x0008Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 497 times by 1 test
Evaluated by:
  • Self test (438)
2-497
265 sqlite3ErrorMsg(pParse, -
266 "RIGHT and FULL OUTER JOINs are not currently supported");-
267 jointype = JT_INNER;-
268 }
executed 2 times by 1 test: end of block
Executed by:
  • Self test (438)
2
269 return jointype;
executed 1271 times by 1 test: return jointype;
Executed by:
  • Self test (438)
1271
270}-
271-
272/*-
273** Return the index of a column in a table. Return -1 if the column-
274** is not contained in the table.-
275*/-
276static int columnIndex(Table *pTab, const char *zCol){-
277 int i;-
278 for(i=0; i<pTab->nCol; i++){
i<pTab->nColDescription
TRUEevaluated 5667 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 936 times by 1 test
Evaluated by:
  • Self test (438)
936-5667
279 if( sqlite3StrICmp(pTab->aCol[i].zName, zCol)==0 ) return i;
executed 2396 times by 1 test: return i;
Executed by:
  • Self test (438)
sqlite3StrICmp...Name, zCol)==0Description
TRUEevaluated 2396 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 3271 times by 1 test
Evaluated by:
  • Self test (438)
2396-3271
280 }
executed 3271 times by 1 test: end of block
Executed by:
  • Self test (438)
3271
281 return -1;
executed 936 times by 1 test: return -1;
Executed by:
  • Self test (438)
936
282}-
283-
284/*-
285** Search the first N tables in pSrc, from left to right, looking for a-
286** table that has a column named zCol. -
287**-
288** When found, set *piTab and *piCol to the table index and column index-
289** of the matching column and return TRUE.-
290**-
291** If not found, return FALSE.-
292*/-
293static int tableAndColumnIndex(-
294 SrcList *pSrc, /* Array of tables to search */-
295 int N, /* Number of tables in pSrc->a[] to search */-
296 const char *zCol, /* Name of the column we are looking for */-
297 int *piTab, /* Write index of pSrc->a[] here */-
298 int *piCol /* Write index of pSrc->a[*piTab].pTab->aCol[] here */-
299){-
300 int i; /* For looping over tables in pSrc */-
301 int iCol; /* Index of column matching zCol */-
302-
303 assert( (piTab==0)==(piCol==0) ); /* Both or neither are NULL */-
304 for(i=0; i<N; i++){
i<NDescription
TRUEevaluated 2684 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 695 times by 1 test
Evaluated by:
  • Self test (438)
695-2684
305 iCol = columnIndex(pSrc->a[i].pTab, zCol);-
306 if( iCol>=0 ){
iCol>=0Description
TRUEevaluated 1753 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 931 times by 1 test
Evaluated by:
  • Self test (438)
931-1753
307 if( piTab ){
piTabDescription
TRUEevaluated 1361 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 392 times by 1 test
Evaluated by:
  • Self test (438)
392-1361
308 *piTab = i;-
309 *piCol = iCol;-
310 }
executed 1361 times by 1 test: end of block
Executed by:
  • Self test (438)
1361
311 return 1;
executed 1753 times by 1 test: return 1;
Executed by:
  • Self test (438)
1753
312 }-
313 }
executed 931 times by 1 test: end of block
Executed by:
  • Self test (438)
931
314 return 0;
executed 695 times by 1 test: return 0;
Executed by:
  • Self test (438)
695
315}-
316-
317/*-
318** This function is used to add terms implied by JOIN syntax to the-
319** WHERE clause expression of a SELECT statement. The new term, which-
320** is ANDed with the existing WHERE clause, is of the form:-
321**-
322** (tab1.col1 = tab2.col2)-
323**-
324** where tab1 is the iSrc'th table in SrcList pSrc and tab2 is the -
325** (iSrc+1)'th. Column col1 is column iColLeft of tab1, and col2 is-
326** column iColRight of tab2.-
327*/-
328static void addWhereTerm(-
329 Parse *pParse, /* Parsing context */-
330 SrcList *pSrc, /* List of tables in FROM clause */-
331 int iLeft, /* Index of first table to join in pSrc */-
332 int iColLeft, /* Index of column in first table */-
333 int iRight, /* Index of second table in pSrc */-
334 int iColRight, /* Index of column in second table */-
335 int isOuterJoin, /* True if this is an OUTER join */-
336 Expr **ppWhere /* IN/OUT: The WHERE clause to add to */-
337){-
338 sqlite3 *db = pParse->db;-
339 Expr *pE1;-
340 Expr *pE2;-
341 Expr *pEq;-
342-
343 assert( iLeft<iRight );-
344 assert( pSrc->nSrc>iRight );-
345 assert( pSrc->a[iLeft].pTab );-
346 assert( pSrc->a[iRight].pTab );-
347-
348 pE1 = sqlite3CreateColumnExpr(db, pSrc, iLeft, iColLeft);-
349 pE2 = sqlite3CreateColumnExpr(db, pSrc, iRight, iColRight);-
350-
351 pEq = sqlite3PExpr(pParse, TK_EQ, pE1, pE2);-
352 if( pEq && isOuterJoin ){
pEqDescription
TRUEevaluated 1361 times by 1 test
Evaluated by:
  • Self test (438)
FALSEnever evaluated
isOuterJoinDescription
TRUEevaluated 138 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1223 times by 1 test
Evaluated by:
  • Self test (438)
0-1361
353 ExprSetProperty(pEq, EP_FromJoin);-
354 assert( !ExprHasProperty(pEq, EP_TokenOnly|EP_Reduced) );-
355 ExprSetVVAProperty(pEq, EP_NoReduce);-
356 pEq->iRightJoinTable = (i16)pE2->iTable;-
357 }
executed 138 times by 1 test: end of block
Executed by:
  • Self test (438)
138
358 *ppWhere = sqlite3ExprAnd(db, *ppWhere, pEq);-
359}
executed 1361 times by 1 test: end of block
Executed by:
  • Self test (438)
1361
360-
361/*-
362** Set the EP_FromJoin property on all terms of the given expression.-
363** And set the Expr.iRightJoinTable to iTable for every term in the-
364** expression.-
365**-
366** The EP_FromJoin property is used on terms of an expression to tell-
367** the LEFT OUTER JOIN processing logic that this term is part of the-
368** join restriction specified in the ON or USING clause and not a part-
369** of the more general WHERE clause. These terms are moved over to the-
370** WHERE clause during join processing but we need to remember that they-
371** originated in the ON or USING clause.-
372**-
373** The Expr.iRightJoinTable tells the WHERE clause processing that the-
374** expression depends on table iRightJoinTable even if that table is not-
375** explicitly mentioned in the expression. That information is needed-
376** for cases like this:-
377**-
378** SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.b AND t1.x=5-
379**-
380** The where clause needs to defer the handling of the t1.x=5-
381** term until after the t2 loop of the join. In that way, a-
382** NULL t2 row will be inserted whenever t1.x!=5. If we do not-
383** defer the handling of t1.x=5, it will be processed immediately-
384** after the t1 loop and rows with t1.x!=5 will never appear in-
385** the output, which is incorrect.-
386*/-
387static void setJoinExpr(Expr *p, int iTable){-
388 while( p ){
pDescription
TRUEevaluated 2288 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 2664 times by 1 test
Evaluated by:
  • Self test (438)
2288-2664
389 ExprSetProperty(p, EP_FromJoin);-
390 assert( !ExprHasProperty(p, EP_TokenOnly|EP_Reduced) );-
391 ExprSetVVAProperty(p, EP_NoReduce);-
392 p->iRightJoinTable = (i16)iTable;-
393 if( p->op==TK_FUNCTION && p->x.pList ){
p->op==157Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 2284 times by 1 test
Evaluated by:
  • Self test (438)
p->x.pListDescription
TRUEevaluated 4 times by 1 test
Evaluated by:
  • Self test (438)
FALSEnever evaluated
0-2284
394 int i;-
395 for(i=0; i<p->x.pList->nExpr; i++){
i<p->x.pList->nExprDescription
TRUEevaluated 7 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 4 times by 1 test
Evaluated by:
  • Self test (438)
4-7
396 setJoinExpr(p->x.pList->a[i].pExpr, iTable);-
397 }
executed 7 times by 1 test: end of block
Executed by:
  • Self test (438)
7
398 }
executed 4 times by 1 test: end of block
Executed by:
  • Self test (438)
4
399 setJoinExpr(p->pLeft, iTable);-
400 p = p->pRight;-
401 }
executed 2288 times by 1 test: end of block
Executed by:
  • Self test (438)
2288
402}
executed 2664 times by 1 test: end of block
Executed by:
  • Self test (438)
2664
403-
404/* Undo the work of setJoinExpr(). In the expression tree p, convert every-
405** term that is marked with EP_FromJoin and iRightJoinTable==iTable into-
406** an ordinary term that omits the EP_FromJoin mark.-
407**-
408** This happens when a LEFT JOIN is simplified into an ordinary JOIN.-
409*/-
410static void unsetJoinExpr(Expr *p, int iTable){-
411 while( p ){
pDescription
TRUEevaluated 557 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 715 times by 1 test
Evaluated by:
  • Self test (438)
557-715
412 if( ExprHasProperty(p, EP_FromJoin)
(((p)->flags&(0x000001))!=0)Description
TRUEevaluated 62 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 495 times by 1 test
Evaluated by:
  • Self test (438)
62-495
413 && (iTable<0 || p->iRightJoinTable==iTable) ){
iTable<0Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 59 times by 1 test
Evaluated by:
  • Self test (438)
p->iRightJoinTable==iTableDescription
TRUEevaluated 56 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 3 times by 1 test
Evaluated by:
  • Self test (438)
3-59
414 ExprClearProperty(p, EP_FromJoin);-
415 }
executed 59 times by 1 test: end of block
Executed by:
  • Self test (438)
59
416 if( p->op==TK_FUNCTION && p->x.pList ){
p->op==157Description
TRUEevaluated 14 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 543 times by 1 test
Evaluated by:
  • Self test (438)
p->x.pListDescription
TRUEevaluated 14 times by 1 test
Evaluated by:
  • Self test (438)
FALSEnever evaluated
0-543
417 int i;-
418 for(i=0; i<p->x.pList->nExpr; i++){
i<p->x.pList->nExprDescription
TRUEevaluated 26 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 14 times by 1 test
Evaluated by:
  • Self test (438)
14-26
419 unsetJoinExpr(p->x.pList->a[i].pExpr, iTable);-
420 }
executed 26 times by 1 test: end of block
Executed by:
  • Self test (438)
26
421 }
executed 14 times by 1 test: end of block
Executed by:
  • Self test (438)
14
422 unsetJoinExpr(p->pLeft, iTable);-
423 p = p->pRight;-
424 }
executed 557 times by 1 test: end of block
Executed by:
  • Self test (438)
557
425}
executed 715 times by 1 test: end of block
Executed by:
  • Self test (438)
715
426-
427/*-
428** This routine processes the join information for a SELECT statement.-
429** ON and USING clauses are converted into extra terms of the WHERE clause.-
430** NATURAL joins also create extra WHERE clause terms.-
431**-
432** The terms of a FROM clause are contained in the Select.pSrc structure.-
433** The left most table is the first entry in Select.pSrc. The right-most-
434** table is the last entry. The join operator is held in the entry to-
435** the left. Thus entry 0 contains the join operator for the join between-
436** entries 0 and 1. Any ON or USING clauses associated with the join are-
437** also attached to the left entry.-
438**-
439** This routine returns the number of errors encountered.-
440*/-
441static int sqliteProcessJoin(Parse *pParse, Select *p){-
442 SrcList *pSrc; /* All tables in the FROM clause */-
443 int i, j; /* Loop counters */-
444 struct SrcList_item *pLeft; /* Left table being joined */-
445 struct SrcList_item *pRight; /* Right table being joined */-
446-
447 pSrc = p->pSrc;-
448 pLeft = &pSrc->a[0];-
449 pRight = &pLeft[1];-
450 for(i=0; i<pSrc->nSrc-1; i++, pRight++, pLeft++){
i<pSrc->nSrc-1Description
TRUEevaluated 79439 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1006823 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
79439-1006823
451 Table *pRightTab = pRight->pTab;-
452 int isOuter;-
453-
454 if( NEVER(pLeft->pTab==0 || pRightTab==0) ) continue;
never executed: continue;
pLeft->pTab==0Description
TRUEnever evaluated
FALSEevaluated 79439 times by 1 test
Evaluated by:
  • Self test (438)
pRightTab==0Description
TRUEnever evaluated
FALSEevaluated 79439 times by 1 test
Evaluated by:
  • Self test (438)
0-79439
455 isOuter = (pRight->fg.jointype & JT_OUTER)!=0;-
456-
457 /* When the NATURAL keyword is present, add WHERE clause terms for-
458 ** every column that the two tables have in common.-
459 */-
460 if( pRight->fg.jointype & JT_NATURAL ){
pRight->fg.jointype & 0x0004Description
TRUEevaluated 587 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 78852 times by 1 test
Evaluated by:
  • Self test (438)
587-78852
461 if( pRight->pOn || pRight->pUsing ){
pRight->pOnDescription
TRUEevaluated 4 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 583 times by 1 test
Evaluated by:
  • Self test (438)
pRight->pUsingDescription
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 580 times by 1 test
Evaluated by:
  • Self test (438)
3-583
462 sqlite3ErrorMsg(pParse, "a NATURAL join may not have "-
463 "an ON or USING clause", 0);-
464 return 1;
executed 7 times by 1 test: return 1;
Executed by:
  • Self test (438)
7
465 }-
466 for(j=0; j<pRightTab->nCol; j++){
j<pRightTab->nColDescription
TRUEevaluated 1218 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 580 times by 1 test
Evaluated by:
  • Self test (438)
580-1218
467 char *zName; /* Name of column in the right table */-
468 int iLeft; /* Matching left table */-
469 int iLeftCol; /* Matching column in the left table */-
470-
471 zName = pRightTab->aCol[j].zName;-
472 if( tableAndColumnIndex(pSrc, i+1, zName, &iLeft, &iLeftCol) ){
tableAndColumn...ft, &iLeftCol)Description
TRUEevaluated 719 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 499 times by 1 test
Evaluated by:
  • Self test (438)
499-719
473 addWhereTerm(pParse, pSrc, iLeft, iLeftCol, i+1, j,-
474 isOuter, &p->pWhere);-
475 }
executed 719 times by 1 test: end of block
Executed by:
  • Self test (438)
719
476 }
executed 1218 times by 1 test: end of block
Executed by:
  • Self test (438)
1218
477 }
executed 580 times by 1 test: end of block
Executed by:
  • Self test (438)
580
478-
479 /* Disallow both ON and USING clauses in the same join-
480 */-
481 if( pRight->pOn && pRight->pUsing ){
pRight->pOnDescription
TRUEevaluated 1885 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 77547 times by 1 test
Evaluated by:
  • Self test (438)
pRight->pUsingDescription
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1882 times by 1 test
Evaluated by:
  • Self test (438)
3-77547
482 sqlite3ErrorMsg(pParse, "cannot have both ON and USING "-
483 "clauses in the same join");-
484 return 1;
executed 3 times by 1 test: return 1;
Executed by:
  • Self test (438)
3
485 }-
486-
487 /* Add the ON clause to the end of the WHERE clause, connected by-
488 ** an AND operator.-
489 */-
490 if( pRight->pOn ){
pRight->pOnDescription
TRUEevaluated 1882 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 77547 times by 1 test
Evaluated by:
  • Self test (438)
1882-77547
491 if( isOuter ) setJoinExpr(pRight->pOn, pRight->iCursor);
executed 347 times by 1 test: setJoinExpr(pRight->pOn, pRight->iCursor);
Executed by:
  • Self test (438)
isOuterDescription
TRUEevaluated 347 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1535 times by 1 test
Evaluated by:
  • Self test (438)
347-1535
492 p->pWhere = sqlite3ExprAnd(pParse->db, p->pWhere, pRight->pOn);-
493 pRight->pOn = 0;-
494 }
executed 1882 times by 1 test: end of block
Executed by:
  • Self test (438)
1882
495-
496 /* Create extra terms on the WHERE clause for each column named-
497 ** in the USING clause. Example: If the two tables to be joined are -
498 ** A and B and the USING clause names X, Y, and Z, then add this-
499 ** to the WHERE clause: A.X=B.X AND A.Y=B.Y AND A.Z=B.Z-
500 ** Report an error if any column mentioned in the USING clause is-
501 ** not contained in both tables to be joined.-
502 */-
503 if( pRight->pUsing ){
pRight->pUsingDescription
TRUEevaluated 613 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 78816 times by 1 test
Evaluated by:
  • Self test (438)
613-78816
504 IdList *pList = pRight->pUsing;-
505 for(j=0; j<pList->nId; j++){
j<pList->nIdDescription
TRUEevaluated 648 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 607 times by 1 test
Evaluated by:
  • Self test (438)
607-648
506 char *zName; /* Name of the term in the USING clause */-
507 int iLeft; /* Table on the left with matching column name */-
508 int iLeftCol; /* Column number of matching column on the left */-
509 int iRightCol; /* Column number of matching column on the right */-
510-
511 zName = pList->a[j].zName;-
512 iRightCol = columnIndex(pRightTab, zName);-
513 if( iRightCol<0
iRightCol<0Description
TRUEevaluated 5 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 643 times by 1 test
Evaluated by:
  • Self test (438)
5-643
514 || !tableAndColumnIndex(pSrc, i+1, zName, &iLeft, &iLeftCol)
!tableAndColum...ft, &iLeftCol)Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 642 times by 1 test
Evaluated by:
  • Self test (438)
1-642
515 ){-
516 sqlite3ErrorMsg(pParse, "cannot join using column %s - column "-
517 "not present in both tables", zName);-
518 return 1;
executed 6 times by 1 test: return 1;
Executed by:
  • Self test (438)
6
519 }-
520 addWhereTerm(pParse, pSrc, iLeft, iLeftCol, i+1, iRightCol,-
521 isOuter, &p->pWhere);-
522 }
executed 642 times by 1 test: end of block
Executed by:
  • Self test (438)
642
523 }
executed 607 times by 1 test: end of block
Executed by:
  • Self test (438)
607
524 }
executed 79423 times by 1 test: end of block
Executed by:
  • Self test (438)
79423
525 return 0;
executed 1006823 times by 435 tests: return 0;
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
1006823
526}-
527-
528/*-
529** An instance of this object holds information (beyond pParse and pSelect)-
530** needed to load the next result row that is to be added to the sorter.-
531*/-
532typedef struct RowLoadInfo RowLoadInfo;-
533struct RowLoadInfo {-
534 int regResult; /* Store results in array of registers here */-
535 u8 ecelFlags; /* Flag argument to ExprCodeExprList() */-
536#ifdef SQLITE_ENABLE_SORTER_REFERENCES-
537 ExprList *pExtra; /* Extra columns needed by sorter refs */-
538 int regExtraResult; /* Where to load the extra columns */-
539#endif-
540};-
541-
542/*-
543** This routine does the work of loading query data into an array of-
544** registers so that it can be added to the sorter.-
545*/-
546static void innerLoopLoadRow(-
547 Parse *pParse, /* Statement under construction */-
548 Select *pSelect, /* The query being coded */-
549 RowLoadInfo *pInfo /* Info needed to complete the row load */-
550){-
551 sqlite3ExprCodeExprList(pParse, pSelect->pEList, pInfo->regResult,-
552 0, pInfo->ecelFlags);-
553#ifdef SQLITE_ENABLE_SORTER_REFERENCES-
554 if( pInfo->pExtra ){-
555 sqlite3ExprCodeExprList(pParse, pInfo->pExtra, pInfo->regExtraResult, 0, 0);-
556 sqlite3ExprListDelete(pParse->db, pInfo->pExtra);-
557 }-
558#endif-
559}
executed 374052 times by 435 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
374052
560-
561/*-
562** Code the OP_MakeRecord instruction that generates the entry to be-
563** added into the sorter.-
564**-
565** Return the register in which the result is stored.-
566*/-
567static int makeSorterRecord(-
568 Parse *pParse,-
569 SortCtx *pSort,-
570 Select *pSelect,-
571 int regBase,-
572 int nBase-
573){-
574 int nOBSat = pSort->nOBSat;-
575 Vdbe *v = pParse->pVdbe;-
576 int regOut = ++pParse->nMem;-
577 if( pSort->pDeferredRowLoad ){
pSort->pDeferredRowLoadDescription
TRUEevaluated 644 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 12482 times by 1 test
Evaluated by:
  • Self test (438)
644-12482
578 innerLoopLoadRow(pParse, pSelect, pSort->pDeferredRowLoad);-
579 }
executed 644 times by 1 test: end of block
Executed by:
  • Self test (438)
644
580 sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase+nOBSat, nBase-nOBSat, regOut);-
581 return regOut;
executed 13126 times by 1 test: return regOut;
Executed by:
  • Self test (438)
13126
582}-
583-
584/*-
585** Generate code that will push the record in registers regData-
586** through regData+nData-1 onto the sorter.-
587*/-
588static void pushOntoSorter(-
589 Parse *pParse, /* Parser context */-
590 SortCtx *pSort, /* Information about the ORDER BY clause */-
591 Select *pSelect, /* The whole SELECT statement */-
592 int regData, /* First register holding data to be sorted */-
593 int regOrigData, /* First register holding data before packing */-
594 int nData, /* Number of elements in the regData data array */-
595 int nPrefixReg /* No. of reg prior to regData available for use */-
596){-
597 Vdbe *v = pParse->pVdbe; /* Stmt under construction */-
598 int bSeq = ((pSort->sortFlags & SORTFLAG_UseSorter)==0);-
599 int nExpr = pSort->pOrderBy->nExpr; /* No. of ORDER BY terms */-
600 int nBase = nExpr + bSeq + nData; /* Fields in sorter record */-
601 int regBase; /* Regs for sorter record */-
602 int regRecord = 0; /* Assembled sorter record */-
603 int nOBSat = pSort->nOBSat; /* ORDER BY terms to skip */-
604 int op; /* Opcode to add sorter record to sorter */-
605 int iLimit; /* LIMIT counter */-
606 int iSkip = 0; /* End of the sorter insert loop */-
607-
608 assert( bSeq==0 || bSeq==1 );-
609-
610 /* Three cases:-
611 ** (1) The data to be sorted has already been packed into a Record-
612 ** by a prior OP_MakeRecord. In this case nData==1 and regData-
613 ** will be completely unrelated to regOrigData.-
614 ** (2) All output columns are included in the sort record. In that-
615 ** case regData==regOrigData.-
616 ** (3) Some output columns are omitted from the sort record due to-
617 ** the SQLITE_ENABLE_SORTER_REFERENCE optimization, or due to the-
618 ** SQLITE_ECEL_OMITREF optimization, or due to the -
619 ** SortCtx.pDeferredRowLoad optimiation. In any of these cases-
620 ** regOrigData is 0 to prevent this routine from trying to copy-
621 ** values that might not yet exist.-
622 */-
623 assert( nData==1 || regData==regOrigData || regOrigData==0 );-
624-
625 if( nPrefixReg ){
nPrefixRegDescription
TRUEevaluated 12979 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 147 times by 1 test
Evaluated by:
  • Self test (438)
147-12979
626 assert( nPrefixReg==nExpr+bSeq );-
627 regBase = regData - nPrefixReg;-
628 }else{
executed 12979 times by 1 test: end of block
Executed by:
  • Self test (438)
12979
629 regBase = pParse->nMem + 1;-
630 pParse->nMem += nBase;-
631 }
executed 147 times by 1 test: end of block
Executed by:
  • Self test (438)
147
632 assert( pSelect->iOffset==0 || pSelect->iLimit!=0 );-
633 iLimit = pSelect->iOffset ? pSelect->iOffset+1 : pSelect->iLimit;
pSelect->iOffsetDescription
TRUEevaluated 264 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 12862 times by 1 test
Evaluated by:
  • Self test (438)
264-12862
634 pSort->labelDone = sqlite3VdbeMakeLabel(v);-
635 sqlite3ExprCodeExprList(pParse, pSort->pOrderBy, regBase, regOrigData,-
636 SQLITE_ECEL_DUP | (regOrigData? SQLITE_ECEL_REF : 0));-
637 if( bSeq ){
bSeqDescription
TRUEevaluated 794 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 12332 times by 1 test
Evaluated by:
  • Self test (438)
794-12332
638 sqlite3VdbeAddOp2(v, OP_Sequence, pSort->iECursor, regBase+nExpr);-
639 }
executed 794 times by 1 test: end of block
Executed by:
  • Self test (438)
794
640 if( nPrefixReg==0 && nData>0 ){
nPrefixReg==0Description
TRUEevaluated 147 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 12979 times by 1 test
Evaluated by:
  • Self test (438)
nData>0Description
TRUEevaluated 99 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 48 times by 1 test
Evaluated by:
  • Self test (438)
48-12979
641 sqlite3ExprCodeMove(pParse, regData, regBase+nExpr+bSeq, nData);-
642 }
executed 99 times by 1 test: end of block
Executed by:
  • Self test (438)
99
643 if( nOBSat>0 ){
nOBSat>0Description
TRUEevaluated 319 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 12807 times by 1 test
Evaluated by:
  • Self test (438)
319-12807
644 int regPrevKey; /* The first nOBSat columns of the previous row */-
645 int addrFirst; /* Address of the OP_IfNot opcode */-
646 int addrJmp; /* Address of the OP_Jump opcode */-
647 VdbeOp *pOp; /* Opcode that opens the sorter */-
648 int nKey; /* Number of sorting key columns, including OP_Sequence */-
649 KeyInfo *pKI; /* Original KeyInfo on the sorter table */-
650-
651 regRecord = makeSorterRecord(pParse, pSort, pSelect, regBase, nBase);-
652 regPrevKey = pParse->nMem+1;-
653 pParse->nMem += pSort->nOBSat;-
654 nKey = nExpr - pSort->nOBSat + bSeq;-
655 if( bSeq ){
bSeqDescription
TRUEevaluated 78 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 241 times by 1 test
Evaluated by:
  • Self test (438)
78-241
656 addrFirst = sqlite3VdbeAddOp1(v, OP_IfNot, regBase+nExpr); -
657 }else{
executed 78 times by 1 test: end of block
Executed by:
  • Self test (438)
78
658 addrFirst = sqlite3VdbeAddOp1(v, OP_SequenceTest, pSort->iECursor);-
659 }
executed 241 times by 1 test: end of block
Executed by:
  • Self test (438)
241
660 VdbeCoverage(v);-
661 sqlite3VdbeAddOp3(v, OP_Compare, regPrevKey, regBase, pSort->nOBSat);-
662 pOp = sqlite3VdbeGetOp(v, pSort->addrSortIndex);-
663 if( pParse->db->mallocFailed ) return;
never executed: return;
pParse->db->mallocFailedDescription
TRUEnever evaluated
FALSEevaluated 319 times by 1 test
Evaluated by:
  • Self test (438)
0-319
664 pOp->p2 = nKey + nData;-
665 pKI = pOp->p4.pKeyInfo;-
666 memset(pKI->aSortOrder, 0, pKI->nKeyField); /* Makes OP_Jump testable */-
667 sqlite3VdbeChangeP4(v, -1, (char*)pKI, P4_KEYINFO);-
668 testcase( pKI->nAllField > pKI->nKeyField+2 );-
669 pOp->p4.pKeyInfo = sqlite3KeyInfoFromExprList(pParse,pSort->pOrderBy,nOBSat,-
670 pKI->nAllField-pKI->nKeyField-1);-
671 addrJmp = sqlite3VdbeCurrentAddr(v);-
672 sqlite3VdbeAddOp3(v, OP_Jump, addrJmp+1, 0, addrJmp+1); VdbeCoverage(v);-
673 pSort->labelBkOut = sqlite3VdbeMakeLabel(v);-
674 pSort->regReturn = ++pParse->nMem;-
675 sqlite3VdbeAddOp2(v, OP_Gosub, pSort->regReturn, pSort->labelBkOut);-
676 sqlite3VdbeAddOp1(v, OP_ResetSorter, pSort->iECursor);-
677 if( iLimit ){
iLimitDescription
TRUEevaluated 78 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 241 times by 1 test
Evaluated by:
  • Self test (438)
78-241
678 sqlite3VdbeAddOp2(v, OP_IfNot, iLimit, pSort->labelDone);-
679 VdbeCoverage(v);-
680 }
executed 78 times by 1 test: end of block
Executed by:
  • Self test (438)
78
681 sqlite3VdbeJumpHere(v, addrFirst);-
682 sqlite3ExprCodeMove(pParse, regBase, regPrevKey, pSort->nOBSat);-
683 sqlite3VdbeJumpHere(v, addrJmp);-
684 }
executed 319 times by 1 test: end of block
Executed by:
  • Self test (438)
319
685 if( iLimit ){
iLimitDescription
TRUEevaluated 794 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 12332 times by 1 test
Evaluated by:
  • Self test (438)
794-12332
686 /* At this point the values for the new sorter entry are stored-
687 ** in an array of registers. They need to be composed into a record-
688 ** and inserted into the sorter if either (a) there are currently-
689 ** less than LIMIT+OFFSET items or (b) the new record is smaller than -
690 ** the largest record currently in the sorter. If (b) is true and there-
691 ** are already LIMIT+OFFSET items in the sorter, delete the largest-
692 ** entry before inserting the new one. This way there are never more -
693 ** than LIMIT+OFFSET items in the sorter.-
694 **-
695 ** If the new record does not need to be inserted into the sorter,-
696 ** jump to the next iteration of the loop. If the pSort->labelOBLopt-
697 ** value is not zero, then it is a label of where to jump. Otherwise,-
698 ** just bypass the row insert logic. See the header comment on the-
699 ** sqlite3WhereOrderByLimitOptLabel() function for additional info.-
700 */-
701 int iCsr = pSort->iECursor;-
702 sqlite3VdbeAddOp2(v, OP_IfNotZero, iLimit, sqlite3VdbeCurrentAddr(v)+4);-
703 VdbeCoverage(v);-
704 sqlite3VdbeAddOp2(v, OP_Last, iCsr, 0);-
705 iSkip = sqlite3VdbeAddOp4Int(v, OP_IdxLE,-
706 iCsr, 0, regBase+nOBSat, nExpr-nOBSat);-
707 VdbeCoverage(v);-
708 sqlite3VdbeAddOp1(v, OP_Delete, iCsr);-
709 }
executed 794 times by 1 test: end of block
Executed by:
  • Self test (438)
794
710 if( regRecord==0 ){
regRecord==0Description
TRUEevaluated 12807 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 319 times by 1 test
Evaluated by:
  • Self test (438)
319-12807
711 regRecord = makeSorterRecord(pParse, pSort, pSelect, regBase, nBase);-
712 }
executed 12807 times by 1 test: end of block
Executed by:
  • Self test (438)
12807
713 if( pSort->sortFlags & SORTFLAG_UseSorter ){
pSort->sortFlags & 0x01Description
TRUEevaluated 12332 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 794 times by 1 test
Evaluated by:
  • Self test (438)
794-12332
714 op = OP_SorterInsert;-
715 }else{
executed 12332 times by 1 test: end of block
Executed by:
  • Self test (438)
12332
716 op = OP_IdxInsert;-
717 }
executed 794 times by 1 test: end of block
Executed by:
  • Self test (438)
794
718 sqlite3VdbeAddOp4Int(v, op, pSort->iECursor, regRecord,-
719 regBase+nOBSat, nBase-nOBSat);-
720 if( iSkip ){
iSkipDescription
TRUEevaluated 794 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 12332 times by 1 test
Evaluated by:
  • Self test (438)
794-12332
721 sqlite3VdbeChangeP2(v, iSkip,-
722 pSort->labelOBLopt ? pSort->labelOBLopt : sqlite3VdbeCurrentAddr(v));-
723 }
executed 794 times by 1 test: end of block
Executed by:
  • Self test (438)
794
724}
executed 13126 times by 1 test: end of block
Executed by:
  • Self test (438)
13126
725-
726/*-
727** Add code to implement the OFFSET-
728*/-
729static void codeOffset(-
730 Vdbe *v, /* Generate code into this VM */-
731 int iOffset, /* Register holding the offset counter */-
732 int iContinue /* Jump here to skip the current record */-
733){-
734 if( iOffset>0 ){
iOffset>0Description
TRUEevaluated 538 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 414809 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
538-414809
735 sqlite3VdbeAddOp3(v, OP_IfPos, iOffset, iContinue, 1); VdbeCoverage(v);-
736 VdbeComment((v, "OFFSET"));-
737 }
executed 538 times by 1 test: end of block
Executed by:
  • Self test (438)
538
738}
executed 415347 times by 435 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
415347
739-
740/*-
741** Add code that will check to make sure the N registers starting at iMem-
742** form a distinct entry. iTab is a sorting index that holds previously-
743** seen combinations of the N values. A new entry is made in iTab-
744** if the current N values are new.-
745**-
746** A jump to addrRepeat is made and the N+1 values are popped from the-
747** stack if the top N elements are not distinct.-
748*/-
749static void codeDistinct(-
750 Parse *pParse, /* Parsing and code generating context */-
751 int iTab, /* A sorting index used to test for distinctness */-
752 int addrRepeat, /* Jump to here if not distinct */-
753 int N, /* Number of elements */-
754 int iMem /* First element */-
755){-
756 Vdbe *v;-
757 int r1;-
758-
759 v = pParse->pVdbe;-
760 r1 = sqlite3GetTempReg(pParse);-
761 sqlite3VdbeAddOp4Int(v, OP_Found, iTab, addrRepeat, iMem, N); VdbeCoverage(v);-
762 sqlite3VdbeAddOp3(v, OP_MakeRecord, iMem, N, r1);-
763 sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iTab, r1, iMem, N);-
764 sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT);-
765 sqlite3ReleaseTempReg(pParse, r1);-
766}
executed 3416 times by 1 test: end of block
Executed by:
  • Self test (438)
3416
767-
768#ifdef SQLITE_ENABLE_SORTER_REFERENCES-
769/*-
770** This function is called as part of inner-loop generation for a SELECT-
771** statement with an ORDER BY that is not optimized by an index. It -
772** determines the expressions, if any, that the sorter-reference -
773** optimization should be used for. The sorter-reference optimization-
774** is used for SELECT queries like:-
775**-
776** SELECT a, bigblob FROM t1 ORDER BY a LIMIT 10-
777**-
778** If the optimization is used for expression "bigblob", then instead of-
779** storing values read from that column in the sorter records, the PK of-
780** the row from table t1 is stored instead. Then, as records are extracted from-
781** the sorter to return to the user, the required value of bigblob is-
782** retrieved directly from table t1. If the values are very large, this -
783** can be more efficient than storing them directly in the sorter records.-
784**-
785** The ExprList_item.bSorterRef flag is set for each expression in pEList -
786** for which the sorter-reference optimization should be enabled. -
787** Additionally, the pSort->aDefer[] array is populated with entries-
788** for all cursors required to evaluate all selected expressions. Finally.-
789** output variable (*ppExtra) is set to an expression list containing-
790** expressions for all extra PK values that should be stored in the-
791** sorter records.-
792*/-
793static void selectExprDefer(-
794 Parse *pParse, /* Leave any error here */-
795 SortCtx *pSort, /* Sorter context */-
796 ExprList *pEList, /* Expressions destined for sorter */-
797 ExprList **ppExtra /* Expressions to append to sorter record */-
798){-
799 int i;-
800 int nDefer = 0;-
801 ExprList *pExtra = 0;-
802 for(i=0; i<pEList->nExpr; i++){-
803 struct ExprList_item *pItem = &pEList->a[i];-
804 if( pItem->u.x.iOrderByCol==0 ){-
805 Expr *pExpr = pItem->pExpr;-
806 Table *pTab = pExpr->y.pTab;-
807 if( pExpr->op==TK_COLUMN && pExpr->iColumn>=0 && pTab && !IsVirtual(pTab)-
808 && (pTab->aCol[pExpr->iColumn].colFlags & COLFLAG_SORTERREF)-
809 ){-
810 int j;-
811 for(j=0; j<nDefer; j++){-
812 if( pSort->aDefer[j].iCsr==pExpr->iTable ) break;-
813 }-
814 if( j==nDefer ){-
815 if( nDefer==ArraySize(pSort->aDefer) ){-
816 continue;-
817 }else{-
818 int nKey = 1;-
819 int k;-
820 Index *pPk = 0;-
821 if( !HasRowid(pTab) ){-
822 pPk = sqlite3PrimaryKeyIndex(pTab);-
823 nKey = pPk->nKeyCol;-
824 }-
825 for(k=0; k<nKey; k++){-
826 Expr *pNew = sqlite3PExpr(pParse, TK_COLUMN, 0, 0);-
827 if( pNew ){-
828 pNew->iTable = pExpr->iTable;-
829 pNew->y.pTab = pExpr->y.pTab;-
830 pNew->iColumn = pPk ? pPk->aiColumn[k] : -1;-
831 pExtra = sqlite3ExprListAppend(pParse, pExtra, pNew);-
832 }-
833 }-
834 pSort->aDefer[nDefer].pTab = pExpr->y.pTab;-
835 pSort->aDefer[nDefer].iCsr = pExpr->iTable;-
836 pSort->aDefer[nDefer].nKey = nKey;-
837 nDefer++;-
838 }-
839 }-
840 pItem->bSorterRef = 1;-
841 }-
842 }-
843 }-
844 pSort->nDefer = (u8)nDefer;-
845 *ppExtra = pExtra;-
846}-
847#endif-
848-
849/*-
850** This routine generates the code for the inside of the inner loop-
851** of a SELECT.-
852**-
853** If srcTab is negative, then the p->pEList expressions-
854** are evaluated in order to get the data for this row. If srcTab is-
855** zero or more, then data is pulled from srcTab and p->pEList is used only -
856** to get the number of columns and the collation sequence for each column.-
857*/-
858static void selectInnerLoop(-
859 Parse *pParse, /* The parser context */-
860 Select *p, /* The complete select statement being coded */-
861 int srcTab, /* Pull data from this table if non-negative */-
862 SortCtx *pSort, /* If not NULL, info on how to process ORDER BY */-
863 DistinctCtx *pDistinct, /* If not NULL, info on how to process DISTINCT */-
864 SelectDest *pDest, /* How to dispose of the results */-
865 int iContinue, /* Jump here to continue with next row */-
866 int iBreak /* Jump here to break out of the inner loop */-
867){-
868 Vdbe *v = pParse->pVdbe;-
869 int i;-
870 int hasDistinct; /* True if the DISTINCT keyword is present */-
871 int eDest = pDest->eDest; /* How to dispose of results */-
872 int iParm = pDest->iSDParm; /* First argument to disposal method */-
873 int nResultCol; /* Number of result columns */-
874 int nPrefixReg = 0; /* Number of extra registers before regResult */-
875 RowLoadInfo sRowLoadInfo; /* Info for deferred row loading */-
876-
877 /* Usually, regResult is the first cell in an array of memory cells-
878 ** containing the current result row. In this case regOrig is set to the-
879 ** same value. However, if the results are being sent to the sorter, the-
880 ** values for any expressions that are also part of the sort-key are omitted-
881 ** from this array. In this case regOrig is set to zero. */-
882 int regResult; /* Start of memory holding current results */-
883 int regOrig; /* Start of memory holding full result (or 0) */-
884-
885 assert( v );-
886 assert( p->pEList!=0 );-
887 hasDistinct = pDistinct ? pDistinct->eTnctType : WHERE_DISTINCT_NOOP;
pDistinctDescription
TRUEevaluated 252634 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 161304 times by 4 tests
Evaluated by:
  • Self test (103)
  • Self test (104)
  • Self test (34)
  • Self test (438)
161304-252634
888 if( pSort && pSort->pOrderBy==0 ) pSort = 0;
executed 239508 times by 435 tests: pSort = 0;
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
pSortDescription
TRUEevaluated 252634 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 161304 times by 4 tests
Evaluated by:
  • Self test (103)
  • Self test (104)
  • Self test (34)
  • Self test (438)
pSort->pOrderBy==0Description
TRUEevaluated 239508 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 13126 times by 1 test
Evaluated by:
  • Self test (438)
13126-252634
889 if( pSort==0 && !hasDistinct ){
pSort==0Description
TRUEevaluated 400812 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 13126 times by 1 test
Evaluated by:
  • Self test (438)
!hasDistinctDescription
TRUEevaluated 400573 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 239 times by 1 test
Evaluated by:
  • Self test (438)
239-400812
890 assert( iContinue!=0 );-
891 codeOffset(v, p->iOffset, iContinue);-
892 }
executed 400573 times by 435 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
400573
893-
894 /* Pull the requested columns.-
895 */-
896 nResultCol = p->pEList->nExpr;-
897-
898 if( pDest->iSdst==0 ){
pDest->iSdst==0Description
TRUEevaluated 258532 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 155406 times by 6 tests
Evaluated by:
  • Self test (101)
  • Self test (32)
  • Self test (33)
  • Self test (34)
  • Self test (438)
  • Self test (64)
155406-258532
899 if( pSort ){
pSortDescription
TRUEevaluated 12979 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 245553 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
12979-245553
900 nPrefixReg = pSort->pOrderBy->nExpr;-
901 if( !(pSort->sortFlags & SORTFLAG_UseSorter) ) nPrefixReg++;
executed 653 times by 1 test: nPrefixReg++;
Executed by:
  • Self test (438)
!(pSort->sortFlags & 0x01)Description
TRUEevaluated 653 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 12326 times by 1 test
Evaluated by:
  • Self test (438)
653-12326
902 pParse->nMem += nPrefixReg;-
903 }
executed 12979 times by 1 test: end of block
Executed by:
  • Self test (438)
12979
904 pDest->iSdst = pParse->nMem+1;-
905 pParse->nMem += nResultCol;-
906 }else if( pDest->iSdst+nResultCol > pParse->nMem ){
executed 258532 times by 435 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
pDest->iSdst+n...> pParse->nMemDescription
TRUEevaluated 17751 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 137655 times by 6 tests
Evaluated by:
  • Self test (101)
  • Self test (32)
  • Self test (33)
  • Self test (34)
  • Self test (438)
  • Self test (64)
17751-258532
907 /* This is an error condition that can result, for example, when a SELECT-
908 ** on the right-hand side of an INSERT contains more result columns than-
909 ** there are columns in the table on the left. The error will be caught-
910 ** and reported later. But we need to make sure enough memory is allocated-
911 ** to avoid other spurious errors in the meantime. */-
912 pParse->nMem += nResultCol;-
913 }
executed 17751 times by 1 test: end of block
Executed by:
  • Self test (438)
17751
914 pDest->nSdst = nResultCol;-
915 regOrig = regResult = pDest->iSdst;-
916 if( srcTab>=0 ){
srcTab>=0Description
TRUEevaluated 36704 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 377234 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
36704-377234
917 for(i=0; i<nResultCol; i++){
i<nResultColDescription
TRUEevaluated 37043 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 36704 times by 1 test
Evaluated by:
  • Self test (438)
36704-37043
918 sqlite3VdbeAddOp3(v, OP_Column, srcTab, i, regResult+i);-
919 VdbeComment((v, "%s", p->pEList->a[i].zName));-
920 }
executed 37043 times by 1 test: end of block
Executed by:
  • Self test (438)
37043
921 }else if( eDest!=SRT_Exists ){
executed 36704 times by 1 test: end of block
Executed by:
  • Self test (438)
eDest!=3Description
TRUEevaluated 374052 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 3182 times by 1 test
Evaluated by:
  • Self test (438)
3182-374052
922#ifdef SQLITE_ENABLE_SORTER_REFERENCES-
923 ExprList *pExtra = 0;-
924#endif-
925 /* If the destination is an EXISTS(...) expression, the actual-
926 ** values returned by the SELECT are not required.-
927 */-
928 u8 ecelFlags; /* "ecel" is an abbreviation of "ExprCodeExprList" */-
929 ExprList *pEList;-
930 if( eDest==SRT_Mem || eDest==SRT_Output || eDest==SRT_Coroutine ){
eDest==10Description
TRUEevaluated 12256 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 361796 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
eDest==9Description
TRUEevaluated 177797 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 183999 times by 9 tests
Evaluated by:
  • Self test
  • Self test (101)
  • Self test (32)
  • Self test (33)
  • Self test (34)
  • Self test (438)
  • Self test (57)
  • Self test (58)
  • Self test (64)
eDest==13Description
TRUEevaluated 108857 times by 9 tests
Evaluated by:
  • Self test
  • Self test (101)
  • Self test (32)
  • Self test (33)
  • Self test (34)
  • Self test (438)
  • Self test (57)
  • Self test (58)
  • Self test (64)
FALSEevaluated 75142 times by 1 test
Evaluated by:
  • Self test (438)
12256-361796
931 ecelFlags = SQLITE_ECEL_DUP;-
932 }else{
executed 298910 times by 435 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
298910
933 ecelFlags = 0;-
934 }
executed 75142 times by 1 test: end of block
Executed by:
  • Self test (438)
75142
935 if( pSort && hasDistinct==0 && eDest!=SRT_EphemTab && eDest!=SRT_Table ){
pSortDescription
TRUEevaluated 13126 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 360926 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
hasDistinct==0Description
TRUEevaluated 13077 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 49 times by 1 test
Evaluated by:
  • Self test (438)
eDest!=12Description
TRUEevaluated 13075 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test (438)
eDest!=14Description
TRUEevaluated 13074 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test (438)
1-360926
936 /* For each expression in p->pEList that is a copy of an expression in-
937 ** the ORDER BY clause (pSort->pOrderBy), set the associated -
938 ** iOrderByCol value to one more than the index of the ORDER BY -
939 ** expression within the sort-key that pushOntoSorter() will generate.-
940 ** This allows the p->pEList field to be omitted from the sorted record,-
941 ** saving space and CPU cycles. */-
942 ecelFlags |= (SQLITE_ECEL_OMITREF|SQLITE_ECEL_REF);-
943-
944 for(i=pSort->nOBSat; i<pSort->pOrderBy->nExpr; i++){
i<pSort->pOrderBy->nExprDescription
TRUEevaluated 15890 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 13074 times by 1 test
Evaluated by:
  • Self test (438)
13074-15890
945 int j;-
946 if( (j = pSort->pOrderBy->a[i].u.x.iOrderByCol)>0 ){
(j = pSort->pO...iOrderByCol)>0Description
TRUEevaluated 7948 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 7942 times by 1 test
Evaluated by:
  • Self test (438)
7942-7948
947 p->pEList->a[j-1].u.x.iOrderByCol = i+1-pSort->nOBSat;-
948 }
executed 7948 times by 1 test: end of block
Executed by:
  • Self test (438)
7948
949 }
executed 15890 times by 1 test: end of block
Executed by:
  • Self test (438)
15890
950#ifdef SQLITE_ENABLE_SORTER_REFERENCES-
951 selectExprDefer(pParse, pSort, p->pEList, &pExtra);-
952 if( pExtra && pParse->db->mallocFailed==0 ){-
953 /* If there are any extra PK columns to add to the sorter records,-
954 ** allocate extra memory cells and adjust the OpenEphemeral -
955 ** instruction to account for the larger records. This is only-
956 ** required if there are one or more WITHOUT ROWID tables with-
957 ** composite primary keys in the SortCtx.aDefer[] array. */-
958 VdbeOp *pOp = sqlite3VdbeGetOp(v, pSort->addrSortIndex);-
959 pOp->p2 += (pExtra->nExpr - pSort->nDefer);-
960 pOp->p4.pKeyInfo->nAllField += (pExtra->nExpr - pSort->nDefer);-
961 pParse->nMem += pExtra->nExpr;-
962 }-
963#endif-
964-
965 /* Adjust nResultCol to account for columns that are omitted-
966 ** from the sorter by the optimizations in this branch */-
967 pEList = p->pEList;-
968 for(i=0; i<pEList->nExpr; i++){
i<pEList->nExprDescription
TRUEevaluated 41075 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 13074 times by 1 test
Evaluated by:
  • Self test (438)
13074-41075
969 if( pEList->a[i].u.x.iOrderByCol>0
pEList->a[i].u.x.iOrderByCol>0Description
TRUEevaluated 7865 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 33210 times by 1 test
Evaluated by:
  • Self test (438)
7865-33210
970#ifdef SQLITE_ENABLE_SORTER_REFERENCES-
971 || pEList->a[i].bSorterRef-
972#endif-
973 ){-
974 nResultCol--;-
975 regOrig = 0;-
976 }
executed 7865 times by 1 test: end of block
Executed by:
  • Self test (438)
7865
977 }
executed 41075 times by 1 test: end of block
Executed by:
  • Self test (438)
41075
978-
979 testcase( regOrig );-
980 testcase( eDest==SRT_Set );-
981 testcase( eDest==SRT_Mem );-
982 testcase( eDest==SRT_Coroutine );-
983 testcase( eDest==SRT_Output );-
984 assert( eDest==SRT_Set || eDest==SRT_Mem -
985 || eDest==SRT_Coroutine || eDest==SRT_Output );-
986 }
executed 13074 times by 1 test: end of block
Executed by:
  • Self test (438)
13074
987 sRowLoadInfo.regResult = regResult;-
988 sRowLoadInfo.ecelFlags = ecelFlags;-
989#ifdef SQLITE_ENABLE_SORTER_REFERENCES-
990 sRowLoadInfo.pExtra = pExtra;-
991 sRowLoadInfo.regExtraResult = regResult + nResultCol;-
992 if( pExtra ) nResultCol += pExtra->nExpr;-
993#endif-
994 if( p->iLimit
p->iLimitDescription
TRUEevaluated 13569 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 360483 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
13569-360483
995 && (ecelFlags & SQLITE_ECEL_OMITREF)!=0
(ecelFlags & 0x08)!=0Description
TRUEevaluated 784 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 12785 times by 1 test
Evaluated by:
  • Self test (438)
784-12785
996 && nPrefixReg>0
nPrefixReg>0Description
TRUEevaluated 644 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 140 times by 1 test
Evaluated by:
  • Self test (438)
140-644
997 ){-
998 assert( pSort!=0 );-
999 assert( hasDistinct==0 );-
1000 pSort->pDeferredRowLoad = &sRowLoadInfo;-
1001 regOrig = 0;-
1002 }else{
executed 644 times by 1 test: end of block
Executed by:
  • Self test (438)
644
1003 innerLoopLoadRow(pParse, p, &sRowLoadInfo);-
1004 }
executed 373408 times by 435 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
373408
1005 }-
1006-
1007 /* If the DISTINCT keyword was present on the SELECT statement-
1008 ** and this row has been seen before, then do not make this row-
1009 ** part of the result.-
1010 */-
1011 if( hasDistinct ){
hasDistinctDescription
TRUEevaluated 288 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 413650 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
288-413650
1012 switch( pDistinct->eTnctType ){-
1013 case WHERE_DISTINCT_ORDERED: {
executed 62 times by 1 test: case 2:
Executed by:
  • Self test (438)
62
1014 VdbeOp *pOp; /* No longer required OpenEphemeral instr. */-
1015 int iJump; /* Jump destination */-
1016 int regPrev; /* Previous row content */-
1017-
1018 /* Allocate space for the previous row */-
1019 regPrev = pParse->nMem+1;-
1020 pParse->nMem += nResultCol;-
1021-
1022 /* Change the OP_OpenEphemeral coded earlier to an OP_Null-
1023 ** sets the MEM_Cleared bit on the first register of the-
1024 ** previous value. This will cause the OP_Ne below to always-
1025 ** fail on the first iteration of the loop even if the first-
1026 ** row is all NULLs.-
1027 */-
1028 sqlite3VdbeChangeToNoop(v, pDistinct->addrTnct);-
1029 pOp = sqlite3VdbeGetOp(v, pDistinct->addrTnct);-
1030 pOp->opcode = OP_Null;-
1031 pOp->p1 = 1;-
1032 pOp->p2 = regPrev;-
1033-
1034 iJump = sqlite3VdbeCurrentAddr(v) + nResultCol;-
1035 for(i=0; i<nResultCol; i++){
i<nResultColDescription
TRUEevaluated 118 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 62 times by 1 test
Evaluated by:
  • Self test (438)
62-118
1036 CollSeq *pColl = sqlite3ExprCollSeq(pParse, p->pEList->a[i].pExpr);-
1037 if( i<nResultCol-1 ){
i<nResultCol-1Description
TRUEevaluated 56 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 62 times by 1 test
Evaluated by:
  • Self test (438)
56-62
1038 sqlite3VdbeAddOp3(v, OP_Ne, regResult+i, iJump, regPrev+i);-
1039 VdbeCoverage(v);-
1040 }else{
executed 56 times by 1 test: end of block
Executed by:
  • Self test (438)
56
1041 sqlite3VdbeAddOp3(v, OP_Eq, regResult+i, iContinue, regPrev+i);-
1042 VdbeCoverage(v);-
1043 }
executed 62 times by 1 test: end of block
Executed by:
  • Self test (438)
62
1044 sqlite3VdbeChangeP4(v, -1, (const char *)pColl, P4_COLLSEQ);-
1045 sqlite3VdbeChangeP5(v, SQLITE_NULLEQ);-
1046 }
executed 118 times by 1 test: end of block
Executed by:
  • Self test (438)
118
1047 assert( sqlite3VdbeCurrentAddr(v)==iJump || pParse->db->mallocFailed );-
1048 sqlite3VdbeAddOp3(v, OP_Copy, regResult, regPrev, nResultCol-1);-
1049 break;
executed 62 times by 1 test: break;
Executed by:
  • Self test (438)
62
1050 }-
1051-
1052 case WHERE_DISTINCT_UNIQUE: {
executed 24 times by 1 test: case 1:
Executed by:
  • Self test (438)
24
1053 sqlite3VdbeChangeToNoop(v, pDistinct->addrTnct);-
1054 break;
executed 24 times by 1 test: break;
Executed by:
  • Self test (438)
24
1055 }-
1056-
1057 default: {
executed 202 times by 1 test: default:
Executed by:
  • Self test (438)
202
1058 assert( pDistinct->eTnctType==WHERE_DISTINCT_UNORDERED );-
1059 codeDistinct(pParse, pDistinct->tabTnct, iContinue, nResultCol,-
1060 regResult);-
1061 break;
executed 202 times by 1 test: break;
Executed by:
  • Self test (438)
202
1062 }-
1063 }-
1064 if( pSort==0 ){
pSort==0Description
TRUEevaluated 239 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 49 times by 1 test
Evaluated by:
  • Self test (438)
49-239
1065 codeOffset(v, p->iOffset, iContinue);-
1066 }
executed 239 times by 1 test: end of block
Executed by:
  • Self test (438)
239
1067 }
executed 288 times by 1 test: end of block
Executed by:
  • Self test (438)
288
1068-
1069 switch( eDest ){-
1070 /* In this mode, write each query result to the key of the temporary-
1071 ** table iParm.-
1072 */-
1073#ifndef SQLITE_OMIT_COMPOUND_SELECT-
1074 case SRT_Union: {
executed 72820 times by 1 test: case 1:
Executed by:
  • Self test (438)
72820
1075 int r1;-
1076 r1 = sqlite3GetTempReg(pParse);-
1077 sqlite3VdbeAddOp3(v, OP_MakeRecord, regResult, nResultCol, r1);-
1078 sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iParm, r1, regResult, nResultCol);-
1079 sqlite3ReleaseTempReg(pParse, r1);-
1080 break;
executed 72820 times by 1 test: break;
Executed by:
  • Self test (438)
72820
1081 }-
1082-
1083 /* Construct a record from the query result, but instead of-
1084 ** saving that record, use it as a key to delete elements from-
1085 ** the temporary table iParm.-
1086 */-
1087 case SRT_Except: {
executed 126 times by 1 test: case 2:
Executed by:
  • Self test (438)
126
1088 sqlite3VdbeAddOp3(v, OP_IdxDelete, iParm, regResult, nResultCol);-
1089 break;
executed 126 times by 1 test: break;
Executed by:
  • Self test (438)
126
1090 }-
1091#endif /* SQLITE_OMIT_COMPOUND_SELECT */-
1092-
1093 /* Store the result as data using a unique key.-
1094 */-
1095 case SRT_Fifo:
executed 470 times by 1 test: case 5:
Executed by:
  • Self test (438)
470
1096 case SRT_DistFifo:
executed 49 times by 1 test: case 6:
Executed by:
  • Self test (438)
49
1097 case SRT_Table:
executed 48 times by 1 test: case 14:
Executed by:
  • Self test (438)
48
1098 case SRT_EphemTab: {
executed 866 times by 1 test: case 12:
Executed by:
  • Self test (438)
866
1099 int r1 = sqlite3GetTempRange(pParse, nPrefixReg+1);-
1100 testcase( eDest==SRT_Table );-
1101 testcase( eDest==SRT_EphemTab );-
1102 testcase( eDest==SRT_Fifo );-
1103 testcase( eDest==SRT_DistFifo );-
1104 sqlite3VdbeAddOp3(v, OP_MakeRecord, regResult, nResultCol, r1+nPrefixReg);-
1105#ifndef SQLITE_OMIT_CTE-
1106 if( eDest==SRT_DistFifo ){
eDest==6Description
TRUEevaluated 49 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1384 times by 1 test
Evaluated by:
  • Self test (438)
49-1384
1107 /* If the destination is DistFifo, then cursor (iParm+1) is open-
1108 ** on an ephemeral index. If the current row is already present-
1109 ** in the index, do not write it to the output. If not, add the-
1110 ** current row to the index and proceed with writing it to the-
1111 ** output table as well. */-
1112 int addr = sqlite3VdbeCurrentAddr(v) + 4;-
1113 sqlite3VdbeAddOp4Int(v, OP_Found, iParm+1, addr, r1, 0);-
1114 VdbeCoverage(v);-
1115 sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iParm+1, r1,regResult,nResultCol);-
1116 assert( pSort==0 );-
1117 }
executed 49 times by 1 test: end of block
Executed by:
  • Self test (438)
49
1118#endif-
1119 if( pSort ){
pSortDescription
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1430 times by 1 test
Evaluated by:
  • Self test (438)
3-1430
1120 assert( regResult==regOrig );-
1121 pushOntoSorter(pParse, pSort, p, r1+nPrefixReg, regOrig, 1, nPrefixReg);-
1122 }else{
executed 3 times by 1 test: end of block
Executed by:
  • Self test (438)
3
1123 int r2 = sqlite3GetTempReg(pParse);-
1124 sqlite3VdbeAddOp2(v, OP_NewRowid, iParm, r2);-
1125 sqlite3VdbeAddOp3(v, OP_Insert, iParm, r1, r2);-
1126 sqlite3VdbeChangeP5(v, OPFLAG_APPEND);-
1127 sqlite3ReleaseTempReg(pParse, r2);-
1128 }
executed 1430 times by 1 test: end of block
Executed by:
  • Self test (438)
1430
1129 sqlite3ReleaseTempRange(pParse, r1, nPrefixReg+1);-
1130 break;
executed 1433 times by 1 test: break;
Executed by:
  • Self test (438)
1433
1131 }-
1132-
1133#ifndef SQLITE_OMIT_SUBQUERY-
1134 /* If we are creating a set for an "expr IN (SELECT ...)" construct,-
1135 ** then there should be a single item on the stack. Write this-
1136 ** item into the set table with bogus data.-
1137 */-
1138 case SRT_Set: {
executed 3911 times by 1 test: case 11:
Executed by:
  • Self test (438)
3911
1139 if( pSort ){
pSortDescription
TRUEevaluated 51 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 3860 times by 1 test
Evaluated by:
  • Self test (438)
51-3860
1140 /* At first glance you would think we could optimize out the-
1141 ** ORDER BY in this case since the order of entries in the set-
1142 ** does not matter. But there might be a LIMIT clause, in which-
1143 ** case the order does matter */-
1144 pushOntoSorter(-
1145 pParse, pSort, p, regResult, regOrig, nResultCol, nPrefixReg);-
1146 }else{
executed 51 times by 1 test: end of block
Executed by:
  • Self test (438)
51
1147 int r1 = sqlite3GetTempReg(pParse);-
1148 assert( sqlite3Strlen30(pDest->zAffSdst)==nResultCol );-
1149 sqlite3VdbeAddOp4(v, OP_MakeRecord, regResult, nResultCol, -
1150 r1, pDest->zAffSdst, nResultCol);-
1151 sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iParm, r1, regResult, nResultCol);-
1152 sqlite3ReleaseTempReg(pParse, r1);-
1153 }
executed 3860 times by 1 test: end of block
Executed by:
  • Self test (438)
3860
1154 break;
executed 3911 times by 1 test: break;
Executed by:
  • Self test (438)
3911
1155 }-
1156-
1157 /* If any row exist in the result set, record that fact and abort.-
1158 */-
1159 case SRT_Exists: {
executed 3207 times by 1 test: case 3:
Executed by:
  • Self test (438)
3207
1160 sqlite3VdbeAddOp2(v, OP_Integer, 1, iParm);-
1161 /* The LIMIT clause will terminate the loop for us */-
1162 break;
executed 3207 times by 1 test: break;
Executed by:
  • Self test (438)
3207
1163 }-
1164-
1165 /* If this is a scalar select that is part of an expression, then-
1166 ** store the results in the appropriate memory cell or array of -
1167 ** memory cells and break out of the scan loop.-
1168 */-
1169 case SRT_Mem: {
executed 12270 times by 1 test: case 10:
Executed by:
  • Self test (438)
12270
1170 if( pSort ){
pSortDescription
TRUEevaluated 112 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 12158 times by 1 test
Evaluated by:
  • Self test (438)
112-12158
1171 assert( nResultCol<=pDest->nSdst );-
1172 pushOntoSorter(-
1173 pParse, pSort, p, regResult, regOrig, nResultCol, nPrefixReg);-
1174 }else{
executed 112 times by 1 test: end of block
Executed by:
  • Self test (438)
112
1175 assert( nResultCol==pDest->nSdst );-
1176 assert( regResult==iParm );-
1177 /* The LIMIT clause will jump out of the loop for us */-
1178 }
executed 12158 times by 1 test: end of block
Executed by:
  • Self test (438)
12158
1179 break;
executed 12270 times by 1 test: break;
Executed by:
  • Self test (438)
12270
1180 }-
1181#endif /* #ifndef SQLITE_OMIT_SUBQUERY */-
1182-
1183 case SRT_Coroutine: /* Send data to a co-routine */
executed 141993 times by 9 tests: case 13:
Executed by:
  • Self test
  • Self test (101)
  • Self test (32)
  • Self test (33)
  • Self test (34)
  • Self test (438)
  • Self test (57)
  • Self test (58)
  • Self test (64)
141993
1184 case SRT_Output: { /* Return the results */
executed 177964 times by 435 tests: case 9:
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
177964
1185 testcase( eDest==SRT_Coroutine );-
1186 testcase( eDest==SRT_Output );-
1187 if( pSort ){
pSortDescription
TRUEevaluated 12960 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 306997 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
12960-306997
1188 pushOntoSorter(pParse, pSort, p, regResult, regOrig, nResultCol,-
1189 nPrefixReg);-
1190 }else if( eDest==SRT_Coroutine ){
executed 12960 times by 1 test: end of block
Executed by:
  • Self test (438)
eDest==13Description
TRUEevaluated 139589 times by 9 tests
Evaluated by:
  • Self test
  • Self test (101)
  • Self test (32)
  • Self test (33)
  • Self test (34)
  • Self test (438)
  • Self test (57)
  • Self test (58)
  • Self test (64)
FALSEevaluated 167408 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
12960-167408
1191 sqlite3VdbeAddOp1(v, OP_Yield, pDest->iSDParm);-
1192 }else{
executed 139589 times by 9 tests: end of block
Executed by:
  • Self test
  • Self test (101)
  • Self test (32)
  • Self test (33)
  • Self test (34)
  • Self test (438)
  • Self test (57)
  • Self test (58)
  • Self test (64)
139589
1193 sqlite3VdbeAddOp2(v, OP_ResultRow, regResult, nResultCol);-
1194 }
executed 167408 times by 435 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
167408
1195 break;
executed 319957 times by 435 tests: break;
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
319957
1196 }-
1197-
1198#ifndef SQLITE_OMIT_CTE-
1199 /* Write the results into a priority queue that is order according to-
1200 ** pDest->pOrderBy (in pSO). pDest->iSDParm (in iParm) is the cursor for an-
1201 ** index with pSO->nExpr+2 columns. Build a key using pSO for the first-
1202 ** pSO->nExpr columns, then make sure all keys are unique by adding a-
1203 ** final OP_Sequence column. The last column is the record as a blob.-
1204 */-
1205 case SRT_DistQueue:
executed 6 times by 1 test: case 8:
Executed by:
  • Self test (438)
6
1206 case SRT_Queue: {
executed 28 times by 1 test: case 7:
Executed by:
  • Self test (438)
28
1207 int nKey;-
1208 int r1, r2, r3;-
1209 int addrTest = 0;-
1210 ExprList *pSO;-
1211 pSO = pDest->pOrderBy;-
1212 assert( pSO );-
1213 nKey = pSO->nExpr;-
1214 r1 = sqlite3GetTempReg(pParse);-
1215 r2 = sqlite3GetTempRange(pParse, nKey+2);-
1216 r3 = r2+nKey+1;-
1217 if( eDest==SRT_DistQueue ){
eDest==8Description
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 28 times by 1 test
Evaluated by:
  • Self test (438)
6-28
1218 /* If the destination is DistQueue, then cursor (iParm+1) is open-
1219 ** on a second ephemeral index that holds all values every previously-
1220 ** added to the queue. */-
1221 addrTest = sqlite3VdbeAddOp4Int(v, OP_Found, iParm+1, 0, -
1222 regResult, nResultCol);-
1223 VdbeCoverage(v);-
1224 }
executed 6 times by 1 test: end of block
Executed by:
  • Self test (438)
6
1225 sqlite3VdbeAddOp3(v, OP_MakeRecord, regResult, nResultCol, r3);-
1226 if( eDest==SRT_DistQueue ){
eDest==8Description
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 28 times by 1 test
Evaluated by:
  • Self test (438)
6-28
1227 sqlite3VdbeAddOp2(v, OP_IdxInsert, iParm+1, r3);-
1228 sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT);-
1229 }
executed 6 times by 1 test: end of block
Executed by:
  • Self test (438)
6
1230 for(i=0; i<nKey; i++){
i<nKeyDescription
TRUEevaluated 44 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 34 times by 1 test
Evaluated by:
  • Self test (438)
34-44
1231 sqlite3VdbeAddOp2(v, OP_SCopy,-
1232 regResult + pSO->a[i].u.x.iOrderByCol - 1,-
1233 r2+i);-
1234 }
executed 44 times by 1 test: end of block
Executed by:
  • Self test (438)
44
1235 sqlite3VdbeAddOp2(v, OP_Sequence, iParm, r2+nKey);-
1236 sqlite3VdbeAddOp3(v, OP_MakeRecord, r2, nKey+2, r1);-
1237 sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iParm, r1, r2, nKey+2);-
1238 if( addrTest ) sqlite3VdbeJumpHere(v, addrTest);
executed 6 times by 1 test: sqlite3VdbeJumpHere(v, addrTest);
Executed by:
  • Self test (438)
addrTestDescription
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 28 times by 1 test
Evaluated by:
  • Self test (438)
6-28
1239 sqlite3ReleaseTempReg(pParse, r1);-
1240 sqlite3ReleaseTempRange(pParse, r2, nKey+2);-
1241 break;
executed 34 times by 1 test: break;
Executed by:
  • Self test (438)
34
1242 }-
1243#endif /* SQLITE_OMIT_CTE */-
1244-
1245-
1246-
1247#if !defined(SQLITE_OMIT_TRIGGER)-
1248 /* Discard the results. This is used for SELECT statements inside-
1249 ** the body of a TRIGGER. The purpose of such selects is to call-
1250 ** user-defined functions that have side effects. We do not care-
1251 ** about the actual results of the select.-
1252 */-
1253 default: {
executed 180 times by 1 test: default:
Executed by:
  • Self test (438)
180
1254 assert( eDest==SRT_Discard );-
1255 break;
executed 180 times by 1 test: break;
Executed by:
  • Self test (438)
180
1256 }-
1257#endif-
1258 }-
1259-
1260 /* Jump to the end of the loop if the LIMIT is reached. Except, if-
1261 ** there is a sorter, in which case the sorter has already limited-
1262 ** the output for us.-
1263 */-
1264 if( pSort==0 && p->iLimit ){
pSort==0Description
TRUEevaluated 400812 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 13126 times by 1 test
Evaluated by:
  • Self test (438)
p->iLimitDescription
TRUEevaluated 16016 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 384796 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
13126-400812
1265 sqlite3VdbeAddOp2(v, OP_DecrJumpZero, p->iLimit, iBreak); VdbeCoverage(v);-
1266 }
executed 16016 times by 1 test: end of block
Executed by:
  • Self test (438)
16016
1267}
executed 413938 times by 435 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
413938
1268-
1269/*-
1270** Allocate a KeyInfo object sufficient for an index of N key columns and-
1271** X extra columns.-
1272*/-
1273KeyInfo *sqlite3KeyInfoAlloc(sqlite3 *db, int N, int X){-
1274 int nExtra = (N+X)*(sizeof(CollSeq*)+1) - sizeof(CollSeq*);-
1275 KeyInfo *p = sqlite3DbMallocRawNN(db, sizeof(KeyInfo) + nExtra);-
1276 if( p ){
pDescription
TRUEevaluated 173203 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 84 times by 1 test
Evaluated by:
  • Self test (438)
84-173203
1277 p->aSortOrder = (u8*)&p->aColl[N+X];-
1278 p->nKeyField = (u16)N;-
1279 p->nAllField = (u16)(N+X);-
1280 p->enc = ENC(db);-
1281 p->db = db;-
1282 p->nRef = 1;-
1283 memset(&p[1], 0, nExtra);-
1284 }else{
executed 173203 times by 435 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
173203
1285 sqlite3OomFault(db);-
1286 }
executed 84 times by 1 test: end of block
Executed by:
  • Self test (438)
84
1287 return p;
executed 173287 times by 435 tests: return p;
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
173287
1288}-
1289-
1290/*-
1291** Deallocate a KeyInfo object-
1292*/-
1293void sqlite3KeyInfoUnref(KeyInfo *p){-
1294 if( p ){
pDescription
TRUEevaluated 214655 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 408 times by 1 test
Evaluated by:
  • Self test (438)
408-214655
1295 assert( p->nRef>0 );-
1296 p->nRef--;-
1297 if( p->nRef==0 ) sqlite3DbFreeNN(p->db, p);
executed 172835 times by 435 tests: sqlite3DbFreeNN(p->db, p);
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
p->nRef==0Description
TRUEevaluated 172835 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 41820 times by 10 tests
Evaluated by:
  • Self test (24)
  • Self test (26)
  • Self test (27)
  • Self test (28)
  • Self test (29)
  • Self test (42)
  • Self test (438)
  • Self test (44)
  • Self test (46)
  • Self test (47)
41820-172835
1298 }
executed 214655 times by 435 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
214655
1299}
executed 215063 times by 435 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
215063
1300-
1301/*-
1302** Make a new pointer to a KeyInfo object-
1303*/-
1304KeyInfo *sqlite3KeyInfoRef(KeyInfo *p){-
1305 if( p ){
pDescription
TRUEevaluated 41820 times by 10 tests
Evaluated by:
  • Self test (24)
  • Self test (26)
  • Self test (27)
  • Self test (28)
  • Self test (29)
  • Self test (42)
  • Self test (438)
  • Self test (44)
  • Self test (46)
  • Self test (47)
FALSEevaluated 14 times by 1 test
Evaluated by:
  • Self test (438)
14-41820
1306 assert( p->nRef>0 );-
1307 p->nRef++;-
1308 }
executed 41820 times by 10 tests: end of block
Executed by:
  • Self test (24)
  • Self test (26)
  • Self test (27)
  • Self test (28)
  • Self test (29)
  • Self test (42)
  • Self test (438)
  • Self test (44)
  • Self test (46)
  • Self test (47)
41820
1309 return p;
executed 41834 times by 10 tests: return p;
Executed by:
  • Self test (24)
  • Self test (26)
  • Self test (27)
  • Self test (28)
  • Self test (29)
  • Self test (42)
  • Self test (438)
  • Self test (44)
  • Self test (46)
  • Self test (47)
41834
1310}-
1311-
1312#ifdef SQLITE_DEBUG-
1313/*-
1314** Return TRUE if a KeyInfo object can be change. The KeyInfo object-
1315** can only be changed if this is just a single reference to the object.-
1316**-
1317** This routine is used only inside of assert() statements.-
1318*/-
1319int sqlite3KeyInfoIsWriteable(KeyInfo *p){ return p->nRef==1; }-
1320#endif /* SQLITE_DEBUG */-
1321-
1322/*-
1323** Given an expression list, generate a KeyInfo structure that records-
1324** the collating sequence for each expression in that expression list.-
1325**-
1326** If the ExprList is an ORDER BY or GROUP BY clause then the resulting-
1327** KeyInfo structure is appropriate for initializing a virtual index to-
1328** implement that clause. If the ExprList is the result set of a SELECT-
1329** then the KeyInfo structure is appropriate for initializing a virtual-
1330** index to implement a DISTINCT test.-
1331**-
1332** Space to hold the KeyInfo structure is obtained from malloc. The calling-
1333** function is responsible for seeing that this structure is eventually-
1334** freed.-
1335*/-
1336KeyInfo *sqlite3KeyInfoFromExprList(-
1337 Parse *pParse, /* Parsing context */-
1338 ExprList *pList, /* Form the KeyInfo object from this ExprList */-
1339 int iStart, /* Begin with this column of pList */-
1340 int nExtra /* Add this many extra columns to the end */-
1341){-
1342 int nExpr;-
1343 KeyInfo *pInfo;-
1344 struct ExprList_item *pItem;-
1345 sqlite3 *db = pParse->db;-
1346 int i;-
1347-
1348 nExpr = pList->nExpr;-
1349 pInfo = sqlite3KeyInfoAlloc(db, nExpr-iStart, nExtra+1);-
1350 if( pInfo ){
pInfoDescription
TRUEevaluated 67713 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 80 times by 1 test
Evaluated by:
  • Self test (438)
80-67713
1351 assert( sqlite3KeyInfoIsWriteable(pInfo) );-
1352 for(i=iStart, pItem=pList->a+iStart; i<nExpr; i++, pItem++){
i<nExprDescription
TRUEevaluated 72197 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 67713 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
67713-72197
1353 pInfo->aColl[i-iStart] = sqlite3ExprNNCollSeq(pParse, pItem->pExpr);-
1354 pInfo->aSortOrder[i-iStart] = pItem->sortOrder;-
1355 }
executed 72197 times by 435 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
72197
1356 }
executed 67713 times by 435 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
67713
1357 return pInfo;
executed 67793 times by 435 tests: return pInfo;
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
67793
1358}-
1359-
1360/*-
1361** Name of the connection operator, used for error messages.-
1362*/-
1363static const char *selectOpName(int id){-
1364 char *z;-
1365 switch( id ){-
1366 case TK_ALL: z = "UNION ALL"; break;
executed 362 times by 1 test: break;
Executed by:
  • Self test (438)
executed 362 times by 1 test: case 124:
Executed by:
  • Self test (438)
362
1367 case TK_INTERSECT: z = "INTERSECT"; break;
executed 187 times by 1 test: break;
Executed by:
  • Self test (438)
executed 187 times by 1 test: case 126:
Executed by:
  • Self test (438)
187
1368 case TK_EXCEPT: z = "EXCEPT"; break;
executed 197 times by 1 test: break;
Executed by:
  • Self test (438)
executed 197 times by 1 test: case 125:
Executed by:
  • Self test (438)
197
1369 default: z = "UNION"; break;
executed 36500 times by 1 test: break;
Executed by:
  • Self test (438)
executed 36500 times by 1 test: default:
Executed by:
  • Self test (438)
36500
1370 }-
1371 return z;
executed 37246 times by 1 test: return z;
Executed by:
  • Self test (438)
37246
1372}-
1373-
1374#ifndef SQLITE_OMIT_EXPLAIN-
1375/*-
1376** Unless an "EXPLAIN QUERY PLAN" command is being processed, this function-
1377** is a no-op. Otherwise, it adds a single row of output to the EQP result,-
1378** where the caption is of the form:-
1379**-
1380** "USE TEMP B-TREE FOR xxx"-
1381**-
1382** where xxx is one of "DISTINCT", "ORDER BY" or "GROUP BY". Exactly which-
1383** is determined by the zUsage argument.-
1384*/-
1385static void explainTempTable(Parse *pParse, const char *zUsage){-
1386 ExplainQueryPlan((pParse, 0, "USE TEMP B-TREE FOR %s", zUsage));-
1387}
executed 15429 times by 1 test: end of block
Executed by:
  • Self test (438)
15429
1388-
1389/*-
1390** Assign expression b to lvalue a. A second, no-op, version of this macro-
1391** is provided when SQLITE_OMIT_EXPLAIN is defined. This allows the code-
1392** in sqlite3Select() to assign values to structure member variables that-
1393** only exist if SQLITE_OMIT_EXPLAIN is not defined without polluting the-
1394** code with #ifndef directives.-
1395*/-
1396# define explainSetInteger(a, b) a = b-
1397-
1398#else-
1399/* No-op versions of the explainXXX() functions and macros. */-
1400# define explainTempTable(y,z)-
1401# define explainSetInteger(y,z)-
1402#endif-
1403-
1404-
1405/*-
1406** If the inner loop was generated using a non-null pOrderBy argument,-
1407** then the results were placed in a sorter. After the loop is terminated-
1408** we need to run the sorter and output the results. The following-
1409** routine generates the code needed to do that.-
1410*/-
1411static void generateSortTail(-
1412 Parse *pParse, /* Parsing context */-
1413 Select *p, /* The SELECT statement */-
1414 SortCtx *pSort, /* Information on the ORDER BY clause */-
1415 int nColumn, /* Number of columns of data */-
1416 SelectDest *pDest /* Write the sorted results here */-
1417){-
1418 Vdbe *v = pParse->pVdbe; /* The prepared statement */-
1419 int addrBreak = pSort->labelDone; /* Jump here to exit loop */-
1420 int addrContinue = sqlite3VdbeMakeLabel(v); /* Jump here for next cycle */-
1421 int addr; /* Top of output loop. Jump for Next. */-
1422 int addrOnce = 0;-
1423 int iTab;-
1424 ExprList *pOrderBy = pSort->pOrderBy;-
1425 int eDest = pDest->eDest;-
1426 int iParm = pDest->iSDParm;-
1427 int regRow;-
1428 int regRowid;-
1429 int iCol;-
1430 int nKey; /* Number of key columns in sorter record */-
1431 int iSortTab; /* Sorter cursor to read from */-
1432 int i;-
1433 int bSeq; /* True if sorter record includes seq. no. */-
1434 int nRefKey = 0;-
1435 struct ExprList_item *aOutEx = p->pEList->a;-
1436-
1437 assert( addrBreak<0 );-
1438 if( pSort->labelBkOut ){
pSort->labelBkOutDescription
TRUEevaluated 319 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 12807 times by 1 test
Evaluated by:
  • Self test (438)
319-12807
1439 sqlite3VdbeAddOp2(v, OP_Gosub, pSort->regReturn, pSort->labelBkOut);-
1440 sqlite3VdbeGoto(v, addrBreak);-
1441 sqlite3VdbeResolveLabel(v, pSort->labelBkOut);-
1442 }
executed 319 times by 1 test: end of block
Executed by:
  • Self test (438)
319
1443-
1444#ifdef SQLITE_ENABLE_SORTER_REFERENCES-
1445 /* Open any cursors needed for sorter-reference expressions */-
1446 for(i=0; i<pSort->nDefer; i++){-
1447 Table *pTab = pSort->aDefer[i].pTab;-
1448 int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);-
1449 sqlite3OpenTable(pParse, pSort->aDefer[i].iCsr, iDb, pTab, OP_OpenRead);-
1450 nRefKey = MAX(nRefKey, pSort->aDefer[i].nKey);-
1451 }-
1452#endif-
1453-
1454 iTab = pSort->iECursor;-
1455 if( eDest==SRT_Output || eDest==SRT_Coroutine || eDest==SRT_Mem ){
eDest==9Description
TRUEevaluated 10556 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 2570 times by 1 test
Evaluated by:
  • Self test (438)
eDest==13Description
TRUEevaluated 2404 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 166 times by 1 test
Evaluated by:
  • Self test (438)
eDest==10Description
TRUEevaluated 112 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 54 times by 1 test
Evaluated by:
  • Self test (438)
54-10556
1456 regRowid = 0;-
1457 regRow = pDest->iSdst;-
1458 }else{
executed 13072 times by 1 test: end of block
Executed by:
  • Self test (438)
13072
1459 regRowid = sqlite3GetTempReg(pParse);-
1460 regRow = sqlite3GetTempRange(pParse, nColumn);-
1461 }
executed 54 times by 1 test: end of block
Executed by:
  • Self test (438)
54
1462 nKey = pOrderBy->nExpr - pSort->nOBSat;-
1463 if( pSort->sortFlags & SORTFLAG_UseSorter ){
pSort->sortFlags & 0x01Description
TRUEevaluated 12332 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 794 times by 1 test
Evaluated by:
  • Self test (438)
794-12332
1464 int regSortOut = ++pParse->nMem;-
1465 iSortTab = pParse->nTab++;-
1466 if( pSort->labelBkOut ){
pSort->labelBkOutDescription
TRUEevaluated 241 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 12091 times by 1 test
Evaluated by:
  • Self test (438)
241-12091
1467 addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v);-
1468 }
executed 241 times by 1 test: end of block
Executed by:
  • Self test (438)
241
1469 sqlite3VdbeAddOp3(v, OP_OpenPseudo, iSortTab, regSortOut, -
1470 nKey+1+nColumn+nRefKey);-
1471 if( addrOnce ) sqlite3VdbeJumpHere(v, addrOnce);
executed 241 times by 1 test: sqlite3VdbeJumpHere(v, addrOnce);
Executed by:
  • Self test (438)
addrOnceDescription
TRUEevaluated 241 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 12091 times by 1 test
Evaluated by:
  • Self test (438)
241-12091
1472 addr = 1 + sqlite3VdbeAddOp2(v, OP_SorterSort, iTab, addrBreak);-
1473 VdbeCoverage(v);-
1474 codeOffset(v, p->iOffset, addrContinue);-
1475 sqlite3VdbeAddOp3(v, OP_SorterData, iTab, regSortOut, iSortTab);-
1476 bSeq = 0;-
1477 }else{
executed 12332 times by 1 test: end of block
Executed by:
  • Self test (438)
12332
1478 addr = 1 + sqlite3VdbeAddOp2(v, OP_Sort, iTab, addrBreak); VdbeCoverage(v);-
1479 codeOffset(v, p->iOffset, addrContinue);-
1480 iSortTab = iTab;-
1481 bSeq = 1;-
1482 }
executed 794 times by 1 test: end of block
Executed by:
  • Self test (438)
794
1483 for(i=0, iCol=nKey+bSeq-1; i<nColumn; i++){
i<nColumnDescription
TRUEevaluated 41155 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 13126 times by 1 test
Evaluated by:
  • Self test (438)
13126-41155
1484#ifdef SQLITE_ENABLE_SORTER_REFERENCES-
1485 if( aOutEx[i].bSorterRef ) continue;-
1486#endif-
1487 if( aOutEx[i].u.x.iOrderByCol==0 ) iCol++;
executed 33290 times by 1 test: iCol++;
Executed by:
  • Self test (438)
aOutEx[i].u.x.iOrderByCol==0Description
TRUEevaluated 33290 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 7865 times by 1 test
Evaluated by:
  • Self test (438)
7865-33290
1488 }
executed 41155 times by 1 test: end of block
Executed by:
  • Self test (438)
41155
1489#ifdef SQLITE_ENABLE_SORTER_REFERENCES-
1490 if( pSort->nDefer ){-
1491 int iKey = iCol+1;-
1492 int regKey = sqlite3GetTempRange(pParse, nRefKey);-
1493-
1494 for(i=0; i<pSort->nDefer; i++){-
1495 int iCsr = pSort->aDefer[i].iCsr;-
1496 Table *pTab = pSort->aDefer[i].pTab;-
1497 int nKey = pSort->aDefer[i].nKey;-
1498-
1499 sqlite3VdbeAddOp1(v, OP_NullRow, iCsr);-
1500 if( HasRowid(pTab) ){-
1501 sqlite3VdbeAddOp3(v, OP_Column, iSortTab, iKey++, regKey);-
1502 sqlite3VdbeAddOp3(v, OP_SeekRowid, iCsr, -
1503 sqlite3VdbeCurrentAddr(v)+1, regKey);-
1504 }else{-
1505 int k;-
1506 int iJmp;-
1507 assert( sqlite3PrimaryKeyIndex(pTab)->nKeyCol==nKey );-
1508 for(k=0; k<nKey; k++){-
1509 sqlite3VdbeAddOp3(v, OP_Column, iSortTab, iKey++, regKey+k);-
1510 }-
1511 iJmp = sqlite3VdbeCurrentAddr(v);-
1512 sqlite3VdbeAddOp4Int(v, OP_SeekGE, iCsr, iJmp+2, regKey, nKey);-
1513 sqlite3VdbeAddOp4Int(v, OP_IdxLE, iCsr, iJmp+3, regKey, nKey);-
1514 sqlite3VdbeAddOp1(v, OP_NullRow, iCsr);-
1515 }-
1516 }-
1517 sqlite3ReleaseTempRange(pParse, regKey, nRefKey);-
1518 }-
1519#endif-
1520 for(i=nColumn-1; i>=0; i--){
i>=0Description
TRUEevaluated 41155 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 13126 times by 1 test
Evaluated by:
  • Self test (438)
13126-41155
1521#ifdef SQLITE_ENABLE_SORTER_REFERENCES-
1522 if( aOutEx[i].bSorterRef ){-
1523 sqlite3ExprCode(pParse, aOutEx[i].pExpr, regRow+i);-
1524 }else-
1525#endif-
1526 {-
1527 int iRead;-
1528 if( aOutEx[i].u.x.iOrderByCol ){
aOutEx[i].u.x.iOrderByColDescription
TRUEevaluated 7865 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 33290 times by 1 test
Evaluated by:
  • Self test (438)
7865-33290
1529 iRead = aOutEx[i].u.x.iOrderByCol-1;-
1530 }else{
executed 7865 times by 1 test: end of block
Executed by:
  • Self test (438)
7865
1531 iRead = iCol--;-
1532 }
executed 33290 times by 1 test: end of block
Executed by:
  • Self test (438)
33290
1533 sqlite3VdbeAddOp3(v, OP_Column, iSortTab, iRead, regRow+i);-
1534 VdbeComment((v, "%s", aOutEx[i].zName?aOutEx[i].zName : aOutEx[i].zSpan));-
1535 }-
1536 }
executed 41155 times by 1 test: end of block
Executed by:
  • Self test (438)
41155
1537 switch( eDest ){-
1538 case SRT_Table:
executed 1 time by 1 test: case 14:
Executed by:
  • Self test (438)
1
1539 case SRT_EphemTab: {
executed 2 times by 1 test: case 12:
Executed by:
  • Self test (438)
2
1540 sqlite3VdbeAddOp2(v, OP_NewRowid, iParm, regRowid);-
1541 sqlite3VdbeAddOp3(v, OP_Insert, iParm, regRow, regRowid);-
1542 sqlite3VdbeChangeP5(v, OPFLAG_APPEND);-
1543 break;
executed 3 times by 1 test: break;
Executed by:
  • Self test (438)
3
1544 }-
1545#ifndef SQLITE_OMIT_SUBQUERY-
1546 case SRT_Set: {
executed 51 times by 1 test: case 11:
Executed by:
  • Self test (438)
51
1547 assert( nColumn==sqlite3Strlen30(pDest->zAffSdst) );-
1548 sqlite3VdbeAddOp4(v, OP_MakeRecord, regRow, nColumn, regRowid,-
1549 pDest->zAffSdst, nColumn);-
1550 sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iParm, regRowid, regRow, nColumn);-
1551 break;
executed 51 times by 1 test: break;
Executed by:
  • Self test (438)
51
1552 }-
1553 case SRT_Mem: {
executed 112 times by 1 test: case 10:
Executed by:
  • Self test (438)
112
1554 /* The LIMIT clause will terminate the loop for us */-
1555 break;
executed 112 times by 1 test: break;
Executed by:
  • Self test (438)
112
1556 }-
1557#endif-
1558 default: {
executed 12960 times by 1 test: default:
Executed by:
  • Self test (438)
12960
1559 assert( eDest==SRT_Output || eDest==SRT_Coroutine ); -
1560 testcase( eDest==SRT_Output );-
1561 testcase( eDest==SRT_Coroutine );-
1562 if( eDest==SRT_Output ){
eDest==9Description
TRUEevaluated 10556 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 2404 times by 1 test
Evaluated by:
  • Self test (438)
2404-10556
1563 sqlite3VdbeAddOp2(v, OP_ResultRow, pDest->iSdst, nColumn);-
1564 }else{
executed 10556 times by 1 test: end of block
Executed by:
  • Self test (438)
10556
1565 sqlite3VdbeAddOp1(v, OP_Yield, pDest->iSDParm);-
1566 }
executed 2404 times by 1 test: end of block
Executed by:
  • Self test (438)
2404
1567 break;
executed 12960 times by 1 test: break;
Executed by:
  • Self test (438)
12960
1568 }-
1569 }-
1570 if( regRowid ){
regRowidDescription
TRUEevaluated 54 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 13072 times by 1 test
Evaluated by:
  • Self test (438)
54-13072
1571 if( eDest==SRT_Set ){
eDest==11Description
TRUEevaluated 51 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 3 times by 1 test
Evaluated by:
  • Self test (438)
3-51
1572 sqlite3ReleaseTempRange(pParse, regRow, nColumn);-
1573 }else{
executed 51 times by 1 test: end of block
Executed by:
  • Self test (438)
51
1574 sqlite3ReleaseTempReg(pParse, regRow);-
1575 }
executed 3 times by 1 test: end of block
Executed by:
  • Self test (438)
3
1576 sqlite3ReleaseTempReg(pParse, regRowid);-
1577 }
executed 54 times by 1 test: end of block
Executed by:
  • Self test (438)
54
1578 /* The bottom of the loop-
1579 */-
1580 sqlite3VdbeResolveLabel(v, addrContinue);-
1581 if( pSort->sortFlags & SORTFLAG_UseSorter ){
pSort->sortFlags & 0x01Description
TRUEevaluated 12332 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 794 times by 1 test
Evaluated by:
  • Self test (438)
794-12332
1582 sqlite3VdbeAddOp2(v, OP_SorterNext, iTab, addr); VdbeCoverage(v);-
1583 }else{
executed 12332 times by 1 test: end of block
Executed by:
  • Self test (438)
12332
1584 sqlite3VdbeAddOp2(v, OP_Next, iTab, addr); VdbeCoverage(v);-
1585 }
executed 794 times by 1 test: end of block
Executed by:
  • Self test (438)
794
1586 if( pSort->regReturn ) sqlite3VdbeAddOp1(v, OP_Return, pSort->regReturn);
executed 319 times by 1 test: sqlite3VdbeAddOp1(v, 66, pSort->regReturn);
Executed by:
  • Self test (438)
pSort->regReturnDescription
TRUEevaluated 319 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 12807 times by 1 test
Evaluated by:
  • Self test (438)
319-12807
1587 sqlite3VdbeResolveLabel(v, addrBreak);-
1588}
executed 13126 times by 1 test: end of block
Executed by:
  • Self test (438)
13126
1589-
1590/*-
1591** Return a pointer to a string containing the 'declaration type' of the-
1592** expression pExpr. The string may be treated as static by the caller.-
1593**-
1594** Also try to estimate the size of the returned value and return that-
1595** result in *pEstWidth.-
1596**-
1597** The declaration type is the exact datatype definition extracted from the-
1598** original CREATE TABLE statement if the expression is a column. The-
1599** declaration type for a ROWID field is INTEGER. Exactly when an expression-
1600** is considered a column can be complex in the presence of subqueries. The-
1601** result-set expression in all of the following SELECT statements is -
1602** considered a column by this function.-
1603**-
1604** SELECT col FROM tbl;-
1605** SELECT (SELECT col FROM tbl;-
1606** SELECT (SELECT col FROM tbl);-
1607** SELECT abc FROM (SELECT col AS abc FROM tbl);-
1608** -
1609** The declaration type for any expression other than a column is NULL.-
1610**-
1611** This routine has either 3 or 6 parameters depending on whether or not-
1612** the SQLITE_ENABLE_COLUMN_METADATA compile-time option is used.-
1613*/-
1614#ifdef SQLITE_ENABLE_COLUMN_METADATA-
1615# define columnType(A,B,C,D,E) columnTypeImpl(A,B,C,D,E)-
1616#else /* if !defined(SQLITE_ENABLE_COLUMN_METADATA) */-
1617# define columnType(A,B,C,D,E) columnTypeImpl(A,B)-
1618#endif-
1619static const char *columnTypeImpl(-
1620 NameContext *pNC, -
1621#ifndef SQLITE_ENABLE_COLUMN_METADATA-
1622 Expr *pExpr-
1623#else-
1624 Expr *pExpr,-
1625 const char **pzOrigDb,-
1626 const char **pzOrigTab,-
1627 const char **pzOrigCol-
1628#endif-
1629){-
1630 char const *zType = 0;-
1631 int j;-
1632#ifdef SQLITE_ENABLE_COLUMN_METADATA-
1633 char const *zOrigDb = 0;-
1634 char const *zOrigTab = 0;-
1635 char const *zOrigCol = 0;-
1636#endif-
1637-
1638 assert( pExpr!=0 );-
1639 assert( pNC->pSrcList!=0 );-
1640 assert( pExpr->op!=TK_AGG_COLUMN ); /* This routine runes before aggregates-
1641 ** are processed */-
1642 switch( pExpr->op ){-
1643 case TK_COLUMN: {
executed 230681 times by 435 tests: case 158:
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
230681
1644 /* The expression is a column. Locate the table the column is being-
1645 ** extracted from in NameContext.pSrcList. This table may be real-
1646 ** database table or a subquery.-
1647 */-
1648 Table *pTab = 0; /* Table structure column is extracted from */-
1649 Select *pS = 0; /* Select the column is extracted from */-
1650 int iCol = pExpr->iColumn; /* Index of column in pTab */-
1651 while( pNC && !pTab ){
pNCDescription
TRUEevaluated 461367 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 8 times by 1 test
Evaluated by:
  • Self test (438)
!pTabDescription
TRUEevaluated 230694 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 230673 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
8-461367
1652 SrcList *pTabList = pNC->pSrcList;-
1653 for(j=0;j<pTabList->nSrc && pTabList->a[j].iCursor!=pExpr->iTable;j++);
executed 96337 times by 1 test: ;
Executed by:
  • Self test (438)
j<pTabList->nSrcDescription
TRUEevaluated 327010 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 21 times by 1 test
Evaluated by:
  • Self test (438)
pTabList->a[j]...=pExpr->iTableDescription
TRUEevaluated 96337 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 230673 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
21-327010
1654 if( j<pTabList->nSrc ){
j<pTabList->nSrcDescription
TRUEevaluated 230673 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 21 times by 1 test
Evaluated by:
  • Self test (438)
21-230673
1655 pTab = pTabList->a[j].pTab;-
1656 pS = pTabList->a[j].pSelect;-
1657 }else{
executed 230673 times by 435 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
230673
1658 pNC = pNC->pNext;-
1659 }
executed 21 times by 1 test: end of block
Executed by:
  • Self test (438)
21
1660 }-
1661-
1662 if( pTab==0 ){
pTab==0Description
TRUEevaluated 8 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 230673 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
8-230673
1663 /* At one time, code such as "SELECT new.x" within a trigger would-
1664 ** cause this condition to run. Since then, we have restructured how-
1665 ** trigger code is generated and so this condition is no longer -
1666 ** possible. However, it can still be true for statements like-
1667 ** the following:-
1668 **-
1669 ** CREATE TABLE t1(col INTEGER);-
1670 ** SELECT (SELECT t1.col) FROM FROM t1;-
1671 **-
1672 ** when columnType() is called on the expression "t1.col" in the -
1673 ** sub-select. In this case, set the column type to NULL, even-
1674 ** though it should really be "INTEGER".-
1675 **-
1676 ** This is not a problem, as the column type of "t1.col" is never-
1677 ** used. When columnType() is called on the expression -
1678 ** "(SELECT t1.col)", the correct type is returned (see the TK_SELECT-
1679 ** branch below. */-
1680 break;
executed 8 times by 1 test: break;
Executed by:
  • Self test (438)
8
1681 }-
1682-
1683 assert( pTab && pExpr->y.pTab==pTab );-
1684 if( pS ){
pSDescription
TRUEevaluated 4706 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
FALSEevaluated 225967 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
4706-225967
1685 /* The "table" is actually a sub-select or a view in the FROM clause-
1686 ** of the SELECT statement. Return the declaration type and origin-
1687 ** data for the result-set column of the sub-select.-
1688 */-
1689 if( iCol>=0 && iCol<pS->pEList->nExpr ){
iCol>=0Description
TRUEevaluated 4704 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test (438)
iCol<pS->pEList->nExprDescription
TRUEevaluated 4703 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test (438)
1-4704
1690 /* If iCol is less than zero, then the expression requests the-
1691 ** rowid of the sub-select or view. This expression is legal (see -
1692 ** test case misc2.2.2) - it always evaluates to NULL.-
1693 */-
1694 NameContext sNC;-
1695 Expr *p = pS->pEList->a[iCol].pExpr;-
1696 sNC.pSrcList = pS->pSrc;-
1697 sNC.pNext = pNC;-
1698 sNC.pParse = pNC->pParse;-
1699 zType = columnType(&sNC, p,&zOrigDb,&zOrigTab,&zOrigCol); -
1700 }
executed 4703 times by 2 tests: end of block
Executed by:
  • Self test (438)
  • Self test (47)
4703
1701 }else{
executed 4706 times by 2 tests: end of block
Executed by:
  • Self test (438)
  • Self test (47)
4706
1702 /* A real table or a CTE table */-
1703 assert( !pS );-
1704#ifdef SQLITE_ENABLE_COLUMN_METADATA-
1705 if( iCol<0 ) iCol = pTab->iPKey;-
1706 assert( iCol==XN_ROWID || (iCol>=0 && iCol<pTab->nCol) );-
1707 if( iCol<0 ){-
1708 zType = "INTEGER";-
1709 zOrigCol = "rowid";-
1710 }else{-
1711 zOrigCol = pTab->aCol[iCol].zName;-
1712 zType = sqlite3ColumnType(&pTab->aCol[iCol],0);-
1713 }-
1714 zOrigTab = pTab->zName;-
1715 if( pNC->pParse && pTab->pSchema ){-
1716 int iDb = sqlite3SchemaToIndex(pNC->pParse->db, pTab->pSchema);-
1717 zOrigDb = pNC->pParse->db->aDb[iDb].zDbSName;-
1718 }-
1719#else-
1720 assert( iCol==XN_ROWID || (iCol>=0 && iCol<pTab->nCol) );-
1721 if( iCol<0 ){
iCol<0Description
TRUEevaluated 34924 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 191043 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
34924-191043
1722 zType = "INTEGER";-
1723 }else{
executed 34924 times by 1 test: end of block
Executed by:
  • Self test (438)
34924
1724 zType = sqlite3ColumnType(&pTab->aCol[iCol],0);-
1725 }
executed 191043 times by 435 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
191043
1726#endif-
1727 }-
1728 break;
executed 230673 times by 435 tests: break;
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
230673
1729 }-
1730#ifndef SQLITE_OMIT_SUBQUERY-
1731 case TK_SELECT: {
executed 283 times by 1 test: case 127:
Executed by:
  • Self test (438)
283
1732 /* The expression is a sub-select. Return the declaration type and-
1733 ** origin info for the single column in the result set of the SELECT-
1734 ** statement.-
1735 */-
1736 NameContext sNC;-
1737 Select *pS = pExpr->x.pSelect;-
1738 Expr *p = pS->pEList->a[0].pExpr;-
1739 assert( ExprHasProperty(pExpr, EP_xIsSelect) );-
1740 sNC.pSrcList = pS->pSrc;-
1741 sNC.pNext = pNC;-
1742 sNC.pParse = pNC->pParse;-
1743 zType = columnType(&sNC, p, &zOrigDb, &zOrigTab, &zOrigCol); -
1744 break;
executed 283 times by 1 test: break;
Executed by:
  • Self test (438)
283
1745 }-
1746#endif-
1747 }-
1748-
1749#ifdef SQLITE_ENABLE_COLUMN_METADATA -
1750 if( pzOrigDb ){-
1751 assert( pzOrigTab && pzOrigCol );-
1752 *pzOrigDb = zOrigDb;-
1753 *pzOrigTab = zOrigTab;-
1754 *pzOrigCol = zOrigCol;-
1755 }-
1756#endif-
1757 return zType;
executed 352134 times by 435 tests: return zType;
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
352134
1758}-
1759-
1760/*-
1761** Generate code that will tell the VDBE the declaration types of columns-
1762** in the result set.-
1763*/-
1764static void generateColumnTypes(-
1765 Parse *pParse, /* Parser context */-
1766 SrcList *pTabList, /* List of tables */-
1767 ExprList *pEList /* Expressions defining the result set */-
1768){-
1769#ifndef SQLITE_OMIT_DECLTYPE-
1770 Vdbe *v = pParse->pVdbe;-
1771 int i;-
1772 NameContext sNC;-
1773 sNC.pSrcList = pTabList;-
1774 sNC.pParse = pParse;-
1775 sNC.pNext = 0;-
1776 for(i=0; i<pEList->nExpr; i++){
i<pEList->nExprDescription
TRUEevaluated 337405 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 177049 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
177049-337405
1777 Expr *p = pEList->a[i].pExpr;-
1778 const char *zType;-
1779#ifdef SQLITE_ENABLE_COLUMN_METADATA-
1780 const char *zOrigDb = 0;-
1781 const char *zOrigTab = 0;-
1782 const char *zOrigCol = 0;-
1783 zType = columnType(&sNC, p, &zOrigDb, &zOrigTab, &zOrigCol);-
1784-
1785 /* The vdbe must make its own copy of the column-type and other -
1786 ** column specific strings, in case the schema is reset before this-
1787 ** virtual machine is deleted.-
1788 */-
1789 sqlite3VdbeSetColName(v, i, COLNAME_DATABASE, zOrigDb, SQLITE_TRANSIENT);-
1790 sqlite3VdbeSetColName(v, i, COLNAME_TABLE, zOrigTab, SQLITE_TRANSIENT);-
1791 sqlite3VdbeSetColName(v, i, COLNAME_COLUMN, zOrigCol, SQLITE_TRANSIENT);-
1792#else-
1793 zType = columnType(&sNC, p, 0, 0, 0);-
1794#endif-
1795 sqlite3VdbeSetColName(v, i, COLNAME_DECLTYPE, zType, SQLITE_TRANSIENT);-
1796 }
executed 337405 times by 435 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
337405
1797#endif /* !defined(SQLITE_OMIT_DECLTYPE) */-
1798}
executed 177049 times by 435 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
177049
1799-
1800-
1801/*-
1802** Compute the column names for a SELECT statement.-
1803**-
1804** The only guarantee that SQLite makes about column names is that if the-
1805** column has an AS clause assigning it a name, that will be the name used.-
1806** That is the only documented guarantee. However, countless applications-
1807** developed over the years have made baseless assumptions about column names-
1808** and will break if those assumptions changes. Hence, use extreme caution-
1809** when modifying this routine to avoid breaking legacy.-
1810**-
1811** See Also: sqlite3ColumnsFromExprList()-
1812**-
1813** The PRAGMA short_column_names and PRAGMA full_column_names settings are-
1814** deprecated. The default setting is short=ON, full=OFF. 99.9% of all-
1815** applications should operate this way. Nevertheless, we need to support the-
1816** other modes for legacy:-
1817**-
1818** short=OFF, full=OFF: Column name is the text of the expression has it-
1819** originally appears in the SELECT statement. In-
1820** other words, the zSpan of the result expression.-
1821**-
1822** short=ON, full=OFF: (This is the default setting). If the result-
1823** refers directly to a table column, then the-
1824** result column name is just the table column-
1825** name: COLUMN. Otherwise use zSpan.-
1826**-
1827** full=ON, short=ANY: If the result refers directly to a table column,-
1828** then the result column name with the table name-
1829** prefix, ex: TABLE.COLUMN. Otherwise use zSpan.-
1830*/-
1831static void generateColumnNames(-
1832 Parse *pParse, /* Parser context */-
1833 Select *pSelect /* Generate column names for this SELECT statement */-
1834){-
1835 Vdbe *v = pParse->pVdbe;-
1836 int i;-
1837 Table *pTab;-
1838 SrcList *pTabList;-
1839 ExprList *pEList;-
1840 sqlite3 *db = pParse->db;-
1841 int fullName; /* TABLE.COLUMN if no AS clause and is a direct table ref */-
1842 int srcName; /* COLUMN or TABLE.COLUMN if no AS clause and is direct */-
1843-
1844#ifndef SQLITE_OMIT_EXPLAIN-
1845 /* If this is an EXPLAIN, skip this step */-
1846 if( pParse->explain ){
pParse->explainDescription
TRUEevaluated 909 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 179402 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
909-179402
1847 return;
executed 909 times by 1 test: return;
Executed by:
  • Self test (438)
909
1848 }-
1849#endif-
1850-
1851 if( pParse->colNamesSet ) return;
executed 2353 times by 1 test: return;
Executed by:
  • Self test (438)
pParse->colNamesSetDescription
TRUEevaluated 2353 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 177049 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
2353-177049
1852 /* Column names are determined by the left-most term of a compound select */-
1853 while( pSelect->pPrior ) pSelect = pSelect->pPrior;
executed 1644 times by 1 test: pSelect = pSelect->pPrior;
Executed by:
  • Self test (438)
pSelect->pPriorDescription
TRUEevaluated 1644 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 177049 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
1644-177049
1854 SELECTTRACE(1,pParse,pSelect,("generating column names\n"));-
1855 pTabList = pSelect->pSrc;-
1856 pEList = pSelect->pEList;-
1857 assert( v!=0 );-
1858 assert( pTabList!=0 );-
1859 pParse->colNamesSet = 1;-
1860 fullName = (db->flags & SQLITE_FullColNames)!=0;-
1861 srcName = (db->flags & SQLITE_ShortColNames)!=0 || fullName;
(db->flags & 0x00000040)!=0Description
TRUEevaluated 177010 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 39 times by 1 test
Evaluated by:
  • Self test (438)
fullNameDescription
TRUEevaluated 25 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 14 times by 1 test
Evaluated by:
  • Self test (438)
14-177010
1862 sqlite3VdbeSetNumCols(v, pEList->nExpr);-
1863 for(i=0; i<pEList->nExpr; i++){
i<pEList->nExprDescription
TRUEevaluated 337405 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 177049 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
177049-337405
1864 Expr *p = pEList->a[i].pExpr;-
1865-
1866 assert( p!=0 );-
1867 assert( p->op!=TK_AGG_COLUMN ); /* Agg processing has not run yet */-
1868 assert( p->op!=TK_COLUMN || p->y.pTab!=0 ); /* Covering idx not yet coded */-
1869 if( pEList->a[i].zName ){
pEList->a[i].zNameDescription
TRUEevaluated 55015 times by 54 tests
Evaluated by:
  • Self test (10)
  • Self test (101)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (12)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (16)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (20)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (27)
  • Self test (3)
  • Self test (30)
  • Self test (35)
  • Self test (36)
  • Self test (37)
  • Self test (4)
  • ...
FALSEevaluated 282390 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
55015-282390
1870 /* An AS clause always takes first priority */-
1871 char *zName = pEList->a[i].zName;-
1872 sqlite3VdbeSetColName(v, i, COLNAME_NAME, zName, SQLITE_TRANSIENT);-
1873 }else if( srcName && p->op==TK_COLUMN ){
executed 55015 times by 54 tests: end of block
Executed by:
  • Self test (10)
  • Self test (101)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (12)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (16)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (20)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (27)
  • Self test (3)
  • Self test (30)
  • Self test (35)
  • Self test (36)
  • Self test (37)
  • Self test (4)
  • ...
srcNameDescription
TRUEevaluated 282373 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 17 times by 1 test
Evaluated by:
  • Self test (438)
p->op==158Description
TRUEevaluated 167820 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 114553 times by 4 tests
Evaluated by:
  • Self test (103)
  • Self test (104)
  • Self test (34)
  • Self test (438)
17-282373
1874 char *zCol;-
1875 int iCol = p->iColumn;-
1876 pTab = p->y.pTab;-
1877 assert( pTab!=0 );-
1878 if( iCol<0 ) iCol = pTab->iPKey;
executed 23161 times by 1 test: iCol = pTab->iPKey;
Executed by:
  • Self test (438)
iCol<0Description
TRUEevaluated 23161 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 144659 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
23161-144659
1879 assert( iCol==-1 || (iCol>=0 && iCol<pTab->nCol) );-
1880 if( iCol<0 ){
iCol<0Description
TRUEevaluated 8630 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 159190 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
8630-159190
1881 zCol = "rowid";-
1882 }else{
executed 8630 times by 1 test: end of block
Executed by:
  • Self test (438)
8630
1883 zCol = pTab->aCol[iCol].zName;-
1884 }
executed 159190 times by 435 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
159190
1885 if( fullName ){
fullNameDescription
TRUEevaluated 62 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 167758 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
62-167758
1886 char *zName = 0;-
1887 zName = sqlite3MPrintf(db, "%s.%s", pTab->zName, zCol);-
1888 sqlite3VdbeSetColName(v, i, COLNAME_NAME, zName, SQLITE_DYNAMIC);-
1889 }else{
executed 62 times by 1 test: end of block
Executed by:
  • Self test (438)
62
1890 sqlite3VdbeSetColName(v, i, COLNAME_NAME, zCol, SQLITE_TRANSIENT);-
1891 }
executed 167758 times by 435 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
167758
1892 }else{-
1893 const char *z = pEList->a[i].zSpan;-
1894 z = z==0 ? sqlite3MPrintf(db, "column%d", i+1) : sqlite3DbStrDup(db, z);
z==0Description
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 114564 times by 4 tests
Evaluated by:
  • Self test (103)
  • Self test (104)
  • Self test (34)
  • Self test (438)
6-114564
1895 sqlite3VdbeSetColName(v, i, COLNAME_NAME, z, SQLITE_DYNAMIC);-
1896 }
executed 114570 times by 4 tests: end of block
Executed by:
  • Self test (103)
  • Self test (104)
  • Self test (34)
  • Self test (438)
114570
1897 }-
1898 generateColumnTypes(pParse, pTabList, pEList);-
1899}
executed 177049 times by 435 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
177049
1900-
1901/*-
1902** Given an expression list (which is really the list of expressions-
1903** that form the result set of a SELECT statement) compute appropriate-
1904** column names for a table that would hold the expression list.-
1905**-
1906** All column names will be unique.-
1907**-
1908** Only the column names are computed. Column.zType, Column.zColl,-
1909** and other fields of Column are zeroed.-
1910**-
1911** Return SQLITE_OK on success. If a memory allocation error occurs,-
1912** store NULL in *paCol and 0 in *pnCol and return SQLITE_NOMEM.-
1913**-
1914** The only guarantee that SQLite makes about column names is that if the-
1915** column has an AS clause assigning it a name, that will be the name used.-
1916** That is the only documented guarantee. However, countless applications-
1917** developed over the years have made baseless assumptions about column names-
1918** and will break if those assumptions changes. Hence, use extreme caution-
1919** when modifying this routine to avoid breaking legacy.-
1920**-
1921** See Also: generateColumnNames()-
1922*/-
1923int sqlite3ColumnsFromExprList(-
1924 Parse *pParse, /* Parsing context */-
1925 ExprList *pEList, /* Expr list from which to derive column names */-
1926 i16 *pnCol, /* Write the number of columns here */-
1927 Column **paCol /* Write the new column list here */-
1928){-
1929 sqlite3 *db = pParse->db; /* Database connection */-
1930 int i, j; /* Loop counters */-
1931 u32 cnt; /* Index added to make the name unique */-
1932 Column *aCol, *pCol; /* For looping over result columns */-
1933 int nCol; /* Number of columns in the result set */-
1934 char *zName; /* Column name */-
1935 int nName; /* Size of name in zName[] */-
1936 Hash ht; /* Hash table of column names */-
1937-
1938 sqlite3HashInit(&ht);-
1939 if( pEList ){
pEListDescription
TRUEevaluated 5418 times by 5 tests
Evaluated by:
  • Self test
  • Self test (438)
  • Self test (47)
  • Self test (57)
  • Self test (58)
FALSEevaluated 41 times by 1 test
Evaluated by:
  • Self test (438)
41-5418
1940 nCol = pEList->nExpr;-
1941 aCol = sqlite3DbMallocZero(db, sizeof(aCol[0])*nCol);-
1942 testcase( aCol==0 );-
1943 if( nCol>32767 ) nCol = 32767;
never executed: nCol = 32767;
nCol>32767Description
TRUEnever evaluated
FALSEevaluated 5418 times by 5 tests
Evaluated by:
  • Self test
  • Self test (438)
  • Self test (47)
  • Self test (57)
  • Self test (58)
0-5418
1944 }else{
executed 5418 times by 5 tests: end of block
Executed by:
  • Self test
  • Self test (438)
  • Self test (47)
  • Self test (57)
  • Self test (58)
5418
1945 nCol = 0;-
1946 aCol = 0;-
1947 }
executed 41 times by 1 test: end of block
Executed by:
  • Self test (438)
41
1948 assert( nCol==(i16)nCol );-
1949 *pnCol = nCol;-
1950 *paCol = aCol;-
1951-
1952 for(i=0, pCol=aCol; i<nCol && !db->mallocFailed; i++, pCol++){
i<nColDescription
TRUEevaluated 19150 times by 5 tests
Evaluated by:
  • Self test
  • Self test (438)
  • Self test (47)
  • Self test (57)
  • Self test (58)
FALSEevaluated 4701 times by 5 tests
Evaluated by:
  • Self test
  • Self test (438)
  • Self test (47)
  • Self test (57)
  • Self test (58)
!db->mallocFailedDescription
TRUEevaluated 18392 times by 5 tests
Evaluated by:
  • Self test
  • Self test (438)
  • Self test (47)
  • Self test (57)
  • Self test (58)
FALSEevaluated 758 times by 1 test
Evaluated by:
  • Self test (438)
758-19150
1953 /* Get an appropriate name for the column-
1954 */-
1955 if( (zName = pEList->a[i].zName)!=0 ){
(zName = pELis...a[i].zName)!=0Description
TRUEevaluated 9773 times by 5 tests
Evaluated by:
  • Self test
  • Self test (438)
  • Self test (47)
  • Self test (57)
  • Self test (58)
FALSEevaluated 8619 times by 1 test
Evaluated by:
  • Self test (438)
8619-9773
1956 /* If the column contains an "AS <name>" phrase, use <name> as the name */-
1957 }else{
executed 9773 times by 5 tests: end of block
Executed by:
  • Self test
  • Self test (438)
  • Self test (47)
  • Self test (57)
  • Self test (58)
9773
1958 Expr *pColExpr = sqlite3ExprSkipCollate(pEList->a[i].pExpr);-
1959 while( pColExpr->op==TK_DOT ){
pColExpr->op==130Description
TRUEevaluated 20 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 8619 times by 1 test
Evaluated by:
  • Self test (438)
20-8619
1960 pColExpr = pColExpr->pRight;-
1961 assert( pColExpr!=0 );-
1962 }
executed 20 times by 1 test: end of block
Executed by:
  • Self test (438)
20
1963 assert( pColExpr->op!=TK_AGG_COLUMN );-
1964 if( pColExpr->op==TK_COLUMN ){
pColExpr->op==158Description
TRUEevaluated 5551 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 3068 times by 1 test
Evaluated by:
  • Self test (438)
3068-5551
1965 /* For columns use the column name name */-
1966 int iCol = pColExpr->iColumn;-
1967 Table *pTab = pColExpr->y.pTab;-
1968 assert( pTab!=0 );-
1969 if( iCol<0 ) iCol = pTab->iPKey;
executed 2349 times by 1 test: iCol = pTab->iPKey;
Executed by:
  • Self test (438)
iCol<0Description
TRUEevaluated 2349 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 3202 times by 1 test
Evaluated by:
  • Self test (438)
2349-3202
1970 zName = iCol>=0 ? pTab->aCol[iCol].zName : "rowid";
iCol>=0Description
TRUEevaluated 5546 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 5 times by 1 test
Evaluated by:
  • Self test (438)
5-5546
1971 }else if( pColExpr->op==TK_ID ){
executed 5551 times by 1 test: end of block
Executed by:
  • Self test (438)
pColExpr->op==59Description
TRUEevaluated 670 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 2398 times by 1 test
Evaluated by:
  • Self test (438)
670-5551
1972 assert( !ExprHasProperty(pColExpr, EP_IntValue) );-
1973 zName = pColExpr->u.zToken;-
1974 }else{
executed 670 times by 1 test: end of block
Executed by:
  • Self test (438)
670
1975 /* Use the original text of the column expression as its name */-
1976 zName = pEList->a[i].zSpan;-
1977 }
executed 2398 times by 1 test: end of block
Executed by:
  • Self test (438)
2398
1978 }-
1979 if( zName ){
zNameDescription
TRUEevaluated 16232 times by 5 tests
Evaluated by:
  • Self test
  • Self test (438)
  • Self test (47)
  • Self test (57)
  • Self test (58)
FALSEevaluated 2160 times by 1 test
Evaluated by:
  • Self test (438)
2160-16232
1980 zName = sqlite3DbStrDup(db, zName);-
1981 }else{
executed 16232 times by 5 tests: end of block
Executed by:
  • Self test
  • Self test (438)
  • Self test (47)
  • Self test (57)
  • Self test (58)
16232
1982 zName = sqlite3MPrintf(db,"column%d",i+1);-
1983 }
executed 2160 times by 1 test: end of block
Executed by:
  • Self test (438)
2160
1984-
1985 /* Make sure the column name is unique. If the name is not unique,-
1986 ** append an integer to the name so that it becomes unique.-
1987 */-
1988 cnt = 0;-
1989 while( zName && sqlite3HashFind(&ht, zName)!=0 ){
zNameDescription
TRUEevaluated 20540 times by 5 tests
Evaluated by:
  • Self test
  • Self test (438)
  • Self test (47)
  • Self test (57)
  • Self test (58)
FALSEevaluated 21 times by 1 test
Evaluated by:
  • Self test (438)
sqlite3HashFind(&ht, zName)!=0Description
TRUEevaluated 2169 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 18371 times by 5 tests
Evaluated by:
  • Self test
  • Self test (438)
  • Self test (47)
  • Self test (57)
  • Self test (58)
21-20540
1990 nName = sqlite3Strlen30(zName);-
1991 if( nName>0 ){
nName>0Description
TRUEevaluated 2165 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 4 times by 1 test
Evaluated by:
  • Self test (438)
4-2165
1992 for(j=nName-1; j>0 && sqlite3Isdigit(zName[j]); j--){}
executed 658 times by 1 test: end of block
Executed by:
  • Self test (438)
j>0Description
TRUEevaluated 1348 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1475 times by 1 test
Evaluated by:
  • Self test (438)
(sqlite3CtypeM...ame[j])]&0x04)Description
TRUEevaluated 658 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 690 times by 1 test
Evaluated by:
  • Self test (438)
658-1475
1993 if( zName[j]==':' ) nName = j;
executed 655 times by 1 test: nName = j;
Executed by:
  • Self test (438)
zName[j]==':'Description
TRUEevaluated 655 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1510 times by 1 test
Evaluated by:
  • Self test (438)
655-1510
1994 }
executed 2165 times by 1 test: end of block
Executed by:
  • Self test (438)
2165
1995 zName = sqlite3MPrintf(db, "%.*z:%u", nName, zName, ++cnt);-
1996 if( cnt>3 ) sqlite3_randomness(sizeof(cnt), &cnt);
executed 65 times by 1 test: sqlite3_randomness(sizeof(cnt), &cnt);
Executed by:
  • Self test (438)
cnt>3Description
TRUEevaluated 65 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 2104 times by 1 test
Evaluated by:
  • Self test (438)
65-2104
1997 }
executed 2169 times by 1 test: end of block
Executed by:
  • Self test (438)
2169
1998 pCol->zName = zName;-
1999 sqlite3ColumnPropertiesFromName(0, pCol);-
2000 if( zName && sqlite3HashInsert(&ht, zName, pCol)==pCol ){
zNameDescription
TRUEevaluated 18371 times by 5 tests
Evaluated by:
  • Self test
  • Self test (438)
  • Self test (47)
  • Self test (57)
  • Self test (58)
FALSEevaluated 21 times by 1 test
Evaluated by:
  • Self test (438)
sqlite3HashIns...e, pCol)==pColDescription
TRUEevaluated 19 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 18352 times by 5 tests
Evaluated by:
  • Self test
  • Self test (438)
  • Self test (47)
  • Self test (57)
  • Self test (58)
19-18371
2001 sqlite3OomFault(db);-
2002 }
executed 19 times by 1 test: end of block
Executed by:
  • Self test (438)
19
2003 }
executed 18392 times by 5 tests: end of block
Executed by:
  • Self test
  • Self test (438)
  • Self test (47)
  • Self test (57)
  • Self test (58)
18392
2004 sqlite3HashClear(&ht);-
2005 if( db->mallocFailed ){
db->mallocFailedDescription
TRUEevaluated 818 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 4641 times by 5 tests
Evaluated by:
  • Self test
  • Self test (438)
  • Self test (47)
  • Self test (57)
  • Self test (58)
818-4641
2006 for(j=0; j<i; j++){
j<iDescription
TRUEevaluated 60 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 818 times by 1 test
Evaluated by:
  • Self test (438)
60-818
2007 sqlite3DbFree(db, aCol[j].zName);-
2008 }
executed 60 times by 1 test: end of block
Executed by:
  • Self test (438)
60
2009 sqlite3DbFree(db, aCol);-
2010 *paCol = 0;-
2011 *pnCol = 0;-
2012 return SQLITE_NOMEM_BKPT;
executed 818 times by 1 test: return 7;
Executed by:
  • Self test (438)
818
2013 }-
2014 return SQLITE_OK;
executed 4641 times by 5 tests: return 0;
Executed by:
  • Self test
  • Self test (438)
  • Self test (47)
  • Self test (57)
  • Self test (58)
4641
2015}-
2016-
2017/*-
2018** Add type and collation information to a column list based on-
2019** a SELECT statement.-
2020** -
2021** The column list presumably came from selectColumnNamesFromExprList().-
2022** The column list has only names, not types or collations. This-
2023** routine goes through and adds the types and collations.-
2024**-
2025** This routine requires that all identifiers in the SELECT-
2026** statement be resolved.-
2027*/-
2028void sqlite3SelectAddColumnTypeAndCollation(-
2029 Parse *pParse, /* Parsing contexts */-
2030 Table *pTab, /* Add column type information to this table */-
2031 Select *pSelect /* SELECT used to determine types and collations */-
2032){-
2033 sqlite3 *db = pParse->db;-
2034 NameContext sNC;-
2035 Column *pCol;-
2036 CollSeq *pColl;-
2037 int i;-
2038 Expr *p;-
2039 struct ExprList_item *a;-
2040-
2041 assert( pSelect!=0 );-
2042 assert( (pSelect->selFlags & SF_Resolved)!=0 );-
2043 assert( pTab->nCol==pSelect->pEList->nExpr || db->mallocFailed );-
2044 if( db->mallocFailed ) return;
executed 24 times by 1 test: return;
Executed by:
  • Self test (438)
db->mallocFailedDescription
TRUEevaluated 24 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 2628 times by 5 tests
Evaluated by:
  • Self test
  • Self test (438)
  • Self test (47)
  • Self test (57)
  • Self test (58)
24-2628
2045 memset(&sNC, 0, sizeof(sNC));-
2046 sNC.pSrcList = pSelect->pSrc;-
2047 a = pSelect->pEList->a;-
2048 for(i=0, pCol=pTab->aCol; i<pTab->nCol; i++, pCol++){
i<pTab->nColDescription
TRUEevaluated 9743 times by 5 tests
Evaluated by:
  • Self test
  • Self test (438)
  • Self test (47)
  • Self test (57)
  • Self test (58)
FALSEevaluated 2628 times by 5 tests
Evaluated by:
  • Self test
  • Self test (438)
  • Self test (47)
  • Self test (57)
  • Self test (58)
2628-9743
2049 const char *zType;-
2050 int n, m;-
2051 p = a[i].pExpr;-
2052 zType = columnType(&sNC, p, 0, 0, 0);-
2053 /* pCol->szEst = ... // Column size est for SELECT tables never used */-
2054 pCol->affinity = sqlite3ExprAffinity(p);-
2055 if( zType ){
zTypeDescription
TRUEevaluated 2582 times by 4 tests
Evaluated by:
  • Self test
  • Self test (438)
  • Self test (57)
  • Self test (58)
FALSEevaluated 7161 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
2582-7161
2056 m = sqlite3Strlen30(zType);-
2057 n = sqlite3Strlen30(pCol->zName);-
2058 pCol->zName = sqlite3DbReallocOrFree(db, pCol->zName, n+m+2);-
2059 if( pCol->zName ){
pCol->zNameDescription
TRUEevaluated 2549 times by 4 tests
Evaluated by:
  • Self test
  • Self test (438)
  • Self test (57)
  • Self test (58)
FALSEevaluated 33 times by 1 test
Evaluated by:
  • Self test (438)
33-2549
2060 memcpy(&pCol->zName[n+1], zType, m+1);-
2061 pCol->colFlags |= COLFLAG_HASTYPE;-
2062 }
executed 2549 times by 4 tests: end of block
Executed by:
  • Self test
  • Self test (438)
  • Self test (57)
  • Self test (58)
2549
2063 }
executed 2582 times by 4 tests: end of block
Executed by:
  • Self test
  • Self test (438)
  • Self test (57)
  • Self test (58)
2582
2064 if( pCol->affinity==0 ) pCol->affinity = SQLITE_AFF_BLOB;
executed 5539 times by 1 test: pCol->affinity = 'A';
Executed by:
  • Self test (438)
pCol->affinity==0Description
TRUEevaluated 5539 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 4204 times by 5 tests
Evaluated by:
  • Self test
  • Self test (438)
  • Self test (47)
  • Self test (57)
  • Self test (58)
4204-5539
2065 pColl = sqlite3ExprCollSeq(pParse, p);-
2066 if( pColl && pCol->zColl==0 ){
pCollDescription
TRUEevaluated 3477 times by 5 tests
Evaluated by:
  • Self test
  • Self test (438)
  • Self test (47)
  • Self test (57)
  • Self test (58)
FALSEevaluated 6266 times by 1 test
Evaluated by:
  • Self test (438)
pCol->zColl==0Description
TRUEevaluated 3472 times by 5 tests
Evaluated by:
  • Self test
  • Self test (438)
  • Self test (47)
  • Self test (57)
  • Self test (58)
FALSEevaluated 5 times by 1 test
Evaluated by:
  • Self test (438)
5-6266
2067 pCol->zColl = sqlite3DbStrDup(db, pColl->zName);-
2068 }
executed 3472 times by 5 tests: end of block
Executed by:
  • Self test
  • Self test (438)
  • Self test (47)
  • Self test (57)
  • Self test (58)
3472
2069 }
executed 9743 times by 5 tests: end of block
Executed by:
  • Self test
  • Self test (438)
  • Self test (47)
  • Self test (57)
  • Self test (58)
9743
2070 pTab->szTabRow = 1; /* Any non-zero value works */-
2071}
executed 2628 times by 5 tests: end of block
Executed by:
  • Self test
  • Self test (438)
  • Self test (47)
  • Self test (57)
  • Self test (58)
2628
2072-
2073/*-
2074** Given a SELECT statement, generate a Table structure that describes-
2075** the result set of that SELECT.-
2076*/-
2077Table *sqlite3ResultSetOfSelect(Parse *pParse, Select *pSelect){-
2078 Table *pTab;-
2079 sqlite3 *db = pParse->db;-
2080 int savedFlags;-
2081-
2082 savedFlags = db->flags;-
2083 db->flags &= ~SQLITE_FullColNames;-
2084 db->flags |= SQLITE_ShortColNames;-
2085 sqlite3SelectPrep(pParse, pSelect, 0);-
2086 if( pParse->nErr ) return 0;
executed 16 times by 1 test: return 0;
Executed by:
  • Self test (438)
pParse->nErrDescription
TRUEevaluated 16 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 980 times by 5 tests
Evaluated by:
  • Self test
  • Self test (438)
  • Self test (47)
  • Self test (57)
  • Self test (58)
16-980
2087 while( pSelect->pPrior ) pSelect = pSelect->pPrior;
executed 49 times by 1 test: pSelect = pSelect->pPrior;
Executed by:
  • Self test (438)
pSelect->pPriorDescription
TRUEevaluated 49 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 980 times by 5 tests
Evaluated by:
  • Self test
  • Self test (438)
  • Self test (47)
  • Self test (57)
  • Self test (58)
49-980
2088 db->flags = savedFlags;-
2089 pTab = sqlite3DbMallocZero(db, sizeof(Table) );-
2090 if( pTab==0 ){
pTab==0Description
TRUEnever evaluated
FALSEevaluated 980 times by 5 tests
Evaluated by:
  • Self test
  • Self test (438)
  • Self test (47)
  • Self test (57)
  • Self test (58)
0-980
2091 return 0;
never executed: return 0;
0
2092 }-
2093 /* The sqlite3ResultSetOfSelect() is only used n contexts where lookaside-
2094 ** is disabled */-
2095 assert( db->lookaside.bDisable );-
2096 pTab->nTabRef = 1;-
2097 pTab->zName = 0;-
2098 pTab->nRowLogEst = 200; assert( 200==sqlite3LogEst(1048576) );-
2099 sqlite3ColumnsFromExprList(pParse, pSelect->pEList, &pTab->nCol, &pTab->aCol);-
2100 sqlite3SelectAddColumnTypeAndCollation(pParse, pTab, pSelect);-
2101 pTab->iPKey = -1;-
2102 if( db->mallocFailed ){
db->mallocFailedDescription
TRUEnever evaluated
FALSEevaluated 980 times by 5 tests
Evaluated by:
  • Self test
  • Self test (438)
  • Self test (47)
  • Self test (57)
  • Self test (58)
0-980
2103 sqlite3DeleteTable(db, pTab);-
2104 return 0;
never executed: return 0;
0
2105 }-
2106 return pTab;
executed 980 times by 5 tests: return pTab;
Executed by:
  • Self test
  • Self test (438)
  • Self test (47)
  • Self test (57)
  • Self test (58)
980
2107}-
2108-
2109/*-
2110** Get a VDBE for the given parser context. Create a new one if necessary.-
2111** If an error occurs, return NULL and leave a message in pParse.-
2112*/-
2113Vdbe *sqlite3GetVdbe(Parse *pParse){-
2114 if( pParse->pVdbe ){
pParse->pVdbeDescription
TRUEevaluated 1696704 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 460643 times by 436 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
460643-1696704
2115 return pParse->pVdbe;
executed 1696704 times by 435 tests: return pParse->pVdbe;
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
1696704
2116 }-
2117 if( pParse->pToplevel==0
pParse->pToplevel==0Description
TRUEevaluated 454619 times by 436 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 6024 times by 1 test
Evaluated by:
  • Self test (438)
6024-454619
2118 && OptimizationEnabled(pParse->db,SQLITE_FactorOutConst)
(((pParse->db)...&(0x0008))==0)Description
TRUEevaluated 454454 times by 436 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 165 times by 1 test
Evaluated by:
  • Self test (438)
165-454454
2119 ){-
2120 pParse->okConstFactor = 1;-
2121 }
executed 454454 times by 436 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
454454
2122 return sqlite3VdbeCreate(pParse);
executed 460643 times by 436 tests: return sqlite3VdbeCreate(pParse);
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
460643
2123}-
2124-
2125-
2126/*-
2127** Compute the iLimit and iOffset fields of the SELECT based on the-
2128** pLimit expressions. pLimit->pLeft and pLimit->pRight hold the expressions-
2129** that appear in the original SQL statement after the LIMIT and OFFSET-
2130** keywords. Or NULL if those keywords are omitted. iLimit and iOffset -
2131** are the integer memory register numbers for counters used to compute -
2132** the limit and offset. If there is no limit and/or offset, then -
2133** iLimit and iOffset are negative.-
2134**-
2135** This routine changes the values of iLimit and iOffset only if-
2136** a limit or offset is defined by pLimit->pLeft and pLimit->pRight. iLimit-
2137** and iOffset should have been preset to appropriate default values (zero)-
2138** prior to calling this routine.-
2139**-
2140** The iOffset register (if it exists) is initialized to the value-
2141** of the OFFSET. The iLimit register is initialized to LIMIT. Register-
2142** iOffset+1 is initialized to LIMIT+OFFSET.-
2143**-
2144** Only if pLimit->pLeft!=0 do the limit registers get-
2145** redefined. The UNION ALL operator uses this property to force-
2146** the reuse of the same limit and offset registers across multiple-
2147** SELECT statements.-
2148*/-
2149static void computeLimitRegisters(Parse *pParse, Select *p, int iBreak){-
2150 Vdbe *v = 0;-
2151 int iLimit = 0;-
2152 int iOffset;-
2153 int n;-
2154 Expr *pLimit = p->pLimit;-
2155-
2156 if( p->iLimit ) return;
executed 403 times by 1 test: return;
Executed by:
  • Self test (438)
p->iLimitDescription
TRUEevaluated 403 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 312751 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
403-312751
2157-
2158 /* -
2159 ** "LIMIT -1" always shows all rows. There is some-
2160 ** controversy about what the correct behavior should be.-
2161 ** The current implementation interprets "LIMIT 0" to mean-
2162 ** no rows.-
2163 */-
2164 if( pLimit ){
pLimitDescription
TRUEevaluated 16521 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 296230 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
16521-296230
2165 assert( pLimit->op==TK_LIMIT );-
2166 assert( pLimit->pLeft!=0 );-
2167 p->iLimit = iLimit = ++pParse->nMem;-
2168 v = sqlite3GetVdbe(pParse);-
2169 assert( v!=0 );-
2170 if( sqlite3ExprIsInteger(pLimit->pLeft, &n) ){
sqlite3ExprIsI...it->pLeft, &n)Description
TRUEevaluated 16457 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 64 times by 1 test
Evaluated by:
  • Self test (438)
64-16457
2171 sqlite3VdbeAddOp2(v, OP_Integer, n, iLimit);-
2172 VdbeComment((v, "LIMIT counter"));-
2173 if( n==0 ){
n==0Description
TRUEevaluated 17 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 16440 times by 1 test
Evaluated by:
  • Self test (438)
17-16440
2174 sqlite3VdbeGoto(v, iBreak);-
2175 }else if( n>=0 && p->nSelectRow>sqlite3LogEst((u64)n) ){
executed 17 times by 1 test: end of block
Executed by:
  • Self test (438)
n>=0Description
TRUEevaluated 16222 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 218 times by 1 test
Evaluated by:
  • Self test (438)
p->nSelectRow>...LogEst((u64)n)Description
TRUEevaluated 15257 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 965 times by 1 test
Evaluated by:
  • Self test (438)
17-16222
2176 p->nSelectRow = sqlite3LogEst((u64)n);-
2177 p->selFlags |= SF_FixedLimit;-
2178 }
executed 15257 times by 1 test: end of block
Executed by:
  • Self test (438)
15257
2179 }else{
executed 16457 times by 1 test: end of block
Executed by:
  • Self test (438)
16457
2180 sqlite3ExprCode(pParse, pLimit->pLeft, iLimit);-
2181 sqlite3VdbeAddOp1(v, OP_MustBeInt, iLimit); VdbeCoverage(v);-
2182 VdbeComment((v, "LIMIT counter"));-
2183 sqlite3VdbeAddOp2(v, OP_IfNot, iLimit, iBreak); VdbeCoverage(v);-
2184 }
executed 64 times by 1 test: end of block
Executed by:
  • Self test (438)
64
2185 if( pLimit->pRight ){
pLimit->pRightDescription
TRUEevaluated 388 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 16133 times by 1 test
Evaluated by:
  • Self test (438)
388-16133
2186 p->iOffset = iOffset = ++pParse->nMem;-
2187 pParse->nMem++; /* Allocate an extra register for limit+offset */-
2188 sqlite3ExprCode(pParse, pLimit->pRight, iOffset);-
2189 sqlite3VdbeAddOp1(v, OP_MustBeInt, iOffset); VdbeCoverage(v);-
2190 VdbeComment((v, "OFFSET counter"));-
2191 sqlite3VdbeAddOp3(v, OP_OffsetLimit, iLimit, iOffset+1, iOffset);-
2192 VdbeComment((v, "LIMIT+OFFSET"));-
2193 }
executed 388 times by 1 test: end of block
Executed by:
  • Self test (438)
388
2194 }
executed 16521 times by 1 test: end of block
Executed by:
  • Self test (438)
16521
2195}
executed 312751 times by 435 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
312751
2196-
2197#ifndef SQLITE_OMIT_COMPOUND_SELECT-
2198/*-
2199** Return the appropriate collating sequence for the iCol-th column of-
2200** the result set for the compound-select statement "p". Return NULL if-
2201** the column has no default collating sequence.-
2202**-
2203** The collating sequence for the compound select is taken from the-
2204** left-most term of the select that has a collating sequence.-
2205*/-
2206static CollSeq *multiSelectCollSeq(Parse *pParse, Select *p, int iCol){-
2207 CollSeq *pRet;-
2208 if( p->pPrior ){
p->pPriorDescription
TRUEevaluated 38982 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 38366 times by 1 test
Evaluated by:
  • Self test (438)
38366-38982
2209 pRet = multiSelectCollSeq(pParse, p->pPrior, iCol);-
2210 }else{
executed 38982 times by 1 test: end of block
Executed by:
  • Self test (438)
38982
2211 pRet = 0;-
2212 }
executed 38366 times by 1 test: end of block
Executed by:
  • Self test (438)
38366
2213 assert( iCol>=0 );-
2214 /* iCol must be less than p->pEList->nExpr. Otherwise an error would-
2215 ** have been thrown during name resolution and we would not have gotten-
2216 ** this far */-
2217 if( pRet==0 && ALWAYS(iCol<p->pEList->nExpr) ){
pRet==0Description
TRUEevaluated 57644 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 19704 times by 1 test
Evaluated by:
  • Self test (438)
(iCol<p->pEList->nExpr)Description
TRUEevaluated 57644 times by 1 test
Evaluated by:
  • Self test (438)
FALSEnever evaluated
0-57644
2218 pRet = sqlite3ExprCollSeq(pParse, p->pEList->a[iCol].pExpr);-
2219 }
executed 57644 times by 1 test: end of block
Executed by:
  • Self test (438)
57644
2220 return pRet;
executed 77348 times by 1 test: return pRet;
Executed by:
  • Self test (438)
77348
2221}-
2222-
2223/*-
2224** The select statement passed as the second parameter is a compound SELECT-
2225** with an ORDER BY clause. This function allocates and returns a KeyInfo-
2226** structure suitable for implementing the ORDER BY.-
2227**-
2228** Space to hold the KeyInfo structure is obtained from malloc. The calling-
2229** function is responsible for ensuring that this structure is eventually-
2230** freed.-
2231*/-
2232static KeyInfo *multiSelectOrderByKeyInfo(Parse *pParse, Select *p, int nExtra){-
2233 ExprList *pOrderBy = p->pOrderBy;-
2234 int nOrderBy = p->pOrderBy->nExpr;-
2235 sqlite3 *db = pParse->db;-
2236 KeyInfo *pRet = sqlite3KeyInfoAlloc(db, nOrderBy+nExtra, 1);-
2237 if( pRet ){
pRetDescription
TRUEevaluated 658 times by 1 test
Evaluated by:
  • Self test (438)
FALSEnever evaluated
0-658
2238 int i;-
2239 for(i=0; i<nOrderBy; i++){
i<nOrderByDescription
TRUEevaluated 1196 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 658 times by 1 test
Evaluated by:
  • Self test (438)
658-1196
2240 struct ExprList_item *pItem = &pOrderBy->a[i];-
2241 Expr *pTerm = pItem->pExpr;-
2242 CollSeq *pColl;-
2243-
2244 if( pTerm->flags & EP_Collate ){
pTerm->flags & 0x000100Description
TRUEevaluated 176 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1020 times by 1 test
Evaluated by:
  • Self test (438)
176-1020
2245 pColl = sqlite3ExprCollSeq(pParse, pTerm);-
2246 }else{
executed 176 times by 1 test: end of block
Executed by:
  • Self test (438)
176
2247 pColl = multiSelectCollSeq(pParse, p, pItem->u.x.iOrderByCol-1);-
2248 if( pColl==0 ) pColl = db->pDfltColl;
executed 94 times by 1 test: pColl = db->pDfltColl;
Executed by:
  • Self test (438)
pColl==0Description
TRUEevaluated 94 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 926 times by 1 test
Evaluated by:
  • Self test (438)
94-926
2249 pOrderBy->a[i].pExpr =-
2250 sqlite3ExprAddCollateString(pParse, pTerm, pColl->zName);-
2251 }
executed 1020 times by 1 test: end of block
Executed by:
  • Self test (438)
1020
2252 assert( sqlite3KeyInfoIsWriteable(pRet) );-
2253 pRet->aColl[i] = pColl;-
2254 pRet->aSortOrder[i] = pOrderBy->a[i].sortOrder;-
2255 }
executed 1196 times by 1 test: end of block
Executed by:
  • Self test (438)
1196
2256 }
executed 658 times by 1 test: end of block
Executed by:
  • Self test (438)
658
2257-
2258 return pRet;
executed 658 times by 1 test: return pRet;
Executed by:
  • Self test (438)
658
2259}-
2260-
2261#ifndef SQLITE_OMIT_CTE-
2262/*-
2263** This routine generates VDBE code to compute the content of a WITH RECURSIVE-
2264** query of the form:-
2265**-
2266** <recursive-table> AS (<setup-query> UNION [ALL] <recursive-query>)-
2267** \___________/ \_______________/-
2268** p->pPrior p-
2269**-
2270**-
2271** There is exactly one reference to the recursive-table in the FROM clause-
2272** of recursive-query, marked with the SrcList->a[].fg.isRecursive flag.-
2273**-
2274** The setup-query runs once to generate an initial set of rows that go-
2275** into a Queue table. Rows are extracted from the Queue table one by-
2276** one. Each row extracted from Queue is output to pDest. Then the single-
2277** extracted row (now in the iCurrent table) becomes the content of the-
2278** recursive-table for a recursive-query run. The output of the recursive-query-
2279** is added back into the Queue table. Then another row is extracted from Queue-
2280** and the iteration continues until the Queue table is empty.-
2281**-
2282** If the compound query operator is UNION then no duplicate rows are ever-
2283** inserted into the Queue table. The iDistinct table keeps a copy of all rows-
2284** that have ever been inserted into Queue and causes duplicates to be-
2285** discarded. If the operator is UNION ALL, then duplicates are allowed.-
2286** -
2287** If the query has an ORDER BY, then entries in the Queue table are kept in-
2288** ORDER BY order and the first entry is extracted for each cycle. Without-
2289** an ORDER BY, the Queue table is just a FIFO.-
2290**-
2291** If a LIMIT clause is provided, then the iteration stops after LIMIT rows-
2292** have been output to pDest. A LIMIT of zero means to output no rows and a-
2293** negative LIMIT means to output all rows. If there is also an OFFSET clause-
2294** with a positive value, then the first OFFSET outputs are discarded rather-
2295** than being sent to pDest. The LIMIT count does not begin until after OFFSET-
2296** rows have been skipped.-
2297*/-
2298static void generateWithRecursiveQuery(-
2299 Parse *pParse, /* Parsing context */-
2300 Select *p, /* The recursive SELECT to be coded */-
2301 SelectDest *pDest /* What to do with query results */-
2302){-
2303 SrcList *pSrc = p->pSrc; /* The FROM clause of the recursive query */-
2304 int nCol = p->pEList->nExpr; /* Number of columns in the recursive table */-
2305 Vdbe *v = pParse->pVdbe; /* The prepared statement under construction */-
2306 Select *pSetup = p->pPrior; /* The setup query */-
2307 int addrTop; /* Top of the loop */-
2308 int addrCont, addrBreak; /* CONTINUE and BREAK addresses */-
2309 int iCurrent = 0; /* The Current table */-
2310 int regCurrent; /* Register holding Current table */-
2311 int iQueue; /* The Queue table */-
2312 int iDistinct = 0; /* To ensure unique results if UNION */-
2313 int eDest = SRT_Fifo; /* How to write to Queue */-
2314 SelectDest destQueue; /* SelectDest targetting the Queue table */-
2315 int i; /* Loop counter */-
2316 int rc; /* Result code */-
2317 ExprList *pOrderBy; /* The ORDER BY clause */-
2318 Expr *pLimit; /* Saved LIMIT and OFFSET */-
2319 int regLimit, regOffset; /* Registers used by LIMIT and OFFSET */-
2320-
2321 /* Obtain authorization to do a recursive query */-
2322 if( sqlite3AuthCheck(pParse, SQLITE_RECURSIVE, 0, 0, 0) ) return;
executed 1 time by 1 test: return;
Executed by:
  • Self test (438)
sqlite3AuthChe..., 33, 0, 0, 0)Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 289 times by 1 test
Evaluated by:
  • Self test (438)
1-289
2323-
2324 /* Process the LIMIT and OFFSET clauses, if they exist */-
2325 addrBreak = sqlite3VdbeMakeLabel(v);-
2326 p->nSelectRow = 320; /* 4 billion rows */-
2327 computeLimitRegisters(pParse, p, addrBreak);-
2328 pLimit = p->pLimit;-
2329 regLimit = p->iLimit;-
2330 regOffset = p->iOffset;-
2331 p->pLimit = 0;-
2332 p->iLimit = p->iOffset = 0;-
2333 pOrderBy = p->pOrderBy;-
2334-
2335 /* Locate the cursor number of the Current table */-
2336 for(i=0; ALWAYS(i<pSrc->nSrc); i++){
(i<pSrc->nSrc)Description
TRUEevaluated 306 times by 1 test
Evaluated by:
  • Self test (438)
FALSEnever evaluated
0-306
2337 if( pSrc->a[i].fg.isRecursive ){
pSrc->a[i].fg.isRecursiveDescription
TRUEevaluated 289 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 17 times by 1 test
Evaluated by:
  • Self test (438)
17-289
2338 iCurrent = pSrc->a[i].iCursor;-
2339 break;
executed 289 times by 1 test: break;
Executed by:
  • Self test (438)
289
2340 }-
2341 }
executed 17 times by 1 test: end of block
Executed by:
  • Self test (438)
17
2342-
2343 /* Allocate cursors numbers for Queue and Distinct. The cursor number for-
2344 ** the Distinct table must be exactly one greater than Queue in order-
2345 ** for the SRT_DistFifo and SRT_DistQueue destinations to work. */-
2346 iQueue = pParse->nTab++;-
2347 if( p->op==TK_UNION ){
p->op==123Description
TRUEevaluated 28 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 261 times by 1 test
Evaluated by:
  • Self test (438)
28-261
2348 eDest = pOrderBy ? SRT_DistQueue : SRT_DistFifo;
pOrderByDescription
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 25 times by 1 test
Evaluated by:
  • Self test (438)
3-25
2349 iDistinct = pParse->nTab++;-
2350 }else{
executed 28 times by 1 test: end of block
Executed by:
  • Self test (438)
28
2351 eDest = pOrderBy ? SRT_Queue : SRT_Fifo;
pOrderByDescription
TRUEevaluated 14 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 247 times by 1 test
Evaluated by:
  • Self test (438)
14-247
2352 }
executed 261 times by 1 test: end of block
Executed by:
  • Self test (438)
261
2353 sqlite3SelectDestInit(&destQueue, eDest, iQueue);-
2354-
2355 /* Allocate cursors for Current, Queue, and Distinct. */-
2356 regCurrent = ++pParse->nMem;-
2357 sqlite3VdbeAddOp3(v, OP_OpenPseudo, iCurrent, regCurrent, nCol);-
2358 if( pOrderBy ){
pOrderByDescription
TRUEevaluated 17 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 272 times by 1 test
Evaluated by:
  • Self test (438)
17-272
2359 KeyInfo *pKeyInfo = multiSelectOrderByKeyInfo(pParse, p, 1);-
2360 sqlite3VdbeAddOp4(v, OP_OpenEphemeral, iQueue, pOrderBy->nExpr+2, 0,-
2361 (char*)pKeyInfo, P4_KEYINFO);-
2362 destQueue.pOrderBy = pOrderBy;-
2363 }else{
executed 17 times by 1 test: end of block
Executed by:
  • Self test (438)
17
2364 sqlite3VdbeAddOp2(v, OP_OpenEphemeral, iQueue, nCol);-
2365 }
executed 272 times by 1 test: end of block
Executed by:
  • Self test (438)
272
2366 VdbeComment((v, "Queue table"));-
2367 if( iDistinct ){
iDistinctDescription
TRUEevaluated 28 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 261 times by 1 test
Evaluated by:
  • Self test (438)
28-261
2368 p->addrOpenEphm[0] = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, iDistinct, 0);-
2369 p->selFlags |= SF_UsesEphemeral;-
2370 }
executed 28 times by 1 test: end of block
Executed by:
  • Self test (438)
28
2371-
2372 /* Detach the ORDER BY clause from the compound SELECT */-
2373 p->pOrderBy = 0;-
2374-
2375 /* Store the results of the setup-query in Queue. */-
2376 pSetup->pNext = 0;-
2377 ExplainQueryPlan((pParse, 1, "SETUP"));-
2378 rc = sqlite3Select(pParse, pSetup, &destQueue);-
2379 pSetup->pNext = p;-
2380 if( rc ) goto end_of_recursive_query;
executed 8 times by 1 test: goto end_of_recursive_query;
Executed by:
  • Self test (438)
rcDescription
TRUEevaluated 8 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 281 times by 1 test
Evaluated by:
  • Self test (438)
8-281
2381-
2382 /* Find the next row in the Queue and output that row */-
2383 addrTop = sqlite3VdbeAddOp2(v, OP_Rewind, iQueue, addrBreak); VdbeCoverage(v);-
2384-
2385 /* Transfer the next row in Queue over to Current */-
2386 sqlite3VdbeAddOp1(v, OP_NullRow, iCurrent); /* To reset column cache */-
2387 if( pOrderBy ){
pOrderByDescription
TRUEevaluated 17 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 264 times by 1 test
Evaluated by:
  • Self test (438)
17-264
2388 sqlite3VdbeAddOp3(v, OP_Column, iQueue, pOrderBy->nExpr+1, regCurrent);-
2389 }else{
executed 17 times by 1 test: end of block
Executed by:
  • Self test (438)
17
2390 sqlite3VdbeAddOp2(v, OP_RowData, iQueue, regCurrent);-
2391 }
executed 264 times by 1 test: end of block
Executed by:
  • Self test (438)
264
2392 sqlite3VdbeAddOp1(v, OP_Delete, iQueue);-
2393-
2394 /* Output the single row in Current */-
2395 addrCont = sqlite3VdbeMakeLabel(v);-
2396 codeOffset(v, regOffset, addrCont);-
2397 selectInnerLoop(pParse, p, iCurrent,-
2398 0, 0, pDest, addrCont, addrBreak);-
2399 if( regLimit ){
regLimitDescription
TRUEevaluated 17 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 264 times by 1 test
Evaluated by:
  • Self test (438)
17-264
2400 sqlite3VdbeAddOp2(v, OP_DecrJumpZero, regLimit, addrBreak);-
2401 VdbeCoverage(v);-
2402 }
executed 17 times by 1 test: end of block
Executed by:
  • Self test (438)
17
2403 sqlite3VdbeResolveLabel(v, addrCont);-
2404-
2405 /* Execute the recursive SELECT taking the single row in Current as-
2406 ** the value for the recursive-table. Store the results in the Queue.-
2407 */-
2408 if( p->selFlags & SF_Aggregate ){
p->selFlags & 0x00008Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 280 times by 1 test
Evaluated by:
  • Self test (438)
1-280
2409 sqlite3ErrorMsg(pParse, "recursive aggregate queries not supported");-
2410 }else{
executed 1 time by 1 test: end of block
Executed by:
  • Self test (438)
1
2411 p->pPrior = 0;-
2412 ExplainQueryPlan((pParse, 1, "RECURSIVE STEP"));-
2413 sqlite3Select(pParse, p, &destQueue);-
2414 assert( p->pPrior==0 );-
2415 p->pPrior = pSetup;-
2416 }
executed 280 times by 1 test: end of block
Executed by:
  • Self test (438)
280
2417-
2418 /* Keep running the loop until the Queue is empty */-
2419 sqlite3VdbeGoto(v, addrTop);-
2420 sqlite3VdbeResolveLabel(v, addrBreak);-
2421-
2422end_of_recursive_query:
code before this statement executed 281 times by 1 test: end_of_recursive_query:
Executed by:
  • Self test (438)
281
2423 sqlite3ExprListDelete(pParse->db, p->pOrderBy);-
2424 p->pOrderBy = pOrderBy;-
2425 p->pLimit = pLimit;-
2426 return;
executed 289 times by 1 test: return;
Executed by:
  • Self test (438)
289
2427}-
2428#endif /* SQLITE_OMIT_CTE */-
2429-
2430/* Forward references */-
2431static int multiSelectOrderBy(-
2432 Parse *pParse, /* Parsing context */-
2433 Select *p, /* The right-most of SELECTs to be coded */-
2434 SelectDest *pDest /* What to do with query results */-
2435);-
2436-
2437/*-
2438** Handle the special case of a compound-select that originates from a-
2439** VALUES clause. By handling this as a special case, we avoid deep-
2440** recursion, and thus do not need to enforce the SQLITE_LIMIT_COMPOUND_SELECT-
2441** on a VALUES clause.-
2442**-
2443** Because the Select object originates from a VALUES clause:-
2444** (1) There is no LIMIT or OFFSET or else there is a LIMIT of exactly 1-
2445** (2) All terms are UNION ALL-
2446** (3) There is no ORDER BY clause-
2447**-
2448** The "LIMIT of exactly 1" case of condition (1) comes about when a VALUES-
2449** clause occurs within scalar expression (ex: "SELECT (VALUES(1),(2),(3))").-
2450** The sqlite3CodeSubselect will have added the LIMIT 1 clause in tht case.-
2451** Since the limit is exactly 1, we only need to evalutes the left-most VALUES.-
2452*/-
2453static int multiSelectValues(-
2454 Parse *pParse, /* Parsing context */-
2455 Select *p, /* The right-most of SELECTs to be coded */-
2456 SelectDest *pDest /* What to do with query results */-
2457){-
2458 int nRow = 1;-
2459 int rc = 0;-
2460 int bShowAll = p->pLimit==0;-
2461 assert( p->selFlags & SF_MultiValue );-
2462 do{-
2463 assert( p->selFlags & SF_Values );-
2464 assert( p->op==TK_ALL || (p->op==TK_SELECT && p->pPrior==0) );-
2465 assert( p->pNext==0 || p->pEList->nExpr==p->pNext->pEList->nExpr );-
2466 if( p->pPrior==0 ) break;
executed 441 times by 1 test: break;
Executed by:
  • Self test (438)
p->pPrior==0Description
TRUEevaluated 441 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 301684 times by 1 test
Evaluated by:
  • Self test (438)
441-301684
2467 assert( p->pPrior->pNext==p );-
2468 p = p->pPrior;-
2469 nRow += bShowAll;-
2470 }while(1);
executed 301684 times by 1 test: end of block
Executed by:
  • Self test (438)
301684
2471 ExplainQueryPlan((pParse, 0, "SCAN %d CONSTANT ROW%s", nRow,-
2472 nRow==1 ? "" : "S"));-
2473 while( p ){
pDescription
TRUEevaluated 102124 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 438 times by 1 test
Evaluated by:
  • Self test (438)
438-102124
2474 selectInnerLoop(pParse, p, -1, 0, 0, pDest, 1, 1);-
2475 if( !bShowAll ) break;
executed 3 times by 1 test: break;
Executed by:
  • Self test (438)
!bShowAllDescription
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 102121 times by 1 test
Evaluated by:
  • Self test (438)
3-102121
2476 p->nSelectRow = nRow;-
2477 p = p->pNext;-
2478 }
executed 102121 times by 1 test: end of block
Executed by:
  • Self test (438)
102121
2479 return rc;
executed 441 times by 1 test: return rc;
Executed by:
  • Self test (438)
441
2480}-
2481-
2482/*-
2483** This routine is called to process a compound query form from-
2484** two or more separate queries using UNION, UNION ALL, EXCEPT, or-
2485** INTERSECT-
2486**-
2487** "p" points to the right-most of the two queries. the query on the-
2488** left is p->pPrior. The left query could also be a compound query-
2489** in which case this routine will be called recursively. -
2490**-
2491** The results of the total query are to be written into a destination-
2492** of type eDest with parameter iParm.-
2493**-
2494** Example 1: Consider a three-way compound SQL statement.-
2495**-
2496** SELECT a FROM t1 UNION SELECT b FROM t2 UNION SELECT c FROM t3-
2497**-
2498** This statement is parsed up as follows:-
2499**-
2500** SELECT c FROM t3-
2501** |-
2502** `-----> SELECT b FROM t2-
2503** |-
2504** `------> SELECT a FROM t1-
2505**-
2506** The arrows in the diagram above represent the Select.pPrior pointer.-
2507** So if this routine is called with p equal to the t3 query, then-
2508** pPrior will be the t2 query. p->op will be TK_UNION in this case.-
2509**-
2510** Notice that because of the way SQLite parses compound SELECTs, the-
2511** individual selects always group from left to right.-
2512*/-
2513static int multiSelect(-
2514 Parse *pParse, /* Parsing context */-
2515 Select *p, /* The right-most of SELECTs to be coded */-
2516 SelectDest *pDest /* What to do with query results */-
2517){-
2518 int rc = SQLITE_OK; /* Success code from a subroutine */-
2519 Select *pPrior; /* Another SELECT immediately to our left */-
2520 Vdbe *v; /* Generate code to this VDBE */-
2521 SelectDest dest; /* Alternative data destination */-
2522 Select *pDelete = 0; /* Chain of simple selects to delete */-
2523 sqlite3 *db; /* Database connection */-
2524-
2525 /* Make sure there is no ORDER BY or LIMIT clause on prior SELECTs. Only-
2526 ** the last (right-most) SELECT in the series may have an ORDER BY or LIMIT.-
2527 */-
2528 assert( p && p->pPrior ); /* Calling function guarantees this much */-
2529 assert( (p->selFlags & SF_Recursive)==0 || p->op==TK_ALL || p->op==TK_UNION );-
2530 db = pParse->db;-
2531 pPrior = p->pPrior;-
2532 dest = *pDest;-
2533 if( pPrior->pOrderBy || pPrior->pLimit ){
pPrior->pOrderByDescription
TRUEevaluated 25 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 39327 times by 1 test
Evaluated by:
  • Self test (438)
pPrior->pLimitDescription
TRUEevaluated 19 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 39308 times by 1 test
Evaluated by:
  • Self test (438)
19-39327
2534 sqlite3ErrorMsg(pParse,"%s clause should come after %s not before",-
2535 pPrior->pOrderBy!=0 ? "ORDER BY" : "LIMIT", selectOpName(p->op));-
2536 rc = 1;-
2537 goto multi_select_end;
executed 44 times by 1 test: goto multi_select_end;
Executed by:
  • Self test (438)
44
2538 }-
2539-
2540 v = sqlite3GetVdbe(pParse);-
2541 assert( v!=0 ); /* The VDBE already created by calling function */-
2542-
2543 /* Create the destination temporary table if necessary-
2544 */-
2545 if( dest.eDest==SRT_EphemTab ){
dest.eDest==12Description
TRUEevaluated 39 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 39269 times by 1 test
Evaluated by:
  • Self test (438)
39-39269
2546 assert( p->pEList );-
2547 sqlite3VdbeAddOp2(v, OP_OpenEphemeral, dest.iSDParm, p->pEList->nExpr);-
2548 dest.eDest = SRT_Table;-
2549 }
executed 39 times by 1 test: end of block
Executed by:
  • Self test (438)
39
2550-
2551 /* Special handling for a compound-select that originates as a VALUES clause.-
2552 */-
2553 if( p->selFlags & SF_MultiValue ){
p->selFlags & 0x00400Description
TRUEevaluated 441 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 38867 times by 1 test
Evaluated by:
  • Self test (438)
441-38867
2554 rc = multiSelectValues(pParse, p, &dest);-
2555 goto multi_select_end;
executed 441 times by 1 test: goto multi_select_end;
Executed by:
  • Self test (438)
441
2556 }-
2557-
2558 /* Make sure all SELECTs in the statement have the same number of elements-
2559 ** in their result sets.-
2560 */-
2561 assert( p->pEList && pPrior->pEList );-
2562 assert( p->pEList->nExpr==pPrior->pEList->nExpr );-
2563-
2564#ifndef SQLITE_OMIT_CTE-
2565 if( p->selFlags & SF_Recursive ){
p->selFlags & 0x02000Description
TRUEevaluated 290 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 38577 times by 1 test
Evaluated by:
  • Self test (438)
290-38577
2566 generateWithRecursiveQuery(pParse, p, &dest);-
2567 }else
executed 290 times by 1 test: end of block
Executed by:
  • Self test (438)
290
2568#endif-
2569-
2570 /* Compound SELECTs that have an ORDER BY clause are handled separately.-
2571 */-
2572 if( p->pOrderBy ){
p->pOrderByDescription
TRUEevaluated 641 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 37936 times by 1 test
Evaluated by:
  • Self test (438)
641-37936
2573 return multiSelectOrderBy(pParse, p, pDest);
executed 641 times by 1 test: return multiSelectOrderBy(pParse, p, pDest);
Executed by:
  • Self test (438)
641
2574 }else{-
2575-
2576#ifndef SQLITE_OMIT_EXPLAIN-
2577 if( pPrior->pPrior==0 ){
pPrior->pPrior==0Description
TRUEevaluated 37061 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 875 times by 1 test
Evaluated by:
  • Self test (438)
875-37061
2578 ExplainQueryPlan((pParse, 1, "COMPOUND QUERY"));-
2579 ExplainQueryPlan((pParse, 1, "LEFT-MOST SUBQUERY"));-
2580 }
executed 37061 times by 1 test: end of block
Executed by:
  • Self test (438)
37061
2581#endif-
2582-
2583 /* Generate code for the left and right SELECT statements.-
2584 */-
2585 switch( p->op ){-
2586 case TK_ALL: {
executed 1431 times by 1 test: case 124:
Executed by:
  • Self test (438)
1431
2587 int addr = 0;-
2588 int nLimit;-
2589 assert( !pPrior->pLimit );-
2590 pPrior->iLimit = p->iLimit;-
2591 pPrior->iOffset = p->iOffset;-
2592 pPrior->pLimit = p->pLimit;-
2593 rc = sqlite3Select(pParse, pPrior, &dest);-
2594 p->pLimit = 0;-
2595 if( rc ){
rcDescription
TRUEnever evaluated
FALSEevaluated 1431 times by 1 test
Evaluated by:
  • Self test (438)
0-1431
2596 goto multi_select_end;
never executed: goto multi_select_end;
0
2597 }-
2598 p->pPrior = 0;-
2599 p->iLimit = pPrior->iLimit;-
2600 p->iOffset = pPrior->iOffset;-
2601 if( p->iLimit ){
p->iLimitDescription
TRUEevaluated 297 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1134 times by 1 test
Evaluated by:
  • Self test (438)
297-1134
2602 addr = sqlite3VdbeAddOp1(v, OP_IfNot, p->iLimit); VdbeCoverage(v);-
2603 VdbeComment((v, "Jump ahead if LIMIT reached"));-
2604 if( p->iOffset ){
p->iOffsetDescription
TRUEevaluated 136 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 161 times by 1 test
Evaluated by:
  • Self test (438)
136-161
2605 sqlite3VdbeAddOp3(v, OP_OffsetLimit,-
2606 p->iLimit, p->iOffset+1, p->iOffset);-
2607 }
executed 136 times by 1 test: end of block
Executed by:
  • Self test (438)
136
2608 }
executed 297 times by 1 test: end of block
Executed by:
  • Self test (438)
297
2609 ExplainQueryPlan((pParse, 1, "UNION ALL"));-
2610 rc = sqlite3Select(pParse, p, &dest);-
2611 testcase( rc!=SQLITE_OK );-
2612 pDelete = p->pPrior;-
2613 p->pPrior = pPrior;-
2614 p->nSelectRow = sqlite3LogEstAdd(p->nSelectRow, pPrior->nSelectRow);-
2615 if( pPrior->pLimit
pPrior->pLimitDescription
TRUEevaluated 119 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1312 times by 1 test
Evaluated by:
  • Self test (438)
119-1312
2616 && sqlite3ExprIsInteger(pPrior->pLimit->pLeft, &nLimit)
sqlite3ExprIsI...Left, &nLimit)Description
TRUEevaluated 110 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 9 times by 1 test
Evaluated by:
  • Self test (438)
9-110
2617 && nLimit>0 && p->nSelectRow > sqlite3LogEst((u64)nLimit)
nLimit>0Description
TRUEevaluated 109 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test (438)
p->nSelectRow ...t((u64)nLimit)Description
TRUEevaluated 107 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test (438)
1-109
2618 ){-
2619 p->nSelectRow = sqlite3LogEst((u64)nLimit);-
2620 }
executed 107 times by 1 test: end of block
Executed by:
  • Self test (438)
107
2621 if( addr ){
addrDescription
TRUEevaluated 297 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1134 times by 1 test
Evaluated by:
  • Self test (438)
297-1134
2622 sqlite3VdbeJumpHere(v, addr);-
2623 }
executed 297 times by 1 test: end of block
Executed by:
  • Self test (438)
297
2624 break;
executed 1431 times by 1 test: break;
Executed by:
  • Self test (438)
1431
2625 }-
2626 case TK_EXCEPT:
executed 120 times by 1 test: case 125:
Executed by:
  • Self test (438)
120
2627 case TK_UNION: {
executed 36313 times by 1 test: case 123:
Executed by:
  • Self test (438)
36313
2628 int unionTab; /* Cursor number of the temp table holding result */-
2629 u8 op = 0; /* One of the SRT_ operations to apply to self */-
2630 int priorOp; /* The SRT_ operation to apply to prior selects */-
2631 Expr *pLimit; /* Saved values of p->nLimit */-
2632 int addr;-
2633 SelectDest uniondest;-
2634 -
2635 testcase( p->op==TK_EXCEPT );-
2636 testcase( p->op==TK_UNION );-
2637 priorOp = SRT_Union;-
2638 if( dest.eDest==priorOp ){
dest.eDest==priorOpDescription
TRUEevaluated 82 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 36351 times by 1 test
Evaluated by:
  • Self test (438)
82-36351
2639 /* We can reuse a temporary table generated by a SELECT to our-
2640 ** right.-
2641 */-
2642 assert( p->pLimit==0 ); /* Not allowed on leftward elements */-
2643 unionTab = dest.iSDParm;-
2644 }else{
executed 82 times by 1 test: end of block
Executed by:
  • Self test (438)
82
2645 /* We will need to create our own temporary table to hold the-
2646 ** intermediate results.-
2647 */-
2648 unionTab = pParse->nTab++;-
2649 assert( p->pOrderBy==0 );-
2650 addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, unionTab, 0);-
2651 assert( p->addrOpenEphm[0] == -1 );-
2652 p->addrOpenEphm[0] = addr;-
2653 findRightmost(p)->selFlags |= SF_UsesEphemeral;-
2654 assert( p->pEList );-
2655 }
executed 36351 times by 1 test: end of block
Executed by:
  • Self test (438)
36351
2656 -
2657 /* Code the SELECT statements to our left-
2658 */-
2659 assert( !pPrior->pOrderBy );-
2660 sqlite3SelectDestInit(&uniondest, priorOp, unionTab);-
2661 rc = sqlite3Select(pParse, pPrior, &uniondest);-
2662 if( rc ){
rcDescription
TRUEnever evaluated
FALSEevaluated 36433 times by 1 test
Evaluated by:
  • Self test (438)
0-36433
2663 goto multi_select_end;
never executed: goto multi_select_end;
0
2664 }-
2665 -
2666 /* Code the current SELECT statement-
2667 */-
2668 if( p->op==TK_EXCEPT ){
p->op==125Description
TRUEevaluated 120 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 36313 times by 1 test
Evaluated by:
  • Self test (438)
120-36313
2669 op = SRT_Except;-
2670 }else{
executed 120 times by 1 test: end of block
Executed by:
  • Self test (438)
120
2671 assert( p->op==TK_UNION );-
2672 op = SRT_Union;-
2673 }
executed 36313 times by 1 test: end of block
Executed by:
  • Self test (438)
36313
2674 p->pPrior = 0;-
2675 pLimit = p->pLimit;-
2676 p->pLimit = 0;-
2677 uniondest.eDest = op;-
2678 ExplainQueryPlan((pParse, 1, "%s USING TEMP B-TREE",-
2679 selectOpName(p->op)));-
2680 rc = sqlite3Select(pParse, p, &uniondest);-
2681 testcase( rc!=SQLITE_OK );-
2682 /* Query flattening in sqlite3Select() might refill p->pOrderBy.-
2683 ** Be sure to delete p->pOrderBy, therefore, to avoid a memory leak. */-
2684 sqlite3ExprListDelete(db, p->pOrderBy);-
2685 pDelete = p->pPrior;-
2686 p->pPrior = pPrior;-
2687 p->pOrderBy = 0;-
2688 if( p->op==TK_UNION ){
p->op==123Description
TRUEevaluated 36313 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 120 times by 1 test
Evaluated by:
  • Self test (438)
120-36313
2689 p->nSelectRow = sqlite3LogEstAdd(p->nSelectRow, pPrior->nSelectRow);-
2690 }
executed 36313 times by 1 test: end of block
Executed by:
  • Self test (438)
36313
2691 sqlite3ExprDelete(db, p->pLimit);-
2692 p->pLimit = pLimit;-
2693 p->iLimit = 0;-
2694 p->iOffset = 0;-
2695 -
2696 /* Convert the data in the temporary table into whatever form-
2697 ** it is that we currently need.-
2698 */-
2699 assert( unionTab==dest.iSDParm || dest.eDest!=priorOp );-
2700 if( dest.eDest!=priorOp ){
dest.eDest!=priorOpDescription
TRUEevaluated 36351 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 82 times by 1 test
Evaluated by:
  • Self test (438)
82-36351
2701 int iCont, iBreak, iStart;-
2702 assert( p->pEList );-
2703 iBreak = sqlite3VdbeMakeLabel(v);-
2704 iCont = sqlite3VdbeMakeLabel(v);-
2705 computeLimitRegisters(pParse, p, iBreak);-
2706 sqlite3VdbeAddOp2(v, OP_Rewind, unionTab, iBreak); VdbeCoverage(v);-
2707 iStart = sqlite3VdbeCurrentAddr(v);-
2708 selectInnerLoop(pParse, p, unionTab,-
2709 0, 0, &dest, iCont, iBreak);-
2710 sqlite3VdbeResolveLabel(v, iCont);-
2711 sqlite3VdbeAddOp2(v, OP_Next, unionTab, iStart); VdbeCoverage(v);-
2712 sqlite3VdbeResolveLabel(v, iBreak);-
2713 sqlite3VdbeAddOp2(v, OP_Close, unionTab, 0);-
2714 }
executed 36351 times by 1 test: end of block
Executed by:
  • Self test (438)
36351
2715 break;
executed 36433 times by 1 test: break;
Executed by:
  • Self test (438)
36433
2716 }-
2717 default: assert( p->op==TK_INTERSECT ); {
executed 72 times by 1 test: default:
Executed by:
  • Self test (438)
72
2718 int tab1, tab2;-
2719 int iCont, iBreak, iStart;-
2720 Expr *pLimit;-
2721 int addr;-
2722 SelectDest intersectdest;-
2723 int r1;-
2724 -
2725 /* INTERSECT is different from the others since it requires-
2726 ** two temporary tables. Hence it has its own case. Begin-
2727 ** by allocating the tables we will need.-
2728 */-
2729 tab1 = pParse->nTab++;-
2730 tab2 = pParse->nTab++;-
2731 assert( p->pOrderBy==0 );-
2732 -
2733 addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, tab1, 0);-
2734 assert( p->addrOpenEphm[0] == -1 );-
2735 p->addrOpenEphm[0] = addr;-
2736 findRightmost(p)->selFlags |= SF_UsesEphemeral;-
2737 assert( p->pEList );-
2738 -
2739 /* Code the SELECTs to our left into temporary table "tab1".-
2740 */-
2741 sqlite3SelectDestInit(&intersectdest, SRT_Union, tab1);-
2742 rc = sqlite3Select(pParse, pPrior, &intersectdest);-
2743 if( rc ){
rcDescription
TRUEnever evaluated
FALSEevaluated 72 times by 1 test
Evaluated by:
  • Self test (438)
0-72
2744 goto multi_select_end;
never executed: goto multi_select_end;
0
2745 }-
2746 -
2747 /* Code the current SELECT into temporary table "tab2"-
2748 */-
2749 addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, tab2, 0);-
2750 assert( p->addrOpenEphm[1] == -1 );-
2751 p->addrOpenEphm[1] = addr;-
2752 p->pPrior = 0;-
2753 pLimit = p->pLimit;-
2754 p->pLimit = 0;-
2755 intersectdest.iSDParm = tab2;-
2756 ExplainQueryPlan((pParse, 1, "%s USING TEMP B-TREE",-
2757 selectOpName(p->op)));-
2758 rc = sqlite3Select(pParse, p, &intersectdest);-
2759 testcase( rc!=SQLITE_OK );-
2760 pDelete = p->pPrior;-
2761 p->pPrior = pPrior;-
2762 if( p->nSelectRow>pPrior->nSelectRow ){
p->nSelectRow>...or->nSelectRowDescription
TRUEevaluated 9 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 63 times by 1 test
Evaluated by:
  • Self test (438)
9-63
2763 p->nSelectRow = pPrior->nSelectRow;-
2764 }
executed 9 times by 1 test: end of block
Executed by:
  • Self test (438)
9
2765 sqlite3ExprDelete(db, p->pLimit);-
2766 p->pLimit = pLimit;-
2767 -
2768 /* Generate code to take the intersection of the two temporary-
2769 ** tables.-
2770 */-
2771 assert( p->pEList );-
2772 iBreak = sqlite3VdbeMakeLabel(v);-
2773 iCont = sqlite3VdbeMakeLabel(v);-
2774 computeLimitRegisters(pParse, p, iBreak);-
2775 sqlite3VdbeAddOp2(v, OP_Rewind, tab1, iBreak); VdbeCoverage(v);-
2776 r1 = sqlite3GetTempReg(pParse);-
2777 iStart = sqlite3VdbeAddOp2(v, OP_RowData, tab1, r1);-
2778 sqlite3VdbeAddOp4Int(v, OP_NotFound, tab2, iCont, r1, 0);-
2779 VdbeCoverage(v);-
2780 sqlite3ReleaseTempReg(pParse, r1);-
2781 selectInnerLoop(pParse, p, tab1,-
2782 0, 0, &dest, iCont, iBreak);-
2783 sqlite3VdbeResolveLabel(v, iCont);-
2784 sqlite3VdbeAddOp2(v, OP_Next, tab1, iStart); VdbeCoverage(v);-
2785 sqlite3VdbeResolveLabel(v, iBreak);-
2786 sqlite3VdbeAddOp2(v, OP_Close, tab2, 0);-
2787 sqlite3VdbeAddOp2(v, OP_Close, tab1, 0);-
2788 break;
executed 72 times by 1 test: break;
Executed by:
  • Self test (438)
72
2789 }-
2790 }-
2791 -
2792 #ifndef SQLITE_OMIT_EXPLAIN-
2793 if( p->pNext==0 ){
p->pNext==0Description
TRUEevaluated 37012 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 924 times by 1 test
Evaluated by:
  • Self test (438)
924-37012
2794 ExplainQueryPlanPop(pParse);-
2795 }
executed 37012 times by 1 test: end of block
Executed by:
  • Self test (438)
37012
2796 #endif-
2797 }
executed 37936 times by 1 test: end of block
Executed by:
  • Self test (438)
37936
2798 -
2799 /* Compute collating sequences used by -
2800 ** temporary tables needed to implement the compound select.-
2801 ** Attach the KeyInfo structure to all temporary tables.-
2802 **-
2803 ** This section is run by the right-most SELECT statement only.-
2804 ** SELECT statements to the left always skip this part. The right-most-
2805 ** SELECT might also skip this part if it has no ORDER BY clause and-
2806 ** no temp tables are required.-
2807 */-
2808 if( p->selFlags & SF_UsesEphemeral ){
p->selFlags & 0x00020Description
TRUEevaluated 36444 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1782 times by 1 test
Evaluated by:
  • Self test (438)
1782-36444
2809 int i; /* Loop counter */-
2810 KeyInfo *pKeyInfo; /* Collating sequence for the result set */-
2811 Select *pLoop; /* For looping through SELECT statements */-
2812 CollSeq **apColl; /* For looping through pKeyInfo->aColl[] */-
2813 int nCol; /* Number of columns in result set */-
2814-
2815 assert( p->pNext==0 );-
2816 nCol = p->pEList->nExpr;-
2817 pKeyInfo = sqlite3KeyInfoAlloc(db, nCol, 1);-
2818 if( !pKeyInfo ){
!pKeyInfoDescription
TRUEnever evaluated
FALSEevaluated 36444 times by 1 test
Evaluated by:
  • Self test (438)
0-36444
2819 rc = SQLITE_NOMEM_BKPT;-
2820 goto multi_select_end;
never executed: goto multi_select_end;
0
2821 }-
2822 for(i=0, apColl=pKeyInfo->aColl; i<nCol; i++, apColl++){
i<nColDescription
TRUEevaluated 36656 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 36444 times by 1 test
Evaluated by:
  • Self test (438)
36444-36656
2823 *apColl = multiSelectCollSeq(pParse, p, i);-
2824 if( 0==*apColl ){
0==*apCollDescription
TRUEevaluated 18501 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 18155 times by 1 test
Evaluated by:
  • Self test (438)
18155-18501
2825 *apColl = db->pDfltColl;-
2826 }
executed 18501 times by 1 test: end of block
Executed by:
  • Self test (438)
18501
2827 }
executed 36656 times by 1 test: end of block
Executed by:
  • Self test (438)
36656
2828-
2829 for(pLoop=p; pLoop; pLoop=pLoop->pPrior){
pLoopDescription
TRUEevaluated 72998 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 36444 times by 1 test
Evaluated by:
  • Self test (438)
36444-72998
2830 for(i=0; i<2; i++){
i<2Description
TRUEevaluated 109449 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 72 times by 1 test
Evaluated by:
  • Self test (438)
72-109449
2831 int addr = pLoop->addrOpenEphm[i];-
2832 if( addr<0 ){
addr<0Description
TRUEevaluated 72926 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 36523 times by 1 test
Evaluated by:
  • Self test (438)
36523-72926
2833 /* If [0] is unused then [1] is also unused. So we can-
2834 ** always safely abort as soon as the first unused slot is found */-
2835 assert( pLoop->addrOpenEphm[1]<0 );-
2836 break;
executed 72926 times by 1 test: break;
Executed by:
  • Self test (438)
72926
2837 }-
2838 sqlite3VdbeChangeP2(v, addr, nCol);-
2839 sqlite3VdbeChangeP4(v, addr, (char*)sqlite3KeyInfoRef(pKeyInfo),-
2840 P4_KEYINFO);-
2841 pLoop->addrOpenEphm[i] = -1;-
2842 }
executed 36523 times by 1 test: end of block
Executed by:
  • Self test (438)
36523
2843 }
executed 72998 times by 1 test: end of block
Executed by:
  • Self test (438)
72998
2844 sqlite3KeyInfoUnref(pKeyInfo);-
2845 }
executed 36444 times by 1 test: end of block
Executed by:
  • Self test (438)
36444
2846-
2847multi_select_end:
code before this statement executed 38226 times by 1 test: multi_select_end:
Executed by:
  • Self test (438)
38226
2848 pDest->iSdst = dest.iSdst;-
2849 pDest->nSdst = dest.nSdst;-
2850 sqlite3SelectDelete(db, pDelete);-
2851 return rc;
executed 38711 times by 1 test: return rc;
Executed by:
  • Self test (438)
38711
2852}-
2853#endif /* SQLITE_OMIT_COMPOUND_SELECT */-
2854-
2855/*-
2856** Error message for when two or more terms of a compound select have different-
2857** size result sets.-
2858*/-
2859void sqlite3SelectWrongNumTermsError(Parse *pParse, Select *p){-
2860 if( p->selFlags & SF_Values ){
p->selFlags & 0x00200Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 56 times by 1 test
Evaluated by:
  • Self test (438)
1-56
2861 sqlite3ErrorMsg(pParse, "all VALUES must have the same number of terms");-
2862 }else{
executed 1 time by 1 test: end of block
Executed by:
  • Self test (438)
1
2863 sqlite3ErrorMsg(pParse, "SELECTs to the left and right of %s"-
2864 " do not have the same number of result columns", selectOpName(p->op));-
2865 }
executed 56 times by 1 test: end of block
Executed by:
  • Self test (438)
56
2866}-
2867-
2868/*-
2869** Code an output subroutine for a coroutine implementation of a-
2870** SELECT statment.-
2871**-
2872** The data to be output is contained in pIn->iSdst. There are-
2873** pIn->nSdst columns to be output. pDest is where the output should-
2874** be sent.-
2875**-
2876** regReturn is the number of the register holding the subroutine-
2877** return address.-
2878**-
2879** If regPrev>0 then it is the first register in a vector that-
2880** records the previous output. mem[regPrev] is a flag that is false-
2881** if there has been no previous output. If regPrev>0 then code is-
2882** generated to suppress duplicates. pKeyInfo is used for comparing-
2883** keys.-
2884**-
2885** If the LIMIT found in p->iLimit is reached, jump immediately to-
2886** iBreak.-
2887*/-
2888static int generateOutputSubroutine(-
2889 Parse *pParse, /* Parsing context */-
2890 Select *p, /* The SELECT statement */-
2891 SelectDest *pIn, /* Coroutine supplying data */-
2892 SelectDest *pDest, /* Where to send the data */-
2893 int regReturn, /* The return address register */-
2894 int regPrev, /* Previous result register. No uniqueness if 0 */-
2895 KeyInfo *pKeyInfo, /* For comparing with previous entry */-
2896 int iBreak /* Jump here if we hit the LIMIT */-
2897){-
2898 Vdbe *v = pParse->pVdbe;-
2899 int iContinue;-
2900 int addr;-
2901-
2902 addr = sqlite3VdbeCurrentAddr(v);-
2903 iContinue = sqlite3VdbeMakeLabel(v);-
2904-
2905 /* Suppress duplicates for UNION, EXCEPT, and INTERSECT -
2906 */-
2907 if( regPrev ){
regPrevDescription
TRUEevaluated 472 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 656 times by 1 test
Evaluated by:
  • Self test (438)
472-656
2908 int addr1, addr2;-
2909 addr1 = sqlite3VdbeAddOp1(v, OP_IfNot, regPrev); VdbeCoverage(v);-
2910 addr2 = sqlite3VdbeAddOp4(v, OP_Compare, pIn->iSdst, regPrev+1, pIn->nSdst,-
2911 (char*)sqlite3KeyInfoRef(pKeyInfo), P4_KEYINFO);-
2912 sqlite3VdbeAddOp3(v, OP_Jump, addr2+2, iContinue, addr2+2); VdbeCoverage(v);-
2913 sqlite3VdbeJumpHere(v, addr1);-
2914 sqlite3VdbeAddOp3(v, OP_Copy, pIn->iSdst, regPrev+1, pIn->nSdst-1);-
2915 sqlite3VdbeAddOp2(v, OP_Integer, 1, regPrev);-
2916 }
executed 472 times by 1 test: end of block
Executed by:
  • Self test (438)
472
2917 if( pParse->db->mallocFailed ) return 0;
never executed: return 0;
pParse->db->mallocFailedDescription
TRUEnever evaluated
FALSEevaluated 1128 times by 1 test
Evaluated by:
  • Self test (438)
0-1128
2918-
2919 /* Suppress the first OFFSET entries if there is an OFFSET clause-
2920 */-
2921 codeOffset(v, p->iOffset, iContinue);-
2922-
2923 assert( pDest->eDest!=SRT_Exists );-
2924 assert( pDest->eDest!=SRT_Table );-
2925 switch( pDest->eDest ){-
2926 /* Store the result as data using a unique key.-
2927 */-
2928 case SRT_EphemTab: {
executed 4 times by 1 test: case 12:
Executed by:
  • Self test (438)
4
2929 int r1 = sqlite3GetTempReg(pParse);-
2930 int r2 = sqlite3GetTempReg(pParse);-
2931 sqlite3VdbeAddOp3(v, OP_MakeRecord, pIn->iSdst, pIn->nSdst, r1);-
2932 sqlite3VdbeAddOp2(v, OP_NewRowid, pDest->iSDParm, r2);-
2933 sqlite3VdbeAddOp3(v, OP_Insert, pDest->iSDParm, r1, r2);-
2934 sqlite3VdbeChangeP5(v, OPFLAG_APPEND);-
2935 sqlite3ReleaseTempReg(pParse, r2);-
2936 sqlite3ReleaseTempReg(pParse, r1);-
2937 break;
executed 4 times by 1 test: break;
Executed by:
  • Self test (438)
4
2938 }-
2939-
2940#ifndef SQLITE_OMIT_SUBQUERY-
2941 /* If we are creating a set for an "expr IN (SELECT ...)".-
2942 */-
2943 case SRT_Set: {
executed 9 times by 1 test: case 11:
Executed by:
  • Self test (438)
9
2944 int r1;-
2945 testcase( pIn->nSdst>1 );-
2946 r1 = sqlite3GetTempReg(pParse);-
2947 sqlite3VdbeAddOp4(v, OP_MakeRecord, pIn->iSdst, pIn->nSdst, -
2948 r1, pDest->zAffSdst, pIn->nSdst);-
2949 sqlite3VdbeAddOp4Int(v, OP_IdxInsert, pDest->iSDParm, r1,-
2950 pIn->iSdst, pIn->nSdst);-
2951 sqlite3ReleaseTempReg(pParse, r1);-
2952 break;
executed 9 times by 1 test: break;
Executed by:
  • Self test (438)
9
2953 }-
2954-
2955 /* If this is a scalar select that is part of an expression, then-
2956 ** store the results in the appropriate memory cell and break out-
2957 ** of the scan loop.-
2958 */-
2959 case SRT_Mem: {
executed 24 times by 1 test: case 10:
Executed by:
  • Self test (438)
24
2960 assert( pIn->nSdst==1 || pParse->nErr>0 ); testcase( pIn->nSdst!=1 );-
2961 sqlite3ExprCodeMove(pParse, pIn->iSdst, pDest->iSDParm, 1);-
2962 /* The LIMIT clause will jump out of the loop for us */-
2963 break;
executed 24 times by 1 test: break;
Executed by:
  • Self test (438)
24
2964 }-
2965#endif /* #ifndef SQLITE_OMIT_SUBQUERY */-
2966-
2967 /* The results are stored in a sequence of registers-
2968 ** starting at pDest->iSdst. Then the co-routine yields.-
2969 */-
2970 case SRT_Coroutine: {
executed 194 times by 1 test: case 13:
Executed by:
  • Self test (438)
194
2971 if( pDest->iSdst==0 ){
pDest->iSdst==0Description
TRUEevaluated 111 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 83 times by 1 test
Evaluated by:
  • Self test (438)
83-111
2972 pDest->iSdst = sqlite3GetTempRange(pParse, pIn->nSdst);-
2973 pDest->nSdst = pIn->nSdst;-
2974 }
executed 111 times by 1 test: end of block
Executed by:
  • Self test (438)
111
2975 sqlite3ExprCodeMove(pParse, pIn->iSdst, pDest->iSdst, pIn->nSdst);-
2976 sqlite3VdbeAddOp1(v, OP_Yield, pDest->iSDParm);-
2977 break;
executed 194 times by 1 test: break;
Executed by:
  • Self test (438)
194
2978 }-
2979-
2980 /* If none of the above, then the result destination must be-
2981 ** SRT_Output. This routine is never called with any other-
2982 ** destination other than the ones handled above or SRT_Output.-
2983 **-
2984 ** For SRT_Output, results are stored in a sequence of registers. -
2985 ** Then the OP_ResultRow opcode is used to cause sqlite3_step() to-
2986 ** return the next row of result.-
2987 */-
2988 default: {
executed 897 times by 1 test: default:
Executed by:
  • Self test (438)
897
2989 assert( pDest->eDest==SRT_Output );-
2990 sqlite3VdbeAddOp2(v, OP_ResultRow, pIn->iSdst, pIn->nSdst);-
2991 break;
executed 897 times by 1 test: break;
Executed by:
  • Self test (438)
897
2992 }-
2993 }-
2994-
2995 /* Jump to the end of the loop if the LIMIT is reached.-
2996 */-
2997 if( p->iLimit ){
p->iLimitDescription
TRUEevaluated 165 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 963 times by 1 test
Evaluated by:
  • Self test (438)
165-963
2998 sqlite3VdbeAddOp2(v, OP_DecrJumpZero, p->iLimit, iBreak); VdbeCoverage(v);-
2999 }
executed 165 times by 1 test: end of block
Executed by:
  • Self test (438)
165
3000-
3001 /* Generate the subroutine return-
3002 */-
3003 sqlite3VdbeResolveLabel(v, iContinue);-
3004 sqlite3VdbeAddOp1(v, OP_Return, regReturn);-
3005-
3006 return addr;
executed 1128 times by 1 test: return addr;
Executed by:
  • Self test (438)
1128
3007}-
3008-
3009/*-
3010** Alternative compound select code generator for cases when there-
3011** is an ORDER BY clause.-
3012**-
3013** We assume a query of the following form:-
3014**-
3015** <selectA> <operator> <selectB> ORDER BY <orderbylist>-
3016**-
3017** <operator> is one of UNION ALL, UNION, EXCEPT, or INTERSECT. The idea-
3018** is to code both <selectA> and <selectB> with the ORDER BY clause as-
3019** co-routines. Then run the co-routines in parallel and merge the results-
3020** into the output. In addition to the two coroutines (called selectA and-
3021** selectB) there are 7 subroutines:-
3022**-
3023** outA: Move the output of the selectA coroutine into the output-
3024** of the compound query.-
3025**-
3026** outB: Move the output of the selectB coroutine into the output-
3027** of the compound query. (Only generated for UNION and-
3028** UNION ALL. EXCEPT and INSERTSECT never output a row that-
3029** appears only in B.)-
3030**-
3031** AltB: Called when there is data from both coroutines and A<B.-
3032**-
3033** AeqB: Called when there is data from both coroutines and A==B.-
3034**-
3035** AgtB: Called when there is data from both coroutines and A>B.-
3036**-
3037** EofA: Called when data is exhausted from selectA.-
3038**-
3039** EofB: Called when data is exhausted from selectB.-
3040**-
3041** The implementation of the latter five subroutines depend on which -
3042** <operator> is used:-
3043**-
3044**-
3045** UNION ALL UNION EXCEPT INTERSECT-
3046** ------------- ----------------- -------------- ------------------
3047** AltB: outA, nextA outA, nextA outA, nextA nextA-
3048**-
3049** AeqB: outA, nextA nextA nextA outA, nextA-
3050**-
3051** AgtB: outB, nextB outB, nextB nextB nextB-
3052**-
3053** EofA: outB, nextB outB, nextB halt halt-
3054**-
3055** EofB: outA, nextA outA, nextA outA, nextA halt-
3056**-
3057** In the AltB, AeqB, and AgtB subroutines, an EOF on A following nextA-
3058** causes an immediate jump to EofA and an EOF on B following nextB causes-
3059** an immediate jump to EofB. Within EofA and EofB, and EOF on entry or-
3060** following nextX causes a jump to the end of the select processing.-
3061**-
3062** Duplicate removal in the UNION, EXCEPT, and INTERSECT cases is handled-
3063** within the output subroutine. The regPrev register set holds the previously-
3064** output value. A comparison is made against this value and the output-
3065** is skipped if the next results would be the same as the previous.-
3066**-
3067** The implementation plan is to implement the two coroutines and seven-
3068** subroutines first, then put the control logic at the bottom. Like this:-
3069**-
3070** goto Init-
3071** coA: coroutine for left query (A)-
3072** coB: coroutine for right query (B)-
3073** outA: output one row of A-
3074** outB: output one row of B (UNION and UNION ALL only)-
3075** EofA: ...-
3076** EofB: ...-
3077** AltB: ...-
3078** AeqB: ...-
3079** AgtB: ...-
3080** Init: initialize coroutine registers-
3081** yield coA-
3082** if eof(A) goto EofA-
3083** yield coB-
3084** if eof(B) goto EofB-
3085** Cmpr: Compare A, B-
3086** Jump AltB, AeqB, AgtB-
3087** End: ...-
3088**-
3089** We call AltB, AeqB, AgtB, EofA, and EofB "subroutines" but they are not-
3090** actually called using Gosub and they do not Return. EofA and EofB loop-
3091** until all data is exhausted then jump to the "end" labe. AltB, AeqB,-
3092** and AgtB jump to either L2 or to one of EofA or EofB.-
3093*/-
3094#ifndef SQLITE_OMIT_COMPOUND_SELECT-
3095static int multiSelectOrderBy(-
3096 Parse *pParse, /* Parsing context */-
3097 Select *p, /* The right-most of SELECTs to be coded */-
3098 SelectDest *pDest /* What to do with query results */-
3099){-
3100 int i, j; /* Loop counters */-
3101 Select *pPrior; /* Another SELECT immediately to our left */-
3102 Vdbe *v; /* Generate code to this VDBE */-
3103 SelectDest destA; /* Destination for coroutine A */-
3104 SelectDest destB; /* Destination for coroutine B */-
3105 int regAddrA; /* Address register for select-A coroutine */-
3106 int regAddrB; /* Address register for select-B coroutine */-
3107 int addrSelectA; /* Address of the select-A coroutine */-
3108 int addrSelectB; /* Address of the select-B coroutine */-
3109 int regOutA; /* Address register for the output-A subroutine */-
3110 int regOutB; /* Address register for the output-B subroutine */-
3111 int addrOutA; /* Address of the output-A subroutine */-
3112 int addrOutB = 0; /* Address of the output-B subroutine */-
3113 int addrEofA; /* Address of the select-A-exhausted subroutine */-
3114 int addrEofA_noB; /* Alternate addrEofA if B is uninitialized */-
3115 int addrEofB; /* Address of the select-B-exhausted subroutine */-
3116 int addrAltB; /* Address of the A<B subroutine */-
3117 int addrAeqB; /* Address of the A==B subroutine */-
3118 int addrAgtB; /* Address of the A>B subroutine */-
3119 int regLimitA; /* Limit register for select-A */-
3120 int regLimitB; /* Limit register for select-A */-
3121 int regPrev; /* A range of registers to hold previous output */-
3122 int savedLimit; /* Saved value of p->iLimit */-
3123 int savedOffset; /* Saved value of p->iOffset */-
3124 int labelCmpr; /* Label for the start of the merge algorithm */-
3125 int labelEnd; /* Label for the end of the overall SELECT stmt */-
3126 int addr1; /* Jump instructions that get retargetted */-
3127 int op; /* One of TK_ALL, TK_UNION, TK_EXCEPT, TK_INTERSECT */-
3128 KeyInfo *pKeyDup = 0; /* Comparison information for duplicate removal */-
3129 KeyInfo *pKeyMerge; /* Comparison information for merging rows */-
3130 sqlite3 *db; /* Database connection */-
3131 ExprList *pOrderBy; /* The ORDER BY clause */-
3132 int nOrderBy; /* Number of terms in the ORDER BY clause */-
3133 int *aPermute; /* Mapping from ORDER BY terms to result set columns */-
3134-
3135 assert( p->pOrderBy!=0 );-
3136 assert( pKeyDup==0 ); /* "Managed" code needs this. Ticket #3382. */-
3137 db = pParse->db;-
3138 v = pParse->pVdbe;-
3139 assert( v!=0 ); /* Already thrown the error if VDBE alloc failed */-
3140 labelEnd = sqlite3VdbeMakeLabel(v);-
3141 labelCmpr = sqlite3VdbeMakeLabel(v);-
3142-
3143-
3144 /* Patch up the ORDER BY clause-
3145 */-
3146 op = p->op; -
3147 pPrior = p->pPrior;-
3148 assert( pPrior->pOrderBy==0 );-
3149 pOrderBy = p->pOrderBy;-
3150 assert( pOrderBy );-
3151 nOrderBy = pOrderBy->nExpr;-
3152-
3153 /* For operators other than UNION ALL we have to make sure that-
3154 ** the ORDER BY clause covers every term of the result set. Add-
3155 ** terms to the ORDER BY clause as necessary.-
3156 */-
3157 if( op!=TK_ALL ){
op!=124Description
TRUEevaluated 313 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 328 times by 1 test
Evaluated by:
  • Self test (438)
313-328
3158 for(i=1; db->mallocFailed==0 && i<=p->pEList->nExpr; i++){
db->mallocFailed==0Description
TRUEevaluated 1003 times by 1 test
Evaluated by:
  • Self test (438)
FALSEnever evaluated
i<=p->pEList->nExprDescription
TRUEevaluated 690 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 313 times by 1 test
Evaluated by:
  • Self test (438)
0-1003
3159 struct ExprList_item *pItem;-
3160 for(j=0, pItem=pOrderBy->a; j<nOrderBy; j++, pItem++){
j<nOrderByDescription
TRUEevaluated 1091 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 139 times by 1 test
Evaluated by:
  • Self test (438)
139-1091
3161 assert( pItem->u.x.iOrderByCol>0 );-
3162 if( pItem->u.x.iOrderByCol==i ) break;
executed 551 times by 1 test: break;
Executed by:
  • Self test (438)
pItem->u.x.iOrderByCol==iDescription
TRUEevaluated 551 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 540 times by 1 test
Evaluated by:
  • Self test (438)
540-551
3163 }
executed 540 times by 1 test: end of block
Executed by:
  • Self test (438)
540
3164 if( j==nOrderBy ){
j==nOrderByDescription
TRUEevaluated 139 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 551 times by 1 test
Evaluated by:
  • Self test (438)
139-551
3165 Expr *pNew = sqlite3Expr(db, TK_INTEGER, 0);-
3166 if( pNew==0 ) return SQLITE_NOMEM_BKPT;
never executed: return 7;
pNew==0Description
TRUEnever evaluated
FALSEevaluated 139 times by 1 test
Evaluated by:
  • Self test (438)
0-139
3167 pNew->flags |= EP_IntValue;-
3168 pNew->u.iValue = i;-
3169 p->pOrderBy = pOrderBy = sqlite3ExprListAppend(pParse, pOrderBy, pNew);-
3170 if( pOrderBy ) pOrderBy->a[nOrderBy++].u.x.iOrderByCol = (u16)i;
executed 139 times by 1 test: pOrderBy->a[nOrderBy++].u.x.iOrderByCol = (u16)i;
Executed by:
  • Self test (438)
pOrderByDescription
TRUEevaluated 139 times by 1 test
Evaluated by:
  • Self test (438)
FALSEnever evaluated
0-139
3171 }
executed 139 times by 1 test: end of block
Executed by:
  • Self test (438)
139
3172 }
executed 690 times by 1 test: end of block
Executed by:
  • Self test (438)
690
3173 }
executed 313 times by 1 test: end of block
Executed by:
  • Self test (438)
313
3174-
3175 /* Compute the comparison permutation and keyinfo that is used with-
3176 ** the permutation used to determine if the next-
3177 ** row of results comes from selectA or selectB. Also add explicit-
3178 ** collations to the ORDER BY clause terms so that when the subqueries-
3179 ** to the right and the left are evaluated, they use the correct-
3180 ** collation.-
3181 */-
3182 aPermute = sqlite3DbMallocRawNN(db, sizeof(int)*(nOrderBy + 1));-
3183 if( aPermute ){
aPermuteDescription
TRUEevaluated 641 times by 1 test
Evaluated by:
  • Self test (438)
FALSEnever evaluated
0-641
3184 struct ExprList_item *pItem;-
3185 aPermute[0] = nOrderBy;-
3186 for(i=1, pItem=pOrderBy->a; i<=nOrderBy; i++, pItem++){
i<=nOrderByDescription
TRUEevaluated 1174 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 641 times by 1 test
Evaluated by:
  • Self test (438)
641-1174
3187 assert( pItem->u.x.iOrderByCol>0 );-
3188 assert( pItem->u.x.iOrderByCol<=p->pEList->nExpr );-
3189 aPermute[i] = pItem->u.x.iOrderByCol - 1;-
3190 }
executed 1174 times by 1 test: end of block
Executed by:
  • Self test (438)
1174
3191 pKeyMerge = multiSelectOrderByKeyInfo(pParse, p, 1);-
3192 }else{
executed 641 times by 1 test: end of block
Executed by:
  • Self test (438)
641
3193 pKeyMerge = 0;-
3194 }
never executed: end of block
0
3195-
3196 /* Reattach the ORDER BY clause to the query.-
3197 */-
3198 p->pOrderBy = pOrderBy;-
3199 pPrior->pOrderBy = sqlite3ExprListDup(pParse->db, pOrderBy, 0);-
3200-
3201 /* Allocate a range of temporary registers and the KeyInfo needed-
3202 ** for the logic that removes duplicate result rows when the-
3203 ** operator is UNION, EXCEPT, or INTERSECT (but not UNION ALL).-
3204 */-
3205 if( op==TK_ALL ){
op==124Description
TRUEevaluated 328 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 313 times by 1 test
Evaluated by:
  • Self test (438)
313-328
3206 regPrev = 0;-
3207 }else{
executed 328 times by 1 test: end of block
Executed by:
  • Self test (438)
328
3208 int nExpr = p->pEList->nExpr;-
3209 assert( nOrderBy>=nExpr || db->mallocFailed );-
3210 regPrev = pParse->nMem+1;-
3211 pParse->nMem += nExpr+1;-
3212 sqlite3VdbeAddOp2(v, OP_Integer, 0, regPrev);-
3213 pKeyDup = sqlite3KeyInfoAlloc(db, nExpr, 1);-
3214 if( pKeyDup ){
pKeyDupDescription
TRUEevaluated 313 times by 1 test
Evaluated by:
  • Self test (438)
FALSEnever evaluated
0-313
3215 assert( sqlite3KeyInfoIsWriteable(pKeyDup) );-
3216 for(i=0; i<nExpr; i++){
i<nExprDescription
TRUEevaluated 690 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 313 times by 1 test
Evaluated by:
  • Self test (438)
313-690
3217 pKeyDup->aColl[i] = multiSelectCollSeq(pParse, p, i);-
3218 pKeyDup->aSortOrder[i] = 0;-
3219 }
executed 690 times by 1 test: end of block
Executed by:
  • Self test (438)
690
3220 }
executed 313 times by 1 test: end of block
Executed by:
  • Self test (438)
313
3221 }
executed 313 times by 1 test: end of block
Executed by:
  • Self test (438)
313
3222 -
3223 /* Separate the left and the right query from one another-
3224 */-
3225 p->pPrior = 0;-
3226 pPrior->pNext = 0;-
3227 sqlite3ResolveOrderGroupBy(pParse, p, p->pOrderBy, "ORDER");-
3228 if( pPrior->pPrior==0 ){
pPrior->pPrior==0Description
TRUEevaluated 563 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 78 times by 1 test
Evaluated by:
  • Self test (438)
78-563
3229 sqlite3ResolveOrderGroupBy(pParse, pPrior, pPrior->pOrderBy, "ORDER");-
3230 }
executed 563 times by 1 test: end of block
Executed by:
  • Self test (438)
563
3231-
3232 /* Compute the limit registers */-
3233 computeLimitRegisters(pParse, p, labelEnd);-
3234 if( p->iLimit && op==TK_ALL ){
p->iLimitDescription
TRUEevaluated 88 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 553 times by 1 test
Evaluated by:
  • Self test (438)
op==124Description
TRUEevaluated 53 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 35 times by 1 test
Evaluated by:
  • Self test (438)
35-553
3235 regLimitA = ++pParse->nMem;-
3236 regLimitB = ++pParse->nMem;-
3237 sqlite3VdbeAddOp2(v, OP_Copy, p->iOffset ? p->iOffset+1 : p->iLimit,-
3238 regLimitA);-
3239 sqlite3VdbeAddOp2(v, OP_Copy, regLimitA, regLimitB);-
3240 }else{
executed 53 times by 1 test: end of block
Executed by:
  • Self test (438)
53
3241 regLimitA = regLimitB = 0;-
3242 }
executed 588 times by 1 test: end of block
Executed by:
  • Self test (438)
588
3243 sqlite3ExprDelete(db, p->pLimit);-
3244 p->pLimit = 0;-
3245-
3246 regAddrA = ++pParse->nMem;-
3247 regAddrB = ++pParse->nMem;-
3248 regOutA = ++pParse->nMem;-
3249 regOutB = ++pParse->nMem;-
3250 sqlite3SelectDestInit(&destA, SRT_Coroutine, regAddrA);-
3251 sqlite3SelectDestInit(&destB, SRT_Coroutine, regAddrB);-
3252-
3253 ExplainQueryPlan((pParse, 1, "MERGE (%s)", selectOpName(p->op)));-
3254-
3255 /* Generate a coroutine to evaluate the SELECT statement to the-
3256 ** left of the compound operator - the "A" select.-
3257 */-
3258 addrSelectA = sqlite3VdbeCurrentAddr(v) + 1;-
3259 addr1 = sqlite3VdbeAddOp3(v, OP_InitCoroutine, regAddrA, 0, addrSelectA);-
3260 VdbeComment((v, "left SELECT"));-
3261 pPrior->iLimit = regLimitA;-
3262 ExplainQueryPlan((pParse, 1, "LEFT"));-
3263 sqlite3Select(pParse, pPrior, &destA);-
3264 sqlite3VdbeEndCoroutine(v, regAddrA);-
3265 sqlite3VdbeJumpHere(v, addr1);-
3266-
3267 /* Generate a coroutine to evaluate the SELECT statement on -
3268 ** the right - the "B" select-
3269 */-
3270 addrSelectB = sqlite3VdbeCurrentAddr(v) + 1;-
3271 addr1 = sqlite3VdbeAddOp3(v, OP_InitCoroutine, regAddrB, 0, addrSelectB);-
3272 VdbeComment((v, "right SELECT"));-
3273 savedLimit = p->iLimit;-
3274 savedOffset = p->iOffset;-
3275 p->iLimit = regLimitB;-
3276 p->iOffset = 0; -
3277 ExplainQueryPlan((pParse, 1, "RIGHT"));-
3278 sqlite3Select(pParse, p, &destB);-
3279 p->iLimit = savedLimit;-
3280 p->iOffset = savedOffset;-
3281 sqlite3VdbeEndCoroutine(v, regAddrB);-
3282-
3283 /* Generate a subroutine that outputs the current row of the A-
3284 ** select as the next output row of the compound select.-
3285 */-
3286 VdbeNoopComment((v, "Output routine for A"));-
3287 addrOutA = generateOutputSubroutine(pParse,-
3288 p, &destA, pDest, regOutA,-
3289 regPrev, pKeyDup, labelEnd);-
3290 -
3291 /* Generate a subroutine that outputs the current row of the B-
3292 ** select as the next output row of the compound select.-
3293 */-
3294 if( op==TK_ALL || op==TK_UNION ){
op==124Description
TRUEevaluated 328 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 313 times by 1 test
Evaluated by:
  • Self test (438)
op==123Description
TRUEevaluated 159 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 154 times by 1 test
Evaluated by:
  • Self test (438)
154-328
3295 VdbeNoopComment((v, "Output routine for B"));-
3296 addrOutB = generateOutputSubroutine(pParse,-
3297 p, &destB, pDest, regOutB,-
3298 regPrev, pKeyDup, labelEnd);-
3299 }
executed 487 times by 1 test: end of block
Executed by:
  • Self test (438)
487
3300 sqlite3KeyInfoUnref(pKeyDup);-
3301-
3302 /* Generate a subroutine to run when the results from select A-
3303 ** are exhausted and only data in select B remains.-
3304 */-
3305 if( op==TK_EXCEPT || op==TK_INTERSECT ){
op==125Description
TRUEevaluated 58 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 583 times by 1 test
Evaluated by:
  • Self test (438)
op==126Description
TRUEevaluated 96 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 487 times by 1 test
Evaluated by:
  • Self test (438)
58-583
3306 addrEofA_noB = addrEofA = labelEnd;-
3307 }else{
executed 154 times by 1 test: end of block
Executed by:
  • Self test (438)
154
3308 VdbeNoopComment((v, "eof-A subroutine"));-
3309 addrEofA = sqlite3VdbeAddOp2(v, OP_Gosub, regOutB, addrOutB);-
3310 addrEofA_noB = sqlite3VdbeAddOp2(v, OP_Yield, regAddrB, labelEnd);-
3311 VdbeCoverage(v);-
3312 sqlite3VdbeGoto(v, addrEofA);-
3313 p->nSelectRow = sqlite3LogEstAdd(p->nSelectRow, pPrior->nSelectRow);-
3314 }
executed 487 times by 1 test: end of block
Executed by:
  • Self test (438)
487
3315-
3316 /* Generate a subroutine to run when the results from select B-
3317 ** are exhausted and only data in select A remains.-
3318 */-
3319 if( op==TK_INTERSECT ){
op==126Description
TRUEevaluated 96 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 545 times by 1 test
Evaluated by:
  • Self test (438)
96-545
3320 addrEofB = addrEofA;-
3321 if( p->nSelectRow > pPrior->nSelectRow ) p->nSelectRow = pPrior->nSelectRow;
executed 32 times by 1 test: p->nSelectRow = pPrior->nSelectRow;
Executed by:
  • Self test (438)
p->nSelectRow ...or->nSelectRowDescription
TRUEevaluated 32 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 64 times by 1 test
Evaluated by:
  • Self test (438)
32-64
3322 }else{
executed 96 times by 1 test: end of block
Executed by:
  • Self test (438)
96
3323 VdbeNoopComment((v, "eof-B subroutine"));-
3324 addrEofB = sqlite3VdbeAddOp2(v, OP_Gosub, regOutA, addrOutA);-
3325 sqlite3VdbeAddOp2(v, OP_Yield, regAddrA, labelEnd); VdbeCoverage(v);-
3326 sqlite3VdbeGoto(v, addrEofB);-
3327 }
executed 545 times by 1 test: end of block
Executed by:
  • Self test (438)
545
3328-
3329 /* Generate code to handle the case of A<B-
3330 */-
3331 VdbeNoopComment((v, "A-lt-B subroutine"));-
3332 addrAltB = sqlite3VdbeAddOp2(v, OP_Gosub, regOutA, addrOutA);-
3333 sqlite3VdbeAddOp2(v, OP_Yield, regAddrA, addrEofA); VdbeCoverage(v);-
3334 sqlite3VdbeGoto(v, labelCmpr);-
3335-
3336 /* Generate code to handle the case of A==B-
3337 */-
3338 if( op==TK_ALL ){
op==124Description
TRUEevaluated 328 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 313 times by 1 test
Evaluated by:
  • Self test (438)
313-328
3339 addrAeqB = addrAltB;-
3340 }else if( op==TK_INTERSECT ){
executed 328 times by 1 test: end of block
Executed by:
  • Self test (438)
op==126Description
TRUEevaluated 96 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 217 times by 1 test
Evaluated by:
  • Self test (438)
96-328
3341 addrAeqB = addrAltB;-
3342 addrAltB++;-
3343 }else{
executed 96 times by 1 test: end of block
Executed by:
  • Self test (438)
96
3344 VdbeNoopComment((v, "A-eq-B subroutine"));-
3345 addrAeqB =-
3346 sqlite3VdbeAddOp2(v, OP_Yield, regAddrA, addrEofA); VdbeCoverage(v);-
3347 sqlite3VdbeGoto(v, labelCmpr);-
3348 }
executed 217 times by 1 test: end of block
Executed by:
  • Self test (438)
217
3349-
3350 /* Generate code to handle the case of A>B-
3351 */-
3352 VdbeNoopComment((v, "A-gt-B subroutine"));-
3353 addrAgtB = sqlite3VdbeCurrentAddr(v);-
3354 if( op==TK_ALL || op==TK_UNION ){
op==124Description
TRUEevaluated 328 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 313 times by 1 test
Evaluated by:
  • Self test (438)
op==123Description
TRUEevaluated 159 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 154 times by 1 test
Evaluated by:
  • Self test (438)
154-328
3355 sqlite3VdbeAddOp2(v, OP_Gosub, regOutB, addrOutB);-
3356 }
executed 487 times by 1 test: end of block
Executed by:
  • Self test (438)
487
3357 sqlite3VdbeAddOp2(v, OP_Yield, regAddrB, addrEofB); VdbeCoverage(v);-
3358 sqlite3VdbeGoto(v, labelCmpr);-
3359-
3360 /* This code runs once to initialize everything.-
3361 */-
3362 sqlite3VdbeJumpHere(v, addr1);-
3363 sqlite3VdbeAddOp2(v, OP_Yield, regAddrA, addrEofA_noB); VdbeCoverage(v);-
3364 sqlite3VdbeAddOp2(v, OP_Yield, regAddrB, addrEofB); VdbeCoverage(v);-
3365-
3366 /* Implement the main merge loop-
3367 */-
3368 sqlite3VdbeResolveLabel(v, labelCmpr);-
3369 sqlite3VdbeAddOp4(v, OP_Permutation, 0, 0, 0, (char*)aPermute, P4_INTARRAY);-
3370 sqlite3VdbeAddOp4(v, OP_Compare, destA.iSdst, destB.iSdst, nOrderBy,-
3371 (char*)pKeyMerge, P4_KEYINFO);-
3372 sqlite3VdbeChangeP5(v, OPFLAG_PERMUTE);-
3373 sqlite3VdbeAddOp3(v, OP_Jump, addrAltB, addrAeqB, addrAgtB); VdbeCoverage(v);-
3374-
3375 /* Jump to the this point in order to terminate the query.-
3376 */-
3377 sqlite3VdbeResolveLabel(v, labelEnd);-
3378-
3379 /* Reassembly the compound query so that it will be freed correctly-
3380 ** by the calling function */-
3381 if( p->pPrior ){
p->pPriorDescription
TRUEevaluated 8 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 633 times by 1 test
Evaluated by:
  • Self test (438)
8-633
3382 sqlite3SelectDelete(db, p->pPrior);-
3383 }
executed 8 times by 1 test: end of block
Executed by:
  • Self test (438)
8
3384 p->pPrior = pPrior;-
3385 pPrior->pNext = p;-
3386-
3387 /*** TBD: Insert subroutine calls to close cursors on incomplete-
3388 **** subqueries ****/-
3389 ExplainQueryPlanPop(pParse);-
3390 return pParse->nErr!=0;
executed 641 times by 1 test: return pParse->nErr!=0;
Executed by:
  • Self test (438)
641
3391}-
3392#endif-
3393-
3394#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW)-
3395-
3396/* An instance of the SubstContext object describes an substitution edit-
3397** to be performed on a parse tree.-
3398**-
3399** All references to columns in table iTable are to be replaced by corresponding-
3400** expressions in pEList.-
3401*/-
3402typedef struct SubstContext {-
3403 Parse *pParse; /* The parsing context */-
3404 int iTable; /* Replace references to this table */-
3405 int iNewTable; /* New table number */-
3406 int isLeftJoin; /* Add TK_IF_NULL_ROW opcodes on each replacement */-
3407 ExprList *pEList; /* Replacement expressions */-
3408} SubstContext;-
3409-
3410/* Forward Declarations */-
3411static void substExprList(SubstContext*, ExprList*);-
3412static void substSelect(SubstContext*, Select*, int);-
3413-
3414/*-
3415** Scan through the expression pExpr. Replace every reference to-
3416** a column in table number iTable with a copy of the iColumn-th-
3417** entry in pEList. (But leave references to the ROWID column -
3418** unchanged.)-
3419**-
3420** This routine is part of the flattening procedure. A subquery-
3421** whose result set is defined by pEList appears as entry in the-
3422** FROM clause of a SELECT such that the VDBE cursor assigned to that-
3423** FORM clause entry is iTable. This routine makes the necessary -
3424** changes to pExpr so that it refers directly to the source table-
3425** of the subquery rather the result set of the subquery.-
3426*/-
3427static Expr *substExpr(-
3428 SubstContext *pSubst, /* Description of the substitution */-
3429 Expr *pExpr /* Expr in which substitution occurs */-
3430){-
3431 if( pExpr==0 ) return 0;
executed 90626 times by 2 tests: return 0;
Executed by:
  • Self test (438)
  • Self test (47)
pExpr==0Description
TRUEevaluated 90626 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
FALSEevaluated 53177 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
53177-90626
3432 if( ExprHasProperty(pExpr, EP_FromJoin)
(((pExpr)->fla...0x000001))!=0)Description
TRUEevaluated 415 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 52762 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
415-52762
3433 && pExpr->iRightJoinTable==pSubst->iTable
pExpr->iRightJ...pSubst->iTableDescription
TRUEevaluated 59 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 356 times by 1 test
Evaluated by:
  • Self test (438)
59-356
3434 ){-
3435 pExpr->iRightJoinTable = pSubst->iNewTable;-
3436 }
executed 59 times by 1 test: end of block
Executed by:
  • Self test (438)
59
3437 if( pExpr->op==TK_COLUMN && pExpr->iTable==pSubst->iTable ){
pExpr->op==158Description
TRUEevaluated 45217 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
FALSEevaluated 7960 times by 1 test
Evaluated by:
  • Self test (438)
pExpr->iTable==pSubst->iTableDescription
TRUEevaluated 38972 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
FALSEevaluated 6245 times by 1 test
Evaluated by:
  • Self test (438)
6245-45217
3438 if( pExpr->iColumn<0 ){
pExpr->iColumn<0Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 38968 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
4-38968
3439 pExpr->op = TK_NULL;-
3440 }else{
executed 4 times by 1 test: end of block
Executed by:
  • Self test (438)
4
3441 Expr *pNew;-
3442 Expr *pCopy = pSubst->pEList->a[pExpr->iColumn].pExpr;-
3443 Expr ifNullRow;-
3444 assert( pSubst->pEList!=0 && pExpr->iColumn<pSubst->pEList->nExpr );-
3445 assert( pExpr->pRight==0 );-
3446 if( sqlite3ExprIsVector(pCopy) ){
sqlite3ExprIsVector(pCopy)Description
TRUEevaluated 8 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 38960 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
8-38960
3447 sqlite3VectorErrorMsg(pSubst->pParse, pCopy);-
3448 }else{
executed 8 times by 1 test: end of block
Executed by:
  • Self test (438)
8
3449 sqlite3 *db = pSubst->pParse->db;-
3450 if( pSubst->isLeftJoin && pCopy->op!=TK_COLUMN ){
pSubst->isLeftJoinDescription
TRUEevaluated 64 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 38896 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
pCopy->op!=158Description
TRUEevaluated 8 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 56 times by 1 test
Evaluated by:
  • Self test (438)
8-38896
3451 memset(&ifNullRow, 0, sizeof(ifNullRow));-
3452 ifNullRow.op = TK_IF_NULL_ROW;-
3453 ifNullRow.pLeft = pCopy;-
3454 ifNullRow.iTable = pSubst->iNewTable;-
3455 pCopy = &ifNullRow;-
3456 }
executed 8 times by 1 test: end of block
Executed by:
  • Self test (438)
8
3457 pNew = sqlite3ExprDup(db, pCopy, 0);-
3458 if( pNew && pSubst->isLeftJoin ){
pNewDescription
TRUEevaluated 38914 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
FALSEevaluated 46 times by 1 test
Evaluated by:
  • Self test (438)
pSubst->isLeftJoinDescription
TRUEevaluated 64 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 38850 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
46-38914
3459 ExprSetProperty(pNew, EP_CanBeNull);-
3460 }
executed 64 times by 1 test: end of block
Executed by:
  • Self test (438)
64
3461 if( pNew && ExprHasProperty(pExpr,EP_FromJoin) ){
pNewDescription
TRUEevaluated 38914 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
FALSEevaluated 46 times by 1 test
Evaluated by:
  • Self test (438)
(((pExpr)->fla...0x000001))!=0)Description
TRUEevaluated 33 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 38881 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
33-38914
3462 pNew->iRightJoinTable = pExpr->iRightJoinTable;-
3463 ExprSetProperty(pNew, EP_FromJoin);-
3464 }
executed 33 times by 1 test: end of block
Executed by:
  • Self test (438)
33
3465 sqlite3ExprDelete(db, pExpr);-
3466 pExpr = pNew;-
3467 }
executed 38960 times by 2 tests: end of block
Executed by:
  • Self test (438)
  • Self test (47)
38960
3468 }-
3469 }else{-
3470 if( pExpr->op==TK_IF_NULL_ROW && pExpr->iTable==pSubst->iTable ){
pExpr->op==167Description
TRUEevaluated 5 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 14200 times by 1 test
Evaluated by:
  • Self test (438)
pExpr->iTable==pSubst->iTableDescription
TRUEevaluated 4 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test (438)
1-14200
3471 pExpr->iTable = pSubst->iNewTable;-
3472 }
executed 4 times by 1 test: end of block
Executed by:
  • Self test (438)
4
3473 pExpr->pLeft = substExpr(pSubst, pExpr->pLeft);-
3474 pExpr->pRight = substExpr(pSubst, pExpr->pRight);-
3475 if( ExprHasProperty(pExpr, EP_xIsSelect) ){
(((pExpr)->fla...0x000800))!=0)Description
TRUEevaluated 114 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 14091 times by 1 test
Evaluated by:
  • Self test (438)
114-14091
3476 substSelect(pSubst, pExpr->x.pSelect, 1);-
3477 }else{
executed 114 times by 1 test: end of block
Executed by:
  • Self test (438)
114
3478 substExprList(pSubst, pExpr->x.pList);-
3479 }
executed 14091 times by 1 test: end of block
Executed by:
  • Self test (438)
14091
3480 }-
3481 return pExpr;
executed 53177 times by 2 tests: return pExpr;
Executed by:
  • Self test (438)
  • Self test (47)
53177
3482}-
3483static void substExprList(-
3484 SubstContext *pSubst, /* Description of the substitution */-
3485 ExprList *pList /* List to scan and in which to make substitutes */-
3486){-
3487 int i;-
3488 if( pList==0 ) return;
executed 86678 times by 2 tests: return;
Executed by:
  • Self test (438)
  • Self test (47)
pList==0Description
TRUEevaluated 86678 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
FALSEevaluated 37605 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
37605-86678
3489 for(i=0; i<pList->nExpr; i++){
i<pList->nExprDescription
TRUEevaluated 41834 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
FALSEevaluated 37605 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
37605-41834
3490 pList->a[i].pExpr = substExpr(pSubst, pList->a[i].pExpr);-
3491 }
executed 41834 times by 2 tests: end of block
Executed by:
  • Self test (438)
  • Self test (47)
41834
3492}
executed 37605 times by 2 tests: end of block
Executed by:
  • Self test (438)
  • Self test (47)
37605
3493static void substSelect(-
3494 SubstContext *pSubst, /* Description of the substitution */-
3495 Select *p, /* SELECT statement in which to make substitutions */-
3496 int doPrior /* Do substitutes on p->pPrior too */-
3497){-
3498 SrcList *pSrc;-
3499 struct SrcList_item *pItem;-
3500 int i;-
3501 if( !p ) return;
executed 37543 times by 2 tests: return;
Executed by:
  • Self test (438)
  • Self test (47)
!pDescription
TRUEevaluated 37543 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
FALSEevaluated 36612 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
36612-37543
3502 do{-
3503 substExprList(pSubst, p->pEList);-
3504 substExprList(pSubst, p->pGroupBy);-
3505 substExprList(pSubst, p->pOrderBy);-
3506 p->pHaving = substExpr(pSubst, p->pHaving);-
3507 p->pWhere = substExpr(pSubst, p->pWhere);-
3508 pSrc = p->pSrc;-
3509 assert( pSrc!=0 );-
3510 for(i=pSrc->nSrc, pItem=pSrc->a; i>0; i--, pItem++){
i>0Description
TRUEevaluated 38460 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
FALSEevaluated 36730 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
36730-38460
3511 substSelect(pSubst, pItem->pSelect, 1);-
3512 if( pItem->fg.isTabFunc ){
pItem->fg.isTabFuncDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 38458 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
2-38458
3513 substExprList(pSubst, pItem->u1.pFuncArg);-
3514 }
executed 2 times by 1 test: end of block
Executed by:
  • Self test (438)
2
3515 }
executed 38460 times by 2 tests: end of block
Executed by:
  • Self test (438)
  • Self test (47)
38460
3516 }while( doPrior && (p = p->pPrior)!=0 );
executed 36730 times by 2 tests: end of block
Executed by:
  • Self test (438)
  • Self test (47)
doPriorDescription
TRUEevaluated 1149 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 35581 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
(p = p->pPrior)!=0Description
TRUEevaluated 118 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1031 times by 1 test
Evaluated by:
  • Self test (438)
118-36730
3517}
executed 36612 times by 2 tests: end of block
Executed by:
  • Self test (438)
  • Self test (47)
36612
3518#endif /* !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) */-
3519-
3520#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW)-
3521/*-
3522** This routine attempts to flatten subqueries as a performance optimization.-
3523** This routine returns 1 if it makes changes and 0 if no flattening occurs.-
3524**-
3525** To understand the concept of flattening, consider the following-
3526** query:-
3527**-
3528** SELECT a FROM (SELECT x+y AS a FROM t1 WHERE z<100) WHERE a>5-
3529**-
3530** The default way of implementing this query is to execute the-
3531** subquery first and store the results in a temporary table, then-
3532** run the outer query on that temporary table. This requires two-
3533** passes over the data. Furthermore, because the temporary table-
3534** has no indices, the WHERE clause on the outer query cannot be-
3535** optimized.-
3536**-
3537** This routine attempts to rewrite queries such as the above into-
3538** a single flat select, like this:-
3539**-
3540** SELECT x+y AS a FROM t1 WHERE z<100 AND a>5-
3541**-
3542** The code generated for this simplification gives the same result-
3543** but only has to scan the data once. And because indices might -
3544** exist on the table t1, a complete scan of the data might be-
3545** avoided.-
3546**-
3547** Flattening is subject to the following constraints:-
3548**-
3549** (**) We no longer attempt to flatten aggregate subqueries. Was:-
3550** The subquery and the outer query cannot both be aggregates.-
3551**-
3552** (**) We no longer attempt to flatten aggregate subqueries. Was:-
3553** (2) If the subquery is an aggregate then-
3554** (2a) the outer query must not be a join and-
3555** (2b) the outer query must not use subqueries-
3556** other than the one FROM-clause subquery that is a candidate-
3557** for flattening. (This is due to ticket [2f7170d73bf9abf80]-
3558** from 2015-02-09.)-
3559**-
3560** (3) If the subquery is the right operand of a LEFT JOIN then-
3561** (3a) the subquery may not be a join and-
3562** (3b) the FROM clause of the subquery may not contain a virtual-
3563** table and-
3564** (3c) the outer query may not be an aggregate.-
3565**-
3566** (4) The subquery can not be DISTINCT.-
3567**-
3568** (**) At one point restrictions (4) and (5) defined a subset of DISTINCT-
3569** sub-queries that were excluded from this optimization. Restriction -
3570** (4) has since been expanded to exclude all DISTINCT subqueries.-
3571**-
3572** (**) We no longer attempt to flatten aggregate subqueries. Was:-
3573** If the subquery is aggregate, the outer query may not be DISTINCT.-
3574**-
3575** (7) The subquery must have a FROM clause. TODO: For subqueries without-
3576** A FROM clause, consider adding a FROM clause with the special-
3577** table sqlite_once that consists of a single row containing a-
3578** single NULL.-
3579**-
3580** (8) If the subquery uses LIMIT then the outer query may not be a join.-
3581**-
3582** (9) If the subquery uses LIMIT then the outer query may not be aggregate.-
3583**-
3584** (**) Restriction (10) was removed from the code on 2005-02-05 but we-
3585** accidently carried the comment forward until 2014-09-15. Original-
3586** constraint: "If the subquery is aggregate then the outer query -
3587** may not use LIMIT."-
3588**-
3589** (11) The subquery and the outer query may not both have ORDER BY clauses.-
3590**-
3591** (**) Not implemented. Subsumed into restriction (3). Was previously-
3592** a separate restriction deriving from ticket #350.-
3593**-
3594** (13) The subquery and outer query may not both use LIMIT.-
3595**-
3596** (14) The subquery may not use OFFSET.-
3597**-
3598** (15) If the outer query is part of a compound select, then the-
3599** subquery may not use LIMIT.-
3600** (See ticket #2339 and ticket [02a8e81d44]).-
3601**-
3602** (16) If the outer query is aggregate, then the subquery may not-
3603** use ORDER BY. (Ticket #2942) This used to not matter-
3604** until we introduced the group_concat() function. -
3605**-
3606** (17) If the subquery is a compound select, then-
3607** (17a) all compound operators must be a UNION ALL, and-
3608** (17b) no terms within the subquery compound may be aggregate-
3609** or DISTINCT, and-
3610** (17c) every term within the subquery compound must have a FROM clause-
3611** (17d) the outer query may not be-
3612** (17d1) aggregate, or-
3613** (17d2) DISTINCT, or-
3614** (17d3) a join.-
3615**-
3616** The parent and sub-query may contain WHERE clauses. Subject to-
3617** rules (11), (13) and (14), they may also contain ORDER BY,-
3618** LIMIT and OFFSET clauses. The subquery cannot use any compound-
3619** operator other than UNION ALL because all the other compound-
3620** operators have an implied DISTINCT which is disallowed by-
3621** restriction (4).-
3622**-
3623** Also, each component of the sub-query must return the same number-
3624** of result columns. This is actually a requirement for any compound-
3625** SELECT statement, but all the code here does is make sure that no-
3626** such (illegal) sub-query is flattened. The caller will detect the-
3627** syntax error and return a detailed message.-
3628**-
3629** (18) If the sub-query is a compound select, then all terms of the-
3630** ORDER BY clause of the parent must be simple references to -
3631** columns of the sub-query.-
3632**-
3633** (19) If the subquery uses LIMIT then the outer query may not-
3634** have a WHERE clause.-
3635**-
3636** (20) If the sub-query is a compound select, then it must not use-
3637** an ORDER BY clause. Ticket #3773. We could relax this constraint-
3638** somewhat by saying that the terms of the ORDER BY clause must-
3639** appear as unmodified result columns in the outer query. But we-
3640** have other optimizations in mind to deal with that case.-
3641**-
3642** (21) If the subquery uses LIMIT then the outer query may not be-
3643** DISTINCT. (See ticket [752e1646fc]).-
3644**-
3645** (22) The subquery may not be a recursive CTE.-
3646**-
3647** (**) Subsumed into restriction (17d3). Was: If the outer query is-
3648** a recursive CTE, then the sub-query may not be a compound query.-
3649** This restriction is because transforming the-
3650** parent to a compound query confuses the code that handles-
3651** recursive queries in multiSelect().-
3652**-
3653** (**) We no longer attempt to flatten aggregate subqueries. Was:-
3654** The subquery may not be an aggregate that uses the built-in min() or -
3655** or max() functions. (Without this restriction, a query like:-
3656** "SELECT x FROM (SELECT max(y), x FROM t1)" would not necessarily-
3657** return the value X for which Y was maximal.)-
3658**-
3659** (25) If either the subquery or the parent query contains a window-
3660** function in the select list or ORDER BY clause, flattening-
3661** is not attempted.-
3662**-
3663**-
3664** In this routine, the "p" parameter is a pointer to the outer query.-
3665** The subquery is p->pSrc->a[iFrom]. isAgg is true if the outer query-
3666** uses aggregates.-
3667**-
3668** If flattening is not attempted, this routine is a no-op and returns 0.-
3669** If flattening is attempted this routine returns 1.-
3670**-
3671** All of the expression analysis must occur on both the outer query and-
3672** the subquery before this routine runs.-
3673*/-
3674static int flattenSubquery(-
3675 Parse *pParse, /* Parsing context */-
3676 Select *p, /* The parent or outer SELECT statement */-
3677 int iFrom, /* Index in p->pSrc->a[] of the inner subquery */-
3678 int isAgg /* True if outer SELECT uses aggregate functions */-
3679){-
3680 const char *zSavedAuthContext = pParse->zAuthContext;-
3681 Select *pParent; /* Current UNION ALL term of the other query */-
3682 Select *pSub; /* The inner query or "subquery" */-
3683 Select *pSub1; /* Pointer to the rightmost select in sub-query */-
3684 SrcList *pSrc; /* The FROM clause of the outer query */-
3685 SrcList *pSubSrc; /* The FROM clause of the subquery */-
3686 int iParent; /* VDBE cursor number of the pSub result set temp table */-
3687 int iNewParent = -1;/* Replacement table for iParent */-
3688 int isLeftJoin = 0; /* True if pSub is the right side of a LEFT JOIN */ -
3689 int i; /* Loop counter */-
3690 Expr *pWhere; /* The WHERE clause */-
3691 struct SrcList_item *pSubitem; /* The subquery */-
3692 sqlite3 *db = pParse->db;-
3693-
3694 /* Check to see if flattening is permitted. Return 0 if not.-
3695 */-
3696 assert( p!=0 );-
3697 assert( p->pPrior==0 );-
3698 if( OptimizationDisabled(db, SQLITE_QueryFlattener) ) return 0;
executed 75 times by 1 test: return 0;
Executed by:
  • Self test (438)
(((db)->dbOptF...&(0x0001))!=0)Description
TRUEevaluated 75 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 69143 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
75-69143
3699 pSrc = p->pSrc;-
3700 assert( pSrc && iFrom>=0 && iFrom<pSrc->nSrc );-
3701 pSubitem = &pSrc->a[iFrom];-
3702 iParent = pSubitem->iCursor;-
3703 pSub = pSubitem->pSelect;-
3704 assert( pSub!=0 );-
3705-
3706#ifndef SQLITE_OMIT_WINDOWFUNC-
3707 if( p->pWin || pSub->pWin ) return 0; /* Restriction (25) */
executed 206 times by 1 test: return 0;
Executed by:
  • Self test (438)
p->pWinDescription
TRUEevaluated 198 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 68945 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
pSub->pWinDescription
TRUEevaluated 8 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 68937 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
8-68945
3708#endif-
3709-
3710 pSubSrc = pSub->pSrc;-
3711 assert( pSubSrc );-
3712 /* Prior to version 3.1.2, when LIMIT and OFFSET had to be simple constants,-
3713 ** not arbitrary expressions, we allowed some combining of LIMIT and OFFSET-
3714 ** because they could be computed at compile-time. But when LIMIT and OFFSET-
3715 ** became arbitrary expressions, we were forced to add restrictions (13)-
3716 ** and (14). */-
3717 if( pSub->pLimit && p->pLimit ) return 0; /* Restriction (13) */
executed 29 times by 1 test: return 0;
Executed by:
  • Self test (438)
pSub->pLimitDescription
TRUEevaluated 148 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 68789 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
p->pLimitDescription
TRUEevaluated 29 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 119 times by 1 test
Evaluated by:
  • Self test (438)
29-68789
3718 if( pSub->pLimit && pSub->pLimit->pRight ) return 0; /* Restriction (14) */
executed 14 times by 1 test: return 0;
Executed by:
  • Self test (438)
pSub->pLimitDescription
TRUEevaluated 119 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 68789 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
pSub->pLimit->pRightDescription
TRUEevaluated 14 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 105 times by 1 test
Evaluated by:
  • Self test (438)
14-68789
3719 if( (p->selFlags & SF_Compound)!=0 && pSub->pLimit ){
(p->selFlags & 0x00100)!=0Description
TRUEevaluated 65705 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 3189 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
pSub->pLimitDescription
TRUEevaluated 54 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 65651 times by 1 test
Evaluated by:
  • Self test (438)
54-65705
3720 return 0; /* Restriction (15) */
executed 54 times by 1 test: return 0;
Executed by:
  • Self test (438)
54
3721 }-
3722 if( pSubSrc->nSrc==0 ) return 0; /* Restriction (7) */
executed 219 times by 1 test: return 0;
Executed by:
  • Self test (438)
pSubSrc->nSrc==0Description
TRUEevaluated 219 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 68621 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
219-68621
3723 if( pSub->selFlags & SF_Distinct ) return 0; /* Restriction (4) */
executed 28 times by 1 test: return 0;
Executed by:
  • Self test (438)
pSub->selFlags & 0x00001Description
TRUEevaluated 28 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 68593 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
28-68593
3724 if( pSub->pLimit && (pSrc->nSrc>1 || isAgg) ){
pSub->pLimitDescription
TRUEevaluated 51 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 68542 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
pSrc->nSrc>1Description
TRUEevaluated 7 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 44 times by 1 test
Evaluated by:
  • Self test (438)
isAggDescription
TRUEevaluated 10 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 34 times by 1 test
Evaluated by:
  • Self test (438)
7-68542
3725 return 0; /* Restrictions (8)(9) */
executed 17 times by 1 test: return 0;
Executed by:
  • Self test (438)
17
3726 }-
3727 if( p->pOrderBy && pSub->pOrderBy ){
p->pOrderByDescription
TRUEevaluated 256 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 68320 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
pSub->pOrderByDescription
TRUEevaluated 27 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 229 times by 1 test
Evaluated by:
  • Self test (438)
27-68320
3728 return 0; /* Restriction (11) */
executed 27 times by 1 test: return 0;
Executed by:
  • Self test (438)
27
3729 }-
3730 if( isAgg && pSub->pOrderBy ) return 0; /* Restriction (16) */
never executed: return 0;
isAggDescription
TRUEevaluated 69 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 68480 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
pSub->pOrderByDescription
TRUEnever evaluated
FALSEevaluated 69 times by 1 test
Evaluated by:
  • Self test (438)
0-68480
3731 if( pSub->pLimit && p->pWhere ) return 0; /* Restriction (19) */
executed 6 times by 1 test: return 0;
Executed by:
  • Self test (438)
pSub->pLimitDescription
TRUEevaluated 20 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 68529 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
p->pWhereDescription
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 14 times by 1 test
Evaluated by:
  • Self test (438)
6-68529
3732 if( pSub->pLimit && (p->selFlags & SF_Distinct)!=0 ){
pSub->pLimitDescription
TRUEevaluated 14 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 68529 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
(p->selFlags & 0x00001)!=0Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 13 times by 1 test
Evaluated by:
  • Self test (438)
1-68529
3733 return 0; /* Restriction (21) */
executed 1 time by 1 test: return 0;
Executed by:
  • Self test (438)
1
3734 }-
3735 if( pSub->selFlags & (SF_Recursive) ){
pSub->selFlags & (0x02000)Description
TRUEevaluated 280 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 68262 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
280-68262
3736 return 0; /* Restrictions (22) */
executed 280 times by 1 test: return 0;
Executed by:
  • Self test (438)
280
3737 }-
3738-
3739 /*-
3740 ** If the subquery is the right operand of a LEFT JOIN, then the-
3741 ** subquery may not be a join itself (3a). Example of why this is not-
3742 ** allowed:-
3743 **-
3744 ** t1 LEFT OUTER JOIN (t2 JOIN t3)-
3745 **-
3746 ** If we flatten the above, we would get-
3747 **-
3748 ** (t1 LEFT OUTER JOIN t2) JOIN t3-
3749 **-
3750 ** which is not at all the same thing.-
3751 **-
3752 ** If the subquery is the right operand of a LEFT JOIN, then the outer-
3753 ** query cannot be an aggregate. (3c) This is an artifact of the way-
3754 ** aggregates are processed - there is no mechanism to determine if-
3755 ** the LEFT JOIN table should be all-NULL.-
3756 **-
3757 ** See also tickets #306, #350, and #3300.-
3758 */-
3759 if( (pSubitem->fg.jointype & JT_OUTER)!=0 ){
(pSubitem->fg....e & 0x0020)!=0Description
TRUEevaluated 46 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 68216 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
46-68216
3760 isLeftJoin = 1;-
3761 if( pSubSrc->nSrc>1 || isAgg || IsVirtual(pSubSrc->a[0].pTab) ){
pSubSrc->nSrc>1Description
TRUEevaluated 20 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 26 times by 1 test
Evaluated by:
  • Self test (438)
isAggDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 24 times by 1 test
Evaluated by:
  • Self test (438)
((pSubSrc->a[0...)->nModuleArg)Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 22 times by 1 test
Evaluated by:
  • Self test (438)
2-26
3762 /* (3a) (3c) (3b) */-
3763 return 0;
executed 24 times by 1 test: return 0;
Executed by:
  • Self test (438)
24
3764 }-
3765 }
executed 22 times by 1 test: end of block
Executed by:
  • Self test (438)
22
3766#ifdef SQLITE_EXTRA_IFNULLROW-
3767 else if( iFrom>0 && !isAgg ){-
3768 /* Setting isLeftJoin to -1 causes OP_IfNullRow opcodes to be generated for-
3769 ** every reference to any result column from subquery in a join, even-
3770 ** though they are not necessary. This will stress-test the OP_IfNullRow -
3771 ** opcode. */-
3772 isLeftJoin = -1;-
3773 }-
3774#endif-
3775-
3776 /* Restriction (17): If the sub-query is a compound SELECT, then it must-
3777 ** use only the UNION ALL operator. And none of the simple select queries-
3778 ** that make up the compound SELECT are allowed to be aggregate or distinct-
3779 ** queries.-
3780 */-
3781 if( pSub->pPrior ){
pSub->pPriorDescription
TRUEevaluated 33102 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 35136 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
33102-35136
3782 if( pSub->pOrderBy ){
pSub->pOrderByDescription
TRUEevaluated 5 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 33097 times by 1 test
Evaluated by:
  • Self test (438)
5-33097
3783 return 0; /* Restriction (20) */
executed 5 times by 1 test: return 0;
Executed by:
  • Self test (438)
5
3784 }-
3785 if( isAgg || (p->selFlags & SF_Distinct)!=0 || pSrc->nSrc!=1 ){
isAggDescription
TRUEevaluated 9 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 33088 times by 1 test
Evaluated by:
  • Self test (438)
(p->selFlags & 0x00001)!=0Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 33086 times by 1 test
Evaluated by:
  • Self test (438)
pSrc->nSrc!=1Description
TRUEevaluated 14 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 33072 times by 1 test
Evaluated by:
  • Self test (438)
2-33088
3786 return 0; /* (17d1), (17d2), or (17d3) */
executed 25 times by 1 test: return 0;
Executed by:
  • Self test (438)
25
3787 }-
3788 for(pSub1=pSub; pSub1; pSub1=pSub1->pPrior){
pSub1Description
TRUEevaluated 33337 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 235 times by 1 test
Evaluated by:
  • Self test (438)
235-33337
3789 testcase( (pSub1->selFlags & (SF_Distinct|SF_Aggregate))==SF_Distinct );-
3790 testcase( (pSub1->selFlags & (SF_Distinct|SF_Aggregate))==SF_Aggregate );-
3791 assert( pSub->pSrc!=0 );-
3792 assert( pSub->pEList->nExpr==pSub1->pEList->nExpr );-
3793 if( (pSub1->selFlags & (SF_Distinct|SF_Aggregate))!=0 /* (17b) */
(pSub1->selFla...1|0x00008))!=0Description
TRUEnever evaluated
FALSEevaluated 33337 times by 1 test
Evaluated by:
  • Self test (438)
0-33337
3794 || (pSub1->pPrior && pSub1->op!=TK_ALL) /* (17a) */
pSub1->pPriorDescription
TRUEevaluated 33098 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 239 times by 1 test
Evaluated by:
  • Self test (438)
pSub1->op!=124Description
TRUEevaluated 32833 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 265 times by 1 test
Evaluated by:
  • Self test (438)
239-33098
3795 || pSub1->pSrc->nSrc<1 /* (17c) */
pSub1->pSrc->nSrc<1Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 500 times by 1 test
Evaluated by:
  • Self test (438)
4-500
3796 ){-
3797 return 0;
executed 32837 times by 1 test: return 0;
Executed by:
  • Self test (438)
32837
3798 }-
3799 testcase( pSub1->pSrc->nSrc>1 );-
3800 }
executed 500 times by 1 test: end of block
Executed by:
  • Self test (438)
500
3801-
3802 /* Restriction (18). */-
3803 if( p->pOrderBy ){
p->pOrderByDescription
TRUEevaluated 66 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 169 times by 1 test
Evaluated by:
  • Self test (438)
66-169
3804 int ii;-
3805 for(ii=0; ii<p->pOrderBy->nExpr; ii++){
ii<p->pOrderBy->nExprDescription
TRUEevaluated 68 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 61 times by 1 test
Evaluated by:
  • Self test (438)
61-68
3806 if( p->pOrderBy->a[ii].u.x.iOrderByCol==0 ) return 0;
executed 5 times by 1 test: return 0;
Executed by:
  • Self test (438)
p->pOrderBy->a...iOrderByCol==0Description
TRUEevaluated 5 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 63 times by 1 test
Evaluated by:
  • Self test (438)
5-63
3807 }
executed 63 times by 1 test: end of block
Executed by:
  • Self test (438)
63
3808 }
executed 61 times by 1 test: end of block
Executed by:
  • Self test (438)
61
3809 }
executed 230 times by 1 test: end of block
Executed by:
  • Self test (438)
230
3810-
3811 /* Ex-restriction (23):-
3812 ** The only way that the recursive part of a CTE can contain a compound-
3813 ** subquery is for the subquery to be one term of a join. But if the-
3814 ** subquery is a join, then the flattening has already been stopped by-
3815 ** restriction (17d3)-
3816 */-
3817 assert( (p->selFlags & SF_Recursive)==0 || pSub->pPrior==0 );-
3818-
3819 /***** If we reach this point, flattening is permitted. *****/-
3820 SELECTTRACE(1,pParse,p,("flatten %u.%p from term %d\n",-
3821 pSub->selId, pSub, iFrom));-
3822-
3823 /* Authorize the subquery */-
3824 pParse->zAuthContext = pSubitem->zName;-
3825 TESTONLY(i =) sqlite3AuthCheck(pParse, SQLITE_SELECT, 0, 0, 0);-
3826 testcase( i==SQLITE_DENY );-
3827 pParse->zAuthContext = zSavedAuthContext;-
3828-
3829 /* If the sub-query is a compound SELECT statement, then (by restrictions-
3830 ** 17 and 18 above) it must be a UNION ALL and the parent query must -
3831 ** be of the form:-
3832 **-
3833 ** SELECT <expr-list> FROM (<sub-query>) <where-clause> -
3834 **-
3835 ** followed by any ORDER BY, LIMIT and/or OFFSET clauses. This block-
3836 ** creates N-1 copies of the parent query without any ORDER BY, LIMIT or -
3837 ** OFFSET clauses and joins them to the left-hand-side of the original-
3838 ** using UNION ALL operators. In this case N is the number of simple-
3839 ** select statements in the compound sub-query.-
3840 **-
3841 ** Example:-
3842 **-
3843 ** SELECT a+1 FROM (-
3844 ** SELECT x FROM tab-
3845 ** UNION ALL-
3846 ** SELECT y FROM tab-
3847 ** UNION ALL-
3848 ** SELECT abs(z*2) FROM tab2-
3849 ** ) WHERE a!=5 ORDER BY 1-
3850 **-
3851 ** Transformed into:-
3852 **-
3853 ** SELECT x+1 FROM tab WHERE x+1!=5-
3854 ** UNION ALL-
3855 ** SELECT y+1 FROM tab WHERE y+1!=5-
3856 ** UNION ALL-
3857 ** SELECT abs(z*2)+1 FROM tab2 WHERE abs(z*2)+1!=5-
3858 ** ORDER BY 1-
3859 **-
3860 ** We call this the "compound-subquery flattening".-
3861 */-
3862 for(pSub=pSub->pPrior; pSub; pSub=pSub->pPrior){
pSubDescription
TRUEevaluated 256 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 35366 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
256-35366
3863 Select *pNew;-
3864 ExprList *pOrderBy = p->pOrderBy;-
3865 Expr *pLimit = p->pLimit;-
3866 Select *pPrior = p->pPrior;-
3867 p->pOrderBy = 0;-
3868 p->pSrc = 0;-
3869 p->pPrior = 0;-
3870 p->pLimit = 0;-
3871 pNew = sqlite3SelectDup(db, p, 0);-
3872 p->pLimit = pLimit;-
3873 p->pOrderBy = pOrderBy;-
3874 p->pSrc = pSrc;-
3875 p->op = TK_ALL;-
3876 if( pNew==0 ){
pNew==0Description
TRUEnever evaluated
FALSEevaluated 256 times by 1 test
Evaluated by:
  • Self test (438)
0-256
3877 p->pPrior = pPrior;-
3878 }else{
never executed: end of block
0
3879 pNew->pPrior = pPrior;-
3880 if( pPrior ) pPrior->pNext = pNew;
executed 26 times by 1 test: pPrior->pNext = pNew;
Executed by:
  • Self test (438)
pPriorDescription
TRUEevaluated 26 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 230 times by 1 test
Evaluated by:
  • Self test (438)
26-230
3881 pNew->pNext = p;-
3882 p->pPrior = pNew;-
3883 SELECTTRACE(2,pParse,p,("compound-subquery flattener"-
3884 " creates %u as peer\n",pNew->selId));-
3885 }
executed 256 times by 1 test: end of block
Executed by:
  • Self test (438)
256
3886 if( db->mallocFailed ) return 1;
never executed: return 1;
db->mallocFailedDescription
TRUEnever evaluated
FALSEevaluated 256 times by 1 test
Evaluated by:
  • Self test (438)
0-256
3887 }
executed 256 times by 1 test: end of block
Executed by:
  • Self test (438)
256
3888-
3889 /* Begin flattening the iFrom-th entry of the FROM clause -
3890 ** in the outer query.-
3891 */-
3892 pSub = pSub1 = pSubitem->pSelect;-
3893-
3894 /* Delete the transient table structure associated with the-
3895 ** subquery-
3896 */-
3897 sqlite3DbFree(db, pSubitem->zDatabase);-
3898 sqlite3DbFree(db, pSubitem->zName);-
3899 sqlite3DbFree(db, pSubitem->zAlias);-
3900 pSubitem->zDatabase = 0;-
3901 pSubitem->zName = 0;-
3902 pSubitem->zAlias = 0;-
3903 pSubitem->pSelect = 0;-
3904-
3905 /* Defer deleting the Table object associated with the-
3906 ** subquery until code generation is-
3907 ** complete, since there may still exist Expr.pTab entries that-
3908 ** refer to the subquery even after flattening. Ticket #3346.-
3909 **-
3910 ** pSubitem->pTab is always non-NULL by test restrictions and tests above.-
3911 */-
3912 if( ALWAYS(pSubitem->pTab!=0) ){
(pSubitem->pTab!=0)Description
TRUEevaluated 35366 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
FALSEnever evaluated
0-35366
3913 Table *pTabToDel = pSubitem->pTab;-
3914 if( pTabToDel->nTabRef==1 ){
pTabToDel->nTabRef==1Description
TRUEevaluated 612 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 34754 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
612-34754
3915 Parse *pToplevel = sqlite3ParseToplevel(pParse);
(pParse)->pToplevelDescription
TRUEevaluated 4 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 608 times by 1 test
Evaluated by:
  • Self test (438)
4-608
3916 pTabToDel->pNextZombie = pToplevel->pZombieTab;-
3917 pToplevel->pZombieTab = pTabToDel;-
3918 }else{
executed 612 times by 1 test: end of block
Executed by:
  • Self test (438)
612
3919 pTabToDel->nTabRef--;-
3920 }
executed 34754 times by 2 tests: end of block
Executed by:
  • Self test (438)
  • Self test (47)
34754
3921 pSubitem->pTab = 0;-
3922 }
executed 35366 times by 2 tests: end of block
Executed by:
  • Self test (438)
  • Self test (47)
35366
3923-
3924 /* The following loop runs once for each term in a compound-subquery-
3925 ** flattening (as described above). If we are doing a different kind-
3926 ** of flattening - a flattening other than a compound-subquery flattening --
3927 ** then this loop only runs once.-
3928 **-
3929 ** This loop moves all of the FROM elements of the subquery into the-
3930 ** the FROM clause of the outer query. Before doing this, remember-
3931 ** the cursor number for the original outer query FROM element in-
3932 ** iParent. The iParent cursor will never be used. Subsequent code-
3933 ** will scan expressions looking for iParent references and replace-
3934 ** those references with expressions that resolve to the subquery FROM-
3935 ** elements we are now copying in.-
3936 */-
3937 for(pParent=p; pParent; pParent=pParent->pPrior, pSub=pSub->pPrior){
pParentDescription
TRUEevaluated 35622 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
FALSEevaluated 35362 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
35362-35622
3938 int nSubSrc;-
3939 u8 jointype = 0;-
3940 pSubSrc = pSub->pSrc; /* FROM clause of subquery */-
3941 nSubSrc = pSubSrc->nSrc; /* Number of terms in subquery FROM clause */-
3942 pSrc = pParent->pSrc; /* FROM clause of the outer query */-
3943-
3944 if( pSrc ){
pSrcDescription
TRUEevaluated 35366 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
FALSEevaluated 256 times by 1 test
Evaluated by:
  • Self test (438)
256-35366
3945 assert( pParent==p ); /* First time through the loop */-
3946 jointype = pSubitem->fg.jointype;-
3947 }else{
executed 35366 times by 2 tests: end of block
Executed by:
  • Self test (438)
  • Self test (47)
35366
3948 assert( pParent!=p ); /* 2nd and subsequent times through the loop */-
3949 pSrc = pParent->pSrc = sqlite3SrcListAppend(db, 0, 0, 0);-
3950 if( pSrc==0 ){
pSrc==0Description
TRUEnever evaluated
FALSEevaluated 256 times by 1 test
Evaluated by:
  • Self test (438)
0-256
3951 assert( db->mallocFailed );-
3952 break;
never executed: break;
0
3953 }-
3954 }
executed 256 times by 1 test: end of block
Executed by:
  • Self test (438)
256
3955-
3956 /* The subquery uses a single slot of the FROM clause of the outer-
3957 ** query. If the subquery has more than one element in its FROM clause,-
3958 ** then expand the outer query to make space for it to hold all elements-
3959 ** of the subquery.-
3960 **-
3961 ** Example:-
3962 **-
3963 ** SELECT * FROM tabA, (SELECT * FROM sub1, sub2), tabB;-
3964 **-
3965 ** The outer query has 3 slots in its FROM clause. One slot of the-
3966 ** outer query (the middle slot) is used by the subquery. The next-
3967 ** block of code will expand the outer query FROM clause to 4 slots.-
3968 ** The middle slot is expanded to two slots in order to make space-
3969 ** for the two elements in the FROM clause of the subquery.-
3970 */-
3971 if( nSubSrc>1 ){
nSubSrc>1Description
TRUEevaluated 1521 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 34101 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
1521-34101
3972 pParent->pSrc = pSrc = sqlite3SrcListEnlarge(db, pSrc, nSubSrc-1,iFrom+1);-
3973 if( db->mallocFailed ){
db->mallocFailedDescription
TRUEevaluated 4 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1517 times by 1 test
Evaluated by:
  • Self test (438)
4-1517
3974 break;
executed 4 times by 1 test: break;
Executed by:
  • Self test (438)
4
3975 }-
3976 }
executed 1517 times by 1 test: end of block
Executed by:
  • Self test (438)
1517
3977-
3978 /* Transfer the FROM clause terms from the subquery into the-
3979 ** outer query.-
3980 */-
3981 for(i=0; i<nSubSrc; i++){
i<nSubSrcDescription
TRUEevaluated 37149 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
FALSEevaluated 35618 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
35618-37149
3982 sqlite3IdListDelete(db, pSrc->a[i+iFrom].pUsing);-
3983 assert( pSrc->a[i+iFrom].fg.isTabFunc==0 );-
3984 pSrc->a[i+iFrom] = pSubSrc->a[i];-
3985 iNewParent = pSubSrc->a[i].iCursor;-
3986 memset(&pSubSrc->a[i], 0, sizeof(pSubSrc->a[i]));-
3987 }
executed 37149 times by 2 tests: end of block
Executed by:
  • Self test (438)
  • Self test (47)
37149
3988 pSrc->a[iFrom].fg.jointype = jointype;-
3989 -
3990 /* Now begin substituting subquery result set expressions for -
3991 ** references to the iParent in the outer query.-
3992 ** -
3993 ** Example:-
3994 **-
3995 ** SELECT a+5, b*10 FROM (SELECT x*3 AS a, y+10 AS b FROM t1) WHERE a>b;-
3996 ** \ \_____________ subquery __________/ /-
3997 ** \_____________________ outer query ______________________________/-
3998 **-
3999 ** We look at every expression in the outer query and every place we see-
4000 ** "a" we substitute "x*3" and every place we see "b" we substitute "y+10".-
4001 */-
4002 if( pSub->pOrderBy ){
pSub->pOrderByDescription
TRUEevaluated 50 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 35568 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
50-35568
4003 /* At this point, any non-zero iOrderByCol values indicate that the-
4004 ** ORDER BY column expression is identical to the iOrderByCol'th-
4005 ** expression returned by SELECT statement pSub. Since these values-
4006 ** do not necessarily correspond to columns in SELECT statement pParent,-
4007 ** zero them before transfering the ORDER BY clause.-
4008 **-
4009 ** Not doing this may cause an error if a subsequent call to this-
4010 ** function attempts to flatten a compound sub-query into pParent-
4011 ** (the only way this can happen is if the compound sub-query is-
4012 ** currently part of pSub->pSrc). See ticket [d11a6e908f]. */-
4013 ExprList *pOrderBy = pSub->pOrderBy;-
4014 for(i=0; i<pOrderBy->nExpr; i++){
i<pOrderBy->nExprDescription
TRUEevaluated 54 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 50 times by 1 test
Evaluated by:
  • Self test (438)
50-54
4015 pOrderBy->a[i].u.x.iOrderByCol = 0;-
4016 }
executed 54 times by 1 test: end of block
Executed by:
  • Self test (438)
54
4017 assert( pParent->pOrderBy==0 );-
4018 pParent->pOrderBy = pOrderBy;-
4019 pSub->pOrderBy = 0;-
4020 }
executed 50 times by 1 test: end of block
Executed by:
  • Self test (438)
50
4021 pWhere = sqlite3ExprDup(db, pSub->pWhere, 0);-
4022 if( isLeftJoin>0 ){
isLeftJoin>0Description
TRUEevaluated 22 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 35596 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
22-35596
4023 setJoinExpr(pWhere, iNewParent);-
4024 }
executed 22 times by 1 test: end of block
Executed by:
  • Self test (438)
22
4025 pParent->pWhere = sqlite3ExprAnd(db, pWhere, pParent->pWhere);-
4026 if( db->mallocFailed==0 ){
db->mallocFailed==0Description
TRUEevaluated 35581 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
FALSEevaluated 37 times by 1 test
Evaluated by:
  • Self test (438)
37-35581
4027 SubstContext x;-
4028 x.pParse = pParse;-
4029 x.iTable = iParent;-
4030 x.iNewTable = iNewParent;-
4031 x.isLeftJoin = isLeftJoin;-
4032 x.pEList = pSub->pEList;-
4033 substSelect(&x, pParent, 0);-
4034 }
executed 35581 times by 2 tests: end of block
Executed by:
  • Self test (438)
  • Self test (47)
35581
4035 -
4036 /* The flattened query is distinct if either the inner or the-
4037 ** outer query is distinct. -
4038 */-
4039 pParent->selFlags |= pSub->selFlags & SF_Distinct;-
4040 -
4041 /*-
4042 ** SELECT ... FROM (SELECT ... LIMIT a OFFSET b) LIMIT x OFFSET y;-
4043 **-
4044 ** One is tempted to try to add a and b to combine the limits. But this-
4045 ** does not work if either limit is negative.-
4046 */-
4047 if( pSub->pLimit ){
pSub->pLimitDescription
TRUEevaluated 8 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 35610 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
8-35610
4048 pParent->pLimit = pSub->pLimit;-
4049 pSub->pLimit = 0;-
4050 }
executed 8 times by 1 test: end of block
Executed by:
  • Self test (438)
8
4051 }
executed 35618 times by 2 tests: end of block
Executed by:
  • Self test (438)
  • Self test (47)
35618
4052-
4053 /* Finially, delete what is left of the subquery and return-
4054 ** success.-
4055 */-
4056 sqlite3SelectDelete(db, pSub1);-
4057-
4058#if SELECTTRACE_ENABLED-
4059 if( sqlite3SelectTrace & 0x100 ){-
4060 SELECTTRACE(0x100,pParse,p,("After flattening:\n"));-
4061 sqlite3TreeViewSelect(0, p, 0);-
4062 }-
4063#endif-
4064-
4065 return 1;
executed 35366 times by 2 tests: return 1;
Executed by:
  • Self test (438)
  • Self test (47)
35366
4066}-
4067#endif /* !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) */-
4068-
4069/*-
4070** A structure to keep track of all of the column values that fixed to-
4071** a known value due to WHERE clause constraints of the form COLUMN=VALUE.-
4072*/-
4073typedef struct WhereConst WhereConst;-
4074struct WhereConst {-
4075 Parse *pParse; /* Parsing context */-
4076 int nConst; /* Number for COLUMN=CONSTANT terms */-
4077 int nChng; /* Number of times a constant is propagated */-
4078 Expr **apExpr; /* [i*2] is COLUMN and [i*2+1] is VALUE */-
4079};-
4080-
4081/*-
4082** Add a new entry to the pConst object-
4083*/-
4084static void constInsert(-
4085 WhereConst *pConst,-
4086 Expr *pColumn,-
4087 Expr *pValue-
4088){-
4089-
4090 pConst->nConst++;-
4091 pConst->apExpr = sqlite3DbReallocOrFree(pConst->pParse->db, pConst->apExpr,-
4092 pConst->nConst*2*sizeof(Expr*));-
4093 if( pConst->apExpr==0 ){
pConst->apExpr==0Description
TRUEevaluated 102 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 3748 times by 1 test
Evaluated by:
  • Self test (438)
102-3748
4094 pConst->nConst = 0;-
4095 }else{
executed 102 times by 1 test: end of block
Executed by:
  • Self test (438)
102
4096 if( ExprHasProperty(pValue, EP_FixedCol) ) pValue = pValue->pLeft;
executed 39 times by 1 test: pValue = pValue->pLeft;
Executed by:
  • Self test (438)
(((pValue)->fl...0x000008))!=0)Description
TRUEevaluated 39 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 3709 times by 1 test
Evaluated by:
  • Self test (438)
39-3709
4097 pConst->apExpr[pConst->nConst*2-2] = pColumn;-
4098 pConst->apExpr[pConst->nConst*2-1] = pValue;-
4099 }
executed 3748 times by 1 test: end of block
Executed by:
  • Self test (438)
3748
4100}-
4101-
4102/*-
4103** Find all terms of COLUMN=VALUE or VALUE=COLUMN in pExpr where VALUE-
4104** is a constant expression and where the term must be true because it-
4105** is part of the AND-connected terms of the expression. For each term-
4106** found, add it to the pConst structure.-
4107*/-
4108static void findConstInWhere(WhereConst *pConst, Expr *pExpr){-
4109 Expr *pRight, *pLeft;-
4110 if( pExpr==0 ) return;
executed 411 times by 1 test: return;
Executed by:
  • Self test (438)
pExpr==0Description
TRUEevaluated 411 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 21556 times by 1 test
Evaluated by:
  • Self test (438)
411-21556
4111 if( ExprHasProperty(pExpr, EP_FromJoin) ) return;
executed 457 times by 1 test: return;
Executed by:
  • Self test (438)
(((pExpr)->fla...0x000001))!=0)Description
TRUEevaluated 457 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 21099 times by 1 test
Evaluated by:
  • Self test (438)
457-21099
4112 if( pExpr->op==TK_AND ){
pExpr->op==44Description
TRUEevaluated 7497 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 13602 times by 1 test
Evaluated by:
  • Self test (438)
7497-13602
4113 findConstInWhere(pConst, pExpr->pRight);-
4114 findConstInWhere(pConst, pExpr->pLeft);-
4115 return;
executed 7497 times by 1 test: return;
Executed by:
  • Self test (438)
7497
4116 }-
4117 if( pExpr->op!=TK_EQ ) return;
executed 3265 times by 1 test: return;
Executed by:
  • Self test (438)
pExpr->op!=53Description
TRUEevaluated 3265 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 10337 times by 1 test
Evaluated by:
  • Self test (438)
3265-10337
4118 pRight = pExpr->pRight;-
4119 pLeft = pExpr->pLeft;-
4120 assert( pRight!=0 );-
4121 assert( pLeft!=0 );-
4122 if( pRight->op==TK_COLUMN
pRight->op==158Description
TRUEevaluated 4424 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 5913 times by 1 test
Evaluated by:
  • Self test (438)
4424-5913
4123 && !ExprHasProperty(pRight, EP_FixedCol)
!(((pRight)->f...0x000008))!=0)Description
TRUEevaluated 4385 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 39 times by 1 test
Evaluated by:
  • Self test (438)
39-4385
4124 && sqlite3ExprIsConstant(pLeft)
sqlite3ExprIsConstant(pLeft)Description
TRUEevaluated 47 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 4338 times by 1 test
Evaluated by:
  • Self test (438)
47-4338
4125 && sqlite3IsBinary(sqlite3BinaryCompareCollSeq(pConst->pParse,pLeft,pRight))
sqlite3IsBinar...pLeft,pRight))Description
TRUEevaluated 42 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 5 times by 1 test
Evaluated by:
  • Self test (438)
5-42
4126 ){-
4127 constInsert(pConst, pRight, pLeft);-
4128 }else
executed 42 times by 1 test: end of block
Executed by:
  • Self test (438)
42
4129 if( pLeft->op==TK_COLUMN
pLeft->op==158Description
TRUEevaluated 10236 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 59 times by 1 test
Evaluated by:
  • Self test (438)
59-10236
4130 && !ExprHasProperty(pLeft, EP_FixedCol)
!(((pLeft)->fl...0x000008))!=0)Description
TRUEevaluated 10231 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 5 times by 1 test
Evaluated by:
  • Self test (438)
5-10231
4131 && sqlite3ExprIsConstant(pRight)
sqlite3ExprIsConstant(pRight)Description
TRUEevaluated 3815 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 6416 times by 1 test
Evaluated by:
  • Self test (438)
3815-6416
4132 && sqlite3IsBinary(sqlite3BinaryCompareCollSeq(pConst->pParse,pLeft,pRight))
sqlite3IsBinar...pLeft,pRight))Description
TRUEevaluated 3808 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 7 times by 1 test
Evaluated by:
  • Self test (438)
7-3808
4133 ){-
4134 constInsert(pConst, pLeft, pRight);-
4135 }
executed 3808 times by 1 test: end of block
Executed by:
  • Self test (438)
3808
4136}
executed 10337 times by 1 test: end of block
Executed by:
  • Self test (438)
10337
4137-
4138/*-
4139** This is a Walker expression callback. pExpr is a candidate expression-
4140** to be replaced by a value. If pExpr is equivalent to one of the-
4141** columns named in pWalker->u.pConst, then overwrite it with its-
4142** corresponding value.-
4143*/-
4144static int propagateConstantExprRewrite(Walker *pWalker, Expr *pExpr){-
4145 int i;-
4146 WhereConst *pConst;-
4147 if( pExpr->op!=TK_COLUMN ) return WRC_Continue;
executed 15343 times by 1 test: return 0;
Executed by:
  • Self test (438)
pExpr->op!=158Description
TRUEevaluated 15343 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 10230 times by 1 test
Evaluated by:
  • Self test (438)
10230-15343
4148 if( ExprHasProperty(pExpr, EP_FixedCol) ) return WRC_Continue;
executed 58 times by 1 test: return 0;
Executed by:
  • Self test (438)
(((pExpr)->fla...0x000008))!=0)Description
TRUEevaluated 58 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 10172 times by 1 test
Evaluated by:
  • Self test (438)
58-10172
4149 pConst = pWalker->u.pConst;-
4150 for(i=0; i<pConst->nConst; i++){
i<pConst->nConstDescription
TRUEevaluated 12294 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 10118 times by 1 test
Evaluated by:
  • Self test (438)
10118-12294
4151 Expr *pColumn = pConst->apExpr[i*2];-
4152 if( pColumn==pExpr ) continue;
executed 3728 times by 1 test: continue;
Executed by:
  • Self test (438)
pColumn==pExprDescription
TRUEevaluated 3728 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 8566 times by 1 test
Evaluated by:
  • Self test (438)
3728-8566
4153 if( pColumn->iTable!=pExpr->iTable ) continue;
executed 4430 times by 1 test: continue;
Executed by:
  • Self test (438)
pColumn->iTable!=pExpr->iTableDescription
TRUEevaluated 4430 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 4136 times by 1 test
Evaluated by:
  • Self test (438)
4136-4430
4154 if( pColumn->iColumn!=pExpr->iColumn ) continue;
executed 4082 times by 1 test: continue;
Executed by:
  • Self test (438)
pColumn->iColu...pExpr->iColumnDescription
TRUEevaluated 4082 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 54 times by 1 test
Evaluated by:
  • Self test (438)
54-4082
4155 /* A match is found. Add the EP_FixedCol property */-
4156 pConst->nChng++;-
4157 ExprClearProperty(pExpr, EP_Leaf);-
4158 ExprSetProperty(pExpr, EP_FixedCol);-
4159 assert( pExpr->pLeft==0 );-
4160 pExpr->pLeft = sqlite3ExprDup(pConst->pParse->db, pConst->apExpr[i*2+1], 0);-
4161 break;
executed 54 times by 1 test: break;
Executed by:
  • Self test (438)
54
4162 }-
4163 return WRC_Prune;
executed 10172 times by 1 test: return 1;
Executed by:
  • Self test (438)
10172
4164}-
4165-
4166/*-
4167** The WHERE-clause constant propagation optimization.-
4168**-
4169** If the WHERE clause contains terms of the form COLUMN=CONSTANT or-
4170** CONSTANT=COLUMN that must be tree (in other words, if the terms top-level-
4171** AND-connected terms that are not part of a ON clause from a LEFT JOIN)-
4172** then throughout the query replace all other occurrences of COLUMN-
4173** with CONSTANT within the WHERE clause.-
4174**-
4175** For example, the query:-
4176**-
4177** SELECT * FROM t1, t2, t3 WHERE t1.a=39 AND t2.b=t1.a AND t3.c=t2.b-
4178**-
4179** Is transformed into-
4180**-
4181** SELECT * FROM t1, t2, t3 WHERE t1.a=39 AND t2.b=39 AND t3.c=39-
4182**-
4183** Return true if any transformations where made and false if not.-
4184**-
4185** Implementation note: Constant propagation is tricky due to affinity-
4186** and collating sequence interactions. Consider this example:-
4187**-
4188** CREATE TABLE t1(a INT,b TEXT);-
4189** INSERT INTO t1 VALUES(123,'0123');-
4190** SELECT * FROM t1 WHERE a=123 AND b=a;-
4191** SELECT * FROM t1 WHERE a=123 AND b=123;-
4192**-
4193** The two SELECT statements above should return different answers. b=a-
4194** is alway true because the comparison uses numeric affinity, but b=123-
4195** is false because it uses text affinity and '0123' is not the same as '123'.-
4196** To work around this, the expression tree is not actually changed from-
4197** "b=a" to "b=123" but rather the "a" in "b=a" is tagged with EP_FixedCol-
4198** and the "123" value is hung off of the pLeft pointer. Code generator-
4199** routines know to generate the constant "123" instead of looking up the-
4200** column value. Also, to avoid collation problems, this optimization is-
4201** only attempted if the "a=123" term uses the default BINARY collation.-
4202*/-
4203static int propagateConstants(-
4204 Parse *pParse, /* The parsing context */-
4205 Select *p /* The query in which to propagate constants */-
4206){-
4207 WhereConst x;-
4208 Walker w;-
4209 int nChng = 0;-
4210 x.pParse = pParse;-
4211 do{-
4212 x.nConst = 0;-
4213 x.nChng = 0;-
4214 x.apExpr = 0;-
4215 findConstInWhere(&x, p->pWhere);-
4216 if( x.nConst ){
x.nConstDescription
TRUEevaluated 3258 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 3715 times by 1 test
Evaluated by:
  • Self test (438)
3258-3715
4217 memset(&w, 0, sizeof(w));-
4218 w.pParse = pParse;-
4219 w.xExprCallback = propagateConstantExprRewrite;-
4220 w.xSelectCallback = sqlite3SelectWalkNoop;-
4221 w.xSelectCallback2 = 0;-
4222 w.walkerDepth = 0;-
4223 w.u.pConst = &x;-
4224 sqlite3WalkExpr(&w, p->pWhere);-
4225 sqlite3DbFree(x.pParse->db, x.apExpr);-
4226 nChng += x.nChng;-
4227 }
executed 3258 times by 1 test: end of block
Executed by:
  • Self test (438)
3258
4228 }while( x.nChng );
executed 6973 times by 1 test: end of block
Executed by:
  • Self test (438)
x.nChngDescription
TRUEevaluated 49 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 6924 times by 1 test
Evaluated by:
  • Self test (438)
49-6973
4229 return nChng;
executed 6924 times by 1 test: return nChng;
Executed by:
  • Self test (438)
6924
4230}-
4231-
4232#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW)-
4233/*-
4234** Make copies of relevant WHERE clause terms of the outer query into-
4235** the WHERE clause of subquery. Example:-
4236**-
4237** SELECT * FROM (SELECT a AS x, c-d AS y FROM t1) WHERE x=5 AND y=10;-
4238**-
4239** Transformed into:-
4240**-
4241** SELECT * FROM (SELECT a AS x, c-d AS y FROM t1 WHERE a=5 AND c-d=10)-
4242** WHERE x=5 AND y=10;-
4243**-
4244** The hope is that the terms added to the inner query will make it more-
4245** efficient.-
4246**-
4247** Do not attempt this optimization if:-
4248**-
4249** (1) (** This restriction was removed on 2017-09-29. We used to-
4250** disallow this optimization for aggregate subqueries, but now-
4251** it is allowed by putting the extra terms on the HAVING clause.-
4252** The added HAVING clause is pointless if the subquery lacks-
4253** a GROUP BY clause. But such a HAVING clause is also harmless-
4254** so there does not appear to be any reason to add extra logic-
4255** to suppress it. **)-
4256**-
4257** (2) The inner query is the recursive part of a common table expression.-
4258**-
4259** (3) The inner query has a LIMIT clause (since the changes to the WHERE-
4260** clause would change the meaning of the LIMIT).-
4261**-
4262** (4) The inner query is the right operand of a LEFT JOIN and the-
4263** expression to be pushed down does not come from the ON clause-
4264** on that LEFT JOIN.-
4265**-
4266** (5) The WHERE clause expression originates in the ON or USING clause-
4267** of a LEFT JOIN where iCursor is not the right-hand table of that-
4268** left join. An example:-
4269**-
4270** SELECT *-
4271** FROM (SELECT 1 AS a1 UNION ALL SELECT 2) AS aa-
4272** JOIN (SELECT 1 AS b2 UNION ALL SELECT 2) AS bb ON (a1=b2)-
4273** LEFT JOIN (SELECT 8 AS c3 UNION ALL SELECT 9) AS cc ON (b2=2);-
4274**-
4275** The correct answer is three rows: (1,1,NULL),(2,2,8),(2,2,9).-
4276** But if the (b2=2) term were to be pushed down into the bb subquery,-
4277** then the (1,1,NULL) row would be suppressed.-
4278**-
4279** (6) The inner query features one or more window-functions (since -
4280** changes to the WHERE clause of the inner query could change the -
4281** window over which window functions are calculated).-
4282**-
4283** Return 0 if no changes are made and non-zero if one or more WHERE clause-
4284** terms are duplicated into the subquery.-
4285*/-
4286static int pushDownWhereTerms(-
4287 Parse *pParse, /* Parse context (for malloc() and error reporting) */-
4288 Select *pSubq, /* The subquery whose WHERE clause is to be augmented */-
4289 Expr *pWhere, /* The WHERE clause of the outer query */-
4290 int iCursor, /* Cursor number of the subquery */-
4291 int isLeftJoin /* True if pSubq is the right term of a LEFT JOIN */-
4292){-
4293 Expr *pNew;-
4294 int nChng = 0;-
4295 if( pWhere==0 ) return 0;
executed 35358 times by 1 test: return 0;
Executed by:
  • Self test (438)
pWhere==0Description
TRUEevaluated 35358 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 244 times by 1 test
Evaluated by:
  • Self test (438)
244-35358
4296 if( pSubq->selFlags & SF_Recursive ) return 0; /* restriction (2) */
executed 14 times by 1 test: return 0;
Executed by:
  • Self test (438)
pSubq->selFlags & 0x02000Description
TRUEevaluated 14 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 230 times by 1 test
Evaluated by:
  • Self test (438)
14-230
4297-
4298#ifndef SQLITE_OMIT_WINDOWFUNC-
4299 if( pSubq->pWin ) return 0; /* restriction (6) */
executed 1 time by 1 test: return 0;
Executed by:
  • Self test (438)
pSubq->pWinDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 229 times by 1 test
Evaluated by:
  • Self test (438)
1-229
4300#endif-
4301-
4302#ifdef SQLITE_DEBUG-
4303 /* Only the first term of a compound can have a WITH clause. But make-
4304 ** sure no other terms are marked SF_Recursive in case something changes-
4305 ** in the future.-
4306 */-
4307 {-
4308 Select *pX; -
4309 for(pX=pSubq; pX; pX=pX->pPrior){-
4310 assert( (pX->selFlags & (SF_Recursive))==0 );-
4311 }-
4312 }-
4313#endif-
4314-
4315 if( pSubq->pLimit!=0 ){
pSubq->pLimit!=0Description
TRUEevaluated 22 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 207 times by 1 test
Evaluated by:
  • Self test (438)
22-207
4316 return 0; /* restriction (3) */
executed 22 times by 1 test: return 0;
Executed by:
  • Self test (438)
22
4317 }-
4318 while( pWhere->op==TK_AND ){
pWhere->op==44Description
TRUEevaluated 51 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 207 times by 1 test
Evaluated by:
  • Self test (438)
51-207
4319 nChng += pushDownWhereTerms(pParse, pSubq, pWhere->pRight,-
4320 iCursor, isLeftJoin);-
4321 pWhere = pWhere->pLeft;-
4322 }
executed 51 times by 1 test: end of block
Executed by:
  • Self test (438)
51
4323 if( isLeftJoin
isLeftJoinDescription
TRUEevaluated 43 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 164 times by 1 test
Evaluated by:
  • Self test (438)
43-164
4324 && (ExprHasProperty(pWhere,EP_FromJoin)==0
(((pWhere)->fl...00001))!=0)==0Description
TRUEevaluated 7 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 36 times by 1 test
Evaluated by:
  • Self test (438)
7-36
4325 || pWhere->iRightJoinTable!=iCursor)
pWhere->iRight...Table!=iCursorDescription
TRUEevaluated 4 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 32 times by 1 test
Evaluated by:
  • Self test (438)
4-32
4326 ){-
4327 return 0; /* restriction (4) */
executed 11 times by 1 test: return 0;
Executed by:
  • Self test (438)
11
4328 }-
4329 if( ExprHasProperty(pWhere,EP_FromJoin) && pWhere->iRightJoinTable!=iCursor ){
(((pWhere)->fl...0x000001))!=0)Description
TRUEevaluated 43 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 153 times by 1 test
Evaluated by:
  • Self test (438)
pWhere->iRight...Table!=iCursorDescription
TRUEevaluated 11 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 32 times by 1 test
Evaluated by:
  • Self test (438)
11-153
4330 return 0; /* restriction (5) */
executed 11 times by 1 test: return 0;
Executed by:
  • Self test (438)
11
4331 }-
4332 if( sqlite3ExprIsTableConstant(pWhere, iCursor) ){
sqlite3ExprIsT...here, iCursor)Description
TRUEevaluated 53 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 132 times by 1 test
Evaluated by:
  • Self test (438)
53-132
4333 nChng++;-
4334 while( pSubq ){
pSubqDescription
TRUEevaluated 99 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 53 times by 1 test
Evaluated by:
  • Self test (438)
53-99
4335 SubstContext x;-
4336 pNew = sqlite3ExprDup(pParse->db, pWhere, 0);-
4337 unsetJoinExpr(pNew, -1);-
4338 x.pParse = pParse;-
4339 x.iTable = iCursor;-
4340 x.iNewTable = iCursor;-
4341 x.isLeftJoin = 0;-
4342 x.pEList = pSubq->pEList;-
4343 pNew = substExpr(&x, pNew);-
4344 if( pSubq->selFlags & SF_Aggregate ){
pSubq->selFlags & 0x00008Description
TRUEevaluated 20 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 79 times by 1 test
Evaluated by:
  • Self test (438)
20-79
4345 pSubq->pHaving = sqlite3ExprAnd(pParse->db, pSubq->pHaving, pNew);-
4346 }else{
executed 20 times by 1 test: end of block
Executed by:
  • Self test (438)
20
4347 pSubq->pWhere = sqlite3ExprAnd(pParse->db, pSubq->pWhere, pNew);-
4348 }
executed 79 times by 1 test: end of block
Executed by:
  • Self test (438)
79
4349 pSubq = pSubq->pPrior;-
4350 }
executed 99 times by 1 test: end of block
Executed by:
  • Self test (438)
99
4351 }
executed 53 times by 1 test: end of block
Executed by:
  • Self test (438)
53
4352 return nChng;
executed 185 times by 1 test: return nChng;
Executed by:
  • Self test (438)
185
4353}-
4354#endif /* !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) */-
4355-
4356/*-
4357** The pFunc is the only aggregate function in the query. Check to see-
4358** if the query is a candidate for the min/max optimization. -
4359**-
4360** If the query is a candidate for the min/max optimization, then set-
4361** *ppMinMax to be an ORDER BY clause to be used for the optimization-
4362** and return either WHERE_ORDERBY_MIN or WHERE_ORDERBY_MAX depending on-
4363** whether pFunc is a min() or max() function.-
4364**-
4365** If the query is not a candidate for the min/max optimization, return-
4366** WHERE_ORDERBY_NORMAL (which must be zero).-
4367**-
4368** This routine must be called after aggregate functions have been-
4369** located but before their arguments have been subjected to aggregate-
4370** analysis.-
4371*/-
4372static u8 minMaxQuery(sqlite3 *db, Expr *pFunc, ExprList **ppMinMax){-
4373 int eRet = WHERE_ORDERBY_NORMAL; /* Return value */-
4374 ExprList *pEList = pFunc->x.pList; /* Arguments to agg function */-
4375 const char *zFunc; /* Name of aggregate function pFunc */-
4376 ExprList *pOrderBy;-
4377 u8 sortOrder;-
4378-
4379 assert( *ppMinMax==0 );-
4380 assert( pFunc->op==TK_AGG_FUNCTION );-
4381 if( pEList==0 || pEList->nExpr!=1 ) return eRet;
executed 2726 times by 4 tests: return eRet;
Executed by:
  • Self test (103)
  • Self test (104)
  • Self test (34)
  • Self test (438)
pEList==0Description
TRUEevaluated 2469 times by 4 tests
Evaluated by:
  • Self test (103)
  • Self test (104)
  • Self test (34)
  • Self test (438)
FALSEevaluated 17296 times by 1 test
Evaluated by:
  • Self test (438)
pEList->nExpr!=1Description
TRUEevaluated 257 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 17039 times by 1 test
Evaluated by:
  • Self test (438)
257-17296
4382 zFunc = pFunc->u.zToken;-
4383 if( sqlite3StrICmp(zFunc, "min")==0 ){
sqlite3StrICmp...unc, "min")==0Description
TRUEevaluated 837 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 16202 times by 1 test
Evaluated by:
  • Self test (438)
837-16202
4384 eRet = WHERE_ORDERBY_MIN;-
4385 sortOrder = SQLITE_SO_ASC;-
4386 }else if( sqlite3StrICmp(zFunc, "max")==0 ){
executed 837 times by 1 test: end of block
Executed by:
  • Self test (438)
sqlite3StrICmp...unc, "max")==0Description
TRUEevaluated 4802 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 11400 times by 1 test
Evaluated by:
  • Self test (438)
837-11400
4387 eRet = WHERE_ORDERBY_MAX;-
4388 sortOrder = SQLITE_SO_DESC;-
4389 }else{
executed 4802 times by 1 test: end of block
Executed by:
  • Self test (438)
4802
4390 return eRet;
executed 11400 times by 1 test: return eRet;
Executed by:
  • Self test (438)
11400
4391 }-
4392 *ppMinMax = pOrderBy = sqlite3ExprListDup(db, pEList, 0);-
4393 assert( pOrderBy!=0 || db->mallocFailed );-
4394 if( pOrderBy ) pOrderBy->a[0].sortOrder = sortOrder;
executed 5639 times by 1 test: pOrderBy->a[0].sortOrder = sortOrder;
Executed by:
  • Self test (438)
pOrderByDescription
TRUEevaluated 5639 times by 1 test
Evaluated by:
  • Self test (438)
FALSEnever evaluated
0-5639
4395 return eRet;
executed 5639 times by 1 test: return eRet;
Executed by:
  • Self test (438)
5639
4396}-
4397-
4398/*-
4399** The select statement passed as the first argument is an aggregate query.-
4400** The second argument is the associated aggregate-info object. This -
4401** function tests if the SELECT is of the form:-
4402**-
4403** SELECT count(*) FROM <tbl>-
4404**-
4405** where table is a database table, not a sub-select or view. If the query-
4406** does match this pattern, then a pointer to the Table object representing-
4407** <tbl> is returned. Otherwise, 0 is returned.-
4408*/-
4409static Table *isSimpleCount(Select *p, AggInfo *pAggInfo){-
4410 Table *pTab;-
4411 Expr *pExpr;-
4412-
4413 assert( !p->pGroupBy );-
4414-
4415 if( p->pWhere || p->pEList->nExpr!=1
p->pWhereDescription
TRUEevaluated 3250 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 19229 times by 4 tests
Evaluated by:
  • Self test (103)
  • Self test (104)
  • Self test (34)
  • Self test (438)
p->pEList->nExpr!=1Description
TRUEevaluated 204 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 19025 times by 4 tests
Evaluated by:
  • Self test (103)
  • Self test (104)
  • Self test (34)
  • Self test (438)
204-19229
4416 || p->pSrc->nSrc!=1 || p->pSrc->a[0].pSelect
p->pSrc->nSrc!=1Description
TRUEevaluated 25 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 19000 times by 4 tests
Evaluated by:
  • Self test (103)
  • Self test (104)
  • Self test (34)
  • Self test (438)
p->pSrc->a[0].pSelectDescription
TRUEevaluated 63 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 18937 times by 4 tests
Evaluated by:
  • Self test (103)
  • Self test (104)
  • Self test (34)
  • Self test (438)
25-19000
4417 ){-
4418 return 0;
executed 3542 times by 1 test: return 0;
Executed by:
  • Self test (438)
3542
4419 }-
4420 pTab = p->pSrc->a[0].pTab;-
4421 pExpr = p->pEList->a[0].pExpr;-
4422 assert( pTab && !pTab->pSelect && pExpr );-
4423-
4424 if( IsVirtual(pTab) ) return 0;
executed 8572 times by 1 test: return 0;
Executed by:
  • Self test (438)
((pTab)->nModuleArg)Description
TRUEevaluated 8572 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 10365 times by 4 tests
Evaluated by:
  • Self test (103)
  • Self test (104)
  • Self test (34)
  • Self test (438)
8572-10365
4425 if( pExpr->op!=TK_AGG_FUNCTION ) return 0;
executed 5254 times by 1 test: return 0;
Executed by:
  • Self test (438)
pExpr->op!=159Description
TRUEevaluated 5254 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 5111 times by 4 tests
Evaluated by:
  • Self test (103)
  • Self test (104)
  • Self test (34)
  • Self test (438)
5111-5254
4426 if( NEVER(pAggInfo->nFunc==0) ) return 0;
never executed: return 0;
(pAggInfo->nFunc==0)Description
TRUEnever evaluated
FALSEevaluated 5111 times by 4 tests
Evaluated by:
  • Self test (103)
  • Self test (104)
  • Self test (34)
  • Self test (438)
0-5111
4427 if( (pAggInfo->aFunc[0].pFunc->funcFlags&SQLITE_FUNC_COUNT)==0 ) return 0;
executed 3114 times by 1 test: return 0;
Executed by:
  • Self test (438)
(pAggInfo->aFu...ags&0x0100)==0Description
TRUEevaluated 3114 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1997 times by 4 tests
Evaluated by:
  • Self test (103)
  • Self test (104)
  • Self test (34)
  • Self test (438)
1997-3114
4428 if( pExpr->flags&EP_Distinct ) return 0;
executed 2 times by 1 test: return 0;
Executed by:
  • Self test (438)
pExpr->flags&0x000010Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1995 times by 4 tests
Evaluated by:
  • Self test (103)
  • Self test (104)
  • Self test (34)
  • Self test (438)
2-1995
4429-
4430 return pTab;
executed 1995 times by 4 tests: return pTab;
Executed by:
  • Self test (103)
  • Self test (104)
  • Self test (34)
  • Self test (438)
1995
4431}-
4432-
4433/*-
4434** If the source-list item passed as an argument was augmented with an-
4435** INDEXED BY clause, then try to locate the specified index. If there-
4436** was such a clause and the named index cannot be found, return -
4437** SQLITE_ERROR and leave an error in pParse. Otherwise, populate -
4438** pFrom->pIndex and return SQLITE_OK.-
4439*/-
4440int sqlite3IndexedByLookup(Parse *pParse, struct SrcList_item *pFrom){-
4441 if( pFrom->pTab && pFrom->fg.isIndexedBy ){
pFrom->pTabDescription
TRUEevaluated 1056133 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 411 times by 9 tests
Evaluated by:
  • Self test (26)
  • Self test (27)
  • Self test (29)
  • Self test (39)
  • Self test (438)
  • Self test (47)
  • Self test (79)
  • Self test (81)
  • Self test (83)
pFrom->fg.isIndexedByDescription
TRUEevaluated 126 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
FALSEevaluated 1056007 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
126-1056133
4442 Table *pTab = pFrom->pTab;-
4443 char *zIndexedBy = pFrom->u1.zIndexedBy;-
4444 Index *pIdx;-
4445 for(pIdx=pTab->pIndex; -
4446 pIdx && sqlite3StrICmp(pIdx->zName, zIndexedBy);
pIdxDescription
TRUEevaluated 183 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
FALSEevaluated 7 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
sqlite3StrICmp...e, zIndexedBy)Description
TRUEevaluated 64 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 119 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
7-183
4447 pIdx=pIdx->pNext-
4448 );
executed 64 times by 1 test: ;
Executed by:
  • Self test (438)
64
4449 if( !pIdx ){
!pIdxDescription
TRUEevaluated 7 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
FALSEevaluated 119 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
7-119
4450 sqlite3ErrorMsg(pParse, "no such index: %s", zIndexedBy, 0);-
4451 pParse->checkSchema = 1;-
4452 return SQLITE_ERROR;
executed 7 times by 2 tests: return 1;
Executed by:
  • Self test (438)
  • Self test (47)
7
4453 }-
4454 pFrom->pIBIndex = pIdx;-
4455 }
executed 119 times by 2 tests: end of block
Executed by:
  • Self test (438)
  • Self test (47)
119
4456 return SQLITE_OK;
executed 1056537 times by 435 tests: return 0;
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
1056537
4457}-
4458/*-
4459** Detect compound SELECT statements that use an ORDER BY clause with -
4460** an alternative collating sequence.-
4461**-
4462** SELECT ... FROM t1 EXCEPT SELECT ... FROM t2 ORDER BY .. COLLATE ...-
4463**-
4464** These are rewritten as a subquery:-
4465**-
4466** SELECT * FROM (SELECT ... FROM t1 EXCEPT SELECT ... FROM t2)-
4467** ORDER BY ... COLLATE ...-
4468**-
4469** This transformation is necessary because the multiSelectOrderBy() routine-
4470** above that generates the code for a compound SELECT with an ORDER BY clause-
4471** uses a merge algorithm that requires the same collating sequence on the-
4472** result columns as on the ORDER BY clause. See ticket-
4473** http://www.sqlite.org/src/info/6709574d2a-
4474**-
4475** This transformation is only needed for EXCEPT, INTERSECT, and UNION.-
4476** The UNION ALL operator works fine with multiSelectOrderBy() even when-
4477** there are COLLATE terms in the ORDER BY.-
4478*/-
4479static int convertCompoundSelectToSubquery(Walker *pWalker, Select *p){-
4480 int i;-
4481 Select *pNew;-
4482 Select *pX;-
4483 sqlite3 *db;-
4484 struct ExprList_item *a;-
4485 SrcList *pNewSrc;-
4486 Parse *pParse;-
4487 Token dummy;-
4488-
4489 if( p->pPrior==0 ) return WRC_Continue;
executed 15015 times by 1 test: return 0;
Executed by:
  • Self test (438)
p->pPrior==0Description
TRUEevaluated 15015 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 4295 times by 1 test
Evaluated by:
  • Self test (438)
4295-15015
4490 if( p->pOrderBy==0 ) return WRC_Continue;
executed 3938 times by 1 test: return 0;
Executed by:
  • Self test (438)
p->pOrderBy==0Description
TRUEevaluated 3938 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 357 times by 1 test
Evaluated by:
  • Self test (438)
357-3938
4491 for(pX=p; pX && (pX->op==TK_ALL || pX->op==TK_SELECT); pX=pX->pPrior){}
executed 7 times by 1 test: end of block
Executed by:
  • Self test (438)
pXDescription
TRUEevaluated 363 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test (438)
pX->op==124Description
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 357 times by 1 test
Evaluated by:
  • Self test (438)
pX->op==127Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 356 times by 1 test
Evaluated by:
  • Self test (438)
1-363
4492 if( pX==0 ) return WRC_Continue;
executed 1 time by 1 test: return 0;
Executed by:
  • Self test (438)
pX==0Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 356 times by 1 test
Evaluated by:
  • Self test (438)
1-356
4493 a = p->pOrderBy->a;-
4494 for(i=p->pOrderBy->nExpr-1; i>=0; i--){
i>=0Description
TRUEevaluated 626 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 295 times by 1 test
Evaluated by:
  • Self test (438)
295-626
4495 if( a[i].pExpr->flags & EP_Collate ) break;
executed 61 times by 1 test: break;
Executed by:
  • Self test (438)
a[i].pExpr->flags & 0x000100Description
TRUEevaluated 61 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 565 times by 1 test
Evaluated by:
  • Self test (438)
61-565
4496 }
executed 565 times by 1 test: end of block
Executed by:
  • Self test (438)
565
4497 if( i<0 ) return WRC_Continue;
executed 295 times by 1 test: return 0;
Executed by:
  • Self test (438)
i<0Description
TRUEevaluated 295 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 61 times by 1 test
Evaluated by:
  • Self test (438)
61-295
4498-
4499 /* If we reach this point, that means the transformation is required. */-
4500-
4501 pParse = pWalker->pParse;-
4502 db = pParse->db;-
4503 pNew = sqlite3DbMallocZero(db, sizeof(*pNew) );-
4504 if( pNew==0 ) return WRC_Abort;
never executed: return 2;
pNew==0Description
TRUEnever evaluated
FALSEevaluated 61 times by 1 test
Evaluated by:
  • Self test (438)
0-61
4505 memset(&dummy, 0, sizeof(dummy));-
4506 pNewSrc = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&dummy,pNew,0,0);-
4507 if( pNewSrc==0 ) return WRC_Abort;
never executed: return 2;
pNewSrc==0Description
TRUEnever evaluated
FALSEevaluated 61 times by 1 test
Evaluated by:
  • Self test (438)
0-61
4508 *pNew = *p;-
4509 p->pSrc = pNewSrc;-
4510 p->pEList = sqlite3ExprListAppend(pParse, 0, sqlite3Expr(db, TK_ASTERISK, 0));-
4511 p->op = TK_SELECT;-
4512 p->pWhere = 0;-
4513 pNew->pGroupBy = 0;-
4514 pNew->pHaving = 0;-
4515 pNew->pOrderBy = 0;-
4516 p->pPrior = 0;-
4517 p->pNext = 0;-
4518 p->pWith = 0;-
4519 p->selFlags &= ~SF_Compound;-
4520 assert( (p->selFlags & SF_Converted)==0 );-
4521 p->selFlags |= SF_Converted;-
4522 assert( pNew->pPrior!=0 );-
4523 pNew->pPrior->pNext = pNew;-
4524 pNew->pLimit = 0;-
4525 return WRC_Continue;
executed 61 times by 1 test: return 0;
Executed by:
  • Self test (438)
61
4526}-
4527-
4528/*-
4529** Check to see if the FROM clause term pFrom has table-valued function-
4530** arguments. If it does, leave an error message in pParse and return-
4531** non-zero, since pFrom is not allowed to be a table-valued function.-
4532*/-
4533static int cannotBeFunction(Parse *pParse, struct SrcList_item *pFrom){-
4534 if( pFrom->fg.isTabFunc ){
pFrom->fg.isTabFuncDescription
TRUEevaluated 7 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 904172 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
7-904172
4535 sqlite3ErrorMsg(pParse, "'%s' is not a function", pFrom->zName);-
4536 return 1;
executed 7 times by 1 test: return 1;
Executed by:
  • Self test (438)
7
4537 }-
4538 return 0;
executed 904172 times by 435 tests: return 0;
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
904172
4539}-
4540-
4541#ifndef SQLITE_OMIT_CTE-
4542/*-
4543** Argument pWith (which may be NULL) points to a linked list of nested -
4544** WITH contexts, from inner to outermost. If the table identified by -
4545** FROM clause element pItem is really a common-table-expression (CTE) -
4546** then return a pointer to the CTE definition for that table. Otherwise-
4547** return NULL.-
4548**-
4549** If a non-NULL value is returned, set *ppContext to point to the With-
4550** object that the returned CTE belongs to.-
4551*/-
4552static struct Cte *searchWith(-
4553 With *pWith, /* Current innermost WITH clause */-
4554 struct SrcList_item *pItem, /* FROM clause element to resolve */-
4555 With **ppContext /* OUT: WITH clause return value belongs to */-
4556){-
4557 const char *zName;-
4558 if( pItem->zDatabase==0 && (zName = pItem->zName)!=0 ){
pItem->zDatabase==0Description
TRUEevaluated 873100 times by 68 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (12)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (16)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (20)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (24)
  • Self test (26)
  • Self test (28)
  • Self test (29)
  • Self test (3)
  • ...
FALSEevaluated 44169 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
(zName = pItem->zName)!=0Description
TRUEevaluated 872219 times by 68 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (12)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (16)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (20)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (24)
  • Self test (26)
  • Self test (28)
  • Self test (29)
  • Self test (3)
  • ...
FALSEevaluated 881 times by 1 test
Evaluated by:
  • Self test (438)
881-873100
4559 With *p;-
4560 for(p=pWith; p; p=p->pOuter){
pDescription
TRUEevaluated 3014 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 870292 times by 68 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (12)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (16)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (20)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (24)
  • Self test (26)
  • Self test (28)
  • Self test (29)
  • Self test (3)
  • ...
3014-870292
4561 int i;-
4562 for(i=0; i<p->nCte; i++){
i<p->nCteDescription
TRUEevaluated 3816 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1087 times by 1 test
Evaluated by:
  • Self test (438)
1087-3816
4563 if( sqlite3StrICmp(zName, p->a[i].zName)==0 ){
sqlite3StrICmp...a[i].zName)==0Description
TRUEevaluated 1927 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1889 times by 1 test
Evaluated by:
  • Self test (438)
1889-1927
4564 *ppContext = p;-
4565 return &p->a[i];
executed 1927 times by 1 test: return &p->a[i];
Executed by:
  • Self test (438)
1927
4566 }-
4567 }
executed 1889 times by 1 test: end of block
Executed by:
  • Self test (438)
1889
4568 }
executed 1087 times by 1 test: end of block
Executed by:
  • Self test (438)
1087
4569 }
executed 870292 times by 68 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (12)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (16)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (20)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (24)
  • Self test (26)
  • Self test (28)
  • Self test (29)
  • Self test (3)
  • ...
870292
4570 return 0;
executed 915342 times by 436 tests: return 0;
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
915342
4571}-
4572-
4573/* The code generator maintains a stack of active WITH clauses-
4574** with the inner-most WITH clause being at the top of the stack.-
4575**-
4576** This routine pushes the WITH clause passed as the second argument-
4577** onto the top of the stack. If argument bFree is true, then this-
4578** WITH clause will never be popped from the stack. In this case it-
4579** should be freed along with the Parse object. In other cases, when-
4580** bFree==0, the With object will be freed along with the SELECT -
4581** statement with which it is associated.-
4582*/-
4583void sqlite3WithPush(Parse *pParse, With *pWith, u8 bFree){-
4584 assert( bFree==0 || (pParse->pWith==0 && pParse->pWithToFree==0) );-
4585 if( pWith ){
pWithDescription
TRUEevaluated 1555 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1007174 times by 436 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
1555-1007174
4586 assert( pParse->pWith!=pWith );-
4587 pWith->pOuter = pParse->pWith;-
4588 pParse->pWith = pWith;-
4589 if( bFree ) pParse->pWithToFree = pWith;
executed 167 times by 1 test: pParse->pWithToFree = pWith;
Executed by:
  • Self test (438)
bFreeDescription
TRUEevaluated 167 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1388 times by 1 test
Evaluated by:
  • Self test (438)
167-1388
4590 }
executed 1555 times by 1 test: end of block
Executed by:
  • Self test (438)
1555
4591}
executed 1008729 times by 436 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
1008729
4592-
4593/*-
4594** This function checks if argument pFrom refers to a CTE declared by -
4595** a WITH clause on the stack currently maintained by the parser. And,-
4596** if currently processing a CTE expression, if it is a recursive-
4597** reference to the current CTE.-
4598**-
4599** If pFrom falls into either of the two categories above, pFrom->pTab-
4600** and other fields are populated accordingly. The caller should check-
4601** (pFrom->pTab!=0) to determine whether or not a successful match-
4602** was found.-
4603**-
4604** Whether or not a match is found, SQLITE_OK is returned if no error-
4605** occurs. If an error does occur, an error message is stored in the-
4606** parser and some error code other than SQLITE_OK returned.-
4607*/-
4608static int withExpand(-
4609 Walker *pWalker, -
4610 struct SrcList_item *pFrom-
4611){-
4612 Parse *pParse = pWalker->pParse;-
4613 sqlite3 *db = pParse->db;-
4614 struct Cte *pCte; /* Matched CTE (or NULL if no match) */-
4615 With *pWith; /* WITH clause that pCte belongs to */-
4616-
4617 assert( pFrom->pTab==0 );-
4618-
4619 pCte = searchWith(pParse->pWith, pFrom, &pWith);-
4620 if( pCte ){
pCteDescription
TRUEevaluated 1927 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 915342 times by 436 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
1927-915342
4621 Table *pTab;-
4622 ExprList *pEList;-
4623 Select *pSel;-
4624 Select *pLeft; /* Left-most SELECT statement */-
4625 int bMayRecursive; /* True if compound joined by UNION [ALL] */-
4626 With *pSavedWith; /* Initial value of pParse->pWith */-
4627-
4628 /* If pCte->zCteErr is non-NULL at this point, then this is an illegal-
4629 ** recursive reference to CTE pCte. Leave an error in pParse and return-
4630 ** early. If pCte->zCteErr is NULL, then this is not a recursive reference.-
4631 ** In this case, proceed. */-
4632 if( pCte->zCteErr ){
pCte->zCteErrDescription
TRUEevaluated 10 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1917 times by 1 test
Evaluated by:
  • Self test (438)
10-1917
4633 sqlite3ErrorMsg(pParse, pCte->zCteErr, pCte->zName);-
4634 return SQLITE_ERROR;
executed 10 times by 1 test: return 1;
Executed by:
  • Self test (438)
10
4635 }-
4636 if( cannotBeFunction(pParse, pFrom) ) return SQLITE_ERROR;
executed 2 times by 1 test: return 1;
Executed by:
  • Self test (438)
cannotBeFuncti...pParse, pFrom)Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1915 times by 1 test
Evaluated by:
  • Self test (438)
2-1915
4637-
4638 assert( pFrom->pTab==0 );-
4639 pFrom->pTab = pTab = sqlite3DbMallocZero(db, sizeof(Table));-
4640 if( pTab==0 ) return WRC_Abort;
executed 10 times by 1 test: return 2;
Executed by:
  • Self test (438)
pTab==0Description
TRUEevaluated 10 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1905 times by 1 test
Evaluated by:
  • Self test (438)
10-1905
4641 pTab->nTabRef = 1;-
4642 pTab->zName = sqlite3DbStrDup(db, pCte->zName);-
4643 pTab->iPKey = -1;-
4644 pTab->nRowLogEst = 200; assert( 200==sqlite3LogEst(1048576) );-
4645 pTab->tabFlags |= TF_Ephemeral | TF_NoVisibleRowid;-
4646 pFrom->pSelect = sqlite3SelectDup(db, pCte->pSelect, 0);-
4647 if( db->mallocFailed ) return SQLITE_NOMEM_BKPT;
executed 110 times by 1 test: return 7;
Executed by:
  • Self test (438)
db->mallocFailedDescription
TRUEevaluated 110 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1795 times by 1 test
Evaluated by:
  • Self test (438)
110-1795
4648 assert( pFrom->pSelect );-
4649-
4650 /* Check if this is a recursive CTE. */-
4651 pSel = pFrom->pSelect;-
4652 bMayRecursive = ( pSel->op==TK_ALL || pSel->op==TK_UNION );
pSel->op==124Description
TRUEevaluated 352 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1443 times by 1 test
Evaluated by:
  • Self test (438)
pSel->op==123Description
TRUEevaluated 35 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1408 times by 1 test
Evaluated by:
  • Self test (438)
35-1443
4653 if( bMayRecursive ){
bMayRecursiveDescription
TRUEevaluated 387 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1408 times by 1 test
Evaluated by:
  • Self test (438)
387-1408
4654 int i;-
4655 SrcList *pSrc = pFrom->pSelect->pSrc;-
4656 for(i=0; i<pSrc->nSrc; i++){
i<pSrc->nSrcDescription
TRUEevaluated 382 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 387 times by 1 test
Evaluated by:
  • Self test (438)
382-387
4657 struct SrcList_item *pItem = &pSrc->a[i];-
4658 if( pItem->zDatabase==0
pItem->zDatabase==0Description
TRUEevaluated 380 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test (438)
2-380
4659 && pItem->zName!=0
pItem->zName!=0Description
TRUEevaluated 378 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test (438)
2-378
4660 && 0==sqlite3StrICmp(pItem->zName, pCte->zName)
0==sqlite3StrI..., pCte->zName)Description
TRUEevaluated 331 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 47 times by 1 test
Evaluated by:
  • Self test (438)
47-331
4661 ){-
4662 pItem->pTab = pTab;-
4663 pItem->fg.isRecursive = 1;-
4664 pTab->nTabRef++;-
4665 pSel->selFlags |= SF_Recursive;-
4666 }
executed 331 times by 1 test: end of block
Executed by:
  • Self test (438)
331
4667 }
executed 382 times by 1 test: end of block
Executed by:
  • Self test (438)
382
4668 }
executed 387 times by 1 test: end of block
Executed by:
  • Self test (438)
387
4669-
4670 /* Only one recursive reference is permitted. */ -
4671 if( pTab->nTabRef>2 ){
pTab->nTabRef>2Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1794 times by 1 test
Evaluated by:
  • Self test (438)
1-1794
4672 sqlite3ErrorMsg(-
4673 pParse, "multiple references to recursive table: %s", pCte->zName-
4674 );-
4675 return SQLITE_ERROR;
executed 1 time by 1 test: return 1;
Executed by:
  • Self test (438)
1
4676 }-
4677 assert( pTab->nTabRef==1 || -
4678 ((pSel->selFlags&SF_Recursive) && pTab->nTabRef==2 ));-
4679-
4680 pCte->zCteErr = "circular reference: %s";-
4681 pSavedWith = pParse->pWith;-
4682 pParse->pWith = pWith;-
4683 if( bMayRecursive ){
bMayRecursiveDescription
TRUEevaluated 386 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1408 times by 1 test
Evaluated by:
  • Self test (438)
386-1408
4684 Select *pPrior = pSel->pPrior;-
4685 assert( pPrior->pWith==0 );-
4686 pPrior->pWith = pSel->pWith;-
4687 sqlite3WalkSelect(pWalker, pPrior);-
4688 pPrior->pWith = 0;-
4689 }else{
executed 386 times by 1 test: end of block
Executed by:
  • Self test (438)
386
4690 sqlite3WalkSelect(pWalker, pSel);-
4691 }
executed 1408 times by 1 test: end of block
Executed by:
  • Self test (438)
1408
4692 pParse->pWith = pWith;-
4693-
4694 for(pLeft=pSel; pLeft->pPrior; pLeft=pLeft->pPrior);
executed 450 times by 1 test: ;
Executed by:
  • Self test (438)
pLeft->pPriorDescription
TRUEevaluated 450 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1794 times by 1 test
Evaluated by:
  • Self test (438)
450-1794
4695 pEList = pLeft->pEList;-
4696 if( pCte->pCols ){
pCte->pColsDescription
TRUEevaluated 419 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1375 times by 1 test
Evaluated by:
  • Self test (438)
419-1375
4697 if( pEList && pEList->nExpr!=pCte->pCols->nExpr ){
pEListDescription
TRUEevaluated 418 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test (438)
pEList->nExpr!...->pCols->nExprDescription
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 412 times by 1 test
Evaluated by:
  • Self test (438)
1-418
4698 sqlite3ErrorMsg(pParse, "table %s has %d values for %d columns",-
4699 pCte->zName, pEList->nExpr, pCte->pCols->nExpr-
4700 );-
4701 pParse->pWith = pSavedWith;-
4702 return SQLITE_ERROR;
executed 6 times by 1 test: return 1;
Executed by:
  • Self test (438)
6
4703 }-
4704 pEList = pCte->pCols;-
4705 }
executed 413 times by 1 test: end of block
Executed by:
  • Self test (438)
413
4706-
4707 sqlite3ColumnsFromExprList(pParse, pEList, &pTab->nCol, &pTab->aCol);-
4708 if( bMayRecursive ){
bMayRecursiveDescription
TRUEevaluated 383 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1405 times by 1 test
Evaluated by:
  • Self test (438)
383-1405
4709 if( pSel->selFlags & SF_Recursive ){
pSel->selFlags & 0x02000Description
TRUEevaluated 327 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 56 times by 1 test
Evaluated by:
  • Self test (438)
56-327
4710 pCte->zCteErr = "multiple recursive references: %s";-
4711 }else{
executed 327 times by 1 test: end of block
Executed by:
  • Self test (438)
327
4712 pCte->zCteErr = "recursive reference in a subquery: %s";-
4713 }
executed 56 times by 1 test: end of block
Executed by:
  • Self test (438)
56
4714 sqlite3WalkSelect(pWalker, pSel);-
4715 }
executed 383 times by 1 test: end of block
Executed by:
  • Self test (438)
383
4716 pCte->zCteErr = 0;-
4717 pParse->pWith = pSavedWith;-
4718 }
executed 1788 times by 1 test: end of block
Executed by:
  • Self test (438)
1788
4719-
4720 return SQLITE_OK;
executed 917130 times by 436 tests: return 0;
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
917130
4721}-
4722#endif-
4723-
4724#ifndef SQLITE_OMIT_CTE-
4725/*-
4726** If the SELECT passed as the second argument has an associated WITH -
4727** clause, pop it from the stack stored as part of the Parse object.-
4728**-
4729** This function is used as the xSelectCallback2() callback by-
4730** sqlite3SelectExpand() when walking a SELECT tree to resolve table-
4731** names and other FROM clause elements. -
4732*/-
4733static void selectPopWith(Walker *pWalker, Select *p){-
4734 Parse *pParse = pWalker->pParse;-
4735 if( OK_IF_ALWAYS_TRUE(pParse->pWith) && p->pPrior==0 ){
(pParse->pWith)Description
TRUEevaluated 2078 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1004653 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
p->pPrior==0Description
TRUEevaluated 1636 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 442 times by 1 test
Evaluated by:
  • Self test (438)
442-1004653
4736 With *pWith = findRightmost(p)->pWith;-
4737 if( pWith!=0 ){
pWith!=0Description
TRUEevaluated 572 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1064 times by 1 test
Evaluated by:
  • Self test (438)
572-1064
4738 assert( pParse->pWith==pWith );-
4739 pParse->pWith = pWith->pOuter;-
4740 }
executed 572 times by 1 test: end of block
Executed by:
  • Self test (438)
572
4741 }
executed 1636 times by 1 test: end of block
Executed by:
  • Self test (438)
1636
4742}
executed 1006731 times by 435 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
1006731
4743#else-
4744#define selectPopWith 0-
4745#endif-
4746-
4747/*-
4748** The SrcList_item structure passed as the second argument represents a-
4749** sub-query in the FROM clause of a SELECT statement. This function-
4750** allocates and populates the SrcList_item.pTab object. If successful,-
4751** SQLITE_OK is returned. Otherwise, if an OOM error is encountered,-
4752** SQLITE_NOMEM.-
4753*/-
4754int sqlite3ExpandSubquery(Parse *pParse, struct SrcList_item *pFrom){-
4755 Select *pSel = pFrom->pSelect;-
4756 Table *pTab;-
4757-
4758 assert( pSel );-
4759 pFrom->pTab = pTab = sqlite3DbMallocZero(pParse->db, sizeof(Table));-
4760 if( pTab==0 ) return SQLITE_NOMEM;
never executed: return 7;
pTab==0Description
TRUEnever evaluated
FALSEevaluated 2680 times by 1 test
Evaluated by:
  • Self test (438)
0-2680
4761 pTab->nTabRef = 1;-
4762 if( pFrom->zAlias ){
pFrom->zAliasDescription
TRUEevaluated 121 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 2559 times by 1 test
Evaluated by:
  • Self test (438)
121-2559
4763 pTab->zName = sqlite3DbStrDup(pParse->db, pFrom->zAlias);-
4764 }else{
executed 121 times by 1 test: end of block
Executed by:
  • Self test (438)
121
4765 pTab->zName = sqlite3MPrintf(pParse->db, "subquery_%u", pSel->selId);-
4766 }
executed 2559 times by 1 test: end of block
Executed by:
  • Self test (438)
2559
4767 while( pSel->pPrior ){ pSel = pSel->pPrior; }
executed 400 times by 1 test: end of block
Executed by:
  • Self test (438)
pSel->pPriorDescription
TRUEevaluated 400 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 2680 times by 1 test
Evaluated by:
  • Self test (438)
400-2680
4768 sqlite3ColumnsFromExprList(pParse, pSel->pEList,&pTab->nCol,&pTab->aCol);-
4769 pTab->iPKey = -1;-
4770 pTab->nRowLogEst = 200; assert( 200==sqlite3LogEst(1048576) );-
4771 pTab->tabFlags |= TF_Ephemeral;-
4772-
4773 return SQLITE_OK;
executed 2680 times by 1 test: return 0;
Executed by:
  • Self test (438)
2680
4774}-
4775-
4776/*-
4777** This routine is a Walker callback for "expanding" a SELECT statement.-
4778** "Expanding" means to do the following:-
4779**-
4780** (1) Make sure VDBE cursor numbers have been assigned to every-
4781** element of the FROM clause.-
4782**-
4783** (2) Fill in the pTabList->a[].pTab fields in the SrcList that -
4784** defines FROM clause. When views appear in the FROM clause,-
4785** fill pTabList->a[].pSelect with a copy of the SELECT statement-
4786** that implements the view. A copy is made of the view's SELECT-
4787** statement so that we can freely modify or delete that statement-
4788** without worrying about messing up the persistent representation-
4789** of the view.-
4790**-
4791** (3) Add terms to the WHERE clause to accommodate the NATURAL keyword-
4792** on joins and the ON and USING clause of joins.-
4793**-
4794** (4) Scan the list of columns in the result set (pEList) looking-
4795** for instances of the "*" operator or the TABLE.* operator.-
4796** If found, expand each "*" to be every column in every table-
4797** and TABLE.* to be every column in TABLE.-
4798**-
4799*/-
4800static int selectExpander(Walker *pWalker, Select *p){-
4801 Parse *pParse = pWalker->pParse;-
4802 int i, j, k;-
4803 SrcList *pTabList;-
4804 ExprList *pEList;-
4805 struct SrcList_item *pFrom;-
4806 sqlite3 *db = pParse->db;-
4807 Expr *pE, *pRight, *pExpr;-
4808 u16 selFlags = p->selFlags;-
4809 u32 elistFlags = 0;-
4810-
4811 p->selFlags |= SF_Expanded;-
4812 if( db->mallocFailed ){
db->mallocFailedDescription
TRUEevaluated 138 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1342351 times by 436 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
138-1342351
4813 return WRC_Abort;
executed 138 times by 1 test: return 2;
Executed by:
  • Self test (438)
138
4814 }-
4815 assert( p->pSrc!=0 );-
4816 if( (selFlags & SF_Expanded)!=0 ){
(selFlags & 0x00040)!=0Description
TRUEevaluated 333789 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
FALSEevaluated 1008562 times by 436 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
333789-1008562
4817 return WRC_Prune;
executed 333789 times by 2 tests: return 1;
Executed by:
  • Self test (438)
  • Self test (47)
333789
4818 }-
4819 pTabList = p->pSrc;-
4820 pEList = p->pEList;-
4821 sqlite3WithPush(pParse, p->pWith, 0);-
4822-
4823 /* Make sure cursor numbers have been assigned to all entries in-
4824 ** the FROM clause of the SELECT statement.-
4825 */-
4826 sqlite3SrcListAssignCursors(pParse, pTabList);-
4827-
4828 /* Look up every table named in the FROM clause of the select. If-
4829 ** an entry of the FROM clause is a subquery instead of a table or view,-
4830 ** then create a transient table structure to describe the subquery.-
4831 */-
4832 for(i=0, pFrom=pTabList->a; i<pTabList->nSrc; i++, pFrom++){
i<pTabList->nSrcDescription
TRUEevaluated 917586 times by 436 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 1007705 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
917586-1007705
4833 Table *pTab;-
4834 assert( pFrom->fg.isRecursive==0 || pFrom->pTab!=0 );-
4835 if( pFrom->fg.isRecursive ) continue;
executed 317 times by 1 test: continue;
Executed by:
  • Self test (438)
pFrom->fg.isRecursiveDescription
TRUEevaluated 317 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 917269 times by 436 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
317-917269
4836 assert( pFrom->pTab==0 );-
4837#ifndef SQLITE_OMIT_CTE-
4838 if( withExpand(pWalker, pFrom) ) return WRC_Abort;
executed 139 times by 1 test: return 2;
Executed by:
  • Self test (438)
withExpand(pWalker, pFrom)Description
TRUEevaluated 139 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 917130 times by 436 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
139-917130
4839 if( pFrom->pTab ) {} else
executed 1788 times by 1 test: end of block
Executed by:
  • Self test (438)
pFrom->pTabDescription
TRUEevaluated 1788 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 915342 times by 436 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
1788-915342
4840#endif-
4841 if( pFrom->zName==0 ){
pFrom->zName==0Description
TRUEevaluated 881 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 914461 times by 436 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
881-914461
4842#ifndef SQLITE_OMIT_SUBQUERY-
4843 Select *pSel = pFrom->pSelect;-
4844 /* A sub-query in the FROM clause of a SELECT */-
4845 assert( pSel!=0 );-
4846 assert( pFrom->pTab==0 );-
4847 if( sqlite3WalkSelect(pWalker, pSel) ) return WRC_Abort;
executed 10 times by 1 test: return 2;
Executed by:
  • Self test (438)
sqlite3WalkSel...pWalker, pSel)Description
TRUEevaluated 10 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 871 times by 1 test
Evaluated by:
  • Self test (438)
10-871
4848 if( sqlite3ExpandSubquery(pParse, pFrom) ) return WRC_Abort;
never executed: return 2;
sqlite3ExpandS...pParse, pFrom)Description
TRUEnever evaluated
FALSEevaluated 871 times by 1 test
Evaluated by:
  • Self test (438)
0-871
4849#endif-
4850 }else{
executed 871 times by 1 test: end of block
Executed by:
  • Self test (438)
871
4851 /* An ordinary table or view name in the FROM clause */-
4852 assert( pFrom->pTab==0 );-
4853 pFrom->pTab = pTab = sqlite3LocateTableItem(pParse, 0, pFrom);-
4854 if( pTab==0 ) return WRC_Abort;
executed 677 times by 6 tests: return 2;
Executed by:
  • Self test (438)
  • Self test (47)
  • Self test (61)
  • Self test (78)
  • Self test (80)
  • Self test (82)
pTab==0Description
TRUEevaluated 677 times by 6 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
  • Self test (61)
  • Self test (78)
  • Self test (80)
  • Self test (82)
FALSEevaluated 913784 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
677-913784
4855 if( pTab->nTabRef>=0xffff ){
pTab->nTabRef>=0xffffDescription
TRUEevaluated 4 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 913780 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
4-913780
4856 sqlite3ErrorMsg(pParse, "too many references to \"%s\": max 65535",-
4857 pTab->zName);-
4858 pFrom->pTab = 0;-
4859 return WRC_Abort;
executed 4 times by 1 test: return 2;
Executed by:
  • Self test (438)
4
4860 }-
4861 pTab->nTabRef++;-
4862 if( !IsVirtual(pTab) && cannotBeFunction(pParse, pFrom) ){
!((pTab)->nModuleArg)Description
TRUEevaluated 902262 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 11518 times by 1 test
Evaluated by:
  • Self test (438)
cannotBeFuncti...pParse, pFrom)Description
TRUEevaluated 5 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 902257 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
5-902262
4863 return WRC_Abort;
executed 5 times by 1 test: return 2;
Executed by:
  • Self test (438)
5
4864 }-
4865#if !defined(SQLITE_OMIT_VIEW) || !defined (SQLITE_OMIT_VIRTUALTABLE)-
4866 if( IsVirtual(pTab) || pTab->pSelect ){
((pTab)->nModuleArg)Description
TRUEevaluated 11518 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 902257 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
pTab->pSelectDescription
TRUEevaluated 329915 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
FALSEevaluated 572342 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
11518-902257
4867 i16 nCol;-
4868 if( sqlite3ViewGetColumnNames(pParse, pTab) ) return WRC_Abort;
executed 15 times by 1 test: return 2;
Executed by:
  • Self test (438)
sqlite3ViewGet...(pParse, pTab)Description
TRUEevaluated 15 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 341418 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
15-341418
4869 assert( pFrom->pSelect==0 );-
4870 pFrom->pSelect = sqlite3SelectDup(db, pTab->pSelect, 0);-
4871 nCol = pTab->nCol;-
4872 pTab->nCol = -1;-
4873 sqlite3WalkSelect(pWalker, pFrom->pSelect);-
4874 pTab->nCol = nCol;-
4875 }
executed 341418 times by 2 tests: end of block
Executed by:
  • Self test (438)
  • Self test (47)
341418
4876#endif-
4877 }
executed 913760 times by 435 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
913760
4878-
4879 /* Locate the index named by the INDEXED BY clause, if any. */-
4880 if( sqlite3IndexedByLookup(pParse, pFrom) ){
sqlite3Indexed...pParse, pFrom)Description
TRUEevaluated 7 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
FALSEevaluated 916412 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
7-916412
4881 return WRC_Abort;
executed 7 times by 2 tests: return 2;
Executed by:
  • Self test (438)
  • Self test (47)
7
4882 }-
4883 }
executed 916412 times by 435 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
916412
4884-
4885 /* Process NATURAL keywords, and ON and USING clauses of joins.-
4886 */-
4887 if( db->mallocFailed || sqliteProcessJoin(pParse, p) ){
db->mallocFailedDescription
TRUEevaluated 866 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1006839 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
sqliteProcessJoin(pParse, p)Description
TRUEevaluated 16 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1006823 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
16-1006839
4888 return WRC_Abort;
executed 882 times by 1 test: return 2;
Executed by:
  • Self test (438)
882
4889 }-
4890-
4891 /* For every "*" that occurs in the column list, insert the names of-
4892 ** all columns in all tables. And for every TABLE.* insert the names-
4893 ** of all columns in TABLE. The parser inserted a special expression-
4894 ** with the TK_ASTERISK operator for each "*" that it found in the column-
4895 ** list. The following code just has to locate the TK_ASTERISK-
4896 ** expressions and expand each one to the list of all columns in-
4897 ** all tables.-
4898 **-
4899 ** The first loop just checks to see if there are any "*" operators-
4900 ** that need expanding.-
4901 */-
4902 for(k=0; k<pEList->nExpr; k++){
k<pEList->nExprDescription
TRUEevaluated 1155061 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 653299 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
653299-1155061
4903 pE = pEList->a[k].pExpr;-
4904 if( pE->op==TK_ASTERISK ) break;
executed 353340 times by 58 tests: break;
Executed by:
  • Self test
  • Self test (10)
  • Self test (101)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (12)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (16)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (20)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (27)
  • Self test (3)
  • Self test (30)
  • Self test (34)
  • Self test (35)
  • Self test (36)
  • ...
pE->op==168Description
TRUEevaluated 353340 times by 58 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (101)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (12)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (16)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (20)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (27)
  • Self test (3)
  • Self test (30)
  • Self test (34)
  • Self test (35)
  • Self test (36)
  • ...
FALSEevaluated 801721 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
353340-801721
4905 assert( pE->op!=TK_DOT || pE->pRight!=0 );-
4906 assert( pE->op!=TK_DOT || (pE->pLeft!=0 && pE->pLeft->op==TK_ID) );-
4907 if( pE->op==TK_DOT && pE->pRight->op==TK_ASTERISK ) break;
executed 184 times by 1 test: break;
Executed by:
  • Self test (438)
pE->op==130Description
TRUEevaluated 5680 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 796041 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
pE->pRight->op==168Description
TRUEevaluated 184 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 5496 times by 1 test
Evaluated by:
  • Self test (438)
184-796041
4908 elistFlags |= pE->flags;-
4909 }
executed 801537 times by 435 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
801537
4910 if( k<pEList->nExpr ){
k<pEList->nExprDescription
TRUEevaluated 353524 times by 58 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (101)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (12)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (16)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (20)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (27)
  • Self test (3)
  • Self test (30)
  • Self test (34)
  • Self test (35)
  • Self test (36)
  • ...
FALSEevaluated 653299 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
353524-653299
4911 /*-
4912 ** If we get here it means the result set contains one or more "*"-
4913 ** operators that need to be expanded. Loop through each expression-
4914 ** in the result set and expand them one by one.-
4915 */-
4916 struct ExprList_item *a = pEList->a;-
4917 ExprList *pNew = 0;-
4918 int flags = pParse->db->flags;-
4919 int longNames = (flags & SQLITE_FullColNames)!=0
(flags & 0x00000004)!=0Description
TRUEevaluated 30 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 353494 times by 58 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (101)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (12)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (16)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (20)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (27)
  • Self test (3)
  • Self test (30)
  • Self test (34)
  • Self test (35)
  • Self test (36)
  • ...
30-353494
4920 && (flags & SQLITE_ShortColNames)==0;
(flags & 0x00000040)==0Description
TRUEevaluated 20 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 10 times by 1 test
Evaluated by:
  • Self test (438)
10-20
4921-
4922 for(k=0; k<pEList->nExpr; k++){
k<pEList->nExprDescription
TRUEevaluated 365175 times by 58 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (101)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (12)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (16)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (20)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (27)
  • Self test (3)
  • Self test (30)
  • Self test (34)
  • Self test (35)
  • Self test (36)
  • ...
FALSEevaluated 353524 times by 58 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (101)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (12)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (16)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (20)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (27)
  • Self test (3)
  • Self test (30)
  • Self test (34)
  • Self test (35)
  • Self test (36)
  • ...
353524-365175
4923 pE = a[k].pExpr;-
4924 elistFlags |= pE->flags;-
4925 pRight = pE->pRight;-
4926 assert( pE->op!=TK_DOT || pRight!=0 );-
4927 if( pE->op!=TK_ASTERISK
pE->op!=168Description
TRUEevaluated 11817 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 353358 times by 58 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (101)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (12)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (16)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (20)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (27)
  • Self test (3)
  • Self test (30)
  • Self test (34)
  • Self test (35)
  • Self test (36)
  • ...
11817-353358
4928 && (pE->op!=TK_DOT || pRight->op!=TK_ASTERISK)
pE->op!=130Description
TRUEevaluated 11496 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 321 times by 1 test
Evaluated by:
  • Self test (438)
pRight->op!=168Description
TRUEevaluated 121 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 200 times by 1 test
Evaluated by:
  • Self test (438)
121-11496
4929 ){-
4930 /* This particular expression does not need to be expanded.-
4931 */-
4932 pNew = sqlite3ExprListAppend(pParse, pNew, a[k].pExpr);-
4933 if( pNew ){
pNewDescription
TRUEevaluated 11617 times by 1 test
Evaluated by:
  • Self test (438)
FALSEnever evaluated
0-11617
4934 pNew->a[pNew->nExpr-1].zName = a[k].zName;-
4935 pNew->a[pNew->nExpr-1].zSpan = a[k].zSpan;-
4936 a[k].zName = 0;-
4937 a[k].zSpan = 0;-
4938 }
executed 11617 times by 1 test: end of block
Executed by:
  • Self test (438)
11617
4939 a[k].pExpr = 0;-
4940 }else{
executed 11617 times by 1 test: end of block
Executed by:
  • Self test (438)
11617
4941 /* This expression is a "*" or a "TABLE.*" and needs to be-
4942 ** expanded. */-
4943 int tableSeen = 0; /* Set to 1 when TABLE matches */-
4944 char *zTName = 0; /* text of name of TABLE */-
4945 if( pE->op==TK_DOT ){
pE->op==130Description
TRUEevaluated 200 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 353358 times by 58 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (101)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (12)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (16)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (20)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (27)
  • Self test (3)
  • Self test (30)
  • Self test (34)
  • Self test (35)
  • Self test (36)
  • ...
200-353358
4946 assert( pE->pLeft!=0 );-
4947 assert( !ExprHasProperty(pE->pLeft, EP_IntValue) );-
4948 zTName = pE->pLeft->u.zToken;-
4949 }
executed 200 times by 1 test: end of block
Executed by:
  • Self test (438)
200
4950 for(i=0, pFrom=pTabList->a; i<pTabList->nSrc; i++, pFrom++){
i<pTabList->nSrcDescription
TRUEevaluated 359886 times by 58 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (101)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (12)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (16)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (20)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (27)
  • Self test (3)
  • Self test (30)
  • Self test (34)
  • Self test (35)
  • Self test (36)
  • ...
FALSEevaluated 353490 times by 58 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (101)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (12)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (16)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (20)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (27)
  • Self test (3)
  • Self test (30)
  • Self test (34)
  • Self test (35)
  • Self test (36)
  • ...
353490-359886
4951 Table *pTab = pFrom->pTab;-
4952 Select *pSub = pFrom->pSelect;-
4953 char *zTabName = pFrom->zAlias;-
4954 const char *zSchemaName = 0;-
4955 int iDb;-
4956 if( zTabName==0 ){
zTabName==0Description
TRUEevaluated 359681 times by 58 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (101)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (12)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (16)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (20)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (27)
  • Self test (3)
  • Self test (30)
  • Self test (34)
  • Self test (35)
  • Self test (36)
  • ...
FALSEevaluated 205 times by 1 test
Evaluated by:
  • Self test (438)
205-359681
4957 zTabName = pTab->zName;-
4958 }
executed 359681 times by 58 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (101)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (12)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (16)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (20)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (27)
  • Self test (3)
  • Self test (30)
  • Self test (34)
  • Self test (35)
  • Self test (36)
  • ...
359681
4959 if( db->mallocFailed ) break;
executed 68 times by 1 test: break;
Executed by:
  • Self test (438)
db->mallocFailedDescription
TRUEevaluated 68 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 359818 times by 58 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (101)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (12)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (16)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (20)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (27)
  • Self test (3)
  • Self test (30)
  • Self test (34)
  • Self test (35)
  • Self test (36)
  • ...
68-359818
4960 if( pSub==0 || (pSub->selFlags & SF_NestedFrom)==0 ){
pSub==0Description
TRUEevaluated 29244 times by 58 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (101)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (12)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (16)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (20)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (27)
  • Self test (3)
  • Self test (30)
  • Self test (34)
  • Self test (35)
  • Self test (36)
  • ...
FALSEevaluated 330574 times by 1 test
Evaluated by:
  • Self test (438)
(pSub->selFlags & 0x00800)==0Description
TRUEevaluated 330521 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 53 times by 1 test
Evaluated by:
  • Self test (438)
53-330574
4961 pSub = 0;-
4962 if( zTName && sqlite3StrICmp(zTName, zTabName)!=0 ){
zTNameDescription
TRUEevaluated 399 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 359366 times by 58 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (101)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (12)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (16)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (20)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (27)
  • Self test (3)
  • Self test (30)
  • Self test (34)
  • Self test (35)
  • Self test (36)
  • ...
sqlite3StrICmp..., zTabName)!=0Description
TRUEevaluated 211 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 188 times by 1 test
Evaluated by:
  • Self test (438)
188-359366
4963 continue;
executed 211 times by 1 test: continue;
Executed by:
  • Self test (438)
211
4964 }-
4965 iDb = sqlite3SchemaToIndex(db, pTab->pSchema);-
4966 zSchemaName = iDb>=0 ? db->aDb[iDb].zDbSName : "*";
iDb>=0Description
TRUEevaluated 358388 times by 58 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (101)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (12)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (16)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (20)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (27)
  • Self test (3)
  • Self test (30)
  • Self test (34)
  • Self test (35)
  • Self test (36)
  • ...
FALSEevaluated 1166 times by 1 test
Evaluated by:
  • Self test (438)
1166-358388
4967 }
executed 359554 times by 58 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (101)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (12)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (16)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (20)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (27)
  • Self test (3)
  • Self test (30)
  • Self test (34)
  • Self test (35)
  • Self test (36)
  • ...
359554
4968 for(j=0; j<pTab->nCol; j++){
j<pTab->nColDescription
TRUEevaluated 395740 times by 58 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (101)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (12)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (16)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (20)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (27)
  • Self test (3)
  • Self test (30)
  • Self test (34)
  • Self test (35)
  • Self test (36)
  • ...
FALSEevaluated 359607 times by 58 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (101)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (12)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (16)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (20)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (27)
  • Self test (3)
  • Self test (30)
  • Self test (34)
  • Self test (35)
  • Self test (36)
  • ...
359607-395740
4969 char *zName = pTab->aCol[j].zName;-
4970 char *zColname; /* The computed column name */-
4971 char *zToFree; /* Malloced string that needs to be freed */-
4972 Token sColname; /* Computed column name as a token */-
4973-
4974 assert( zName );-
4975 if( zTName && pSub
zTNameDescription
TRUEevaluated 566 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 395174 times by 58 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (101)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (12)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (16)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (20)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (27)
  • Self test (3)
  • Self test (30)
  • Self test (34)
  • Self test (35)
  • Self test (36)
  • ...
pSubDescription
TRUEevaluated 54 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 512 times by 1 test
Evaluated by:
  • Self test (438)
54-395174
4976 && sqlite3MatchSpanName(pSub->pEList->a[j].zSpan, 0, zTName, 0)==0
sqlite3MatchSp... zTName, 0)==0Description
TRUEevaluated 38 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 16 times by 1 test
Evaluated by:
  • Self test (438)
16-38
4977 ){-
4978 continue;
executed 38 times by 1 test: continue;
Executed by:
  • Self test (438)
38
4979 }-
4980-
4981 /* If a column is marked as 'hidden', omit it from the expanded-
4982 ** result-set list unless the SELECT has the SF_IncludeHidden-
4983 ** bit set.-
4984 */-
4985 if( (p->selFlags & SF_IncludeHidden)==0
(p->selFlags & 0x20000)==0Description
TRUEevaluated 393951 times by 58 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (101)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (12)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (16)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (20)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (27)
  • Self test (3)
  • Self test (30)
  • Self test (34)
  • Self test (35)
  • Self test (36)
  • ...
FALSEevaluated 1751 times by 1 test
Evaluated by:
  • Self test (438)
1751-393951
4986 && IsHiddenColumn(&pTab->aCol[j])
(((&pTab->aCol... & 0x0002)!=0)Description
TRUEevaluated 84 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 393867 times by 58 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (101)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (12)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (16)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (20)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (27)
  • Self test (3)
  • Self test (30)
  • Self test (34)
  • Self test (35)
  • Self test (36)
  • ...
84-393867
4987 ){-
4988 continue;
executed 84 times by 1 test: continue;
Executed by:
  • Self test (438)
84
4989 }-
4990 tableSeen = 1;-
4991-
4992 if( i>0 && zTName==0 ){
i>0Description
TRUEevaluated 8895 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 386723 times by 58 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (101)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (12)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (16)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (20)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (27)
  • Self test (3)
  • Self test (30)
  • Self test (34)
  • Self test (35)
  • Self test (36)
  • ...
zTName==0Description
TRUEevaluated 8674 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 221 times by 1 test
Evaluated by:
  • Self test (438)
221-386723
4993 if( (pFrom->fg.jointype & JT_NATURAL)!=0
(pFrom->fg.joi...e & 0x0004)!=0Description
TRUEevaluated 587 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 8087 times by 1 test
Evaluated by:
  • Self test (438)
587-8087
4994 && tableAndColumnIndex(pTabList, i, zName, 0, 0)
tableAndColumn..., zName, 0, 0)Description
TRUEevaluated 392 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 195 times by 1 test
Evaluated by:
  • Self test (438)
195-392
4995 ){-
4996 /* In a NATURAL join, omit the join columns from the -
4997 ** table to the right of the join */-
4998 continue;
executed 392 times by 1 test: continue;
Executed by:
  • Self test (438)
392
4999 }-
5000 if( sqlite3IdListIndex(pFrom->pUsing, zName)>=0 ){
sqlite3IdListI...ing, zName)>=0Description
TRUEevaluated 220 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 8062 times by 1 test
Evaluated by:
  • Self test (438)
220-8062
5001 /* In a join with a USING clause, omit columns in the-
5002 ** using clause from the table on the right. */-
5003 continue;
executed 220 times by 1 test: continue;
Executed by:
  • Self test (438)
220
5004 }-
5005 }
executed 8062 times by 1 test: end of block
Executed by:
  • Self test (438)
8062
5006 pRight = sqlite3Expr(db, TK_ID, zName);-
5007 zColname = zName;-
5008 zToFree = 0;-
5009 if( longNames || pTabList->nSrc>1 ){
longNamesDescription
TRUEevaluated 170 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 394836 times by 58 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (101)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (12)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (16)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (20)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (27)
  • Self test (3)
  • Self test (30)
  • Self test (34)
  • Self test (35)
  • Self test (36)
  • ...
pTabList->nSrc>1Description
TRUEevaluated 13272 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 381564 times by 58 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (101)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (12)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (16)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (20)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (27)
  • Self test (3)
  • Self test (30)
  • Self test (34)
  • Self test (35)
  • Self test (36)
  • ...
170-394836
5010 Expr *pLeft;-
5011 pLeft = sqlite3Expr(db, TK_ID, zTabName);-
5012 pExpr = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight);-
5013 if( zSchemaName ){
zSchemaNameDescription
TRUEevaluated 13293 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 149 times by 1 test
Evaluated by:
  • Self test (438)
149-13293
5014 pLeft = sqlite3Expr(db, TK_ID, zSchemaName);-
5015 pExpr = sqlite3PExpr(pParse, TK_DOT, pLeft, pExpr);-
5016 }
executed 13293 times by 1 test: end of block
Executed by:
  • Self test (438)
13293
5017 if( longNames ){
longNamesDescription
TRUEevaluated 170 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 13272 times by 1 test
Evaluated by:
  • Self test (438)
170-13272
5018 zColname = sqlite3MPrintf(db, "%s.%s", zTabName, zName);-
5019 zToFree = zColname;-
5020 }
executed 170 times by 1 test: end of block
Executed by:
  • Self test (438)
170
5021 }else{
executed 13442 times by 1 test: end of block
Executed by:
  • Self test (438)
13442
5022 pExpr = pRight;-
5023 }
executed 381564 times by 58 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (101)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (12)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (16)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (20)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (27)
  • Self test (3)
  • Self test (30)
  • Self test (34)
  • Self test (35)
  • Self test (36)
  • ...
381564
5024 pNew = sqlite3ExprListAppend(pParse, pNew, pExpr);-
5025 sqlite3TokenInit(&sColname, zColname);-
5026 sqlite3ExprListSetName(pParse, pNew, &sColname, 0);-
5027 if( pNew && (p->selFlags & SF_NestedFrom)!=0 ){
pNewDescription
TRUEevaluated 394624 times by 58 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (101)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (12)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (16)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (20)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (27)
  • Self test (3)
  • Self test (30)
  • Self test (34)
  • Self test (35)
  • Self test (36)
  • ...
FALSEevaluated 382 times by 1 test
Evaluated by:
  • Self test (438)
(p->selFlags & 0x00800)!=0Description
TRUEevaluated 216 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 394408 times by 58 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (101)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (12)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (16)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (20)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (27)
  • Self test (3)
  • Self test (30)
  • Self test (34)
  • Self test (35)
  • Self test (36)
  • ...
216-394624
5028 struct ExprList_item *pX = &pNew->a[pNew->nExpr-1];-
5029 if( pSub ){
pSubDescription
TRUEevaluated 67 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 149 times by 1 test
Evaluated by:
  • Self test (438)
67-149
5030 pX->zSpan = sqlite3DbStrDup(db, pSub->pEList->a[j].zSpan);-
5031 testcase( pX->zSpan==0 );-
5032 }else{
executed 67 times by 1 test: end of block
Executed by:
  • Self test (438)
67
5033 pX->zSpan = sqlite3MPrintf(db, "%s.%s.%s",-
5034 zSchemaName, zTabName, zColname);-
5035 testcase( pX->zSpan==0 );-
5036 }
executed 149 times by 1 test: end of block
Executed by:
  • Self test (438)
149
5037 pX->bSpanIsTab = 1;-
5038 }
executed 216 times by 1 test: end of block
Executed by:
  • Self test (438)
216
5039 sqlite3DbFree(db, zToFree);-
5040 }
executed 395006 times by 58 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (101)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (12)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (16)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (20)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (27)
  • Self test (3)
  • Self test (30)
  • Self test (34)
  • Self test (35)
  • Self test (36)
  • ...
395006
5041 }
executed 359607 times by 58 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (101)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (12)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (16)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (20)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (27)
  • Self test (3)
  • Self test (30)
  • Self test (34)
  • Self test (35)
  • Self test (36)
  • ...
359607
5042 if( !tableSeen ){
!tableSeenDescription
TRUEevaluated 14 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 353544 times by 58 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (101)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (12)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (16)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (20)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (27)
  • Self test (3)
  • Self test (30)
  • Self test (34)
  • Self test (35)
  • Self test (36)
  • ...
14-353544
5043 if( zTName ){
zTNameDescription
TRUEevaluated 4 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 10 times by 1 test
Evaluated by:
  • Self test (438)
4-10
5044 sqlite3ErrorMsg(pParse, "no such table: %s", zTName);-
5045 }else{
executed 4 times by 1 test: end of block
Executed by:
  • Self test (438)
4
5046 sqlite3ErrorMsg(pParse, "no tables specified");-
5047 }
executed 10 times by 1 test: end of block
Executed by:
  • Self test (438)
10
5048 }-
5049 }
executed 353558 times by 58 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (101)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (12)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (16)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (20)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (27)
  • Self test (3)
  • Self test (30)
  • Self test (34)
  • Self test (35)
  • Self test (36)
  • ...
353558
5050 }-
5051 sqlite3ExprListDelete(db, pEList);-
5052 p->pEList = pNew;-
5053 }
executed 353524 times by 58 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (101)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (12)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (16)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (20)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (27)
  • Self test (3)
  • Self test (30)
  • Self test (34)
  • Self test (35)
  • Self test (36)
  • ...
353524
5054 if( p->pEList ){
p->pEListDescription
TRUEevaluated 1006630 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 193 times by 1 test
Evaluated by:
  • Self test (438)
193-1006630
5055 if( p->pEList->nExpr>db->aLimit[SQLITE_LIMIT_COLUMN] ){
p->pEList->nExpr>db->aLimit[2]Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1006629 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
1-1006629
5056 sqlite3ErrorMsg(pParse, "too many columns in result set");-
5057 return WRC_Abort;
executed 1 time by 1 test: return 2;
Executed by:
  • Self test (438)
1
5058 }-
5059 if( (elistFlags & (EP_HasFunc|EP_Subquery))!=0 ){
(elistFlags & ...|0x200000))!=0Description
TRUEevaluated 50367 times by 7 tests
Evaluated by:
  • Self test (103)
  • Self test (104)
  • Self test (32)
  • Self test (33)
  • Self test (34)
  • Self test (438)
  • Self test (64)
FALSEevaluated 956262 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
50367-956262
5060 p->selFlags |= SF_ComplexResult;-
5061 }
executed 50367 times by 7 tests: end of block
Executed by:
  • Self test (103)
  • Self test (104)
  • Self test (32)
  • Self test (33)
  • Self test (34)
  • Self test (438)
  • Self test (64)
50367
5062 }
executed 1006629 times by 435 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
1006629
5063 return WRC_Continue;
executed 1006822 times by 435 tests: return 0;
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
1006822
5064}-
5065-
5066/*-
5067** No-op routine for the parse-tree walker.-
5068**-
5069** When this routine is the Walker.xExprCallback then expression trees-
5070** are walked without any actions being taken at each node. Presumably,-
5071** when this routine is used for Walker.xExprCallback then -
5072** Walker.xSelectCallback is set to do something useful for every -
5073** subquery in the parser tree.-
5074*/-
5075int sqlite3ExprWalkNoop(Walker *NotUsed, Expr *NotUsed2){-
5076 UNUSED_PARAMETER2(NotUsed, NotUsed2);-
5077 return WRC_Continue;
executed 5521392 times by 435 tests: return 0;
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
5521392
5078}-
5079-
5080/*-
5081** No-op routine for the parse-tree walker for SELECT statements.-
5082** subquery in the parser tree.-
5083*/-
5084int sqlite3SelectWalkNoop(Walker *NotUsed, Select *NotUsed2){-
5085 UNUSED_PARAMETER2(NotUsed, NotUsed2);-
5086 return WRC_Continue;
executed 811272 times by 435 tests: return 0;
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
811272
5087}-
5088-
5089#if SQLITE_DEBUG-
5090/*-
5091** Always assert. This xSelectCallback2 implementation proves that the-
5092** xSelectCallback2 is never invoked.-
5093*/-
5094void sqlite3SelectWalkAssert2(Walker *NotUsed, Select *NotUsed2){-
5095 UNUSED_PARAMETER2(NotUsed, NotUsed2);-
5096 assert( 0 );-
5097}-
5098#endif-
5099/*-
5100** This routine "expands" a SELECT statement and all of its subqueries.-
5101** For additional information on what it means to "expand" a SELECT-
5102** statement, see the comment on the selectExpand worker callback above.-
5103**-
5104** Expanding a SELECT statement is the first step in processing a-
5105** SELECT statement. The SELECT statement must be expanded before-
5106** name resolution is performed.-
5107**-
5108** If anything goes wrong, an error message is written into pParse.-
5109** The calling function can detect the problem by looking at pParse->nErr-
5110** and/or pParse->db->mallocFailed.-
5111*/-
5112static void sqlite3SelectExpand(Parse *pParse, Select *pSelect){-
5113 Walker w;-
5114 w.xExprCallback = sqlite3ExprWalkNoop;-
5115 w.pParse = pParse;-
5116 if( OK_IF_ALWAYS_TRUE(pParse->hasCompound) ){
(pParse->hasCompound)Description
TRUEevaluated 2630 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 184820 times by 436 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
2630-184820
5117 w.xSelectCallback = convertCompoundSelectToSubquery;-
5118 w.xSelectCallback2 = 0;-
5119 sqlite3WalkSelect(&w, pSelect);-
5120 }
executed 2630 times by 1 test: end of block
Executed by:
  • Self test (438)
2630
5121 w.xSelectCallback = selectExpander;-
5122 w.xSelectCallback2 = selectPopWith;-
5123 sqlite3WalkSelect(&w, pSelect);-
5124}
executed 187450 times by 436 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
187450
5125-
5126-
5127#ifndef SQLITE_OMIT_SUBQUERY-
5128/*-
5129** This is a Walker.xSelectCallback callback for the sqlite3SelectTypeInfo()-
5130** interface.-
5131**-
5132** For each FROM-clause subquery, add Column.zType and Column.zColl-
5133** information to the Table structure that represents the result set-
5134** of that subquery.-
5135**-
5136** The Table structure that represents the result set was constructed-
5137** by selectExpander() but the type and collation information was omitted-
5138** at that point because identifiers had not yet been resolved. This-
5139** routine is called after identifier resolution.-
5140*/-
5141static void selectAddSubqueryTypeInfo(Walker *pWalker, Select *p){-
5142 Parse *pParse;-
5143 int i;-
5144 SrcList *pTabList;-
5145 struct SrcList_item *pFrom;-
5146-
5147 assert( p->selFlags & SF_Resolved );-
5148 if( p->selFlags & SF_HasTypeInfo ) return;
executed 41 times by 1 test: return;
Executed by:
  • Self test (438)
p->selFlags & 0x00080Description
TRUEevaluated 41 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 811098 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
41-811098
5149 p->selFlags |= SF_HasTypeInfo;-
5150 pParse = pWalker->pParse;-
5151 pTabList = p->pSrc;-
5152 for(i=0, pFrom=pTabList->a; i<pTabList->nSrc; i++, pFrom++){
i<pTabList->nSrcDescription
TRUEevaluated 523466 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 811098 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
523466-811098
5153 Table *pTab = pFrom->pTab;-
5154 assert( pTab!=0 );-
5155 if( (pTab->tabFlags & TF_Ephemeral)!=0 ){
(pTab->tabFlags & 0x0002)!=0Description
TRUEevaluated 1960 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 521506 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
1960-521506
5156 /* A sub-query in the FROM clause of a SELECT */-
5157 Select *pSel = pFrom->pSelect;-
5158 if( pSel ){
pSelDescription
TRUEevaluated 1664 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 296 times by 1 test
Evaluated by:
  • Self test (438)
296-1664
5159 while( pSel->pPrior ) pSel = pSel->pPrior;
executed 828 times by 1 test: pSel = pSel->pPrior;
Executed by:
  • Self test (438)
pSel->pPriorDescription
TRUEevaluated 828 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1664 times by 1 test
Evaluated by:
  • Self test (438)
828-1664
5160 sqlite3SelectAddColumnTypeAndCollation(pParse, pTab, pSel);-
5161 }
executed 1664 times by 1 test: end of block
Executed by:
  • Self test (438)
1664
5162 }
executed 1960 times by 1 test: end of block
Executed by:
  • Self test (438)
1960
5163 }
executed 523466 times by 435 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
523466
5164}
executed 811098 times by 435 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
811098
5165#endif-
5166-
5167-
5168/*-
5169** This routine adds datatype and collating sequence information to-
5170** the Table structures of all FROM-clause subqueries in a-
5171** SELECT statement.-
5172**-
5173** Use this routine after name resolution.-
5174*/-
5175static void sqlite3SelectAddTypeInfo(Parse *pParse, Select *pSelect){-
5176#ifndef SQLITE_OMIT_SUBQUERY-
5177 Walker w;-
5178 w.xSelectCallback = sqlite3SelectWalkNoop;-
5179 w.xSelectCallback2 = selectAddSubqueryTypeInfo;-
5180 w.xExprCallback = sqlite3ExprWalkNoop;-
5181 w.pParse = pParse;-
5182 sqlite3WalkSelect(&w, pSelect);-
5183#endif-
5184}
executed 185978 times by 435 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
185978
5185-
5186-
5187/*-
5188** This routine sets up a SELECT statement for processing. The-
5189** following is accomplished:-
5190**-
5191** * VDBE Cursor numbers are assigned to all FROM-clause terms.-
5192** * Ephemeral Table objects are created for all FROM-clause subqueries.-
5193** * ON and USING clauses are shifted into WHERE statements-
5194** * Wildcards "*" and "TABLE.*" in result sets are expanded.-
5195** * Identifiers in expression are matched to tables.-
5196**-
5197** This routine acts recursively on all subqueries within the SELECT.-
5198*/-
5199void sqlite3SelectPrep(-
5200 Parse *pParse, /* The parser context */-
5201 Select *p, /* The SELECT statement being coded. */-
5202 NameContext *pOuterNC /* Name context for container */-
5203){-
5204 assert( p!=0 || pParse->db->mallocFailed );-
5205 if( pParse->db->mallocFailed ) return;
never executed: return;
pParse->db->mallocFailedDescription
TRUEnever evaluated
FALSEevaluated 320135 times by 436 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
0-320135
5206 if( p->selFlags & SF_HasTypeInfo ) return;
executed 132685 times by 4 tests: return;
Executed by:
  • Self test
  • Self test (438)
  • Self test (57)
  • Self test (58)
p->selFlags & 0x00080Description
TRUEevaluated 132685 times by 4 tests
Evaluated by:
  • Self test
  • Self test (438)
  • Self test (57)
  • Self test (58)
FALSEevaluated 187450 times by 436 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
132685-187450
5207 sqlite3SelectExpand(pParse, p);-
5208 if( pParse->nErr || pParse->db->mallocFailed ) return;
executed 1194 times by 6 tests: return;
Executed by:
  • Self test (438)
  • Self test (47)
  • Self test (61)
  • Self test (78)
  • Self test (80)
  • Self test (82)
pParse->nErrDescription
TRUEevaluated 760 times by 6 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
  • Self test (61)
  • Self test (78)
  • Self test (80)
  • Self test (82)
FALSEevaluated 186690 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
pParse->db->mallocFailedDescription
TRUEevaluated 434 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 186256 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
434-186690
5209 sqlite3ResolveSelectNames(pParse, p, pOuterNC);-
5210 if( pParse->nErr || pParse->db->mallocFailed ) return;
executed 278 times by 2 tests: return;
Executed by:
  • Self test (438)
  • Self test (47)
pParse->nErrDescription
TRUEevaluated 278 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
FALSEevaluated 185978 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
pParse->db->mallocFailedDescription
TRUEnever evaluated
FALSEevaluated 185978 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
0-185978
5211 sqlite3SelectAddTypeInfo(pParse, p);-
5212}
executed 185978 times by 435 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
185978
5213-
5214/*-
5215** Reset the aggregate accumulator.-
5216**-
5217** The aggregate accumulator is a set of memory cells that hold-
5218** intermediate results while calculating an aggregate. This-
5219** routine generates code that stores NULLs in all of those memory-
5220** cells.-
5221*/-
5222static void resetAccumulator(Parse *pParse, AggInfo *pAggInfo){-
5223 Vdbe *v = pParse->pVdbe;-
5224 int i;-
5225 struct AggInfo_func *pFunc;-
5226 int nReg = pAggInfo->nFunc + pAggInfo->nColumn;-
5227 if( nReg==0 ) return;
executed 10 times by 1 test: return;
Executed by:
  • Self test (438)
nReg==0Description
TRUEevaluated 10 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 22681 times by 1 test
Evaluated by:
  • Self test (438)
10-22681
5228#ifdef SQLITE_DEBUG-
5229 /* Verify that all AggInfo registers are within the range specified by-
5230 ** AggInfo.mnReg..AggInfo.mxReg */-
5231 assert( nReg==pAggInfo->mxReg-pAggInfo->mnReg+1 );-
5232 for(i=0; i<pAggInfo->nColumn; i++){-
5233 assert( pAggInfo->aCol[i].iMem>=pAggInfo->mnReg-
5234 && pAggInfo->aCol[i].iMem<=pAggInfo->mxReg );-
5235 }-
5236 for(i=0; i<pAggInfo->nFunc; i++){-
5237 assert( pAggInfo->aFunc[i].iMem>=pAggInfo->mnReg-
5238 && pAggInfo->aFunc[i].iMem<=pAggInfo->mxReg );-
5239 }-
5240#endif-
5241 sqlite3VdbeAddOp3(v, OP_Null, 0, pAggInfo->mnReg, pAggInfo->mxReg);-
5242 for(pFunc=pAggInfo->aFunc, i=0; i<pAggInfo->nFunc; i++, pFunc++){
i<pAggInfo->nFuncDescription
TRUEevaluated 33667 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 22681 times by 1 test
Evaluated by:
  • Self test (438)
22681-33667
5243 if( pFunc->iDistinct>=0 ){
pFunc->iDistinct>=0Description
TRUEevaluated 3217 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 30450 times by 1 test
Evaluated by:
  • Self test (438)
3217-30450
5244 Expr *pE = pFunc->pExpr;-
5245 assert( !ExprHasProperty(pE, EP_xIsSelect) );-
5246 if( pE->x.pList==0 || pE->x.pList->nExpr!=1 ){
pE->x.pList==0Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 3214 times by 1 test
Evaluated by:
  • Self test (438)
pE->x.pList->nExpr!=1Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 3213 times by 1 test
Evaluated by:
  • Self test (438)
1-3214
5247 sqlite3ErrorMsg(pParse, "DISTINCT aggregates must have exactly one "-
5248 "argument");-
5249 pFunc->iDistinct = -1;-
5250 }else{
executed 4 times by 1 test: end of block
Executed by:
  • Self test (438)
4
5251 KeyInfo *pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pE->x.pList,0,0);-
5252 sqlite3VdbeAddOp4(v, OP_OpenEphemeral, pFunc->iDistinct, 0, 0,-
5253 (char*)pKeyInfo, P4_KEYINFO);-
5254 }
executed 3213 times by 1 test: end of block
Executed by:
  • Self test (438)
3213
5255 }-
5256 }
executed 33667 times by 1 test: end of block
Executed by:
  • Self test (438)
33667
5257}
executed 22681 times by 1 test: end of block
Executed by:
  • Self test (438)
22681
5258-
5259/*-
5260** Invoke the OP_AggFinalize opcode for every aggregate function-
5261** in the AggInfo structure.-
5262*/-
5263static void finalizeAggFunctions(Parse *pParse, AggInfo *pAggInfo){-
5264 Vdbe *v = pParse->pVdbe;-
5265 int i;-
5266 struct AggInfo_func *pF;-
5267 for(i=0, pF=pAggInfo->aFunc; i<pAggInfo->nFunc; i++, pF++){
i<pAggInfo->nFuncDescription
TRUEevaluated 33664 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 22688 times by 1 test
Evaluated by:
  • Self test (438)
22688-33664
5268 ExprList *pList = pF->pExpr->x.pList;-
5269 assert( !ExprHasProperty(pF->pExpr, EP_xIsSelect) );-
5270 sqlite3VdbeAddOp2(v, OP_AggFinal, pF->iMem, pList ? pList->nExpr : 0);-
5271 sqlite3VdbeAppendP4(v, pF->pFunc, P4_FUNCDEF);-
5272 }
executed 33664 times by 1 test: end of block
Executed by:
  • Self test (438)
33664
5273}
executed 22688 times by 1 test: end of block
Executed by:
  • Self test (438)
22688
5274-
5275-
5276/*-
5277** Update the accumulator memory cells for an aggregate based on-
5278** the current cursor position.-
5279**-
5280** If regAcc is non-zero and there are no min() or max() aggregates-
5281** in pAggInfo, then only populate the pAggInfo->nAccumulator accumulator-
5282** registers i register regAcc contains 0. The caller will take care-
5283** of setting and clearing regAcc.-
5284*/-
5285static void updateAccumulator(Parse *pParse, int regAcc, AggInfo *pAggInfo){-
5286 Vdbe *v = pParse->pVdbe;-
5287 int i;-
5288 int regHit = 0;-
5289 int addrHitTest = 0;-
5290 struct AggInfo_func *pF;-
5291 struct AggInfo_col *pC;-
5292-
5293 pAggInfo->directMode = 1;-
5294 for(i=0, pF=pAggInfo->aFunc; i<pAggInfo->nFunc; i++, pF++){
i<pAggInfo->nFuncDescription
TRUEevaluated 33664 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 22688 times by 1 test
Evaluated by:
  • Self test (438)
22688-33664
5295 int nArg;-
5296 int addrNext = 0;-
5297 int regAgg;-
5298 ExprList *pList = pF->pExpr->x.pList;-
5299 assert( !ExprHasProperty(pF->pExpr, EP_xIsSelect) );-
5300 if( pList ){
pListDescription
TRUEevaluated 31470 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 2194 times by 1 test
Evaluated by:
  • Self test (438)
2194-31470
5301 nArg = pList->nExpr;-
5302 regAgg = sqlite3GetTempRange(pParse, nArg);-
5303 sqlite3ExprCodeExprList(pParse, pList, regAgg, 0, SQLITE_ECEL_DUP);-
5304 }else{
executed 31470 times by 1 test: end of block
Executed by:
  • Self test (438)
31470
5305 nArg = 0;-
5306 regAgg = 0;-
5307 }
executed 2194 times by 1 test: end of block
Executed by:
  • Self test (438)
2194
5308 if( pF->iDistinct>=0 ){
pF->iDistinct>=0Description
TRUEevaluated 3214 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 30450 times by 1 test
Evaluated by:
  • Self test (438)
3214-30450
5309 addrNext = sqlite3VdbeMakeLabel(v);-
5310 testcase( nArg==0 ); /* Error condition */-
5311 testcase( nArg>1 ); /* Also an error */-
5312 codeDistinct(pParse, pF->iDistinct, addrNext, 1, regAgg);-
5313 }
executed 3214 times by 1 test: end of block
Executed by:
  • Self test (438)
3214
5314 if( pF->pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL ){
pF->pFunc->funcFlags & 0x0020Description
TRUEevaluated 14538 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 19126 times by 1 test
Evaluated by:
  • Self test (438)
14538-19126
5315 CollSeq *pColl = 0;-
5316 struct ExprList_item *pItem;-
5317 int j;-
5318 assert( pList!=0 ); /* pList!=0 if pF->pFunc has NEEDCOLL */-
5319 for(j=0, pItem=pList->a; !pColl && j<nArg; j++, pItem++){
!pCollDescription
TRUEevaluated 23505 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 5571 times by 1 test
Evaluated by:
  • Self test (438)
j<nArgDescription
TRUEevaluated 14538 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 8967 times by 1 test
Evaluated by:
  • Self test (438)
5571-23505
5320 pColl = sqlite3ExprCollSeq(pParse, pItem->pExpr);-
5321 }
executed 14538 times by 1 test: end of block
Executed by:
  • Self test (438)
14538
5322 if( !pColl ){
!pCollDescription
TRUEevaluated 8967 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 5571 times by 1 test
Evaluated by:
  • Self test (438)
5571-8967
5323 pColl = pParse->db->pDfltColl;-
5324 }
executed 8967 times by 1 test: end of block
Executed by:
  • Self test (438)
8967
5325 if( regHit==0 && pAggInfo->nAccumulator ) regHit = ++pParse->nMem;
executed 1813 times by 1 test: regHit = ++pParse->nMem;
Executed by:
  • Self test (438)
regHit==0Description
TRUEevaluated 12805 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1733 times by 1 test
Evaluated by:
  • Self test (438)
pAggInfo->nAccumulatorDescription
TRUEevaluated 1813 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 10992 times by 1 test
Evaluated by:
  • Self test (438)
1733-12805
5326 sqlite3VdbeAddOp4(v, OP_CollSeq, regHit, 0, 0, (char *)pColl, P4_COLLSEQ);-
5327 }
executed 14538 times by 1 test: end of block
Executed by:
  • Self test (438)
14538
5328 sqlite3VdbeAddOp3(v, OP_AggStep, 0, regAgg, pF->iMem);-
5329 sqlite3VdbeAppendP4(v, pF->pFunc, P4_FUNCDEF);-
5330 sqlite3VdbeChangeP5(v, (u8)nArg);-
5331 sqlite3ReleaseTempRange(pParse, regAgg, nArg);-
5332 if( addrNext ){
addrNextDescription
TRUEevaluated 3214 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 30450 times by 1 test
Evaluated by:
  • Self test (438)
3214-30450
5333 sqlite3VdbeResolveLabel(v, addrNext);-
5334 }
executed 3214 times by 1 test: end of block
Executed by:
  • Self test (438)
3214
5335 }
executed 33664 times by 1 test: end of block
Executed by:
  • Self test (438)
33664
5336 if( regHit==0 && pAggInfo->nAccumulator ){
regHit==0Description
TRUEevaluated 20875 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1813 times by 1 test
Evaluated by:
  • Self test (438)
pAggInfo->nAccumulatorDescription
TRUEevaluated 358 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 20517 times by 1 test
Evaluated by:
  • Self test (438)
358-20875
5337 regHit = regAcc;-
5338 }
executed 358 times by 1 test: end of block
Executed by:
  • Self test (438)
358
5339 if( regHit ){
regHitDescription
TRUEevaluated 2171 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 20517 times by 1 test
Evaluated by:
  • Self test (438)
2171-20517
5340 addrHitTest = sqlite3VdbeAddOp1(v, OP_If, regHit); VdbeCoverage(v);-
5341 }
executed 2171 times by 1 test: end of block
Executed by:
  • Self test (438)
2171
5342 for(i=0, pC=pAggInfo->aCol; i<pAggInfo->nAccumulator; i++, pC++){
i<pAggInfo->nAccumulatorDescription
TRUEevaluated 2355 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 22688 times by 1 test
Evaluated by:
  • Self test (438)
2355-22688
5343 sqlite3ExprCode(pParse, pC->pExpr, pC->iMem);-
5344 }
executed 2355 times by 1 test: end of block
Executed by:
  • Self test (438)
2355
5345 pAggInfo->directMode = 0;-
5346 if( addrHitTest ){
addrHitTestDescription
TRUEevaluated 2171 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 20517 times by 1 test
Evaluated by:
  • Self test (438)
2171-20517
5347 sqlite3VdbeJumpHere(v, addrHitTest);-
5348 }
executed 2171 times by 1 test: end of block
Executed by:
  • Self test (438)
2171
5349}
executed 22688 times by 1 test: end of block
Executed by:
  • Self test (438)
22688
5350-
5351/*-
5352** Add a single OP_Explain instruction to the VDBE to explain a simple-
5353** count(*) query ("SELECT count(*) FROM pTab").-
5354*/-
5355#ifndef SQLITE_OMIT_EXPLAIN-
5356static void explainSimpleCount(-
5357 Parse *pParse, /* Parse context */-
5358 Table *pTab, /* Table being queried */-
5359 Index *pIdx /* Index used to optimize scan, or NULL */-
5360){-
5361 if( pParse->explain==2 ){
pParse->explain==2Description
TRUEevaluated 8 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1987 times by 4 tests
Evaluated by:
  • Self test (103)
  • Self test (104)
  • Self test (34)
  • Self test (438)
8-1987
5362 int bCover = (pIdx!=0 && (HasRowid(pTab) || !IsPrimaryKeyIndex(pIdx)));
pIdx!=0Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 4 times by 1 test
Evaluated by:
  • Self test (438)
(((pTab)->tabF... & 0x0020)==0)Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test (438)
!((pIdx)->idxType==2)Description
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test (438)
0-4
5363 sqlite3VdbeExplain(pParse, 0, "SCAN TABLE %s%s%s",-
5364 pTab->zName,-
5365 bCover ? " USING COVERING INDEX " : "",-
5366 bCover ? pIdx->zName : ""-
5367 );-
5368 }
executed 8 times by 1 test: end of block
Executed by:
  • Self test (438)
8
5369}
executed 1995 times by 4 tests: end of block
Executed by:
  • Self test (103)
  • Self test (104)
  • Self test (34)
  • Self test (438)
1995
5370#else-
5371# define explainSimpleCount(a,b,c)-
5372#endif-
5373-
5374/*-
5375** sqlite3WalkExpr() callback used by havingToWhere().-
5376**-
5377** If the node passed to the callback is a TK_AND node, return -
5378** WRC_Continue to tell sqlite3WalkExpr() to iterate through child nodes.-
5379**-
5380** Otherwise, return WRC_Prune. In this case, also check if the -
5381** sub-expression matches the criteria for being moved to the WHERE-
5382** clause. If so, add it to the WHERE clause and replace the sub-expression-
5383** within the HAVING expression with a constant "1".-
5384*/-
5385static int havingToWhereExprCb(Walker *pWalker, Expr *pExpr){-
5386 if( pExpr->op!=TK_AND ){
pExpr->op!=44Description
TRUEevaluated 94 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 3 times by 1 test
Evaluated by:
  • Self test (438)
3-94
5387 Select *pS = pWalker->u.pSelect;-
5388 if( sqlite3ExprIsConstantOrGroupBy(pWalker->pParse, pExpr, pS->pGroupBy) ){
sqlite3ExprIsC... pS->pGroupBy)Description
TRUEevaluated 28 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 66 times by 1 test
Evaluated by:
  • Self test (438)
28-66
5389 sqlite3 *db = pWalker->pParse->db;-
5390 Expr *pNew = sqlite3ExprAlloc(db, TK_INTEGER, &sqlite3IntTokens[1], 0);-
5391 if( pNew ){
pNewDescription
TRUEevaluated 28 times by 1 test
Evaluated by:
  • Self test (438)
FALSEnever evaluated
0-28
5392 Expr *pWhere = pS->pWhere;-
5393 SWAP(Expr, *pNew, *pExpr);-
5394 pNew = sqlite3ExprAnd(db, pWhere, pNew);-
5395 pS->pWhere = pNew;-
5396 pWalker->eCode = 1;-
5397 }
executed 28 times by 1 test: end of block
Executed by:
  • Self test (438)
28
5398 }
executed 28 times by 1 test: end of block
Executed by:
  • Self test (438)
28
5399 return WRC_Prune;
executed 94 times by 1 test: return 1;
Executed by:
  • Self test (438)
94
5400 }-
5401 return WRC_Continue;
executed 3 times by 1 test: return 0;
Executed by:
  • Self test (438)
3
5402}-
5403-
5404/*-
5405** Transfer eligible terms from the HAVING clause of a query, which is-
5406** processed after grouping, to the WHERE clause, which is processed before-
5407** grouping. For example, the query:-
5408**-
5409** SELECT * FROM <tables> WHERE a=? GROUP BY b HAVING b=? AND c=?-
5410**-
5411** can be rewritten as:-
5412**-
5413** SELECT * FROM <tables> WHERE a=? AND b=? GROUP BY b HAVING c=?-
5414**-
5415** A term of the HAVING expression is eligible for transfer if it consists-
5416** entirely of constants and expressions that are also GROUP BY terms that-
5417** use the "BINARY" collation sequence.-
5418*/-
5419static void havingToWhere(Parse *pParse, Select *p){-
5420 Walker sWalker;-
5421 memset(&sWalker, 0, sizeof(sWalker));-
5422 sWalker.pParse = pParse;-
5423 sWalker.xExprCallback = havingToWhereExprCb;-
5424 sWalker.u.pSelect = p;-
5425 sqlite3WalkExpr(&sWalker, p->pHaving);-
5426#if SELECTTRACE_ENABLED-
5427 if( sWalker.eCode && (sqlite3SelectTrace & 0x100)!=0 ){-
5428 SELECTTRACE(0x100,pParse,p,("Move HAVING terms into WHERE:\n"));-
5429 sqlite3TreeViewSelect(0, p, 0);-
5430 }-
5431#endif-
5432}
executed 91 times by 1 test: end of block
Executed by:
  • Self test (438)
91
5433-
5434/*-
5435** Check to see if the pThis entry of pTabList is a self-join of a prior view.-
5436** If it is, then return the SrcList_item for the prior view. If it is not,-
5437** then return 0.-
5438*/-
5439static struct SrcList_item *isSelfJoinView(-
5440 SrcList *pTabList, /* Search for self-joins in this FROM clause */-
5441 struct SrcList_item *pThis /* Search for prior reference to this subquery */-
5442){-
5443 struct SrcList_item *pItem;-
5444 for(pItem = pTabList->a; pItem<pThis; pItem++){
pItem<pThisDescription
TRUEevaluated 130 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 153 times by 1 test
Evaluated by:
  • Self test (438)
130-153
5445 if( pItem->pSelect==0 ) continue;
executed 93 times by 1 test: continue;
Executed by:
  • Self test (438)
pItem->pSelect==0Description
TRUEevaluated 93 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 37 times by 1 test
Evaluated by:
  • Self test (438)
37-93
5446 if( pItem->fg.viaCoroutine ) continue;
executed 7 times by 1 test: continue;
Executed by:
  • Self test (438)
pItem->fg.viaCoroutineDescription
TRUEevaluated 7 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 30 times by 1 test
Evaluated by:
  • Self test (438)
7-30
5447 if( pItem->zName==0 ) continue;
executed 22 times by 1 test: continue;
Executed by:
  • Self test (438)
pItem->zName==0Description
TRUEevaluated 22 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 8 times by 1 test
Evaluated by:
  • Self test (438)
8-22
5448 if( sqlite3_stricmp(pItem->zDatabase, pThis->zDatabase)!=0 ) continue;
never executed: continue;
sqlite3_stricm...>zDatabase)!=0Description
TRUEnever evaluated
FALSEevaluated 8 times by 1 test
Evaluated by:
  • Self test (438)
0-8
5449 if( sqlite3_stricmp(pItem->zName, pThis->zName)!=0 ) continue;
executed 1 time by 1 test: continue;
Executed by:
  • Self test (438)
sqlite3_stricm...his->zName)!=0Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 7 times by 1 test
Evaluated by:
  • Self test (438)
1-7
5450 if( sqlite3ExprCompare(0,
sqlite3ExprCom...t->pWhere, -1)Description
TRUEevaluated 5 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test (438)
2-5
5451 pThis->pSelect->pWhere, pItem->pSelect->pWhere, -1)
sqlite3ExprCom...t->pWhere, -1)Description
TRUEevaluated 5 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test (438)
2-5
5452 ){-
5453 /* The view was modified by some other optimization such as-
5454 ** pushDownWhereTerms() */-
5455 continue;
executed 5 times by 1 test: continue;
Executed by:
  • Self test (438)
5
5456 }-
5457 return pItem;
executed 2 times by 1 test: return pItem;
Executed by:
  • Self test (438)
2
5458 }-
5459 return 0;
executed 153 times by 1 test: return 0;
Executed by:
  • Self test (438)
153
5460}-
5461-
5462#ifdef SQLITE_COUNTOFVIEW_OPTIMIZATION-
5463/*-
5464** Attempt to transform a query of the form-
5465**-
5466** SELECT count(*) FROM (SELECT x FROM t1 UNION ALL SELECT y FROM t2)-
5467**-
5468** Into this:-
5469**-
5470** SELECT (SELECT count(*) FROM t1)+(SELECT count(*) FROM t2)-
5471**-
5472** The transformation only works if all of the following are true:-
5473**-
5474** * The subquery is a UNION ALL of two or more terms-
5475** * The subquery does not have a LIMIT clause-
5476** * There is no WHERE or GROUP BY or HAVING clauses on the subqueries-
5477** * The outer query is a simple count(*)-
5478**-
5479** Return TRUE if the optimization is undertaken.-
5480*/-
5481static int countOfViewOptimization(Parse *pParse, Select *p){-
5482 Select *pSub, *pPrior;-
5483 Expr *pExpr;-
5484 Expr *pCount;-
5485 sqlite3 *db;-
5486 if( (p->selFlags & SF_Aggregate)==0 ) return 0; /* This is an aggregate */-
5487 if( p->pEList->nExpr!=1 ) return 0; /* Single result column */-
5488 pExpr = p->pEList->a[0].pExpr;-
5489 if( pExpr->op!=TK_AGG_FUNCTION ) return 0; /* Result is an aggregate */-
5490 if( sqlite3_stricmp(pExpr->u.zToken,"count") ) return 0; /* Is count() */-
5491 if( pExpr->x.pList!=0 ) return 0; /* Must be count(*) */-
5492 if( p->pSrc->nSrc!=1 ) return 0; /* One table in FROM */-
5493 pSub = p->pSrc->a[0].pSelect;-
5494 if( pSub==0 ) return 0; /* The FROM is a subquery */-
5495 if( pSub->pPrior==0 ) return 0; /* Must be a compound ry */-
5496 do{-
5497 if( pSub->op!=TK_ALL && pSub->pPrior ) return 0; /* Must be UNION ALL */-
5498 if( pSub->pWhere ) return 0; /* No WHERE clause */-
5499 if( pSub->pLimit ) return 0; /* No LIMIT clause */-
5500 if( pSub->selFlags & SF_Aggregate ) return 0; /* Not an aggregate */-
5501 pSub = pSub->pPrior; /* Repeat over compound */-
5502 }while( pSub );-
5503-
5504 /* If we reach this point then it is OK to perform the transformation */-
5505-
5506 db = pParse->db;-
5507 pCount = pExpr;-
5508 pExpr = 0;-
5509 pSub = p->pSrc->a[0].pSelect;-
5510 p->pSrc->a[0].pSelect = 0;-
5511 sqlite3SrcListDelete(db, p->pSrc);-
5512 p->pSrc = sqlite3DbMallocZero(pParse->db, sizeof(*p->pSrc));-
5513 while( pSub ){-
5514 Expr *pTerm;-
5515 pPrior = pSub->pPrior;-
5516 pSub->pPrior = 0;-
5517 pSub->pNext = 0;-
5518 pSub->selFlags |= SF_Aggregate;-
5519 pSub->selFlags &= ~SF_Compound;-
5520 pSub->nSelectRow = 0;-
5521 sqlite3ExprListDelete(db, pSub->pEList);-
5522 pTerm = pPrior ? sqlite3ExprDup(db, pCount, 0) : pCount;-
5523 pSub->pEList = sqlite3ExprListAppend(pParse, 0, pTerm);-
5524 pTerm = sqlite3PExpr(pParse, TK_SELECT, 0, 0);-
5525 sqlite3PExprAddSelect(pParse, pTerm, pSub);-
5526 if( pExpr==0 ){-
5527 pExpr = pTerm;-
5528 }else{-
5529 pExpr = sqlite3PExpr(pParse, TK_PLUS, pTerm, pExpr);-
5530 }-
5531 pSub = pPrior;-
5532 }-
5533 p->pEList->a[0].pExpr = pExpr;-
5534 p->selFlags &= ~SF_Aggregate;-
5535-
5536#if SELECTTRACE_ENABLED-
5537 if( sqlite3SelectTrace & 0x400 ){-
5538 SELECTTRACE(0x400,pParse,p,("After count-of-view optimization:\n"));-
5539 sqlite3TreeViewSelect(0, p, 0);-
5540 }-
5541#endif-
5542 return 1;-
5543}-
5544#endif /* SQLITE_COUNTOFVIEW_OPTIMIZATION */-
5545-
5546/*-
5547** Generate code for the SELECT statement given in the p argument. -
5548**-
5549** The results are returned according to the SelectDest structure.-
5550** See comments in sqliteInt.h for further information.-
5551**-
5552** This routine returns the number of errors. If any errors are-
5553** encountered, then an appropriate error message is left in-
5554** pParse->zErrMsg.-
5555**-
5556** This routine does NOT free the Select structure passed in. The-
5557** calling function needs to do that.-
5558*/-
5559int sqlite3Select(-
5560 Parse *pParse, /* The parser context */-
5561 Select *p, /* The SELECT statement being coded. */-
5562 SelectDest *pDest /* What to do with the query results */-
5563){-
5564 int i, j; /* Loop counters */-
5565 WhereInfo *pWInfo; /* Return from sqlite3WhereBegin() */-
5566 Vdbe *v; /* The virtual machine under construction */-
5567 int isAgg; /* True for select lists like "count(*)" */-
5568 ExprList *pEList = 0; /* List of columns to extract. */-
5569 SrcList *pTabList; /* List of tables to select from */-
5570 Expr *pWhere; /* The WHERE clause. May be NULL */-
5571 ExprList *pGroupBy; /* The GROUP BY clause. May be NULL */-
5572 Expr *pHaving; /* The HAVING clause. May be NULL */-
5573 int rc = 1; /* Value to return from this function */-
5574 DistinctCtx sDistinct; /* Info on how to code the DISTINCT keyword */-
5575 SortCtx sSort; /* Info on how to code the ORDER BY clause */-
5576 AggInfo sAggInfo; /* Information used by aggregate queries */-
5577 int iEnd; /* Address of the end of the query */-
5578 sqlite3 *db; /* The database connection */-
5579 ExprList *pMinMaxOrderBy = 0; /* Added ORDER BY for min/max queries */-
5580 u8 minMaxFlag; /* Flag for min/max queries */-
5581-
5582 db = pParse->db;-
5583 v = sqlite3GetVdbe(pParse);-
5584 if( p==0 || db->mallocFailed || pParse->nErr ){
p==0Description
TRUEevaluated 120 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 316827 times by 436 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
db->mallocFailedDescription
TRUEevaluated 50 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 316777 times by 436 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
pParse->nErrDescription
TRUEevaluated 48 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 316729 times by 436 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
48-316827
5585 return 1;
executed 218 times by 1 test: return 1;
Executed by:
  • Self test (438)
218
5586 }-
5587 if( sqlite3AuthCheck(pParse, SQLITE_SELECT, 0, 0, 0) ) return 1;
executed 3 times by 1 test: return 1;
Executed by:
  • Self test (438)
sqlite3AuthChe..., 21, 0, 0, 0)Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 316726 times by 436 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
3-316726
5588 memset(&sAggInfo, 0, sizeof(sAggInfo));-
5589#if SELECTTRACE_ENABLED-
5590 SELECTTRACE(1,pParse,p, ("begin processing:\n", pParse->addrExplain));-
5591 if( sqlite3SelectTrace & 0x100 ){-
5592 sqlite3TreeViewSelect(0, p, 0);-
5593 }-
5594#endif-
5595-
5596 assert( p->pOrderBy==0 || pDest->eDest!=SRT_DistFifo );-
5597 assert( p->pOrderBy==0 || pDest->eDest!=SRT_Fifo );-
5598 assert( p->pOrderBy==0 || pDest->eDest!=SRT_DistQueue );-
5599 assert( p->pOrderBy==0 || pDest->eDest!=SRT_Queue );-
5600 if( IgnorableOrderby(pDest) ){
((pDest->eDest)<=8)Description
TRUEevaluated 77056 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 239670 times by 436 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
77056-239670
5601 assert(pDest->eDest==SRT_Exists || pDest->eDest==SRT_Union || -
5602 pDest->eDest==SRT_Except || pDest->eDest==SRT_Discard ||-
5603 pDest->eDest==SRT_Queue || pDest->eDest==SRT_DistFifo ||-
5604 pDest->eDest==SRT_DistQueue || pDest->eDest==SRT_Fifo);-
5605 /* If ORDER BY makes no difference in the output then neither does-
5606 ** DISTINCT so it can be removed too. */-
5607 sqlite3ExprListDelete(db, p->pOrderBy);-
5608 p->pOrderBy = 0;-
5609 p->selFlags &= ~SF_Distinct;-
5610 }
executed 77056 times by 1 test: end of block
Executed by:
  • Self test (438)
77056
5611 sqlite3SelectPrep(pParse, p, 0);-
5612 if( pParse->nErr || db->mallocFailed ){
pParse->nErrDescription
TRUEevaluated 1007 times by 6 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
  • Self test (61)
  • Self test (78)
  • Self test (80)
  • Self test (82)
FALSEevaluated 315719 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
db->mallocFailedDescription
TRUEevaluated 466 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 315253 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
466-315719
5613 goto select_end;
executed 1473 times by 6 tests: goto select_end;
Executed by:
  • Self test (438)
  • Self test (47)
  • Self test (61)
  • Self test (78)
  • Self test (80)
  • Self test (82)
1473
5614 }-
5615 assert( p->pEList!=0 );-
5616#if SELECTTRACE_ENABLED-
5617 if( sqlite3SelectTrace & 0x104 ){-
5618 SELECTTRACE(0x104,pParse,p, ("after name resolution:\n"));-
5619 sqlite3TreeViewSelect(0, p, 0);-
5620 }-
5621#endif-
5622-
5623 if( pDest->eDest==SRT_Output ){
pDest->eDest==9Description
TRUEevaluated 180311 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 134942 times by 9 tests
Evaluated by:
  • Self test
  • Self test (101)
  • Self test (32)
  • Self test (33)
  • Self test (34)
  • Self test (438)
  • Self test (57)
  • Self test (58)
  • Self test (64)
134942-180311
5624 generateColumnNames(pParse, p);-
5625 }
executed 180311 times by 435 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
180311
5626-
5627#ifndef SQLITE_OMIT_WINDOWFUNC-
5628 if( sqlite3WindowRewrite(pParse, p) ){
sqlite3WindowR...ite(pParse, p)Description
TRUEnever evaluated
FALSEevaluated 315253 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
0-315253
5629 goto select_end;
never executed: goto select_end;
0
5630 }-
5631#if SELECTTRACE_ENABLED-
5632 if( sqlite3SelectTrace & 0x108 ){-
5633 SELECTTRACE(0x104,pParse,p, ("after window rewrite:\n"));-
5634 sqlite3TreeViewSelect(0, p, 0);-
5635 }-
5636#endif-
5637#endif /* SQLITE_OMIT_WINDOWFUNC */-
5638 pTabList = p->pSrc;-
5639 isAgg = (p->selFlags & SF_Aggregate)!=0;-
5640 memset(&sSort, 0, sizeof(sSort));-
5641 sSort.pOrderBy = p->pOrderBy;-
5642-
5643 /* Try to various optimizations (flattening subqueries, and strength-
5644 ** reduction of join operators) in the FROM clause up into the main query-
5645 */-
5646#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW)-
5647 for(i=0; !p->pPrior && i<pTabList->nSrc; i++){
!p->pPriorDescription
TRUEevaluated 601030 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 39352 times by 1 test
Evaluated by:
  • Self test (438)
i<pTabList->nSrcDescription
TRUEevaluated 325205 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 275825 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
39352-601030
5648 struct SrcList_item *pItem = &pTabList->a[i];-
5649 Select *pSub = pItem->pSelect;-
5650 Table *pTab = pItem->pTab;-
5651-
5652 /* Convert LEFT JOIN into JOIN if there are terms of the right table-
5653 ** of the LEFT JOIN used in the WHERE clause.-
5654 */-
5655 if( (pItem->fg.jointype & JT_LEFT)!=0
(pItem->fg.joi...e & 0x0008)!=0Description
TRUEevaluated 520 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 324685 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
520-324685
5656 && sqlite3ExprImpliesNonNullRow(p->pWhere, pItem->iCursor)
sqlite3ExprImp...Item->iCursor)Description
TRUEevaluated 34 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 486 times by 1 test
Evaluated by:
  • Self test (438)
34-486
5657 && OptimizationEnabled(db, SQLITE_SimplifyJoin)
(((db)->dbOptF...&(0x2000))==0)Description
TRUEevaluated 33 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test (438)
1-33
5658 ){-
5659 SELECTTRACE(0x100,pParse,p,-
5660 ("LEFT-JOIN simplifies to JOIN on term %d\n",i));-
5661 pItem->fg.jointype &= ~(JT_LEFT|JT_OUTER);-
5662 unsetJoinExpr(p->pWhere, pItem->iCursor);-
5663 }
executed 33 times by 1 test: end of block
Executed by:
  • Self test (438)
33
5664-
5665 /* No futher action if this term of the FROM clause is no a subquery */-
5666 if( pSub==0 ) continue;
executed 254257 times by 435 tests: continue;
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
pSub==0Description
TRUEevaluated 254257 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 70948 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
70948-254257
5667-
5668 /* Catch mismatch in the declared columns of a view and the number of-
5669 ** columns in the SELECT on the RHS */-
5670 if( pTab->nCol!=pSub->pEList->nExpr ){
pTab->nCol!=pS...>pEList->nExprDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 70946 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
2-70946
5671 sqlite3ErrorMsg(pParse, "expected %d columns for '%s' but got %d",-
5672 pTab->nCol, pTab->zName, pSub->pEList->nExpr);-
5673 goto select_end;
executed 2 times by 1 test: goto select_end;
Executed by:
  • Self test (438)
2
5674 }-
5675-
5676 /* Do not try to flatten an aggregate subquery.-
5677 **-
5678 ** Flattening an aggregate subquery is only possible if the outer query-
5679 ** is not a join. But if the outer query is not a join, then the subquery-
5680 ** will be implemented as a co-routine and there is no advantage to-
5681 ** flattening in that case.-
5682 */-
5683 if( (pSub->selFlags & SF_Aggregate)!=0 ) continue;
executed 105 times by 1 test: continue;
Executed by:
  • Self test (438)
(pSub->selFlags & 0x00008)!=0Description
TRUEevaluated 105 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 70841 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
105-70841
5684 assert( pSub->pGroupBy==0 );-
5685-
5686 /* If the outer query contains a "complex" result set (that is,-
5687 ** if the result set of the outer query uses functions or subqueries)-
5688 ** and if the subquery contains an ORDER BY clause and if-
5689 ** it will be implemented as a co-routine, then do not flatten. This-
5690 ** restriction allows SQL constructs like this:-
5691 **-
5692 ** SELECT expensive_function(x)-
5693 ** FROM (SELECT x FROM tab ORDER BY y LIMIT 10);-
5694 **-
5695 ** The expensive_function() is only computed on the 10 rows that-
5696 ** are output, rather than every row of the table.-
5697 **-
5698 ** The requirement that the outer query have a complex result set-
5699 ** means that flattening does occur on simpler SQL constraints without-
5700 ** the expensive_function() like:-
5701 **-
5702 ** SELECT x FROM (SELECT x FROM tab ORDER BY y LIMIT 10);-
5703 */-
5704 if( pSub->pOrderBy!=0
pSub->pOrderBy!=0Description
TRUEevaluated 1910 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 68931 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
1910-68931
5705 && i==0
i==0Description
TRUEevaluated 1906 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 4 times by 1 test
Evaluated by:
  • Self test (438)
4-1906
5706 && (p->selFlags & SF_ComplexResult)!=0
(p->selFlags & 0x40000)!=0Description
TRUEevaluated 1623 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 283 times by 1 test
Evaluated by:
  • Self test (438)
283-1623
5707 && (pTabList->nSrc==1
pTabList->nSrc==1Description
TRUEevaluated 1623 times by 1 test
Evaluated by:
  • Self test (438)
FALSEnever evaluated
0-1623
5708 || (pTabList->a[1].fg.jointype&(JT_LEFT|JT_CROSS))!=0)
(pTabList->a[1...08|0x0002))!=0Description
TRUEnever evaluated
FALSEnever evaluated
0
5709 ){-
5710 continue;
executed 1623 times by 1 test: continue;
Executed by:
  • Self test (438)
1623
5711 }-
5712-
5713 if( flattenSubquery(pParse, p, i, isAgg) ){
flattenSubquer..., p, i, isAgg)Description
TRUEevaluated 35366 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
FALSEevaluated 33852 times by 1 test
Evaluated by:
  • Self test (438)
33852-35366
5714 /* This subquery can be absorbed into its parent. */-
5715 i = -1;-
5716 }
executed 35366 times by 2 tests: end of block
Executed by:
  • Self test (438)
  • Self test (47)
35366
5717 pTabList = p->pSrc;-
5718 if( db->mallocFailed ) goto select_end;
executed 74 times by 1 test: goto select_end;
Executed by:
  • Self test (438)
db->mallocFailedDescription
TRUEevaluated 74 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 69144 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
74-69144
5719 if( !IgnorableOrderby(pDest) ){
!((pDest->eDest)<=8)Description
TRUEevaluated 3551 times by 2 tests
Evaluated by:
  • Self test (438)
  • Self test (47)
FALSEevaluated 65593 times by 1 test
Evaluated by:
  • Self test (438)
3551-65593
5720 sSort.pOrderBy = p->pOrderBy;-
5721 }
executed 3551 times by 2 tests: end of block
Executed by:
  • Self test (438)
  • Self test (47)
3551
5722 }
executed 69144 times by 2 tests: end of block
Executed by:
  • Self test (438)
  • Self test (47)
69144
5723#endif-
5724-
5725#ifndef SQLITE_OMIT_COMPOUND_SELECT-
5726 /* Handle compound SELECT statements using the separate multiSelect()-
5727 ** procedure.-
5728 */-
5729 if( p->pPrior ){
p->pPriorDescription
TRUEevaluated 39352 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 275825 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
39352-275825
5730 rc = multiSelect(pParse, p, pDest);-
5731#if SELECTTRACE_ENABLED-
5732 SELECTTRACE(0x1,pParse,p,("end compound-select processing\n"));-
5733 if( (sqlite3SelectTrace & 0x2000)!=0 && ExplainQueryPlanParent(pParse)==0 ){-
5734 sqlite3TreeViewSelect(0, p, 0);-
5735 }-
5736#endif-
5737 if( p->pNext==0 ) ExplainQueryPlanPop(pParse);
executed 38428 times by 1 test: sqlite3VdbeExplainPop(pParse);
Executed by:
  • Self test (438)
p->pNext==0Description
TRUEevaluated 38428 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 924 times by 1 test
Evaluated by:
  • Self test (438)
924-38428
5738 return rc;
executed 39352 times by 1 test: return rc;
Executed by:
  • Self test (438)
39352
5739 }-
5740#endif-
5741-
5742 /* Do the WHERE-clause constant propagation optimization if this is-
5743 ** a join. No need to speed time on this operation for non-join queries-
5744 ** as the equivalent optimization will be handled by query planner in-
5745 ** sqlite3WhereBegin().-
5746 */-
5747 if( pTabList->nSrc>1
pTabList->nSrc>1Description
TRUEevaluated 6929 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 268896 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
6929-268896
5748 && OptimizationEnabled(db, SQLITE_PropagateConst)
(((db)->dbOptF...&(0x8000))==0)Description
TRUEevaluated 6924 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 5 times by 1 test
Evaluated by:
  • Self test (438)
5-6924
5749 && propagateConstants(pParse, p)
propagateConstants(pParse, p)Description
TRUEevaluated 47 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 6877 times by 1 test
Evaluated by:
  • Self test (438)
47-6877
5750 ){-
5751#if SELECTTRACE_ENABLED-
5752 if( sqlite3SelectTrace & 0x100 ){-
5753 SELECTTRACE(0x100,pParse,p,("After constant propagation:\n"));-
5754 sqlite3TreeViewSelect(0, p, 0);-
5755 }-
5756#endif-
5757 }else{
executed 47 times by 1 test: end of block
Executed by:
  • Self test (438)
47
5758 SELECTTRACE(0x100,pParse,p,("Constant propagation not helpful\n"));-
5759 }
executed 275778 times by 435 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
275778
5760-
5761#ifdef SQLITE_COUNTOFVIEW_OPTIMIZATION-
5762 if( OptimizationEnabled(db, SQLITE_QueryFlattener|SQLITE_CountOfView)-
5763 && countOfViewOptimization(pParse, p)-
5764 ){-
5765 if( db->mallocFailed ) goto select_end;-
5766 pEList = p->pEList;-
5767 pTabList = p->pSrc;-
5768 }-
5769#endif-
5770-
5771 /* For each term in the FROM clause, do two things:-
5772 ** (1) Authorized unreferenced tables-
5773 ** (2) Generate code for all sub-queries-
5774 */-
5775 for(i=0; i<pTabList->nSrc; i++){
i<pTabList->nSrcDescription
TRUEevaluated 289689 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 275801 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
275801-289689
5776 struct SrcList_item *pItem = &pTabList->a[i];-
5777 SelectDest dest;-
5778 Select *pSub;-
5779#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW)-
5780 const char *zSavedAuthContext;-
5781#endif-
5782-
5783 /* Issue SQLITE_READ authorizations with a fake column name for any-
5784 ** tables that are referenced but from which no values are extracted.-
5785 ** Examples of where these kinds of null SQLITE_READ authorizations-
5786 ** would occur:-
5787 **-
5788 ** SELECT count(*) FROM t1; -- SQLITE_READ t1.""-
5789 ** SELECT t1.* FROM t1, t2; -- SQLITE_READ t2.""-
5790 **-
5791 ** The fake column name is an empty string. It is possible for a table to-
5792 ** have a column named by the empty string, in which case there is no way to-
5793 ** distinguish between an unreferenced table and an actual reference to the-
5794 ** "" column. The original design was for the fake column name to be a NULL,-
5795 ** which would be unambiguous. But legacy authorization callbacks might-
5796 ** assume the column name is non-NULL and segfault. The use of an empty-
5797 ** string for the fake column name seems safer.-
5798 */-
5799 if( pItem->colUsed==0 ){
pItem->colUsed==0Description
TRUEevaluated 78083 times by 7 tests
Evaluated by:
  • Self test (103)
  • Self test (104)
  • Self test (32)
  • Self test (33)
  • Self test (34)
  • Self test (438)
  • Self test (64)
FALSEevaluated 211606 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
78083-211606
5800 sqlite3AuthCheck(pParse, SQLITE_READ, pItem->zName, "", pItem->zDatabase);-
5801 }
executed 78083 times by 7 tests: end of block
Executed by:
  • Self test (103)
  • Self test (104)
  • Self test (32)
  • Self test (33)
  • Self test (34)
  • Self test (438)
  • Self test (64)
78083
5802-
5803#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW)-
5804 /* Generate code for all sub-queries in the FROM clause-
5805 */-
5806 pSub = pItem->pSelect;-
5807 if( pSub==0 ) continue;
executed 254127 times by 435 tests: continue;
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
pSub==0Description
TRUEevaluated 254127 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 35562 times by 1 test
Evaluated by:
  • Self test (438)
35562-254127
5808-
5809 /* Sometimes the code for a subquery will be generated more than-
5810 ** once, if the subquery is part of the WHERE clause in a LEFT JOIN,-
5811 ** for example. In that case, do not regenerate the code to manifest-
5812 ** a view or the co-routine to implement a view. The first instance-
5813 ** is sufficient, though the subroutine to manifest the view does need-
5814 ** to be invoked again. */-
5815 if( pItem->addrFillSub ){
pItem->addrFillSubDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 35561 times by 1 test
Evaluated by:
  • Self test (438)
1-35561
5816 if( pItem->fg.viaCoroutine==0 ){
pItem->fg.viaCoroutine==0Description
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test (438)
0-1
5817 /* The subroutine that manifests the view might be a one-time routine,-
5818 ** or it might need to be rerun on each iteration because it-
5819 ** encodes a correlated subquery. */-
5820 testcase( sqlite3VdbeGetOp(v, pItem->addrFillSub)->opcode==OP_Once );-
5821 sqlite3VdbeAddOp2(v, OP_Gosub, pItem->regReturn, pItem->addrFillSub);-
5822 }
never executed: end of block
0
5823 continue;
executed 1 time by 1 test: continue;
Executed by:
  • Self test (438)
1
5824 }-
5825-
5826 /* Increment Parse.nHeight by the height of the largest expression-
5827 ** tree referred to by this, the parent select. The child select-
5828 ** may contain expression trees of at most-
5829 ** (SQLITE_MAX_EXPR_DEPTH-Parse.nHeight) height. This is a bit-
5830 ** more conservative than necessary, but much easier than enforcing-
5831 ** an exact limit.-
5832 */-
5833 pParse->nHeight += sqlite3SelectExprHeight(p);-
5834-
5835 /* Make copies of constant WHERE-clause terms in the outer query down-
5836 ** inside the subquery. This can help the subquery to run more efficiently.-
5837 */-
5838 if( OptimizationEnabled(db, SQLITE_PushDown)
(((db)->dbOptF...&(0x1000))==0)Description
TRUEevaluated 35551 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 10 times by 1 test
Evaluated by:
  • Self test (438)
10-35551
5839 && pushDownWhereTerms(pParse, pSub, p->pWhere, pItem->iCursor,
pushDownWhereT... & 0x0020)!=0)Description
TRUEevaluated 52 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 35499 times by 1 test
Evaluated by:
  • Self test (438)
52-35499
5840 (pItem->fg.jointype & JT_OUTER)!=0)
pushDownWhereT... & 0x0020)!=0)Description
TRUEevaluated 52 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 35499 times by 1 test
Evaluated by:
  • Self test (438)
52-35499
5841 ){-
5842#if SELECTTRACE_ENABLED-
5843 if( sqlite3SelectTrace & 0x100 ){-
5844 SELECTTRACE(0x100,pParse,p,-
5845 ("After WHERE-clause push-down into subquery %d:\n", pSub->selId));-
5846 sqlite3TreeViewSelect(0, p, 0);-
5847 }-
5848#endif-
5849 }else{
executed 52 times by 1 test: end of block
Executed by:
  • Self test (438)
52
5850 SELECTTRACE(0x100,pParse,p,("Push-down not possible\n"));-
5851 }
executed 35509 times by 1 test: end of block
Executed by:
  • Self test (438)
35509
5852-
5853 zSavedAuthContext = pParse->zAuthContext;-
5854 pParse->zAuthContext = pItem->zName;-
5855-
5856 /* Generate code to implement the subquery-
5857 **-
5858 ** The subquery is implemented as a co-routine if the subquery is-
5859 ** guaranteed to be the outer loop (so that it does not need to be-
5860 ** computed more than once)-
5861 **-
5862 ** TODO: Are there other reasons beside (1) to use a co-routine-
5863 ** implementation?-
5864 */-
5865 if( i==0
i==0Description
TRUEevaluated 35448 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 113 times by 1 test
Evaluated by:
  • Self test (438)
113-35448
5866 && (pTabList->nSrc==1
pTabList->nSrc==1Description
TRUEevaluated 35396 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 52 times by 1 test
Evaluated by:
  • Self test (438)
52-35396
5867 || (pTabList->a[1].fg.jointype&(JT_LEFT|JT_CROSS))!=0) /* (1) */
(pTabList->a[1...08|0x0002))!=0Description
TRUEevaluated 10 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 42 times by 1 test
Evaluated by:
  • Self test (438)
10-42
5868 ){-
5869 /* Implement a co-routine that will return a single row of the result-
5870 ** set on each invocation.-
5871 */-
5872 int addrTop = sqlite3VdbeCurrentAddr(v)+1;-
5873 -
5874 pItem->regReturn = ++pParse->nMem;-
5875 sqlite3VdbeAddOp3(v, OP_InitCoroutine, pItem->regReturn, 0, addrTop);-
5876 VdbeComment((v, "%s", pItem->pTab->zName));-
5877 pItem->addrFillSub = addrTop;-
5878 sqlite3SelectDestInit(&dest, SRT_Coroutine, pItem->regReturn);-
5879 ExplainQueryPlan((pParse, 1, "CO-ROUTINE %u", pSub->selId));-
5880 sqlite3Select(pParse, pSub, &dest);-
5881 pItem->pTab->nRowLogEst = pSub->nSelectRow;-
5882 pItem->fg.viaCoroutine = 1;-
5883 pItem->regResult = dest.iSdst;-
5884 sqlite3VdbeEndCoroutine(v, pItem->regReturn);-
5885 sqlite3VdbeJumpHere(v, addrTop-1);-
5886 sqlite3ClearTempRegCache(pParse);-
5887 }else{
executed 35406 times by 1 test: end of block
Executed by:
  • Self test (438)
35406
5888 /* Generate a subroutine that will fill an ephemeral table with-
5889 ** the content of this subquery. pItem->addrFillSub will point-
5890 ** to the address of the generated subroutine. pItem->regReturn-
5891 ** is a register allocated to hold the subroutine return address-
5892 */-
5893 int topAddr;-
5894 int onceAddr = 0;-
5895 int retAddr;-
5896 struct SrcList_item *pPrior;-
5897-
5898 assert( pItem->addrFillSub==0 );-
5899 pItem->regReturn = ++pParse->nMem;-
5900 topAddr = sqlite3VdbeAddOp2(v, OP_Integer, 0, pItem->regReturn);-
5901 pItem->addrFillSub = topAddr+1;-
5902 if( pItem->fg.isCorrelated==0 ){
pItem->fg.isCorrelated==0Description
TRUEevaluated 154 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test (438)
1-154
5903 /* If the subquery is not correlated and if we are not inside of-
5904 ** a trigger, then we only need to compute the value of the subquery-
5905 ** once. */-
5906 onceAddr = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v);-
5907 VdbeComment((v, "materialize \"%s\"", pItem->pTab->zName));-
5908 }else{
executed 154 times by 1 test: end of block
Executed by:
  • Self test (438)
154
5909 VdbeNoopComment((v, "materialize \"%s\"", pItem->pTab->zName));-
5910 }
executed 1 time by 1 test: end of block
Executed by:
  • Self test (438)
1
5911 pPrior = isSelfJoinView(pTabList, pItem);-
5912 if( pPrior ){
pPriorDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 153 times by 1 test
Evaluated by:
  • Self test (438)
2-153
5913 sqlite3VdbeAddOp2(v, OP_OpenDup, pItem->iCursor, pPrior->iCursor);-
5914 assert( pPrior->pSelect!=0 );-
5915 pSub->nSelectRow = pPrior->pSelect->nSelectRow;-
5916 }else{
executed 2 times by 1 test: end of block
Executed by:
  • Self test (438)
2
5917 sqlite3SelectDestInit(&dest, SRT_EphemTab, pItem->iCursor);-
5918 ExplainQueryPlan((pParse, 1, "MATERIALIZE %u", pSub->selId));-
5919 sqlite3Select(pParse, pSub, &dest);-
5920 }
executed 153 times by 1 test: end of block
Executed by:
  • Self test (438)
153
5921 pItem->pTab->nRowLogEst = pSub->nSelectRow;-
5922 if( onceAddr ) sqlite3VdbeJumpHere(v, onceAddr);
executed 154 times by 1 test: sqlite3VdbeJumpHere(v, onceAddr);
Executed by:
  • Self test (438)
onceAddrDescription
TRUEevaluated 154 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test (438)
1-154
5923 retAddr = sqlite3VdbeAddOp1(v, OP_Return, pItem->regReturn);-
5924 VdbeComment((v, "end %s", pItem->pTab->zName));-
5925 sqlite3VdbeChangeP1(v, topAddr, retAddr);-
5926 sqlite3ClearTempRegCache(pParse);-
5927 }
executed 155 times by 1 test: end of block
Executed by:
  • Self test (438)
155
5928 if( db->mallocFailed ) goto select_end;
executed 24 times by 1 test: goto select_end;
Executed by:
  • Self test (438)
db->mallocFailedDescription
TRUEevaluated 24 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 35537 times by 1 test
Evaluated by:
  • Self test (438)
24-35537
5929 pParse->nHeight -= sqlite3SelectExprHeight(p);-
5930 pParse->zAuthContext = zSavedAuthContext;-
5931#endif-
5932 }
executed 35537 times by 1 test: end of block
Executed by:
  • Self test (438)
35537
5933-
5934 /* Various elements of the SELECT copied into local variables for-
5935 ** convenience */-
5936 pEList = p->pEList;-
5937 pWhere = p->pWhere;-
5938 pGroupBy = p->pGroupBy;-
5939 pHaving = p->pHaving;-
5940 sDistinct.isTnct = (p->selFlags & SF_Distinct)!=0;-
5941-
5942#if SELECTTRACE_ENABLED-
5943 if( sqlite3SelectTrace & 0x400 ){-
5944 SELECTTRACE(0x400,pParse,p,("After all FROM-clause analysis:\n"));-
5945 sqlite3TreeViewSelect(0, p, 0);-
5946 }-
5947#endif-
5948-
5949 /* If the query is DISTINCT with an ORDER BY but is not an aggregate, and -
5950 ** if the select-list is the same as the ORDER BY list, then this query-
5951 ** can be rewritten as a GROUP BY. In other words, this:-
5952 **-
5953 ** SELECT DISTINCT xyz FROM ... ORDER BY xyz-
5954 **-
5955 ** is transformed to:-
5956 **-
5957 ** SELECT xyz FROM ... GROUP BY xyz ORDER BY xyz-
5958 **-
5959 ** The second form is preferred as a single index (or temp-table) may be -
5960 ** used for both the ORDER BY and DISTINCT processing. As originally -
5961 ** written the query must use a temp-table for at least one of the ORDER -
5962 ** BY and DISTINCT, and an index or separate temp-table for the other.-
5963 */-
5964 if( (p->selFlags & (SF_Distinct|SF_Aggregate))==SF_Distinct
(p->selFlags &...008))==0x00001Description
TRUEevaluated 351 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 275450 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
351-275450
5965 && sqlite3ExprListCompare(sSort.pOrderBy, pEList, -1)==0
sqlite3ExprLis...pEList, -1)==0Description
TRUEevaluated 87 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 264 times by 1 test
Evaluated by:
  • Self test (438)
87-264
5966 ){-
5967 p->selFlags &= ~SF_Distinct;-
5968 pGroupBy = p->pGroupBy = sqlite3ExprListDup(db, pEList, 0);-
5969 /* Notice that even thought SF_Distinct has been cleared from p->selFlags,-
5970 ** the sDistinct.isTnct is still set. Hence, isTnct represents the-
5971 ** original setting of the SF_Distinct flag, not the current setting */-
5972 assert( sDistinct.isTnct );-
5973-
5974#if SELECTTRACE_ENABLED-
5975 if( sqlite3SelectTrace & 0x400 ){-
5976 SELECTTRACE(0x400,pParse,p,("Transform DISTINCT into GROUP BY:\n"));-
5977 sqlite3TreeViewSelect(0, p, 0);-
5978 }-
5979#endif-
5980 }
executed 87 times by 1 test: end of block
Executed by:
  • Self test (438)
87
5981-
5982 /* If there is an ORDER BY clause, then create an ephemeral index to-
5983 ** do the sorting. But this sorting ephemeral index might end up-
5984 ** being unused if the data can be extracted in pre-sorted order.-
5985 ** If that is the case, then the OP_OpenEphemeral instruction will be-
5986 ** changed to an OP_Noop once we figure out that the sorting index is-
5987 ** not needed. The sSort.addrSortIndex variable is used to facilitate-
5988 ** that change.-
5989 */-
5990 if( sSort.pOrderBy ){
sSort.pOrderByDescription
TRUEevaluated 59933 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 215868 times by 68 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (12)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (16)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (20)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (24)
  • Self test (26)
  • Self test (27)
  • Self test (28)
  • Self test (29)
  • ...
59933-215868
5991 KeyInfo *pKeyInfo;-
5992 pKeyInfo = sqlite3KeyInfoFromExprList(-
5993 pParse, sSort.pOrderBy, 0, pEList->nExpr);-
5994 sSort.iECursor = pParse->nTab++;-
5995 sSort.addrSortIndex =-
5996 sqlite3VdbeAddOp4(v, OP_OpenEphemeral,-
5997 sSort.iECursor, sSort.pOrderBy->nExpr+1+pEList->nExpr, 0,-
5998 (char*)pKeyInfo, P4_KEYINFO-
5999 );-
6000 }else{
executed 59933 times by 435 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
59933
6001 sSort.addrSortIndex = -1;-
6002 }
executed 215868 times by 68 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (12)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (16)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (20)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (24)
  • Self test (26)
  • Self test (27)
  • Self test (28)
  • Self test (29)
  • ...
215868
6003-
6004 /* If the output is destined for a temporary table, open that table.-
6005 */-
6006 if( pDest->eDest==SRT_EphemTab ){
pDest->eDest==12Description
TRUEevaluated 928 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 274873 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
928-274873
6007 sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pDest->iSDParm, pEList->nExpr);-
6008 }
executed 928 times by 1 test: end of block
Executed by:
  • Self test (438)
928
6009-
6010 /* Set the limiter.-
6011 */-
6012 iEnd = sqlite3VdbeMakeLabel(v);-
6013 if( (p->selFlags & SF_FixedLimit)==0 ){
(p->selFlags & 0x04000)==0Description
TRUEevaluated 274878 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 923 times by 1 test
Evaluated by:
  • Self test (438)
923-274878
6014 p->nSelectRow = 320; /* 4 billion rows */-
6015 }
executed 274878 times by 435 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
274878
6016 computeLimitRegisters(pParse, p, iEnd);-
6017 if( p->iLimit==0 && sSort.addrSortIndex>=0 ){
p->iLimit==0Description
TRUEevaluated 259041 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 16760 times by 1 test
Evaluated by:
  • Self test (438)
sSort.addrSortIndex>=0Description
TRUEevaluated 59024 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 200017 times by 68 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (12)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (16)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (20)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (24)
  • Self test (26)
  • Self test (27)
  • Self test (28)
  • Self test (29)
  • ...
16760-259041
6018 sqlite3VdbeChangeOpcode(v, sSort.addrSortIndex, OP_SorterOpen);-
6019 sSort.sortFlags |= SORTFLAG_UseSorter;-
6020 }
executed 59024 times by 435 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
59024
6021-
6022 /* Open an ephemeral index to use for the distinct set.-
6023 */-
6024 if( p->selFlags & SF_Distinct ){
p->selFlags & 0x00001Description
TRUEevaluated 291 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 275510 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
291-275510
6025 sDistinct.tabTnct = pParse->nTab++;-
6026 sDistinct.addrTnct = sqlite3VdbeAddOp4(v, OP_OpenEphemeral,-
6027 sDistinct.tabTnct, 0, 0,-
6028 (char*)sqlite3KeyInfoFromExprList(pParse, p->pEList,0,0),-
6029 P4_KEYINFO);-
6030 sqlite3VdbeChangeP5(v, BTREE_UNORDERED);-
6031 sDistinct.eTnctType = WHERE_DISTINCT_UNORDERED;-
6032 }else{
executed 291 times by 1 test: end of block
Executed by:
  • Self test (438)
291
6033 sDistinct.eTnctType = WHERE_DISTINCT_NOOP;-
6034 }
executed 275510 times by 435 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
275510
6035-
6036 if( !isAgg && pGroupBy==0 ){
!isAggDescription
TRUEevaluated 251200 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 24601 times by 4 tests
Evaluated by:
  • Self test (103)
  • Self test (104)
  • Self test (34)
  • Self test (438)
pGroupBy==0Description
TRUEevaluated 251113 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 87 times by 1 test
Evaluated by:
  • Self test (438)
87-251200
6037 /* No aggregate functions and no GROUP BY clause */-
6038 u16 wctrlFlags = (sDistinct.isTnct ? WHERE_WANT_DISTINCT : 0)
sDistinct.isTnctDescription
TRUEevaluated 264 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 250849 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
264-250849
6039 | (p->selFlags & SF_FixedLimit);-
6040#ifndef SQLITE_OMIT_WINDOWFUNC-
6041 Window *pWin = p->pWin; /* Master window object (or NULL) */-
6042 if( pWin ){
pWinDescription
TRUEevaluated 1809 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 249304 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
1809-249304
6043 sqlite3WindowCodeInit(pParse, pWin);-
6044 }
executed 1809 times by 1 test: end of block
Executed by:
  • Self test (438)
1809
6045#endif-
6046 assert( WHERE_USE_LIMIT==SF_FixedLimit );-
6047-
6048-
6049 /* Begin the database scan. */-
6050 SELECTTRACE(1,pParse,p,("WhereBegin\n"));-
6051 pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, sSort.pOrderBy,-
6052 p->pEList, wctrlFlags, p->nSelectRow);-
6053 if( pWInfo==0 ) goto select_end;
executed 686 times by 1 test: goto select_end;
Executed by:
  • Self test (438)
pWInfo==0Description
TRUEevaluated 686 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 250427 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
686-250427
6054 if( sqlite3WhereOutputRowCount(pWInfo) < p->nSelectRow ){
sqlite3WhereOu... p->nSelectRowDescription
TRUEevaluated 238859 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 11568 times by 1 test
Evaluated by:
  • Self test (438)
11568-238859
6055 p->nSelectRow = sqlite3WhereOutputRowCount(pWInfo);-
6056 }
executed 238859 times by 435 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
238859
6057 if( sDistinct.isTnct && sqlite3WhereIsDistinct(pWInfo) ){
sDistinct.isTnctDescription
TRUEevaluated 262 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 250165 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
sqlite3WhereIsDistinct(pWInfo)Description
TRUEevaluated 86 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 176 times by 1 test
Evaluated by:
  • Self test (438)
86-250165
6058 sDistinct.eTnctType = sqlite3WhereIsDistinct(pWInfo);-
6059 }
executed 86 times by 1 test: end of block
Executed by:
  • Self test (438)
86
6060 if( sSort.pOrderBy ){
sSort.pOrderByDescription
TRUEevaluated 57793 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 192634 times by 67 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (101)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (12)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (16)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (20)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (24)
  • Self test (26)
  • Self test (27)
  • Self test (28)
  • Self test (29)
  • Self test (3)
  • ...
57793-192634
6061 sSort.nOBSat = sqlite3WhereIsOrdered(pWInfo);-
6062 sSort.labelOBLopt = sqlite3WhereOrderByLimitOptLabel(pWInfo);-
6063 if( sSort.nOBSat==sSort.pOrderBy->nExpr ){
sSort.nOBSat==...OrderBy->nExprDescription
TRUEevaluated 44753 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 13040 times by 1 test
Evaluated by:
  • Self test (438)
13040-44753
6064 sSort.pOrderBy = 0;-
6065 }
executed 44753 times by 435 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
44753
6066 }
executed 57793 times by 435 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
57793
6067-
6068 /* If sorting index that was created by a prior OP_OpenEphemeral -
6069 ** instruction ended up not being needed, then change the OP_OpenEphemeral-
6070 ** into an OP_Noop.-
6071 */-
6072 if( sSort.addrSortIndex>=0 && sSort.pOrderBy==0 ){
sSort.addrSortIndex>=0Description
TRUEevaluated 57793 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 192634 times by 67 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (101)
  • Self test (104)
  • Self test (105)
  • Self test (11)
  • Self test (12)
  • Self test (13)
  • Self test (14)
  • Self test (15)
  • Self test (16)
  • Self test (17)
  • Self test (18)
  • Self test (19)
  • Self test (2)
  • Self test (20)
  • Self test (21)
  • Self test (22)
  • Self test (23)
  • Self test (24)
  • Self test (26)
  • Self test (27)
  • Self test (28)
  • Self test (29)
  • Self test (3)
  • ...
sSort.pOrderBy==0Description
TRUEevaluated 44753 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
FALSEevaluated 13040 times by 1 test
Evaluated by:
  • Self test (438)
13040-192634
6073 sqlite3VdbeChangeToNoop(v, sSort.addrSortIndex);-
6074 }
executed 44753 times by 435 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
44753
6075-
6076 assert( p->pEList==pEList );-
6077#ifndef SQLITE_OMIT_WINDOWFUNC-
6078 if( pWin ){
pWinDescription
TRUEevaluated 1809 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 248618 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
1809-248618
6079 int addrGosub = sqlite3VdbeMakeLabel(v);-
6080 int iCont = sqlite3VdbeMakeLabel(v);-
6081 int iBreak = sqlite3VdbeMakeLabel(v);-
6082 int regGosub = ++pParse->nMem;-
6083-
6084 sqlite3WindowCodeStep(pParse, p, pWInfo, regGosub, addrGosub);-
6085-
6086 sqlite3VdbeAddOp2(v, OP_Goto, 0, iBreak);-
6087 sqlite3VdbeResolveLabel(v, addrGosub);-
6088 VdbeNoopComment((v, "inner-loop subroutine"));-
6089 sSort.labelOBLopt = 0;-
6090 selectInnerLoop(pParse, p, -1, &sSort, &sDistinct, pDest, iCont, iBreak);-
6091 sqlite3VdbeResolveLabel(v, iCont);-
6092 sqlite3VdbeAddOp1(v, OP_Return, regGosub);-
6093 VdbeComment((v, "end inner-loop subroutine"));-
6094 sqlite3VdbeResolveLabel(v, iBreak);-
6095 }else
executed 1809 times by 1 test: end of block
Executed by:
  • Self test (438)
1809
6096#endif /* SQLITE_OMIT_WINDOWFUNC */-
6097 {-
6098 /* Use the standard inner loop. */-
6099 selectInnerLoop(pParse, p, -1, &sSort, &sDistinct, pDest,-
6100 sqlite3WhereContinueLabel(pWInfo),-
6101 sqlite3WhereBreakLabel(pWInfo));-
6102-
6103 /* End the database scan loop.-
6104 */-
6105 sqlite3WhereEnd(pWInfo);-
6106 }
executed 248618 times by 435 tests: end of block
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
248618
6107 }else{-
6108 /* This case when there exist aggregate functions or a GROUP BY clause-
6109 ** or both */-
6110 NameContext sNC; /* Name context for processing aggregate information */-
6111 int iAMem; /* First Mem address for storing current GROUP BY */-
6112 int iBMem; /* First Mem address for previous GROUP BY */-
6113 int iUseFlag; /* Mem address holding flag indicating that at least-
6114 ** one row of the input to the aggregator has been-
6115 ** processed */-
6116 int iAbortFlag; /* Mem address which causes query abort if positive */-
6117 int groupBySort; /* Rows come from source in GROUP BY order */-
6118 int addrEnd; /* End of processing for this SELECT */-
6119 int sortPTab = 0; /* Pseudotable used to decode sorting results */-
6120 int sortOut = 0; /* Output register from the sorter */-
6121 int orderByGrp = 0; /* True if the GROUP BY and ORDER BY are the same */-
6122-
6123 /* Remove any and all aliases between the result set and the-
6124 ** GROUP BY clause.-
6125 */-
6126 if( pGroupBy ){
pGroupByDescription
TRUEevaluated 2209 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 22479 times by 4 tests
Evaluated by:
  • Self test (103)
  • Self test (104)
  • Self test (34)
  • Self test (438)
2209-22479
6127 int k; /* Loop counter */-
6128 struct ExprList_item *pItem; /* For looping over expression in a list */-
6129-
6130 for(k=p->pEList->nExpr, pItem=p->pEList->a; k>0; k--, pItem++){
k>0Description
TRUEevaluated 6105 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 2209 times by 1 test
Evaluated by:
  • Self test (438)
2209-6105
6131 pItem->u.x.iAlias = 0;-
6132 }
executed 6105 times by 1 test: end of block
Executed by:
  • Self test (438)
6105
6133 for(k=pGroupBy->nExpr, pItem=pGroupBy->a; k>0; k--, pItem++){
k>0Description
TRUEevaluated 2286 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 2209 times by 1 test
Evaluated by:
  • Self test (438)
2209-2286
6134 pItem->u.x.iAlias = 0;-
6135 }
executed 2286 times by 1 test: end of block
Executed by:
  • Self test (438)
2286
6136 assert( 66==sqlite3LogEst(100) );-
6137 if( p->nSelectRow>66 ) p->nSelectRow = 66;
executed 2192 times by 1 test: p->nSelectRow = 66;
Executed by:
  • Self test (438)
p->nSelectRow>66Description
TRUEevaluated 2192 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 17 times by 1 test
Evaluated by:
  • Self test (438)
17-2192
6138 }else{
executed 2209 times by 1 test: end of block
Executed by:
  • Self test (438)
2209
6139 assert( 0==sqlite3LogEst(1) );-
6140 p->nSelectRow = 0;-
6141 }
executed 22479 times by 4 tests: end of block
Executed by:
  • Self test (103)
  • Self test (104)
  • Self test (34)
  • Self test (438)
22479
6142-
6143 /* If there is both a GROUP BY and an ORDER BY clause and they are-
6144 ** identical, then it may be possible to disable the ORDER BY clause -
6145 ** on the grounds that the GROUP BY will cause elements to come out -
6146 ** in the correct order. It also may not - the GROUP BY might use a-
6147 ** database index that causes rows to be grouped together as required-
6148 ** but not actually sorted. Either way, record the fact that the-
6149 ** ORDER BY and GROUP BY clauses are the same by setting the orderByGrp-
6150 ** variable. */-
6151 if( sqlite3ExprListCompare(pGroupBy, sSort.pOrderBy, -1)==0 ){
sqlite3ExprLis...rderBy, -1)==0Description
TRUEevaluated 24334 times by 4 tests
Evaluated by:
  • Self test (103)
  • Self test (104)
  • Self test (34)
  • Self test (438)
FALSEevaluated 354 times by 1 test
Evaluated by:
  • Self test (438)
354-24334
6152 orderByGrp = 1;-
6153 }
executed 24334 times by 4 tests: end of block
Executed by:
  • Self test (103)
  • Self test (104)
  • Self test (34)
  • Self test (438)
24334
6154 -
6155 /* Create a label to jump to when we want to abort the query */-
6156 addrEnd = sqlite3VdbeMakeLabel(v);-
6157-
6158 /* Convert TK_COLUMN nodes into TK_AGG_COLUMN and make entries in-
6159 ** sAggInfo for all TK_AGG_FUNCTION nodes in expressions of the-
6160 ** SELECT statement.-
6161 */-
6162 memset(&sNC, 0, sizeof(sNC));-
6163 sNC.pParse = pParse;-
6164 sNC.pSrcList = pTabList;-
6165 sNC.uNC.pAggInfo = &sAggInfo;-
6166 VVA_ONLY( sNC.ncFlags = NC_UAggInfo; )-
6167 sAggInfo.mnReg = pParse->nMem+1;-
6168 sAggInfo.nSortingColumn = pGroupBy ? pGroupBy->nExpr : 0;
pGroupByDescription
TRUEevaluated 2209 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 22479 times by 4 tests
Evaluated by:
  • Self test (103)
  • Self test (104)
  • Self test (34)
  • Self test (438)
2209-22479
6169 sAggInfo.pGroupBy = pGroupBy;-
6170 sqlite3ExprAnalyzeAggList(&sNC, pEList);-
6171 sqlite3ExprAnalyzeAggList(&sNC, sSort.pOrderBy);-
6172 if( pHaving ){
pHavingDescription
TRUEevaluated 97 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 24591 times by 4 tests
Evaluated by:
  • Self test (103)
  • Self test (104)
  • Self test (34)
  • Self test (438)
97-24591
6173 if( pGroupBy ){
pGroupByDescription
TRUEevaluated 91 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 6 times by 1 test
Evaluated by:
  • Self test (438)
6-91
6174 assert( pWhere==p->pWhere );-
6175 assert( pHaving==p->pHaving );-
6176 assert( pGroupBy==p->pGroupBy );-
6177 havingToWhere(pParse, p);-
6178 pWhere = p->pWhere;-
6179 }
executed 91 times by 1 test: end of block
Executed by:
  • Self test (438)
91
6180 sqlite3ExprAnalyzeAggregates(&sNC, pHaving);-
6181 }
executed 97 times by 1 test: end of block
Executed by:
  • Self test (438)
97
6182 sAggInfo.nAccumulator = sAggInfo.nColumn;-
6183 if( p->pGroupBy==0 && p->pHaving==0 && sAggInfo.nFunc==1 ){
p->pGroupBy==0Description
TRUEevaluated 22479 times by 4 tests
Evaluated by:
  • Self test (103)
  • Self test (104)
  • Self test (34)
  • Self test (438)
FALSEevaluated 2209 times by 1 test
Evaluated by:
  • Self test (438)
p->pHaving==0Description
TRUEevaluated 22473 times by 4 tests
Evaluated by:
  • Self test (103)
  • Self test (104)
  • Self test (34)
  • Self test (438)
FALSEevaluated 6 times by 1 test
Evaluated by:
  • Self test (438)
sAggInfo.nFunc==1Description
TRUEevaluated 19765 times by 4 tests
Evaluated by:
  • Self test (103)
  • Self test (104)
  • Self test (34)
  • Self test (438)
FALSEevaluated 2708 times by 1 test
Evaluated by:
  • Self test (438)
6-22479
6184 minMaxFlag = minMaxQuery(db, sAggInfo.aFunc[0].pExpr, &pMinMaxOrderBy);-
6185 }else{
executed 19765 times by 4 tests: end of block
Executed by:
  • Self test (103)
  • Self test (104)
  • Self test (34)
  • Self test (438)
19765
6186 minMaxFlag = WHERE_ORDERBY_NORMAL;-
6187 }
executed 4923 times by 1 test: end of block
Executed by:
  • Self test (438)
4923
6188 for(i=0; i<sAggInfo.nFunc; i++){
i<sAggInfo.nFuncDescription
TRUEevaluated 35663 times by 4 tests
Evaluated by:
  • Self test (103)
  • Self test (104)
  • Self test (34)
  • Self test (438)
FALSEevaluated 24688 times by 4 tests
Evaluated by:
  • Self test (103)
  • Self test (104)
  • Self test (34)
  • Self test (438)
24688-35663
6189 assert( !ExprHasProperty(sAggInfo.aFunc[i].pExpr, EP_xIsSelect) );-
6190 sNC.ncFlags |= NC_InAggFunc;-
6191 sqlite3ExprAnalyzeAggList(&sNC, sAggInfo.aFunc[i].pExpr->x.pList);-
6192 sNC.ncFlags &= ~NC_InAggFunc;-
6193 }
executed 35663 times by 4 tests: end of block
Executed by:
  • Self test (103)
  • Self test (104)
  • Self test (34)
  • Self test (438)
35663
6194 sAggInfo.mxReg = pParse->nMem;-
6195 if( db->mallocFailed ) goto select_end;
never executed: goto select_end;
db->mallocFailedDescription
TRUEnever evaluated
FALSEevaluated 24688 times by 4 tests
Evaluated by:
  • Self test (103)
  • Self test (104)
  • Self test (34)
  • Self test (438)
0-24688
6196#if SELECTTRACE_ENABLED-
6197 if( sqlite3SelectTrace & 0x400 ){-
6198 int ii;-
6199 SELECTTRACE(0x400,pParse,p,("After aggregate analysis:\n"));-
6200 sqlite3TreeViewSelect(0, p, 0);-
6201 for(ii=0; ii<sAggInfo.nColumn; ii++){-
6202 sqlite3DebugPrintf("agg-column[%d] iMem=%d\n",-
6203 ii, sAggInfo.aCol[ii].iMem);-
6204 sqlite3TreeViewExpr(0, sAggInfo.aCol[ii].pExpr, 0);-
6205 }-
6206 for(ii=0; ii<sAggInfo.nFunc; ii++){-
6207 sqlite3DebugPrintf("agg-func[%d]: iMem=%d\n",-
6208 ii, sAggInfo.aFunc[ii].iMem);-
6209 sqlite3TreeViewExpr(0, sAggInfo.aFunc[ii].pExpr, 0);-
6210 }-
6211 }-
6212#endif-
6213-
6214-
6215 /* Processing for aggregates with GROUP BY is very different and-
6216 ** much more complex than aggregates without a GROUP BY.-
6217 */-
6218 if( pGroupBy ){
pGroupByDescription
TRUEevaluated 2209 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 22479 times by 4 tests
Evaluated by:
  • Self test (103)
  • Self test (104)
  • Self test (34)
  • Self test (438)
2209-22479
6219 KeyInfo *pKeyInfo; /* Keying information for the group by clause */-
6220 int addr1; /* A-vs-B comparision jump */-
6221 int addrOutputRow; /* Start of subroutine that outputs a result row */-
6222 int regOutputRow; /* Return address register for output subroutine */-
6223 int addrSetAbort; /* Set the abort flag and return */-
6224 int addrTopOfLoop; /* Top of the input loop */-
6225 int addrSortingIdx; /* The OP_OpenEphemeral for the sorting index */-
6226 int addrReset; /* Subroutine for resetting the accumulator */-
6227 int regReset; /* Return address register for reset subroutine */-
6228-
6229 /* If there is a GROUP BY clause we might need a sorting index to-
6230 ** implement it. Allocate that sorting index now. If it turns out-
6231 ** that we do not need it after all, the OP_SorterOpen instruction-
6232 ** will be converted into a Noop. -
6233 */-
6234 sAggInfo.sortingIdx = pParse->nTab++;-
6235 pKeyInfo = sqlite3KeyInfoFromExprList(pParse,pGroupBy,0,sAggInfo.nColumn);-
6236 addrSortingIdx = sqlite3VdbeAddOp4(v, OP_SorterOpen, -
6237 sAggInfo.sortingIdx, sAggInfo.nSortingColumn, -
6238 0, (char*)pKeyInfo, P4_KEYINFO);-
6239-
6240 /* Initialize memory locations used by GROUP BY aggregate processing-
6241 */-
6242 iUseFlag = ++pParse->nMem;-
6243 iAbortFlag = ++pParse->nMem;-
6244 regOutputRow = ++pParse->nMem;-
6245 addrOutputRow = sqlite3VdbeMakeLabel(v);-
6246 regReset = ++pParse->nMem;-
6247 addrReset = sqlite3VdbeMakeLabel(v);-
6248 iAMem = pParse->nMem + 1;-
6249 pParse->nMem += pGroupBy->nExpr;-
6250 iBMem = pParse->nMem + 1;-
6251 pParse->nMem += pGroupBy->nExpr;-
6252 sqlite3VdbeAddOp2(v, OP_Integer, 0, iAbortFlag);-
6253 VdbeComment((v, "clear abort flag"));-
6254 sqlite3VdbeAddOp3(v, OP_Null, 0, iAMem, iAMem+pGroupBy->nExpr-1);-
6255-
6256 /* Begin a loop that will extract all source rows in GROUP BY order.-
6257 ** This might involve two separate loops with an OP_Sort in between, or-
6258 ** it might be a single loop that uses an index to extract information-
6259 ** in the right order to begin with.-
6260 */-
6261 sqlite3VdbeAddOp2(v, OP_Gosub, regReset, addrReset);-
6262 SELECTTRACE(1,pParse,p,("WhereBegin\n"));-
6263 pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, pGroupBy, 0,-
6264 WHERE_GROUPBY | (orderByGrp ? WHERE_SORTBYGROUP : 0), 0-
6265 );-
6266 if( pWInfo==0 ) goto select_end;
executed 2 times by 1 test: goto select_end;
Executed by:
  • Self test (438)
pWInfo==0Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 2207 times by 1 test
Evaluated by:
  • Self test (438)
2-2207
6267 if( sqlite3WhereIsOrdered(pWInfo)==pGroupBy->nExpr ){
sqlite3WhereIs...GroupBy->nExprDescription
TRUEevaluated 107 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 2100 times by 1 test
Evaluated by:
  • Self test (438)
107-2100
6268 /* The optimizer is able to deliver rows in group by order so-
6269 ** we do not have to sort. The OP_OpenEphemeral table will be-
6270 ** cancelled later because we still need to use the pKeyInfo-
6271 */-
6272 groupBySort = 0;-
6273 }else{
executed 107 times by 1 test: end of block
Executed by:
  • Self test (438)
107
6274 /* Rows are coming out in undetermined order. We have to push-
6275 ** each row into a sorting index, terminate the first loop,-
6276 ** then loop over the sorting index in order to get the output-
6277 ** in sorted order-
6278 */-
6279 int regBase;-
6280 int regRecord;-
6281 int nCol;-
6282 int nGroupBy;-
6283-
6284 explainTempTable(pParse, -
6285 (sDistinct.isTnct && (p->selFlags&SF_Distinct)==0) ?-
6286 "DISTINCT" : "GROUP BY");-
6287-
6288 groupBySort = 1;-
6289 nGroupBy = pGroupBy->nExpr;-
6290 nCol = nGroupBy;-
6291 j = nGroupBy;-
6292 for(i=0; i<sAggInfo.nColumn; i++){
i<sAggInfo.nColumnDescription
TRUEevaluated 5716 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 2100 times by 1 test
Evaluated by:
  • Self test (438)
2100-5716
6293 if( sAggInfo.aCol[i].iSorterColumn>=j ){
sAggInfo.aCol[...orterColumn>=jDescription
TRUEevaluated 3705 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 2011 times by 1 test
Evaluated by:
  • Self test (438)
2011-3705
6294 nCol++;-
6295 j++;-
6296 }
executed 3705 times by 1 test: end of block
Executed by:
  • Self test (438)
3705
6297 }
executed 5716 times by 1 test: end of block
Executed by:
  • Self test (438)
5716
6298 regBase = sqlite3GetTempRange(pParse, nCol);-
6299 sqlite3ExprCodeExprList(pParse, pGroupBy, regBase, 0, 0);-
6300 j = nGroupBy;-
6301 for(i=0; i<sAggInfo.nColumn; i++){
i<sAggInfo.nColumnDescription
TRUEevaluated 5716 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 2100 times by 1 test
Evaluated by:
  • Self test (438)
2100-5716
6302 struct AggInfo_col *pCol = &sAggInfo.aCol[i];-
6303 if( pCol->iSorterColumn>=j ){
pCol->iSorterColumn>=jDescription
TRUEevaluated 3705 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 2011 times by 1 test
Evaluated by:
  • Self test (438)
2011-3705
6304 int r1 = j + regBase;-
6305 sqlite3ExprCodeGetColumnOfTable(v,-
6306 pCol->pTab, pCol->iTable, pCol->iColumn, r1);-
6307 j++;-
6308 }
executed 3705 times by 1 test: end of block
Executed by:
  • Self test (438)
3705
6309 }
executed 5716 times by 1 test: end of block
Executed by:
  • Self test (438)
5716
6310 regRecord = sqlite3GetTempReg(pParse);-
6311 sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase, nCol, regRecord);-
6312 sqlite3VdbeAddOp2(v, OP_SorterInsert, sAggInfo.sortingIdx, regRecord);-
6313 sqlite3ReleaseTempReg(pParse, regRecord);-
6314 sqlite3ReleaseTempRange(pParse, regBase, nCol);-
6315 sqlite3WhereEnd(pWInfo);-
6316 sAggInfo.sortingIdxPTab = sortPTab = pParse->nTab++;-
6317 sortOut = sqlite3GetTempReg(pParse);-
6318 sqlite3VdbeAddOp3(v, OP_OpenPseudo, sortPTab, sortOut, nCol);-
6319 sqlite3VdbeAddOp2(v, OP_SorterSort, sAggInfo.sortingIdx, addrEnd);-
6320 VdbeComment((v, "GROUP BY sort")); VdbeCoverage(v);-
6321 sAggInfo.useSortingIdx = 1;-
6322 }
executed 2100 times by 1 test: end of block
Executed by:
  • Self test (438)
2100
6323-
6324 /* If the index or temporary table used by the GROUP BY sort-
6325 ** will naturally deliver rows in the order required by the ORDER BY-
6326 ** clause, cancel the ephemeral table open coded earlier.-
6327 **-
6328 ** This is an optimization - the correct answer should result regardless.-
6329 ** Use the SQLITE_GroupByOrder flag with SQLITE_TESTCTRL_OPTIMIZER to -
6330 ** disable this optimization for testing purposes. */-
6331 if( orderByGrp && OptimizationEnabled(db, SQLITE_GroupByOrder)
orderByGrpDescription
TRUEevaluated 1875 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 332 times by 1 test
Evaluated by:
  • Self test (438)
(((db)->dbOptF...&(0x0004))==0)Description
TRUEevaluated 1873 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test (438)
2-1875
6332 && (groupBySort || sqlite3WhereIsSorted(pWInfo))
groupBySortDescription
TRUEevaluated 1850 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 23 times by 1 test
Evaluated by:
  • Self test (438)
sqlite3WhereIsSorted(pWInfo)Description
TRUEevaluated 18 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 5 times by 1 test
Evaluated by:
  • Self test (438)
5-1850
6333 ){-
6334 sSort.pOrderBy = 0;-
6335 sqlite3VdbeChangeToNoop(v, sSort.addrSortIndex);-
6336 }
executed 1868 times by 1 test: end of block
Executed by:
  • Self test (438)
1868
6337-
6338 /* Evaluate the current GROUP BY terms and store in b0, b1, b2...-
6339 ** (b0 is memory location iBMem+0, b1 is iBMem+1, and so forth)-
6340 ** Then compare the current GROUP BY terms against the GROUP BY terms-
6341 ** from the previous row currently stored in a0, a1, a2...-
6342 */-
6343 addrTopOfLoop = sqlite3VdbeCurrentAddr(v);-
6344 if( groupBySort ){
groupBySortDescription
TRUEevaluated 2100 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 107 times by 1 test
Evaluated by:
  • Self test (438)
107-2100
6345 sqlite3VdbeAddOp3(v, OP_SorterData, sAggInfo.sortingIdx,-
6346 sortOut, sortPTab);-
6347 }
executed 2100 times by 1 test: end of block
Executed by:
  • Self test (438)
2100
6348 for(j=0; j<pGroupBy->nExpr; j++){
j<pGroupBy->nExprDescription
TRUEevaluated 2284 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 2207 times by 1 test
Evaluated by:
  • Self test (438)
2207-2284
6349 if( groupBySort ){
groupBySortDescription
TRUEevaluated 2146 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 138 times by 1 test
Evaluated by:
  • Self test (438)
138-2146
6350 sqlite3VdbeAddOp3(v, OP_Column, sortPTab, j, iBMem+j);-
6351 }else{
executed 2146 times by 1 test: end of block
Executed by:
  • Self test (438)
2146
6352 sAggInfo.directMode = 1;-
6353 sqlite3ExprCode(pParse, pGroupBy->a[j].pExpr, iBMem+j);-
6354 }
executed 138 times by 1 test: end of block
Executed by:
  • Self test (438)
138
6355 }-
6356 sqlite3VdbeAddOp4(v, OP_Compare, iAMem, iBMem, pGroupBy->nExpr,-
6357 (char*)sqlite3KeyInfoRef(pKeyInfo), P4_KEYINFO);-
6358 addr1 = sqlite3VdbeCurrentAddr(v);-
6359 sqlite3VdbeAddOp3(v, OP_Jump, addr1+1, 0, addr1+1); VdbeCoverage(v);-
6360-
6361 /* Generate code that runs whenever the GROUP BY changes.-
6362 ** Changes in the GROUP BY are detected by the previous code-
6363 ** block. If there were no changes, this block is skipped.-
6364 **-
6365 ** This code copies current group by terms in b0,b1,b2,...-
6366 ** over to a0,a1,a2. It then calls the output subroutine-
6367 ** and resets the aggregate accumulator registers in preparation-
6368 ** for the next GROUP BY batch.-
6369 */-
6370 sqlite3ExprCodeMove(pParse, iBMem, iAMem, pGroupBy->nExpr);-
6371 sqlite3VdbeAddOp2(v, OP_Gosub, regOutputRow, addrOutputRow);-
6372 VdbeComment((v, "output one row"));-
6373 sqlite3VdbeAddOp2(v, OP_IfPos, iAbortFlag, addrEnd); VdbeCoverage(v);-
6374 VdbeComment((v, "check abort flag"));-
6375 sqlite3VdbeAddOp2(v, OP_Gosub, regReset, addrReset);-
6376 VdbeComment((v, "reset accumulator"));-
6377-
6378 /* Update the aggregate accumulators based on the content of-
6379 ** the current row-
6380 */-
6381 sqlite3VdbeJumpHere(v, addr1);-
6382 updateAccumulator(pParse, iUseFlag, &sAggInfo);-
6383 sqlite3VdbeAddOp2(v, OP_Integer, 1, iUseFlag);-
6384 VdbeComment((v, "indicate data in accumulator"));-
6385-
6386 /* End of the loop-
6387 */-
6388 if( groupBySort ){
groupBySortDescription
TRUEevaluated 2100 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 107 times by 1 test
Evaluated by:
  • Self test (438)
107-2100
6389 sqlite3VdbeAddOp2(v, OP_SorterNext, sAggInfo.sortingIdx, addrTopOfLoop);-
6390 VdbeCoverage(v);-
6391 }else{
executed 2100 times by 1 test: end of block
Executed by:
  • Self test (438)
2100
6392 sqlite3WhereEnd(pWInfo);-
6393 sqlite3VdbeChangeToNoop(v, addrSortingIdx);-
6394 }
executed 107 times by 1 test: end of block
Executed by:
  • Self test (438)
107
6395-
6396 /* Output the final row of result-
6397 */-
6398 sqlite3VdbeAddOp2(v, OP_Gosub, regOutputRow, addrOutputRow);-
6399 VdbeComment((v, "output final row"));-
6400-
6401 /* Jump over the subroutines-
6402 */-
6403 sqlite3VdbeGoto(v, addrEnd);-
6404-
6405 /* Generate a subroutine that outputs a single row of the result-
6406 ** set. This subroutine first looks at the iUseFlag. If iUseFlag-
6407 ** is less than or equal to zero, the subroutine is a no-op. If-
6408 ** the processing calls for the query to abort, this subroutine-
6409 ** increments the iAbortFlag memory location before returning in-
6410 ** order to signal the caller to abort.-
6411 */-
6412 addrSetAbort = sqlite3VdbeCurrentAddr(v);-
6413 sqlite3VdbeAddOp2(v, OP_Integer, 1, iAbortFlag);-
6414 VdbeComment((v, "set abort flag"));-
6415 sqlite3VdbeAddOp1(v, OP_Return, regOutputRow);-
6416 sqlite3VdbeResolveLabel(v, addrOutputRow);-
6417 addrOutputRow = sqlite3VdbeCurrentAddr(v);-
6418 sqlite3VdbeAddOp2(v, OP_IfPos, iUseFlag, addrOutputRow+2);-
6419 VdbeCoverage(v);-
6420 VdbeComment((v, "Groupby result generator entry point"));-
6421 sqlite3VdbeAddOp1(v, OP_Return, regOutputRow);-
6422 finalizeAggFunctions(pParse, &sAggInfo);-
6423 sqlite3ExprIfFalse(pParse, pHaving, addrOutputRow+1, SQLITE_JUMPIFNULL);-
6424 selectInnerLoop(pParse, p, -1, &sSort,-
6425 &sDistinct, pDest,-
6426 addrOutputRow+1, addrSetAbort);-
6427 sqlite3VdbeAddOp1(v, OP_Return, regOutputRow);-
6428 VdbeComment((v, "end groupby result generator"));-
6429-
6430 /* Generate a subroutine that will reset the group-by accumulator-
6431 */-
6432 sqlite3VdbeResolveLabel(v, addrReset);-
6433 resetAccumulator(pParse, &sAggInfo);-
6434 sqlite3VdbeAddOp2(v, OP_Integer, 0, iUseFlag);-
6435 VdbeComment((v, "indicate accumulator empty"));-
6436 sqlite3VdbeAddOp1(v, OP_Return, regReset);-
6437 -
6438 } /* endif pGroupBy. Begin aggregate queries without GROUP BY: */
executed 2207 times by 1 test: end of block
Executed by:
  • Self test (438)
2207
6439 else {-
6440#ifndef SQLITE_OMIT_BTREECOUNT-
6441 Table *pTab;-
6442 if( (pTab = isSimpleCount(p, &sAggInfo))!=0 ){
(pTab = isSimp...&sAggInfo))!=0Description
TRUEevaluated 1995 times by 4 tests
Evaluated by:
  • Self test (103)
  • Self test (104)
  • Self test (34)
  • Self test (438)
FALSEevaluated 20484 times by 1 test
Evaluated by:
  • Self test (438)
1995-20484
6443 /* If isSimpleCount() returns a pointer to a Table structure, then-
6444 ** the SQL statement is of the form:-
6445 **-
6446 ** SELECT count(*) FROM <tbl>-
6447 **-
6448 ** where the Table structure returned represents table <tbl>.-
6449 **-
6450 ** This statement is so common that it is optimized specially. The-
6451 ** OP_Count instruction is executed either on the intkey table that-
6452 ** contains the data for table <tbl> or on one of its indexes. It-
6453 ** is better to execute the op on an index, as indexes are almost-
6454 ** always spread across less pages than their corresponding tables.-
6455 */-
6456 const int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);-
6457 const int iCsr = pParse->nTab++; /* Cursor to scan b-tree */-
6458 Index *pIdx; /* Iterator variable */-
6459 KeyInfo *pKeyInfo = 0; /* Keyinfo for scanned index */-
6460 Index *pBest = 0; /* Best index found so far */-
6461 int iRoot = pTab->tnum; /* Root page of scanned b-tree */-
6462-
6463 sqlite3CodeVerifySchema(pParse, iDb);-
6464 sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName);-
6465-
6466 /* Search for the index that has the lowest scan cost.-
6467 **-
6468 ** (2011-04-15) Do not do a full scan of an unordered index.-
6469 **-
6470 ** (2013-10-03) Do not count the entries in a partial index.-
6471 **-
6472 ** In practice the KeyInfo structure will not be used. It is only -
6473 ** passed to keep OP_OpenRead happy.-
6474 */-
6475 if( !HasRowid(pTab) ) pBest = sqlite3PrimaryKeyIndex(pTab);
executed 19 times by 1 test: pBest = sqlite3PrimaryKeyIndex(pTab);
Executed by:
  • Self test (438)
!(((pTab)->tab... & 0x0020)==0)Description
TRUEevaluated 19 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1976 times by 4 tests
Evaluated by:
  • Self test (103)
  • Self test (104)
  • Self test (34)
  • Self test (438)
19-1976
6476 for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
pIdxDescription
TRUEevaluated 562 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1995 times by 4 tests
Evaluated by:
  • Self test (103)
  • Self test (104)
  • Self test (34)
  • Self test (438)
562-1995
6477 if( pIdx->bUnordered==0
pIdx->bUnordered==0Description
TRUEevaluated 561 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test (438)
1-561
6478 && pIdx->szIdxRow<pTab->szTabRow
pIdx->szIdxRow<pTab->szTabRowDescription
TRUEevaluated 350 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 211 times by 1 test
Evaluated by:
  • Self test (438)
211-350
6479 && pIdx->pPartIdxWhere==0
pIdx->pPartIdxWhere==0Description
TRUEevaluated 346 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 4 times by 1 test
Evaluated by:
  • Self test (438)
4-346
6480 && (!pBest || pIdx->szIdxRow<pBest->szIdxRow)
!pBestDescription
TRUEevaluated 215 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 131 times by 1 test
Evaluated by:
  • Self test (438)
pIdx->szIdxRow<pBest->szIdxRowDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 129 times by 1 test
Evaluated by:
  • Self test (438)
2-215
6481 ){-
6482 pBest = pIdx;-
6483 }
executed 217 times by 1 test: end of block
Executed by:
  • Self test (438)
217
6484 }
executed 562 times by 1 test: end of block
Executed by:
  • Self test (438)
562
6485 if( pBest ){
pBestDescription
TRUEevaluated 234 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1761 times by 4 tests
Evaluated by:
  • Self test (103)
  • Self test (104)
  • Self test (34)
  • Self test (438)
234-1761
6486 iRoot = pBest->tnum;-
6487 pKeyInfo = sqlite3KeyInfoOfIndex(pParse, pBest);-
6488 }
executed 234 times by 1 test: end of block
Executed by:
  • Self test (438)
234
6489-
6490 /* Open a read-only cursor, execute the OP_Count, close the cursor. */-
6491 sqlite3VdbeAddOp4Int(v, OP_OpenRead, iCsr, iRoot, iDb, 1);-
6492 if( pKeyInfo ){
pKeyInfoDescription
TRUEevaluated 234 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 1761 times by 4 tests
Evaluated by:
  • Self test (103)
  • Self test (104)
  • Self test (34)
  • Self test (438)
234-1761
6493 sqlite3VdbeChangeP4(v, -1, (char *)pKeyInfo, P4_KEYINFO);-
6494 }
executed 234 times by 1 test: end of block
Executed by:
  • Self test (438)
234
6495 sqlite3VdbeAddOp2(v, OP_Count, iCsr, sAggInfo.aFunc[0].iMem);-
6496 sqlite3VdbeAddOp1(v, OP_Close, iCsr);-
6497 explainSimpleCount(pParse, pTab, pBest);-
6498 }else
executed 1995 times by 4 tests: end of block
Executed by:
  • Self test (103)
  • Self test (104)
  • Self test (34)
  • Self test (438)
1995
6499#endif /* SQLITE_OMIT_BTREECOUNT */-
6500 {-
6501 int regAcc = 0; /* "populate accumulators" flag */-
6502-
6503 /* If there are accumulator registers but no min() or max() functions,-
6504 ** allocate register regAcc. Register regAcc will contain 0 the first-
6505 ** time the inner loop runs, and 1 thereafter. The code generated-
6506 ** by updateAccumulator() only updates the accumulator registers if-
6507 ** regAcc contains 0. */-
6508 if( sAggInfo.nAccumulator ){
sAggInfo.nAccumulatorDescription
TRUEevaluated 51 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 20433 times by 1 test
Evaluated by:
  • Self test (438)
51-20433
6509 for(i=0; i<sAggInfo.nFunc; i++){
i<sAggInfo.nFuncDescription
TRUEevaluated 51 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 20 times by 1 test
Evaluated by:
  • Self test (438)
20-51
6510 if( sAggInfo.aFunc[i].pFunc->funcFlags&SQLITE_FUNC_NEEDCOLL ) break;
executed 31 times by 1 test: break;
Executed by:
  • Self test (438)
sAggInfo.aFunc...ncFlags&0x0020Description
TRUEevaluated 31 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 20 times by 1 test
Evaluated by:
  • Self test (438)
20-31
6511 }
executed 20 times by 1 test: end of block
Executed by:
  • Self test (438)
20
6512 if( i==sAggInfo.nFunc ){
i==sAggInfo.nFuncDescription
TRUEevaluated 20 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 31 times by 1 test
Evaluated by:
  • Self test (438)
20-31
6513 regAcc = ++pParse->nMem;-
6514 sqlite3VdbeAddOp2(v, OP_Integer, 0, regAcc);-
6515 }
executed 20 times by 1 test: end of block
Executed by:
  • Self test (438)
20
6516 }
executed 51 times by 1 test: end of block
Executed by:
  • Self test (438)
51
6517-
6518 /* This case runs if the aggregate has no GROUP BY clause. The-
6519 ** processing is much simpler since there is only a single row-
6520 ** of output.-
6521 */-
6522 assert( p->pGroupBy==0 );-
6523 resetAccumulator(pParse, &sAggInfo);-
6524-
6525 /* If this query is a candidate for the min/max optimization, then-
6526 ** minMaxFlag will have been previously set to either-
6527 ** WHERE_ORDERBY_MIN or WHERE_ORDERBY_MAX and pMinMaxOrderBy will-
6528 ** be an appropriate ORDER BY expression for the optimization.-
6529 */-
6530 assert( minMaxFlag==WHERE_ORDERBY_NORMAL || pMinMaxOrderBy!=0 );-
6531 assert( pMinMaxOrderBy==0 || pMinMaxOrderBy->nExpr==1 );-
6532-
6533 SELECTTRACE(1,pParse,p,("WhereBegin\n"));-
6534 pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, pMinMaxOrderBy,-
6535 0, minMaxFlag, 0);-
6536 if( pWInfo==0 ){
pWInfo==0Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 20481 times by 1 test
Evaluated by:
  • Self test (438)
3-20481
6537 goto select_end;
executed 3 times by 1 test: goto select_end;
Executed by:
  • Self test (438)
3
6538 }-
6539 updateAccumulator(pParse, regAcc, &sAggInfo);-
6540 if( regAcc ) sqlite3VdbeAddOp2(v, OP_Integer, 1, regAcc);
executed 20 times by 1 test: sqlite3VdbeAddOp2(v, 70, 1, regAcc);
Executed by:
  • Self test (438)
regAccDescription
TRUEevaluated 20 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 20461 times by 1 test
Evaluated by:
  • Self test (438)
20-20461
6541 if( sqlite3WhereIsOrdered(pWInfo)>0 ){
sqlite3WhereIs...ered(pWInfo)>0Description
TRUEevaluated 1065 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 19416 times by 1 test
Evaluated by:
  • Self test (438)
1065-19416
6542 sqlite3VdbeGoto(v, sqlite3WhereBreakLabel(pWInfo));-
6543 VdbeComment((v, "%s() by index",-
6544 (minMaxFlag==WHERE_ORDERBY_MIN?"min":"max")));-
6545 }
executed 1065 times by 1 test: end of block
Executed by:
  • Self test (438)
1065
6546 sqlite3WhereEnd(pWInfo);-
6547 finalizeAggFunctions(pParse, &sAggInfo);-
6548 }
executed 20481 times by 1 test: end of block
Executed by:
  • Self test (438)
20481
6549-
6550 sSort.pOrderBy = 0;-
6551 sqlite3ExprIfFalse(pParse, pHaving, addrEnd, SQLITE_JUMPIFNULL);-
6552 selectInnerLoop(pParse, p, -1, 0, 0, -
6553 pDest, addrEnd, addrEnd);-
6554 }
executed 22476 times by 4 tests: end of block
Executed by:
  • Self test (103)
  • Self test (104)
  • Self test (34)
  • Self test (438)
22476
6555 sqlite3VdbeResolveLabel(v, addrEnd);-
6556 -
6557 } /* endif aggregate query */
executed 24683 times by 4 tests: end of block
Executed by:
  • Self test (103)
  • Self test (104)
  • Self test (34)
  • Self test (438)
24683
6558-
6559 if( sDistinct.eTnctType==WHERE_DISTINCT_UNORDERED ){
sDistinct.eTnctType==3Description
TRUEevaluated 203 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 274907 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
203-274907
6560 explainTempTable(pParse, "DISTINCT");-
6561 }
executed 203 times by 1 test: end of block
Executed by:
  • Self test (438)
203
6562-
6563 /* If there is an ORDER BY clause, then we need to sort the results-
6564 ** and send them to the callback one by one.-
6565 */-
6566 if( sSort.pOrderBy ){
sSort.pOrderByDescription
TRUEevaluated 13126 times by 1 test
Evaluated by:
  • Self test (438)
FALSEevaluated 261984 times by 435 tests
Evaluated by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
13126-261984
6567 explainTempTable(pParse,-
6568 sSort.nOBSat>0 ? "RIGHT PART OF ORDER BY":"ORDER BY");-
6569 assert( p->pEList==pEList );-
6570 generateSortTail(pParse, p, &sSort, pEList->nExpr, pDest);-
6571 }
executed 13126 times by 1 test: end of block
Executed by:
  • Self test (438)
13126
6572-
6573 /* Jump here to skip this query-
6574 */-
6575 sqlite3VdbeResolveLabel(v, iEnd);-
6576-
6577 /* The SELECT has been coded. If there is an error in the Parse structure,-
6578 ** set the return code to 1. Otherwise 0. */-
6579 rc = (pParse->nErr>0);-
6580-
6581 /* Control jumps to here if an error is encountered above, or upon-
6582 ** successful coding of the SELECT.-
6583 */-
6584select_end:
code before this statement executed 275110 times by 435 tests: select_end:
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
275110
6585 sqlite3ExprListDelete(db, pMinMaxOrderBy);-
6586 sqlite3DbFree(db, sAggInfo.aCol);-
6587 sqlite3DbFree(db, sAggInfo.aFunc);-
6588#if SELECTTRACE_ENABLED-
6589 SELECTTRACE(0x1,pParse,p,("end processing\n"));-
6590 if( (sqlite3SelectTrace & 0x2000)!=0 && ExplainQueryPlanParent(pParse)==0 ){-
6591 sqlite3TreeViewSelect(0, p, 0);-
6592 }-
6593#endif-
6594 ExplainQueryPlanPop(pParse);-
6595 return rc;
executed 277374 times by 436 tests: return rc;
Executed by:
  • Self test
  • Self test (10)
  • Self test (100)
  • Self test (101)
  • Self test (103)
  • Self test (104)
  • Self test (105)
  • Self test (106)
  • Self test (107)
  • Self test (108)
  • Self test (109)
  • Self test (11)
  • Self test (110)
  • Self test (111)
  • Self test (112)
  • Self test (113)
  • Self test (114)
  • Self test (115)
  • Self test (116)
  • Self test (117)
  • Self test (118)
  • Self test (119)
  • Self test (12)
  • Self test (120)
  • Self test (121)
  • ...
277374
6596}-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.2.2