Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Fix a problem with min() and descending indexes. (CVS 4933) |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
39705b617a775d4299e98ac88fab4525 |
User & Date: | danielk1977 2008-03-28 19:16:57.000 |
Context
2008-03-29
| ||
11:00 | Add the --pause option to the main test driver. (CVS 4934) (check-in: 37dfcdf529 user: drh tags: trunk) | |
2008-03-28
| ||
19:16 | Fix a problem with min() and descending indexes. (CVS 4933) (check-in: 39705b617a user: danielk1977 tags: trunk) | |
19:16 | Fix a memory leak that can occur when the library API is misused. (CVS 4932) (check-in: 2b6d3e015e user: danielk1977 tags: trunk) | |
Changes
Changes to src/where.c.
︙ | ︙ | |||
12 13 14 15 16 17 18 | ** This module contains C code that generates VDBE code used to process ** the WHERE clause of SQL statements. This module is reponsible for ** generating the code that loops through a table looking for applicable ** rows. Indices are selected and used to speed the search when doing ** so is applicable. Because this module is responsible for selecting ** indices, you might also think of this module as the "query optimizer". ** | | | 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | ** This module contains C code that generates VDBE code used to process ** the WHERE clause of SQL statements. This module is reponsible for ** generating the code that loops through a table looking for applicable ** rows. Indices are selected and used to speed the search when doing ** so is applicable. Because this module is responsible for selecting ** indices, you might also think of this module as the "query optimizer". ** ** $Id: where.c,v 1.294 2008/03/28 19:16:57 danielk1977 Exp $ */ #include "sqliteInt.h" /* ** The number of bits in a Bitmask. "BMS" means "BitMask Size". */ #define BMS (sizeof(Bitmask)*8) |
︙ | ︙ | |||
2552 2553 2554 2555 2556 2557 2558 | btmEq = pTerm->eOperator & (WO_LE|WO_GE); disableTerm(pLevel, pTerm); }else{ btmEq = 1; } if( nEq>0 || btmLimit || (isMinQuery&&!bRev) ){ int nCol = nEq + btmLimit; | | | 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 | btmEq = pTerm->eOperator & (WO_LE|WO_GE); disableTerm(pLevel, pTerm); }else{ btmEq = 1; } if( nEq>0 || btmLimit || (isMinQuery&&!bRev) ){ int nCol = nEq + btmLimit; if( isMinQuery && !bRev && !btmLimit ){ sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nCol); nCol++; btmEq = 0; } if( bRev ){ r1 = pLevel->iMem; testOp = OP_IdxLT; |
︙ | ︙ |
Changes to test/minmax3.test.
1 2 3 4 5 6 7 8 9 10 | # 2008 January 5 # # The author disclaims copyright to this source code. In place of # a legal notice, here is a blessing: # # May you do good and not evil. # May you find forgiveness for yourself and forgive others. # May you share freely, never taking more than you give. # #*********************************************************************** | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # 2008 January 5 # # The author disclaims copyright to this source code. In place of # a legal notice, here is a blessing: # # May you do good and not evil. # May you find forgiveness for yourself and forgive others. # May you share freely, never taking more than you give. # #*********************************************************************** # $Id: minmax3.test,v 1.4 2008/03/28 19:16:57 danielk1977 Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl # Do an SQL statement. Append the search count to the end of the result. # proc count sql { |
︙ | ︙ | |||
137 138 139 140 141 142 143 144 145 146 147 148 149 150 | do_test minmax3-2.1 { execsql { CREATE TABLE t2(a, b); CREATE INDEX i3 ON t2(a, b); INSERT INTO t2 VALUES(1, NULL); INSERT INTO t2 VALUES(1, 1); INSERT INTO t2 VALUES(1, 2); INSERT INTO t2 VALUES(1, 3); INSERT INTO t2 VALUES(2, NULL); INSERT INTO t2 VALUES(2, 1); INSERT INTO t2 VALUES(2, 2); INSERT INTO t2 VALUES(2, 3); INSERT INTO t2 VALUES(3, 1); | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 | do_test minmax3-2.1 { execsql { CREATE TABLE t2(a, b); CREATE INDEX i3 ON t2(a, b); INSERT INTO t2 VALUES(1, NULL); INSERT INTO t2 VALUES(1, 1); INSERT INTO t2 VALUES(1, 2); INSERT INTO t2 VALUES(1, 3); INSERT INTO t2 VALUES(2, NULL); INSERT INTO t2 VALUES(2, 1); INSERT INTO t2 VALUES(2, 2); INSERT INTO t2 VALUES(2, 3); INSERT INTO t2 VALUES(3, 1); INSERT INTO t2 VALUES(3, 2); INSERT INTO t2 VALUES(3, 3); } } {} do_test minmax3-2.2 { execsql { SELECT min(b) FROM t2 WHERE a = 1; } } {1} do_test minmax3-2.3 { execsql { SELECT min(b) FROM t2 WHERE a = 1 AND b>1; } } {2} do_test minmax3-2.4 { execsql { SELECT min(b) FROM t2 WHERE a = 1 AND b>-1; } } {1} do_test minmax3-2.5 { execsql { SELECT min(b) FROM t2 WHERE a = 1; } } {1} do_test minmax3-2.6 { execsql { SELECT min(b) FROM t2 WHERE a = 1 AND b<2; } } {1} do_test minmax3-2.7 { execsql { SELECT min(b) FROM t2 WHERE a = 1 AND b<1; } } {{}} do_test minmax3-2.8 { execsql { SELECT min(b) FROM t2 WHERE a = 3 AND b<1; } } {{}} do_test minmax3-2.1 { execsql { DROP TABLE t2; CREATE TABLE t2(a, b); CREATE INDEX i3 ON t2(a, b DESC); INSERT INTO t2 VALUES(1, NULL); INSERT INTO t2 VALUES(1, 1); INSERT INTO t2 VALUES(1, 2); INSERT INTO t2 VALUES(1, 3); INSERT INTO t2 VALUES(2, NULL); INSERT INTO t2 VALUES(2, 1); INSERT INTO t2 VALUES(2, 2); INSERT INTO t2 VALUES(2, 3); INSERT INTO t2 VALUES(3, 1); |
︙ | ︙ |