]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Support in-memory databases for temp tables (CVS 903)
authorpaul <paul@noemail.net>
Sun, 13 Apr 2003 18:26:49 +0000 (18:26 +0000)
committerpaul <paul@noemail.net>
Sun, 13 Apr 2003 18:26:49 +0000 (18:26 +0000)
FossilOrigin-Name: 96336bffde6c441af197a521ee9e56fdfd7efff8

13 files changed:
Makefile.in
configure
configure.ac
manifest
manifest.uuid
src/attach.c
src/btree.c
src/build.c
src/main.c
src/pragma.c
src/sqliteInt.h
src/test3.c
src/vdbe.c

index 398d593bbc0e95fe57a9485d86d46d22315a993f..ea77dbeb21fe9c80f5274cdf337a32f7883b18b9 100644 (file)
@@ -57,6 +57,17 @@ LIBREADLINE = @TARGET_READLINE_LIBS@
 # ENCODING  = ISO8859
 ENCODING = @ENCODING@
 
+# Flags controlling use of the in memory btree implementation
+# INCOREDB says whether to build btree_rb.c
+# TEMPDBINCORE controls the default placement of temporary databases.
+# ALLOWATTACHMEM controls whether ATTACH DATABASE ':memory:' is supported
+INCOREDB = @INCOREDB@
+TEMPDBINCORE = @TEMPDBINCORE@
+ALLOWATTACHMEM = @ALLOWATTACHMEM@
+
+INCOREFLAGS = -DINCOREDB=${INCOREDB} -DTEMPDBINCORE=${TEMPDBINCORE} 
+INCOREFLAGS += -DALLOWATTACHMEM=${ALLOWATTACHMEM}
+
 # You should not have to change anything below this line
 ###############################################################################
 
@@ -69,6 +80,10 @@ LIBOBJ = attach.lo auth.lo btree.lo build.lo copy.lo \
          update.lo util.lo vacuum.lo vdbe.lo \
          where.lo trigger.lo
 
+ifeq (${INCOREDB},1)
+LIBOBJ += btree_rb.lo
+endif
+
 # All of the source code files.
 #
 SRC = \
@@ -177,11 +192,14 @@ lemon:    $(TOP)/tool/lemon.c $(TOP)/tool/lempar.c
 btree.lo:      $(TOP)/src/btree.c $(HDR) $(TOP)/src/pager.h
        $(LIBTOOL) $(TCC) -c $(TOP)/src/btree.c
 
+btree_rb.lo:   $(TOP)/src/btree_rb.c $(HDR)
+       $(LIBTOOL) $(TCC) -c $(TOP)/src/btree_rb.c
+
 build.lo:      $(TOP)/src/build.c $(HDR)
        $(LIBTOOL) $(TCC) -c $(TOP)/src/build.c
 
 main.lo:       $(TOP)/src/main.c $(HDR)
-       $(LIBTOOL) $(TCC) -c $(TOP)/src/main.c
+       $(LIBTOOL) $(TCC) -c ${INCOREFLAGS} $(TOP)/src/main.c
 
 pager.lo:      $(TOP)/src/pager.c $(HDR) $(TOP)/src/pager.h
        $(LIBTOOL) $(TCC) -c $(TOP)/src/pager.c
index fc3a79e353c505ce07d02ad6d3936ee169cbda33..e01428ab23114d6ea9e787e84e4a58272c117b7d 100755 (executable)
--- a/configure
+++ b/configure
@@ -467,7 +467,7 @@ ac_includes_default="\
 # include <unistd.h>
 #endif"
 
