/ Check-in [300038be]
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

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

Overview
Comment:Fix bugs in temp database handling introduced by the prevous check-in. (CVS 4288)
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1: 300038be9368556a29efce7cf3657fabfe54d8f9
User & Date: drh 2007-08-24 16:29:24
Context
2007-08-24
17:52
Rework the win32 OS driver to use malloc()/free() directly rather than going through the SQLite memory allocation layer. With this change, the complete quick.test script now runs on windows. There are a few errors, but no segfaults. Progress. (CVS 4289) check-in: 75aad316 user: drh tags: trunk
16:29
Fix bugs in temp database handling introduced by the prevous check-in. (CVS 4288) check-in: 300038be user: drh tags: trunk
16:08
Remove nRef and vfsMutex from the sqlite3_vfs structure. Omit the sqlite3_vfs_release() interface. Less memory allocated for a pager in the common case where the size of the pathname is less than MAX_PATH. (CVS 4287) check-in: b8451da3 user: drh tags: trunk
Changes
Hide Diffs Unified Diffs Ignore Whitespace Patch

Changes to src/pager.c.

14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
....
1804
1805
1806
1807
1808
1809
1810

1811


1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833





1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
....
1898
1899
1900
1901
1902
1903
1904




1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
....
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
** The pager is used to access a database disk file.  It implements
** atomic commit and rollback through the use of a journal file that
** is separate from the database file.  The pager also implements file
** locking to prevent two processes from writing the same database
** file simultaneously, or one process from reading the database while
** another is writing.
**
** @(#) $Id: pager.c,v 1.375 2007/08/24 16:08:29 drh Exp $
*/
#ifndef SQLITE_OMIT_DISKIO
#include "sqliteInt.h"
#include <assert.h>
#include <string.h>

/*
................................................................................
/*
** Open a temporary file. 
**
** Write the file descriptor into *fd.  Return SQLITE_OK on success or some
** other error code if we fail. The OS will automatically delete the temporary
** file when it is closed.
**

** If zNameOut is 0, then SQLITE_OPEN_SUBJOURNAL is passed to the OS layer.


** If zNameOut is not 0, SQLITE_OPEN_TEMP_DB is passed.
*/
static int sqlite3PagerOpentemp(
  sqlite3_vfs *pVfs, 
  sqlite3_file *pFile, 
  char *zNameOut
){
  int cnt = 8;
  int rc;
  int flags = (
     SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|
     SQLITE_OPEN_EXCLUSIVE|SQLITE_OPEN_DELETEONCLOSE
  );

  char *zFree = 0;
  if( zNameOut==0 ){
    zFree = (char *)sqlite3_malloc(pVfs->mxPathname);
    if( !zFree ){
      return SQLITE_NOMEM;
    }
    zNameOut = zFree;
    flags |= SQLITE_OPEN_SUBJOURNAL;





  }else{
    flags |= SQLITE_OPEN_TEMP_DB;
  }

#ifdef SQLITE_TEST
  sqlite3_opentemp_count++;  /* Used for testing and analysis only */
#endif

  do{
    cnt--;
    sqlite3OsGetTempName(pVfs, zNameOut);
    rc = sqlite3OsOpen(pVfs, zNameOut, pFile, flags, 0);
    assert( rc!=SQLITE_OK || pFile->pMethods );
  }while( cnt>0 && rc!=SQLITE_OK && rc!=SQLITE_NOMEM );

  sqlite3_free(zFree);
  return rc;
}

/*
** Create a new page cache and put a pointer to the page cache in *ppPager.
** The file to be cached need not exist.  The file is not locked until
................................................................................
    if( strcmp(zFilename,":memory:")==0 ){
      memDb = 1;
      zPathname[0] = 0;
    }else
#endif
    {
      rc = sqlite3OsFullPathname(pVfs, zFilename, zPathname);




      if( rc!=SQLITE_OK ){
        sqlite3_free(zPathname);
        return rc;
      }
    }
  }else{
    zPathname[0] = 0;
  }
  nPathname = strlen(zPathname);

  /* Allocate memory for the pager structure */
  pPager = sqlite3MallocZero(
    sizeof(*pPager) +           /* Pager structure */
    journalFileSize +           /* The journal file structure */ 
................................................................................
  pPager->zJournal = &pPager->zDirectory[nPathname+1];
  pPager->pVfs = pVfs;
  memcpy(pPager->zFilename, zPathname, nPathname+1);
  sqlite3_free(zPathname);

  /* Open the pager file.
  */
  if( pPager->zFilename[0] ){
    if( nPathname>(pVfs->mxPathname - sizeof("-journal")) ){
      rc = SQLITE_CANTOPEN;
    }else{
/***  FIXME:  Might need to be SQLITE_OPEN_TEMP_DB.  Need to pass in
**** a flag from higher up.
****/
      int oflag = 







|







 







>
|
>
>
|




|

<







|




|

>
>
>
>
>








<
<
<
|
|
<
<







 







>
>
>
>
|
|
|
<
<
<
<







 







|







14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
....
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821

1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848



1849
1850


1851
1852
1853
1854
1855
1856
1857
....
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913




1914
1915
1916
1917
1918
1919
1920
....
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
** The pager is used to access a database disk file.  It implements
** atomic commit and rollback through the use of a journal file that
** is separate from the database file.  The pager also implements file
** locking to prevent two processes from writing the same database
** file simultaneously, or one process from reading the database while
** another is writing.
**
** @(#) $Id: pager.c,v 1.376 2007/08/24 16:29:24 drh Exp $
*/
#ifndef SQLITE_OMIT_DISKIO
#include "sqliteInt.h"
#include <assert.h>
#include <string.h>

/*
................................................................................
/*
** Open a temporary file. 
**
** Write the file descriptor into *fd.  Return SQLITE_OK on success or some
** other error code if we fail. The OS will automatically delete the temporary
** file when it is closed.
**
** If zFilename is 0, then an appropriate temporary filename is
** generated automatically and  SQLITE_OPEN_SUBJOURNAL is passed to
** the OS layer as the file type.
**
** If zFilename is not 0, SQLITE_OPEN_TEMP_DB is passed as the file type.
*/
static int sqlite3PagerOpentemp(
  sqlite3_vfs *pVfs, 
  sqlite3_file *pFile, 
  char *zFilename
){

  int rc;
  int flags = (
     SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|
     SQLITE_OPEN_EXCLUSIVE|SQLITE_OPEN_DELETEONCLOSE
  );

  char *zFree = 0;
  if( zFilename==0 ){
    zFree = (char *)sqlite3_malloc(pVfs->mxPathname);
    if( !zFree ){
      return SQLITE_NOMEM;
    }
    zFilename = zFree;
    flags |= SQLITE_OPEN_SUBJOURNAL;
    rc = sqlite3OsGetTempName(pVfs, zFilename);
    if( rc!=SQLITE_OK ){
      sqlite3_free(zFree);
      return rc;
    }
  }else{
    flags |= SQLITE_OPEN_TEMP_DB;
  }

#ifdef SQLITE_TEST
  sqlite3_opentemp_count++;  /* Used for testing and analysis only */
#endif




  rc = sqlite3OsOpen(pVfs, zFilename, pFile, flags, 0);
  assert( rc!=SQLITE_OK || pFile->pMethods );


  sqlite3_free(zFree);
  return rc;
}

/*
** Create a new page cache and put a pointer to the page cache in *ppPager.
** The file to be cached need not exist.  The file is not locked until
................................................................................
    if( strcmp(zFilename,":memory:")==0 ){
      memDb = 1;
      zPathname[0] = 0;
    }else
#endif
    {
      rc = sqlite3OsFullPathname(pVfs, zFilename, zPathname);
    }
  }else{
    rc = sqlite3OsGetTempName(pVfs, zPathname);
  }
  if( rc!=SQLITE_OK ){
    sqlite3_free(zPathname);
    return rc;




  }
  nPathname = strlen(zPathname);

  /* Allocate memory for the pager structure */
  pPager = sqlite3MallocZero(
    sizeof(*pPager) +           /* Pager structure */
    journalFileSize +           /* The journal file structure */ 
................................................................................
  pPager->zJournal = &pPager->zDirectory[nPathname+1];
  pPager->pVfs = pVfs;
  memcpy(pPager->zFilename, zPathname, nPathname+1);
  sqlite3_free(zPathname);

  /* Open the pager file.
  */
  if( zFilename && zFilename[0] && !memDb ){
    if( nPathname>(pVfs->mxPathname - sizeof("-journal")) ){
      rc = SQLITE_CANTOPEN;
    }else{
/***  FIXME:  Might need to be SQLITE_OPEN_TEMP_DB.  Need to pass in
**** a flag from higher up.
****/
      int oflag = 

Changes to test/pager.test.

7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
...
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
#    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.  The
# focus of this script is page cache subsystem.
#
# $Id: pager.test,v 1.29 2007/08/24 16:08:29 drh Exp $


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

if {[info commands pager_open]!=""} {
db close
................................................................................
do_test pager-4.6.1 {
  pager_close [pager_open ptf2.db -15]
} {}

# Test truncate on an in-memory database is Ok.
ifcapable memorydb {
  do_test pager-4.6.2 {
btree_breakpoint
    set ::p2 [pager_open :memory: 10]
    pager_truncate $::p2 5
  } {}
  do_test pager-4.6.3 {
    for {set i 1} {$i<5} {incr i} {
      set p [page_get $::p2 $i]
      page_write $p "Page $i"







|







 







<







7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
...
405
406
407
408
409
410
411

412
413
414
415
416
417
418
#    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.  The
# focus of this script is page cache subsystem.
#
# $Id: pager.test,v 1.30 2007/08/24 16:29:24 drh Exp $


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

if {[info commands pager_open]!=""} {
db close
................................................................................
do_test pager-4.6.1 {
  pager_close [pager_open ptf2.db -15]
} {}

# Test truncate on an in-memory database is Ok.
ifcapable memorydb {
  do_test pager-4.6.2 {

    set ::p2 [pager_open :memory: 10]
    pager_truncate $::p2 5
  } {}
  do_test pager-4.6.3 {
    for {set i 1} {$i<5} {incr i} {
      set p [page_get $::p2 $i]
      page_write $p "Page $i"