[TEST] sqlite3-3.7.17-3

Warren Young warren@etr-usa.com
Tue Jun 11 15:04:00 GMT 2013


This is the first formal test release of SQLite 3.7.17.  These are -3 
packages because there were two informal test releases prior to this.

Because it is a "test" release, you have to select it specially from the 
setup.exe packages screen.  You still get 3.7.16.2-1 by default.

Aside from tracking the upstream .17 release, this Cygwin build does 
many things, which is why I am going through a multistage test sequence. 
  This is the last stage before final release.



Heretofore, Cygwin SQLite has been built in "Cygwin mode," where SQLite 
bypasses the Cygwin DLL for some calls, particularly in regards to file 
locking.  These calls go straight to the Win32 API.  This lets Cygwin 
SQLite do file locking the same way native Win32 builds of SQLite do, so 
that any pair of programs can cooperate in their use of a single DB 
file, regardless of which version of SQLite they are built against.

I did once (3.7.12.1-1) ship Cygwin SQLite built the other way, in "Unix 
mode," which forces the SQLite code to treat Cygwin as any other POSIX 
platform.  This has the benefit that file locking works the way POSIX 
programs expect, but it breaks compatibility with the huge number of 
programs built against native SQLite.

This gave me a choice of evils: I could choose to break compatibility 
with native Win32 programs, or I could break compatibility with other 
Cygwin programs.  I chose the second option, simply because there are 
more native Win32 programs than Cygwin programs using SQLite.

This impasse was broken -- we hope -- by a feature added by Corinna in 
Cygwin 1.7.19 and extended in 1.7.20.  It allows a program -- such as 
Cygwin SQLite -- to request that the DLL do file locking in a way more 
compatible with native Windows programs.  This release uses this new 
feature by default, so that despite being built in Unix mode, it should 
still interoperate with native Windows programs that also use SQLite.

You do require Cygwin 1.7.20 to properly test this new package.  The 
variant of the feature in 1.7.19 doesn't work for SQLite, so this -3 
test release no longer has code to attempt to enable it.  (The original 
version of this new feature may still be useful to other programs, so it 
hasn't been removed from the Cygwin DLL.)  These new packages will still 
run under Cygwin 1.7.18 and earlier, but they will behave the same as 
the ill-fated SQLite 3.7.12.1 release in regards to locking.

If you have had problems in the past with SQLite interoperability with 
native Windows programs, please test with this new release.  You 
shouldn't have to do anything to test its interoperability with native 
Windows programs.

If your interop problems were with other Cygwin programs, then you want 
to set the new CYGWIN_SQLITE_LOCKING environment variable to "posix". 
(Case doesn't matter.)  This will suppress Cygwin SQLite's call to the 
new Cygwin API, so it behaves like a stock Unix mode build.

Because this test release removes the "posixmand" feature, if you tested 
the -1 or -2 releases, I ask that you re-test with -3.  I believe you 
will see no change, but y'all are the ones with all the important test 
cases. :)



This version of Cygwin SQLite also makes one other big, potentially 
breaking change: temporary files are created in-memory exclusively, by 
default.

There is some concern that this could cause problems with huge DB files 
on 32-bit Cygwin.  If this version of SQLite fails with some 
out-of-memory error with your DB, there is a pragma you can set to make 
it behave the old way:

	https://www.sqlite.org/pragma.html#pragma_temp_store

If setting this pragma to 1 fixes such an error, I want to hear it! 
(I'd also be curious to know how big the DB file is, and how much RAM 
there is in your machine.)

Note that this isn't the same thing as loading the entire DB into RAM. 
If your DB is, say, 5 GB, you needn't worry about 4 GB memory limits in 
32-bit systems.  The problem should only come up with DB files much 
bigger than this, so that it needs gigs just to store its temporary 
working data.

The open question is what that ratio is, between DB file size and 
working set size.  It is doubtless dependent on the queries you run, and 
probably on other things like indexing.



More information about the Cygwin-announce mailing list