code: public function select($columns, $option = null)
      {
          if ($columns instanceof ExpressionInterface) {
              $columns = [$columns];
          } elseif (!is_array($columns)) {
              $columns = preg_split('/\s*,\s*/', trim($columns), -1, PREG_SPLIT_NO_EMPTY);
          }
          // this sequantial assignment is needed in order to make sure select is being reset
          // before using getUniqueColumns() that checks it
          $this->select = [];
          $this->select = $this->getUniqueColumns($columns);
          $this->selectOption = $option;
          return $this;
      }
docs: Sets the SELECT part of the query.
  @param string|array|ExpressionInterface $columns the columns to be selected.
  Columns can be specified in either a string (e.g. "id, name") or an array (e.g. ['id', 'name']).
  Columns can be prefixed with table names (e.g. "user.id") and/or contain column aliases (e.g. "user.id AS user_id").
  The method will automatically quote the column names unless a column contains some parenthesis
  (which means the column contains a DB expression). A DB expression may also be passed in form of
  an [[ExpressionInterface]] object.
  
  Note that if you are selecting an expression like `CONCAT(first_name, ' ', last_name)`, you should
  use an array to specify the columns. Otherwise, the expression may be incorrectly split into several parts.
  
  When the columns are specified as an array, you may also use array keys as the column aliases (if a column
  does not need alias, do not use a string key).
  
  Starting from version 2.0.1, you may also select sub-queries as columns by specifying each such column
  as a `Query` instance representing the sub-query.
  
  @param string $option additional option that should be appended to the 'SELECT' keyword. For example,
  in MySQL, the option 'SQL_CALC_FOUND_ROWS' can be used.
  @return $this the query object itself