#At file:///Users/kevinlewis/Work/Mysql/WL5628/2011-03-11/Part1/mysql-trunk-innodb/ based on revid:vasil.dimov@stripped
3548 kevin.lewis@stripped 2011-03-18
RB://621-Part 1 of the changes in RB://595.
These changes are a pre-requisite for WL#5744-Support various page sizes.
The main change here is the separation of the DICT_TF2_TEMPORARY flag from table->flags to a new flag
variable called table->flags2. Now, table->flags maps fully to SYS_TABLES.TYPE and table->flags2 maps to
SYS_TABLES.MIX_LEN. No changes are made to the on-disk structure of SYS_TABLES.
Other related changes:
* Some of the extra work to account for the DICT_TF2_TEMPORARY bit being at position 7 in table->flags
is no longer needed.
* dict_mem_table_create() passes flags2.
* SYS_TABLES.MIX_LEN was/is only checked for flags2 if SYS_TABLES.N_COLS had the high order bit set.
The code now refers to this bit as DICT_N_COLS_COMPACT instead of 0x80000000.
* #define DICT_TF_BIT_MASK (~(~0 << DICT_TF_BITS)) makes the code easier to read when checking only
the known bits in table->flags.
modified:
storage/innobase/dict/dict0boot.c
storage/innobase/dict/dict0crea.c
storage/innobase/dict/dict0dict.c
storage/innobase/dict/dict0load.c
storage/innobase/dict/dict0mem.c
storage/innobase/fil/fil0fil.c
storage/innobase/handler/ha_innodb.cc
storage/innobase/ibuf/ibuf0ibuf.c
storage/innobase/include/dict0mem.h
storage/innobase/mtr/mtr0log.c
storage/innobase/page/page0zip.c
storage/innobase/pars/pars0pars.c
storage/innobase/row/row0merge.c
storage/innobase/row/row0mysql.c
=== modified file 'storage/innobase/dict/dict0boot.c'
--- a/storage/innobase/dict/dict0boot.c revid:vasil.dimov@stripped
+++ b/storage/innobase/dict/dict0boot.c revid:kevin.lewis@stripped
@@ -1,6 +1,6 @@
/*****************************************************************************
-Copyright (c) 1996, 2010, Innobase Oy. All Rights Reserved.
+Copyright (c) 1996, 2011, Oracle and/or its affiliates. All Rights Reserved.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
@@ -283,7 +283,7 @@ dict_boot(void)
/* Insert into the dictionary cache the descriptions of the basic
system tables */
/*-------------------------*/
- table = dict_mem_table_create("SYS_TABLES", DICT_HDR_SPACE, 8, 0);
+ table = dict_mem_table_create("SYS_TABLES", DICT_HDR_SPACE, 8, 0, 0);
dict_mem_table_add_col(table, heap, "NAME", DATA_BINARY, 0, 0);
dict_mem_table_add_col(table, heap, "ID", DATA_BINARY, 0, 0);
@@ -335,7 +335,7 @@ dict_boot(void)
ut_a(error == DB_SUCCESS);
/*-------------------------*/
- table = dict_mem_table_create("SYS_COLUMNS", DICT_HDR_SPACE, 7, 0);
+ table = dict_mem_table_create("SYS_COLUMNS", DICT_HDR_SPACE, 7, 0, 0);
dict_mem_table_add_col(table, heap, "TABLE_ID", DATA_BINARY, 0, 0);
dict_mem_table_add_col(table, heap, "POS", DATA_INT, 0, 4);
@@ -367,7 +367,7 @@ dict_boot(void)
ut_a(error == DB_SUCCESS);
/*-------------------------*/
- table = dict_mem_table_create("SYS_INDEXES", DICT_HDR_SPACE, 7, 0);
+ table = dict_mem_table_create("SYS_INDEXES", DICT_HDR_SPACE, 7, 0, 0);
dict_mem_table_add_col(table, heap, "TABLE_ID", DATA_BINARY, 0, 0);
dict_mem_table_add_col(table, heap, "ID", DATA_BINARY, 0, 0);
@@ -413,7 +413,7 @@ dict_boot(void)
ut_a(error == DB_SUCCESS);
/*-------------------------*/
- table = dict_mem_table_create("SYS_FIELDS", DICT_HDR_SPACE, 3, 0);
+ table = dict_mem_table_create("SYS_FIELDS", DICT_HDR_SPACE, 3, 0, 0);
dict_mem_table_add_col(table, heap, "INDEX_ID", DATA_BINARY, 0, 0);
dict_mem_table_add_col(table, heap, "POS", DATA_INT, 0, 4);
=== modified file 'storage/innobase/dict/dict0crea.c'
--- a/storage/innobase/dict/dict0crea.c revid:vasil.dimov@stripped
+++ b/storage/innobase/dict/dict0crea.c revid:kevin.lewis@stripped
@@ -1,6 +1,6 @@
/*****************************************************************************
-Copyright (c) 1996, 2010, Innobase Oy. All Rights Reserved.
+Copyright (c) 1996, 2011, Oracle and/or its affiliates. All Rights Reserved.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
@@ -97,13 +97,13 @@ dict_create_sys_tables_tuple(
dfield = dtuple_get_nth_field(entry, 3/*TYPE*/);
ptr = mem_heap_alloc(heap, 4);
- if (table->flags & (~DICT_TF_COMPACT & ~(~0 << DICT_TF_BITS))) {
+ if (table->flags & ~DICT_TF_COMPACT) {
ut_a(table->flags & DICT_TF_COMPACT);
ut_a(dict_table_get_format(table) >= DICT_TF_FORMAT_ZIP);
ut_a((table->flags & DICT_TF_ZSSIZE_MASK)
<= (DICT_TF_ZSSIZE_MAX << DICT_TF_ZSSIZE_SHIFT));
- ut_a(!(table->flags & (~0 << DICT_TF2_BITS)));
- mach_write_to_4(ptr, table->flags & ~(~0 << DICT_TF_BITS));
+ ut_a(!(table->flags & ~DICT_TF_BIT_MASK));
+ mach_write_to_4(ptr, table->flags & DICT_TF_BIT_MASK);
} else {
mach_write_to_4(ptr, DICT_TABLE_ORDINARY);
}
@@ -120,7 +120,9 @@ dict_create_sys_tables_tuple(
dfield = dtuple_get_nth_field(entry, 5/*MIX_LEN*/);
ptr = mem_heap_alloc(heap, 4);
- mach_write_to_4(ptr, table->flags >> DICT_TF2_SHIFT);
+ /* Be sure all non-used bits are zero. */
+ ut_a(!(table->flags2 & ~DICT_TF2_BIT_MASK));
+ mach_write_to_4(ptr, table->flags2);
dfield_set_data(dfield, ptr, 4);
/* 8: CLUSTER_NAME ---------------------*/
@@ -291,7 +293,8 @@ dict_build_table_def_step(
ut_ad(!dict_table_zip_size(table)
|| dict_table_get_format(table) >= DICT_TF_FORMAT_ZIP);
- flags = table->flags & ~(~0 << DICT_TF_BITS);
+ flags = table->flags;
+ ut_a(!(flags & ~DICT_TF_BIT_MASK));
error = fil_create_new_single_table_tablespace(
space, path_or_name, is_path,
flags == DICT_TF_COMPACT ? 0 : flags,
@@ -309,8 +312,10 @@ dict_build_table_def_step(
mtr_commit(&mtr);
} else {
- /* Create in the system tablespace: disallow new features */
- table->flags &= (~0 << DICT_TF_BITS) | DICT_TF_COMPACT;
+ /* Create in the system tablespace: disallow Barracuda
+ features by keeping only the first bit which says whether
+ the row format is redundant or compact */
+ table->flags &= DICT_TF_COMPACT;
}
row = dict_create_sys_tables_tuple(table, node->heap);
=== modified file 'storage/innobase/dict/dict0dict.c'
--- a/storage/innobase/dict/dict0dict.c revid:vasil.dimov@stripped
+++ b/storage/innobase/dict/dict0dict.c revid:kevin.lewis@stripped
@@ -5085,7 +5085,7 @@ dict_ind_init(void)
dict_table_t* table;
/* create dummy table and index for REDUNDANT infimum and supremum */
- table = dict_mem_table_create("SYS_DUMMY1", DICT_HDR_SPACE, 1, 0);
+ table = dict_mem_table_create("SYS_DUMMY1", DICT_HDR_SPACE, 1, 0, 0);
dict_mem_table_add_col(table, NULL, NULL, DATA_CHAR,
DATA_ENGLISH | DATA_NOT_NULL, 8);
@@ -5097,7 +5097,8 @@ dict_ind_init(void)
/* create dummy table and index for COMPACT infimum and supremum */
table = dict_mem_table_create("SYS_DUMMY2",
- DICT_HDR_SPACE, 1, DICT_TF_COMPACT);
+ DICT_HDR_SPACE, 1,
+ DICT_TF_COMPACT, 0);
dict_mem_table_add_col(table, NULL, NULL, DATA_CHAR,
DATA_ENGLISH | DATA_NOT_NULL, 8);
dict_ind_compact = dict_mem_index_create("SYS_DUMMY2", "SYS_DUMMY2",
=== modified file 'storage/innobase/dict/dict0load.c'
--- a/storage/innobase/dict/dict0load.c revid:vasil.dimov@stripped
+++ b/storage/innobase/dict/dict0load.c revid:kevin.lewis@stripped
@@ -605,7 +605,7 @@ dict_sys_tables_get_flags(
field = rec_get_nth_field_old(rec, 4/*N_COLS*/, &len);
n_cols = mach_read_from_4(field);
- if (UNIV_UNLIKELY(!(n_cols & 0x80000000UL))) {
+ if (UNIV_UNLIKELY(!(n_cols & DICT_N_COLS_COMPACT))) {
/* New file formats require ROW_FORMAT=COMPACT. */
return(ULINT_UNDEFINED);
}
@@ -632,7 +632,7 @@ dict_sys_tables_get_flags(
return(ULINT_UNDEFINED);
}
- if (UNIV_UNLIKELY(flags & (~0 << DICT_TF_BITS))) {
+ if (UNIV_UNLIKELY(flags & ~DICT_TF_BIT_MASK)) {
/* Some unused bits are set. */
return(ULINT_UNDEFINED);
}
@@ -746,7 +746,7 @@ loop:
ibool is_temp;
field = rec_get_nth_field_old(rec, 4, &len);
- if (0x80000000UL & mach_read_from_4(field)) {
+ if (mach_read_from_4(field) & DICT_N_COLS_COMPACT) {
/* ROW_FORMAT=COMPACT: read the is_temp
flag from SYS_TABLES.MIX_LEN. */
field = rec_get_nth_field_old(rec, 7, &len);
@@ -1485,7 +1485,8 @@ dict_load_table_low(
ulint len;
ulint space;
ulint n_cols;
- ulint flags;
+ ulint flags = 0;
+ ulint flags2 = 0;
if (UNIV_UNLIKELY(rec_get_deleted_flag(rec, 0))) {
return("delete-marked record in SYS_TABLES");
@@ -1567,27 +1568,22 @@ err_len:
(ulong) flags);
return("incorrect flags in SYS_TABLES");
}
- } else {
- flags = 0;
}
/* The high-order bit of N_COLS is the "compact format" flag.
For tables in that format, MIX_LEN may hold additional flags. */
- if (n_cols & 0x80000000UL) {
- ulint flags2;
-
+ if (n_cols & DICT_N_COLS_COMPACT) {
flags |= DICT_TF_COMPACT;
- field = rec_get_nth_field_old(rec, 7, &len);
+ field = rec_get_nth_field_old(rec, 7/*MIX_LEN*/, &len);
if (UNIV_UNLIKELY(len != 4)) {
-
goto err_len;
}
flags2 = mach_read_from_4(field);
- if (flags2 & (~0 << (DICT_TF2_BITS - DICT_TF2_SHIFT))) {
+ if (flags2 & ~DICT_TF2_BIT_MASK) {
ut_print_timestamp(stderr);
fputs(" InnoDB: Warning: table ", stderr);
ut_print_filename(stderr, name);
@@ -1596,15 +1592,13 @@ err_len:
" has unknown flags %lx.\n",
(ulong) flags2);
- flags2 &= ~(~0 << (DICT_TF2_BITS - DICT_TF2_SHIFT));
+ flags2 &= DICT_TF2_BIT_MASK;
}
-
- flags |= flags2 << DICT_TF2_SHIFT;
}
/* See if the tablespace is available. */
- *table = dict_mem_table_create(name, space, n_cols & ~0x80000000UL,
- flags);
+ *table = dict_mem_table_create(
+ name, space, n_cols & ~DICT_N_COLS_COMPACT, flags, flags2);
field = rec_get_nth_field_old(rec, 3/*ID*/, &len);
ut_ad(len == 8); /* this was checked earlier */
@@ -1707,11 +1701,10 @@ err_exit:
/* The system tablespace is always available. */
} else if (!fil_space_for_table_exists_in_mem(
table->space, name,
- (table->flags >> DICT_TF2_SHIFT)
- & DICT_TF2_TEMPORARY,
+ table->flags2 & DICT_TF2_TEMPORARY,
FALSE, FALSE)) {
- if (table->flags & (DICT_TF2_TEMPORARY << DICT_TF2_SHIFT)) {
+ if (table->flags2 & DICT_TF2_TEMPORARY) {
/* Do not bother to retry opening temporary tables. */
table->ibd_file_missing = TRUE;
} else {
@@ -1727,7 +1720,7 @@ err_exit:
if (!fil_open_single_table_tablespace(
TRUE, table->space,
table->flags == DICT_TF_COMPACT ? 0 :
- table->flags & ~(~0 << DICT_TF_BITS), name)) {
+ table->flags, name)) {
/* We failed to find a sensible
tablespace file */
=== modified file 'storage/innobase/dict/dict0mem.c'
--- a/storage/innobase/dict/dict0mem.c revid:vasil.dimov@stripped
+++ b/storage/innobase/dict/dict0mem.c revid:kevin.lewis@stripped
@@ -1,6 +1,6 @@
/*****************************************************************************
-Copyright (c) 1996, 2010, Innobase Oy. All Rights Reserved.
+Copyright (c) 1996, 2011, Oracle and/or its affiliates. All Rights Reserved.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
@@ -63,13 +63,15 @@ dict_mem_table_create(
ignored if the table is made a member of
a cluster */
ulint n_cols, /*!< in: number of columns */
- ulint flags) /*!< in: table flags */
+ ulint flags, /*!< in: table flags */
+ ulint flags2) /*!< in: table flags2 */
{
dict_table_t* table;
mem_heap_t* heap;
ut_ad(name);
- ut_a(!(flags & (~0 << DICT_TF2_BITS)));
+ ut_a(!(flags & ~DICT_TF_BIT_MASK));
+ ut_a(!(flags2 & ~DICT_TF2_BIT_MASK));
heap = mem_heap_create(DICT_HEAP_SIZE);
@@ -78,6 +80,7 @@ dict_mem_table_create(
table->heap = heap;
table->flags = (unsigned int) flags;
+ table->flags2 = (unsigned int) flags2;
table->name = ut_malloc(strlen(name) + 1);
memcpy(table->name, name, strlen(name) + 1);
table->space = (unsigned int) space;
=== modified file 'storage/innobase/fil/fil0fil.c'
--- a/storage/innobase/fil/fil0fil.c revid:vasil.dimov@stripped
+++ b/storage/innobase/fil/fil0fil.c revid:kevin.lewis@stripped
@@ -1153,13 +1153,11 @@ fil_space_create(
fil_space_t* space;
/* The tablespace flags (FSP_SPACE_FLAGS) should be 0 for
- ROW_FORMAT=COMPACT
- ((table->flags & ~(~0 << DICT_TF_BITS)) == DICT_TF_COMPACT) and
+ ROW_FORMAT=COMPACT (table->flags == DICT_TF_COMPACT) and
ROW_FORMAT=REDUNDANT (table->flags == 0). For any other
- format, the tablespace flags should equal
- (table->flags & ~(~0 << DICT_TF_BITS)). */
+ format, the tablespace flags should equal table->flags. */
ut_a(flags != DICT_TF_COMPACT);
- ut_a(!(flags & (~0UL << DICT_TF_BITS)));
+ ut_a(!(flags & ~DICT_TF_BIT_MASK));
try_again:
/*printf(
@@ -2697,13 +2695,11 @@ fil_create_new_single_table_tablespace(
ut_a(space_id < SRV_LOG_SPACE_FIRST_ID);
ut_a(size >= FIL_IBD_FILE_INITIAL_SIZE);
/* The tablespace flags (FSP_SPACE_FLAGS) should be 0 for
- ROW_FORMAT=COMPACT
- ((table->flags & ~(~0 << DICT_TF_BITS)) == DICT_TF_COMPACT) and
+ ROW_FORMAT=COMPACT (table->flags == DICT_TF_COMPACT) and
ROW_FORMAT=REDUNDANT (table->flags == 0). For any other
- format, the tablespace flags should equal
- (table->flags & ~(~0 << DICT_TF_BITS)). */
+ format, the tablespace flags should equal table->flags. */
ut_a(flags != DICT_TF_COMPACT);
- ut_a(!(flags & (~0UL << DICT_TF_BITS)));
+ ut_a(!(flags & ~DICT_TF_BIT_MASK));
path = fil_make_ibd_name(tablename, is_temp);
@@ -3072,13 +3068,11 @@ fil_open_single_table_tablespace(
filepath = fil_make_ibd_name(name, FALSE);
/* The tablespace flags (FSP_SPACE_FLAGS) should be 0 for
- ROW_FORMAT=COMPACT
- ((table->flags & ~(~0 << DICT_TF_BITS)) == DICT_TF_COMPACT) and
+ ROW_FORMAT=COMPACT (table->flags == DICT_TF_COMPACT) and
ROW_FORMAT=REDUNDANT (table->flags == 0). For any other
- format, the tablespace flags should equal
- (table->flags & ~(~0 << DICT_TF_BITS)). */
+ format, the tablespace flags should equal table->flags. */
ut_a(flags != DICT_TF_COMPACT);
- ut_a(!(flags & (~0UL << DICT_TF_BITS)));
+ ut_a(!(flags & ~DICT_TF_BIT_MASK));
file = os_file_create_simple_no_error_handling(
innodb_file_data_key, filepath, OS_FILE_OPEN,
@@ -3131,8 +3125,7 @@ fil_open_single_table_tablespace(
ut_free(buf2);
- if (UNIV_UNLIKELY(space_id != id
- || space_flags != (flags & ~(~0 << DICT_TF_BITS)))) {
+ if (UNIV_UNLIKELY(space_id != id || space_flags != flags)) {
ut_print_timestamp(stderr);
fputs(" InnoDB: Error: tablespace id and flags in file ",
=== modified file 'storage/innobase/handler/ha_innodb.cc'
--- a/storage/innobase/handler/ha_innodb.cc revid:vasil.dimov@stripped
+++ b/storage/innobase/handler/ha_innodb.cc revid:kevin.lewis@stripped
@@ -6668,7 +6668,8 @@ create_table_def(
an .ibd file for it (no .ibd extension
in the path, though); otherwise this
is NULL */
- ulint flags) /*!< in: table flags */
+ ulint flags, /*!< in: table flags */
+ ulint flags2) /*!< in: table flags2 */
{
Field* field;
dict_table_t* table;
@@ -6708,7 +6709,7 @@ create_table_def(
/* We pass 0 as the space id, and determine at a lower level the space
id where to store the table */
- table = dict_mem_table_create(table_name, 0, n_cols, flags);
+ table = dict_mem_table_create(table_name, 0, n_cols, flags, flags2);
if (path_of_temp_table) {
table->dir_path_of_temp_table =
@@ -7183,7 +7184,8 @@ ha_innobase::create(
char norm_name[FN_REFLEN];
THD* thd = ha_thd();
ib_int64_t auto_inc_value;
- ulint flags;
+ ulint flags = 0;
+ ulint flags2 = 0;
/* Cache the value of innodb_file_format, in case it is
modified by another thread while the table is being created. */
const ulint file_format = srv_file_format;
@@ -7253,8 +7255,6 @@ ha_innobase::create(
/* Create the table definition in InnoDB */
- flags = 0;
-
/* Validate create options if innodb_strict_mode is set. */
if (!create_options_are_valid(thd, form, create_info)) {
error = ER_ILLEGAL_HA_CREATE_OPTION;
@@ -7407,12 +7407,12 @@ ha_innobase::create(
}
if (create_info->options & HA_LEX_CREATE_TMP_TABLE) {
- flags |= DICT_TF2_TEMPORARY << DICT_TF2_SHIFT;
+ flags2 |= DICT_TF2_TEMPORARY;
}
error = create_table_def(trx, form, norm_name,
create_info->options & HA_LEX_CREATE_TMP_TABLE ? name2 : NULL,
- flags);
+ flags, flags2);
if (error) {
goto cleanup;
=== modified file 'storage/innobase/ibuf/ibuf0ibuf.c'
--- a/storage/innobase/ibuf/ibuf0ibuf.c revid:vasil.dimov@stripped
+++ b/storage/innobase/ibuf/ibuf0ibuf.c revid:kevin.lewis@stripped
@@ -573,7 +573,7 @@ ibuf_init_at_db_start(void)
heap = mem_heap_create(450);
/* Use old-style record format for the insert buffer. */
- table = dict_mem_table_create(IBUF_TABLE_NAME, IBUF_SPACE_ID, 1, 0);
+ table = dict_mem_table_create(IBUF_TABLE_NAME, IBUF_SPACE_ID, 1, 0, 0);
dict_mem_table_add_col(table, heap, "DUMMY_COLUMN", DATA_BINARY, 0, 0);
@@ -1515,7 +1515,7 @@ ibuf_dummy_index_create(
table = dict_mem_table_create("IBUF_DUMMY",
DICT_HDR_SPACE, n,
- comp ? DICT_TF_COMPACT : 0);
+ comp ? DICT_TF_COMPACT : 0, 0);
index = dict_mem_index_create("IBUF_DUMMY", "IBUF_DUMMY",
DICT_HDR_SPACE, 0, n);
=== modified file 'storage/innobase/include/dict0mem.h'
--- a/storage/innobase/include/dict0mem.h revid:vasil.dimov@stripped
+++ b/storage/innobase/include/dict0mem.h revid:kevin.lewis@stripped
@@ -83,6 +83,8 @@ combination of types */
#define DICT_TF_FORMAT_MASK \
((~(~0 << (DICT_TF_BITS - DICT_TF_FORMAT_SHIFT))) << DICT_TF_FORMAT_SHIFT)
#define DICT_TF_FORMAT_51 0 /*!< InnoDB/MySQL up to 5.1 */
+#define DICT_N_COLS_COMPACT 0x80000000UL /*!< Set if ROW_FORMAT!=REDUNDANT */
+
#define DICT_TF_FORMAT_ZIP 1 /*!< InnoDB plugin for 5.1:
compressed tables,
new BLOB treatment */
@@ -97,23 +99,22 @@ combination of types */
#if (1 << (DICT_TF_BITS - DICT_TF_FORMAT_SHIFT)) <= DICT_TF_FORMAT_MAX
# error "DICT_TF_BITS is insufficient for DICT_TF_FORMAT_MAX"
#endif
+/** Valid table flag bits */
+#define DICT_TF_BIT_MASK (~(~0 << DICT_TF_BITS))
/* @} */
-/** @brief Additional table flags.
+/** @brief Table Flags set number 2.
These flags will be stored in SYS_TABLES.MIX_LEN. All unused flags
will be written as 0. The column may contain garbage for tables
created with old versions of InnoDB that only implemented
ROW_FORMAT=REDUNDANT. */
/* @{ */
-#define DICT_TF2_SHIFT DICT_TF_BITS
- /*!< Shift value for
- table->flags. */
-#define DICT_TF2_TEMPORARY 1 /*!< TRUE for tables from
- CREATE TEMPORARY TABLE. */
-#define DICT_TF2_BITS (DICT_TF2_SHIFT + 1)
- /*!< Total number of bits
- in table->flags. */
+/** Total number of bits in table->flags2. */
+#define DICT_TF2_BITS 1
+#define DICT_TF2_BIT_MASK ~(~0 << DICT_TF2_BITS)
+
+#define DICT_TF2_TEMPORARY (1<<0) /*!< 1 if CREATE TEMPORARY TABLE */
/* @} */
/** Tables could be chained together with Foreign key constraint. When
@@ -145,7 +146,8 @@ dict_mem_table_create(
is ignored if the table is made
a member of a cluster */
ulint n_cols, /*!< in: number of columns */
- ulint flags); /*!< in: table flags */
+ ulint flags, /*!< in: table flags */
+ ulint flags2); /*!< in: table flags2 */
/****************************************************************//**
Free a table memory object. */
UNIV_INTERN
@@ -486,7 +488,8 @@ struct dict_table_struct{
unsigned space:32;
/*!< space where the clustered index of the
table is placed */
- unsigned flags:DICT_TF2_BITS;/*!< DICT_TF_COMPACT, ... */
+ unsigned flags:DICT_TF_BITS; /*!< DICT_TF_... */
+ unsigned flags2:DICT_TF2_BITS; /*!< DICT_TF2_... */
unsigned ibd_file_missing:1;
/*!< TRUE if this is in a single-table
tablespace and the .ibd file is missing; then
=== modified file 'storage/innobase/mtr/mtr0log.c'
--- a/storage/innobase/mtr/mtr0log.c revid:vasil.dimov@stripped
+++ b/storage/innobase/mtr/mtr0log.c revid:kevin.lewis@stripped
@@ -1,6 +1,6 @@
/*****************************************************************************
-Copyright (c) 1995, 2009, Innobase Oy. All Rights Reserved.
+Copyright (c) 1995, 2011, Oracle and/or its affiliates. All Rights Reserved.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
@@ -563,7 +563,7 @@ mlog_parse_index(
n = n_uniq = 1;
}
table = dict_mem_table_create("LOG_DUMMY", DICT_HDR_SPACE, n,
- comp ? DICT_TF_COMPACT : 0);
+ comp ? DICT_TF_COMPACT : 0, 0);
ind = dict_mem_index_create("LOG_DUMMY", "LOG_DUMMY",
DICT_HDR_SPACE, 0, n);
ind->table = table;
=== modified file 'storage/innobase/page/page0zip.c'
--- a/storage/innobase/page/page0zip.c revid:vasil.dimov@stripped
+++ b/storage/innobase/page/page0zip.c revid:kevin.lewis@stripped
@@ -1516,7 +1516,7 @@ page_zip_fields_decode(
}
table = dict_mem_table_create("ZIP_DUMMY", DICT_HDR_SPACE, n,
- DICT_TF_COMPACT);
+ DICT_TF_COMPACT, 0);
index = dict_mem_index_create("ZIP_DUMMY", "ZIP_DUMMY",
DICT_HDR_SPACE, 0, n);
index->table = table;
=== modified file 'storage/innobase/pars/pars0pars.c'
--- a/storage/innobase/pars/pars0pars.c revid:vasil.dimov@stripped
+++ b/storage/innobase/pars/pars0pars.c revid:kevin.lewis@stripped
@@ -1,6 +1,6 @@
/*****************************************************************************
-Copyright (c) 1996, 2010, Innobase Oy. All Rights Reserved.
+Copyright (c) 1996, 2011, Oracle and/or its affiliates. All Rights Reserved.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
@@ -1629,7 +1629,7 @@ pars_create_table(
/* As the InnoDB SQL parser is for internal use only,
for creating some system tables, this function will only
create tables in the old (not compact) record format. */
- table = dict_mem_table_create(table_sym->name, 0, n_cols, 0);
+ table = dict_mem_table_create(table_sym->name, 0, n_cols, 0, 0);
#ifdef UNIV_DEBUG
if (not_fit_in_memory != NULL) {
=== modified file 'storage/innobase/row/row0merge.c'
--- a/storage/innobase/row/row0merge.c revid:vasil.dimov@stripped
+++ b/storage/innobase/row/row0merge.c revid:kevin.lewis@stripped
@@ -2295,7 +2295,8 @@ row_merge_create_temporary_table(
ut_ad(table);
ut_ad(mutex_own(&dict_sys->mutex));
- new_table = dict_mem_table_create(table_name, 0, n_cols, table->flags);
+ new_table = dict_mem_table_create(
+ table_name, 0, n_cols, table->flags, table->flags2);
for (i = 0; i < n_cols; i++) {
const dict_col_t* col;
=== modified file 'storage/innobase/row/row0mysql.c'
--- a/storage/innobase/row/row0mysql.c revid:vasil.dimov@stripped
+++ b/storage/innobase/row/row0mysql.c revid:kevin.lewis@stripped
@@ -3416,8 +3416,7 @@ check_next_foreign:
is_temp = TRUE;
} else {
name_or_path = name;
- is_temp = (table->flags >> DICT_TF2_SHIFT)
- & DICT_TF2_TEMPORARY;
+ is_temp = table->flags2 & DICT_TF2_TEMPORARY;
}
dict_table_remove_from_cache(table);
@@ -3552,15 +3551,19 @@ row_mysql_drop_temp_tables(void)
break;
}
+ /* The high order bit of N_COLS is set unless
+ ROW_FORMAT=REDUNDANT. */
rec = btr_pcur_get_rec(&pcur);
field = rec_get_nth_field_old(rec, 4/*N_COLS*/, &len);
- if (len != 4 || !(mach_read_from_4(field) & 0x80000000UL)) {
+ if (len != 4
+ || !(mach_read_from_4(field) & DICT_N_COLS_COMPACT)) {
continue;
}
- /* Because this is not a ROW_FORMAT=REDUNDANT table,
- the is_temp flag is valid. Examine it. */
-
+ /* Older versions of InnoDB, which only supported tables
+ in ROW_FORMAT=REDUNDANT could write garbage to
+ SYS_TABLES.MIX_LEN, where we now store the is_temp flag.
+ Above, we assumed is_temp=0 if ROW_FORMAT=REDUNDANT. */
field = rec_get_nth_field_old(rec, 7/*MIX_LEN*/, &len);
if (len != 4
|| !(mach_read_from_4(field) & DICT_TF2_TEMPORARY)) {
Attachment: [text/bzr-bundle] bzr/kevin.lewis@oracle.com-20110318154814-kjxi0lkisssxm2mw.bundle
| Thread |
|---|
| • bzr commit into mysql-trunk-innodb branch (kevin.lewis:3548) WL#5744 | kevin.lewis | 18 Mar |