[Phpmyadmin-devel] BugFix question

Rabus rabus at bugfixes.info
Fri Nov 1 00:29:02 CET 2002


-----Original Message-----
From: Robin Johnson
> Alex posted these fixes to libraries/sqlparser.lib.php3:
> @@ -171,6 +171,10 @@ if (!defined('PMA_SQP_LIB_INCLUDED')) {
>              return $sql;
>          }
> 
> +        // rabus: Convert all line feeds to Unix style
> +        $sql = str_replace("\r\n", "\n", $sql);
> +        $sql = str_replace("\r", "\n", $sql);
> +
>          $len = $GLOBALS['PMA_strlen']($sql);
>          if ($len == 0) {
>              return array();
> 
> This changes newline contents for the query before any 
> parsing is done. I think this should be avoided at this 
> point, as it removes some newlines out of string escaped 
> variables. Eg I might have SELECT 'foo\n\r\n\rbar'; # foo, 
> bar, sepereated by TWO lines we should actually preserve the 
> contents of strings as they are.

Hmm, my code would convert your "\n\r\n\r" into "\n\n\n"...
But, where is a line feed style like "\n\r" used? I only know about
these three ones:

Unix: "\n"
Mac: "\r"
Windows: "\r\n"

As I tested my code about the ANSI style comment variation, I noticed
that your code in line 243 got problems with my Windows line feeds...

$pos  = $GLOBALS['PMA_strpos']($sql, "\n", $count2);

imho, it would be annoying to handle all types of line feeds whenever we
look for one.
This is why I added these two lines at the beginning of the function.

> If anybody can show me a testcase where we actually need this 
> str_replace, then we can revise it, but I can't think of any, 
> so in the name of speed, it should get removed.

Test your parser on a Windows or Mac client. You will see, without my
code, it behaves a little different since it expects only Unix line
feeds.

> @@ -227,7 +231,7 @@ if (!defined('PMA_SQP_LIB_INCLUDED')) {
>              // ANSI style --
>              if (($c == '#')
>                  || (($count2 + 1 < $len) && ($c == '/') && 
> ($sql[$count2 + 1] == '*'))
> -                || (($count2 + 2 < $len) && ($c == '-') && 
> ($sql[$count2 + 1] == '-') && ($sql[$count2 + 2] == ' '))) {
> +                || (($count2 + 2 < $len) && ($c == '-') && 
> + ($sql[$count2 + 1] == '-') && ereg("(\n|[space])", 
> $sql[$count2 + 2]))) {
>                  $count2++;
>                  $pos  = 0;
>                  $type = 'bad';
> 
> Intend that it could match broken ANSI comments of '--\n' in 
> addition to the standard '-- '. Should we support this as it 
> is partially supported by MySQL? I say partially, because the 
> MySQL commandline client strips out anything matching 
> '--.*\n', but the actualy MySQL server if it is sent raw 
> commands throws a syntax error on '--\n'.

I does NOT! I tested it myself here and MySQL server treated "--\n" like
a comment.
I tested this behavior on MySQL 3.23.51 (Linux x86) and 4.0.4-beta
(WindowsNT)

> I would say that we should follow the MySQL server in handling
> the input.

That's what I did. Without my code, the parser treated "--\n" like SQL
code and tried to parse it...!

> If we do keep it, lets change it to use only direct 
> comparisions instead of regular expressions. Regex should be 
> avoided inside the parser, as it makes code much slower.

OK, I'll change it since the regex used here is a very simple one.

Sorry for touching your holy parser code ;-)

Alexander






More information about the Developers mailing list