mirror of
https://github.com/sqlite/sqlite.git
synced 2025-11-06 15:49:35 +03:00
More fixes for test cases.
FossilOrigin-Name: 85d9f23be1e8673dbda42e43b9b23332ada9225f
This commit is contained in:
@@ -611,7 +611,7 @@ typedef struct StrAccum StrAccum;
|
||||
typedef struct Table Table;
|
||||
typedef struct TableLock TableLock;
|
||||
typedef struct Token Token;
|
||||
typedef struct TriggerStack TriggerStack;
|
||||
typedef struct TriggerPrg TriggerPrg;
|
||||
typedef struct TriggerStep TriggerStep;
|
||||
typedef struct Trigger Trigger;
|
||||
typedef struct UnpackedRecord UnpackedRecord;
|
||||
@@ -1577,7 +1577,8 @@ struct Expr {
|
||||
*********************************************************************/
|
||||
|
||||
int iTable; /* TK_COLUMN: cursor number of table holding column
|
||||
** TK_REGISTER: register number */
|
||||
** TK_REGISTER: register number
|
||||
** TK_TRIGGER: 1 -> new, 0 -> old */
|
||||
i16 iColumn; /* TK_COLUMN: column index. -1 for rowid */
|
||||
i16 iAgg; /* Which entry in pAggInfo->aCol[] or ->aFunc[] */
|
||||
i16 iRightJoinTable; /* If EP_FromJoin, the right table of the join */
|
||||
@@ -2016,14 +2017,25 @@ struct AutoincInfo {
|
||||
# define SQLITE_N_COLCACHE 10
|
||||
#endif
|
||||
|
||||
typedef struct CodedTrigger CodedTrigger;
|
||||
struct CodedTrigger {
|
||||
SubProgram *pProgram;
|
||||
Trigger *pTrigger;
|
||||
u32 oldmask; /* Mask of old.* columns accessed */
|
||||
u32 newmask; /* Mask of new.* columns accessed */
|
||||
/*
|
||||
** At least one instance of the following structure is created for each
|
||||
** trigger that may be fired while parsing an INSERT, UPDATE or DELETE
|
||||
** statement. All such objects are stored in the linked list headed at
|
||||
** Parse.pTriggerPrg and deleted once statement compilation has been
|
||||
** completed.
|
||||
**
|
||||
** A Vdbe sub-program that implements the body and WHEN clause of trigger
|
||||
** TriggerPrg.pTrigger, assuming a default ON CONFLICT clause of
|
||||
** TriggerPrg.orconf, is stored in the TriggerPrg.pProgram variable.
|
||||
** The Parse.pTriggerPrg list never contains two entries with the same
|
||||
** values for both pTrigger and orconf.
|
||||
*/
|
||||
struct TriggerPrg {
|
||||
Trigger *pTrigger; /* Trigger this program was coded from */
|
||||
int orconf; /* Default ON CONFLICT policy */
|
||||
CodedTrigger *pNext;
|
||||
SubProgram *pProgram; /* Program implementing pTrigger/orconf */
|
||||
u32 oldmask; /* Mask of old.* columns accessed */
|
||||
TriggerPrg *pNext; /* Next entry in Parse.pTriggerPrg list */
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -2112,9 +2124,6 @@ struct Parse {
|
||||
const char *zTail; /* All SQL text past the last semicolon parsed */
|
||||
Table *pNewTable; /* A table being constructed by CREATE TABLE */
|
||||
Trigger *pNewTrigger; /* Trigger under construct by a CREATE TRIGGER */
|
||||
#if 0
|
||||
TriggerStack *trigStack; /* Trigger actions being coded */
|
||||
#endif
|
||||
const char *zAuthContext; /* The 6th parameter to db->xAuth callbacks */
|
||||
#ifndef SQLITE_OMIT_VIRTUALTABLE
|
||||
Token sArg; /* Complete text of a module argument */
|
||||
@@ -2124,7 +2133,7 @@ struct Parse {
|
||||
#endif
|
||||
int nHeight; /* Expression tree height of current sub-select */
|
||||
Table *pZombieTab; /* List of Table objects to delete after code gen */
|
||||
CodedTrigger *pCodedTrigger; /* Linked list of coded triggers */
|
||||
TriggerPrg *pTriggerPrg; /* Linked list of coded triggers */
|
||||
};
|
||||
|
||||
#ifdef SQLITE_OMIT_VIRTUALTABLE
|
||||
@@ -2241,45 +2250,6 @@ struct TriggerStep {
|
||||
TriggerStep *pLast; /* Last element in link-list. Valid for 1st elem only */
|
||||
};
|
||||
|
||||
/*
|
||||
* An instance of struct TriggerStack stores information required during code
|
||||
* generation of a single trigger program. While the trigger program is being
|
||||
* coded, its associated TriggerStack instance is pointed to by the
|
||||
* "pTriggerStack" member of the Parse structure.
|
||||
*
|
||||
* The pTab member points to the table that triggers are being coded on. The
|
||||
* newIdx member contains the index of the vdbe cursor that points at the temp
|
||||
* table that stores the new.* references. If new.* references are not valid
|
||||
* for the trigger being coded (for example an ON DELETE trigger), then newIdx
|
||||
* is set to -1. The oldIdx member is analogous to newIdx, for old.* references.
|
||||
*
|
||||
* The ON CONFLICT policy to be used for the trigger program steps is stored
|
||||
* as the orconf member. If this is OE_Default, then the ON CONFLICT clause
|
||||
* specified for individual triggers steps is used.
|
||||
*
|
||||
* struct TriggerStack has a "pNext" member, to allow linked lists to be
|
||||
* constructed. When coding nested triggers (triggers fired by other triggers)
|
||||
* each nested trigger stores its parent trigger's TriggerStack as the "pNext"
|
||||
* pointer. Once the nested trigger has been coded, the pNext value is restored
|
||||
* to the pTriggerStack member of the Parse stucture and coding of the parent
|
||||
* trigger continues.
|
||||
*
|
||||
* Before a nested trigger is coded, the linked list pointed to by the
|
||||
* pTriggerStack is scanned to ensure that the trigger is not about to be coded
|
||||
* recursively. If this condition is detected, the nested trigger is not coded.
|
||||
*/
|
||||
struct TriggerStack {
|
||||
Table *pTab; /* Table that triggers are currently being coded on */
|
||||
int newIdx; /* Index of vdbe cursor to "new" temp table */
|
||||
int oldIdx; /* Index of vdbe cursor to "old" temp table */
|
||||
u32 newColMask;
|
||||
u32 oldColMask;
|
||||
int orconf; /* Current orconf policy */
|
||||
int ignoreJump; /* where to jump to for a RAISE(IGNORE) */
|
||||
Trigger *pTrigger; /* The trigger currently being coded */
|
||||
TriggerStack *pNext; /* Next trigger down on the trigger stack */
|
||||
};
|
||||
|
||||
/*
|
||||
** The following structure contains information used by the sqliteFix...
|
||||
** routines as they walk the parse tree to make database references
|
||||
@@ -2674,7 +2644,7 @@ void sqlite3GenerateRowIndexDelete(Parse*, Table*, int, int*);
|
||||
int sqlite3GenerateIndexKey(Parse*, Index*, int, int, int);
|
||||
void sqlite3GenerateConstraintChecks(Parse*,Table*,int,int,
|
||||
int*,int,int,int,int,int*);
|
||||
void sqlite3CompleteInsertion(Parse*, Table*, int, int, int*, int, int,int,int);
|
||||
void sqlite3CompleteInsertion(Parse*, Table*, int, int, int*, int, int, int);
|
||||
int sqlite3OpenTableAndIndices(Parse*, Table*, int, int);
|
||||
void sqlite3BeginWriteOperation(Parse*, int, int);
|
||||
Expr *sqlite3ExprDup(sqlite3*,Expr*,int);
|
||||
@@ -2721,7 +2691,7 @@ void sqlite3MaterializeView(Parse*, Table*, Expr*, int);
|
||||
TriggerStep *sqlite3TriggerDeleteStep(sqlite3*,Token*, Expr*);
|
||||
void sqlite3DeleteTrigger(sqlite3*, Trigger*);
|
||||
void sqlite3UnlinkAndDeleteTrigger(sqlite3*,int,const char*);
|
||||
void sqlite3TriggerUses(Parse*,Trigger*,int,ExprList*,Table*,int,u32*,u32*);
|
||||
u32 sqlite3TriggerOldmask(Parse*,Trigger*,int,ExprList*,Table*,int);
|
||||
#else
|
||||
# define sqlite3TriggersExist(B,C,D,E,F) 0
|
||||
# define sqlite3DeleteTrigger(A,B)
|
||||
|
||||
Reference in New Issue
Block a user