Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(62)

Side by Side Diff: third_party/sqlite/src/src/table.c

Issue 2751253002: [sql] Import SQLite 3.17.0. (Closed)
Patch Set: also clang on Linux i386 Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/sqlite/src/src/status.c ('k') | third_party/sqlite/src/src/tclsqlite.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 ** 2001 September 15 2 ** 2001 September 15
3 ** 3 **
4 ** The author disclaims copyright to this source code. In place of 4 ** The author disclaims copyright to this source code. In place of
5 ** a legal notice, here is a blessing: 5 ** a legal notice, here is a blessing:
6 ** 6 **
7 ** May you do good and not evil. 7 ** May you do good and not evil.
8 ** May you find forgiveness for yourself and forgive others. 8 ** May you find forgiveness for yourself and forgive others.
9 ** May you share freely, never taking more than you give. 9 ** May you share freely, never taking more than you give.
10 ** 10 **
11 ************************************************************************* 11 *************************************************************************
12 ** This file contains the sqlite3_get_table() and sqlite3_free_table() 12 ** This file contains the sqlite3_get_table() and sqlite3_free_table()
13 ** interface routines. These are just wrappers around the main 13 ** interface routines. These are just wrappers around the main
14 ** interface routine of sqlite3_exec(). 14 ** interface routine of sqlite3_exec().
15 ** 15 **
16 ** These routines are in a separate files so that they will not be linked 16 ** These routines are in a separate files so that they will not be linked
17 ** if they are not used. 17 ** if they are not used.
18 */ 18 */
19 #include "sqliteInt.h" 19 #include "sqliteInt.h"
20 #include <stdlib.h>
21 #include <string.h>
22 20
23 #ifndef SQLITE_OMIT_GET_TABLE 21 #ifndef SQLITE_OMIT_GET_TABLE
24 22
25 /* 23 /*
26 ** This structure is used to pass data from sqlite3_get_table() through 24 ** This structure is used to pass data from sqlite3_get_table() through
27 ** to the callback function is uses to build the result. 25 ** to the callback function is uses to build the result.
28 */ 26 */
29 typedef struct TabResult { 27 typedef struct TabResult {
30 char **azResult; /* Accumulated output */ 28 char **azResult; /* Accumulated output */
31 char *zErrMsg; /* Error message text, if an error occurs */ 29 char *zErrMsg; /* Error message text, if an error occurs */
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
94 if( z==0 ) goto malloc_failed; 92 if( z==0 ) goto malloc_failed;
95 memcpy(z, argv[i], n); 93 memcpy(z, argv[i], n);
96 } 94 }
97 p->azResult[p->nData++] = z; 95 p->azResult[p->nData++] = z;
98 } 96 }
99 p->nRow++; 97 p->nRow++;
100 } 98 }
101 return 0; 99 return 0;
102 100
103 malloc_failed: 101 malloc_failed:
104 p->rc = SQLITE_NOMEM; 102 p->rc = SQLITE_NOMEM_BKPT;
105 return 1; 103 return 1;
106 } 104 }
107 105
108 /* 106 /*
109 ** Query the database. But instead of invoking a callback for each row, 107 ** Query the database. But instead of invoking a callback for each row,
110 ** malloc() for space to hold the result and return the entire results 108 ** malloc() for space to hold the result and return the entire results
111 ** at the conclusion of the call. 109 ** at the conclusion of the call.
112 ** 110 **
113 ** The result that is written to ***pazResult is held in memory obtained 111 ** The result that is written to ***pazResult is held in memory obtained
114 ** from malloc(). But the caller cannot free this memory directly. 112 ** from malloc(). But the caller cannot free this memory directly.
(...skipping 20 matching lines...) Expand all
135 if( pzErrMsg ) *pzErrMsg = 0; 133 if( pzErrMsg ) *pzErrMsg = 0;
136 res.zErrMsg = 0; 134 res.zErrMsg = 0;
137 res.nRow = 0; 135 res.nRow = 0;
138 res.nColumn = 0; 136 res.nColumn = 0;
139 res.nData = 1; 137 res.nData = 1;
140 res.nAlloc = 20; 138 res.nAlloc = 20;
141 res.rc = SQLITE_OK; 139 res.rc = SQLITE_OK;
142 res.azResult = sqlite3_malloc64(sizeof(char*)*res.nAlloc ); 140 res.azResult = sqlite3_malloc64(sizeof(char*)*res.nAlloc );
143 if( res.azResult==0 ){ 141 if( res.azResult==0 ){
144 db->errCode = SQLITE_NOMEM; 142 db->errCode = SQLITE_NOMEM;
145 return SQLITE_NOMEM; 143 return SQLITE_NOMEM_BKPT;
146 } 144 }
147 res.azResult[0] = 0; 145 res.azResult[0] = 0;
148 rc = sqlite3_exec(db, zSql, sqlite3_get_table_cb, &res, pzErrMsg); 146 rc = sqlite3_exec(db, zSql, sqlite3_get_table_cb, &res, pzErrMsg);
149 assert( sizeof(res.azResult[0])>= sizeof(res.nData) ); 147 assert( sizeof(res.azResult[0])>= sizeof(res.nData) );
150 res.azResult[0] = SQLITE_INT_TO_PTR(res.nData); 148 res.azResult[0] = SQLITE_INT_TO_PTR(res.nData);
151 if( (rc&0xff)==SQLITE_ABORT ){ 149 if( (rc&0xff)==SQLITE_ABORT ){
152 sqlite3_free_table(&res.azResult[1]); 150 sqlite3_free_table(&res.azResult[1]);
153 if( res.zErrMsg ){ 151 if( res.zErrMsg ){
154 if( pzErrMsg ){ 152 if( pzErrMsg ){
155 sqlite3_free(*pzErrMsg); 153 sqlite3_free(*pzErrMsg);
156 *pzErrMsg = sqlite3_mprintf("%s",res.zErrMsg); 154 *pzErrMsg = sqlite3_mprintf("%s",res.zErrMsg);
157 } 155 }
158 sqlite3_free(res.zErrMsg); 156 sqlite3_free(res.zErrMsg);
159 } 157 }
160 db->errCode = res.rc; /* Assume 32-bit assignment is atomic */ 158 db->errCode = res.rc; /* Assume 32-bit assignment is atomic */
161 return res.rc; 159 return res.rc;
162 } 160 }
163 sqlite3_free(res.zErrMsg); 161 sqlite3_free(res.zErrMsg);
164 if( rc!=SQLITE_OK ){ 162 if( rc!=SQLITE_OK ){
165 sqlite3_free_table(&res.azResult[1]); 163 sqlite3_free_table(&res.azResult[1]);
166 return rc; 164 return rc;
167 } 165 }
168 if( res.nAlloc>res.nData ){ 166 if( res.nAlloc>res.nData ){
169 char **azNew; 167 char **azNew;
170 azNew = sqlite3_realloc64( res.azResult, sizeof(char*)*res.nData ); 168 azNew = sqlite3_realloc64( res.azResult, sizeof(char*)*res.nData );
171 if( azNew==0 ){ 169 if( azNew==0 ){
172 sqlite3_free_table(&res.azResult[1]); 170 sqlite3_free_table(&res.azResult[1]);
173 db->errCode = SQLITE_NOMEM; 171 db->errCode = SQLITE_NOMEM;
174 return SQLITE_NOMEM; 172 return SQLITE_NOMEM_BKPT;
175 } 173 }
176 res.azResult = azNew; 174 res.azResult = azNew;
177 } 175 }
178 *pazResult = &res.azResult[1]; 176 *pazResult = &res.azResult[1];
179 if( pnColumn ) *pnColumn = res.nColumn; 177 if( pnColumn ) *pnColumn = res.nColumn;
180 if( pnRow ) *pnRow = res.nRow; 178 if( pnRow ) *pnRow = res.nRow;
181 return rc; 179 return rc;
182 } 180 }
183 181
184 /* 182 /*
185 ** This routine frees the space the sqlite3_get_table() malloced. 183 ** This routine frees the space the sqlite3_get_table() malloced.
186 */ 184 */
187 void sqlite3_free_table( 185 void sqlite3_free_table(
188 char **azResult /* Result returned from sqlite3_get_table() */ 186 char **azResult /* Result returned from sqlite3_get_table() */
189 ){ 187 ){
190 if( azResult ){ 188 if( azResult ){
191 int i, n; 189 int i, n;
192 azResult--; 190 azResult--;
193 assert( azResult!=0 ); 191 assert( azResult!=0 );
194 n = SQLITE_PTR_TO_INT(azResult[0]); 192 n = SQLITE_PTR_TO_INT(azResult[0]);
195 for(i=1; i<n; i++){ if( azResult[i] ) sqlite3_free(azResult[i]); } 193 for(i=1; i<n; i++){ if( azResult[i] ) sqlite3_free(azResult[i]); }
196 sqlite3_free(azResult); 194 sqlite3_free(azResult);
197 } 195 }
198 } 196 }
199 197
200 #endif /* SQLITE_OMIT_GET_TABLE */ 198 #endif /* SQLITE_OMIT_GET_TABLE */
OLDNEW
« no previous file with comments | « third_party/sqlite/src/src/status.c ('k') | third_party/sqlite/src/src/tclsqlite.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698