Skip to content

Commit ed39181

Browse files
committed
MDEV-19533 Add methods make() and append_uniq() to Row_definition_list
1 parent fae1319 commit ed39181

File tree

6 files changed

+44
-24
lines changed

6 files changed

+44
-24
lines changed

sql/field.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4852,6 +4852,14 @@ class Row_definition_list: public List<class Spvar_definition>
48524852
}
48534853
return 0;
48544854
}
4855+
static Row_definition_list *make(MEM_ROOT *mem_root, Spvar_definition *var)
4856+
{
4857+
Row_definition_list *list;
4858+
if (!(list= new (mem_root) Row_definition_list()))
4859+
return NULL;
4860+
return list->push_back(var, mem_root) ? NULL : list;
4861+
}
4862+
bool append_uniq(MEM_ROOT *thd, Spvar_definition *var);
48554863
bool adjust_formal_params_to_actual_params(THD *thd, List<Item> *args);
48564864
bool adjust_formal_params_to_actual_params(THD *thd,
48574865
Item **args, uint arg_count);

sql/sp_rcontext.cc

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,19 @@ sp_rcontext *sp_rcontext::create(THD *thd,
119119
}
120120

121121

122+
bool Row_definition_list::append_uniq(MEM_ROOT *mem_root, Spvar_definition *var)
123+
{
124+
DBUG_ASSERT(elements);
125+
uint unused;
126+
if (unlikely(find_row_field_by_name(&var->field_name, &unused)))
127+
{
128+
my_error(ER_DUP_FIELDNAME, MYF(0), var->field_name.str);
129+
return true;
130+
}
131+
return push_back(var, mem_root);
132+
}
133+
134+
122135
bool Row_definition_list::
123136
adjust_formal_params_to_actual_params(THD *thd, List<Item> *args)
124137
{

sql/sql_lex.cc

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10416,3 +10416,19 @@ bool LEX::stmt_create_stored_function_start(const DDL_options_st &options,
1041610416
return true;
1041710417
return false;
1041810418
}
10419+
10420+
10421+
Spvar_definition *LEX::row_field_name(THD *thd, const Lex_ident_sys_st &name)
10422+
{
10423+
Spvar_definition *res;
10424+
if (unlikely(check_string_char_length(&name, 0, NAME_CHAR_LEN,
10425+
system_charset_info, 1)))
10426+
{
10427+
my_error(ER_TOO_LONG_IDENT, MYF(0), name.str);
10428+
return NULL;
10429+
}
10430+
if (unlikely(!(res= new (thd->mem_root) Spvar_definition())))
10431+
return NULL;
10432+
init_last_field(res, &name, thd->variables.collation_database);
10433+
return res;
10434+
}

sql/sql_lex.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4506,6 +4506,7 @@ struct LEX: public Query_tables_list
45064506
const Lex_ident_sys_st &name,
45074507
Item_result return_type,
45084508
const LEX_CSTRING &soname);
4509+
Spvar_definition *row_field_name(THD *thd, const Lex_ident_sys_st &name);
45094510
};
45104511

45114512

sql/sql_yacc.yy

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3508,12 +3508,8 @@ optionally_qualified_column_ident:
35083508
row_field_name:
35093509
ident
35103510
{
3511-
if (unlikely(check_string_char_length(&$1, 0, NAME_CHAR_LEN,
3512-
system_charset_info, 1)))
3513-
my_yyabort_error((ER_TOO_LONG_IDENT, MYF(0), $1.str));
3514-
if (unlikely(!($$= new (thd->mem_root) Spvar_definition())))
3511+
if (!($$= Lex->row_field_name(thd, $1)))
35153512
MYSQL_YYABORT;
3516-
Lex->init_last_field($$, &$1, thd->variables.collation_database);
35173513
}
35183514
;
35193515

@@ -3524,17 +3520,12 @@ row_field_definition:
35243520
row_field_definition_list:
35253521
row_field_definition
35263522
{
3527-
if (unlikely(!($$= new (thd->mem_root) Row_definition_list())) ||
3528-
unlikely($$->push_back($1, thd->mem_root)))
3523+
if (!($$= Row_definition_list::make(thd->mem_root, $1)))
35293524
MYSQL_YYABORT;
35303525
}
35313526
| row_field_definition_list ',' row_field_definition
35323527
{
3533-
uint unused;
3534-
if (unlikely($1->find_row_field_by_name(&$3->field_name, &unused)))
3535-
my_yyabort_error((ER_DUP_FIELDNAME, MYF(0), $3->field_name.str));
3536-
$$= $1;
3537-
if (unlikely($$->push_back($3, thd->mem_root)))
3528+
if (($$= $1)->append_uniq(thd->mem_root, $3))
35383529
MYSQL_YYABORT;
35393530
}
35403531
;

sql/sql_yacc_ora.yy

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3411,12 +3411,8 @@ optionally_qualified_column_ident:
34113411
row_field_name:
34123412
ident_directly_assignable
34133413
{
3414-
if (unlikely(check_string_char_length(&$1, 0, NAME_CHAR_LEN,
3415-
system_charset_info, 1)))
3416-
my_yyabort_error((ER_TOO_LONG_IDENT, MYF(0), $1.str));
3417-
if (unlikely(!($$= new (thd->mem_root) Spvar_definition())))
3414+
if (!($$= Lex->row_field_name(thd, $1)))
34183415
MYSQL_YYABORT;
3419-
Lex->init_last_field($$, &$1, thd->variables.collation_database);
34203416
}
34213417
;
34223418

@@ -3427,17 +3423,12 @@ row_field_definition:
34273423
row_field_definition_list:
34283424
row_field_definition
34293425
{
3430-
if (unlikely(!($$= new (thd->mem_root) Row_definition_list())) ||
3431-
unlikely($$->push_back($1, thd->mem_root)))
3426+
if (!($$= Row_definition_list::make(thd->mem_root, $1)))
34323427
MYSQL_YYABORT;
34333428
}
34343429
| row_field_definition_list ',' row_field_definition
34353430
{
3436-
uint unused;
3437-
if (unlikely($1->find_row_field_by_name(&$3->field_name, &unused)))
3438-
my_yyabort_error((ER_DUP_FIELDNAME, MYF(0), $3->field_name.str));
3439-
$$= $1;
3440-
if (unlikely($$->push_back($3, thd->mem_root)))
3431+
if (($$= $1)->append_uniq(thd->mem_root, $3))
34413432
MYSQL_YYABORT;
34423433
}
34433434
;

0 commit comments

Comments
 (0)