mirror of
https://github.com/MariaDB/server.git
synced 2026-05-16 20:07:13 +02:00
Merge with 4.0
innobase/dict/dict0boot.c: Auto merged innobase/dict/dict0load.c: Auto merged innobase/dict/dict0mem.c: Auto merged innobase/fut/fut0lst.c: Auto merged innobase/include/buf0lru.h: Auto merged innobase/include/dict0mem.h: Auto merged innobase/include/fsp0fsp.h: Auto merged innobase/include/ha0ha.h: Auto merged innobase/include/ibuf0ibuf.h: Auto merged innobase/include/lock0lock.h: Auto merged innobase/include/log0log.h: Auto merged innobase/include/mem0pool.h: Auto merged innobase/include/mtr0mtr.h: Auto merged innobase/include/os0file.h: Auto merged innobase/include/rem0rec.h: Auto merged innobase/include/rem0rec.ic: Auto merged innobase/include/srv0srv.h: Auto merged innobase/include/sync0sync.h: Auto merged innobase/include/trx0sys.h: Auto merged innobase/include/ut0byte.h: Auto merged innobase/include/ut0ut.h: Auto merged innobase/mem/mem0pool.c: Auto merged innobase/mtr/mtr0mtr.c: Auto merged innobase/os/os0proc.c: Auto merged innobase/pars/lexyy.c: Auto merged innobase/pars/pars0opt.c: Auto merged innobase/row/row0ins.c: Auto merged innobase/row/row0purge.c: Auto merged innobase/row/row0uins.c: Auto merged innobase/row/row0umod.c: Auto merged innobase/row/row0undo.c: Auto merged innobase/row/row0upd.c: Auto merged innobase/trx/trx0purge.c: Auto merged innobase/trx/trx0roll.c: Auto merged innobase/trx/trx0sys.c: Auto merged innobase/trx/trx0undo.c: Auto merged innobase/ut/ut0byte.c: Auto merged pstack/bucomm.h: Auto merged pstack/budbg.h: Auto merged sql/item_sum.h: Auto merged sql/slave.cc: Auto merged sql/sql_db.cc: Auto merged support-files/mysql.spec.sh: Auto merged tests/insert_test.c: Auto merged mysql-test/t/func_group.test: Merge with 4.0 Put 4.1 tests lasts sql/ha_innodb.cc: Merge with 4.0 Added checking of results from my_malloc() BitKeeper/etc/logging_ok: Logging to logging@openlogging.org accepted
This commit is contained in:
commit
1065f2bbd6
125 changed files with 4583 additions and 4780 deletions
|
|
@ -71,7 +71,8 @@ dict_hdr_get_new_id(
|
|||
compile wrong */
|
||||
|
||||
if (0 == ut_dulint_cmp(id, ut_dulint_max)) {
|
||||
printf("Max id\n");
|
||||
/* TO DO: remove this code, or make it conditional */
|
||||
ut_dbg_null_ptr = 0;
|
||||
}
|
||||
|
||||
id = ut_dulint_add(id, 1);
|
||||
|
|
|
|||
|
|
@ -25,11 +25,6 @@ Created 1/8/1996 Heikki Tuuri
|
|||
#include "trx0roll.h"
|
||||
#include "usr0sess.h"
|
||||
|
||||
/* Maximum lengths of identifiers in MySQL, in bytes */
|
||||
#define MAX_TABLE_NAME_LEN 64
|
||||
#define MAX_COLUMN_NAME_LEN 64
|
||||
#define MAX_IDENTIFIER_LEN 255
|
||||
|
||||
/*********************************************************************
|
||||
Based on a table object, this function builds the entry to be inserted
|
||||
in the SYS_TABLES system table. */
|
||||
|
|
@ -37,67 +32,6 @@ static
|
|||
dtuple_t*
|
||||
dict_create_sys_tables_tuple(
|
||||
/*=========================*/
|
||||
/* out: the tuple which should be inserted */
|
||||
dict_table_t* table, /* in: table */
|
||||
mem_heap_t* heap); /* in: memory heap from which the memory for
|
||||
the built tuple is allocated */
|
||||
/*********************************************************************
|
||||
Based on a table object, this function builds the entry to be inserted
|
||||
in the SYS_COLUMNS system table. */
|
||||
static
|
||||
dtuple_t*
|
||||
dict_create_sys_columns_tuple(
|
||||
/*==========================*/
|
||||
/* out: the tuple which should be inserted */
|
||||
dict_table_t* table, /* in: table */
|
||||
ulint i, /* in: column number */
|
||||
mem_heap_t* heap); /* in: memory heap from which the memory for
|
||||
the built tuple is allocated */
|
||||
/*********************************************************************
|
||||
Based on an index object, this function builds the entry to be inserted
|
||||
in the SYS_INDEXES system table. */
|
||||
static
|
||||
dtuple_t*
|
||||
dict_create_sys_indexes_tuple(
|
||||
/*==========================*/
|
||||
/* out: the tuple which should be inserted */
|
||||
dict_index_t* index, /* in: index */
|
||||
mem_heap_t* heap, /* in: memory heap from which the memory for
|
||||
the built tuple is allocated */
|
||||
trx_t* trx); /* in: transaction handle */
|
||||
/*********************************************************************
|
||||
Based on an index object, this function builds the entry to be inserted
|
||||
in the SYS_FIELDS system table. */
|
||||
static
|
||||
dtuple_t*
|
||||
dict_create_sys_fields_tuple(
|
||||
/*=========================*/
|
||||
/* out: the tuple which should be inserted */
|
||||
dict_index_t* index, /* in: index */
|
||||
ulint i, /* in: field number */
|
||||
mem_heap_t* heap); /* in: memory heap from which the memory for
|
||||
the built tuple is allocated */
|
||||
/*********************************************************************
|
||||
Creates the tuple with which the index entry is searched for
|
||||
writing the index tree root page number, if such a tree is created. */
|
||||
static
|
||||
dtuple_t*
|
||||
dict_create_search_tuple(
|
||||
/*=====================*/
|
||||
/* out: the tuple for search */
|
||||
dtuple_t* tuple, /* in: the tuple inserted in the SYS_INDEXES
|
||||
table */
|
||||
mem_heap_t* heap); /* in: memory heap from which the memory for
|
||||
the built tuple is allocated */
|
||||
|
||||
/*********************************************************************
|
||||
Based on a table object, this function builds the entry to be inserted
|
||||
in the SYS_TABLES system table. */
|
||||
static
|
||||
dtuple_t*
|
||||
dict_create_sys_tables_tuple(
|
||||
/*=========================*/
|
||||
/* out: the tuple which should be inserted */
|
||||
dict_table_t* table, /* in: table */
|
||||
mem_heap_t* heap) /* in: memory heap from which the memory for
|
||||
the built tuple is allocated */
|
||||
|
|
@ -359,9 +293,8 @@ dict_create_sys_indexes_tuple(
|
|||
/*==========================*/
|
||||
/* out: the tuple which should be inserted */
|
||||
dict_index_t* index, /* in: index */
|
||||
mem_heap_t* heap, /* in: memory heap from which the memory for
|
||||
mem_heap_t* heap) /* in: memory heap from which the memory for
|
||||
the built tuple is allocated */
|
||||
trx_t* trx) /* in: transaction handle */
|
||||
{
|
||||
dict_table_t* sys_indexes;
|
||||
dict_table_t* table;
|
||||
|
|
@ -369,7 +302,6 @@ dict_create_sys_indexes_tuple(
|
|||
dfield_t* dfield;
|
||||
byte* ptr;
|
||||
|
||||
UT_NOT_USED(trx);
|
||||
#ifdef UNIV_SYNC_DEBUG
|
||||
ut_ad(mutex_own(&(dict_sys->mutex)));
|
||||
#endif /* UNIV_SYNC_DEBUG */
|
||||
|
|
@ -415,7 +347,9 @@ dict_create_sys_indexes_tuple(
|
|||
dfield_set_data(dfield, ptr, 4);
|
||||
/* 7: SPACE --------------------------*/
|
||||
|
||||
ut_a(DICT_SYS_INDEXES_SPACE_NO_FIELD == 7);
|
||||
#if DICT_SYS_INDEXES_SPACE_NO_FIELD != 7
|
||||
#error "DICT_SYS_INDEXES_SPACE_NO_FIELD != 7"
|
||||
#endif
|
||||
|
||||
dfield = dtuple_get_nth_field(entry, 5);
|
||||
|
||||
|
|
@ -425,7 +359,9 @@ dict_create_sys_indexes_tuple(
|
|||
dfield_set_data(dfield, ptr, 4);
|
||||
/* 8: PAGE_NO --------------------------*/
|
||||
|
||||
ut_a(DICT_SYS_INDEXES_PAGE_NO_FIELD == 8);
|
||||
#if DICT_SYS_INDEXES_PAGE_NO_FIELD != 8
|
||||
#error "DICT_SYS_INDEXES_PAGE_NO_FIELD != 8"
|
||||
#endif
|
||||
|
||||
dfield = dtuple_get_nth_field(entry, 6);
|
||||
|
||||
|
|
@ -593,8 +529,7 @@ dict_build_index_def_step(
|
|||
|
||||
index->page_no = FIL_NULL;
|
||||
|
||||
row = dict_create_sys_indexes_tuple(index, node->heap,
|
||||
thr_get_trx(thr));
|
||||
row = dict_create_sys_indexes_tuple(index, node->heap);
|
||||
node->ind_row = row;
|
||||
|
||||
ins_node_set_new_row(node->ind_def, row);
|
||||
|
|
@ -630,7 +565,6 @@ ulint
|
|||
dict_create_index_tree_step(
|
||||
/*========================*/
|
||||
/* out: DB_SUCCESS or DB_OUT_OF_FILE_SPACE */
|
||||
que_thr_t* thr, /* in: query thread */
|
||||
ind_node_t* node) /* in: index create node */
|
||||
{
|
||||
dict_index_t* index;
|
||||
|
|
@ -643,7 +577,6 @@ dict_create_index_tree_step(
|
|||
#ifdef UNIV_SYNC_DEBUG
|
||||
ut_ad(mutex_own(&(dict_sys->mutex)));
|
||||
#endif /* UNIV_SYNC_DEBUG */
|
||||
UT_NOT_USED(thr);
|
||||
|
||||
index = node->index;
|
||||
table = node->table;
|
||||
|
|
@ -1003,7 +936,7 @@ dict_create_index_step(
|
|||
|
||||
if (node->state == INDEX_CREATE_INDEX_TREE) {
|
||||
|
||||
err = dict_create_index_tree_step(thr, node);
|
||||
err = dict_create_index_tree_step(node);
|
||||
|
||||
if (err != DB_SUCCESS) {
|
||||
|
||||
|
|
@ -1101,13 +1034,13 @@ dict_create_or_check_foreign_constraint_tables(void)
|
|||
if (table1) {
|
||||
fprintf(stderr,
|
||||
"InnoDB: dropping incompletely created SYS_FOREIGN table\n");
|
||||
row_drop_table_for_mysql((char *) "SYS_FOREIGN", trx);
|
||||
row_drop_table_for_mysql((char*)"SYS_FOREIGN", trx, TRUE);
|
||||
}
|
||||
|
||||
if (table2) {
|
||||
fprintf(stderr,
|
||||
"InnoDB: dropping incompletely created SYS_FOREIGN_COLS table\n");
|
||||
row_drop_table_for_mysql((char *) "SYS_FOREIGN_COLS", trx);
|
||||
row_drop_table_for_mysql((char*)"SYS_FOREIGN_COLS", trx, TRUE);
|
||||
}
|
||||
|
||||
fprintf(stderr,
|
||||
|
|
@ -1157,8 +1090,8 @@ dict_create_or_check_foreign_constraint_tables(void)
|
|||
fprintf(stderr,
|
||||
"InnoDB: dropping incompletely created SYS_FOREIGN tables\n");
|
||||
|
||||
row_drop_table_for_mysql((char *) "SYS_FOREIGN", trx);
|
||||
row_drop_table_for_mysql((char *) "SYS_FOREIGN_COLS", trx);
|
||||
row_drop_table_for_mysql((char*)"SYS_FOREIGN", trx, TRUE);
|
||||
row_drop_table_for_mysql((char*)"SYS_FOREIGN_COLS", trx, TRUE);
|
||||
|
||||
error = DB_MUST_GET_MORE_FILE_SPACE;
|
||||
}
|
||||
|
|
@ -1207,11 +1140,22 @@ dict_create_add_foreigns_to_dictionary(
|
|||
que_t* graph;
|
||||
ulint number = start_id + 1;
|
||||
ulint len;
|
||||
ulint namelen;
|
||||
ulint error;
|
||||
char* ebuf = dict_foreign_err_buf;
|
||||
FILE* ef = dict_foreign_err_file;
|
||||
ulint i;
|
||||
char buf[10000];
|
||||
char* sql;
|
||||
char* sqlend;
|
||||
/* This procedure builds an InnoDB stored procedure which will insert
|
||||
the necessary rows into SYS_FOREIGN and SYS_FOREIGN_COLS. */
|
||||
static const char str1[] = "PROCEDURE ADD_FOREIGN_DEFS_PROC () IS\n"
|
||||
"BEGIN\n"
|
||||
"INSERT INTO SYS_FOREIGN VALUES(";
|
||||
static const char str2[] = ");\n";
|
||||
static const char str3[] =
|
||||
"INSERT INTO SYS_FOREIGN_COLS VALUES(";
|
||||
static const char str4[] =
|
||||
"COMMIT WORK;\n"
|
||||
"END;\n";
|
||||
|
||||
#ifdef UNIV_SYNC_DEBUG
|
||||
ut_ad(mutex_own(&(dict_sys->mutex)));
|
||||
|
|
@ -1231,58 +1175,75 @@ loop:
|
|||
return(DB_SUCCESS);
|
||||
}
|
||||
|
||||
/* Build an InnoDB stored procedure which will insert the necessary
|
||||
rows to SYS_FOREIGN and SYS_FOREIGN_COLS */
|
||||
|
||||
len = 0;
|
||||
|
||||
len += sprintf(buf,
|
||||
"PROCEDURE ADD_FOREIGN_DEFS_PROC () IS\n"
|
||||
"BEGIN\n");
|
||||
|
||||
namelen = strlen(table->name);
|
||||
ut_a(namelen < MAX_TABLE_NAME_LEN);
|
||||
|
||||
if (foreign->id == NULL) {
|
||||
/* Generate a new constraint id */
|
||||
foreign->id = mem_heap_alloc(foreign->heap, namelen + 20);
|
||||
ulint namelen = strlen(table->name);
|
||||
char* id = mem_heap_alloc(foreign->heap, namelen + 20);
|
||||
/* no overflow if number < 1e13 */
|
||||
sprintf(foreign->id, "%s_ibfk_%lu", table->name, (ulong) number);
|
||||
number++;
|
||||
sprintf(id, "%s_ibfk_%lu", table->name, (ulong) number++);
|
||||
foreign->id = id;
|
||||
}
|
||||
|
||||
ut_a(strlen(foreign->id) < MAX_IDENTIFIER_LEN);
|
||||
ut_a(len < (sizeof buf)
|
||||
- 46 - 2 * MAX_TABLE_NAME_LEN - MAX_IDENTIFIER_LEN - 20);
|
||||
|
||||
len += sprintf(buf + len,
|
||||
"INSERT INTO SYS_FOREIGN VALUES('%s', '%s', '%s', %lu);\n",
|
||||
foreign->id,
|
||||
table->name,
|
||||
foreign->referenced_table_name,
|
||||
(ulong) (foreign->n_fields
|
||||
+ (foreign->type << 24)));
|
||||
len = (sizeof str1) + (sizeof str2) + (sizeof str4) - 3
|
||||
+ 9/* ' and , chars */ + 10/* 32-bit integer */
|
||||
+ ut_strlenq(foreign->id, '\'') * (foreign->n_fields + 1)
|
||||
+ ut_strlenq(table->name, '\'')
|
||||
+ ut_strlenq(foreign->referenced_table_name, '\'');
|
||||
|
||||
for (i = 0; i < foreign->n_fields; i++) {
|
||||
ut_a(len < (sizeof buf)
|
||||
- 51 - 2 * MAX_COLUMN_NAME_LEN
|
||||
- MAX_IDENTIFIER_LEN - 20);
|
||||
|
||||
len += sprintf(buf + len,
|
||||
"INSERT INTO SYS_FOREIGN_COLS VALUES('%s', %lu, '%s', '%s');\n",
|
||||
foreign->id,
|
||||
(ulong) i,
|
||||
foreign->foreign_col_names[i],
|
||||
foreign->referenced_col_names[i]);
|
||||
len += 9/* ' and , chars */ + 10/* 32-bit integer */
|
||||
+ (sizeof str3) + (sizeof str2) - 2
|
||||
+ ut_strlenq(foreign->foreign_col_names[i], '\'')
|
||||
+ ut_strlenq(foreign->referenced_col_names[i], '\'');
|
||||
}
|
||||
|
||||
ut_a(len < (sizeof buf) - 19);
|
||||
len += sprintf(buf + len,"COMMIT WORK;\nEND;\n");
|
||||
sql = sqlend = mem_alloc(len + 1);
|
||||
|
||||
graph = pars_sql(buf);
|
||||
/* INSERT INTO SYS_FOREIGN VALUES(...); */
|
||||
memcpy(sqlend, str1, (sizeof str1) - 1);
|
||||
sqlend += (sizeof str1) - 1;
|
||||
*sqlend++ = '\'';
|
||||
sqlend = ut_strcpyq(sqlend, '\'', foreign->id);
|
||||
*sqlend++ = '\'', *sqlend++ = ',', *sqlend++ = '\'';
|
||||
sqlend = ut_strcpyq(sqlend, '\'', table->name);
|
||||
*sqlend++ = '\'', *sqlend++ = ',', *sqlend++ = '\'';
|
||||
sqlend = ut_strcpyq(sqlend, '\'', foreign->referenced_table_name);
|
||||
*sqlend++ = '\'', *sqlend++ = ',';
|
||||
sqlend += sprintf(sqlend, "%010lu",
|
||||
foreign->n_fields + (foreign->type << 24));
|
||||
memcpy(sqlend, str2, (sizeof str2) - 1);
|
||||
sqlend += (sizeof str2) - 1;
|
||||
|
||||
for (i = 0; i < foreign->n_fields; i++) {
|
||||
/* INSERT INTO SYS_FOREIGN_COLS VALUES(...); */
|
||||
memcpy(sqlend, str3, (sizeof str3) - 1);
|
||||
sqlend += (sizeof str3) - 1;
|
||||
*sqlend++ = '\'';
|
||||
sqlend = ut_strcpyq(sqlend, '\'', foreign->id);
|
||||
*sqlend++ = '\''; *sqlend++ = ',';
|
||||
sqlend += sprintf(sqlend, "%010lu", (ulong) i);
|
||||
*sqlend++ = ','; *sqlend++ = '\'';
|
||||
sqlend = ut_strcpyq(sqlend, '\'',
|
||||
foreign->foreign_col_names[i]);
|
||||
*sqlend++ = '\''; *sqlend++ = ','; *sqlend++ = '\'';
|
||||
sqlend = ut_strcpyq(sqlend, '\'',
|
||||
foreign->referenced_col_names[i]);
|
||||
*sqlend++ = '\'';
|
||||
memcpy(sqlend, str2, (sizeof str2) - 1);
|
||||
sqlend += (sizeof str2) - 1;
|
||||
}
|
||||
|
||||
memcpy(sqlend, str4, sizeof str4);
|
||||
sqlend += sizeof str4;
|
||||
|
||||
ut_a(sqlend == sql + len + 1);
|
||||
|
||||
graph = pars_sql(sql);
|
||||
|
||||
ut_a(graph);
|
||||
|
||||
mem_free(sql);
|
||||
|
||||
graph->trx = trx;
|
||||
trx->graph = NULL;
|
||||
|
||||
|
|
@ -1298,14 +1259,17 @@ loop:
|
|||
|
||||
if (error == DB_DUPLICATE_KEY) {
|
||||
mutex_enter(&dict_foreign_err_mutex);
|
||||
ut_sprintf_timestamp(ebuf);
|
||||
ut_a(strlen(ebuf) < DICT_FOREIGN_ERR_BUF_LEN
|
||||
- MAX_TABLE_NAME_LEN - MAX_IDENTIFIER_LEN - 201);
|
||||
sprintf(ebuf + strlen(ebuf),
|
||||
" Error in foreign key constraint creation for table %s.\n"
|
||||
"A foreign key constraint of name %s\n"
|
||||
"already exists (note that internally InnoDB adds 'databasename/'\n"
|
||||
"in front of the user-defined constraint name).\n", table->name, foreign->id);
|
||||
rewind(ef);
|
||||
ut_print_timestamp(ef);
|
||||
fputs(" Error in foreign key constraint creation for table ",
|
||||
ef);
|
||||
ut_print_name(ef, table->name);
|
||||
fputs(".\nA foreign key constraint of name ", ef);
|
||||
ut_print_name(ef, foreign->id);
|
||||
fputs("\nalready exists."
|
||||
" (Note that internally InnoDB adds 'databasename/'\n"
|
||||
"in front of the user-defined constraint name).\n",
|
||||
ef);
|
||||
|
||||
mutex_exit(&dict_foreign_err_mutex);
|
||||
|
||||
|
|
@ -1318,12 +1282,12 @@ loop:
|
|||
"InnoDB: internal error number %lu\n", (ulong) error);
|
||||
|
||||
mutex_enter(&dict_foreign_err_mutex);
|
||||
ut_sprintf_timestamp(ebuf);
|
||||
ut_a(strlen(ebuf) < DICT_FOREIGN_ERR_BUF_LEN
|
||||
- MAX_TABLE_NAME_LEN - 124);
|
||||
sprintf(ebuf + strlen(ebuf),
|
||||
" Internal error in foreign key constraint creation for table %s.\n"
|
||||
"See the MySQL .err log in the datadir for more information.\n", table->name);
|
||||
ut_print_timestamp(ef);
|
||||
fputs(" Internal error in foreign key constraint creation"
|
||||
" for table ", ef);
|
||||
ut_print_name(ef, table->name);
|
||||
fputs(".\n"
|
||||
"See the MySQL .err log in the datadir for more information.\n", ef);
|
||||
mutex_exit(&dict_foreign_err_mutex);
|
||||
|
||||
return(error);
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -40,7 +40,6 @@ dict_get_first_table_name_in_db(
|
|||
rec_t* rec;
|
||||
byte* field;
|
||||
ulint len;
|
||||
char* table_name;
|
||||
mtr_t mtr;
|
||||
|
||||
#ifdef UNIV_SYNC_DEBUG
|
||||
|
|
@ -92,9 +91,7 @@ loop:
|
|||
|
||||
/* We found one */
|
||||
|
||||
table_name = mem_alloc(len + 1);
|
||||
ut_memcpy(table_name, field, len);
|
||||
table_name[len] = '\0';
|
||||
char* table_name = mem_strdupl(field, len);
|
||||
|
||||
btr_pcur_close(&pcur);
|
||||
mtr_commit(&mtr);
|
||||
|
|
@ -157,18 +154,19 @@ loop:
|
|||
|
||||
/* We found one */
|
||||
|
||||
ut_memcpy(table_name, field, len);
|
||||
table_name[len] = '\0';
|
||||
|
||||
char* table_name = mem_strdupl(field, len);
|
||||
|
||||
btr_pcur_store_position(&pcur, &mtr);
|
||||
|
||||
mtr_commit(&mtr);
|
||||
|
||||
|
||||
table = dict_table_get_low(table_name);
|
||||
mem_free(table_name);
|
||||
|
||||
if (table == NULL) {
|
||||
fprintf(stderr, "InnoDB: Failed to load table %s\n",
|
||||
table_name);
|
||||
fputs("InnoDB: Failed to load table ", stderr);
|
||||
ut_print_namel(stderr, field, len);
|
||||
putc('\n', stderr);
|
||||
} else {
|
||||
/* The table definition was corrupt if there
|
||||
is no index */
|
||||
|
|
@ -300,7 +298,6 @@ dict_load_columns(
|
|||
byte* field;
|
||||
ulint len;
|
||||
byte* buf;
|
||||
char* name_buf;
|
||||
char* name;
|
||||
ulint mtype;
|
||||
ulint prtype;
|
||||
|
|
@ -351,12 +348,7 @@ dict_load_columns(
|
|||
dict_table_get_first_index(sys_columns), 4))->name));
|
||||
|
||||
field = rec_get_nth_field(rec, 4, &len);
|
||||
|
||||
name_buf = mem_heap_alloc(heap, len + 1);
|
||||
ut_memcpy(name_buf, field, len);
|
||||
name_buf[len] = '\0';
|
||||
|
||||
name = name_buf;
|
||||
name = mem_heap_strdupl(heap, field, len);
|
||||
|
||||
field = rec_get_nth_field(rec, 5, &len);
|
||||
mtype = mach_read_from_4(field);
|
||||
|
|
@ -393,6 +385,27 @@ dict_load_columns(
|
|||
mtr_commit(&mtr);
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
Report that an index field or index for a table has been delete marked. */
|
||||
static
|
||||
void
|
||||
dict_load_report_deleted_index(
|
||||
char* name, /* in: table name */
|
||||
ulint field) /* in: index field, or ULINT_UNDEFINED */
|
||||
{
|
||||
fputs("InnoDB: Error: data dictionary entry"
|
||||
" for table ", stderr);
|
||||
ut_print_name(stderr, name);
|
||||
fputs(" is corrupt!\n", stderr);
|
||||
if (field != ULINT_UNDEFINED) {
|
||||
fprintf(stderr,
|
||||
"InnoDB: Index field %lu is delete marked.\n", field);
|
||||
}
|
||||
else {
|
||||
fputs("InnoDB: An index is delete marked.\n", stderr);
|
||||
}
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
Loads definitions for index fields. */
|
||||
static
|
||||
|
|
@ -408,7 +421,6 @@ dict_load_fields(
|
|||
btr_pcur_t pcur;
|
||||
dtuple_t* tuple;
|
||||
dfield_t* dfield;
|
||||
char* col_name;
|
||||
ulint pos_and_prefix_len;
|
||||
ulint prefix_len;
|
||||
rec_t* rec;
|
||||
|
|
@ -446,10 +458,7 @@ dict_load_fields(
|
|||
|
||||
ut_a(btr_pcur_is_on_user_rec(&pcur, &mtr));
|
||||
if (rec_get_deleted_flag(rec)) {
|
||||
fprintf(stderr,
|
||||
"InnoDB: Error: data dictionary entry for table %s is corrupt!\n"
|
||||
"InnoDB: An index field is delete marked.\n",
|
||||
table->name);
|
||||
dict_load_report_deleted_index(table->name, i);
|
||||
}
|
||||
|
||||
field = rec_get_nth_field(rec, 0, &len);
|
||||
|
|
@ -487,11 +496,8 @@ dict_load_fields(
|
|||
|
||||
field = rec_get_nth_field(rec, 4, &len);
|
||||
|
||||
col_name = mem_heap_alloc(heap, len + 1);
|
||||
ut_memcpy(col_name, field, len);
|
||||
col_name[len] = '\0';
|
||||
|
||||
dict_mem_index_add_field(index, col_name, 0, prefix_len);
|
||||
dict_mem_index_add_field(index,
|
||||
mem_heap_strdupl(heap, field, len), 0, prefix_len);
|
||||
|
||||
btr_pcur_move_to_next_user_rec(&pcur, &mtr);
|
||||
}
|
||||
|
|
@ -575,10 +581,8 @@ dict_load_indexes(
|
|||
}
|
||||
|
||||
if (rec_get_deleted_flag(rec)) {
|
||||
fprintf(stderr,
|
||||
"InnoDB: Error: data dictionary entry for table %s is corrupt!\n"
|
||||
"InnoDB: An index is delete marked.\n",
|
||||
table->name);
|
||||
dict_load_report_deleted_index(table->name,
|
||||
ULINT_UNDEFINED);
|
||||
|
||||
btr_pcur_close(&pcur);
|
||||
mtr_commit(&mtr);
|
||||
|
|
@ -596,10 +600,7 @@ dict_load_indexes(
|
|||
dict_table_get_first_index(sys_indexes), 4))->name));
|
||||
|
||||
field = rec_get_nth_field(rec, 4, &name_len);
|
||||
|
||||
name_buf = mem_heap_alloc(heap, name_len + 1);
|
||||
ut_memcpy(name_buf, field, name_len);
|
||||
name_buf[name_len] = '\0';
|
||||
name_buf = mem_heap_strdupl(heap, field, name_len);
|
||||
|
||||
field = rec_get_nth_field(rec, 5, &len);
|
||||
n_fields = mach_read_from_4(field);
|
||||
|
|
@ -620,11 +621,13 @@ dict_load_indexes(
|
|||
|
||||
if (page_no == FIL_NULL) {
|
||||
|
||||
fprintf(stderr,
|
||||
"InnoDB: Error: trying to load index %s for table %s\n"
|
||||
"InnoDB: but the index tree has been freed!\n",
|
||||
name_buf, table->name);
|
||||
|
||||
fputs("InnoDB: Error: trying to load index ", stderr);
|
||||
ut_print_name(stderr, name_buf);
|
||||
fputs(" for table ", stderr);
|
||||
ut_print_name(stderr, table->name);
|
||||
fputs("\n"
|
||||
"InnoDB: but the index tree has been freed!\n", stderr);
|
||||
|
||||
btr_pcur_close(&pcur);
|
||||
mtr_commit(&mtr);
|
||||
|
||||
|
|
@ -634,10 +637,12 @@ dict_load_indexes(
|
|||
if ((type & DICT_CLUSTERED) == 0
|
||||
&& NULL == dict_table_get_first_index(table)) {
|
||||
|
||||
fprintf(stderr,
|
||||
"InnoDB: Error: trying to load index %s for table %s\n"
|
||||
"InnoDB: but the first index was not clustered!\n",
|
||||
name_buf, table->name);
|
||||
fputs("InnoDB: Error: trying to load index ", stderr);
|
||||
ut_print_namel(stderr, name_buf, name_len);
|
||||
fputs(" for table ", stderr);
|
||||
ut_print_name(stderr, table->name);
|
||||
fputs("\n"
|
||||
"InnoDB: but the first index is not clustered!\n", stderr);
|
||||
|
||||
btr_pcur_close(&pcur);
|
||||
mtr_commit(&mtr);
|
||||
|
|
@ -648,7 +653,7 @@ dict_load_indexes(
|
|||
if (is_sys_table
|
||||
&& ((type & DICT_CLUSTERED)
|
||||
|| ((table == dict_sys->sys_tables)
|
||||
&& (name_len == ut_strlen("ID_IND"))
|
||||
&& (name_len == (sizeof "ID_IND") - 1)
|
||||
&& (0 == ut_memcmp(name_buf, (char*) "ID_IND",
|
||||
name_len))))) {
|
||||
|
||||
|
|
@ -702,7 +707,6 @@ dict_load_table(
|
|||
rec_t* rec;
|
||||
byte* field;
|
||||
ulint len;
|
||||
char* buf;
|
||||
ulint space;
|
||||
ulint n_cols;
|
||||
ulint err;
|
||||
|
|
@ -802,15 +806,13 @@ dict_load_table(
|
|||
|
||||
if (table->type == DICT_TABLE_CLUSTER_MEMBER) {
|
||||
ut_error;
|
||||
|
||||
#if 0 /* clustered tables have not been implemented yet */
|
||||
field = rec_get_nth_field(rec, 6, &len);
|
||||
table->mix_id = mach_read_from_8(field);
|
||||
|
||||
field = rec_get_nth_field(rec, 8, &len);
|
||||
buf = mem_heap_alloc(heap, len);
|
||||
ut_memcpy(buf, field, len);
|
||||
|
||||
table->cluster_name = buf;
|
||||
table->cluster_name = mem_heap_strdupl(heap, field, len);
|
||||
#endif
|
||||
}
|
||||
|
||||
if ((table->type == DICT_TABLE_CLUSTER)
|
||||
|
|
@ -879,7 +881,6 @@ dict_load_table_on_id(
|
|||
byte* field;
|
||||
ulint len;
|
||||
dict_table_t* table;
|
||||
char* name;
|
||||
mtr_t mtr;
|
||||
|
||||
#ifdef UNIV_SYNC_DEBUG
|
||||
|
|
@ -942,13 +943,8 @@ dict_load_table_on_id(
|
|||
|
||||
/* Now we get the table name from the record */
|
||||
field = rec_get_nth_field(rec, 1, &len);
|
||||
|
||||
name = mem_heap_alloc(heap, len + 1);
|
||||
ut_memcpy(name, field, len);
|
||||
name[len] = '\0';
|
||||
|
||||
/* Load the table definition to memory */
|
||||
table = dict_load_table(name);
|
||||
table = dict_load_table(mem_heap_strdupl(heap, field, len));
|
||||
|
||||
btr_pcur_close(&pcur);
|
||||
mtr_commit(&mtr);
|
||||
|
|
@ -995,7 +991,6 @@ dict_load_foreign_cols(
|
|||
btr_pcur_t pcur;
|
||||
dtuple_t* tuple;
|
||||
dfield_t* dfield;
|
||||
char* col_name;
|
||||
rec_t* rec;
|
||||
byte* field;
|
||||
ulint len;
|
||||
|
|
@ -1040,21 +1035,13 @@ dict_load_foreign_cols(
|
|||
ut_a(i == mach_read_from_4(field));
|
||||
|
||||
field = rec_get_nth_field(rec, 4, &len);
|
||||
|
||||
col_name = mem_heap_alloc(foreign->heap, len + 1);
|
||||
ut_memcpy(col_name, field, len);
|
||||
col_name[len] = '\0';
|
||||
|
||||
foreign->foreign_col_names[i] = col_name;
|
||||
foreign->foreign_col_names[i] =
|
||||
mem_heap_strdupl(foreign->heap, field, len);
|
||||
|
||||
field = rec_get_nth_field(rec, 5, &len);
|
||||
foreign->referenced_col_names[i] =
|
||||
mem_heap_strdupl(foreign->heap, field, len);
|
||||
|
||||
col_name = mem_heap_alloc(foreign->heap, len + 1);
|
||||
ut_memcpy(col_name, field, len);
|
||||
col_name[len] = '\0';
|
||||
|
||||
foreign->referenced_col_names[i] = col_name;
|
||||
|
||||
btr_pcur_move_to_next_user_rec(&pcur, &mtr);
|
||||
}
|
||||
|
||||
|
|
@ -1110,8 +1097,10 @@ dict_load_foreign(
|
|||
|| rec_get_deleted_flag(rec)) {
|
||||
/* Not found */
|
||||
|
||||
fprintf(stderr,
|
||||
"InnoDB: Error A: cannot load foreign constraint %s\n", id);
|
||||
fputs("InnoDB: Error A: cannot load foreign constraint ",
|
||||
stderr);
|
||||
ut_print_name(stderr, id);
|
||||
putc('\n', stderr);
|
||||
|
||||
btr_pcur_close(&pcur);
|
||||
mtr_commit(&mtr);
|
||||
|
|
@ -1125,8 +1114,10 @@ dict_load_foreign(
|
|||
/* Check if the id in record is the searched one */
|
||||
if (len != ut_strlen(id) || ut_memcmp(id, field, len) != 0) {
|
||||
|
||||
fprintf(stderr,
|
||||
"InnoDB: Error B: cannot load foreign constraint %s\n", id);
|
||||
fputs("InnoDB: Error B: cannot load foreign constraint ",
|
||||
stderr);
|
||||
ut_print_name(stderr, id);
|
||||
putc('\n', stderr);
|
||||
|
||||
btr_pcur_close(&pcur);
|
||||
mtr_commit(&mtr);
|
||||
|
|
@ -1151,23 +1142,15 @@ dict_load_foreign(
|
|||
foreign->type = foreign->n_fields >> 24;
|
||||
foreign->n_fields = foreign->n_fields & 0xFFFFFFUL;
|
||||
|
||||
foreign->id = mem_heap_alloc(foreign->heap, ut_strlen(id) + 1);
|
||||
|
||||
ut_memcpy(foreign->id, id, ut_strlen(id) + 1);
|
||||
foreign->id = mem_heap_strdup(foreign->heap, id);
|
||||
|
||||
field = rec_get_nth_field(rec, 3, &len);
|
||||
|
||||
foreign->foreign_table_name = mem_heap_alloc(foreign->heap, 1 + len);
|
||||
|
||||
ut_memcpy(foreign->foreign_table_name, field, len);
|
||||
foreign->foreign_table_name[len] = '\0';
|
||||
foreign->foreign_table_name =
|
||||
mem_heap_strdupl(foreign->heap, field, len);
|
||||
|
||||
field = rec_get_nth_field(rec, 4, &len);
|
||||
|
||||
foreign->referenced_table_name = mem_heap_alloc(foreign->heap,
|
||||
1 + len);
|
||||
ut_memcpy(foreign->referenced_table_name, field, len);
|
||||
foreign->referenced_table_name[len] = '\0';
|
||||
foreign->referenced_table_name =
|
||||
mem_heap_strdupl(foreign->heap, field, len);
|
||||
|
||||
btr_pcur_close(&pcur);
|
||||
mtr_commit(&mtr);
|
||||
|
|
@ -1281,10 +1264,7 @@ loop:
|
|||
|
||||
/* Now we get a foreign key constraint id */
|
||||
field = rec_get_nth_field(rec, 1, &len);
|
||||
|
||||
id = mem_heap_alloc(heap, len + 1);
|
||||
ut_memcpy(id, field, len);
|
||||
id[len] = '\0';
|
||||
id = mem_heap_strdupl(heap, field, len);
|
||||
|
||||
btr_pcur_store_position(&pcur, &mtr);
|
||||
|
||||
|
|
|
|||
|
|
@ -49,9 +49,7 @@ dict_mem_table_create(
|
|||
|
||||
table->heap = heap;
|
||||
|
||||
str = mem_heap_alloc(heap, 1 + ut_strlen(name));
|
||||
|
||||
ut_strcpy(str, name);
|
||||
str = mem_heap_strdup(heap, name);
|
||||
|
||||
table->type = DICT_TABLE_ORDINARY;
|
||||
table->name = str;
|
||||
|
|
@ -148,7 +146,6 @@ dict_mem_table_add_col(
|
|||
ulint len, /* in: length */
|
||||
ulint prec) /* in: precision */
|
||||
{
|
||||
char* str;
|
||||
dict_col_t* col;
|
||||
dtype_t* type;
|
||||
|
||||
|
|
@ -156,15 +153,11 @@ dict_mem_table_add_col(
|
|||
ut_ad(table->magic_n == DICT_TABLE_MAGIC_N);
|
||||
|
||||
table->n_def++;
|
||||
|
||||
|
||||
col = dict_table_get_nth_col(table, table->n_def - 1);
|
||||
|
||||
str = mem_heap_alloc(table->heap, 1 + ut_strlen(name));
|
||||
|
||||
ut_strcpy(str, name);
|
||||
|
||||
col->ind = table->n_def - 1;
|
||||
col->name = str;
|
||||
col->name = mem_heap_strdup(table->heap, name);
|
||||
col->table = table;
|
||||
col->ord_part = 0;
|
||||
|
||||
|
|
@ -190,7 +183,6 @@ dict_mem_index_create(
|
|||
ulint type, /* in: DICT_UNIQUE, DICT_CLUSTERED, ... ORed */
|
||||
ulint n_fields) /* in: number of fields */
|
||||
{
|
||||
char* str;
|
||||
dict_index_t* index;
|
||||
mem_heap_t* heap;
|
||||
|
||||
|
|
@ -201,13 +193,9 @@ dict_mem_index_create(
|
|||
|
||||
index->heap = heap;
|
||||
|
||||
str = mem_heap_alloc(heap, 1 + ut_strlen(index_name));
|
||||
|
||||
ut_strcpy(str, index_name);
|
||||
|
||||
index->type = type;
|
||||
index->space = space;
|
||||
index->name = str;
|
||||
index->name = mem_heap_strdup(heap, index_name);
|
||||
index->table_name = table_name;
|
||||
index->table = NULL;
|
||||
index->n_def = 0;
|
||||
|
|
@ -303,56 +291,3 @@ dict_mem_index_free(
|
|||
{
|
||||
mem_heap_free(index->heap);
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
Creates a procedure memory object. */
|
||||
|
||||
dict_proc_t*
|
||||
dict_mem_procedure_create(
|
||||
/*======================*/
|
||||
/* out, own: procedure object */
|
||||
char* name, /* in: procedure name */
|
||||
char* sql_string, /* in: procedure definition as an SQL
|
||||
string */
|
||||
que_fork_t* graph) /* in: parsed procedure graph */
|
||||
{
|
||||
dict_proc_t* proc;
|
||||
proc_node_t* proc_node;
|
||||
mem_heap_t* heap;
|
||||
char* str;
|
||||
|
||||
ut_ad(name);
|
||||
|
||||
heap = mem_heap_create(128);
|
||||
|
||||
proc = mem_heap_alloc(heap, sizeof(dict_proc_t));
|
||||
|
||||
proc->heap = heap;
|
||||
|
||||
str = mem_heap_alloc(heap, 1 + ut_strlen(name));
|
||||
|
||||
ut_strcpy(str, name);
|
||||
|
||||
proc->name = str;
|
||||
|
||||
str = mem_heap_alloc(heap, 1 + ut_strlen(sql_string));
|
||||
|
||||
ut_strcpy(str, sql_string);
|
||||
|
||||
proc->sql_string = str;
|
||||
|
||||
UT_LIST_INIT(proc->graphs);
|
||||
|
||||
/* UT_LIST_ADD_LAST(graphs, proc->graphs, graph); */
|
||||
|
||||
#ifdef UNIV_DEBUG
|
||||
UT_LIST_VALIDATE(graphs, que_t, proc->graphs);
|
||||
#endif
|
||||
proc->mem_fix = 0;
|
||||
|
||||
proc_node = que_fork_get_child(graph);
|
||||
|
||||
proc_node->dict_proc = proc;
|
||||
|
||||
return(proc);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue