private static Operator<?> createSelect(RelDataType relDataType, Operator<?> parentOp) {
    List<String> columnNames = new ArrayList<>();
    List<ExprNodeDesc> exprNodeDescList = new ArrayList<>();
    Map<String, ExprNodeDesc> colExprMap = new HashMap<>();
    List<ColumnInfo> colInfoList = new ArrayList<>();

    for (int i = 0; i < relDataType.getFieldList().size(); i++) {
      RelDataTypeField typeField = relDataType.getFieldList().get(i);

      ColumnInfo ci = new ColumnInfo(
              typeField.getName(), TypeConverter.convert(typeField.getType()), SemanticAnalyzer.DUMMY_TABLE, false);
      colInfoList.add(ci);
      columnNames.add(typeField.getName());

      ExprNodeDesc exprNodeDesc = new ExprNodeConstantDesc(TypeConverter.convert(typeField.getType()), null);
      colExprMap.put(typeField.getName(), exprNodeDesc);
      exprNodeDescList.add(exprNodeDesc);
    }

    SelectDesc sd = new SelectDesc(exprNodeDescList, columnNames);
    Operator<?> selOp = OperatorFactory.getAndMakeChild(sd, new RowSchema(colInfoList), parentOp);
    selOp.setColumnExprMap(colExprMap);
    return selOp;
  }
Converts empty {@link HiveValues} to a plan like
TS [DUMMY] - SEL [null, ..., null] - LIM [0]
ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/opconventer/HiveValuesVisitor.java