Add new sqlite3_open() and sqlite3_open16() APIs. (CVS 1423)
FossilOrigin-Name: 307b55006c401f10ec5fa5b12cc7d5ba860f9a46
This commit is contained in:
parent
ffbc30884c
commit
4ad1713c5e
32
manifest
32
manifest
@ -1,5 +1,5 @@
|
||||
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
|
||||
@ -37,7 +37,7 @@ F src/func.c cfbb7096efb58e2857e3b312a8958a12774b625a
|
||||
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
|
||||
@ -49,11 +49,11 @@ F src/printf.c ef750e8e2398ca7e8b58be991075f08c6a7f0e53
|
||||
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
|
||||
@ -71,18 +71,18 @@ F src/vdbeaux.c 51f7d0cc6c515111b11576e2d82f4637156075cd
|
||||
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
|
||||
@ -137,7 +137,7 @@ F test/table.test 50e4534552d0385a0e59b3a6d7dde059ced02f83
|
||||
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
|
||||
@ -150,7 +150,7 @@ F test/types.test e1e0d71c8e65f8aa5d9a36751f4c8cbce6f01f7a
|
||||
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
|
||||
@ -195,7 +195,7 @@ F www/sqlite.tcl 3c83b08cf9f18aa2d69453ff441a36c40e431604
|
||||
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
|
||||
|
@ -1 +1 @@
|
||||
0736b7e8401f587f8b412602d029ef9bd69425f6
|
||||
307b55006c401f10ec5fa5b12cc7d5ba860f9a46
|
151
src/main.c
151
src/main.c
@ -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.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"
|
||||
@ -1055,14 +1055,51 @@ int sqlite3BtreeFactory(
|
||||
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 ){
|
||||
@ -1212,6 +1249,118 @@ int sqlite3_prepare16(
|
||||
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
|
||||
|
||||
|
@ -12,7 +12,7 @@
|
||||
** 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_
|
||||
@ -596,7 +596,7 @@ int sqlite3_set_authorizer(
|
||||
|
||||
/*
|
||||
** 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*);
|
||||
@ -727,11 +727,11 @@ int sqlite3_finalize(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
|
||||
** 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
|
||||
@ -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
|
||||
** 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 ******
|
||||
@ -868,33 +868,33 @@ typedef sqlite sqlite3;
|
||||
|
||||
/*
|
||||
** 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.
|
||||
*/
|
||||
@ -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
|
||||
** 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.
|
||||
**
|
||||
@ -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
|
||||
** 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.
|
||||
@ -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
|
||||
** 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.
|
||||
**
|
||||
@ -1025,6 +1025,27 @@ const char *sqlite3_errmsg(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(
|
||||
sqlite3 *db, /* Database handle */
|
||||
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 */
|
||||
);
|
||||
|
||||
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*);
|
||||
|
@ -11,7 +11,7 @@
|
||||
*************************************************************************
|
||||
** 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"
|
||||
@ -282,6 +282,7 @@ struct Db {
|
||||
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. */
|
||||
};
|
||||
|
||||
/*
|
||||
@ -315,6 +316,12 @@ struct Db {
|
||||
#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.
|
||||
|
167
src/test1.c
167
src/test1.c
@ -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.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"
|
||||
@ -132,36 +132,6 @@ static int makePointerStr(Tcl_Interp *interp, char *zPtr, void *p){
|
||||
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().
|
||||
*/
|
||||
@ -781,47 +751,6 @@ static int sqlite_datatypes(
|
||||
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?
|
||||
**
|
||||
@ -1330,6 +1259,7 @@ static int test_prepare(
|
||||
const char *zTail = 0;
|
||||
sqlite3_stmt *pStmt = 0;
|
||||
char zBuf[50];
|
||||
int rc;
|
||||
|
||||
if( objc!=5 ){
|
||||
Tcl_AppendResult(interp, "wrong # args: should be \"",
|
||||
@ -1340,19 +1270,24 @@ static int test_prepare(
|
||||
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;
|
||||
}
|
||||
|
||||
@ -1400,13 +1335,70 @@ static int test_prepare16(
|
||||
pTail = Tcl_NewByteArrayObj((u8 *)zTail, objlen);
|
||||
Tcl_IncrRefCount(pTail);
|
||||
Tcl_ObjSetVar2(interp, objv[4], 0, pTail, 0);
|
||||
// Tcl_DecrRefCount(pTail);
|
||||
Tcl_DecrRefCount(pTail);
|
||||
|
||||
if( makePointerStr(interp, zBuf, pStmt) ) return TCL_ERROR;
|
||||
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( 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
|
||||
@ -1467,7 +1459,7 @@ int Sqlitetest1_Init(Tcl_Interp *interp){
|
||||
{ "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 },
|
||||
@ -1481,12 +1473,11 @@ int Sqlitetest1_Init(Tcl_Interp *interp){
|
||||
{ "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;
|
||||
@ -1504,6 +1495,8 @@ int Sqlitetest1_Init(Tcl_Interp *interp){
|
||||
{ "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;
|
||||
|
@ -12,7 +12,7 @@
|
||||
# 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 $
|
||||
#
|
||||
|
||||
|
||||
@ -124,13 +124,13 @@ do_test attach2-2.12 {
|
||||
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
|
||||
|
@ -11,7 +11,7 @@
|
||||
# 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]
|
||||
@ -21,7 +21,7 @@ do_test bind-1.1 {
|
||||
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 {
|
||||
@ -71,7 +71,7 @@ do_test bind-2.1 {
|
||||
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
|
||||
} {}
|
||||
|
||||
|
@ -11,7 +11,7 @@
|
||||
# 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]
|
||||
@ -23,7 +23,7 @@ do_test capi2-1.1 {
|
||||
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 {
|
||||
@ -61,7 +61,7 @@ do_test capi2-1.10 {
|
||||
} {}
|
||||
|
||||
# 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 {
|
||||
@ -69,7 +69,7 @@ do_test capi2-2.1 {
|
||||
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;
|
||||
@ -87,7 +87,7 @@ do_test capi2-2.4 {
|
||||
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
|
||||
@ -100,7 +100,7 @@ do_test capi2-2.7 {
|
||||
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
|
||||
} {{} {}}
|
||||
|
||||
@ -108,37 +108,37 @@ do_test capi2-2.8 {
|
||||
#
|
||||
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 {}}
|
||||
@ -153,7 +153,7 @@ do_test capi2-3.8 {
|
||||
} {}
|
||||
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}
|
||||
@ -172,7 +172,7 @@ do_test capi2-3.12 {
|
||||
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}
|
||||
@ -180,7 +180,7 @@ do_test capi2-3.14 {
|
||||
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 {
|
||||
@ -190,7 +190,7 @@ do_test capi2-3.17 {
|
||||
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 {
|
||||
@ -200,15 +200,15 @@ 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 {
|
||||
@ -242,9 +242,9 @@ do_test capi2-4.12 {
|
||||
# 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 {
|
||||
@ -297,7 +297,7 @@ do_test capi2-6.1 {
|
||||
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
|
||||
} {}
|
||||
@ -457,15 +457,15 @@ do_test capi2-7.12 {
|
||||
# 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
|
||||
} {}
|
||||
|
@ -11,7 +11,7 @@
|
||||
# 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]
|
||||
@ -45,6 +45,8 @@ proc utf8 {str} {
|
||||
#
|
||||
# capi3-1.*: Test sqlite3_prepare
|
||||
# capi3-2.*: Test sqlite3_prepare16
|
||||
# capi3-3.*: Test sqlite3_open
|
||||
# capi3-4.*: Test sqlite3_open16
|
||||
#
|
||||
|
||||
db close
|
||||
@ -105,6 +107,54 @@ do_test capi3-2.5 {
|
||||
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
|
||||
|
||||
|
||||
|
@ -11,7 +11,7 @@
|
||||
# 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.
|
||||
@ -198,7 +198,7 @@ proc stepsql {dbptr sql} {
|
||||
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]
|
||||
|
@ -11,7 +11,7 @@
|
||||
# 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
|
||||
@ -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 {
|
||||
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 {
|
||||
|
Loading…
x
Reference in New Issue
Block a user