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

📄 sqliteint.h

📁 SQLite is a software library that implements a self-contained, serverless, zero-configuration, trans
💻 H
📖 第 1 页 / 共 5 页
字号:
****      INSERT INTO t(a,b,c) VALUES ...;**      CREATE INDEX idx ON t(a,b,c);**      CREATE TRIGGER trig BEFORE UPDATE ON t(a,b,c) ...;**** The IdList.a.idx field is used when the IdList represents the list of** 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 {  struct IdList_item {    char *zName;      /* Name of the identifier */    int idx;          /* Index in some Table.aCol[] of a column named zName */  } *a;  int nId;         /* Number of identifiers on the list */  int nAlloc;      /* Number of entries allocated for a[] below */};/*** The bitmask datatype defined below is used for various optimizations.**** Changing this from a 64-bit to a 32-bit type limits the number of** tables in a join to 32 instead of 64.  But it also reduces the size** of the library by 738 bytes on ix86.*/typedef u64 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.**** The jointype starts out showing the join type between the current table** and the next table on the list.  The parser builds the list this way.** But sqlite3SrcListShiftJoinType() later shifts the jointypes so that each** jointype expresses the join between the table and the previous table.*/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 */    u8 isPopulated;   /* Temporary table associated with SELECT is populated */    u8 jointype;      /* Type of join between this able and the previous */    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_CROSS     0x0002    /* Explicit use of the CROSS keyword */#define JT_NATURAL   0x0004    /* True for a "natural" join */#define JT_LEFT      0x0008    /* Left outer join */#define JT_RIGHT     0x0010    /* Right outer join */#define JT_OUTER     0x0020    /* The "OUTER" keyword is present */#define JT_ERROR     0x0040    /* 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.**** The pIdxInfo and pBestIdx fields are used to help pick the best** index on a virtual table.  The pIdxInfo pointer contains indexing** information for the i-th table in the FROM clause before reordering.** All the pIdxInfo pointers are freed by whereInfoFree() in where.c.** The pBestIdx pointer is a copy of pIdxInfo for the i-th table after** FROM clause ordering.  This is a little confusing so I will repeat** it in different words.  WhereInfo.a[i].pIdxInfo is index information ** for WhereInfo.pTabList.a[i].  WhereInfo.a[i].pBestInfo is the** index information for the i-th loop of the join.  pBestInfo is always** either NULL or a copy of some pIdxInfo.  So for cleanup it is ** sufficient to free all of the pIdxInfo pointers.** */struct WhereLevel {  int iFrom;            /* Which entry in the FROM clause */  int flags;            /* Flags associated with this level */  int iMem;             /* First memory cell used by this level */  int iLeftJoin;        /* Memory cell used to implement LEFT OUTER JOIN */  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 brk;              /* Jump here to break out of the loop */  int nxt;              /* Jump here to start the next IN combination */  int cont;             /* Jump here to continue with the next loop cycle */  int top;              /* First instruction of interior of the loop */  int op, p1, p2;       /* Opcode used to terminate the loop */  int nEq;              /* Number of == or IN constraints on this loop */  int nIn;              /* Number of IN operators constraining this loop */  struct InLoop {    int iCur;              /* The VDBE cursor used by this IN operator */    int topAddr;           /* Top of the IN loop */  } *aInLoop;           /* Information about each nested IN operator */  sqlite3_index_info *pBestIdx;  /* Index information for this level */  /* The following field is really not part of the current level.  But  ** we need a place to cache index information for each table in the  ** FROM clause and the WhereLevel structure is a convenient place.  */  sqlite3_index_info *pIdxInfo;  /* Index info for n-th source table */};/*** Flags appropriate for the wflags parameter of sqlite3WhereBegin().*/#define WHERE_ORDERBY_NORMAL     0   /* No-op */#define WHERE_ORDERBY_MIN        1   /* ORDER BY processing for min() func */#define WHERE_ORDERBY_MAX        2   /* ORDER BY processing for max() func */#define WHERE_ONEPASS_DESIRED    4   /* Want to do one-pass UPDATE/DELETE *//*** 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;       /* Parsing and code generating context */  u8 okOnePass;        /* Ok to use one-pass algorithm for UPDATE or DELETE */  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 */  sqlite3_index_info **apInfo;  /* Array of pointers to index info structures */  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;           /* True if aggregates are seen */  u8 isCheck;          /* True if resolving names in a CHECK constraint */  int nDepth;          /* Depth of subquery recursion. 1 for no recursion */  AggInfo *pAggInfo;   /* Information about aggregates at this level */  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.**** addrOpenEphm[] entries contain the address of OP_OpenEphemeral opcodes.** These addresses must be stored so that we can go back and fill in** the P4_KEYINFO and P2 parameters later.  Neither the KeyInfo nor** the number of columns in P2 can be computed at the same time** as the OP_OpenEphm instruction is coded because not** enough information about the compound query is known at that point.** The KeyInfo for addrOpenTran[0] and [1] contains collating sequences** for the result set.  The KeyInfo for addrOpenTran[2] contains collating** sequences for the ORDER BY clause.*/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 */  u8 isResolved;         /* True once sqlite3SelectResolve() has run. */  u8 isAgg;              /* True if this is an aggregate query */  u8 usesEphm;           /* True if uses an OpenEphemeral opcode */  u8 disallowOrderBy;    /* Do not allow an ORDER BY to be attached if TRUE */  char affinity;         /* MakeRecord with this affinity for SRT_Set */  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 */  Select *pNext;         /* Next select to the left in a compound */  Select *pRightmost;    /* Right-most 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 */  int addrOpenEphm[3];   /* OP_OpenEphem opcodes related to this select */};/*** The results of a select can be distributed in several ways.*/#define SRT_Union        1  /* Store result as keys in an index */#define SRT_Except       2  /* Remove result from a UNION index */#define SRT_Exists       3  /* Store 1 if the result is not empty */#define SRT_Discard      4  /* Do not save the results anywhere *//* The ORDER BY clause is ignored for all of the above */#define IgnorableOrderby(X) ((X->eDest)<=SRT_Discard)#define SRT_Callback     5  /* Invoke a callback with each row of result */#define SRT_Mem          6  /* Store result in a memory cell */#define SRT_Set          7  /* Store non-null results as keys in an index */#define SRT_Table        8  /* Store result as data with an automatic rowid */#define SRT_EphemTab     9  /* Create transient tab and store like SRT_Table */#define SRT_Subroutine  10  /* Call a subroutine to handle results *//*** A structure used to customize the behaviour of sqlite3Select(). See** comments above sqlite3Select() for details.*/typedef struct SelectDest SelectDest;struct SelectDest {  u8 eDest;         /* How to dispose of the results */  u8 affinity;      /* Affinity used when eDest==SRT_Set */  int iParm;        /* A parameter used by the eDest disposal method */  int iMem;         /* Base register where results are written */  int nMem;         /* Number of registers allocated */};/*** 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.**** The nTableLock and aTableLock variables are only used if the shared-cache ** feature is enabled (if sqlite3Tsd()->useSharedData is true). They are** used to store the set of table-locks required by the statement being** compiled. Function sqlite3TableLock() is used to add entries to the** list.*/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 parseError;       /* True after a parsing error.  Ticket #1794 */  u8 nTempReg;         /* Number of temporary registers in aTempReg[] */  u8 nTempInUse;       /* Number of aTempReg[] currently checked out */  int aTempReg[8];     /* Holding area for temporary registers */  int nRangeReg;       /* Size of the temporary register block */  int iRangeReg;       /* First register in temporary register block */  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 */  int ckBase;          /* Base register of data during check constraints */  int disableColCache; /* True to disable adding to column cache */  int nColCache;       /* Number of entries in the column cache */  int iColCache;  

⌨️ 快捷键说明

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