Skip to content

Commit 6079b46

Browse files
montywivuvova
authored andcommitted
Split item->flags into base_flags and with_flags
This was done to simplify copying of with_* flags Other things: - Changed Flags to C++ enums, which enables gdb to print out bit values for the flags. This also enables compiler errors if one tries to manipulate a non existing bit in a variable. - Added set_maybe_null() as a shortcut as setting the MAYBE_NULL flags was used in a LOT of places. - Renamed PARAM flag to SP_VAR to ensure it's not confused with persistent statement parameters.
1 parent 7ca4e38 commit 6079b46

37 files changed

+524
-462
lines changed

plugin/func_test/plugin.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class Item_func_sysconst_test :public Item_func_sysconst
3232
bool fix_length_and_dec()
3333
{
3434
max_length= MAX_FIELD_NAME * system_charset_info->mbmaxlen;
35-
flags|= ITEM_FLAG_MAYBE_NULL;
35+
set_maybe_null();
3636
return false;
3737
}
3838
const char *func_name() const { return "sysconst_test"; }

plugin/type_inet/item_inetfunc.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class Item_func_inet_aton : public Item_longlong_func
3737
{
3838
decimals= 0;
3939
max_length= 21;
40-
flags|= ITEM_FLAG_MAYBE_NULL;
40+
set_maybe_null();
4141
unsigned_flag= 1;
4242
return FALSE;
4343
}
@@ -61,7 +61,7 @@ class Item_func_inet_ntoa : public Item_str_func
6161
{
6262
decimals= 0;
6363
fix_length_and_charset(3 * 8 + 7, default_charset());
64-
flags|= ITEM_FLAG_MAYBE_NULL;
64+
set_maybe_null();
6565
return FALSE;
6666
}
6767
Item *get_copy(THD *thd)
@@ -105,7 +105,7 @@ class Item_func_inet6_aton : public Item_str_func
105105
{
106106
decimals= 0;
107107
fix_length_and_charset(16, &my_charset_bin);
108-
flags|= ITEM_FLAG_MAYBE_NULL;
108+
set_maybe_null();
109109
return FALSE;
110110
}
111111
Item *get_copy(THD *thd)
@@ -139,7 +139,7 @@ class Item_func_inet6_ntoa : public Item_str_ascii_func
139139
// 4 symbols per group
140140
fix_length_and_charset(8 * 4 + 7, default_charset());
141141

142-
flags|= ITEM_FLAG_MAYBE_NULL;;
142+
set_maybe_null();;
143143
return FALSE;
144144
}
145145
String *val_str_ascii(String *to);

plugin/type_inet/sql_type_inet.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1055,7 +1055,7 @@ class Item_typecast_inet6: public Item_func
10551055
{
10561056
Type_std_attributes::operator=(Type_std_attributes_inet6());
10571057
if (Inet6::fix_fields_maybe_null_on_conversion_to_inet6(args[0]))
1058-
flags|= ITEM_FLAG_MAYBE_NULL;
1058+
set_maybe_null();
10591059
return false;
10601060
}
10611061
String *val_str(String *to) override

sql/item.cc

