Hello,
I have found an obscure bug in the virtual table processing.

The schema looks like this:
CREATE TABLE t1 (id int, value text);
INSERT INTO t1 VALUES(1,'try');
CREATE TABLE t2 (ctx int, id int, value text);
INSERT INTO t2 VALUES(1,1,'good');
INSERT INTO t2 VALUES(2,2,'evil');

The following query works ok if t1 and t2 are real:
sqlite> select * from t2 left join t1 on t1.id=t2.ctx where t1.value is null;
2|2|evil||

If they are virtual (and the module implements ISNULL processing) the result is wrong: sqlite> select * from t2 left join t1 on t1.id=t2.ctx where t1.value is null;
1|1|good||
2|2|evil||

Looking at WhereTrace I can see the ISNULL term applied to t1 without the L flag. The virtual module correctly returns 0 records for t1 search, but t2 records are returned anyway.

As a workaround I can use a unary operator, effective blocking the ISNULL term processing in virtual module: sqlite> select * from t2 left join t1 on t1.id=t2.ctx where +t1.value is null;
2|2|evil||

Best regards,
Joe
_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to