1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-08-05 15:55:57 +03:00

Add the sqlite3ResultStrAccum() internal interface to simplify the

the implementation of functions that return strings.

FossilOrigin-Name: e548e9299d3fd6ce5b647cf0dd93ff8e917a5eda43076c6a02389c52640e2e50
This commit is contained in:
drh
2021-10-03 00:12:43 +00:00
parent ad1188b21c
commit 5bf4715e01
7 changed files with 122 additions and 163 deletions

View File

@@ -1,5 +1,5 @@
C Try\sto\sfix\sa\sharmless\sstatic-analyzer\swarning\sin\ssqlite3BtreeTransferRow(). C Add\sthe\ssqlite3ResultStrAccum()\sinternal\sinterface\sto\ssimplify\sthe\nthe\simplementation\sof\sfunctions\sthat\sreturn\sstrings.
D 2021-10-02T18:22:24.853 D 2021-10-03T00:12:43.656
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -484,7 +484,7 @@ F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b
F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786
F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a
F src/alter.c a6afe961ef3544104fa635a0c3161bfe1a34382f32e2a28706993abadedbffed F src/alter.c a6afe961ef3544104fa635a0c3161bfe1a34382f32e2a28706993abadedbffed
F src/analyze.c 6ff8ae7b9e8dfacd62447e1204d85e57f76580c955f4faf953704c36ed8ac60e F src/analyze.c 979b6d2cdaca992a9c9f0818de55d08fb9a4e52929a509752b52d9fd23bb86d3
F src/attach.c a514e81758ba7b3a3a0501faf70af6cfc509de8810235db726cfc9f25165e929 F src/attach.c a514e81758ba7b3a3a0501faf70af6cfc509de8810235db726cfc9f25165e929
F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf
F src/backup.c 3014889fa06e20e6adfa0d07b60097eec1f6e5b06671625f476a714d2356513d F src/backup.c 3014889fa06e20e6adfa0d07b60097eec1f6e5b06671625f476a714d2356513d
@@ -497,14 +497,14 @@ F src/build.c ee6941680fa2ab0461d9be145a546f8659f6543af643ace0b44d08abdf85e001
F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c
F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
F src/ctime.c 8159d5f706551861c18ec6c8f6bdf105e15ea00367f05d9ab65d31a1077facc1 F src/ctime.c 8159d5f706551861c18ec6c8f6bdf105e15ea00367f05d9ab65d31a1077facc1
F src/date.c e0632f335952b32401482d099321bbf12716b29d6e72836b53ae49683ebae4bf F src/date.c 467848d8187382764e37fd7678d6825cdfb90d9e564648527ed832e999ea7b85
F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a
F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d
F src/delete.c 3ce6af6b64c8b476de51ccc32da0cb3142d42e65754e1d8118addf65b8bcba15 F src/delete.c 3ce6af6b64c8b476de51ccc32da0cb3142d42e65754e1d8118addf65b8bcba15
F src/expr.c ebc76aa98b9bcd556c2855942c18f4d2f52c6504c13f7285413026bdd1c7bbf5 F src/expr.c ebc76aa98b9bcd556c2855942c18f4d2f52c6504c13f7285413026bdd1c7bbf5
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
F src/fkey.c 1905af1821b88321e1bb9d6a69e704495b6844a9b6c29398d40117cc251e893c F src/fkey.c 1905af1821b88321e1bb9d6a69e704495b6844a9b6c29398d40117cc251e893c
F src/func.c f4924c04e95335762ed1b24f184df26d0db5b20e87decbc5a0ed6431f7ebd9ca F src/func.c 761a989e9b6a1f03cae05ef274f30881cb8f7ec816af2913b58dc18ac31ffd0e
F src/global.c 612ea60c9acbcb45754c2ed659b4a56936a06814718e969636fedc7e3b889808 F src/global.c 612ea60c9acbcb45754c2ed659b4a56936a06814718e969636fedc7e3b889808
F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19
F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38
@@ -545,7 +545,7 @@ F src/pcache1.c 54881292a9a5db202b2c0ac541c5e3ef9a5e8c4f1c1383adb2601d5499a60e65
F src/pragma.c 4a473feae3646063996ce3bfae78032009fa950765908d97424f7578b202813c F src/pragma.c 4a473feae3646063996ce3bfae78032009fa950765908d97424f7578b202813c
F src/pragma.h b33c7a542ae7965c471f0d3c0565ce4d340c3f32cc162f44133539b6b0edb927 F src/pragma.h b33c7a542ae7965c471f0d3c0565ce4d340c3f32cc162f44133539b6b0edb927
F src/prepare.c 8f07616db04337057b8498b72d051ee90f73c54615c2e908c05404cef1e060b7 F src/prepare.c 8f07616db04337057b8498b72d051ee90f73c54615c2e908c05404cef1e060b7
F src/printf.c 1ce574bf02b503b0e031a70d3453324a9f4a0eb1ad379f3324ced73b918ed20b F src/printf.c 5901672228f305f7d493cbc4e7d76a61a5caecdbc1cd06b1f9ec42ea4265cf8d
F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c
F src/resolve.c b9e60afa56d0484ee573aba54d9e73603736236df33d2ae3421b4cd0367d907d F src/resolve.c b9e60afa56d0484ee573aba54d9e73603736236df33d2ae3421b4cd0367d907d
F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92
@@ -554,7 +554,7 @@ F src/shell.c.in 5a4ccff506efcc58b72df1bff13d9f54c1534887c93d42746d6f1ccf1d0a815
F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510
F src/sqliteInt.h 2cfc99065003dd1f5d91a85114449f920fde0adbea4bdbd524fca8907a6e38f3 F src/sqliteInt.h e105aa8ec699c8c247117b99080b49c175b013493f9938bd411f00d839a381dc
F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657
F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1
F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
@@ -1929,7 +1929,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
P 918c22e82ae6e366ddd094d337ed73fd23878c51745045519ed700113832545c P 5906a0152deded614d965e790a33c67832890828a4835451d65c06414ba71f8b
R 5781c21c06185469dcaa5dd85fb44478 R 899d8dbf1371ef1c2da55d4150a8c0b1
U drh U drh
Z 74091180b7dd3dec2d49d6625f2783ff Z 0fd44f9546cbcefb4424b0b49d87120d

