Details
-
Task
-
Status: Closed (View Workflow)
-
Major
-
Resolution: Fixed
-
None
Description
There is a duplicate code in sql_yacc.yy and sql_yacc_ora.yy related to ROW variable defintion:
row_field_name:
|
ident // or ident_directly_assignable |
{
|
if (unlikely(check_string_char_length(&$1, 0, NAME_CHAR_LEN, |
system_charset_info, 1)))
|
my_yyabort_error((ER_TOO_LONG_IDENT, MYF(0), $1.str));
|
if (unlikely(!($$= new (thd->mem_root) Spvar_definition()))) |
MYSQL_YYABORT;
|
Lex->init_last_field($$, &$1, thd->variables.collation_database);
|
}
|
;
|
|
row_field_definition_list:
|
row_field_definition
|
{
|
if (unlikely(!($$= new (thd->mem_root) Row_definition_list())) || |
unlikely($$->push_back($1, thd->mem_root)))
|
MYSQL_YYABORT;
|
}
|
| row_field_definition_list ',' row_field_definition |
{
|
uint unused;
|
if (unlikely($1->find_row_field_by_name(&$3->field_name, &unused))) |
my_yyabort_error((ER_DUP_FIELDNAME, MYF(0), $3->field_name.str));
|
$$= $1;
|
if (unlikely($$->push_back($3, thd->mem_root))) |
MYSQL_YYABORT;
|
}
|
;
|
There is a difference though:
- in sql_yacc.yy row_field_name is defined as ident
- in sql_yacc_ora.yy row_field_name is defined as ident_directly_assignable
In order to join the two *.yy files easier, let's move the C++ code into new Row_definition_list methods and simplify the grammar as follows:
row_field_name:
|
ident // or ident_directly_assignable |
{
|
if (!($$= Lex->row_field_name(thd, $1))) |
MYSQL_YYABORT;
|
}
|
;
|
|
row_field_definition_list:
|
row_field_definition
|
{
|
if (!($$= Row_definition_list::make(thd->mem_root, $1))) |
MYSQL_YYABORT;
|
}
|
| row_field_definition_list ',' row_field_definition |
{
|
if (($$= $1)->append_uniq(thd->mem_root, $3)) |
MYSQL_YYABORT;
|
}
|
;
|
Attachments
Issue Links
- blocks
-
MDEV-12518 Unify sql_yacc.yy and sql_yacc_ora.yy
-
- Closed
-
Activity
Field | Original Value | New Value |
---|---|---|
Link |
This issue blocks |
Description |
There is a duplicate code in sql_yacc.yy and sql_yacc_ora.yy related to ROW variable defintion:
{code:cpp} row_field_name: ident { if (unlikely(check_string_char_length(&$1, 0, NAME_CHAR_LEN, system_charset_info, 1))) my_yyabort_error((ER_TOO_LONG_IDENT, MYF(0), $1.str)); if (unlikely(!($$= new (thd->mem_root) Spvar_definition()))) MYSQL_YYABORT; Lex->init_last_field($$, &$1, thd->variables.collation_database); } ; row_field_definition_list: row_field_definition { if (unlikely(!($$= new (thd->mem_root) Row_definition_list())) || unlikely($$->push_back($1, thd->mem_root))) MYSQL_YYABORT; } | row_field_definition_list ',' row_field_definition { uint unused; if (unlikely($1->find_row_field_by_name(&$3->field_name, &unused))) my_yyabort_error((ER_DUP_FIELDNAME, MYF(0), $3->field_name.str)); $$= $1; if (unlikely($$->push_back($3, thd->mem_root))) MYSQL_YYABORT; } ; {code} The difference between though: - in {{sql_yacc.yy}} {{row_field_name}} is defined as {{ident}} - in {{sql_yacc_ora.yy}} {{row_field_name}} is defined as {{ident_directly_assignable}} In order to join the two *.yy files easier, let's move the C++ code into new Row_definition_list methods and simplify the grammar as follows: {code:cpp} row_field_name: ident // or ident_directly_assignable { if (!($$= Lex->row_field_name(thd, $1))) MYSQL_YYABORT; } ; row_field_definition_list: row_field_definition { if (!($$= Row_definition_list::make(thd->mem_root, $1))) MYSQL_YYABORT; } | row_field_definition_list ',' row_field_definition { if (($$= $1)->append_uniq(thd->mem_root, $3)) MYSQL_YYABORT; } ; {code} |
There is a duplicate code in sql_yacc.yy and sql_yacc_ora.yy related to ROW variable defintion:
{code:cpp} row_field_name: ident { if (unlikely(check_string_char_length(&$1, 0, NAME_CHAR_LEN, system_charset_info, 1))) my_yyabort_error((ER_TOO_LONG_IDENT, MYF(0), $1.str)); if (unlikely(!($$= new (thd->mem_root) Spvar_definition()))) MYSQL_YYABORT; Lex->init_last_field($$, &$1, thd->variables.collation_database); } ; row_field_definition_list: row_field_definition { if (unlikely(!($$= new (thd->mem_root) Row_definition_list())) || unlikely($$->push_back($1, thd->mem_root))) MYSQL_YYABORT; } | row_field_definition_list ',' row_field_definition { uint unused; if (unlikely($1->find_row_field_by_name(&$3->field_name, &unused))) my_yyabort_error((ER_DUP_FIELDNAME, MYF(0), $3->field_name.str)); $$= $1; if (unlikely($$->push_back($3, thd->mem_root))) MYSQL_YYABORT; } ; {code} There is a difference though: - in {{sql_yacc.yy}} {{row_field_name}} is defined as {{ident}} - in {{sql_yacc_ora.yy}} {{row_field_name}} is defined as {{ident_directly_assignable}} In order to join the two *.yy files easier, let's move the C++ code into new Row_definition_list methods and simplify the grammar as follows: {code:cpp} row_field_name: ident // or ident_directly_assignable { if (!($$= Lex->row_field_name(thd, $1))) MYSQL_YYABORT; } ; row_field_definition_list: row_field_definition { if (!($$= Row_definition_list::make(thd->mem_root, $1))) MYSQL_YYABORT; } | row_field_definition_list ',' row_field_definition { if (($$= $1)->append_uniq(thd->mem_root, $3)) MYSQL_YYABORT; } ; {code} |
Description |
There is a duplicate code in sql_yacc.yy and sql_yacc_ora.yy related to ROW variable defintion:
{code:cpp} row_field_name: ident { if (unlikely(check_string_char_length(&$1, 0, NAME_CHAR_LEN, system_charset_info, 1))) my_yyabort_error((ER_TOO_LONG_IDENT, MYF(0), $1.str)); if (unlikely(!($$= new (thd->mem_root) Spvar_definition()))) MYSQL_YYABORT; Lex->init_last_field($$, &$1, thd->variables.collation_database); } ; row_field_definition_list: row_field_definition { if (unlikely(!($$= new (thd->mem_root) Row_definition_list())) || unlikely($$->push_back($1, thd->mem_root))) MYSQL_YYABORT; } | row_field_definition_list ',' row_field_definition { uint unused; if (unlikely($1->find_row_field_by_name(&$3->field_name, &unused))) my_yyabort_error((ER_DUP_FIELDNAME, MYF(0), $3->field_name.str)); $$= $1; if (unlikely($$->push_back($3, thd->mem_root))) MYSQL_YYABORT; } ; {code} There is a difference though: - in {{sql_yacc.yy}} {{row_field_name}} is defined as {{ident}} - in {{sql_yacc_ora.yy}} {{row_field_name}} is defined as {{ident_directly_assignable}} In order to join the two *.yy files easier, let's move the C++ code into new Row_definition_list methods and simplify the grammar as follows: {code:cpp} row_field_name: ident // or ident_directly_assignable { if (!($$= Lex->row_field_name(thd, $1))) MYSQL_YYABORT; } ; row_field_definition_list: row_field_definition { if (!($$= Row_definition_list::make(thd->mem_root, $1))) MYSQL_YYABORT; } | row_field_definition_list ',' row_field_definition { if (($$= $1)->append_uniq(thd->mem_root, $3)) MYSQL_YYABORT; } ; {code} |
There is a duplicate code in sql_yacc.yy and sql_yacc_ora.yy related to ROW variable defintion:
{code:cpp} row_field_name: ident // or ident_directly_assignable { if (unlikely(check_string_char_length(&$1, 0, NAME_CHAR_LEN, system_charset_info, 1))) my_yyabort_error((ER_TOO_LONG_IDENT, MYF(0), $1.str)); if (unlikely(!($$= new (thd->mem_root) Spvar_definition()))) MYSQL_YYABORT; Lex->init_last_field($$, &$1, thd->variables.collation_database); } ; row_field_definition_list: row_field_definition { if (unlikely(!($$= new (thd->mem_root) Row_definition_list())) || unlikely($$->push_back($1, thd->mem_root))) MYSQL_YYABORT; } | row_field_definition_list ',' row_field_definition { uint unused; if (unlikely($1->find_row_field_by_name(&$3->field_name, &unused))) my_yyabort_error((ER_DUP_FIELDNAME, MYF(0), $3->field_name.str)); $$= $1; if (unlikely($$->push_back($3, thd->mem_root))) MYSQL_YYABORT; } ; {code} There is a difference though: - in {{sql_yacc.yy}} {{row_field_name}} is defined as {{ident}} - in {{sql_yacc_ora.yy}} {{row_field_name}} is defined as {{ident_directly_assignable}} In order to join the two *.yy files easier, let's move the C++ code into new Row_definition_list methods and simplify the grammar as follows: {code:cpp} row_field_name: ident // or ident_directly_assignable { if (!($$= Lex->row_field_name(thd, $1))) MYSQL_YYABORT; } ; row_field_definition_list: row_field_definition { if (!($$= Row_definition_list::make(thd->mem_root, $1))) MYSQL_YYABORT; } | row_field_definition_list ',' row_field_definition { if (($$= $1)->append_uniq(thd->mem_root, $3)) MYSQL_YYABORT; } ; {code} |
Fix Version/s | 10.4.5 [ 23311 ] | |
Fix Version/s | 10.4 [ 22408 ] | |
Resolution | Fixed [ 1 ] | |
Status | Open [ 1 ] | Closed [ 6 ] |
Fix Version/s | 10.4.6 [ 23412 ] | |
Fix Version/s | 10.4.5 [ 23311 ] |
Workflow | MariaDB v3 [ 96844 ] | MariaDB v4 [ 133959 ] |