diff --git a/adminer/drivers/firebird.inc.php b/adminer/drivers/firebird.inc.php index 68f98320..822b33b9 100644 --- a/adminer/drivers/firebird.inc.php +++ b/adminer/drivers/firebird.inc.php @@ -147,7 +147,7 @@ if (isset($_GET["firebird"])) { return $return; } - function limit1($query, $where) { + function limit1($table, $query, $where) { return limit($query, $where, 1); } diff --git a/adminer/drivers/mssql.inc.php b/adminer/drivers/mssql.inc.php index 0f119ad2..becfaeae 100644 --- a/adminer/drivers/mssql.inc.php +++ b/adminer/drivers/mssql.inc.php @@ -308,7 +308,7 @@ if (isset($_GET["mssql"])) { return ($limit !== null ? " TOP (" . ($limit + $offset) . ")" : "") . " $query$where"; // seek later } - function limit1($query, $where) { + function limit1($table, $query, $where) { return limit($query, $where, 1); } diff --git a/adminer/drivers/mysql.inc.php b/adminer/drivers/mysql.inc.php index b06405d9..34a3b1d1 100644 --- a/adminer/drivers/mysql.inc.php +++ b/adminer/drivers/mysql.inc.php @@ -362,11 +362,12 @@ if (!defined("DRIVER")) { } /** Formulate SQL modification query with limit 1 + * @param string * @param string everything after UPDATE or DELETE * @param string * @return string */ - function limit1($query, $where) { + function limit1($table, $query, $where) { return limit($query, $where, 1); } diff --git a/adminer/drivers/oracle.inc.php b/adminer/drivers/oracle.inc.php index 363481f6..3e7b9974 100644 --- a/adminer/drivers/oracle.inc.php +++ b/adminer/drivers/oracle.inc.php @@ -175,8 +175,8 @@ if (isset($_GET["oracle"])) { )); } - function limit1($query, $where) { - return " $query$where"; + function limit1($table, $query, $where) { + return " $query$where"; //! limit } function db_collation($db, $collations) { diff --git a/adminer/drivers/pgsql.inc.php b/adminer/drivers/pgsql.inc.php index ed69ecd6..733b4c5b 100644 --- a/adminer/drivers/pgsql.inc.php +++ b/adminer/drivers/pgsql.inc.php @@ -226,8 +226,8 @@ if (isset($_GET["pgsql"])) { return " $query$where" . ($limit !== null ? $separator . "LIMIT $limit" . ($offset ? " OFFSET $offset" : "") : ""); } - function limit1($query, $where) { - return " $query$where"; + function limit1($table, $query, $where) { + return (preg_match('~^INTO~', $query) ? limit($query, $where, 1) : "$query WHERE ctid = (SELECT ctid FROM " . table($table) . "$where LIMIT 1)"); } function db_collation($db, $collations) { diff --git a/adminer/drivers/sqlite.inc.php b/adminer/drivers/sqlite.inc.php index 58e0f103..9d8efbb3 100644 --- a/adminer/drivers/sqlite.inc.php +++ b/adminer/drivers/sqlite.inc.php @@ -242,9 +242,9 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) { return " $query$where" . ($limit !== null ? $separator . "LIMIT $limit" . ($offset ? " OFFSET $offset" : "") : ""); } - function limit1($query, $where) { + function limit1($table, $query, $where) { global $connection; - return ($connection->result("SELECT sqlite_compileoption_used('ENABLE_UPDATE_DELETE_LIMIT')") ? limit($query, $where, 1) : " $query$where"); + return ($connection->result("SELECT sqlite_compileoption_used('ENABLE_UPDATE_DELETE_LIMIT')") ? limit($query, $where, 1) : " $query$where"); //! limit } function db_collation($db, $collations) { diff --git a/adminer/include/driver.inc.php b/adminer/include/driver.inc.php index 543894bb..5db00dcb 100644 --- a/adminer/include/driver.inc.php +++ b/adminer/include/driver.inc.php @@ -50,7 +50,7 @@ */ function delete($table, $queryWhere, $limit = 0) { $query = "FROM " . table($table); - return queries("DELETE" . ($limit ? limit1($query, $queryWhere) : " $query$queryWhere")); + return queries("DELETE" . ($limit ? limit1($table, $query, $queryWhere) : " $query$queryWhere")); } /** Update data in table @@ -67,7 +67,7 @@ $values[] = "$key = $val"; } $query = table($table) . " SET$separator" . implode(",$separator", $values); - return queries("UPDATE" . ($limit ? limit1($query, $queryWhere) : " $query$queryWhere")); + return queries("UPDATE" . ($limit ? limit1($table, $query, $queryWhere) : " $query$queryWhere")); } /** Insert data into table diff --git a/adminer/select.inc.php b/adminer/select.inc.php index 2bb27d84..8c6ba242 100644 --- a/adminer/select.inc.php +++ b/adminer/select.inc.php @@ -123,7 +123,7 @@ if ($_POST && !$error) { $result = ($_POST["delete"] ? $driver->delete($TABLE, $where2, 1) : ($_POST["clone"] - ? queries("INSERT" . limit1($query, $where2)) + ? queries("INSERT" . limit1($TABLE, $query, $where2)) : $driver->update($TABLE, $set, $where2, 1) ) ); diff --git a/changes.txt b/changes.txt index 74867992..8e8a2dce 100644 --- a/changes.txt +++ b/changes.txt @@ -9,7 +9,8 @@ MySQL, PostgreSQL: Display warnings MySQL: Add floor and ceil select functions MySQL: Add FIND_IN_SET search operator MariaDB: Support JSON since MariaDB 10.2 -PostgreSQL: Support functions +PostgreSQL: Support routines +PostgreSQL: Limit rows in data manipulation without unique key PostgreSQL: Allow editing views with uppercase letters (bug #467) PostgreSQL: Allow now() as default value (bug #525) SimpleDB: Document that allow_url_fopen is required