• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 ** 2007 March 29
3 **
4 ** The author disclaims copyright to this source code.  In place of
5 ** a legal notice, here is a blessing:
6 **
7 **    May you do good and not evil.
8 **    May you find forgiveness for yourself and forgive others.
9 **    May you share freely, never taking more than you give.
10 **
11 *************************************************************************
12 **
13 ** This file contains obscure tests of the C-interface required
14 ** for completeness. Test code is written in C for these cases
15 ** as there is not much point in binding to Tcl.
16 */
17 #include "sqliteInt.h"
18 #include "tcl.h"
19 #include <stdlib.h>
20 #include <string.h>
21 
22 /*
23 ** c_collation_test
24 */
c_collation_test(ClientData clientData,Tcl_Interp * interp,int objc,Tcl_Obj * CONST objv[])25 static int c_collation_test(
26   ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
27   Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
28   int objc,              /* Number of arguments */
29   Tcl_Obj *CONST objv[]  /* Command arguments */
30 ){
31   const char *zErrFunction = "N/A";
32   sqlite3 *db;
33 
34   int rc;
35   if( objc!=1 ){
36     Tcl_WrongNumArgs(interp, 1, objv, "");
37     return TCL_ERROR;
38   }
39 
40   /* Open a database. */
41   rc = sqlite3_open(":memory:", &db);
42   if( rc!=SQLITE_OK ){
43     zErrFunction = "sqlite3_open";
44     goto error_out;
45   }
46 
47   rc = sqlite3_create_collation(db, "collate", 456, 0, 0);
48   if( rc!=SQLITE_MISUSE ){
49     sqlite3_close(db);
50     zErrFunction = "sqlite3_create_collation";
51     goto error_out;
52   }
53 
54   sqlite3_close(db);
55   return TCL_OK;
56 
57 error_out:
58   Tcl_ResetResult(interp);
59   Tcl_AppendResult(interp, "Error testing function: ", zErrFunction, 0);
60   return TCL_ERROR;
61 }
62 
63 /*
64 ** c_realloc_test
65 */
c_realloc_test(ClientData clientData,Tcl_Interp * interp,int objc,Tcl_Obj * CONST objv[])66 static int c_realloc_test(
67   ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
68   Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
69   int objc,              /* Number of arguments */
70   Tcl_Obj *CONST objv[]  /* Command arguments */
71 ){
72   void *p;
73   const char *zErrFunction = "N/A";
74 
75   if( objc!=1 ){
76     Tcl_WrongNumArgs(interp, 1, objv, "");
77     return TCL_ERROR;
78   }
79 
80   p = sqlite3_malloc(5);
81   if( !p ){
82     zErrFunction = "sqlite3_malloc";
83     goto error_out;
84   }
85 
86   /* Test that realloc()ing a block of memory to a negative size is
87   ** the same as free()ing that memory.
88   */
89   p = sqlite3_realloc(p, -1);
90   if( p ){
91     zErrFunction = "sqlite3_realloc";
92     goto error_out;
93   }
94 
95   return TCL_OK;
96 
97 error_out:
98   Tcl_ResetResult(interp);
99   Tcl_AppendResult(interp, "Error testing function: ", zErrFunction, 0);
100   return TCL_ERROR;
101 }
102 
103 
104 /*
105 ** c_misuse_test
106 */
c_misuse_test(ClientData clientData,Tcl_Interp * interp,int objc,Tcl_Obj * CONST objv[])107 static int c_misuse_test(
108   ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
109   Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
110   int objc,              /* Number of arguments */
111   Tcl_Obj *CONST objv[]  /* Command arguments */
112 ){
113   const char *zErrFunction = "N/A";
114   sqlite3 *db = 0;
115   sqlite3_stmt *pStmt;
116   int rc;
117 
118   if( objc!=1 ){
119     Tcl_WrongNumArgs(interp, 1, objv, "");
120     return TCL_ERROR;
121   }
122 
123   /* Open a database. Then close it again. We need to do this so that
124   ** we have a "closed database handle" to pass to various API functions.
125   */
126   rc = sqlite3_open(":memory:", &db);
127   if( rc!=SQLITE_OK ){
128     zErrFunction = "sqlite3_open";
129     goto error_out;
130   }
131   sqlite3_close(db);
132 
133 
134   rc = sqlite3_errcode(db);
135   if( rc!=SQLITE_MISUSE ){
136     zErrFunction = "sqlite3_errcode";
137     goto error_out;
138   }
139 
140   pStmt = (sqlite3_stmt*)1234;
141   rc = sqlite3_prepare(db, 0, 0, &pStmt, 0);
142   if( rc!=SQLITE_MISUSE ){
143     zErrFunction = "sqlite3_prepare";
144     goto error_out;
145   }
146   assert( pStmt==0 ); /* Verify that pStmt is zeroed even on a MISUSE error */
147 
148   pStmt = (sqlite3_stmt*)1234;
149   rc = sqlite3_prepare_v2(db, 0, 0, &pStmt, 0);
150   if( rc!=SQLITE_MISUSE ){
151     zErrFunction = "sqlite3_prepare_v2";
152     goto error_out;
153   }
154   assert( pStmt==0 );
155 
156 #ifndef SQLITE_OMIT_UTF16
157   pStmt = (sqlite3_stmt*)1234;
158   rc = sqlite3_prepare16(db, 0, 0, &pStmt, 0);
159   if( rc!=SQLITE_MISUSE ){
160     zErrFunction = "sqlite3_prepare16";
161     goto error_out;
162   }
163   assert( pStmt==0 );
164   pStmt = (sqlite3_stmt*)1234;
165   rc = sqlite3_prepare16_v2(db, 0, 0, &pStmt, 0);
166   if( rc!=SQLITE_MISUSE ){
167     zErrFunction = "sqlite3_prepare16_v2";
168     goto error_out;
169   }
170   assert( pStmt==0 );
171 #endif
172 
173   return TCL_OK;
174 
175 error_out:
176   Tcl_ResetResult(interp);
177   Tcl_AppendResult(interp, "Error testing function: ", zErrFunction, 0);
178   return TCL_ERROR;
179 }
180 
181 /*
182 ** Register commands with the TCL interpreter.
183 */
Sqlitetest9_Init(Tcl_Interp * interp)184 int Sqlitetest9_Init(Tcl_Interp *interp){
185   static struct {
186      char *zName;
187      Tcl_ObjCmdProc *xProc;
188      void *clientData;
189   } aObjCmd[] = {
190      { "c_misuse_test",    c_misuse_test, 0 },
191      { "c_realloc_test",   c_realloc_test, 0 },
192      { "c_collation_test", c_collation_test, 0 },
193   };
194   int i;
195   for(i=0; i<sizeof(aObjCmd)/sizeof(aObjCmd[0]); i++){
196     Tcl_CreateObjCommand(interp, aObjCmd[i].zName,
197         aObjCmd[i].xProc, aObjCmd[i].clientData, 0);
198   }
199   return TCL_OK;
200 }
201