]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Added the last_insert_rowid API function. Improved documentation of
authordrh <drh@noemail.net>
Wed, 16 Jan 2002 21:00:27 +0000 (21:00 +0000)
committerdrh <drh@noemail.net>
Wed, 16 Jan 2002 21:00:27 +0000 (21:00 +0000)
the random ROWID algorithm. (CVS 349)

FossilOrigin-Name: f74d61aaf3fec06cde2c4a6f1465f86ac9058ad2

16 files changed:
VERSION
manifest
manifest.uuid
src/main.c
src/random.c
src/sqlite.h.in
src/sqliteInt.h
src/tclsqlite.c
src/test1.c
src/vdbe.c
test/intpkey.test
test/tclsqlite.test
www/c_interface.tcl
www/changes.tcl
www/faq.tcl
www/tclsqlite.tcl

diff --git a/VERSION b/VERSION
index b1b25a5ffae43c2f07d222b53240d871e7c1789b..585940699b5b99df6541c819a773ef738985a956 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-2.2.2
+2.2.3
index 30973470a0aaca100e53e63b24a77939e4f137ac..5ee16aad2b35016e45829987e989bfd7436a0bb6 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,9 +1,9 @@
-C Added\simplementations\sfor\ssqliteOsEnterMutex()\sand\ssqliteOsLeaveMutex().\s(CVS\s348)
-D 2002-01-15T18:39:44
+C Added\sthe\slast_insert_rowid\sAPI\sfunction.\s\sImproved\sdocumentation\sof\nthe\srandom\sROWID\salgorithm.\s(CVS\s349)
+D 2002-01-16T21:00:27
 F Makefile.in 9fa4277413bf1d9cf91365f07d4108d7d87ed2af
 F Makefile.template 3e26a3b9e7aee1b811deaf673e8d8973bdb3f22d
 F README a4c0ba11354ef6ba0776b400d057c59da47a4cc0
-F VERSION e4851f0e1fd8b7411787e28c5062067c23d706f1
+F VERSION da55054c39447bab51e716c492a9fa987086fa17
 F aclocal.m4 11faa843caa38fd451bc6aeb43e248d1723a269d
 F config.guess f38b1e93d1e0fa6f5a6913e9e7b12774b9232588
 F config.log 6a73d03433669b10a3f0c221198c3f26b9413914
@@ -27,7 +27,7 @@ F src/expr.c 8169261ac56e96c860407a8773ca10b779e32328
 F src/hash.c 8f7c740ef2eaaa8decfa8751f2be30680b123e46
 F src/hash.h a5f5b3ce2d086a172c5879b0b06a27a82eac9fac
 F src/insert.c 813c37719866c583e6ca7660f94f10230f4e385d
-F src/main.c bdce5ed20f2828cd5b390c3880d5820b70e09871
+F src/main.c 0205771a6c31a9858ff131fc1e797b589afb76bf
 F src/md5.c 52f677bfc590e09f71d07d7e327bd59da738d07c
 F src/os.c c615faa4d23e742e0650e0751a6ad2a18438ad53
 F src/os.h 5405a5695bf16889d4fc6caf9d42043caa41c269
@@ -35,21 +35,21 @@ F src/pager.c 1e80a3ba731e454df6bd2e58d32eeba7dd65121b
 F src/pager.h f78d064c780855ff70beacbeba0e2324471b26fe
 F src/parse.y f3fc4fb5766393003577bd175eb611495f6efd9f
 F src/printf.c 300a90554345751f26e1fc0c0333b90a66110a1d
-F src/random.c 2a9cc2c9716d14815fd4c2accf89d87a1143e46b
+F src/random.c f6b36bec5ebd3edb3440224bf5bf811fe4ac9a1b
 F src/select.c bddd8b5d07ffdae0d798c10b20dc7167469a3904
 F src/shell.c 539a41d4121ed371d438d57d829e53056a54471c
 F src/shell.tcl 27ecbd63dd88396ad16d81ab44f73e6c0ea9d20e