Lines changed: 42 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -413,7 +413,8 @@ Item::Item(THD *thd):
413413
name(null_clex_str), orig_name(0), is_expensive_cache(-1)
414414
{
415415
DBUG_ASSERT(thd);
416-
flags= ITEM_FLAG_FIXED | ITEM_FLAG_IS_AUTOGENERATED_NAME;
416+
base_flags= item_base_t::FIXED | item_base_t::IS_AUTOGENERATED_NAME;
417+
with_flags= item_with_t::NONE;
417418
null_value= 0;
418419
marker= 0;
419420

@@ -445,7 +446,8 @@ Item::Item():
445446
name(null_clex_str), orig_name(0), is_expensive_cache(-1)
446447
{
447448
DBUG_ASSERT(my_progname == NULL); // before main()
448-
flags= ITEM_FLAG_FIXED | ITEM_FLAG_IS_AUTOGENERATED_NAME;
449+
base_flags= item_base_t::FIXED | item_base_t::IS_AUTOGENERATED_NAME;
450+
with_flags= item_with_t::NONE;
449451
null_value= 0;
450452
marker= 0;
451453
join_tab_idx= MAX_TABLES;
@@ -473,13 +475,13 @@ Item::Item(THD *thd, Item *item):
473475
str_value(item->str_value),
474476
name(item->name),
475477
orig_name(item->orig_name),
478+
base_flags(item->base_flags & ~item_base_t::FIXED),
479+
with_flags(item->with_flags),
476480
marker(item->marker),
477481
null_value(item->null_value),
478482
is_expensive_cache(-1),
479483
join_tab_idx(item->join_tab_idx)
480484
{
481-
flags= item->flags & (item_flags_t) ~ITEM_FLAG_FIXED;
482-
483485
next= thd->free_list; // Put in free list
484486
thd->free_list= this;
485487
}
@@ -1599,9 +1601,10 @@ bool Item_sp_variable::fix_fields_from_item(THD *thd, Item **, const Item *it)
15991601
max_length= it->max_length;
16001602
decimals= it->decimals;
16011603
unsigned_flag= it->unsigned_flag;
1602-
flags|= ITEM_FLAG_WITH_PARAM | ITEM_FLAG_FIXED;
1604+
base_flags|= item_base_t::FIXED;
1605+
with_flags|= item_with_t::SP_VAR;
16031606
if (thd->lex->current_select && thd->lex->current_select->master_unit()->item)
1604-
thd->lex->current_select->master_unit()->item->flags|= ITEM_FLAG_WITH_PARAM;
1607+
thd->lex->current_select->master_unit()->item->with_flags|= item_with_t::SP_VAR;
16051608
collation.set(it->collation.collation, it->collation.derivation);
16061609

16071610
return FALSE;
@@ -1723,7 +1726,7 @@ Item_splocal::Item_splocal(THD *thd,
17231726
m_var_idx(sp_var_idx),
17241727
m_type(handler == &type_handler_row ? ROW_ITEM : CONST_ITEM)
17251728
{
1726-
flags|= ITEM_FLAG_MAYBE_NULL;
1729+
set_maybe_null();
17271730
}
17281731

17291732

@@ -2086,7 +2089,7 @@ Item_name_const::Item_name_const(THD *thd, Item *name_arg, Item *val):
20862089
StringBuffer<128> name_buffer;
20872090
String *name_str;
20882091

2089-
flags|= ITEM_FLAG_MAYBE_NULL;
2092+
set_maybe_null();
20902093
if (name_item->basic_const_item() &&
20912094
(name_str= name_item->val_str(&name_buffer))) // Can't have a NULL name
20922095
set_name(thd, name_str);
@@ -2140,7 +2143,7 @@ bool Item_name_const::fix_fields(THD *thd, Item **ref)
21402143
max_length= value_item->max_length;
21412144
decimals= value_item->decimals;
21422145
unsigned_flag= value_item->unsigned_flag;
2143-
flags|= ITEM_FLAG_FIXED;
2146+
base_flags|= item_base_t::FIXED;
21442147
return FALSE;
21452148
}
21462149

@@ -2959,7 +2962,7 @@ Item_field::Item_field(THD *thd, Field *f)
29592962
*/
29602963
orig_table_name= table_name;
29612964
orig_field_name= field_name;
2962-
flags|= ITEM_FLAG_WITH_FIELD;
2965+
with_flags|= item_with_t::FIELD;
29632966
}
29642967

29652968

@@ -3009,7 +3012,7 @@ Item_field::Item_field(THD *thd, Name_resolution_context *context_arg,
30093012
name= orig_field_name;
30103013
}
30113014
set_field(f);
3012-
flags|= ITEM_FLAG_WITH_FIELD;
3015+
with_flags|= item_with_t::FIELD;
30133016
}
30143017

30153018

