> What if we kill RelNode.getChildExps and add RelNode
> RelNode.accept(RexShuttle shuttle) instead?
+1 That method is very general-purpose. I like it.
It should respect the immutability of RelNodes and return a new
RelNode iff there are changes. Most RelNodes, except sub-classes of
project, filter, join, will just 'return this' right away.
The shuttle must make only very limited changes. Even changing the
output type of an expression should not be allowed. We can relax these
restrictions later, if justified.