-F src/sqlite.h.in a4c11d38d62b1bfbd50a5804edee8ca54c1adc9b
-F src/sqliteInt.h 7a7c5213a422e29883dcfe4c07d1f1def24f03fd
+F src/sqlite.h.in f57074c84a2c112a5093ba7a9d9636aa9cacc87c
+F src/sqliteInt.h 2382456c76bd66d0255d385820af1c72c961540c
 F src/table.c c89698bd5bb4b8d14722d6ee7e9be014c383d24a
-F src/tclsqlite.c b82e4faeae89fdb7304b3c970979ade299336a1f
-F src/test1.c 41eabe255970ef947263b94145c9b2766bab8675
+F src/tclsqlite.c b9cf346e95291cb4c4f1bf5ac1d77db6b8ad023d
+F src/test1.c 33efd350dca27c52c58c553c04fd3a6a51f13c1f
 F src/test2.c e9f99aa5ee73872819259d6612c11e55e1644321
 F src/test3.c d6775f95fd91f5b3cf0e2382a28e5aaeb68f745b
 F src/tokenize.c 830e9ef684334070a26583d94770bb869e2727bf
 F src/update.c 5cb326ed4bace89cbad7d919b828da6c2a9064e4
 F src/util.c 3958a14a2dbfb13fa5f779976b4d0daf9ab49bb1
-F src/vdbe.c 7c64ac039a603036ce08d4f1dda3856d2825d3b6
+F src/vdbe.c 158bab65e4eafceb75a83f616caafa2c58f00242
 F src/vdbe.h e5cc6fb13d1905a4339db4d6dba4ab393c0765fa
 F src/where.c a9b286ac7323e7ebed5d3d217b3963acf1e6a355
 F test/all.test 2a51e5395ac7c2c539689b123b9782a05e3837fe
@@ -65,7 +65,7 @@ F test/in.test 9323681388be301dc73f370b4cd62c5a33f79d1e
 F test/index.test c8a471243bbf878974b99baf5badd59407237cf3
 F test/insert.test a5c122aa726f1cef6f07d6767e8fd6f220994c11
 F test/insert2.test d6901ca931e308fea7fca8c95ebe7dc957cc9fc2
-F test/intpkey.test c9f427cb7b74835deeef112ed7f2af13d2ad662b
+F test/intpkey.test d6c7f42679b3f87da3933f5dddac92c822dd89c5
 F test/ioerr.test 57d9bffaca18b34f9e976f786eadc2591d6efc6a
 F test/limit.test a930f3eba2a7691c8397ccab33710b931589566a
 F test/lock.test 19593689260c419efe7ced55b1418653a4b7bcd1
@@ -86,7 +86,7 @@ F test/sort.test 462c1161eee1abaa7cc93990e0b34d5fdb70ce19
 F test/subselect.test 335d3dad8d585726c447dfee8d9c4f7383c76b78
 F test/table.test 3ef4254d62ece31a3872ab11cdaec846f6fa8fd1
 F test/tableapi.test 51d0c209aa6b1158cb952ec917c656d4ce66e9e4
-F test/tclsqlite.test 9cbac5a39e78851df6b3608d3cc6b71617407bdd
+F test/tclsqlite.test ca8dd89b02ab68bd4540163c24551756a69f6783
 F test/temptable.test 0e9934283259a5e637eec756a7eefd6964c0f79b
 F test/tester.tcl 96db1b49157388edb57e11bf33285e3811a897e4
 F test/trans.test 9e49495c06b1c41f889bf4f0fb195a015b126de0
@@ -104,12 +104,12 @@ F tool/report1.txt 9eae07f26a8fc53889b45fc833a66a33daa22816
 F www/arch.fig d5f9752a4dbf242e9cfffffd3f5762b6c63b3bcf
 F www/arch.png 82ef36db1143828a7abc88b1e308a5f55d4336f4
 F www/arch.tcl 72a0c80e9054cc7025a50928d28d9c75c02c2b8b
