private static JdbcColumnOption columnOptionOf(
     Map<String, JdbcColumnOption> columnOptions, JdbcColumn targetColumn) {
   return Optional.fromNullable(columnOptions.get(targetColumn.getName()))
       .or(
           // default column option
           new Supplier<JdbcColumnOption>() {
             public JdbcColumnOption get() {
               return Exec.newConfigSource().loadConfig(JdbcColumnOption.class);
             }
           });
 }
  private Schema setupTask(JdbcInputConnection con, PluginTask task) throws SQLException {
    // build SELECT query and gets schema of its result
    String query = getQuery(task, con);
    logger.info("SQL: " + query);
    JdbcSchema querySchema = con.getSchemaOfQuery(query);
    task.setQuerySchema(querySchema);

    // validate column_options
    newColumnGetters(task, querySchema, null);

    ColumnGetterFactory factory = newColumnGetterFactory(null, task.getDefaultTimeZone());
    ImmutableList.Builder<Column> columns = ImmutableList.builder();
    for (int i = 0; i < querySchema.getCount(); i++) {
      JdbcColumn column = querySchema.getColumn(i);
      JdbcColumnOption columnOption = columnOptionOf(task.getColumnOptions(), column);
      columns.add(
          new Column(
              i, column.getName(), factory.newColumnGetter(column, columnOption).getToType()));
    }
    return new Schema(columns.build());
  }