SQLite

Check-in [aebe429e52]
Login

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:When handling ORDER BY expressions, do not assume all values of an indexed expressions are distinct. Fix for [4766f444].
Downloads: Tarball | ZIP archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1: aebe429e52ffef026cb0803fb164339d61bd2e88
User & Date: dan 2016-10-10 14:34:00.108
References
2016-10-10
14:38 Closed ticket [4766f44486]: ORDER BY handling with indexes on expressions plus 6 other changes (artifact: 498d1d7a4d user: dan)
Context
2016-10-10
14:48
Remove a stray line from session4.test causing a memory leak. No changes to SQLite code. (check-in: 6624c4964b user: dan tags: trunk)
14:34
When handling ORDER BY expressions, do not assume all values of an indexed expressions are distinct. Fix for [4766f444]. (check-in: aebe429e52 user: dan tags: trunk)
13:29
Make sure indexes on expressions skip over initial NULL values in the index. Fix for ticket [4baa464912129477f3c9] (check-in: 71797ba431 user: drh tags: trunk)
Changes
Unified Diff Ignore Whitespace Patch
Changes to src/where.c.
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
          }else{
            rev = revIdx ^ pOrderBy->a[i].sortOrder;
            if( rev ) *pRevMask |= MASKBIT(iLoop);
            revSet = 1;
          }
        }
        if( isMatch ){
          if( iColumn<0 ){
            testcase( distinctColumns==0 );
            distinctColumns = 1;
          }
          obSat |= MASKBIT(i);
        }else{
          /* No match found */
          if( j==0 || j<nKeyCol ){







|







3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
          }else{
            rev = revIdx ^ pOrderBy->a[i].sortOrder;
            if( rev ) *pRevMask |= MASKBIT(iLoop);
            revSet = 1;
          }
        }
        if( isMatch ){
          if( iColumn==XN_ROWID ){
            testcase( distinctColumns==0 );
            distinctColumns = 1;
          }
          obSat |= MASKBIT(i);
        }else{
          /* No match found */
          if( j==0 || j<nKeyCol ){
Changes to test/indexexpr1.test.
335
336
337
338
339
340
341






























342
343
  SELECT '1:', typeof(a), a FROM t1 WHERE a<10;
  SELECT '2:', typeof(a), a FROM t1 WHERE a+0<10;
  CREATE INDEX t1x1 ON t1(a);
  CREATE INDEX t1x2 ON t1(a+0);
  SELECT '3:', typeof(a), a FROM t1 WHERE a<10;
  SELECT '4:', typeof(a), a FROM t1 WHERE a+0<10;
} {1: integer 1 2: integer 1 3: integer 1 4: integer 1}































finish_test







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>


335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
  SELECT '1:', typeof(a), a FROM t1 WHERE a<10;
  SELECT '2:', typeof(a), a FROM t1 WHERE a+0<10;
  CREATE INDEX t1x1 ON t1(a);
  CREATE INDEX t1x2 ON t1(a+0);
  SELECT '3:', typeof(a), a FROM t1 WHERE a<10;
  SELECT '4:', typeof(a), a FROM t1 WHERE a+0<10;
} {1: integer 1 2: integer 1 3: integer 1 4: integer 1}

do_execsql_test indexexpr1-1200 {
  CREATE TABLE t10(a int, b int, c int, d int);
  INSERT INTO t10(a, b, c, d) VALUES(0, 0, 2, 2);
  INSERT INTO t10(a, b, c, d) VALUES(0, 0, 0, 0);
  INSERT INTO t10(a, b, c, d) VALUES(0, 0, 1, 1);
  INSERT INTO t10(a, b, c, d) VALUES(1, 1, 1, 1);
  INSERT INTO t10(a, b, c, d) VALUES(1, 1, 0, 0);
  INSERT INTO t10(a, b, c, d) VALUES(2, 2, 0, 0);

  SELECT a+b, c+d FROM t10 ORDER BY a+b, c+d;
} {
  0 0 0 2 0 4 2 0 2 2 4 0
}
do_execsql_test indexexpr1-1200.1 {
  CREATE INDEX t10_ab ON t10(a+b);
}
do_execsql_test indexexpr1-1200.2 {
  SELECT a+b, c+d FROM t10 ORDER BY a+b, c+d;
} {
  0 0 0 2 0 4 2 0 2 2 4 0
}
do_execsql_test indexexpr1-1200.3 {
  CREATE INDEX t10_abcd ON t10(a+b,c+d);
}
do_execsql_test indexexpr1-1200.4 {
  SELECT a+b, c+d FROM t10 ORDER BY a+b, c+d;
} {
  0 0 0 2 0 4 2 0 2 2 4 0
}

finish_test