-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT LN_S ECHO RANLIB ac_ct_RANLIB STRIP ac_ct_STRIP CPP EGREP LIBTOOL INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA program_prefix VERSION BUILD_CC BUILD_CFLAGS BUILD_LIBS TARGET_CC TARGET_CFLAGS TARGET_LINK TARGET_LFLAGS TARGET_RANLIB TARGET_AR ENCODING BUILD_EXEEXT OS_UNIX OS_WIN TARGET_EXEEXT TARGET_LIBS TARGET_TCL_LIBS TARGET_TCL_INC TARGET_READLINE_LIBS TARGET_READLINE_INC TARGET_HAVE_READLINE LIBOBJS LTLIBOBJS'
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT LN_S ECHO RANLIB ac_ct_RANLIB STRIP ac_ct_STRIP CPP EGREP LIBTOOL INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA program_prefix VERSION BUILD_CC BUILD_CFLAGS BUILD_LIBS TARGET_CC TARGET_CFLAGS TARGET_LINK TARGET_LFLAGS TARGET_RANLIB TARGET_AR ENCODING ALLOWATTACHMEM INCOREDB TEMPDBINCORE BUILD_EXEEXT OS_UNIX OS_WIN TARGET_EXEEXT TARGET_LIBS TARGET_TCL_LIBS TARGET_TCL_INC TARGET_READLINE_LIBS TARGET_READLINE_INC TARGET_HAVE_READLINE LIBOBJS LTLIBOBJS'
 ac_subst_files=''
 
 # Initialize some variables set by options.
@@ -1007,6 +1007,8 @@ Optional Features:
   --enable-fast-install=PKGS  optimize for fast installation default=yes
   --disable-libtool-lock  avoid locking (might break parallel builds)
   --enable-utf8           Use UTF-8 encodings
+  --enable-incore-db           Support incore database
+  --enable-tempdb-in-ram     Use an in-ram database for temporary tables
 
 Optional Packages:
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
@@ -1432,7 +1434,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
 # The following RCS revision string applies to configure.in
-# $Revision: 1.13 $
+# $Revision: 1.14 $
 
 #########
 # Programs needed
@@ -4034,7 +4036,7 @@ test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
 case $host in
 *-*-irix6*)
   # Find out which ABI we are using.
-  echo '#line 4037 "configure"' > conftest.$ac_ext
+  echo '#line 4039 "configure"' > conftest.$ac_ext
   if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
@@ -4563,7 +4565,7 @@ chmod -w .
 save_CFLAGS="$CFLAGS"
 CFLAGS="$CFLAGS -o out/conftest2.$ac_objext"
 compiler_c_o=no
-if { (eval echo configure:4566: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.$ac_objext; then
+if { (eval echo configure:4568: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.$ac_objext; then
   # The compiler can only warn and ignore the option if not recognized
   # So say no if there are warnings
   if test -s out/conftest.err; then
@@ -6408,7 +6410,7 @@ else
     lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<EOF
-#line 6411 "configure"
+#line 6413 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -6506,7 +6508,7 @@ else
     lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<EOF
-#line 6509 "configure"
+#line 6511 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -8242,6 +8244,71 @@ echo "${ECHO_T}UTF-8" >&6
 fi
 
 
+##########
+# Do we want to support in-ram databases for ATTACH DATABASE and sqlite_open
+#
+# Check whether --enable-incore-db or --disable-incore-db was given.
+if test "${enable_incore_db+set}" = set; then
+  enableval="$enable_incore_db"
+
+else
+  enable_incore-db=yes
+fi;
+echo "$as_me:$LINENO: checking whether to support incore databases for attach and open" >&5
+echo $ECHO_N "checking whether to support incore databases for attach and open... $ECHO_C" >&6
+if test "$enable_incore-db" = "no"; then
+  INCOREDB=0
+  ALLOWATTACHMEM=0
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+else
+  INCOREDB=1
+  ALLOWATTACHMEM=1
+  echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+fi
+
+
+##########
+# Do we want temporary databases in memory
+#
+# Check whether --enable-tempdb-in-ram or --disable-tempdb-in-ram was given.
+if test "${enable_tempdb_in_ram+set}" = set; then
+  enableval="$enable_tempdb_in_ram"
+
+else
+  enable_tempdb-in-ram=no
+fi;
+echo "$as_me:$LINENO: checking whether to use an in-ram database for temporary tables" >&5
+echo $ECHO_N "checking whether to use an in-ram database for temporary tables... $ECHO_C" >&6
+case "$enable_tempdb-in-ram" in
+  never )
+    TEMPDBINCORE=0
+    echo "$as_me:$LINENO: result: never" >&5
+echo "${ECHO_T}never" >&6
+  ;;
+  no )
+    INCOREDB=1
+    TEMPDBINCORE=1
+    echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+  ;;
+  always )
+    INCOREDB=1
+    TEMPDBINCORE=3
+    echo "$as_me:$LINENO: result: always" >&5
+echo "${ECHO_T}always" >&6
+  ;;
+  * )
+    INCOREDB=1
+    TEMPDBINCORE=2
+    echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+  ;;
+esac
+
+
+
 ###########
 # Lots of things are different if we are compiling for Windows using
 # the CYGWIN environment.  So check for that special case and handle
