It’s problematic doing such a transformation in a rule. Why? Rules are supposed 
to preserve semantics, i.e. convert a RelNode to one that produces the same 
result. If a rule converts A to B then the engine is at liberty to choose A or 
B (or something derived from A, or something derived from B), whichever is 
cheaper. And that’s valid because they all give the same result, right?!

Try this: write your own RelShuttle (RelShuttleImpl and RelHomogeneousShuttle 
are useful partial implementations) and apply it soon after Sql-to-rel 
translation.

Julian
 




> On Mar 24, 2017, at 7:16 PM, Jingwu Li <[email protected]> wrote:
> 
> Hi all,
> 
>       Is there a way to do value transformation for a sql query? For example, 
> select * from user where user_id = 1234 need to transform to select * from 
> user where user_id = 5678.
> 
>       I have tried to create a planner rule similar to JdbcFilterRule which 
> match the LogicalFilter and created a value transformer visitor to do the 
> value transformation. But after the optimization phase, ether my cutomized 
> transformation relnode does not get selected due to the cost is not cheapest 
> or the transformation has applied multiple times thus the value got 
> transformed to unexpected value ( 1234 -> 5678 -> 9012 ...). Is this a right 
> place to do such value transformation?
> 
>      I also looked at the query parsing phase and try to find a place to get 
> the parsed sqlnode tree.  It seems hard to add a visitor to do the 
> transformation when traversal the tree.
> 
>      Could you give some thoughts?
> 
> 
>     Regards,
> 
>     Jingwu Li
> 
> 
> 

Reply via email to