SQLite

Check-in [8a9b43f930]
Login

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

Overview
Comment:Merge the shared-cache KeyInfo fix from trunk.
Downloads: Tarball | ZIP archive
Timelines: family | ancestors | descendants | both | apple-osx
Files: files | file ages | folders
SHA1: 8a9b43f930de9c789b230909233eee64ad1db93d
User & Date: drh 2014-12-05 20:16:52.803
Context
2014-12-09
15:01
Increase the default PMA size from 10 to 250 pages and provide the SQLITE_SORTER_PMASZ compile-time option to change this default. Add needed mutex call when clearing the KeyInfo cache in shared-cache mode. (check-in: 6e2da589ad user: drh tags: apple-osx)
2014-12-05
20:16
Merge the shared-cache KeyInfo fix from trunk. (check-in: 8a9b43f930 user: drh tags: apple-osx)
19:50
Make sure the WhereTerm objects are fully zeroed when they are allocated. (check-in: fdb667335c user: drh tags: trunk)
00:49
Import compiler warning and autoconf makefile fixes from trunk. (check-in: 5437e0534a user: drh tags: apple-osx)
Changes
Side-by-Side Diff Show Whitespace Changes Patch
Changes to src/main.c.
1031
1032
1033
1034
1035
1036
1037








1038
1039
1040
1041
1042
1043
1044
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052







+
+
+
+
+
+
+
+







  /* Free any outstanding Savepoint structures. */
  sqlite3CloseSavepoints(db);

  /* Close all database connections */
  for(j=0; j<db->nDb; j++){
    struct Db *pDb = &db->aDb[j];
    if( pDb->pBt ){
      if( pDb->pSchema ){
        /* Must clear the KeyInfo cache.  See ticket [e4a18565a36884b00edf] */
        for(i=sqliteHashFirst(&pDb->pSchema->idxHash); i; i=sqliteHashNext(i)){
          Index *pIdx = sqliteHashData(i);
          sqlite3KeyInfoUnref(pIdx->pKeyInfo);
          pIdx->pKeyInfo = 0;
        }
      }
      sqlite3BtreeClose(pDb->pBt);
      pDb->pBt = 0;
      if( j!=1 ){
        pDb->pSchema = 0;
      }
    }
  }
Changes to src/where.c.
218
219
220
221
222
223
224

225
226
227
228
229
230
231
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232







+







      return 0;
    }
    memcpy(pWC->a, pOld, sizeof(pWC->a[0])*pWC->nTerm);
    if( pOld!=pWC->aStatic ){
      sqlite3DbFree(db, pOld);
    }
    pWC->nSlot = sqlite3DbMallocSize(db, pWC->a)/sizeof(pWC->a[0]);
    memset(&pWC->a[pWC->nTerm], 0, sizeof(pWC->a[0])*(pWC->nSlot-pWC->nTerm));
  }
  pTerm = &pWC->a[idx = pWC->nTerm++];
  if( p && ExprHasProperty(p, EP_Unlikely) ){
    pTerm->truthProb = sqlite3LogEst(p->iTable) - 270;
  }else{
    pTerm->truthProb = 1;
  }
Added test/sharedB.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
50
51
52
53
54
55
56
57
58
59
60
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
# 2014-12-05
#
# 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.
#
#***********************************************************************
#
# Open two database connections on the same database in shared cache
# mode.  Hold one open while repeatedly closing, reopening, and using
# the second.
#
# This test is designed to demostrate that the fix for ticket
# [e4a18565a36884b00edf66541f38c693827968ab] works.  
#


set testdir [file dirname $argv0]
source $testdir/tester.tcl
if {[run_thread_tests]==0} { finish_test ; return }
db close
set ::testprefix sharedB

set ::enable_shared_cache [sqlite3_enable_shared_cache 1]

#-------------------------------------------------------------------------
#
do_test 1.1 {
  sqlite3 db1 test.db
  sqlite3 db2 test.db

  db1 eval {
    CREATE TABLE t1(x,y TEXT COLLATE nocase);
    WITH RECURSIVE
      c(i) AS (VALUES(1) UNION ALL SELECT i+1 FROM c WHERE i<100)
    INSERT INTO t1(x,y) SELECT i, printf('x%03dy',i) FROM c;
    CREATE INDEX t1yx ON t1(y,x);
  }
  db2 eval {
    SELECT x FROM t1 WHERE y='X014Y';
  }
} {14}

for {set j 1} {$j<=100} {incr j} {
  do_test 1.2.$j {
    db2 close
    sqlite3 db2 test.db
    db2 eval {
      SELECT x FROM t1 WHERE y='X014Y';
    }
  } {14}
}

db1 close
db2 close
sqlite3_enable_shared_cache $::enable_shared_cache
finish_test