From 380b1da9bca20cdf89599ec0296a258d5dd7aa17 Mon Sep 17 00:00:00 2001 From: jakubvrana Date: Sat, 12 Sep 2009 04:44:18 +0000 Subject: [PATCH] Display EXPLAIN in SQL query git-svn-id: https://adminer.svn.sourceforge.net/svnroot/adminer/trunk@1100 7c3ca157-0c34-0410-bff1-cbf682f78f5c --- adminer/sql.inc.php | 28 +++++++++++++++++----------- changes.txt | 3 ++- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/adminer/sql.inc.php b/adminer/sql.inc.php index ceb4f1ff..720df727 100644 --- a/adminer/sql.inc.php +++ b/adminer/sql.inc.php @@ -20,12 +20,12 @@ if (!$error && $_POST) { $query = get_file("sql_file", true); } if (is_string($query)) { // get_file() returns error as number, fread() as false - $space = "(\\s|/\\*.*\\*/|(#|-- )[^\n]*\n|--\n)"; - $alter_database = "(CREATE|DROP)$space+(DATABASE|SCHEMA)\\b~isU"; - $databases = &$_SESSION["databases"][$_GET["server"]]; if (!$fp && strlen($query) && (!$history || end($history) != $query)) { // don't add repeated $history[] = $query; } + $space = "(\\s|/\\*.*\\*/|(#|-- )[^\n]*\n|--\n)"; + $alter_database = "(CREATE|DROP)$space+(DATABASE|SCHEMA)\\b~isU"; + $databases = &$_SESSION["databases"][$_GET["server"]]; if (isset($databases) && !preg_match("~\\b$alter_database", $query)) { // quick check - may be inside string //! false positive with $fp session_write_close(); @@ -33,10 +33,11 @@ if (!$error && $_POST) { $delimiter = ";"; $offset = 0; $empty = true; - $dbh2 = (strlen(DB) ? connect() : null); // connection for exploring indexes (to not replace FOUND_ROWS()) //! PDO - silent error + $dbh2 = (strlen(DB) ? connect() : null); // connection for exploring indexes and EXPLAIN (to not replace FOUND_ROWS()) //! PDO - silent error if (is_object($dbh2)) { $dbh2->select_db(DB); } + $explain = 1; while (strlen($query)) { if (!$offset && preg_match('~^\\s*DELIMITER\\s+(.+)~i', $query, $match)) { $delimiter = $match[1]; @@ -53,27 +54,32 @@ if (!$error && $_POST) { } if (!$found || $found == $delimiter) { // end of a query $empty = false; - echo "
" . shorten_utf8(trim(substr($query, 0, $match[0][1]))) . "
\n"; + $q = substr($query, 0, $match[0][1]); + echo "
" . shorten_utf8(trim($q)) . "
\n"; ob_flush(); flush(); // can take a long time - show the running query $start = explode(" ", microtime()); // microtime(true) is available since PHP 5 //! don't allow changing of character_set_results, convert encoding of displayed query - if (!$dbh->multi_query(substr($query, 0, $match[0][1]))) { + if (!$dbh->multi_query($q)) { echo "

" . lang('Error in query') . ": " . h($dbh->error) . "\n"; if ($_POST["error_stops"]) { break; } } else { $end = explode(" ", microtime()); - $i = 0; + echo "

" . lang('%.3f s', max(0, $end[0] - $start[0] + $end[1] - $start[1])) . "

\n"; do { $result = $dbh->store_result(); - if (!$i) { - echo "

" . (is_object($result) ? lang('%d row(s)', $result->num_rows) . ", ": "") . lang('%.3f s', max(0, $end[0] - $start[0] + $end[1] - $start[1])) . "

\n"; - $i++; - } if (is_object($result)) { select($result, $dbh2); + if (preg_match("~^$space*SELECT$space+~isU", $q)) { + $id = "explain-$explain"; + echo "

" . lang('%d row(s)', $result->num_rows) . ", EXPLAIN\n"; + echo "

\n"; + $explain++; + } } else { if (preg_match("~^$space*$alter_database", $query)) { $databases = null; // clear cache diff --git a/changes.txt b/changes.txt index 1008f958..50d6265f 100644 --- a/changes.txt +++ b/changes.txt @@ -1,11 +1,12 @@ Adminer 2.1.0-dev: Edit default values directly in table creation Execute SQL file stored on server disk +Display EXPLAIN in SQL query Compress export and import Display column comments in table overview Use ON DUPLICATE KEY UPDATE for CSV import -Click on row selects it Print ALTER export instead of executing it +Click on row selects it Fix Editor date format Fix long SQL query crash (bug #2839231) Speedup of simple alter table