mirror of
https://github.com/MariaDB/server.git
synced 2025-09-02 09:41:40 +03:00
Merge 127.(none):/home/osku/mysql/5.0/12084
into 127.(none):/home/osku/mysql/5.1/clean
This commit is contained in:
@@ -2527,3 +2527,15 @@ SELECT * FROM t1;
|
|||||||
id
|
id
|
||||||
1
|
1
|
||||||
DROP TABLE t2, t1;
|
DROP TABLE t2, t1;
|
||||||
|
CREATE TABLE t1
|
||||||
|
(
|
||||||
|
id INT PRIMARY KEY
|
||||||
|
) ENGINE=InnoDB;
|
||||||
|
CREATE TEMPORARY TABLE t2
|
||||||
|
(
|
||||||
|
id INT NOT NULL PRIMARY KEY,
|
||||||
|
b INT,
|
||||||
|
FOREIGN KEY (b) REFERENCES test.t1(id)
|
||||||
|
) ENGINE=InnoDB;
|
||||||
|
Got one of the listed errors
|
||||||
|
DROP TABLE t1;
|
||||||
|
@@ -1451,3 +1451,18 @@ TRUNCATE t1;
|
|||||||
INSERT INTO t1 (id) VALUES (NULL);
|
INSERT INTO t1 (id) VALUES (NULL);
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
DROP TABLE t2, t1;
|
DROP TABLE t2, t1;
|
||||||
|
|
||||||
|
-- Test that foreign keys in temporary tables are not accepted (bug #12084)
|
||||||
|
CREATE TABLE t1
|
||||||
|
(
|
||||||
|
id INT PRIMARY KEY
|
||||||
|
) ENGINE=InnoDB;
|
||||||
|
|
||||||
|
--error 1005,1005
|
||||||
|
CREATE TEMPORARY TABLE t2
|
||||||
|
(
|
||||||
|
id INT NOT NULL PRIMARY KEY,
|
||||||
|
b INT,
|
||||||
|
FOREIGN KEY (b) REFERENCES test.t1(id)
|
||||||
|
) ENGINE=InnoDB;
|
||||||
|
DROP TABLE t1;
|
||||||
|
@@ -4689,13 +4689,7 @@ ha_innobase::create(
|
|||||||
form->s->row_type != ROW_TYPE_REDUNDANT);
|
form->s->row_type != ROW_TYPE_REDUNDANT);
|
||||||
|
|
||||||
if (error) {
|
if (error) {
|
||||||
innobase_commit_low(trx);
|
goto cleanup;
|
||||||
|
|
||||||
row_mysql_unlock_data_dictionary(trx);
|
|
||||||
|
|
||||||
trx_free_for_mysql(trx);
|
|
||||||
|
|
||||||
DBUG_RETURN(error);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Look for a primary key */
|
/* Look for a primary key */
|
||||||
@@ -4719,13 +4713,7 @@ ha_innobase::create(
|
|||||||
error = create_clustered_index_when_no_primary(trx,
|
error = create_clustered_index_when_no_primary(trx,
|
||||||
norm_name);
|
norm_name);
|
||||||
if (error) {
|
if (error) {
|
||||||
innobase_commit_low(trx);
|
goto cleanup;
|
||||||
|
|
||||||
row_mysql_unlock_data_dictionary(trx);
|
|
||||||
|
|
||||||
trx_free_for_mysql(trx);
|
|
||||||
|
|
||||||
DBUG_RETURN(error);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4734,13 +4722,7 @@ ha_innobase::create(
|
|||||||
first */
|
first */
|
||||||
if ((error = create_index(trx, form, norm_name,
|
if ((error = create_index(trx, form, norm_name,
|
||||||
(uint) primary_key_no))) {
|
(uint) primary_key_no))) {
|
||||||
innobase_commit_low(trx);
|
goto cleanup;
|
||||||
|
|
||||||
row_mysql_unlock_data_dictionary(trx);
|
|
||||||
|
|
||||||
trx_free_for_mysql(trx);
|
|
||||||
|
|
||||||
DBUG_RETURN(error);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4749,14 +4731,7 @@ ha_innobase::create(
|
|||||||
if (i != (uint) primary_key_no) {
|
if (i != (uint) primary_key_no) {
|
||||||
|
|
||||||
if ((error = create_index(trx, form, norm_name, i))) {
|
if ((error = create_index(trx, form, norm_name, i))) {
|
||||||
|
goto cleanup;
|
||||||
innobase_commit_low(trx);
|
|
||||||
|
|
||||||
row_mysql_unlock_data_dictionary(trx);
|
|
||||||
|
|
||||||
trx_free_for_mysql(trx);
|
|
||||||
|
|
||||||
DBUG_RETURN(error);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4769,21 +4744,18 @@ ha_innobase::create(
|
|||||||
current_thd->query_length,
|
current_thd->query_length,
|
||||||
current_thd->charset())) {
|
current_thd->charset())) {
|
||||||
error = HA_ERR_OUT_OF_MEM;
|
error = HA_ERR_OUT_OF_MEM;
|
||||||
} else {
|
|
||||||
error = row_table_add_foreign_constraints(trx,
|
goto cleanup;
|
||||||
q.str, norm_name);
|
|
||||||
|
|
||||||
error = convert_error_code_to_mysql(error, NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
error = row_table_add_foreign_constraints(trx,
|
||||||
|
q.str, norm_name,
|
||||||
|
create_info->options & HA_LEX_CREATE_TMP_TABLE);
|
||||||
|
|
||||||
|
error = convert_error_code_to_mysql(error, NULL);
|
||||||
|
|
||||||
if (error) {
|
if (error) {
|
||||||
innobase_commit_low(trx);
|
goto cleanup;
|
||||||
|
|
||||||
row_mysql_unlock_data_dictionary(trx);
|
|
||||||
|
|
||||||
trx_free_for_mysql(trx);
|
|
||||||
|
|
||||||
DBUG_RETURN(error);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4823,6 +4795,15 @@ ha_innobase::create(
|
|||||||
trx_free_for_mysql(trx);
|
trx_free_for_mysql(trx);
|
||||||
|
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
innobase_commit_low(trx);
|
||||||
|
|
||||||
|
row_mysql_unlock_data_dictionary(trx);
|
||||||
|
|
||||||
|
trx_free_for_mysql(trx);
|
||||||
|
|
||||||
|
DBUG_RETURN(error);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*********************************************************************
|
/*********************************************************************
|
||||||
|
@@ -2871,8 +2871,12 @@ dict_create_foreign_constraints_low(
|
|||||||
table2 can be written also with the database
|
table2 can be written also with the database
|
||||||
name before it: test.table2; the default
|
name before it: test.table2; the default
|
||||||
database is the database of parameter name */
|
database is the database of parameter name */
|
||||||
const char* name) /* in: table full name in the normalized form
|
const char* name, /* in: table full name in the normalized form
|
||||||
database_name/table_name */
|
database_name/table_name */
|
||||||
|
ibool reject_fks)
|
||||||
|
/* in: if TRUE, fail with error code
|
||||||
|
DB_CANNOT_ADD_CONSTRAINT if any foreign
|
||||||
|
keys are found. */
|
||||||
{
|
{
|
||||||
dict_table_t* table;
|
dict_table_t* table;
|
||||||
dict_table_t* referenced_table;
|
dict_table_t* referenced_table;
|
||||||
@@ -2994,6 +2998,18 @@ loop:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (*ptr == '\0') {
|
if (*ptr == '\0') {
|
||||||
|
/* The proper way to reject foreign keys for temporary
|
||||||
|
tables would be to split the lexing and syntactical
|
||||||
|
analysis of foreign key clauses from the actual adding
|
||||||
|
of them, so that ha_innodb.cc could first parse the SQL
|
||||||
|
command, determine if there are any foreign keys, and
|
||||||
|
if so, immediately reject the command if the table is a
|
||||||
|
temporary one. For now, this kludge will work. */
|
||||||
|
if (reject_fks && (UT_LIST_GET_LEN(table->foreign_list) > 0))
|
||||||
|
{
|
||||||
|
return DB_CANNOT_ADD_CONSTRAINT;
|
||||||
|
}
|
||||||
|
|
||||||
/**********************************************************/
|
/**********************************************************/
|
||||||
/* The following call adds the foreign key constraints
|
/* The following call adds the foreign key constraints
|
||||||
to the data dictionary system tables on disk */
|
to the data dictionary system tables on disk */
|
||||||
@@ -3417,9 +3433,12 @@ dict_create_foreign_constraints(
|
|||||||
name before it: test.table2; the
|
name before it: test.table2; the
|
||||||
default database id the database of
|
default database id the database of
|
||||||
parameter name */
|
parameter name */
|
||||||
const char* name) /* in: table full name in the
|
const char* name, /* in: table full name in the
|
||||||
normalized form
|
normalized form
|
||||||
database_name/table_name */
|
database_name/table_name */
|
||||||
|
ibool reject_fks) /* in: if TRUE, fail with error
|
||||||
|
code DB_CANNOT_ADD_CONSTRAINT if
|
||||||
|
any foreign keys are found. */
|
||||||
{
|
{
|
||||||
char* str;
|
char* str;
|
||||||
ulint err;
|
ulint err;
|
||||||
@@ -3428,7 +3447,8 @@ dict_create_foreign_constraints(
|
|||||||
str = dict_strip_comments(sql_string);
|
str = dict_strip_comments(sql_string);
|
||||||
heap = mem_heap_create(10000);
|
heap = mem_heap_create(10000);
|
||||||
|
|
||||||
err = dict_create_foreign_constraints_low(trx, heap, str, name);
|
err = dict_create_foreign_constraints_low(trx, heap, str, name,
|
||||||
|
reject_fks);
|
||||||
|
|
||||||
mem_heap_free(heap);
|
mem_heap_free(heap);
|
||||||
mem_free(str);
|
mem_free(str);
|
||||||
|
@@ -228,9 +228,12 @@ dict_create_foreign_constraints(
|
|||||||
name before it: test.table2; the
|
name before it: test.table2; the
|
||||||
default database id the database of
|
default database id the database of
|
||||||
parameter name */
|
parameter name */
|
||||||
const char* name); /* in: table full name in the
|
const char* name, /* in: table full name in the
|
||||||
normalized form
|
normalized form
|
||||||
database_name/table_name */
|
database_name/table_name */
|
||||||
|
ibool reject_fks); /* in: if TRUE, fail with error
|
||||||
|
code DB_CANNOT_ADD_CONSTRAINT if
|
||||||
|
any foreign keys are found. */
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
Parses the CONSTRAINT id's to be dropped in an ALTER TABLE statement. */
|
Parses the CONSTRAINT id's to be dropped in an ALTER TABLE statement. */
|
||||||
|
|
||||||
|
@@ -355,9 +355,13 @@ row_table_add_foreign_constraints(
|
|||||||
FOREIGN KEY (a, b) REFERENCES table2(c, d),
|
FOREIGN KEY (a, b) REFERENCES table2(c, d),
|
||||||
table2 can be written also with the
|
table2 can be written also with the
|
||||||
database name before it: test.table2 */
|
database name before it: test.table2 */
|
||||||
const char* name); /* in: table full name in the
|
const char* name, /* in: table full name in the
|
||||||
normalized form
|
normalized form
|
||||||
database_name/table_name */
|
database_name/table_name */
|
||||||
|
ibool reject_fks); /* in: if TRUE, fail with error
|
||||||
|
code DB_CANNOT_ADD_CONSTRAINT if
|
||||||
|
any foreign keys are found. */
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
The master thread in srv0srv.c calls this regularly to drop tables which
|
The master thread in srv0srv.c calls this regularly to drop tables which
|
||||||
we must drop in background after queries to them have ended. Such lazy
|
we must drop in background after queries to them have ended. Such lazy
|
||||||
|
@@ -2088,9 +2088,12 @@ row_table_add_foreign_constraints(
|
|||||||
FOREIGN KEY (a, b) REFERENCES table2(c, d),
|
FOREIGN KEY (a, b) REFERENCES table2(c, d),
|
||||||
table2 can be written also with the
|
table2 can be written also with the
|
||||||
database name before it: test.table2 */
|
database name before it: test.table2 */
|
||||||
const char* name) /* in: table full name in the
|
const char* name, /* in: table full name in the
|
||||||
normalized form
|
normalized form
|
||||||
database_name/table_name */
|
database_name/table_name */
|
||||||
|
ibool reject_fks) /* in: if TRUE, fail with error
|
||||||
|
code DB_CANNOT_ADD_CONSTRAINT if
|
||||||
|
any foreign keys are found. */
|
||||||
{
|
{
|
||||||
ulint err;
|
ulint err;
|
||||||
|
|
||||||
@@ -2111,7 +2114,8 @@ row_table_add_foreign_constraints(
|
|||||||
|
|
||||||
trx->dict_operation = TRUE;
|
trx->dict_operation = TRUE;
|
||||||
|
|
||||||
err = dict_create_foreign_constraints(trx, sql_string, name);
|
err = dict_create_foreign_constraints(trx, sql_string, name,
|
||||||
|
reject_fks);
|
||||||
|
|
||||||
if (err == DB_SUCCESS) {
|
if (err == DB_SUCCESS) {
|
||||||
/* Check that also referencing constraints are ok */
|
/* Check that also referencing constraints are ok */
|
||||||
|
Reference in New Issue
Block a user