Commit 1c1026ec authored by marko's avatar marko

Reduce the size of the data dictionary cache. (Bug #20877)

dtype_t: Remove unused field "prec", which was supposed to be used for
the precision of decimal columns in stand-alone InnoDB.

dtype_get_prec(): Remove.

dtype_set(), dict_mem_table_add_col(): Remove parameter "prec".

dtype_t: Turn all fields (mtype, prtype, len, mbminlen, mbmaxlen, len)
into bit-fields.

dict_table_t, dict_index_t, dict_tree_t: Omit magic_n from non-debug builds.

dict_col_t: Turn ind, clust_pos, and ord_part into bit-fields.

Replace the default clust_pos value ULINT_UNDEFINED with
REC_MAX_N_FIELDS and replace all references to clust_pos with calls to
the accessor function dict_col_get_clust_pos().

dict_field_t: Turn prefix_len and fixed_len into bit-fields.

dict_tree_t: Remove pad[64].

dict_table_t: Turn the fields ibd_file_missing, tablespace_discarded,
cached, flags, stat_initialized, and autoinc_inited into bit-fields.
Remove does_not_fit_in_memory from non-debug builds.

dict_index_t: Turn the fields trx_id_offset, n_user_defined_cols,
n_uniq, n_def, n_fields, n_nullable, and cached into bit-fields.

dict_foreign_struct: Turn n_fields and type into bit-fields.

rw_lock_t: Turn cline, last_s_line, and last_x_line into bit-fields.
Omit level unless #defined UNIV_SYNC_DEBUG.

Move REC_MAX_N_FIELDS (and REC_MAX_HEAP_NO and REC_MAX_N_OWNED)
from rem0rec.c to rem0types.h, as they are needed in dict0dict.ic.
dict_col_get_clust_pos(): Map REC_MAX_N_FIELDS to ULINT_UNDEFINED.
parent 85f5b73e
...@@ -322,7 +322,8 @@ btr_search_update_block_hash_info( ...@@ -322,7 +322,8 @@ btr_search_update_block_hash_info(
the block is recommended */ the block is recommended */
btr_search_t* info, /* in: search info */ btr_search_t* info, /* in: search info */
buf_block_t* block, /* in: buffer block */ buf_block_t* block, /* in: buffer block */
btr_cur_t* cursor) /* in: cursor */ btr_cur_t* cursor __attribute__((unused)))
/* in: cursor */
{ {
#ifdef UNIV_SYNC_DEBUG #ifdef UNIV_SYNC_DEBUG
ut_ad(!rw_lock_own(&btr_search_latch, RW_LOCK_SHARED)); ut_ad(!rw_lock_own(&btr_search_latch, RW_LOCK_SHARED));
...@@ -362,9 +363,11 @@ btr_search_update_block_hash_info( ...@@ -362,9 +363,11 @@ btr_search_update_block_hash_info(
block->side = info->side; block->side = info->side;
} }
#ifdef UNIV_DEBUG
if (cursor->index->table->does_not_fit_in_memory) { if (cursor->index->table->does_not_fit_in_memory) {
block->n_hash_helps = 0; block->n_hash_helps = 0;
} }
#endif /* UNIV_DEBUG */
if ((block->n_hash_helps > page_get_n_recs(block->frame) if ((block->n_hash_helps > page_get_n_recs(block->frame)
/ BTR_SEARCH_PAGE_BUILD_LIMIT) / BTR_SEARCH_PAGE_BUILD_LIMIT)
......
...@@ -40,7 +40,7 @@ charset-collation code for them. */ ...@@ -40,7 +40,7 @@ charset-collation code for them. */
ulint data_mysql_default_charset_coll = 99999999; ulint data_mysql_default_charset_coll = 99999999;
dtype_t dtype_binary_val = {DATA_BINARY, 0, 0, 0, 0, 0}; dtype_t dtype_binary_val = {DATA_BINARY, 0, 0, 0, 0};
dtype_t* dtype_binary = &dtype_binary_val; dtype_t* dtype_binary = &dtype_binary_val;
/************************************************************************* /*************************************************************************
...@@ -291,7 +291,7 @@ dtype_print( ...@@ -291,7 +291,7 @@ dtype_print(
} }
} }
fprintf(stderr, " len %lu prec %lu", (ulong) len, (ulong) type->prec); fprintf(stderr, " len %lu", (ulong) len);
} }
/*************************************************************************** /***************************************************************************
......
...@@ -247,14 +247,14 @@ dict_boot(void) ...@@ -247,14 +247,14 @@ dict_boot(void)
/*-------------------------*/ /*-------------------------*/
table = dict_mem_table_create("SYS_TABLES", DICT_HDR_SPACE, 8, 0); table = dict_mem_table_create("SYS_TABLES", DICT_HDR_SPACE, 8, 0);
dict_mem_table_add_col(table, "NAME", DATA_BINARY, 0, 0, 0); dict_mem_table_add_col(table, "NAME", DATA_BINARY, 0, 0);
dict_mem_table_add_col(table, "ID", DATA_BINARY, 0, 0, 0); dict_mem_table_add_col(table, "ID", DATA_BINARY, 0, 0);
dict_mem_table_add_col(table, "N_COLS", DATA_INT, 0, 4, 0); dict_mem_table_add_col(table, "N_COLS", DATA_INT, 0, 4);
dict_mem_table_add_col(table, "TYPE", DATA_INT, 0, 4, 0); dict_mem_table_add_col(table, "TYPE", DATA_INT, 0, 4);
dict_mem_table_add_col(table, "MIX_ID", DATA_BINARY, 0, 0, 0); dict_mem_table_add_col(table, "MIX_ID", DATA_BINARY, 0, 0);
dict_mem_table_add_col(table, "MIX_LEN", DATA_INT, 0, 4, 0); dict_mem_table_add_col(table, "MIX_LEN", DATA_INT, 0, 4);
dict_mem_table_add_col(table, "CLUSTER_NAME", DATA_BINARY, 0, 0, 0); dict_mem_table_add_col(table, "CLUSTER_NAME", DATA_BINARY, 0, 0);
dict_mem_table_add_col(table, "SPACE", DATA_INT, 0, 4, 0); dict_mem_table_add_col(table, "SPACE", DATA_INT, 0, 4);
table->id = DICT_TABLES_ID; table->id = DICT_TABLES_ID;
...@@ -287,13 +287,13 @@ dict_boot(void) ...@@ -287,13 +287,13 @@ dict_boot(void)
/*-------------------------*/ /*-------------------------*/
table = dict_mem_table_create("SYS_COLUMNS", DICT_HDR_SPACE, 7, 0); table = dict_mem_table_create("SYS_COLUMNS", DICT_HDR_SPACE, 7, 0);
dict_mem_table_add_col(table, "TABLE_ID", DATA_BINARY,0,0,0); dict_mem_table_add_col(table, "TABLE_ID", DATA_BINARY, 0, 0);
dict_mem_table_add_col(table, "POS", DATA_INT, 0, 4, 0); dict_mem_table_add_col(table, "POS", DATA_INT, 0, 4);
dict_mem_table_add_col(table, "NAME", DATA_BINARY, 0, 0, 0); dict_mem_table_add_col(table, "NAME", DATA_BINARY, 0, 0);
dict_mem_table_add_col(table, "MTYPE", DATA_INT, 0, 4, 0); dict_mem_table_add_col(table, "MTYPE", DATA_INT, 0, 4);
dict_mem_table_add_col(table, "PRTYPE", DATA_INT, 0, 4, 0); dict_mem_table_add_col(table, "PRTYPE", DATA_INT, 0, 4);
dict_mem_table_add_col(table, "LEN", DATA_INT, 0, 4, 0); dict_mem_table_add_col(table, "LEN", DATA_INT, 0, 4);
dict_mem_table_add_col(table, "PREC", DATA_INT, 0, 4, 0); dict_mem_table_add_col(table, "PREC", DATA_INT, 0, 4);
table->id = DICT_COLUMNS_ID; table->id = DICT_COLUMNS_ID;
...@@ -315,13 +315,13 @@ dict_boot(void) ...@@ -315,13 +315,13 @@ dict_boot(void)
/*-------------------------*/ /*-------------------------*/
table = dict_mem_table_create("SYS_INDEXES", DICT_HDR_SPACE, 7, 0); table = dict_mem_table_create("SYS_INDEXES", DICT_HDR_SPACE, 7, 0);
dict_mem_table_add_col(table, "TABLE_ID", DATA_BINARY, 0,0,0); dict_mem_table_add_col(table, "TABLE_ID", DATA_BINARY, 0, 0);
dict_mem_table_add_col(table, "ID", DATA_BINARY, 0, 0, 0); dict_mem_table_add_col(table, "ID", DATA_BINARY, 0, 0);
dict_mem_table_add_col(table, "NAME", DATA_BINARY, 0, 0, 0); dict_mem_table_add_col(table, "NAME", DATA_BINARY, 0, 0);
dict_mem_table_add_col(table, "N_FIELDS", DATA_INT, 0, 4, 0); dict_mem_table_add_col(table, "N_FIELDS", DATA_INT, 0, 4);
dict_mem_table_add_col(table, "TYPE", DATA_INT, 0, 4, 0); dict_mem_table_add_col(table, "TYPE", DATA_INT, 0, 4);
dict_mem_table_add_col(table, "SPACE", DATA_INT, 0, 4, 0); dict_mem_table_add_col(table, "SPACE", DATA_INT, 0, 4);
dict_mem_table_add_col(table, "PAGE_NO", DATA_INT, 0, 4, 0); dict_mem_table_add_col(table, "PAGE_NO", DATA_INT, 0, 4);
/* The '+ 2' below comes from the 2 system fields */ /* The '+ 2' below comes from the 2 system fields */
#if DICT_SYS_INDEXES_PAGE_NO_FIELD != 6 + 2 #if DICT_SYS_INDEXES_PAGE_NO_FIELD != 6 + 2
...@@ -353,9 +353,9 @@ dict_boot(void) ...@@ -353,9 +353,9 @@ dict_boot(void)
/*-------------------------*/ /*-------------------------*/
table = dict_mem_table_create("SYS_FIELDS", DICT_HDR_SPACE, 3, 0); table = dict_mem_table_create("SYS_FIELDS", DICT_HDR_SPACE, 3, 0);
dict_mem_table_add_col(table, "INDEX_ID", DATA_BINARY, 0,0,0); dict_mem_table_add_col(table, "INDEX_ID", DATA_BINARY, 0, 0);
dict_mem_table_add_col(table, "POS", DATA_INT, 0, 4, 0); dict_mem_table_add_col(table, "POS", DATA_INT, 0, 4);
dict_mem_table_add_col(table, "COL_NAME", DATA_BINARY, 0,0,0); dict_mem_table_add_col(table, "COL_NAME", DATA_BINARY, 0, 0);
table->id = DICT_FIELDS_ID; table->id = DICT_FIELDS_ID;
dict_table_add_to_cache(table); dict_table_add_to_cache(table);
......
...@@ -181,7 +181,7 @@ dict_create_sys_columns_tuple( ...@@ -181,7 +181,7 @@ dict_create_sys_columns_tuple(
dfield = dtuple_get_nth_field(entry, 6); dfield = dtuple_get_nth_field(entry, 6);
ptr = mem_heap_alloc(heap, 4); ptr = mem_heap_alloc(heap, 4);
mach_write_to_4(ptr, (column->type).prec); mach_write_to_4(ptr, 0/* unused */);
dfield_set_data(dfield, ptr, 4); dfield_set_data(dfield, ptr, 4);
/*---------------------------------*/ /*---------------------------------*/
......
...@@ -556,7 +556,7 @@ dict_index_get_nth_col_pos( ...@@ -556,7 +556,7 @@ dict_index_get_nth_col_pos(
if (index->type & DICT_CLUSTERED) { if (index->type & DICT_CLUSTERED) {
return(col->clust_pos); return(dict_col_get_clust_pos(col));
} }
n_fields = dict_index_get_n_fields(index); n_fields = dict_index_get_n_fields(index);
...@@ -884,25 +884,25 @@ dict_table_add_to_cache( ...@@ -884,25 +884,25 @@ dict_table_add_to_cache(
dict_mem_table_add_col(table, "DB_ROW_ID", DATA_SYS, dict_mem_table_add_col(table, "DB_ROW_ID", DATA_SYS,
DATA_ROW_ID | DATA_NOT_NULL, DATA_ROW_ID | DATA_NOT_NULL,
DATA_ROW_ID_LEN, 0); DATA_ROW_ID_LEN);
#if DATA_ROW_ID != 0 #if DATA_ROW_ID != 0
#error "DATA_ROW_ID != 0" #error "DATA_ROW_ID != 0"
#endif #endif
dict_mem_table_add_col(table, "DB_TRX_ID", DATA_SYS, dict_mem_table_add_col(table, "DB_TRX_ID", DATA_SYS,
DATA_TRX_ID | DATA_NOT_NULL, DATA_TRX_ID | DATA_NOT_NULL,
DATA_TRX_ID_LEN, 0); DATA_TRX_ID_LEN);
#if DATA_TRX_ID != 1 #if DATA_TRX_ID != 1
#error "DATA_TRX_ID != 1" #error "DATA_TRX_ID != 1"
#endif #endif
dict_mem_table_add_col(table, "DB_ROLL_PTR", DATA_SYS, dict_mem_table_add_col(table, "DB_ROLL_PTR", DATA_SYS,
DATA_ROLL_PTR | DATA_NOT_NULL, DATA_ROLL_PTR | DATA_NOT_NULL,
DATA_ROLL_PTR_LEN, 0); DATA_ROLL_PTR_LEN);
#if DATA_ROLL_PTR != 2 #if DATA_ROLL_PTR != 2
#error "DATA_ROLL_PTR != 2" #error "DATA_ROLL_PTR != 2"
#endif #endif
dict_mem_table_add_col(table, "DB_MIX_ID", DATA_SYS, dict_mem_table_add_col(table, "DB_MIX_ID", DATA_SYS,
DATA_MIX_ID | DATA_NOT_NULL, DATA_MIX_ID | DATA_NOT_NULL,
DATA_MIX_ID_LEN, 0); DATA_MIX_ID_LEN);
#if DATA_MIX_ID != 3 #if DATA_MIX_ID != 3
#error "DATA_MIX_ID != 3" #error "DATA_MIX_ID != 3"
#endif #endif
...@@ -1815,7 +1815,7 @@ dict_index_build_internal_clust( ...@@ -1815,7 +1815,7 @@ dict_index_build_internal_clust(
if (UNIV_UNLIKELY(index->type & DICT_UNIVERSAL)) { if (UNIV_UNLIKELY(index->type & DICT_UNIVERSAL)) {
/* No fixed number of fields determines an entry uniquely */ /* No fixed number of fields determines an entry uniquely */
new_index->n_uniq = ULINT_MAX; new_index->n_uniq = REC_MAX_N_FIELDS;
} else if (index->type & DICT_UNIQUE) { } else if (index->type & DICT_UNIQUE) {
/* Only the fields defined so far are needed to identify /* Only the fields defined so far are needed to identify
...@@ -1902,7 +1902,7 @@ dict_index_build_internal_clust( ...@@ -1902,7 +1902,7 @@ dict_index_build_internal_clust(
/* Add to new_index non-system columns of table not yet included /* Add to new_index non-system columns of table not yet included
there */ there */
for (i = 0; i < table->n_cols - DATA_N_SYS_COLS; i++) { for (i = 0; i + DATA_N_SYS_COLS < (ulint) table->n_cols; i++) {
col = dict_table_get_nth_col(table, i); col = dict_table_get_nth_col(table, i);
ut_ad(col->type.mtype != DATA_SYS); ut_ad(col->type.mtype != DATA_SYS);
...@@ -3741,7 +3741,9 @@ dict_tree_create( ...@@ -3741,7 +3741,9 @@ dict_tree_create(
tree->tree_index = NULL; tree->tree_index = NULL;
#ifdef UNIV_DEBUG
tree->magic_n = DICT_TREE_MAGIC_N; tree->magic_n = DICT_TREE_MAGIC_N;
#endif /* UNIV_DEBUG */
rw_lock_create(&tree->lock, SYNC_INDEX_TREE); rw_lock_create(&tree->lock, SYNC_INDEX_TREE);
...@@ -3843,7 +3845,7 @@ dict_tree_build_node_ptr( ...@@ -3843,7 +3845,7 @@ dict_tree_build_node_ptr(
field = dtuple_get_nth_field(tuple, n_unique); field = dtuple_get_nth_field(tuple, n_unique);
dfield_set_data(field, buf, 4); dfield_set_data(field, buf, 4);
dtype_set(dfield_get_type(field), DATA_SYS_CHILD, DATA_NOT_NULL, 4, 0); dtype_set(dfield_get_type(field), DATA_SYS_CHILD, DATA_NOT_NULL, 4);
rec_copy_prefix_to_dtuple(tuple, rec, ind, n_unique, heap); rec_copy_prefix_to_dtuple(tuple, rec, ind, n_unique, heap);
dtuple_set_info_bits(tuple, dtuple_get_info_bits(tuple) dtuple_set_info_bits(tuple, dtuple_get_info_bits(tuple)
...@@ -4167,7 +4169,7 @@ dict_table_print_low( ...@@ -4167,7 +4169,7 @@ dict_table_print_low(
(ulong) UT_LIST_GET_LEN(table->indexes), (ulong) UT_LIST_GET_LEN(table->indexes),
(ulong) table->stat_n_rows); (ulong) table->stat_n_rows);
for (i = 0; i < table->n_cols - 1; i++) { for (i = 0; i + 1 < (ulint) table->n_cols; i++) {
dict_col_print_low(dict_table_get_nth_col(table, i)); dict_col_print_low(dict_table_get_nth_col(table, i));
fputs("; ", stderr); fputs("; ", stderr);
} }
......
...@@ -331,7 +331,6 @@ dict_load_columns( ...@@ -331,7 +331,6 @@ dict_load_columns(
ulint mtype; ulint mtype;
ulint prtype; ulint prtype;
ulint col_len; ulint col_len;
ulint prec;
ulint i; ulint i;
mtr_t mtr; mtr_t mtr;
...@@ -356,7 +355,7 @@ dict_load_columns( ...@@ -356,7 +355,7 @@ dict_load_columns(
btr_pcur_open_on_user_rec(sys_index, tuple, PAGE_CUR_GE, btr_pcur_open_on_user_rec(sys_index, tuple, PAGE_CUR_GE,
BTR_SEARCH_LEAF, &pcur, &mtr); BTR_SEARCH_LEAF, &pcur, &mtr);
for (i = 0; i < table->n_cols - DATA_N_SYS_COLS; i++) { for (i = 0; i + DATA_N_SYS_COLS < (ulint) table->n_cols; i++) {
rec = btr_pcur_get_rec(&pcur); rec = btr_pcur_get_rec(&pcur);
...@@ -411,11 +410,7 @@ dict_load_columns( ...@@ -411,11 +410,7 @@ dict_load_columns(
ut_a(!strcmp("PREC", dict_field_get_col ut_a(!strcmp("PREC", dict_field_get_col
(dict_index_get_nth_field(sys_index, 8))->name)); (dict_index_get_nth_field(sys_index, 8))->name));
field = rec_get_nth_field_old(rec, 8, &len); dict_mem_table_add_col(table, name, mtype, prtype, col_len);
prec = mach_read_from_4(field);
dict_mem_table_add_col(table, name, mtype, prtype, col_len,
prec);
btr_pcur_move_to_next_user_rec(&pcur, &mtr); btr_pcur_move_to_next_user_rec(&pcur, &mtr);
} }
......
...@@ -76,7 +76,9 @@ dict_mem_table_create( ...@@ -76,7 +76,9 @@ dict_mem_table_create(
UT_LIST_INIT(table->foreign_list); UT_LIST_INIT(table->foreign_list);
UT_LIST_INIT(table->referenced_list); UT_LIST_INIT(table->referenced_list);
#ifdef UNIV_DEBUG
table->does_not_fit_in_memory = FALSE; table->does_not_fit_in_memory = FALSE;
#endif /* UNIV_DEBUG */
table->stat_initialized = FALSE; table->stat_initialized = FALSE;
...@@ -87,9 +89,9 @@ dict_mem_table_create( ...@@ -87,9 +89,9 @@ dict_mem_table_create(
mutex_create(&table->autoinc_mutex, SYNC_DICT_AUTOINC_MUTEX); mutex_create(&table->autoinc_mutex, SYNC_DICT_AUTOINC_MUTEX);
table->autoinc_inited = FALSE; table->autoinc_inited = FALSE;
#ifdef UNIV_DEBUG
table->magic_n = DICT_TABLE_MAGIC_N; table->magic_n = DICT_TABLE_MAGIC_N;
#endif /* UNIV_DEBUG */
return(table); return(table);
} }
...@@ -118,8 +120,7 @@ dict_mem_table_add_col( ...@@ -118,8 +120,7 @@ dict_mem_table_add_col(
const char* name, /* in: column name */ const char* name, /* in: column name */
ulint mtype, /* in: main datatype */ ulint mtype, /* in: main datatype */
ulint prtype, /* in: precise type */ ulint prtype, /* in: precise type */
ulint len, /* in: length */ ulint len) /* in: precision */
ulint prec) /* in: precision */
{ {
dict_col_t* col; dict_col_t* col;
dtype_t* type; dtype_t* type;
...@@ -136,11 +137,11 @@ dict_mem_table_add_col( ...@@ -136,11 +137,11 @@ dict_mem_table_add_col(
col->table = table; col->table = table;
col->ord_part = 0; col->ord_part = 0;
col->clust_pos = ULINT_UNDEFINED; col->clust_pos = REC_MAX_N_FIELDS;
type = dict_col_get_type(col); type = dict_col_get_type(col);
dtype_set(type, mtype, prtype, len, prec); dtype_set(type, mtype, prtype, len);
} }
/************************************************************************** /**************************************************************************
...@@ -183,8 +184,9 @@ dict_mem_index_create( ...@@ -183,8 +184,9 @@ dict_mem_index_create(
index->stat_n_diff_key_vals = NULL; index->stat_n_diff_key_vals = NULL;
index->cached = FALSE; index->cached = FALSE;
#ifdef UNIV_DEBUG
index->magic_n = DICT_INDEX_MAGIC_N; index->magic_n = DICT_INDEX_MAGIC_N;
#endif /* UNIV_DEBUG */
return(index); return(index);
} }
......
...@@ -3164,8 +3164,8 @@ include_field: ...@@ -3164,8 +3164,8 @@ include_field:
templ->col_no = i; templ->col_no = i;
if (index == clust_index) { if (index == clust_index) {
templ->rec_field_no = (index->table->cols + i) templ->rec_field_no = dict_col_get_clust_pos
->clust_pos; (&index->table->cols[i]);
} else { } else {
templ->rec_field_no = dict_index_get_nth_col_pos( templ->rec_field_no = dict_index_get_nth_col_pos(
index, i); index, i);
...@@ -3224,8 +3224,8 @@ skip_field: ...@@ -3224,8 +3224,8 @@ skip_field:
for (i = 0; i < n_requested_fields; i++) { for (i = 0; i < n_requested_fields; i++) {
templ = prebuilt->mysql_template + i; templ = prebuilt->mysql_template + i;
templ->rec_field_no = templ->rec_field_no = dict_col_get_clust_pos
(index->table->cols + templ->col_no)->clust_pos; (&index->table->cols[templ->col_no]);
} }
} }
} }
...@@ -3598,7 +3598,8 @@ calc_row_difference( ...@@ -3598,7 +3598,8 @@ calc_row_difference(
} }
ufield->exp = NULL; ufield->exp = NULL;
ufield->field_no = prebuilt->table->cols[i].clust_pos; ufield->field_no = dict_col_get_clust_pos
(&prebuilt->table->cols[i]);
n_changed++; n_changed++;
} }
} }
...@@ -4578,8 +4579,7 @@ create_table_def( ...@@ -4578,8 +4579,7 @@ create_table_def(
| nulls_allowed | unsigned_type | nulls_allowed | unsigned_type
| binary_type | long_true_varchar, | binary_type | long_true_varchar,
charset_no), charset_no),
col_len, col_len);
0);
} }
error = row_create_table_for_mysql(table, trx); error = row_create_table_for_mysql(table, trx);
......
...@@ -524,8 +524,8 @@ ibuf_data_init_for_space( ...@@ -524,8 +524,8 @@ ibuf_data_init_for_space(
/* use old-style record format for the insert buffer */ /* use old-style record format for the insert buffer */
table = dict_mem_table_create(buf, space, 2, 0); table = dict_mem_table_create(buf, space, 2, 0);
dict_mem_table_add_col(table, "PAGE_NO", DATA_BINARY, 0, 0, 0); dict_mem_table_add_col(table, "PAGE_NO", DATA_BINARY, 0, 0);
dict_mem_table_add_col(table, "TYPES", DATA_BINARY, 0, 0, 0); dict_mem_table_add_col(table, "TYPES", DATA_BINARY, 0, 0);
table->id = ut_dulint_add(DICT_IBUF_ID_MIN, space); table->id = ut_dulint_add(DICT_IBUF_ID_MIN, space);
...@@ -1145,8 +1145,7 @@ ibuf_dummy_index_add_col( ...@@ -1145,8 +1145,7 @@ ibuf_dummy_index_add_col(
dict_mem_table_add_col(index->table, "DUMMY", dict_mem_table_add_col(index->table, "DUMMY",
dtype_get_mtype(type), dtype_get_mtype(type),
dtype_get_prtype(type), dtype_get_prtype(type),
dtype_get_len(type), dtype_get_len(type));
dtype_get_prec(type));
dict_index_add_col(index, dict_index_add_col(index,
dict_table_get_nth_col(index->table, i), len); dict_table_get_nth_col(index->table, i), len);
} }
......
...@@ -334,7 +334,7 @@ dtuple_set_types_binary( ...@@ -334,7 +334,7 @@ dtuple_set_types_binary(
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
dfield_type = dfield_get_type(dtuple_get_nth_field(tuple, i)); dfield_type = dfield_get_type(dtuple_get_nth_field(tuple, i));
dtype_set(dfield_type, DATA_BINARY, 0, 0, 0); dtype_set(dfield_type, DATA_BINARY, 0, 0);
} }
} }
......
...@@ -224,8 +224,7 @@ dtype_set( ...@@ -224,8 +224,7 @@ dtype_set(
dtype_t* type, /* in: type struct to init */ dtype_t* type, /* in: type struct to init */
ulint mtype, /* in: main data type */ ulint mtype, /* in: main data type */
ulint prtype, /* in: precise type */ ulint prtype, /* in: precise type */
ulint len, /* in: length of type */ ulint len); /* in: precision of type */
ulint prec); /* in: precision of type */
/************************************************************************* /*************************************************************************
Copies a data type structure. */ Copies a data type structure. */
UNIV_INLINE UNIV_INLINE
...@@ -280,13 +279,6 @@ dtype_get_len( ...@@ -280,13 +279,6 @@ dtype_get_len(
/*==========*/ /*==========*/
dtype_t* type); dtype_t* type);
/************************************************************************* /*************************************************************************
Gets the type precision. */
UNIV_INLINE
ulint
dtype_get_prec(
/*===========*/
dtype_t* type);
/*************************************************************************
Gets the minimum length of a character, in bytes. */ Gets the minimum length of a character, in bytes. */
UNIV_INLINE UNIV_INLINE
ulint ulint
...@@ -415,8 +407,8 @@ dtype_new_read_for_order_and_null_size() ...@@ -415,8 +407,8 @@ dtype_new_read_for_order_and_null_size()
sym_tab_add_null_lit() */ sym_tab_add_null_lit() */
struct dtype_struct{ struct dtype_struct{
ulint mtype; /* main data type */ ulint mtype:8; /* main data type */
ulint prtype; /* precise type; MySQL data type, charset code, ulint prtype:24; /* precise type; MySQL data type, charset code,
flags to indicate nullability, signedness, flags to indicate nullability, signedness,
whether this is a binary string, whether this whether this is a binary string, whether this
is a true VARCHAR where MySQL uses 2 bytes to is a true VARCHAR where MySQL uses 2 bytes to
...@@ -424,16 +416,15 @@ struct dtype_struct{ ...@@ -424,16 +416,15 @@ struct dtype_struct{
/* the remaining fields do not affect alphabetical ordering: */ /* the remaining fields do not affect alphabetical ordering: */
ulint len; /* length; for MySQL data this is ulint mbminlen:3; /* minimum length of a character, in bytes */
ulint mbmaxlen:3; /* maximum length of a character, in bytes */
ulint len:16; /* length; for MySQL data this is
field->pack_length(), except that for a field->pack_length(), except that for a
>= 5.0.3 type true VARCHAR this is the >= 5.0.3 type true VARCHAR this is the
maximum byte length of the string data maximum byte length of the string data
(in addition to the string, MySQL uses 1 or (in addition to the string, MySQL uses 1 or
2 bytes to store the string length) */ 2 bytes to store the string length) */
ulint prec; /* precision */
ulint mbminlen; /* minimum length of a character, in bytes */
ulint mbmaxlen; /* maximum length of a character, in bytes */
}; };
#ifndef UNIV_NONINL #ifndef UNIV_NONINL
......
...@@ -58,9 +58,13 @@ dtype_set_mblen( ...@@ -58,9 +58,13 @@ dtype_set_mblen(
ut_ad(type); ut_ad(type);
if (dtype_is_string_type(type->mtype)) { if (dtype_is_string_type(type->mtype)) {
#ifndef UNIV_HOTBACKUP #ifndef UNIV_HOTBACKUP
ulint mbminlen, mbmaxlen;
innobase_get_cset_width(dtype_get_charset_coll(type->prtype), innobase_get_cset_width(dtype_get_charset_coll(type->prtype),
&type->mbminlen, &type->mbmaxlen); &mbminlen, &mbmaxlen);
ut_ad(type->mbminlen <= type->mbmaxlen); ut_ad(mbminlen <= mbmaxlen);
type->mbminlen = mbminlen;
type->mbmaxlen = mbmaxlen;
#else /* !UNIV_HOTBACKUP */ #else /* !UNIV_HOTBACKUP */
#ifdef notdefined #ifdef notdefined
printf("ibbackup: DEBUG: type->mtype=%lu, type->prtype=%lu\n", printf("ibbackup: DEBUG: type->mtype=%lu, type->prtype=%lu\n",
...@@ -86,8 +90,7 @@ dtype_set( ...@@ -86,8 +90,7 @@ dtype_set(
dtype_t* type, /* in: type struct to init */ dtype_t* type, /* in: type struct to init */
ulint mtype, /* in: main data type */ ulint mtype, /* in: main data type */
ulint prtype, /* in: precise type */ ulint prtype, /* in: precise type */
ulint len, /* in: length of type */ ulint len) /* in: precision of type */
ulint prec) /* in: precision of type */
{ {
ut_ad(type); ut_ad(type);
ut_ad(mtype <= DATA_MTYPE_MAX); ut_ad(mtype <= DATA_MTYPE_MAX);
...@@ -95,7 +98,6 @@ dtype_set( ...@@ -95,7 +98,6 @@ dtype_set(
type->mtype = mtype; type->mtype = mtype;
type->prtype = prtype; type->prtype = prtype;
type->len = len; type->len = len;
type->prec = prec;
dtype_set_mblen(type); dtype_set_mblen(type);
ut_ad(dtype_validate(type)); ut_ad(dtype_validate(type));
...@@ -154,19 +156,6 @@ dtype_get_len( ...@@ -154,19 +156,6 @@ dtype_get_len(
return(type->len); return(type->len);
} }
/*************************************************************************
Gets the type precision. */
UNIV_INLINE
ulint
dtype_get_prec(
/*===========*/
dtype_t* type)
{
ut_ad(type);
return(type->prec);
}
/************************************************************************* /*************************************************************************
Gets the minimum length of a character, in bytes. */ Gets the minimum length of a character, in bytes. */
UNIV_INLINE UNIV_INLINE
......
...@@ -9,6 +9,7 @@ Created 1/8/1996 Heikki Tuuri ...@@ -9,6 +9,7 @@ Created 1/8/1996 Heikki Tuuri
#include "dict0load.h" #include "dict0load.h"
#include "trx0undo.h" #include "trx0undo.h"
#include "trx0sys.h" #include "trx0sys.h"
#include "rem0types.h"
/************************************************************************* /*************************************************************************
Gets the column data type. */ Gets the column data type. */
...@@ -46,7 +47,9 @@ dict_col_get_clust_pos( ...@@ -46,7 +47,9 @@ dict_col_get_clust_pos(
{ {
ut_ad(col); ut_ad(col);
return(col->clust_pos); return(col->clust_pos == REC_MAX_N_FIELDS
? ULINT_UNDEFINED
: col->clust_pos);
} }
/************************************************************************ /************************************************************************
...@@ -321,7 +324,7 @@ dict_index_get_sys_col_pos( ...@@ -321,7 +324,7 @@ dict_index_get_sys_col_pos(
if (index->type & DICT_CLUSTERED) { if (index->type & DICT_CLUSTERED) {
return(col->clust_pos); return(dict_col_get_clust_pos(col));
} }
return(dict_index_get_nth_col_pos return(dict_index_get_nth_col_pos
......
...@@ -75,8 +75,7 @@ dict_mem_table_add_col( ...@@ -75,8 +75,7 @@ dict_mem_table_add_col(
const char* name, /* in: column name */ const char* name, /* in: column name */
ulint mtype, /* in: main datatype */ ulint mtype, /* in: main datatype */
ulint prtype, /* in: precise type */ ulint prtype, /* in: precise type */
ulint len, /* in: length */ ulint len); /* in: precision */
ulint prec); /* in: precision */
/************************************************************************** /**************************************************************************
Creates an index memory object. */ Creates an index memory object. */
...@@ -123,11 +122,11 @@ dict_mem_foreign_create(void); ...@@ -123,11 +122,11 @@ dict_mem_foreign_create(void);
/* Data structure for a column in a table */ /* Data structure for a column in a table */
struct dict_col_struct{ struct dict_col_struct{
hash_node_t hash; /* hash chain node */ hash_node_t hash; /* hash chain node */
ulint ind; /* table column position (they are numbered ulint ind:10; /* table column position (they are numbered
starting from 0) */ starting from 0) */
ulint clust_pos;/* position of the column in the ulint clust_pos:10;/* position of the column in the
clustered index */ clustered index */
ulint ord_part;/* count of how many times this column ulint ord_part:12;/* count of how many times this column
appears in ordering fields of an index */ appears in ordering fields of an index */
const char* name; /* name */ const char* name; /* name */
dtype_t type; /* data type */ dtype_t type; /* data type */
...@@ -145,14 +144,14 @@ UTF-8 charset. In that charset, a character may take at most 3 bytes. */ ...@@ -145,14 +144,14 @@ UTF-8 charset. In that charset, a character may take at most 3 bytes. */
struct dict_field_struct{ struct dict_field_struct{
dict_col_t* col; /* pointer to the table column */ dict_col_t* col; /* pointer to the table column */
const char* name; /* name of the column */ const char* name; /* name of the column */
ulint prefix_len; /* 0 or the length of the column ulint prefix_len:10; /* 0 or the length of the column
prefix in bytes in a MySQL index of prefix in bytes in a MySQL index of
type, e.g., INDEX (textcol(25)); type, e.g., INDEX (textcol(25));
must be smaller than must be smaller than
DICT_MAX_INDEX_COL_LEN; NOTE that DICT_MAX_INDEX_COL_LEN; NOTE that
in the UTF-8 charset, MySQL sets this in the UTF-8 charset, MySQL sets this
to 3 * the prefix len in UTF-8 chars */ to 3 * the prefix len in UTF-8 chars */
ulint fixed_len; /* 0 or the fixed length of the ulint fixed_len:10; /* 0 or the fixed length of the
column if smaller than column if smaller than
DICT_MAX_INDEX_COL_LEN */ DICT_MAX_INDEX_COL_LEN */
}; };
...@@ -163,17 +162,16 @@ struct dict_tree_struct{ ...@@ -163,17 +162,16 @@ struct dict_tree_struct{
dulint id; /* id of the index stored in the tree */ dulint id; /* id of the index stored in the tree */
ulint space; /* space of index tree */ ulint space; /* space of index tree */
ulint page; /* index tree root page number */ ulint page; /* index tree root page number */
byte pad[64];/* Padding to prevent other memory hotspots on
the same memory cache line */
rw_lock_t lock; /* read-write lock protecting the upper levels rw_lock_t lock; /* read-write lock protecting the upper levels
of the index tree */ of the index tree */
dict_index_t* tree_index; /* the index stored in the dict_index_t* tree_index; /* the index stored in the
index tree */ index tree */
#ifdef UNIV_DEBUG
ulint magic_n;/* magic number */ ulint magic_n;/* magic number */
# define DICT_TREE_MAGIC_N 7545676
#endif /* UNIV_DEBUG */
}; };
#define DICT_TREE_MAGIC_N 7545676
/* Data structure for an index */ /* Data structure for an index */
struct dict_index_struct{ struct dict_index_struct{
dulint id; /* id of the index */ dulint id; /* id of the index */
...@@ -183,29 +181,29 @@ struct dict_index_struct{ ...@@ -183,29 +181,29 @@ struct dict_index_struct{
const char* table_name; /* table name */ const char* table_name; /* table name */
dict_table_t* table; /* back pointer to table */ dict_table_t* table; /* back pointer to table */
ulint space; /* space where the index tree is placed */ ulint space; /* space where the index tree is placed */
ulint trx_id_offset;/* position of the the trx id column ulint trx_id_offset:10;/* position of the the trx id column
in a clustered index record, if the fields in a clustered index record, if the fields
before it are known to be of a fixed size, before it are known to be of a fixed size,
0 otherwise */ 0 otherwise */
ulint n_user_defined_cols; ulint n_user_defined_cols:10;
/* number of columns the user defined to /* number of columns the user defined to
be in the index: in the internal be in the index: in the internal
representation we add more columns */ representation we add more columns */
ulint n_uniq; /* number of fields from the beginning ulint n_uniq:10;/* number of fields from the beginning
which are enough to determine an index which are enough to determine an index
entry uniquely */ entry uniquely */
ulint n_def; /* number of fields defined so far */ ulint n_def:10;/* number of fields defined so far */
ulint n_fields;/* number of fields in the index */ ulint n_fields:10;/* number of fields in the index */
ulint n_nullable:10;/* number of nullable fields */
ibool cached:1;/* TRUE if the index object is in the
dictionary cache */
dict_field_t* fields; /* array of field descriptions */ dict_field_t* fields; /* array of field descriptions */
ulint n_nullable;/* number of nullable fields */
UT_LIST_NODE_T(dict_index_t) UT_LIST_NODE_T(dict_index_t)
indexes;/* list of indexes of the table */ indexes;/* list of indexes of the table */
dict_tree_t* tree; /* index tree struct */ dict_tree_t* tree; /* index tree struct */
UT_LIST_NODE_T(dict_index_t) UT_LIST_NODE_T(dict_index_t)
tree_indexes; /* list of indexes of the same index tree_indexes; /* list of indexes of the same index
tree */ tree */
ibool cached; /* TRUE if the index object is in the
dictionary cache */
btr_search_t* search_info; /* info used in optimistic searches */ btr_search_t* search_info; /* info used in optimistic searches */
/*----------------------*/ /*----------------------*/
ib_longlong* stat_n_diff_key_vals; ib_longlong* stat_n_diff_key_vals;
...@@ -218,7 +216,10 @@ struct dict_index_struct{ ...@@ -218,7 +216,10 @@ struct dict_index_struct{
ulint stat_n_leaf_pages; ulint stat_n_leaf_pages;
/* approximate number of leaf pages in the /* approximate number of leaf pages in the
index tree */ index tree */
#ifdef UNIV_DEBUG
ulint magic_n;/* magic number */ ulint magic_n;/* magic number */
# define DICT_INDEX_MAGIC_N 76789786
#endif
}; };
/* Data structure for a foreign key constraint; an example: /* Data structure for a foreign key constraint; an example:
...@@ -229,7 +230,13 @@ struct dict_foreign_struct{ ...@@ -229,7 +230,13 @@ struct dict_foreign_struct{
this memory heap */ this memory heap */
char* id; /* id of the constraint as a char* id; /* id of the constraint as a
null-terminated string */ null-terminated string */
ulint type; /* 0 or DICT_FOREIGN_ON_DELETE_CASCADE ulint n_fields:10; /* number of indexes' first fields
for which the the foreign key
constraint is defined: we allow the
indexes to contain more fields than
mentioned in the constraint, as long
as the first fields are as mentioned */
ulint type:6; /* 0 or DICT_FOREIGN_ON_DELETE_CASCADE
or DICT_FOREIGN_ON_DELETE_SET_NULL */ or DICT_FOREIGN_ON_DELETE_SET_NULL */
char* foreign_table_name;/* foreign table name */ char* foreign_table_name;/* foreign table name */
dict_table_t* foreign_table; /* table where the foreign key is */ dict_table_t* foreign_table; /* table where the foreign key is */
...@@ -240,12 +247,6 @@ struct dict_foreign_struct{ ...@@ -240,12 +247,6 @@ struct dict_foreign_struct{
is */ is */
const char** referenced_col_names;/* names of the referenced const char** referenced_col_names;/* names of the referenced
columns in the referenced table */ columns in the referenced table */
ulint n_fields; /* number of indexes' first fields
for which the the foreign key
constraint is defined: we allow the
indexes to contain more fields than
mentioned in the constraint, as long
as the first fields are as mentioned */
dict_index_t* foreign_index; /* foreign index; we require that dict_index_t* foreign_index; /* foreign index; we require that
both tables contain explicitly defined both tables contain explicitly defined
indexes for the constraint: InnoDB indexes for the constraint: InnoDB
...@@ -270,12 +271,9 @@ a foreign key constraint is enforced, therefore RESTRICT just means no flag */ ...@@ -270,12 +271,9 @@ a foreign key constraint is enforced, therefore RESTRICT just means no flag */
#define DICT_FOREIGN_ON_UPDATE_NO_ACTION 32 #define DICT_FOREIGN_ON_UPDATE_NO_ACTION 32
#define DICT_INDEX_MAGIC_N 76789786
/* Data structure for a database table */ /* Data structure for a database table */
struct dict_table_struct{ struct dict_table_struct{
dulint id; /* id of the table */ dulint id; /* id of the table */
ulint flags; /* DICT_TF_COMPACT, ... */
mem_heap_t* heap; /* memory heap */ mem_heap_t* heap; /* memory heap */
const char* name; /* table name */ const char* name; /* table name */
const char* dir_path_of_temp_table;/* NULL or the directory path const char* dir_path_of_temp_table;/* NULL or the directory path
...@@ -286,17 +284,20 @@ struct dict_table_struct{ ...@@ -286,17 +284,20 @@ struct dict_table_struct{
\temp\... */ \temp\... */
ulint space; /* space where the clustered index of the ulint space; /* space where the clustered index of the
table is placed */ table is placed */
ibool ibd_file_missing;/* TRUE if this is in a single-table ibool ibd_file_missing:1;/* TRUE if this is in a single-table
tablespace and the .ibd file is missing; then tablespace and the .ibd file is missing; then
we must return in ha_innodb.cc an error if the we must return in ha_innodb.cc an error if the
user tries to query such an orphaned table */ user tries to query such an orphaned table */
ibool tablespace_discarded;/* this flag is set TRUE when the ibool tablespace_discarded:1;/* this flag is set TRUE when the
user calls DISCARD TABLESPACE on this table, user calls DISCARD TABLESPACE on this table,
and reset to FALSE in IMPORT TABLESPACE */ and reset to FALSE in IMPORT TABLESPACE */
ibool cached:1;/* TRUE if the table object has been added
to the dictionary cache */
ulint flags:8;/* DICT_TF_COMPACT, ... */
hash_node_t name_hash; /* hash chain node */ hash_node_t name_hash; /* hash chain node */
hash_node_t id_hash; /* hash chain node */ hash_node_t id_hash; /* hash chain node */
ulint n_def; /* number of columns defined so far */ ulint n_def:10;/* number of columns defined so far */
ulint n_cols; /* number of columns */ ulint n_cols:10;/* number of columns */
dict_col_t* cols; /* array of column descriptions */ dict_col_t* cols; /* array of column descriptions */
UT_LIST_BASE_NODE_T(dict_index_t) UT_LIST_BASE_NODE_T(dict_index_t)
indexes; /* list of indexes of the table */ indexes; /* list of indexes of the table */
...@@ -321,8 +322,6 @@ struct dict_table_struct{ ...@@ -321,8 +322,6 @@ struct dict_table_struct{
on the table: we cannot drop the table while on the table: we cannot drop the table while
there are foreign key checks running on there are foreign key checks running on
it! */ it! */
ibool cached; /* TRUE if the table object has been added
to the dictionary cache */
lock_t* auto_inc_lock;/* a buffer for an auto-inc lock lock_t* auto_inc_lock;/* a buffer for an auto-inc lock
for this table: we allocate the memory here for this table: we allocate the memory here
so that individual transactions can get it so that individual transactions can get it
...@@ -345,6 +344,7 @@ struct dict_table_struct{ ...@@ -345,6 +344,7 @@ struct dict_table_struct{
accurate. it's ULINT_MAX if there are accurate. it's ULINT_MAX if there are
unbounded variable-width fields. initialized unbounded variable-width fields. initialized
in dict_table_add_to_cache. */ in dict_table_add_to_cache. */
#ifdef UNIV_DEBUG
/*----------------------*/ /*----------------------*/
ibool does_not_fit_in_memory; ibool does_not_fit_in_memory;
/* this field is used to specify in simulations /* this field is used to specify in simulations
...@@ -355,6 +355,7 @@ struct dict_table_struct{ ...@@ -355,6 +355,7 @@ struct dict_table_struct{
dictionary on disk, and the database will dictionary on disk, and the database will
forget about value TRUE if it has to reload forget about value TRUE if it has to reload
the table definition from disk */ the table definition from disk */
#endif /* UNIV_DEBUG */
/*----------------------*/ /*----------------------*/
ib_longlong stat_n_rows; ib_longlong stat_n_rows;
/* approximate number of rows in the table; /* approximate number of rows in the table;
...@@ -364,7 +365,7 @@ struct dict_table_struct{ ...@@ -364,7 +365,7 @@ struct dict_table_struct{
database pages */ database pages */
ulint stat_sum_of_other_index_sizes; ulint stat_sum_of_other_index_sizes;
/* other indexes in database pages */ /* other indexes in database pages */
ibool stat_initialized; /* TRUE if statistics have ibool stat_initialized:1; /* TRUE if statistics have
been calculated the first time been calculated the first time
after database startup or table creation */ after database startup or table creation */
ulint stat_modified_counter; ulint stat_modified_counter;
...@@ -383,15 +384,17 @@ struct dict_table_struct{ ...@@ -383,15 +384,17 @@ struct dict_table_struct{
mutex_t autoinc_mutex; mutex_t autoinc_mutex;
/* mutex protecting the autoincrement /* mutex protecting the autoincrement
counter */ counter */
ibool autoinc_inited; ibool autoinc_inited:1;
/* TRUE if the autoinc counter has been /* TRUE if the autoinc counter has been
inited; MySQL gets the init value by executing inited; MySQL gets the init value by executing
SELECT MAX(auto inc column) */ SELECT MAX(auto inc column) */
ib_longlong autoinc;/* autoinc counter value to give to the ib_longlong autoinc;/* autoinc counter value to give to the
next inserted row */ next inserted row */
#ifdef UNIV_DEBUG
ulint magic_n;/* magic number */ ulint magic_n;/* magic number */
# define DICT_TABLE_MAGIC_N 76333786
#endif /* UNIV_DEBUG */
}; };
#define DICT_TABLE_MAGIC_N 76333786
#ifndef UNIV_NONINL #ifndef UNIV_NONINL
#include "dict0mem.ic" #include "dict0mem.ic"
......
...@@ -14,11 +14,6 @@ Created 5/30/1994 Heikki Tuuri ...@@ -14,11 +14,6 @@ Created 5/30/1994 Heikki Tuuri
#include "rem0types.h" #include "rem0types.h"
#include "mtr0types.h" #include "mtr0types.h"
/* Maximum values for various fields (for non-blob tuples) */
#define REC_MAX_N_FIELDS (1024 - 1)
#define REC_MAX_HEAP_NO (2 * 8192 - 1)
#define REC_MAX_N_OWNED (16 - 1)
/* Info bit denoting the predefined minimum record: this bit is set /* Info bit denoting the predefined minimum record: this bit is set
if and only if the record is the first user record on a non-leaf if and only if the record is the first user record on a non-leaf
B-tree page that is the leftmost page on its level B-tree page that is the leftmost page on its level
......
...@@ -12,5 +12,9 @@ Created 5/30/1994 Heikki Tuuri ...@@ -12,5 +12,9 @@ Created 5/30/1994 Heikki Tuuri
/* We define the physical record simply as an array of bytes */ /* We define the physical record simply as an array of bytes */
typedef byte rec_t; typedef byte rec_t;
/* Maximum values for various fields (for non-blob tuples) */
#define REC_MAX_N_FIELDS (1024 - 1)
#define REC_MAX_HEAP_NO (2 * 8192 - 1)
#define REC_MAX_N_OWNED (16 - 1)
#endif #endif
...@@ -440,15 +440,14 @@ struct rw_lock_struct { ...@@ -440,15 +440,14 @@ struct rw_lock_struct {
UT_LIST_BASE_NODE_T(rw_lock_debug_t) debug_list; UT_LIST_BASE_NODE_T(rw_lock_debug_t) debug_list;
/* In the debug version: pointer to the debug /* In the debug version: pointer to the debug
info list of the lock */ info list of the lock */
#endif /* UNIV_SYNC_DEBUG */
ulint level; /* Level in the global latching order. */ ulint level; /* Level in the global latching order. */
#endif /* UNIV_SYNC_DEBUG */
const char* cfile_name;/* File name where lock created */ const char* cfile_name;/* File name where lock created */
ulint cline; /* Line where created */ ulint cline:14; /* Line where created */
const char* last_s_file_name;/* File name where last s-locked */ const char* last_s_file_name;/* File name where last s-locked */
const char* last_x_file_name;/* File name where last x-locked */ const char* last_x_file_name;/* File name where last x-locked */
ulint last_s_line; /* Line number where last time s-locked */ ulint last_s_line:14; /* Line number where last time s-locked */
ulint last_x_line; /* Line number where last time x-locked */ ulint last_x_line:14; /* Line number where last time x-locked */
ulint magic_n; ulint magic_n;
}; };
......
...@@ -546,7 +546,7 @@ mlog_parse_index( ...@@ -546,7 +546,7 @@ mlog_parse_index(
((len + 1) & 0x7fff) <= 1 ((len + 1) & 0x7fff) <= 1
? DATA_BINARY : DATA_FIXBINARY, ? DATA_BINARY : DATA_FIXBINARY,
len & 0x8000 ? DATA_NOT_NULL : 0, len & 0x8000 ? DATA_NOT_NULL : 0,
len & 0x7fff, 0); len & 0x7fff);
dict_index_add_col dict_index_add_col
(ind, dict_table_get_nth_col(table, i), 0); (ind, dict_table_get_nth_col(table, i), 0);
} }
......
...@@ -381,7 +381,7 @@ page_create( ...@@ -381,7 +381,7 @@ page_create(
dfield_set_data(field, "infimum", 8); dfield_set_data(field, "infimum", 8);
dtype_set(dfield_get_type(field), dtype_set(dfield_get_type(field),
DATA_VARCHAR, DATA_ENGLISH | DATA_NOT_NULL, 8, 0); DATA_VARCHAR, DATA_ENGLISH | DATA_NOT_NULL, 8);
/* Set the corresponding physical record to its place in the page /* Set the corresponding physical record to its place in the page
record heap */ record heap */
...@@ -407,7 +407,7 @@ page_create( ...@@ -407,7 +407,7 @@ page_create(
dfield_set_data(field, "supremum", comp ? 8 : 9); dfield_set_data(field, "supremum", comp ? 8 : 9);
dtype_set(dfield_get_type(field), dtype_set(dfield_get_type(field),
DATA_VARCHAR, DATA_ENGLISH | DATA_NOT_NULL, comp ? 8 : 9, 0); DATA_VARCHAR, DATA_ENGLISH | DATA_NOT_NULL, comp ? 8 : 9);
supremum_rec = rec_convert_dtuple_to_rec(heap_top, index, tuple); supremum_rec = rec_convert_dtuple_to_rec(heap_top, index, tuple);
......
...@@ -254,43 +254,43 @@ pars_resolve_func_data_type( ...@@ -254,43 +254,43 @@ pars_resolve_func_data_type(
== DATA_INT); == DATA_INT);
} else if (func == PARS_COUNT_TOKEN) { } else if (func == PARS_COUNT_TOKEN) {
ut_a(arg); ut_a(arg);
dtype_set(que_node_get_data_type(node), DATA_INT, 0, 4, 0); dtype_set(que_node_get_data_type(node), DATA_INT, 0, 4);
} else if (func == PARS_TO_CHAR_TOKEN) { } else if (func == PARS_TO_CHAR_TOKEN) {
ut_a(dtype_get_mtype(que_node_get_data_type(arg)) == DATA_INT); ut_a(dtype_get_mtype(que_node_get_data_type(arg)) == DATA_INT);
dtype_set(que_node_get_data_type(node), DATA_VARCHAR, dtype_set(que_node_get_data_type(node), DATA_VARCHAR,
DATA_ENGLISH, 0, 0); DATA_ENGLISH, 0);
} else if (func == PARS_TO_BINARY_TOKEN) { } else if (func == PARS_TO_BINARY_TOKEN) {
if (dtype_get_mtype(que_node_get_data_type(arg)) == DATA_INT) { if (dtype_get_mtype(que_node_get_data_type(arg)) == DATA_INT) {
dtype_set(que_node_get_data_type(node), DATA_VARCHAR, dtype_set(que_node_get_data_type(node), DATA_VARCHAR,
DATA_ENGLISH, 0, 0); DATA_ENGLISH, 0);
} else { } else {
dtype_set(que_node_get_data_type(node), DATA_BINARY, dtype_set(que_node_get_data_type(node), DATA_BINARY,
0, 0, 0); 0, 0);
} }
} else if (func == PARS_TO_NUMBER_TOKEN) { } else if (func == PARS_TO_NUMBER_TOKEN) {
ut_a(dtype_get_mtype(que_node_get_data_type(arg)) ut_a(dtype_get_mtype(que_node_get_data_type(arg))
== DATA_VARCHAR); == DATA_VARCHAR);
dtype_set(que_node_get_data_type(node), DATA_INT, 0, 4, 0); dtype_set(que_node_get_data_type(node), DATA_INT, 0, 4);
} else if (func == PARS_BINARY_TO_NUMBER_TOKEN) { } else if (func == PARS_BINARY_TO_NUMBER_TOKEN) {
ut_a(dtype_get_mtype(que_node_get_data_type(arg)) ut_a(dtype_get_mtype(que_node_get_data_type(arg))
== DATA_VARCHAR); == DATA_VARCHAR);
dtype_set(que_node_get_data_type(node), DATA_INT, 0, 4, 0); dtype_set(que_node_get_data_type(node), DATA_INT, 0, 4);
} else if (func == PARS_LENGTH_TOKEN) { } else if (func == PARS_LENGTH_TOKEN) {
ut_a(dtype_get_mtype(que_node_get_data_type(arg)) ut_a(dtype_get_mtype(que_node_get_data_type(arg))
== DATA_VARCHAR); == DATA_VARCHAR);
dtype_set(que_node_get_data_type(node), DATA_INT, 0, 4, 0); dtype_set(que_node_get_data_type(node), DATA_INT, 0, 4);
} else if (func == PARS_INSTR_TOKEN) { } else if (func == PARS_INSTR_TOKEN) {
ut_a(dtype_get_mtype(que_node_get_data_type(arg)) ut_a(dtype_get_mtype(que_node_get_data_type(arg))
== DATA_VARCHAR); == DATA_VARCHAR);
dtype_set(que_node_get_data_type(node), DATA_INT, 0, 4, 0); dtype_set(que_node_get_data_type(node), DATA_INT, 0, 4);
} else if (func == PARS_SYSDATE_TOKEN) { } else if (func == PARS_SYSDATE_TOKEN) {
ut_a(arg == NULL); ut_a(arg == NULL);
dtype_set(que_node_get_data_type(node), DATA_INT, 0, 4, 0); dtype_set(que_node_get_data_type(node), DATA_INT, 0, 4);
} else if ((func == PARS_SUBSTR_TOKEN) } else if ((func == PARS_SUBSTR_TOKEN)
|| (func == PARS_CONCAT_TOKEN)) { || (func == PARS_CONCAT_TOKEN)) {
...@@ -298,7 +298,7 @@ pars_resolve_func_data_type( ...@@ -298,7 +298,7 @@ pars_resolve_func_data_type(
ut_a(dtype_get_mtype(que_node_get_data_type(arg)) ut_a(dtype_get_mtype(que_node_get_data_type(arg))
== DATA_VARCHAR); == DATA_VARCHAR);
dtype_set(que_node_get_data_type(node), DATA_VARCHAR, dtype_set(que_node_get_data_type(node), DATA_VARCHAR,
DATA_ENGLISH, 0, 0); DATA_ENGLISH, 0);
} else if ((func == '>') || (func == '<') || (func == '=') } else if ((func == '>') || (func == '<') || (func == '=')
|| (func == PARS_GE_TOKEN) || (func == PARS_GE_TOKEN)
...@@ -310,18 +310,18 @@ pars_resolve_func_data_type( ...@@ -310,18 +310,18 @@ pars_resolve_func_data_type(
|| (func == PARS_NOTFOUND_TOKEN)) { || (func == PARS_NOTFOUND_TOKEN)) {
/* We currently have no iboolean type: use integer type */ /* We currently have no iboolean type: use integer type */
dtype_set(que_node_get_data_type(node), DATA_INT, 0, 4, 0); dtype_set(que_node_get_data_type(node), DATA_INT, 0, 4);
} else if (func == PARS_RND_TOKEN) { } else if (func == PARS_RND_TOKEN) {
ut_a(dtype_get_mtype(que_node_get_data_type(arg)) == DATA_INT); ut_a(dtype_get_mtype(que_node_get_data_type(arg)) == DATA_INT);
dtype_set(que_node_get_data_type(node), DATA_INT, 0, 4, 0); dtype_set(que_node_get_data_type(node), DATA_INT, 0, 4);
} else if (func == PARS_RND_STR_TOKEN) { } else if (func == PARS_RND_STR_TOKEN) {
ut_a(dtype_get_mtype(que_node_get_data_type(arg)) == DATA_INT); ut_a(dtype_get_mtype(que_node_get_data_type(arg)) == DATA_INT);
dtype_set(que_node_get_data_type(node), DATA_VARCHAR, dtype_set(que_node_get_data_type(node), DATA_VARCHAR,
DATA_ENGLISH, 0, 0); DATA_ENGLISH, 0);
} else { } else {
ut_error; ut_error;
} }
...@@ -1126,23 +1126,23 @@ pars_set_dfield_type( ...@@ -1126,23 +1126,23 @@ pars_set_dfield_type(
if (type == &pars_int_token) { if (type == &pars_int_token) {
ut_a(len == 0); ut_a(len == 0);
dtype_set(dfield_get_type(dfield), DATA_INT, flags, 4, 0); dtype_set(dfield_get_type(dfield), DATA_INT, flags, 4);
} else if (type == &pars_char_token) { } else if (type == &pars_char_token) {
ut_a(len == 0); ut_a(len == 0);
dtype_set(dfield_get_type(dfield), DATA_VARCHAR, dtype_set(dfield_get_type(dfield), DATA_VARCHAR,
DATA_ENGLISH | flags, 0, 0); DATA_ENGLISH | flags, 0);
} else if (type == &pars_binary_token) { } else if (type == &pars_binary_token) {
ut_a(len != 0); ut_a(len != 0);
dtype_set(dfield_get_type(dfield), DATA_FIXBINARY, dtype_set(dfield_get_type(dfield), DATA_FIXBINARY,
DATA_BINARY_TYPE | flags, len, 0); DATA_BINARY_TYPE | flags, len);
} else if (type == &pars_blob_token) { } else if (type == &pars_blob_token) {
ut_a(len == 0); ut_a(len == 0);
dtype_set(dfield_get_type(dfield), DATA_BLOB, dtype_set(dfield_get_type(dfield), DATA_BLOB,
DATA_BINARY_TYPE | flags, 0, 0); DATA_BINARY_TYPE | flags, 0);
} else { } else {
ut_error; ut_error;
} }
...@@ -1599,7 +1599,8 @@ pars_create_table( ...@@ -1599,7 +1599,8 @@ pars_create_table(
sym_node_t* table_sym, /* in: table name node in the symbol sym_node_t* table_sym, /* in: table name node in the symbol
table */ table */
sym_node_t* column_defs, /* in: list of column names */ sym_node_t* column_defs, /* in: list of column names */
void* not_fit_in_memory)/* in: a non-NULL pointer means that void* not_fit_in_memory __attribute__((unused)))
/* in: a non-NULL pointer means that
this is a table which in simulations this is a table which in simulations
should be simulated as not fitting should be simulated as not fitting
in memory; thread is put to sleep in memory; thread is put to sleep
...@@ -1623,18 +1624,18 @@ pars_create_table( ...@@ -1623,18 +1624,18 @@ pars_create_table(
create tables in the old (not compact) record format. */ 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);
#ifdef UNIV_DEBUG
if (not_fit_in_memory != NULL) { if (not_fit_in_memory != NULL) {
table->does_not_fit_in_memory = TRUE; table->does_not_fit_in_memory = TRUE;
} }
#endif /* UNIV_DEBUG */
column = column_defs; column = column_defs;
while (column) { while (column) {
dtype = dfield_get_type(que_node_get_val(column)); dtype = dfield_get_type(que_node_get_val(column));
dict_mem_table_add_col(table, column->name, dtype->mtype, dict_mem_table_add_col(table, column->name, dtype->mtype,
dtype->prtype, dtype->len, dtype->prtype, dtype->len);
dtype->prec);
column->resolved = TRUE; column->resolved = TRUE;
column->token_type = SYM_COLUMN; column->token_type = SYM_COLUMN;
......
...@@ -102,7 +102,7 @@ sym_tab_add_int_lit( ...@@ -102,7 +102,7 @@ sym_tab_add_int_lit(
node->indirection = NULL; node->indirection = NULL;
dtype_set(&(node->common.val.type), DATA_INT, 0, 4, 0); dtype_set(&(node->common.val.type), DATA_INT, 0, 4);
data = mem_heap_alloc(sym_tab->heap, 4); data = mem_heap_alloc(sym_tab->heap, 4);
mach_write_to_4(data, val); mach_write_to_4(data, val);
...@@ -144,7 +144,7 @@ sym_tab_add_str_lit( ...@@ -144,7 +144,7 @@ sym_tab_add_str_lit(
node->indirection = NULL; node->indirection = NULL;
dtype_set(&(node->common.val.type), DATA_VARCHAR, DATA_ENGLISH, 0, 0); dtype_set(&(node->common.val.type), DATA_VARCHAR, DATA_ENGLISH, 0);
if (len) { if (len) {
data = mem_heap_alloc(sym_tab->heap, len); data = mem_heap_alloc(sym_tab->heap, len);
...@@ -226,7 +226,7 @@ sym_tab_add_bound_lit( ...@@ -226,7 +226,7 @@ sym_tab_add_bound_lit(
ut_error; ut_error;
} }
dtype_set(&(node->common.val.type), blit->type, blit->prtype, len, 0); dtype_set(&(node->common.val.type), blit->type, blit->prtype, len);
dfield_set_data(&(node->common.val), blit->address, blit->length); dfield_set_data(&(node->common.val), blit->address, blit->length);
......
...@@ -972,7 +972,8 @@ row_upd_index_replace_new_col_vals( ...@@ -972,7 +972,8 @@ row_upd_index_replace_new_col_vals(
upd_field = upd_get_nth_field(update, i); upd_field = upd_get_nth_field(update, i);
if (upd_field->field_no == field->col->clust_pos) { if (upd_field->field_no
== dict_col_get_clust_pos(field->col)) {
dfield = dtuple_get_nth_field(entry, j); dfield = dtuple_get_nth_field(entry, j);
......
...@@ -899,7 +899,7 @@ srv_init(void) ...@@ -899,7 +899,7 @@ srv_init(void)
table = dict_mem_table_create("SYS_DUMMY1", table = dict_mem_table_create("SYS_DUMMY1",
DICT_HDR_SPACE, 1, 0); DICT_HDR_SPACE, 1, 0);
dict_mem_table_add_col(table, "DUMMY", DATA_CHAR, dict_mem_table_add_col(table, "DUMMY", DATA_CHAR,
DATA_ENGLISH | DATA_NOT_NULL, 8, 0); DATA_ENGLISH | DATA_NOT_NULL, 8);
srv_sys->dummy_ind1 = dict_mem_index_create srv_sys->dummy_ind1 = dict_mem_index_create
("SYS_DUMMY1", "SYS_DUMMY1", DICT_HDR_SPACE, 0, 1); ("SYS_DUMMY1", "SYS_DUMMY1", DICT_HDR_SPACE, 0, 1);
...@@ -910,7 +910,7 @@ srv_init(void) ...@@ -910,7 +910,7 @@ srv_init(void)
table = dict_mem_table_create("SYS_DUMMY2", table = dict_mem_table_create("SYS_DUMMY2",
DICT_HDR_SPACE, 1, DICT_TF_COMPACT); DICT_HDR_SPACE, 1, DICT_TF_COMPACT);
dict_mem_table_add_col(table, "DUMMY", DATA_CHAR, dict_mem_table_add_col(table, "DUMMY", DATA_CHAR,
DATA_ENGLISH | DATA_NOT_NULL, 8, 0); DATA_ENGLISH | DATA_NOT_NULL, 8);
srv_sys->dummy_ind2 = dict_mem_index_create srv_sys->dummy_ind2 = dict_mem_index_create
("SYS_DUMMY2", "SYS_DUMMY2", DICT_HDR_SPACE, 0, 1); ("SYS_DUMMY2", "SYS_DUMMY2", DICT_HDR_SPACE, 0, 1);
dict_index_add_col(srv_sys->dummy_ind2, dict_index_add_col(srv_sys->dummy_ind2,
......
...@@ -89,7 +89,8 @@ void ...@@ -89,7 +89,8 @@ void
rw_lock_create_func( rw_lock_create_func(
/*================*/ /*================*/
rw_lock_t* lock, /* in: pointer to memory */ rw_lock_t* lock, /* in: pointer to memory */
ulint level, /* in: level */ ulint level __attribute__((unused)),
/* in: level */
const char* cfile_name, /* in: file name where created */ const char* cfile_name, /* in: file name where created */
ulint cline, /* in: file line where created */ ulint cline, /* in: file line where created */
const char* cmutex_name) /* in: mutex name */ const char* cmutex_name) /* in: mutex name */
...@@ -116,9 +117,9 @@ rw_lock_create_func( ...@@ -116,9 +117,9 @@ rw_lock_create_func(
#ifdef UNIV_SYNC_DEBUG #ifdef UNIV_SYNC_DEBUG
UT_LIST_INIT(lock->debug_list); UT_LIST_INIT(lock->debug_list);
#endif /* UNIV_SYNC_DEBUG */
lock->level = level; lock->level = level;
#endif /* UNIV_SYNC_DEBUG */
lock->magic_n = RW_LOCK_MAGIC_N; lock->magic_n = RW_LOCK_MAGIC_N;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment