1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-01 03:47:19 +03:00

Merge remote-tracking branch 'origin/10.4' into 10.5

This commit is contained in:
Monty
2020-07-03 23:31:12 +03:00
40 changed files with 182 additions and 173 deletions

View File

@ -6562,6 +6562,7 @@ add_ft_keys(DYNAMIC_ARRAY *keyuse_array,
keyuse.keypart= FT_KEYPART;
keyuse.used_tables=cond_func->key_item()->used_tables();
keyuse.optimize= 0;
keyuse.ref_table_rows= 0;
keyuse.keypart_map= 0;
keyuse.sj_pred_no= UINT_MAX;
keyuse.validity_ref= 0;
@ -18641,17 +18642,15 @@ bool Create_tmp_table::finalize(THD *thd,
uint null_pack_length[2];
uint null_pack_base[2];
uint null_counter[2]= {0, 0};
uint whole_null_pack_length;
bool use_packed_rows= false;
bool save_abort_on_warning;
uchar *pos;
uchar *null_flags;
KEY *keyinfo;
TMP_ENGINE_COLUMNDEF *recinfo;
TABLE_SHARE *share= table->s;
Copy_field *copy= param->copy_field;
MEM_ROOT *mem_root_save= thd->mem_root;
thd->mem_root= &table->mem_root;
@ -18752,6 +18751,11 @@ bool Create_tmp_table::finalize(THD *thd,
{
null_counter[(m_field_count[other] ? other : distinct)]++;
}
/* Protect against warnings in field_conv() in the next loop*/
save_abort_on_warning= thd->abort_on_warning;
thd->abort_on_warning= 0;
for (uint i= 0; i < share->fields; i++, recinfo++)
{
Field *field= table->field[i];
@ -18795,25 +18799,31 @@ bool Create_tmp_table::finalize(THD *thd,
inherit the default value that is defined for the field referred
by the Item_field object from which 'field' has been created.
*/
const Field *orig_field= m_default_field[i];
Field *orig_field= m_default_field[i];
/* Get the value from default_values */
if (orig_field->is_null_in_record(orig_field->table->s->default_values))
field->set_null();
else
{
/*
Copy default value. We have to use field_conv() for copy, instead of
memcpy(), because bit_fields may be stored differently
*/
my_ptrdiff_t ptr_diff= (orig_field->table->s->default_values -
orig_field->table->record[0]);
field->set_notnull();
memcpy(field->ptr,
orig_field->ptr_in_record(orig_field->table->s->default_values),
field->pack_length_in_rec());
orig_field->move_field_offset(ptr_diff);
field_conv(field, orig_field);
orig_field->move_field_offset(-ptr_diff);
}
}
}
if (m_from_field[i])
{ /* Not a table Item */
copy->set(field, m_from_field[i], m_save_sum_fields);
copy++;
}
length=field->pack_length();
length=field->pack_length_in_rec();
pos+= length;
/* Make entry for create table */
@ -18823,7 +18833,11 @@ bool Create_tmp_table::finalize(THD *thd,
// fix table name in field entry
field->set_table_name(&table->alias);
}
/* Handle group_null_items */
bzero(pos, table->s->reclength - (pos - table->record[0]));
MEM_CHECK_DEFINED(table->record[0], table->s->reclength);
thd->abort_on_warning= save_abort_on_warning;
param->copy_field_end= copy;
param->recinfo= recinfo; // Pointer to after last field
store_record(table,s->default_values); // Make empty default record
@ -19086,8 +19100,9 @@ bool Create_tmp_table::finalize(THD *thd,
goto err;
}
// Make empty record so random data is not written to disk
empty_record(table);
/* record[0] and share->default_values should now have been set up */
MEM_CHECK_DEFINED(table->record[0], table->s->reclength);
MEM_CHECK_DEFINED(share->default_values, table->s->reclength);
thd->mem_root= mem_root_save;
@ -19483,7 +19498,11 @@ bool create_internal_tmp_table(TABLE *table, KEY *keyinfo,
(*recinfo)->type= FIELD_CHECK;
(*recinfo)->length= MARIA_UNIQUE_HASH_LENGTH;
(*recinfo)++;
share->reclength+= MARIA_UNIQUE_HASH_LENGTH;
/* Avoid warnings from valgrind */
bzero(table->record[0]+ share->reclength, MARIA_UNIQUE_HASH_LENGTH);
bzero(share->default_values+ share->reclength, MARIA_UNIQUE_HASH_LENGTH);
share->reclength+= MARIA_UNIQUE_HASH_LENGTH;
}
else
{
@ -19677,7 +19696,10 @@ bool create_internal_tmp_table(TABLE *table, KEY *keyinfo,
(*recinfo)->type= FIELD_CHECK;
(*recinfo)->length=MI_UNIQUE_HASH_LENGTH;
(*recinfo)++;
share->reclength+=MI_UNIQUE_HASH_LENGTH;
/* Avoid warnings from valgrind */
bzero(table->record[0]+ share->reclength, MI_UNIQUE_HASH_LENGTH);
bzero(share->default_values+ share->reclength, MI_UNIQUE_HASH_LENGTH);
share->reclength+= MI_UNIQUE_HASH_LENGTH;
}
else
{
@ -20269,11 +20291,11 @@ bool instantiate_tmp_table(TABLE *table, KEY *keyinfo,
If it is not heap (in-memory) table then convert index to unique
constrain.
*/
MEM_CHECK_DEFINED(table->record[0], table->s->reclength);
if (create_internal_tmp_table(table, keyinfo, start_recinfo, recinfo,
options))
return TRUE;
// Make empty record so random data is not written to disk
empty_record(table);
MEM_CHECK_DEFINED(table->record[0], table->s->reclength);
}
if (open_tmp_table(table))
return TRUE;
@ -28795,7 +28817,6 @@ AGGR_OP::prepare_tmp_table()
join->select_options))
return true;
(void) table->file->extra(HA_EXTRA_WRITE_CACHE);
empty_record(table);
}
/* If it wasn't already, start index scan for grouping using table index. */
if (!table->file->inited && table->group &&