@@ -3025,7 +3028,7 @@ Item_field::Item_field(THD *thd, Name_resolution_context *context_arg,
30253028
collation.set(DERIVATION_IMPLICIT);
30263029
if (select && select->parsing_place != IN_HAVING)
30273030
select->select_n_where_fields++;
3028-
flags|= ITEM_FLAG_WITH_FIELD;
3031+
with_flags|= item_with_t::FIELD;
30293032
}
30303033

30313034
/**
@@ -3040,7 +3043,7 @@ Item_field::Item_field(THD *thd, Item_field *item)
30403043
any_privileges(item->any_privileges)
30413044
{
30423045
collation.set(DERIVATION_IMPLICIT);
3043-
flags|= ITEM_FLAG_WITH_FIELD;
3046+
with_flags|= item_with_t::FIELD;
30443047
}
30453048

30463049

@@ -3065,7 +3068,7 @@ void Item_field::set_field(Field *field_par)
30653068
db_name= field_par->table->s->db;
30663069
alias_name_used= field_par->table->alias_name_used;
30673070

3068-
flags|= ITEM_FLAG_FIXED;
3071+
base_flags|= item_base_t::FIXED;
30693072
if (field->table->s->tmp_table == SYSTEM_TMP_TABLE)
30703073
any_privileges= 0;
30713074
}
@@ -3959,7 +3962,7 @@ Item_param::Item_param(THD *thd, const LEX_CSTRING *name_arg,
39593962
before mysql_stmt_execute(), so we assuming that it can be NULL until
39603963
value is set.
39613964
*/
3962-
flags|= ITEM_FLAG_MAYBE_NULL;
3965+
set_maybe_null();
39633966
}
39643967

39653968

@@ -3991,7 +3994,7 @@ void Item_param::sync_clones()
39913994
{
39923995
Item_param *c= *c_ptr;
39933996
/* Scalar-type members: */
3994-
c->copy_flags(this, ITEM_FLAG_MAYBE_NULL);
3997+
c->copy_flags(this, item_base_t::MAYBE_NULL);
39953998
c->null_value= null_value;
39963999
c->Type_std_attributes::operator=(*this);
39974000
c->Type_handler_hybrid_field_type::operator=(*this);
@@ -4043,7 +4046,7 @@ void Item_param::set_int(longlong i, uint32 max_length_arg)
40434046
collation= DTCollation_numeric();
40444047
max_length= max_length_arg;
40454048
decimals= 0;
4046-
flags&= (item_flags_t) ~ITEM_FLAG_MAYBE_NULL;
4049+
base_flags&= ~item_base_t::MAYBE_NULL;
40474050
null_value= 0;
40484051
DBUG_VOID_RETURN;
40494052
}
@@ -4057,7 +4060,7 @@ void Item_param::set_double(double d)
40574060
collation= DTCollation_numeric();
40584061
max_length= DBL_DIG + 8;
40594062
decimals= NOT_FIXED_DEC;
4060-
flags&= (item_flags_t) ~ITEM_FLAG_MAYBE_NULL;
4063+
base_flags&= ~item_base_t::MAYBE_NULL;
40614064
null_value= 0;
40624065
DBUG_VOID_RETURN;
40634066
}
@@ -4089,7 +4092,7 @@ void Item_param::set_decimal(const char *str, ulong length)
40894092
max_length=
40904093
my_decimal_precision_to_length_no_truncation(value.m_decimal.precision(),
40914094
decimals, unsigned_flag);
4092-
flags&= (item_flags_t) ~ITEM_FLAG_MAYBE_NULL;
4095+
base_flags&= ~item_base_t::MAYBE_NULL;
40934096
null_value= 0;
40944097
DBUG_VOID_RETURN;
40954098
}
@@ -4106,7 +4109,7 @@ void Item_param::set_decimal(const my_decimal *dv, bool unsigned_arg)
41064109
unsigned_flag= unsigned_arg;
41074110
max_length= my_decimal_precision_to_length(value.m_decimal.intg + decimals,
41084111
decimals, unsigned_flag);
4109-
flags&= (item_flags_t) ~ITEM_FLAG_MAYBE_NULL;
4112+
base_flags&= ~item_base_t::MAYBE_NULL;
41104113
null_value= 0;
41114114
}
41124115

