aboutsummaryrefslogtreecommitdiff
path: root/src/expr.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/expr.c')
-rw-r--r--src/expr.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/src/expr.c b/src/expr.c
index e1efeba2b..21fa97d8e 100644
--- a/src/expr.c
+++ b/src/expr.c
@@ -3649,9 +3649,14 @@ expr_code_doover:
Table *pTab = pExpr->y.pTab;
int iSrc;
int iCol = pExpr->iColumn;
+ if( pTab==0 ){
+ assert( CORRUPT_DB );
+ sqlite3VdbeAddOp2(v, OP_Null, 0, target);
+ return target;
+ }
assert( pTab!=0 );
assert( iCol>=XN_ROWID );
- assert( iCol<pExpr->y.pTab->nCol );
+ assert( iCol<pTab->nCol );
if( iCol<0 ){
return -1-pParse->iSelfTab;
}
@@ -3717,9 +3722,10 @@ expr_code_doover:
default: {
/* Make NULL the default case so that if a bug causes an illegal
** Expr node to be passed into this function, it will be handled
- ** sanely and not crash. But keep an assert() to bring the problem
- ** to the attention of the developers. */
- assert( op==TK_NULL );
+ ** sanely and not crash. This comes up, for example, if a corrupt
+ ** database schema is loaded using PRAGMA writable_schema=ON. */
+ assert( op==TK_NULL || CORRUPT_DB );
+ testcase( op!=TK_NULL );
sqlite3VdbeAddOp2(v, OP_Null, 0, target);
return target;
}