@@ -9859,6 +9926,9 @@ s,@TARGET_LFLAGS@,$TARGET_LFLAGS,;t t
 s,@TARGET_RANLIB@,$TARGET_RANLIB,;t t
 s,@TARGET_AR@,$TARGET_AR,;t t
 s,@ENCODING@,$ENCODING,;t t
+s,@ALLOWATTACHMEM@,$ALLOWATTACHMEM,;t t
+s,@INCOREDB@,$INCOREDB,;t t
+s,@TEMPDBINCORE@,$TEMPDBINCORE,;t t
 s,@BUILD_EXEEXT@,$BUILD_EXEEXT,;t t
 s,@OS_UNIX@,$OS_UNIX,;t t
 s,@OS_WIN@,$OS_WIN,;t t
index eb7aa88bc80128d5bd8d141f4d8499cf0af24078..15a4b1b1e0574672dbeb0cbfc6bd22d8fd381574 100644 (file)
@@ -138,7 +138,7 @@ AC_INIT(src/sqlite.h.in)
 dnl Put the RCS revision string after AC_INIT so that it will also
 dnl show in in configure.
 # The following RCS revision string applies to configure.in
-# $Revision: 1.2 $
+# $Revision: 1.3 $
 
 #########
 # Programs needed
@@ -305,6 +305,53 @@ else
 fi
 AC_SUBST(ENCODING)
 
+##########
+# Do we want to support in-ram databases for ATTACH DATABASE and sqlite_open
+#
+AC_ARG_ENABLE(incore-db, 
+[  --enable-incore-db           Support incore database],,enable_incore-db=yes)
+AC_MSG_CHECKING([whether to support incore databases for attach and open])
+if test "$enable_incore-db" = "no"; then
+  INCOREDB=0
+  ALLOWATTACHMEM=0
+  AC_MSG_RESULT([no])
+else
+  INCOREDB=1
+  ALLOWATTACHMEM=1
+  AC_MSG_RESULT([yes])
+fi
+AC_SUBST(ALLOWATTACHMEM)
+
+##########
+# Do we want temporary databases in memory
+#
+AC_ARG_ENABLE(tempdb-in-ram, 
+[  --enable-tempdb-in-ram     Use an in-ram database for temporary tables],,enable_tempdb-in-ram=no)
+AC_MSG_CHECKING([whether to use an in-ram database for temporary tables])
+case "$enable_tempdb-in-ram" in
+  never ) 
+    TEMPDBINCORE=0
+    AC_MSG_RESULT([never])
+  ;;
+  no ) 
+    INCOREDB=1
+    TEMPDBINCORE=1
+    AC_MSG_RESULT([no])
+  ;;
+  always ) 
+    INCOREDB=1
+    TEMPDBINCORE=3
+    AC_MSG_RESULT([always])
+  ;;
+  * ) 
+    INCOREDB=1
+    TEMPDBINCORE=2
+    AC_MSG_RESULT([yes])
+  ;;
+esac
+AC_SUBST(INCOREDB)
+AC_SUBST(TEMPDBINCORE)
+
 ###########
 # Lots of things are different if we are compiling for Windows using
 # the CYGWIN environment.  So check for that special case and handle
index 79e87278a72891cc7bc9f89ede757ee4194d889b..4f77037db43a5c1f1cacba5955f5930cf3697b99 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,14 +1,14 @@
-C Split\sthe\simplementation\sof\sCOPY,\sPRAGMA,\sand\sATTACH\sinto\sseparate\nsource\scode\sfiles.\s(CVS\s902)
-D 2003-04-06T21:08:24
-F Makefile.in 935bf18ecefa32f780acdc1660852403468f0058
+C Support\sin-memory\sdatabases\sfor\stemp\stables\s(CVS\s903)
+D 2003-04-13T18:26:49
+F Makefile.in 503590f4bdb4733d4c1f114939d68ff8a74523c6
 F Makefile.linux-gcc b86a99c493a5bfb402d1d9178dcdc4bd4b32f906
 F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd
 F VERSION e5b03976c56deafa24511d6ef17d64a28679e9bd
 F aclocal.m4 ff32919e75f42b2d4213fe3c6f79dd0fe47f7769
 F config.guess 831db445a8ae31d1f773fce85e14c16c8677417d
 F config.sub 975368989965310238930ecf8e7f06a23061dbb1
