xref: /sqlite-3.40.0/src/malloc.c (revision fec00eab)
1a3152895Sdrh /*
2a3152895Sdrh ** 2001 September 15
3a3152895Sdrh **
4a3152895Sdrh ** The author disclaims copyright to this source code.  In place of
5a3152895Sdrh ** a legal notice, here is a blessing:
6a3152895Sdrh **
7a3152895Sdrh **    May you do good and not evil.
8a3152895Sdrh **    May you find forgiveness for yourself and forgive others.
9a3152895Sdrh **    May you share freely, never taking more than you give.
10a3152895Sdrh **
11a3152895Sdrh *************************************************************************
12*fec00eabSdrh **
13a3152895Sdrh ** Memory allocation functions used throughout sqlite.
14a3152895Sdrh **
15*fec00eabSdrh ** $Id: malloc.c,v 1.16 2008/06/14 16:56:22 drh Exp $
16a3152895Sdrh */
17a3152895Sdrh #include "sqliteInt.h"
18a3152895Sdrh #include <stdarg.h>
19a3152895Sdrh #include <ctype.h>
20a3152895Sdrh 
21a3152895Sdrh /*
22b21c8cd4Sdrh ** This routine runs when the memory allocator sees that the
23b21c8cd4Sdrh ** total memory allocation is about to exceed the soft heap
24b21c8cd4Sdrh ** limit.
25b21c8cd4Sdrh */
26b21c8cd4Sdrh static void softHeapLimitEnforcer(
27b21c8cd4Sdrh   void *NotUsed,
28153c62c4Sdrh   sqlite3_int64 inUse,
29153c62c4Sdrh   int allocSize
30b21c8cd4Sdrh ){
31b21c8cd4Sdrh   sqlite3_release_memory(allocSize);
32b21c8cd4Sdrh }
33b21c8cd4Sdrh 
34b21c8cd4Sdrh /*
35b21c8cd4Sdrh ** Set the soft heap-size limit for the current thread. Passing a
36b21c8cd4Sdrh ** zero or negative value indicates no limit.
37a3152895Sdrh */
38a3152895Sdrh void sqlite3_soft_heap_limit(int n){
39b21c8cd4Sdrh   sqlite3_uint64 iLimit;
40b21c8cd4Sdrh   int overage;
41b21c8cd4Sdrh   if( n<0 ){
42b21c8cd4Sdrh     iLimit = 0;
43b21c8cd4Sdrh   }else{
44b21c8cd4Sdrh     iLimit = n;
45a3152895Sdrh   }
46b21c8cd4Sdrh   if( iLimit>0 ){
47b21c8cd4Sdrh     sqlite3_memory_alarm(softHeapLimitEnforcer, 0, iLimit);
48b21c8cd4Sdrh   }else{
49b21c8cd4Sdrh     sqlite3_memory_alarm(0, 0, 0);
50b21c8cd4Sdrh   }
51b21c8cd4Sdrh   overage = sqlite3_memory_used() - n;
52b21c8cd4Sdrh   if( overage>0 ){
53b21c8cd4Sdrh     sqlite3_release_memory(overage);
54b21c8cd4Sdrh   }
55a3152895Sdrh }
56a3152895Sdrh 
57a3152895Sdrh /*
58a3152895Sdrh ** Release memory held by SQLite instances created by the current thread.
59a3152895Sdrh */
60a3152895Sdrh int sqlite3_release_memory(int n){
6186f8c197Sdrh #ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
62dfb316d4Sdanielk1977   int nRet = sqlite3VdbeReleaseMemory(n);
63dfb316d4Sdanielk1977   nRet += sqlite3PagerReleaseMemory(n-nRet);
64dfb316d4Sdanielk1977   return nRet;
651e536953Sdanielk1977 #else
661e536953Sdanielk1977   return SQLITE_OK;
671e536953Sdanielk1977 #endif
68a3152895Sdrh }
69a3152895Sdrh 
70*fec00eabSdrh /*
71*fec00eabSdrh ** State information local to the memory allocation subsystem.
72*fec00eabSdrh */
73*fec00eabSdrh static struct {
74*fec00eabSdrh   sqlite3_mutex *mutex;         /* Mutex to serialize access */
75*fec00eabSdrh 
76*fec00eabSdrh   /*
77*fec00eabSdrh   ** The alarm callback and its arguments.  The mem0.mutex lock will
78*fec00eabSdrh   ** be held while the callback is running.  Recursive calls into
79*fec00eabSdrh   ** the memory subsystem are allowed, but no new callbacks will be
80*fec00eabSdrh   ** issued.  The alarmBusy variable is set to prevent recursive
81*fec00eabSdrh   ** callbacks.
82*fec00eabSdrh   */
83*fec00eabSdrh   sqlite3_int64 alarmThreshold;
84*fec00eabSdrh   void (*alarmCallback)(void*, sqlite3_int64,int);
85*fec00eabSdrh   void *alarmArg;
86*fec00eabSdrh   int alarmBusy;
87*fec00eabSdrh 
88*fec00eabSdrh   /*
89*fec00eabSdrh   ** Performance statistics
90*fec00eabSdrh   */
91*fec00eabSdrh   sqlite3_int64 nowUsed;  /* Main memory currently in use */
92*fec00eabSdrh   sqlite3_int64 mxUsed;   /* Highwater mark for nowUsed */
93*fec00eabSdrh   int mxReq;              /* maximum request size for main or page-cache mem */
94*fec00eabSdrh } mem0;
95*fec00eabSdrh 
96*fec00eabSdrh /*
97*fec00eabSdrh ** Initialize the memory allocation subsystem.
98*fec00eabSdrh */
99*fec00eabSdrh int sqlite3MallocInit(void){
100*fec00eabSdrh   if( sqlite3Config.m.xMalloc==0 ){
101*fec00eabSdrh     sqlite3MemSetDefault();
102*fec00eabSdrh   }
103*fec00eabSdrh   memset(&mem0, 0, sizeof(mem0));
104*fec00eabSdrh   if( sqlite3Config.bMemstat && sqlite3Config.bCoreMutex ){
105*fec00eabSdrh     mem0.mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MEM);
106*fec00eabSdrh   }
107*fec00eabSdrh   return sqlite3Config.m.xInit(sqlite3Config.m.pAppData);
108*fec00eabSdrh }
109*fec00eabSdrh 
110*fec00eabSdrh /*
111*fec00eabSdrh ** Deinitialize the memory allocation subsystem.
112*fec00eabSdrh */
113*fec00eabSdrh void sqlite3MallocEnd(void){
114*fec00eabSdrh    sqlite3Config.m.xShutdown(sqlite3Config.m.pAppData);
115*fec00eabSdrh }
116*fec00eabSdrh 
117*fec00eabSdrh /*
118*fec00eabSdrh ** Return the amount of memory currently checked out.
119*fec00eabSdrh */
120*fec00eabSdrh sqlite3_int64 sqlite3_memory_used(void){
121*fec00eabSdrh   sqlite3_int64 n;
122*fec00eabSdrh   sqlite3_mutex_enter(mem0.mutex);
123*fec00eabSdrh   n = mem0.nowUsed;
124*fec00eabSdrh   sqlite3_mutex_leave(mem0.mutex);
125*fec00eabSdrh   return n;
126*fec00eabSdrh }
127*fec00eabSdrh 
128*fec00eabSdrh /*
129*fec00eabSdrh ** Return the maximum amount of memory that has ever been
130*fec00eabSdrh ** checked out since either the beginning of this process
131*fec00eabSdrh ** or since the most recent reset.
132*fec00eabSdrh */
133*fec00eabSdrh sqlite3_int64 sqlite3_memory_highwater(int resetFlag){
134*fec00eabSdrh   sqlite3_int64 n;
135*fec00eabSdrh   sqlite3_mutex_enter(mem0.mutex);
136*fec00eabSdrh   n = mem0.mxUsed;
137*fec00eabSdrh   if( resetFlag ){
138*fec00eabSdrh     mem0.mxUsed = mem0.nowUsed;
139*fec00eabSdrh   }
140*fec00eabSdrh   sqlite3_mutex_leave(mem0.mutex);
141*fec00eabSdrh   return n;
142*fec00eabSdrh }
143*fec00eabSdrh 
144*fec00eabSdrh /*
145*fec00eabSdrh ** Change the alarm callback
146*fec00eabSdrh */
147*fec00eabSdrh int sqlite3_memory_alarm(
148*fec00eabSdrh   void(*xCallback)(void *pArg, sqlite3_int64 used,int N),
149*fec00eabSdrh   void *pArg,
150*fec00eabSdrh   sqlite3_int64 iThreshold
151*fec00eabSdrh ){
152*fec00eabSdrh   sqlite3_mutex_enter(mem0.mutex);
153*fec00eabSdrh   mem0.alarmCallback = xCallback;
154*fec00eabSdrh   mem0.alarmArg = pArg;
155*fec00eabSdrh   mem0.alarmThreshold = iThreshold;
156*fec00eabSdrh   sqlite3_mutex_leave(mem0.mutex);
157*fec00eabSdrh   return SQLITE_OK;
158*fec00eabSdrh }
159*fec00eabSdrh 
160*fec00eabSdrh /*
161*fec00eabSdrh ** Trigger the alarm
162*fec00eabSdrh */
163*fec00eabSdrh static void sqlite3MallocAlarm(int nByte){
164*fec00eabSdrh   void (*xCallback)(void*,sqlite3_int64,int);
165*fec00eabSdrh   sqlite3_int64 nowUsed;
166*fec00eabSdrh   void *pArg;
167*fec00eabSdrh   if( mem0.alarmCallback==0 || mem0.alarmBusy  ) return;
168*fec00eabSdrh   mem0.alarmBusy = 1;
169*fec00eabSdrh   xCallback = mem0.alarmCallback;
170*fec00eabSdrh   nowUsed = mem0.nowUsed;
171*fec00eabSdrh   pArg = mem0.alarmArg;
172*fec00eabSdrh   sqlite3_mutex_leave(mem0.mutex);
173*fec00eabSdrh   xCallback(pArg, nowUsed, nByte);
174*fec00eabSdrh   sqlite3_mutex_enter(mem0.mutex);
175*fec00eabSdrh   mem0.alarmBusy = 0;
176*fec00eabSdrh }
177*fec00eabSdrh 
178*fec00eabSdrh 
179*fec00eabSdrh /*
180*fec00eabSdrh ** Allocate memory.  This routine is like sqlite3_malloc() except that it
181*fec00eabSdrh ** assumes the memory subsystem has already been initialized.
182*fec00eabSdrh */
183*fec00eabSdrh void *sqlite3Malloc(int n){
184*fec00eabSdrh   void *p;
185*fec00eabSdrh   int nFull;
186*fec00eabSdrh   if( n<=0 ){
187*fec00eabSdrh     return 0;
188*fec00eabSdrh   }else if( sqlite3Config.bMemstat ){
189*fec00eabSdrh     nFull = sqlite3Config.m.xRoundup(n);
190*fec00eabSdrh     sqlite3_mutex_enter(mem0.mutex);
191*fec00eabSdrh     if( n>mem0.mxReq ) mem0.mxReq = n;
192*fec00eabSdrh     if( mem0.alarmCallback!=0 && mem0.nowUsed+nFull>=mem0.alarmThreshold ){
193*fec00eabSdrh       sqlite3MallocAlarm(nFull);
194*fec00eabSdrh     }
195*fec00eabSdrh     if( sqlite3FaultStep(SQLITE_FAULTINJECTOR_MALLOC) ){
196*fec00eabSdrh       p = 0;
197*fec00eabSdrh     }else{
198*fec00eabSdrh       p = sqlite3Config.m.xMalloc(nFull);
199*fec00eabSdrh       if( p==0 ){
200*fec00eabSdrh         sqlite3MallocAlarm(nFull);
201*fec00eabSdrh         p = malloc(nFull);
202*fec00eabSdrh       }
203*fec00eabSdrh     }
204*fec00eabSdrh     if( p ){
205*fec00eabSdrh       mem0.nowUsed += nFull;
206*fec00eabSdrh       if( mem0.nowUsed>mem0.mxUsed ){
207*fec00eabSdrh         mem0.mxUsed = mem0.nowUsed;
208*fec00eabSdrh       }
209*fec00eabSdrh     }
210*fec00eabSdrh     sqlite3_mutex_leave(mem0.mutex);
211*fec00eabSdrh   }else{
212*fec00eabSdrh     p = sqlite3Config.m.xMalloc(n);
213*fec00eabSdrh   }
214*fec00eabSdrh   return p;
215*fec00eabSdrh }
216*fec00eabSdrh 
217*fec00eabSdrh /*
218*fec00eabSdrh ** This version of the memory allocation is for use by the application.
219*fec00eabSdrh ** First make sure the memory subsystem is initialized, then do the
220*fec00eabSdrh ** allocation.
221*fec00eabSdrh */
222*fec00eabSdrh void *sqlite3_malloc(int n){
223*fec00eabSdrh #ifndef SQLITE_OMIT_AUTOINIT
224*fec00eabSdrh   if( sqlite3_initialize() ) return 0;
225*fec00eabSdrh #endif
226*fec00eabSdrh   return sqlite3Malloc(n);
227*fec00eabSdrh }
228*fec00eabSdrh 
229*fec00eabSdrh /*
230*fec00eabSdrh ** Return the size of a memory allocation previously obtained from
231*fec00eabSdrh ** sqlite3Malloc() or sqlite3_malloc().
232*fec00eabSdrh */
233*fec00eabSdrh int sqlite3MallocSize(void *p){
234*fec00eabSdrh   return sqlite3Config.m.xSize(p);
235*fec00eabSdrh }
236*fec00eabSdrh 
237*fec00eabSdrh /*
238*fec00eabSdrh ** Free memory previously obtained from sqlite3Malloc().
239*fec00eabSdrh */
240*fec00eabSdrh void sqlite3_free(void *p){
241*fec00eabSdrh   if( p==0 ) return;
242*fec00eabSdrh   if( sqlite3Config.bMemstat ){
243*fec00eabSdrh     sqlite3_mutex_enter(mem0.mutex);
244*fec00eabSdrh     mem0.nowUsed -= sqlite3MallocSize(p);
245*fec00eabSdrh     sqlite3Config.m.xFree(p);
246*fec00eabSdrh     sqlite3_mutex_leave(mem0.mutex);
247*fec00eabSdrh   }else{
248*fec00eabSdrh     sqlite3Config.m.xFree(p);
249*fec00eabSdrh   }
250*fec00eabSdrh }
251*fec00eabSdrh 
252*fec00eabSdrh /*
253*fec00eabSdrh ** Change the size of an existing memory allocation
254*fec00eabSdrh */
255*fec00eabSdrh void *sqlite3Realloc(void *pOld, int nBytes){
256*fec00eabSdrh   int nOld, nNew;
257*fec00eabSdrh   void *pNew;
258*fec00eabSdrh   if( pOld==0 ){
259*fec00eabSdrh     return sqlite3Malloc(nBytes);
260*fec00eabSdrh   }
261*fec00eabSdrh   if( nBytes<=0 ){
262*fec00eabSdrh     sqlite3_free(pOld);
263*fec00eabSdrh     return 0;
264*fec00eabSdrh   }
265*fec00eabSdrh   nOld = sqlite3MallocSize(pOld);
266*fec00eabSdrh   if( sqlite3Config.bMemstat ){
267*fec00eabSdrh     sqlite3_mutex_enter(mem0.mutex);
268*fec00eabSdrh     if( nBytes>mem0.mxReq ) mem0.mxReq = nBytes;
269*fec00eabSdrh     nNew = sqlite3Config.m.xRoundup(nBytes);
270*fec00eabSdrh     if( nOld==nNew ){
271*fec00eabSdrh       pNew = pOld;
272*fec00eabSdrh     }else{
273*fec00eabSdrh       if( mem0.nowUsed+nNew-nOld>=mem0.alarmThreshold ){
274*fec00eabSdrh         sqlite3MallocAlarm(nNew-nOld);
275*fec00eabSdrh       }
276*fec00eabSdrh       if( sqlite3FaultStep(SQLITE_FAULTINJECTOR_MALLOC) ){
277*fec00eabSdrh         pNew = 0;
278*fec00eabSdrh       }else{
279*fec00eabSdrh         pNew = sqlite3Config.m.xRealloc(pOld, nNew);
280*fec00eabSdrh         if( pNew==0 ){
281*fec00eabSdrh           sqlite3MallocAlarm(nBytes);
282*fec00eabSdrh           pNew = sqlite3Config.m.xRealloc(pOld, nNew);
283*fec00eabSdrh         }
284*fec00eabSdrh       }
285*fec00eabSdrh       if( pNew ){
286*fec00eabSdrh         mem0.nowUsed += nNew-nOld;
287*fec00eabSdrh         if( mem0.nowUsed>mem0.mxUsed ){
288*fec00eabSdrh           mem0.mxUsed = mem0.nowUsed;
289*fec00eabSdrh         }
290*fec00eabSdrh       }
291*fec00eabSdrh     }
292*fec00eabSdrh     sqlite3_mutex_leave(mem0.mutex);
293*fec00eabSdrh   }else{
294*fec00eabSdrh     pNew = sqlite3Config.m.xRealloc(pOld, nBytes);
295*fec00eabSdrh   }
296*fec00eabSdrh   return pNew;
297*fec00eabSdrh }
298*fec00eabSdrh 
299*fec00eabSdrh /*
300*fec00eabSdrh ** The public interface to sqlite3Realloc.  Make sure that the memory
301*fec00eabSdrh ** subsystem is initialized prior to invoking sqliteRealloc.
302*fec00eabSdrh */
303*fec00eabSdrh void *sqlite3_realloc(void *pOld, int n){
304*fec00eabSdrh #ifndef SQLITE_OMIT_AUTOINIT
305*fec00eabSdrh   if( sqlite3_initialize() ) return 0;
306*fec00eabSdrh #endif
307*fec00eabSdrh   return sqlite3Realloc(pOld, n);
308*fec00eabSdrh }
309*fec00eabSdrh 
310a3152895Sdrh 
311a3152895Sdrh /*
31217435752Sdrh ** Allocate and zero memory.
313a3152895Sdrh */
314*fec00eabSdrh void *sqlite3MallocZero(int n){
315*fec00eabSdrh   void *p = sqlite3Malloc(n);
316a3152895Sdrh   if( p ){
317a3152895Sdrh     memset(p, 0, n);
318a3152895Sdrh   }
319a3152895Sdrh   return p;
320a3152895Sdrh }
32117435752Sdrh 
32217435752Sdrh /*
32317435752Sdrh ** Allocate and zero memory.  If the allocation fails, make
32417435752Sdrh ** the mallocFailed flag in the connection pointer.
32517435752Sdrh */
326*fec00eabSdrh void *sqlite3DbMallocZero(sqlite3 *db, int n){
327a1644fd8Sdanielk1977   void *p = sqlite3DbMallocRaw(db, n);
32817435752Sdrh   if( p ){
32917435752Sdrh     memset(p, 0, n);
33017435752Sdrh   }
33117435752Sdrh   return p;
33217435752Sdrh }
33317435752Sdrh 
33417435752Sdrh /*
33517435752Sdrh ** Allocate and zero memory.  If the allocation fails, make
33617435752Sdrh ** the mallocFailed flag in the connection pointer.
33717435752Sdrh */
338*fec00eabSdrh void *sqlite3DbMallocRaw(sqlite3 *db, int n){
339a1644fd8Sdanielk1977   void *p = 0;
340a1644fd8Sdanielk1977   if( !db || db->mallocFailed==0 ){
341*fec00eabSdrh     p = sqlite3Malloc(n);
342f3a65f7eSdrh     if( !p && db ){
34317435752Sdrh       db->mallocFailed = 1;
34417435752Sdrh     }
345a1644fd8Sdanielk1977   }
34617435752Sdrh   return p;
34717435752Sdrh }
34817435752Sdrh 
34926783a58Sdanielk1977 /*
35026783a58Sdanielk1977 ** Resize the block of memory pointed to by p to n bytes. If the
35126783a58Sdanielk1977 ** resize fails, set the mallocFailed flag inthe connection object.
35226783a58Sdanielk1977 */
353a1644fd8Sdanielk1977 void *sqlite3DbRealloc(sqlite3 *db, void *p, int n){
354a1644fd8Sdanielk1977   void *pNew = 0;
355a1644fd8Sdanielk1977   if( db->mallocFailed==0 ){
356a1644fd8Sdanielk1977     pNew = sqlite3_realloc(p, n);
357a1644fd8Sdanielk1977     if( !pNew ){
358a1644fd8Sdanielk1977       db->mallocFailed = 1;
359a1644fd8Sdanielk1977     }
360a1644fd8Sdanielk1977   }
361a1644fd8Sdanielk1977   return pNew;
362a1644fd8Sdanielk1977 }
363a1644fd8Sdanielk1977 
36417435752Sdrh /*
36517435752Sdrh ** Attempt to reallocate p.  If the reallocation fails, then free p
36617435752Sdrh ** and set the mallocFailed flag in the database connection.
36717435752Sdrh */
36817435752Sdrh void *sqlite3DbReallocOrFree(sqlite3 *db, void *p, int n){
369a3152895Sdrh   void *pNew;
370a1644fd8Sdanielk1977   pNew = sqlite3DbRealloc(db, p, n);
371a3152895Sdrh   if( !pNew ){
3721e536953Sdanielk1977     sqlite3_free(p);
373a3152895Sdrh   }
374a3152895Sdrh   return pNew;
375a3152895Sdrh }
376a3152895Sdrh 
377a3152895Sdrh /*
378a3152895Sdrh ** Make a copy of a string in memory obtained from sqliteMalloc(). These
379a3152895Sdrh ** functions call sqlite3MallocRaw() directly instead of sqliteMalloc(). This
380a3152895Sdrh ** is because when memory debugging is turned on, these two functions are
381a3152895Sdrh ** called via macros that record the current file and line number in the
382a3152895Sdrh ** ThreadData structure.
383a3152895Sdrh */
384a3152895Sdrh char *sqlite3StrDup(const char *z){
385a3152895Sdrh   char *zNew;
386a3152895Sdrh   int n;
387a3152895Sdrh   if( z==0 ) return 0;
388a3152895Sdrh   n = strlen(z)+1;
3891e536953Sdanielk1977   zNew = sqlite3_malloc(n);
390a3152895Sdrh   if( zNew ) memcpy(zNew, z, n);
391a3152895Sdrh   return zNew;
392a3152895Sdrh }
393a3152895Sdrh char *sqlite3StrNDup(const char *z, int n){
394a3152895Sdrh   char *zNew;
395a3152895Sdrh   if( z==0 ) return 0;
3961e536953Sdanielk1977   zNew = sqlite3_malloc(n+1);
397a3152895Sdrh   if( zNew ){
398a3152895Sdrh     memcpy(zNew, z, n);
399a3152895Sdrh     zNew[n] = 0;
400a3152895Sdrh   }
401a3152895Sdrh   return zNew;
402a3152895Sdrh }
403a3152895Sdrh 
4041e536953Sdanielk1977 char *sqlite3DbStrDup(sqlite3 *db, const char *z){
4051e536953Sdanielk1977   char *zNew = sqlite3StrDup(z);
4061e536953Sdanielk1977   if( z && !zNew ){
4071e536953Sdanielk1977     db->mallocFailed = 1;
4081e536953Sdanielk1977   }
4091e536953Sdanielk1977   return zNew;
4101e536953Sdanielk1977 }
4111e536953Sdanielk1977 char *sqlite3DbStrNDup(sqlite3 *db, const char *z, int n){
4121e536953Sdanielk1977   char *zNew = sqlite3StrNDup(z, n);
4131e536953Sdanielk1977   if( z && !zNew ){
4141e536953Sdanielk1977     db->mallocFailed = 1;
4151e536953Sdanielk1977   }
4161e536953Sdanielk1977   return zNew;
4171e536953Sdanielk1977 }
4181e536953Sdanielk1977 
419a3152895Sdrh /*
420a3152895Sdrh ** Create a string from the 2nd and subsequent arguments (up to the
421a3152895Sdrh ** first NULL argument), store the string in memory obtained from
422a3152895Sdrh ** sqliteMalloc() and make the pointer indicated by the 1st argument
423a3152895Sdrh ** point to that string.  The 1st argument must either be NULL or
424a3152895Sdrh ** point to memory obtained from sqliteMalloc().
425a3152895Sdrh */
426a3152895Sdrh void sqlite3SetString(char **pz, ...){
427a3152895Sdrh   va_list ap;
428a3152895Sdrh   int nByte;
429a3152895Sdrh   const char *z;
430a3152895Sdrh   char *zResult;
431a3152895Sdrh 
432a3152895Sdrh   assert( pz!=0 );
433a3152895Sdrh   nByte = 1;
434a3152895Sdrh   va_start(ap, pz);
435a3152895Sdrh   while( (z = va_arg(ap, const char*))!=0 ){
436a3152895Sdrh     nByte += strlen(z);
437a3152895Sdrh   }
438a3152895Sdrh   va_end(ap);
4391e536953Sdanielk1977   sqlite3_free(*pz);
4401e536953Sdanielk1977   *pz = zResult = sqlite3_malloc(nByte);
441a3152895Sdrh   if( zResult==0 ){
442a3152895Sdrh     return;
443a3152895Sdrh   }
444a3152895Sdrh   *zResult = 0;
445a3152895Sdrh   va_start(ap, pz);
446a3152895Sdrh   while( (z = va_arg(ap, const char*))!=0 ){
447a3152895Sdrh     int n = strlen(z);
448a3152895Sdrh     memcpy(zResult, z, n);
449a3152895Sdrh     zResult += n;
450a3152895Sdrh   }
451a3152895Sdrh   zResult[0] = 0;
452a3152895Sdrh   va_end(ap);
453a3152895Sdrh }
454a3152895Sdrh 
455a3152895Sdrh 
456a3152895Sdrh /*
457a3152895Sdrh ** This function must be called before exiting any API function (i.e.
45817435752Sdrh ** returning control to the user) that has called sqlite3_malloc or
45917435752Sdrh ** sqlite3_realloc.
460a3152895Sdrh **
461a3152895Sdrh ** The returned value is normally a copy of the second argument to this
462a3152895Sdrh ** function. However, if a malloc() failure has occured since the previous
463a3152895Sdrh ** invocation SQLITE_NOMEM is returned instead.
464a3152895Sdrh **
465a3152895Sdrh ** If the first argument, db, is not NULL and a malloc() error has occured,
466a3152895Sdrh ** then the connection error-code (the value returned by sqlite3_errcode())
467a3152895Sdrh ** is set to SQLITE_NOMEM.
468a3152895Sdrh */
469a3152895Sdrh int sqlite3ApiExit(sqlite3* db, int rc){
470a1644fd8Sdanielk1977   /* If the db handle is not NULL, then we must hold the connection handle
471a1644fd8Sdanielk1977   ** mutex here. Otherwise the read (and possible write) of db->mallocFailed
472a1644fd8Sdanielk1977   ** is unsafe, as is the call to sqlite3Error().
473a1644fd8Sdanielk1977   */
474a1644fd8Sdanielk1977   assert( !db || sqlite3_mutex_held(db->mutex) );
4751e536953Sdanielk1977   if( db && db->mallocFailed ){
476a3152895Sdrh     sqlite3Error(db, SQLITE_NOMEM, 0);
47717435752Sdrh     db->mallocFailed = 0;
478a3152895Sdrh     rc = SQLITE_NOMEM;
479a3152895Sdrh   }
480a3152895Sdrh   return rc & (db ? db->errMask : 0xff);
481a3152895Sdrh }
482