Commit 0aa8d141 authored by unknown's avatar unknown
Browse files

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 1d635090
Loading
Loading
Loading
Loading
+29 −26
Original line number Diff line number Diff line
@@ -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,33 +2150,36 @@ dict_scan_to(
	const char*	ptr,	/* in: scan from */
	const char*	string)	/* in: look for this */
{
	ibool	success;
	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;
loop:
	if (*ptr == '\0') {
		return(ptr);
			for (i = 0; string[i]; i++) {
				if (toupper((ulint)(ptr[i]))
					!= toupper((ulint)(string[i]))) {
					goto nomatch;
				}
			}

	success = TRUE;
	
	for (i = 0; i < ut_strlen(string); i++) {
		if (toupper((ulint)(ptr[i])) != toupper((ulint)(string[i]))) {
			success = FALSE;

			break;
		nomatch:
			;
		}
	}

	if (success) {

	return(ptr);
}

	ptr++;

	goto loop;
}

/*************************************************************************
Accepts a specified string. Comparisons are case-insensitive. */

@@ -2762,13 +2765,13 @@ dict_create_foreign_constraints_low(

		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) {