On 4/3/18, Richard Hipp <[email protected]> wrote:
>
> Probably there will be a 3.23.1 patch release later today.
>
Or, maybe not.
If the series.c file is compiled with -DSQLITE_SERIES_CONSTRAINT_VERIFY=1 then
the generate_series() virtual table behaves correctly, and Edzard's
example gives a correct answer both before and after the new LEFT JOIN
strength reduction optimization is added.
Without the -DSQLITE_SERIES_CONSTRAINT_VERIFY=1 compile-time option,
the test case consistently gives the wrong answer. Here is an
alternative test case:
WITH
t1(x) AS (VALUES(1),(2)),
t2(y,z) AS (VALUES(2,1))
SELECT * FROM t1 LEFT JOIN t2 ON x=y JOIN generate_series
WHERE start=z AND stop=2;
The query above should return only two rows:
2 2 1 1
2 2 1 2
But it instead returns 5 rows, because the generate_series virtual
table is telling the code generate that it does not need to check the
start=z constraint. When the start=z constraint is not checked, then
indeed 5 rows are generated because the query becomes equivalent to
this:
WITH
t1(x) AS (VALUES(1),(2)),
t2(y,z) AS (VALUES(2,1))
SELECT * FROM t1 LEFT JOIN t2 ON x=y JOIN generate_series
WHERE start=coalesce(z,0) AND stop=2;
I'm testing a patch now that causes the LEFT JOIN strength reduction
optimization to assume that NULL arguments to a virtual table
constraint can return a TRUE result. But I'm wondering, since this is
really a work-around to problems in virtual table implementations, if
this change warrants a patch release?
Your thoughts?
Should we issue 3.23.1 just to work around dodgy virtual table
implementations? Or should we just check-in the change and let those
who want to continue using their dodgy virtual tables either patch the
issue themselves or wait for 3.24.0?
--
D. Richard Hipp
[email protected]
_______________________________________________
sqlite-users mailing list
[email protected]
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users