code: protected function cleanUpTableNames($tableNames)
      {
          $cleanedUpTableNames = [];
          foreach ($tableNames as $alias => $tableName) {
              if (is_string($tableName) && !is_string($alias)) {
                  $pattern = <<<PATTERN
  ~
  ^
  \s*
  (
  (?:['"`\[]|{{)
  .*?
  (?:['"`\]]|}})
  |
  \(.*?\)
  |
  .*?
  )
  (?:
  (?:
      \s+
      (?:as)?
      \s*
  )
  (
     (?:['"`\[]|{{)
      .*?
      (?:['"`\]]|}})
      |
      .*?
  )
  )?
  \s*
  $
  ~iux
  PATTERN;
                  if (preg_match($pattern, $tableName, $matches)) {
                      if (isset($matches[2])) {
                          list(, $tableName, $alias) = $matches;
                      } else {
                          $tableName = $alias = $matches[1];
                      }
                  }
              }
  
  
              if ($tableName instanceof Expression) {
                  if (!is_string($alias)) {
                      throw new InvalidArgumentException('To use Expression in from() method, pass it in array format with alias.');
                  }
                  $cleanedUpTableNames[$this->ensureNameQuoted($alias)] = $tableName;
              } elseif ($tableName instanceof self) {
                  $cleanedUpTableNames[$this->ensureNameQuoted($alias)] = $tableName;
              } else {
                  $cleanedUpTableNames[$this->ensureNameQuoted($alias)] = $this->ensureNameQuoted($tableName);
              }
          }
  
          return $cleanedUpTableNames;
      }
docs: Clean up table names and aliases
  Both aliases and names are enclosed into {{ and }}.
  @param array $tableNames non-empty array
  @return string[] table names indexed by aliases
  @since 2.0.14