SQLite

Check-in [c950d6c411]
Login

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

Overview
Comment:Make sure that virtual WHERE-clause terms do not get transformed into real terms when processing set of OR-connected terms. Fix for ticket [4c86b126f22ad].
Downloads: Tarball | ZIP archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1: c950d6c4117d076f871518e738cdf9e8c46a19fc
User & Date: drh 2014-02-11 01:50:29.864
Context
2014-02-11
14:37
Fixes to the "editline" support in the command-line shell. (check-in: 7989ce5f10 user: drh tags: trunk)
04:30
Sync the latest trunk changes, and in particular the STAT4 IS NOT NULL fix. (check-in: b006792695 user: drh tags: sessions)
03:50
Make sure that virtual WHERE-clause terms do not get transformed into real terms when processing set of OR-connected terms. Fix for ticket [4c86b126f22ad]. (check-in: de635e0960 user: drh tags: branch-3.8.3)
01:50
Make sure that virtual WHERE-clause terms do not get transformed into real terms when processing set of OR-connected terms. Fix for ticket [4c86b126f22ad]. (check-in: c950d6c411 user: drh tags: trunk)
2014-02-10
21:07
Fix a pointless conditional. Add a test case. (check-in: 9367632dd7 user: drh tags: trunk)
Changes
Side-by-Side Diff Show Whitespace Changes Patch
Changes to src/where.c.
3311
3312
3313
3314
3315
3316
3317


3318

3319
3320
3321
3322
3323
3324
3325
3311
3312
3313
3314
3315
3316
3317
3318
3319

3320
3321
3322
3323
3324
3325
3326
3327







+
+
-
+







    */
    if( pWC->nTerm>1 ){
      int iTerm;
      for(iTerm=0; iTerm<pWC->nTerm; iTerm++){
        Expr *pExpr = pWC->a[iTerm].pExpr;
        if( &pWC->a[iTerm] == pTerm ) continue;
        if( ExprHasProperty(pExpr, EP_FromJoin) ) continue;
        testcase( pWC->a[iTerm].wtFlags & TERM_ORINFO );
        testcase( pWC->a[iTerm].wtFlags & TERM_VIRTUAL );
        if( pWC->a[iTerm].wtFlags & (TERM_ORINFO) ) continue;
        if( pWC->a[iTerm].wtFlags & (TERM_ORINFO|TERM_VIRTUAL) ) continue;
        if( (pWC->a[iTerm].eOperator & WO_ALL)==0 ) continue;
        pExpr = sqlite3ExprDup(db, pExpr, 0);
        pAndExpr = sqlite3ExprAnd(db, pAndExpr, pExpr);
      }
      if( pAndExpr ){
        pAndExpr = sqlite3PExpr(pParse, TK_AND, 0, pAndExpr, 0);
      }
Added test/tkt-4c86b126f2.test.

















































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
# 2014-02-11
#
# 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.
#
#***********************************************************************
# This file implements regression tests for SQLite library. Specifically,
# it tests that ticket [4c86b126f22ad548fee0125337bdc9366912d9ac].
#
# When SQLite is compiled using SQLITE_ENABLE_STAT3 or SQLITE_ENABLE_STAT4,
# it gets the wrong answer...
#
# The problem was introduced in SQLite 3.8.1.

set testdir [file dirname $argv0]
source $testdir/tester.tcl

do_execsql_test tkt-4c86b126f2-1.1 {
  CREATE TABLE nodes(
     local_relpath  TEXT PRIMARY KEY,
     moved_to  TEXT
  );
  INSERT INTO nodes VALUES('A',NULL);
  INSERT INTO nodes VALUES('A/B',NULL);
  INSERT INTO nodes VALUES('',NULL);
  INSERT INTO nodes VALUES('A/B/C-move',NULL);
  INSERT INTO nodes VALUES('A/B/C','A/B/C-move');
  INSERT INTO nodes VALUES('A/B-move',NULL);
  INSERT INTO nodes VALUES('A/B-move/C-move',NULL);
  INSERT INTO nodes VALUES('A/B-move/C','x');
  SELECT local_relpath, moved_to
   FROM nodes
  WHERE (local_relpath = 'A/B' OR
           ((local_relpath > 'A/B/') AND (local_relpath < 'A/B0')))
    AND moved_to IS NOT NULL;
} {A/B/C A/B/C-move}

do_execsql_test tkt-4c86b126f2-2.1 {
  CREATE TABLE t1(x TEXT UNIQUE, y TEXT UNIQUE, z);
  INSERT INTO t1 VALUES('ghi','jkl','y');
  SELECT * FROM t1 WHERE (x='ghi' OR y='jkl') AND z IS NOT NULL;
} {ghi jkl y}


finish_test
Changes to test/where8.test.
206
207
208
209
210
211
212
213

214
215
216
217
218
219
220
221
222
223
224
225

226
227
228
229
230
231
232
206
207
208
209
210
211
212

213
214
215
216
217
218
219
220
221
222
223
224

225
226
227
228
229
230
231
232







-
+











-
+







  execsql_status {
    SELECT a, d FROM t1, t2 WHERE (a = 2 OR a = 3) AND d = a
  }
} {2 2 3 3 0 0}

do_test where8-3.5 {
  execsql_status {
    SELECT a, d FROM t1, t2 WHERE (a = 2 OR a = 3) AND (d = a OR e = 'sixteen')
    SELECT a, d FROM t1, t2 WHERE (a = 2 OR a = 3) AND (d = +a OR e = 'sixteen')
     ORDER BY +a, +d;
  }
} {2 2 2 4 3 3 3 4 0 1}

do_test where8-3.6 {
  # The first part of the WHERE clause in this query, (a=2 OR a=3) is
  # transformed into "a IN (2, 3)". This is why the sort is required.
  #
  execsql_status {
    SELECT a, d 
    FROM t1, t2 
    WHERE (a = 2 OR a = 3) AND (d = a OR e = 'sixteen')
    WHERE (a = 2 OR a = 3) AND (d = +a OR e = 'sixteen')
    ORDER BY t1.rowid
  }
} {2 2 2 4 3 3 3 4 0 1}
do_test where8-3.7 {
  execsql_status {
    SELECT a, d 
    FROM t1, t2