| Bug #47154 | Connector/NET MySqlScript tokenizer does not like empty comment lines | ||
|---|---|---|---|
| Submitted: | 6 Sep 2009 6:36 | Modified: | 23 Oct 2009 18:21 |
| Reporter: | Bassam Tabbara | Email Updates: | |
| Status: | Not a Bug | Impact on me: | |
| Category: | Connector / NET | Severity: | S3 (Non-critical) |
| Version: | 5.2.7 | OS: | Any |
| Assigned to: | Reggie Burnett | CPU Architecture: | Any |
[9 Sep 2009 8:04]
Tonci Grgin
Hi Bassam and thanks for your report.
I tried:
cmdCreateTable.CommandText = "--" + "\n" +
"-- 'quoted' comment" + "\n" +
" CREATE TABLE `bug29010` (" +
" `ID` int(10) unsigned NOT NULL," +
" `NAME` varchar(80) default NULL," +
" PRIMARY KEY (`ID`)" +
" ) ENGINE=MyISAM";
cmdCreateTable.ExecuteNonQuery();
cmdCreateTable.CommandText = ("--" + "\n" +
"-- 'quoted' comment" + "\n" +
" CREATE PROCEDURE `SP_BUG29010`(" +"\n"+
"IN P_ID INT, -- com. param1 \n" +
"IN P_NAME VARCHAR(80) -- com. param2 \n" +
") \n" +
"BEGIN INSERT INTO bug29010 (`ID`, NAME) VALUES (P_ID, P_NAME); END\n");
and all comments were recognized:
[09.09.09 10:01:44] - Executing command QUERY with text ='--
-- 'quoted' comment
CREATE TABLE `bug29010` ( `ID` int(10) unsigned NOT NULL, `NAME` varchar(80) default NULL, PRIMARY KEY (`ID`) ) ENGINE=MyISAM'
[09.09.09 10:01:44] - Executing command QUERY with text ='--
-- 'quoted' comment
CREATE PROCEDURE `SP_BUG29010`(
IN P_ID INT, -- com. param1
IN P_NAME VARCHAR(80) -- com. param2
)
BEGIN INSERT INTO bug29010 (`ID`, NAME) VALUES (P_ID, P_NAME); END
'
If you still think this is a bug, please attach complete test case so I can recheck.
[11 Sep 2009 18:40]
Bassam Tabbara
Here's a repro on 5.2.7:
using System;
using MySql.Data.MySqlClient;
namespace MySqlBug
{
class Program
{
static string connectionString = "server=dev;database=control;user id=root;password=;Connection Reset=true;";
static void Main(string[] args)
{
TokenizerBug();
}
static void TokenizerBug()
{
using (MySqlConnection cn = new MySqlConnection(connectionString))
{
cn.Open();
// no space after --
MySqlScript script = new MySqlScript(cn);
script.Query = @"--comment" + Environment.NewLine + @"DROP PROCEDURE IF EXISTS `Foo`;";
script.Execute(); //throws
}
}
}
}
throws the following:
MySql.Data.MySqlClient.MySqlException was unhandled
Message="You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '--comment\r\nDROP PROCEDURE IF EXISTS `Foo`' at line 1"
Source="MySql.Data"
ErrorCode=-2147467259
Number=1064
StackTrace:
at MySql.Data.MySqlClient.MySqlStream.OpenPacket() in C:\OldLaptop\Sources\mysqlconnector-bazaar\5.2\MySql.Data\Provider\Source\MySqlStream.cs:line 177
at MySql.Data.MySqlClient.NativeDriver.ReadResult(UInt64& affectedRows, Int64& lastInsertId) in C:\OldLaptop\Sources\mysqlconnector-bazaar\5.2\MySql.Data\Provider\Source\NativeDriver.cs:line 536
at MySql.Data.MySqlClient.MySqlDataReader.GetResultSet() in C:\OldLaptop\Sources\mysqlconnector-bazaar\5.2\MySql.Data\Provider\Source\datareader.cs:line 831
at MySql.Data.MySqlClient.MySqlDataReader.NextResult() in C:\OldLaptop\Sources\mysqlconnector-bazaar\5.2\MySql.Data\Provider\Source\datareader.cs:line 923
at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior) in C:\OldLaptop\Sources\mysqlconnector-bazaar\5.2\MySql.Data\Provider\Source\command.cs:line 466
at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader() in C:\OldLaptop\Sources\mysqlconnector-bazaar\5.2\MySql.Data\Provider\Source\command.cs:line 343
at MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery() in C:\OldLaptop\Sources\mysqlconnector-bazaar\5.2\MySql.Data\Provider\Source\command.cs:line 312
at MySql.Data.MySqlClient.MySqlScript.Execute() in C:\OldLaptop\Sources\mysqlconnector-bazaar\5.2\MySql.Data\Provider\Source\MySqlScript.cs:line 180
at MySqlBug.Program.TokenizerBug() in C:\Users\bassam\Documents\Visual Studio 2008\Projects\MySqlBug\MySqlBug\Program.cs:line 24
at MySqlBug.Program.Main(String[] args) in C:\Users\bassam\Documents\Visual Studio 2008\Projects\MySqlBug\MySqlBug\Program.cs:line 12
at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:
[13 Oct 2009 11:48]
Tonci Grgin
Verified just as described using latest c/NET sources (trunk).
[23 Oct 2009 18:21]
Reggie Burnett
This is not a bug. I refer you to the following documentation page: http://dev.mysql.com/doc/refman/5.0/en/comments.html Please see the following passage that clearly indicates that '--' must be followed by at least 1 white space character to begin a comment. There is also a link there to describe why this is. I've made a note to add a feature to our next release to support standard SQL '--' syntax in scripts. From a “-- ” sequence to the end of the line. In MySQL, the “-- ” (double-dash) comment style requires the second dash to be followed by at least one whitespace or control character (such as a space, tab, newline, and so on). This syntax differs slightly from standard SQL comment syntax, as discussed in Section 1.7.5.6, “'--' as the Start of a Comment”.

Description: The MySqlScript class barfs at the following script: -- -- "quoted" comment DROP PROCEDURE IF EXISTS `Foo`; How to repeat: Run MySqlScript with the script above. Suggested fix: I changed MySqlTokenizer.ReadComment() to the following: private bool ReadComment(char c) { // make sure the comment starts correctly if (c == '/' && (pos >= sql.Length || sql[pos] != '*')) return false; if (c == '-' && (pos + 1) >= sql.Length || sql[pos] != '-' || (sql[pos + 1] != ' ' && sql[pos + 1] != '\r' && sql[pos + 1] != '\n')) return false; and it fixed it for me.