-F www/c_interface.tcl 9123810452845783fac8e3184929463d9e70d609
-F www/changes.tcl a3499bf739cd6eecfdfab30485a51a96a048a775
+F www/c_interface.tcl 82a026b1681757f13b3f62e035f3a31407c1d353
+F www/changes.tcl 21116410e94d5f0852b49880ddf65f390423f24c
 F www/crosscompile.tcl 3622ebbe518927a3854a12de51344673eb2dd060
 F www/download.tcl 1ea61f9d89a2a5a9b2cee36b0d5cf97321bdefe0
 F www/dynload.tcl 02eb8273aa78cfa9070dd4501dca937fb22b466c
-F www/faq.tcl f475a9ca61697d6d9cdae5497fa1a539df3f7e05
+F www/faq.tcl 324ec51080e5c3d62ccce4fb22a8b839eaded694
 F www/formatchng.tcl d96e5e937dcbbebd481720aa08745ca5a906a63f
 F www/index.tcl 571c585a5c0b577db2fe7cb88cf1f12cccd96ceb
 F www/lang.tcl 6843fd3f85cba95fd199a350533ce742c706603c
@@ -117,9 +117,9 @@ F www/mingw.tcl f1c7c0a7f53387dd9bb4f8c7e8571b7561510ebc
 F www/opcode.tcl bdec8ef9f100dbd87bbef8976c54b88e43fd8ccc
 F www/speed.tcl 83457b2bf6bb430900bd48ca3dd98264d9a916a5
 F www/sqlite.tcl 8b5884354cb615049aed83039f8dfe1552a44279
-F www/tclsqlite.tcl 880ef67cb4f2797b95bf1368fc4e0d8ca0fda956
+F www/tclsqlite.tcl 829b393d1ab187fd7a5e978631b3429318885c49
 F www/vdbe.tcl 2013852c27a02a091d39a766bc87cff329f21218
-P f3038d218c91b44b70b75a7b881ea24c87fa6a02
-R afcefb473faa5582942ee6c805ad94f5
+P f8a026a3ca14ef0b0d562029dd6b184f060457f4
+R 0e682a68cf7bb91386b1d3da8599787d
 U drh
-Z ddd0c4146a965f893289115586945425
+Z 80f27b8d44ccea1a5a5d9cef7e210848
index 6e4d6257a3d17327cbf4225fb02be896df645a89..ee8dde517e98df5ea52f621fe6067843408cc725 100644 (file)
@@ -1 +1 @@
-f8a026a3ca14ef0b0d562029dd6b184f060457f4
\ No newline at end of file
+f74d61aaf3fec06cde2c4a6f1465f86ac9058ad2
\ No newline at end of file
index e80b87a1bae2a55934e8fc65c9aed6815c1c174f..6d5f46f65cdc8834105abc4a1ce1be1be8313561 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.55 2002/01/10 14:31:49 drh Exp $
+** $Id: main.c,v 1.56 2002/01/16 21:00:27 drh Exp $
 */
 #include "sqliteInt.h"
 #include "os.h"
@@ -358,6 +358,13 @@ static void clearHashTable(sqlite *db, int preserveTemps){
   db->flags &= ~SQLITE_Initialized;
 }
 
+/*
+** Return the ROWID of the most recent insert
+*/
+int sqlite_last_insert_rowid(sqlite *db){
+  return db->lastRowid;
+}
+
 /*
 ** Close an existing SQLite database
 */
index 904fdaf22dc00771be36c547a5c6986824baddfe..2f669ae03414278f651300074cb902894d44e60e 100644 (file)
 ** Random numbers are used by some of the database backends in order
 ** to generate random integer keys for tables or random filenames.
 **
-** $Id: random.c,v 1.8 2001/10/09 04:19:47 drh Exp $
+** $Id: random.c,v 1.9 2002/01/16 21:00:27 drh Exp $
 */
 #include "sqliteInt.h"
 #include "os.h"
 
