-C Sorting\sbug\sfixes.\s\sNow\sonly\s17\stests\sfail.\s(CVS\s1422)
-D 2004-05-21T01:29:06
+C Add\snew\ssqlite3_open()\sand\ssqlite3_open16()\sAPIs.\s(CVS\s1423)
+D 2004-05-21T01:47:27
F Makefile.in ab7b0d5118e2da97bac66be8684a1034e3500f5a
F Makefile.linux-gcc b86a99c493a5bfb402d1d9178dcdc4bd4b32f906
F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd
F src/hash.c 440c2f8cb373ee1b4e13a0988489c7cd95d55b6f
F src/hash.h 762d95f1e567664d1eafc1687de755626be962fb
F src/insert.c e510d62d23b4de4d901e7ccbbe7833b7fb3b9570
-F src/main.c bb0e84eda9beb447bff109b061a82e6c9b3dc811
+F src/main.c a9ee98262a12454c72741d94da2317119d3a1071
F src/md5.c 8e39fdae6d8776b87558e91dcc94740c9b635a9c
F src/os.c ddcda92f7fd71b4513c57c1ec797917f206d504e
F src/os.h 6e446a17cbeb6c2ce470683a0bb8d9c63abe8607
F src/random.c eff68e3f257e05e81eae6c4d50a51eb88beb4ff3
F src/select.c d77f773165a2690e6e58c0a94dc21b28270695c2
F src/shell.c 0c4662e13bfbfd3d13b066c5859cc97ad2f95d21
-F src/sqlite.h.in 8c000826a517ac7302dc2e1c483e71cd06eaf0de
-F src/sqliteInt.h 3f4848eb5b7cd7818943e9f4b924a8601f7ef06a
+F src/sqlite.h.in de337e211905c6bd4ad901916f78df28f1467df4
+F src/sqliteInt.h 2e5533ba50106d266cddfb00b2eb3ab6944b8f3e
F src/table.c af14284fa36c8d41f6829e3f2819dce07d3e2de2
F src/tclsqlite.c fbf0fac73624ae246551a6c671f1de0235b5faa1
-F src/test1.c 5ba6352c8d63eae9eb98e6ae5bfe24a448b3bcb7
+F src/test1.c c72aed60609038b25c0782ec69b71f33f1157d64
F src/test2.c 6195a1ca2c8d0d2d93644e86da3289b403486872
F src/test3.c 5e4a6d596f982f6f47a5f9f75ede9b4a3b739968
F src/test4.c b3fab9aea7a8940a8a7386ce1c7e2157b09bd296
F src/where.c efe5d25fe18cd7381722457898cd863e84097a0c
F test/all.test 569a92a8ee88f5300c057cc4a8f50fbbc69a3242
F test/attach.test cb9b884344e6cfa5e165965d5b1adea679a24c83
-F test/attach2.test 7c388dee63a4c1997695c3d41957f32ce784ac56
+F test/attach2.test 7a722607c1fa37837d3b2717605357d89b86c8b9
F test/auth.test 5c4d95cdaf539c0c236e20ce1f71a93e7dde9185
F test/bigfile.test ea904b853ce2d703b16c5ce90e2b54951bc1ae81
F test/bigrow.test 8ab252dba108f12ad64e337b0f2ff31a807ac578
-F test/bind.test 5d6ac8ab0dbec03ce79284abefa9230726cb9dad
+F test/bind.test 4517a8e8296c12f57f5917764cc1029ff567ff4f
F test/btree.test 08e4093c78d2bc1d54e27266f8d17fed14751125
F test/btree2.test aa4a6d05b1ea90b1acaf83ba89039dd302a88635
F test/btree4.test 3797b4305694c7af6828675b0f4b1424b8ca30e4
F test/btree5.test 8e5ff32c02e685d36516c6499add9375fe1377f2
F test/btree6.test a5ede6bfbbb2ec8b27e62813612c0f28e8f3e027
-F test/capi2.test ec96e0e235d87b53cbaef3d8e3e0f8ccf32c71ca
-F test/capi3.test acc3919c0f37e85ac3561fc33d6abf7183e1aee1
+F test/capi2.test 007f856cc7fe5a9aaeb076d2df9aff92012a0d5e
+F test/capi3.test ff3dfacdd07abad140c17eb58b235623c6957322
F test/conflict.test 0911bb2f079046914a6e9c3341b36658c4e2103e
F test/copy.test f07ea8d60878da7a67416ab62f78e9706b9d3c45
F test/crashtest1.c 09c1c7d728ccf4feb9e481671e29dda5669bbcc2
F test/tableapi.test e0c4cce61e58343caa84dab33fa6823cb35fe1e1
F test/tclsqlite.test a684fc191b81e6cded8a81263663d5a130fbb013
F test/temptable.test a770ba6308d7f7332fce985086b8e06bed6430c2
-F test/tester.tcl 4f7d3ec86d86d9e6ce6939ad6dba4438d8375fba
+F test/tester.tcl 8c234ba903a437ce8c8a58f388d120310b54b44c
F test/thread1.test 53f050d5be6932d9430df7756edd379366508ff6
F test/threadtest1.c f7f896e62ed46feae1dc411114a48c15a0f82ee2
F test/threadtest2.c d94ca4114fd1504f7e0ae724bcd83d4b40931d86
F test/types2.test 5d725fcb68dbd032c6d4950d568d75fa33872687
F test/unique.test 0e38d4cc7affeef2527720d1dafd1f6870f02f2b
F test/update.test b29bd9061a1150426dab6959806fcc73a41b1217
-F test/vacuum.test a2a44544df719666efb51afbfeb6062fd59a672a
+F test/vacuum.test 7b5f504636a13992344871f8155b8557b683232a
F test/varint.test ab7b110089a08b9926ed7390e7e97bdefeb74102
F test/version.test 2ba212ba06380e65e476bdf2fcd390e8b05af5a0
F test/view.test 1ee12c6f8f4791a2c0655120d5562a49400cfe53
F www/tclsqlite.tcl b9271d44dcf147a93c98f8ecf28c927307abd6da
F www/vdbe.tcl 9b9095d4495f37697fd1935d10e14c6015e80aa1
F www/whentouse.tcl a8335bce47cc2fddb07f19052cb0cb4d9129a8e4
-P b032b646b72a03e828d732ac22192f992904d79f
-R 855c0de9c9913c06ac48c05901c20ce2
-U drh
-Z cf8b0e36973f7277ebb2343b2ce02ab9
+P 0736b7e8401f587f8b412602d029ef9bd69425f6
+R 48a2aee2f380542eefb73a0652ba3654
+U danielk1977
+Z 95516270bea0185aee7836097f272d88
-0736b7e8401f587f8b412602d029ef9bd69425f6
\ No newline at end of file
+307b55006c401f10ec5fa5b12cc7d5ba860f9a46
\ No newline at end of file
** other files are for internal use by SQLite and should not be
** accessed by users of the library.
**
-** $Id: main.c,v 1.178 2004/05/20 22:16:29 drh Exp $
+** $Id: main.c,v 1.179 2004/05/21 01:47:27 danielk1977 Exp $
*/
#include "sqliteInt.h"
#include "os.h"
return sqlite3BtreeOpen(zFilename, ppBtree, nCache, btree_flags);
}
+/*
+** Return UTF-8 encoded English language explanation of the most recent
+** error.
+*/
const char *sqlite3_errmsg(sqlite3 *db){
+ if( !db ){
+ /* If db is NULL, then assume that a malloc() failed during an
+ ** sqlite3_open() call.
+ */
+ return sqlite3_error_string(SQLITE_NOMEM);
+ }
if( db->zErrMsg ){
return db->zErrMsg;
}
return sqlite3_error_string(db->errCode);
}
+/*
+** Return UTF-16 encoded English language explanation of the most recent
+** error.
+*/
const void *sqlite3_errmsg16(sqlite3 *db){
+ if( !db ){
+ /* If db is NULL, then assume that a malloc() failed during an
+ ** sqlite3_open() call. We have a static version of the string
+ ** "out of memory" encoded using UTF-16 just for this purpose.
+ **
+ ** Because all the characters in the string are in the unicode
+ ** range 0x00-0xFF, if we pad the big-endian string with a
+ ** zero byte, we can obtain the little-endian string with
+ ** &big_endian[1].
+ */
+ static char outOfMemBe[] = {
+ 0, 'o', 0, 'u', 0, 't', 0, ' ',
+ 0, 'o', 0, 'f', 0, ' ',
+ 0, 'm', 0, 'e', 0, 'm', 0, 'o', 0, 'r', 0, 'y', 0, 0, 0
+ };
+ static char *outOfMemLe = &outOfMemBe[1];
+
+ if( SQLITE3_BIGENDIAN ){
+ return (void *)outOfMemBe;
+ }else{
+ return (void *)outOfMemLe;
+ }
+ }
if( !db->zErrMsg16 ){
char const *zErr8 = sqlite3_errmsg(db);
if( SQLITE3_BIGENDIAN ){
return rc;
}
+/*
+** This routine does the work of opening a database on behalf of
+** sqlite3_open() and sqlite3_open16(). The database filename "zFilename"
+** is UTF-8 encoded. The fourth argument, "def_enc" is one of the TEXT_*
+** macros from sqliteInt.h. If we end up creating a new database file
+** (not opening an existing one), the text encoding of the database
+** will be set to this value.
+*/
+static int openDatabase(
+ const char *zFilename, /* Database filename UTF-8 encoded */
+ sqlite3 **ppDb, /* OUT: Returned database handle */
+ const char **options, /* Null terminated list of db options, or null */
+ u8 def_enc /* One of TEXT_Utf8, TEXT_Utf16le or TEXT_Utf16be */
+){
+ sqlite3 *db;
+ int rc, i;
+ char *zErrMsg = 0;
+
+ /* Allocate the sqlite data structure */
+ db = sqliteMalloc( sizeof(sqlite) );
+ if( db==0 ) goto opendb_out;
+ db->onError = OE_Default;
+ db->priorNewRowid = 0;
+ db->magic = SQLITE_MAGIC_BUSY;
+ db->nDb = 2;
+ db->aDb = db->aDbStatic;
+ /* db->flags |= SQLITE_ShortColNames; */
+ sqlite3HashInit(&db->aFunc, SQLITE_HASH_STRING, 1);
+ sqlite3HashInit(&db->aCollSeq, SQLITE_HASH_STRING, 0);
+ for(i=0; i<db->nDb; i++){
+ sqlite3HashInit(&db->aDb[i].tblHash, SQLITE_HASH_STRING, 0);
+ sqlite3HashInit(&db->aDb[i].idxHash, SQLITE_HASH_STRING, 0);
+ sqlite3HashInit(&db->aDb[i].trigHash, SQLITE_HASH_STRING, 0);
+ sqlite3HashInit(&db->aDb[i].aFKey, SQLITE_HASH_STRING, 1);
+ }
+ db->pDfltColl =
+ sqlite3ChangeCollatingFunction(db, "BINARY", 6, 0, binaryCollatingFunc);
+
+ /* Open the backend database driver */
+ if( zFilename[0]==':' && strcmp(zFilename,":memory:")==0 ){
+ db->temp_store = 2;
+ }
+ rc = sqlite3BtreeFactory(db, zFilename, 0, MAX_PAGES, &db->aDb[0].pBt);
+ if( rc!=SQLITE_OK ){
+ /* FIX ME: sqlite3BtreeFactory() should call sqlite3Error(). */
+ sqlite3Error(db, rc, 0);
+ db->magic = SQLITE_MAGIC_CLOSED;
+ goto opendb_out;
+ }
+ db->aDb[0].zName = "main";
+ db->aDb[1].zName = "temp";
+
+ /* Attempt to read the schema */
+ sqlite3RegisterBuiltinFunctions(db);
+ rc = sqlite3Init(db, &zErrMsg);
+ if( sqlite3_malloc_failed ){
+ sqlite3_close(db);
+ db = 0;
+ goto opendb_out;
+ }else if( rc!=SQLITE_OK && rc!=SQLITE_BUSY ){
+ sqlite3Error(db, rc, "%s", zErrMsg, 0);
+ db->magic = SQLITE_MAGIC_CLOSED;
+ }else{
+ db->magic = SQLITE_MAGIC_OPEN;
+ }
+ if( zErrMsg ) sqliteFree(zErrMsg);
+
+opendb_out:
+ *ppDb = db;
+ return sqlite3_errcode(db);
+}
+
+/*
+** Open a new database handle.
+*/
+int sqlite3_open_new(
+ const char *zFilename,
+ sqlite3 **ppDb,
+ const char **options
+){
+ return openDatabase(zFilename, ppDb, options, TEXT_Utf8);
+}
+
+/*
+** Open a new database handle.
+*/
+int sqlite3_open16(
+ const void *zFilename,
+ sqlite3 **ppDb,
+ const char **options
+){
+ char *zFilename8; /* zFilename encoded in UTF-8 instead of UTF-16 */
+ int rc;
+
+ assert( ppDb );
+
+ zFilename8 = sqlite3utf16to8(zFilename, -1);
+ if( !zFilename8 ){
+ *ppDb = 0;
+ return SQLITE_NOMEM;
+ }
+
+ if( SQLITE3_BIGENDIAN ){
+ rc = openDatabase(zFilename8, ppDb, options, TEXT_Utf16be);
+ }else{
+ rc = openDatabase(zFilename8, ppDb, options, TEXT_Utf16le);
+ }
+
+ sqliteFree(zFilename8);
+ return rc;
+}
+
#if 0
** This header file defines the interface that the SQLite library
** presents to client programs.
**
-** @(#) $Id: sqlite.h.in,v 1.66 2004/05/20 11:00:52 danielk1977 Exp $
+** @(#) $Id: sqlite.h.in,v 1.67 2004/05/21 01:47:27 danielk1977 Exp $
*/
#ifndef _SQLITE_H_
#define _SQLITE_H_
/*
** Register a function that is called at every invocation of sqlite3_exec()
-** or sqlite3_compile(). This function can be used (for example) to generate
+** or sqlite3_prepare(). This function can be used (for example) to generate
** a log file of all SQL executed against a database.
*/
void *sqlite3_trace(sqlite*, void(*xTrace)(void*,const char*), void*);
int sqlite3_reset(sqlite_vm*, char **pzErrMsg);
/*
-** If the SQL that was handed to sqlite3_compile contains variables that
+** If the SQL that was handed to sqlite3_prepare contains variables that
** are represeted in the SQL text by a question mark ('?'). This routine
** is used to assign values to those variables.
**
-** The first parameter is a virtual machine obtained from sqlite3_compile().
+** The first parameter is a virtual machine obtained from sqlite3_prepare().
** The 2nd "idx" parameter determines which variable in the SQL statement
** to bind the value to. The left most '?' is 1. The 3rd parameter is
** the value to assign to that variable. The 4th parameter is the number
** If the 4th "len" parameter is -1, then strlen() is used to find the
** length.
**
-** This routine can only be called immediately after sqlite3_compile()
+** This routine can only be called immediately after sqlite3_prepare()
** or sqlite3_reset() and before any calls to sqlite3_step().
**
******* THIS IS AN EXPERIMENTAL API AND IS SUBJECT TO CHANGE ******
/*
** This routine is used to bind a 32-bit integer value to a variable
-** in an SQL statement compiled by sqlite3_compile(). See comments for
-** sqlite3_compile() for more details on SQL statement variables.
+** in an SQL statement compiled by sqlite3_prepare(). See comments for
+** sqlite3_prepare() for more details on SQL statement variables.
**
** The first argument is a pointer to an SQL statement previously
-** obtained from a call to sqlite3_compile(). The second parameter "i"
+** obtained from a call to sqlite3_prepare(). The second parameter "i"
** determines the parameter to bind the value "iValue" to.
*/
int sqlite3_bind_int32(sqlite3_stmt*, int i, int iValue);
/*
** This routine is used to bind a 64-bit integer value to a variable
-** in an SQL statement compiled by sqlite3_compile(). See comments for
-** sqlite3_compile() for more details on SQL statement variables.
+** in an SQL statement compiled by sqlite3_prepare(). See comments for
+** sqlite3_prepare() for more details on SQL statement variables.
**
** The first argument is a pointer to an SQL statement previously
-** obtained from a call to sqlite3_compile(). The second parameter "i"
+** obtained from a call to sqlite3_prepare(). The second parameter "i"
** determines the parameter to bind the value "iValue" to.
*/
int sqlite3_bind_int64(sqlite3_stmt*, int i, long long int iValue);
/*
** This routine is used to bind a real (floating point) value to a variable
-** in an SQL statement compiled by sqlite3_compile(). See comments for
-** sqlite3_compile() for more details on SQL statement variables.
+** in an SQL statement compiled by sqlite3_prepare(). See comments for
+** sqlite3_prepare() for more details on SQL statement variables.
**
** The first argument is a pointer to an SQL statement previously obtained
-** from a call to sqlite3_compile(). The second parameter "i" determines
+** from a call to sqlite3_prepare(). The second parameter "i" determines
** the parameter to bind the value "iValue" to. Internally, SQLite will
** manipulate the value as a 64-bit IEEE float.
*/
/*
** This routine is used to bind a NULL value to a variable in an SQL
-** statement compiled by sqlite3_compile(). See comments for
-** sqlite3_compile() for more details on SQL statement variables.
+** statement compiled by sqlite3_prepare(). See comments for
+** sqlite3_prepare() for more details on SQL statement variables.
**
** The first argument is a pointer to an SQL statement previously obtained
-** from a call to sqlite3_compile(). The second parameter "i" determines
+** from a call to sqlite3_prepare(). The second parameter "i" determines
** the parameter to bind the NULL value to.
*/
int sqlite3_bind_null(sqlite3_stmt*, int i);
/*
** This routine is used to bind a UTF-8 string value to a variable in an
-** SQL statement compiled by sqlite3_compile(). See comments for
-** sqlite3_compile() for more details on SQL statement variables.
+** SQL statement compiled by sqlite3_prepare(). See comments for
+** sqlite3_prepare() for more details on SQL statement variables.
**
** The first argument is a pointer to an SQL statement previously obtained
-** from a call to sqlite3_compile(). The second parameter "i" determines
+** from a call to sqlite3_prepare(). The second parameter "i" determines
** the parameter to bind the value to. Parameter three "z" is a pointer
** to the UTF-8 string.
**
/*
** This routine is used to bind a UTF-16 string value to a variable in an
-** SQL statement compiled by sqlite3_compile(). See comments for
-** sqlite3_compile() for more details on SQL statement variables.
+** SQL statement compiled by sqlite3_prepare(). See comments for
+** sqlite3_prepare() for more details on SQL statement variables.
**
** The first argument is a pointer to an SQL statement previously obtained
-** from a call to sqlite3_compile(). The second parameter "i" determines
+** from a call to sqlite3_prepare(). The second parameter "i" determines
** the parameter to bind the value to. Parameter three "z" is a pointer to
** the UTF-16 string. If the string does not begin with a byte-order-mark,
** it is assumed to be encoded in the native byte order of the machine.
/*
** This routine is used to bind a blob value to a variable in an
-** SQL statement compiled by sqlite3_compile(). See comments for
-** sqlite3_compile() for more details on SQL statement variables.
+** SQL statement compiled by sqlite3_prepare(). See comments for
+** sqlite3_prepare() for more details on SQL statement variables.
**
** The first argument is a pointer to an SQL statement previously obtained
-** from a call to sqlite3_compile(). The second parameter "i" determines
+** from a call to sqlite3_prepare(). The second parameter "i" determines
** the parameter to bind the value to. Parameter three "z" is a pointer to
** the blob of data.
**
*/
const void *sqlite3_errmsg16(sqlite3*);
+/*
+** To execute an SQL query, it must first be compiled into a byte-code
+** program using this routine. The first parameter "db" is an SQLite
+** database handle. The second parameter "zSql" is the statement
+** to be compiled, encoded as UTF-8 text. If the next parameter, "nBytes",
+** is less than zero, then zSql is read up to the first nul terminator.
+** If "nBytes" is not less than zero, then it is the length of the
+** string zSql, in bytes (not characters).
+**
+** *pzTail is made to point to the first character past the end of the first
+** SQL statement in zSql. This routine only compiles the first statement
+** in zSql, so *pzTail is left pointing to what remains uncompiled.
+**
+** *ppStmt is left pointing to a compiled SQL statement that can be
+** executed using sqlite3_step(). Or if there is an error, *ppStmt may be
+** set to NULL. If the input text contained no SQL (if the input is and
+** empty string or a comment) then *ppStmt is set to NULL.
+**
+** On success, SQLITE_OK is returned. Otherwise an error code is returned.
+**
+*/
int sqlite3_prepare(
sqlite3 *db, /* Database handle */
const char *zSql, /* SQL statement, UTF-8 encoded */
const void **pzTail /* OUT: Pointer to unused portion of zSql */
);
+int sqlite3_open_new(
+ const char *filename, /* Database filename (UTF-8) */
+ sqlite3 **ppDb, /* OUT: SQLite db handle */
+ const char **args /* Null terminated array of option strings */
+);
+
+int sqlite3_open16(
+ const void *filename, /* Database filename (UTF-16) */
+ sqlite3 **ppDb, /* OUT: SQLite db handle */
+ const char **args /* Null terminated array of option strings */
+);
+
+
#if 0
-int sqlite3_open(const char*, sqlite3**, const char**);
-int sqlite3_open16(const void*, sqlite3**, const char**);
int sqlite3_close(sqlite3*);
int sqlite3_finalize(sqlite3_stmt*);
*************************************************************************
** Internal interface definitions for SQLite.
**
-** @(#) $Id: sqliteInt.h,v 1.242 2004/05/21 01:29:06 drh Exp $
+** @(#) $Id: sqliteInt.h,v 1.243 2004/05/21 01:47:27 danielk1977 Exp $
*/
#include "config.h"
#include "sqlite.h"
u16 flags; /* Flags associated with this database */
void *pAux; /* Auxiliary data. Usually NULL */
void (*xFreeAux)(void*); /* Routine to free pAux */
+ u8 textEnc; /* Text encoding for this database. */
};
/*
#define DB_SchemaLoaded 0x0004 /* The schema has been loaded */
#define DB_UnresetViews 0x0008 /* Some views have defined column names */
+/*
+** Possible values for the Db.textEnc field.
+*/
+#define TEXT_Utf8 1
+#define TEXT_Utf16le 2
+#define TEXT_Utf16be 3
/*
** Each database is an instance of the following structure.
** is not included in the SQLite library. It is used for automated
** testing of the SQLite library.
**
-** $Id: test1.c,v 1.43 2004/05/20 22:16:30 drh Exp $
+** $Id: test1.c,v 1.44 2004/05/21 01:47:27 danielk1977 Exp $
*/
#include "sqliteInt.h"
#include "tcl.h"
return TCL_OK;
}
-/*
-** Usage: sqlite3_open filename
-**
-** Returns: The name of an open database.
-*/
-static int sqlite_test_open(
- 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 *zErr = 0;
- char zBuf[100];
- if( argc!=2 ){
- Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
- " FILENAME\"", 0);
- return TCL_ERROR;
- }
- db = sqlite3_open(argv[1], 0666, &zErr);
- if( db==0 ){
- Tcl_AppendResult(interp, zErr, 0);
- free(zErr);
- return TCL_ERROR;
- }
- if( makePointerStr(interp, zBuf, db) ) return TCL_ERROR;
- Tcl_AppendResult(interp, zBuf, 0);
- return TCL_OK;
-}
-
/*
** The callback routine for sqlite3_exec_printf().
*/
return TCL_OK;
}
-/*
-** Usage: sqlite3_compile DB SQL ?TAILVAR?
-**
-** Attempt to compile an SQL statement. Return a pointer to the virtual
-** machine used to execute that statement. Unprocessed SQL is written
-** into TAILVAR.
-*/
-static int test_compile(
- 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;
- sqlite_vm *vm;
- int rc;
- char *zErr = 0;
- const char *zTail;
- char zBuf[50];
- if( argc!=3 && argc!=4 ){
- Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
- " DB SQL TAILVAR", 0);
- return TCL_ERROR;
- }
- if( getDbPointer(interp, argv[1], &db) ) return TCL_ERROR;
- rc = sqlite3_compile(db, argv[2], argc==4 ? &zTail : 0, &vm, &zErr);
- if( argc==4 ) Tcl_SetVar(interp, argv[3], zTail, 0);
- if( rc ){
- assert( vm==0 );
- sprintf(zBuf, "(%d) ", rc);
- Tcl_AppendResult(interp, zBuf, zErr, 0);
- sqlite3_freemem(zErr);
- return TCL_ERROR;
- }
- if( vm ){
- if( makePointerStr(interp, zBuf, vm) ) return TCL_ERROR;
- Tcl_AppendResult(interp, zBuf, 0);
- }
- return TCL_OK;
-}
-
/*
** Usage: sqlite3_step VM ?NVAR? ?VALUEVAR? ?COLNAMEVAR?
**
const char *zTail = 0;
sqlite3_stmt *pStmt = 0;
char zBuf[50];
+ int rc;
if( objc!=5 ){
Tcl_AppendResult(interp, "wrong # args: should be \"",
zSql = Tcl_GetString(objv[2]);
if( Tcl_GetIntFromObj(interp, objv[3], &bytes) ) return TCL_ERROR;
- if( SQLITE_OK!=sqlite3_prepare(db, zSql, bytes, &pStmt, &zTail) ){
- return TCL_ERROR;
- }
-
+ rc = sqlite3_prepare(db, zSql, bytes, &pStmt, &zTail);
if( zTail ){
if( bytes>=0 ){
bytes = bytes - (zTail-zSql);
}
Tcl_ObjSetVar2(interp, objv[4], 0, Tcl_NewStringObj(zTail, bytes), 0);
}
+ if( rc!=SQLITE_OK ){
+ assert( pStmt==0 );
+ sprintf(zBuf, "(%d) ", rc);
+ Tcl_AppendResult(interp, zBuf, sqlite3_errmsg(db), 0);
+ return TCL_ERROR;
+ }
- if( makePointerStr(interp, zBuf, pStmt) ) return TCL_ERROR;
- Tcl_AppendResult(interp, zBuf, 0);
+ if( pStmt ){
+ if( makePointerStr(interp, zBuf, pStmt) ) return TCL_ERROR;
+ Tcl_AppendResult(interp, zBuf, 0);
+ }
return TCL_OK;
}
pTail = Tcl_NewByteArrayObj((u8 *)zTail, objlen);
Tcl_IncrRefCount(pTail);
Tcl_ObjSetVar2(interp, objv[4], 0, pTail, 0);
- // Tcl_DecrRefCount(pTail);
+ Tcl_DecrRefCount(pTail);
+
+ if( pStmt ){
+ if( makePointerStr(interp, zBuf, pStmt) ) return TCL_ERROR;
+ }
+ Tcl_AppendResult(interp, zBuf, 0);
+ return TCL_OK;
+}
+
+/*
+** Usage: sqlite3_open filename ?options-list?
+*/
+static int test_open(
+ void * clientData,
+ Tcl_Interp *interp,
+ int objc,
+ Tcl_Obj *CONST objv[]
+){
+ const char *zFilename;
+ sqlite3 *db;
+ int rc;
+ char zBuf[100];
- if( makePointerStr(interp, zBuf, pStmt) ) return TCL_ERROR;
+ if( objc!=3 && objc!=2 ){
+ Tcl_AppendResult(interp, "wrong # args: should be \"",
+ Tcl_GetString(objv[0]), " filename options-list", 0);
+ return TCL_ERROR;
+ }
+
+ zFilename = Tcl_GetString(objv[1]);
+ rc = sqlite3_open_new(zFilename, &db, 0);
+
+ if( makePointerStr(interp, zBuf, db) ) return TCL_ERROR;
Tcl_AppendResult(interp, zBuf, 0);
return TCL_OK;
}
+/*
+** Usage: sqlite3_open16 filename options
+*/
+static int test_open16(
+ void * clientData,
+ Tcl_Interp *interp,
+ int objc,
+ Tcl_Obj *CONST objv[]
+){
+ const void *zFilename;
+ sqlite3 *db;
+ int rc;
+ char zBuf[100];
+
+ if( objc!=3 ){
+ Tcl_AppendResult(interp, "wrong # args: should be \"",
+ Tcl_GetString(objv[0]), " filename options-list", 0);
+ return TCL_ERROR;
+ }
+
+ zFilename = Tcl_GetByteArrayFromObj(objv[1], 0);
+ rc = sqlite3_open16(zFilename, &db, 0);
+
+ if( makePointerStr(interp, zBuf, db) ) return TCL_ERROR;
+ Tcl_AppendResult(interp, zBuf, 0);
+ return TCL_OK;
+}
/*
** This is a collating function named "REVERSE" which sorts text
{ "sqlite3_mprintf_double", (Tcl_CmdProc*)sqlite3_mprintf_double },
{ "sqlite3_mprintf_scaled", (Tcl_CmdProc*)sqlite3_mprintf_scaled },
{ "sqlite3_mprintf_z_test", (Tcl_CmdProc*)test_mprintf_z },
- { "sqlite3_open", (Tcl_CmdProc*)sqlite_test_open },
+// { "sqlite3_open", (Tcl_CmdProc*)sqlite_test_open },
{ "sqlite3_last_insert_rowid", (Tcl_CmdProc*)test_last_rowid },
{ "sqlite3_exec_printf", (Tcl_CmdProc*)test_exec_printf },
{ "sqlite3_get_table_printf", (Tcl_CmdProc*)test_get_table_printf },
{ "sqlite_malloc_fail", (Tcl_CmdProc*)sqlite_malloc_fail },
{ "sqlite_malloc_stat", (Tcl_CmdProc*)sqlite_malloc_stat },
#endif
- { "sqlite_compile", (Tcl_CmdProc*)test_compile },
- { "sqlite_step", (Tcl_CmdProc*)test_step },
- { "sqlite_finalize", (Tcl_CmdProc*)test_finalize },
- { "sqlite_bind", (Tcl_CmdProc*)test_bind },
- { "sqlite_reset", (Tcl_CmdProc*)test_reset },
- { "breakpoint", (Tcl_CmdProc*)test_breakpoint },
+ { "sqlite_step", (Tcl_CmdProc*)test_step },
+ { "sqlite_finalize", (Tcl_CmdProc*)test_finalize },
+ { "sqlite_bind", (Tcl_CmdProc*)test_bind },
+ { "sqlite_reset", (Tcl_CmdProc*)test_reset },
+ { "breakpoint", (Tcl_CmdProc*)test_breakpoint },
};
static struct {
char *zName;
{ "sqlite3_errmsg16", (Tcl_ObjCmdProc*)test_errmsg16 },
{ "sqlite3_prepare", (Tcl_ObjCmdProc*)test_prepare },
{ "sqlite3_prepare16", (Tcl_ObjCmdProc*)test_prepare16 },
+ { "sqlite3_open", (Tcl_ObjCmdProc*)test_open },
+ { "sqlite3_open16", (Tcl_ObjCmdProc*)test_open16 },
{ "add_reverse_collating_func", (Tcl_ObjCmdProc*)reverse_collfunc },
};
int i;
# focus of this script is testing the ATTACH and DETACH commands
# and related functionality.
#
-# $Id: attach2.test,v 1.7 2004/05/13 11:34:17 danielk1977 Exp $
+# $Id: attach2.test,v 1.8 2004/05/21 01:47:27 danielk1977 Exp $
#
do_test attach2-3.1 {
db close
set DB [sqlite db test.db]
- set rc [catch {sqlite_compile $DB "ATTACH 'test2.db' AS t2" TAIL} VM]
+ set rc [catch {sqlite3_prepare $DB "ATTACH 'test2.db' AS t2" -1 TAIL} VM]
if {$rc} {lappend rc $VM}
sqlite_finalize $VM
set rc
} {0}
do_test attach2-3.2 {
- set rc [catch {sqlite_compile $DB "DETACH t2" TAIL} VM]
+ set rc [catch {sqlite3_prepare $DB "DETACH t2" -1 TAIL} VM]
if {$rc} {lappend rc $VM}
sqlite_finalize $VM
set rc
# This file implements regression tests for SQLite library. The
# focus of this script testing the sqlite_bind API.
#
-# $Id: bind.test,v 1.3 2004/05/20 11:00:53 danielk1977 Exp $
+# $Id: bind.test,v 1.4 2004/05/21 01:47:27 danielk1977 Exp $
#
set testdir [file dirname $argv0]
db close
set DB [sqlite db test.db]
execsql {CREATE TABLE t1(a,b,c)}
- set VM [sqlite_compile $DB {INSERT INTO t1 VALUES(?,?,?)} TAIL]
+ set VM [sqlite3_prepare $DB {INSERT INTO t1 VALUES(?,?,?)} -1 TAIL]
set TAIL
} {}
do_test bind-1.2 {
execsql {
DELETE FROM t1;
}
- set VM [sqlite_compile $DB {INSERT INTO t1 VALUES(?,?,?)} TAIL]
+ set VM [sqlite3_bind_int32 $DB {INSERT INTO t1 VALUES(?,?,?)} TAIL]
set TAIL
} {}
# This file implements regression tests for SQLite library. The
# focus of this script testing the callback-free C/C++ API.
#
-# $Id: capi2.test,v 1.10 2003/08/05 13:13:38 drh Exp $
+# $Id: capi2.test,v 1.11 2004/05/21 01:47:27 danielk1977 Exp $
#
set testdir [file dirname $argv0]
db close
set DB [sqlite db test.db]
execsql {CREATE TABLE t1(a,b,c)}
- set VM [sqlite_compile $DB {SELECT name, rowid FROM sqlite_master} TAIL]
+ set VM [sqlite3_prepare $DB {SELECT name, rowid FROM sqlite_master} -1 TAIL]
set TAIL
} {}
do_test capi2-1.2 {
} {}
# Check to make sure that the "tail" of a multi-statement SQL script
-# is returned by sqlite_compile.
+# is returned by sqlite3_prepare.
#
do_test capi2-2.1 {
set SQL {
SELECT name, rowid FROM sqlite_temp_master;
-- A comment at the end
}
- set VM [sqlite_compile $DB $SQL SQL]
+ set VM [sqlite3_prepare $DB $SQL -1 SQL]
set SQL
} {
SELECT name, rowid FROM sqlite_temp_master;
sqlite_finalize $VM
} {}
do_test capi2-2.5 {
- set VM [sqlite_compile $DB $SQL SQL]
+ set VM [sqlite3_prepare $DB $SQL -1 SQL]
set SQL
} {
-- A comment at the end
sqlite_finalize $VM
} {}
do_test capi2-2.8 {
- set VM [sqlite_compile $DB $SQL SQL]
+ set VM [sqlite3_prepare $DB $SQL -1 SQL]
list $SQL $VM
} {{} {}}
#
do_test capi2-3.1 {
set rc [catch {
- sqlite_compile $DB {select bogus from sqlite_master} TAIL
+ sqlite3_prepare $DB {select bogus from sqlite_master} -1 TAIL
} msg]
lappend rc $msg $TAIL
} {1 {(1) no such column: bogus} {}}
do_test capi2-3.2 {
set rc [catch {
- sqlite_compile $DB {select bogus from } TAIL
+ sqlite3_prepare $DB {select bogus from } -1 TAIL
} msg]
lappend rc $msg $TAIL
} {1 {(1) near " ": syntax error} {}}
do_test capi2-3.3 {
set rc [catch {
- sqlite_compile $DB {;;;;select bogus from sqlite_master} TAIL
+ sqlite3_prepare $DB {;;;;select bogus from sqlite_master} -1 TAIL
} msg]
lappend rc $msg $TAIL
} {1 {(1) no such column: bogus} {}}
do_test capi2-3.4 {
set rc [catch {
- sqlite_compile $DB {select bogus from sqlite_master;x;} TAIL
+ sqlite3_prepare $DB {select bogus from sqlite_master;x;} -1 TAIL
} msg]
lappend rc $msg $TAIL
} {1 {(1) no such column: bogus} {x;}}
do_test capi2-3.5 {
set rc [catch {
- sqlite_compile $DB {select bogus from sqlite_master;;;x;} TAIL
+ sqlite3_prepare $DB {select bogus from sqlite_master;;;x;} -1 TAIL
} msg]
lappend rc $msg $TAIL
} {1 {(1) no such column: bogus} {;;x;}}
do_test capi2-3.6 {
set rc [catch {
- sqlite_compile $DB {select 5/0} TAIL
+ sqlite3_prepare $DB {select 5/0} -1 TAIL
} VM]
lappend rc $TAIL
} {0 {}}
} {}
do_test capi2-3.9 {
execsql {CREATE UNIQUE INDEX i1 ON t1(a)}
- set VM [sqlite_compile $DB {INSERT INTO t1 VALUES(1,2,3)} TAIL]
+ set VM [sqlite3_prepare $DB {INSERT INTO t1 VALUES(1,2,3)} -1 TAIL]
set TAIL
} {}
do_test capi2-3.9b {db changes} {0}
list [catch {sqlite_finalize $VM} msg] [set msg]
} {1 {(21) library routine called out of sequence}}
do_test capi2-3.13 {
- set VM [sqlite_compile $DB {INSERT INTO t1 VALUES(1,3,4)} TAIL]
+ set VM [sqlite3_prepare $DB {INSERT INTO t1 VALUES(1,3,4)} -1 TAIL]
list [sqlite_step $VM N VALUE COLNAME] [set N] [set VALUE] [set COLNAME]
} {SQLITE_ERROR 0 {} {}}
do_test capi2-3.13b {db changes} {0}
list [catch {sqlite_finalize $VM} msg] [set msg]
} {1 {(19) column a is not unique}}
do_test capi2-3.15 {
- set VM [sqlite_compile $DB {CREATE TABLE t2(a NOT NULL, b)} TAIL]
+ set VM [sqlite3_prepare $DB {CREATE TABLE t2(a NOT NULL, b)} -1 TAIL]
set TAIL
} {}
do_test capi2-3.16 {
list [catch {sqlite_finalize $VM} msg] [set msg]
} {0 {}}
do_test capi2-3.18 {
- set VM [sqlite_compile $DB {INSERT INTO t2 VALUES(NULL,2)} TAIL]
+ set VM [sqlite3_prepare $DB {INSERT INTO t2 VALUES(NULL,2)} -1 TAIL]
list [sqlite_step $VM N VALUE COLNAME] [set N] [set VALUE] [set COLNAME]
} {SQLITE_ERROR 0 {} {}}
do_test capi2-3.19 {
# Two or more virtual machines exists at the same time.
#
do_test capi2-4.1 {
- set VM1 [sqlite_compile $DB {INSERT INTO t2 VALUES(1,2)} TAIL]
+ set VM1 [sqlite3_prepare $DB {INSERT INTO t2 VALUES(1,2)} -1 TAIL]
set TAIL
} {}
do_test capi2-4.2 {
- set VM2 [sqlite_compile $DB {INSERT INTO t2 VALUES(2,3)} TAIL]
+ set VM2 [sqlite3_prepare $DB {INSERT INTO t2 VALUES(2,3)} -1 TAIL]
set TAIL
} {}
do_test capi2-4.3 {
- set VM3 [sqlite_compile $DB {INSERT INTO t2 VALUES(3,4)} TAIL]
+ set VM3 [sqlite3_prepare $DB {INSERT INTO t2 VALUES(3,4)} -1 TAIL]
set TAIL
} {}
do_test capi2-4.4 {
# Interleaved SELECTs
#
do_test capi2-5.1 {
- set VM1 [sqlite_compile $DB {SELECT * FROM t2} TAIL]
- set VM2 [sqlite_compile $DB {SELECT * FROM t2} TAIL]
- set VM3 [sqlite_compile $DB {SELECT * FROM t2} TAIL]
+ set VM1 [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL]
+ set VM2 [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL]
+ set VM3 [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL]
list [sqlite_step $VM1 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME]
} {SQLITE_ROW 2 {2 3} {a b {} {}}}
do_test capi2-5.2 {
INSERT INTO t3 SELECT x+8 FROM t3;
COMMIT;
}
- set VM1 [sqlite_compile $DB {SELECT * FROM t3} TAIL]
+ set VM1 [sqlite3_prepare $DB {SELECT * FROM t3} -1 TAIL]
sqlite db2 test.db
execsql {BEGIN} db2
} {}
# Ticket #261 - make sure we can finalize before the end of a query.
#
do_test capi2-8.1 {
- set VM1 [sqlite_compile $DB {SELECT * FROM t2} TAIL]
+ set VM1 [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL]
sqlite_finalize $VM1
} {}
-# Tickets #384 and #385 - make sure the TAIL argument to sqlite_compile
+# Tickets #384 and #385 - make sure the TAIL argument to sqlite3_prepare
# and all of the return pointers in sqlite_step can be null.
#
do_test capi2-9.1 {
- set VM1 [sqlite_compile $DB {SELECT * FROM t2}]
+ set VM1 [sqlite3_prepare $DB {SELECT * FROM t2} -1 DUMMY]
sqlite_step $VM1
sqlite_finalize $VM1
} {}
# This file implements regression tests for SQLite library. The
# focus of this script testing the callback-free C/C++ API.
#
-# $Id: capi3.test,v 1.1 2004/05/20 11:00:53 danielk1977 Exp $
+# $Id: capi3.test,v 1.2 2004/05/21 01:47:27 danielk1977 Exp $
#
set testdir [file dirname $argv0]
#
# capi3-1.*: Test sqlite3_prepare
# capi3-2.*: Test sqlite3_prepare16
+# capi3-3.*: Test sqlite3_open
+# capi3-4.*: Test sqlite3_open16
#
db close
sqlite3_errmsg $DB
} {no such column: namex}
+# rename sqlite3_open sqlite3_open_old
+# proc sqlite3_open {fname options} {sqlite3_open_new $fname $options}
+
+do_test capi3-3.1 {
+ set db2 [sqlite3_open test.db {}]
+ sqlite3_errcode $db2
+} {SQLITE_OK}
+# FIX ME: Should test the db handle works.
+do_test capi3-3.2 {
+ sqlite3_close $db2
+} {}
+do_test capi3-3.3 {
+ catch {
+ set db2 [sqlite3_open /bogus/path/test.db {}]
+ }
+ sqlite3_errcode $db2
+} {SQLITE_CANTOPEN}
+do_test capi3-3.4 {
+ sqlite3_errmsg $db2
+} {unable to open database file}
+do_test capi3-3.4 {
+ sqlite3_close $db2
+} {}
+
+# rename sqlite3_open ""
+# rename sqlite3_open_old sqlite3_open
+
+do_test capi3-4.1 {
+ set db2 [sqlite3_open16 [utf16 test.db] {}]
+ sqlite3_errcode $db2
+} {SQLITE_OK}
+# FIX ME: Should test the db handle works.
+do_test capi3-4.2 {
+ sqlite3_close $db2
+} {}
+do_test capi3-4.3 {
+ catch {
+ set db2 [sqlite3_open16 [utf16 /bogus/path/test.db] {}]
+ }
+ sqlite3_errcode $db2
+} {SQLITE_CANTOPEN}
+do_test capi3-4.4 {
+ utf8 [sqlite3_errmsg16 $db2]
+} {unable to open database file}
+do_test capi3-4.4 {
+ sqlite3_close $db2
+} {}
+
finish_test
# This file implements some common TCL routines used for regression
# testing the SQLite library
#
-# $Id: tester.tcl,v 1.33 2004/05/20 22:16:31 drh Exp $
+# $Id: tester.tcl,v 1.34 2004/05/21 01:47:27 danielk1977 Exp $
# Make sure tclsqlite was compiled correctly. Abort now with an
# error message if not.
set sql [string trim $sql]
set r 0
while {[string length $sql]>0} {
- if {[catch {sqlite_compile $dbptr $sql sqltail} vm]} {
+ if {[catch {sqlite3_prepare $dbptr $sql -1 sqltail} vm]} {
return [list 1 $vm]
}
set sql [string trim $sqltail]
# This file implements regression tests for SQLite library. The
# focus of this file is testing the VACUUM statement.
#
-# $Id: vacuum.test,v 1.15 2004/02/14 16:31:04 drh Exp $
+# $Id: vacuum.test,v 1.16 2004/05/21 01:47:27 danielk1977 Exp $
set testdir [file dirname $argv0]
source $testdir/tester.tcl
}
} {}
-# Ticket #464. Make sure VACUUM works with the sqlite_compile() API.
+# Ticket #464. Make sure VACUUM works with the sqlite3_prepare() API.
#
do_test vacuum-4.1 {
db close
set DB [sqlite db test.db]
- set VM [sqlite_compile $DB {VACUUM} TAIL]
+ set VM [sqlite3_prepare $DB {VACUUM} -1 TAIL]
sqlite_step $VM N VALUES COLNAMES
} {SQLITE_DONE}
do_test vacuum-4.2 {