View File

@@ -1 +1 @@
5906a0152deded614d965e790a33c67832890828a4835451d65c06414ba71f8b e548e9299d3fd6ce5b647cf0dd93ff8e917a5eda43076c6a02389c52640e2e50

View File

@@ -851,28 +851,19 @@ static void statGet(
** **
** I = (K+D-1)/D ** I = (K+D-1)/D
*/ */
char *z; sqlite3_str sStat; /* Text of the constructed "stat" line */
int i; int i; /* Loop counter */
char *zRet = sqlite3MallocZero( (p->nKeyCol+1)*25 ); sqlite3StrAccumInit(&sStat, 0, 0, 0, (p->nKeyCol+1)*100);
if( zRet==0 ){ sqlite3_str_appendf(&sStat, "%llu",
sqlite3_result_error_nomem(context);
return;
}
sqlite3_snprintf(24, zRet, "%llu",
p->nSkipAhead ? (u64)p->nEst : (u64)p->nRow); p->nSkipAhead ? (u64)p->nEst : (u64)p->nRow);
z = zRet + sqlite3Strlen30(zRet);
for(i=0; i<p->nKeyCol; i++){ for(i=0; i<p->nKeyCol; i++){
u64 nDistinct = p->current.anDLt[i] + 1; u64 nDistinct = p->current.anDLt[i] + 1;
u64 iVal = (p->nRow + nDistinct - 1) / nDistinct; u64 iVal = (p->nRow + nDistinct - 1) / nDistinct;
sqlite3_snprintf(24, z, " %llu", iVal); sqlite3_str_appendf(&sStat, " %llu", iVal);
z += sqlite3Strlen30(z);
assert( p->current.anEq[i] ); assert( p->current.anEq[i] );
} }
assert( z[0]=='\0' && z>zRet ); sqlite3ResultStrAccum(context, &sStat);
sqlite3_result_text(context, zRet, -1, sqlite3_free);
} }
#ifdef SQLITE_ENABLE_STAT4 #ifdef SQLITE_ENABLE_STAT4
else if( eCall==STAT_GET_ROWID ){ else if( eCall==STAT_GET_ROWID ){
@@ -891,6 +882,8 @@ static void statGet(
} }
}else{ }else{
tRowcnt *aCnt = 0; tRowcnt *aCnt = 0;
sqlite3_str sStat;
int i;
assert( p->iGet<p->nSample ); assert( p->iGet<p->nSample );
switch( eCall ){ switch( eCall ){
@@ -902,23 +895,12 @@ static void statGet(
break; break;
} }
} }
sqlite3StrAccumInit(&sStat, 0, 0, 0, p->nCol*100);
{ for(i=0; i<p->nCol; i++){
char *zRet = sqlite3MallocZero(p->nCol * 25); sqlite3_str_appendf(&sStat, "%llu ", (u64)aCnt[i]);
if( zRet==0 ){
sqlite3_result_error_nomem(context);
}else{
int i;
char *z = zRet;
for(i=0; i<p->nCol; i++){
sqlite3_snprintf(24, z, "%llu ", (u64)aCnt[i]);
z += sqlite3Strlen30(z);
}
assert( z[0]=='\0' && z>zRet );
z[-1] = '\0';
sqlite3_result_text(context, zRet, -1, sqlite3_free);
}
} }
if( sStat.nChar ) sStat.nChar--;
sqlite3ResultStrAccum(context, &sStat);
} }
#endif /* SQLITE_ENABLE_STAT4 */ #endif /* SQLITE_ENABLE_STAT4 */
#ifndef SQLITE_DEBUG #ifndef SQLITE_DEBUG

