Index: third_party/sqlite/sqlite-src-3080704/src/test3.c |
diff --git a/third_party/sqlite/sqlite-src-3080704/src/test3.c b/third_party/sqlite/sqlite-src-3080704/src/test3.c |
deleted file mode 100644 |
index e3ed310c8104fe3621cebb0f51d10145018d4fac..0000000000000000000000000000000000000000 |
--- a/third_party/sqlite/sqlite-src-3080704/src/test3.c |
+++ /dev/null |
@@ -1,628 +0,0 @@ |
-/* |
-** 2001 September 15 |
-** |
-** The author disclaims copyright to this source code. In place of |
-** a legal notice, here is a blessing: |
-** |
-** May you do good and not evil. |
-** May you find forgiveness for yourself and forgive others. |
-** May you share freely, never taking more than you give. |
-** |
-************************************************************************* |
-** Code for testing the btree.c module in SQLite. This code |
-** is not included in the SQLite library. It is used for automated |
-** testing of the SQLite library. |
-*/ |
-#include "sqliteInt.h" |
-#include "btreeInt.h" |
-#include "tcl.h" |
-#include <stdlib.h> |
-#include <string.h> |
- |
-extern const char *sqlite3ErrName(int); |
- |
-/* |
-** A bogus sqlite3 connection structure for use in the btree |
-** tests. |
-*/ |
-static sqlite3 sDb; |
-static int nRefSqlite3 = 0; |
- |
-/* |
-** Usage: btree_open FILENAME NCACHE |
-** |
-** Open a new database |
-*/ |
-static int btree_open( |
- void *NotUsed, |
- Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
- int argc, /* Number of arguments */ |
- const char **argv /* Text of each argument */ |
-){ |
- Btree *pBt; |
- int rc, nCache; |
- char zBuf[100]; |
- int n; |
- char *zFilename; |
- if( argc!=3 ){ |
- Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], |
- " FILENAME NCACHE FLAGS\"", 0); |
- return TCL_ERROR; |
- } |
- if( Tcl_GetInt(interp, argv[2], &nCache) ) return TCL_ERROR; |
- nRefSqlite3++; |
- if( nRefSqlite3==1 ){ |
- sDb.pVfs = sqlite3_vfs_find(0); |
- sDb.mutex = sqlite3MutexAlloc(SQLITE_MUTEX_RECURSIVE); |
- sqlite3_mutex_enter(sDb.mutex); |
- } |
- n = (int)strlen(argv[1]); |
- zFilename = sqlite3_malloc( n+2 ); |
- if( zFilename==0 ) return TCL_ERROR; |
- memcpy(zFilename, argv[1], n+1); |
- zFilename[n+1] = 0; |
- rc = sqlite3BtreeOpen(sDb.pVfs, zFilename, &sDb, &pBt, 0, |
- SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_MAIN_DB); |
- sqlite3_free(zFilename); |
- if( rc!=SQLITE_OK ){ |
- Tcl_AppendResult(interp, sqlite3ErrName(rc), 0); |
- return TCL_ERROR; |
- } |
- sqlite3BtreeSetCacheSize(pBt, nCache); |
- sqlite3_snprintf(sizeof(zBuf), zBuf,"%p", pBt); |
- Tcl_AppendResult(interp, zBuf, 0); |
- return TCL_OK; |
-} |
- |
-/* |
-** Usage: btree_close ID |
-** |
-** Close the given database. |
-*/ |
-static int btree_close( |
- void *NotUsed, |
- Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
- int argc, /* Number of arguments */ |
- const char **argv /* Text of each argument */ |
-){ |
- Btree *pBt; |
- int rc; |
- if( argc!=2 ){ |
- Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], |
- " ID\"", 0); |
- return TCL_ERROR; |
- } |
- pBt = sqlite3TestTextToPtr(argv[1]); |
- rc = sqlite3BtreeClose(pBt); |
- if( rc!=SQLITE_OK ){ |
- Tcl_AppendResult(interp, sqlite3ErrName(rc), 0); |
- return TCL_ERROR; |
- } |
- nRefSqlite3--; |
- if( nRefSqlite3==0 ){ |
- sqlite3_mutex_leave(sDb.mutex); |
- sqlite3_mutex_free(sDb.mutex); |
- sDb.mutex = 0; |
- sDb.pVfs = 0; |
- } |
- return TCL_OK; |
-} |
- |
- |
-/* |
-** Usage: btree_begin_transaction ID |
-** |
-** Start a new transaction |
-*/ |
-static int btree_begin_transaction( |
- void *NotUsed, |
- Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
- int argc, /* Number of arguments */ |
- const char **argv /* Text of each argument */ |
-){ |
- Btree *pBt; |
- int rc; |
- if( argc!=2 ){ |
- Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], |
- " ID\"", 0); |
- return TCL_ERROR; |
- } |
- pBt = sqlite3TestTextToPtr(argv[1]); |
- sqlite3BtreeEnter(pBt); |
- rc = sqlite3BtreeBeginTrans(pBt, 1); |
- sqlite3BtreeLeave(pBt); |
- if( rc!=SQLITE_OK ){ |
- Tcl_AppendResult(interp, sqlite3ErrName(rc), 0); |
- return TCL_ERROR; |
- } |
- return TCL_OK; |
-} |
- |
-/* |
-** Usage: btree_pager_stats ID |
-** |
-** Returns pager statistics |
-*/ |
-static int btree_pager_stats( |
- void *NotUsed, |
- Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
- int argc, /* Number of arguments */ |
- const char **argv /* Text of each argument */ |
-){ |
- Btree *pBt; |
- int i; |
- int *a; |
- |
- if( argc!=2 ){ |
- Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], |
- " ID\"", 0); |
- return TCL_ERROR; |
- } |
- pBt = sqlite3TestTextToPtr(argv[1]); |
- |
- /* Normally in this file, with a b-tree handle opened using the |
- ** [btree_open] command it is safe to call sqlite3BtreeEnter() directly. |
- ** But this function is sometimes called with a btree handle obtained |
- ** from an open SQLite connection (using [btree_from_db]). In this case |
- ** we need to obtain the mutex for the controlling SQLite handle before |
- ** it is safe to call sqlite3BtreeEnter(). |
- */ |
- sqlite3_mutex_enter(pBt->db->mutex); |
- |
- sqlite3BtreeEnter(pBt); |
- a = sqlite3PagerStats(sqlite3BtreePager(pBt)); |
- for(i=0; i<11; i++){ |
- static char *zName[] = { |
- "ref", "page", "max", "size", "state", "err", |
- "hit", "miss", "ovfl", "read", "write" |
- }; |
- char zBuf[100]; |
- Tcl_AppendElement(interp, zName[i]); |
- sqlite3_snprintf(sizeof(zBuf), zBuf,"%d",a[i]); |
- Tcl_AppendElement(interp, zBuf); |
- } |
- sqlite3BtreeLeave(pBt); |
- |
- /* Release the mutex on the SQLite handle that controls this b-tree */ |
- sqlite3_mutex_leave(pBt->db->mutex); |
- return TCL_OK; |
-} |
- |
-/* |
-** Usage: btree_cursor ID TABLENUM WRITEABLE |
-** |
-** Create a new cursor. Return the ID for the cursor. |
-*/ |
-static int btree_cursor( |
- void *NotUsed, |
- Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
- int argc, /* Number of arguments */ |
- const char **argv /* Text of each argument */ |
-){ |
- Btree *pBt; |
- int iTable; |
- BtCursor *pCur; |
- int rc = SQLITE_OK; |
- int wrFlag; |
- char zBuf[30]; |
- |
- if( argc!=4 ){ |
- Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], |
- " ID TABLENUM WRITEABLE\"", 0); |
- return TCL_ERROR; |
- } |
- pBt = sqlite3TestTextToPtr(argv[1]); |
- if( Tcl_GetInt(interp, argv[2], &iTable) ) return TCL_ERROR; |
- if( Tcl_GetBoolean(interp, argv[3], &wrFlag) ) return TCL_ERROR; |
- pCur = (BtCursor *)ckalloc(sqlite3BtreeCursorSize()); |
- memset(pCur, 0, sqlite3BtreeCursorSize()); |
- sqlite3BtreeEnter(pBt); |
-#ifndef SQLITE_OMIT_SHARED_CACHE |
- rc = sqlite3BtreeLockTable(pBt, iTable, wrFlag); |
-#endif |
- if( rc==SQLITE_OK ){ |
- rc = sqlite3BtreeCursor(pBt, iTable, wrFlag, 0, pCur); |
- } |
- sqlite3BtreeLeave(pBt); |
- if( rc ){ |
- ckfree((char *)pCur); |
- Tcl_AppendResult(interp, sqlite3ErrName(rc), 0); |
- return TCL_ERROR; |
- } |
- sqlite3_snprintf(sizeof(zBuf), zBuf,"%p", pCur); |
- Tcl_AppendResult(interp, zBuf, 0); |
- return SQLITE_OK; |
-} |
- |
-/* |
-** Usage: btree_close_cursor ID |
-** |
-** Close a cursor opened using btree_cursor. |
-*/ |
-static int btree_close_cursor( |
- void *NotUsed, |
- Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
- int argc, /* Number of arguments */ |
- const char **argv /* Text of each argument */ |
-){ |
- BtCursor *pCur; |
- Btree *pBt; |
- int rc; |
- |
- if( argc!=2 ){ |
- Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], |
- " ID\"", 0); |
- return TCL_ERROR; |
- } |
- pCur = sqlite3TestTextToPtr(argv[1]); |
- pBt = pCur->pBtree; |
- sqlite3BtreeEnter(pBt); |
- rc = sqlite3BtreeCloseCursor(pCur); |
- sqlite3BtreeLeave(pBt); |
- ckfree((char *)pCur); |
- if( rc ){ |
- Tcl_AppendResult(interp, sqlite3ErrName(rc), 0); |
- return TCL_ERROR; |
- } |
- return SQLITE_OK; |
-} |
- |
-/* |
-** Usage: btree_next ID |
-** |
-** Move the cursor to the next entry in the table. Return 0 on success |
-** or 1 if the cursor was already on the last entry in the table or if |
-** the table is empty. |
-*/ |
-static int btree_next( |
- void *NotUsed, |
- Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
- int argc, /* Number of arguments */ |
- const char **argv /* Text of each argument */ |
-){ |
- BtCursor *pCur; |
- int rc; |
- int res = 0; |
- char zBuf[100]; |
- |
- if( argc!=2 ){ |
- Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], |
- " ID\"", 0); |
- return TCL_ERROR; |
- } |
- pCur = sqlite3TestTextToPtr(argv[1]); |
- sqlite3BtreeEnter(pCur->pBtree); |
- rc = sqlite3BtreeNext(pCur, &res); |
- sqlite3BtreeLeave(pCur->pBtree); |
- if( rc ){ |
- Tcl_AppendResult(interp, sqlite3ErrName(rc), 0); |
- return TCL_ERROR; |
- } |
- sqlite3_snprintf(sizeof(zBuf),zBuf,"%d",res); |
- Tcl_AppendResult(interp, zBuf, 0); |
- return SQLITE_OK; |
-} |
- |
-/* |
-** Usage: btree_first ID |
-** |
-** Move the cursor to the first entry in the table. Return 0 if the |
-** cursor was left point to something and 1 if the table is empty. |
-*/ |
-static int btree_first( |
- void *NotUsed, |
- Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
- int argc, /* Number of arguments */ |
- const char **argv /* Text of each argument */ |
-){ |
- BtCursor *pCur; |
- int rc; |
- int res = 0; |
- char zBuf[100]; |
- |
- if( argc!=2 ){ |
- Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], |
- " ID\"", 0); |
- return TCL_ERROR; |
- } |
- pCur = sqlite3TestTextToPtr(argv[1]); |
- sqlite3BtreeEnter(pCur->pBtree); |
- rc = sqlite3BtreeFirst(pCur, &res); |
- sqlite3BtreeLeave(pCur->pBtree); |
- if( rc ){ |
- Tcl_AppendResult(interp, sqlite3ErrName(rc), 0); |
- return TCL_ERROR; |
- } |
- sqlite3_snprintf(sizeof(zBuf),zBuf,"%d",res); |
- Tcl_AppendResult(interp, zBuf, 0); |
- return SQLITE_OK; |
-} |
- |
-/* |
-** Usage: btree_eof ID |
-** |
-** Return TRUE if the given cursor is not pointing at a valid entry. |
-** Return FALSE if the cursor does point to a valid entry. |
-*/ |
-static int btree_eof( |
- void *NotUsed, |
- Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
- int argc, /* Number of arguments */ |
- const char **argv /* Text of each argument */ |
-){ |
- BtCursor *pCur; |
- int rc; |
- char zBuf[50]; |
- |
- if( argc!=2 ){ |
- Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], |
- " ID\"", 0); |
- return TCL_ERROR; |
- } |
- pCur = sqlite3TestTextToPtr(argv[1]); |
- sqlite3BtreeEnter(pCur->pBtree); |
- rc = sqlite3BtreeEof(pCur); |
- sqlite3BtreeLeave(pCur->pBtree); |
- sqlite3_snprintf(sizeof(zBuf),zBuf, "%d", rc); |
- Tcl_AppendResult(interp, zBuf, 0); |
- return SQLITE_OK; |
-} |
- |
-/* |
-** Usage: btree_payload_size ID |
-** |
-** Return the number of bytes of payload |
-*/ |
-static int btree_payload_size( |
- void *NotUsed, |
- Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
- int argc, /* Number of arguments */ |
- const char **argv /* Text of each argument */ |
-){ |
- BtCursor *pCur; |
- int n2; |
- u64 n1; |
- char zBuf[50]; |
- |
- if( argc!=2 ){ |
- Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], |
- " ID\"", 0); |
- return TCL_ERROR; |
- } |
- pCur = sqlite3TestTextToPtr(argv[1]); |
- sqlite3BtreeEnter(pCur->pBtree); |
- |
- /* The cursor may be in "require-seek" state. If this is the case, the |
- ** call to BtreeDataSize() will fix it. */ |
- sqlite3BtreeDataSize(pCur, (u32*)&n2); |
- if( pCur->apPage[pCur->iPage]->intKey ){ |
- n1 = 0; |
- }else{ |
- sqlite3BtreeKeySize(pCur, (i64*)&n1); |
- } |
- sqlite3BtreeLeave(pCur->pBtree); |
- sqlite3_snprintf(sizeof(zBuf),zBuf, "%d", (int)(n1+n2)); |
- Tcl_AppendResult(interp, zBuf, 0); |
- return SQLITE_OK; |
-} |
- |
-/* |
-** usage: varint_test START MULTIPLIER COUNT INCREMENT |
-** |
-** This command tests the putVarint() and getVarint() |
-** routines, both for accuracy and for speed. |
-** |
-** An integer is written using putVarint() and read back with |
-** getVarint() and varified to be unchanged. This repeats COUNT |
-** times. The first integer is START*MULTIPLIER. Each iteration |
-** increases the integer by INCREMENT. |
-** |
-** This command returns nothing if it works. It returns an error message |
-** if something goes wrong. |
-*/ |
-static int btree_varint_test( |
- void *NotUsed, |
- Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
- int argc, /* Number of arguments */ |
- const char **argv /* Text of each argument */ |
-){ |
- u32 start, mult, count, incr; |
- u64 in, out; |
- int n1, n2, i, j; |
- unsigned char zBuf[100]; |
- if( argc!=5 ){ |
- Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], |
- " START MULTIPLIER COUNT INCREMENT\"", 0); |
- return TCL_ERROR; |
- } |
- if( Tcl_GetInt(interp, argv[1], (int*)&start) ) return TCL_ERROR; |
- if( Tcl_GetInt(interp, argv[2], (int*)&mult) ) return TCL_ERROR; |
- if( Tcl_GetInt(interp, argv[3], (int*)&count) ) return TCL_ERROR; |
- if( Tcl_GetInt(interp, argv[4], (int*)&incr) ) return TCL_ERROR; |
- in = start; |
- in *= mult; |
- for(i=0; i<(int)count; i++){ |
- char zErr[200]; |
- n1 = putVarint(zBuf, in); |
- if( n1>9 || n1<1 ){ |
- sprintf(zErr, "putVarint returned %d - should be between 1 and 9", n1); |
- Tcl_AppendResult(interp, zErr, 0); |
- return TCL_ERROR; |
- } |
- n2 = getVarint(zBuf, &out); |
- if( n1!=n2 ){ |
- sprintf(zErr, "putVarint returned %d and getVarint returned %d", n1, n2); |
- Tcl_AppendResult(interp, zErr, 0); |
- return TCL_ERROR; |
- } |
- if( in!=out ){ |
- sprintf(zErr, "Wrote 0x%016llx and got back 0x%016llx", in, out); |
- Tcl_AppendResult(interp, zErr, 0); |
- return TCL_ERROR; |
- } |
- if( (in & 0xffffffff)==in ){ |
- u32 out32; |
- n2 = getVarint32(zBuf, out32); |
- out = out32; |
- if( n1!=n2 ){ |
- sprintf(zErr, "putVarint returned %d and GetVarint32 returned %d", |
- n1, n2); |
- Tcl_AppendResult(interp, zErr, 0); |
- return TCL_ERROR; |
- } |
- if( in!=out ){ |
- sprintf(zErr, "Wrote 0x%016llx and got back 0x%016llx from GetVarint32", |
- in, out); |
- Tcl_AppendResult(interp, zErr, 0); |
- return TCL_ERROR; |
- } |
- } |
- |
- /* In order to get realistic timings, run getVarint 19 more times. |
- ** This is because getVarint is called about 20 times more often |
- ** than putVarint. |
- */ |
- for(j=0; j<19; j++){ |
- getVarint(zBuf, &out); |
- } |
- in += incr; |
- } |
- return TCL_OK; |
-} |
- |
-/* |
-** usage: btree_from_db DB-HANDLE |
-** |
-** This command returns the btree handle for the main database associated |
-** with the database-handle passed as the argument. Example usage: |
-** |
-** sqlite3 db test.db |
-** set bt [btree_from_db db] |
-*/ |
-static int btree_from_db( |
- void *NotUsed, |
- Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
- int argc, /* Number of arguments */ |
- const char **argv /* Text of each argument */ |
-){ |
- char zBuf[100]; |
- Tcl_CmdInfo info; |
- sqlite3 *db; |
- Btree *pBt; |
- int iDb = 0; |
- |
- if( argc!=2 && argc!=3 ){ |
- Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], |
- " DB-HANDLE ?N?\"", 0); |
- return TCL_ERROR; |
- } |
- |
- if( 1!=Tcl_GetCommandInfo(interp, argv[1], &info) ){ |
- Tcl_AppendResult(interp, "No such db-handle: \"", argv[1], "\"", 0); |
- return TCL_ERROR; |
- } |
- if( argc==3 ){ |
- iDb = atoi(argv[2]); |
- } |
- |
- db = *((sqlite3 **)info.objClientData); |
- assert( db ); |
- |
- pBt = db->aDb[iDb].pBt; |
- sqlite3_snprintf(sizeof(zBuf), zBuf, "%p", pBt); |
- Tcl_SetResult(interp, zBuf, TCL_VOLATILE); |
- return TCL_OK; |
-} |
- |
-/* |
-** Usage: btree_ismemdb ID |
-** |
-** Return true if the B-Tree is in-memory. |
-*/ |
-static int btree_ismemdb( |
- void *NotUsed, |
- Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
- int argc, /* Number of arguments */ |
- const char **argv /* Text of each argument */ |
-){ |
- Btree *pBt; |
- int res; |
- |
- if( argc!=2 ){ |
- Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], |
- " ID\"", 0); |
- return TCL_ERROR; |
- } |
- pBt = sqlite3TestTextToPtr(argv[1]); |
- sqlite3_mutex_enter(pBt->db->mutex); |
- sqlite3BtreeEnter(pBt); |
- res = sqlite3PagerIsMemdb(sqlite3BtreePager(pBt)); |
- sqlite3BtreeLeave(pBt); |
- sqlite3_mutex_leave(pBt->db->mutex); |
- Tcl_SetObjResult(interp, Tcl_NewBooleanObj(res)); |
- return SQLITE_OK; |
-} |
- |
-/* |
-** usage: btree_set_cache_size ID NCACHE |
-** |
-** Set the size of the cache used by btree $ID. |
-*/ |
-static int btree_set_cache_size( |
- void *NotUsed, |
- Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
- int argc, /* Number of arguments */ |
- const char **argv /* Text of each argument */ |
-){ |
- int nCache; |
- Btree *pBt; |
- |
- if( argc!=3 ){ |
- Tcl_AppendResult( |
- interp, "wrong # args: should be \"", argv[0], " BT NCACHE\"", 0); |
- return TCL_ERROR; |
- } |
- pBt = sqlite3TestTextToPtr(argv[1]); |
- if( Tcl_GetInt(interp, argv[2], &nCache) ) return TCL_ERROR; |
- |
- sqlite3_mutex_enter(pBt->db->mutex); |
- sqlite3BtreeEnter(pBt); |
- sqlite3BtreeSetCacheSize(pBt, nCache); |
- sqlite3BtreeLeave(pBt); |
- sqlite3_mutex_leave(pBt->db->mutex); |
- return TCL_OK; |
-} |
- |
- |
- |
-/* |
-** Register commands with the TCL interpreter. |
-*/ |
-int Sqlitetest3_Init(Tcl_Interp *interp){ |
- static struct { |
- char *zName; |
- Tcl_CmdProc *xProc; |
- } aCmd[] = { |
- { "btree_open", (Tcl_CmdProc*)btree_open }, |
- { "btree_close", (Tcl_CmdProc*)btree_close }, |
- { "btree_begin_transaction", (Tcl_CmdProc*)btree_begin_transaction }, |
- { "btree_pager_stats", (Tcl_CmdProc*)btree_pager_stats }, |
- { "btree_cursor", (Tcl_CmdProc*)btree_cursor }, |
- { "btree_close_cursor", (Tcl_CmdProc*)btree_close_cursor }, |
- { "btree_next", (Tcl_CmdProc*)btree_next }, |
- { "btree_eof", (Tcl_CmdProc*)btree_eof }, |
- { "btree_payload_size", (Tcl_CmdProc*)btree_payload_size }, |
- { "btree_first", (Tcl_CmdProc*)btree_first }, |
- { "btree_varint_test", (Tcl_CmdProc*)btree_varint_test }, |
- { "btree_from_db", (Tcl_CmdProc*)btree_from_db }, |
- { "btree_ismemdb", (Tcl_CmdProc*)btree_ismemdb }, |
- { "btree_set_cache_size", (Tcl_CmdProc*)btree_set_cache_size } |
- }; |
- int i; |
- |
- for(i=0; i<sizeof(aCmd)/sizeof(aCmd[0]); i++){ |
- Tcl_CreateCommand(interp, aCmd[i].zName, aCmd[i].xProc, 0, 0); |
- } |
- |
- return TCL_OK; |
-} |