1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-07-30 19:03:16 +03:00

Add new sqlite3_open() and sqlite3_open16() APIs. (CVS 1423)

FossilOrigin-Name: 307b55006c401f10ec5fa5b12cc7d5ba860f9a46
This commit is contained in:
danielk1977
2004-05-21 01:47:26 +00:00
parent ffbc30884c
commit 4ad1713c5e
12 changed files with 403 additions and 172 deletions

View File

@ -1,5 +1,5 @@
C Sorting\sbug\sfixes.\s\sNow\sonly\s17\stests\sfail.\s(CVS\s1422) C Add\snew\ssqlite3_open()\sand\ssqlite3_open16()\sAPIs.\s(CVS\s1423)
D 2004-05-21T01:29:06 D 2004-05-21T01:47:27
F Makefile.in ab7b0d5118e2da97bac66be8684a1034e3500f5a F Makefile.in ab7b0d5118e2da97bac66be8684a1034e3500f5a
F Makefile.linux-gcc b86a99c493a5bfb402d1d9178dcdc4bd4b32f906 F Makefile.linux-gcc b86a99c493a5bfb402d1d9178dcdc4bd4b32f906
F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd
@ -37,7 +37,7 @@ F src/func.c cfbb7096efb58e2857e3b312a8958a12774b625a
F src/hash.c 440c2f8cb373ee1b4e13a0988489c7cd95d55b6f F src/hash.c 440c2f8cb373ee1b4e13a0988489c7cd95d55b6f
F src/hash.h 762d95f1e567664d1eafc1687de755626be962fb F src/hash.h 762d95f1e567664d1eafc1687de755626be962fb
F src/insert.c e510d62d23b4de4d901e7ccbbe7833b7fb3b9570 F src/insert.c e510d62d23b4de4d901e7ccbbe7833b7fb3b9570
F src/main.c bb0e84eda9beb447bff109b061a82e6c9b3dc811 F src/main.c a9ee98262a12454c72741d94da2317119d3a1071
F src/md5.c 8e39fdae6d8776b87558e91dcc94740c9b635a9c F src/md5.c 8e39fdae6d8776b87558e91dcc94740c9b635a9c
F src/os.c ddcda92f7fd71b4513c57c1ec797917f206d504e F src/os.c ddcda92f7fd71b4513c57c1ec797917f206d504e
F src/os.h 6e446a17cbeb6c2ce470683a0bb8d9c63abe8607 F src/os.h 6e446a17cbeb6c2ce470683a0bb8d9c63abe8607
@ -49,11 +49,11 @@ F src/printf.c ef750e8e2398ca7e8b58be991075f08c6a7f0e53
F src/random.c eff68e3f257e05e81eae6c4d50a51eb88beb4ff3 F src/random.c eff68e3f257e05e81eae6c4d50a51eb88beb4ff3
F src/select.c d77f773165a2690e6e58c0a94dc21b28270695c2 F src/select.c d77f773165a2690e6e58c0a94dc21b28270695c2
F src/shell.c 0c4662e13bfbfd3d13b066c5859cc97ad2f95d21 F src/shell.c 0c4662e13bfbfd3d13b066c5859cc97ad2f95d21
F src/sqlite.h.in 8c000826a517ac7302dc2e1c483e71cd06eaf0de F src/sqlite.h.in de337e211905c6bd4ad901916f78df28f1467df4
F src/sqliteInt.h 3f4848eb5b7cd7818943e9f4b924a8601f7ef06a F src/sqliteInt.h 2e5533ba50106d266cddfb00b2eb3ab6944b8f3e
F src/table.c af14284fa36c8d41f6829e3f2819dce07d3e2de2 F src/table.c af14284fa36c8d41f6829e3f2819dce07d3e2de2
F src/tclsqlite.c fbf0fac73624ae246551a6c671f1de0235b5faa1 F src/tclsqlite.c fbf0fac73624ae246551a6c671f1de0235b5faa1
F src/test1.c 5ba6352c8d63eae9eb98e6ae5bfe24a448b3bcb7 F src/test1.c c72aed60609038b25c0782ec69b71f33f1157d64
F src/test2.c 6195a1ca2c8d0d2d93644e86da3289b403486872 F src/test2.c 6195a1ca2c8d0d2d93644e86da3289b403486872
F src/test3.c 5e4a6d596f982f6f47a5f9f75ede9b4a3b739968 F src/test3.c 5e4a6d596f982f6f47a5f9f75ede9b4a3b739968
F src/test4.c b3fab9aea7a8940a8a7386ce1c7e2157b09bd296 F src/test4.c b3fab9aea7a8940a8a7386ce1c7e2157b09bd296
@ -71,18 +71,18 @@ F src/vdbeaux.c 51f7d0cc6c515111b11576e2d82f4637156075cd
F src/where.c efe5d25fe18cd7381722457898cd863e84097a0c F src/where.c efe5d25fe18cd7381722457898cd863e84097a0c
F test/all.test 569a92a8ee88f5300c057cc4a8f50fbbc69a3242 F test/all.test 569a92a8ee88f5300c057cc4a8f50fbbc69a3242
F test/attach.test cb9b884344e6cfa5e165965d5b1adea679a24c83 F test/attach.test cb9b884344e6cfa5e165965d5b1adea679a24c83
F test/attach2.test 7c388dee63a4c1997695c3d41957f32ce784ac56 F test/attach2.test 7a722607c1fa37837d3b2717605357d89b86c8b9
F test/auth.test 5c4d95cdaf539c0c236e20ce1f71a93e7dde9185 F test/auth.test 5c4d95cdaf539c0c236e20ce1f71a93e7dde9185
F test/bigfile.test ea904b853ce2d703b16c5ce90e2b54951bc1ae81 F test/bigfile.test ea904b853ce2d703b16c5ce90e2b54951bc1ae81
F test/bigrow.test 8ab252dba108f12ad64e337b0f2ff31a807ac578 F test/bigrow.test 8ab252dba108f12ad64e337b0f2ff31a807ac578
F test/bind.test 5d6ac8ab0dbec03ce79284abefa9230726cb9dad F test/bind.test 4517a8e8296c12f57f5917764cc1029ff567ff4f
F test/btree.test 08e4093c78d2bc1d54e27266f8d17fed14751125 F test/btree.test 08e4093c78d2bc1d54e27266f8d17fed14751125
F test/btree2.test aa4a6d05b1ea90b1acaf83ba89039dd302a88635 F test/btree2.test aa4a6d05b1ea90b1acaf83ba89039dd302a88635
F test/btree4.test 3797b4305694c7af6828675b0f4b1424b8ca30e4 F test/btree4.test 3797b4305694c7af6828675b0f4b1424b8ca30e4
F test/btree5.test 8e5ff32c02e685d36516c6499add9375fe1377f2 F test/btree5.test 8e5ff32c02e685d36516c6499add9375fe1377f2
F test/btree6.test a5ede6bfbbb2ec8b27e62813612c0f28e8f3e027 F test/btree6.test a5ede6bfbbb2ec8b27e62813612c0f28e8f3e027
F test/capi2.test ec96e0e235d87b53cbaef3d8e3e0f8ccf32c71ca F test/capi2.test 007f856cc7fe5a9aaeb076d2df9aff92012a0d5e
F test/capi3.test acc3919c0f37e85ac3561fc33d6abf7183e1aee1 F test/capi3.test ff3dfacdd07abad140c17eb58b235623c6957322
F test/conflict.test 0911bb2f079046914a6e9c3341b36658c4e2103e F test/conflict.test 0911bb2f079046914a6e9c3341b36658c4e2103e
F test/copy.test f07ea8d60878da7a67416ab62f78e9706b9d3c45 F test/copy.test f07ea8d60878da7a67416ab62f78e9706b9d3c45
F test/crashtest1.c 09c1c7d728ccf4feb9e481671e29dda5669bbcc2 F test/crashtest1.c 09c1c7d728ccf4feb9e481671e29dda5669bbcc2
@ -137,7 +137,7 @@ F test/table.test 50e4534552d0385a0e59b3a6d7dde059ced02f83
F test/tableapi.test e0c4cce61e58343caa84dab33fa6823cb35fe1e1 F test/tableapi.test e0c4cce61e58343caa84dab33fa6823cb35fe1e1
F test/tclsqlite.test a684fc191b81e6cded8a81263663d5a130fbb013 F test/tclsqlite.test a684fc191b81e6cded8a81263663d5a130fbb013
F test/temptable.test a770ba6308d7f7332fce985086b8e06bed6430c2 F test/temptable.test a770ba6308d7f7332fce985086b8e06bed6430c2
F test/tester.tcl 4f7d3ec86d86d9e6ce6939ad6dba4438d8375fba F test/tester.tcl 8c234ba903a437ce8c8a58f388d120310b54b44c
F test/thread1.test 53f050d5be6932d9430df7756edd379366508ff6 F test/thread1.test 53f050d5be6932d9430df7756edd379366508ff6
F test/threadtest1.c f7f896e62ed46feae1dc411114a48c15a0f82ee2 F test/threadtest1.c f7f896e62ed46feae1dc411114a48c15a0f82ee2
F test/threadtest2.c d94ca4114fd1504f7e0ae724bcd83d4b40931d86 F test/threadtest2.c d94ca4114fd1504f7e0ae724bcd83d4b40931d86
@ -150,7 +150,7 @@ F test/types.test e1e0d71c8e65f8aa5d9a36751f4c8cbce6f01f7a
F test/types2.test 5d725fcb68dbd032c6d4950d568d75fa33872687 F test/types2.test 5d725fcb68dbd032c6d4950d568d75fa33872687
F test/unique.test 0e38d4cc7affeef2527720d1dafd1f6870f02f2b F test/unique.test 0e38d4cc7affeef2527720d1dafd1f6870f02f2b
F test/update.test b29bd9061a1150426dab6959806fcc73a41b1217 F test/update.test b29bd9061a1150426dab6959806fcc73a41b1217
F test/vacuum.test a2a44544df719666efb51afbfeb6062fd59a672a F test/vacuum.test 7b5f504636a13992344871f8155b8557b683232a
F test/varint.test ab7b110089a08b9926ed7390e7e97bdefeb74102 F test/varint.test ab7b110089a08b9926ed7390e7e97bdefeb74102
F test/version.test 2ba212ba06380e65e476bdf2fcd390e8b05af5a0 F test/version.test 2ba212ba06380e65e476bdf2fcd390e8b05af5a0
F test/view.test 1ee12c6f8f4791a2c0655120d5562a49400cfe53 F test/view.test 1ee12c6f8f4791a2c0655120d5562a49400cfe53
@ -195,7 +195,7 @@ F www/sqlite.tcl 3c83b08cf9f18aa2d69453ff441a36c40e431604
F www/tclsqlite.tcl b9271d44dcf147a93c98f8ecf28c927307abd6da F www/tclsqlite.tcl b9271d44dcf147a93c98f8ecf28c927307abd6da
F www/vdbe.tcl 9b9095d4495f37697fd1935d10e14c6015e80aa1 F www/vdbe.tcl 9b9095d4495f37697fd1935d10e14c6015e80aa1
F www/whentouse.tcl a8335bce47cc2fddb07f19052cb0cb4d9129a8e4 F www/whentouse.tcl a8335bce47cc2fddb07f19052cb0cb4d9129a8e4
P b032b646b72a03e828d732ac22192f992904d79f P 0736b7e8401f587f8b412602d029ef9bd69425f6
R 855c0de9c9913c06ac48c05901c20ce2 R 48a2aee2f380542eefb73a0652ba3654
U drh U danielk1977
Z cf8b0e36973f7277ebb2343b2ce02ab9 Z 95516270bea0185aee7836097f272d88