@@ -4117,7 +4120,7 @@ void Item_param::fix_temporal(uint32 max_length_arg, uint decimals_arg)
41174120
collation= DTCollation_numeric();
41184121
max_length= max_length_arg;
41194122
decimals= decimals_arg;
4120-
flags&= (item_flags_t) ~ITEM_FLAG_MAYBE_NULL;
4123+
base_flags&= ~item_base_t::MAYBE_NULL;
41214124
null_value= 0;
41224125
}
41234126

@@ -4127,7 +4130,7 @@ void Item_param::set_time(const MYSQL_TIME *tm,
41274130
{
41284131
DBUG_ASSERT(value.type_handler()->cmp_type() == TIME_RESULT);
41294132
value.time= *tm;
4130-
flags&= (item_flags_t) ~ITEM_FLAG_MAYBE_NULL;
4133+
base_flags&= ~item_base_t::MAYBE_NULL;
41314134
null_value= 0;
41324135
fix_temporal(max_length_arg, decimals_arg);
41334136
}
@@ -4162,7 +4165,7 @@ void Item_param::set_time(MYSQL_TIME *tm, timestamp_type time_type,
41624165
&str, time_type, NULL, NULL, NULL);
41634166
set_zero_time(&value.time, time_type);
41644167
}
4165-
flags&= (item_flags_t) ~ITEM_FLAG_MAYBE_NULL;
4168+
base_flags&= ~item_base_t::MAYBE_NULL;
41664169
null_value= 0;
41674170
fix_temporal(max_length_arg,
41684171
tm->second_part > 0 ? TIME_SECOND_PART_DIGITS : 0);
@@ -4199,7 +4202,7 @@ bool Item_param::set_str(const char *str, ulong length,
41994202
state= SHORT_DATA_VALUE;
42004203
collation.set(tocs, DERIVATION_COERCIBLE);
42014204
max_length= length;
4202-
flags&= (item_flags_t) ~ITEM_FLAG_MAYBE_NULL;
4205+
base_flags&= ~item_base_t::MAYBE_NULL;
42034206
null_value= 0;
42044207
/* max_length and decimals are set after charset conversion */
42054208
/* sic: str may be not null-terminated, don't add DBUG_PRINT here */
@@ -4234,7 +4237,7 @@ bool Item_param::set_longdata(const char *str, ulong length)
42344237
if (value.m_string.append(str, length, &my_charset_bin))
42354238
DBUG_RETURN(TRUE);
42364239
state= LONG_DATA_VALUE;
4237-
flags&= (item_flags_t) ~ITEM_FLAG_MAYBE_NULL;
4240+
base_flags&= ~item_base_t::MAYBE_NULL;
42384241
null_value= 0;
42394242

42404243
DBUG_RETURN(FALSE);
@@ -4335,7 +4338,7 @@ void Item_param::reset()
43354338
value.m_string.set_charset(&my_charset_bin);
43364339
collation.set(&my_charset_bin, DERIVATION_COERCIBLE);
43374340
state= NO_VALUE;
4338-
flags|= ITEM_FLAG_MAYBE_NULL;
4341+
set_maybe_null();
43394342
null_value= 0;
43404343
DBUG_VOID_RETURN;
43414344
}
@@ -4794,7 +4797,7 @@ Item_param::set_param_type_and_swap_value(Item_param *src)
47944797
Type_std_attributes::set(src);
47954798
set_handler(src->type_handler());
47964799

4797-
copy_flags(src, ITEM_FLAG_MAYBE_NULL);
4800+
copy_flags(src, item_base_t::MAYBE_NULL);
47984801
null_value= src->null_value;
47994802
state= src->state;
48004803

