Commit a19b8ec7 authored by unknown's avatar unknown

InnoDB: fix bugs in the FOREIGN KEY parser (Bug #6340)


innobase/dict/dict0dict.c:
  dict_scan_to(): skip quoted strings while scanning for the keyword
  dict_create_foreign_constraints_low(): allow quote immediately after CONSTRAINT
parent e5493270
...@@ -604,7 +604,7 @@ dict_table_get_on_id( ...@@ -604,7 +604,7 @@ dict_table_get_on_id(
} }
/************************************************************************ /************************************************************************
Looks for column n postion in the clustered index. */ Looks for column n position in the clustered index. */
ulint ulint
dict_table_get_nth_col_pos( dict_table_get_nth_col_pos(
...@@ -2140,8 +2140,8 @@ dict_foreign_add_to_cache( ...@@ -2140,8 +2140,8 @@ dict_foreign_add_to_cache(
/************************************************************************* /*************************************************************************
Scans from pointer onwards. Stops if is at the start of a copy of Scans from pointer onwards. Stops if is at the start of a copy of
'string' where characters are compared without case sensitivity. Stops 'string' where characters are compared without case sensitivity, and
also at '\0'. */ only outside `` or "" quotes. Stops also at '\0'. */
static static
const char* const char*
dict_scan_to( dict_scan_to(
...@@ -2150,31 +2150,34 @@ dict_scan_to( ...@@ -2150,31 +2150,34 @@ dict_scan_to(
const char* ptr, /* in: scan from */ const char* ptr, /* in: scan from */
const char* string) /* in: look for this */ const char* string) /* in: look for this */
{ {
ibool success; char quote = '\0';
ulint i;
loop:
if (*ptr == '\0') {
return(ptr);
}
success = TRUE;
for (i = 0; i < ut_strlen(string); i++) {
if (toupper((ulint)(ptr[i])) != toupper((ulint)(string[i]))) {
success = FALSE;
for (; *ptr; ptr++) {
if (*ptr == quote) {
/* Closing quote character: do not look for
starting quote or the keyword. */
quote = '\0';
} else if (quote) {
/* Within quotes: do nothing. */
} else if (*ptr == '`' || *ptr == '"') {
/* Starting quote: remember the quote character. */
quote = *ptr;
} else {
/* Outside quotes: look for the keyword. */
ulint i;
for (i = 0; string[i]; i++) {
if (toupper((ulint)(ptr[i]))
!= toupper((ulint)(string[i]))) {
goto nomatch;
}
}
break; break;
nomatch:
;
} }
} }
if (success) { return(ptr);
return(ptr);
}
ptr++;
goto loop;
} }
/************************************************************************* /*************************************************************************
...@@ -2762,13 +2765,13 @@ dict_create_foreign_constraints_low( ...@@ -2762,13 +2765,13 @@ dict_create_foreign_constraints_low(
ut_a(success); ut_a(success);
if (!isspace(*ptr)) { if (!isspace(*ptr) && *ptr != '"' && *ptr != '`') {
goto loop; goto loop;
} }
do { while (isspace(*ptr)) {
ptr++; ptr++;
} while (isspace(*ptr)); }
/* read constraint name unless got "CONSTRAINT FOREIGN" */ /* read constraint name unless got "CONSTRAINT FOREIGN" */
if (ptr != ptr2) { if (ptr != ptr2) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment