[Phpmyadmin-git] [SCM] phpMyAdmin branch, master, updated. RELEASE_3_3_6-9314-g1d67bab

Michal Čihař nijel at users.sourceforge.net
Mon Aug 30 16:12:19 CEST 2010


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 at 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 at 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 at novell.com>
Date:   Mon Aug 30 16:00:33 2010 +0200

    Add testcase for failed parsing.

commit 4afbb5958819a61d52c45bd2f262f8720fa0bb87
Author: Michal Čihař <mcihar at novell.com>
Date:   Mon Aug 30 15:55:52 2010 +0200

    Add testcase for backticked table.

commit 24b83423cea3d00d6d0f2e8a6fb52b5cf47b82f6
Author: Michal Čihař <mcihar at novell.com>
Date:   Mon Aug 30 15:54:30 2010 +0200

    Add testcase for simple SELECT.

commit a6ba9845042698610bb7071b8d127b7fb37dfd74
Author: Michal Čihař <mcihar at 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
-- 
phpMyAdmin




More information about the Git mailing list