⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pragma.c

📁 最新的sqlite3.6.2源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
      }    }else{      if( zRight[0] ){        int res;        sqlite3OsAccess(db->pVfs, zRight, SQLITE_ACCESS_READWRITE, &res);        if( res==0 ){          sqlite3ErrorMsg(pParse, "not a writable directory");          goto pragma_out;        }      }      if( SQLITE_TEMP_STORE==0       || (SQLITE_TEMP_STORE==1 && db->temp_store<=1)       || (SQLITE_TEMP_STORE==2 && db->temp_store==1)      ){        invalidateTempStorage(pParse);      }      sqlite3_free(sqlite3_temp_directory);      if( zRight[0] ){        sqlite3_temp_directory = sqlite3DbStrDup(0, zRight);      }else{        sqlite3_temp_directory = 0;      }    }  }else  /*  **   PRAGMA [database.]synchronous  **   PRAGMA [database.]synchronous=OFF|ON|NORMAL|FULL  **  ** Return or set the local value of the synchronous flag.  Changing  ** the local value does not make changes to the disk file and the  ** default value will be restored the next time the database is  ** opened.  */  if( sqlite3StrICmp(zLeft,"synchronous")==0 ){    if( sqlite3ReadSchema(pParse) ) goto pragma_out;    if( !zRight ){      returnSingleInt(pParse, "synchronous", pDb->safety_level-1);    }else{      if( !db->autoCommit ){        sqlite3ErrorMsg(pParse,             "Safety level may not be changed inside a transaction");      }else{        pDb->safety_level = getSafetyLevel(zRight)+1;      }    }  }else#endif /* SQLITE_OMIT_PAGER_PRAGMAS */#ifndef SQLITE_OMIT_FLAG_PRAGMAS  if( flagPragma(pParse, zLeft, zRight) ){    /* The flagPragma() subroutine also generates any necessary code    ** there is nothing more to do here */  }else#endif /* SQLITE_OMIT_FLAG_PRAGMAS */#ifndef SQLITE_OMIT_SCHEMA_PRAGMAS  /*  **   PRAGMA table_info(<table>)  **  ** Return a single row for each column of the named table. The columns of  ** the returned data set are:  **  ** cid:        Column id (numbered from left to right, starting at 0)  ** name:       Column name  ** type:       Column declaration type.  ** notnull:    True if 'NOT NULL' is part of column declaration  ** dflt_value: The default value for the column, if any.  */  if( sqlite3StrICmp(zLeft, "table_info")==0 && zRight ){    Table *pTab;    if( sqlite3ReadSchema(pParse) ) goto pragma_out;    pTab = sqlite3FindTable(db, zRight, zDb);    if( pTab ){      int i;      int nHidden = 0;      Column *pCol;      sqlite3VdbeSetNumCols(v, 6);      pParse->nMem = 6;      sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "cid", P4_STATIC);      sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "name", P4_STATIC);      sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "type", P4_STATIC);      sqlite3VdbeSetColName(v, 3, COLNAME_NAME, "notnull", P4_STATIC);      sqlite3VdbeSetColName(v, 4, COLNAME_NAME, "dflt_value", P4_STATIC);      sqlite3VdbeSetColName(v, 5, COLNAME_NAME, "pk", P4_STATIC);      sqlite3ViewGetColumnNames(pParse, pTab);      for(i=0, pCol=pTab->aCol; i<pTab->nCol; i++, pCol++){        const Token *pDflt;        if( IsHiddenColumn(pCol) ){          nHidden++;          continue;        }        sqlite3VdbeAddOp2(v, OP_Integer, i-nHidden, 1);        sqlite3VdbeAddOp4(v, OP_String8, 0, 2, 0, pCol->zName, 0);        sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0,           pCol->zType ? pCol->zType : "", 0);        sqlite3VdbeAddOp2(v, OP_Integer, pCol->notNull, 4);        if( pCol->pDflt && (pDflt = &pCol->pDflt->span)->z ){          sqlite3VdbeAddOp4(v, OP_String8, 0, 5, 0, (char*)pDflt->z, pDflt->n);        }else{          sqlite3VdbeAddOp2(v, OP_Null, 0, 5);        }        sqlite3VdbeAddOp2(v, OP_Integer, pCol->isPrimKey, 6);        sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 6);      }    }  }else  if( sqlite3StrICmp(zLeft, "index_info")==0 && zRight ){    Index *pIdx;    Table *pTab;    if( sqlite3ReadSchema(pParse) ) goto pragma_out;    pIdx = sqlite3FindIndex(db, zRight, zDb);    if( pIdx ){      int i;      pTab = pIdx->pTable;      sqlite3VdbeSetNumCols(v, 3);      pParse->nMem = 3;      sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seqno", P4_STATIC);      sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "cid", P4_STATIC);      sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "name", P4_STATIC);      for(i=0; i<pIdx->nColumn; i++){        int 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);      }    }  }else  if( sqlite3StrICmp(zLeft, "index_list")==0 && zRight ){    Index *pIdx;    Table *pTab;    if( sqlite3ReadSchema(pParse) ) goto pragma_out;    pTab = sqlite3FindTable(db, zRight, zDb);    if( pTab ){      v = sqlite3GetVdbe(pParse);      pIdx = pTab->pIndex;      if( pIdx ){        int i = 0;         sqlite3VdbeSetNumCols(v, 3);        pParse->nMem = 3;        sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seq", P4_STATIC);        sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "name", P4_STATIC);        sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "unique", P4_STATIC);        while(pIdx){          sqlite3VdbeAddOp2(v, OP_Integer, i, 1);          sqlite3VdbeAddOp4(v, OP_String8, 0, 2, 0, pIdx->zName, 0);          sqlite3VdbeAddOp2(v, OP_Integer, pIdx->onError!=OE_None, 3);          sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 3);          ++i;          pIdx = pIdx->pNext;        }      }    }  }else  if( sqlite3StrICmp(zLeft, "database_list")==0 ){    int i;    if( sqlite3ReadSchema(pParse) ) goto pragma_out;    sqlite3VdbeSetNumCols(v, 3);    pParse->nMem = 3;    sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seq", P4_STATIC);    sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "name", P4_STATIC);    sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "file", P4_STATIC);    for(i=0; i<db->nDb; i++){      if( db->aDb[i].pBt==0 ) continue;      assert( db->aDb[i].zName!=0 );      sqlite3VdbeAddOp2(v, OP_Integer, i, 1);      sqlite3VdbeAddOp4(v, OP_String8, 0, 2, 0, db->aDb[i].zName, 0);      sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0,           sqlite3BtreeGetFilename(db->aDb[i].pBt), 0);      sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 3);    }  }else  if( sqlite3StrICmp(zLeft, "collation_list")==0 ){    int i = 0;    HashElem *p;    sqlite3VdbeSetNumCols(v, 2);    pParse->nMem = 2;    sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seq", P4_STATIC);    sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "name", P4_STATIC);    for(p=sqliteHashFirst(&db->aCollSeq); p; p=sqliteHashNext(p)){      CollSeq *pColl = (CollSeq *)sqliteHashData(p);      sqlite3VdbeAddOp2(v, OP_Integer, i++, 1);      sqlite3VdbeAddOp4(v, OP_String8, 0, 2, 0, pColl->zName, 0);      sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 2);    }  }else#endif /* SQLITE_OMIT_SCHEMA_PRAGMAS */#ifndef SQLITE_OMIT_FOREIGN_KEY  if( sqlite3StrICmp(zLeft, "foreign_key_list")==0 && zRight ){    FKey *pFK;    Table *pTab;    if( sqlite3ReadSchema(pParse) ) goto pragma_out;    pTab = sqlite3FindTable(db, zRight, zDb);    if( pTab ){      v = sqlite3GetVdbe(pParse);      pFK = pTab->pFKey;      if( pFK ){        int i = 0;         sqlite3VdbeSetNumCols(v, 5);        pParse->nMem = 5;        sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "id", P4_STATIC);        sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "seq", P4_STATIC);        sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "table", P4_STATIC);        sqlite3VdbeSetColName(v, 3, COLNAME_NAME, "from", P4_STATIC);        sqlite3VdbeSetColName(v, 4, COLNAME_NAME, "to", P4_STATIC);        while(pFK){          int j;          for(j=0; j<pFK->nCol; j++){            char *zCol = pFK->aCol[j].zCol;            sqlite3VdbeAddOp2(v, OP_Integer, i, 1);            sqlite3VdbeAddOp2(v, OP_Integer, j, 2);            sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, pFK->zTo, 0);            sqlite3VdbeAddOp4(v, OP_String8, 0, 4, 0,                              pTab->aCol[pFK->aCol[j].iFrom].zName, 0);            sqlite3VdbeAddOp4(v, zCol ? OP_String8 : OP_Null, 0, 5, 0, zCol, 0);            sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 5);          }          ++i;          pFK = pFK->pNextFrom;        }      }    }  }else#endif /* !defined(SQLITE_OMIT_FOREIGN_KEY) */#ifndef NDEBUG  if( sqlite3StrICmp(zLeft, "parser_trace")==0 ){    if( zRight ){      if( getBoolean(zRight) ){        sqlite3ParserTrace(stderr, "parser: ");      }else{        sqlite3ParserTrace(0, 0);      }    }  }else#endif  /* Reinstall the LIKE and GLOB functions.  The variant of LIKE  ** used will be case sensitive or not depending on the RHS.  */  if( sqlite3StrICmp(zLeft, "case_sensitive_like")==0 ){    if( zRight ){      sqlite3RegisterLikeFunctions(db, getBoolean(zRight));    }  }else#ifndef SQLITE_INTEGRITY_CHECK_ERROR_MAX# define SQLITE_INTEGRITY_CHECK_ERROR_MAX 100#endif#ifndef SQLITE_OMIT_INTEGRITY_CHECK  /* Pragma "quick_check" is an experimental reduced version of   ** integrity_check designed to detect most database corruption  ** without most of the overhead of a full integrity-check.  */  if( sqlite3StrICmp(zLeft, "integrity_check")==0   || sqlite3StrICmp(zLeft, "quick_check")==0   ){    int i, j, addr, mxErr;    /* Code that appears at the end of the integrity check.  If no error    ** messages have been generated, output OK.  Otherwise output the    ** error message    */    static const VdbeOpList endCode[] = {      { OP_AddImm,      1, 0,        0},    /* 0 */      { OP_IfNeg,       1, 0,        0},    /* 1 */      { OP_String8,     0, 3,        0},    /* 2 */      { OP_ResultRow,   3, 1,        0},    };    int isQuick = (zLeft[0]=='q');    /* Initialize the VDBE program */    if( sqlite3ReadSchema(pParse) ) goto pragma_out;    pParse->nMem = 6;    sqlite3VdbeSetNumCols(v, 1);    sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "integrity_check", P4_STATIC);    /* Set the maximum error count */    mxErr = SQLITE_INTEGRITY_CHECK_ERROR_MAX;    if( zRight ){      mxErr = atoi(zRight);      if( mxErr<=0 ){        mxErr = SQLITE_INTEGRITY_CHECK_ERROR_MAX;      }    }    sqlite3VdbeAddOp2(v, OP_Integer, mxErr, 1);  /* reg[1] holds errors left */    /* Do an integrity check on each database file */    for(i=0; i<db->nDb; i++){      HashElem *x;      Hash *pTbls;      int cnt = 0;      if( OMIT_TEMPDB && i==1 ) continue;      sqlite3CodeVerifySchema(pParse, i);      addr = sqlite3VdbeAddOp1(v, OP_IfPos, 1); /* Halt if out of errors */      sqlite3VdbeAddOp2(v, OP_Halt, 0, 0);      sqlite3VdbeJumpHere(v, addr);      /* Do an integrity check of the B-Tree      **      ** Begin by filling registers 2, 3, ... with the root pages numbers      ** for all tables and indices in the database.      */      pTbls = &db->aDb[i].pSchema->tblHash;      for(x=sqliteHashFirst(pTbls); x; x=sqliteHashNext(x)){        Table *pTab = sqliteHashData(x);        Index *pIdx;        sqlite3VdbeAddOp2(v, OP_Integer, pTab->tnum, 2+cnt);        cnt++;        for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){          sqlite3VdbeAddOp2(v, OP_Integer, pIdx->tnum, 2+cnt);          cnt++;        }      }      if( cnt==0 ) continue;      /* Make sure sufficient number of registers have been allocated */      if( pParse->nMem < cnt+4 ){        pParse->nMem = cnt+4;      }      /* Do the b-tree integrity checks */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -