The branch, master has been updated via 1d67babd5286f9f5198b40ee3a4be21f9643ad8e (commit) via 61fe92976f290467b10443f679d7ed882ebb5d5b (commit) via e781f7f9b96fa2ca8970cefba5d628eb7481692d (commit) via 4afbb5958819a61d52c45bd2f262f8720fa0bb87 (commit) via 24b83423cea3d00d6d0f2e8a6fb52b5cf47b82f6 (commit) via a6ba9845042698610bb7071b8d127b7fb37dfd74 (commit) from 388327d642714ff42e3dd7eb3cdc1c9b24efea2d (commit)
- Log ----------------------------------------------------------------- commit 1d67babd5286f9f5198b40ee3a4be21f9643ad8e Author: Michal Čihař mcihar@novell.com Date: Mon Aug 30 16:11:46 2010 +0200
Do not fail on non analyzed query (eg. because of parser failure).
commit 61fe92976f290467b10443f679d7ed882ebb5d5b Author: Michal Čihař mcihar@novell.com Date: Mon Aug 30 16:10:51 2010 +0200
This variable does not seem to be used.
commit e781f7f9b96fa2ca8970cefba5d628eb7481692d Author: Michal Čihař mcihar@novell.com Date: Mon Aug 30 16:00:33 2010 +0200
Add testcase for failed parsing.
commit 4afbb5958819a61d52c45bd2f262f8720fa0bb87 Author: Michal Čihař mcihar@novell.com Date: Mon Aug 30 15:55:52 2010 +0200
Add testcase for backticked table.
commit 24b83423cea3d00d6d0f2e8a6fb52b5cf47b82f6 Author: Michal Čihař mcihar@novell.com Date: Mon Aug 30 15:54:30 2010 +0200
Add testcase for simple SELECT.
commit a6ba9845042698610bb7071b8d127b7fb37dfd74 Author: Michal Čihař mcihar@novell.com Date: Mon Aug 30 15:53:00 2010 +0200
Start testcase for SQL parser.
-----------------------------------------------------------------------
Summary of changes: libraries/common.lib.php | 7 +- libraries/display_tbl.lib.php | 10 +-- libraries/sqlparser.lib.php | 8 +- test/PMA_SQL_parser_test.php | 181 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 194 insertions(+), 12 deletions(-) create mode 100644 test/PMA_SQL_parser_test.php
diff --git a/libraries/common.lib.php b/libraries/common.lib.php index 665298b..6f7064a 100644 --- a/libraries/common.lib.php +++ b/libraries/common.lib.php @@ -1039,6 +1039,9 @@ function PMA_showMessage($message, $sql_query = null, $type = 'notice', $is_view } else { // Parse SQL if needed $parsed_sql = PMA_SQP_parse($query_base); + if (PMA_SQP_isError()) { + unset($parsed_sql); + } }
// Analyze it @@ -1242,8 +1245,8 @@ function PMA_showMessage($message, $sql_query = null, $type = 'notice', $is_view } echo '</div><br />' . "\n";
- // If we are in an Ajax request, we have most probably been called in - // PMA_ajaxResponse(). Hence, collect the buffer contents and return it + // If we are in an Ajax request, we have most probably been called in + // PMA_ajaxResponse(). Hence, collect the buffer contents and return it // to PMA_ajaxResponse(), which will encode it for JSON. if( $GLOBALS['is_ajax_request'] == true && !isset($GLOBALS['buffer_message']) ) { $buffer_contents = ob_get_contents(); diff --git a/libraries/display_tbl.lib.php b/libraries/display_tbl.lib.php index 16ac8c9..bb16bbf 100644 --- a/libraries/display_tbl.lib.php +++ b/libraries/display_tbl.lib.php @@ -717,10 +717,6 @@ function PMA_displayTableHeaders(&$is_display, &$fields_meta, $fields_cnt = 0, $ $GLOBALS['mime_map'] = PMA_getMIME($db, $table); }
- if ($is_display['sort_lnk'] == '1') { - $select_expr = $analyzed_sql[0]['select_expr_clause']; - } - // See if we have to highlight any header fields of a WHERE query. // Uses SQL-Parser results. $highlight_columns = array(); @@ -1299,7 +1295,7 @@ function PMA_displayTableBody(&$dt_result, &$is_display, $map, $analyzed_sql) {
// reset $class from $data_inline_edit_class to '' as we can't edit binary data $class = ''; - + if (stristr($field_flags, 'BINARY')) { if (!isset($row[$i]) || is_null($row[$i])) { $vertical_display['data'][$row_no][$i] = ' <td align="right"' . $mouse_events . ' class="' . $class . ($condition_field ? ' condition' : '') . '"><i>NULL</i></td>' . "\n"; @@ -2094,7 +2090,7 @@ function PMA_displayTable(&$dt_result, &$the_disp_mode, $analyzed_sql) 'submit_mult_change', __('Change'), 'b_edit.png'); PMA_buttonOrImage('submit_mult', 'mult_submit', 'submit_mult_delete', $delete_text, 'b_drop.png'); - if ($analyzed_sql[0]['querytype'] == 'SELECT') { + if (isset($analyzed_sql[0]) && $analyzed_sql[0]['querytype'] == 'SELECT') { PMA_buttonOrImage('submit_mult', 'mult_submit', 'submit_mult_export', __('Export'), 'b_tblexport.png'); @@ -2352,7 +2348,7 @@ function PMA_prepare_row_data($mouse_events, $class, $condition_field, $analyzed }
// continue the <td> tag started before calling this function: - $result = $mouse_events . ' class="' . $class . ($condition_field ? ' condition' : '') . $nowrap + $result = $mouse_events . ' class="' . $class . ($condition_field ? ' condition' : '') . $nowrap . ' ' . ($is_field_truncated ? ' truncated' : '') . ($transform_function != $default_function ? ' transformed' : '') . (isset($map[$meta->name]) ? ' relation' : '') diff --git a/libraries/sqlparser.lib.php b/libraries/sqlparser.lib.php index d8967d9..b8b2bba 100644 --- a/libraries/sqlparser.lib.php +++ b/libraries/sqlparser.lib.php @@ -43,7 +43,9 @@ if (! defined('PMA_MINIMUM_COMMON')) { * Include data for the SQL Parser */ require_once './libraries/sqlparser.data.php'; - require_once './libraries/mysql_charsets.lib.php'; + if (!defined('TESTSUITE')) { + require_once './libraries/mysql_charsets.lib.php'; + } if (!isset($mysql_charsets)) { $mysql_charsets = array(); $mysql_charsets_count = 0; @@ -2091,8 +2093,8 @@ if (! defined('PMA_MINIMUM_COMMON')) { $docu = TRUE; break; } // end switch - // inner_sql is a span that exists for all cases - // of $cfg['SQP']['fmtType'] to make possible a replacement + // inner_sql is a span that exists for all cases + // of $cfg['SQP']['fmtType'] to make possible a replacement // for inline editing $str .= '<span class="inner_sql">'; $close_docu_link = false; diff --git a/test/PMA_SQL_parser_test.php b/test/PMA_SQL_parser_test.php new file mode 100644 index 0000000..2774ba1 --- /dev/null +++ b/test/PMA_SQL_parser_test.php @@ -0,0 +1,181 @@ +<?php +/* vim: set expandtab sw=4 ts=4 sts=4: */ +/** + * tests for correctness of SQL parser + * + * @package phpMyAdmin-test + */ + +/** + * Tests core. + */ +require_once 'PHPUnit/Framework.php'; + +define('PHPMYADMIN', 1); +define('TESTSUITE', 1); +$GLOBALS['charset'] = 'utf-8'; + +function __($s) { + return $s; +} + +/** + * Include to test. + */ +require_once './libraries/sqlparser.lib.php'; + +/** + * Test for SQL parser + * + * @package phpMyAdmin-test + */ +class PMA_SQL_parser_test extends PHPUnit_Framework_TestCase +{ + private function assertParser($sql, $expected, $error = '') + { + $parsed_sql = PMA_SQP_parse($sql); + $this->assertEquals(PMA_SQP_getErrorString(), $error); + $this->assertEquals($parsed_sql, $expected); + } + + public function testParse_1() + { + $this->assertParser('SELECT 1;', array ( + 'raw' => 'SELECT 1;', + 0 => + array ( + 'type' => 'alpha_reservedWord', + 'data' => 'SELECT', + 'pos' => 6, + 'forbidden' => true, + ), + 1 => + array ( + 'type' => 'digit_integer', + 'data' => '1', + 'pos' => 8, + ), + 2 => + array ( + 'type' => 'punct_queryend', + 'data' => ';', + 'pos' => 0, + ), + 'len' => 3, + )); + } + + public function testParse_2() + { + $this->assertParser('SELECT * from aaa;', array ( + 'raw' => 'SELECT * from aaa;', + 0 => + array ( + 'type' => 'alpha_reservedWord', + 'data' => 'SELECT', + 'pos' => 6, + 'forbidden' => true, + ), + 1 => + array ( + 'type' => 'punct', + 'data' => '*', + 'pos' => 0, + ), + 2 => + array ( + 'type' => 'alpha_reservedWord', + 'data' => 'from', + 'pos' => 13, + 'forbidden' => true, + ), + 3 => + array ( + 'type' => 'alpha_identifier', + 'data' => 'aaa', + 'pos' => 17, + 'forbidden' => false, + ), + 4 => + array ( + 'type' => 'punct_queryend', + 'data' => ';', + 'pos' => 0, + ), + 'len' => 5, + )); + } + + public function testParse_3() + { + $this->assertParser('SELECT * from `aaa`;', array ( + 'raw' => 'SELECT * from `aaa`;', + 0 => + array ( + 'type' => 'alpha_reservedWord', + 'data' => 'SELECT', + 'pos' => 6, + 'forbidden' => true, + ), + 1 => + array ( + 'type' => 'punct', + 'data' => '*', + 'pos' => 0, + ), + 2 => + array ( + 'type' => 'alpha_reservedWord', + 'data' => 'from', + 'pos' => 13, + 'forbidden' => true, + ), + 3 => + array ( + 'type' => 'quote_backtick', + 'data' => '`aaa`', + 'pos' => 0, + ), + 4 => + array ( + 'type' => 'punct_queryend', + 'data' => ';', + 'pos' => 0, + ), + 'len' => 5, + )); + } + + public function testParse_4() + { + $this->assertParser('SELECT * from `aaa;', array ( + 'raw' => 'SELECT * from `aaa;', + 0 => + array ( + 'type' => 'alpha', + 'data' => 'SELECT', + 'pos' => 6, + ), + 1 => + array ( + 'type' => 'punct', + 'data' => '*', + 'pos' => 0, + ), + 2 => + array ( + 'type' => 'alpha', + 'data' => 'from', + 'pos' => 13, + ), + ), +'<p>There seems to be an error in your SQL query. The MySQL server error output below, if there is any, may also help you in diagnosing the problem</p> +<pre> +ERROR: Unclosed quote @ 14 +STR: ` +SQL: SELECT * from `aaa; +</pre> +'); + } +} +?>
hooks/post-receive