⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sqliteint.h

📁 sqlite 嵌入式数据库的源码
💻 H
📖 第 1 页 / 共 5 页
字号:
** column names after a table name in an INSERT statement.  In the statement****     INSERT INTO t(a,b,c) ...**** If "a" is the k-th column of table "t", then IdList.a[0].idx==k.*/struct IdList {  int nId;         /* Number of identifiers on the list */  int nAlloc;      /* Number of entries allocated for a[] below */  struct IdList_item {    char *zName;      /* Name of the identifier */    int idx;          /* Index in some Table.aCol[] of a column named zName */  } *a;};/*** The bitmask datatype defined below is used for various optimizations.*/typedef unsigned int Bitmask;/*** The following structure describes the FROM clause of a SELECT statement.** Each table or subquery in the FROM clause is a separate element of** the SrcList.a[] array.**** With the addition of multiple database support, the following structure** can also be used to describe a particular table such as the table that** is modified by an INSERT, DELETE, or UPDATE statement.  In standard SQL,** such a table must be a simple name: ID.  But in SQLite, the table can** now be identified by a database name, a dot, then the table name: ID.ID.*/struct SrcList {  i16 nSrc;        /* Number of tables or subqueries in the FROM clause */  i16 nAlloc;      /* Number of entries allocated in a[] below */  struct SrcList_item {    char *zDatabase;  /* Name of database holding this table */    char *zName;      /* Name of the table */    char *zAlias;     /* The "B" part of a "A AS B" phrase.  zName is the "A" */    Table *pTab;      /* An SQL table corresponding to zName */    Select *pSelect;  /* A SELECT statement used in place of a table name */    int jointype;     /* Type of join between this table and the next */    int iCursor;      /* The VDBE cursor number used to access this table */    Expr *pOn;        /* The ON clause of a join */    IdList *pUsing;   /* The USING clause of a join */    Bitmask colUsed;  /* Bit N (1<<N) set if column N or pTab is used */  } a[1];             /* One entry for each identifier on the list */};/*** Permitted values of the SrcList.a.jointype field*/#define JT_INNER     0x0001    /* Any kind of inner or cross join */#define JT_NATURAL   0x0002    /* True for a "natural" join */#define JT_LEFT      0x0004    /* Left outer join */#define JT_RIGHT     0x0008    /* Right outer join */#define JT_OUTER     0x0010    /* The "OUTER" keyword is present */#define JT_ERROR     0x0020    /* unknown or unsupported join type *//*** For each nested loop in a WHERE clause implementation, the WhereInfo** structure contains a single instance of this structure.  This structure** is intended to be private the the where.c module and should not be** access or modified by other modules.*/struct WhereLevel {  int iMem;            /* Memory cell used by this level */  Index *pIdx;         /* Index used.  NULL if no index */  int iTabCur;         /* The VDBE cursor used to access the table */  int iIdxCur;         /* The VDBE cursor used to acesss pIdx */  int score;           /* How well this index scored */  int brk;             /* Jump here to break out of the loop */  int cont;            /* Jump here to continue with the next loop cycle */  int op, p1, p2;      /* Opcode used to terminate the loop */  int iLeftJoin;       /* Memory cell used to implement LEFT OUTER JOIN */  int top;             /* First instruction of interior of the loop */  int inOp, inP1, inP2;/* Opcode used to implement an IN operator */  int bRev;            /* Do the scan in the reverse direction */};/*** The WHERE clause processing routine has two halves.  The** first part does the start of the WHERE loop and the second** half does the tail of the WHERE loop.  An instance of** this structure is returned by the first half and passed** into the second half to give some continuity.*/struct WhereInfo {  Parse *pParse;  SrcList *pTabList;   /* List of tables in the join */  int iTop;            /* The very beginning of the WHERE loop */  int iContinue;       /* Jump here to continue with next record */  int iBreak;          /* Jump here to break out of the loop */  int nLevel;          /* Number of nested loop */  WhereLevel a[1];     /* Information about each nest loop in the WHERE */};/*** A NameContext defines a context in which to resolve table and column** names.  The context consists of a list of tables (the pSrcList) field and** a list of named expression (pEList).  The named expression list may** be NULL.  The pSrc corresponds to the FROM clause of a SELECT or** to the table being operated on by INSERT, UPDATE, or DELETE.  The** pEList corresponds to the result set of a SELECT and is NULL for** other statements.**** NameContexts can be nested.  When resolving names, the inner-most ** context is searched first.  If no match is found, the next outer** context is checked.  If there is still no match, the next context** is checked.  This process continues until either a match is found** or all contexts are check.  When a match is found, the nRef member of** the context containing the match is incremented. **** Each subquery gets a new NameContext.  The pNext field points to the** NameContext in the parent query.  Thus the process of scanning the** NameContext list corresponds to searching through successively outer** subqueries looking for a match.*/struct NameContext {  Parse *pParse;       /* The parser */  SrcList *pSrcList;   /* One or more tables used to resolve names */  ExprList *pEList;    /* Optional list of named expressions */  int nRef;            /* Number of names resolved by this context */  int nErr;            /* Number of errors encountered while resolving names */  u8 allowAgg;         /* Aggregate functions allowed here */  u8 hasAgg;  int nDepth;          /* Depth of subquery recursion. 1 for no recursion */  NameContext *pNext;  /* Next outer name context.  NULL for outermost */};/*** An instance of the following structure contains all information** needed to generate code for a single SELECT statement.**** nLimit is set to -1 if there is no LIMIT clause.  nOffset is set to 0.** If there is a LIMIT clause, the parser sets nLimit to the value of the** limit and nOffset to the value of the offset (or 0 if there is not** offset).  But later on, nLimit and nOffset become the memory locations** in the VDBE that record the limit and offset counters.*/struct Select {  ExprList *pEList;      /* The fields of the result */  u8 op;                 /* One of: TK_UNION TK_ALL TK_INTERSECT TK_EXCEPT */  u8 isDistinct;         /* True if the DISTINCT keyword is present */  SrcList *pSrc;         /* The FROM clause */  Expr *pWhere;          /* The WHERE clause */  ExprList *pGroupBy;    /* The GROUP BY clause */  Expr *pHaving;         /* The HAVING clause */  ExprList *pOrderBy;    /* The ORDER BY clause */  Select *pPrior;        /* Prior select in a compound select statement */  Expr *pLimit;          /* LIMIT expression. NULL means not used. */  Expr *pOffset;         /* OFFSET expression. NULL means not used. */  int iLimit, iOffset;   /* Memory registers holding LIMIT & OFFSET counters */  IdList **ppOpenTemp;   /* OP_OpenTemp addresses used by multi-selects */  u8 isResolved;         /* True once sqlite3SelectResolve() has run. */  u8 isAgg;              /* True if this is an aggregate query */};/*** The results of a select can be distributed in several ways.*/#define SRT_Callback     1  /* Invoke a callback with each row of result */#define SRT_Mem          2  /* Store result in a memory cell */#define SRT_Set          3  /* Store result as unique keys in a table */#define SRT_Union        5  /* Store result as keys in a table */#define SRT_Except       6  /* Remove result from a UNION table */#define SRT_Table        7  /* Store result as data with a unique key */#define SRT_TempTable    8  /* Store result in a trasient table */#define SRT_Discard      9  /* Do not save the results anywhere */#define SRT_Sorter      10  /* Store results in the sorter */#define SRT_Subroutine  11  /* Call a subroutine to handle results */#define SRT_Exists      12  /* Put 0 or 1 in a memory cell *//*** When a SELECT uses aggregate functions (like "count(*)" or "avg(f1)")** we have to do some additional analysis of expressions.  An instance** of the following structure holds information about a single subexpression** somewhere in the SELECT statement.  An array of these structures holds** all the information we need to generate code for aggregate** expressions.**** Note that when analyzing a SELECT containing aggregates, both** non-aggregate field variables and aggregate functions are stored** in the AggExpr array of the Parser structure.**** The pExpr field points to an expression that is part of either the** field list, the GROUP BY clause, the HAVING clause or the ORDER BY** clause.  The expression will be freed when those clauses are cleaned** up.  Do not try to delete the expression attached to AggExpr.pExpr.**** If AggExpr.pExpr==0, that means the expression is "count(*)".*/struct AggExpr {  int isAgg;        /* if TRUE contains an aggregate function */  Expr *pExpr;      /* The expression */  FuncDef *pFunc;   /* Information about the aggregate function */};/*** An SQL parser context.  A copy of this structure is passed through** the parser and down into all the parser action routine in order to** carry around information that is global to the entire parse.**** The structure is divided into two parts.  When the parser and code** generate call themselves recursively, the first part of the structure** is constant but the second part is reset at the beginning and end of** each recursion.*/struct Parse {  sqlite3 *db;         /* The main database structure */  int rc;              /* Return code from execution */  char *zErrMsg;       /* An error message */  Vdbe *pVdbe;         /* An engine for executing database bytecode */  u8 colNamesSet;      /* TRUE after OP_ColumnName has been issued to pVdbe */  u8 nameClash;        /* A permanent table name clashes with temp table name */  u8 checkSchema;      /* Causes schema cookie check after an error */  u8 nested;           /* Number of nested calls to the parser/code generator */  u8 fillAgg;          /* If true, ignore the Expr.iAgg field. Normally false */  int nErr;            /* Number of errors seen */  int nTab;            /* Number of previously allocated VDBE cursors */  int nMem;            /* Number of memory cells used so far */  int nSet;            /* Number of sets used so far */  u32 writeMask;       /* Start a write transaction on these databases */  u32 cookieMask;      /* Bitmask of schema verified databases */  int cookieGoto;      /* Address of OP_Goto to cookie verifier subroutine */  int cookieValue[MAX_ATTACHED+2];  /* Values of cookies to verify */  /* Above is constant between recursions.  Below is reset before and after  ** each recursion */  int nVar;            /* Number of '?' variables seen in the SQL so far */  int nVarExpr;        /* Number of used slots in apVarExpr[] */  int nVarExprAlloc;   /* Number of allocated slots in apVarExpr[] */  Expr **apVarExpr;    /* Pointers to :aaa and $aaaa wildcard expressions */  u8 explain;          /* True if the EXPLAIN flag is found on the query */  Token sErrToken;     /* The token at which the error occurred */  Token sNameToken;    /* Token with unqualified schema object name */  Token sLastToken;    /* The last token parsed */  const char *zSql;    /* All SQL text */  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 */  TriggerStack *trigStack;  /* Trigger actions being coded */  const char *zAuthContext; /* The 6th parameter to db->xAuth callbacks */  int nAgg;            /* Number of aggregate expressions */  AggExpr *aAgg;       /* An array of aggregate expressions */  int nMaxDepth;       /* Maximum depth of subquery recursion */};/*** An instance of the following structure can be declared on a stack and used** to save the Parse.zAuthContext value so that it can be restored later.*/struct AuthContext {  const char *zAuthContext;   /* Put saved Parse.zAuthContext here */  Parse *pParse;              /* The Parse structure */};/*** Bitfield flags for P2 value in OP_Insert and OP_Delete*/#define OPFLAG_NCHANGE   1    /* Set to update db->nChange */#define OPFLAG_LASTROWID 2    /* Set to update db->lastRowid *//* * Each trigger present in the database schema is stored as an instance of * struct Trigger.  * * Pointers to instances of struct Trigger are stored in two ways. * 1. In the "trigHash" hash table (part of the sqlite3* that represents the  *    database). This allows Trigger structures to be retrieved by name. * 2. All triggers associated with a single table form a linked list, using the *    pNext member of struct Trigger. A pointer to the first element of the *    linked list is stored as the "pTrigger" member of the associated *    struct Table. * * The "step_list" member points to the first element of a linked list * containing the SQL statements specified as the trigger program. */struct Trigger {  char *name;             /* The name of the trigger                        */  char *table;            /* The table or view to which the trigger applies */  u8 iDb;                 /* Database containing this trigger               */  u8 iTabDb;              /* Database containing Trigger.table              */  u8 op;                  /* One of TK_DELETE, TK_UPDATE, TK_INSERT         */  u8 tr_tm;               /* One of TRIGGER_BEFORE, TRIGGER_AFTER */  Expr *pWhen;            /* The WHEN clause of the expresion (may be NULL) */  IdList *pColumns;       /* If this is an UPDATE OF <column-list> trigger,                             the <column-list> is stored here */  int foreach;            /* One of TK_ROW or TK_STATEMENT */  Token nameToken;        /* Token containing zName. Use during parsing only */  TriggerStep *step_list; /* Link list of trigger program steps             */  Trigger *pNext;         /* Next trigger associated with the table */};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -