4 ** The author disclaims copyright to this source code. In place of
5 ** a legal notice, here is a blessing:
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.
11 *************************************************************************
12 ** This file contains the sqlite3_get_table() and sqlite3_free_table()
13 ** interface routines. These are just wrappers around the main
14 ** interface routine of sqlite3_exec().
16 ** These routines are in a separate files so that they will not be linked
17 ** if they are not used.
19 #include "sqliteInt.h"
21 #ifndef SQLITE_OMIT_GET_TABLE
24 ** This structure is used to pass data from sqlite3_get_table() through
25 ** to the callback function is uses to build the result.
27 typedef struct TabResult
{
28 char **azResult
; /* Accumulated output */
29 char *zErrMsg
; /* Error message text, if an error occurs */
30 u32 nAlloc
; /* Slots allocated for azResult[] */
31 u32 nRow
; /* Number of rows in the result */
32 u32 nColumn
; /* Number of columns in the result */
33 u32 nData
; /* Slots used in azResult[]. (nRow+1)*nColumn */
34 int rc
; /* Return code from sqlite3_exec() */
38 ** This routine is called once for each row in the result table. Its job
39 ** is to fill in the TabResult structure appropriately, allocating new
40 ** memory as necessary.
42 static int sqlite3_get_table_cb(void *pArg
, int nCol
, char **argv
, char **colv
){
43 TabResult
*p
= (TabResult
*)pArg
; /* Result accumulator */
44 int need
; /* Slots needed in p->azResult[] */
45 int i
; /* Loop counter */
46 char *z
; /* A single column of result */
48 /* Make sure there is enough space in p->azResult to hold everything
49 ** we need to remember from this invocation of the callback.
51 if( p
->nRow
==0 && argv
!=0 ){
56 if( p
->nData
+ need
> p
->nAlloc
){
58 p
->nAlloc
= p
->nAlloc
*2 + need
;
59 azNew
= sqlite3_realloc64( p
->azResult
, sizeof(char*)*p
->nAlloc
);
60 if( azNew
==0 ) goto malloc_failed
;
64 /* If this is the first row, then generate an extra row containing
65 ** the names of all columns.
69 for(i
=0; i
<nCol
; i
++){
70 z
= sqlite3_mprintf("%s", colv
[i
]);
71 if( z
==0 ) goto malloc_failed
;
72 p
->azResult
[p
->nData
++] = z
;
74 }else if( (int)p
->nColumn
!=nCol
){
75 sqlite3_free(p
->zErrMsg
);
76 p
->zErrMsg
= sqlite3_mprintf(
77 "sqlite3_get_table() called with two or more incompatible queries"
83 /* Copy over the row data
86 for(i
=0; i
<nCol
; i
++){
90 int n
= sqlite3Strlen30(argv
[i
])+1;
91 z
= sqlite3_malloc64( n
);
92 if( z
==0 ) goto malloc_failed
;
93 memcpy(z
, argv
[i
], n
);
95 p
->azResult
[p
->nData
++] = z
;
102 p
->rc
= SQLITE_NOMEM_BKPT
;
107 ** Query the database. But instead of invoking a callback for each row,
108 ** malloc() for space to hold the result and return the entire results
109 ** at the conclusion of the call.
111 ** The result that is written to ***pazResult is held in memory obtained
112 ** from malloc(). But the caller cannot free this memory directly.
113 ** Instead, the entire table should be passed to sqlite3_free_table() when
114 ** the calling procedure is finished using it.
116 int sqlite3_get_table(
117 sqlite3
*db
, /* The database on which the SQL executes */
118 const char *zSql
, /* The SQL to be executed */
119 char ***pazResult
, /* Write the result table here */
120 int *pnRow
, /* Write the number of rows in the result here */
121 int *pnColumn
, /* Write the number of columns of result here */
122 char **pzErrMsg
/* Write error messages here */
127 #ifdef SQLITE_ENABLE_API_ARMOR
128 if( !sqlite3SafetyCheckOk(db
) || pazResult
==0 ) return SQLITE_MISUSE_BKPT
;
131 if( pnColumn
) *pnColumn
= 0;
132 if( pnRow
) *pnRow
= 0;
133 if( pzErrMsg
) *pzErrMsg
= 0;
140 res
.azResult
= sqlite3_malloc64(sizeof(char*)*res
.nAlloc
);
141 if( res
.azResult
==0 ){
142 db
->errCode
= SQLITE_NOMEM
;
143 return SQLITE_NOMEM_BKPT
;
146 rc
= sqlite3_exec(db
, zSql
, sqlite3_get_table_cb
, &res
, pzErrMsg
);
147 assert( sizeof(res
.azResult
[0])>= sizeof(res
.nData
) );
148 res
.azResult
[0] = SQLITE_INT_TO_PTR(res
.nData
);
149 if( (rc
&0xff)==SQLITE_ABORT
){
150 sqlite3_free_table(&res
.azResult
[1]);
153 sqlite3_free(*pzErrMsg
);
154 *pzErrMsg
= sqlite3_mprintf("%s",res
.zErrMsg
);
156 sqlite3_free(res
.zErrMsg
);
158 db
->errCode
= res
.rc
; /* Assume 32-bit assignment is atomic */
161 sqlite3_free(res
.zErrMsg
);
163 sqlite3_free_table(&res
.azResult
[1]);
166 if( res
.nAlloc
>res
.nData
){
168 azNew
= sqlite3_realloc64( res
.azResult
, sizeof(char*)*res
.nData
);
170 sqlite3_free_table(&res
.azResult
[1]);
171 db
->errCode
= SQLITE_NOMEM
;
172 return SQLITE_NOMEM_BKPT
;
174 res
.azResult
= azNew
;
176 *pazResult
= &res
.azResult
[1];
177 if( pnColumn
) *pnColumn
= res
.nColumn
;
178 if( pnRow
) *pnRow
= res
.nRow
;
183 ** This routine frees the space the sqlite3_get_table() malloced.
185 void sqlite3_free_table(
186 char **azResult
/* Result returned from sqlite3_get_table() */
191 assert( azResult
!=0 );
192 n
= SQLITE_PTR_TO_INT(azResult
[0]);
193 for(i
=1; i
<n
; i
++){ if( azResult
[i
] ) sqlite3_free(azResult
[i
]); }
194 sqlite3_free(azResult
);
198 #endif /* SQLITE_OMIT_GET_TABLE */