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 > > >