@@ -5629,7 +5632,7 @@ Item_field::fix_outer_field(THD *thd, Field **from_field, Item **reference)
56295632
set_if_bigger(thd->lex->in_sum_func->max_arg_level,
56305633
select->nest_level);
56315634
set_field(*from_field);
5632-
flags|= ITEM_FLAG_FIXED;
5635+
base_flags|= item_base_t::FIXED;
56335636
mark_as_dependent(thd, last_checked_context->select_lex,
56345637
context->select_lex, this,
56355638
((ref_type == REF_ITEM ||
@@ -6049,7 +6052,7 @@ bool Item_field::fix_fields(THD *thd, Item **reference)
60496052
}
60506053
}
60516054
#endif
6052-
flags|= ITEM_FLAG_FIXED;
6055+
base_flags|= item_base_t::FIXED;
60536056
if (field->vcol_info)
60546057
fix_session_vcol_expr_for_read(thd, field, field->vcol_info);
60556058
if (thd->variables.sql_mode & MODE_ONLY_FULL_GROUP_BY &&
@@ -8072,20 +8075,10 @@ void Item_ref::set_properties()
80728075
We have to remember if we refer to a sum function, to ensure that
80738076
split_sum_func() doesn't try to change the reference.
80748077
*/
8075-
/* Reset flags if called from update_ref() */
8076-
flags&= ~ (ITEM_FLAG_WITH_SUM_FUNC |
8077-
ITEM_FLAG_WITH_PARAM |
8078-
ITEM_FLAG_WITH_WINDOW_FUNC |
8079-
ITEM_FLAG_WITH_SUBQUERY |
8080-
ITEM_FLAG_WITH_FIELD);
8081-
8082-
flags|= (ITEM_FLAG_FIXED |
8083-
((*ref)->flags & (ITEM_FLAG_MAYBE_NULL |
8084-
ITEM_FLAG_WITH_SUM_FUNC |
8085-
ITEM_FLAG_WITH_PARAM |
8086-
ITEM_FLAG_WITH_WINDOW_FUNC |
8087-
ITEM_FLAG_WITH_SUBQUERY |
8088-
ITEM_FLAG_WITH_FIELD)));
8078+
with_flags= (*ref)->with_flags;
8079+
base_flags|= (item_base_t::FIXED |
8080+
((*ref)->base_flags & item_base_t::MAYBE_NULL));
8081+
80898082
if (alias_name_used)
80908083
return;
80918084
if ((*ref)->type() == FIELD_ITEM)
@@ -8563,14 +8556,10 @@ Item_cache_wrapper::Item_cache_wrapper(THD *thd, Item *item_arg):
85638556
DBUG_ASSERT(orig_item->fixed());
85648557
Type_std_attributes::set(orig_item);
85658558

8566-
flags|= ITEM_FLAG_FIXED |
8567-
(orig_item->flags &
8568-
(ITEM_FLAG_MAYBE_NULL |
8569-
ITEM_FLAG_WITH_SUM_FUNC |
8570-
ITEM_FLAG_WITH_SUBQUERY |
8571-
ITEM_FLAG_WITH_PARAM |
8572-
ITEM_FLAG_WITH_FIELD));
8573-
8559+
base_flags|= (item_base_t::FIXED |
8560+
(orig_item->base_flags & item_base_t::MAYBE_NULL));
8561+
with_flags|= orig_item->with_flags;
8562+
85748563
name= item_arg->name;
85758564

85768565
if ((expr_value= orig_item->get_cache(thd)))
@@ -9029,7 +9018,7 @@ bool Item_direct_view_ref::fix_fields(THD *thd, Item **reference)
90299018
if (Item_direct_ref::fix_fields(thd, reference))
90309019
return TRUE;
90319020
if (view->table && view->table->maybe_null)
9032-
flags|= ITEM_FLAG_MAYBE_NULL;
9021+
set_maybe_null();
90339022
set_null_ref_table();
90349023
return FALSE;
90359024
}
@@ -9789,7 +9778,7 @@ bool Item_trigger_field::fix_fields(THD *thd, Item **items)
97899778
field= (row_version == OLD_ROW) ? triggers->old_field[field_idx] :
97909779
triggers->new_field[field_idx];
97919780
set_field(field);
9792-
flags|= ITEM_FLAG_FIXED;
9781+
base_flags|= item_base_t::FIXED;
97939782
return FALSE;
97949783
}
97959784

0 commit comments

Comments
 (0)