mirror of
https://github.com/MariaDB/server.git
synced 2025-01-19 05:22:25 +01:00
Remove dict_col_t::clust_pos.
dict_col_get_clust_pos(): Add parameter clust_index. Replace the look-up with a linear search of all columns in the clustered index. row_upd_index_replace_new_col_vals(): Compute clust_index outside the loops. Compute clust_pos outside the inner loop. row_upd_changes_ord_field_binary(), row_upd_changes_first_fields_binary(): Compute clust_index outside the loops. Declare the auxiliary variables inside the loop scope.
This commit is contained in:
parent
f1cc5233f5
commit
3b49ab383b
8 changed files with 62 additions and 54 deletions
|
@ -528,7 +528,7 @@ dict_index_get_nth_col_pos(
|
|||
|
||||
if (index->type & DICT_CLUSTERED) {
|
||||
|
||||
return(dict_col_get_clust_pos(col));
|
||||
return(dict_col_get_clust_pos(col, index));
|
||||
}
|
||||
|
||||
n_fields = dict_index_get_n_fields(index);
|
||||
|
@ -1756,18 +1756,6 @@ dict_index_build_internal_clust(
|
|||
ut_ad((index->type & DICT_IBUF)
|
||||
|| (UT_LIST_GET_LEN(table->indexes) == 0));
|
||||
|
||||
/* Store to the column structs the position of the table columns
|
||||
in the clustered index */
|
||||
|
||||
for (i = 0; i < new_index->n_def; i++) {
|
||||
field = dict_index_get_nth_field(new_index, i);
|
||||
|
||||
if (field->prefix_len == 0) {
|
||||
|
||||
field->col->clust_pos = i;
|
||||
}
|
||||
}
|
||||
|
||||
new_index->cached = TRUE;
|
||||
|
||||
return(new_index);
|
||||
|
|
|
@ -136,8 +136,6 @@ dict_mem_table_add_col(
|
|||
col->name = mem_heap_strdup(table->heap, name);
|
||||
col->ord_part = 0;
|
||||
|
||||
col->clust_pos = REC_MAX_N_FIELDS;
|
||||
|
||||
type = dict_col_get_type(col);
|
||||
|
||||
dtype_set(type, mtype, prtype, len);
|
||||
|
|
|
@ -3165,7 +3165,7 @@ include_field:
|
|||
|
||||
if (index == clust_index) {
|
||||
templ->rec_field_no = dict_col_get_clust_pos
|
||||
(&index->table->cols[i]);
|
||||
(&index->table->cols[i], index);
|
||||
} else {
|
||||
templ->rec_field_no = dict_index_get_nth_col_pos(
|
||||
index, i);
|
||||
|
@ -3225,7 +3225,8 @@ skip_field:
|
|||
templ = prebuilt->mysql_template + i;
|
||||
|
||||
templ->rec_field_no = dict_col_get_clust_pos
|
||||
(&index->table->cols[templ->col_no]);
|
||||
(&index->table->cols[templ->col_no],
|
||||
clust_index);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3491,9 +3492,11 @@ calc_row_difference(
|
|||
ulint col_type;
|
||||
ulint n_changed = 0;
|
||||
dfield_t dfield;
|
||||
dict_index_t* clust_index;
|
||||
uint i;
|
||||
|
||||
n_fields = table->s->fields;
|
||||
clust_index = dict_table_get_first_index_noninline(prebuilt->table);
|
||||
|
||||
/* We use upd_buff to convert changed fields */
|
||||
buf = (byte*) upd_buff;
|
||||
|
@ -3599,7 +3602,7 @@ calc_row_difference(
|
|||
|
||||
ufield->exp = NULL;
|
||||
ufield->field_no = dict_col_get_clust_pos
|
||||
(&prebuilt->table->cols[i]);
|
||||
(&prebuilt->table->cols[i], clust_index);
|
||||
n_changed++;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -96,7 +96,8 @@ UNIV_INLINE
|
|||
ulint
|
||||
dict_col_get_clust_pos(
|
||||
/*===================*/
|
||||
dict_col_t* col);
|
||||
const dict_col_t* col, /* in: table column */
|
||||
const dict_index_t* clust_index); /* in: clustered index */
|
||||
/********************************************************************
|
||||
If the given column name is reserved for InnoDB system columns, return
|
||||
TRUE. */
|
||||
|
|
|
@ -43,13 +43,23 @@ UNIV_INLINE
|
|||
ulint
|
||||
dict_col_get_clust_pos(
|
||||
/*===================*/
|
||||
dict_col_t* col)
|
||||
const dict_col_t* col, /* in: table column */
|
||||
const dict_index_t* clust_index) /* in: clustered index */
|
||||
{
|
||||
ut_ad(col);
|
||||
ulint i;
|
||||
|
||||
return(col->clust_pos == REC_MAX_N_FIELDS
|
||||
? ULINT_UNDEFINED
|
||||
: col->clust_pos);
|
||||
ut_ad(col);
|
||||
ut_ad(clust_index && clust_index->type & DICT_CLUSTERED);
|
||||
|
||||
for (i = 0; i < clust_index->n_def; i++) {
|
||||
const dict_field_t* field = &clust_index->fields[i];
|
||||
|
||||
if (!field->prefix_len && field->col == col) {
|
||||
return(i);
|
||||
}
|
||||
}
|
||||
|
||||
return(ULINT_UNDEFINED);
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
|
@ -324,7 +334,7 @@ dict_index_get_sys_col_pos(
|
|||
|
||||
if (index->type & DICT_CLUSTERED) {
|
||||
|
||||
return(dict_col_get_clust_pos(col));
|
||||
return(dict_col_get_clust_pos(col, index));
|
||||
}
|
||||
|
||||
return(dict_index_get_nth_col_pos
|
||||
|
|
|
@ -123,8 +123,6 @@ dict_mem_foreign_create(void);
|
|||
struct dict_col_struct{
|
||||
ulint ind:10; /* table column position (they are numbered
|
||||
starting from 0) */
|
||||
ulint clust_pos:10;/* position of the column in the
|
||||
clustered index */
|
||||
ulint ord_part:1;/* nonzero if this column appears
|
||||
in ordering fields of an index */
|
||||
const char* name; /* name */
|
||||
|
|
|
@ -102,9 +102,10 @@ row_sel_sec_rec_is_for_clust_rec(
|
|||
ifield = dict_index_get_nth_field(sec_index, i);
|
||||
col = dict_field_get_col(ifield);
|
||||
|
||||
clust_field = rec_get_nth_field(clust_rec, clust_offs,
|
||||
dict_col_get_clust_pos(col),
|
||||
&clust_len);
|
||||
clust_field = rec_get_nth_field
|
||||
(clust_rec, clust_offs,
|
||||
dict_col_get_clust_pos(col, clust_index),
|
||||
&clust_len);
|
||||
sec_field = rec_get_nth_field(sec_rec, sec_offs, i, &sec_len);
|
||||
|
||||
if (ifield->prefix_len > 0
|
||||
|
|
|
@ -952,28 +952,32 @@ row_upd_index_replace_new_col_vals(
|
|||
copy the new values, set this as NULL if you
|
||||
do not want allocation */
|
||||
{
|
||||
dict_field_t* field;
|
||||
upd_field_t* upd_field;
|
||||
dfield_t* dfield;
|
||||
dfield_t* new_val;
|
||||
ulint j;
|
||||
ulint i;
|
||||
dtype_t* cur_type;
|
||||
dict_index_t* clust_index;
|
||||
|
||||
ut_ad(index);
|
||||
|
||||
clust_index = dict_table_get_first_index(index->table);
|
||||
|
||||
dtuple_set_info_bits(entry, update->info_bits);
|
||||
|
||||
for (j = 0; j < dict_index_get_n_fields(index); j++) {
|
||||
|
||||
field = dict_index_get_nth_field(index, j);
|
||||
ulint clust_pos;
|
||||
dict_field_t* field = dict_index_get_nth_field(index, j);
|
||||
|
||||
clust_pos = dict_col_get_clust_pos(field->col, clust_index);
|
||||
|
||||
for (i = 0; i < upd_get_n_fields(update); i++) {
|
||||
|
||||
upd_field = upd_get_nth_field(update, i);
|
||||
|
||||
if (upd_field->field_no
|
||||
== dict_col_get_clust_pos(field->col)) {
|
||||
if (upd_field->field_no == clust_pos) {
|
||||
|
||||
dfield = dtuple_get_nth_field(entry, j);
|
||||
|
||||
|
@ -1026,30 +1030,33 @@ row_upd_changes_ord_field_binary(
|
|||
field numbers in this MUST be clustered index
|
||||
positions! */
|
||||
{
|
||||
upd_field_t* upd_field;
|
||||
dict_field_t* ind_field;
|
||||
dict_col_t* col;
|
||||
ulint n_unique;
|
||||
ulint n_upd_fields;
|
||||
ulint col_pos;
|
||||
ulint col_no;
|
||||
ulint i, j;
|
||||
dict_index_t* clust_index;
|
||||
|
||||
ut_ad(update && index);
|
||||
|
||||
n_unique = dict_index_get_n_unique(index);
|
||||
n_upd_fields = upd_get_n_fields(update);
|
||||
|
||||
clust_index = dict_table_get_first_index(index->table);
|
||||
|
||||
for (i = 0; i < n_unique; i++) {
|
||||
|
||||
ind_field = dict_index_get_nth_field(index, i);
|
||||
col = dict_field_get_col(ind_field);
|
||||
col_pos = dict_col_get_clust_pos(col);
|
||||
col_no = dict_col_get_no(col);
|
||||
dict_field_t* ind_field
|
||||
= dict_index_get_nth_field(index, i);
|
||||
dict_col_t* col
|
||||
= dict_field_get_col(ind_field);
|
||||
ulint col_pos
|
||||
= dict_col_get_clust_pos(col, clust_index);
|
||||
ulint col_no
|
||||
= dict_col_get_no(col);
|
||||
|
||||
for (j = 0; j < n_upd_fields; j++) {
|
||||
|
||||
upd_field = upd_get_nth_field(update, j);
|
||||
upd_field_t* upd_field
|
||||
= upd_get_nth_field(update, j);
|
||||
|
||||
/* Note that if the index field is a column prefix
|
||||
then it may be that row does not contain an externally
|
||||
|
@ -1118,29 +1125,31 @@ row_upd_changes_first_fields_binary(
|
|||
upd_t* update, /* in: update vector for the row */
|
||||
ulint n) /* in: how many first fields to check */
|
||||
{
|
||||
upd_field_t* upd_field;
|
||||
dict_field_t* ind_field;
|
||||
dict_col_t* col;
|
||||
ulint n_upd_fields;
|
||||
ulint col_pos;
|
||||
ulint i, j;
|
||||
dict_index_t* clust_index;
|
||||
|
||||
ut_a(update && index);
|
||||
ut_a(n <= dict_index_get_n_fields(index));
|
||||
ut_ad(update && index);
|
||||
ut_ad(n <= dict_index_get_n_fields(index));
|
||||
|
||||
n_upd_fields = upd_get_n_fields(update);
|
||||
clust_index = dict_table_get_first_index(index->table);
|
||||
|
||||
for (i = 0; i < n; i++) {
|
||||
|
||||
ind_field = dict_index_get_nth_field(index, i);
|
||||
col = dict_field_get_col(ind_field);
|
||||
col_pos = dict_col_get_clust_pos(col);
|
||||
dict_field_t* ind_field
|
||||
= dict_index_get_nth_field(index, i);
|
||||
dict_col_t* col
|
||||
= dict_field_get_col(ind_field);
|
||||
ulint col_pos
|
||||
= dict_col_get_clust_pos(col, clust_index);
|
||||
|
||||
ut_a(ind_field->prefix_len == 0);
|
||||
|
||||
for (j = 0; j < n_upd_fields; j++) {
|
||||
|
||||
upd_field = upd_get_nth_field(update, j);
|
||||
upd_field_t* upd_field
|
||||
= upd_get_nth_field(update, j);
|
||||
|
||||
if (col_pos == upd_field->field_no
|
||||
&& !dfield_datas_are_binary_equal
|
||||
|
|
Loading…
Reference in a new issue