-F configure b9ece53c0bca7c50934980dd5c460d7b1a315955 x
-F configure.ac 222ba4ebf74c05114a2b4922843ec57e3d41b7c8
+F configure 21b2d9997812b8134fe6281aca659af23fd92131 x
+F configure.ac 6bd07419ebca8993cd117a2fb58629c2b506d71c
 F doc/lemon.html f0f682f50210928c07e562621c3b7e8ab912a538
 F doc/report1.txt a031aaf37b185e4fa540223cb516d3bccec7eeac
 F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895
@@ -19,11 +19,11 @@ F publish.sh 86b5e8535830a2588f62ce1d5d1ef00e1dede23a
 F spec.template 238f7db425a78dc1bb7682e56e3834c7270a3f5e
 F sqlite.1 83f4a9d37bdf2b7ef079a82d54eaf2e3509ee6ea
 F sqlite.pc.in 30552343140c53304c2a658c080fbe810cd09ca2
-F src/attach.c 1e429791ee28427403938388ede9fea2caef17b2
+F src/attach.c 8c98e2c0ca434b94deca1b8694c72bd0303a9a87
 F src/auth.c f37bfc9451b8c1fa52f34adff474560018892729
-F src/btree.c 3b0e0f09886bc83fa183df367d6a1b7077da9c46
+F src/btree.c 9949031b6087e9d1b43b359b84c68a491086984f
 F src/btree.h 5cb871546bd6fa58396a6f033e2b29b388241e1b
-F src/build.c f0c774c4c4ec7d79d1021de7d941863faeb77fd6
+F src/build.c 77b910f739174b0655f052ce8c1a7a0f01d3bfca
 F src/copy.c ddd204d5dddac09d71a07f4ceded4c9926d5512b
 F src/delete.c 58d698779a6b7f819718ecd45b310a9de8537088
 F src/encode.c faf03741efe921755ec371cf4a6984536de00042
@@ -32,33 +32,33 @@ F src/func.c 882c3ed5a02be18cd904715c7ec62947a34a3605
 F src/hash.c 4fc39feb7b7711f6495ee9f2159559bedb043e1f
 F src/hash.h cd0433998bc1a3759d244e1637fe5a3c13b53bf8
 F src/insert.c e2f5e7feecb507d904a7da48874595f440b715aa
-F src/main.c c5109638c0cd86fa450faa2bd5a60468325aef69
+F src/main.c 8500dcd5dab93b201842b6688e0329c2b25c0d79
 F src/md5.c fe4f9c9c6f71dfc26af8da63e4d04489b1430565
 F src/os.c c33ebb320921b8df6d09ea19fe846348df86a0c9
 F src/os.h aa52f0c9da321ff6134d19f2ca959e18e33615d0
 F src/pager.c df4c81350cbd80c1ab48341ae0768ba78d99ad49
 F src/pager.h e3702f7d384921f6cd5ce0b3ed589185433e9f6c
 F src/parse.y 3be47fa18323aa2e3364fc42bf7a6ba5b3cc0a81
-F src/pragma.c 927fc036580eea38ae05c5f0da75fd4ee340f6f0
+F src/pragma.c 476b13896571bc8d1049d6dbe9c9a84e6d4e33c8
 F src/printf.c fc5fdef6e92ad205005263661fe9716f55a49f3e
 F src/random.c 19e8e00fe0df32a742f115773f57651be327cabe
 F src/select.c 14e2e2a512f4edfc75fb310ebcb502ff3ee87402
 F src/shell.c 97f397c0c108176ccbc52ea5b8ec688f995eba7a
 F src/shell.tcl 27ecbd63dd88396ad16d81ab44f73e6c0ea9d20e
 F src/sqlite.h.in f49c2cdec7d24cb03e496a1ca519e16306495ee1
