亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? build.c

?? 這是一個嵌入式系統(tǒng)上運行的輕量級數據庫
?? C
?? 第 1 頁 / 共 5 頁
字號:
  zStmt = sqliteMallocRaw( n );  if( zStmt==0 ) return 0;  strcpy(zStmt, p->iDb==1 ? "CREATE TEMP TABLE " : "CREATE TABLE ");  k = strlen(zStmt);  identPut(zStmt, &k, p->zName);  zStmt[k++] = '(';  for(i=0; i<p->nCol; i++){    strcpy(&zStmt[k], zSep);    k += strlen(&zStmt[k]);    zSep = zSep2;    identPut(zStmt, &k, p->aCol[i].zName);  }  strcpy(&zStmt[k], zEnd);  return zStmt;}/*** This routine is called to report the final ")" that terminates** a CREATE TABLE statement.**** The table structure that other action routines have been building** is added to the internal hash tables, assuming no errors have** occurred.**** An entry for the table is made in the master table on disk, unless** this is a temporary table or db->init.busy==1.  When db->init.busy==1** it means we are reading the sqlite_master table because we just** connected to the database or because the sqlite_master table has** recently changes, so the entry for this table already exists in** the sqlite_master table.  We do not want to create it again.**** If the pSelect argument is not NULL, it means that this routine** was called to create a table generated from a ** "CREATE TABLE ... AS SELECT ..." statement.  The column names of** the new table will match the result set of the SELECT.*/void sqliteEndTable(Parse *pParse, Token *pEnd, Select *pSelect){  Table *p;  sqlite *db = pParse->db;  if( (pEnd==0 && pSelect==0) || pParse->nErr || sqlite_malloc_failed ) return;  p = pParse->pNewTable;  if( p==0 ) return;  /* If the table is generated from a SELECT, then construct the  ** list of columns and the text of the table.  */  if( pSelect ){    Table *pSelTab = sqliteResultSetOfSelect(pParse, 0, pSelect);    if( pSelTab==0 ) return;    assert( p->aCol==0 );    p->nCol = pSelTab->nCol;    p->aCol = pSelTab->aCol;    pSelTab->nCol = 0;    pSelTab->aCol = 0;    sqliteDeleteTable(0, pSelTab);  }  /* If the db->init.busy is 1 it means we are reading the SQL off the  ** "sqlite_master" or "sqlite_temp_master" table on the disk.  ** So do not write to the disk again.  Extract the root page number  ** for the table from the db->init.newTnum field.  (The page number  ** should have been put there by the sqliteOpenCb routine.)  */  if( db->init.busy ){    p->tnum = db->init.newTnum;  }  /* If not initializing, then create a record for the new table  ** in the SQLITE_MASTER table of the database.  The record number  ** for the new table entry should already be on the stack.  **  ** If this is a TEMPORARY table, write the entry into the auxiliary  ** file instead of into the main database file.  */  if( !db->init.busy ){    int n;    Vdbe *v;    v = sqliteGetVdbe(pParse);    if( v==0 ) return;    if( p->pSelect==0 ){      /* A regular table */      sqliteVdbeOp3(v, OP_CreateTable, 0, p->iDb, (char*)&p->tnum, P3_POINTER);    }else{      /* A view */      sqliteVdbeAddOp(v, OP_Integer, 0, 0);    }    p->tnum = 0;    sqliteVdbeAddOp(v, OP_Pull, 1, 0);    sqliteVdbeOp3(v, OP_String, 0, 0, p->pSelect==0?"table":"view", P3_STATIC);    sqliteVdbeOp3(v, OP_String, 0, 0, p->zName, 0);    sqliteVdbeOp3(v, OP_String, 0, 0, p->zName, 0);    sqliteVdbeAddOp(v, OP_Dup, 4, 0);    sqliteVdbeAddOp(v, OP_String, 0, 0);    if( pSelect ){      char *z = createTableStmt(p);      n = z ? strlen(z) : 0;      sqliteVdbeChangeP3(v, -1, z, n);      sqliteFree(z);    }else{      assert( pEnd!=0 );      n = Addr(pEnd->z) - Addr(pParse->sFirstToken.z) + 1;      sqliteVdbeChangeP3(v, -1, pParse->sFirstToken.z, n);    }    sqliteVdbeAddOp(v, OP_MakeRecord, 5, 0);    sqliteVdbeAddOp(v, OP_PutIntKey, 0, 0);    if( !p->iDb ){      sqliteChangeCookie(db, v);    }    sqliteVdbeAddOp(v, OP_Close, 0, 0);    if( pSelect ){      sqliteVdbeAddOp(v, OP_Integer, p->iDb, 0);      sqliteVdbeAddOp(v, OP_OpenWrite, 1, 0);      pParse->nTab = 2;      sqliteSelect(pParse, pSelect, SRT_Table, 1, 0, 0, 0);    }    sqliteEndWriteOperation(pParse);  }  /* Add the table to the in-memory representation of the database.  */  if( pParse->explain==0 && pParse->nErr==0 ){    Table *pOld;    FKey *pFKey;    pOld = sqliteHashInsert(&db->aDb[p->iDb].tblHash,                             p->zName, strlen(p->zName)+1, p);    if( pOld ){      assert( p==pOld );  /* Malloc must have failed inside HashInsert() */      return;    }    for(pFKey=p->pFKey; pFKey; pFKey=pFKey->pNextFrom){      int nTo = strlen(pFKey->zTo) + 1;      pFKey->pNextTo = sqliteHashFind(&db->aDb[p->iDb].aFKey, pFKey->zTo, nTo);      sqliteHashInsert(&db->aDb[p->iDb].aFKey, pFKey->zTo, nTo, pFKey);    }    pParse->pNewTable = 0;    db->nTable++;    db->flags |= SQLITE_InternChanges;  }}/*** The parser calls this routine in order to create a new VIEW*/void sqliteCreateView(  Parse *pParse,     /* The parsing context */  Token *pBegin,     /* The CREATE token that begins the statement */  Token *pName,      /* The token that holds the name of the view */  Select *pSelect,   /* A SELECT statement that will become the new view */  int isTemp         /* TRUE for a TEMPORARY view */){  Table *p;  int n;  const char *z;  Token sEnd;  DbFixer sFix;  sqliteStartTable(pParse, pBegin, pName, isTemp, 1);  p = pParse->pNewTable;  if( p==0 || pParse->nErr ){    sqliteSelectDelete(pSelect);    return;  }  if( sqliteFixInit(&sFix, pParse, p->iDb, "view", pName)    && sqliteFixSelect(&sFix, pSelect)  ){    sqliteSelectDelete(pSelect);    return;  }  /* Make a copy of the entire SELECT statement that defines the view.  ** This will force all the Expr.token.z values to be dynamically  ** allocated rather than point to the input string - which means that  ** they will persist after the current sqlite_exec() call returns.  */  p->pSelect = sqliteSelectDup(pSelect);  sqliteSelectDelete(pSelect);  if( !pParse->db->init.busy ){    sqliteViewGetColumnNames(pParse, p);  }  /* Locate the end of the CREATE VIEW statement.  Make sEnd point to  ** the end.  */  sEnd = pParse->sLastToken;  if( sEnd.z[0]!=0 && sEnd.z[0]!=';' ){    sEnd.z += sEnd.n;  }  sEnd.n = 0;  n = sEnd.z - pBegin->z;  z = pBegin->z;  while( n>0 && (z[n-1]==';' || isspace(z[n-1])) ){ n--; }  sEnd.z = &z[n-1];  sEnd.n = 1;  /* Use sqliteEndTable() to add the view to the SQLITE_MASTER table */  sqliteEndTable(pParse, &sEnd, 0);  return;}/*** The Table structure pTable is really a VIEW.  Fill in the names of** the columns of the view in the pTable structure.  Return the number** of errors.  If an error is seen leave an error message in pParse->zErrMsg.*/int sqliteViewGetColumnNames(Parse *pParse, Table *pTable){  ExprList *pEList;  Select *pSel;  Table *pSelTab;  int nErr = 0;  assert( pTable );  /* A positive nCol means the columns names for this view are  ** already known.  */  if( pTable->nCol>0 ) return 0;  /* A negative nCol is a special marker meaning that we are currently  ** trying to compute the column names.  If we enter this routine with  ** a negative nCol, it means two or more views form a loop, like this:  **  **     CREATE VIEW one AS SELECT * FROM two;  **     CREATE VIEW two AS SELECT * FROM one;  **  ** Actually, this error is caught previously and so the following test  ** should always fail.  But we will leave it in place just to be safe.  */  if( pTable->nCol<0 ){    sqliteErrorMsg(pParse, "view %s is circularly defined", pTable->zName);    return 1;  }  /* If we get this far, it means we need to compute the table names.  */  assert( pTable->pSelect ); /* If nCol==0, then pTable must be a VIEW */  pSel = pTable->pSelect;  /* Note that the call to sqliteResultSetOfSelect() will expand any  ** "*" elements in this list.  But we will need to restore the list  ** back to its original configuration afterwards, so we save a copy of  ** the original in pEList.  */  pEList = pSel->pEList;  pSel->pEList = sqliteExprListDup(pEList);  if( pSel->pEList==0 ){    pSel->pEList = pEList;    return 1;  /* Malloc failed */  }  pTable->nCol = -1;  pSelTab = sqliteResultSetOfSelect(pParse, 0, pSel);  if( pSelTab ){    assert( pTable->aCol==0 );    pTable->nCol = pSelTab->nCol;    pTable->aCol = pSelTab->aCol;    pSelTab->nCol = 0;    pSelTab->aCol = 0;    sqliteDeleteTable(0, pSelTab);    DbSetProperty(pParse->db, pTable->iDb, DB_UnresetViews);  }else{    pTable->nCol = 0;    nErr++;  }  sqliteSelectUnbind(pSel);  sqliteExprListDelete(pSel->pEList);  pSel->pEList = pEList;  return nErr;  }/*** Clear the column names from the VIEW pTable.**** This routine is called whenever any other table or view is modified.** The view passed into this routine might depend directly or indirectly** on the modified or deleted table so we need to clear the old column** names so that they will be recomputed.*/static void sqliteViewResetColumnNames(Table *pTable){  int i;  Column *pCol;  assert( pTable!=0 && pTable->pSelect!=0 );  for(i=0, pCol=pTable->aCol; i<pTable->nCol; i++, pCol++){    sqliteFree(pCol->zName);    sqliteFree(pCol->zDflt);    sqliteFree(pCol->zType);  }  sqliteFree(pTable->aCol);  pTable->aCol = 0;  pTable->nCol = 0;}/*** Clear the column names from every VIEW in database idx.*/static void sqliteViewResetAll(sqlite *db, int idx){  HashElem *i;  if( !DbHasProperty(db, idx, DB_UnresetViews) ) return;  for(i=sqliteHashFirst(&db->aDb[idx].tblHash); i; i=sqliteHashNext(i)){    Table *pTab = sqliteHashData(i);    if( pTab->pSelect ){      sqliteViewResetColumnNames(pTab);    }  }  DbClearProperty(db, idx, DB_UnresetViews);}/*** Given a token, look up a table with that name.  If not found, leave** an error for the parser to find and return NULL.*/Table *sqliteTableFromToken(Parse *pParse, Token *pTok){  char *zName;  Table *pTab;  zName = sqliteTableNameFromToken(pTok);  if( zName==0 ) return 0;  pTab = sqliteFindTable(pParse->db, zName, 0);  sqliteFree(zName);  if( pTab==0 ){    sqliteErrorMsg(pParse, "no such table: %T", pTok);  }  return pTab;}/*** This routine is called to do the work of a DROP TABLE statement.** pName is the name of the table to be dropped.*/void sqliteDropTable(Parse *pParse, Token *pName, int isView){  Table *pTable;  Vdbe *v;  int base;  sqlite *db = pParse->db;  int iDb;  if( pParse->nErr || sqlite_malloc_failed ) return;  pTable = sqliteTableFromToken(pParse, pName);  if( pTable==0 ) return;  iDb = pTable->iDb;  assert( iDb>=0 && iDb<db->nDb );#ifndef SQLITE_OMIT_AUTHORIZATION  {    int code;    const char *zTab = SCHEMA_TABLE(pTable->iDb);    const char *zDb = db->aDb[pTable->iDb].zName;    if( sqliteAuthCheck(pParse, SQLITE_DELETE, zTab, 0, zDb)){      return;    }    if( isView ){      if( iDb==1 ){        code = SQLITE_DROP_TEMP_VIEW;      }else{        code = SQLITE_DROP_VIEW;      }    }else{      if( iDb==1 ){        code = SQLITE_DROP_TEMP_TABLE;      }else{        code = SQLITE_DROP_TABLE;      }    }    if( sqliteAuthCheck(pParse, code, pTable->zName, 0, zDb) ){      return;    }    if( sqliteAuthCheck(pParse, SQLITE_DELETE, pTable->zName, 0, zDb) ){      return;    }  }#endif  if( pTable->readOnly ){    sqliteErrorMsg(pParse, "table %s may not be dropped", pTable->zName);    pParse->nErr++;    return;  }  if( isView && pTable->pSelect==0 ){    sqliteErrorMsg(pParse, "use DROP TABLE to delete table %s", pTable->zName);    return;  }  if( !isView && pTable->pSelect ){    sqliteErrorMsg(pParse, "use DROP VIEW to delete view %s", pTable->zName);    return;  }  /* Generate code to remove the table from the master table  ** on disk.  */  v = sqliteGetVdbe(pParse);  if( v ){    static VdbeOpList dropTable[] = {      { OP_Rewind,     0, ADDR(8),  0},      { OP_String,     0, 0,        0}, /* 1 */      { OP_MemStore,   1, 1,        0},      { OP_MemLoad,    1, 0,        0}, /* 3 */      { OP_Column,     0, 2,        0},      { OP_Ne,         0, ADDR(7),  0},      { OP_Delete,     0, 0,        0},      { OP_Next,       0, ADDR(3),  0}, /* 7 */    };    Index *pIdx;    Trigger *pTrigger;    sqliteBeginWriteOperation(pParse, 0, pTable->iDb);    /* Drop all triggers associated with the table being dropped */    pTrigger = pTable->pTrigger;    while( pTrigger ){      assert( pTrigger->iDb==pTable->iDb || pTrigger->iDb==1 );      sqliteDropTriggerPtr(pParse, pTrigger, 1);      if( pParse->explain ){        pTrigger = pTrigger->pNext;      }else{        pTrigger = pTable->pTrigger;      }    }    /* Drop all SQLITE_MASTER entries that refer to the table */    sqliteOpenMasterTable(v, pTable->iDb);    base = sqliteVdbeAddOpList(v, ArraySize(dropTable), dropTable);    sqliteVdbeChangeP3(v, base+1, pTable->zName, 0);    /* Drop all SQLITE_TEMP_MASTER entries that refer to the table */    if( pTable->iDb!=1 ){      sqliteOpenMasterTable(v, 1);      base = sqliteVdbeAddOpList(v, ArraySize(dropTable), dropTable);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人av在线播放网站| 在线观看日韩毛片| 欧美在线观看一区| 亚洲精品在线免费播放| 一区二区三区免费网站| 国产一区在线看| 69堂亚洲精品首页| 亚洲三级在线播放| 国产91在线|亚洲| 日韩欧美综合一区| 一区二区成人在线| 成人国产在线观看| 久久精品亚洲国产奇米99| 亚洲成av人片在线观看| 91视频免费看| 国产精品成人免费在线| 国内不卡的二区三区中文字幕| 欧美日韩在线观看一区二区| 中文字幕视频一区二区三区久| 国产高清不卡一区| 精品福利二区三区| 久久精品国产成人一区二区三区| 欧洲另类一二三四区| 亚洲三级免费电影| 91免费观看国产| 国产精品人成在线观看免费| 国内偷窥港台综合视频在线播放| 欧美精品乱码久久久久久按摩| 亚洲综合免费观看高清完整版在线 | 久久久www成人免费无遮挡大片| 日韩精品一二三四| 777精品伊人久久久久大香线蕉| 亚洲地区一二三色| 欧美裸体一区二区三区| 麻豆精品一区二区三区| 欧美日韩夫妻久久| 亚洲h精品动漫在线观看| 欧美午夜精品久久久久久孕妇| 亚洲欧美日韩国产综合在线 | 成人福利视频网站| 中文字幕一区三区| 一本久久a久久精品亚洲| 亚洲三级在线看| 欧美性受极品xxxx喷水| 天堂成人免费av电影一区| 777色狠狠一区二区三区| 日本vs亚洲vs韩国一区三区二区| 91麻豆精品国产91久久久 | 欧美国产1区2区| 成人在线综合网站| 日韩理论片中文av| 欧美午夜不卡在线观看免费| 日本va欧美va精品发布| 久久女同性恋中文字幕| 成人精品视频网站| 亚洲综合在线电影| 欧美一区二区播放| 国产精一区二区三区| 中文字幕制服丝袜一区二区三区 | 日本不卡在线视频| 久久综合色8888| 97国产一区二区| 日韩激情视频在线观看| 国产偷国产偷精品高清尤物| 91香蕉视频mp4| 日本特黄久久久高潮| 国产欧美一区二区精品忘忧草| 91丨九色丨黑人外教| 男男gaygay亚洲| 国产精品免费人成网站| 在线播放欧美女士性生活| 国产酒店精品激情| 亚洲成a人片综合在线| 久久久久99精品国产片| 欧美午夜电影网| 国产成人亚洲综合a∨婷婷| 亚洲综合一二三区| 国产亚洲欧美日韩在线一区| 欧美视频完全免费看| 国产米奇在线777精品观看| 一区二区三区精品在线| 国产欧美日韩在线看| 91麻豆精品国产自产在线观看一区| 国产91精品一区二区麻豆亚洲| 午夜久久电影网| 亚洲另类在线视频| 国产欧美日本一区二区三区| 欧美日韩精品福利| 91亚洲国产成人精品一区二区三 | 国产白丝网站精品污在线入口| 亚洲一区二区四区蜜桃| 国产片一区二区| 91精品国产色综合久久不卡蜜臀| 99久久免费精品| 国产精品自拍三区| 美国毛片一区二区| 天天色图综合网| 一区二区三区高清| |精品福利一区二区三区| 久久久久国产精品厨房| 日韩一区二区视频在线观看| 欧美在线高清视频| 91蝌蚪porny九色| aa级大片欧美| 成人免费视频网站在线观看| 国产又粗又猛又爽又黄91精品| 日韩精品国产精品| 天天爽夜夜爽夜夜爽精品视频| 亚洲一卡二卡三卡四卡| 亚洲精品一二三四区| √…a在线天堂一区| 中文字幕一区二区三中文字幕| 日本一区免费视频| 久久久国产精华| 中文字幕欧美日本乱码一线二线| 久久综合色综合88| 国产日韩欧美精品在线| 久久久久久久网| 欧美国产97人人爽人人喊| 日本一区二区三区四区| 亚洲乱码国产乱码精品精的特点| 中文字幕亚洲一区二区av在线| 亚洲欧美电影一区二区| 亚洲卡通动漫在线| 亚洲一区二区三区爽爽爽爽爽 | 成人午夜激情片| www.成人在线| 色婷婷国产精品| 欧美日韩视频在线第一区 | 日韩一区二区三区电影在线观看| 欧美日韩国产色站一区二区三区| 欧美色爱综合网| 日韩写真欧美这视频| 久久青草欧美一区二区三区| 中文字幕av一区二区三区免费看 | 91麻豆精品国产无毒不卡在线观看 | 精品久久久影院| 国产亚洲精品7777| 亚洲欧洲韩国日本视频| 一区二区三区四区乱视频| 天天综合色天天综合色h| 蜜桃av一区二区| 国产成a人无v码亚洲福利| 色天使色偷偷av一区二区| 欧美精品久久一区二区三区| 久久日韩粉嫩一区二区三区| 日韩美女视频一区二区| 亚洲18女电影在线观看| 国产一区欧美日韩| 91丨九色丨蝌蚪富婆spa| 欧美一区二区在线看| 欧美国产精品一区二区| 亚洲成人黄色影院| 国产精品18久久久| 在线视频欧美精品| 久久中文娱乐网| 一区av在线播放| 国产乱码精品一区二区三区忘忧草| 91色乱码一区二区三区| 日韩欧美成人午夜| 亚洲激情第一区| 精品一区二区三区视频| 欧美主播一区二区三区美女| 精品三级在线看| 亚洲自拍偷拍欧美| 成人一区二区三区视频 | 日韩欧美成人激情| 亚洲免费av观看| 国产精品77777竹菊影视小说| 欧美日韩在线免费视频| 国产精品久久午夜| 国内精品免费在线观看| 欧美日韩在线观看一区二区| 国产精品久久久久毛片软件| 日本女优在线视频一区二区| 一本久久精品一区二区 | 欧美一区午夜视频在线观看| 亚洲欧美一区二区三区国产精品| 韩国女主播一区| 欧美一区二区私人影院日本| 亚洲综合清纯丝袜自拍| 91视频在线看| 国产精品美女久久久久久久久| 奇米777欧美一区二区| 欧美三级日韩在线| 亚洲乱码中文字幕综合| 成人激情黄色小说| 久久一区二区三区国产精品| 日本美女一区二区| 欧美日韩成人在线| 亚洲愉拍自拍另类高清精品| 99精品桃花视频在线观看| 国产午夜精品在线观看| 国精品**一区二区三区在线蜜桃| 91精品欧美久久久久久动漫| 亚洲国产精品麻豆| 欧美日韩一区中文字幕| 亚洲国产另类av| 欧美精品久久久久久久多人混战| 亚洲午夜影视影院在线观看|