From a31b8f24e447a517dc90a8da51f4c4d743b0c00f Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 4 Oct 2004 16:24:37 +0300 Subject: [PATCH] InnoDB: make ALTER TABLE to work on table names containing '#' (Bug #5856) innobase/dict/dict0dict.c: dict_strip_comments(): do not look for comments within quotes (Bug #5856) innobase/row/row0mysql.c: row_drop_table_for_mysql(): Remove a memory leak --- innobase/dict/dict0dict.c | 22 ++++++++++++++++------ innobase/row/row0mysql.c | 1 + 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/innobase/dict/dict0dict.c b/innobase/dict/dict0dict.c index 61bf3fae137..4340934ab3d 100644 --- a/innobase/dict/dict0dict.c +++ b/innobase/dict/dict0dict.c @@ -2500,7 +2500,9 @@ dict_strip_comments( char* str; char* sptr; char* ptr; - + /* unclosed quote character (0 if none) */ + char quote = 0; + str = mem_alloc(strlen(sql_string) + 1); sptr = sql_string; @@ -2515,8 +2517,18 @@ scan_more: return(str); } - - if (*sptr == '#' + + if (*sptr == quote) { + /* Closing quote character: do not look for + starting quote or comments. */ + quote = 0; + } else if (quote) { + /* Within quotes: do not look for + starting quotes or comments. */ + } else if (*sptr == '"' || *sptr == '`') { + /* Starting quote: remember the quote character. */ + quote = *sptr; + } else if (*sptr == '#' || (0 == memcmp("-- ", sptr, 3))) { for (;;) { /* In Unix a newline is 0x0A while in Windows @@ -2531,9 +2543,7 @@ scan_more: sptr++; } - } - - if (*sptr == '/' && *(sptr + 1) == '*') { + } else if (!quote && *sptr == '/' && *(sptr + 1) == '*') { for (;;) { if (*sptr == '*' && *(sptr + 1) == '/') { diff --git a/innobase/row/row0mysql.c b/innobase/row/row0mysql.c index a23444df4ef..a884dc8d9ef 100644 --- a/innobase/row/row0mysql.c +++ b/innobase/row/row0mysql.c @@ -2051,6 +2051,7 @@ row_drop_table_for_mysql( memcpy(sql, str1, (sizeof str1) - 1); memcpy(sql + (sizeof str1) - 1, quoted_name, namelen); memcpy(sql + (sizeof str1) - 1 + namelen, str2, sizeof str2); + mem_free(quoted_name); /* Serialize data dictionary operations with dictionary mutex: no deadlocks can occur then in these operations */