function testTree_IndexRangeScan_CrossColumnIndex() {
  var treeBefore =
      'project()\n' +
      '-order_by(CrossColumnTable.string DESC, ' +
          'CrossColumnTable.number DESC)\n' +
      '--select(value_pred(CrossColumnTable.boolean eq false))\n' +
      '---table_access_by_row_id(CrossColumnTable)\n' +
      '----index_range_scan(CrossColumnTable.idx_crossColumn, ' +
          '[unbound, unbound],[unbound, 10], natural)\n';

  var treeAfter =
      'project()\n' +
      '-select(value_pred(CrossColumnTable.boolean eq false))\n' +
      '--table_access_by_row_id(CrossColumnTable)\n' +
      '---index_range_scan(CrossColumnTable.idx_crossColumn, ' +
          '[unbound, unbound],[unbound, 10], reverse)\n';

  lf.testing.treeutil.assertTreeTransformation(
      constructTree3(lf.Order.DESC, lf.Order.DESC),
      treeBefore, treeAfter, pass);
}
Tests the case where an existing IndexRangeScanStep can be leveraged to
perform the ORDER BY. The optimization pass simply removes the ORDER BY node
and adjusts the IndexRangeScanStep's ordering to match the requested order.