diff options
author | unknown <mikael@dator5.(none)> | 2006-06-20 15:13:44 -0400 |
---|---|---|
committer | unknown <mikael@dator5.(none)> | 2006-06-20 15:13:44 -0400 |
commit | 5efea6a0a07b98e30fcd93ae11d7c3d93dfeaa03 (patch) | |
tree | 466a850c17d713549e1d1a16c02210bcdeb026fd /sql/sql_table.cc | |
parent | 89fc7fdb056fc8aa5ffb5da229b460e9863f0641 (diff) | |
parent | ae90c20278270d75bc43be0817d173916e44095b (diff) | |
download | mariadb-git-5efea6a0a07b98e30fcd93ae11d7c3d93dfeaa03.tar.gz |
Merge dator5.(none):/home/pappa/clean-mysql-5.1
into dator5.(none):/home/pappa/bug19309
sql/sql_table.cc:
Auto merged
mysql-test/r/partition.result:
manual merge
mysql-test/t/partition.test:
manual merge
Diffstat (limited to 'sql/sql_table.cc')
-rw-r--r-- | sql/sql_table.cc | 39 |
1 files changed, 37 insertions, 2 deletions
diff --git a/sql/sql_table.cc b/sql/sql_table.cc index bf0535567b4..a746e91d318 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -3002,6 +3002,31 @@ void sp_prepare_create_field(THD *thd, create_field *sql_field) /* + Copy HA_CREATE_INFO struct + SYNOPSIS + copy_create_info() + lex_create_info The create_info struct setup by parser + RETURN VALUES + > 0 A pointer to a copy of the lex_create_info + 0 Memory allocation error + DESCRIPTION + Allocate memory for copy of HA_CREATE_INFO structure from parser + to ensure we can reuse the parser struct in stored procedures + and prepared statements. +*/ + +static HA_CREATE_INFO *copy_create_info(HA_CREATE_INFO *lex_create_info) +{ + HA_CREATE_INFO *create_info; + if (!(create_info= (HA_CREATE_INFO*)sql_alloc(sizeof(HA_CREATE_INFO)))) + mem_alloc_error(sizeof(HA_CREATE_INFO)); + else + memcpy((void*)create_info, (void*)lex_create_info, sizeof(HA_CREATE_INFO)); + return create_info; +} + + +/* Create a table SYNOPSIS @@ -3030,7 +3055,7 @@ void sp_prepare_create_field(THD *thd, create_field *sql_field) bool mysql_create_table_internal(THD *thd, const char *db, const char *table_name, - HA_CREATE_INFO *create_info, + HA_CREATE_INFO *lex_create_info, List<create_field> &fields, List<Key> &keys,bool internal_tmp_table, uint select_field_count) @@ -3040,10 +3065,15 @@ bool mysql_create_table_internal(THD *thd, const char *alias; uint db_options, key_count; KEY *key_info_buffer; + HA_CREATE_INFO *create_info; handler *file; bool error= TRUE; DBUG_ENTER("mysql_create_table_internal"); + if (!(create_info= copy_create_info(lex_create_info))) + { + DBUG_RETURN(TRUE); + } /* Check for duplicate fields and check type of table to create */ if (!fields.elements) { @@ -4889,7 +4919,7 @@ static uint compare_tables(TABLE *table, List<create_field> *create_list, */ bool mysql_alter_table(THD *thd,char *new_db, char *new_name, - HA_CREATE_INFO *create_info, + HA_CREATE_INFO *lex_create_info, TABLE_LIST *table_list, List<create_field> &fields, List<Key> &keys, uint order_num, ORDER *order, @@ -4907,6 +4937,7 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name, ulonglong next_insert_id; uint db_create_options, used_fields; handlerton *old_db_type, *new_db_type; + HA_CREATE_INFO *create_info; uint need_copy_table= 0; bool no_table_reopen= FALSE, varchar= FALSE; #ifdef WITH_PARTITION_STORAGE_ENGINE @@ -4932,6 +4963,10 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name, LINT_INIT(index_drop_buffer); thd->proc_info="init"; + if (!(create_info= copy_create_info(lex_create_info))) + { + DBUG_RETURN(TRUE); + } table_name=table_list->table_name; alias= (lower_case_table_names == 2) ? table_list->alias : table_name; db=table_list->db; |