Implementation of one of the rule-based optimization steps. ColumnPruner gets
the current operator tree. The \ tree is traversed to find out the columns
used for all the base tables. If all the columns for a table are not used, a
select is pushed on top of that table (to select only those columns). Since
this changes the row resolver, the tree is built again. This can be optimized
later to patch the tree.