Merge all the latest trunk fixes and enhancements into the json5 branch.
FossilOrigin-Name: b5ca15cfc19380cf870b70be6a86e70f2026cc3d6d89005b45891d58c4f11c2d
This commit is contained in:
@@ -38,4 +38,8 @@
|
||||
#define SQLITE_4_BYTE_ALIGNED_MALLOC
|
||||
#endif /* defined(_MSC_VER) && !defined(_WIN64) */
|
||||
|
||||
#if !defined(HAVE_LOG2) && defined(_MSC_VER) && _MSC_VER<1800
|
||||
#define HAVE_LOG2 0
|
||||
#endif /* !defined(HAVE_LOG2) && defined(_MSC_VER) && _MSC_VER<1800 */
|
||||
|
||||
#endif /* SQLITE_MSVC_H */
|
||||
|
||||
+10
-3
@@ -5197,7 +5197,7 @@ static int winOpen(
|
||||
if( isReadWrite ){
|
||||
int rc2, isRO = 0;
|
||||
sqlite3BeginBenignMalloc();
|
||||
rc2 = winAccess(pVfs, zName, SQLITE_ACCESS_READ, &isRO);
|
||||
rc2 = winAccess(pVfs, zUtf8Name, SQLITE_ACCESS_READ, &isRO);
|
||||
sqlite3EndBenignMalloc();
|
||||
if( rc2==SQLITE_OK && isRO ) break;
|
||||
}
|
||||
@@ -5214,7 +5214,7 @@ static int winOpen(
|
||||
if( isReadWrite ){
|
||||
int rc2, isRO = 0;
|
||||
sqlite3BeginBenignMalloc();
|
||||
rc2 = winAccess(pVfs, zName, SQLITE_ACCESS_READ, &isRO);
|
||||
rc2 = winAccess(pVfs, zUtf8Name, SQLITE_ACCESS_READ, &isRO);
|
||||
sqlite3EndBenignMalloc();
|
||||
if( rc2==SQLITE_OK && isRO ) break;
|
||||
}
|
||||
@@ -5234,7 +5234,7 @@ static int winOpen(
|
||||
if( isReadWrite ){
|
||||
int rc2, isRO = 0;
|
||||
sqlite3BeginBenignMalloc();
|
||||
rc2 = winAccess(pVfs, zName, SQLITE_ACCESS_READ, &isRO);
|
||||
rc2 = winAccess(pVfs, zUtf8Name, SQLITE_ACCESS_READ, &isRO);
|
||||
sqlite3EndBenignMalloc();
|
||||
if( rc2==SQLITE_OK && isRO ) break;
|
||||
}
|
||||
@@ -5457,6 +5457,13 @@ static int winAccess(
|
||||
OSTRACE(("ACCESS name=%s, flags=%x, pResOut=%p\n",
|
||||
zFilename, flags, pResOut));
|
||||
|
||||
if( zFilename==0 ){
|
||||
*pResOut = 0;
|
||||
OSTRACE(("ACCESS name=%s, pResOut=%p, *pResOut=%d, rc=SQLITE_OK\n",
|
||||
zFilename, pResOut, *pResOut));
|
||||
return SQLITE_OK;
|
||||
}
|
||||
|
||||
zConverted = winConvertFromUtf8Filename(zFilename);
|
||||
if( zConverted==0 ){
|
||||
OSTRACE(("ACCESS name=%s, rc=SQLITE_IOERR_NOMEM\n", zFilename));
|
||||
|
||||
+10
-3
@@ -1860,6 +1860,7 @@ static void output_quoted_string(FILE *out, const char *z){
|
||||
int i;
|
||||
char c;
|
||||
setBinaryMode(out, 1);
|
||||
if( z==0 ) return;
|
||||
for(i=0; (c = z[i])!=0 && c!='\''; i++){}
|
||||
if( c==0 ){
|
||||
utf8_printf(out,"'%s'",z);
|
||||
@@ -3565,10 +3566,14 @@ static void bind_prepared_stmt(ShellState *pArg, sqlite3_stmt *pStmt){
|
||||
sqlite3_bind_text(pQ, 1, zVar, -1, SQLITE_STATIC);
|
||||
if( rc==SQLITE_OK && pQ && sqlite3_step(pQ)==SQLITE_ROW ){
|
||||
sqlite3_bind_value(pStmt, i, sqlite3_column_value(pQ, 0));
|
||||
#ifdef NAN
|
||||
}else if( sqlite3_strlike("_NAN", zVar, 0)==0 ){
|
||||
sqlite3_bind_double(pStmt, i, NAN);
|
||||
#endif
|
||||
#ifdef INFINITY
|
||||
}else if( sqlite3_strlike("_INF", zVar, 0)==0 ){
|
||||
sqlite3_bind_double(pStmt, i, INFINITY);
|
||||
#endif
|
||||
}else{
|
||||
sqlite3_bind_null(pStmt, i);
|
||||
}
|
||||
@@ -4995,10 +5000,10 @@ static int showHelp(FILE *out, const char *zPattern){
|
||||
** Otherwise => whole help for documented commands
|
||||
*/
|
||||
enum HelpWanted hw = HW_SummaryOnly;
|
||||
enum HelpHave hh = HH_More;
|
||||
if( zPattern!=0 ){
|
||||
hw = (*zPattern=='0')? HW_NoCull|HW_Undoc : HW_NoCull;
|
||||
}
|
||||
enum HelpHave hh = HH_More;
|
||||
for(i=0; i<ArraySize(azHelp); i++){
|
||||
switch( azHelp[i][0] ){
|
||||
case ',':
|
||||
@@ -9187,7 +9192,8 @@ static int do_meta_command(char *zLine, ShellState *p){
|
||||
const char *zFile, *zProc;
|
||||
char *zErrMsg = 0;
|
||||
failIfSafeMode(p, "cannot run .load in safe mode");
|
||||
if( nArg<2 ){
|
||||
if( nArg<2 || azArg[1][0]==0 ){
|
||||
/* Must have a non-empty FILE. (Will not load self.) */
|
||||
raw_printf(stderr, "Usage: .load FILE ?ENTRYPOINT?\n");
|
||||
rc = 1;
|
||||
goto meta_command_exit;
|
||||
@@ -10512,7 +10518,8 @@ static int do_meta_command(char *zLine, ShellState *p){
|
||||
if( bDebug ) utf8_printf(p->out, "%s\n", zRevText);
|
||||
lrc = sqlite3_prepare_v2(p->db, zRevText, -1, &pStmt, 0);
|
||||
if( lrc!=SQLITE_OK ){
|
||||
assert(lrc==SQLITE_NOMEM);
|
||||
/* assert(lrc==SQLITE_NOMEM); // might also be SQLITE_ERROR if the
|
||||
** user does cruel and unnatural things like ".limit expr_depth 0". */
|
||||
rc = 1;
|
||||
}else{
|
||||
if( zLike ) sqlite3_bind_text(pStmt,1,zLike,-1,SQLITE_STATIC);
|
||||
|
||||
+2
-2
@@ -2745,7 +2745,7 @@ case OP_IfNullRow: { /* jump */
|
||||
VdbeCursor *pC;
|
||||
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
|
||||
pC = p->apCsr[pOp->p1];
|
||||
if( ALWAYS(pC) && pC->nullRow ){
|
||||
if( pC && pC->nullRow ){
|
||||
sqlite3VdbeMemSetNull(aMem + pOp->p3);
|
||||
goto jump_to_p2;
|
||||
}
|
||||
@@ -3240,7 +3240,7 @@ case OP_Affinity: {
|
||||
}else{
|
||||
pIn1->u.r = (double)pIn1->u.i;
|
||||
pIn1->flags |= MEM_Real;
|
||||
pIn1->flags &= ~MEM_Int;
|
||||
pIn1->flags &= ~(MEM_Int|MEM_Str);
|
||||
}
|
||||
}
|
||||
REGISTER_TRACE((int)(pIn1-aMem), pIn1);
|
||||
|
||||
+3
-2
@@ -1337,9 +1337,9 @@ static const void *columnName(
|
||||
assert( db!=0 );
|
||||
n = sqlite3_column_count(pStmt);
|
||||
if( N<n && N>=0 ){
|
||||
u8 prior_mallocFailed = db->mallocFailed;
|
||||
N += useType*n;
|
||||
sqlite3_mutex_enter(db->mutex);
|
||||
assert( db->mallocFailed==0 );
|
||||
#ifndef SQLITE_OMIT_UTF16
|
||||
if( useUtf16 ){
|
||||
ret = sqlite3_value_text16((sqlite3_value*)&p->aColName[N]);
|
||||
@@ -1351,7 +1351,8 @@ static const void *columnName(
|
||||
/* A malloc may have failed inside of the _text() call. If this
|
||||
** is the case, clear the mallocFailed flag and return NULL.
|
||||
*/
|
||||
if( db->mallocFailed ){
|
||||
assert( db->mallocFailed==0 || db->mallocFailed==1 );
|
||||
if( db->mallocFailed > prior_mallocFailed ){
|
||||
sqlite3OomClear(db);
|
||||
ret = 0;
|
||||
}
|
||||
|
||||
@@ -157,6 +157,7 @@ int sqlite3VdbeMemValidStrRep(Mem *p){
|
||||
char *z;
|
||||
int i, j, incr;
|
||||
if( (p->flags & MEM_Str)==0 ) return 1;
|
||||
if( p->db && p->db->mallocFailed ) return 1;
|
||||
if( p->flags & MEM_Term ){
|
||||
/* Insure that the string is properly zero-terminated. Pay particular
|
||||
** attention to the case where p->n is odd */
|
||||
|
||||
+34
-11
@@ -5982,22 +5982,45 @@ WhereInfo *sqlite3WhereBegin(
|
||||
}
|
||||
if( pParse->nErr ) goto whereBeginError;
|
||||
|
||||
/* Special case: WHERE terms that do not refer to any tables in the join
|
||||
** (constant expressions). Evaluate each such term, and jump over all the
|
||||
** generated code if the result is not true.
|
||||
/* The False-WHERE-Term-Bypass optimization:
|
||||
**
|
||||
** Do not do this if the expression contains non-deterministic functions
|
||||
** that are not within a sub-select. This is not strictly required, but
|
||||
** preserves SQLite's legacy behaviour in the following two cases:
|
||||
** If there are WHERE terms that are false, then no rows will be output,
|
||||
** so skip over all of the code generated here.
|
||||
**
|
||||
** FROM ... WHERE random()>0; -- eval random() once per row
|
||||
** FROM ... WHERE (SELECT random())>0; -- eval random() once overall
|
||||
** Conditions:
|
||||
**
|
||||
** (1) The WHERE term must not refer to any tables in the join.
|
||||
** (2) The term must not come from an ON clause on the
|
||||
** right-hand side of a LEFT or FULL JOIN.
|
||||
** (3) The term must not come from an ON clause, or there must be
|
||||
** no RIGHT or FULL OUTER joins in pTabList.
|
||||
** (4) If the expression contains non-deterministic functions
|
||||
** that are not within a sub-select. This is not required
|
||||
** for correctness but rather to preserves SQLite's legacy
|
||||
** behaviour in the following two cases:
|
||||
**
|
||||
** WHERE random()>0; -- eval random() once per row
|
||||
** WHERE (SELECT random())>0; -- eval random() just once overall
|
||||
**
|
||||
** Note that the Where term need not be a constant in order for this
|
||||
** optimization to apply, though it does need to be constant relative to
|
||||
** the current subquery (condition 1). The term might include variables
|
||||
** from outer queries so that the value of the term changes from one
|
||||
** invocation of the current subquery to the next.
|
||||
*/
|
||||
for(ii=0; ii<sWLB.pWC->nBase; ii++){
|
||||
WhereTerm *pT = &sWLB.pWC->a[ii];
|
||||
WhereTerm *pT = &sWLB.pWC->a[ii]; /* A term of the WHERE clause */
|
||||
Expr *pX; /* The expression of pT */
|
||||
if( pT->wtFlags & TERM_VIRTUAL ) continue;
|
||||
if( pT->prereqAll==0 && (nTabList==0 || exprIsDeterministic(pT->pExpr)) ){
|
||||
sqlite3ExprIfFalse(pParse, pT->pExpr, pWInfo->iBreak, SQLITE_JUMPIFNULL);
|
||||
pX = pT->pExpr;
|
||||
assert( pX!=0 );
|
||||
assert( pT->prereqAll!=0 || !ExprHasProperty(pX, EP_OuterON) );
|
||||
if( pT->prereqAll==0 /* Conditions (1) and (2) */
|
||||
&& (nTabList==0 || exprIsDeterministic(pX)) /* Condition (4) */
|
||||
&& !(ExprHasProperty(pX, EP_InnerON) /* Condition (3) */
|
||||
&& (pTabList->a[0].fg.jointype & JT_LTORJ)!=0 )
|
||||
){
|
||||
sqlite3ExprIfFalse(pParse, pX, pWInfo->iBreak, SQLITE_JUMPIFNULL);
|
||||
pT->wtFlags |= TERM_CODED;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user