code: protected function prepareInsertSelectSubQuery($columns, $schema, $params = [])
      {
          if (!is_array($columns->select) || empty($columns->select) || in_array('*', $columns->select)) {
              throw new InvalidArgumentException('Expected select query object with enumerated (named) parameters');
          }
  
          list($values, $params) = $this->build($columns, $params);
          $names = [];
          $values = ' ' . $values;
          foreach ($columns->select as $title => $field) {
              if (is_string($title)) {
                  $names[] = $schema->quoteColumnName($title);
              } elseif (preg_match('/^(.*?)(?i:\s+as\s+|\s+)([\w\-_\.]+)$/', $field, $matches)) {
                  $names[] = $schema->quoteColumnName($matches[2]);
              } else {
                  $names[] = $schema->quoteColumnName($field);
              }
          }
  
          return [$names, $values, $params];
      }
docs: Prepare select-subquery and field names for INSERT INTO ... SELECT SQL statement.
  
  @param Query $columns Object, which represents select query.
  @param \yii\db\Schema $schema Schema object to quote column name.
  @param array $params the parameters to be bound to the generated SQL statement. These parameters will
  be included in the result with the additional parameters generated during the query building process.
  @return array array of column names, values and params.
  @throws InvalidArgumentException if query's select does not contain named parameters only.
  @since 2.0.11