mirror of
https://github.com/MariaDB/server.git
synced 2025-01-31 02:51:44 +01:00
InnoDB: fix bugs in the FOREIGN KEY parser (Bug #6340)
This commit is contained in:
parent
73bb6b9c33
commit
b58cb6b50f
1 changed files with 29 additions and 26 deletions
|
@ -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
|
||||
dict_table_get_nth_col_pos(
|
||||
|
@ -2140,8 +2140,8 @@ dict_foreign_add_to_cache(
|
|||
|
||||
/*************************************************************************
|
||||
Scans from pointer onwards. Stops if is at the start of a copy of
|
||||
'string' where characters are compared without case sensitivity. Stops
|
||||
also at '\0'. */
|
||||
'string' where characters are compared without case sensitivity, and
|
||||
only outside `` or "" quotes. Stops also at '\0'. */
|
||||
static
|
||||
const char*
|
||||
dict_scan_to(
|
||||
|
@ -2150,31 +2150,34 @@ dict_scan_to(
|
|||
const char* ptr, /* in: scan from */
|
||||
const char* string) /* in: look for this */
|
||||
{
|
||||
ibool success;
|
||||
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;
|
||||
char quote = '\0';
|
||||
|
||||
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;
|
||||
nomatch:
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
if (success) {
|
||||
|
||||
return(ptr);
|
||||
}
|
||||
|
||||
ptr++;
|
||||
|
||||
goto loop;
|
||||
return(ptr);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
|
@ -2762,13 +2765,13 @@ loop:
|
|||
|
||||
ut_a(success);
|
||||
|
||||
if (!isspace(*ptr)) {
|
||||
if (!isspace(*ptr) && *ptr != '"' && *ptr != '`') {
|
||||
goto loop;
|
||||
}
|
||||
|
||||
do {
|
||||
while (isspace(*ptr)) {
|
||||
ptr++;
|
||||
} while (isspace(*ptr));
|
||||
}
|
||||
|
||||
/* read constraint name unless got "CONSTRAINT FOREIGN" */
|
||||
if (ptr != ptr2) {
|
||||
|
|
Loading…
Add table
Reference in a new issue