+
 /*
 ** Get a single 8-bit random value from the RC4 PRNG.  The Mutex
 ** must be held while executing this routine.
+**
+** Why not just use a library random generator like lrand48() for this?
+** Because the OP_NewRecno opcode in the VDBE depends on having a very
+** good source of random numbers.  The lrand48() library function may
+** well be good enough.  But maybe not.  Or maybe lrand48() has some
+** subtle problems on some systems that could cause problems.  It is hard
+** to know.  To minimize the risk of problems due to bad lrand48()
+** implementations, SQLite uses is this random number generator based
+** on RC4, which we know works very well.
 */
 static int randomByte(){
   int t;
index 4e2601f06d8deb86e80c43f20d9197e2c6ecb1f2..12d07ac18237dad24e5eca9151416ffe429f68af 100644 (file)
@@ -12,7 +12,7 @@
 ** This header file defines the interface that the SQLite library
 ** presents to client programs.
 **
-** @(#) $Id: sqlite.h.in,v 1.24 2001/12/22 14:49:25 drh Exp $
+** @(#) $Id: sqlite.h.in,v 1.25 2002/01/16 21:00:27 drh Exp $
 */
 #ifndef _SQLITE_H_
 #define _SQLITE_H_
@@ -162,6 +162,17 @@ int sqlite_exec(
 #define SQLITE_CONSTRAINT  19   /* Abort due to contraint violation */
 #define SQLITE_MISMATCH    20   /* Data type mismatch */
 
+/*
+** Each entry in an SQLite table has a unique integer key.  (The key is
+** the value of the INTEGER PRIMARY KEY column if there is such a column,
+** otherwise the key is generated at random.  The unique key is always
+** available as the ROWID, OID, or _ROWID_ column.)  The following routine
+** returns the integer key of the most recent insert in the database.
+**
+** This function is similar to the mysql_insert_id() function from MySQL.
+*/
+int sqlite_last_insert_rowid(sqlite*);
+
 /* If the parameter to this routine is one of the return value constants
 ** defined above, then this routine returns a constant text string which
 ** descripts (in English) the meaning of the return value.
index 1e49e61a5febb0100bc3ed9b692bb4444d187d71..11129c94281f862a2080fb1300c4632f867af0ba 100644 (file)
@@ -11,7 +11,7 @@
 *************************************************************************
 ** Internal interface definitions for SQLite.
 **
-** @(#) $Id: sqliteInt.h,v 1.76 2002/01/09 03:20:00 drh Exp $
+** @(#) $Id: sqliteInt.h,v 1.77 2002/01/16 21:00:27 drh Exp $
 */
 #include "sqlite.h"
 #include "hash.h"
@@ -181,6 +181,7 @@ struct sqlite {
   Hash idxHash;                 /* All (named) indices indexed by name */
   Hash tblDrop;                 /* Uncommitted DROP TABLEs */
   Hash idxDrop;                 /* Uncommitted DROP INDEXs */
+  int lastRowid;                /* ROWID of most recent insert */
   int nextRowid;                /* Next generated rowID */
 };
 
index a604afc08c540a7ed4b5b14e184cf6e2766040a3..541914161c14c43052afe973cd7cdee1ab1fa2b1 100644 (file)
@@ -11,7 +11,7 @@
 *************************************************************************
 ** A TCL Interface to SQLite
 **
-** $Id: tclsqlite.c,v 1.28 2001/11/09 13:41:10 drh Exp $
+** $Id: tclsqlite.c,v 1.29 2002/01/16 21:00:27 drh Exp $
 */
 #ifndef NO_TCL     /* Omit this whole file if TCL is unavailable */
 
@@ -268,10 +268,10 @@ static int DbObjCmd(void *cd, Tcl_Interp *interp, int objc,Tcl_Obj *const*objv){
   SqliteDb *pDb = (SqliteDb*)cd;
   int choice;
   static char *DB_optStrs[] = {
-     "busy",   "close",  "complete",  "eval",  "timeout", 0
+     "busy",   "close",  "complete",  "eval",  "last_insert_rowid", "timeout", 0
   };
   enum DB_opts {
-     DB_BUSY,  DB_CLOSE, DB_COMPLETE, DB_EVAL, DB_TIMEOUT
+     DB_BUSY,  DB_CLOSE, DB_COMPLETE, DB_EVAL, DB_LAST_INSERT_ROWID, DB_TIMEOUT
   };
 
   if( objc<2 ){
@@ -424,6 +424,24 @@ static int DbObjCmd(void *cd, Tcl_Interp *interp, int objc,Tcl_Obj *const*objv){
     return rc;
   }
 
+  /*
+  **     $db last_insert_rowid 
+  **
+  ** Return an integer which is the ROWID for the most recent insert.
+  */
+  case DB_LAST_INSERT_ROWID: {
+    Tcl_Obj *pResult;
+    int rowid;
+    if( objc!=2 ){
+      Tcl_WrongNumArgs(interp, 2, objv, "");
+      return TCL_ERROR;
+    }
+    rowid = sqlite_last_insert_rowid(pDb->db);
+    pResult = Tcl_GetObjResult(interp);
+    Tcl_SetIntObj(pResult, rowid);
+    break;
+  }
+
   /*
   **     $db timeout MILLESECONDS
   **
index 009cbf11f55c159738f2712eab8eba4ed18f89e8..0ca93fe064e14cf288deabc3f78a0029b0051f60 100644 (file)
@@ -13,7 +13,7 @@
 ** is not included in the SQLite library.  It is used for automated
 ** testing of the SQLite library.
 **
-** $Id: test1.c,v 1.5 2001/11/08 00:45:21 drh Exp $
+** $Id: test1.c,v 1.6 2002/01/16 21:00:27 drh Exp $
 */
 #include "sqliteInt.h"
 #include "tcl.h"
@@ -150,6 +150,31 @@ static int test_get_table_printf(
   return TCL_OK;
 }
 
+
+/*
+** Usage:  sqlite_last_insert_rowid DB
+**
+** Returns the integer ROWID of the most recent insert.
+*/
+static int test_last_rowid(
+  void *NotUsed,
+  Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
+  int argc,              /* Number of arguments */
+  char **argv            /* Text of each argument */
+){
+  sqlite *db;
+  char zBuf[30];
+
+  if( argc!=2 ){
+    Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " DB\"", 0);
+    return TCL_ERROR;
+  }
+  db = (sqlite*)atoi(argv[1]);
+  sprintf(zBuf, "%d", sqlite_last_insert_rowid(db));
+  Tcl_AppendResult(interp, zBuf, 0);
+  return SQLITE_OK;
+}
+
 /*
 ** Usage:  sqlite_close DB
 **
@@ -308,6 +333,7 @@ int Sqlitetest1_Init(Tcl_Interp *interp){
   Tcl_CreateCommand(interp, "sqlite_mprintf_str", sqlite_mprintf_str, 0, 0);
   Tcl_CreateCommand(interp, "sqlite_mprintf_double", sqlite_mprintf_double,0,0);
   Tcl_CreateCommand(interp, "sqlite_open", sqlite_test_open, 0, 0);
+  Tcl_CreateCommand(interp, "sqlite_last_insert_rowid", test_last_rowid, 0, 0);
   Tcl_CreateCommand(interp, "sqlite_exec_printf", test_exec_printf, 0, 0);
   Tcl_CreateCommand(interp, "sqlite_get_table_printf", test_get_table_printf,
       0, 0);
index 797d3f4828d6c22fd6a72ec01ba663400f6a4ef2..602f9503bf573dca346e040be1ce9b7cb45b4e57 100644 (file)
@@ -30,7 +30,7 @@
 ** But other routines are also provided to help in building up
 ** a program instruction by instruction.
 **
-** $Id: vdbe.c,v 1.106 2002/01/14 09:28:20 drh Exp $
+** $Id: vdbe.c,v 1.107 2002/01/16 21:00:27 drh Exp $
 */
 #include "sqliteInt.h"
 #include <ctype.h>
@@ -2731,6 +2731,13 @@ case OP_NewRecno: {
     ** never cause a problem.  You are much, much more likely to have a
     ** hardware failure than for this algorithm to fail.
     **
+    ** The analysis in the previous paragraph assumes that you have a good
+    ** source of random numbers.  Is a library function like lrand48()
+    ** good enough?  Maybe. Maybe not. It's hard to know whether there
+    ** might be subtle bugs is some implementations of lrand48() that
+    ** could cause problems. To avoid uncertainty, SQLite uses its own 
+    ** random number generator based on the RC4 algorithm.
+    **
     ** To promote locality of reference for repetitive inserts, the
     ** first few attempts at chosing a rowid pick values just a little
     ** larger than the previous rowid.  This has been shown experimentally
@@ -2790,6 +2797,7 @@ case OP_Put: {
       nKey = sizeof(int);
       iKey = intToKey(aStack[nos].i);
       zKey = (char*)&iKey;
+      db->lastRowid = aStack[nos].i;
     }
     if( pOp->p2 ){
       int res;
index 8355116f6882dc8d6365e77d40e418b430c18b4d..c3adfd0cf76933d6497978855b17b4d55ac8d8a5 100644 (file)
@@ -13,7 +13,7 @@
 # This file implements tests for the special processing associated
 # with INTEGER PRIMARY KEY columns.
 #
-# $Id: intpkey.test,v 1.5 2002/01/14 02:56:26 drh Exp $
+# $Id: intpkey.test,v 1.6 2002/01/16 21:00:28 drh Exp $
 
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
@@ -55,7 +55,8 @@ do_test intpkey-1.3 {
   execsql {
     INSERT INTO t1 VALUES(5,'hello','world');
   }
-} {}
+  db last_insert_rowid
+} {5}
 do_test intpkey-1.4 {
   execsql {
     SELECT * FROM t1;
@@ -87,6 +88,9 @@ do_test intpkey-1.8 {
   }} msg]
   lappend r $msg
 } {0 {}}
+do_test intpkey-1.8.1 {
+  db last_insert_rowid
+} {6}
 do_test intpkey-1.9 {
   execsql {
     SELECT rowid, * FROM t1;
index 5827adf8b27856cb6ea2252c9e6162b8c88676a2..42ff8d19f0c908640b12f64e18ba856852204424 100644 (file)
@@ -15,7 +15,7 @@
 # interface is pretty well tested.  This file contains some addition
 # tests for fringe issues that the main test suite does not cover.
 #
-# $Id: tclsqlite.test,v 1.4 2002/01/15 18:39:45 drh Exp $
+# $Id: tclsqlite.test,v 1.5 2002/01/16 21:00:28 drh Exp $
 
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
@@ -29,7 +29,7 @@ do_test tcl-1.1 {
 do_test tcl-1.2 {
   set v [catch {db bogus} msg]
   lappend v $msg
-} {1 {bad option "bogus": must be busy, close, complete, eval, or timeout}}
+} {1 {bad option "bogus": must be busy, close, complete, eval, last_insert_rowid, or timeout}}
 do_test tcl-1.3 {
   execsql {CREATE TABLE t1(a int, b int)}
   execsql {INSERT INTO t1 VALUES(10,20)}
index e2033050e6bf39d928ce7184f58285061e7b49a4..59eb5150f8fe8b36a2e0cf28a029eeee4a22f61f 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Run this Tcl script to generate the sqlite.html file.
 #
-set rcsid {$Id: c_interface.tcl,v 1.22 2001/12/22 19:27:41 drh Exp $}
+set rcsid {$Id: c_interface.tcl,v 1.23 2002/01/16 21:00:28 drh Exp $}
 
 puts {<html>
 <head>
@@ -305,6 +305,8 @@ useful interfaces.  These extended routines are as follows:
 </p>
 
 <blockquote><pre>
+int sqlite_last_insert_rowid(sqlite*);
+
 int sqlite_get_table(
   sqlite*,
   char *sql,
@@ -371,6 +373,22 @@ int sqlite_get_table_vprintf(
 <p>All of the above definitions are included in the "sqlite.h"
 header file that comes in the source tree.</p>
 
+<h2>The ROWID of the most recent insert</h2>
+
+<p>Every row of an SQLite table has a unique integer key.  If the
+table has a column labeled INTEGER PRIMARY KEY, then that column
+servers as the key.  If there is no INTEGER PRIMARY KEY column then
+the key is a random integer.  The key for a row can be accessed in
+a SELECT statement or used in a WHERE or ORDER BY clause using any
+of the names "ROWID", "OID", or "_ROWID_".</p>
+
+<p>When you do an insert into a table that does not have an INTEGER PRIMARY
+KEY column, or if the table does have an INTEGER PRIMARY KEY but the value
+for that column is not specified in the VALUES clause of the insert, then
+the key is automatically generated.  You can find the value of the key
+for the most recent INSERT statement using the
+<b>sqlite_last_insert_rowid()</b> API function.</p>
+
 <h2>Querying without using a callback function</h2>
 
 <p>The <b>sqlite_get_table()</b> function is a wrapper around
index 08b838eab107063f2317feeed254bf4b681ef96b..0d6e7eb98e6d568050bb3ee5d5e9aa2e58463ce2 100644 (file)
@@ -17,10 +17,11 @@ proc chng {date desc} {
   puts "<DD><P><UL>$desc</UL></P></DD>"
 }
 
-chng {2002 Jan 14 (2.2.3)} {
+chng {2002 Jan 16 (2.2.3)} {
 <li>Fix warning messages in VC++ 7.0.  (Patches from nicolas352001)</li>
 <li>Make the library thread-safe.  (The code is there and appears to work
     but has not been stressed.)</li>
+<li>Added the new <b>sqlite_last_insert_rowid()</b> API function.</li>
 }
 
 chng {2002 Jan 13 (2.2.2)} {
index 7672b479ecd285208798fee3d9250578dcf425bb..d8756421af7f8619418849965600bca31c1b30e2 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Run this script to generated a faq.html output file
 #
-set rcsid {$Id: faq.tcl,v 1.5 2001/12/22 19:27:41 drh Exp $}
+set rcsid {$Id: faq.tcl,v 1.6 2002/01/16 21:00:28 drh Exp $}
 
 puts {<html>
 <head>
@@ -81,6 +81,11 @@ SELECT * FROM ex1;
   the case and you cannot count on that behavior.  The keys will never
   be sequential.  If you need sequential keys, use the counter implemention
   described first.</p>
+
+  <p>Beginning with version 2.2.3, there is a new API function named
+  <b>sqlite_last_insert_rowid()</b> which will return the integer key
+  for the most recent insert operation.  See the API documentation for
+  details.</p>
 }
 
 faq {
index 457c7221d2cfe36a0841fc558c16cacaef7d6473..f54069885d12bf7524944cfe3b247dcb874ea535 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Run this Tcl script to generate the tclsqlite.html file.
 #
-set rcsid {$Id: tclsqlite.tcl,v 1.5 2001/11/24 13:23:05 drh Exp $}
+set rcsid {$Id: tclsqlite.tcl,v 1.6 2002/01/16 21:00:28 drh Exp $}
 
 puts {<html>
 <head>
@@ -50,7 +50,7 @@ the database is stored.
 
 <p>
 Once an SQLite database is open, it can be controlled using 
-methods of the <i>dbcmd</i>.  There are currently 5 methods
+methods of the <i>dbcmd</i>.  There are currently 6 methods
 defined:</p>
 
 <p>
@@ -59,6 +59,7 @@ defined:</p>
 <li> close
 <li> complete
 <li> eval
+<li> last_insert_rowid
 <li> timeout
 </ul>
 </p>
@@ -242,6 +243,11 @@ so that the lock can be tried again.  The callback procedure should
 return "0" if it wants SQLite to try again to open the database and
 should return "1" if it wants SQLite to abandon the current operation.
 
+<h2>The "last_insert_rowid" method</h2>
+
+<p>The "last_insert_rowid" method returns an integer which is the ROWID
+of the most recently inserted database row.</p>
+
 }
 
 puts {