Hi all:

A potential circular dependency has been found in my recent work caused by 
materialized view union rewriting, but I am not sure if it is bug, maybe it’s 
by design. That's why I send a email instead of creating a JIRA issue directly.

I write a simple example to describe the problem, consider a query, we call the 
query is filter#1, just like:

Filter(condition=[AND(ISNOTNULL($0), ISNOTNULL($1))])
    Project(a=[$0], b=[$1])
        Filter(condition=[EQ($0, ‘o')])
            TableScan(table=[p.src])

And there is a materialized view, we call it mv#1, just like:

Project(a=[$0], b=[$1])
    Filter(condition=[AND(ISNOTNULL($0), ISNOTNULL($1), EQ($0, ‘o'))])
        TableScan(table=[p.src])

Materialized view union rewriting will get the result when optimizing the input 
of filter#1:

Union(all=[true])
    TableScan(table=[mv#1])
    Project(a=[$0], b=[$1])
        Filter(condition=[AND(OR(ISNULL($0), ISNULL($1)), EQ($0, ‘o'))])
            TableScan(table=[p.src])

We call the union is union#1.

And when we optimize filter#1, materialized view rewriting will get the result:

TableScan(table=[mv#1])

So the filter#1 and the mv#1 will be in a same RelSet, we call the RelSet is 
set#1.
And union#1 is an input of filter#1, mv#1 is an input of union#1, mv#1 and 
filter#1 both in set#1. So a circular dependency occurred.

Infinite loop problems will occur in  some push down optimizing rules because 
of the circular dependency.

I'm not sure if this kind of circular dependency is allowed in optimize phase, 
otherwise the infinite loop should be fixed in push down optimizing rules.


Mou Wu
Best regards

Reply via email to