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

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

?? build.c

?? 這是一個嵌入式系統上運行的輕量級數據庫
?? C
?? 第 1 頁 / 共 5 頁
字號:
  Parse *pParse,   /* Parser context */  Token *pStart,   /* The "CREATE" token */  Token *pName,    /* Name of table or view to create */  int isTemp,      /* True if this is a TEMP table */  int isView       /* True if this is a VIEW */){  Table *pTable;  Index *pIdx;  char *zName;  sqlite *db = pParse->db;  Vdbe *v;  int iDb;  pParse->sFirstToken = *pStart;  zName = sqliteTableNameFromToken(pName);  if( zName==0 ) return;  if( db->init.iDb==1 ) isTemp = 1;#ifndef SQLITE_OMIT_AUTHORIZATION  assert( (isTemp & 1)==isTemp );  {    int code;    char *zDb = isTemp ? "temp" : "main";    if( sqliteAuthCheck(pParse, SQLITE_INSERT, SCHEMA_TABLE(isTemp), 0, zDb) ){      sqliteFree(zName);      return;    }    if( isView ){      if( isTemp ){        code = SQLITE_CREATE_TEMP_VIEW;      }else{        code = SQLITE_CREATE_VIEW;      }    }else{      if( isTemp ){        code = SQLITE_CREATE_TEMP_TABLE;      }else{        code = SQLITE_CREATE_TABLE;      }    }    if( sqliteAuthCheck(pParse, code, zName, 0, zDb) ){      sqliteFree(zName);      return;    }  }#endif   /* Before trying to create a temporary table, make sure the Btree for  ** holding temporary tables is open.  */  if( isTemp && db->aDb[1].pBt==0 && !pParse->explain ){    int rc = sqliteBtreeFactory(db, 0, 0, MAX_PAGES, &db->aDb[1].pBt);    if( rc!=SQLITE_OK ){      sqliteErrorMsg(pParse, "unable to open a temporary database "        "file for storing temporary tables");      pParse->nErr++;      return;    }    if( db->flags & SQLITE_InTrans ){      rc = sqliteBtreeBeginTrans(db->aDb[1].pBt);      if( rc!=SQLITE_OK ){        sqliteErrorMsg(pParse, "unable to get a write lock on "          "the temporary database file");        return;      }    }  }  /* Make sure the new table name does not collide with an existing  ** index or table name.  Issue an error message if it does.  **  ** If we are re-reading the sqlite_master table because of a schema  ** change and a new permanent table is found whose name collides with  ** an existing temporary table, that is not an error.  */  pTable = sqliteFindTable(db, zName, 0);  iDb = isTemp ? 1 : db->init.iDb;  if( pTable!=0 && (pTable->iDb==iDb || !db->init.busy) ){    sqliteErrorMsg(pParse, "table %T already exists", pName);    sqliteFree(zName);    return;  }  if( (pIdx = sqliteFindIndex(db, zName, 0))!=0 &&          (pIdx->iDb==0 || !db->init.busy) ){    sqliteErrorMsg(pParse, "there is already an index named %s", zName);    sqliteFree(zName);    return;  }  pTable = sqliteMalloc( sizeof(Table) );  if( pTable==0 ){    sqliteFree(zName);    return;  }  pTable->zName = zName;  pTable->nCol = 0;  pTable->aCol = 0;  pTable->iPKey = -1;  pTable->pIndex = 0;  pTable->iDb = iDb;  if( pParse->pNewTable ) sqliteDeleteTable(db, pParse->pNewTable);  pParse->pNewTable = pTable;  /* Begin generating the code that will insert the table record into  ** the SQLITE_MASTER table.  Note in particular that we must go ahead  ** and allocate the record number for the table entry now.  Before any  ** PRIMARY KEY or UNIQUE keywords are parsed.  Those keywords will cause  ** indices to be created and the table record must come before the   ** indices.  Hence, the record number for the table must be allocated  ** now.  */  if( !db->init.busy && (v = sqliteGetVdbe(pParse))!=0 ){    sqliteBeginWriteOperation(pParse, 0, isTemp);    if( !isTemp ){      sqliteVdbeAddOp(v, OP_Integer, db->file_format, 0);      sqliteVdbeAddOp(v, OP_SetCookie, 0, 1);    }    sqliteOpenMasterTable(v, isTemp);    sqliteVdbeAddOp(v, OP_NewRecno, 0, 0);    sqliteVdbeAddOp(v, OP_Dup, 0, 0);    sqliteVdbeAddOp(v, OP_String, 0, 0);    sqliteVdbeAddOp(v, OP_PutIntKey, 0, 0);  }}/*** Add a new column to the table currently being constructed.**** The parser calls this routine once for each column declaration** in a CREATE TABLE statement.  sqliteStartTable() gets called** first to get things going.  Then this routine is called for each** column.*/void sqliteAddColumn(Parse *pParse, Token *pName){  Table *p;  int i;  char *z = 0;  Column *pCol;  if( (p = pParse->pNewTable)==0 ) return;  sqliteSetNString(&z, pName->z, pName->n, 0);  if( z==0 ) return;  sqliteDequote(z);  for(i=0; i<p->nCol; i++){    if( sqliteStrICmp(z, p->aCol[i].zName)==0 ){      sqliteErrorMsg(pParse, "duplicate column name: %s", z);      sqliteFree(z);      return;    }  }  if( (p->nCol & 0x7)==0 ){    Column *aNew;    aNew = sqliteRealloc( p->aCol, (p->nCol+8)*sizeof(p->aCol[0]));    if( aNew==0 ) return;    p->aCol = aNew;  }  pCol = &p->aCol[p->nCol];  memset(pCol, 0, sizeof(p->aCol[0]));  pCol->zName = z;  pCol->sortOrder = SQLITE_SO_NUM;  p->nCol++;}/*** This routine is called by the parser while in the middle of** parsing a CREATE TABLE statement.  A "NOT NULL" constraint has** been seen on a column.  This routine sets the notNull flag on** the column currently under construction.*/void sqliteAddNotNull(Parse *pParse, int onError){  Table *p;  int i;  if( (p = pParse->pNewTable)==0 ) return;  i = p->nCol-1;  if( i>=0 ) p->aCol[i].notNull = onError;}/*** This routine is called by the parser while in the middle of** parsing a CREATE TABLE statement.  The pFirst token is the first** token in the sequence of tokens that describe the type of the** column currently under construction.   pLast is the last token** in the sequence.  Use this information to construct a string** that contains the typename of the column and store that string** in zType.*/ void sqliteAddColumnType(Parse *pParse, Token *pFirst, Token *pLast){  Table *p;  int i, j;  int n;  char *z, **pz;  Column *pCol;  if( (p = pParse->pNewTable)==0 ) return;  i = p->nCol-1;  if( i<0 ) return;  pCol = &p->aCol[i];  pz = &pCol->zType;  n = pLast->n + Addr(pLast->z) - Addr(pFirst->z);  sqliteSetNString(pz, pFirst->z, n, 0);  z = *pz;  if( z==0 ) return;  for(i=j=0; z[i]; i++){    int c = z[i];    if( isspace(c) ) continue;    z[j++] = c;  }  z[j] = 0;  if( pParse->db->file_format>=4 ){    pCol->sortOrder = sqliteCollateType(z, n);  }else{    pCol->sortOrder = SQLITE_SO_NUM;  }}/*** The given token is the default value for the last column added to** the table currently under construction.  If "minusFlag" is true, it** means the value token was preceded by a minus sign.**** This routine is called by the parser while in the middle of** parsing a CREATE TABLE statement.*/void sqliteAddDefaultValue(Parse *pParse, Token *pVal, int minusFlag){  Table *p;  int i;  char **pz;  if( (p = pParse->pNewTable)==0 ) return;  i = p->nCol-1;  if( i<0 ) return;  pz = &p->aCol[i].zDflt;  if( minusFlag ){    sqliteSetNString(pz, "-", 1, pVal->z, pVal->n, 0);  }else{    sqliteSetNString(pz, pVal->z, pVal->n, 0);  }  sqliteDequote(*pz);}/*** Designate the PRIMARY KEY for the table.  pList is a list of names ** of columns that form the primary key.  If pList is NULL, then the** most recently added column of the table is the primary key.**** A table can have at most one primary key.  If the table already has** a primary key (and this is the second primary key) then create an** error.**** If the PRIMARY KEY is on a single column whose datatype is INTEGER,** then we will try to use that column as the row id.  (Exception:** For backwards compatibility with older databases, do not do this** if the file format version number is less than 1.)  Set the Table.iPKey** field of the table under construction to be the index of the** INTEGER PRIMARY KEY column.  Table.iPKey is set to -1 if there is** no INTEGER PRIMARY KEY.**** If the key is not an INTEGER PRIMARY KEY, then create a unique** index for the key.  No index is created for INTEGER PRIMARY KEYs.*/void sqliteAddPrimaryKey(Parse *pParse, IdList *pList, int onError){  Table *pTab = pParse->pNewTable;  char *zType = 0;  int iCol = -1, i;  if( pTab==0 ) goto primary_key_exit;  if( pTab->hasPrimKey ){    sqliteErrorMsg(pParse,       "table \"%s\" has more than one primary key", pTab->zName);    goto primary_key_exit;  }  pTab->hasPrimKey = 1;  if( pList==0 ){    iCol = pTab->nCol - 1;    pTab->aCol[iCol].isPrimKey = 1;  }else{    for(i=0; i<pList->nId; i++){      for(iCol=0; iCol<pTab->nCol; iCol++){        if( sqliteStrICmp(pList->a[i].zName, pTab->aCol[iCol].zName)==0 ) break;      }      if( iCol<pTab->nCol ) pTab->aCol[iCol].isPrimKey = 1;    }    if( pList->nId>1 ) iCol = -1;  }  if( iCol>=0 && iCol<pTab->nCol ){    zType = pTab->aCol[iCol].zType;  }  if( pParse->db->file_format>=1 &&            zType && sqliteStrICmp(zType, "INTEGER")==0 ){    pTab->iPKey = iCol;    pTab->keyConf = onError;  }else{    sqliteCreateIndex(pParse, 0, 0, pList, onError, 0, 0);    pList = 0;  }primary_key_exit:  sqliteIdListDelete(pList);  return;}/*** Return the appropriate collating type given a type name.**** The collation type is text (SQLITE_SO_TEXT) if the type** name contains the character stream "text" or "blob" or** "clob".  Any other type name is collated as numeric** (SQLITE_SO_NUM).*/int sqliteCollateType(const char *zType, int nType){  int i;  for(i=0; i<nType-3; i++){    int c = *(zType++) | 0x60;    if( (c=='b' || c=='c') && sqliteStrNICmp(zType, "lob", 3)==0 ){      return SQLITE_SO_TEXT;    }    if( c=='c' && sqliteStrNICmp(zType, "har", 3)==0 ){      return SQLITE_SO_TEXT;    }    if( c=='t' && sqliteStrNICmp(zType, "ext", 3)==0 ){      return SQLITE_SO_TEXT;    }  }  return SQLITE_SO_NUM;}/*** This routine is called by the parser while in the middle of** parsing a CREATE TABLE statement.  A "COLLATE" clause has** been seen on a column.  This routine sets the Column.sortOrder on** the column currently under construction.*/void sqliteAddCollateType(Parse *pParse, int collType){  Table *p;  int i;  if( (p = pParse->pNewTable)==0 ) return;  i = p->nCol-1;  if( i>=0 ) p->aCol[i].sortOrder = collType;}/*** Come up with a new random value for the schema cookie.  Make sure** the new value is different from the old.**** The schema cookie is used to determine when the schema for the** database changes.  After each schema change, the cookie value** changes.  When a process first reads the schema it records the** cookie.  Thereafter, whenever it goes to access the database,** it checks the cookie to make sure the schema has not changed** since it was last read.**** This plan is not completely bullet-proof.  It is possible for** the schema to change multiple times and for the cookie to be** set back to prior value.  But schema changes are infrequent** and the probability of hitting the same cookie value is only** 1 chance in 2^32.  So we're safe enough.*/void sqliteChangeCookie(sqlite *db, Vdbe *v){  if( db->next_cookie==db->aDb[0].schema_cookie ){    unsigned char r;    sqliteRandomness(1, &r);    db->next_cookie = db->aDb[0].schema_cookie + r + 1;    db->flags |= SQLITE_InternChanges;    sqliteVdbeAddOp(v, OP_Integer, db->next_cookie, 0);    sqliteVdbeAddOp(v, OP_SetCookie, 0, 0);  }}/*** Measure the number of characters needed to output the given** identifier.  The number returned includes any quotes used** but does not include the null terminator.*/static int identLength(const char *z){  int n;  int needQuote = 0;  for(n=0; *z; n++, z++){    if( *z=='\'' ){ n++; needQuote=1; }  }  return n + needQuote*2;}/*** Write an identifier onto the end of the given string.  Add** quote characters as needed.*/static void identPut(char *z, int *pIdx, char *zIdent){  int i, j, needQuote;  i = *pIdx;  for(j=0; zIdent[j]; j++){    if( !isalnum(zIdent[j]) && zIdent[j]!='_' ) break;  }  needQuote =  zIdent[j]!=0 || isdigit(zIdent[0])                  || sqliteKeywordCode(zIdent, j)!=TK_ID;  if( needQuote ) z[i++] = '\'';  for(j=0; zIdent[j]; j++){    z[i++] = zIdent[j];    if( zIdent[j]=='\'' ) z[i++] = '\'';  }  if( needQuote ) z[i++] = '\'';  z[i] = 0;  *pIdx = i;}/*** Generate a CREATE TABLE statement appropriate for the given** table.  Memory to hold the text of the statement is obtained** from sqliteMalloc() and must be freed by the calling function.*/static char *createTableStmt(Table *p){  int i, k, n;  char *zStmt;  char *zSep, *zSep2, *zEnd;  n = 0;  for(i=0; i<p->nCol; i++){    n += identLength(p->aCol[i].zName);  }  n += identLength(p->zName);  if( n<40 ){    zSep = "";    zSep2 = ",";    zEnd = ")";  }else{    zSep = "\n  ";    zSep2 = ",\n  ";    zEnd = "\n)";  }  n += 35 + 6*p->nCol;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美视频一区二| 亚洲无人区一区| 懂色av一区二区三区蜜臀| 日韩欧美一区在线| 久久精品国产成人一区二区三区| 久久精品夜色噜噜亚洲a∨| 韩国成人精品a∨在线观看| 久久综合一区二区| 国产**成人网毛片九色| 中文在线资源观看网站视频免费不卡| 国产成a人亚洲| 亚洲少妇30p| 91麻豆精品国产91久久久久| 日本vs亚洲vs韩国一区三区二区 | 在线观看91av| 美女精品一区二区| 欧美国产在线观看| 色综合久久综合网97色综合 | 久久蜜臀精品av| 99久久er热在这里只有精品66| 国产精品第四页| 欧美专区日韩专区| 九色综合狠狠综合久久| 中文字幕在线播放不卡一区| 欧美丝袜丝交足nylons| 久久精品999| 亚洲人吸女人奶水| 日韩一区二区三区高清免费看看| 国产综合久久久久久久久久久久| 国产欧美日韩精品在线| 在线观看av一区| 国产一区二区在线视频| 一区二区三区蜜桃| 国产喂奶挤奶一区二区三区| 欧美私模裸体表演在线观看| 国产曰批免费观看久久久| 亚洲精品视频在线看| 精品免费国产一区二区三区四区| 99精品视频免费在线观看| 奇米精品一区二区三区在线观看| 国产午夜精品理论片a级大结局| 日本精品一区二区三区四区的功能| 日本麻豆一区二区三区视频| 国产精品福利一区二区三区| 欧美丰满高潮xxxx喷水动漫| 波多野洁衣一区| 看国产成人h片视频| 一区二区三区高清不卡| 欧美激情一区二区三区蜜桃视频| 欧美精品精品一区| 91老师片黄在线观看| 在线视频亚洲一区| 国产一区二区免费看| 三级影片在线观看欧美日韩一区二区| 国产精品网站在线观看| 日韩一区二区三区精品视频| 一本到不卡免费一区二区| 国产精品一区二区免费不卡| 青青草成人在线观看| 亚洲国产精品久久艾草纯爱| 中文字幕五月欧美| 国产日韩视频一区二区三区| 精品久久久久久久久久久院品网 | 欧美精品一二三| 日本乱人伦aⅴ精品| kk眼镜猥琐国模调教系列一区二区 | www.日韩av| 国产成人在线视频网址| 久久精品国产秦先生| 婷婷丁香久久五月婷婷| 夜夜嗨av一区二区三区四季av| 中文字幕高清不卡| 国产性色一区二区| 久久久国产一区二区三区四区小说| 日韩一级成人av| 日韩视频国产视频| 欧美大片一区二区| 日韩欧美第一区| 日韩美一区二区三区| 日韩三级精品电影久久久| 91精品国产综合久久小美女| 欧美美女一区二区| 欧美一区二区三区四区视频| 在线综合亚洲欧美在线视频| 欧美精品aⅴ在线视频| 欧美精品在线观看一区二区| 欧美精品丝袜中出| 欧美一级生活片| 久久综合精品国产一区二区三区 | 精品对白一区国产伦| 五月天亚洲婷婷| 日日摸夜夜添夜夜添精品视频| 亚洲国产欧美在线人成| 日韩中文欧美在线| 久久激情五月激情| 国产黄人亚洲片| 91在线视频播放| 欧美日韩另类一区| 欧美一区二区福利在线| 精品国产免费一区二区三区香蕉| 久久中文娱乐网| 1024国产精品| 日韩在线一区二区三区| 国产乱人伦偷精品视频不卡| 成人91在线观看| 欧美日韩精品一二三区| 精品成人在线观看| 综合在线观看色| 偷拍一区二区三区| 韩国av一区二区三区在线观看| 国产传媒欧美日韩成人| 91久久奴性调教| 欧美成人性战久久| 国产精品久久久爽爽爽麻豆色哟哟| 一区二区高清在线| 久久成人久久鬼色| 色欲综合视频天天天| 欧美一二三区在线| 国产精品久久久久久久久晋中| 性欧美大战久久久久久久久| 国产精品综合网| 欧美四级电影网| 国产精品女上位| 毛片一区二区三区| 91视频91自| 精品国产伦一区二区三区观看方式| ●精品国产综合乱码久久久久| 日韩一区欧美二区| 99热精品国产| 日韩欧美中文字幕精品| 亚洲精品中文在线影院| 美女国产一区二区三区| 91香蕉视频黄| 久久人人爽爽爽人久久久| 亚洲国产精品人人做人人爽| 国产suv一区二区三区88区| 欧美精品乱人伦久久久久久| 成人欧美一区二区三区1314| 九九精品一区二区| 欧美日韩精品一二三区| 亚洲免费在线看| 国产.欧美.日韩| 欧美va亚洲va| 日韩电影免费在线| 在线观看亚洲成人| 日韩毛片精品高清免费| 国产成人免费在线视频| 欧美成人乱码一区二区三区| 亚洲国产精品一区二区尤物区| 成人午夜电影久久影院| 2020国产精品| 久久爱另类一区二区小说| 欧美欧美欧美欧美首页| 一区二区三区久久| 91啪亚洲精品| 亚洲欧美在线高清| 不卡视频在线观看| 欧美激情一区二区三区在线| 国产尤物一区二区| 一区二区三区四区乱视频| 9色porny自拍视频一区二区| 国产欧美日韩在线看| 狠狠狠色丁香婷婷综合久久五月| 欧美一区二区三区爱爱| 日韩国产欧美在线播放| 欧美日韩精品一区视频| 亚洲国产精品一区二区久久| 91精品福利视频| 亚洲精品老司机| 欧美午夜片在线观看| 一区二区三区四区蜜桃| 欧美三区免费完整视频在线观看| 亚洲精品欧美专区| 在线视频国内一区二区| 亚洲一区二区在线观看视频 | 欧美色图12p| 亚洲第一综合色| 欧美一区二区三区在线看| 蜜桃精品视频在线| 精品国产乱码久久久久久久 | 欧美国产一区视频在线观看| 丁香六月综合激情| **欧美大码日韩| 日本韩国精品在线| 丝袜国产日韩另类美女| 欧美成人三级在线| 国产大陆a不卡| 亚洲欧美日韩系列| 欧美放荡的少妇| 狠狠色综合色综合网络| 中文字幕第一区| 在线看一区二区| 蜜臀久久99精品久久久画质超高清| 精品日韩成人av| 99视频一区二区三区| 午夜精品久久久久久久久久| 精品美女在线观看| 99久久免费视频.com| 亚洲午夜视频在线| 久久综合九色欧美综合狠狠 |