-F src/sqliteInt.h 5c2371b20f69f2607ee988ba0aee85cdf9367370
+F src/sqliteInt.h 3dcd08da7d9a9f85dcd67a064f1e9baa17238d3a
 F src/table.c eed2098c9b577aa17f8abe89313a9c4413f57d63
 F src/tclsqlite.c 7a072c3c8ba9796edc25e5ffa62b68558134e192
 F src/test1.c 7ad4e6308dde0bf5a0f0775ce20cb2ec37a328f8
 F src/test2.c 5014337d8576b731cce5b5a14bec4f0daf432700
-F src/test3.c c12ea7f1c3fbbd58904e81e6cb10ad424e6fc728
+F src/test3.c 30985ebdfaf3ee1462a9b0652d3efbdc8d9798f5
 F src/threadtest.c d641a5219e718e18a1a80a50eb9bb549f451f42e
 F src/tokenize.c 675b4718d17c69fe7609dc8e85e426ef002be811
 F src/trigger.c bd5a5b234b47f28f9f21a46243dcaf1c5b2383a3
 F src/update.c b368369f1fbe6d7f56a53e5ffad3b75dae9e3e1a
 F src/util.c 8953c612a036e30f24c1c1f5a1498176173daa37
 F src/vacuum.c 6b9ebf0ef5761b06ce86672574c71b1e9098ef9c
-F src/vdbe.c 540c480912e11e23f5c08a31b8b3594df016f4d1
+F src/vdbe.c 45d2987a5f8337d9aa0da92830fd654fb5fcd478
 F src/vdbe.h 985c24f312d10f9ef8f9a8b8ea62fcdf68e82f21
 F src/where.c e5733f7d5e9cc4ed3590dc3401f779e7b7bb8127
 F test/all.test 569a92a8ee88f5300c057cc4a8f50fbbc69a3242
@@ -161,7 +161,7 @@ F www/speed.tcl cb4c10a722614aea76d2c51f32ee43400d5951be
 F www/sqlite.tcl ae3dcfb077e53833b59d4fcc94d8a12c50a44098
 F www/tclsqlite.tcl 1db15abeb446aad0caf0b95b8b9579720e4ea331
 F www/vdbe.tcl 2013852c27a02a091d39a766bc87cff329f21218
-P b123c165fd3d0a5a86ee8a7baa669105dafb481a
-R 351f9d3f3ae1d413356658b3a79e309f
-U drh
-Z 8dcf477abd69457b6da834133632d978
+P 73359037ea639abb066c74db9c19e84bf1104006
+R 4a0923ca1b7d3d92da7657c4b796ad95
+U paul
+Z 85c89f43ad9bfc64133f7dac4ee2ff75
index 84f4d174de2796c11283e231882f6cb8418fd40b..44bbc6d75e56d6e4dd8db760770bc33b3d045b85 100644 (file)
@@ -1 +1 @@
-73359037ea639abb066c74db9c19e84bf1104006
\ No newline at end of file
+96336bffde6c441af197a521ee9e56fdfd7efff8
\ No newline at end of file
index a2ffc28c68679d13dc30302d52dd90716f1a9ca4..3e79cacbd97d460eff8e6a3b58517d94de64dc27 100644 (file)
@@ -11,7 +11,7 @@
 *************************************************************************
 ** This file contains code used to implement the ATTACH and DETACH commands.
 **
-** $Id: attach.c,v 1.1 2003/04/06 21:08:24 drh Exp $
+** $Id: attach.c,v 1.2 2003/04/13 18:26:51 paul Exp $
 */
 #include "sqliteInt.h"
 
