mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-07 02:42:48 +03:00
Improved comments on the new code.
FossilOrigin-Name: a38f0c1d7c1d7635732ac370d8fbc7e6a2005378e4621da7bc4f51a2f99912d1
This commit is contained in:
14
manifest
14
manifest
@@ -1,5 +1,5 @@
|
||||
C Add\san\sALWAYS()\sto\san\sunreachable\sbranch.
|
||||
D 2021-01-30T16:16:42.507
|
||||
C Improved\scomments\son\sthe\snew\scode.
|
||||
D 2021-01-30T21:55:38.166
|
||||
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
||||
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
||||
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
|
||||
@@ -485,7 +485,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6
|
||||
F src/btree.c 47d9fe97d5c0d74506154e3597f8a23b81a00080751dc4d11fec91ee22796f4c
|
||||
F src/btree.h 285f8377aa1353185a32bf455faafa9ff9a0d40d074d60509534d14990c7829e
|
||||
F src/btreeInt.h 7614cae30f95b6aed0c7cac7718276a55cfe2c77058cbfd8bef5b75329757331
|
||||
F src/build.c ff2cdab3c86156c3c1808e282daaf04d298e532ef11478844964107496898cf9
|
||||
F src/build.c 118e1076282415229420d04f9cc25bb148a2c412d82ea3c319136d2122c842e5
|
||||
F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c
|
||||
F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
|
||||
F src/ctime.c 2a322b9a3d75771fb4d99e0702851f4f68dda982507a0f798eefb0712969a410
|
||||
@@ -607,7 +607,7 @@ F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
|
||||
F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c
|
||||
F src/tokenize.c c64c49d7c2ec4490c2fef1f24350167ba16b03b0c6cee58ad1a1d70a4325d4e9
|
||||
F src/treeview.c 4b92992176fb2caefbe06ba5bd06e0e0ebcde3d5564758da672631f17aa51cda
|
||||
F src/trigger.c ec5ba098328dccba9b5c2e5e9946df4dab1d551ae8b7d1b0bdaec65914bf2bfa
|
||||
F src/trigger.c 207168409c59f346df3a8b4556f0f35fdf721cd35e06fb3c75ea76b7ce95ed35
|
||||
F src/update.c 3dbc7189ffcf361c2149f1b1d0841a8a9689d27f15c5e72e6f14ebc447e6b0c0
|
||||
F src/upsert.c df8f1727d62b5987c4fd302cd4d7c0c84ae57cd65683c5a34a740dfe24039235
|
||||
F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0
|
||||
@@ -1899,7 +1899,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
|
||||
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
||||
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
||||
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
||||
P fea91e3a511b14dafcc4da92c59188f927ec60ed91441335183da6b4e7866c1b
|
||||
R 8cd82e0fb3b2559278f1acef6be93a28
|
||||
P 6bb6de42b62acd35ade6c95a11bb4c9b35e7e9a24620731ae36364c4d5c3bc31
|
||||
R 9e0cb8b9c72d2bfe4a3d882f4b872a05
|
||||
U drh
|
||||
Z 32c0d1eece5071f19ef4a6007df09364
|
||||
Z 296f4bf266bf4139fc832ba9efb3047c
|
||||
|
@@ -1 +1 @@
|
||||
6bb6de42b62acd35ade6c95a11bb4c9b35e7e9a24620731ae36364c4d5c3bc31
|
||||
a38f0c1d7c1d7635732ac370d8fbc7e6a2005378e4621da7bc4f51a2f99912d1
|
31
src/build.c
31
src/build.c
@@ -1244,23 +1244,38 @@ void sqlite3ColumnPropertiesFromName(Table *pTab, Column *pCol){
|
||||
#endif
|
||||
|
||||
/*
|
||||
** Name of the magic TEMP trigger used to implement RETURNING
|
||||
** Name of the special TEMP trigger used to implement RETURNING. The
|
||||
** name begins with "sqlite_" so that it is guaranteed not to collide
|
||||
** with any application-generated triggers.
|
||||
*/
|
||||
#define RETURNING_TRIGGER "sqlite_returning"
|
||||
#define RETURNING_TRIGGER_NAME "sqlite_returning"
|
||||
|
||||
/*
|
||||
** Delete the data structures associated with the RETURNING clause.
|
||||
** Clean up the data structures associated with the RETURNING clause.
|
||||
*/
|
||||
static void sqlite3DeleteReturning(sqlite3 *db, Returning *pRet){
|
||||
Hash *pHash;
|
||||
pHash = &(db->aDb[1].pSchema->trigHash);
|
||||
sqlite3HashInsert(pHash, RETURNING_TRIGGER, 0);
|
||||
sqlite3HashInsert(pHash, RETURNING_TRIGGER_NAME, 0);
|
||||
sqlite3ExprListDelete(db, pRet->pReturnEL);
|
||||
sqlite3DbFree(db, pRet);
|
||||
}
|
||||
|
||||
/*
|
||||
** Add the RETURNING clause to the parser currently underway.
|
||||
** Add the RETURNING clause to the parse currently underway.
|
||||
**
|
||||
** This routine creates a special TEMP trigger that will fire for each row
|
||||
** of the DML statement. That TEMP trigger contains a single SELECT
|
||||
** statement with a result set that is the argument of the RETURNING clause.
|
||||
** The trigger has the Trigger.bReturning flag and an opcode of
|
||||
** TK_RETURNING instead of TK_SELECT, so that the trigger code generator
|
||||
** knows to handle it specially. The TEMP trigger is automatically
|
||||
** removed at the end of the parse.
|
||||
**
|
||||
** When this routine is called, we do not yet know if the RETURNING clause
|
||||
** is attached to a DELETE, INSERT, or UPDATE, so construct it as a
|
||||
** RETURNING trigger instead. It will then be converted into the appropriate
|
||||
** type on the first call to sqlite3TriggersExist().
|
||||
*/
|
||||
void sqlite3AddReturning(Parse *pParse, ExprList *pList){
|
||||
Returning *pRet;
|
||||
@@ -1278,7 +1293,7 @@ void sqlite3AddReturning(Parse *pParse, ExprList *pList){
|
||||
sqlite3ParserAddCleanup(pParse,
|
||||
(void(*)(sqlite3*,void*))sqlite3DeleteReturning, pRet);
|
||||
if( db->mallocFailed ) return;
|
||||
pRet->retTrig.zName = "sqlite_returning";
|
||||
pRet->retTrig.zName = RETURNING_TRIGGER_NAME;
|
||||
pRet->retTrig.op = TK_RETURNING;
|
||||
pRet->retTrig.tr_tm = TRIGGER_AFTER;
|
||||
pRet->retTrig.bReturning = 1;
|
||||
@@ -1291,8 +1306,8 @@ void sqlite3AddReturning(Parse *pParse, ExprList *pList){
|
||||
pRet->retSel.pEList = pList;
|
||||
pRet->retSel.pSrc = (SrcList*)&pRet->retSrcList;
|
||||
pHash = &(db->aDb[1].pSchema->trigHash);
|
||||
assert( sqlite3HashFind(pHash, RETURNING_TRIGGER)==0 );
|
||||
if( sqlite3HashInsert(pHash, "sqlite_returning", &pRet->retTrig)
|
||||
assert( sqlite3HashFind(pHash, RETURNING_TRIGGER_NAME)==0 );
|
||||
if( sqlite3HashInsert(pHash, RETURNING_TRIGGER_NAME, &pRet->retTrig)
|
||||
==&pRet->retTrig ){
|
||||
sqlite3OomFault(db);
|
||||
}
|
||||
|
@@ -739,10 +739,14 @@ Trigger *sqlite3TriggersExist(
|
||||
for(p=pList; p; p=p->pNext){
|
||||
if( p->op==op && checkColumnOverlap(p->pColumns, pChanges) ){
|
||||
mask |= p->tr_tm;
|
||||
}else if( p->bReturning
|
||||
&& (p->op==TK_RETURNING || (p->op!=TK_DELETE && op!=TK_DELETE)) ){
|
||||
}else if( p->op==TK_RETURNING ){
|
||||
/* The first time a RETURNING trigger is seen, the "op" value tells
|
||||
** us what time of trigger it should be. */
|
||||
p->op = op;
|
||||
mask |= TRIGGER_AFTER;
|
||||
}else if( p->bReturning && p->op==TK_INSERT && op==TK_UPDATE ){
|
||||
/* Also fire a RETURNING trigger for INSERT on the UPDATE of an UPSERT */
|
||||
mask |= TRIGGER_AFTER;
|
||||
}
|
||||
}
|
||||
if( pMask ){
|
||||
@@ -1216,13 +1220,19 @@ void sqlite3CodeRowTrigger(
|
||||
assert( p->pSchema==p->pTabSchema
|
||||
|| p->pSchema==pParse->db->aDb[1].pSchema );
|
||||
|
||||
/* Determine whether we should code this trigger */
|
||||
if( (p->op==op || (p->bReturning && p->op!=TK_DELETE))
|
||||
/* Determine whether we should code this trigger. One of two choices:
|
||||
** 1. The trigger is an exact match to the current DML statement
|
||||
** 2. This is a RETURNING trigger for INSERT but we are currently
|
||||
** doing the UPDATE part of an UPSERT.
|
||||
*/
|
||||
if( (p->op==op || (p->bReturning && p->op==TK_INSERT && op==TK_UPDATE))
|
||||
&& p->tr_tm==tr_tm
|
||||
&& checkColumnOverlap(p->pColumns, pChanges)
|
||||
){
|
||||
u8 origOp = p->op;
|
||||
p->op = op;
|
||||
sqlite3CodeRowTriggerDirect(pParse, p, pTab, reg, orconf, ignoreJump);
|
||||
p->op = origOp;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user