summaryrefslogtreecommitdiff
path: root/innobase/row/row0mysql.c
diff options
context:
space:
mode:
Diffstat (limited to 'innobase/row/row0mysql.c')
-rw-r--r--innobase/row/row0mysql.c74
1 files changed, 33 insertions, 41 deletions
diff --git a/innobase/row/row0mysql.c b/innobase/row/row0mysql.c
index 6d1f6f6e40e..35305b037c6 100644
--- a/innobase/row/row0mysql.c
+++ b/innobase/row/row0mysql.c
@@ -89,9 +89,6 @@ row_mysql_store_blob_ref(
also to set the NULL bit in the MySQL record
header! */
{
- ulint sum = 0;
- ulint i;
-
/* MySQL might assume the field is set to zero except the length and
the pointer fields */
@@ -106,22 +103,6 @@ row_mysql_store_blob_ref(
ut_a(col_len - 8 > 2 || len < 256 * 256);
ut_a(col_len - 8 > 3 || len < 256 * 256 * 256);
- /* We try to track an elusive bug which probably was fixed
- May 9, 2002, but better be sure: we probe the data buffer
- to make sure it is in valid allocated memory */
-
- for (i = 0; i < len; i++) {
-
- sum += (ulint)(data + i);
- }
-
- /* The variable below is identically false, we just fool the
- compiler to not optimize away our loop */
- if (row_mysql_identically_false) {
-
- printf("Sum %lu\n", sum);
- }
-
mach_write_to_n_little_endian(dest, col_len - 8, len);
ut_memcpy(dest + col_len - 8, (byte*)&data, sizeof(byte*));
@@ -539,6 +520,7 @@ row_get_prebuilt_insert_row(
ins_node_t* node;
dtuple_t* row;
dict_table_t* table = prebuilt->table;
+ ulint i;
ut_ad(prebuilt && table && prebuilt->trx);
@@ -562,6 +544,14 @@ row_get_prebuilt_insert_row(
dict_table_copy_types(row, table);
+ /* We init the value of every field to the SQL NULL to avoid
+ a debug assertion from failing */
+
+ for (i = 0; i < dtuple_get_n_fields(row); i++) {
+
+ dtuple_get_nth_field(row, i)->len = UNIV_SQL_NULL;
+ }
+
ins_node_set_new_row(node, row);
prebuilt->ins_graph =
@@ -965,7 +955,8 @@ row_update_for_mysql(
if (prebuilt->pcur->btr_cur.index == clust_index) {
btr_pcur_copy_stored_position(node->pcur, prebuilt->pcur);
} else {
- btr_pcur_copy_stored_position(node->pcur, prebuilt->clust_pcur);
+ btr_pcur_copy_stored_position(node->pcur,
+ prebuilt->clust_pcur);
}
ut_a(node->pcur->rel_pos == BTR_PCUR_ON);
@@ -1490,8 +1481,7 @@ row_create_index_for_mysql(
ulint namelen;
ulint keywordlen;
ulint err;
- ulint i;
- ulint j;
+ ulint i, j;
ut_ad(rw_lock_own(&dict_operation_lock, RW_LOCK_EX));
ut_ad(mutex_own(&(dict_sys->mutex)));
@@ -1499,23 +1489,9 @@ row_create_index_for_mysql(
trx->op_info = (char *) "creating index";
- trx_start_if_not_started(trx);
-
- namelen = ut_strlen(index->table_name);
-
- keywordlen = ut_strlen("_recover_innodb_tmp_table");
-
- if (namelen >= keywordlen
- && 0 == ut_memcmp(
- index->table_name + namelen - keywordlen,
- (char*)"_recover_innodb_tmp_table", keywordlen)) {
-
- return(DB_SUCCESS);
- }
-
/* Check that the same column does not appear twice in the index.
- InnoDB assumes this in its algorithms, e.g., update of an index
- entry */
+ Starting from 4.0.14 InnoDB should be able to cope with that, but
+ safer not to allow them. */
for (i = 0; i < dict_index_get_n_fields(index); i++) {
for (j = 0; j < i; j++) {
@@ -1538,6 +1514,20 @@ row_create_index_for_mysql(
}
}
+ trx_start_if_not_started(trx);
+
+ namelen = ut_strlen(index->table_name);
+
+ keywordlen = ut_strlen("_recover_innodb_tmp_table");
+
+ if (namelen >= keywordlen
+ && 0 == ut_memcmp(
+ index->table_name + namelen - keywordlen,
+ (char*)"_recover_innodb_tmp_table", keywordlen)) {
+
+ return(DB_SUCCESS);
+ }
+
heap = mem_heap_create(512);
trx->dict_operation = TRUE;
@@ -1555,6 +1545,7 @@ row_create_index_for_mysql(
que_graph_free((que_t*) que_node_get_parent(thr));
error_handling:
+
if (err != DB_SUCCESS) {
/* We have special error handling here */
@@ -1677,7 +1668,7 @@ row_drop_table_for_mysql_in_background(
the InnoDB data dictionary get out-of-sync if the user runs
with innodb_flush_log_at_trx_commit = 0 */
- log_write_up_to(ut_dulint_max, LOG_WAIT_ONE_GROUP, TRUE);
+ log_buffer_flush_to_disk();
trx_commit_for_mysql(trx);
@@ -1959,7 +1950,8 @@ row_drop_table_for_mysql(
" found := 0;\n"
" ELSE"
" DELETE FROM SYS_FIELDS WHERE INDEX_ID = index_id;\n"
- " DELETE FROM SYS_INDEXES WHERE ID = index_id;\n"
+ " DELETE FROM SYS_INDEXES WHERE ID = index_id\n"
+ " AND TABLE_ID = table_id;\n"
" END IF;\n"
"END LOOP;\n"
"DELETE FROM SYS_COLUMNS WHERE TABLE_ID = table_id;\n"
@@ -2554,7 +2546,7 @@ loop:
prev_entry = row_rec_to_index_entry(ROW_COPY_DATA, index, rec, heap);
- ret = row_search_for_mysql(buf, PAGE_CUR_G, prebuilt, 0, ROW_SEL_NEXT);
+ ret = row_search_for_mysql(buf, PAGE_CUR_G, prebuilt, 0, ROW_SEL_NEXT);
goto loop;
}