View File

@@ -1009,131 +1009,100 @@ static void strftimeFunc(
sqlite3_value **argv sqlite3_value **argv
){ ){
DateTime x; DateTime x;
u64 n;
size_t i,j; size_t i,j;
char *z;
sqlite3 *db; sqlite3 *db;
const char *zFmt; const char *zFmt;
char zBuf[100]; sqlite3_str sRes;
if( argc==0 ) return; if( argc==0 ) return;
zFmt = (const char*)sqlite3_value_text(argv[0]); zFmt = (const char*)sqlite3_value_text(argv[0]);
if( zFmt==0 || isDate(context, argc-1, argv+1, &x) ) return; if( zFmt==0 || isDate(context, argc-1, argv+1, &x) ) return;
db = sqlite3_context_db_handle(context); db = sqlite3_context_db_handle(context);
for(i=0, n=1; zFmt[i]; i++, n++){ sqlite3StrAccumInit(&sRes, 0, 0, 0, db->aLimit[SQLITE_LIMIT_LENGTH]);
if( zFmt[i]=='%' ){
switch( zFmt[i+1] ){
case 'd':
case 'H':
case 'm':
case 'M':
case 'S':
case 'W':
n++;
/* fall thru */
case 'w':
case '%':
break;
case 'f':
n += 8;
break;
case 'j':
n += 3;
break;
case 'Y':
n += 8;
break;
case 's':
case 'J':
n += 50;
break;
default:
return; /* ERROR. return a NULL */
}
i++;
}
}
testcase( n==sizeof(zBuf)-1 );
testcase( n==sizeof(zBuf) );
testcase( n==(u64)db->aLimit[SQLITE_LIMIT_LENGTH]+1 );
testcase( n==(u64)db->aLimit[SQLITE_LIMIT_LENGTH] );
if( n<sizeof(zBuf) ){
z = zBuf;
}else if( n>(u64)db->aLimit[SQLITE_LIMIT_LENGTH] ){
sqlite3_result_error_toobig(context);
return;
}else{
z = sqlite3DbMallocRawNN(db, (int)n);
if( z==0 ){
sqlite3_result_error_nomem(context);
return;
}
}
computeJD(&x); computeJD(&x);
computeYMD_HMS(&x); computeYMD_HMS(&x);
for(i=j=0; zFmt[i]; i++){ for(i=j=0; zFmt[i]; i++){
if( zFmt[i]!='%' ){ if( zFmt[i]!='%' ) continue;
z[j++] = zFmt[i]; if( j<i ) sqlite3_str_append(&sRes, zFmt+j, i-j);
}else{ i++;
i++; j = i + 1;
switch( zFmt[i] ){ switch( zFmt[i] ){
case 'd': sqlite3_snprintf(3, &z[j],"%02d",x.D); j+=2; break; case 'd': {
case 'f': { sqlite3_str_appendf(&sRes, "%02d", x.D);
double s = x.s; break;
if( s>59.999 ) s = 59.999; }
sqlite3_snprintf(7, &z[j],"%06.3f", s); case 'f': {
j += sqlite3Strlen30(&z[j]); double s = x.s;
break; if( s>59.999 ) s = 59.999;
sqlite3_str_appendf(&sRes, "%06.3f", s);
break;
}
case 'H': {
sqlite3_str_appendf(&sRes, "%02d", x.h);
break;
}
case 'W': /* Fall thru */
case 'j': {
int nDay; /* Number of days since 1st day of year */
DateTime y = x;
y.validJD = 0;
y.M = 1;
y.D = 1;
computeJD(&y);
nDay = (int)((x.iJD-y.iJD+43200000)/86400000);
if( zFmt[i]=='W' ){
int wd; /* 0=Monday, 1=Tuesday, ... 6=Sunday */
wd = (int)(((x.iJD+43200000)/86400000)%7);
sqlite3_str_appendf(&sRes,"%02d",(nDay+7-wd)/7);
}else{
sqlite3_str_appendf(&sRes,"%03d",nDay+1);
} }
case 'H': sqlite3_snprintf(3, &z[j],"%02d",x.h); j+=2; break; break;
case 'W': /* Fall thru */ }
case 'j': { case 'J': {
int nDay; /* Number of days since 1st day of year */ sqlite3_str_appendf(&sRes,"%.16g",x.iJD/86400000.0);
DateTime y = x; break;
y.validJD = 0; }
y.M = 1; case 'm': {
y.D = 1; sqlite3_str_appendf(&sRes,"%02d",x.M);
computeJD(&y); break;
nDay = (int)((x.iJD-y.iJD+43200000)/86400000); }
if( zFmt[i]=='W' ){ case 'M': {
int wd; /* 0=Monday, 1=Tuesday, ... 6=Sunday */ sqlite3_str_appendf(&sRes,"%02d",x.m);
wd = (int)(((x.iJD+43200000)/86400000)%7); break;
sqlite3_snprintf(3, &z[j],"%02d",(nDay+7-wd)/7); }
j += 2; case 's': {
}else{ i64 iS = (i64)(x.iJD/1000 - 21086676*(i64)10000);
sqlite3_snprintf(4, &z[j],"%03d",nDay+1); sqlite3_str_appendf(&sRes,"%lld",iS);
j += 3; break;
} }
break; case 'S': {
} sqlite3_str_appendf(&sRes,"%02d",(int)x.s);
case 'J': { break;
sqlite3_snprintf(20, &z[j],"%.16g",x.iJD/86400000.0); }
j+=sqlite3Strlen30(&z[j]); case 'w': {
break; sqlite3_str_appendchar(&sRes, 1,
} (char)(((x.iJD+129600000)/86400000) % 7) + '0');
case 'm': sqlite3_snprintf(3, &z[j],"%02d",x.M); j+=2; break; break;
case 'M': sqlite3_snprintf(3, &z[j],"%02d",x.m); j+=2; break; }
case 's': { case 'Y': {
i64 iS = (i64)(x.iJD/1000 - 21086676*(i64)10000); sqlite3_str_appendf(&sRes,"%04d",x.Y);
sqlite3Int64ToText(iS, &z[j]); break;
j += sqlite3Strlen30(&z[j]); }
break; case '%': {
} sqlite3_str_appendchar(&sRes, 1, '%');
case 'S': sqlite3_snprintf(3,&z[j],"%02d",(int)x.s); j+=2; break; break;
case 'w': { }
z[j++] = (char)(((x.iJD+129600000)/86400000) % 7) + '0'; default: {
break; sqlite3_str_reset(&sRes);
} return;
case 'Y': {
sqlite3_snprintf(5,&z[j],"%04d",x.Y); j+=sqlite3Strlen30(&z[j]);
break;
}
default: z[j++] = '%'; break;
} }
} }
} }
z[j] = 0; if( j<i ) sqlite3_str_append(&sRes, zFmt+j, i-j);
sqlite3_result_text(context, z, -1, sqlite3ResultStrAccum(context, &sRes);
z==zBuf ? SQLITE_TRANSIENT : SQLITE_DYNAMIC);
} }
/* /*

View File

@@ -1853,16 +1853,7 @@ static void groupConcatFinalize(sqlite3_context *context){
GroupConcatCtx *pGCC GroupConcatCtx *pGCC
= (GroupConcatCtx*)sqlite3_aggregate_context(context, 0); = (GroupConcatCtx*)sqlite3_aggregate_context(context, 0);
if( pGCC ){ if( pGCC ){
StrAccum *pAccum = &pGCC->str; sqlite3ResultStrAccum(context, &pGCC->str);
if( pAccum->accError==SQLITE_TOOBIG ){
sqlite3_result_error_toobig(context);
}else if( pAccum->accError==SQLITE_NOMEM ){
sqlite3_result_error_nomem(context);
}else{
int n = pAccum->nChar;
sqlite3_result_text(context, sqlite3StrAccumFinish(pAccum), n,
sqlite3_free);
}
#ifndef SQLITE_OMIT_WINDOWFUNC #ifndef SQLITE_OMIT_WINDOWFUNC
sqlite3_free(pGCC->pnSepLengths); sqlite3_free(pGCC->pnSepLengths);
#endif #endif

View File

@@ -1044,6 +1044,22 @@ char *sqlite3StrAccumFinish(StrAccum *p){
return p->zText; return p->zText;
} }
/*
** Use the content of the StrAccum passed as the second argument
** as the result of an SQL function.
*/
void sqlite3ResultStrAccum(sqlite3_context *pCtx, StrAccum *p){
if( p->accError ){
sqlite3_result_error_code(pCtx, p->accError);
sqlite3_str_reset(p);
}else if( isMalloced(p) ){
sqlite3_result_text(pCtx, p->zText, p->nChar, SQLITE_DYNAMIC);
}else{
sqlite3_result_text(pCtx, "", 0, SQLITE_STATIC);
sqlite3_str_reset(p);
}
}
/* /*
** This singleton is an sqlite3_str object that is returned if ** This singleton is an sqlite3_str object that is returned if
** sqlite3_malloc() fails to provide space for a real one. This ** sqlite3_malloc() fails to provide space for a real one. This

View File

@@ -4941,6 +4941,7 @@ int sqlite3OpenTempDatabase(Parse *);
void sqlite3StrAccumInit(StrAccum*, sqlite3*, char*, int, int); void sqlite3StrAccumInit(StrAccum*, sqlite3*, char*, int, int);
char *sqlite3StrAccumFinish(StrAccum*); char *sqlite3StrAccumFinish(StrAccum*);
void sqlite3StrAccumSetError(StrAccum*, u8); void sqlite3StrAccumSetError(StrAccum*, u8);
void sqlite3ResultStrAccum(sqlite3_context*,StrAccum*);
void sqlite3SelectDestInit(SelectDest*,int,int); void sqlite3SelectDestInit(SelectDest*,int,int);
Expr *sqlite3CreateColumnExpr(sqlite3 *, SrcList *, int, int); Expr *sqlite3CreateColumnExpr(sqlite3 *, SrcList *, int, int);