diff --git a/adminer/drivers/mysql.inc.php b/adminer/drivers/mysql.inc.php index 249b3dd2..8fa8e344 100644 --- a/adminer/drivers/mysql.inc.php +++ b/adminer/drivers/mysql.inc.php @@ -277,7 +277,7 @@ if (!defined("DRIVER")) { return queries($prefix . implode(",\n", $values) . $suffix); } - function convertSearch($idf, $field) { + function convertSearch($idf, $val, $field) { return (preg_match('~char|text|enum|set~', $field["type"]) && !preg_match("~^utf8~", $field["collation"]) ? "CONVERT($idf USING " . charset($this->_conn) . ")" : $idf diff --git a/adminer/drivers/pgsql.inc.php b/adminer/drivers/pgsql.inc.php index 57961c8c..440bc1a8 100644 --- a/adminer/drivers/pgsql.inc.php +++ b/adminer/drivers/pgsql.inc.php @@ -181,6 +181,13 @@ if (isset($_GET["pgsql"])) { return true; } + function convertSearch($idf, $val, $field) { + return (preg_match('~char|text' . (is_numeric($val["val"]) && !preg_match('~LIKE~', $val["op"]) ? '|' . number_type() : '') . '~', $field["type"]) + ? $idf + : "CAST($idf AS text)" + ); + } + function warnings() { return $this->_conn->warnings(); } diff --git a/adminer/include/adminer.inc.php b/adminer/include/adminer.inc.php index 4a1f2aae..bbe43c5e 100644 --- a/adminer/include/adminer.inc.php +++ b/adminer/include/adminer.inc.php @@ -534,7 +534,7 @@ class Adminer { $cond .= " " . $this->processInput($fields[$val["col"]], $val["val"]); } if ($val["col"] != "") { - $return[] = $prefix . $driver->convertSearch(idf_escape($val["col"]), $fields[$val["col"]]) . $cond; + $return[] = $prefix . $driver->convertSearch(idf_escape($val["col"]), $val, $fields[$val["col"]]) . $cond; } else { // find anywhere $cols = array(); @@ -542,7 +542,7 @@ class Adminer { if ((is_numeric($val["val"]) || !preg_match('~' . number_type() . '|bit~', $field["type"])) && (!preg_match("~[\x80-\xFF]~", $val["val"]) || preg_match('~char|text|enum|set~', $field["type"])) ) { - $cols[] = $prefix . $driver->convertSearch(idf_escape($name), $field) . $cond; + $cols[] = $prefix . $driver->convertSearch(idf_escape($name), $val, $field) . $cond; } } $return[] = ($cols ? "(" . implode(" OR ", $cols) . ")" : "1 = 0"); diff --git a/adminer/include/driver.inc.php b/adminer/include/driver.inc.php index c16481aa..4a2ae222 100644 --- a/adminer/include/driver.inc.php +++ b/adminer/include/driver.inc.php @@ -114,11 +114,12 @@ } /** Convert column to be searchable - * @param string escaped name + * @param string escaped column name + * @param array array("op" => , "val" => ) * @param array * @return string */ - function convertSearch($idf, $field) { + function convertSearch($idf, $val, $field) { return $idf; } diff --git a/changes.txt b/changes.txt index d3289bcf..7cbe57c0 100644 --- a/changes.txt +++ b/changes.txt @@ -1,6 +1,7 @@ Adminer 4.6.1-dev: MySQL: Support non-utf8 charset in search in column MySQL: Support geometry in MySQL 8 (bug #574) +PostgreSQL: Cast to string when searching using LIKE (bug #325) PostgreSQL: Don't treat interval type as number (bug #474) PostgreSQL: Fix condition for selecting no rows