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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? trigger.c

?? Trolltech公司發(fā)布的基于C++圖形開發(fā)環(huán)境
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
 * removes it from the internal schema and places it in the trigDrop hash  * table. This is so that the trigger can be restored into the database schema * if the transaction is rolled back. */void sqliteDropTrigger(Parse *pParse, SrcList *pName){  Trigger *pTrigger;  int i;  const char *zDb;  const char *zName;  int nName;  sqlite *db = pParse->db;  if( sqlite_malloc_failed ) goto drop_trigger_cleanup;  assert( pName->nSrc==1 );  zDb = pName->a[0].zDatabase;  zName = pName->a[0].zName;  nName = strlen(zName);  for(i=0; i<db->nDb; i++){    int j = (i<2) ? i^1 : i;  /* Search TEMP before MAIN */    if( zDb && sqliteStrICmp(db->aDb[j].zName, zDb) ) continue;    pTrigger = sqliteHashFind(&(db->aDb[j].trigHash), zName, nName+1);    if( pTrigger ) break;  }  if( !pTrigger ){    sqliteErrorMsg(pParse, "no such trigger: %S", pName, 0);    goto drop_trigger_cleanup;  }  sqliteDropTriggerPtr(pParse, pTrigger, 0);drop_trigger_cleanup:  sqliteSrcListDelete(pName);}/*** Drop a trigger given a pointer to that trigger.  If nested is false,** then also generate code to remove the trigger from the SQLITE_MASTER** table.*/void sqliteDropTriggerPtr(Parse *pParse, Trigger *pTrigger, int nested){  Table   *pTable;  Vdbe *v;  sqlite *db = pParse->db;  assert( pTrigger->iDb<db->nDb );  if( pTrigger->iDb>=2 ){    sqliteErrorMsg(pParse, "triggers may not be removed from "       "auxiliary database %s", db->aDb[pTrigger->iDb].zName);    return;  }  pTable = sqliteFindTable(db, pTrigger->table,db->aDb[pTrigger->iTabDb].zName);  assert(pTable);  assert( pTable->iDb==pTrigger->iDb || pTrigger->iDb==1 );#ifndef SQLITE_OMIT_AUTHORIZATION  {    int code = SQLITE_DROP_TRIGGER;    const char *zDb = db->aDb[pTrigger->iDb].zName;    const char *zTab = SCHEMA_TABLE(pTrigger->iDb);    if( pTrigger->iDb ) code = SQLITE_DROP_TEMP_TRIGGER;    if( sqliteAuthCheck(pParse, code, pTrigger->name, pTable->zName, zDb) ||      sqliteAuthCheck(pParse, SQLITE_DELETE, zTab, 0, zDb) ){      return;    }  }#endif  /* Generate code to destroy the database record of the trigger.  */  if( pTable!=0 && !nested && (v = sqliteGetVdbe(pParse))!=0 ){    int base;    static VdbeOpList dropTrigger[] = {      { OP_Rewind,     0, ADDR(9),  0},      { OP_String,     0, 0,        0}, /* 1 */      { OP_Column,     0, 1,        0},      { OP_Ne,         0, ADDR(8),  0},      { OP_String,     0, 0,        "trigger"},      { OP_Column,     0, 0,        0},      { OP_Ne,         0, ADDR(8),  0},      { OP_Delete,     0, 0,        0},      { OP_Next,       0, ADDR(1),  0}, /* 8 */    };    sqliteBeginWriteOperation(pParse, 0, 0);    sqliteOpenMasterTable(v, pTrigger->iDb);    base = sqliteVdbeAddOpList(v,  ArraySize(dropTrigger), dropTrigger);    sqliteVdbeChangeP3(v, base+1, pTrigger->name, 0);    if( pTrigger->iDb==0 ){      sqliteChangeCookie(db, v);    }    sqliteVdbeAddOp(v, OP_Close, 0, 0);    sqliteEndWriteOperation(pParse);  }  /*   * If this is not an "explain", then delete the trigger structure.   */  if( !pParse->explain ){    const char *zName = pTrigger->name;    int nName = strlen(zName);    if( pTable->pTrigger == pTrigger ){      pTable->pTrigger = pTrigger->pNext;    }else{      Trigger *cc = pTable->pTrigger;      while( cc ){         if( cc->pNext == pTrigger ){          cc->pNext = cc->pNext->pNext;          break;        }        cc = cc->pNext;      }      assert(cc);    }    sqliteHashInsert(&(db->aDb[pTrigger->iDb].trigHash), zName, nName+1, 0);    sqliteDeleteTrigger(pTrigger);  }}/*** pEList is the SET clause of an UPDATE statement.  Each entry** in pEList is of the format <id>=<expr>.  If any of the entries** in pEList have an <id> which matches an identifier in pIdList,** then return TRUE.  If pIdList==NULL, then it is considered a** wildcard that matches anything.  Likewise if pEList==NULL then** it matches anything so always return true.  Return false only** if there is no match.*/static int checkColumnOverLap(IdList *pIdList, ExprList *pEList){  int e;  if( !pIdList || !pEList ) return 1;  for(e=0; e<pEList->nExpr; e++){    if( sqliteIdListIndex(pIdList, pEList->a[e].zName)>=0 ) return 1;  }  return 0; }/* A global variable that is TRUE if we should always set up temp tables for * for triggers, even if there are no triggers to code. This is used to test  * how much overhead the triggers algorithm is causing. * * This flag can be set or cleared using the "trigger_overhead_test" pragma. * The pragma is not documented since it is not really part of the interface * to SQLite, just the test procedure.*/int always_code_trigger_setup = 0;/* * Returns true if a trigger matching op, tr_tm and foreach that is NOT already * on the Parse objects trigger-stack (to prevent recursive trigger firing) is * found in the list specified as pTrigger. */int sqliteTriggersExist(  Parse *pParse,          /* Used to check for recursive triggers */  Trigger *pTrigger,      /* A list of triggers associated with a table */  int op,                 /* one of TK_DELETE, TK_INSERT, TK_UPDATE */  int tr_tm,              /* one of TK_BEFORE, TK_AFTER */  int foreach,            /* one of TK_ROW or TK_STATEMENT */  ExprList *pChanges      /* Columns that change in an UPDATE statement */){  Trigger * pTriggerCursor;  if( always_code_trigger_setup ){    return 1;  }  pTriggerCursor = pTrigger;  while( pTriggerCursor ){    if( pTriggerCursor->op == op && 	pTriggerCursor->tr_tm == tr_tm && 	pTriggerCursor->foreach == foreach &&	checkColumnOverLap(pTriggerCursor->pColumns, pChanges) ){      TriggerStack * ss;      ss = pParse->trigStack;      while( ss && ss->pTrigger != pTrigger ){	ss = ss->pNext;      }      if( !ss )return 1;    }    pTriggerCursor = pTriggerCursor->pNext;  }  return 0;}/*** Convert the pStep->target token into a SrcList and return a pointer** to that SrcList.**** This routine adds a specific database name, if needed, to the target when** forming the SrcList.  This prevents a trigger in one database from** referring to a target in another database.  An exception is when the** trigger is in TEMP in which case it can refer to any other database it** wants.*/static SrcList *targetSrcList(  Parse *pParse,       /* The parsing context */  TriggerStep *pStep   /* The trigger containing the target token */){  Token sDb;           /* Dummy database name token */  int iDb;             /* Index of the database to use */  SrcList *pSrc;       /* SrcList to be returned */  iDb = pStep->pTrig->iDb;  if( iDb==0 || iDb>=2 ){    assert( iDb<pParse->db->nDb );    sDb.z = pParse->db->aDb[iDb].zName;    sDb.n = strlen(sDb.z);    pSrc = sqliteSrcListAppend(0, &sDb, &pStep->target);  } else {    pSrc = sqliteSrcListAppend(0, &pStep->target, 0);  }  return pSrc;}/*** Generate VDBE code for zero or more statements inside the body of a** trigger.  */static int codeTriggerProgram(  Parse *pParse,            /* The parser context */  TriggerStep *pStepList,   /* List of statements inside the trigger body */  int orconfin              /* Conflict algorithm. (OE_Abort, etc) */  ){  TriggerStep * pTriggerStep = pStepList;  int orconf;  while( pTriggerStep ){    int saveNTab = pParse->nTab;     orconf = (orconfin == OE_Default)?pTriggerStep->orconf:orconfin;    pParse->trigStack->orconf = orconf;    switch( pTriggerStep->op ){      case TK_SELECT: {	Select * ss = sqliteSelectDup(pTriggerStep->pSelect);		  	assert(ss);	assert(ss->pSrc);	sqliteSelect(pParse, ss, SRT_Discard, 0, 0, 0, 0);	sqliteSelectDelete(ss);	break;      }      case TK_UPDATE: {        SrcList *pSrc;        pSrc = targetSrcList(pParse, pTriggerStep);        sqliteVdbeAddOp(pParse->pVdbe, OP_ListPush, 0, 0);        sqliteUpdate(pParse, pSrc,		sqliteExprListDup(pTriggerStep->pExprList), 		sqliteExprDup(pTriggerStep->pWhere), orconf);        sqliteVdbeAddOp(pParse->pVdbe, OP_ListPop, 0, 0);        break;      }      case TK_INSERT: {        SrcList *pSrc;        pSrc = targetSrcList(pParse, pTriggerStep);        sqliteInsert(pParse, pSrc,          sqliteExprListDup(pTriggerStep->pExprList),           sqliteSelectDup(pTriggerStep->pSelect),           sqliteIdListDup(pTriggerStep->pIdList), orconf);        break;      }      case TK_DELETE: {        SrcList *pSrc;        sqliteVdbeAddOp(pParse->pVdbe, OP_ListPush, 0, 0);        pSrc = targetSrcList(pParse, pTriggerStep);        sqliteDeleteFrom(pParse, pSrc, sqliteExprDup(pTriggerStep->pWhere));        sqliteVdbeAddOp(pParse->pVdbe, OP_ListPop, 0, 0);        break;      }      default:        assert(0);    }     pParse->nTab = saveNTab;    pTriggerStep = pTriggerStep->pNext;  }  return 0;}/*** This is called to code FOR EACH ROW triggers.**** When the code that this function generates is executed, the following ** must be true:**** 1. No cursors may be open in the main database.  (But newIdx and oldIdx**    can be indices of cursors in temporary tables.  See below.)**** 2. If the triggers being coded are ON INSERT or ON UPDATE triggers, then**    a temporary vdbe cursor (index newIdx) must be open and pointing at**    a row containing values to be substituted for new.* expressions in the**    trigger program(s).**** 3. If the triggers being coded are ON DELETE or ON UPDATE triggers, then**    a temporary vdbe cursor (index oldIdx) must be open and pointing at**    a row containing values to be substituted for old.* expressions in the**    trigger program(s).***/int sqliteCodeRowTrigger(  Parse *pParse,       /* Parse context */  int op,              /* One of TK_UPDATE, TK_INSERT, TK_DELETE */  ExprList *pChanges,  /* Changes list for any UPDATE OF triggers */  int tr_tm,           /* One of TK_BEFORE, TK_AFTER */  Table *pTab,         /* The table to code triggers from */  int newIdx,          /* The indice of the "new" row to access */  int oldIdx,          /* The indice of the "old" row to access */  int orconf,          /* ON CONFLICT policy */  int ignoreJump       /* Instruction to jump to for RAISE(IGNORE) */){  Trigger * pTrigger;  TriggerStack * pTriggerStack;  assert(op == TK_UPDATE || op == TK_INSERT || op == TK_DELETE);  assert(tr_tm == TK_BEFORE || tr_tm == TK_AFTER );  assert(newIdx != -1 || oldIdx != -1);  pTrigger = pTab->pTrigger;  while( pTrigger ){    int fire_this = 0;    /* determine whether we should code this trigger */    if( pTrigger->op == op && pTrigger->tr_tm == tr_tm &&         pTrigger->foreach == TK_ROW ){      fire_this = 1;      pTriggerStack = pParse->trigStack;      while( pTriggerStack ){        if( pTriggerStack->pTrigger == pTrigger ){	  fire_this = 0;	}        pTriggerStack = pTriggerStack->pNext;      }      if( op == TK_UPDATE && pTrigger->pColumns &&          !checkColumnOverLap(pTrigger->pColumns, pChanges) ){        fire_this = 0;      }    }    if( fire_this && (pTriggerStack = sqliteMalloc(sizeof(TriggerStack)))!=0 ){      int endTrigger;      SrcList dummyTablist;      Expr * whenExpr;      AuthContext sContext;      dummyTablist.nSrc = 0;      /* Push an entry on to the trigger stack */      pTriggerStack->pTrigger = pTrigger;      pTriggerStack->newIdx = newIdx;      pTriggerStack->oldIdx = oldIdx;      pTriggerStack->pTab = pTab;      pTriggerStack->pNext = pParse->trigStack;      pTriggerStack->ignoreJump = ignoreJump;      pParse->trigStack = pTriggerStack;      sqliteAuthContextPush(pParse, &sContext, pTrigger->name);      /* code the WHEN clause */      endTrigger = sqliteVdbeMakeLabel(pParse->pVdbe);      whenExpr = sqliteExprDup(pTrigger->pWhen);      if( sqliteExprResolveIds(pParse, &dummyTablist, 0, whenExpr) ){        pParse->trigStack = pParse->trigStack->pNext;        sqliteFree(pTriggerStack);        sqliteExprDelete(whenExpr);        return 1;      }      sqliteExprIfFalse(pParse, whenExpr, endTrigger, 1);      sqliteExprDelete(whenExpr);      sqliteVdbeAddOp(pParse->pVdbe, OP_ContextPush, 0, 0);      codeTriggerProgram(pParse, pTrigger->step_list, orconf);       sqliteVdbeAddOp(pParse->pVdbe, OP_ContextPop, 0, 0);      /* Pop the entry off the trigger stack */      pParse->trigStack = pParse->trigStack->pNext;      sqliteAuthContextPop(&sContext);      sqliteFree(pTriggerStack);      sqliteVdbeResolveLabel(pParse->pVdbe, endTrigger);    }    pTrigger = pTrigger->pNext;  }  return 0;}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
悠悠色在线精品| 久久99精品久久久久久久久久久久| 欧美高清激情brazzers| 国产成人午夜片在线观看高清观看| 亚洲日本一区二区| 欧美大片在线观看一区二区| 91免费视频大全| 国产风韵犹存在线视精品| 亚洲风情在线资源站| 国产精品国产三级国产普通话99 | 99精品欧美一区二区蜜桃免费| 奇米影视一区二区三区小说| 亚洲天堂2016| 国产精品无码永久免费888| 欧美一级免费大片| 在线看日本不卡| www.激情成人| 国产精品一品二品| 免费成人在线播放| 日韩中文字幕一区二区三区| 亚洲图片欧美激情| 成人免费一区二区三区在线观看| 日韩欧美成人一区| 欧美一区二区在线免费播放| 91黄色免费网站| 色成年激情久久综合| 91蝌蚪porny九色| 成人免费福利片| 国产99精品视频| 国产成人亚洲综合色影视| 激情六月婷婷久久| 蜜桃视频在线观看一区二区| 日韩成人午夜精品| 日韩黄色免费电影| 日av在线不卡| 麻豆精品久久久| 蜜桃视频一区二区| 激情文学综合网| 国产精品影视在线| 成人丝袜18视频在线观看| 国产91精品免费| www.成人在线| 色狠狠色狠狠综合| 欧美在线小视频| 欧美日韩卡一卡二| 7777精品伊人久久久大香线蕉完整版| 欧美日韩精品高清| 欧美一区二区三区视频免费播放| 91精选在线观看| 精品人伦一区二区色婷婷| 久久久久国产免费免费| 国产网站一区二区| 亚洲欧美激情在线| 亚洲国产综合91精品麻豆| 视频一区中文字幕国产| 久热成人在线视频| 成人综合婷婷国产精品久久蜜臀 | 成人av电影在线| 91久久国产最好的精华液| 欧美无人高清视频在线观看| 91麻豆精品国产无毒不卡在线观看| 91精品国产色综合久久久蜜香臀| 日韩精品一区二区三区视频 | 国产精品一区二区x88av| 丁香亚洲综合激情啪啪综合| 99久久综合国产精品| 欧美三级蜜桃2在线观看| 欧美不卡视频一区| 日本一区二区久久| 亚洲电影第三页| 国内久久婷婷综合| 色网站国产精品| 日韩一区二区视频| 中文字幕在线观看一区二区| 亚洲成人在线网站| 国产一区三区三区| 欧美亚洲一区二区在线| 久久中文娱乐网| 亚洲一区二区免费视频| 久久电影国产免费久久电影 | 91天堂素人约啪| 欧美精品久久天天躁| 久久精品日韩一区二区三区| 亚洲最大成人综合| 国产精品亚洲一区二区三区在线| 色婷婷综合在线| 2014亚洲片线观看视频免费| 亚洲激情图片一区| 国产在线麻豆精品观看| 在线看日本不卡| 国产精品素人视频| 免费日本视频一区| 色婷婷综合久色| 久久久久久**毛片大全| 偷拍与自拍一区| 91一区在线观看| 久久久噜噜噜久久人人看| 丝瓜av网站精品一区二区 | 日韩色在线观看| 亚洲人一二三区| 国产高清一区日本| 91精品国产综合久久香蕉的特点| 中文字幕在线不卡一区| 国产精品亚洲成人| 日韩三级视频在线观看| 亚洲制服丝袜av| www.激情成人| 国产欧美一区二区精品秋霞影院| 日本视频免费一区| 欧美天堂亚洲电影院在线播放| 中文字幕精品三区| 国产精品原创巨作av| 日韩欧美成人一区| 日本亚洲欧美天堂免费| 色婷婷一区二区三区四区| 国产精品区一区二区三| 国产一区二区三区高清播放| 欧美一级理论性理论a| 亚洲va欧美va人人爽| 色天天综合色天天久久| 亚洲色图丝袜美腿| 99久久久久久| 国产精品国产三级国产普通话三级| 国产一区二区三区av电影| 精品少妇一区二区三区日产乱码| 午夜免费欧美电影| 欧美日韩国产大片| 亚洲成人免费在线观看| 欧美性受xxxx黑人xyx| 亚洲精品成人天堂一二三| 一本大道综合伊人精品热热| 中文字幕一区二区三区四区| 成人免费va视频| 国产精品福利一区| 色综合亚洲欧洲| 亚洲一二三区视频在线观看| 欧洲精品视频在线观看| 亚洲一区二区三区免费视频| 欧美日韩在线精品一区二区三区激情| 亚洲综合久久av| 欧美在线播放高清精品| 亚洲国产日韩精品| 88在线观看91蜜桃国自产| 美女免费视频一区二区| 欧美精品一区二区三区在线播放 | 欧美亚洲自拍偷拍| 五月天一区二区| 日韩欧美综合在线| 国内国产精品久久| 欧美—级在线免费片| 99re这里只有精品6| 亚洲已满18点击进入久久| 欧美日韩夫妻久久| 婷婷六月综合网| 欧美大片拔萝卜| 国产成人8x视频一区二区| 亚洲美女视频一区| 欧美人妖巨大在线| 国产精品自产自拍| 国产精品萝li| 欧美日韩精品三区| 国产综合色在线视频区| 中文字幕在线一区免费| 欧美人与z0zoxxxx视频| 国模娜娜一区二区三区| 中文字幕中文在线不卡住| 91官网在线免费观看| 麻豆国产欧美一区二区三区| 国产精品区一区二区三区| 欧美日韩国产免费| 国产精品1区2区| 亚洲一区视频在线观看视频| 欧美电视剧免费观看| 91看片淫黄大片一级| 欧美a级一区二区| 国产精品久久久99| 91精品国产免费| 成人av综合在线| 蜜桃视频在线观看一区二区| 中文字幕在线不卡一区 | 日韩欧美国产三级电影视频| 高清久久久久久| 午夜精品123| 国产清纯在线一区二区www| 欧美三级韩国三级日本三斤 | 日本乱人伦一区| 久久99久久久欧美国产| 亚洲男女毛片无遮挡| 亚洲精品一区二区三区影院| 欧美网站一区二区| 成人看片黄a免费看在线| 琪琪久久久久日韩精品| 一区二区理论电影在线观看| 久久久亚洲高清| 欧美日韩免费观看一区三区| 成人教育av在线| 国产麻豆成人精品| 人禽交欧美网站| 亚洲国产成人av网| 亚洲色图欧洲色图|