MDEV-20924 Unify grammar rules: field_type_string and sp_param_field_type_string
In order to: - unify sql_yacc.yy and sql_yacc_ora.yy easier - move more functionality from the parser to Type_handler (so plugins can override the behavior) this patch: - removes rules sp_param_field_type_string and sp_param_field_type from sql_yacc_ora.yy - adds a new virtial method Type_handler::Column_definition_set_attributes()
This commit is contained in:
parent
0ccfdc8eff
commit
f2cff12556
17
sql/field.cc
17
sql/field.cc
@ -10073,17 +10073,26 @@ bool Column_definition::prepare_interval_field(MEM_ROOT *mem_root,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Column_definition::set_attributes(const Lex_field_type_st &type,
|
bool Column_definition::set_attributes(THD *thd,
|
||||||
CHARSET_INFO *cs)
|
const Lex_field_type_st &def,
|
||||||
|
CHARSET_INFO *cs,
|
||||||
|
column_definition_type_t type)
|
||||||
{
|
{
|
||||||
DBUG_ASSERT(type_handler() == &type_handler_null);
|
DBUG_ASSERT(type_handler() == &type_handler_null);
|
||||||
DBUG_ASSERT(charset == &my_charset_bin || charset == NULL);
|
DBUG_ASSERT(charset == &my_charset_bin || charset == NULL);
|
||||||
DBUG_ASSERT(length == 0);
|
DBUG_ASSERT(length == 0);
|
||||||
DBUG_ASSERT(decimals == 0);
|
DBUG_ASSERT(decimals == 0);
|
||||||
|
|
||||||
set_handler(type.type_handler());
|
set_handler(def.type_handler());
|
||||||
charset= cs;
|
return type_handler()->Column_definition_set_attributes(thd, this,
|
||||||
|
def, cs, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Column_definition_attributes::set_length_and_dec(const Lex_length_and_dec_st
|
||||||
|
&type)
|
||||||
|
{
|
||||||
if (type.length())
|
if (type.length())
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
@ -4862,6 +4862,7 @@ public:
|
|||||||
bool frm_unpack_numeric_with_dec(TABLE_SHARE *share, const uchar *buff);
|
bool frm_unpack_numeric_with_dec(TABLE_SHARE *share, const uchar *buff);
|
||||||
bool frm_unpack_temporal_with_dec(TABLE_SHARE *share, uint intlen,
|
bool frm_unpack_temporal_with_dec(TABLE_SHARE *share, uint intlen,
|
||||||
const uchar *buff);
|
const uchar *buff);
|
||||||
|
void set_length_and_dec(const Lex_length_and_dec_st &attr);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -4964,7 +4965,10 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
Column_definition(THD *thd, Field *field, Field *orig_field);
|
Column_definition(THD *thd, Field *field, Field *orig_field);
|
||||||
void set_attributes(const Lex_field_type_st &type, CHARSET_INFO *cs);
|
bool set_attributes(THD *thd,
|
||||||
|
const Lex_field_type_st &attr,
|
||||||
|
CHARSET_INFO *cs,
|
||||||
|
column_definition_type_t type);
|
||||||
void create_length_to_internal_length_null()
|
void create_length_to_internal_length_null()
|
||||||
{
|
{
|
||||||
DBUG_ASSERT(length == 0);
|
DBUG_ASSERT(length == 0);
|
||||||
|
@ -5580,9 +5580,22 @@ sp_variable *LEX::sp_param_init(LEX_CSTRING *name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool LEX::sp_param_fill_definition(sp_variable *spvar)
|
bool LEX::sp_param_fill_definition(sp_variable *spvar,
|
||||||
|
const Lex_field_type_st &def)
|
||||||
{
|
{
|
||||||
return sphead->fill_spvar_definition(thd, last_field, &spvar->name);
|
return
|
||||||
|
last_field->set_attributes(thd, def, charset,
|
||||||
|
COLUMN_DEFINITION_ROUTINE_PARAM) ||
|
||||||
|
sphead->fill_spvar_definition(thd, last_field, &spvar->name);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool LEX::sf_return_fill_definition(const Lex_field_type_st &def)
|
||||||
|
{
|
||||||
|
return
|
||||||
|
last_field->set_attributes(thd, def, charset,
|
||||||
|
COLUMN_DEFINITION_FUNCTION_RETURN) ||
|
||||||
|
sphead->fill_field_definition(thd, last_field);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -3742,7 +3742,9 @@ public:
|
|||||||
bool sp_proc_stmt_statement_finalize(THD *, bool no_lookahead);
|
bool sp_proc_stmt_statement_finalize(THD *, bool no_lookahead);
|
||||||
|
|
||||||
sp_variable *sp_param_init(LEX_CSTRING *name);
|
sp_variable *sp_param_init(LEX_CSTRING *name);
|
||||||
bool sp_param_fill_definition(sp_variable *spvar);
|
bool sp_param_fill_definition(sp_variable *spvar,
|
||||||
|
const Lex_field_type_st &def);
|
||||||
|
bool sf_return_fill_definition(const Lex_field_type_st &def);
|
||||||
|
|
||||||
int case_stmt_action_expr(Item* expr);
|
int case_stmt_action_expr(Item* expr);
|
||||||
int case_stmt_action_when(Item *when, bool simple);
|
int case_stmt_action_when(Item *when, bool simple);
|
||||||
|
102
sql/sql_type.cc
102
sql/sql_type.cc
@ -2832,6 +2832,108 @@ bool Type_handler::
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************/
|
||||||
|
|
||||||
|
bool
|
||||||
|
Type_handler::Column_definition_set_attributes(THD *thd,
|
||||||
|
Column_definition *def,
|
||||||
|
const Lex_field_type_st &attr,
|
||||||
|
CHARSET_INFO *cs,
|
||||||
|
column_definition_type_t type)
|
||||||
|
const
|
||||||
|
{
|
||||||
|
def->charset= cs;
|
||||||
|
def->set_length_and_dec(attr);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
In sql_mode=ORACLE, real size of VARCHAR and CHAR with no length
|
||||||
|
in SP parameters is fixed at runtime with the length of real args.
|
||||||
|
Let's translate VARCHAR to VARCHAR(4000) for return value.
|
||||||
|
|
||||||
|
Since Oracle 9, maximum size for VARCHAR in PL/SQL is 32767.
|
||||||
|
|
||||||
|
In MariaDB the limit for VARCHAR is 65535 bytes.
|
||||||
|
We could translate VARCHAR with no length to VARCHAR(65535), but
|
||||||
|
it would mean that for multi-byte character sets we'd have to translate
|
||||||
|
VARCHAR to MEDIUMTEXT, to guarantee 65535 characters.
|
||||||
|
|
||||||
|
Also we could translate VARCHAR to VARCHAR(16383), where 16383 is
|
||||||
|
the maximum possible length in characters in case of mbmaxlen=4
|
||||||
|
(e.g. utf32, utf16, utf8mb4). However, we'll have character sets with
|
||||||
|
mbmaxlen=5 soon (e.g. gb18030).
|
||||||
|
*/
|
||||||
|
|
||||||
|
bool
|
||||||
|
Type_handler_string::Column_definition_set_attributes(
|
||||||
|
THD *thd,
|
||||||
|
Column_definition *def,
|
||||||
|
const Lex_field_type_st &attr,
|
||||||
|
CHARSET_INFO *cs,
|
||||||
|
column_definition_type_t type)
|
||||||
|
const
|
||||||
|
{
|
||||||
|
Type_handler::Column_definition_set_attributes(thd, def, attr, cs, type);
|
||||||
|
if (attr.length())
|
||||||
|
return false;
|
||||||
|
switch (type) {
|
||||||
|
case COLUMN_DEFINITION_ROUTINE_PARAM:
|
||||||
|
case COLUMN_DEFINITION_FUNCTION_RETURN:
|
||||||
|
if (thd->variables.sql_mode & MODE_ORACLE)
|
||||||
|
{
|
||||||
|
// See Type_handler_varchar::Column_definition_set_attributes()
|
||||||
|
def->length= def->decimals= 2000;
|
||||||
|
def->set_handler(&type_handler_varchar);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case COLUMN_DEFINITION_ROUTINE_LOCAL:
|
||||||
|
case COLUMN_DEFINITION_TABLE_FIELD:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
def->length= 1;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
Type_handler_varchar::Column_definition_set_attributes(
|
||||||
|
THD *thd,
|
||||||
|
Column_definition *def,
|
||||||
|
const Lex_field_type_st &attr,
|
||||||
|
CHARSET_INFO *cs,
|
||||||
|
column_definition_type_t type)
|
||||||
|
const
|
||||||
|
{
|
||||||
|
Type_handler::Column_definition_set_attributes(thd, def, attr, cs, type);
|
||||||
|
if (attr.length())
|
||||||
|
return false;
|
||||||
|
switch (type) {
|
||||||
|
case COLUMN_DEFINITION_ROUTINE_PARAM:
|
||||||
|
case COLUMN_DEFINITION_FUNCTION_RETURN:
|
||||||
|
if (thd->variables.sql_mode & MODE_ORACLE)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
Type_handler_varchar::adjust_spparam_type() tests "decimals"
|
||||||
|
to detect if the formal parameter length needs to be adjusted to
|
||||||
|
the actual parameter length. Non-zero decimals means that the length
|
||||||
|
was set implicitly to the default value and needs to be adjusted.
|
||||||
|
*/
|
||||||
|
def->length= def->decimals= 4000;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case COLUMN_DEFINITION_ROUTINE_LOCAL:
|
||||||
|
case COLUMN_DEFINITION_TABLE_FIELD:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
thd->parse_error();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
bool Type_handler_null::
|
bool Type_handler_null::
|
||||||
Column_definition_fix_attributes(Column_definition *def) const
|
Column_definition_fix_attributes(Column_definition *def) const
|
||||||
|
@ -127,6 +127,15 @@ enum partition_value_print_mode_t
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
enum column_definition_type_t
|
||||||
|
{
|
||||||
|
COLUMN_DEFINITION_TABLE_FIELD,
|
||||||
|
COLUMN_DEFINITION_ROUTINE_PARAM,
|
||||||
|
COLUMN_DEFINITION_ROUTINE_LOCAL,
|
||||||
|
COLUMN_DEFINITION_FUNCTION_RETURN
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
class Data_type_statistics
|
class Data_type_statistics
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -3620,6 +3629,13 @@ public:
|
|||||||
virtual bool Column_definition_validate_check_constraint(THD *thd,
|
virtual bool Column_definition_validate_check_constraint(THD *thd,
|
||||||
Column_definition *c)
|
Column_definition *c)
|
||||||
const;
|
const;
|
||||||
|
// Set attributes in the parser
|
||||||
|
virtual bool Column_definition_set_attributes(THD *thd,
|
||||||
|
Column_definition *def,
|
||||||
|
const Lex_field_type_st &attr,
|
||||||
|
CHARSET_INFO *cs,
|
||||||
|
column_definition_type_t type)
|
||||||
|
const;
|
||||||
// Fix attributes after the parser
|
// Fix attributes after the parser
|
||||||
virtual bool Column_definition_fix_attributes(Column_definition *c) const= 0;
|
virtual bool Column_definition_fix_attributes(Column_definition *c) const= 0;
|
||||||
/*
|
/*
|
||||||
@ -6488,6 +6504,12 @@ public:
|
|||||||
Field *make_conversion_table_field(MEM_ROOT *root,
|
Field *make_conversion_table_field(MEM_ROOT *root,
|
||||||
TABLE *table, uint metadata,
|
TABLE *table, uint metadata,
|
||||||
const Field *target) const override;
|
const Field *target) const override;
|
||||||
|
bool Column_definition_set_attributes(THD *thd,
|
||||||
|
Column_definition *def,
|
||||||
|
const Lex_field_type_st &attr,
|
||||||
|
CHARSET_INFO *cs,
|
||||||
|
column_definition_type_t type)
|
||||||
|
const override;
|
||||||
bool Column_definition_fix_attributes(Column_definition *c) const override;
|
bool Column_definition_fix_attributes(Column_definition *c) const override;
|
||||||
bool Column_definition_prepare_stage2(Column_definition *c,
|
bool Column_definition_prepare_stage2(Column_definition *c,
|
||||||
handler *file,
|
handler *file,
|
||||||
@ -6581,6 +6603,12 @@ public:
|
|||||||
Field *make_conversion_table_field(MEM_ROOT *root,
|
Field *make_conversion_table_field(MEM_ROOT *root,
|
||||||
TABLE *table, uint metadata,
|
TABLE *table, uint metadata,
|
||||||
const Field *target) const override;
|
const Field *target) const override;
|
||||||
|
bool Column_definition_set_attributes(THD *thd,
|
||||||
|
Column_definition *def,
|
||||||
|
const Lex_field_type_st &attr,
|
||||||
|
CHARSET_INFO *cs,
|
||||||
|
column_definition_type_t type)
|
||||||
|
const override;
|
||||||
bool Column_definition_fix_attributes(Column_definition *c) const override;
|
bool Column_definition_fix_attributes(Column_definition *c) const override;
|
||||||
bool Column_definition_prepare_stage2(Column_definition *c,
|
bool Column_definition_prepare_stage2(Column_definition *c,
|
||||||
handler *file,
|
handler *file,
|
||||||
|
@ -1830,7 +1830,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize);
|
|||||||
wild_and_where
|
wild_and_where
|
||||||
|
|
||||||
%type <const_simple_string>
|
%type <const_simple_string>
|
||||||
field_length opt_field_length opt_field_length_default_1
|
field_length opt_field_length
|
||||||
opt_compression_method
|
opt_compression_method
|
||||||
|
|
||||||
%type <string>
|
%type <string>
|
||||||
@ -3422,7 +3422,7 @@ sp_param_name:
|
|||||||
sp_param_name_and_type:
|
sp_param_name_and_type:
|
||||||
sp_param_name type_with_opt_collate
|
sp_param_name type_with_opt_collate
|
||||||
{
|
{
|
||||||
if (unlikely(Lex->sp_param_fill_definition($$= $1)))
|
if (unlikely(Lex->sp_param_fill_definition($$= $1, $2)))
|
||||||
MYSQL_YYABORT;
|
MYSQL_YYABORT;
|
||||||
}
|
}
|
||||||
| sp_param_name TYPE_SYM OF_SYM ident '.' ident
|
| sp_param_name TYPE_SYM OF_SYM ident '.' ident
|
||||||
@ -3551,6 +3551,10 @@ row_field_name:
|
|||||||
|
|
||||||
row_field_definition:
|
row_field_definition:
|
||||||
row_field_name type_with_opt_collate
|
row_field_name type_with_opt_collate
|
||||||
|
{
|
||||||
|
Lex->last_field->set_attributes(thd, $2, Lex->charset,
|
||||||
|
COLUMN_DEFINITION_ROUTINE_LOCAL);
|
||||||
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
row_field_definition_list:
|
row_field_definition_list:
|
||||||
@ -3580,11 +3584,15 @@ sp_decl_idents_init_vars:
|
|||||||
sp_decl_variable_list:
|
sp_decl_variable_list:
|
||||||
sp_decl_idents_init_vars
|
sp_decl_idents_init_vars
|
||||||
type_with_opt_collate
|
type_with_opt_collate
|
||||||
|
{
|
||||||
|
Lex->last_field->set_attributes(thd, $2, Lex->charset,
|
||||||
|
COLUMN_DEFINITION_ROUTINE_LOCAL);
|
||||||
|
}
|
||||||
sp_opt_default
|
sp_opt_default
|
||||||
{
|
{
|
||||||
if (unlikely(Lex->sp_variable_declarations_finalize(thd, $1,
|
if (unlikely(Lex->sp_variable_declarations_finalize(thd, $1,
|
||||||
&Lex->last_field[0],
|
&Lex->last_field[0],
|
||||||
$3)))
|
$4)))
|
||||||
MYSQL_YYABORT;
|
MYSQL_YYABORT;
|
||||||
$$.init_using_vars($1);
|
$$.init_using_vars($1);
|
||||||
}
|
}
|
||||||
@ -6680,7 +6688,11 @@ field_spec:
|
|||||||
;
|
;
|
||||||
|
|
||||||
field_type_or_serial:
|
field_type_or_serial:
|
||||||
field_type { Lex->last_field->set_attributes($1, Lex->charset); }
|
field_type
|
||||||
|
{
|
||||||
|
Lex->last_field->set_attributes(thd, $1, Lex->charset,
|
||||||
|
COLUMN_DEFINITION_TABLE_FIELD);
|
||||||
|
}
|
||||||
field_def
|
field_def
|
||||||
| SERIAL_SYM
|
| SERIAL_SYM
|
||||||
{
|
{
|
||||||
@ -6898,7 +6910,7 @@ field_type_numeric:
|
|||||||
$$.set(&type_handler_float);
|
$$.set(&type_handler_float);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
| BIT_SYM opt_field_length_default_1
|
| BIT_SYM opt_field_length
|
||||||
{
|
{
|
||||||
$$.set(&type_handler_bit, $2);
|
$$.set(&type_handler_bit, $2);
|
||||||
}
|
}
|
||||||
@ -6934,39 +6946,39 @@ opt_binary_and_compression:
|
|||||||
;
|
;
|
||||||
|
|
||||||
field_type_string:
|
field_type_string:
|
||||||
char opt_field_length_default_1 opt_binary
|
char opt_field_length opt_binary
|
||||||
{
|
{
|
||||||
$$.set(&type_handler_string, $2);
|
$$.set(&type_handler_string, $2);
|
||||||
}
|
}
|
||||||
| nchar opt_field_length_default_1 opt_bin_mod
|
| nchar opt_field_length opt_bin_mod
|
||||||
{
|
{
|
||||||
$$.set(&type_handler_string, $2);
|
$$.set(&type_handler_string, $2);
|
||||||
bincmp_collation(national_charset_info, $3);
|
bincmp_collation(national_charset_info, $3);
|
||||||
}
|
}
|
||||||
| BINARY opt_field_length_default_1
|
| BINARY opt_field_length
|
||||||
{
|
{
|
||||||
Lex->charset=&my_charset_bin;
|
Lex->charset=&my_charset_bin;
|
||||||
$$.set(&type_handler_string, $2);
|
$$.set(&type_handler_string, $2);
|
||||||
}
|
}
|
||||||
| varchar field_length opt_binary_and_compression
|
| varchar opt_field_length opt_binary_and_compression
|
||||||
{
|
{
|
||||||
$$.set(&type_handler_varchar, $2);
|
$$.set(&type_handler_varchar, $2);
|
||||||
}
|
}
|
||||||
| VARCHAR2_ORACLE_SYM field_length opt_binary_and_compression
|
| VARCHAR2_ORACLE_SYM opt_field_length opt_binary_and_compression
|
||||||
{
|
{
|
||||||
$$.set(&type_handler_varchar, $2);
|
$$.set(&type_handler_varchar, $2);
|
||||||
}
|
}
|
||||||
| nvarchar field_length opt_compressed opt_bin_mod
|
| nvarchar opt_field_length opt_compressed opt_bin_mod
|
||||||
{
|
{
|
||||||
$$.set(&type_handler_varchar, $2);
|
$$.set(&type_handler_varchar, $2);
|
||||||
bincmp_collation(national_charset_info, $4);
|
bincmp_collation(national_charset_info, $4);
|
||||||
}
|
}
|
||||||
| VARBINARY field_length opt_compressed
|
| VARBINARY opt_field_length opt_compressed
|
||||||
{
|
{
|
||||||
Lex->charset=&my_charset_bin;
|
Lex->charset=&my_charset_bin;
|
||||||
$$.set(&type_handler_varchar, $2);
|
$$.set(&type_handler_varchar, $2);
|
||||||
}
|
}
|
||||||
| RAW_ORACLE_SYM field_length opt_compressed
|
| RAW_ORACLE_SYM opt_field_length opt_compressed
|
||||||
{
|
{
|
||||||
Lex->charset= &my_charset_bin;
|
Lex->charset= &my_charset_bin;
|
||||||
$$.set(&type_handler_varchar, $2);
|
$$.set(&type_handler_varchar, $2);
|
||||||
@ -7181,11 +7193,6 @@ opt_field_length:
|
|||||||
| field_length { $$= $1; }
|
| field_length { $$= $1; }
|
||||||
;
|
;
|
||||||
|
|
||||||
opt_field_length_default_1:
|
|
||||||
/* empty */ { $$= (char*) "1"; }
|
|
||||||
| field_length { $$= $1; }
|
|
||||||
;
|
|
||||||
|
|
||||||
opt_precision:
|
opt_precision:
|
||||||
/* empty */ { $$.set(0, 0); }
|
/* empty */ { $$.set(0, 0); }
|
||||||
| precision { $$= $1; }
|
| precision { $$= $1; }
|
||||||
@ -7343,7 +7350,6 @@ type_with_opt_collate:
|
|||||||
if (unlikely(!(Lex->charset= merge_charset_and_collation(Lex->charset, $2))))
|
if (unlikely(!(Lex->charset= merge_charset_and_collation(Lex->charset, $2))))
|
||||||
MYSQL_YYABORT;
|
MYSQL_YYABORT;
|
||||||
}
|
}
|
||||||
Lex->last_field->set_attributes($1, Lex->charset);
|
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
@ -18299,8 +18305,7 @@ sf_return_type:
|
|||||||
}
|
}
|
||||||
type_with_opt_collate
|
type_with_opt_collate
|
||||||
{
|
{
|
||||||
if (unlikely(Lex->sphead->fill_field_definition(thd,
|
if (unlikely(Lex->sf_return_fill_definition($3)))
|
||||||
Lex->last_field)))
|
|
||||||
MYSQL_YYABORT;
|
MYSQL_YYABORT;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
@ -1302,7 +1302,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize);
|
|||||||
wild_and_where
|
wild_and_where
|
||||||
|
|
||||||
%type <const_simple_string>
|
%type <const_simple_string>
|
||||||
field_length opt_field_length opt_field_length_default_1
|
field_length opt_field_length
|
||||||
opt_compression_method
|
opt_compression_method
|
||||||
|
|
||||||
%type <string>
|
%type <string>
|
||||||
@ -1311,9 +1311,6 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize);
|
|||||||
%type <type_handler> int_type real_type
|
%type <type_handler> int_type real_type
|
||||||
|
|
||||||
%type <Lex_field_type> type_with_opt_collate field_type
|
%type <Lex_field_type> type_with_opt_collate field_type
|
||||||
sp_param_type_with_opt_collate
|
|
||||||
sp_param_field_type
|
|
||||||
sp_param_field_type_string
|
|
||||||
field_type_numeric
|
field_type_numeric
|
||||||
field_type_string
|
field_type_string
|
||||||
field_type_lob
|
field_type_lob
|
||||||
@ -1478,8 +1475,6 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize);
|
|||||||
%type <Lex_cast_type> cast_type cast_type_numeric cast_type_temporal
|
%type <Lex_cast_type> cast_type cast_type_numeric cast_type_temporal
|
||||||
|
|
||||||
%type <Lex_length_and_dec> precision opt_precision float_options
|
%type <Lex_length_and_dec> precision opt_precision float_options
|
||||||
opt_field_length_default_sp_param_varchar
|
|
||||||
opt_field_length_default_sp_param_char
|
|
||||||
|
|
||||||
%type <lex_user> user grant_user grant_role user_or_role current_role
|
%type <lex_user> user grant_user grant_role user_or_role current_role
|
||||||
admin_option_for_role user_maybe_role
|
admin_option_for_role user_maybe_role
|
||||||
@ -3214,9 +3209,9 @@ sp_param_name:
|
|||||||
;
|
;
|
||||||
|
|
||||||
sp_param_name_and_type:
|
sp_param_name_and_type:
|
||||||
sp_param_name sp_param_type_with_opt_collate
|
sp_param_name type_with_opt_collate
|
||||||
{
|
{
|
||||||
if (unlikely(Lex->sp_param_fill_definition($$= $1)))
|
if (unlikely(Lex->sp_param_fill_definition($$= $1, $2)))
|
||||||
MYSQL_YYABORT;
|
MYSQL_YYABORT;
|
||||||
}
|
}
|
||||||
| sp_param_name sp_decl_ident '.' ident PERCENT_ORACLE_SYM TYPE_SYM
|
| sp_param_name sp_decl_ident '.' ident PERCENT_ORACLE_SYM TYPE_SYM
|
||||||
@ -3258,10 +3253,10 @@ sp_pdparams:
|
|||||||
;
|
;
|
||||||
|
|
||||||
sp_pdparam:
|
sp_pdparam:
|
||||||
sp_param_name sp_opt_inout sp_param_type_with_opt_collate
|
sp_param_name sp_opt_inout type_with_opt_collate
|
||||||
{
|
{
|
||||||
$1->mode= $2;
|
$1->mode= $2;
|
||||||
if (unlikely(Lex->sp_param_fill_definition($1)))
|
if (unlikely(Lex->sp_param_fill_definition($1, $3)))
|
||||||
MYSQL_YYABORT;
|
MYSQL_YYABORT;
|
||||||
}
|
}
|
||||||
| sp_param_name sp_opt_inout sp_decl_ident '.' ident PERCENT_ORACLE_SYM TYPE_SYM
|
| sp_param_name sp_opt_inout sp_decl_ident '.' ident PERCENT_ORACLE_SYM TYPE_SYM
|
||||||
@ -3428,6 +3423,10 @@ row_field_name:
|
|||||||
|
|
||||||
row_field_definition:
|
row_field_definition:
|
||||||
row_field_name type_with_opt_collate
|
row_field_name type_with_opt_collate
|
||||||
|
{
|
||||||
|
Lex->last_field->set_attributes(thd, $2, Lex->charset,
|
||||||
|
COLUMN_DEFINITION_ROUTINE_LOCAL);
|
||||||
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
row_field_definition_list:
|
row_field_definition_list:
|
||||||
@ -3457,11 +3456,15 @@ sp_decl_idents_init_vars:
|
|||||||
sp_decl_vars:
|
sp_decl_vars:
|
||||||
sp_decl_idents_init_vars
|
sp_decl_idents_init_vars
|
||||||
type_with_opt_collate
|
type_with_opt_collate
|
||||||
|
{
|
||||||
|
Lex->last_field->set_attributes(thd, $2, Lex->charset,
|
||||||
|
COLUMN_DEFINITION_ROUTINE_LOCAL);
|
||||||
|
}
|
||||||
sp_opt_default
|
sp_opt_default
|
||||||
{
|
{
|
||||||
if (unlikely(Lex->sp_variable_declarations_finalize(thd, $1,
|
if (unlikely(Lex->sp_variable_declarations_finalize(thd, $1,
|
||||||
&Lex->last_field[0],
|
&Lex->last_field[0],
|
||||||
$3)))
|
$4)))
|
||||||
MYSQL_YYABORT;
|
MYSQL_YYABORT;
|
||||||
$$.init_using_vars($1);
|
$$.init_using_vars($1);
|
||||||
}
|
}
|
||||||
@ -6678,7 +6681,11 @@ field_spec:
|
|||||||
;
|
;
|
||||||
|
|
||||||
field_type_or_serial:
|
field_type_or_serial:
|
||||||
field_type { Lex->last_field->set_attributes($1, Lex->charset); }
|
field_type
|
||||||
|
{
|
||||||
|
Lex->last_field->set_attributes(thd, $1, Lex->charset,
|
||||||
|
COLUMN_DEFINITION_TABLE_FIELD);
|
||||||
|
}
|
||||||
field_def
|
field_def
|
||||||
| SERIAL_SYM
|
| SERIAL_SYM
|
||||||
{
|
{
|
||||||
@ -6874,31 +6881,6 @@ field_type:
|
|||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
sp_param_field_type:
|
|
||||||
field_type_numeric
|
|
||||||
| field_type_temporal
|
|
||||||
| sp_param_field_type_string
|
|
||||||
| field_type_lob
|
|
||||||
| field_type_misc
|
|
||||||
| IDENT_sys float_options srid_option
|
|
||||||
{
|
|
||||||
if (Lex->set_field_type_udt(&$$, $1, $2))
|
|
||||||
MYSQL_YYABORT;
|
|
||||||
}
|
|
||||||
| reserved_keyword_udt float_options srid_option
|
|
||||||
{
|
|
||||||
if (Lex->set_field_type_udt(&$$, $1, $2))
|
|
||||||
MYSQL_YYABORT;
|
|
||||||
}
|
|
||||||
| non_reserved_keyword_udt float_options srid_option
|
|
||||||
{
|
|
||||||
if (Lex->set_field_type_udt(&$$, $1, $2))
|
|
||||||
MYSQL_YYABORT;
|
|
||||||
}
|
|
||||||
;
|
|
||||||
|
|
||||||
|
|
||||||
field_type_numeric:
|
field_type_numeric:
|
||||||
int_type opt_field_length last_field_options
|
int_type opt_field_length last_field_options
|
||||||
{
|
{
|
||||||
@ -6921,7 +6903,7 @@ field_type_numeric:
|
|||||||
$$.set(&type_handler_float);
|
$$.set(&type_handler_float);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
| BIT_SYM opt_field_length_default_1
|
| BIT_SYM opt_field_length
|
||||||
{
|
{
|
||||||
$$.set(&type_handler_bit, $2);
|
$$.set(&type_handler_bit, $2);
|
||||||
}
|
}
|
||||||
@ -6957,87 +6939,45 @@ opt_binary_and_compression:
|
|||||||
;
|
;
|
||||||
|
|
||||||
field_type_string:
|
field_type_string:
|
||||||
char opt_field_length_default_1 opt_binary
|
char opt_field_length opt_binary
|
||||||
{
|
{
|
||||||
$$.set(&type_handler_string, $2);
|
$$.set(&type_handler_string, $2);
|
||||||
}
|
}
|
||||||
| nchar opt_field_length_default_1 opt_bin_mod
|
| nchar opt_field_length opt_bin_mod
|
||||||
{
|
{
|
||||||
$$.set(&type_handler_string, $2);
|
$$.set(&type_handler_string, $2);
|
||||||
bincmp_collation(national_charset_info, $3);
|
bincmp_collation(national_charset_info, $3);
|
||||||
}
|
}
|
||||||
| BINARY opt_field_length_default_1
|
| BINARY opt_field_length
|
||||||
{
|
{
|
||||||
Lex->charset=&my_charset_bin;
|
Lex->charset=&my_charset_bin;
|
||||||
$$.set(&type_handler_string, $2);
|
$$.set(&type_handler_string, $2);
|
||||||
}
|
}
|
||||||
| varchar field_length opt_binary_and_compression
|
| varchar opt_field_length opt_binary_and_compression
|
||||||
{
|
{
|
||||||
$$.set(&type_handler_varchar, $2);
|
$$.set(&type_handler_varchar, $2);
|
||||||
}
|
}
|
||||||
| VARCHAR2_ORACLE_SYM field_length opt_binary_and_compression
|
| VARCHAR2_ORACLE_SYM opt_field_length opt_binary_and_compression
|
||||||
{
|
{
|
||||||
$$.set(&type_handler_varchar, $2);
|
$$.set(&type_handler_varchar, $2);
|
||||||
}
|
}
|
||||||
| nvarchar field_length opt_compressed opt_bin_mod
|
| nvarchar opt_field_length opt_compressed opt_bin_mod
|
||||||
{
|
{
|
||||||
$$.set(&type_handler_varchar, $2);
|
$$.set(&type_handler_varchar, $2);
|
||||||
bincmp_collation(national_charset_info, $4);
|
bincmp_collation(national_charset_info, $4);
|
||||||
}
|
}
|
||||||
| VARBINARY field_length opt_compressed
|
| VARBINARY opt_field_length opt_compressed
|
||||||
{
|
{
|
||||||
Lex->charset=&my_charset_bin;
|
Lex->charset=&my_charset_bin;
|
||||||
$$.set(&type_handler_varchar, $2);
|
$$.set(&type_handler_varchar, $2);
|
||||||
}
|
}
|
||||||
| RAW_ORACLE_SYM field_length opt_compressed
|
| RAW_ORACLE_SYM opt_field_length opt_compressed
|
||||||
{
|
{
|
||||||
Lex->charset= &my_charset_bin;
|
Lex->charset= &my_charset_bin;
|
||||||
$$.set(&type_handler_varchar, $2);
|
$$.set(&type_handler_varchar, $2);
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
sp_param_field_type_string:
|
|
||||||
char opt_field_length_default_sp_param_char opt_binary
|
|
||||||
{
|
|
||||||
$$.set(&type_handler_varchar, $2);
|
|
||||||
}
|
|
||||||
| nchar opt_field_length_default_sp_param_char opt_bin_mod
|
|
||||||
{
|
|
||||||
$$.set(&type_handler_varchar, $2);
|
|
||||||
bincmp_collation(national_charset_info, $3);
|
|
||||||
}
|
|
||||||
| BINARY opt_field_length_default_sp_param_char
|
|
||||||
{
|
|
||||||
Lex->charset=&my_charset_bin;
|
|
||||||
$$.set(&type_handler_varchar, $2);
|
|
||||||
}
|
|
||||||
| varchar opt_field_length_default_sp_param_varchar opt_binary
|
|
||||||
{
|
|
||||||
$$.set(&type_handler_varchar, $2);
|
|
||||||
}
|
|
||||||
| VARCHAR2_ORACLE_SYM opt_field_length_default_sp_param_varchar opt_binary
|
|
||||||
{
|
|
||||||
$$.set(&type_handler_varchar, $2);
|
|
||||||
}
|
|
||||||
| nvarchar opt_field_length_default_sp_param_varchar opt_bin_mod
|
|
||||||
{
|
|
||||||
$$.set(&type_handler_varchar, $2);
|
|
||||||
bincmp_collation(national_charset_info, $3);
|
|
||||||
}
|
|
||||||
| VARBINARY opt_field_length_default_sp_param_varchar
|
|
||||||
{
|
|
||||||
Lex->charset= &my_charset_bin;
|
|
||||||
$$.set(&type_handler_varchar, $2);
|
|
||||||
}
|
|
||||||
| RAW_ORACLE_SYM opt_field_length_default_sp_param_varchar
|
|
||||||
{
|
|
||||||
Lex->charset= &my_charset_bin;
|
|
||||||
$$.set(&type_handler_varchar, $2);
|
|
||||||
}
|
|
||||||
;
|
|
||||||
|
|
||||||
|
|
||||||
field_type_temporal:
|
field_type_temporal:
|
||||||
YEAR_SYM opt_field_length last_field_options
|
YEAR_SYM opt_field_length last_field_options
|
||||||
{
|
{
|
||||||
@ -7246,38 +7186,6 @@ opt_field_length:
|
|||||||
| field_length { $$= $1; }
|
| field_length { $$= $1; }
|
||||||
;
|
;
|
||||||
|
|
||||||
opt_field_length_default_1:
|
|
||||||
/* empty */ { $$= (char*) "1"; }
|
|
||||||
| field_length { $$= $1; }
|
|
||||||
;
|
|
||||||
|
|
||||||
/*
|
|
||||||
In sql_mode=ORACLE, real size of VARCHAR and CHAR with no length
|
|
||||||
in SP parameters is fixed at runtime with the length of real args.
|
|
||||||
Let's translate VARCHAR to VARCHAR(4000) for return value.
|
|
||||||
|
|
||||||
Since Oracle 9, maximum size for VARCHAR in PL/SQL is 32767.
|
|
||||||
|
|
||||||
In MariaDB the limit for VARCHAR is 65535 bytes.
|
|
||||||
We could translate VARCHAR with no length to VARCHAR(65535), but
|
|
||||||
it would mean that for multi-byte character sets we'd have to translate
|
|
||||||
VARCHAR to MEDIUMTEXT, to guarantee 65535 characters.
|
|
||||||
|
|
||||||
Also we could translate VARCHAR to VARCHAR(16383), where 16383 is
|
|
||||||
the maximum possible length in characters in case of mbmaxlen=4
|
|
||||||
(e.g. utf32, utf16, utf8mb4). However, we'll have character sets with
|
|
||||||
mbmaxlen=5 soon (e.g. gb18030).
|
|
||||||
*/
|
|
||||||
opt_field_length_default_sp_param_varchar:
|
|
||||||
/* empty */ { $$.set("4000", "4000"); }
|
|
||||||
| field_length { $$.set($1, NULL); }
|
|
||||||
;
|
|
||||||
|
|
||||||
opt_field_length_default_sp_param_char:
|
|
||||||
/* empty */ { $$.set("2000", "2000"); }
|
|
||||||
| field_length { $$.set($1, NULL); }
|
|
||||||
;
|
|
||||||
|
|
||||||
opt_precision:
|
opt_precision:
|
||||||
/* empty */ { $$.set(0, 0); }
|
/* empty */ { $$.set(0, 0); }
|
||||||
| precision { $$= $1; }
|
| precision { $$= $1; }
|
||||||
@ -7435,20 +7343,6 @@ type_with_opt_collate:
|
|||||||
if (unlikely(!(Lex->charset= merge_charset_and_collation(Lex->charset, $2))))
|
if (unlikely(!(Lex->charset= merge_charset_and_collation(Lex->charset, $2))))
|
||||||
MYSQL_YYABORT;
|
MYSQL_YYABORT;
|
||||||
}
|
}
|
||||||
Lex->last_field->set_attributes($1, Lex->charset);
|
|
||||||
}
|
|
||||||
;
|
|
||||||
|
|
||||||
sp_param_type_with_opt_collate:
|
|
||||||
sp_param_field_type opt_collate
|
|
||||||
{
|
|
||||||
$$= $1;
|
|
||||||
if ($2)
|
|
||||||
{
|
|
||||||
if (unlikely(!(Lex->charset= merge_charset_and_collation(Lex->charset, $2))))
|
|
||||||
MYSQL_YYABORT;
|
|
||||||
}
|
|
||||||
Lex->last_field->set_attributes($1, Lex->charset);
|
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
@ -18529,10 +18423,9 @@ sf_return_type:
|
|||||||
&empty_clex_str,
|
&empty_clex_str,
|
||||||
thd->variables.collation_database);
|
thd->variables.collation_database);
|
||||||
}
|
}
|
||||||
sp_param_type_with_opt_collate
|
type_with_opt_collate
|
||||||
{
|
{
|
||||||
if (unlikely(Lex->sphead->fill_field_definition(thd,
|
if (unlikely(Lex->sf_return_fill_definition($2)))
|
||||||
Lex->last_field)))
|
|
||||||
MYSQL_YYABORT;
|
MYSQL_YYABORT;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user