|
|
@@ -280,7 +280,7 @@ extern "C" {
|
|
|
*/
|
|
|
#define SQLITE_VERSION "3.8.8"
|
|
|
#define SQLITE_VERSION_NUMBER 3008008
|
|
|
-#define SQLITE_SOURCE_ID "2015-01-30 20:59:27 42d5601739c90434e5adfda8fa99ef7b903877db"
|
|
|
+#define SQLITE_SOURCE_ID "2015-02-07 15:16:35 5df02f50f8348dfde4fc15126abc7b7ef7803e69"
|
|
|
|
|
|
/*
|
|
|
** CAPI3REF: Run-Time Library Version Numbers
|
|
|
@@ -77057,12 +77057,17 @@ SQLITE_API int sqlite3_blob_open(
|
|
|
Incrblob *pBlob = 0;
|
|
|
|
|
|
#ifdef SQLITE_ENABLE_API_ARMOR
|
|
|
- if( !sqlite3SafetyCheckOk(db) || ppBlob==0 || zTable==0 ){
|
|
|
+ if( ppBlob==0 ){
|
|
|
return SQLITE_MISUSE_BKPT;
|
|
|
}
|
|
|
#endif
|
|
|
- flags = !!flags; /* flags = (flags ? 1 : 0); */
|
|
|
*ppBlob = 0;
|
|
|
+#ifdef SQLITE_ENABLE_API_ARMOR
|
|
|
+ if( !sqlite3SafetyCheckOk(db) || zTable==0 ){
|
|
|
+ return SQLITE_MISUSE_BKPT;
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ flags = !!flags; /* flags = (flags ? 1 : 0); */
|
|
|
|
|
|
sqlite3_mutex_enter(db->mutex);
|
|
|
|
|
|
@@ -77276,7 +77281,7 @@ static int blobReadWrite(
|
|
|
sqlite3_mutex_enter(db->mutex);
|
|
|
v = (Vdbe*)p->pStmt;
|
|
|
|
|
|
- if( n<0 || iOffset<0 || (iOffset+n)>p->nByte ){
|
|
|
+ if( n<0 || iOffset<0 || ((sqlite3_int64)iOffset+n)>p->nByte ){
|
|
|
/* Request is out of range. Return a transient error. */
|
|
|
rc = SQLITE_ERROR;
|
|
|
}else if( v==0 ){
|
|
|
@@ -102330,11 +102335,18 @@ SQLITE_PRIVATE void sqlite3AutoLoadExtensions(sqlite3 *db){
|
|
|
#endif
|
|
|
|
|
|
/***************************************************************************
|
|
|
-** The next block of code, including the PragTyp_XXXX macro definitions and
|
|
|
-** the aPragmaName[] object is composed of generated code. DO NOT EDIT.
|
|
|
-**
|
|
|
-** To add new pragmas, edit the code in ../tool/mkpragmatab.tcl and rerun
|
|
|
-** that script. Then copy/paste the output in place of the following:
|
|
|
+** The "pragma.h" include file is an automatically generated file that
|
|
|
+** that includes the PragType_XXXX macro definitions and the aPragmaName[]
|
|
|
+** object. This ensures that the aPragmaName[] table is arranged in
|
|
|
+** lexicographical order to facility a binary search of the pragma name.
|
|
|
+** Do not edit pragma.h directly. Edit and rerun the script in at
|
|
|
+** ../tool/mkpragmatab.tcl. */
|
|
|
+/************** Include pragma.h in the middle of pragma.c *******************/
|
|
|
+/************** Begin file pragma.h ******************************************/
|
|
|
+/* DO NOT EDIT!
|
|
|
+** This file is automatically generated by the script at
|
|
|
+** ../tool/mkpragmatab.tcl. To update the set of pragmas, edit
|
|
|
+** that script and rerun it.
|
|
|
*/
|
|
|
#define PragTyp_HEADER_VALUE 0
|
|
|
#define PragTyp_AUTO_VACUUM 1
|
|
|
@@ -102569,6 +102581,10 @@ static const struct sPragmaNames {
|
|
|
/* ePragTyp: */ PragTyp_INDEX_LIST,
|
|
|
/* ePragFlag: */ PragFlag_NeedSchema,
|
|
|
/* iArg: */ 0 },
|
|
|
+ { /* zName: */ "index_xinfo",
|
|
|
+ /* ePragTyp: */ PragTyp_INDEX_INFO,
|
|
|
+ /* ePragFlag: */ PragFlag_NeedSchema,
|
|
|
+ /* iArg: */ 1 },
|
|
|
#endif
|
|
|
#if !defined(SQLITE_OMIT_INTEGRITY_CHECK)
|
|
|
{ /* zName: */ "integrity_check",
|
|
|
@@ -102785,9 +102801,10 @@ static const struct sPragmaNames {
|
|
|
/* iArg: */ SQLITE_WriteSchema|SQLITE_RecoveryMode },
|
|
|
#endif
|
|
|
};
|
|
|
-/* Number of pragmas: 58 on by default, 71 total. */
|
|
|
-/* End of the automatically generated pragma table.
|
|
|
-***************************************************************************/
|
|
|
+/* Number of pragmas: 59 on by default, 72 total. */
|
|
|
+
|
|
|
+/************** End of pragma.h **********************************************/
|
|
|
+/************** Continuing where we left off in pragma.c *********************/
|
|
|
|
|
|
/*
|
|
|
** Interpret the given string as a safety level. Return 0 for OFF,
|
|
|
@@ -103040,6 +103057,7 @@ SQLITE_PRIVATE void sqlite3Pragma(
|
|
|
sqlite3 *db = pParse->db; /* The database connection */
|
|
|
Db *pDb; /* The specific database being pragmaed */
|
|
|
Vdbe *v = sqlite3GetVdbe(pParse); /* Prepared statement */
|
|
|
+ const struct sPragmaNames *pPragma;
|
|
|
|
|
|
if( v==0 ) return;
|
|
|
sqlite3VdbeRunOnlyOnce(v);
|
|
|
@@ -103117,14 +103135,15 @@ SQLITE_PRIVATE void sqlite3Pragma(
|
|
|
}
|
|
|
}
|
|
|
if( lwr>upr ) goto pragma_out;
|
|
|
+ pPragma = &aPragmaNames[mid];
|
|
|
|
|
|
/* Make sure the database schema is loaded if the pragma requires that */
|
|
|
- if( (aPragmaNames[mid].mPragFlag & PragFlag_NeedSchema)!=0 ){
|
|
|
+ if( (pPragma->mPragFlag & PragFlag_NeedSchema)!=0 ){
|
|
|
if( sqlite3ReadSchema(pParse) ) goto pragma_out;
|
|
|
}
|
|
|
|
|
|
/* Jump to the appropriate pragma handler */
|
|
|
- switch( aPragmaNames[mid].ePragTyp ){
|
|
|
+ switch( pPragma->ePragTyp ){
|
|
|
|
|
|
#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && !defined(SQLITE_OMIT_DEPRECATED)
|
|
|
/*
|
|
|
@@ -103703,10 +103722,9 @@ SQLITE_PRIVATE void sqlite3Pragma(
|
|
|
#ifndef SQLITE_OMIT_FLAG_PRAGMAS
|
|
|
case PragTyp_FLAG: {
|
|
|
if( zRight==0 ){
|
|
|
- returnSingleInt(pParse, aPragmaNames[mid].zName,
|
|
|
- (db->flags & aPragmaNames[mid].iArg)!=0 );
|
|
|
+ returnSingleInt(pParse, pPragma->zName, (db->flags & pPragma->iArg)!=0 );
|
|
|
}else{
|
|
|
- int mask = aPragmaNames[mid].iArg; /* Mask of bits to set or clear. */
|
|
|
+ int mask = pPragma->iArg; /* Mask of bits to set or clear. */
|
|
|
if( db->autoCommit==0 ){
|
|
|
/* Foreign key support may not be enabled or disabled while not
|
|
|
** in auto-commit mode. */
|
|
|
@@ -103835,20 +103853,30 @@ SQLITE_PRIVATE void sqlite3Pragma(
|
|
|
pIdx = sqlite3FindIndex(db, zRight, zDb);
|
|
|
if( pIdx ){
|
|
|
int i;
|
|
|
+ int mx = pPragma->iArg ? pIdx->nColumn : pIdx->nKeyCol;
|
|
|
pTab = pIdx->pTable;
|
|
|
- sqlite3VdbeSetNumCols(v, 3);
|
|
|
- pParse->nMem = 3;
|
|
|
+ sqlite3VdbeSetNumCols(v, 6);
|
|
|
+ pParse->nMem = 6;
|
|
|
sqlite3CodeVerifySchema(pParse, iDb);
|
|
|
sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seqno", SQLITE_STATIC);
|
|
|
sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "cid", SQLITE_STATIC);
|
|
|
sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "name", SQLITE_STATIC);
|
|
|
- for(i=0; i<pIdx->nKeyCol; i++){
|
|
|
+ sqlite3VdbeSetColName(v, 3, COLNAME_NAME, "desc", SQLITE_STATIC);
|
|
|
+ sqlite3VdbeSetColName(v, 4, COLNAME_NAME, "coll", SQLITE_STATIC);
|
|
|
+ sqlite3VdbeSetColName(v, 5, COLNAME_NAME, "key", SQLITE_STATIC);
|
|
|
+ for(i=0; i<mx; i++){
|
|
|
i16 cnum = pIdx->aiColumn[i];
|
|
|
sqlite3VdbeAddOp2(v, OP_Integer, i, 1);
|
|
|
sqlite3VdbeAddOp2(v, OP_Integer, cnum, 2);
|
|
|
- assert( pTab->nCol>cnum );
|
|
|
- sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, pTab->aCol[cnum].zName, 0);
|
|
|
- sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 3);
|
|
|
+ if( cnum<0 ){
|
|
|
+ sqlite3VdbeAddOp2(v, OP_Null, 0, 3);
|
|
|
+ }else{
|
|
|
+ sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, pTab->aCol[cnum].zName, 0);
|
|
|
+ }
|
|
|
+ sqlite3VdbeAddOp2(v, OP_Integer, pIdx->aSortOrder[i], 4);
|
|
|
+ sqlite3VdbeAddOp4(v, OP_String8, 0, 5, 0, pIdx->azColl[i], 0);
|
|
|
+ sqlite3VdbeAddOp2(v, OP_Integer, i<pIdx->nKeyCol, 6);
|
|
|
+ sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 6);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -103861,17 +103889,22 @@ SQLITE_PRIVATE void sqlite3Pragma(
|
|
|
pTab = sqlite3FindTable(db, zRight, zDb);
|
|
|
if( pTab ){
|
|
|
v = sqlite3GetVdbe(pParse);
|
|
|
- sqlite3VdbeSetNumCols(v, 3);
|
|
|
- pParse->nMem = 3;
|
|
|
+ sqlite3VdbeSetNumCols(v, 5);
|
|
|
+ pParse->nMem = 5;
|
|
|
sqlite3CodeVerifySchema(pParse, iDb);
|
|
|
sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seq", SQLITE_STATIC);
|
|
|
sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "name", SQLITE_STATIC);
|
|
|
sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "unique", SQLITE_STATIC);
|
|
|
+ sqlite3VdbeSetColName(v, 3, COLNAME_NAME, "origin", SQLITE_STATIC);
|
|
|
+ sqlite3VdbeSetColName(v, 4, COLNAME_NAME, "partial", SQLITE_STATIC);
|
|
|
for(pIdx=pTab->pIndex, i=0; pIdx; pIdx=pIdx->pNext, i++){
|
|
|
+ const char *azOrigin[] = { "c", "u", "pk" };
|
|
|
sqlite3VdbeAddOp2(v, OP_Integer, i, 1);
|
|
|
sqlite3VdbeAddOp4(v, OP_String8, 0, 2, 0, pIdx->zName, 0);
|
|
|
sqlite3VdbeAddOp2(v, OP_Integer, IsUniqueIndex(pIdx), 3);
|
|
|
- sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 3);
|
|
|
+ sqlite3VdbeAddOp4(v, OP_String8, 0, 4, 0, azOrigin[pIdx->idxType], 0);
|
|
|
+ sqlite3VdbeAddOp2(v, OP_Integer, pIdx->pPartIdxWhere!=0, 5);
|
|
|
+ sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 5);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -104441,9 +104474,9 @@ SQLITE_PRIVATE void sqlite3Pragma(
|
|
|
** applications for any purpose.
|
|
|
*/
|
|
|
case PragTyp_HEADER_VALUE: {
|
|
|
- int iCookie = aPragmaNames[mid].iArg; /* Which cookie to read or write */
|
|
|
+ int iCookie = pPragma->iArg; /* Which cookie to read or write */
|
|
|
sqlite3VdbeUsesBtree(v, iDb);
|
|
|
- if( zRight && (aPragmaNames[mid].mPragFlag & PragFlag_ReadOnly)==0 ){
|
|
|
+ if( zRight && (pPragma->mPragFlag & PragFlag_ReadOnly)==0 ){
|
|
|
/* Write the specified cookie value */
|
|
|
static const VdbeOpList setCookie[] = {
|
|
|
{ OP_Transaction, 0, 1, 0}, /* 0 */
|
|
|
@@ -104563,7 +104596,7 @@ SQLITE_PRIVATE void sqlite3Pragma(
|
|
|
** disables the timeout.
|
|
|
*/
|
|
|
/*case PragTyp_BUSY_TIMEOUT*/ default: {
|
|
|
- assert( aPragmaNames[mid].ePragTyp==PragTyp_BUSY_TIMEOUT );
|
|
|
+ assert( pPragma->ePragTyp==PragTyp_BUSY_TIMEOUT );
|
|
|
if( zRight ){
|
|
|
sqlite3_busy_timeout(db, sqlite3Atoi(zRight));
|
|
|
}
|
|
|
@@ -130460,12 +130493,14 @@ SQLITE_API int sqlite3_test_control(int op, ...){
|
|
|
*/
|
|
|
case SQLITE_TESTCTRL_IMPOSTER: {
|
|
|
sqlite3 *db = va_arg(ap, sqlite3*);
|
|
|
+ sqlite3_mutex_enter(db->mutex);
|
|
|
db->init.iDb = sqlite3FindDbName(db, va_arg(ap,const char*));
|
|
|
db->init.busy = db->init.imposterTable = va_arg(ap,int);
|
|
|
db->init.newTnum = va_arg(ap,int);
|
|
|
if( db->init.busy==0 && db->init.newTnum>0 ){
|
|
|
sqlite3ResetAllSchemasOfConnection(db);
|
|
|
}
|
|
|
+ sqlite3_mutex_leave(db->mutex);
|
|
|
break;
|
|
|
}
|
|
|
}
|