From a6ba9845042698610bb7071b8d127b7fb37dfd74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Mon, 30 Aug 2010 15:53:00 +0200 Subject: [PATCH 1/6] Start testcase for SQL parser. --- libraries/sqlparser.lib.php | 8 +++-- test/PMA_SQL_parser_test.php | 64 ++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 3 deletions(-) create mode 100644 test/PMA_SQL_parser_test.php diff --git a/libraries/sqlparser.lib.php b/libraries/sqlparser.lib.php index d8967d9ce..b8b2bbafa 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 .= ''; $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 000000000..3eb6849a4 --- /dev/null +++ b/test/PMA_SQL_parser_test.php @@ -0,0 +1,64 @@ +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, + )); + } + +} +?> From 24b83423cea3d00d6d0f2e8a6fb52b5cf47b82f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Mon, 30 Aug 2010 15:54:30 +0200 Subject: [PATCH 2/6] Add testcase for simple SELECT. --- test/PMA_SQL_parser_test.php | 40 ++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/test/PMA_SQL_parser_test.php b/test/PMA_SQL_parser_test.php index 3eb6849a4..4f956609e 100644 --- a/test/PMA_SQL_parser_test.php +++ b/test/PMA_SQL_parser_test.php @@ -60,5 +60,45 @@ class PMA_SQL_parser_test extends PHPUnit_Framework_TestCase )); } + 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, + )); + } } ?> From 4afbb5958819a61d52c45bd2f262f8720fa0bb87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Mon, 30 Aug 2010 15:55:52 +0200 Subject: [PATCH 3/6] Add testcase for backticked table. --- test/PMA_SQL_parser_test.php | 40 ++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/test/PMA_SQL_parser_test.php b/test/PMA_SQL_parser_test.php index 4f956609e..0c26bb4c0 100644 --- a/test/PMA_SQL_parser_test.php +++ b/test/PMA_SQL_parser_test.php @@ -100,5 +100,45 @@ class PMA_SQL_parser_test extends PHPUnit_Framework_TestCase '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, + )); + } } ?> From e781f7f9b96fa2ca8970cefba5d628eb7481692d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Mon, 30 Aug 2010 16:00:33 +0200 Subject: [PATCH 4/6] Add testcase for failed parsing. --- test/PMA_SQL_parser_test.php | 39 +++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/test/PMA_SQL_parser_test.php b/test/PMA_SQL_parser_test.php index 0c26bb4c0..2774ba10d 100644 --- a/test/PMA_SQL_parser_test.php +++ b/test/PMA_SQL_parser_test.php @@ -15,6 +15,10 @@ define('PHPMYADMIN', 1); define('TESTSUITE', 1); $GLOBALS['charset'] = 'utf-8'; +function __($s) { + return $s; +} + /** * Include to test. */ @@ -27,9 +31,10 @@ require_once './libraries/sqlparser.lib.php'; */ class PMA_SQL_parser_test extends PHPUnit_Framework_TestCase { - private function assertParser($sql, $expected) + private function assertParser($sql, $expected, $error = '') { $parsed_sql = PMA_SQP_parse($sql); + $this->assertEquals(PMA_SQP_getErrorString(), $error); $this->assertEquals($parsed_sql, $expected); } @@ -140,5 +145,37 @@ class PMA_SQL_parser_test extends PHPUnit_Framework_TestCase '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, + ), + ), +'

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

+
+ERROR: Unclosed quote @ 14
+STR: `
+SQL: SELECT * from `aaa;
+
+'); + } } ?> From 61fe92976f290467b10443f679d7ed882ebb5d5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Mon, 30 Aug 2010 16:10:51 +0200 Subject: [PATCH 5/6] This variable does not seem to be used. --- libraries/display_tbl.lib.php | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/libraries/display_tbl.lib.php b/libraries/display_tbl.lib.php index 16ac8c9d9..d236b7fda 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] = ' NULL' . "\n"; @@ -2352,7 +2348,7 @@ function PMA_prepare_row_data($mouse_events, $class, $condition_field, $analyzed } // continue the 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' : '') From 1d67babd5286f9f5198b40ee3a4be21f9643ad8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Mon, 30 Aug 2010 16:11:46 +0200 Subject: [PATCH 6/6] Do not fail on non analyzed query (eg. because of parser failure). --- libraries/common.lib.php | 7 +++++-- libraries/display_tbl.lib.php | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/libraries/common.lib.php b/libraries/common.lib.php index 665298b49..6f7064a6b 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 '
' . "\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 d236b7fda..bb16bbf7f 100644 --- a/libraries/display_tbl.lib.php +++ b/libraries/display_tbl.lib.php @@ -2090,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');