SQLite

Check-in [32f5f46139]
Login

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

Overview
Comment:Merge test script fixes from trunk into this branch.
Downloads: Tarball | ZIP archive
Timelines: family | ancestors | descendants | both | apple-osx
Files: files | file ages | folders
SHA3-256: 32f5f4613985283498162f2eaaba04316ee2f9ac6ce14bf238d36ebd16d55fa0
User & Date: dan 2017-11-17 20:10:12.906
Context
2017-11-17
20:16
Add an 'extern "C"' wrapper to sqlite3_private.h. (check-in: 97ab1efe4e user: dan tags: apple-osx)
20:10
Merge test script fixes from trunk into this branch. (check-in: 32f5f46139 user: dan tags: apple-osx)
20:07
Add some missing "finish_test" lines to the end of test scripts. (check-in: c21406ab32 user: dan tags: trunk)
13:23
Merge latest changes from trunk, including the temporary db/ATTACH/master-journal fix. (check-in: 162c754365 user: dan tags: apple-osx)
Changes
Unified Diff Ignore Whitespace Patch
Changes to src/expr.c.
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
**     SELECT <column1>, <column2>... FROM <table>
**
** If the RHS of the IN operator is a list or a more complex subquery, then
** an ephemeral table might need to be generated from the RHS and then
** pX->iTable made to point to the ephemeral table instead of an
** existing table.
**
** The inFlags parameter must contain exactly one of the bits
** IN_INDEX_MEMBERSHIP or IN_INDEX_LOOP.  If inFlags contains
** IN_INDEX_MEMBERSHIP, then the generated table will be used for a
** fast membership test.  When the IN_INDEX_LOOP bit is set, the
** IN index will be used to loop over all values of the RHS of the
** IN operator.
**
** When IN_INDEX_LOOP is used (and the b-tree will be used to iterate
** through the set members) then the b-tree must not contain duplicates.
** An epheremal table must be used unless the selected columns are guaranteed
** to be unique - either because it is an INTEGER PRIMARY KEY or due to
** a UNIQUE constraint or index.
**
** When IN_INDEX_MEMBERSHIP is used (and the b-tree will be used 
** for fast set membership tests) then an epheremal table must 
** be used unless <columns> is a single INTEGER PRIMARY KEY column or an 
** index can be found with the specified <columns> as its left-most.







|
|
|
|
|
<



|







2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193

2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
**     SELECT <column1>, <column2>... FROM <table>
**
** If the RHS of the IN operator is a list or a more complex subquery, then
** an ephemeral table might need to be generated from the RHS and then
** pX->iTable made to point to the ephemeral table instead of an
** existing table.
**
** The inFlags parameter must contain, at a minimum, one of the bits
** IN_INDEX_MEMBERSHIP or IN_INDEX_LOOP but not both.  If inFlags contains
** IN_INDEX_MEMBERSHIP, then the generated table will be used for a fast
** membership test.  When the IN_INDEX_LOOP bit is set, the IN index will
** be used to loop over all values of the RHS of the IN operator.

**
** When IN_INDEX_LOOP is used (and the b-tree will be used to iterate
** through the set members) then the b-tree must not contain duplicates.
** An epheremal table will be created unless the selected columns are guaranteed
** to be unique - either because it is an INTEGER PRIMARY KEY or due to
** a UNIQUE constraint or index.
**
** When IN_INDEX_MEMBERSHIP is used (and the b-tree will be used 
** for fast set membership tests) then an epheremal table must 
** be used unless <columns> is a single INTEGER PRIMARY KEY column or an 
** index can be found with the specified <columns> as its left-most.
Changes to src/wherecode.c.
372
373
374
375
376
377
378





















379
380
381
382
383
384
385
    if( sqlite3CompareAffinity(p, zAff[i])==SQLITE_AFF_BLOB
     || sqlite3ExprNeedsNoAffinityChange(p, zAff[i])
    ){
      zAff[i] = SQLITE_AFF_BLOB;
    }
  }
}






