View File

@ -1 +1 @@
0736b7e8401f587f8b412602d029ef9bd69425f6 307b55006c401f10ec5fa5b12cc7d5ba860f9a46

View File

@ -14,7 +14,7 @@
** other files are for internal use by SQLite and should not be ** other files are for internal use by SQLite and should not be
** accessed by users of the library. ** 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 "sqliteInt.h"
#include "os.h" #include "os.h"
@ -1055,14 +1055,51 @@ int sqlite3BtreeFactory(
return sqlite3BtreeOpen(zFilename, ppBtree, nCache, btree_flags); 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){ 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 ){ if( db->zErrMsg ){
return db->zErrMsg; return db->zErrMsg;
} }
return sqlite3_error_string(db->errCode); return sqlite3_error_string(db->errCode);
} }
/*
** Return UTF-16 encoded English language explanation of the most recent
** error.
*/
const void *sqlite3_errmsg16(sqlite3 *db){ 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 ){ if( !db->zErrMsg16 ){
char const *zErr8 = sqlite3_errmsg(db); char const *zErr8 = sqlite3_errmsg(db);
if( SQLITE3_BIGENDIAN ){ if( SQLITE3_BIGENDIAN ){
@ -1212,6 +1249,118 @@ int sqlite3_prepare16(
return rc; 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 #if 0

View File

@ -12,7 +12,7 @@
** This header file defines the interface that the SQLite library ** This header file defines the interface that the SQLite library
** presents to client programs. ** 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_ #ifndef _SQLITE_H_
#define _SQLITE_H_ #define _SQLITE_H_
@ -596,7 +596,7 @@ int sqlite3_set_authorizer(
/* /*
** Register a function that is called at every invocation of sqlite3_exec() ** 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. ** a log file of all SQL executed against a database.
*/ */
void *sqlite3_trace(sqlite*, void(*xTrace)(void*,const char*), void*); void *sqlite3_trace(sqlite*, void(*xTrace)(void*,const char*), void*);
@ -727,11 +727,11 @@ int sqlite3_finalize(sqlite_vm*, char **pzErrMsg);
int sqlite3_reset(sqlite_vm*, char **pzErrMsg); 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 ** are represeted in the SQL text by a question mark ('?'). This routine
** is used to assign values to those variables. ** 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 ** 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 ** 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 ** the value to assign to that variable. The 4th parameter is the number
@ -748,7 +748,7 @@ int sqlite3_reset(sqlite_vm*, char **pzErrMsg);
** If the 4th "len" parameter is -1, then strlen() is used to find the ** If the 4th "len" parameter is -1, then strlen() is used to find the
** length. ** 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(). ** or sqlite3_reset() and before any calls to sqlite3_step().
** **
******* THIS IS AN EXPERIMENTAL API AND IS SUBJECT TO CHANGE ****** ******* THIS IS AN EXPERIMENTAL API AND IS SUBJECT TO CHANGE ******
@ -868,33 +868,33 @@ typedef sqlite sqlite3;
/* /*
** This routine is used to bind a 32-bit integer value to a variable ** 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 ** in an SQL statement compiled by sqlite3_prepare(). See comments for
** sqlite3_compile() for more details on SQL statement variables. ** sqlite3_prepare() for more details on SQL statement variables.
** **
** The first argument is a pointer to an SQL statement previously ** 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. ** determines the parameter to bind the value "iValue" to.
*/ */
int sqlite3_bind_int32(sqlite3_stmt*, int i, int iValue); int sqlite3_bind_int32(sqlite3_stmt*, int i, int iValue);
/* /*
** This routine is used to bind a 64-bit integer value to a variable ** 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 ** in an SQL statement compiled by sqlite3_prepare(). See comments for
** sqlite3_compile() for more details on SQL statement variables. ** sqlite3_prepare() for more details on SQL statement variables.
** **
** The first argument is a pointer to an SQL statement previously ** 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. ** determines the parameter to bind the value "iValue" to.
*/ */
int sqlite3_bind_int64(sqlite3_stmt*, int i, long long int iValue); 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 ** 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 ** in an SQL statement compiled by sqlite3_prepare(). See comments for
** sqlite3_compile() for more details on SQL statement variables. ** sqlite3_prepare() for more details on SQL statement variables.
** **
** The first argument is a pointer to an SQL statement previously obtained ** 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 ** the parameter to bind the value "iValue" to. Internally, SQLite will
** manipulate the value as a 64-bit IEEE float. ** manipulate the value as a 64-bit IEEE float.
*/ */
@ -902,22 +902,22 @@ int sqlite3_bind_double(sqlite3_stmt*, int i, double iValue);
/* /*
** This routine is used to bind a NULL value to a variable in an SQL ** This routine is used to bind a NULL value to a variable in an SQL
** statement compiled by sqlite3_compile(). See comments for ** statement compiled by sqlite3_prepare(). See comments for
** sqlite3_compile() for more details on SQL statement variables. ** sqlite3_prepare() for more details on SQL statement variables.
** **
** The first argument is a pointer to an SQL statement previously obtained ** 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. ** the parameter to bind the NULL value to.
*/ */
int sqlite3_bind_null(sqlite3_stmt*, int i); int sqlite3_bind_null(sqlite3_stmt*, int i);
/* /*
** This routine is used to bind a UTF-8 string value to a variable in an ** 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 ** SQL statement compiled by sqlite3_prepare(). See comments for
** sqlite3_compile() for more details on SQL statement variables. ** sqlite3_prepare() for more details on SQL statement variables.
** **
** The first argument is a pointer to an SQL statement previously obtained ** 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 ** the parameter to bind the value to. Parameter three "z" is a pointer
** to the UTF-8 string. ** to the UTF-8 string.
** **
@ -936,11 +936,11 @@ int sqlite3_bind_text(sqlite3_stmt*, int i, const char* z, int n, int eCopy);
/* /*
** This routine is used to bind a UTF-16 string value to a variable in an ** 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 ** SQL statement compiled by sqlite3_prepare(). See comments for
** sqlite3_compile() for more details on SQL statement variables. ** sqlite3_prepare() for more details on SQL statement variables.
** **
** The first argument is a pointer to an SQL statement previously obtained ** 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 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, ** 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. ** it is assumed to be encoded in the native byte order of the machine.
@ -960,11 +960,11 @@ int sqlite3_bind_text16(sqlite3_stmt*, int i, const void *z, int, int eCopy);
/* /*
** This routine is used to bind a blob value to a variable in an ** This routine is used to bind a blob value to a variable in an
** SQL statement compiled by sqlite3_compile(). See comments for ** SQL statement compiled by sqlite3_prepare(). See comments for
** sqlite3_compile() for more details on SQL statement variables. ** sqlite3_prepare() for more details on SQL statement variables.
** **
** The first argument is a pointer to an SQL statement previously obtained ** 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 parameter to bind the value to. Parameter three "z" is a pointer to
** the blob of data. ** the blob of data.
** **
@ -1025,6 +1025,27 @@ const char *sqlite3_errmsg(sqlite3*);
*/ */
const void *sqlite3_errmsg16(sqlite3*); 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( int sqlite3_prepare(
sqlite3 *db, /* Database handle */ sqlite3 *db, /* Database handle */
const char *zSql, /* SQL statement, UTF-8 encoded */ const char *zSql, /* SQL statement, UTF-8 encoded */
@ -1041,10 +1062,21 @@ int sqlite3_prepare16(
const void **pzTail /* OUT: Pointer to unused portion of zSql */ 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 #if 0
int sqlite3_open(const char*, sqlite3**, const char**);
int sqlite3_open16(const void*, sqlite3**, const char**);
int sqlite3_close(sqlite3*); int sqlite3_close(sqlite3*);
int sqlite3_finalize(sqlite3_stmt*); int sqlite3_finalize(sqlite3_stmt*);

View File

@ -11,7 +11,7 @@
************************************************************************* *************************************************************************
** Internal interface definitions for SQLite. ** 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 "config.h"
#include "sqlite.h" #include "sqlite.h"
@ -282,6 +282,7 @@ struct Db {
u16 flags; /* Flags associated with this database */ u16 flags; /* Flags associated with this database */
void *pAux; /* Auxiliary data. Usually NULL */ void *pAux; /* Auxiliary data. Usually NULL */
void (*xFreeAux)(void*); /* Routine to free pAux */ void (*xFreeAux)(void*); /* Routine to free pAux */
u8 textEnc; /* Text encoding for this database. */
}; };
/* /*
@ -315,6 +316,12 @@ struct Db {
#define DB_SchemaLoaded 0x0004 /* The schema has been loaded */ #define DB_SchemaLoaded 0x0004 /* The schema has been loaded */
#define DB_UnresetViews 0x0008 /* Some views have defined column names */ #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. ** Each database is an instance of the following structure.

View File

@ -13,7 +13,7 @@
** is not included in the SQLite library. It is used for automated ** is not included in the SQLite library. It is used for automated
** testing of the SQLite library. ** 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 "sqliteInt.h"
#include "tcl.h" #include "tcl.h"
@ -132,36 +132,6 @@ static int makePointerStr(Tcl_Interp *interp, char *zPtr, void *p){
return TCL_OK; 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(). ** The callback routine for sqlite3_exec_printf().
*/ */
@ -781,47 +751,6 @@ static int sqlite_datatypes(
return TCL_OK; 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? ** Usage: sqlite3_step VM ?NVAR? ?VALUEVAR? ?COLNAMEVAR?
** **
@ -1330,6 +1259,7 @@ static int test_prepare(
const char *zTail = 0; const char *zTail = 0;
sqlite3_stmt *pStmt = 0; sqlite3_stmt *pStmt = 0;
char zBuf[50]; char zBuf[50];
int rc;
if( objc!=5 ){ if( objc!=5 ){
Tcl_AppendResult(interp, "wrong # args: should be \"", Tcl_AppendResult(interp, "wrong # args: should be \"",
@ -1340,19 +1270,24 @@ static int test_prepare(
zSql = Tcl_GetString(objv[2]); zSql = Tcl_GetString(objv[2]);
if( Tcl_GetIntFromObj(interp, objv[3], &bytes) ) return TCL_ERROR; if( Tcl_GetIntFromObj(interp, objv[3], &bytes) ) return TCL_ERROR;
if( SQLITE_OK!=sqlite3_prepare(db, zSql, bytes, &pStmt, &zTail) ){ rc = sqlite3_prepare(db, zSql, bytes, &pStmt, &zTail);
return TCL_ERROR;
}
if( zTail ){ if( zTail ){
if( bytes>=0 ){ if( bytes>=0 ){
bytes = bytes - (zTail-zSql); bytes = bytes - (zTail-zSql);
} }
Tcl_ObjSetVar2(interp, objv[4], 0, Tcl_NewStringObj(zTail, bytes), 0); 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( pStmt ){
if( makePointerStr(interp, zBuf, pStmt) ) return TCL_ERROR; if( makePointerStr(interp, zBuf, pStmt) ) return TCL_ERROR;
Tcl_AppendResult(interp, zBuf, 0); Tcl_AppendResult(interp, zBuf, 0);
}
return TCL_OK; return TCL_OK;
} }
@ -1400,13 +1335,70 @@ static int test_prepare16(
pTail = Tcl_NewByteArrayObj((u8 *)zTail, objlen); pTail = Tcl_NewByteArrayObj((u8 *)zTail, objlen);
Tcl_IncrRefCount(pTail); Tcl_IncrRefCount(pTail);
Tcl_ObjSetVar2(interp, objv[4], 0, pTail, 0); Tcl_ObjSetVar2(interp, objv[4], 0, pTail, 0);
// Tcl_DecrRefCount(pTail); Tcl_DecrRefCount(pTail);
if( pStmt ){
if( makePointerStr(interp, zBuf, pStmt) ) return TCL_ERROR; if( makePointerStr(interp, zBuf, pStmt) ) return TCL_ERROR;
}
Tcl_AppendResult(interp, zBuf, 0); Tcl_AppendResult(interp, zBuf, 0);
return TCL_OK; 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( 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 ** This is a collating function named "REVERSE" which sorts text
@ -1467,7 +1459,7 @@ int Sqlitetest1_Init(Tcl_Interp *interp){
{ "sqlite3_mprintf_double", (Tcl_CmdProc*)sqlite3_mprintf_double }, { "sqlite3_mprintf_double", (Tcl_CmdProc*)sqlite3_mprintf_double },
{ "sqlite3_mprintf_scaled", (Tcl_CmdProc*)sqlite3_mprintf_scaled }, { "sqlite3_mprintf_scaled", (Tcl_CmdProc*)sqlite3_mprintf_scaled },
{ "sqlite3_mprintf_z_test", (Tcl_CmdProc*)test_mprintf_z }, { "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_last_insert_rowid", (Tcl_CmdProc*)test_last_rowid },
{ "sqlite3_exec_printf", (Tcl_CmdProc*)test_exec_printf }, { "sqlite3_exec_printf", (Tcl_CmdProc*)test_exec_printf },
{ "sqlite3_get_table_printf", (Tcl_CmdProc*)test_get_table_printf }, { "sqlite3_get_table_printf", (Tcl_CmdProc*)test_get_table_printf },
@ -1481,7 +1473,6 @@ int Sqlitetest1_Init(Tcl_Interp *interp){
{ "sqlite_malloc_fail", (Tcl_CmdProc*)sqlite_malloc_fail }, { "sqlite_malloc_fail", (Tcl_CmdProc*)sqlite_malloc_fail },
{ "sqlite_malloc_stat", (Tcl_CmdProc*)sqlite_malloc_stat }, { "sqlite_malloc_stat", (Tcl_CmdProc*)sqlite_malloc_stat },
#endif #endif
{ "sqlite_compile", (Tcl_CmdProc*)test_compile },
{ "sqlite_step", (Tcl_CmdProc*)test_step }, { "sqlite_step", (Tcl_CmdProc*)test_step },
{ "sqlite_finalize", (Tcl_CmdProc*)test_finalize }, { "sqlite_finalize", (Tcl_CmdProc*)test_finalize },
{ "sqlite_bind", (Tcl_CmdProc*)test_bind }, { "sqlite_bind", (Tcl_CmdProc*)test_bind },
@ -1504,6 +1495,8 @@ int Sqlitetest1_Init(Tcl_Interp *interp){
{ "sqlite3_errmsg16", (Tcl_ObjCmdProc*)test_errmsg16 }, { "sqlite3_errmsg16", (Tcl_ObjCmdProc*)test_errmsg16 },
{ "sqlite3_prepare", (Tcl_ObjCmdProc*)test_prepare }, { "sqlite3_prepare", (Tcl_ObjCmdProc*)test_prepare },
{ "sqlite3_prepare16", (Tcl_ObjCmdProc*)test_prepare16 }, { "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 }, { "add_reverse_collating_func", (Tcl_ObjCmdProc*)reverse_collfunc },
}; };
int i; int i;

View File

@ -12,7 +12,7 @@
# focus of this script is testing the ATTACH and DETACH commands # focus of this script is testing the ATTACH and DETACH commands
# and related functionality. # 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 $
# #
@ -124,13 +124,13 @@ do_test attach2-2.12 {
do_test attach2-3.1 { do_test attach2-3.1 {
db close db close
set DB [sqlite db test.db] 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} if {$rc} {lappend rc $VM}
sqlite_finalize $VM sqlite_finalize $VM
set rc set rc
} {0} } {0}
do_test attach2-3.2 { 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} if {$rc} {lappend rc $VM}
sqlite_finalize $VM sqlite_finalize $VM
set rc set rc

View File

@ -11,7 +11,7 @@
# This file implements regression tests for SQLite library. The # This file implements regression tests for SQLite library. The
# focus of this script testing the sqlite_bind API. # 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] set testdir [file dirname $argv0]
@ -21,7 +21,7 @@ do_test bind-1.1 {
db close db close
set DB [sqlite db test.db] set DB [sqlite db test.db]
execsql {CREATE TABLE t1(a,b,c)} 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 set TAIL
} {} } {}
do_test bind-1.2 { do_test bind-1.2 {
@ -71,7 +71,7 @@ do_test bind-2.1 {
execsql { execsql {
DELETE FROM t1; 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 set TAIL
} {} } {}

View File

@ -11,7 +11,7 @@
# This file implements regression tests for SQLite library. The # This file implements regression tests for SQLite library. The
# focus of this script testing the callback-free C/C++ API. # 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] set testdir [file dirname $argv0]
@ -23,7 +23,7 @@ do_test capi2-1.1 {
db close db close
set DB [sqlite db test.db] set DB [sqlite db test.db]
execsql {CREATE TABLE t1(a,b,c)} 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 set TAIL
} {} } {}
do_test capi2-1.2 { do_test capi2-1.2 {
@ -61,7 +61,7 @@ do_test capi2-1.10 {
} {} } {}
# Check to make sure that the "tail" of a multi-statement SQL script # 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 { do_test capi2-2.1 {
set SQL { set SQL {
@ -69,7 +69,7 @@ do_test capi2-2.1 {
SELECT name, rowid FROM sqlite_temp_master; SELECT name, rowid FROM sqlite_temp_master;
-- A comment at the end -- A comment at the end
} }
set VM [sqlite_compile $DB $SQL SQL] set VM [sqlite3_prepare $DB $SQL -1 SQL]
set SQL set SQL
} { } {
SELECT name, rowid FROM sqlite_temp_master; SELECT name, rowid FROM sqlite_temp_master;
@ -87,7 +87,7 @@ do_test capi2-2.4 {
sqlite_finalize $VM sqlite_finalize $VM
} {} } {}
do_test capi2-2.5 { do_test capi2-2.5 {
set VM [sqlite_compile $DB $SQL SQL] set VM [sqlite3_prepare $DB $SQL -1 SQL]
set SQL set SQL
} { } {
-- A comment at the end -- A comment at the end
@ -100,7 +100,7 @@ do_test capi2-2.7 {
sqlite_finalize $VM sqlite_finalize $VM
} {} } {}
do_test capi2-2.8 { do_test capi2-2.8 {
set VM [sqlite_compile $DB $SQL SQL] set VM [sqlite3_prepare $DB $SQL -1 SQL]
list $SQL $VM list $SQL $VM
} {{} {}} } {{} {}}
@ -108,37 +108,37 @@ do_test capi2-2.8 {
# #
do_test capi2-3.1 { do_test capi2-3.1 {
set rc [catch { set rc [catch {
sqlite_compile $DB {select bogus from sqlite_master} TAIL sqlite3_prepare $DB {select bogus from sqlite_master} -1 TAIL
} msg] } msg]
lappend rc $msg $TAIL lappend rc $msg $TAIL
} {1 {(1) no such column: bogus} {}} } {1 {(1) no such column: bogus} {}}
do_test capi2-3.2 { do_test capi2-3.2 {
set rc [catch { set rc [catch {
sqlite_compile $DB {select bogus from } TAIL sqlite3_prepare $DB {select bogus from } -1 TAIL
} msg] } msg]
lappend rc $msg $TAIL lappend rc $msg $TAIL
} {1 {(1) near " ": syntax error} {}} } {1 {(1) near " ": syntax error} {}}
do_test capi2-3.3 { do_test capi2-3.3 {
set rc [catch { set rc [catch {
sqlite_compile $DB {;;;;select bogus from sqlite_master} TAIL sqlite3_prepare $DB {;;;;select bogus from sqlite_master} -1 TAIL
} msg] } msg]
lappend rc $msg $TAIL lappend rc $msg $TAIL
} {1 {(1) no such column: bogus} {}} } {1 {(1) no such column: bogus} {}}
do_test capi2-3.4 { do_test capi2-3.4 {
set rc [catch { 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] } msg]
lappend rc $msg $TAIL lappend rc $msg $TAIL
} {1 {(1) no such column: bogus} {x;}} } {1 {(1) no such column: bogus} {x;}}
do_test capi2-3.5 { do_test capi2-3.5 {
set rc [catch { 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] } msg]
lappend rc $msg $TAIL lappend rc $msg $TAIL
} {1 {(1) no such column: bogus} {;;x;}} } {1 {(1) no such column: bogus} {;;x;}}
do_test capi2-3.6 { do_test capi2-3.6 {
set rc [catch { set rc [catch {
sqlite_compile $DB {select 5/0} TAIL sqlite3_prepare $DB {select 5/0} -1 TAIL
} VM] } VM]
lappend rc $TAIL lappend rc $TAIL
} {0 {}} } {0 {}}
@ -153,7 +153,7 @@ do_test capi2-3.8 {
} {} } {}
do_test capi2-3.9 { do_test capi2-3.9 {
execsql {CREATE UNIQUE INDEX i1 ON t1(a)} 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 set TAIL
} {} } {}
do_test capi2-3.9b {db changes} {0} do_test capi2-3.9b {db changes} {0}
@ -172,7 +172,7 @@ do_test capi2-3.12 {
list [catch {sqlite_finalize $VM} msg] [set msg] list [catch {sqlite_finalize $VM} msg] [set msg]
} {1 {(21) library routine called out of sequence}} } {1 {(21) library routine called out of sequence}}
do_test capi2-3.13 { 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] list [sqlite_step $VM N VALUE COLNAME] [set N] [set VALUE] [set COLNAME]
} {SQLITE_ERROR 0 {} {}} } {SQLITE_ERROR 0 {} {}}
do_test capi2-3.13b {db changes} {0} do_test capi2-3.13b {db changes} {0}
@ -180,7 +180,7 @@ do_test capi2-3.14 {
list [catch {sqlite_finalize $VM} msg] [set msg] list [catch {sqlite_finalize $VM} msg] [set msg]
} {1 {(19) column a is not unique}} } {1 {(19) column a is not unique}}
do_test capi2-3.15 { 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 set TAIL
} {} } {}
do_test capi2-3.16 { do_test capi2-3.16 {
@ -190,7 +190,7 @@ do_test capi2-3.17 {
list [catch {sqlite_finalize $VM} msg] [set msg] list [catch {sqlite_finalize $VM} msg] [set msg]
} {0 {}} } {0 {}}
do_test capi2-3.18 { 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] list [sqlite_step $VM N VALUE COLNAME] [set N] [set VALUE] [set COLNAME]
} {SQLITE_ERROR 0 {} {}} } {SQLITE_ERROR 0 {} {}}
do_test capi2-3.19 { do_test capi2-3.19 {
@ -200,15 +200,15 @@ do_test capi2-3.19 {
# Two or more virtual machines exists at the same time. # Two or more virtual machines exists at the same time.
# #
do_test capi2-4.1 { 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 set TAIL
} {} } {}
do_test capi2-4.2 { 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 set TAIL
} {} } {}
do_test capi2-4.3 { 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 set TAIL
} {} } {}
do_test capi2-4.4 { do_test capi2-4.4 {
@ -242,9 +242,9 @@ do_test capi2-4.12 {
# Interleaved SELECTs # Interleaved SELECTs
# #
do_test capi2-5.1 { do_test capi2-5.1 {
set VM1 [sqlite_compile $DB {SELECT * FROM t2} TAIL] set VM1 [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL]
set VM2 [sqlite_compile $DB {SELECT * FROM t2} TAIL] set VM2 [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL]
set VM3 [sqlite_compile $DB {SELECT * FROM t2} TAIL] set VM3 [sqlite3_prepare $DB {SELECT * FROM t2} -1 TAIL]
list [sqlite_step $VM1 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME] list [sqlite_step $VM1 N VALUE COLNAME] [set N] [set VALUE] [set COLNAME]
} {SQLITE_ROW 2 {2 3} {a b {} {}}} } {SQLITE_ROW 2 {2 3} {a b {} {}}}
do_test capi2-5.2 { do_test capi2-5.2 {
@ -297,7 +297,7 @@ do_test capi2-6.1 {
INSERT INTO t3 SELECT x+8 FROM t3; INSERT INTO t3 SELECT x+8 FROM t3;
COMMIT; COMMIT;
} }
set VM1 [sqlite_compile $DB {SELECT * FROM t3} TAIL] set VM1 [sqlite3_prepare $DB {SELECT * FROM t3} -1 TAIL]
sqlite db2 test.db sqlite db2 test.db
execsql {BEGIN} db2 execsql {BEGIN} db2
} {} } {}
@ -457,15 +457,15 @@ do_test capi2-7.12 {
# Ticket #261 - make sure we can finalize before the end of a query. # Ticket #261 - make sure we can finalize before the end of a query.
# #
do_test capi2-8.1 { 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 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. # and all of the return pointers in sqlite_step can be null.
# #
do_test capi2-9.1 { 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_step $VM1
sqlite_finalize $VM1 sqlite_finalize $VM1
} {} } {}

View File

@ -11,7 +11,7 @@
# This file implements regression tests for SQLite library. The # This file implements regression tests for SQLite library. The
# focus of this script testing the callback-free C/C++ API. # 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] set testdir [file dirname $argv0]
@ -45,6 +45,8 @@ proc utf8 {str} {
# #
# capi3-1.*: Test sqlite3_prepare # capi3-1.*: Test sqlite3_prepare
# capi3-2.*: Test sqlite3_prepare16 # capi3-2.*: Test sqlite3_prepare16
# capi3-3.*: Test sqlite3_open
# capi3-4.*: Test sqlite3_open16
# #
db close db close
@ -105,6 +107,54 @@ do_test capi3-2.5 {
sqlite3_errmsg $DB sqlite3_errmsg $DB
} {no such column: namex} } {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 finish_test

View File

@ -11,7 +11,7 @@
# This file implements some common TCL routines used for regression # This file implements some common TCL routines used for regression
# testing the SQLite library # 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 # Make sure tclsqlite was compiled correctly. Abort now with an
# error message if not. # error message if not.
@ -198,7 +198,7 @@ proc stepsql {dbptr sql} {
set sql [string trim $sql] set sql [string trim $sql]
set r 0 set r 0
while {[string length $sql]>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] return [list 1 $vm]
} }
set sql [string trim $sqltail] set sql [string trim $sqltail]

View File

@ -11,7 +11,7 @@
# This file implements regression tests for SQLite library. The # This file implements regression tests for SQLite library. The
# focus of this file is testing the VACUUM statement. # 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] set testdir [file dirname $argv0]
source $testdir/tester.tcl source $testdir/tester.tcl
@ -130,12 +130,12 @@ do_test vacuum-3.1 {
} }
} {} } {}
# 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 { do_test vacuum-4.1 {
db close db close
set DB [sqlite db test.db] 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_step $VM N VALUES COLNAMES
} {SQLITE_DONE} } {SQLITE_DONE}
do_test vacuum-4.2 { do_test vacuum-4.2 {