@Override
 public Info visitLeave(RowValueConstructorExpression node, List<Info> l) {
   // Child expression returned null and was filtered, so not order preserving
   if (l.size() != node.getChildren().size()) {
     return null;
   }
   Info firstInfo = l.get(0);
   Info lastInfo = firstInfo;
   // Check that pkPos are consecutive which is the only way a RVC can be order preserving
   for (int i = 1; i < l.size(); i++) {
     // not order preserving since it's not last
     if (lastInfo.orderPreserving == OrderPreserving.YES_IF_LAST) {
       return null;
     }
     Info info = l.get(i);
     // not order preserving since there's a gap in the pk
     if (info.pkPosition != lastInfo.pkPosition + 1) {
       return null;
     }
     lastInfo = info;
   }
   return new Info(firstInfo, l.size(), lastInfo.orderPreserving);
 }
 @Override
 public Iterator<Expression> visitEnter(RowValueConstructorExpression node) {
   return node.getChildren().iterator();
 }