/*
** Generate code for a single equality term of the WHERE clause.  An equality
** term can be either X=expr or X IN (...).   pTerm is the term to be 
** coded.
**
** The current value for the constraint is left in a register, the index







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







372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
    if( sqlite3CompareAffinity(p, zAff[i])==SQLITE_AFF_BLOB
     || sqlite3ExprNeedsNoAffinityChange(p, zAff[i])
    ){
      zAff[i] = SQLITE_AFF_BLOB;
    }
  }
}

#ifdef SQLITE_DEBUG
/* Return true if the pSub ExprList is a subset of pMain.  The terms
** of pSub can be in a different order from pMain.  The only requirement
** is that every term in pSub must exist somewhere in pMain.
**
** Return false if pSub contains any term that is not found in pMain.
*/
static int exprListSubset(ExprList *pSub, ExprList *pMain){
  int i, j;
  for(i=0; i<pSub->nExpr; i++){
    Expr *p = pSub->a[i].pExpr;
    for(j=0; j<pMain->nExpr; j++){
      if( sqlite3ExprCompare(0, p, pMain->a[j].pExpr, 0)==0 ) break;
    }
    if( j>=pMain->nExpr ) return 0;
  }
  return 1;
}
#endif /* SQLITE_DEBUG */


/*
** Generate code for a single equality term of the WHERE clause.  An equality
** term can be either X=expr or X IN (...).   pTerm is the term to be 
** coded.
**
** The current value for the constraint is left in a register, the index
459
460
461
462
463
464
465








466
467
468
469
470
471
472
          Expr *pNewRhs = sqlite3ExprDup(db, pOrigRhs->a[iField].pExpr, 0);
          Expr *pNewLhs = sqlite3ExprDup(db, pOrigLhs->a[iField].pExpr, 0);

          pRhs = sqlite3ExprListAppend(pParse, pRhs, pNewRhs);
          pLhs = sqlite3ExprListAppend(pParse, pLhs, pNewLhs);
        }
      }








      if( !db->mallocFailed ){
        Expr *pLeft = pX->pLeft;

        if( pSelect->pOrderBy ){
          /* If the SELECT statement has an ORDER BY clause, zero the 
          ** iOrderByCol variables. These are set to non-zero when an 
          ** ORDER BY term exactly matches one of the terms of the 







>
>
>
>
>
>
>
>







480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
          Expr *pNewRhs = sqlite3ExprDup(db, pOrigRhs->a[iField].pExpr, 0);
          Expr *pNewLhs = sqlite3ExprDup(db, pOrigLhs->a[iField].pExpr, 0);

          pRhs = sqlite3ExprListAppend(pParse, pRhs, pNewRhs);
          pLhs = sqlite3ExprListAppend(pParse, pLhs, pNewLhs);
        }
      }
 
      /* pRhs should be a subset of pOrigRhs (though possibly in a different
      ** order).  And pLhs should be a subset of pOrigLhs.  To put it 
      ** another way:  Every term of pRhs should exist in pOrigRhs and
      ** every term of pLhs should exist in pOrigLhs. */
      assert( db->mallocFailed || exprListSubset(pRhs, pOrigRhs) );
      assert( db->mallocFailed || exprListSubset(pLhs, pOrigLhs) );

      if( !db->mallocFailed ){
        Expr *pLeft = pX->pLeft;

        if( pSelect->pOrderBy ){
          /* If the SELECT statement has an ORDER BY clause, zero the 
          ** iOrderByCol variables. These are set to non-zero when an 
          ** ORDER BY term exactly matches one of the terms of the 
Changes to test/tkt-26ff0c2d1e.test.
27
28
29
30
31
32
33


do_test bug-20100512-3 {
  sqlite3_bind_int $STMT 1 123
  sqlite3_bind_int $STMT 2 456
  sqlite3_step $STMT
  sqlite3_column_int $STMT 0
} {555}
sqlite3_finalize $STMT









>
>
27
28
29
30
31
32
33
34
35
do_test bug-20100512-3 {
  sqlite3_bind_int $STMT 1 123
  sqlite3_bind_int $STMT 2 456
  sqlite3_step $STMT
  sqlite3_column_int $STMT 0
} {555}
sqlite3_finalize $STMT

finish_test
Changes to test/tkt-7a31705a7e6.test.
19
20
21
22
23
24
25



do_execsql_test tkt-7a31705a7e6-1.1 {
  CREATE TABLE t1 (a INTEGER PRIMARY KEY);
  CREATE TABLE t2 (a INTEGER PRIMARY KEY, b INTEGER);
  CREATE TABLE t2x (b INTEGER PRIMARY KEY);
  SELECT t1.a FROM ((t1 JOIN t2 ON t1.a=t2.a) AS x JOIN t2x ON x.b=t2x.b) as y;
} {}









>
>
19
20
21
22
23
24
25
26
27

do_execsql_test tkt-7a31705a7e6-1.1 {
  CREATE TABLE t1 (a INTEGER PRIMARY KEY);
  CREATE TABLE t2 (a INTEGER PRIMARY KEY, b INTEGER);
  CREATE TABLE t2x (b INTEGER PRIMARY KEY);
  SELECT t1.a FROM ((t1 JOIN t2 ON t1.a=t2.a) AS x JOIN t2x ON x.b=t2x.b) as y;
} {}

finish_test
Changes to test/tkt-a8a0d2996a.test.
87
88
89
90
91
92
93


} {-9.22337203685478e+18}
do_execsql_test 4.5 {
  SELECT '9223372036854775806x'+'1x';
} {9.22337203685478e+18}
do_execsql_test 4.6 {
  SELECT '1234x'/'10y';
} {123.4}









>
>
87
88
89
90
91
92
93
94
95
} {-9.22337203685478e+18}
do_execsql_test 4.5 {
  SELECT '9223372036854775806x'+'1x';
} {9.22337203685478e+18}
do_execsql_test 4.6 {
  SELECT '1234x'/'10y';
} {123.4}

finish_test
Changes to test/tkt3334.test.
78
79
80
81
82
83
84


  }
} {1 1 1}
do_test tkt3334-1.10 {
  execsql {
    SELECT count(*) FROM (SELECT a FROM t1) WHERE a=1;
  }
} {3}









>
>
78
79
80
81
82
83
84
85
86
  }
} {1 1 1}
do_test tkt3334-1.10 {
  execsql {
    SELECT count(*) FROM (SELECT a FROM t1) WHERE a=1;
  }
} {3}

finish_test
Changes to test/vacuum4.test.
61
62
63
64
65
66
67


      c120, c121, c122, c123, c124, c125, c126, c127, c128, c129,
      c130, c131, c132, c133, c134, c135, c136, c137, c138, c139,
      c140, c141, c142, c143, c144, c145, c146, c147, c148, c149
    );
    VACUUM;
  }
} {}









>
>
61
62
63
64
65
66
67
68
69
      c120, c121, c122, c123, c124, c125, c126, c127, c128, c129,
      c130, c131, c132, c133, c134, c135, c136, c137, c138, c139,
      c140, c141, c142, c143, c144, c145, c146, c147, c148, c149
    );
    VACUUM;
  }
} {}

finish_test
Changes to test/varint.test.
26
27
28
29
30
31
32


      incr cnt
      do_test varint-1.$cnt {
        btree_varint_test $start $mult 5000 $incr
      } {}
    }
  }
}









>
>
26
27
28
29
30
31
32
33
34
      incr cnt
      do_test varint-1.$cnt {
        btree_varint_test $start $mult 5000 $incr
      } {}
    }
  }
}

finish_test