mirror of
https://github.com/sqlite/sqlite.git
synced 2025-11-11 01:42:22 +03:00
Merge enhancements from trunk.
FossilOrigin-Name: 091403a6705f5f1352c76eacbfdca75fe0bab12ab9b156842641de07c38d3f66
This commit is contained in:
105
src/sqliteInt.h
105
src/sqliteInt.h
@@ -1298,6 +1298,25 @@ struct Schema {
|
||||
** disables lookaside without adding a new test for the bDisable flag
|
||||
** in a performance-critical path. sz should be set by to szTrue whenever
|
||||
** bDisable changes back to zero.
|
||||
**
|
||||
** Lookaside buffers are initially held on the pInit list. As they are
|
||||
** used and freed, they are added back to the pFree list. New allocations
|
||||
** come off of pFree first, then pInit as a fallback. This dual-list
|
||||
** allows use to compute a high-water mark - the maximum number of allocations
|
||||
** outstanding at any point in the past - by subtracting the number of
|
||||
** allocations on the pInit list from the total number of allocations.
|
||||
**
|
||||
** Enhancement on 2019-12-12: Two-size-lookaside
|
||||
** The default lookaside configuration is 100 slots of 1200 bytes each.
|
||||
** The larger slot sizes are important for performance, but they waste
|
||||
** a lot of space, as most lookaside allocations are less than 128 bytes.
|
||||
** The two-size-lookaside enhancement breaks up the lookaside allocation
|
||||
** into two pools: One of 128-byte slots and the other of the default size
|
||||
** (1200-byte) slots. Allocations are filled from the small-pool first,
|
||||
** failing over to the full-size pool if that does not work. Thus more
|
||||
** lookaside slots are available while also using less memory.
|
||||
** This enhancement can be omitted by compiling with
|
||||
** SQLITE_OMIT_TWOSIZE_LOOKASIDE.
|
||||
*/
|
||||
struct Lookaside {
|
||||
u32 bDisable; /* Only operate the lookaside when zero */
|
||||
@@ -1308,6 +1327,12 @@ struct Lookaside {
|
||||
u32 anStat[3]; /* 0: hits. 1: size misses. 2: full misses */
|
||||
LookasideSlot *pInit; /* List of buffers not previously used */
|
||||
LookasideSlot *pFree; /* List of available buffers */
|
||||
#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE
|
||||
LookasideSlot *pSmallInit; /* List of small buffers not prediously used */
|
||||
LookasideSlot *pSmallFree; /* List of available small buffers */
|
||||
void *pMiddle; /* First byte past end of full-size buffers and
|
||||
** the first byte of LOOKASIDE_SMALL buffers */
|
||||
#endif /* SQLITE_OMIT_TWOSIZE_LOOKASIDE */
|
||||
void *pStart; /* First byte of available memory space */
|
||||
void *pEnd; /* First byte past end of available space */
|
||||
};
|
||||
@@ -1319,6 +1344,13 @@ struct LookasideSlot {
|
||||
#define EnableLookaside db->lookaside.bDisable--;\
|
||||
db->lookaside.sz=db->lookaside.bDisable?0:db->lookaside.szTrue
|
||||
|
||||
/* Size of the smaller allocations in two-size lookside */
|
||||
#ifdef SQLITE_OMIT_TWOSIZE_LOOKASIDE
|
||||
# define LOOKASIDE_SMALL 0
|
||||
#else
|
||||
# define LOOKASIDE_SMALL 128
|
||||
#endif
|
||||
|
||||
/*
|
||||
** A hash table for built-in function definitions. (Application-defined
|
||||
** functions use a regular table table from hash.h.)
|
||||
@@ -1600,6 +1632,7 @@ struct sqlite3 {
|
||||
#define DBFLAG_Vacuum 0x0004 /* Currently in a VACUUM */
|
||||
#define DBFLAG_VacuumInto 0x0008 /* Currently running VACUUM INTO */
|
||||
#define DBFLAG_SchemaKnownOk 0x0010 /* Schema is known to be valid */
|
||||
#define DBFLAG_InternalFunc 0x0020 /* Allow use of internal functions */
|
||||
|
||||
/*
|
||||
** Bits of the sqlite3.dbOptFlags field that are used by the
|
||||
@@ -1723,12 +1756,21 @@ struct FuncDestructor {
|
||||
#define SQLITE_FUNC_MINMAX 0x1000 /* True for min() and max() aggregates */
|
||||
#define SQLITE_FUNC_SLOCHNG 0x2000 /* "Slow Change". Value constant during a
|
||||
** single query - might change over time */
|
||||
#define SQLITE_FUNC_AFFINITY 0x4000 /* Built-in affinity() function */
|
||||
#define SQLITE_FUNC_TEST 0x4000 /* Built-in testing functions */
|
||||
#define SQLITE_FUNC_OFFSET 0x8000 /* Built-in sqlite_offset() function */
|
||||
#define SQLITE_FUNC_WINDOW 0x00010000 /* Built-in window-only function */
|
||||
#define SQLITE_FUNC_INTERNAL 0x00040000 /* For use by NestedParse() only */
|
||||
#define SQLITE_FUNC_DIRECT 0x00080000 /* Not for use in TRIGGERs or VIEWs */
|
||||
#define SQLITE_FUNC_SUBTYPE 0x00100000 /* Result likely to have sub-type */
|
||||
#define SQLITE_FUNC_INLINE 0x00200000 /* Functions implemented in-line */
|
||||
|
||||
/* Identifier numbers for each in-line function */
|
||||
#define INLINEFUNC_coalesce 0
|
||||
#define INLINEFUNC_implies_nonnull_row 1
|
||||
#define INLINEFUNC_expr_implies_expr 2
|
||||
#define INLINEFUNC_expr_compare 3
|
||||
#define INLINEFUNC_affinity 4
|
||||
#define INLINEFUNC_unlikely 99 /* Default case */
|
||||
|
||||
/*
|
||||
** The following three macros, FUNCTION(), LIKEFUNC() and AGGREGATE() are
|
||||
@@ -1748,6 +1790,18 @@ struct FuncDestructor {
|
||||
** Like FUNCTION except it omits the SQLITE_FUNC_CONSTANT flag and
|
||||
** adds the SQLITE_DIRECTONLY flag.
|
||||
**
|
||||
** INLINE_FUNC(zName, nArg, iFuncId, mFlags)
|
||||
** zName is the name of a function that is implemented by in-line
|
||||
** byte code rather than by the usual callbacks. The iFuncId
|
||||
** parameter determines the function id. The mFlags parameter is
|
||||
** optional SQLITE_FUNC_ flags for this function.
|
||||
**
|
||||
** TEST_FUNC(zName, nArg, iFuncId, mFlags)
|
||||
** zName is the name of a test-only function implemented by in-line
|
||||
** byte code rather than by the usual callbacks. The iFuncId
|
||||
** parameter determines the function id. The mFlags parameter is
|
||||
** optional SQLITE_FUNC_ flags for this function.
|
||||
**
|
||||
** DFUNCTION(zName, nArg, iArg, bNC, xFunc)
|
||||
** Like FUNCTION except it omits the SQLITE_FUNC_CONSTANT flag and
|
||||
** adds the SQLITE_FUNC_SLOCHNG flag. Used for date & time functions
|
||||
@@ -1790,6 +1844,13 @@ struct FuncDestructor {
|
||||
#define SFUNCTION(zName, nArg, iArg, bNC, xFunc) \
|
||||
{nArg, SQLITE_UTF8|SQLITE_DIRECTONLY, \
|
||||
SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, 0, #zName, {0} }
|
||||
#define INLINE_FUNC(zName, nArg, iArg, mFlags) \
|
||||
{nArg, SQLITE_UTF8|SQLITE_FUNC_INLINE|SQLITE_FUNC_CONSTANT|(mFlags), \
|
||||
SQLITE_INT_TO_PTR(iArg), 0, noopFunc, 0, 0, 0, #zName, {0} }
|
||||
#define TEST_FUNC(zName, nArg, iArg, mFlags) \
|
||||
{nArg, SQLITE_UTF8|SQLITE_FUNC_INTERNAL|SQLITE_FUNC_TEST| \
|
||||
SQLITE_FUNC_INLINE|SQLITE_FUNC_CONSTANT|(mFlags), \
|
||||
SQLITE_INT_TO_PTR(iArg), 0, noopFunc, 0, 0, 0, #zName, {0} }
|
||||
#define DFUNCTION(zName, nArg, iArg, bNC, xFunc) \
|
||||
{nArg, SQLITE_FUNC_SLOCHNG|SQLITE_UTF8, \
|
||||
0, 0, xFunc, 0, 0, 0, #zName, {0} }
|
||||
@@ -2674,23 +2735,28 @@ struct Expr {
|
||||
** also be used as the argument to a function, in which case the a.zName
|
||||
** field is not used.
|
||||
**
|
||||
** By default the Expr.zSpan field holds a human-readable description of
|
||||
** the expression that is used in the generation of error messages and
|
||||
** column labels. In this case, Expr.zSpan is typically the text of a
|
||||
** column expression as it exists in a SELECT statement. However, if
|
||||
** the bSpanIsTab flag is set, then zSpan is overloaded to mean the name
|
||||
** of the result column in the form: DATABASE.TABLE.COLUMN. This later
|
||||
** form is used for name resolution with nested FROM clauses.
|
||||
** In order to try to keep memory usage down, the Expr.a.zEName field
|
||||
** is used for multiple purposes:
|
||||
**
|
||||
** eEName Usage
|
||||
** ---------- -------------------------
|
||||
** ENAME_NAME (1) the AS of result set column
|
||||
** (2) COLUMN= of an UPDATE
|
||||
**
|
||||
** ENAME_TAB DB.TABLE.NAME used to resolve names
|
||||
** of subqueries
|
||||
**
|
||||
** ENAME_SPAN Text of the original result set
|
||||
** expression.
|
||||
*/
|
||||
struct ExprList {
|
||||
int nExpr; /* Number of expressions on the list */
|
||||
struct ExprList_item { /* For each expression in the list */
|
||||
Expr *pExpr; /* The parse tree for this expression */
|
||||
char *zName; /* Token associated with this expression */
|
||||
char *zSpan; /* Original text of the expression */
|
||||
char *zEName; /* Token associated with this expression */
|
||||
u8 sortFlags; /* Mask of KEYINFO_ORDER_* flags */
|
||||
unsigned eEName :2; /* Meaning of zEName */
|
||||
unsigned done :1; /* A flag to indicate when processing is finished */
|
||||
unsigned bSpanIsTab :1; /* zSpan holds DB.TABLE.COLUMN */
|
||||
unsigned reusable :1; /* Constant expression is reusable */
|
||||
unsigned bSorterRef :1; /* Defer evaluation until after sorting */
|
||||
unsigned bNulls: 1; /* True if explicit "NULLS FIRST/LAST" */
|
||||
@@ -2704,6 +2770,13 @@ struct ExprList {
|
||||
} a[1]; /* One slot for each expression in the list */
|
||||
};
|
||||
|
||||
/*
|
||||
** Allowed values for Expr.a.eEName
|
||||
*/
|
||||
#define ENAME_NAME 0 /* The AS clause of a result set */
|
||||
#define ENAME_SPAN 1 /* Complete text of the result set expression */
|
||||
#define ENAME_TAB 2 /* "DB.TABLE.NAME" for the result set */
|
||||
|
||||
/*
|
||||
** An instance of this structure can hold a simple list of identifiers,
|
||||
** such as the list "a,b,c" in the following statements:
|
||||
@@ -3547,7 +3620,6 @@ struct Sqlite3Config {
|
||||
int (*xTestCallback)(int); /* Invoked by sqlite3FaultSim() */
|
||||
#endif
|
||||
int bLocaltimeFault; /* True to fail localtime() calls */
|
||||
int bInternalFunctions; /* Internal SQL functions are visible */
|
||||
int iOnceResetThreshold; /* When to reset OP_Once counters */
|
||||
u32 szSorterRef; /* Min size in bytes to use sorter-refs */
|
||||
unsigned int iPrngSeed; /* Alternative fixed seed for the PRNG */
|
||||
@@ -3710,7 +3782,7 @@ Window *sqlite3WindowAlloc(Parse*, int, int, Expr*, int , Expr*, u8);
|
||||
void sqlite3WindowAttach(Parse*, Expr*, Window*);
|
||||
void sqlite3WindowLink(Select *pSel, Window *pWin);
|
||||
int sqlite3WindowCompare(Parse*, Window*, Window*, int);
|
||||
void sqlite3WindowCodeInit(Parse*, Window*);
|
||||
void sqlite3WindowCodeInit(Parse*, Select*);
|
||||
void sqlite3WindowCodeStep(Parse*, Select*, WhereInfo*, int, int);
|
||||
int sqlite3WindowRewrite(Parse*, Select*);
|
||||
int sqlite3ExpandSubquery(Parse*, struct SrcList_item*);
|
||||
@@ -4444,7 +4516,12 @@ void sqlite3CodeRhsOfIN(Parse*, Expr*, int);
|
||||
int sqlite3CodeSubselect(Parse*, Expr*);
|
||||
void sqlite3SelectPrep(Parse*, Select*, NameContext*);
|
||||
void sqlite3SelectWrongNumTermsError(Parse *pParse, Select *p);
|
||||
int sqlite3MatchSpanName(const char*, const char*, const char*, const char*);
|
||||
int sqlite3MatchEName(
|
||||
const struct ExprList_item*,
|
||||
const char*,
|
||||
const char*,
|
||||
const char*
|
||||
);
|
||||
int sqlite3ResolveExprNames(NameContext*, Expr*);
|
||||
int sqlite3ResolveExprListNames(NameContext*, ExprList*);
|
||||
void sqlite3ResolveSelectNames(Parse*, Select*, NameContext*);
|
||||
|
||||
Reference in New Issue
Block a user