public function escapes($names, $prefix, $aliases = [])
    {
        $names = is_array($names) ? $names : [$names];
        $sql = [];
        foreach ($names as $key => $value) {
            if ($this->isOperator($key)) {
                $sql[] = $this->conditions($names);
            } elseif (is_string($value)) {
                if (!is_numeric($key)) {
                    $name = $this->name($key, $aliases);
                    $value = $this->name($value);
                    $name = $name !== $value ? "{$name} AS {$value}" : $name;
                } else {
                    $name = $this->name($value, $aliases);
                }
                $name = $prefix ? "{$prefix}.{$name}" : $name;
                $sql[$name] = $name;
            } elseif (!is_array($value)) {
                $sql[] = (string) $value;
            } else {
                $pfx = $prefix;
                if (!is_numeric($key)) {
                    $pfx = $this->escape(isset($aliases[$key]) ? $aliases[$key] : $key);
                }
                $sql = array_merge($sql, $this->escapes($value, $pfx, $aliases));
            }
        }
        return $sql;
    }