@@ -76,7 +76,7 @@ void sqliteAttach(Parse *pParse, Token *pFilename, Token *pDbname){
   sqliteSetNString(&zFile, pFilename->z, pFilename->n, 0);
   if( zFile==0 ) return;
   sqliteDequote(zFile);
-  rc = sqliteBtreeOpen(zFile, 0, MAX_PAGES, &aNew->pBt);
+  rc = sqliteBtreeFactory(db, zFile, 0, MAX_PAGES, &aNew->pBt);
   if( rc ){
     sqliteErrorMsg(pParse, "unable to open database: %s", zFile);
   }
index a47b98a7c933346e7dd0335537d926608d00f0c3..dca1be374670a028d209cc2230074f3dbe8abab2 100644 (file)
@@ -9,7 +9,7 @@
 **    May you share freely, never taking more than you give.
 **
 *************************************************************************
-** $Id: btree.c,v 1.87 2003/04/06 20:44:45 drh Exp $
+** $Id: btree.c,v 1.88 2003/04/13 18:26:51 paul Exp $
 **
 ** This file implements a external (disk-based) database using BTrees.
 ** For a detailed discussion of BTrees, refer to
 ** BTree begins on page 2 of the file.  (Pages are numbered beginning with
 ** 1, not 0.)  Thus a minimum database contains 2 pages.
 */
-/* We don't want the btree function macros */
+
+/* We don't want the btree function macros as they clash with the functions
+** defined in this file. This may be fixed in future by renaming the macros
+** or the functions defined here, or both.
+*/
 #define SQLITE_NO_BTREE_DEFS
 
 #include "sqliteInt.h"
index 10750aad9955240a03d7b94bfea196fb4553f949..9f41cbbd90403a55d029d2137abd93a6246ae8a3 100644 (file)
@@ -23,7 +23,7 @@
 **     ROLLBACK
 **     PRAGMA
 **
-** $Id: build.c,v 1.143 2003/04/06 21:08:24 drh Exp $
+** $Id: build.c,v 1.144 2003/04/13 18:26:51 paul Exp $
 */
 #include "sqliteInt.h"
 #include <ctype.h>
@@ -436,7 +436,7 @@ void sqliteStartTable(
   ** holding temporary tables is open.
   */
   if( isTemp && db->aDb[1].pBt==0 && !pParse->explain ){
-    int rc = sqliteBtreeOpen(0, 0, MAX_PAGES, &db->aDb[1].pBt);
+    int rc = sqliteBtreeFactory(db, ":temp:", 0, MAX_PAGES, &db->aDb[1].pBt);
     if( rc!=SQLITE_OK ){
       sqliteSetString(&pParse->zErrMsg, "unable to open a temporary database "
         "file for storing temporary tables", 0);
index 408d97fa2140dac6867b66c6b010e5dd91eb8e89..211eb7012f016134076e1308873f7f38235dee8a 100644 (file)
@@ -14,7 +14,7 @@
 ** other files are for internal use by SQLite and should not be
 ** accessed by users of the library.
 **
-** $Id: main.c,v 1.121 2003/04/05 03:42:27 drh Exp $
+** $Id: main.c,v 1.122 2003/04/13 18:26:51 paul Exp $
 */
 #include "sqliteInt.h"
 #include "os.h"
@@ -1055,3 +1055,47 @@ void *sqlite_commit_hook(
   db->pCommitArg = pArg;
   return pOld;
 }
+
+/*
+** This routine is called when sqlite wants to open a btree.  zFilename is
+** either the name of a btree file or the magic name ":memory:" which opens an
+** in-memory btree or ":temp:" which opens a temporary btree. This may either
+** be in memory or backed by a temporary file depending on run-time settings.
+*/
+int sqliteBtreeFactory(
+  const sqlite *db,        /* Main database when opening aux otherwise 0 */
+  const char *zFilename,    /* Name of the file containing the BTree database */
+  int omitJournal,          /* if TRUE then do not journal this file */
+  int nCache,               /* How many pages in the page cache */
+  Btree **ppBtree){         /* Pointer to new Btree object written here */
+
+  assert( zFilename != 0 );
+  assert( ppBtree != 0);
+
+  if (strcmp(zFilename, ":memory:") == 0) {
+    if (ALLOWATTACHMEM) {
+      return sqliteRBtreeOpen(0, 0, 0, ppBtree);
+    } else {
+      return SQLITE_CANTOPEN;
+    }
+  } else if (strcmp(zFilename, ":temp:") == 0) {
+    if (TEMPDBINCORE == 0) {
+      /* Always use file based temporary DB */
+      return sqliteBtreeOpen(0, omitJournal, nCache, ppBtree);
+    } else if (TEMPDBINCORE == 1 || TEMPDBINCORE == 2) {
+      /* Switch depending on compile-time and/or runtime settings. */
+      int location = db->tmpdb_loc == 0 ? TEMPDBINCORE : db->tmpdb_loc;
+
+      if (location == 1) {
+        return sqliteBtreeOpen(zFilename, omitJournal, nCache, ppBtree);
+      } else {
+        return sqliteRBtreeOpen(0, 0, 0, ppBtree);
+      }
+    } else {
+      /* Always use in-core DB */
+      return sqliteRBtreeOpen(0, 0, 0, ppBtree);
+    }
+  } else {
+    return sqliteBtreeOpen(zFilename, omitJournal, nCache, ppBtree);
+  }
+}
index f92d559dc27f9467902c1962dda95c879fe787a2..f3f7b62dad9f1675ec876182b33bbe919f2a1f07 100644 (file)
@@ -11,7 +11,7 @@
 *************************************************************************
 ** This file contains code used to implement the PRAGMA command.
 **
-** $Id: pragma.c,v 1.1 2003/04/06 21:08:24 drh Exp $
+** $Id: pragma.c,v 1.2 2003/04/13 18:26:51 paul Exp $
 */
 #include "sqliteInt.h"
 
@@ -64,6 +64,21 @@ static int getSafetyLevel(char *z){
   return 1;
 }
 
+/*
+** Interpret the given string as a temp db location. Return 1 for file
+** backed temporary databases, 2 for the Red-Black tree in memory database
+** and 0 to use the compile-time default.
+*/
+static int getTmpdbLocation(char *z){
+    if (sqliteStrICmp(z, "file") == 0) {
+       return 1;
+    } else if (sqliteStrICmp(z, "memory") == 0) {
+       return 2;
+    } else {
+       return 0;
+    }
+}
+
 /*
 ** Process a pragma statement.  
 **
@@ -423,6 +438,62 @@ void sqlitePragma(Parse *pParse, Token *pLeft, Token *pRight, int minusFlag){
       sqliteVdbeAddOp(v, OP_Callback, 2, 0);
     }
   }else
+  /*
+  **   PRAGMA tmpdb_location
+  **   PRAGMA tmpdb_location= DEFAULT|MEMORY|FILE
+  **
+  ** Return or set the local value of the tmpdb_location flag.  Changing
+  ** the local value does not make changes to the disk file and the default
+  ** value will be restored the next time the database is opened.
+  **
+  ** Note that it is possible for the library compile-time options to
+  ** override this setting
+  */
+  if( sqliteStrICmp(zLeft, "tmpdb_location")==0 ){
+    static VdbeOp getTmpDbLoc[] = {
+      { OP_ColumnName,  0, 0,        "tmpdb_location"},
+      { OP_Callback,    1, 0,        0},
+    };
+    if( pRight->z==pLeft->z ){
+      sqliteVdbeAddOp(v, OP_Integer, db->tmpdb_loc, 0);
+      sqliteVdbeAddOpList(v, ArraySize(getTmpDbLoc), getTmpDbLoc);
+    }else{
+      if (&db->aDb[1].pBt != 0) {
+       sqliteErrorMsg(pParse, "The temporary database already exists, its location cannot now be changed");
+      } else {
+       db->tmpdb_loc = getTmpdbLocation(zRight);
+      }
+    }
+  }else
+  /*
+  **   PRAGMA default_tmpdb_location
+  **   PRAGMA default_tmpdb_location= DEFAULT|MEMORY|FILE
+  **
+  ** Return or set the value of the persistent tmpdb_location flag (as
+  ** well as the value currently in force).
+  **
+  ** Note that it is possible for the library compile-time options to
+  ** override this setting
+  */
+  if( sqliteStrICmp(zLeft, "default_tmpdb_location")==0 ){
+    static VdbeOp getTmpDbLoc[] = {
+      { OP_ColumnName,  0, 0,        "tmpdb_location"},
+      { OP_ReadCookie,  0, 5,        0},
+      { OP_Callback,    1, 0,        0}};
+    if( pRight->z==pLeft->z ){
+      sqliteVdbeAddOpList(v, ArraySize(getTmpDbLoc), getTmpDbLoc);
+    }else{
+      if (&db->aDb[1].pBt != 0) {
+       sqliteErrorMsg(pParse, "The temporary database already exists, its location cannot now be changed");
+      } else {
+       sqliteBeginWriteOperation(pParse, 0, 0);
+       db->tmpdb_loc = getTmpdbLocation(zRight);
+       sqliteVdbeAddOp(v, OP_Integer, db->tmpdb_loc, 0);
+       sqliteVdbeAddOp(v, OP_SetCookie, 0, 5);
+       sqliteEndWriteOperation(pParse);
+      }
+    }
+  }else
 
 #ifndef NDEBUG
   if( sqliteStrICmp(zLeft, "parser_trace")==0 ){
index fa1d4fd30f0f36fcef32794dddaaf65e6054cead..838da3a3bf311f65ecc14c885b88ca4ea273f5cf 100644 (file)
@@ -11,7 +11,7 @@
 *************************************************************************
 ** Internal interface definitions for SQLite.
 **
-** @(#) $Id: sqliteInt.h,v 1.170 2003/04/03 15:46:04 drh Exp $
+** @(#) $Id: sqliteInt.h,v 1.171 2003/04/13 18:26:52 paul Exp $
 */
 #include "config.h"
 #include "sqlite.h"
@@ -241,6 +241,7 @@ struct sqlite {
   u8 want_to_close;             /* Close after all VDBEs are deallocated */
   int next_cookie;              /* Next value of aDb[0].schema_cookie */
   int cache_size;               /* Number of pages to use in the cache */
+  int tmpdb_loc;                /* Temp DB loc */
   int nTable;                   /* Number of tables in the database */
   void *pBusyArg;               /* 1st Argument to the busy callback */
   int (*xBusyCallback)(void *,const char*,int);  /* The busy callback */
@@ -1097,3 +1098,4 @@ void sqliteDeferForeignKey(Parse*, int);
 #endif
 void sqliteAttach(Parse*, Token*, Token*);
 void sqliteDetach(Parse*, Token*);
+int sqliteBtreeFactory(const sqlite *db, const char *zFilename, int mode, int nPg, Btree **ppBtree);
index b270b3d17e46839313e15ac8e4edb2905a79f11e..10a1c86cb8657edb1dc8530fd58ae7b7b67b9faa 100644 (file)
@@ -13,7 +13,7 @@
 ** is not included in the SQLite library.  It is used for automated
 ** testing of the SQLite library.
 **
-** $Id: test3.c,v 1.22 2002/12/04 13:40:26 drh Exp $
+** $Id: test3.c,v 1.23 2003/04/13 18:26:52 paul Exp $
 */
 #include "sqliteInt.h"
 #include "pager.h"
@@ -67,7 +67,7 @@ static int btree_open(
        " FILENAME\"", 0);
     return TCL_ERROR;
   }
-  rc = sqliteBtreeOpen(argv[1], 0, 1000, &pBt);
+  rc = sqliteBtreeFactory(0, argv[1], 0, 1000, &pBt);
   if( rc!=SQLITE_OK ){
     Tcl_AppendResult(interp, errorName(rc), 0);
     return TCL_ERROR;
index 5c59d8b7913a43742376ca3dcc852e4ef5ab3479..7579255ea7b4d30fc8d6ff6c265586fa9bb7a139 100644 (file)
@@ -36,7 +36,7 @@
 ** in this file for details.  If in doubt, do not deviate from existing
 ** commenting and indentation practices when changing or adding code.
 **
-** $Id: vdbe.c,v 1.211 2003/04/03 15:46:04 drh Exp $
+** $Id: vdbe.c,v 1.212 2003/04/13 18:26:52 paul Exp $
 */
 #include "sqliteInt.h"
 #include <ctype.h>
@@ -3503,7 +3503,8 @@ case OP_OpenTemp: {
   cleanupCursor(pCx);
   memset(pCx, 0, sizeof(*pCx));
   pCx->nullRow = 1;
-  rc = sqliteBtreeOpen(0, 1, TEMP_PAGES, &pCx->pBt);
+  rc = sqliteBtreeFactory(db, ":temp:", 1, TEMP_PAGES, &pCx->pBt);
+
   if( rc==SQLITE_OK ){
     rc = sqliteBtreeBeginTrans(pCx->pBt);
   }