1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-07 00:04:31 +03:00

store/show vcols as item->print()

otherwise we'd need to store sql_mode *per vcol*
(consider CREATE INDEX...) and how SHOW CREATE TABLE would
support that?

Additionally, get rid of vcol::expr_str, just to make sure
the string is always generated and never leaked in the
original form.
This commit is contained in:
Sergei Golubchik
2016-11-07 17:17:40 +01:00
parent 8b3b6dc377
commit a411d7f4f6
132 changed files with 2091 additions and 2192 deletions

View File

@@ -2353,6 +2353,12 @@ end_create:
DBUG_RETURN(thd->is_error());
}
#define memdup_vcol(thd, vcol) \
if (vcol) \
{ \
(vcol)= (Virtual_column_info*)(thd)->memdup((vcol), sizeof(*(vcol))); \
(vcol)->expr_item= NULL; \
}
/**
As we can't let many client threads modify the same TABLE
@@ -2374,7 +2380,6 @@ TABLE *Delayed_insert::get_local_table(THD* client_thd)
{
my_ptrdiff_t adjust_ptrs;
Field **field,**org_field, *found_next_number_field;
Field **vfield= 0, **dfield_ptr= 0;
TABLE *copy;
TABLE_SHARE *share;
uchar *bitmap;
@@ -2437,14 +2442,6 @@ TABLE *Delayed_insert::get_local_table(THD* client_thd)
if (!copy_tmp)
goto error;
if (share->virtual_fields)
{
vfield= (Field **) client_thd->alloc((share->virtual_fields+1)*
sizeof(Field*));
if (!vfield)
goto error;
}
/* Copy the TABLE object. */
copy= new (copy_tmp) TABLE;
*copy= *table;
@@ -2463,7 +2460,14 @@ TABLE *Delayed_insert::get_local_table(THD* client_thd)
sizeof(Field*));
if (!copy->default_field)
goto error;
dfield_ptr= copy->default_field;
}
if (share->virtual_fields)
{
copy->vfield= (Field **) client_thd->alloc((share->virtual_fields+1)*
sizeof(Field*));
if (!copy->vfield)
goto error;
}
copy->expr_arena= NULL;
@@ -2481,12 +2485,14 @@ TABLE *Delayed_insert::get_local_table(THD* client_thd)
found_next_number_field= table->found_next_number_field;
for (org_field= table->field; *org_field; org_field++, field++)
{
if (!(*field= (*org_field)->make_new_field(client_thd->mem_root, copy,
1)))
if (!(*field= (*org_field)->make_new_field(client_thd->mem_root, copy, 1)))
goto error;
(*field)->unireg_check= (*org_field)->unireg_check;
(*field)->orig_table= copy; // Remove connection
(*field)->move_field_offset(adjust_ptrs); // Point at copy->record[0]
memdup_vcol(client_thd, (*field)->vcol_info);
memdup_vcol(client_thd, (*field)->default_value);
memdup_vcol(client_thd, (*field)->check_constraint);
if (*org_field == found_next_number_field)
(*field)->table->found_next_number_field= *field;
}
@@ -2499,42 +2505,9 @@ TABLE *Delayed_insert::get_local_table(THD* client_thd)
if (!(copy->def_vcol_set= (MY_BITMAP*) alloc_root(client_thd->mem_root,
sizeof(MY_BITMAP))))
goto error;
copy->vfield= vfield;
for (field= copy->field; *field; field++)
{
Virtual_column_info *vcol;
if ((*field)->vcol_info)
{
if (!(vcol= unpack_vcol_info_from_frm(client_thd,
client_thd->mem_root,
copy,
0,
(*field)->vcol_info,
&error_reported)))
goto error;
(*field)->vcol_info= vcol;
*vfield++= *field;
}
if ((*field)->default_value)
{
if (!(vcol= unpack_vcol_info_from_frm(client_thd,
client_thd->mem_root,
copy,
0,
(*field)->default_value,
&error_reported)))
goto error;
(*field)->default_value= vcol;
*dfield_ptr++= *field;
}
else
if ((*field)->has_update_default_function())
*dfield_ptr++= *field;
}
if (vfield)
*vfield= 0;
if (dfield_ptr)
*dfield_ptr= 0;
if (parse_vcol_defs(client_thd, client_thd->mem_root, copy, &error_reported))
goto error;
}
switch_defaults_to_nullable_trigger_fields(copy);