mirror of https://github.com/sqlite/sqlite
Factor out and simplify code in pragma.c for pragmas that return a single
row with a single column that is an integer or text value. FossilOrigin-Name: d7f4bdf594e93c848f46901637861c8eed4c34df
This commit is contained in:
parent
b460e52a83
commit
7cc023c7fa
14
manifest
14
manifest
|
@ -1,5 +1,5 @@
|
|||
C For\sPRAGMAs,\sfactor\sout\sthe\scode\sthat\ssets\sthe\sresult\sset\scolumn\snames\sinto\na\ssubroutine.
|
||||
D 2015-09-03T03:29:51.139
|
||||
C Factor\sout\sand\ssimplify\scode\sin\spragma.c\sfor\spragmas\sthat\sreturn\sa\ssingle\nrow\swith\sa\ssingle\scolumn\sthat\sis\san\sinteger\sor\stext\svalue.
|
||||
D 2015-09-03T04:28:25.375
|
||||
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
|
||||
F Makefile.in f85066ce844a28b671aaeeff320921cd0ce36239
|
||||
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
|
||||
|
@ -330,7 +330,7 @@ F src/parse.y f599aa5e871a493330d567ced93de696f61f48f7
|
|||
F src/pcache.c cde06aa50962595e412d497e22fd2e07878ba1f0
|
||||
F src/pcache.h 9968603796240cdf83da7e7bef76edf90619cea9
|
||||
F src/pcache1.c b31af9dbc83b9c68e87d681b8453a9605f28e734
|
||||
F src/pragma.c a5a100adba96b061e3cb1e0ca0598add70ab1b04
|
||||
F src/pragma.c 0465869b5a6161f3184b8e31227ef1edfbabff46
|
||||
F src/pragma.h 631a91c8b0e6ca8f051a1d8a4a0da4150e04620a
|
||||
F src/prepare.c 82e5db1013846a819f198336fed72c44c974e7b1
|
||||
F src/printf.c 0c4bcdd1c2e2521024f0a69cb5eb334f86b3652a
|
||||
|
@ -404,7 +404,7 @@ F src/vdbe.c 6d85be995bd2308a5aa2a68c7b564c5d4cc1a6fb
|
|||
F src/vdbe.h 4297a88c5f29b79dda25f486ec26dd6a19dc6036
|
||||
F src/vdbeInt.h 8b54e01ad0463590e7cffabce0bc36da9ee4f816
|
||||
F src/vdbeapi.c bda74ef4b5103d7b4a4be36f936d3cf2b56a7d6f
|
||||
F src/vdbeaux.c b67374bde84ac2acd5dcc42fd6299ea50e8ed415
|
||||
F src/vdbeaux.c 9a10bda8923d5046ce0144dfca0f132a48f14544
|
||||
F src/vdbeblob.c 4f2e8e075d238392df98c5e03a64342465b03f90
|
||||
F src/vdbemem.c ae38a0d35ae71cf604381a887c170466ba518090
|
||||
F src/vdbesort.c f5009e7a35e3065635d8918b9a31f498a499976b
|
||||
|
@ -1380,7 +1380,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
|
|||
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
|
||||
F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b
|
||||
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
|
||||
P a3b35ddeca8f459e81105ab6477f3c5afb9b96d5
|
||||
R 14d3a3b046e1487e842b98a1bd4b8e73
|
||||
P 0ea6e5c9fc6b1dd1174c09097be5bf291da4e6c7
|
||||
R ffdc67a15f3e87587ec67dbf739c11e1
|
||||
U drh
|
||||
Z 1260ec354aa98cd7f6537c5c76a659cf
|
||||
Z 0c8a5640caa42ef8a565318b70a0d8e2
|
||||
|
|
|
@ -1 +1 @@
|
|||
0ea6e5c9fc6b1dd1174c09097be5bf291da4e6c7
|
||||
d7f4bdf594e93c848f46901637861c8eed4c34df
|
90
src/pragma.c
90
src/pragma.c
|
@ -180,16 +180,25 @@ static void setOneColumnName(Vdbe *v, const char *z){
|
|||
/*
|
||||
** Generate code to return a single integer value.
|
||||
*/
|
||||
static void returnSingleInt(Parse *pParse, const char *zLabel, i64 value){
|
||||
Vdbe *v = sqlite3GetVdbe(pParse);
|
||||
int nMem = ++pParse->nMem;
|
||||
i64 *pI64 = sqlite3DbMallocRaw(pParse->db, sizeof(value));
|
||||
if( pI64 ){
|
||||
memcpy(pI64, &value, sizeof(value));
|
||||
}
|
||||
sqlite3VdbeAddOp4(v, OP_Int64, 0, nMem, 0, (char*)pI64, P4_INT64);
|
||||
static void returnSingleInt(Vdbe *v, const char *zLabel, i64 value){
|
||||
sqlite3VdbeAddOp4Dup8(v, OP_Int64, 0, 1, 0, (const u8*)&value, P4_INT64);
|
||||
setOneColumnName(v, zLabel);
|
||||
sqlite3VdbeAddOp2(v, OP_ResultRow, nMem, 1);
|
||||
sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1);
|
||||
}
|
||||
|
||||
/*
|
||||
** Generate code to return a single text value.
|
||||
*/
|
||||
static void returnSingleText(
|
||||
Vdbe *v, /* Prepared statement under construction */
|
||||
const char *zLabel, /* Name of the result column */
|
||||
const char *zValue /* Value to be returned */
|
||||
){
|
||||
if( zValue ){
|
||||
sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, (const char*)zValue, 0);
|
||||
setOneColumnName(v, zLabel);
|
||||
sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -353,13 +362,8 @@ void sqlite3Pragma(
|
|||
db->busyHandler.nBusy = 0;
|
||||
rc = sqlite3_file_control(db, zDb, SQLITE_FCNTL_PRAGMA, (void*)aFcntl);
|
||||
if( rc==SQLITE_OK ){
|
||||
if( aFcntl[0] ){
|
||||
int nMem = ++pParse->nMem;
|
||||
sqlite3VdbeAddOp4(v, OP_String8, 0, nMem, 0, aFcntl[0], 0);
|
||||
setOneColumnName(v, "result");
|
||||
sqlite3VdbeAddOp2(v, OP_ResultRow, nMem, 1);
|
||||
sqlite3_free(aFcntl[0]);
|
||||
}
|
||||
returnSingleText(v, "result", aFcntl[0]);
|
||||
sqlite3_free(aFcntl[0]);
|
||||
goto pragma_out;
|
||||
}
|
||||
if( rc!=SQLITE_NOTFOUND ){
|
||||
|
@ -463,7 +467,7 @@ void sqlite3Pragma(
|
|||
assert( pBt!=0 );
|
||||
if( !zRight ){
|
||||
int size = ALWAYS(pBt) ? sqlite3BtreeGetPageSize(pBt) : 0;
|
||||
returnSingleInt(pParse, "page_size", size);
|
||||
returnSingleInt(v, "page_size", size);
|
||||
}else{
|
||||
/* Malloc may fail when setting the page-size, as there is an internal
|
||||
** buffer that the pager module resizes using sqlite3_realloc().
|
||||
|
@ -498,7 +502,7 @@ void sqlite3Pragma(
|
|||
}
|
||||
}
|
||||
b = sqlite3BtreeSecureDelete(pBt, b);
|
||||
returnSingleInt(pParse, "secure_delete", b);
|
||||
returnSingleInt(v, "secure_delete", b);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -577,9 +581,7 @@ void sqlite3Pragma(
|
|||
if( eMode==PAGER_LOCKINGMODE_EXCLUSIVE ){
|
||||
zRet = "exclusive";
|
||||
}
|
||||
setOneColumnName(v, "locking_mode");
|
||||
sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, zRet, 0);
|
||||
sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1);
|
||||
returnSingleText(v, "locking_mode", zRet);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -638,7 +640,7 @@ void sqlite3Pragma(
|
|||
if( iLimit<-1 ) iLimit = -1;
|
||||
}
|
||||
iLimit = sqlite3PagerJournalSizeLimit(pPager, iLimit);
|
||||
returnSingleInt(pParse, "journal_size_limit", iLimit);
|
||||
returnSingleInt(v, "journal_size_limit", iLimit);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -656,7 +658,7 @@ void sqlite3Pragma(
|
|||
Btree *pBt = pDb->pBt;
|
||||
assert( pBt!=0 );
|
||||
if( !zRight ){
|
||||
returnSingleInt(pParse, "auto_vacuum", sqlite3BtreeGetAutoVacuum(pBt));
|
||||
returnSingleInt(v, "auto_vacuum", sqlite3BtreeGetAutoVacuum(pBt));
|
||||
}else{
|
||||
int eAuto = getAutoVacuum(zRight);
|
||||
assert( eAuto>=0 && eAuto<=2 );
|
||||
|
@ -734,7 +736,7 @@ void sqlite3Pragma(
|
|||
assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
|
||||
if( !zRight ){
|
||||
if( sqlite3ReadSchema(pParse) ) goto pragma_out;
|
||||
returnSingleInt(pParse, "cache_size", pDb->pSchema->cache_size);
|
||||
returnSingleInt(v, "cache_size", pDb->pSchema->cache_size);
|
||||
}else{
|
||||
int size = sqlite3Atoi(zRight);
|
||||
pDb->pSchema->cache_size = size;
|
||||
|
@ -780,7 +782,7 @@ void sqlite3Pragma(
|
|||
rc = SQLITE_OK;
|
||||
#endif
|
||||
if( rc==SQLITE_OK ){
|
||||
returnSingleInt(pParse, "mmap_size", sz);
|
||||
returnSingleInt(v, "mmap_size", sz);
|
||||
}else if( rc!=SQLITE_NOTFOUND ){
|
||||
pParse->nErr++;
|
||||
pParse->rc = rc;
|
||||
|
@ -801,7 +803,7 @@ void sqlite3Pragma(
|
|||
*/
|
||||
case PragTyp_TEMP_STORE: {
|
||||
if( !zRight ){
|
||||
returnSingleInt(pParse, "temp_store", db->temp_store);
|
||||
returnSingleInt(v, "temp_store", db->temp_store);
|
||||
}else{
|
||||
changeTempStorage(pParse, zRight);
|
||||
}
|
||||
|
@ -820,11 +822,7 @@ void sqlite3Pragma(
|
|||
*/
|
||||
case PragTyp_TEMP_STORE_DIRECTORY: {
|
||||
if( !zRight ){
|
||||
if( sqlite3_temp_directory ){
|
||||
setOneColumnName(v, "temp_store_diretory");
|
||||
sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, sqlite3_temp_directory, 0);
|
||||
sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1);
|
||||
}
|
||||
returnSingleText(v, "temp_store_directory", sqlite3_temp_directory);
|
||||
}else{
|
||||
#ifndef SQLITE_OMIT_WSD
|
||||
if( zRight[0] ){
|
||||
|
@ -868,11 +866,7 @@ void sqlite3Pragma(
|
|||
*/
|
||||
case PragTyp_DATA_STORE_DIRECTORY: {
|
||||
if( !zRight ){
|
||||
if( sqlite3_data_directory ){
|
||||
setOneColumnName(v, "data_store_directory");
|
||||
sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, sqlite3_data_directory, 0);
|
||||
sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1);
|
||||
}
|
||||
returnSingleText(v, "data_store_directory", sqlite3_data_directory);
|
||||
}else{
|
||||
#ifndef SQLITE_OMIT_WSD
|
||||
if( zRight[0] ){
|
||||
|
@ -911,12 +905,7 @@ void sqlite3Pragma(
|
|||
sqlite3_file *pFile = sqlite3PagerFile(pPager);
|
||||
sqlite3OsFileControlHint(pFile, SQLITE_GET_LOCKPROXYFILE,
|
||||
&proxy_file_path);
|
||||
|
||||
if( proxy_file_path ){
|
||||
setOneColumnName(v, "lock_proxy_file");
|
||||
sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, proxy_file_path, 0);
|
||||
sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1);
|
||||
}
|
||||
returnSingleText(v, "lock_proxy_file", proxy_file_path);
|
||||
}else{
|
||||
Pager *pPager = sqlite3BtreePager(pDb->pBt);
|
||||
sqlite3_file *pFile = sqlite3PagerFile(pPager);
|
||||
|
@ -948,7 +937,7 @@ void sqlite3Pragma(
|
|||
*/
|
||||
case PragTyp_SYNCHRONOUS: {
|
||||
if( !zRight ){
|
||||
returnSingleInt(pParse, "synchronous", pDb->safety_level-1);
|
||||
returnSingleInt(v, "synchronous", pDb->safety_level-1);
|
||||
}else{
|
||||
if( !db->autoCommit ){
|
||||
sqlite3ErrorMsg(pParse,
|
||||
|
@ -967,7 +956,7 @@ void sqlite3Pragma(
|
|||
#ifndef SQLITE_OMIT_FLAG_PRAGMAS
|
||||
case PragTyp_FLAG: {
|
||||
if( zRight==0 ){
|
||||
returnSingleInt(pParse, pPragma->zName, (db->flags & pPragma->iArg)!=0 );
|
||||
returnSingleInt(v, pPragma->zName, (db->flags & pPragma->iArg)!=0 );
|
||||
}else{
|
||||
int mask = pPragma->iArg; /* Mask of bits to set or clear. */
|
||||
if( db->autoCommit==0 ){
|
||||
|
@ -1641,13 +1630,10 @@ void sqlite3Pragma(
|
|||
const struct EncName *pEnc;
|
||||
if( !zRight ){ /* "PRAGMA encoding" */
|
||||
if( sqlite3ReadSchema(pParse) ) goto pragma_out;
|
||||
setOneColumnName(v, "encoding");
|
||||
sqlite3VdbeAddOp2(v, OP_String8, 0, 1);
|
||||
assert( encnames[SQLITE_UTF8].enc==SQLITE_UTF8 );
|
||||
assert( encnames[SQLITE_UTF16LE].enc==SQLITE_UTF16LE );
|
||||
assert( encnames[SQLITE_UTF16BE].enc==SQLITE_UTF16BE );
|
||||
sqlite3VdbeChangeP4(v, -1, encnames[ENC(pParse->db)].zName, P4_STATIC);
|
||||
sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1);
|
||||
returnSingleText(v, "encoding", encnames[ENC(pParse->db)].zName);
|
||||
}else{ /* "PRAGMA encoding = XXX" */
|
||||
/* Only change the value of sqlite.enc if the database handle is not
|
||||
** initialized. If the main database exists, the new sqlite.enc value
|
||||
|
@ -1796,7 +1782,7 @@ void sqlite3Pragma(
|
|||
if( zRight ){
|
||||
sqlite3_wal_autocheckpoint(db, sqlite3Atoi(zRight));
|
||||
}
|
||||
returnSingleInt(pParse, "wal_autocheckpoint",
|
||||
returnSingleInt(v, "wal_autocheckpoint",
|
||||
db->xWalCallback==sqlite3WalDefaultHook ?
|
||||
SQLITE_PTR_TO_INT(db->pWalArg) : 0);
|
||||
}
|
||||
|
@ -1829,7 +1815,7 @@ void sqlite3Pragma(
|
|||
if( zRight ){
|
||||
sqlite3_busy_timeout(db, sqlite3Atoi(zRight));
|
||||
}
|
||||
returnSingleInt(pParse, "timeout", db->busyTimeout);
|
||||
returnSingleInt(v, "timeout", db->busyTimeout);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1849,7 +1835,7 @@ void sqlite3Pragma(
|
|||
if( zRight && sqlite3DecOrHexToI64(zRight, &N)==SQLITE_OK ){
|
||||
sqlite3_soft_heap_limit64(N);
|
||||
}
|
||||
returnSingleInt(pParse, "soft_heap_limit", sqlite3_soft_heap_limit64(-1));
|
||||
returnSingleInt(v, "soft_heap_limit", sqlite3_soft_heap_limit64(-1));
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1868,7 +1854,7 @@ void sqlite3Pragma(
|
|||
){
|
||||
sqlite3_limit(db, SQLITE_LIMIT_WORKER_THREADS, (int)(N&0x7fffffff));
|
||||
}
|
||||
returnSingleInt(pParse, "threads",
|
||||
returnSingleInt(v, "threads",
|
||||
sqlite3_limit(db, SQLITE_LIMIT_WORKER_THREADS, -1));
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -237,7 +237,8 @@ int sqlite3VdbeAddOp4(
|
|||
}
|
||||
|
||||
/*
|
||||
** Add an opcode that includes the p4 value with a P4_INT64 type.
|
||||
** Add an opcode that includes the p4 value with a P4_INT64 or
|
||||
** P4_REAL type.
|
||||
*/
|
||||
int sqlite3VdbeAddOp4Dup8(
|
||||
Vdbe *p, /* Add the opcode to this VM */
|
||||
|
|
Loading…
Reference in New Issue