boolean allSame = expr==project.expression();
for(int i = 0, arity = project.arity(); i < arity; i++) {
cols[i] = project.column(i).accept(this);
allSame = allSame && (cols[i]==project.column(i));
}
ret = allSame ? project : expr.project(cols);
return cache(project, ret);
}
/**
* Calls lookup(castExpr) and returns the cached value, if any. If a replacement
* has not been cached, visits the expression's child. If nothing changes, the argument