mirror of
https://github.com/sqlite/sqlite.git
synced 2025-07-24 22:22:08 +03:00
Allow an index paired with a NOT NULL constraint to be used for sorting
under the condition that the index be treated as a non-unique index. FossilOrigin-Name: d78949fc93077e1aa7f05cf9f7e947727939cc96
This commit is contained in:
20
manifest
20
manifest
@ -1,8 +1,8 @@
|
|||||||
-----BEGIN PGP SIGNED MESSAGE-----
|
-----BEGIN PGP SIGNED MESSAGE-----
|
||||||
Hash: SHA1
|
Hash: SHA1
|
||||||
|
|
||||||
C Disable\sunused\sNULL\stests\swhen\sSQLITE_ENABLE_STAT2\sis\snot\sin\suse.
|
C Allow\san\sindex\spaired\swith\sa\sNOT\sNULL\sconstraint\sto\sbe\sused\sfor\ssorting\nunder\sthe\scondition\sthat\sthe\sindex\sbe\streated\sas\sa\snon-unique\sindex.
|
||||||
D 2011-02-11T02:43:14.522
|
D 2011-02-11T03:56:11.449
|
||||||
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
|
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
|
||||||
F Makefile.in 27701a1653595a1f2187dc61c8117e00a6c1d50f
|
F Makefile.in 27701a1653595a1f2187dc61c8117e00a6c1d50f
|
||||||
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
|
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
|
||||||
@ -244,7 +244,7 @@ F src/vtab.c b297e8fa656ab5e66244ab15680d68db0adbec30
|
|||||||
F src/wal.c aca10a60655e103fc8630a75345000f43c6d47ca
|
F src/wal.c aca10a60655e103fc8630a75345000f43c6d47ca
|
||||||
F src/wal.h 7a5fbb00114b7f2cd40c7e1003d4c41ce9d26840
|
F src/wal.h 7a5fbb00114b7f2cd40c7e1003d4c41ce9d26840
|
||||||
F src/walker.c 3112bb3afe1d85dc52317cb1d752055e9a781f8f
|
F src/walker.c 3112bb3afe1d85dc52317cb1d752055e9a781f8f
|
||||||
F src/where.c 612ca339d1d1d076ff7d933ec86bb8548f978892
|
F src/where.c 96d634b85310cfcfe89f004aa8525b57d8898315
|
||||||
F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
|
F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
|
||||||
F test/alias.test 4529fbc152f190268a15f9384a5651bbbabc9d87
|
F test/alias.test 4529fbc152f190268a15f9384a5651bbbabc9d87
|
||||||
F test/all.test 51756962d522e474338e9b2ebb26e7364d4aa125
|
F test/all.test 51756962d522e474338e9b2ebb26e7364d4aa125
|
||||||
@ -780,7 +780,7 @@ F test/tkt3773.test 430b06567ce40285dfd2c4834a2a61816403efeb
|
|||||||
F test/tkt3791.test a6624b9a80b216a26cf473607f42f3e51898c267
|
F test/tkt3791.test a6624b9a80b216a26cf473607f42f3e51898c267
|
||||||
F test/tkt3793.test 754b73f0e6a9349c70dc57e522cf3247272ecd5d
|
F test/tkt3793.test 754b73f0e6a9349c70dc57e522cf3247272ecd5d
|
||||||
F test/tkt3810.test 90fa0635dfa7da9680c8cd3513350a49b3a8ae12
|
F test/tkt3810.test 90fa0635dfa7da9680c8cd3513350a49b3a8ae12
|
||||||
F test/tkt3824.test 3da2f5c81b057e3ff355f5dfc9aa0cf0a92e0206
|
F test/tkt3824.test 150aa00bb6220672e5f0eb14dc8eaa36750425f0
|
||||||
F test/tkt3832.test 2300d10d57562b89875b72148338ac3e14f8847d
|
F test/tkt3832.test 2300d10d57562b89875b72148338ac3e14f8847d
|
||||||
F test/tkt3838.test f956f0719b5f805b12dd1dbf19f19d298bacebc3
|
F test/tkt3838.test f956f0719b5f805b12dd1dbf19f19d298bacebc3
|
||||||
F test/tkt3841.test 4659845bc53f809a5932c61c6ce8c5bb9d6b947f
|
F test/tkt3841.test 4659845bc53f809a5932c61c6ce8c5bb9d6b947f
|
||||||
@ -909,14 +909,14 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
|
|||||||
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
|
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
|
||||||
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
|
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
|
||||||
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
|
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
|
||||||
P f85afa0ecc7b31d32659ae53e70771cd42abda38
|
P 5ecd11788269e78dc26639b2503a10b7e25b2483
|
||||||
R 6c9f8fa6a95f1c6416ba30a2f337f141
|
R efe2bc1def692179832d1c52a5f44bf5
|
||||||
U drh
|
U drh
|
||||||
Z 031fc29c45bc927547b928a448afa15e
|
Z 7fabc9263a982330a71ce326ddcb4d5b
|
||||||
-----BEGIN PGP SIGNATURE-----
|
-----BEGIN PGP SIGNATURE-----
|
||||||
Version: GnuPG v1.4.6 (GNU/Linux)
|
Version: GnuPG v1.4.6 (GNU/Linux)
|
||||||
|
|
||||||
iD8DBQFNVKJGoxKgR168RlERAhU0AKCBT4jzm3Kj7UEwq0dWnN39SWVL6gCffkF9
|
iD8DBQFNVLNeoxKgR168RlERAnOpAKCHCIoShZYXHuUaFypK9VIeAKx74QCfeuXj
|
||||||
sYAMWWqE055NfvfyH8VwD8g=
|
wxJDR+7h4QKi3fBF3WRZCW4=
|
||||||
=sVIn
|
=fdWc
|
||||||
-----END PGP SIGNATURE-----
|
-----END PGP SIGNATURE-----
|
||||||
|
@ -1 +1 @@
|
|||||||
5ecd11788269e78dc26639b2503a10b7e25b2483
|
d78949fc93077e1aa7f05cf9f7e947727939cc96
|
11
src/where.c
11
src/where.c
@ -1419,6 +1419,7 @@ static int isSortingIndex(
|
|||||||
int base, /* Cursor number for the table to be sorted */
|
int base, /* Cursor number for the table to be sorted */
|
||||||
ExprList *pOrderBy, /* The ORDER BY clause */
|
ExprList *pOrderBy, /* The ORDER BY clause */
|
||||||
int nEqCol, /* Number of index columns with == constraints */
|
int nEqCol, /* Number of index columns with == constraints */
|
||||||
|
int wsFlags, /* Index usages flags */
|
||||||
int *pbRev /* Set to 1 if ORDER BY is DESC */
|
int *pbRev /* Set to 1 if ORDER BY is DESC */
|
||||||
){
|
){
|
||||||
int i, j; /* Loop counters */
|
int i, j; /* Loop counters */
|
||||||
@ -1524,11 +1525,14 @@ static int isSortingIndex(
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if( pIdx->onError!=OE_None && i==pIdx->nColumn
|
if( pIdx->onError!=OE_None && i==pIdx->nColumn
|
||||||
|
&& (wsFlags & WHERE_COLUMN_NULL)==0
|
||||||
&& !referencesOtherTables(pOrderBy, pMaskSet, j, base) ){
|
&& !referencesOtherTables(pOrderBy, pMaskSet, j, base) ){
|
||||||
/* All terms of this index match some prefix of the ORDER BY clause
|
/* All terms of this index match some prefix of the ORDER BY clause
|
||||||
** and the index is UNIQUE and no terms on the tail of the ORDER BY
|
** and the index is UNIQUE and no terms on the tail of the ORDER BY
|
||||||
** clause reference other tables in a join. If this is all true then
|
** clause reference other tables in a join. If this is all true then
|
||||||
** the order by clause is superfluous. */
|
** the order by clause is superfluous. Not that if the matching
|
||||||
|
** condition is IS NULL then the result is not necessarily unique
|
||||||
|
** even on a UNIQUE index, so disallow those cases. */
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -2881,8 +2885,9 @@ static void bestBtreeIndex(
|
|||||||
** in wsFlags. Otherwise, if there is an ORDER BY clause but the index
|
** in wsFlags. Otherwise, if there is an ORDER BY clause but the index
|
||||||
** will scan rows in a different order, set the bSort variable. */
|
** will scan rows in a different order, set the bSort variable. */
|
||||||
if( pOrderBy ){
|
if( pOrderBy ){
|
||||||
if( (wsFlags & (WHERE_COLUMN_IN|WHERE_COLUMN_NULL))==0
|
if( (wsFlags & WHERE_COLUMN_IN)==0
|
||||||
&& isSortingIndex(pParse,pWC->pMaskSet,pProbe,iCur,pOrderBy,nEq,&rev)
|
&& isSortingIndex(pParse, pWC->pMaskSet, pProbe, iCur, pOrderBy,
|
||||||
|
nEq, wsFlags, &rev)
|
||||||
){
|
){
|
||||||
wsFlags |= WHERE_ROWID_RANGE|WHERE_COLUMN_RANGE|WHERE_ORDERBY;
|
wsFlags |= WHERE_ROWID_RANGE|WHERE_COLUMN_RANGE|WHERE_ORDERBY;
|
||||||
wsFlags |= (rev ? WHERE_REVERSE : 0);
|
wsFlags |= (rev ? WHERE_REVERSE : 0);
|
||||||
|
@ -72,7 +72,7 @@ do_test tkt3824-2.3 {
|
|||||||
lsort [execsql_status {
|
lsort [execsql_status {
|
||||||
SELECT a FROM t2 WHERE b=2 AND c IS NULL ORDER BY b;
|
SELECT a FROM t2 WHERE b=2 AND c IS NULL ORDER BY b;
|
||||||
}]
|
}]
|
||||||
} {5 9 sort}
|
} {5 9 nosort}
|
||||||
|
|
||||||
do_test tkt3824-3.1 {
|
do_test tkt3824-3.1 {
|
||||||
db eval {
|
db eval {
|
||||||
|
Reference in New Issue
Block a user