aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2014-12-04 16:27:17 +0000
committerdrh <drh@noemail.net>2014-12-04 16:27:17 +0000
commit72673a24e2d38c1699d911cfca0203f5e545f78c (patch)
tree90f4ce666016c55d5f17f3b409f4c1240611e298 /src
parentd8922052b27a3d2d62ccf3cf0ef1ea9b7272124d (diff)
downloadsqlite-72673a24e2d38c1699d911cfca0203f5e545f78c.tar.gz
sqlite-72673a24e2d38c1699d911cfca0203f5e545f78c.zip
If a table is the right operand of a LEFT JOIN, then any column of that
table can be NULL even if that column as a NOT NULL constraint. Fix for ticket [6f2222d550f5b0ee7ed]. FossilOrigin-Name: 6f6fcbe4736b9468a495c684d5eebc8bfe5c566a
Diffstat (limited to 'src')
-rw-r--r--src/expr.c3
-rw-r--r--src/resolve.c4
-rw-r--r--src/sqliteInt.h3
3 files changed, 8 insertions, 2 deletions
diff --git a/src/expr.c b/src/expr.c
index c28f19622..817975ab3 100644
--- a/src/expr.c
+++ b/src/expr.c
@@ -1414,7 +1414,8 @@ int sqlite3ExprCanBeNull(const Expr *p){
return 0;
case TK_COLUMN:
assert( p->pTab!=0 );
- return p->iColumn>=0 && p->pTab->aCol[p->iColumn].notNull==0;
+ return ExprHasProperty(p, EP_CanBeNull) ||
+ (p->iColumn>=0 && p->pTab->aCol[p->iColumn].notNull==0);
default:
return 1;
}
diff --git a/src/resolve.c b/src/resolve.c
index 8fb580b3a..d4bd548c9 100644
--- a/src/resolve.c
+++ b/src/resolve.c
@@ -320,6 +320,10 @@ static int lookupName(
if( pMatch ){
pExpr->iTable = pMatch->iCursor;
pExpr->pTab = pMatch->pTab;
+ assert( (pMatch->jointype & JT_RIGHT)==0 ); /* RIGHT JOIN not (yet) supported */
+ if( (pMatch->jointype & JT_LEFT)!=0 ){
+ ExprSetProperty(pExpr, EP_CanBeNull);
+ }
pSchema = pExpr->pTab->pSchema;
}
} /* if( pSrcList ) */
diff --git a/src/sqliteInt.h b/src/sqliteInt.h
index f3d6ce015..3498517f2 100644
--- a/src/sqliteInt.h
+++ b/src/sqliteInt.h
@@ -2015,7 +2015,7 @@ struct Expr {
/*
** The following are the meanings of bits in the Expr.flags field.
*/
-#define EP_FromJoin 0x000001 /* Originated in ON or USING clause of a join */
+#define EP_FromJoin 0x000001 /* Originates in ON/USING clause of outer join */
#define EP_Agg 0x000002 /* Contains one or more aggregate functions */
#define EP_Resolved 0x000004 /* IDs have been resolved to COLUMNs */
#define EP_Error 0x000008 /* Expression contains one or more errors */
@@ -2035,6 +2035,7 @@ struct Expr {
#define EP_NoReduce 0x020000 /* Cannot EXPRDUP_REDUCE this Expr */
#define EP_Unlikely 0x040000 /* unlikely() or likelihood() function */
#define EP_Constant 0x080000 /* Node is a constant */
+#define EP_CanBeNull 0x100000 /* Can be null despite NOT NULL constraint */
/*
** These macros can be used to test, set, or clear bits in the