Commit f5855ba0 authored by Alexander Barkov's avatar Alexander Barkov

MDEV-17664 Add sql_mode specific tokens for ':' and '%'

parent 8e6f1033
...@@ -1423,6 +1423,13 @@ int Lex_input_stream::lex_one_token(YYSTYPE *yylval, THD *thd) ...@@ -1423,6 +1423,13 @@ int Lex_input_stream::lex_one_token(YYSTYPE *yylval, THD *thd)
} }
/* Fall through */ /* Fall through */
case MY_LEX_CHAR: // Unknown or single char token case MY_LEX_CHAR: // Unknown or single char token
{
if (c == '%' && (m_thd->variables.sql_mode & MODE_ORACLE))
{
next_state= MY_LEX_START;
return PERCENT_ORACLE_SYM;
}
}
case MY_LEX_SKIP: // This should not happen case MY_LEX_SKIP: // This should not happen
if (c != ')') if (c != ')')
next_state= MY_LEX_START; // Allow signed numbers next_state= MY_LEX_START; // Allow signed numbers
...@@ -1861,8 +1868,13 @@ int Lex_input_stream::lex_one_token(YYSTYPE *yylval, THD *thd) ...@@ -1861,8 +1868,13 @@ int Lex_input_stream::lex_one_token(YYSTYPE *yylval, THD *thd)
case MY_LEX_SET_VAR: // Check if ':=' case MY_LEX_SET_VAR: // Check if ':='
if (yyPeek() != '=') if (yyPeek() != '=')
{ {
state= MY_LEX_CHAR; // Return ':' next_state= MY_LEX_START;
break; if (m_thd->variables.sql_mode & MODE_ORACLE)
{
yylval->kwd.set_keyword(m_tok_start, 1);
return COLON_ORACLE_SYM;
}
return (int) ':';
} }
yySkip(); yySkip();
return (SET_VAR); return (SET_VAR);
...@@ -6655,6 +6667,30 @@ Item *LEX::make_item_colon_ident_ident(THD *thd, ...@@ -6655,6 +6667,30 @@ Item *LEX::make_item_colon_ident_ident(THD *thd,
} }
Item *LEX::make_item_plsql_cursor_attr(THD *thd, const LEX_CSTRING *name,
plsql_cursor_attr_t attr)
{
uint offset;
if (unlikely(!spcont || !spcont->find_cursor(name, &offset, false)))
{
my_error(ER_SP_CURSOR_MISMATCH, MYF(0), name->str);
return NULL;
}
switch (attr) {
case PLSQL_CURSOR_ATTR_ISOPEN:
return new (thd->mem_root) Item_func_cursor_isopen(thd, name, offset);
case PLSQL_CURSOR_ATTR_FOUND:
return new (thd->mem_root) Item_func_cursor_found(thd, name, offset);
case PLSQL_CURSOR_ATTR_NOTFOUND:
return new (thd->mem_root) Item_func_cursor_notfound(thd, name, offset);
case PLSQL_CURSOR_ATTR_ROWCOUNT:
return new (thd->mem_root) Item_func_cursor_rowcount(thd, name, offset);
}
DBUG_ASSERT(0);
return NULL;
}
Item *LEX::make_item_sysvar(THD *thd, Item *LEX::make_item_sysvar(THD *thd,
enum_var_type type, enum_var_type type,
const LEX_CSTRING *name, const LEX_CSTRING *name,
......
...@@ -182,6 +182,16 @@ enum enum_view_suid ...@@ -182,6 +182,16 @@ enum enum_view_suid
VIEW_SUID_DEFAULT= 2 VIEW_SUID_DEFAULT= 2
}; };
enum plsql_cursor_attr_t
{
PLSQL_CURSOR_ATTR_ISOPEN,
PLSQL_CURSOR_ATTR_FOUND,
PLSQL_CURSOR_ATTR_NOTFOUND,
PLSQL_CURSOR_ATTR_ROWCOUNT
};
/* These may not be declared yet */ /* These may not be declared yet */
class Table_ident; class Table_ident;
class sql_exchange; class sql_exchange;
...@@ -3642,6 +3652,10 @@ struct LEX: public Query_tables_list ...@@ -3642,6 +3652,10 @@ struct LEX: public Query_tables_list
Item *make_item_colon_ident_ident(THD *thd, Item *make_item_colon_ident_ident(THD *thd,
const Lex_ident_cli_st *a, const Lex_ident_cli_st *a,
const Lex_ident_cli_st *b); const Lex_ident_cli_st *b);
// PLSQL: cursor%ISOPEN etc
Item *make_item_plsql_cursor_attr(THD *thd, const LEX_CSTRING *name,
plsql_cursor_attr_t attr);
// For "SELECT @@var", "SELECT @@var.field" // For "SELECT @@var", "SELECT @@var.field"
Item *make_item_sysvar(THD *thd, Item *make_item_sysvar(THD *thd,
enum_var_type type, enum_var_type type,
......
...@@ -790,11 +790,6 @@ Virtual_column_info *add_virtual_expression(THD *thd, Item *expr) ...@@ -790,11 +790,6 @@ Virtual_column_info *add_virtual_expression(THD *thd, Item *expr)
Lex_for_loop_st for_loop; Lex_for_loop_st for_loop;
Lex_for_loop_bounds_st for_loop_bounds; Lex_for_loop_bounds_st for_loop_bounds;
Lex_trim_st trim; Lex_trim_st trim;
struct
{
LEX_CSTRING name;
uint offset;
} sp_cursor_name_and_offset;
vers_history_point_t vers_history_point; vers_history_point_t vers_history_point;
/* pointers */ /* pointers */
...@@ -878,6 +873,7 @@ Virtual_column_info *add_virtual_expression(THD *thd, Item *expr) ...@@ -878,6 +873,7 @@ Virtual_column_info *add_virtual_expression(THD *thd, Item *expr)
DDL_options_st object_ddl_options; DDL_options_st object_ddl_options;
enum vers_sys_type_t vers_range_unit; enum vers_sys_type_t vers_range_unit;
enum Column_definition::enum_column_versioning vers_column_versioning; enum Column_definition::enum_column_versioning vers_column_versioning;
enum plsql_cursor_attr_t plsql_cursor_attr;
} }
%{ %{
...@@ -1104,6 +1100,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); ...@@ -1104,6 +1100,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize);
%token PARAM_MARKER %token PARAM_MARKER
%token PARSE_VCOL_EXPR_SYM %token PARSE_VCOL_EXPR_SYM
%token PARTITION_SYM /* SQL-2003-R */ %token PARTITION_SYM /* SQL-2003-R */
%token PERCENT_ORACLE_SYM /* INTERNAL */
%token PERCENT_RANK_SYM %token PERCENT_RANK_SYM
%token PERCENTILE_CONT_SYM %token PERCENTILE_CONT_SYM
%token PERCENTILE_DISC_SYM %token PERCENTILE_DISC_SYM
...@@ -1278,6 +1275,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); ...@@ -1278,6 +1275,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize);
%token <kwd> COALESCE /* SQL-2003-N */ %token <kwd> COALESCE /* SQL-2003-N */
%token <kwd> CODE_SYM %token <kwd> CODE_SYM
%token <kwd> COLLATION_SYM /* SQL-2003-N */ %token <kwd> COLLATION_SYM /* SQL-2003-N */
%token <kwd> COLON_ORACLE_SYM /* INTERNAL */
%token <kwd> COLUMNS %token <kwd> COLUMNS
%token <kwd> COLUMN_ADD_SYM %token <kwd> COLUMN_ADD_SYM
%token <kwd> COLUMN_CHECK_SYM %token <kwd> COLUMN_CHECK_SYM
...@@ -1933,7 +1931,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); ...@@ -1933,7 +1931,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize);
geometry_function signed_literal expr_or_literal geometry_function signed_literal expr_or_literal
opt_escape opt_escape
sp_opt_default sp_opt_default
simple_ident_nospvar simple_ident_q simple_ident_q2 simple_ident_nospvar
field_or_var limit_option field_or_var limit_option
part_func_expr part_func_expr
window_func_expr window_func_expr
...@@ -1942,6 +1940,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); ...@@ -1942,6 +1940,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize);
inverse_distribution_function inverse_distribution_function
percentile_function percentile_function
inverse_distribution_function_def inverse_distribution_function_def
explicit_cursor_attr
function_call_keyword function_call_keyword
function_call_keyword_timestamp function_call_keyword_timestamp
function_call_nonkeyword function_call_nonkeyword
...@@ -2144,6 +2143,8 @@ END_OF_INPUT ...@@ -2144,6 +2143,8 @@ END_OF_INPUT
%type <num> view_algorithm view_check_option %type <num> view_algorithm view_check_option
%type <view_suid> view_suid opt_view_suid %type <view_suid> view_suid opt_view_suid
%type <plsql_cursor_attr> plsql_cursor_attr
%type <num> sp_decl_idents sp_decl_idents_init_vars %type <num> sp_decl_idents sp_decl_idents_init_vars
%type <num> sp_handler_type sp_hcond_list %type <num> sp_handler_type sp_hcond_list
%type <spcondvalue> sp_cond sp_hcond sqlstate signal_value opt_signal_value %type <spcondvalue> sp_cond sp_hcond sqlstate signal_value opt_signal_value
...@@ -10095,6 +10096,23 @@ dyncall_create_list: ...@@ -10095,6 +10096,23 @@ dyncall_create_list:
} }
; ;
plsql_cursor_attr:
ISOPEN_SYM { $$= PLSQL_CURSOR_ATTR_ISOPEN; }
| FOUND_SYM { $$= PLSQL_CURSOR_ATTR_FOUND; }
| NOTFOUND_SYM { $$= PLSQL_CURSOR_ATTR_NOTFOUND; }
| ROWCOUNT_SYM { $$= PLSQL_CURSOR_ATTR_ROWCOUNT; }
;
explicit_cursor_attr:
ident PERCENT_ORACLE_SYM plsql_cursor_attr
{
if (unlikely(!($$= Lex->make_item_plsql_cursor_attr(thd, &$1, $3))))
MYSQL_YYABORT;
}
;
trim_operands: trim_operands:
expr { $$.set(TRIM_BOTH, $1); } expr { $$.set(TRIM_BOTH, $1); }
| LEADING expr FROM expr { $$.set(TRIM_LEADING, $2, $4); } | LEADING expr FROM expr { $$.set(TRIM_LEADING, $2, $4); }
...@@ -10258,6 +10276,7 @@ column_default_non_parenthesized_expr: ...@@ -10258,6 +10276,7 @@ column_default_non_parenthesized_expr:
primary_expr: primary_expr:
column_default_non_parenthesized_expr column_default_non_parenthesized_expr
| explicit_cursor_attr
| '(' parenthesized_expr ')' { $$= $2; } | '(' parenthesized_expr ')' { $$= $2; }
; ;
...@@ -10444,6 +10463,14 @@ function_call_keyword: ...@@ -10444,6 +10463,14 @@ function_call_keyword:
if (unlikely($$ == NULL)) if (unlikely($$ == NULL))
MYSQL_YYABORT; MYSQL_YYABORT;
} }
| SQL_SYM PERCENT_ORACLE_SYM ROWCOUNT_SYM
{
$$= new (thd->mem_root) Item_func_oracle_sql_rowcount(thd);
if (unlikely($$ == NULL))
MYSQL_YYABORT;
Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION);
Lex->safe_to_cache_query= 0;
}
| TIME_SYM '(' expr ')' | TIME_SYM '(' expr ')'
{ {
$$= new (thd->mem_root) Item_time_typecast(thd, $3, $$= new (thd->mem_root) Item_time_typecast(thd, $3,
...@@ -14956,6 +14983,19 @@ param_marker: ...@@ -14956,6 +14983,19 @@ param_marker:
YYLIP->get_tok_start() + 1)))) YYLIP->get_tok_start() + 1))))
MYSQL_YYABORT; MYSQL_YYABORT;
} }
| COLON_ORACLE_SYM ident_cli
{
if (unlikely(!($$= Lex->add_placeholder(thd, &null_clex_str,
$1.pos(), $2.end()))))
MYSQL_YYABORT;
}
| COLON_ORACLE_SYM NUM
{
if (unlikely(!($$= Lex->add_placeholder(thd, &null_clex_str,
$1.pos(),
YYLIP->get_ptr()))))
MYSQL_YYABORT;
}
; ;
signed_literal: signed_literal:
...@@ -15265,6 +15305,11 @@ simple_ident: ...@@ -15265,6 +15305,11 @@ simple_ident:
if (unlikely(!($$= Lex->create_item_ident(thd, &$1, &$3, &$5)))) if (unlikely(!($$= Lex->create_item_ident(thd, &$1, &$3, &$5))))
MYSQL_YYABORT; MYSQL_YYABORT;
} }
| COLON_ORACLE_SYM ident_cli '.' ident_cli
{
if (unlikely(!($$= Lex->make_item_colon_ident_ident(thd, &$2, &$4))))
MYSQL_YYABORT;
}
; ;
simple_ident_nospvar: simple_ident_nospvar:
...@@ -15273,20 +15318,17 @@ simple_ident_nospvar: ...@@ -15273,20 +15318,17 @@ simple_ident_nospvar:
if (unlikely(!($$= Lex->create_item_ident_nosp(thd, &$1)))) if (unlikely(!($$= Lex->create_item_ident_nosp(thd, &$1))))
MYSQL_YYABORT; MYSQL_YYABORT;
} }
| simple_ident_q { $$= $1; } | ident '.' ident
;
simple_ident_q:
ident '.' ident
{ {
if (unlikely(!($$= Lex->create_item_ident_nospvar(thd, &$1, &$3)))) if (unlikely(!($$= Lex->create_item_ident_nospvar(thd, &$1, &$3))))
MYSQL_YYABORT; MYSQL_YYABORT;
} }
| simple_ident_q2 | COLON_ORACLE_SYM ident_cli '.' ident_cli
; {
if (unlikely(!($$= Lex->make_item_colon_ident_ident(thd, &$2, &$4))))
simple_ident_q2: MYSQL_YYABORT;
'.' ident '.' ident }
| '.' ident '.' ident
{ {
Lex_ident_sys none; Lex_ident_sys none;
if (unlikely(!($$= Lex->create_item_ident(thd, &none, &$2, &$4)))) if (unlikely(!($$= Lex->create_item_ident(thd, &none, &$2, &$4))))
......
...@@ -183,11 +183,6 @@ void ORAerror(THD *thd, const char *s) ...@@ -183,11 +183,6 @@ void ORAerror(THD *thd, const char *s)
Lex_for_loop_st for_loop; Lex_for_loop_st for_loop;
Lex_for_loop_bounds_st for_loop_bounds; Lex_for_loop_bounds_st for_loop_bounds;
Lex_trim_st trim; Lex_trim_st trim;
struct
{
LEX_CSTRING name;
uint offset;
} sp_cursor_name_and_offset;
vers_history_point_t vers_history_point; vers_history_point_t vers_history_point;
/* pointers */ /* pointers */
...@@ -272,6 +267,7 @@ void ORAerror(THD *thd, const char *s) ...@@ -272,6 +267,7 @@ void ORAerror(THD *thd, const char *s)
DDL_options_st object_ddl_options; DDL_options_st object_ddl_options;
enum vers_sys_type_t vers_range_unit; enum vers_sys_type_t vers_range_unit;
enum Column_definition::enum_column_versioning vers_column_versioning; enum Column_definition::enum_column_versioning vers_column_versioning;
enum plsql_cursor_attr_t plsql_cursor_attr;
} }
%{ %{
...@@ -498,6 +494,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); ...@@ -498,6 +494,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize);
%token PARAM_MARKER %token PARAM_MARKER
%token PARSE_VCOL_EXPR_SYM %token PARSE_VCOL_EXPR_SYM
%token PARTITION_SYM /* SQL-2003-R */ %token PARTITION_SYM /* SQL-2003-R */
%token PERCENT_ORACLE_SYM /* INTERNAL */
%token PERCENT_RANK_SYM %token PERCENT_RANK_SYM
%token PERCENTILE_CONT_SYM %token PERCENTILE_CONT_SYM
%token PERCENTILE_DISC_SYM %token PERCENTILE_DISC_SYM
...@@ -672,6 +669,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); ...@@ -672,6 +669,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize);
%token <kwd> COALESCE /* SQL-2003-N */ %token <kwd> COALESCE /* SQL-2003-N */
%token <kwd> CODE_SYM %token <kwd> CODE_SYM
%token <kwd> COLLATION_SYM /* SQL-2003-N */ %token <kwd> COLLATION_SYM /* SQL-2003-N */
%token <kwd> COLON_ORACLE_SYM /* INTERNAL */
%token <kwd> COLUMNS %token <kwd> COLUMNS
%token <kwd> COLUMN_ADD_SYM %token <kwd> COLUMN_ADD_SYM
%token <kwd> COLUMN_CHECK_SYM %token <kwd> COLUMN_CHECK_SYM
...@@ -1081,7 +1079,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); ...@@ -1081,7 +1079,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize);
%left '&' %left '&'
%left SHIFT_LEFT SHIFT_RIGHT %left SHIFT_LEFT SHIFT_RIGHT
%left '-' '+' ORACLE_CONCAT_SYM %left '-' '+' ORACLE_CONCAT_SYM
%left '*' '/' DIV_SYM MOD_SYM %left '*' '/' '%' DIV_SYM MOD_SYM
%left '^' %left '^'
%left MYSQL_CONCAT_SYM %left MYSQL_CONCAT_SYM
%left NEG '~' NOT2_SYM BINARY %left NEG '~' NOT2_SYM BINARY
...@@ -1242,7 +1240,6 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); ...@@ -1242,7 +1240,6 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize);
remember_name remember_end remember_end_opt remember_name remember_end remember_end_opt
remember_tok_start remember_tok_end remember_tok_start remember_tok_end
wild_and_where wild_and_where
colon_with_pos
%type <const_simple_string> %type <const_simple_string>
field_length opt_field_length opt_field_length_default_1 field_length opt_field_length opt_field_length_default_1
...@@ -1551,6 +1548,8 @@ END_OF_INPUT ...@@ -1551,6 +1548,8 @@ END_OF_INPUT
%type <num> view_algorithm view_check_option %type <num> view_algorithm view_check_option
%type <view_suid> view_suid opt_view_suid %type <view_suid> view_suid opt_view_suid
%type <plsql_cursor_attr> plsql_cursor_attr
%type <sp_suid> sp_suid %type <sp_suid> sp_suid
%type <num> sp_decl_idents sp_decl_idents_init_vars %type <num> sp_decl_idents sp_decl_idents_init_vars
...@@ -1568,7 +1567,6 @@ END_OF_INPUT ...@@ -1568,7 +1567,6 @@ END_OF_INPUT
%type <spblock_handlers> sp_block_statements_and_exceptions %type <spblock_handlers> sp_block_statements_and_exceptions
%type <spblock_handlers> package_implementation_executable_section %type <spblock_handlers> package_implementation_executable_section
%type <sp_instr_addr> sp_instr_addr %type <sp_instr_addr> sp_instr_addr
%type <sp_cursor_name_and_offset> sp_cursor_name_and_offset
%type <num> opt_exception_clause exception_handlers %type <num> opt_exception_clause exception_handlers
%type <lex> remember_lex package_routine_lex %type <lex> remember_lex package_routine_lex
package_specification_function package_specification_function
...@@ -3058,22 +3056,22 @@ sp_param_name_and_type: ...@@ -3058,22 +3056,22 @@ sp_param_name_and_type:
if (unlikely(Lex->sp_param_fill_definition($$= $1))) if (unlikely(Lex->sp_param_fill_definition($$= $1)))
MYSQL_YYABORT; MYSQL_YYABORT;
} }
| sp_param_name sp_decl_ident '.' ident '%' TYPE_SYM | sp_param_name sp_decl_ident '.' ident PERCENT_ORACLE_SYM TYPE_SYM
{ {
if (unlikely(Lex->sphead->spvar_fill_type_reference(thd, $$= $1, $2, $4))) if (unlikely(Lex->sphead->spvar_fill_type_reference(thd, $$= $1, $2, $4)))
MYSQL_YYABORT; MYSQL_YYABORT;
} }
| sp_param_name sp_decl_ident '.' ident '.' ident '%' TYPE_SYM | sp_param_name sp_decl_ident '.' ident '.' ident PERCENT_ORACLE_SYM TYPE_SYM
{ {
if (unlikely(Lex->sphead->spvar_fill_type_reference(thd, $$= $1, $2, $4, $6))) if (unlikely(Lex->sphead->spvar_fill_type_reference(thd, $$= $1, $2, $4, $6)))
MYSQL_YYABORT; MYSQL_YYABORT;
} }
| sp_param_name sp_decl_ident '%' ROWTYPE_ORACLE_SYM | sp_param_name sp_decl_ident PERCENT_ORACLE_SYM ROWTYPE_ORACLE_SYM
{ {
if (unlikely(Lex->sphead->spvar_fill_table_rowtype_reference(thd, $$= $1, $2))) if (unlikely(Lex->sphead->spvar_fill_table_rowtype_reference(thd, $$= $1, $2)))
MYSQL_YYABORT; MYSQL_YYABORT;
} }
| sp_param_name sp_decl_ident '.' ident '%' ROWTYPE_ORACLE_SYM | sp_param_name sp_decl_ident '.' ident PERCENT_ORACLE_SYM ROWTYPE_ORACLE_SYM
{ {
if (unlikely(Lex->sphead->spvar_fill_table_rowtype_reference(thd, $$= $1, $2, $4))) if (unlikely(Lex->sphead->spvar_fill_table_rowtype_reference(thd, $$= $1, $2, $4)))
MYSQL_YYABORT; MYSQL_YYABORT;
...@@ -3103,25 +3101,25 @@ sp_pdparam: ...@@ -3103,25 +3101,25 @@ sp_pdparam:
if (unlikely(Lex->sp_param_fill_definition($1))) if (unlikely(Lex->sp_param_fill_definition($1)))
MYSQL_YYABORT; MYSQL_YYABORT;
} }
| sp_param_name sp_opt_inout sp_decl_ident '.' ident '%' TYPE_SYM | sp_param_name sp_opt_inout sp_decl_ident '.' ident PERCENT_ORACLE_SYM TYPE_SYM
{ {
$1->mode= $2; $1->mode= $2;
if (unlikely(Lex->sphead->spvar_fill_type_reference(thd, $1, $3, $5))) if (unlikely(Lex->sphead->spvar_fill_type_reference(thd, $1, $3, $5)))
MYSQL_YYABORT; MYSQL_YYABORT;
} }
| sp_param_name sp_opt_inout sp_decl_ident '.' ident '.' ident '%' TYPE_SYM | sp_param_name sp_opt_inout sp_decl_ident '.' ident '.' ident PERCENT_ORACLE_SYM TYPE_SYM
{ {
$1->mode= $2; $1->mode= $2;
if (unlikely(Lex->sphead->spvar_fill_type_reference(thd, $1, $3, $5, $7))) if (unlikely(Lex->sphead->spvar_fill_type_reference(thd, $1, $3, $5, $7)))
MYSQL_YYABORT; MYSQL_YYABORT;
} }
| sp_param_name sp_opt_inout sp_decl_ident '%' ROWTYPE_ORACLE_SYM | sp_param_name sp_opt_inout sp_decl_ident PERCENT_ORACLE_SYM ROWTYPE_ORACLE_SYM
{ {
$1->mode= $2; $1->mode= $2;
if (unlikely(Lex->sphead->spvar_fill_table_rowtype_reference(thd, $1, $3))) if (unlikely(Lex->sphead->spvar_fill_table_rowtype_reference(thd, $1, $3)))
MYSQL_YYABORT; MYSQL_YYABORT;
} }
| sp_param_name sp_opt_inout sp_decl_ident '.' ident '%' ROWTYPE_ORACLE_SYM | sp_param_name sp_opt_inout sp_decl_ident '.' ident PERCENT_ORACLE_SYM ROWTYPE_ORACLE_SYM
{ {
$1->mode= $2; $1->mode= $2;
if (unlikely(Lex->sphead->spvar_fill_table_rowtype_reference(thd, $1, $3, $5))) if (unlikely(Lex->sphead->spvar_fill_table_rowtype_reference(thd, $1, $3, $5)))
...@@ -3326,7 +3324,7 @@ sp_decl_vars: ...@@ -3326,7 +3324,7 @@ sp_decl_vars:
$$.init_using_vars($1); $$.init_using_vars($1);
} }
| sp_decl_idents_init_vars | sp_decl_idents_init_vars
optionally_qualified_column_ident '%' TYPE_SYM optionally_qualified_column_ident PERCENT_ORACLE_SYM TYPE_SYM
sp_opt_default sp_opt_default
{ {
if (unlikely(Lex->sp_variable_declarations_with_ref_finalize(thd, $1, $2, $5))) if (unlikely(Lex->sp_variable_declarations_with_ref_finalize(thd, $1, $2, $5)))
...@@ -3334,7 +3332,7 @@ sp_decl_vars: ...@@ -3334,7 +3332,7 @@ sp_decl_vars:
$$.init_using_vars($1); $$.init_using_vars($1);
} }
| sp_decl_idents_init_vars | sp_decl_idents_init_vars
optionally_qualified_column_ident '%' ROWTYPE_ORACLE_SYM optionally_qualified_column_ident PERCENT_ORACLE_SYM ROWTYPE_ORACLE_SYM
sp_opt_default sp_opt_default
{ {
if (unlikely(Lex->sp_variable_declarations_rowtype_finalize(thd, $1, $2, $5))) if (unlikely(Lex->sp_variable_declarations_rowtype_finalize(thd, $1, $2, $5)))
...@@ -9496,13 +9494,6 @@ select_item: ...@@ -9496,13 +9494,6 @@ select_item:
} }
; ;
colon_with_pos:
':'
{
$$= (char *) YYLIP->get_tok_start();
}
;
remember_tok_start: remember_tok_start:
{ {
$$= (char*) YYLIP->get_tok_start(); $$= (char*) YYLIP->get_tok_start();
...@@ -9932,6 +9923,12 @@ bit_expr: ...@@ -9932,6 +9923,12 @@ bit_expr:
if (unlikely($$ == NULL)) if (unlikely($$ == NULL))
MYSQL_YYABORT; MYSQL_YYABORT;
} }
| bit_expr '%' bit_expr %prec '%'
{
$$= new (thd->mem_root) Item_func_mod(thd, $1, $3);
if (unlikely($$ == NULL))
MYSQL_YYABORT;
}
| bit_expr DIV_SYM bit_expr %prec DIV_SYM | bit_expr DIV_SYM bit_expr %prec DIV_SYM
{ {
$$= new (thd->mem_root) Item_func_int_div(thd, $1, $3); $$= new (thd->mem_root) Item_func_int_div(thd, $1, $3);
...@@ -10068,44 +10065,23 @@ dyncall_create_list: ...@@ -10068,44 +10065,23 @@ dyncall_create_list:
} }
; ;
sp_cursor_name_and_offset:
ident plsql_cursor_attr:
{ ISOPEN_SYM { $$= PLSQL_CURSOR_ATTR_ISOPEN; }
LEX *lex= Lex; | FOUND_SYM { $$= PLSQL_CURSOR_ATTR_FOUND; }
$$.name= $1; | NOTFOUND_SYM { $$= PLSQL_CURSOR_ATTR_NOTFOUND; }
if (unlikely(!lex->spcont || | ROWCOUNT_SYM { $$= PLSQL_CURSOR_ATTR_ROWCOUNT; }
!lex->spcont->find_cursor(&$1, &$$.offset, false)))
my_yyabort_error((ER_SP_CURSOR_MISMATCH, MYF(0), $1.str));
}
; ;
explicit_cursor_attr: explicit_cursor_attr:
sp_cursor_name_and_offset '%' ISOPEN_SYM ident PERCENT_ORACLE_SYM plsql_cursor_attr
{
if (unlikely(!($$= new (thd->mem_root)
Item_func_cursor_isopen(thd, &$1.name, $1.offset))))
MYSQL_YYABORT;
}
| sp_cursor_name_and_offset '%' FOUND_SYM
{
if (unlikely(!($$= new (thd->mem_root)
Item_func_cursor_found(thd, &$1.name, $1.offset))))
MYSQL_YYABORT;
}
| sp_cursor_name_and_offset '%' NOTFOUND_SYM
{
if (unlikely(!($$= new (thd->mem_root)
Item_func_cursor_notfound(thd, &$1.name, $1.offset))))
MYSQL_YYABORT;
}
| sp_cursor_name_and_offset '%' ROWCOUNT_SYM
{ {
if (unlikely(!($$= new (thd->mem_root) if (unlikely(!($$= Lex->make_item_plsql_cursor_attr(thd, &$1, $3))))
Item_func_cursor_rowcount(thd, &$1.name, $1.offset))))
MYSQL_YYABORT; MYSQL_YYABORT;
} }
; ;
trim_operands: trim_operands:
expr { $$.set(TRIM_BOTH, $1); } expr { $$.set(TRIM_BOTH, $1); }
| LEADING expr FROM expr { $$.set(TRIM_LEADING, $2, $4); } | LEADING expr FROM expr { $$.set(TRIM_LEADING, $2, $4); }
...@@ -10456,7 +10432,7 @@ function_call_keyword: ...@@ -10456,7 +10432,7 @@ function_call_keyword:
if (unlikely($$ == NULL)) if (unlikely($$ == NULL))
MYSQL_YYABORT; MYSQL_YYABORT;
} }
| SQL_SYM '%' ROWCOUNT_SYM | SQL_SYM PERCENT_ORACLE_SYM ROWCOUNT_SYM
{ {
$$= new (thd->mem_root) Item_func_oracle_sql_rowcount(thd); $$= new (thd->mem_root) Item_func_oracle_sql_rowcount(thd);
if (unlikely($$ == NULL)) if (unlikely($$ == NULL))
...@@ -15006,16 +14982,17 @@ param_marker: ...@@ -15006,16 +14982,17 @@ param_marker:
YYLIP->get_tok_start() + 1)))) YYLIP->get_tok_start() + 1))))
MYSQL_YYABORT; MYSQL_YYABORT;
} }
| colon_with_pos ident_cli | COLON_ORACLE_SYM ident_cli
{ {
if (unlikely(!($$= Lex->add_placeholder(thd, &null_clex_str, if (unlikely(!($$= Lex->add_placeholder(thd, &null_clex_str,
$1, $2.end())))) $1.pos(), $2.end()))))
MYSQL_YYABORT; MYSQL_YYABORT;
} }
| colon_with_pos NUM | COLON_ORACLE_SYM NUM
{ {
if (unlikely(!($$= Lex->add_placeholder(thd, &null_clex_str, if (unlikely(!($$= Lex->add_placeholder(thd, &null_clex_str,
$1, YYLIP->get_ptr())))) $1.pos(),
YYLIP->get_ptr()))))
MYSQL_YYABORT; MYSQL_YYABORT;
} }
; ;
...@@ -15327,7 +15304,7 @@ simple_ident: ...@@ -15327,7 +15304,7 @@ simple_ident:
if (unlikely(!($$= Lex->create_item_ident(thd, &$1, &$3, &$5)))) if (unlikely(!($$= Lex->create_item_ident(thd, &$1, &$3, &$5))))
MYSQL_YYABORT; MYSQL_YYABORT;
} }
| colon_with_pos ident_cli '.' ident_cli | COLON_ORACLE_SYM ident_cli '.' ident_cli
{ {
if (unlikely(!($$= Lex->make_item_colon_ident_ident(thd, &$2, &$4)))) if (unlikely(!($$= Lex->make_item_colon_ident_ident(thd, &$2, &$4))))
MYSQL_YYABORT; MYSQL_YYABORT;
...@@ -15345,7 +15322,7 @@ simple_ident_nospvar: ...@@ -15345,7 +15322,7 @@ simple_ident_nospvar:
if (unlikely(!($$= Lex->create_item_ident_nospvar(thd, &$1, &$3)))) if (unlikely(!($$= Lex->create_item_ident_nospvar(thd, &$1, &$3))))
MYSQL_YYABORT; MYSQL_YYABORT;
} }
| colon_with_pos ident_cli '.' ident_cli | COLON_ORACLE_SYM ident_cli '.' ident_cli
{ {
if (unlikely(!($$= Lex->make_item_colon_ident_ident(thd, &$2, &$4)))) if (unlikely(!($$= Lex->make_item_colon_ident_ident(thd, &$2, &$4))))
MYSQL_YYABORT; MYSQL_YYABORT;
...@@ -16252,12 +16229,12 @@ set_assign: ...@@ -16252,12 +16229,12 @@ set_assign:
unlikely(lex->sphead->restore_lex(thd))) unlikely(lex->sphead->restore_lex(thd)))
MYSQL_YYABORT; MYSQL_YYABORT;
} }
| colon_with_pos ident '.' ident SET_VAR | COLON_ORACLE_SYM ident '.' ident SET_VAR
{ {
LEX *lex= Lex; LEX *lex= Lex;
if (unlikely(!lex->is_trigger_new_or_old_reference(&$2))) if (unlikely(!lex->is_trigger_new_or_old_reference(&$2)))
{ {
thd->parse_error(ER_SYNTAX_ERROR, $1); thd->parse_error(ER_SYNTAX_ERROR, $1.pos());
MYSQL_YYABORT; MYSQL_YYABORT;
} }
lex->set_stmt_init(); lex->set_stmt_init();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment