diff options
-rw-r--r-- | mysql-test/suite/binlog/r/binlog_stm_sp.result | 88 | ||||
-rw-r--r-- | mysql-test/suite/binlog/t/binlog_stm_sp.test | 41 | ||||
-rw-r--r-- | mysql-test/suite/compat/oracle/r/binlog_stm_sp.result | 33 | ||||
-rw-r--r-- | mysql-test/suite/compat/oracle/t/binlog_stm_sp.test | 23 | ||||
-rw-r--r-- | sql/sql_class.cc | 33 | ||||
-rw-r--r-- | sql/sql_class.h | 34 | ||||
-rw-r--r-- | sql/sql_lex.cc | 706 | ||||
-rw-r--r-- | sql/sql_lex.h | 211 | ||||
-rw-r--r-- | sql/sql_parse.cc | 26 | ||||
-rw-r--r-- | sql/sql_parse.h | 1 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 2017 | ||||
-rw-r--r-- | sql/sql_yacc_ora.yy | 2028 | ||||
-rw-r--r-- | sql/structs.h | 6 |
13 files changed, 2857 insertions, 2390 deletions
diff --git a/mysql-test/suite/binlog/r/binlog_stm_sp.result b/mysql-test/suite/binlog/r/binlog_stm_sp.result index 6c470517a93..2fbb1cbce2e 100644 --- a/mysql-test/suite/binlog/r/binlog_stm_sp.result +++ b/mysql-test/suite/binlog/r/binlog_stm_sp.result @@ -84,3 +84,91 @@ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; DROP TABLE `t1` /* generated by server */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; DROP PROCEDURE p1 +# +# MDEV-16020 SP variables inside GROUP BY..WITH ROLLUP break replication +# +FLUSH LOGS; +CREATE TABLE t1 (d DATE); +INSERT INTO t1 VALUES ('1985-05-13'),('1989-12-24'); +CREATE TABLE t2 (d DATE, c BIGINT); +BEGIN NOT ATOMIC +BEGIN +DECLARE var INT DEFAULT 10; +INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, var; +INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, var WITH ROLLUP; +END; +BEGIN +DECLARE atomic INT DEFAULT 20; +INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, atomic; +INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, atomic WITH ROLLUP; +INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, `atomic`; +INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, `atomic` WITH ROLLUP; +END; +BEGIN +DECLARE atomic ROW (atomic INT, xxx INT) DEFAULT (31,32); +INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, atomic.atomic; +INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, atomic.atomic WITH ROLLUP; +INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, `atomic`.`atomic`; +INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, `atomic`.`atomic` WITH ROLLUP; +INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, atomic.xxx; +INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, atomic.xxx WITH ROLLUP; +INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, `atomic`.`xxx`; +INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, `atomic`.`xxx` WITH ROLLUP; +END; +END; +$$ +DROP TABLE t1,t2; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000002 # Binlog_checkpoint # # master-bin.000002 +master-bin.000002 # Gtid # # GTID #-#-# +master-bin.000002 # Query # # use `test`; CREATE TABLE t1 (d DATE) +master-bin.000002 # Gtid # # BEGIN GTID #-#-# +master-bin.000002 # Query # # use `test`; INSERT INTO t1 VALUES ('1985-05-13'),('1989-12-24') +master-bin.000002 # Query # # COMMIT +master-bin.000002 # Gtid # # GTID #-#-# +master-bin.000002 # Query # # use `test`; CREATE TABLE t2 (d DATE, c BIGINT) +master-bin.000002 # Gtid # # BEGIN GTID #-#-# +master-bin.000002 # Query # # use `test`; INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, NAME_CONST('var',10) +master-bin.000002 # Query # # COMMIT +master-bin.000002 # Gtid # # BEGIN GTID #-#-# +master-bin.000002 # Query # # use `test`; INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, NAME_CONST('var',10) WITH ROLLUP +master-bin.000002 # Query # # COMMIT +master-bin.000002 # Gtid # # BEGIN GTID #-#-# +master-bin.000002 # Query # # use `test`; INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, NAME_CONST('atomic',20) +master-bin.000002 # Query # # COMMIT +master-bin.000002 # Gtid # # BEGIN GTID #-#-# +master-bin.000002 # Query # # use `test`; INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, NAME_CONST('atomic',20) WITH ROLLUP +master-bin.000002 # Query # # COMMIT +master-bin.000002 # Gtid # # BEGIN GTID #-#-# +master-bin.000002 # Query # # use `test`; INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, NAME_CONST('atomic',20) +master-bin.000002 # Query # # COMMIT +master-bin.000002 # Gtid # # BEGIN GTID #-#-# +master-bin.000002 # Query # # use `test`; INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, NAME_CONST('atomic',20) WITH ROLLUP +master-bin.000002 # Query # # COMMIT +master-bin.000002 # Gtid # # BEGIN GTID #-#-# +master-bin.000002 # Query # # use `test`; INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, NAME_CONST('atomic.atomic',31) +master-bin.000002 # Query # # COMMIT +master-bin.000002 # Gtid # # BEGIN GTID #-#-# +master-bin.000002 # Query # # use `test`; INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, NAME_CONST('atomic.atomic',31) WITH ROLLUP +master-bin.000002 # Query # # COMMIT +master-bin.000002 # Gtid # # BEGIN GTID #-#-# +master-bin.000002 # Query # # use `test`; INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, NAME_CONST('atomic.atomic',31) +master-bin.000002 # Query # # COMMIT +master-bin.000002 # Gtid # # BEGIN GTID #-#-# +master-bin.000002 # Query # # use `test`; INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, NAME_CONST('atomic.atomic',31) WITH ROLLUP +master-bin.000002 # Query # # COMMIT +master-bin.000002 # Gtid # # BEGIN GTID #-#-# +master-bin.000002 # Query # # use `test`; INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, NAME_CONST('atomic.xxx',32) +master-bin.000002 # Query # # COMMIT +master-bin.000002 # Gtid # # BEGIN GTID #-#-# +master-bin.000002 # Query # # use `test`; INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, NAME_CONST('atomic.xxx',32) WITH ROLLUP +master-bin.000002 # Query # # COMMIT +master-bin.000002 # Gtid # # BEGIN GTID #-#-# +master-bin.000002 # Query # # use `test`; INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, NAME_CONST('atomic.xxx',32) +master-bin.000002 # Query # # COMMIT +master-bin.000002 # Gtid # # BEGIN GTID #-#-# +master-bin.000002 # Query # # use `test`; INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, NAME_CONST('atomic.xxx',32) WITH ROLLUP +master-bin.000002 # Query # # COMMIT +master-bin.000002 # Gtid # # GTID #-#-# +master-bin.000002 # Query # # use `test`; DROP TABLE `t1`,`t2` /* generated by server */ diff --git a/mysql-test/suite/binlog/t/binlog_stm_sp.test b/mysql-test/suite/binlog/t/binlog_stm_sp.test index 095b4c7f699..047cab741ce 100644 --- a/mysql-test/suite/binlog/t/binlog_stm_sp.test +++ b/mysql-test/suite/binlog/t/binlog_stm_sp.test @@ -39,3 +39,44 @@ DROP PROCEDURE p1; --let $binlog_file = LAST source include/show_binlog_events.inc; + +--echo # +--echo # MDEV-16020 SP variables inside GROUP BY..WITH ROLLUP break replication +--echo # + +FLUSH LOGS; +CREATE TABLE t1 (d DATE); +INSERT INTO t1 VALUES ('1985-05-13'),('1989-12-24'); +CREATE TABLE t2 (d DATE, c BIGINT); +DELIMITER $$; +BEGIN NOT ATOMIC + BEGIN + DECLARE var INT DEFAULT 10; + INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, var; + INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, var WITH ROLLUP; + END; + BEGIN + DECLARE atomic INT DEFAULT 20; + INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, atomic; + INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, atomic WITH ROLLUP; + INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, `atomic`; + INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, `atomic` WITH ROLLUP; + END; + BEGIN + DECLARE atomic ROW (atomic INT, xxx INT) DEFAULT (31,32); + INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, atomic.atomic; + INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, atomic.atomic WITH ROLLUP; + INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, `atomic`.`atomic`; + INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, `atomic`.`atomic` WITH ROLLUP; + INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, atomic.xxx; + INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, atomic.xxx WITH ROLLUP; + INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, `atomic`.`xxx`; + INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, `atomic`.`xxx` WITH ROLLUP; + END; +END; +$$ +DELIMITER ;$$ +DROP TABLE t1,t2; + +--let $binlog_file = LAST +source include/show_binlog_events.inc; diff --git a/mysql-test/suite/compat/oracle/r/binlog_stm_sp.result b/mysql-test/suite/compat/oracle/r/binlog_stm_sp.result index 9823b155c8f..468309a0e56 100644 --- a/mysql-test/suite/compat/oracle/r/binlog_stm_sp.result +++ b/mysql-test/suite/compat/oracle/r/binlog_stm_sp.result @@ -475,3 +475,36 @@ master-bin.000005 # Gtid # # GTID #-#-# master-bin.000005 # Query # # use `test`; DROP TABLE "t2" /* generated by server */ master-bin.000005 # Gtid # # GTID #-#-# master-bin.000005 # Query # # use `test`; DROP PROCEDURE p1 +# +# MDEV-16020 SP variables inside GROUP BY..WITH ROLLUP break replication +# +FLUSH LOGS; +CREATE TABLE t1 (d DATE); +INSERT INTO t1 VALUES ('1985-05-13'),('1989-12-24'); +CREATE TABLE t2 (d DATE, c BIGINT); +DECLARE +var INT; +BEGIN +INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, var; +INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, var WITH ROLLUP; +END; +$$ +DROP TABLE t1,t2; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000006 # Binlog_checkpoint # # master-bin.000006 +master-bin.000006 # Gtid # # GTID #-#-# +master-bin.000006 # Query # # use `test`; CREATE TABLE t1 (d DATE) +master-bin.000006 # Gtid # # BEGIN GTID #-#-# +master-bin.000006 # Query # # use `test`; INSERT INTO t1 VALUES ('1985-05-13'),('1989-12-24') +master-bin.000006 # Query # # COMMIT +master-bin.000006 # Gtid # # GTID #-#-# +master-bin.000006 # Query # # use `test`; CREATE TABLE t2 (d DATE, c BIGINT) +master-bin.000006 # Gtid # # BEGIN GTID #-#-# +master-bin.000006 # Query # # use `test`; INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, NAME_CONST('var',NULL) +master-bin.000006 # Query # # COMMIT +master-bin.000006 # Gtid # # BEGIN GTID #-#-# +master-bin.000006 # Query # # use `test`; INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, NAME_CONST('var',NULL) WITH ROLLUP +master-bin.000006 # Query # # COMMIT +master-bin.000006 # Gtid # # GTID #-#-# +master-bin.000006 # Query # # use `test`; DROP TABLE "t1","t2" /* generated by server */ diff --git a/mysql-test/suite/compat/oracle/t/binlog_stm_sp.test b/mysql-test/suite/compat/oracle/t/binlog_stm_sp.test index 065c43eb274..e6f33cb1118 100644 --- a/mysql-test/suite/compat/oracle/t/binlog_stm_sp.test +++ b/mysql-test/suite/compat/oracle/t/binlog_stm_sp.test @@ -194,3 +194,26 @@ DROP TABLE t2; DROP PROCEDURE p1; --let $binlog_file = LAST source include/show_binlog_events.inc; + + +--echo # +--echo # MDEV-16020 SP variables inside GROUP BY..WITH ROLLUP break replication +--echo # + +FLUSH LOGS; +CREATE TABLE t1 (d DATE); +INSERT INTO t1 VALUES ('1985-05-13'),('1989-12-24'); +CREATE TABLE t2 (d DATE, c BIGINT); +DELIMITER $$; +DECLARE + var INT; +BEGIN + INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, var; + INSERT INTO t2 SELECT d, COUNT(*) FROM t1 GROUP BY d, var WITH ROLLUP; +END; +$$ +DELIMITER ;$$ +DROP TABLE t1,t2; + +--let $binlog_file = LAST +source include/show_binlog_events.inc; diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 09a2d205d85..5d129abd8b0 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -2498,6 +2498,39 @@ bool THD::convert_string(String *s, CHARSET_INFO *from_cs, CHARSET_INFO *to_cs) } +bool THD::check_string_for_wellformedness(const char *str, + size_t length, + CHARSET_INFO *cs) const +{ + DBUG_ASSERT(charset_is_system_charset); + size_t wlen= Well_formed_prefix(cs, str, length).length(); + if (wlen < length) + { + ErrConvString err(str, length, &my_charset_bin); + my_error(ER_INVALID_CHARACTER_STRING, MYF(0), cs->csname, err.ptr()); + return true; + } + return false; +} + + +bool THD::to_ident_sys_alloc(Lex_ident_sys_st *to, const Lex_ident_cli_st *ident) +{ + if (ident->is_quoted()) + { + LEX_CSTRING unquoted; + if (quote_unescape(&unquoted, ident, ident->quote())) + return true; + return charset_is_system_charset ? + to->copy_sys(this, &unquoted) : + to->convert(this, &unquoted, charset()); + } + return charset_is_system_charset ? + to->copy_sys(this, ident) : + to->copy_or_convert(this, ident, charset()); +} + + Item_basic_constant * THD::make_string_literal(const char *str, size_t length, uint repertoire) { diff --git a/sql/sql_class.h b/sql/sql_class.h index 75e3f99ea98..2d5ff8c4590 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -3658,6 +3658,26 @@ public: lex_str->length= length; return lex_str; } + // Remove double quotes: aaa""bbb -> aaa"bbb + bool quote_unescape(LEX_CSTRING *dst, const LEX_CSTRING *src, char quote) + { + const char *tmp= src->str; + const char *tmpend= src->str + src->length; + char *to; + if (!(dst->str= to= (char *) alloc(src->length + 1))) + { + dst->length= 0; // Safety + return true; + } + for ( ; tmp < tmpend; ) + { + if ((*to++= *tmp++) == quote) + tmp++; // Skip double quotes + } + *to= 0; // End null for safety + dst->length= to - dst->str; + return false; + } LEX_CSTRING *make_clex_string(const char* str, size_t length) { @@ -3701,7 +3721,6 @@ public: bool convert_with_error(CHARSET_INFO *dstcs, LEX_STRING *dst, CHARSET_INFO *srccs, const char *src, size_t src_length); - /* If either "dstcs" or "srccs" is &my_charset_bin, then performs native copying using cs->cset->copy_fix(). @@ -3721,6 +3740,17 @@ public: bool convert_string(String *s, CHARSET_INFO *from_cs, CHARSET_INFO *to_cs); /* + Check if the string is wellformed, raise an error if not wellformed. + @param str - The string to check. + @param length - the string length. + */ + bool check_string_for_wellformedness(const char *str, + size_t length, + CHARSET_INFO *cs) const; + + bool to_ident_sys_alloc(Lex_ident_sys_st *to, const Lex_ident_cli_st *from); + + /* Create a string literal with optional client->connection conversion. @param str - the string in the client character set @param length - length of the string @@ -3827,7 +3857,7 @@ public: void set_stmt_da(Diagnostics_area *da) { m_stmt_da= da; } - inline CHARSET_INFO *charset() { return variables.character_set_client; } + inline CHARSET_INFO *charset() const { return variables.character_set_client; } void update_charset(); void update_charset(CHARSET_INFO *character_set_client, CHARSET_INFO *collation_connection) diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 35e84effd09..dd15f69e619 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -849,9 +849,9 @@ static int find_keyword(Lex_input_stream *lip, uint len, bool function) SYMBOL *symbol= get_hash_symbol(tok, len, function); if (symbol) { - lip->yylval->symbol.symbol=symbol; - lip->yylval->symbol.str= (char*) tok; - lip->yylval->symbol.length=len; + lip->yylval->kwd.set_keyword(tok, len); + DBUG_ASSERT(tok >= lip->get_buf()); + DBUG_ASSERT(tok < lip->get_end_of_query()); if ((symbol->tok == NOT_SYM) && (lip->m_thd->variables.sql_mode & MODE_HIGH_NOT_PRECEDENCE)) @@ -968,41 +968,6 @@ static LEX_CSTRING get_token(Lex_input_stream *lip, uint skip, uint length) return tmp; } -/* - todo: - There are no dangerous charsets in mysql for function - get_quoted_token yet. But it should be fixed in the - future to operate multichar strings (like ucs2) -*/ - -static LEX_CSTRING get_quoted_token(Lex_input_stream *lip, - uint skip, - uint length, char quote) -{ - LEX_CSTRING tmp; - const char *from, *end; - char *to; - lip->yyUnget(); // ptr points now after last token char - tmp.length= length; - tmp.str= to= (char*) lip->m_thd->alloc(tmp.length+1); - from= lip->get_tok_start() + skip; - end= to+length; - - lip->m_cpp_text_start= lip->get_cpp_tok_start() + skip; - lip->m_cpp_text_end= lip->m_cpp_text_start + length; - - for ( ; to != end; ) - { - if ((*to++= *from++) == quote) - { - from++; // Skip double quotes - lip->m_cpp_text_start++; - } - } - *to= 0; // End null for safety - return tmp; -} - static size_t my_unescape(CHARSET_INFO *cs, char *to, const char *str, const char *end, @@ -1407,7 +1372,7 @@ static int lex_one_token(YYSTYPE *yylval, THD *thd) { uchar UNINIT_VAR(c); bool comment_closed; - int tokval, result_state; + int tokval; uint length; enum my_lex_states state; Lex_input_stream *lip= & thd->m_parser_state->m_lip; @@ -1529,95 +1494,15 @@ static int lex_one_token(YYSTYPE *yylval, THD *thd) } /* fall through */ case MY_LEX_IDENT: - const char *start; -#if defined(USE_MB) && defined(USE_MB_IDENT) - if (use_mb(cs)) - { - result_state= IDENT_QUOTED; - int char_length= my_charlen(cs, lip->get_ptr() - 1, - lip->get_end_of_query()); - if (char_length <= 0) - { - state= MY_LEX_CHAR; - continue; - } - lip->skip_binary(char_length - 1); - - while (ident_map[c=lip->yyGet()]) - { - char_length= my_charlen(cs, lip->get_ptr() - 1, - lip->get_end_of_query()); - if (char_length <= 0) - break; - lip->skip_binary(char_length - 1); - } - } - else -#endif - { - for (result_state= c; - ident_map[(uchar) (c= lip->yyGet())]; - result_state|= c) - ; - /* If there were non-ASCII characters, mark that we must convert */ - result_state= result_state & 0x80 ? IDENT_QUOTED : IDENT; - } - length= lip->yyLength(); - start= lip->get_ptr(); - if (lip->ignore_space) - { - /* - If we find a space then this can't be an identifier. We notice this - below by checking start != lex->ptr. - */ - for (; state_map[(uchar) c] == MY_LEX_SKIP ; c= lip->yyGet()) - { - if (c == '\n') - lip->yylineno++; - } - } - if (start == lip->get_ptr() && c == '.' && - ident_map[(uchar) lip->yyPeek()]) - lip->next_state=MY_LEX_IDENT_SEP; - else - { // '(' must follow directly if function - lip->yyUnget(); - if ((tokval = find_keyword(lip, length, c == '('))) - { - lip->next_state= MY_LEX_START; // Allow signed numbers - return(tokval); // Was keyword - } - lip->yySkip(); // next state does a unget - } - yylval->lex_str=get_token(lip, 0, length); - - /* - Note: "SELECT _bla AS 'alias'" - _bla should be considered as a IDENT if charset haven't been found. - So we don't use MYF(MY_WME) with get_charset_by_csname to avoid - producing an error. - */ - - if (yylval->lex_str.str[0] == '_') - { - CHARSET_INFO *cs= get_charset_by_csname(yylval->lex_str.str + 1, - MY_CS_PRIMARY, MYF(0)); - if (cs) - { - yylval->charset= cs; - lip->m_underscore_cs= cs; - - lip->body_utf8_append(lip->m_cpp_text_start, - lip->get_cpp_tok_start() + length); - return(UNDERSCORE_CHARSET); - } - } - - lip->body_utf8_append(lip->m_cpp_text_start); - - lip->body_utf8_append_ident(thd, &yylval->lex_str, lip->m_cpp_text_end); - - return(result_state); // IDENT or IDENT_QUOTED + { + tokval= lip->scan_ident_middle(thd, &yylval->ident_cli, + &yylval->charset, &state); + if (!tokval) + continue; + if (tokval == UNDERSCORE_CHARSET) + lip->m_underscore_cs= yylval->charset; + return tokval; + } case MY_LEX_IDENT_SEP: // Found ident and now '.' yylval->lex_str.str= (char*) lip->get_ptr(); @@ -1686,81 +1571,11 @@ static int lex_one_token(YYSTYPE *yylval, THD *thd) } // fall through case MY_LEX_IDENT_START: // We come here after '.' - result_state= IDENT; -#if defined(USE_MB) && defined(USE_MB_IDENT) - if (use_mb(cs)) - { - result_state= IDENT_QUOTED; - while (ident_map[c=lip->yyGet()]) - { - int char_length= my_charlen(cs, lip->get_ptr() - 1, - lip->get_end_of_query()); - if (char_length <= 0) - break; - lip->skip_binary(char_length - 1); - } - } - else -#endif - { - for (result_state=0; ident_map[c= lip->yyGet()]; result_state|= c) - ; - /* If there were non-ASCII characters, mark that we must convert */ - result_state= result_state & 0x80 ? IDENT_QUOTED : IDENT; - } - if (c == '.' && ident_map[(uchar) lip->yyPeek()]) - lip->next_state=MY_LEX_IDENT_SEP;// Next is '.' - - yylval->lex_str= get_token(lip, 0, lip->yyLength()); - - lip->body_utf8_append(lip->m_cpp_text_start); - - lip->body_utf8_append_ident(thd, &yylval->lex_str, lip->m_cpp_text_end); - - return(result_state); + return lip->scan_ident_start(thd, &yylval->ident_cli); case MY_LEX_USER_VARIABLE_DELIMITER: // Found quote char - { - uint double_quotes= 0; - char quote_char= c; // Used char - while ((c=lip->yyGet())) - { - int var_length= my_charlen(cs, lip->get_ptr() - 1, - lip->get_end_of_query()); - if (var_length == 1) - { - if (c == quote_char) - { - if (lip->yyPeek() != quote_char) - break; - c=lip->yyGet(); - double_quotes++; - continue; - } - } -#ifdef USE_MB - else if (var_length > 1) - { - lip->skip_binary(var_length - 1); - } -#endif - } - if (double_quotes) - yylval->lex_str=get_quoted_token(lip, 1, - lip->yyLength() - double_quotes -1, - quote_char); - else - yylval->lex_str=get_token(lip, 1, lip->yyLength() -1); - if (c == quote_char) - lip->yySkip(); // Skip end ` - lip->next_state= MY_LEX_START; - - lip->body_utf8_append(lip->m_cpp_text_start); - - lip->body_utf8_append_ident(thd, &yylval->lex_str, lip->m_cpp_text_end); + return lip->scan_ident_delimited(thd, &yylval->ident_cli); - return(IDENT_QUOTED); - } case MY_LEX_INT_OR_REAL: // Complete int or incomplete real if (c != '.' || lip->yyPeek() == '.') { @@ -2120,31 +1935,255 @@ static int lex_one_token(YYSTYPE *yylval, THD *thd) We should now be able to handle: [(global | local | session) .]variable_name */ + return lip->scan_ident_sysvar(thd, &yylval->ident_cli); + } + } +} - for (result_state= 0; ident_map[c= lip->yyGet()]; result_state|= c) - ; - /* If there were non-ASCII characters, mark that we must convert */ - result_state= result_state & 0x80 ? IDENT_QUOTED : IDENT; - - if (c == '.') - lip->next_state=MY_LEX_IDENT_SEP; - length= lip->yyLength(); - if (length == 0) - return(ABORT_SYM); // Names must be nonempty. - if ((tokval= find_keyword(lip, length,0))) - { - lip->yyUnget(); // Put back 'c' - return(tokval); // Was keyword - } - yylval->lex_str=get_token(lip, 0, length); - lip->body_utf8_append(lip->m_cpp_text_start); +bool Lex_input_stream::get_7bit_or_8bit_ident(THD *thd, uchar *last_char) +{ + uchar c; + CHARSET_INFO *const cs= thd->charset(); + const uchar *const ident_map= cs->ident_map; + bool is_8bit= false; + for ( ; ident_map[c= yyGet()]; ) + { + if (c & 0x80) + is_8bit= true; // will convert + } + *last_char= c; + return is_8bit; +} + + +int Lex_input_stream::scan_ident_sysvar(THD *thd, Lex_ident_cli_st *str) +{ + uchar last_char; + uint length; + int tokval; + bool is_8bit; + DBUG_ASSERT(m_tok_start == m_ptr); + + is_8bit= get_7bit_or_8bit_ident(thd, &last_char); + + if (last_char == '.') + next_state= MY_LEX_IDENT_SEP; + if (!(length= yyLength())) + return ABORT_SYM; // Names must be nonempty. + if ((tokval= find_keyword(this, length, 0))) + { + yyUnget(); // Put back 'c' + return tokval; // Was keyword + } + + yyUnget(); // ptr points now after last token char + str->set_ident(get_tok_start(), length, is_8bit); + + m_cpp_text_start= get_cpp_tok_start(); + m_cpp_text_end= m_cpp_text_start + length; + body_utf8_append(m_cpp_text_start); + body_utf8_append_ident(thd, str, m_cpp_text_end); + + return is_8bit ? IDENT_QUOTED : IDENT; +} - lip->body_utf8_append_ident(thd, &yylval->lex_str, lip->m_cpp_text_end); - return(result_state); +/* + We can come here if different parsing stages: + - In an identifier chain: + SELECT t1.cccc FROM t1; + (when the "cccc" part starts) + In this case both m_tok_start and m_ptr point to "cccc". + - When a sequence of digits has changed to something else, + therefore the token becomes an identifier rather than a number: + SELECT 12345_6 FROM t1; + In this case m_tok_start points to the entire "12345_678", + while m_ptr points to "678". +*/ +int Lex_input_stream::scan_ident_start(THD *thd, Lex_ident_cli_st *str) +{ + uchar c; + bool is_8bit; + CHARSET_INFO *const cs= thd->charset(); + const uchar *const ident_map= cs->ident_map; + DBUG_ASSERT(m_tok_start <= m_ptr); + + if (use_mb(cs)) + { + is_8bit= true; + while (ident_map[c= yyGet()]) + { + int char_length= my_charlen(cs, get_ptr() - 1, get_end_of_query()); + if (char_length <= 0) + break; + skip_binary(char_length - 1); } } + else + { + is_8bit= get_7bit_or_8bit_ident(thd, &c); + } + if (c == '.' && ident_map[(uchar) yyPeek()]) + next_state= MY_LEX_IDENT_SEP;// Next is '.' + + uint length= yyLength(); + yyUnget(); // ptr points now after last token char + str->set_ident(get_tok_start(), length, is_8bit); + m_cpp_text_start= get_cpp_tok_start(); + m_cpp_text_end= m_cpp_text_start + length; + body_utf8_append(m_cpp_text_start); + body_utf8_append_ident(thd, str, m_cpp_text_end); + return is_8bit ? IDENT_QUOTED : IDENT; +} + + +int Lex_input_stream::scan_ident_middle(THD *thd, Lex_ident_cli_st *str, + CHARSET_INFO **introducer, + my_lex_states *st) +{ + CHARSET_INFO *const cs= thd->charset(); + const uchar *const ident_map= cs->ident_map; + const uchar *const state_map= cs->state_map; + const char *start; + uint length; + uchar c; + bool is_8bit; + bool resolve_introducer= true; + DBUG_ASSERT(m_ptr == m_tok_start + 1); // m_ptr points to the second byte + + if (use_mb(cs)) + { + is_8bit= true; + int char_length= my_charlen(cs, get_ptr() - 1, get_end_of_query()); + if (char_length <= 0) + { + *st= MY_LEX_CHAR; + return 0; + } + skip_binary(char_length - 1); + + while (ident_map[c= yyGet()]) + { + char_length= my_charlen(cs, get_ptr() - 1, get_end_of_query()); + if (char_length <= 0) + break; + if (char_length > 1 || (c & 0x80)) + resolve_introducer= false; + skip_binary(char_length - 1); + } + } + else + { + is_8bit= (m_tok_start[0] & 0x80) | get_7bit_or_8bit_ident(thd, &c); + resolve_introducer= !is_8bit; + } + length= yyLength(); + start= get_ptr(); + if (ignore_space) + { + /* + If we find a space then this can't be an identifier. We notice this + below by checking start != lex->ptr. + */ + for (; state_map[(uchar) c] == MY_LEX_SKIP ; c= yyGet()) + { + if (c == '\n') + yylineno++; + } + } + if (start == get_ptr() && c == '.' && ident_map[(uchar) yyPeek()]) + next_state= MY_LEX_IDENT_SEP; + else + { // '(' must follow directly if function + int tokval; + yyUnget(); + if ((tokval= find_keyword(this, length, c == '('))) + { + next_state= MY_LEX_START; // Allow signed numbers + return(tokval); // Was keyword + } + yySkip(); // next state does a unget + } + + /* + Note: "SELECT _bla AS 'alias'" + _bla should be considered as a IDENT if charset haven't been found. + So we don't use MYF(MY_WME) with get_charset_by_csname to avoid + producing an error. + */ + DBUG_ASSERT(length > 0); + if (resolve_introducer && get_tok_start()[0] == '_') + { + + yyUnget(); // ptr points now after last token char + str->set_ident(get_tok_start(), length, false); + + m_cpp_text_start= get_cpp_tok_start(); + m_cpp_text_end= m_cpp_text_start + length; + body_utf8_append(m_cpp_text_start, get_cpp_tok_start() + length); + ErrConvString csname(str->str + 1, str->length - 1, &my_charset_bin); + CHARSET_INFO *cs= get_charset_by_csname(csname.ptr(), + MY_CS_PRIMARY, MYF(0)); + if (cs) + { + *introducer= cs; + return UNDERSCORE_CHARSET; + } + return IDENT; + } + + yyUnget(); // ptr points now after last token char + str->set_ident(get_tok_start(), length, is_8bit); + m_cpp_text_start= get_cpp_tok_start(); + m_cpp_text_end= m_cpp_text_start + length; + body_utf8_append(m_cpp_text_start); + body_utf8_append_ident(thd, str, m_cpp_text_end); + return is_8bit ? IDENT_QUOTED : IDENT; +} + + +int Lex_input_stream::scan_ident_delimited(THD *thd, + Lex_ident_cli_st *str) +{ + CHARSET_INFO *const cs= thd->charset(); + uint double_quotes= 0; + uchar c, quote_char= m_tok_start[0]; + DBUG_ASSERT(m_ptr == m_tok_start + 1); + + while ((c= yyGet())) + { + int var_length= my_charlen(cs, get_ptr() - 1, get_end_of_query()); + if (var_length == 1) + { + if (c == quote_char) + { + if (yyPeek() != quote_char) + break; + c= yyGet(); + double_quotes++; + continue; + } + } + else if (var_length > 1) + { + skip_binary(var_length - 1); + } + } + + str->set_ident_quoted(get_tok_start() + 1, yyLength() - 1, true, quote_char); + yyUnget(); // ptr points now after last token char + + m_cpp_text_start= get_cpp_tok_start() + 1; + m_cpp_text_end= m_cpp_text_start + str->length; + + if (c == quote_char) + yySkip(); // Skip end ` + next_state= MY_LEX_START; + body_utf8_append(m_cpp_text_start); + // QQQ: shouldn't it add unescaped version ???? + body_utf8_append_ident(thd, str, m_cpp_text_end); + return IDENT_QUOTED; } @@ -5249,12 +5288,26 @@ LEX::find_variable(const LEX_CSTRING *name, } +static bool is_new(const char *str) +{ + return (str[0] == 'n' || str[0] == 'N') && + (str[1] == 'e' || str[1] == 'E') && + (str[2] == 'w' || str[2] == 'W'); +} + +static bool is_old(const char *str) +{ + return (str[0] == 'o' || str[0] == 'O') && + (str[1] == 'l' || str[1] == 'L') && + (str[2] == 'd' || str[2] == 'D'); +} + + bool LEX::is_trigger_new_or_old_reference(const LEX_CSTRING *name) const { + // "name" is not necessarily NULL-terminated! return sphead && sphead->m_handler->type() == TYPE_ENUM_TRIGGER && - name->length == 3 && - (!my_strcasecmp(system_charset_info, name->str, "NEW") || - !my_strcasecmp(system_charset_info, name->str, "OLD")); + name->length == 3 && (is_new(name->str) || is_old(name->str)); } @@ -6546,6 +6599,20 @@ Item *LEX::create_and_link_Item_trigger_field(THD *thd, } +Item *LEX::make_item_colon_ident_ident(THD *thd, + const Lex_ident_sys_st *a, + const Lex_ident_sys_st *b) +{ + if (!is_trigger_new_or_old_reference(a)) + { + thd->parse_error(); + return NULL; + } + bool new_row= (a->str[0] == 'N' || a->str[0] == 'n'); + return create_and_link_Item_trigger_field(thd, b, new_row); +} + + Item_param *LEX::add_placeholder(THD *thd, const LEX_CSTRING *name, const char *start, const char *end) { @@ -6591,8 +6658,8 @@ bool LEX::add_resignal_statement(THD *thd, const sp_condition_value *v) Item *LEX::create_item_ident_nospvar(THD *thd, - const LEX_CSTRING *a, - const LEX_CSTRING *b) + const Lex_ident_sys_st *a, + const Lex_ident_sys_st *b) { DBUG_ASSERT(this == thd->lex); /* @@ -6623,8 +6690,8 @@ Item *LEX::create_item_ident_nospvar(THD *thd, Item_splocal *LEX::create_item_spvar_row_field(THD *thd, const Sp_rcontext_handler *rh, - const LEX_CSTRING *a, - const LEX_CSTRING *b, + const Lex_ident_sys *a, + const Lex_ident_sys *b, sp_variable *spv, const char *start, const char *end) @@ -6765,38 +6832,45 @@ Item *LEX::create_item_func_setval(THD *thd, Table_ident *table_ident, Item *LEX::create_item_ident(THD *thd, - const LEX_CSTRING *a, - const LEX_CSTRING *b, - const char *start, const char *end) + const Lex_ident_cli_st *ca, + const Lex_ident_cli_st *cb) { + const char *start= ca->pos(); + const char *end= cb->end(); const Sp_rcontext_handler *rh; sp_variable *spv; - if ((spv= find_variable(a, &rh)) && + DBUG_ASSERT(thd->m_parser_state->m_lip.get_buf() <= start); + DBUG_ASSERT(start <= end); + DBUG_ASSERT(end <= thd->m_parser_state->m_lip.get_end_of_query()); + Lex_ident_sys a(thd, ca), b(thd, cb); + if (a.is_null() || b.is_null()) + return NULL; // OEM + if ((spv= find_variable(&a, &rh)) && (spv->field_def.is_row() || spv->field_def.is_table_rowtype_ref() || spv->field_def.is_cursor_rowtype_ref())) - return create_item_spvar_row_field(thd, rh, a, b, spv, start, end); + return create_item_spvar_row_field(thd, rh, &a, &b, spv, start, end); - if ((thd->variables.sql_mode & MODE_ORACLE) && b->length == 7) + if ((thd->variables.sql_mode & MODE_ORACLE) && b.length == 7) { if (!my_strnncoll(system_charset_info, - (const uchar *) b->str, 7, + (const uchar *) b.str, 7, (const uchar *) "NEXTVAL", 7)) - return create_item_func_nextval(thd, &null_clex_str, a); + return create_item_func_nextval(thd, &null_clex_str, &a); else if (!my_strnncoll(system_charset_info, - (const uchar *) b->str, 7, + (const uchar *) b.str, 7, (const uchar *) "CURRVAL", 7)) - return create_item_func_lastval(thd, &null_clex_str, a); + return create_item_func_lastval(thd, &null_clex_str, &a); } - return create_item_ident_nospvar(thd, a, b); + return create_item_ident_nospvar(thd, &a, &b); } Item *LEX::create_item_ident(THD *thd, - const LEX_CSTRING *a, - const LEX_CSTRING *b, - const LEX_CSTRING *c) + const Lex_ident_sys_st *a, + const Lex_ident_sys_st *b, + const Lex_ident_sys_st *c) { const char *schema= (thd->client_capabilities & CLIENT_NO_SCHEMA ? NullS : a->str); @@ -6827,21 +6901,26 @@ Item *LEX::create_item_ident(THD *thd, } -Item *LEX::create_item_limit(THD *thd, - const LEX_CSTRING *a, - const char *start, const char *end) +Item *LEX::create_item_limit(THD *thd, const Lex_ident_cli_st *ca) { + DBUG_ASSERT(thd->m_parser_state->m_lip.get_buf() <= ca->pos()); + DBUG_ASSERT(ca->pos() <= ca->end()); + DBUG_ASSERT(ca->end() <= thd->m_parser_state->m_lip.get_end_of_query()); + const Sp_rcontext_handler *rh; sp_variable *spv; - if (!(spv= find_variable(a, &rh))) + Lex_ident_sys sa(thd, ca); + if (sa.is_null()) + return NULL; // EOM + if (!(spv= find_variable(&sa, &rh))) { - my_error(ER_SP_UNDECLARED_VAR, MYF(0), a->str); + my_error(ER_SP_UNDECLARED_VAR, MYF(0), sa.str); return NULL; } - Query_fragment pos(thd, sphead, start, end); + Query_fragment pos(thd, sphead, ca->pos(), ca->end()); Item_splocal *item; - if (!(item= new (thd->mem_root) Item_splocal(thd, rh, a, + if (!(item= new (thd->mem_root) Item_splocal(thd, rh, &sa, spv->offset, spv->type_handler(), pos.pos(), pos.length()))) return NULL; @@ -6861,21 +6940,28 @@ Item *LEX::create_item_limit(THD *thd, Item *LEX::create_item_limit(THD *thd, - const LEX_CSTRING *a, - const LEX_CSTRING *b, - const char *start, const char *end) + const Lex_ident_cli_st *ca, + const Lex_ident_cli_st *cb) { + DBUG_ASSERT(thd->m_parser_state->m_lip.get_buf() <= ca->pos()); + DBUG_ASSERT(ca->pos() <= cb->end()); + DBUG_ASSERT(cb->end() <= thd->m_parser_state->m_lip.get_end_of_query()); + const Sp_rcontext_handler *rh; sp_variable *spv; - if (!(spv= find_variable(a, &rh))) + Lex_ident_sys sa(thd, ca), sb(thd, cb); + if (sa.is_null() || sb.is_null()) + return NULL; // EOM + if (!(spv= find_variable(&sa, &rh))) { - my_error(ER_SP_UNDECLARED_VAR, MYF(0), a->str); + my_error(ER_SP_UNDECLARED_VAR, MYF(0), sa.str); return NULL; } // Qualified %TYPE variables are not possible DBUG_ASSERT(!spv->field_def.column_type_ref()); Item_splocal *item; - if (!(item= create_item_spvar_row_field(thd, rh, a, b, spv, start, end))) + if (!(item= create_item_spvar_row_field(thd, rh, &sa, &sb, spv, + ca->pos(), cb->end()))) return NULL; if (item->type() != Item::INT_ITEM) { @@ -6899,7 +6985,7 @@ bool LEX::set_user_variable(THD *thd, const LEX_CSTRING *name, Item *val) } -Item *LEX::create_item_ident_nosp(THD *thd, LEX_CSTRING *name) +Item *LEX::create_item_ident_nosp(THD *thd, Lex_ident_sys_st *name) { if (current_select->parsing_place != IN_HAVING || current_select->get_in_sum_expr() > 0) @@ -6911,10 +6997,14 @@ Item *LEX::create_item_ident_nosp(THD *thd, LEX_CSTRING *name) } -Item *LEX::create_item_ident_sp(THD *thd, LEX_CSTRING *name, +Item *LEX::create_item_ident_sp(THD *thd, Lex_ident_sys_st *name, const char *start, const char *end) { + DBUG_ASSERT(thd->m_parser_state->m_lip.get_buf() <= start); + DBUG_ASSERT(start <= end); + DBUG_ASSERT(end <= thd->m_parser_state->m_lip.get_end_of_query()); + const Sp_rcontext_handler *rh; sp_variable *spv; DBUG_ASSERT(spcont); @@ -7757,3 +7847,109 @@ Item *Lex_trim_st::make_item_func_trim(THD *thd) const make_item_func_trim_oracle(thd) : make_item_func_trim_std(thd); } + + +Item *LEX::make_item_func_call_generic(THD *thd, Lex_ident_cli_st *cdb, + Lex_ident_cli_st *cname, List<Item> *args) +{ + Lex_ident_sys db(thd, cdb), name(thd, cname); + if (db.is_null() || name.is_null()) + return NULL; // EOM + /* + The following in practice calls: + <code>Create_sp_func::create()</code> + and builds a stored function. + + However, it's important to maintain the interface between the + parser and the implementation in item_create.cc clean, + since this will change with WL#2128 (SQL PATH): + - INFORMATION_SCHEMA.version() is the SQL 99 syntax for the native + function version(), + - MySQL.version() is the SQL 2003 syntax for the native function + version() (a vendor can specify any schema). + */ + + if (!name.str || check_db_name((LEX_STRING*) static_cast<LEX_CSTRING*>(&db))) + { + my_error(ER_WRONG_DB_NAME, MYF(0), db.str); + return NULL; + } + if (check_routine_name(&name)) + return NULL; + + Create_qfunc *builder= find_qualified_function_builder(thd); + DBUG_ASSERT(builder); + return builder->create_with_db(thd, &db, &name, true, args); +} + + +Item *LEX::create_item_qualified_asterisk(THD *thd, + const Lex_ident_sys_st *name) +{ + Item *item; + if (!(item= new (thd->mem_root) Item_field(thd, current_context(), + NullS, name->str, + &star_clex_str))) + return NULL; + current_select->with_wild++; + return item; +} + + +Item *LEX::create_item_qualified_asterisk(THD *thd, + const Lex_ident_sys_st *a, + const Lex_ident_sys_st *b) +{ + Item *item; + const char* schema= thd->client_capabilities & CLIENT_NO_SCHEMA ? + NullS : a->str; + if (!(item= new (thd->mem_root) Item_field(thd, current_context(), + schema, b->str, + &star_clex_str))) + return NULL; + current_select->with_wild++; + return item; +} + + +bool Lex_ident_sys_st::copy_ident_cli(THD *thd, const Lex_ident_cli_st *str) +{ + return thd->to_ident_sys_alloc(this, str); +} + +bool Lex_ident_sys_st::copy_keyword(THD *thd, const Lex_ident_cli_st *str) +{ + return thd->make_lex_string(static_cast<LEX_CSTRING*>(this), + str->str, str->length) == NULL; +} + +bool Lex_ident_sys_st::copy_or_convert(THD *thd, + const Lex_ident_cli_st *src, + CHARSET_INFO *cs) +{ + if (!src->is_8bit()) + return copy_keyword(thd, src); // 7bit string makes a wellformed identifier + return convert(thd, src, cs); +} + + +bool Lex_ident_sys_st::copy_sys(THD *thd, const LEX_CSTRING *src) +{ + if (thd->check_string_for_wellformedness(src->str, src->length, + system_charset_info)) + return true; + return thd->make_lex_string(this, src->str, src->length) == NULL; +} + + +bool Lex_ident_sys_st::convert(THD *thd, + const LEX_CSTRING *src, CHARSET_INFO *cs) +{ + LEX_STRING tmp; + if (thd->convert_with_error(system_charset_info, &tmp, cs, + src->str, src->length)) + return true; + str= tmp.str; + length= tmp.length; + return false; +} diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 610d9de364d..3fc6798e3ff 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -67,6 +67,92 @@ public: }; +/* + Used to store identifiers in the client character set. + Points to a query fragment. +*/ +struct Lex_ident_cli_st: public LEX_CSTRING +{ +private: + bool m_is_8bit; + char m_quote; +public: + void set_keyword(const char *s, size_t len) + { + str= s; + length= len; + m_is_8bit= false; + m_quote= '\0'; + } + void set_ident(const char *s, size_t len, bool is_8bit) + { + str= s; + length= len; + m_is_8bit= is_8bit; + m_quote= '\0'; + } + void set_ident_quoted(const char *s, size_t len, bool is_8bit, char quote) + { + str= s; + length= len; + m_is_8bit= is_8bit; + m_quote= quote; + } + void set_unquoted(const LEX_CSTRING *s, bool is_8bit) + { + ((LEX_CSTRING &)*this)= *s; + m_is_8bit= is_8bit; + m_quote= '\0'; + } + const char *pos() const { return str - is_quoted(); } + const char *end() const { return str + length + is_quoted(); } + bool is_quoted() const { return m_quote != '\0'; } + bool is_8bit() const { return m_is_8bit; } + char quote() const { return m_quote; } +}; + + +class Lex_ident_cli: public Lex_ident_cli_st +{ +public: + Lex_ident_cli(const LEX_CSTRING *s, bool is_8bit) + { + set_unquoted(s, is_8bit); + } + Lex_ident_cli(const char *s, size_t len) + { + set_ident(s, len, false); + } +}; + + +struct Lex_ident_sys_st: public LEX_CSTRING +{ +public: + bool copy_ident_cli(THD *thd, const Lex_ident_cli_st *str); + bool copy_keyword(THD *thd, const Lex_ident_cli_st *str); + bool copy_sys(THD *thd, const LEX_CSTRING *str); + bool convert(THD *thd, const LEX_CSTRING *str, CHARSET_INFO *cs); + bool copy_or_convert(THD *thd, const Lex_ident_cli_st *str, CHARSET_INFO *cs); + bool is_null() const { return str == NULL; } +}; + + +class Lex_ident_sys: public Lex_ident_sys_st +{ +public: + Lex_ident_sys(THD *thd, const Lex_ident_cli_st *str) + { + if (copy_ident_cli(thd, str)) + ((LEX_CSTRING &) *this)= null_clex_str; + } + Lex_ident_sys() + { + ((LEX_CSTRING &) *this)= null_clex_str; + } +}; + + enum sub_select_type { UNSPECIFIED_TYPE, @@ -2392,6 +2478,12 @@ public: void reduce_digest_token(uint token_left, uint token_right); + int scan_ident_sysvar(THD *thd, Lex_ident_cli_st *str); + int scan_ident_start(THD *thd, Lex_ident_cli_st *str); + int scan_ident_middle(THD *thd, Lex_ident_cli_st *str, + CHARSET_INFO **cs, my_lex_states *); + int scan_ident_delimited(THD *thd, Lex_ident_cli_st *str); + bool get_7bit_or_8bit_ident(THD *thd, uchar *last_char); private: /** Pointer to the current position in the raw input stream. */ char *m_ptr; @@ -3299,20 +3391,42 @@ public: bool sp_open_cursor(THD *thd, const LEX_CSTRING *name, List<sp_assignment_lex> *parameters); - Item_splocal *create_item_for_sp_var(LEX_CSTRING *name, sp_variable *spvar, - const char *start, const char *end); + Item_splocal *create_item_for_sp_var(const Lex_ident_cli_st *name, + sp_variable *spvar); + + Item *create_item_qualified_asterisk(THD *thd, const Lex_ident_sys_st *name); + Item *create_item_qualified_asterisk(THD *thd, + const Lex_ident_sys_st *a, + const Lex_ident_sys_st *b); + Item *create_item_qualified_asterisk(THD *thd, const Lex_ident_cli_st *cname) + { + Lex_ident_sys name(thd, cname); + if (name.is_null()) + return NULL; // EOM + return create_item_qualified_asterisk(thd, &name); + } + Item *create_item_qualified_asterisk(THD *thd, + const Lex_ident_cli_st *ca, + const Lex_ident_cli_st *cb) + { + Lex_ident_sys a(thd, ca), b(thd, cb); + if (a.is_null() || b.is_null()) + return NULL; // EOM + return create_item_qualified_asterisk(thd, &a, &b); + } - Item *create_item_ident_nosp(THD *thd, LEX_CSTRING *name); - Item *create_item_ident_sp(THD *thd, LEX_CSTRING *name, + Item *create_item_ident_nosp(THD *thd, Lex_ident_sys_st *name); + Item *create_item_ident_sp(THD *thd, Lex_ident_sys_st *name, const char *start, const char *end); - Item *create_item_ident(THD *thd, LEX_CSTRING *name, - const char *start, const char *end) + Item *create_item_ident(THD *thd, Lex_ident_cli_st *cname) { + Lex_ident_sys name(thd, cname); + if (name.is_null()) + return NULL; // EOM return sphead ? - create_item_ident_sp(thd, name, start, end) : - create_item_ident_nosp(thd, name); + create_item_ident_sp(thd, &name, cname->pos(), cname->end()) : + create_item_ident_nosp(thd, &name); } - /* Create an Item corresponding to a qualified name: a.b when the parser is out of an SP context. @@ -3327,8 +3441,8 @@ public: - Item_ref */ Item *create_item_ident_nospvar(THD *thd, - const LEX_CSTRING *a, - const LEX_CSTRING *b); + const Lex_ident_sys_st *a, + const Lex_ident_sys_st *b); /* Create an Item corresponding to a ROW field valiable: var.field @param THD - THD, for mem_root @@ -3342,8 +3456,8 @@ public: */ Item_splocal *create_item_spvar_row_field(THD *thd, const Sp_rcontext_handler *rh, - const LEX_CSTRING *var, - const LEX_CSTRING *field, + const Lex_ident_sys *var, + const Lex_ident_sys *field, sp_variable *spvar, const char *start, const char *end); @@ -3356,15 +3470,11 @@ public: @param thd - THD, for mem_root @param a - the first name @param b - the second name - @param start - position in the query (for binary log) - @param end - end in the query (for binary log) @retval - NULL on error, or a pointer to a new Item. */ Item *create_item_ident(THD *thd, - const LEX_CSTRING *a, - const LEX_CSTRING *b, - const char *start, - const char *end); + const Lex_ident_cli_st *a, + const Lex_ident_cli_st *b); /* Create an item from its qualified name. Depending on context, it can be a table field, a table field reference, @@ -3376,9 +3486,27 @@ public: @retval - NULL on error, or a pointer to a new Item. */ Item *create_item_ident(THD *thd, - const LEX_CSTRING *a, - const LEX_CSTRING *b, - const LEX_CSTRING *c); + const Lex_ident_sys_st *a, + const Lex_ident_sys_st *b, + const Lex_ident_sys_st *c); + + Item *create_item_ident(THD *thd, + const Lex_ident_cli_st *ca, + const Lex_ident_cli_st *cb, + const Lex_ident_cli_st *cc) + { + Lex_ident_sys b(thd, cb), c(thd, cc); + if (b.is_null() || c.is_null()) + return NULL; + if (ca->pos() == cb->pos()) // SELECT .t1.col1 + { + DBUG_ASSERT(ca->length == 0); + Lex_ident_sys none; + return create_item_ident(thd, &none, &b, &c); + } + Lex_ident_sys a(thd, ca); + return a.is_null() ? NULL : create_item_ident(thd, &a, &b, &c); + } /* Create an item for "NEXT VALUE FOR sequence_name" @@ -3403,16 +3531,11 @@ public: Create an item for a name in LIMIT clause: LIMIT var @param THD - THD, for mem_root @param var_name - the variable name - @param start - position in the query (for binary log) - @param end - end in the query (for binary log) @retval - a new Item corresponding to the SP variable, or NULL on error (non in SP, unknown variable, wrong data type). */ - Item *create_item_limit(THD *thd, - const LEX_CSTRING *var_name, - const char *start, - const char *end); + Item *create_item_limit(THD *thd, const Lex_ident_cli_st *var_name); /* Create an item for a qualified name in LIMIT clause: LIMIT var.field @@ -3427,14 +3550,14 @@ public: wrong data type). */ Item *create_item_limit(THD *thd, - const LEX_CSTRING *var_name, - const LEX_CSTRING *field_name, - const char *start, - const char *end); + const Lex_ident_cli_st *var_name, + const Lex_ident_cli_st *field_name); Item *make_item_func_replace(THD *thd, Item *org, Item *find, Item *replace); Item *make_item_func_substr(THD *thd, Item *a, Item *b, Item *c); Item *make_item_func_substr(THD *thd, Item *a, Item *b); + Item *make_item_func_call_generic(THD *thd, Lex_ident_cli_st *db, + Lex_ident_cli_st *name, List<Item> *args); my_var *create_outvar(THD *thd, const LEX_CSTRING *name); /* @@ -3452,7 +3575,10 @@ public: Item *create_and_link_Item_trigger_field(THD *thd, const LEX_CSTRING *name, bool new_row); - + // For syntax with colon, e.g. :NEW.a or :OLD.a + Item *make_item_colon_ident_ident(THD *thd, + const Lex_ident_sys_st *a, + const Lex_ident_sys_st *b); void sp_block_init(THD *thd, const LEX_CSTRING *label); void sp_block_init(THD *thd) { @@ -3748,6 +3874,25 @@ public: return create_info.vers_info; } sp_package *get_sp_package() const; + + /** + Check if the select is a simple select (not an union). + @retval + 0 ok + @retval + 1 error ; In this case the error messege is sent to the client + */ + bool check_simple_select(const LEX_CSTRING *option) + { + if (current_select != &select_lex) + { + char command[80]; + strmake(command, option->str, MY_MIN(option->length, sizeof(command)-1)); + my_error(ER_CANT_USE_OPTION_HERE, MYF(0), command); + return true; + } + return false; + } }; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 6e0d2b0ba0a..4b9c00168af 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -9059,32 +9059,6 @@ bool append_file_to_dir(THD *thd, const char **filename_ptr, } -/** - Check if the select is a simple select (not an union). - - @retval - 0 ok - @retval - 1 error ; In this case the error messege is sent to the client -*/ - -bool check_simple_select() -{ - THD *thd= current_thd; - LEX *lex= thd->lex; - if (lex->current_select != &lex->select_lex) - { - char command[80]; - Lex_input_stream *lip= & thd->m_parser_state->m_lip; - strmake(command, lip->yylval->symbol.str, - MY_MIN(lip->yylval->symbol.length, sizeof(command)-1)); - my_error(ER_CANT_USE_OPTION_HERE, MYF(0), command); - return 1; - } - return 0; -} - - Comp_creator *comp_eq_creator(bool invert) { return invert?(Comp_creator *)&ne_creator:(Comp_creator *)&eq_creator; diff --git a/sql/sql_parse.h b/sql/sql_parse.h index d23da6f1b68..5e5f7b50ba3 100644 --- a/sql/sql_parse.h +++ b/sql/sql_parse.h @@ -119,7 +119,6 @@ bool push_new_name_resolution_context(THD *thd, TABLE_LIST *left_op, TABLE_LIST *right_op); void init_update_queries(void); -bool check_simple_select(); Item *normalize_cond(THD *thd, Item *cond); Item *negate_expression(THD *thd, Item *expr); bool check_stack_overrun(THD *thd, long margin, uchar *dummy); diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index e1f3d15e514..1ff86c777b5 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -377,20 +377,25 @@ bool LEX::set_trigger_new_row(const LEX_CSTRING *name, Item *val) @return An Item_splocal object representing the SP variable, or NULL on error. */ Item_splocal* -LEX::create_item_for_sp_var(LEX_CSTRING *name, sp_variable *spvar, - const char *start_in_q, const char *end_in_q) +LEX::create_item_for_sp_var(const Lex_ident_cli_st *cname, sp_variable *spvar) { const Sp_rcontext_handler *rh; Item_splocal *item; + const char *start_in_q= cname->pos(); + const char *end_in_q= cname->end(); uint pos_in_q, len_in_q; + Lex_ident_sys name(thd, cname); + + if (name.is_null()) + return NULL; // EOM /* If necessary, look for the variable. */ if (spcont && !spvar) - spvar= find_variable(name, &rh); + spvar= find_variable(&name, &rh); if (!spvar) { - my_error(ER_SP_UNDECLARED_VAR, MYF(0), name->str); + my_error(ER_SP_UNDECLARED_VAR, MYF(0), name.str); return NULL; } @@ -401,7 +406,7 @@ LEX::create_item_for_sp_var(LEX_CSTRING *name, sp_variable *spvar, len_in_q= (uint)(end_in_q - start_in_q); item= new (thd->mem_root) - Item_splocal(thd, rh, name, spvar->offset, spvar->type_handler(), + Item_splocal(thd, rh, &name, spvar->offset, spvar->type_handler(), pos_in_q, len_in_q); #ifdef DBUG_ASSERT_EXISTS @@ -779,9 +784,10 @@ Virtual_column_info *add_virtual_expression(THD *thd, Item *expr) /* structs */ LEX_CSTRING lex_str; - LEX_SYMBOL symbol; + Lex_ident_cli_st kwd; + Lex_ident_cli_st ident_cli; + Lex_ident_sys_st ident_sys; Lex_string_with_metadata_st lex_string_with_metadata; - Lex_string_with_pos_st lex_string_with_pos; Lex_spblock_st spblock; Lex_spblock_handlers_st spblock_handlers; Lex_length_and_dec_st Lex_length_and_dec; @@ -912,679 +918,276 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); This makes the code grep-able, and helps maintenance. */ - + + +/* + Reserved keywords and operators +*/ %token ABORT_SYM /* INTERNAL (used in lex) */ %token ACCESSIBLE_SYM -%token ACTION /* SQL-2003-N */ %token ADD /* SQL-2003-R */ -%token ADMIN_SYM /* SQL-2003-N */ -%token ADDDATE_SYM /* MYSQL-FUNC */ -%token AFTER_SYM /* SQL-2003-N */ -%token AGAINST -%token AGGREGATE_SYM -%token ALGORITHM_SYM %token ALL /* SQL-2003-R */ %token ALTER /* SQL-2003-R */ -%token ALWAYS_SYM %token ANALYZE_SYM %token AND_AND_SYM /* OPERATOR */ %token AND_SYM /* SQL-2003-R */ -%token ANY_SYM /* SQL-2003-R */ %token AS /* SQL-2003-R */ %token ASC /* SQL-2003-N */ -%token ASCII_SYM /* MYSQL-FUNC */ %token ASENSITIVE_SYM /* FUTURE-USE */ -%token AT_SYM /* SQL-2003-R */ -%token ATOMIC_SYM /* SQL-2003-R */ -%token AUTHORS_SYM -%token AUTOEXTEND_SIZE_SYM -%token AUTO_INC -%token AUTO_SYM -%token AVG_ROW_LENGTH -%token AVG_SYM /* SQL-2003-N */ -%token BACKUP_SYM %token BEFORE_SYM /* SQL-2003-N */ -%token BEGIN_SYM /* SQL-2003-R */ %token BETWEEN_SYM /* SQL-2003-R */ %token BIGINT /* SQL-2003-R */ %token BINARY /* SQL-2003-R */ -%token BINLOG_SYM %token BIN_NUM %token BIT_AND /* MYSQL-FUNC */ %token BIT_OR /* MYSQL-FUNC */ -%token BIT_SYM /* MYSQL-FUNC */ %token BIT_XOR /* MYSQL-FUNC */ %token BLOB_SYM /* SQL-2003-R */ -%token BLOCK_SYM -%token BODY_SYM /* Oracle-R */ -%token BOOLEAN_SYM /* SQL-2003-R */ -%token BOOL_SYM %token BOTH /* SQL-2003-R */ -%token BTREE_SYM %token BY /* SQL-2003-R */ -%token BYTE_SYM -%token CACHE_SYM %token CALL_SYM /* SQL-2003-R */ %token CASCADE /* SQL-2003-N */ -%token CASCADED /* SQL-2003-R */ %token CASE_SYM /* SQL-2003-R */ %token CAST_SYM /* SQL-2003-R */ -%token CATALOG_NAME_SYM /* SQL-2003-N */ -%token CHAIN_SYM /* SQL-2003-N */ %token CHANGE -%token CHANGED -%token CHARSET %token CHAR_SYM /* SQL-2003-R */ -%token CHECKPOINT_SYM -%token CHECKSUM_SYM %token CHECK_SYM /* SQL-2003-R */ -%token CIPHER_SYM -%token CLASS_ORIGIN_SYM /* SQL-2003-N */ -%token CLIENT_SYM -%token CLOSE_SYM /* SQL-2003-R */ -%token CLOB /* SQL-2003-R */ -%token COALESCE /* SQL-2003-N */ -%token CODE_SYM %token COLLATE_SYM /* SQL-2003-R */ -%token COLLATION_SYM /* SQL-2003-N */ -%token COLUMNS -%token COLUMN_ADD_SYM -%token COLUMN_CHECK_SYM -%token COLUMN_CREATE_SYM -%token COLUMN_DELETE_SYM -%token COLUMN_GET_SYM -%token COLUMN_SYM /* SQL-2003-R */ -%token COLUMN_NAME_SYM /* SQL-2003-N */ -%token COMMENT_SYM -%token COMMITTED_SYM /* SQL-2003-N */ -%token COMMIT_SYM /* SQL-2003-R */ -%token COMPACT_SYM -%token COMPLETION_SYM -%token COMPRESSED_SYM -%token CONCURRENT %token CONDITION_SYM /* SQL-2003-R, SQL-2008-R */ -%token CONNECTION_SYM -%token CONSISTENT_SYM %token CONSTRAINT /* SQL-2003-R */ -%token CONSTRAINT_CATALOG_SYM /* SQL-2003-N */ -%token CONSTRAINT_NAME_SYM /* SQL-2003-N */ -%token CONSTRAINT_SCHEMA_SYM /* SQL-2003-N */ -%token CONTAINS_SYM /* SQL-2003-N */ -%token CONTEXT_SYM %token CONTINUE_SYM /* SQL-2003-R */ -%token CONTRIBUTORS_SYM %token CONVERT_SYM /* SQL-2003-N */ %token COUNT_SYM /* SQL-2003-N */ -%token CPU_SYM %token CREATE /* SQL-2003-R */ %token CROSS /* SQL-2003-R */ -%token CUBE_SYM /* SQL-2003-R */ %token CUME_DIST_SYM %token CURDATE /* MYSQL-FUNC */ -%token CURRENT_SYM /* SQL-2003-R */ %token CURRENT_USER /* SQL-2003-R */ %token CURRENT_ROLE /* SQL-2003-R */ -%token CURRENT_POS_SYM %token CURSOR_SYM /* SQL-2003-R */ -%token CURSOR_NAME_SYM /* SQL-2003-N */ %token CURTIME /* MYSQL-FUNC */ -%token CYCLE_SYM %token DATABASE %token DATABASES -%token DATAFILE_SYM -%token DATA_SYM /* SQL-2003-N */ -%token DATETIME %token DATE_ADD_INTERVAL /* MYSQL-FUNC */ -%token DATE_FORMAT_SYM /* MYSQL-FUNC */ %token DATE_SUB_INTERVAL /* MYSQL-FUNC */ -%token DATE_SYM /* SQL-2003-R */ %token DAY_HOUR_SYM %token DAY_MICROSECOND_SYM %token DAY_MINUTE_SYM %token DAY_SECOND_SYM -%token DAY_SYM /* SQL-2003-R */ -%token DEALLOCATE_SYM /* SQL-2003-R */ %token DECIMAL_NUM %token DECIMAL_SYM /* SQL-2003-R */ %token DECLARE_SYM /* SQL-2003-R */ -%token DECODE_SYM /* Oracle function, non-reserved */ %token DEFAULT /* SQL-2003-R */ -%token DEFINER_SYM -%token DELAYED_SYM -%token DELAY_KEY_WRITE_SYM %token DELETE_DOMAIN_ID_SYM %token DELETE_SYM /* SQL-2003-R */ %token DENSE_RANK_SYM %token DESC /* SQL-2003-N */ %token DESCRIBE /* SQL-2003-R */ -%token DES_KEY_FILE %token DETERMINISTIC_SYM /* SQL-2003-R */ -%token DIAGNOSTICS_SYM /* SQL-2003-N */ -%token DIRECTORY_SYM -%token DISABLE_SYM -%token DISCARD -%token DISK_SYM %token DISTINCT /* SQL-2003-R */ %token DIV_SYM %token DOUBLE_SYM /* SQL-2003-R */ %token DO_DOMAIN_IDS_SYM -%token DO_SYM %token DOT_DOT_SYM %token DROP /* SQL-2003-R */ %token DUAL_SYM -%token DUMPFILE -%token DUPLICATE_SYM -%token DYNAMIC_SYM /* SQL-2003-R */ %token EACH_SYM /* SQL-2003-R */ %token ELSE /* SQL-2003-R */ %token ELSEIF_SYM -%token ELSIF_SYM /* Oracle, reserved in PL/SQL*/ -%token ENABLE_SYM %token ENCLOSED -%token END /* SQL-2003-R */ -%token ENDS_SYM %token END_OF_INPUT /* INTERNAL */ -%token ENGINES_SYM -%token ENGINE_SYM -%token ENUM %token EQUAL_SYM /* OPERATOR */ -%token ERROR_SYM -%token ERRORS %token ESCAPED -%token ESCAPE_SYM /* SQL-2003-R */ -%token EVENTS_SYM -%token EVENT_SYM -%token EVERY_SYM /* SQL-2003-N */ -%token EXCHANGE_SYM -%token EXAMINED_SYM %token EXCEPT_SYM /* SQL-2003-R */ -%token EXCLUDE_SYM /* SQL-2011-N */ -%token EXECUTE_SYM /* SQL-2003-R */ -%token EXCEPTION_SYM /* SQL-2003-N, Oracle-PLSQL-R */ %token EXISTS /* SQL-2003-R */ -%token EXIT_SYM -%token EXPANSION_SYM -%token EXPORT_SYM -%token EXTENDED_SYM -%token EXTENT_SIZE_SYM %token EXTRACT_SYM /* SQL-2003-N */ %token FALSE_SYM /* SQL-2003-R */ -%token FAST_SYM -%token FAULTS_SYM %token FETCH_SYM /* SQL-2003-R */ -%token FILE_SYM %token FIRST_VALUE_SYM /* SQL-2011 */ -%token FIRST_SYM /* SQL-2003-N */ -%token FIXED_SYM %token FLOAT_NUM %token FLOAT_SYM /* SQL-2003-R */ -%token FLUSH_SYM -%token FOLLOWS_SYM /* MYSQL trigger*/ -%token FOLLOWING_SYM /* SQL-2011-N */ -%token FORCE_SYM %token FOREIGN /* SQL-2003-R */ %token FOR_SYM /* SQL-2003-R */ %token FOR_SYSTEM_TIME_SYM /* INTERNAL */ -%token FORMAT_SYM -%token FOUND_SYM /* SQL-2003-R */ %token FROM -%token FULL /* SQL-2003-R */ %token FULLTEXT_SYM -%token FUNCTION_SYM /* SQL-2003-R */ %token GE -%token GENERAL -%token GENERATED_SYM -%token GEOMETRYCOLLECTION -%token GEOMETRY_SYM -%token GET_FORMAT /* MYSQL-FUNC */ -%token GET_SYM /* SQL-2003-R */ -%token GLOBAL_SYM /* SQL-2003-R */ -%token GOTO_SYM /* Oracle, reserved in PL/SQL*/ %token GRANT /* SQL-2003-R */ -%token GRANTS %token GROUP_SYM /* SQL-2003-R */ %token GROUP_CONCAT_SYM %token LAG_SYM /* SQL-2011 */ %token LEAD_SYM /* SQL-2011 */ -%token HANDLER_SYM -%token HARD_SYM -%token HASH_SYM %token HAVING /* SQL-2003-R */ -%token HELP_SYM %token HEX_NUM %token HEX_STRING -%token HIGH_PRIORITY -%token HISTORY_SYM /* MYSQL */ -%token HOST_SYM -%token HOSTS_SYM %token HOUR_MICROSECOND_SYM %token HOUR_MINUTE_SYM %token HOUR_SECOND_SYM -%token HOUR_SYM /* SQL-2003-R */ -%token ID_SYM /* MYSQL */ %token IDENT -%token IDENTIFIED_SYM %token IDENT_QUOTED %token IF_SYM %token IGNORE_DOMAIN_IDS_SYM %token IGNORE_SYM -%token IGNORE_SERVER_IDS_SYM -%token IMMEDIATE_SYM /* SQL-2003-R */ -%token IMPORT -%token INCREMENT_SYM -%token INDEXES %token INDEX_SYM %token INFILE -%token INITIAL_SIZE_SYM %token INNER_SYM /* SQL-2003-R */ %token INOUT_SYM /* SQL-2003-R */ %token INSENSITIVE_SYM /* SQL-2003-R */ %token INSERT /* SQL-2003-R */ -%token INSERT_METHOD -%token INSTALL_SYM %token INTERSECT_SYM /* SQL-2003-R */ %token INTERVAL_SYM /* SQL-2003-R */ %token INTO /* SQL-2003-R */ %token INT_SYM /* SQL-2003-R */ -%token INVOKER_SYM %token IN_SYM /* SQL-2003-R */ -%token IO_SYM -%token IPC_SYM %token IS /* SQL-2003-R */ -%token ISOLATION /* SQL-2003-R */ -%token ISOPEN_SYM /* Oracle-N */ -%token ISSUER_SYM %token ITERATE_SYM -%token INVISIBLE_SYM %token JOIN_SYM /* SQL-2003-R */ -%token JSON_SYM %token KEYS -%token KEY_BLOCK_SIZE %token KEY_SYM /* SQL-2003-N */ %token KILL_SYM -%token LANGUAGE_SYM /* SQL-2003-R */ -%token LAST_SYM /* SQL-2003-N */ -%token LAST_VALUE -%token LASTVAL_SYM /* PostgreSQL sequence function */ %token LE /* OPERATOR */ %token LEADING /* SQL-2003-R */ -%token LEAVES %token LEAVE_SYM %token LEFT /* SQL-2003-R */ -%token LESS_SYM -%token LEVEL_SYM %token LEX_HOSTNAME %token LIKE /* SQL-2003-R */ %token LIMIT %token LINEAR_SYM %token LINES -%token LINESTRING -%token LIST_SYM %token LOAD -%token LOCAL_SYM /* SQL-2003-R */ %token LOCATOR_SYM /* SQL-2003-N */ -%token LOCKS_SYM %token LOCK_SYM -%token LOGFILE_SYM -%token LOGS_SYM %token LONGBLOB %token LONGTEXT %token LONG_NUM %token LONG_SYM %token LOOP_SYM %token LOW_PRIORITY -%token MASTER_CONNECT_RETRY_SYM -%token MASTER_DELAY_SYM -%token MASTER_GTID_POS_SYM -%token MASTER_HOST_SYM -%token MASTER_LOG_FILE_SYM -%token MASTER_LOG_POS_SYM -%token MASTER_PASSWORD_SYM -%token MASTER_PORT_SYM -%token MASTER_SERVER_ID_SYM -%token MASTER_SSL_CAPATH_SYM -%token MASTER_SSL_CA_SYM -%token MASTER_SSL_CERT_SYM -%token MASTER_SSL_CIPHER_SYM -%token MASTER_SSL_CRL_SYM -%token MASTER_SSL_CRLPATH_SYM -%token MASTER_SSL_KEY_SYM -%token MASTER_SSL_SYM %token MASTER_SSL_VERIFY_SERVER_CERT_SYM -%token MASTER_SYM -%token MASTER_USER_SYM -%token MASTER_USE_GTID_SYM -%token MASTER_HEARTBEAT_PERIOD_SYM %token MATCH /* SQL-2003-R */ -%token MAX_CONNECTIONS_PER_HOUR -%token MAX_QUERIES_PER_HOUR -%token MAX_ROWS -%token MAX_SIZE_SYM %token MAX_SYM /* SQL-2003-N */ -%token MAX_UPDATES_PER_HOUR -%token MAX_STATEMENT_TIME_SYM -%token MAX_USER_CONNECTIONS_SYM %token MAXVALUE_SYM /* SQL-2003-N */ %token MEDIAN_SYM %token MEDIUMBLOB %token MEDIUMINT %token MEDIUMTEXT -%token MEDIUM_SYM -%token MEMORY_SYM -%token MERGE_SYM /* SQL-2003-R */ -%token MESSAGE_TEXT_SYM /* SQL-2003-N */ -%token MICROSECOND_SYM /* MYSQL-FUNC */ -%token MIGRATE_SYM %token MINUTE_MICROSECOND_SYM %token MINUTE_SECOND_SYM -%token MINUTE_SYM /* SQL-2003-R */ -%token MINVALUE_SYM -%token MIN_ROWS %token MIN_SYM /* SQL-2003-N */ -%token MODE_SYM %token MODIFIES_SYM /* SQL-2003-R */ -%token MODIFY_SYM %token MOD_SYM /* SQL-2003-N */ -%token MONTH_SYM /* SQL-2003-R */ -%token MULTILINESTRING -%token MULTIPOINT -%token MULTIPOLYGON -%token MUTEX_SYM -%token MYSQL_SYM -%token MYSQL_ERRNO_SYM -%token NAMES_SYM /* SQL-2003-N */ -%token NAME_SYM /* SQL-2003-N */ -%token NATIONAL_SYM /* SQL-2003-R */ %token NATURAL /* SQL-2003-R */ %token NCHAR_STRING -%token NCHAR_SYM /* SQL-2003-R */ %token NE /* OPERATOR */ %token NEG -%token NEW_SYM /* SQL-2003-R */ -%token NEXT_SYM /* SQL-2003-N */ -%token NEXTVAL_SYM /* PostgreSQL sequence function */ -%token NOCACHE_SYM -%token NOCYCLE_SYM -%token NODEGROUP_SYM -%token NONE_SYM /* SQL-2003-R */ %token NOT2_SYM %token NOT_SYM /* SQL-2003-R */ -%token NOTFOUND_SYM /* Oracle-R */ %token NOW_SYM -%token NO_SYM /* SQL-2003-R */ -%token NOMAXVALUE_SYM -%token NOMINVALUE_SYM -%token NO_WAIT_SYM -%token NOWAIT_SYM %token NO_WRITE_TO_BINLOG %token NTILE_SYM %token NULL_SYM /* SQL-2003-R */ %token NUM -%token NUMBER_SYM /* SQL-2003-N */ %token NUMERIC_SYM /* SQL-2003-R */ %token NTH_VALUE_SYM /* SQL-2011 */ -%token NVARCHAR_SYM -%token OF_SYM /* SQL-1992-R, Oracle-R */ -%token OFFSET_SYM -%token OLD_PASSWORD_SYM %token ON /* SQL-2003-R */ -%token ONE_SYM -%token ONLY_SYM /* SQL-2003-R */ -%token ONLINE_SYM -%token OPEN_SYM /* SQL-2003-R */ %token OPTIMIZE -%token OPTIONS_SYM -%token OPTION /* SQL-2003-N */ %token OPTIONALLY %token OR2_SYM %token ORDER_SYM /* SQL-2003-R */ %token OR_OR_SYM /* OPERATOR */ %token OR_SYM /* SQL-2003-R */ -%token OTHERS_SYM /* SQL-2011-N */ %token OUTER %token OUTFILE %token OUT_SYM /* SQL-2003-R */ %token OVER_SYM -%token OWNER_SYM -%token PACKAGE_SYM /* Oracle-R */ -%token PACK_KEYS_SYM -%token PAGE_SYM %token PAGE_CHECKSUM_SYM %token PARAM_MARKER -%token PARSER_SYM %token PARSE_VCOL_EXPR_SYM -%token PARTIAL /* SQL-2003-N */ %token PARTITION_SYM /* SQL-2003-R */ -%token PARTITIONS_SYM -%token PARTITIONING_SYM -%token PASSWORD_SYM %token PERCENT_RANK_SYM %token PERCENTILE_CONT_SYM %token PERCENTILE_DISC_SYM -%token PERIOD_SYM /* SQL-2011-R */ -%token PERSISTENT_SYM -%token PHASE_SYM -%token PLUGINS_SYM -%token PLUGIN_SYM -%token POINT_SYM -%token POLYGON -%token PORT_SYM %token POSITION_SYM /* SQL-2003-N */ -%token PRECEDES_SYM /* MYSQL */ -%token PRECEDING_SYM /* SQL-2011-N */ %token PRECISION /* SQL-2003-R */ -%token PREPARE_SYM /* SQL-2003-R */ -%token PRESERVE_SYM -%token PREV_SYM -%token PREVIOUS_SYM %token PRIMARY_SYM /* SQL-2003-R */ -%token PRIVILEGES /* SQL-2003-N */ %token PROCEDURE_SYM /* SQL-2003-R */ -%token PROCESS -%token PROCESSLIST_SYM -%token PROFILE_SYM -%token PROFILES_SYM -%token PROXY_SYM %token PURGE -%token QUARTER_SYM -%token QUERY_SYM -%token QUICK -%token RAISE_SYM /* Oracle-PLSQL-R */ %token RANGE_SYM /* SQL-2003-R */ %token RANK_SYM -%token RAW /* Oracle */ %token READS_SYM /* SQL-2003-R */ -%token READ_ONLY_SYM %token READ_SYM /* SQL-2003-N */ %token READ_WRITE_SYM %token REAL /* SQL-2003-R */ -%token REBUILD_SYM -%token RECOVER_SYM %token RECURSIVE_SYM -%token REDOFILE_SYM -%token REDO_BUFFER_SIZE_SYM -%token REDUNDANT_SYM +%token REF_SYSTEM_ID_SYM %token REFERENCES /* SQL-2003-R */ %token REGEXP -%token RELAY -%token RELAYLOG_SYM -%token RELAY_LOG_FILE_SYM -%token RELAY_LOG_POS_SYM -%token RELAY_THREAD %token RELEASE_SYM /* SQL-2003-R */ -%token RELOAD -%token REMOVE_SYM %token RENAME -%token REORGANIZE_SYM -%token REPAIR -%token REPEATABLE_SYM /* SQL-2003-N */ %token REPEAT_SYM /* MYSQL-FUNC */ %token REPLACE /* MYSQL-FUNC */ -%token REPLICATION %token REQUIRE_SYM -%token RESET_SYM -%token RESTART_SYM %token RESIGNAL_SYM /* SQL-2003-R */ -%token RESOURCES -%token RESTORE_SYM %token RESTRICT -%token RESUME_SYM -%token RETURNED_SQLSTATE_SYM /* SQL-2003-N */ %token RETURNING_SYM -%token RETURNS_SYM /* SQL-2003-R */ %token RETURN_SYM /* SQL-2003-R */ -%token REUSE_SYM /* Oracle-R */ -%token REVERSE_SYM %token REVOKE /* SQL-2003-R */ %token RIGHT /* SQL-2003-R */ -%token ROLE_SYM -%token ROLLBACK_SYM /* SQL-2003-R */ -%token ROLLUP_SYM /* SQL-2003-R */ -%token ROUTINE_SYM /* SQL-2003-N */ -%token ROWCOUNT_SYM /* Oracle-N */ -%token ROW_SYM /* SQL-2003-R */ %token ROWS_SYM /* SQL-2003-R */ -%token ROWTYPE_SYM /* Oracle-PLSQL-R */ -%token ROW_COUNT_SYM /* SQL-2003-N */ -%token ROW_FORMAT_SYM %token ROW_NUMBER_SYM -%token RTREE_SYM -%token SAVEPOINT_SYM /* SQL-2003-R */ -%token SCHEDULE_SYM -%token SCHEMA_NAME_SYM /* SQL-2003-N */ %token SECOND_MICROSECOND_SYM -%token SECOND_SYM /* SQL-2003-R */ -%token SECURITY_SYM /* SQL-2003-N */ %token SELECT_SYM /* SQL-2003-R */ %token SENSITIVE_SYM /* FUTURE-USE */ %token SEPARATOR_SYM -%token SEQUENCE_SYM -%token SERIALIZABLE_SYM /* SQL-2003-N */ -%token SERIAL_SYM -%token SESSION_SYM /* SQL-2003-N */ -%token SERVER_SYM %token SERVER_OPTIONS %token SET /* SQL-2003-R */ -%token SETVAL_SYM /* PostgreSQL sequence function */ %token SET_VAR -%token SHARE_SYM %token SHIFT_LEFT /* OPERATOR */ %token SHIFT_RIGHT /* OPERATOR */ %token SHOW -%token SHUTDOWN %token SIGNAL_SYM /* SQL-2003-R */ -%token SIGNED_SYM -%token SIMPLE_SYM /* SQL-2003-N */ -%token SLAVE -%token SLAVES -%token SLAVE_POS_SYM -%token SLOW %token SMALLINT /* SQL-2003-R */ -%token SNAPSHOT_SYM -%token SOCKET_SYM -%token SOFT_SYM -%token SONAME_SYM -%token SOUNDS_SYM -%token SOURCE_SYM %token SPATIAL_SYM %token SPECIFIC_SYM /* SQL-2003-R */ %token SQLEXCEPTION_SYM /* SQL-2003-R */ %token SQLSTATE_SYM /* SQL-2003-R */ %token SQLWARNING_SYM /* SQL-2003-R */ %token SQL_BIG_RESULT -%token SQL_BUFFER_RESULT -%token SQL_CACHE_SYM -%token SQL_CALC_FOUND_ROWS -%token SQL_NO_CACHE_SYM %token SQL_SMALL_RESULT %token SQL_SYM /* SQL-2003-R */ -%token SQL_THREAD -%token REF_SYSTEM_ID_SYM %token SSL_SYM %token STARTING -%token STARTS_SYM -%token START_SYM /* SQL-2003-R */ -%token STATEMENT_SYM %token STATS_AUTO_RECALC_SYM %token STATS_PERSISTENT_SYM %token STATS_SAMPLE_PAGES_SYM -%token STATUS_SYM %token STDDEV_SAMP_SYM /* SQL-2003-N */ %token STD_SYM -%token STOP_SYM -%token STORAGE_SYM -%token STORED_SYM %token STRAIGHT_JOIN -%token STRING_SYM -%token SUBCLASS_ORIGIN_SYM /* SQL-2003-N */ -%token SUBDATE_SYM -%token SUBJECT_SYM -%token SUBPARTITIONS_SYM -%token SUBPARTITION_SYM %token SUBSTRING /* SQL-2003-N */ %token SUM_SYM /* SQL-2003-N */ -%token SUPER_SYM -%token SUSPEND_SYM -%token SWAPS_SYM -%token SWITCHES_SYM %token SYSDATE -%token SYSTEM /* SQL-2011-R */ -%token SYSTEM_TIME_SYM /* SQL-2011-R */ -%token TABLES -%token TABLESPACE %token TABLE_REF_PRIORITY %token TABLE_SYM /* SQL-2003-R */ -%token TABLE_CHECKSUM_SYM -%token TABLE_NAME_SYM /* SQL-2003-N */ -%token TEMPORARY /* SQL-2003-N */ -%token TEMPTABLE_SYM %token TERMINATED %token TEXT_STRING -%token TEXT_SYM -%token THAN_SYM %token THEN_SYM /* SQL-2003-R */ -%token TIES_SYM /* SQL-2011-N */ -%token TIMESTAMP /* SQL-2003-R */ -%token TIMESTAMP_ADD -%token TIMESTAMP_DIFF -%token TIME_SYM /* SQL-2003-R */ %token TINYBLOB %token TINYINT %token TINYTEXT %token TO_SYM /* SQL-2003-R */ %token TRAILING /* SQL-2003-R */ -%token TRANSACTION_SYM -%token TRANSACTIONAL_SYM -%token TRIGGERS_SYM %token TRIGGER_SYM /* SQL-2003-R */ %token TRIM /* SQL-2003-N */ -%token TRIM_ORACLE %token TRUE_SYM /* SQL-2003-R */ -%token TRUNCATE_SYM -%token TYPES_SYM -%token TYPE_SYM /* SQL-2003-N */ -%token UDF_RETURNS_SYM %token ULONGLONG_NUM -%token UNBOUNDED_SYM /* SQL-2011-N */ -%token UNCOMMITTED_SYM /* SQL-2003-N */ -%token UNDEFINED_SYM %token UNDERSCORE_CHARSET -%token UNDOFILE_SYM -%token UNDO_BUFFER_SIZE_SYM %token UNDO_SYM /* FUTURE-USE */ -%token UNICODE_SYM -%token UNINSTALL_SYM %token UNION_SYM /* SQL-2003-R */ %token UNIQUE_SYM -%token UNKNOWN_SYM /* SQL-2003-R */ %token UNLOCK_SYM %token UNSIGNED -%token UNTIL_SYM %token UPDATE_SYM /* SQL-2003-R */ -%token UPGRADE_SYM %token USAGE /* SQL-2003-N */ -%token USER_SYM /* SQL-2003-R */ -%token USE_FRM %token USE_SYM %token USING /* SQL-2003-R */ %token UTC_DATE_SYM @@ -1593,44 +1196,462 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); %token VALUES /* SQL-2003-R */ %token VALUES_IN_SYM %token VALUES_LESS_SYM -%token VALUE_SYM /* SQL-2003-R */ %token VARBINARY %token VARCHAR /* SQL-2003-R */ -%token VARCHAR2 /* Oracle */ -%token VARIABLES %token VARIANCE_SYM %token VARYING /* SQL-2003-R */ %token VAR_SAMP_SYM -%token VERSIONING_SYM /* SQL-2011-R */ -%token VIA_SYM -%token VIEW_SYM /* SQL-2003-N */ -%token VIRTUAL_SYM -%token WAIT_SYM -%token WARNINGS -%token WEEK_SYM -%token WEIGHT_STRING_SYM %token WHEN_SYM /* SQL-2003-R */ %token WHERE /* SQL-2003-R */ -%token WINDOW_SYM %token WHILE_SYM %token WITH /* SQL-2003-R */ -%token WITHIN -%token WITHOUT /* SQL-2003-R */ %token WITH_CUBE_SYM /* INTERNAL */ %token WITH_ROLLUP_SYM /* INTERNAL */ %token WITH_SYSTEM_SYM /* INTERNAL */ -%token WORK_SYM /* SQL-2003-N */ -%token WRAPPER_SYM -%token WRITE_SYM /* SQL-2003-N */ -%token X509_SYM -%token XA_SYM -%token XML_SYM %token XOR %token YEAR_MONTH_SYM -%token YEAR_SYM /* SQL-2003-R */ %token ZEROFILL -%token IMPOSSIBLE_ACTION /* To avoid warning for yyerrlab1 */ +%token IMPOSSIBLE_ACTION /* To avoid warning for yyerrlab1 */ + + +/* + Keywords that have different reserved status in std/oracle modes. +*/ +%token <kwd> BODY_SYM /* Oracle-R */ +%token <kwd> COMMENT_SYM +%token <kwd> ELSIF_SYM /* Oracle, reserved in PL/SQL*/ +%token <kwd> GOTO_SYM /* Oracle, reserved in PL/SQL*/ +%token <kwd> HISTORY_SYM /* MYSQL */ +%token <kwd> OTHERS_SYM /* SQL-2011-N */ +%token <kwd> PACKAGE_SYM /* Oracle-R */ +%token <kwd> PERIOD_SYM /* SQL-2011-R */ +%token <kwd> RAISE_SYM /* Oracle-PLSQL-R */ +%token <kwd> ROWTYPE_SYM /* Oracle-PLSQL-R */ +%token <kwd> SYSTEM /* SQL-2011-R */ +%token <kwd> SYSTEM_TIME_SYM /* SQL-2011-R */ +%token <kwd> VERSIONING_SYM /* SQL-2011-R */ +%token <kwd> WINDOW_SYM +%token <kwd> WITHOUT /* SQL-2003-R */ + +/* + Non-reserved keywords +*/ + +%token <kwd> ACTION /* SQL-2003-N */ +%token <kwd> ADMIN_SYM /* SQL-2003-N */ +%token <kwd> ADDDATE_SYM /* MYSQL-FUNC */ +%token <kwd> AFTER_SYM /* SQL-2003-N */ +%token <kwd> AGAINST +%token <kwd> AGGREGATE_SYM +%token <kwd> ALGORITHM_SYM +%token <kwd> ALWAYS_SYM +%token <kwd> ANY_SYM /* SQL-2003-R */ +%token <kwd> ASCII_SYM /* MYSQL-FUNC */ +%token <kwd> AT_SYM /* SQL-2003-R */ +%token <kwd> ATOMIC_SYM /* SQL-2003-R */ +%token <kwd> AUTHORS_SYM +%token <kwd> AUTOEXTEND_SIZE_SYM +%token <kwd> AUTO_INC +%token <kwd> AUTO_SYM +%token <kwd> AVG_ROW_LENGTH +%token <kwd> AVG_SYM /* SQL-2003-N */ +%token <kwd> BACKUP_SYM +%token <kwd> BEGIN_SYM /* SQL-2003-R */ +%token <kwd> BINLOG_SYM +%token <kwd> BIT_SYM /* MYSQL-FUNC */ +%token <kwd> BLOCK_SYM +%token <kwd> BOOL_SYM +%token <kwd> BOOLEAN_SYM /* SQL-2003-R */ +%token <kwd> BTREE_SYM +%token <kwd> BYTE_SYM +%token <kwd> CACHE_SYM +%token <kwd> CASCADED /* SQL-2003-R */ +%token <kwd> CATALOG_NAME_SYM /* SQL-2003-N */ +%token <kwd> CHAIN_SYM /* SQL-2003-N */ +%token <kwd> CHANGED +%token <kwd> CHARSET +%token <kwd> CHECKPOINT_SYM +%token <kwd> CHECKSUM_SYM +%token <kwd> CIPHER_SYM +%token <kwd> CLASS_ORIGIN_SYM /* SQL-2003-N */ +%token <kwd> CLIENT_SYM +%token <kwd> CLOB /* SQL-2003-R */ +%token <kwd> CLOSE_SYM /* SQL-2003-R */ +%token <kwd> COALESCE /* SQL-2003-N */ +%token <kwd> CODE_SYM +%token <kwd> COLLATION_SYM /* SQL-2003-N */ +%token <kwd> COLUMNS +%token <kwd> COLUMN_ADD_SYM +%token <kwd> COLUMN_CHECK_SYM +%token <kwd> COLUMN_CREATE_SYM +%token <kwd> COLUMN_DELETE_SYM +%token <kwd> COLUMN_GET_SYM +%token <kwd> COLUMN_SYM /* SQL-2003-R */ +%token <kwd> COLUMN_NAME_SYM /* SQL-2003-N */ +%token <kwd> COMMITTED_SYM /* SQL-2003-N */ +%token <kwd> COMMIT_SYM /* SQL-2003-R */ +%token <kwd> COMPACT_SYM +%token <kwd> COMPLETION_SYM +%token <kwd> COMPRESSED_SYM +%token <kwd> CONCURRENT +%token <kwd> CONNECTION_SYM +%token <kwd> CONSISTENT_SYM +%token <kwd> CONSTRAINT_CATALOG_SYM /* SQL-2003-N */ +%token <kwd> CONSTRAINT_NAME_SYM /* SQL-2003-N */ +%token <kwd> CONSTRAINT_SCHEMA_SYM /* SQL-2003-N */ +%token <kwd> CONTAINS_SYM /* SQL-2003-N */ +%token <kwd> CONTEXT_SYM +%token <kwd> CONTRIBUTORS_SYM +%token <kwd> CPU_SYM +%token <kwd> CUBE_SYM /* SQL-2003-R */ +%token <kwd> CURRENT_SYM /* SQL-2003-R */ +%token <kwd> CURRENT_POS_SYM +%token <kwd> CURSOR_NAME_SYM /* SQL-2003-N */ +%token <kwd> CYCLE_SYM +%token <kwd> DATAFILE_SYM +%token <kwd> DATA_SYM /* SQL-2003-N */ +%token <kwd> DATETIME +%token <kwd> DATE_FORMAT_SYM /* MYSQL-FUNC */ +%token <kwd> DATE_SYM /* SQL-2003-R */ +%token <kwd> DAY_SYM /* SQL-2003-R */ +%token <kwd> DEALLOCATE_SYM /* SQL-2003-R */ +%token <kwd> DECODE_SYM /* Oracle function, non-reserved */ +%token <kwd> DEFINER_SYM +%token <kwd> DELAYED_SYM +%token <kwd> DELAY_KEY_WRITE_SYM +%token <kwd> DES_KEY_FILE +%token <kwd> DIAGNOSTICS_SYM /* SQL-2003-N */ +%token <kwd> DIRECTORY_SYM +%token <kwd> DISABLE_SYM +%token <kwd> DISCARD +%token <kwd> DISK_SYM +%token <kwd> DO_SYM +%token <kwd> DUMPFILE +%token <kwd> DUPLICATE_SYM +%token <kwd> DYNAMIC_SYM /* SQL-2003-R */ +%token <kwd> ENABLE_SYM +%token <kwd> END /* SQL-2003-R */ +%token <kwd> ENDS_SYM +%token <kwd> ENGINES_SYM +%token <kwd> ENGINE_SYM +%token <kwd> ENUM +%token <kwd> ERROR_SYM +%token <kwd> ERRORS +%token <kwd> ESCAPE_SYM /* SQL-2003-R */ +%token <kwd> EVENTS_SYM +%token <kwd> EVENT_SYM +%token <kwd> EVERY_SYM /* SQL-2003-N */ +%token <kwd> EXCHANGE_SYM +%token <kwd> EXAMINED_SYM +%token <kwd> EXCLUDE_SYM /* SQL-2011-N */ +%token <kwd> EXECUTE_SYM /* SQL-2003-R */ +%token <kwd> EXCEPTION_SYM /* SQL-2003-N, Oracle-PLSQL-R */ +%token <kwd> EXIT_SYM +%token <kwd> EXPANSION_SYM +%token <kwd> EXPORT_SYM +%token <kwd> EXTENDED_SYM +%token <kwd> EXTENT_SIZE_SYM +%token <kwd> FAST_SYM +%token <kwd> FAULTS_SYM +%token <kwd> FILE_SYM +%token <kwd> FIRST_SYM /* SQL-2003-N */ +%token <kwd> FIXED_SYM +%token <kwd> FLUSH_SYM +%token <kwd> FOLLOWS_SYM /* MYSQL trigger*/ +%token <kwd> FOLLOWING_SYM /* SQL-2011-N */ +%token <kwd> FORCE_SYM +%token <kwd> FORMAT_SYM +%token <kwd> FOUND_SYM /* SQL-2003-R */ +%token <kwd> FULL /* SQL-2003-R */ +%token <kwd> FUNCTION_SYM /* SQL-2003-R */ +%token <kwd> GENERAL +%token <kwd> GENERATED_SYM +%token <kwd> GEOMETRYCOLLECTION +%token <kwd> GEOMETRY_SYM +%token <kwd> GET_FORMAT /* MYSQL-FUNC */ +%token <kwd> GET_SYM /* SQL-2003-R */ +%token <kwd> GLOBAL_SYM /* SQL-2003-R */ +%token <kwd> GRANTS +%token <kwd> HANDLER_SYM +%token <kwd> HARD_SYM +%token <kwd> HASH_SYM +%token <kwd> HELP_SYM +%token <kwd> HIGH_PRIORITY +%token <kwd> HOST_SYM +%token <kwd> HOSTS_SYM +%token <kwd> HOUR_SYM /* SQL-2003-R */ +%token <kwd> ID_SYM /* MYSQL */ +%token <kwd> IDENTIFIED_SYM +%token <kwd> IGNORE_SERVER_IDS_SYM +%token <kwd> IMMEDIATE_SYM /* SQL-2003-R */ +%token <kwd> IMPORT +%token <kwd> INCREMENT_SYM +%token <kwd> INDEXES +%token <kwd> INITIAL_SIZE_SYM +%token <kwd> INSERT_METHOD +%token <kwd> INSTALL_SYM +%token <kwd> INVOKER_SYM +%token <kwd> IO_SYM +%token <kwd> IPC_SYM +%token <kwd> ISOLATION /* SQL-2003-R */ +%token <kwd> ISOPEN_SYM /* Oracle-N */ +%token <kwd> ISSUER_SYM +%token <kwd> INVISIBLE_SYM +%token <kwd> JSON_SYM +%token <kwd> KEY_BLOCK_SIZE +%token <kwd> LANGUAGE_SYM /* SQL-2003-R */ +%token <kwd> LAST_SYM /* SQL-2003-N */ +%token <kwd> LAST_VALUE +%token <kwd> LASTVAL_SYM /* PostgreSQL sequence function */ +%token <kwd> LEAVES +%token <kwd> LESS_SYM +%token <kwd> LEVEL_SYM +%token <kwd> LINESTRING +%token <kwd> LIST_SYM +%token <kwd> LOCAL_SYM /* SQL-2003-R */ +%token <kwd> LOCKS_SYM +%token <kwd> LOGFILE_SYM +%token <kwd> LOGS_SYM +%token <kwd> MASTER_CONNECT_RETRY_SYM +%token <kwd> MASTER_DELAY_SYM +%token <kwd> MASTER_GTID_POS_SYM +%token <kwd> MASTER_HOST_SYM +%token <kwd> MASTER_LOG_FILE_SYM +%token <kwd> MASTER_LOG_POS_SYM +%token <kwd> MASTER_PASSWORD_SYM +%token <kwd> MASTER_PORT_SYM +%token <kwd> MASTER_SERVER_ID_SYM +%token <kwd> MASTER_SSL_CAPATH_SYM +%token <kwd> MASTER_SSL_CA_SYM +%token <kwd> MASTER_SSL_CERT_SYM +%token <kwd> MASTER_SSL_CIPHER_SYM +%token <kwd> MASTER_SSL_CRL_SYM +%token <kwd> MASTER_SSL_CRLPATH_SYM +%token <kwd> MASTER_SSL_KEY_SYM +%token <kwd> MASTER_SSL_SYM +%token <kwd> MASTER_SYM +%token <kwd> MASTER_USER_SYM +%token <kwd> MASTER_USE_GTID_SYM +%token <kwd> MASTER_HEARTBEAT_PERIOD_SYM +%token <kwd> MAX_CONNECTIONS_PER_HOUR +%token <kwd> MAX_QUERIES_PER_HOUR +%token <kwd> MAX_ROWS +%token <kwd> MAX_SIZE_SYM +%token <kwd> MAX_UPDATES_PER_HOUR +%token <kwd> MAX_STATEMENT_TIME_SYM +%token <kwd> MAX_USER_CONNECTIONS_SYM +%token <kwd> MEDIUM_SYM +%token <kwd> MEMORY_SYM +%token <kwd> MERGE_SYM /* SQL-2003-R */ +%token <kwd> MESSAGE_TEXT_SYM /* SQL-2003-N */ +%token <kwd> MICROSECOND_SYM /* MYSQL-FUNC */ +%token <kwd> MIGRATE_SYM +%token <kwd> MINUTE_SYM /* SQL-2003-R */ +%token <kwd> MINVALUE_SYM +%token <kwd> MIN_ROWS +%token <kwd> MODE_SYM +%token <kwd> MODIFY_SYM +%token <kwd> MONTH_SYM /* SQL-2003-R */ +%token <kwd> MULTILINESTRING +%token <kwd> MULTIPOINT +%token <kwd> MULTIPOLYGON +%token <kwd> MUTEX_SYM +%token <kwd> MYSQL_SYM +%token <kwd> MYSQL_ERRNO_SYM +%token <kwd> NAMES_SYM /* SQL-2003-N */ +%token <kwd> NAME_SYM /* SQL-2003-N */ +%token <kwd> NATIONAL_SYM /* SQL-2003-R */ +%token <kwd> NCHAR_SYM /* SQL-2003-R */ +%token <kwd> NEW_SYM /* SQL-2003-R */ +%token <kwd> NEXT_SYM /* SQL-2003-N */ +%token <kwd> NEXTVAL_SYM /* PostgreSQL sequence function */ +%token <kwd> NOCACHE_SYM +%token <kwd> NOCYCLE_SYM +%token <kwd> NODEGROUP_SYM +%token <kwd> NONE_SYM /* SQL-2003-R */ +%token <kwd> NOTFOUND_SYM /* Oracle-R */ +%token <kwd> NO_SYM /* SQL-2003-R */ +%token <kwd> NOMAXVALUE_SYM +%token <kwd> NOMINVALUE_SYM +%token <kwd> NO_WAIT_SYM +%token <kwd> NOWAIT_SYM +%token <kwd> NUMBER_SYM /* SQL-2003-N */ +%token <kwd> NVARCHAR_SYM +%token <kwd> OF_SYM /* SQL-1992-R, Oracle-R */ +%token <kwd> OFFSET_SYM +%token <kwd> OLD_PASSWORD_SYM +%token <kwd> ONE_SYM +%token <kwd> ONLY_SYM /* SQL-2003-R */ +%token <kwd> ONLINE_SYM +%token <kwd> OPEN_SYM /* SQL-2003-R */ +%token <kwd> OPTIONS_SYM +%token <kwd> OPTION /* SQL-2003-N */ +%token <kwd> OWNER_SYM +%token <kwd> PACK_KEYS_SYM +%token <kwd> PAGE_SYM +%token <kwd> PARSER_SYM +%token <kwd> PARTIAL /* SQL-2003-N */ +%token <kwd> PARTITIONS_SYM +%token <kwd> PARTITIONING_SYM +%token <kwd> PASSWORD_SYM +%token <kwd> PERSISTENT_SYM +%token <kwd> PHASE_SYM +%token <kwd> PLUGINS_SYM +%token <kwd> PLUGIN_SYM +%token <kwd> POINT_SYM +%token <kwd> POLYGON +%token <kwd> PORT_SYM +%token <kwd> PRECEDES_SYM /* MYSQL */ +%token <kwd> PRECEDING_SYM /* SQL-2011-N */ +%token <kwd> PREPARE_SYM /* SQL-2003-R */ +%token <kwd> PRESERVE_SYM +%token <kwd> PREV_SYM +%token <kwd> PREVIOUS_SYM +%token <kwd> PRIVILEGES /* SQL-2003-N */ +%token <kwd> PROCESS +%token <kwd> PROCESSLIST_SYM +%token <kwd> PROFILE_SYM +%token <kwd> PROFILES_SYM +%token <kwd> PROXY_SYM +%token <kwd> QUARTER_SYM +%token <kwd> QUERY_SYM +%token <kwd> QUICK +%token <kwd> RAW /* Oracle */ +%token <kwd> READ_ONLY_SYM +%token <kwd> REBUILD_SYM +%token <kwd> RECOVER_SYM +%token <kwd> REDOFILE_SYM +%token <kwd> REDO_BUFFER_SIZE_SYM +%token <kwd> REDUNDANT_SYM +%token <kwd> RELAY +%token <kwd> RELAYLOG_SYM +%token <kwd> RELAY_LOG_FILE_SYM +%token <kwd> RELAY_LOG_POS_SYM +%token <kwd> RELAY_THREAD +%token <kwd> RELOAD +%token <kwd> REMOVE_SYM +%token <kwd> REORGANIZE_SYM +%token <kwd> REPAIR +%token <kwd> REPEATABLE_SYM /* SQL-2003-N */ +%token <kwd> REPLICATION +%token <kwd> RESET_SYM +%token <kwd> RESTART_SYM +%token <kwd> RESOURCES +%token <kwd> RESTORE_SYM +%token <kwd> RESUME_SYM +%token <kwd> RETURNED_SQLSTATE_SYM /* SQL-2003-N */ +%token <kwd> RETURNS_SYM /* SQL-2003-R */ +%token <kwd> REUSE_SYM /* Oracle-R */ +%token <kwd> REVERSE_SYM +%token <kwd> ROLE_SYM +%token <kwd> ROLLBACK_SYM /* SQL-2003-R */ +%token <kwd> ROLLUP_SYM /* SQL-2003-R */ +%token <kwd> ROUTINE_SYM /* SQL-2003-N */ +%token <kwd> ROWCOUNT_SYM /* Oracle-N */ +%token <kwd> ROW_SYM /* SQL-2003-R */ +%token <kwd> ROW_COUNT_SYM /* SQL-2003-N */ +%token <kwd> ROW_FORMAT_SYM +%token <kwd> RTREE_SYM +%token <kwd> SAVEPOINT_SYM /* SQL-2003-R */ +%token <kwd> SCHEDULE_SYM +%token <kwd> SCHEMA_NAME_SYM /* SQL-2003-N */ +%token <kwd> SECOND_SYM /* SQL-2003-R */ +%token <kwd> SECURITY_SYM /* SQL-2003-N */ +%token <kwd> SEQUENCE_SYM +%token <kwd> SERIALIZABLE_SYM /* SQL-2003-N */ +%token <kwd> SERIAL_SYM +%token <kwd> SESSION_SYM /* SQL-2003-N */ +%token <kwd> SERVER_SYM +%token <kwd> SETVAL_SYM /* PostgreSQL sequence function */ +%token <kwd> SHARE_SYM +%token <kwd> SHUTDOWN +%token <kwd> SIGNED_SYM +%token <kwd> SIMPLE_SYM /* SQL-2003-N */ +%token <kwd> SLAVE +%token <kwd> SLAVES +%token <kwd> SLAVE_POS_SYM +%token <kwd> SLOW +%token <kwd> SNAPSHOT_SYM +%token <kwd> SOCKET_SYM +%token <kwd> SOFT_SYM +%token <kwd> SONAME_SYM +%token <kwd> SOUNDS_SYM +%token <kwd> SOURCE_SYM +%token <kwd> SQL_BUFFER_RESULT +%token <kwd> SQL_CACHE_SYM +%token <kwd> SQL_CALC_FOUND_ROWS +%token <kwd> SQL_NO_CACHE_SYM +%token <kwd> SQL_THREAD +%token <kwd> STARTS_SYM +%token <kwd> START_SYM /* SQL-2003-R */ +%token <kwd> STATEMENT_SYM +%token <kwd> STATUS_SYM +%token <kwd> STOP_SYM +%token <kwd> STORAGE_SYM +%token <kwd> STORED_SYM +%token <kwd> STRING_SYM +%token <kwd> SUBCLASS_ORIGIN_SYM /* SQL-2003-N */ +%token <kwd> SUBDATE_SYM +%token <kwd> SUBJECT_SYM +%token <kwd> SUBPARTITIONS_SYM +%token <kwd> SUBPARTITION_SYM +%token <kwd> SUPER_SYM +%token <kwd> SUSPEND_SYM +%token <kwd> SWAPS_SYM +%token <kwd> SWITCHES_SYM +%token <kwd> TABLES +%token <kwd> TABLESPACE +%token <kwd> TABLE_CHECKSUM_SYM +%token <kwd> TABLE_NAME_SYM /* SQL-2003-N */ +%token <kwd> TEMPORARY /* SQL-2003-N */ +%token <kwd> TEMPTABLE_SYM +%token <kwd> TEXT_SYM +%token <kwd> THAN_SYM +%token <kwd> TIES_SYM /* SQL-2011-N */ +%token <kwd> TIMESTAMP /* SQL-2003-R */ +%token <kwd> TIMESTAMP_ADD +%token <kwd> TIMESTAMP_DIFF +%token <kwd> TIME_SYM /* SQL-2003-R */ +%token <kwd> TRANSACTION_SYM +%token <kwd> TRANSACTIONAL_SYM +%token <kwd> TRIGGERS_SYM +%token <kwd> TRIM_ORACLE +%token <kwd> TRUNCATE_SYM +%token <kwd> TYPES_SYM +%token <kwd> TYPE_SYM /* SQL-2003-N */ +%token <kwd> UDF_RETURNS_SYM +%token <kwd> UNBOUNDED_SYM /* SQL-2011-N */ +%token <kwd> UNCOMMITTED_SYM /* SQL-2003-N */ +%token <kwd> UNDEFINED_SYM +%token <kwd> UNDOFILE_SYM +%token <kwd> UNDO_BUFFER_SIZE_SYM +%token <kwd> UNICODE_SYM +%token <kwd> UNINSTALL_SYM +%token <kwd> UNKNOWN_SYM /* SQL-2003-R */ +%token <kwd> UNTIL_SYM +%token <kwd> UPGRADE_SYM +%token <kwd> USER_SYM /* SQL-2003-R */ +%token <kwd> USE_FRM +%token <kwd> VALUE_SYM /* SQL-2003-R */ +%token <kwd> VARCHAR2 /* Oracle */ +%token <kwd> VARIABLES +%token <kwd> VIA_SYM +%token <kwd> VIEW_SYM /* SQL-2003-N */ +%token <kwd> VIRTUAL_SYM +%token <kwd> WAIT_SYM +%token <kwd> WARNINGS +%token <kwd> WEEK_SYM +%token <kwd> WEIGHT_STRING_SYM +%token <kwd> WITHIN +%token <kwd> WORK_SYM /* SQL-2003-N */ +%token <kwd> WRAPPER_SYM +%token <kwd> WRITE_SYM /* SQL-2003-N */ +%token <kwd> X509_SYM +%token <kwd> XA_SYM +%token <kwd> XML_SYM +%token <kwd> YEAR_SYM /* SQL-2003-R */ + %left JOIN_SYM INNER_SYM STRAIGHT_JOIN CROSS LEFT RIGHT /* A dummy token to force the priority of table_ref production in a join. */ @@ -1653,20 +1674,26 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); %left INTERVAL_SYM %type <lex_str> - IDENT IDENT_QUOTED DECIMAL_NUM FLOAT_NUM NUM LONG_NUM + DECIMAL_NUM FLOAT_NUM NUM LONG_NUM HEX_NUM HEX_STRING LEX_HOSTNAME ULONGLONG_NUM field_ident select_alias ident_or_text - IDENT_sys TEXT_STRING_sys TEXT_STRING_literal + TEXT_STRING_sys TEXT_STRING_literal opt_component key_cache_name - sp_opt_label BIN_NUM TEXT_STRING_filesystem ident_or_empty - opt_constraint constraint opt_ident ident_table_alias - sp_decl_ident + sp_opt_label BIN_NUM TEXT_STRING_filesystem + opt_constraint constraint opt_ident sp_block_label opt_place opt_db %type <lex_str> - label_ident sp_label +%type <ident_sys> + IDENT_sys + ident + label_ident + sp_decl_ident + ident_or_empty + ident_table_alias + %type <lex_string_with_metadata> TEXT_STRING NCHAR_STRING @@ -1674,8 +1701,18 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); %type <lex_str_ptr> opt_table_alias -%type <lex_string_with_pos> - ident ident_with_tok_start +%type <ident_cli> + IDENT + IDENT_QUOTED + IDENT_cli + ident_cli + +%type <kwd> + keyword keyword_sp + keyword_alias + keyword_sp_data_type + keyword_sp_not_data_type + keyword_sp_verb_clause %type <table> table_ident table_ident_nodb references xid @@ -1770,6 +1807,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); variable variable_aux bool_pri predicate bit_expr parenthesized_expr table_wild simple_expr column_default_non_parenthesized_expr udf_expr + select_sublist_qualified_asterisk expr_or_default set_expr_or_default geometry_function signed_literal expr_or_literal opt_escape @@ -1857,10 +1895,6 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); %type <Lex_length_and_dec> precision opt_precision float_options -%type <symbol> keyword keyword_sp keyword_alias - keyword_sp_data_type - keyword_sp_not_data_type - %type <lex_user> user grant_user grant_role user_or_role current_role admin_option_for_role user_maybe_role @@ -2028,7 +2062,6 @@ END_OF_INPUT '-' '+' '*' '/' '%' '(' ')' ',' '!' '{' '}' '&' '|' AND_SYM OR_SYM OR_OR_SYM BETWEEN_SYM CASE_SYM THEN_SYM WHEN_SYM DIV_SYM MOD_SYM OR2_SYM AND_AND_SYM DELETE_SYM - ROLE_SYM %type <with_clause> opt_with_clause with_clause @@ -3776,13 +3809,9 @@ statement_information_item: } simple_target_specification: - ident + ident_cli { - Lex_input_stream *lip= &thd->m_parser_state->m_lip; - $$= thd->lex->create_item_for_sp_var(&$1, NULL, - lip->get_tok_start(), - lip->get_ptr()); - if ($$ == NULL) + if (!($$= thd->lex->create_item_for_sp_var(&$1, NULL))) MYSQL_YYABORT; } | '@' ident_or_text @@ -3862,7 +3891,7 @@ condition_information_item_name: ; sp_decl_ident: - ident { $$= $1; } + ident ; sp_decl_idents: @@ -5883,15 +5912,15 @@ opt_versioning_interval_start: { $$= thd->systime(); } - | remember_tok_start STARTS_SYM ulong_num + | STARTS_SYM ulong_num { /* only allowed from mysql_unpack_partition() */ if (!Lex->part_info->table) { - thd->parse_error(ER_SYNTAX_ERROR, $1); + thd->parse_error(ER_SYNTAX_ERROR, $1.pos()); MYSQL_YYABORT; } - $$= (ulong)$3; + $$= (ulong)$2; } ; @@ -7858,8 +7887,8 @@ opt_ev_sql_stmt: ; ident_or_empty: - /* empty */ { $$= null_clex_str; } - | ident { $$= $1; } + /* empty */ { $$= Lex_ident_sys(); } + | ident ; alter_commands: @@ -9345,7 +9374,7 @@ select_item_list: ; select_item: - remember_name table_wild remember_end + remember_name select_sublist_qualified_asterisk remember_end { if (add_item_to_list(thd, $2)) MYSQL_YYABORT; @@ -10843,40 +10872,10 @@ function_call_generic: MYSQL_YYABORT; } } - | ident '.' ident '(' opt_expr_list ')' + | ident_cli '.' ident_cli '(' opt_expr_list ')' { - Create_qfunc *builder; - Item *item= NULL; - - /* - The following in practice calls: - <code>Create_sp_func::create()</code> - and builds a stored function. - - However, it's important to maintain the interface between the - parser and the implementation in item_create.cc clean, - since this will change with WL#2128 (SQL PATH): - - INFORMATION_SCHEMA.version() is the SQL 99 syntax for the native - function version(), - - MySQL.version() is the SQL 2003 syntax for the native function - version() (a vendor can specify any schema). - */ - - if (!$1.str || check_db_name((LEX_STRING*) &$1)) - my_yyabort_error((ER_WRONG_DB_NAME, MYF(0), $1.str)); - if (check_routine_name(&$3)) - { + if (!($$= Lex->make_item_func_call_generic(thd, &$1, &$3, $5))) MYSQL_YYABORT; - } - - builder= find_qualified_function_builder(thd); - DBUG_ASSERT(builder); - item= builder->create_with_db(thd, &$1, &$3, true, $5); - - if (! ($$= item)) - { - MYSQL_YYABORT; - } } ; @@ -12613,26 +12612,20 @@ limit_options: ; limit_option: - ident_with_tok_start - { - LEX *lex= thd->lex; - Lex_input_stream *lip= & thd->m_parser_state->m_lip; - if (!($$= lex->create_item_limit(thd, &$1, - $1.m_pos, lip->get_tok_end()))) - MYSQL_YYABORT; - } - | ident_with_tok_start '.' ident - { - LEX *lex= thd->lex; - Lex_input_stream *lip= & thd->m_parser_state->m_lip; - if (!($$= lex->create_item_limit(thd, &$1, &$3, - $1.m_pos, lip->get_ptr()))) - MYSQL_YYABORT; - } + ident_cli + { + if (!($$= Lex->create_item_limit(thd, &$1))) + MYSQL_YYABORT; + } + | ident_cli '.' ident_cli + { + if (!($$= Lex->create_item_limit(thd, &$1, &$3))) + MYSQL_YYABORT; + } | param_marker - { - $1->limit_clause_param= TRUE; - } + { + $1->limit_clause_param= TRUE; + } | ULONGLONG_NUM { $$= new (thd->mem_root) Item_uint(thd, $1.str, $1.length); @@ -13162,10 +13155,9 @@ insert_lock_option: | LOW_PRIORITY { $$= TL_WRITE_LOW_PRIORITY; } | DELAYED_SYM { - Lex->keyword_delayed_begin_offset= (uint)(YYLIP->get_tok_start() - - thd->query()); - Lex->keyword_delayed_end_offset= Lex->keyword_delayed_begin_offset + - YYLIP->yyLength() + 1; + // QQ: why was +1? + Lex->keyword_delayed_begin_offset= (uint)($1.pos() - thd->query()); + Lex->keyword_delayed_end_offset= (uint)($1.end() - thd->query()); $$= TL_WRITE_DELAYED; } | HIGH_PRIORITY { $$= TL_WRITE; } @@ -13175,10 +13167,8 @@ replace_lock_option: opt_low_priority { $$= $1; } | DELAYED_SYM { - Lex->keyword_delayed_begin_offset= (uint)(YYLIP->get_tok_start() - - thd->query()); - Lex->keyword_delayed_end_offset= Lex->keyword_delayed_begin_offset + - YYLIP->yyLength() + 1; + Lex->keyword_delayed_begin_offset= (uint)($1.pos() - thd->query()); + Lex->keyword_delayed_end_offset= (uint)($1.end() - thd->query()); $$= TL_WRITE_DELAYED; } ; @@ -14122,7 +14112,7 @@ opt_format_json: DBUG_ASSERT(Lex->explain_json==false); else my_yyabort_error((ER_UNKNOWN_EXPLAIN_FORMAT, MYF(0), "EXPLAIN", - $3.str)); + $3.str)); } ; @@ -14951,24 +14941,26 @@ insert_ident: table_wild: ident '.' '*' { - SELECT_LEX *sel= Select; - $$= new (thd->mem_root) Item_field(thd, Lex->current_context(), - NullS, $1.str, &star_clex_str); - if ($$ == NULL) + if (!($$= Lex->create_item_qualified_asterisk(thd, &$1))) MYSQL_YYABORT; - sel->with_wild++; } | ident '.' ident '.' '*' { - SELECT_LEX *sel= Select; - const char* schema= thd->client_capabilities & CLIENT_NO_SCHEMA ? - NullS : $1.str; - $$= new (thd->mem_root) Item_field(thd, Lex->current_context(), - schema, - $3.str, &star_clex_str); - if ($$ == NULL) + if (!($$= Lex->create_item_qualified_asterisk(thd, &$1, &$3))) + MYSQL_YYABORT; + } + ; + +select_sublist_qualified_asterisk: + ident_cli '.' '*' + { + if (!($$= Lex->create_item_qualified_asterisk(thd, &$1))) + MYSQL_YYABORT; + } + | ident_cli '.' ident_cli '.' '*' + { + if (!($$= Lex->create_item_qualified_asterisk(thd, &$1, &$3))) MYSQL_YYABORT; - sel->with_wild++; } ; @@ -14976,21 +14968,27 @@ order_ident: expr { $$=$1; } ; + simple_ident: - ident + ident_cli { - Lex_input_stream *lip= YYLIP; - if (!($$= Lex->create_item_ident(thd, &$1, - lip->get_tok_start_prev(), - lip->get_tok_end()))) + if (!($$= Lex->create_item_ident(thd, &$1))) MYSQL_YYABORT; } - | simple_ident_q2 - | ident '.' ident + | ident_cli '.' ident_cli { - LEX *lex= thd->lex; - if (!($$= lex->create_item_ident(thd, &$1, &$3, - $1.m_pos, YYLIP->get_tok_end()))) + if (!($$= Lex->create_item_ident(thd, &$1, &$3))) + MYSQL_YYABORT; + } + | '.' ident_cli '.' ident_cli + { + Lex_ident_cli empty($2.pos(), 0); + if (!($$= Lex->create_item_ident(thd, &empty, &$2, &$4))) + MYSQL_YYABORT; + } + | ident_cli '.' ident_cli '.' ident_cli + { + if (!($$= Lex->create_item_ident(thd, &$1, &$3, &$5))) MYSQL_YYABORT; } ; @@ -15016,7 +15014,8 @@ simple_ident_q: simple_ident_q2: '.' ident '.' ident { - if (!($$= Lex->create_item_ident(thd, &null_clex_str, &$2, &$4))) + Lex_ident_sys none; + if (!($$= Lex->create_item_ident(thd, &none, &$2, &$4))) MYSQL_YYABORT; } | ident '.' ident '.' ident @@ -15095,32 +15094,22 @@ table_ident_nodb: } ; -IDENT_sys: - IDENT { $$= $1; } +IDENT_cli: + IDENT | IDENT_QUOTED + ; + +ident_cli: + IDENT + | IDENT_QUOTED + | keyword { $$= $1; } + ; + +IDENT_sys: + IDENT_cli { - if (thd->charset_is_system_charset) - { - CHARSET_INFO *cs= system_charset_info; - size_t wlen= Well_formed_prefix(cs, $1.str, $1.length).length(); - if (wlen < $1.length) - { - ErrConvString err($1.str, $1.length, &my_charset_bin); - my_error(ER_INVALID_CHARACTER_STRING, MYF(0), - cs->csname, err.ptr()); - MYSQL_YYABORT; - } - $$= $1; - } - else - { - LEX_STRING to; - if (thd->convert_with_error(system_charset_info, &to, - thd->charset(), $1.str, $1.length)) - MYSQL_YYABORT; - $$.str= to.str; - $$.length= to.length; - } + if (thd->to_ident_sys_alloc(&$$, &$1)) + MYSQL_YYABORT; } ; @@ -15176,7 +15165,7 @@ TEXT_STRING_filesystem: } ident_table_alias: - IDENT_sys { $$= $1; } + IDENT_sys | keyword_alias { $$.str= thd->strmake($1.str, $1.length); @@ -15188,43 +15177,19 @@ ident_table_alias: ident: IDENT_sys - { - (LEX_CSTRING &)$$= $1; - $$.m_pos= (char *) YYLIP->get_tok_start_prev(); - } - | keyword - { - $$.str= thd->strmake($1.str, $1.length); - if ($$.str == NULL) - MYSQL_YYABORT; - $$.length= $1.length; - $$.m_pos= (char *) YYLIP->get_tok_start_prev(); - } - ; - -ident_with_tok_start: - IDENT_sys - { - (LEX_CSTRING &)$$= $1; - $$.m_pos= (char *) YYLIP->get_tok_start(); - } | keyword { - if (!($$.str= thd->strmake($1.str, $1.length))) + if ($$.copy_keyword(thd, &$1)) MYSQL_YYABORT; - $$.length= $1.length; - $$.m_pos= (char *) YYLIP->get_tok_start(); } ; label_ident: - IDENT_sys { $$=$1; } + IDENT_sys | keyword_sp { - $$.str= thd->strmake($1.str, $1.length); - if ($$.str == NULL) + if ($$.copy_keyword(thd, &$1)) MYSQL_YYABORT; - $$.length= $1.length; } ; @@ -15300,73 +15265,73 @@ user: user_maybe_role /* Keywords which we allow as table aliases. */ keyword_alias: - keyword_sp {} - | keyword_sp_verb_clause{} - | ASCII_SYM {} - | BACKUP_SYM {} - | BINLOG_SYM {} - | BYTE_SYM {} - | CACHE_SYM {} - | CHARSET {} - | CHECKSUM_SYM {} - | CHECKPOINT_SYM {} - | COLUMN_ADD_SYM {} - | COLUMN_CHECK_SYM {} - | COLUMN_CREATE_SYM {} - | COLUMN_DELETE_SYM {} - | COLUMN_GET_SYM {} - | COMMENT_SYM {} - | CONTAINS_SYM {} - | DEALLOCATE_SYM {} - | EXAMINED_SYM {} - | EXCLUDE_SYM {} - | EXECUTE_SYM {} - | FLUSH_SYM {} - | FOLLOWS_SYM {} - | FOLLOWING_SYM {} - | FORMAT_SYM {} - | GET_SYM {} - | HELP_SYM {} - | HOST_SYM {} - | INSTALL_SYM {} - | LANGUAGE_SYM {} - | NO_SYM {} - | OPTION {} - | OPTIONS_SYM {} - | OTHERS_SYM {} - | OWNER_SYM {} - | PARSER_SYM {} - | PERIOD_SYM {} - | PORT_SYM {} - | PRECEDES_SYM {} - | PRECEDING_SYM {} - | PREPARE_SYM {} - | REMOVE_SYM {} - | RESET_SYM {} - | RESTORE_SYM {} - | SECURITY_SYM {} - | SERVER_SYM {} - | SIGNED_SYM {} - | SOCKET_SYM {} - | SLAVE {} - | SLAVES {} - | SONAME_SYM {} - | START_SYM {} - | STOP_SYM {} - | STORED_SYM {} - | TIES_SYM {} - | UNICODE_SYM {} - | UNINSTALL_SYM {} - | UNBOUNDED_SYM {} - | WITHIN {} - | WRAPPER_SYM {} - | XA_SYM {} - | UPGRADE_SYM {} + keyword_sp + | keyword_sp_verb_clause + | ASCII_SYM + | BACKUP_SYM + | BINLOG_SYM + | BYTE_SYM + | CACHE_SYM + | CHARSET + | CHECKSUM_SYM + | CHECKPOINT_SYM + | COLUMN_ADD_SYM + | COLUMN_CHECK_SYM + | COLUMN_CREATE_SYM + | COLUMN_DELETE_SYM + | COLUMN_GET_SYM + | COMMENT_SYM + | CONTAINS_SYM + | DEALLOCATE_SYM + | EXAMINED_SYM + | EXCLUDE_SYM + | EXECUTE_SYM + | FLUSH_SYM + | FOLLOWS_SYM + | FOLLOWING_SYM + | FORMAT_SYM + | GET_SYM + | HELP_SYM + | HOST_SYM + | INSTALL_SYM + | LANGUAGE_SYM + | NO_SYM + | OPTION + | OPTIONS_SYM + | OTHERS_SYM + | OWNER_SYM + | PARSER_SYM + | PERIOD_SYM + | PORT_SYM + | PRECEDES_SYM + | PRECEDING_SYM + | PREPARE_SYM + | REMOVE_SYM + | RESET_SYM + | RESTORE_SYM + | SECURITY_SYM + | SERVER_SYM + | SIGNED_SYM + | SOCKET_SYM + | SLAVE + | SLAVES + | SONAME_SYM + | START_SYM + | STOP_SYM + | STORED_SYM + | TIES_SYM + | UNICODE_SYM + | UNINSTALL_SYM + | UNBOUNDED_SYM + | WITHIN + | WRAPPER_SYM + | XA_SYM + | UPGRADE_SYM ; /* Keyword that we allow for identifiers (except SP labels) */ -keyword: keyword_alias | WINDOW_SYM {}; +keyword: keyword_alias | WINDOW_SYM; /* * Keywords that we allow for labels in SPs. @@ -15388,18 +15353,18 @@ keyword_sp: xxx:=10 */ keyword_sp_verb_clause: - BEGIN_SYM { /* Compound. Reserved in Oracle */ } - | CLOSE_SYM { /* Verb clause. Reserved in Oracle */ } - | COMMIT_SYM { /* Verb clause. Reserved in Oracle */ } - | DO_SYM { /* Verb clause */ } - | END { /* Compound. Reserved in Oracle */ } - | HANDLER_SYM { /* Verb clause */ } - | OPEN_SYM { /* Verb clause. Reserved in Oracle */ } - | REPAIR { /* Verb clause */ } - | ROLLBACK_SYM { /* Verb clause. Reserved in Oracle */ } - | SAVEPOINT_SYM { /* Verb clause. Reserved in Oracle */ } - | SHUTDOWN { /* Verb clause */ } - | TRUNCATE_SYM { /* Verb clause. Reserved in Oracle */ } + BEGIN_SYM /* Compound. Reserved in Oracle */ + | CLOSE_SYM /* Verb clause. Reserved in Oracle */ + | COMMIT_SYM /* Verb clause. Reserved in Oracle */ + | DO_SYM /* Verb clause */ + | END /* Compound. Reserved in Oracle */ + | HANDLER_SYM /* Verb clause */ + | OPEN_SYM /* Verb clause. Reserved in Oracle */ + | REPAIR /* Verb clause */ + | ROLLBACK_SYM /* Verb clause. Reserved in Oracle */ + | SAVEPOINT_SYM /* Verb clause. Reserved in Oracle */ + | SHUTDOWN /* Verb clause */ + | TRUNCATE_SYM /* Verb clause. Reserved in Oracle */ ; @@ -15408,362 +15373,362 @@ keyword_sp_verb_clause: but not allowed as non-delimited SP variable names in sql_mode=ORACLE. */ keyword_sp_data_type: - BIT_SYM {} - | BOOLEAN_SYM {} /* PLSQL-R */ - | BOOL_SYM {} - | CLOB {} - | DATE_SYM {} /* Oracle-R, PLSQL-R */ - | DATETIME {} - | ENUM {} - | FIXED_SYM {} - | GEOMETRYCOLLECTION {} - | GEOMETRY_SYM {} - | JSON_SYM {} - | LINESTRING {} - | MEDIUM_SYM {} - | MULTILINESTRING {} - | MULTIPOINT {} - | MULTIPOLYGON {} - | NATIONAL_SYM {} - | NCHAR_SYM {} - | NUMBER_SYM {} /* Oracle-R, PLSQL-R */ - | NVARCHAR_SYM {} - | POINT_SYM {} - | POLYGON {} - | RAW {} /* Oracle-R */ - | ROW_SYM {} - | SERIAL_SYM {} - | TEXT_SYM {} - | TIMESTAMP {} - | TIME_SYM {} /* Oracle-R */ - | VARCHAR2 {} /* Oracle-R, PLSQL-R */ - | YEAR_SYM {} + BIT_SYM + | BOOLEAN_SYM /* PLSQL-R */ + | BOOL_SYM + | CLOB + | DATE_SYM /* Oracle-R, PLSQL-R */ + | DATETIME + | ENUM + | FIXED_SYM + | GEOMETRYCOLLECTION + | GEOMETRY_SYM + | JSON_SYM + | LINESTRING + | MEDIUM_SYM + | MULTILINESTRING + | MULTIPOINT + | MULTIPOLYGON + | NATIONAL_SYM + | NCHAR_SYM + | NUMBER_SYM /* Oracle-R, PLSQL-R */ + | NVARCHAR_SYM + | POINT_SYM + | POLYGON + | RAW /* Oracle-R */ + | ROW_SYM + | SERIAL_SYM + | TEXT_SYM + | TIMESTAMP + | TIME_SYM /* Oracle-R */ + | VARCHAR2 /* Oracle-R, PLSQL-R */ + | YEAR_SYM ; keyword_sp_not_data_type: - ACTION {} - | ADDDATE_SYM {} - | ADMIN_SYM {} - | AFTER_SYM {} - | AGAINST {} - | AGGREGATE_SYM {} - | ALGORITHM_SYM {} - | ALWAYS_SYM {} - | ANY_SYM {} - | AT_SYM {} - | ATOMIC_SYM {} - | AUTHORS_SYM {} - | AUTO_INC {} - | AUTOEXTEND_SIZE_SYM {} - | AUTO_SYM {} - | AVG_ROW_LENGTH {} - | AVG_SYM {} - | BLOCK_SYM {} - | BODY_SYM {} - | BTREE_SYM {} - | CASCADED {} - | CATALOG_NAME_SYM {} - | CHAIN_SYM {} - | CHANGED {} - | CIPHER_SYM {} - | CLIENT_SYM {} - | CLASS_ORIGIN_SYM {} - | COALESCE {} - | CODE_SYM {} - | COLLATION_SYM {} - | COLUMN_NAME_SYM {} - | COLUMNS {} - | COMMITTED_SYM {} - | COMPACT_SYM {} - | COMPLETION_SYM {} - | COMPRESSED_SYM {} - | CONCURRENT {} - | CONNECTION_SYM {} - | CONSISTENT_SYM {} - | CONSTRAINT_CATALOG_SYM {} - | CONSTRAINT_SCHEMA_SYM {} - | CONSTRAINT_NAME_SYM {} - | CONTEXT_SYM {} - | CONTRIBUTORS_SYM {} - | CURRENT_POS_SYM {} - | CPU_SYM {} - | CUBE_SYM {} + ACTION + | ADDDATE_SYM + | ADMIN_SYM + | AFTER_SYM + | AGAINST + | AGGREGATE_SYM + | ALGORITHM_SYM + | ALWAYS_SYM + | ANY_SYM + | AT_SYM + | ATOMIC_SYM + | AUTHORS_SYM + | AUTO_INC + | AUTOEXTEND_SIZE_SYM + | AUTO_SYM + | AVG_ROW_LENGTH + | AVG_SYM + | BLOCK_SYM + | BODY_SYM + | BTREE_SYM + | CASCADED + | CATALOG_NAME_SYM + | CHAIN_SYM + | CHANGED + | CIPHER_SYM + | CLIENT_SYM + | CLASS_ORIGIN_SYM + | COALESCE + | CODE_SYM + | COLLATION_SYM + | COLUMN_NAME_SYM + | COLUMNS + | COMMITTED_SYM + | COMPACT_SYM + | COMPLETION_SYM + | COMPRESSED_SYM + | CONCURRENT + | CONNECTION_SYM + | CONSISTENT_SYM + | CONSTRAINT_CATALOG_SYM + | CONSTRAINT_SCHEMA_SYM + | CONSTRAINT_NAME_SYM + | CONTEXT_SYM + | CONTRIBUTORS_SYM + | CURRENT_POS_SYM + | CPU_SYM + | CUBE_SYM /* Although a reserved keyword in SQL:2003 (and :2008), not reserved in MySQL per WL#2111 specification. */ - | CURRENT_SYM {} - | CURSOR_NAME_SYM {} - | CYCLE_SYM {} - | DATA_SYM {} - | DATAFILE_SYM {} - | DATE_FORMAT_SYM {} - | DAY_SYM {} - | DECODE_SYM {} - | DEFINER_SYM {} - | DELAY_KEY_WRITE_SYM {} - | DES_KEY_FILE {} - | DIAGNOSTICS_SYM {} - | DIRECTORY_SYM {} - | DISABLE_SYM {} - | DISCARD {} - | DISK_SYM {} - | DUMPFILE {} - | DUPLICATE_SYM {} - | DYNAMIC_SYM {} - | ELSIF_SYM {} - | ENDS_SYM {} - | ENGINE_SYM {} - | ENGINES_SYM {} - | ERROR_SYM {} - | ERRORS {} - | ESCAPE_SYM {} - | EVENT_SYM {} - | EVENTS_SYM {} - | EVERY_SYM {} - | EXCEPTION_SYM {} - | EXCHANGE_SYM {} - | EXPANSION_SYM {} - | EXPORT_SYM {} - | EXTENDED_SYM {} - | EXTENT_SIZE_SYM {} - | FAULTS_SYM {} - | FAST_SYM {} - | FOUND_SYM {} - | ENABLE_SYM {} - | FULL {} - | FILE_SYM {} - | FIRST_SYM {} - | GENERAL {} - | GENERATED_SYM {} - | GET_FORMAT {} - | GRANTS {} - | GLOBAL_SYM {} - | GOTO_SYM {} - | HASH_SYM {} - | HARD_SYM {} - | HISTORY_SYM {} - | HOSTS_SYM {} - | HOUR_SYM {} - | ID_SYM {} - | IDENTIFIED_SYM {} - | IGNORE_SERVER_IDS_SYM {} - | INCREMENT_SYM {} - | IMMEDIATE_SYM {} /* SQL-2003-R */ - | INVOKER_SYM {} - | IMPORT {} - | INDEXES {} - | INITIAL_SIZE_SYM {} - | IO_SYM {} - | IPC_SYM {} - | ISOLATION {} - | ISOPEN_SYM {} - | ISSUER_SYM {} - | INSERT_METHOD {} - | INVISIBLE_SYM {} - | KEY_BLOCK_SIZE {} - | LAST_VALUE {} - | LAST_SYM {} - | LASTVAL_SYM {} - | LEAVES {} - | LESS_SYM {} - | LEVEL_SYM {} - | LIST_SYM {} - | LOCAL_SYM {} - | LOCKS_SYM {} - | LOGFILE_SYM {} - | LOGS_SYM {} - | MAX_ROWS {} - | MASTER_SYM {} - | MASTER_HEARTBEAT_PERIOD_SYM {} - | MASTER_GTID_POS_SYM {} - | MASTER_HOST_SYM {} - | MASTER_PORT_SYM {} - | MASTER_LOG_FILE_SYM {} - | MASTER_LOG_POS_SYM {} - | MASTER_USER_SYM {} - | MASTER_USE_GTID_SYM {} - | MASTER_PASSWORD_SYM {} - | MASTER_SERVER_ID_SYM {} - | MASTER_CONNECT_RETRY_SYM {} - | MASTER_DELAY_SYM {} - | MASTER_SSL_SYM {} - | MASTER_SSL_CA_SYM {} - | MASTER_SSL_CAPATH_SYM {} - | MASTER_SSL_CERT_SYM {} - | MASTER_SSL_CIPHER_SYM {} - | MASTER_SSL_CRL_SYM {} - | MASTER_SSL_CRLPATH_SYM {} - | MASTER_SSL_KEY_SYM {} - | MAX_CONNECTIONS_PER_HOUR {} - | MAX_QUERIES_PER_HOUR {} - | MAX_SIZE_SYM {} - | MAX_STATEMENT_TIME_SYM {} - | MAX_UPDATES_PER_HOUR {} - | MAX_USER_CONNECTIONS_SYM {} - | MEMORY_SYM {} - | MERGE_SYM {} - | MESSAGE_TEXT_SYM {} - | MICROSECOND_SYM {} - | MIGRATE_SYM {} - | MINUTE_SYM {} - | MINVALUE_SYM {} - | MIN_ROWS {} - | MODIFY_SYM {} - | MODE_SYM {} - | MONTH_SYM {} - | MUTEX_SYM {} - | MYSQL_SYM {} - | MYSQL_ERRNO_SYM {} - | NAME_SYM {} - | NAMES_SYM {} - | NEXT_SYM {} - | NEXTVAL_SYM {} - | NEW_SYM {} - | NOCACHE_SYM {} - | NOCYCLE_SYM {} - | NOMINVALUE_SYM {} - | NOMAXVALUE_SYM {} - | NO_WAIT_SYM {} - | NOWAIT_SYM {} - | NODEGROUP_SYM {} - | NONE_SYM {} - | NOTFOUND_SYM {} - | OF_SYM {} /* SQL-1999-R, Oracle-R */ - | OFFSET_SYM {} - | OLD_PASSWORD_SYM {} - | ONE_SYM {} - | ONLINE_SYM {} - | ONLY_SYM {} - | PACKAGE_SYM {} - | PACK_KEYS_SYM {} - | PAGE_SYM {} - | PARTIAL {} - | PARTITIONING_SYM {} - | PARTITIONS_SYM {} - | PASSWORD_SYM {} - | PERSISTENT_SYM {} - | PHASE_SYM {} - | PLUGIN_SYM {} - | PLUGINS_SYM {} - | PRESERVE_SYM {} - | PREV_SYM {} - | PREVIOUS_SYM {} - | PRIVILEGES {} - | PROCESS {} - | PROCESSLIST_SYM {} - | PROFILE_SYM {} - | PROFILES_SYM {} - | PROXY_SYM {} - | QUARTER_SYM {} - | QUERY_SYM {} - | QUICK {} - | RAISE_SYM {} - | READ_ONLY_SYM {} - | REBUILD_SYM {} - | RECOVER_SYM {} - | REDO_BUFFER_SIZE_SYM {} - | REDOFILE_SYM {} - | REDUNDANT_SYM {} - | RELAY {} - | RELAYLOG_SYM {} - | RELAY_LOG_FILE_SYM {} - | RELAY_LOG_POS_SYM {} - | RELAY_THREAD {} - | RELOAD {} - | REORGANIZE_SYM {} - | REPEATABLE_SYM {} - | REPLICATION {} - | RESOURCES {} - | RESTART_SYM {} - | RESUME_SYM {} - | RETURNED_SQLSTATE_SYM {} - | RETURNS_SYM {} - | REUSE_SYM {} /* Oracle-R */ - | REVERSE_SYM {} - | ROLE_SYM {} - | ROLLUP_SYM {} - | ROUTINE_SYM {} - | ROWCOUNT_SYM {} - | ROWTYPE_SYM {} - | ROW_COUNT_SYM {} - | ROW_FORMAT_SYM {} - | RTREE_SYM {} - | SCHEDULE_SYM {} - | SCHEMA_NAME_SYM {} - | SECOND_SYM {} - | SEQUENCE_SYM {} - | SERIALIZABLE_SYM {} - | SESSION_SYM {} - | SETVAL_SYM {} - | SIMPLE_SYM {} - | SHARE_SYM {} - | SLAVE_POS_SYM {} - | SLOW {} - | SNAPSHOT_SYM {} - | SOFT_SYM {} - | SOUNDS_SYM {} - | SOURCE_SYM {} - | SQL_CACHE_SYM {} - | SQL_BUFFER_RESULT {} - | SQL_NO_CACHE_SYM {} - | SQL_THREAD {} - | STARTS_SYM {} - | STATEMENT_SYM {} - | STATUS_SYM {} - | STORAGE_SYM {} - | STRING_SYM {} - | SUBCLASS_ORIGIN_SYM {} - | SUBDATE_SYM {} - | SUBJECT_SYM {} - | SUBPARTITION_SYM {} - | SUBPARTITIONS_SYM {} - | SUPER_SYM {} - | SUSPEND_SYM {} - | SWAPS_SYM {} - | SWITCHES_SYM {} - | SYSTEM {} - | SYSTEM_TIME_SYM {} - | TABLE_NAME_SYM {} - | TABLES {} - | TABLE_CHECKSUM_SYM {} - | TABLESPACE {} - | TEMPORARY {} - | TEMPTABLE_SYM {} - | THAN_SYM {} - | TRANSACTION_SYM {} - | TRANSACTIONAL_SYM {} - | TRIGGERS_SYM {} - | TRIM_ORACLE {} - | TIMESTAMP_ADD {} - | TIMESTAMP_DIFF {} - | TYPES_SYM {} - | TYPE_SYM {} - | UDF_RETURNS_SYM {} - | FUNCTION_SYM {} - | UNCOMMITTED_SYM {} - | UNDEFINED_SYM {} - | UNDO_BUFFER_SIZE_SYM {} - | UNDOFILE_SYM {} - | UNKNOWN_SYM {} - | UNTIL_SYM {} - | USER_SYM {} - | USE_FRM {} - | VARIABLES {} - | VERSIONING_SYM {} - | VIEW_SYM {} - | VIRTUAL_SYM {} - | VALUE_SYM {} - | WARNINGS {} - | WAIT_SYM {} - | WEEK_SYM {} - | WEIGHT_STRING_SYM {} - | WITHOUT {} - | WORK_SYM {} - | X509_SYM {} - | XML_SYM {} - | VIA_SYM {} + | CURRENT_SYM + | CURSOR_NAME_SYM + | CYCLE_SYM + | DATA_SYM + | DATAFILE_SYM + | DATE_FORMAT_SYM + | DAY_SYM + | DECODE_SYM + | DEFINER_SYM + | DELAY_KEY_WRITE_SYM + | DES_KEY_FILE + | DIAGNOSTICS_SYM + | DIRECTORY_SYM + | DISABLE_SYM + | DISCARD + | DISK_SYM + | DUMPFILE + | DUPLICATE_SYM + | DYNAMIC_SYM + | ELSIF_SYM + | ENDS_SYM + | ENGINE_SYM + | ENGINES_SYM + | ERROR_SYM + | ERRORS + | ESCAPE_SYM + | EVENT_SYM + | EVENTS_SYM + | EVERY_SYM + | EXCEPTION_SYM + | EXCHANGE_SYM + | EXPANSION_SYM + | EXPORT_SYM + | EXTENDED_SYM + | EXTENT_SIZE_SYM + | FAULTS_SYM + | FAST_SYM + | FOUND_SYM + | ENABLE_SYM + | FULL + | FILE_SYM + | FIRST_SYM + | GENERAL + | GENERATED_SYM + | GET_FORMAT + | GRANTS + | GLOBAL_SYM + | GOTO_SYM + | HASH_SYM + | HARD_SYM + | HISTORY_SYM + | HOSTS_SYM + | HOUR_SYM + | ID_SYM + | IDENTIFIED_SYM + | IGNORE_SERVER_IDS_SYM + | INCREMENT_SYM + | IMMEDIATE_SYM /* SQL-2003-R */ + | INVOKER_SYM + | IMPORT + | INDEXES + | INITIAL_SIZE_SYM + | IO_SYM + | IPC_SYM + | ISOLATION + | ISOPEN_SYM + | ISSUER_SYM + | INSERT_METHOD + | INVISIBLE_SYM + | KEY_BLOCK_SIZE + | LAST_VALUE + | LAST_SYM + | LASTVAL_SYM + | LEAVES + | LESS_SYM + | LEVEL_SYM + | LIST_SYM + | LOCAL_SYM + | LOCKS_SYM + | LOGFILE_SYM + | LOGS_SYM + | MAX_ROWS + | MASTER_SYM + | MASTER_HEARTBEAT_PERIOD_SYM + | MASTER_GTID_POS_SYM + | MASTER_HOST_SYM + | MASTER_PORT_SYM + | MASTER_LOG_FILE_SYM + | MASTER_LOG_POS_SYM + | MASTER_USER_SYM + | MASTER_USE_GTID_SYM + | MASTER_PASSWORD_SYM + | MASTER_SERVER_ID_SYM + | MASTER_CONNECT_RETRY_SYM + | MASTER_DELAY_SYM + | MASTER_SSL_SYM + | MASTER_SSL_CA_SYM + | MASTER_SSL_CAPATH_SYM + | MASTER_SSL_CERT_SYM + | MASTER_SSL_CIPHER_SYM + | MASTER_SSL_CRL_SYM + | MASTER_SSL_CRLPATH_SYM + | MASTER_SSL_KEY_SYM + | MAX_CONNECTIONS_PER_HOUR + | MAX_QUERIES_PER_HOUR + | MAX_SIZE_SYM + | MAX_STATEMENT_TIME_SYM + | MAX_UPDATES_PER_HOUR + | MAX_USER_CONNECTIONS_SYM + | MEMORY_SYM + | MERGE_SYM + | MESSAGE_TEXT_SYM + | MICROSECOND_SYM + | MIGRATE_SYM + | MINUTE_SYM + | MINVALUE_SYM + | MIN_ROWS + | MODIFY_SYM + | MODE_SYM + | MONTH_SYM + | MUTEX_SYM + | MYSQL_SYM + | MYSQL_ERRNO_SYM + | NAME_SYM + | NAMES_SYM + | NEXT_SYM + | NEXTVAL_SYM + | NEW_SYM + | NOCACHE_SYM + | NOCYCLE_SYM + | NOMINVALUE_SYM + | NOMAXVALUE_SYM + | NO_WAIT_SYM + | NOWAIT_SYM + | NODEGROUP_SYM + | NONE_SYM + | NOTFOUND_SYM + | OF_SYM /* SQL-1999-R, Oracle-R */ + | OFFSET_SYM + | OLD_PASSWORD_SYM + | ONE_SYM + | ONLINE_SYM + | ONLY_SYM + | PACKAGE_SYM + | PACK_KEYS_SYM + | PAGE_SYM + | PARTIAL + | PARTITIONING_SYM + | PARTITIONS_SYM + | PASSWORD_SYM + | PERSISTENT_SYM + | PHASE_SYM + | PLUGIN_SYM + | PLUGINS_SYM + | PRESERVE_SYM + | PREV_SYM + | PREVIOUS_SYM + | PRIVILEGES + | PROCESS + | PROCESSLIST_SYM + | PROFILE_SYM + | PROFILES_SYM + | PROXY_SYM + | QUARTER_SYM + | QUERY_SYM + | QUICK + | RAISE_SYM + | READ_ONLY_SYM + | REBUILD_SYM + | RECOVER_SYM + | REDO_BUFFER_SIZE_SYM + | REDOFILE_SYM + | REDUNDANT_SYM + | RELAY + | RELAYLOG_SYM + | RELAY_LOG_FILE_SYM + | RELAY_LOG_POS_SYM + | RELAY_THREAD + | RELOAD + | REORGANIZE_SYM + | REPEATABLE_SYM + | REPLICATION + | RESOURCES + | RESTART_SYM + | RESUME_SYM + | RETURNED_SQLSTATE_SYM + | RETURNS_SYM + | REUSE_SYM /* Oracle-R */ + | REVERSE_SYM + | ROLE_SYM + | ROLLUP_SYM + | ROUTINE_SYM + | ROWCOUNT_SYM + | ROWTYPE_SYM + | ROW_COUNT_SYM + | ROW_FORMAT_SYM + | RTREE_SYM + | SCHEDULE_SYM + | SCHEMA_NAME_SYM + | SECOND_SYM + | SEQUENCE_SYM + | SERIALIZABLE_SYM + | SESSION_SYM + | SETVAL_SYM + | SIMPLE_SYM + | SHARE_SYM + | SLAVE_POS_SYM + | SLOW + | SNAPSHOT_SYM + | SOFT_SYM + | SOUNDS_SYM + | SOURCE_SYM + | SQL_CACHE_SYM + | SQL_BUFFER_RESULT + | SQL_NO_CACHE_SYM + | SQL_THREAD + | STARTS_SYM + | STATEMENT_SYM + | STATUS_SYM + | STORAGE_SYM + | STRING_SYM + | SUBCLASS_ORIGIN_SYM + | SUBDATE_SYM + | SUBJECT_SYM + | SUBPARTITION_SYM + | SUBPARTITIONS_SYM + | SUPER_SYM + | SUSPEND_SYM + | SWAPS_SYM + | SWITCHES_SYM + | SYSTEM + | SYSTEM_TIME_SYM + | TABLE_NAME_SYM + | TABLES + | TABLE_CHECKSUM_SYM + | TABLESPACE + | TEMPORARY + | TEMPTABLE_SYM + | THAN_SYM + | TRANSACTION_SYM + | TRANSACTIONAL_SYM + | TRIGGERS_SYM + | TRIM_ORACLE + | TIMESTAMP_ADD + | TIMESTAMP_DIFF + | TYPES_SYM + | TYPE_SYM + | UDF_RETURNS_SYM + | FUNCTION_SYM + | UNCOMMITTED_SYM + | UNDEFINED_SYM + | UNDO_BUFFER_SIZE_SYM + | UNDOFILE_SYM + | UNKNOWN_SYM + | UNTIL_SYM + | USER_SYM + | USE_FRM + | VARIABLES + | VERSIONING_SYM + | VIEW_SYM + | VIRTUAL_SYM + | VALUE_SYM + | WARNINGS + | WAIT_SYM + | WEEK_SYM + | WEIGHT_STRING_SYM + | WITHOUT + | WORK_SYM + | X509_SYM + | XML_SYM + | VIA_SYM ; /* @@ -17133,7 +17098,7 @@ query_expression_option: STRAIGHT_JOIN { Select->options|= SELECT_STRAIGHT_JOIN; } | HIGH_PRIORITY { - if (check_simple_select()) + if (Lex->check_simple_select(&$1)) MYSQL_YYABORT; YYPS->m_lock_type= TL_READ_HIGH_PRIORITY; YYPS->m_mdl_type= MDL_SHARED_READ; @@ -17144,13 +17109,13 @@ query_expression_option: | SQL_BIG_RESULT { Select->options|= SELECT_BIG_RESULT; } | SQL_BUFFER_RESULT { - if (check_simple_select()) + if (Lex->check_simple_select(&$1)) MYSQL_YYABORT; Select->options|= OPTION_BUFFER_RESULT; } | SQL_CALC_FOUND_ROWS { - if (check_simple_select()) + if (Lex->check_simple_select(&$1)) MYSQL_YYABORT; Select->options|= OPTION_FOUND_ROWS; } diff --git a/sql/sql_yacc_ora.yy b/sql/sql_yacc_ora.yy index ec2aeeaefba..dc0878d7ee7 100644 --- a/sql/sql_yacc_ora.yy +++ b/sql/sql_yacc_ora.yy @@ -169,9 +169,10 @@ void ORAerror(THD *thd, const char *s) /* structs */ LEX_CSTRING lex_str; - LEX_SYMBOL symbol; + Lex_ident_cli_st kwd; + Lex_ident_cli_st ident_cli; + Lex_ident_sys_st ident_sys; Lex_string_with_metadata_st lex_string_with_metadata; - Lex_string_with_pos_st lex_string_with_pos; Lex_spblock_st spblock; Lex_spblock_handlers_st spblock_handlers; Lex_length_and_dec_st Lex_length_and_dec; @@ -300,679 +301,276 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); This makes the code grep-able, and helps maintenance. */ - + + +/* + Reserved keywords and operators +*/ %token ABORT_SYM /* INTERNAL (used in lex) */ %token ACCESSIBLE_SYM -%token ACTION /* SQL-2003-N */ %token ADD /* SQL-2003-R */ -%token ADMIN_SYM /* SQL-2003-N */ -%token ADDDATE_SYM /* MYSQL-FUNC */ -%token AFTER_SYM /* SQL-2003-N */ -%token AGAINST -%token AGGREGATE_SYM -%token ALGORITHM_SYM %token ALL /* SQL-2003-R */ %token ALTER /* SQL-2003-R */ -%token ALWAYS_SYM %token ANALYZE_SYM %token AND_AND_SYM /* OPERATOR */ %token AND_SYM /* SQL-2003-R */ -%token ANY_SYM /* SQL-2003-R */ %token AS /* SQL-2003-R */ %token ASC /* SQL-2003-N */ -%token ASCII_SYM /* MYSQL-FUNC */ %token ASENSITIVE_SYM /* FUTURE-USE */ -%token AT_SYM /* SQL-2003-R */ -%token ATOMIC_SYM /* SQL-2003-R */ -%token AUTHORS_SYM -%token AUTOEXTEND_SIZE_SYM -%token AUTO_INC -%token AUTO_SYM -%token AVG_ROW_LENGTH -%token AVG_SYM /* SQL-2003-N */ -%token BACKUP_SYM %token BEFORE_SYM /* SQL-2003-N */ -%token BEGIN_SYM /* SQL-2003-R */ %token BETWEEN_SYM /* SQL-2003-R */ %token BIGINT /* SQL-2003-R */ %token BINARY /* SQL-2003-R */ -%token BINLOG_SYM %token BIN_NUM %token BIT_AND /* MYSQL-FUNC */ %token BIT_OR /* MYSQL-FUNC */ -%token BIT_SYM /* MYSQL-FUNC */ %token BIT_XOR /* MYSQL-FUNC */ %token BLOB_SYM /* SQL-2003-R */ -%token BLOCK_SYM -%token BODY_SYM /* Oracle-R */ -%token BOOLEAN_SYM /* SQL-2003-R */ -%token BOOL_SYM %token BOTH /* SQL-2003-R */ -%token BTREE_SYM %token BY /* SQL-2003-R */ -%token BYTE_SYM -%token CACHE_SYM %token CALL_SYM /* SQL-2003-R */ %token CASCADE /* SQL-2003-N */ -%token CASCADED /* SQL-2003-R */ %token CASE_SYM /* SQL-2003-R */ %token CAST_SYM /* SQL-2003-R */ -%token CATALOG_NAME_SYM /* SQL-2003-N */ -%token CHAIN_SYM /* SQL-2003-N */ %token CHANGE -%token CHANGED -%token CHARSET %token CHAR_SYM /* SQL-2003-R */ -%token CHECKPOINT_SYM -%token CHECKSUM_SYM %token CHECK_SYM /* SQL-2003-R */ -%token CIPHER_SYM -%token CLASS_ORIGIN_SYM /* SQL-2003-N */ -%token CLIENT_SYM -%token CLOSE_SYM /* SQL-2003-R */ -%token CLOB /* SQL-2003-R */ -%token COALESCE /* SQL-2003-N */ -%token CODE_SYM %token COLLATE_SYM /* SQL-2003-R */ -%token COLLATION_SYM /* SQL-2003-N */ -%token COLUMNS -%token COLUMN_ADD_SYM -%token COLUMN_CHECK_SYM -%token COLUMN_CREATE_SYM -%token COLUMN_DELETE_SYM -%token COLUMN_GET_SYM -%token COLUMN_SYM /* SQL-2003-R */ -%token COLUMN_NAME_SYM /* SQL-2003-N */ -%token COMMENT_SYM -%token COMMITTED_SYM /* SQL-2003-N */ -%token COMMIT_SYM /* SQL-2003-R */ -%token COMPACT_SYM -%token COMPLETION_SYM -%token COMPRESSED_SYM -%token CONCURRENT %token CONDITION_SYM /* SQL-2003-R, SQL-2008-R */ -%token CONNECTION_SYM -%token CONSISTENT_SYM %token CONSTRAINT /* SQL-2003-R */ -%token CONSTRAINT_CATALOG_SYM /* SQL-2003-N */ -%token CONSTRAINT_NAME_SYM /* SQL-2003-N */ -%token CONSTRAINT_SCHEMA_SYM /* SQL-2003-N */ -%token CONTAINS_SYM /* SQL-2003-N */ -%token CONTEXT_SYM %token CONTINUE_SYM /* SQL-2003-R */ -%token CONTRIBUTORS_SYM %token CONVERT_SYM /* SQL-2003-N */ %token COUNT_SYM /* SQL-2003-N */ -%token CPU_SYM %token CREATE /* SQL-2003-R */ %token CROSS /* SQL-2003-R */ -%token CUBE_SYM /* SQL-2003-R */ %token CUME_DIST_SYM %token CURDATE /* MYSQL-FUNC */ -%token CURRENT_SYM /* SQL-2003-R */ %token CURRENT_USER /* SQL-2003-R */ %token CURRENT_ROLE /* SQL-2003-R */ -%token CURRENT_POS_SYM %token CURSOR_SYM /* SQL-2003-R */ -%token CURSOR_NAME_SYM /* SQL-2003-N */ %token CURTIME /* MYSQL-FUNC */ -%token CYCLE_SYM %token DATABASE %token DATABASES -%token DATAFILE_SYM -%token DATA_SYM /* SQL-2003-N */ -%token DATETIME %token DATE_ADD_INTERVAL /* MYSQL-FUNC */ -%token DATE_FORMAT_SYM /* MYSQL-FUNC */ %token DATE_SUB_INTERVAL /* MYSQL-FUNC */ -%token DATE_SYM /* SQL-2003-R */ %token DAY_HOUR_SYM %token DAY_MICROSECOND_SYM %token DAY_MINUTE_SYM %token DAY_SECOND_SYM -%token DAY_SYM /* SQL-2003-R */ -%token DEALLOCATE_SYM /* SQL-2003-R */ %token DECIMAL_NUM %token DECIMAL_SYM /* SQL-2003-R */ %token DECLARE_SYM /* SQL-2003-R */ -%token DECODE_SYM /* Oracle function, non-reserved */ %token DEFAULT /* SQL-2003-R */ -%token DEFINER_SYM -%token DELAYED_SYM -%token DELAY_KEY_WRITE_SYM %token DELETE_DOMAIN_ID_SYM %token DELETE_SYM /* SQL-2003-R */ %token DENSE_RANK_SYM %token DESC /* SQL-2003-N */ %token DESCRIBE /* SQL-2003-R */ -%token DES_KEY_FILE %token DETERMINISTIC_SYM /* SQL-2003-R */ -%token DIAGNOSTICS_SYM /* SQL-2003-N */ -%token DIRECTORY_SYM -%token DISABLE_SYM -%token DISCARD -%token DISK_SYM %token DISTINCT /* SQL-2003-R */ %token DIV_SYM %token DOUBLE_SYM /* SQL-2003-R */ %token DO_DOMAIN_IDS_SYM -%token DO_SYM %token DOT_DOT_SYM %token DROP /* SQL-2003-R */ %token DUAL_SYM -%token DUMPFILE -%token DUPLICATE_SYM -%token DYNAMIC_SYM /* SQL-2003-R */ %token EACH_SYM /* SQL-2003-R */ %token ELSE /* SQL-2003-R */ %token ELSEIF_SYM -%token ELSIF_SYM /* Oracle, reserved in PL/SQL*/ -%token ENABLE_SYM %token ENCLOSED -%token END /* SQL-2003-R */ -%token ENDS_SYM %token END_OF_INPUT /* INTERNAL */ -%token ENGINES_SYM -%token ENGINE_SYM -%token ENUM %token EQUAL_SYM /* OPERATOR */ -%token ERROR_SYM -%token ERRORS %token ESCAPED -%token ESCAPE_SYM /* SQL-2003-R */ -%token EVENTS_SYM -%token EVENT_SYM -%token EVERY_SYM /* SQL-2003-N */ -%token EXCHANGE_SYM -%token EXAMINED_SYM %token EXCEPT_SYM /* SQL-2003-R */ -%token EXCLUDE_SYM /* SQL-2011-N */ -%token EXECUTE_SYM /* SQL-2003-R */ -%token EXCEPTION_SYM /* SQL-2003-N, Oracle-PLSQL-R */ %token EXISTS /* SQL-2003-R */ -%token EXIT_SYM -%token EXPANSION_SYM -%token EXPORT_SYM -%token EXTENDED_SYM -%token EXTENT_SIZE_SYM %token EXTRACT_SYM /* SQL-2003-N */ %token FALSE_SYM /* SQL-2003-R */ -%token FAST_SYM -%token FAULTS_SYM %token FETCH_SYM /* SQL-2003-R */ -%token FILE_SYM %token FIRST_VALUE_SYM /* SQL-2011 */ -%token FIRST_SYM /* SQL-2003-N */ -%token FIXED_SYM %token FLOAT_NUM %token FLOAT_SYM /* SQL-2003-R */ -%token FLUSH_SYM -%token FOLLOWS_SYM /* MYSQL trigger*/ -%token FOLLOWING_SYM /* SQL-2011-N */ -%token FORCE_SYM %token FOREIGN /* SQL-2003-R */ %token FOR_SYM /* SQL-2003-R */ %token FOR_SYSTEM_TIME_SYM /* INTERNAL */ -%token FORMAT_SYM -%token FOUND_SYM /* SQL-2003-R */ %token FROM -%token FULL /* SQL-2003-R */ %token FULLTEXT_SYM -%token FUNCTION_SYM /* SQL-2003-R */ %token GE -%token GENERAL -%token GENERATED_SYM -%token GEOMETRYCOLLECTION -%token GEOMETRY_SYM -%token GET_FORMAT /* MYSQL-FUNC */ -%token GET_SYM /* SQL-2003-R */ -%token GLOBAL_SYM /* SQL-2003-R */ -%token GOTO_SYM /* Oracle, reserved in PL/SQL*/ %token GRANT /* SQL-2003-R */ -%token GRANTS %token GROUP_SYM /* SQL-2003-R */ %token GROUP_CONCAT_SYM %token LAG_SYM /* SQL-2011 */ %token LEAD_SYM /* SQL-2011 */ -%token HANDLER_SYM -%token HARD_SYM -%token HASH_SYM %token HAVING /* SQL-2003-R */ -%token HELP_SYM %token HEX_NUM %token HEX_STRING -%token HIGH_PRIORITY -%token HISTORY_SYM /* MYSQL */ -%token HOST_SYM -%token HOSTS_SYM %token HOUR_MICROSECOND_SYM %token HOUR_MINUTE_SYM %token HOUR_SECOND_SYM -%token HOUR_SYM /* SQL-2003-R */ -%token ID_SYM /* MYSQL */ %token IDENT -%token IDENTIFIED_SYM %token IDENT_QUOTED %token IF_SYM %token IGNORE_DOMAIN_IDS_SYM %token IGNORE_SYM -%token IGNORE_SERVER_IDS_SYM -%token IMMEDIATE_SYM /* SQL-2003-R */ -%token IMPORT -%token INCREMENT_SYM -%token INDEXES %token INDEX_SYM %token INFILE -%token INITIAL_SIZE_SYM %token INNER_SYM /* SQL-2003-R */ %token INOUT_SYM /* SQL-2003-R */ %token INSENSITIVE_SYM /* SQL-2003-R */ %token INSERT /* SQL-2003-R */ -%token INSERT_METHOD -%token INSTALL_SYM %token INTERSECT_SYM /* SQL-2003-R */ %token INTERVAL_SYM /* SQL-2003-R */ %token INTO /* SQL-2003-R */ %token INT_SYM /* SQL-2003-R */ -%token INVOKER_SYM %token IN_SYM /* SQL-2003-R */ -%token IO_SYM -%token IPC_SYM %token IS /* SQL-2003-R */ -%token ISOLATION /* SQL-2003-R */ -%token ISOPEN_SYM /* Oracle-N */ -%token ISSUER_SYM %token ITERATE_SYM -%token INVISIBLE_SYM %token JOIN_SYM /* SQL-2003-R */ -%token JSON_SYM %token KEYS -%token KEY_BLOCK_SIZE %token KEY_SYM /* SQL-2003-N */ %token KILL_SYM -%token LANGUAGE_SYM /* SQL-2003-R */ -%token LAST_SYM /* SQL-2003-N */ -%token LAST_VALUE -%token LASTVAL_SYM /* PostgreSQL sequence function */ %token LE /* OPERATOR */ %token LEADING /* SQL-2003-R */ -%token LEAVES %token LEAVE_SYM %token LEFT /* SQL-2003-R */ -%token LESS_SYM -%token LEVEL_SYM %token LEX_HOSTNAME %token LIKE /* SQL-2003-R */ %token LIMIT %token LINEAR_SYM %token LINES -%token LINESTRING -%token LIST_SYM %token LOAD -%token LOCAL_SYM /* SQL-2003-R */ %token LOCATOR_SYM /* SQL-2003-N */ -%token LOCKS_SYM %token LOCK_SYM -%token LOGFILE_SYM -%token LOGS_SYM %token LONGBLOB %token LONGTEXT %token LONG_NUM %token LONG_SYM %token LOOP_SYM %token LOW_PRIORITY -%token MASTER_CONNECT_RETRY_SYM -%token MASTER_DELAY_SYM -%token MASTER_GTID_POS_SYM -%token MASTER_HOST_SYM -%token MASTER_LOG_FILE_SYM -%token MASTER_LOG_POS_SYM -%token MASTER_PASSWORD_SYM -%token MASTER_PORT_SYM -%token MASTER_SERVER_ID_SYM -%token MASTER_SSL_CAPATH_SYM -%token MASTER_SSL_CA_SYM -%token MASTER_SSL_CERT_SYM -%token MASTER_SSL_CIPHER_SYM -%token MASTER_SSL_CRL_SYM -%token MASTER_SSL_CRLPATH_SYM -%token MASTER_SSL_KEY_SYM -%token MASTER_SSL_SYM %token MASTER_SSL_VERIFY_SERVER_CERT_SYM -%token MASTER_SYM -%token MASTER_USER_SYM -%token MASTER_USE_GTID_SYM -%token MASTER_HEARTBEAT_PERIOD_SYM %token MATCH /* SQL-2003-R */ -%token MAX_CONNECTIONS_PER_HOUR -%token MAX_QUERIES_PER_HOUR -%token MAX_ROWS -%token MAX_SIZE_SYM %token MAX_SYM /* SQL-2003-N */ -%token MAX_UPDATES_PER_HOUR -%token MAX_STATEMENT_TIME_SYM -%token MAX_USER_CONNECTIONS_SYM %token MAXVALUE_SYM /* SQL-2003-N */ %token MEDIAN_SYM %token MEDIUMBLOB %token MEDIUMINT %token MEDIUMTEXT -%token MEDIUM_SYM -%token MEMORY_SYM -%token MERGE_SYM /* SQL-2003-R */ -%token MESSAGE_TEXT_SYM /* SQL-2003-N */ -%token MICROSECOND_SYM /* MYSQL-FUNC */ -%token MIGRATE_SYM %token MINUTE_MICROSECOND_SYM %token MINUTE_SECOND_SYM -%token MINUTE_SYM /* SQL-2003-R */ -%token MINVALUE_SYM -%token MIN_ROWS %token MIN_SYM /* SQL-2003-N */ -%token MODE_SYM %token MODIFIES_SYM /* SQL-2003-R */ -%token MODIFY_SYM %token MOD_SYM /* SQL-2003-N */ -%token MONTH_SYM /* SQL-2003-R */ -%token MULTILINESTRING -%token MULTIPOINT -%token MULTIPOLYGON -%token MUTEX_SYM -%token MYSQL_SYM -%token MYSQL_ERRNO_SYM -%token NAMES_SYM /* SQL-2003-N */ -%token NAME_SYM /* SQL-2003-N */ -%token NATIONAL_SYM /* SQL-2003-R */ %token NATURAL /* SQL-2003-R */ %token NCHAR_STRING -%token NCHAR_SYM /* SQL-2003-R */ %token NE /* OPERATOR */ %token NEG -%token NEW_SYM /* SQL-2003-R */ -%token NEXT_SYM /* SQL-2003-N */ -%token NEXTVAL_SYM /* PostgreSQL sequence function */ -%token NOCACHE_SYM -%token NOCYCLE_SYM -%token NODEGROUP_SYM -%token NONE_SYM /* SQL-2003-R */ %token NOT2_SYM %token NOT_SYM /* SQL-2003-R */ -%token NOTFOUND_SYM /* Oracle-R */ %token NOW_SYM -%token NO_SYM /* SQL-2003-R */ -%token NOMAXVALUE_SYM -%token NOMINVALUE_SYM -%token NO_WAIT_SYM -%token NOWAIT_SYM %token NO_WRITE_TO_BINLOG %token NTILE_SYM %token NULL_SYM /* SQL-2003-R */ %token NUM -%token NUMBER_SYM /* SQL-2003-N */ %token NUMERIC_SYM /* SQL-2003-R */ %token NTH_VALUE_SYM /* SQL-2011 */ -%token NVARCHAR_SYM -%token OF_SYM /* SQL-1992-R, Oracle-R */ -%token OFFSET_SYM -%token OLD_PASSWORD_SYM %token ON /* SQL-2003-R */ -%token ONE_SYM -%token ONLY_SYM /* SQL-2003-R */ -%token ONLINE_SYM -%token OPEN_SYM /* SQL-2003-R */ %token OPTIMIZE -%token OPTIONS_SYM -%token OPTION /* SQL-2003-N */ %token OPTIONALLY %token OR2_SYM %token ORDER_SYM /* SQL-2003-R */ %token OR_OR_SYM /* OPERATOR */ %token OR_SYM /* SQL-2003-R */ -%token OTHERS_SYM /* SQL-2011-N */ %token OUTER %token OUTFILE %token OUT_SYM /* SQL-2003-R */ %token OVER_SYM -%token OWNER_SYM -%token PACKAGE_SYM /* Oracle-R */ -%token PACK_KEYS_SYM -%token PAGE_SYM %token PAGE_CHECKSUM_SYM %token PARAM_MARKER -%token PARSER_SYM %token PARSE_VCOL_EXPR_SYM -%token PARTIAL /* SQL-2003-N */ %token PARTITION_SYM /* SQL-2003-R */ -%token PARTITIONS_SYM -%token PARTITIONING_SYM -%token PASSWORD_SYM %token PERCENT_RANK_SYM %token PERCENTILE_CONT_SYM %token PERCENTILE_DISC_SYM -%token PERIOD_SYM /* SQL-2011-R */ -%token PERSISTENT_SYM -%token PHASE_SYM -%token PLUGINS_SYM -%token PLUGIN_SYM -%token POINT_SYM -%token POLYGON -%token PORT_SYM %token POSITION_SYM /* SQL-2003-N */ -%token PRECEDES_SYM /* MYSQL */ -%token PRECEDING_SYM /* SQL-2011-N */ %token PRECISION /* SQL-2003-R */ -%token PREPARE_SYM /* SQL-2003-R */ -%token PRESERVE_SYM -%token PREV_SYM -%token PREVIOUS_SYM %token PRIMARY_SYM /* SQL-2003-R */ -%token PRIVILEGES /* SQL-2003-N */ %token PROCEDURE_SYM /* SQL-2003-R */ -%token PROCESS -%token PROCESSLIST_SYM -%token PROFILE_SYM -%token PROFILES_SYM -%token PROXY_SYM %token PURGE -%token QUARTER_SYM -%token QUERY_SYM -%token QUICK -%token RAISE_SYM /* Oracle-PLSQL-R */ %token RANGE_SYM /* SQL-2003-R */ %token RANK_SYM -%token RAW /* Oracle */ %token READS_SYM /* SQL-2003-R */ -%token READ_ONLY_SYM %token READ_SYM /* SQL-2003-N */ %token READ_WRITE_SYM %token REAL /* SQL-2003-R */ -%token REBUILD_SYM -%token RECOVER_SYM %token RECURSIVE_SYM -%token REDOFILE_SYM -%token REDO_BUFFER_SIZE_SYM -%token REDUNDANT_SYM +%token REF_SYSTEM_ID_SYM %token REFERENCES /* SQL-2003-R */ %token REGEXP -%token RELAY -%token RELAYLOG_SYM -%token RELAY_LOG_FILE_SYM -%token RELAY_LOG_POS_SYM -%token RELAY_THREAD %token RELEASE_SYM /* SQL-2003-R */ -%token RELOAD -%token REMOVE_SYM %token RENAME -%token REORGANIZE_SYM -%token REPAIR -%token REPEATABLE_SYM /* SQL-2003-N */ %token REPEAT_SYM /* MYSQL-FUNC */ %token REPLACE /* MYSQL-FUNC */ -%token REPLICATION %token REQUIRE_SYM -%token RESET_SYM -%token RESTART_SYM %token RESIGNAL_SYM /* SQL-2003-R */ -%token RESOURCES -%token RESTORE_SYM %token RESTRICT -%token RESUME_SYM -%token RETURNED_SQLSTATE_SYM /* SQL-2003-N */ %token RETURNING_SYM -%token RETURNS_SYM /* SQL-2003-R */ %token RETURN_SYM /* SQL-2003-R */ -%token REUSE_SYM /* Oracle-R */ -%token REVERSE_SYM %token REVOKE /* SQL-2003-R */ %token RIGHT /* SQL-2003-R */ -%token ROLE_SYM -%token ROLLBACK_SYM /* SQL-2003-R */ -%token ROLLUP_SYM /* SQL-2003-R */ -%token ROUTINE_SYM /* SQL-2003-N */ -%token ROWCOUNT_SYM /* Oracle-N */ -%token ROW_SYM /* SQL-2003-R */ %token ROWS_SYM /* SQL-2003-R */ -%token ROWTYPE_SYM /* Oracle-PLSQL-R */ -%token ROW_COUNT_SYM /* SQL-2003-N */ -%token ROW_FORMAT_SYM %token ROW_NUMBER_SYM -%token RTREE_SYM -%token SAVEPOINT_SYM /* SQL-2003-R */ -%token SCHEDULE_SYM -%token SCHEMA_NAME_SYM /* SQL-2003-N */ %token SECOND_MICROSECOND_SYM -%token SECOND_SYM /* SQL-2003-R */ -%token SECURITY_SYM /* SQL-2003-N */ %token SELECT_SYM /* SQL-2003-R */ %token SENSITIVE_SYM /* FUTURE-USE */ %token SEPARATOR_SYM -%token SEQUENCE_SYM -%token SERIALIZABLE_SYM /* SQL-2003-N */ -%token SERIAL_SYM -%token SESSION_SYM /* SQL-2003-N */ -%token SERVER_SYM %token SERVER_OPTIONS %token SET /* SQL-2003-R */ -%token SETVAL_SYM /* PostgreSQL sequence function */ %token SET_VAR -%token SHARE_SYM %token SHIFT_LEFT /* OPERATOR */ %token SHIFT_RIGHT /* OPERATOR */ %token SHOW -%token SHUTDOWN %token SIGNAL_SYM /* SQL-2003-R */ -%token SIGNED_SYM -%token SIMPLE_SYM /* SQL-2003-N */ -%token SLAVE -%token SLAVES -%token SLAVE_POS_SYM -%token SLOW %token SMALLINT /* SQL-2003-R */ -%token SNAPSHOT_SYM -%token SOCKET_SYM -%token SOFT_SYM -%token SONAME_SYM -%token SOUNDS_SYM -%token SOURCE_SYM %token SPATIAL_SYM %token SPECIFIC_SYM /* SQL-2003-R */ %token SQLEXCEPTION_SYM /* SQL-2003-R */ %token SQLSTATE_SYM /* SQL-2003-R */ %token SQLWARNING_SYM /* SQL-2003-R */ %token SQL_BIG_RESULT -%token SQL_BUFFER_RESULT -%token SQL_CACHE_SYM -%token SQL_CALC_FOUND_ROWS -%token SQL_NO_CACHE_SYM %token SQL_SMALL_RESULT %token SQL_SYM /* SQL-2003-R */ -%token SQL_THREAD -%token REF_SYSTEM_ID_SYM %token SSL_SYM %token STARTING -%token STARTS_SYM -%token START_SYM /* SQL-2003-R */ -%token STATEMENT_SYM %token STATS_AUTO_RECALC_SYM %token STATS_PERSISTENT_SYM %token STATS_SAMPLE_PAGES_SYM -%token STATUS_SYM %token STDDEV_SAMP_SYM /* SQL-2003-N */ %token STD_SYM -%token STOP_SYM -%token STORAGE_SYM -%token STORED_SYM %token STRAIGHT_JOIN -%token STRING_SYM -%token SUBCLASS_ORIGIN_SYM /* SQL-2003-N */ -%token SUBDATE_SYM -%token SUBJECT_SYM -%token SUBPARTITIONS_SYM -%token SUBPARTITION_SYM %token SUBSTRING /* SQL-2003-N */ %token SUM_SYM /* SQL-2003-N */ -%token SUPER_SYM -%token SUSPEND_SYM -%token SWAPS_SYM -%token SWITCHES_SYM %token SYSDATE -%token SYSTEM /* SQL-2011-R */ -%token SYSTEM_TIME_SYM /* SQL-2011-R */ -%token TABLES -%token TABLESPACE %token TABLE_REF_PRIORITY %token TABLE_SYM /* SQL-2003-R */ -%token TABLE_CHECKSUM_SYM -%token TABLE_NAME_SYM /* SQL-2003-N */ -%token TEMPORARY /* SQL-2003-N */ -%token TEMPTABLE_SYM %token TERMINATED %token TEXT_STRING -%token TEXT_SYM -%token THAN_SYM %token THEN_SYM /* SQL-2003-R */ -%token TIES_SYM /* SQL-2011-N */ -%token TIMESTAMP /* SQL-2003-R */ -%token TIMESTAMP_ADD -%token TIMESTAMP_DIFF -%token TIME_SYM /* SQL-2003-R */ %token TINYBLOB %token TINYINT %token TINYTEXT %token TO_SYM /* SQL-2003-R */ %token TRAILING /* SQL-2003-R */ -%token TRANSACTION_SYM -%token TRANSACTIONAL_SYM -%token TRIGGERS_SYM %token TRIGGER_SYM /* SQL-2003-R */ %token TRIM /* SQL-2003-N */ -%token TRIM_ORACLE %token TRUE_SYM /* SQL-2003-R */ -%token TRUNCATE_SYM -%token TYPES_SYM -%token TYPE_SYM /* SQL-2003-N */ -%token UDF_RETURNS_SYM %token ULONGLONG_NUM -%token UNBOUNDED_SYM /* SQL-2011-N */ -%token UNCOMMITTED_SYM /* SQL-2003-N */ -%token UNDEFINED_SYM %token UNDERSCORE_CHARSET -%token UNDOFILE_SYM -%token UNDO_BUFFER_SIZE_SYM %token UNDO_SYM /* FUTURE-USE */ -%token UNICODE_SYM -%token UNINSTALL_SYM %token UNION_SYM /* SQL-2003-R */ %token UNIQUE_SYM -%token UNKNOWN_SYM /* SQL-2003-R */ %token UNLOCK_SYM %token UNSIGNED -%token UNTIL_SYM %token UPDATE_SYM /* SQL-2003-R */ -%token UPGRADE_SYM %token USAGE /* SQL-2003-N */ -%token USER_SYM /* SQL-2003-R */ -%token USE_FRM %token USE_SYM %token USING /* SQL-2003-R */ %token UTC_DATE_SYM @@ -981,44 +579,462 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); %token VALUES /* SQL-2003-R */ %token VALUES_IN_SYM %token VALUES_LESS_SYM -%token VALUE_SYM /* SQL-2003-R */ %token VARBINARY %token VARCHAR /* SQL-2003-R */ -%token VARCHAR2 /* Oracle */ -%token VARIABLES %token VARIANCE_SYM %token VARYING /* SQL-2003-R */ %token VAR_SAMP_SYM -%token VERSIONING_SYM /* SQL-2011-R */ -%token VIA_SYM -%token VIEW_SYM /* SQL-2003-N */ -%token VIRTUAL_SYM -%token WAIT_SYM -%token WARNINGS -%token WEEK_SYM -%token WEIGHT_STRING_SYM %token WHEN_SYM /* SQL-2003-R */ %token WHERE /* SQL-2003-R */ -%token WINDOW_SYM %token WHILE_SYM %token WITH /* SQL-2003-R */ -%token WITHIN -%token WITHOUT /* SQL-2003-R */ %token WITH_CUBE_SYM /* INTERNAL */ %token WITH_ROLLUP_SYM /* INTERNAL */ %token WITH_SYSTEM_SYM /* INTERNAL */ -%token WORK_SYM /* SQL-2003-N */ -%token WRAPPER_SYM -%token WRITE_SYM /* SQL-2003-N */ -%token X509_SYM -%token XA_SYM -%token XML_SYM %token XOR %token YEAR_MONTH_SYM -%token YEAR_SYM /* SQL-2003-R */ %token ZEROFILL -%token IMPOSSIBLE_ACTION /* To avoid warning for yyerrlab1 */ +%token IMPOSSIBLE_ACTION /* To avoid warning for yyerrlab1 */ + + +/* + Keywords that have different reserved status in std/oracle modes. +*/ +%token BODY_SYM /* Oracle-R */ +%token COMMENT_SYM +%token ELSIF_SYM /* Oracle, reserved in PL/SQL*/ +%token GOTO_SYM /* Oracle, reserved in PL/SQL*/ +%token HISTORY_SYM /* MYSQL */ +%token OTHERS_SYM /* SQL-2011-N */ +%token PACKAGE_SYM /* Oracle-R */ +%token PERIOD_SYM /* SQL-2011-R */ +%token RAISE_SYM /* Oracle-PLSQL-R */ +%token ROWTYPE_SYM /* Oracle-PLSQL-R */ +%token SYSTEM /* SQL-2011-R */ +%token SYSTEM_TIME_SYM /* SQL-2011-R */ +%token VERSIONING_SYM /* SQL-2011-R */ +%token WINDOW_SYM +%token WITHOUT /* SQL-2003-R */ + +/* + Non-reserved keywords +*/ + +%token <kwd> ACTION /* SQL-2003-N */ +%token <kwd> ADMIN_SYM /* SQL-2003-N */ +%token <kwd> ADDDATE_SYM /* MYSQL-FUNC */ +%token <kwd> AFTER_SYM /* SQL-2003-N */ +%token <kwd> AGAINST +%token <kwd> AGGREGATE_SYM +%token <kwd> ALGORITHM_SYM +%token <kwd> ALWAYS_SYM +%token <kwd> ANY_SYM /* SQL-2003-R */ +%token <kwd> ASCII_SYM /* MYSQL-FUNC */ +%token <kwd> AT_SYM /* SQL-2003-R */ +%token <kwd> ATOMIC_SYM /* SQL-2003-R */ +%token <kwd> AUTHORS_SYM +%token <kwd> AUTOEXTEND_SIZE_SYM +%token <kwd> AUTO_INC +%token <kwd> AUTO_SYM +%token <kwd> AVG_ROW_LENGTH +%token <kwd> AVG_SYM /* SQL-2003-N */ +%token <kwd> BACKUP_SYM +%token <kwd> BEGIN_SYM /* SQL-2003-R */ +%token <kwd> BINLOG_SYM +%token <kwd> BIT_SYM /* MYSQL-FUNC */ +%token <kwd> BLOCK_SYM +%token <kwd> BOOL_SYM +%token <kwd> BOOLEAN_SYM /* SQL-2003-R */ +%token <kwd> BTREE_SYM +%token <kwd> BYTE_SYM +%token <kwd> CACHE_SYM +%token <kwd> CASCADED /* SQL-2003-R */ +%token <kwd> CATALOG_NAME_SYM /* SQL-2003-N */ +%token <kwd> CHAIN_SYM /* SQL-2003-N */ +%token <kwd> CHANGED +%token <kwd> CHARSET +%token <kwd> CHECKPOINT_SYM +%token <kwd> CHECKSUM_SYM +%token <kwd> CIPHER_SYM +%token <kwd> CLASS_ORIGIN_SYM /* SQL-2003-N */ +%token <kwd> CLIENT_SYM +%token <kwd> CLOB /* SQL-2003-R */ +%token <kwd> CLOSE_SYM /* SQL-2003-R */ +%token <kwd> COALESCE /* SQL-2003-N */ +%token <kwd> CODE_SYM +%token <kwd> COLLATION_SYM /* SQL-2003-N */ +%token <kwd> COLUMNS +%token <kwd> COLUMN_ADD_SYM +%token <kwd> COLUMN_CHECK_SYM +%token <kwd> COLUMN_CREATE_SYM +%token <kwd> COLUMN_DELETE_SYM +%token <kwd> COLUMN_GET_SYM +%token <kwd> COLUMN_SYM /* SQL-2003-R */ +%token <kwd> COLUMN_NAME_SYM /* SQL-2003-N */ +%token <kwd> COMMITTED_SYM /* SQL-2003-N */ +%token <kwd> COMMIT_SYM /* SQL-2003-R */ +%token <kwd> COMPACT_SYM +%token <kwd> COMPLETION_SYM +%token <kwd> COMPRESSED_SYM +%token <kwd> CONCURRENT +%token <kwd> CONNECTION_SYM +%token <kwd> CONSISTENT_SYM +%token <kwd> CONSTRAINT_CATALOG_SYM /* SQL-2003-N */ +%token <kwd> CONSTRAINT_NAME_SYM /* SQL-2003-N */ +%token <kwd> CONSTRAINT_SCHEMA_SYM /* SQL-2003-N */ +%token <kwd> CONTAINS_SYM /* SQL-2003-N */ +%token <kwd> CONTEXT_SYM +%token <kwd> CONTRIBUTORS_SYM +%token <kwd> CPU_SYM +%token <kwd> CUBE_SYM /* SQL-2003-R */ +%token <kwd> CURRENT_SYM /* SQL-2003-R */ +%token <kwd> CURRENT_POS_SYM +%token <kwd> CURSOR_NAME_SYM /* SQL-2003-N */ +%token <kwd> CYCLE_SYM +%token <kwd> DATAFILE_SYM +%token <kwd> DATA_SYM /* SQL-2003-N */ +%token <kwd> DATETIME +%token <kwd> DATE_FORMAT_SYM /* MYSQL-FUNC */ +%token <kwd> DATE_SYM /* SQL-2003-R */ +%token <kwd> DAY_SYM /* SQL-2003-R */ +%token <kwd> DEALLOCATE_SYM /* SQL-2003-R */ +%token <kwd> DECODE_SYM /* Oracle function, non-reserved */ +%token <kwd> DEFINER_SYM +%token <kwd> DELAYED_SYM +%token <kwd> DELAY_KEY_WRITE_SYM +%token <kwd> DES_KEY_FILE +%token <kwd> DIAGNOSTICS_SYM /* SQL-2003-N */ +%token <kwd> DIRECTORY_SYM +%token <kwd> DISABLE_SYM +%token <kwd> DISCARD +%token <kwd> DISK_SYM +%token <kwd> DO_SYM +%token <kwd> DUMPFILE +%token <kwd> DUPLICATE_SYM +%token <kwd> DYNAMIC_SYM /* SQL-2003-R */ +%token <kwd> ENABLE_SYM +%token <kwd> END /* SQL-2003-R */ +%token <kwd> ENDS_SYM +%token <kwd> ENGINES_SYM +%token <kwd> ENGINE_SYM +%token <kwd> ENUM +%token <kwd> ERROR_SYM +%token <kwd> ERRORS +%token <kwd> ESCAPE_SYM /* SQL-2003-R */ +%token <kwd> EVENTS_SYM +%token <kwd> EVENT_SYM +%token <kwd> EVERY_SYM /* SQL-2003-N */ +%token <kwd> EXCHANGE_SYM +%token <kwd> EXAMINED_SYM +%token <kwd> EXCLUDE_SYM /* SQL-2011-N */ +%token <kwd> EXECUTE_SYM /* SQL-2003-R */ +%token <kwd> EXCEPTION_SYM /* SQL-2003-N, Oracle-PLSQL-R */ +%token <kwd> EXIT_SYM +%token <kwd> EXPANSION_SYM +%token <kwd> EXPORT_SYM +%token <kwd> EXTENDED_SYM +%token <kwd> EXTENT_SIZE_SYM +%token <kwd> FAST_SYM +%token <kwd> FAULTS_SYM +%token <kwd> FILE_SYM +%token <kwd> FIRST_SYM /* SQL-2003-N */ +%token <kwd> FIXED_SYM +%token <kwd> FLUSH_SYM +%token <kwd> FOLLOWS_SYM /* MYSQL trigger*/ +%token <kwd> FOLLOWING_SYM /* SQL-2011-N */ +%token <kwd> FORCE_SYM +%token <kwd> FORMAT_SYM +%token <kwd> FOUND_SYM /* SQL-2003-R */ +%token <kwd> FULL /* SQL-2003-R */ +%token <kwd> FUNCTION_SYM /* SQL-2003-R */ +%token <kwd> GENERAL +%token <kwd> GENERATED_SYM +%token <kwd> GEOMETRYCOLLECTION +%token <kwd> GEOMETRY_SYM +%token <kwd> GET_FORMAT /* MYSQL-FUNC */ +%token <kwd> GET_SYM /* SQL-2003-R */ +%token <kwd> GLOBAL_SYM /* SQL-2003-R */ +%token <kwd> GRANTS +%token <kwd> HANDLER_SYM +%token <kwd> HARD_SYM +%token <kwd> HASH_SYM +%token <kwd> HELP_SYM +%token <kwd> HIGH_PRIORITY +%token <kwd> HOST_SYM +%token <kwd> HOSTS_SYM +%token <kwd> HOUR_SYM /* SQL-2003-R */ +%token <kwd> ID_SYM /* MYSQL */ +%token <kwd> IDENTIFIED_SYM +%token <kwd> IGNORE_SERVER_IDS_SYM +%token <kwd> IMMEDIATE_SYM /* SQL-2003-R */ +%token <kwd> IMPORT +%token <kwd> INCREMENT_SYM +%token <kwd> INDEXES +%token <kwd> INITIAL_SIZE_SYM +%token <kwd> INSERT_METHOD +%token <kwd> INSTALL_SYM +%token <kwd> INVOKER_SYM +%token <kwd> IO_SYM +%token <kwd> IPC_SYM +%token <kwd> ISOLATION /* SQL-2003-R */ +%token <kwd> ISOPEN_SYM /* Oracle-N */ +%token <kwd> ISSUER_SYM +%token <kwd> INVISIBLE_SYM +%token <kwd> JSON_SYM +%token <kwd> KEY_BLOCK_SIZE +%token <kwd> LANGUAGE_SYM /* SQL-2003-R */ +%token <kwd> LAST_SYM /* SQL-2003-N */ +%token <kwd> LAST_VALUE +%token <kwd> LASTVAL_SYM /* PostgreSQL sequence function */ +%token <kwd> LEAVES +%token <kwd> LESS_SYM +%token <kwd> LEVEL_SYM +%token <kwd> LINESTRING +%token <kwd> LIST_SYM +%token <kwd> LOCAL_SYM /* SQL-2003-R */ +%token <kwd> LOCKS_SYM +%token <kwd> LOGFILE_SYM +%token <kwd> LOGS_SYM +%token <kwd> MASTER_CONNECT_RETRY_SYM +%token <kwd> MASTER_DELAY_SYM +%token <kwd> MASTER_GTID_POS_SYM +%token <kwd> MASTER_HOST_SYM +%token <kwd> MASTER_LOG_FILE_SYM +%token <kwd> MASTER_LOG_POS_SYM +%token <kwd> MASTER_PASSWORD_SYM +%token <kwd> MASTER_PORT_SYM +%token <kwd> MASTER_SERVER_ID_SYM +%token <kwd> MASTER_SSL_CAPATH_SYM +%token <kwd> MASTER_SSL_CA_SYM +%token <kwd> MASTER_SSL_CERT_SYM +%token <kwd> MASTER_SSL_CIPHER_SYM +%token <kwd> MASTER_SSL_CRL_SYM +%token <kwd> MASTER_SSL_CRLPATH_SYM +%token <kwd> MASTER_SSL_KEY_SYM +%token <kwd> MASTER_SSL_SYM +%token <kwd> MASTER_SYM +%token <kwd> MASTER_USER_SYM +%token <kwd> MASTER_USE_GTID_SYM +%token <kwd> MASTER_HEARTBEAT_PERIOD_SYM +%token <kwd> MAX_CONNECTIONS_PER_HOUR +%token <kwd> MAX_QUERIES_PER_HOUR +%token <kwd> MAX_ROWS +%token <kwd> MAX_SIZE_SYM +%token <kwd> MAX_UPDATES_PER_HOUR +%token <kwd> MAX_STATEMENT_TIME_SYM +%token <kwd> MAX_USER_CONNECTIONS_SYM +%token <kwd> MEDIUM_SYM +%token <kwd> MEMORY_SYM +%token <kwd> MERGE_SYM /* SQL-2003-R */ +%token <kwd> MESSAGE_TEXT_SYM /* SQL-2003-N */ +%token <kwd> MICROSECOND_SYM /* MYSQL-FUNC */ +%token <kwd> MIGRATE_SYM +%token <kwd> MINUTE_SYM /* SQL-2003-R */ +%token <kwd> MINVALUE_SYM +%token <kwd> MIN_ROWS +%token <kwd> MODE_SYM +%token <kwd> MODIFY_SYM +%token <kwd> MONTH_SYM /* SQL-2003-R */ +%token <kwd> MULTILINESTRING +%token <kwd> MULTIPOINT +%token <kwd> MULTIPOLYGON +%token <kwd> MUTEX_SYM +%token <kwd> MYSQL_SYM +%token <kwd> MYSQL_ERRNO_SYM +%token <kwd> NAMES_SYM /* SQL-2003-N */ +%token <kwd> NAME_SYM /* SQL-2003-N */ +%token <kwd> NATIONAL_SYM /* SQL-2003-R */ +%token <kwd> NCHAR_SYM /* SQL-2003-R */ +%token <kwd> NEW_SYM /* SQL-2003-R */ +%token <kwd> NEXT_SYM /* SQL-2003-N */ +%token <kwd> NEXTVAL_SYM /* PostgreSQL sequence function */ +%token <kwd> NOCACHE_SYM +%token <kwd> NOCYCLE_SYM +%token <kwd> NODEGROUP_SYM +%token <kwd> NONE_SYM /* SQL-2003-R */ +%token <kwd> NOTFOUND_SYM /* Oracle-R */ +%token <kwd> NO_SYM /* SQL-2003-R */ +%token <kwd> NOMAXVALUE_SYM +%token <kwd> NOMINVALUE_SYM +%token <kwd> NO_WAIT_SYM +%token <kwd> NOWAIT_SYM +%token <kwd> NUMBER_SYM /* SQL-2003-N */ +%token <kwd> NVARCHAR_SYM +%token <kwd> OF_SYM /* SQL-1992-R, Oracle-R */ +%token <kwd> OFFSET_SYM +%token <kwd> OLD_PASSWORD_SYM +%token <kwd> ONE_SYM +%token <kwd> ONLY_SYM /* SQL-2003-R */ +%token <kwd> ONLINE_SYM +%token <kwd> OPEN_SYM /* SQL-2003-R */ +%token <kwd> OPTIONS_SYM +%token <kwd> OPTION /* SQL-2003-N */ +%token <kwd> OWNER_SYM +%token <kwd> PACK_KEYS_SYM +%token <kwd> PAGE_SYM +%token <kwd> PARSER_SYM +%token <kwd> PARTIAL /* SQL-2003-N */ +%token <kwd> PARTITIONS_SYM +%token <kwd> PARTITIONING_SYM +%token <kwd> PASSWORD_SYM +%token <kwd> PERSISTENT_SYM +%token <kwd> PHASE_SYM +%token <kwd> PLUGINS_SYM +%token <kwd> PLUGIN_SYM +%token <kwd> POINT_SYM +%token <kwd> POLYGON +%token <kwd> PORT_SYM +%token <kwd> PRECEDES_SYM /* MYSQL */ +%token <kwd> PRECEDING_SYM /* SQL-2011-N */ +%token <kwd> PREPARE_SYM /* SQL-2003-R */ +%token <kwd> PRESERVE_SYM +%token <kwd> PREV_SYM +%token <kwd> PREVIOUS_SYM +%token <kwd> PRIVILEGES /* SQL-2003-N */ +%token <kwd> PROCESS +%token <kwd> PROCESSLIST_SYM +%token <kwd> PROFILE_SYM +%token <kwd> PROFILES_SYM +%token <kwd> PROXY_SYM +%token <kwd> QUARTER_SYM +%token <kwd> QUERY_SYM +%token <kwd> QUICK +%token <kwd> RAW /* Oracle */ +%token <kwd> READ_ONLY_SYM +%token <kwd> REBUILD_SYM +%token <kwd> RECOVER_SYM +%token <kwd> REDOFILE_SYM +%token <kwd> REDO_BUFFER_SIZE_SYM +%token <kwd> REDUNDANT_SYM +%token <kwd> RELAY +%token <kwd> RELAYLOG_SYM +%token <kwd> RELAY_LOG_FILE_SYM +%token <kwd> RELAY_LOG_POS_SYM +%token <kwd> RELAY_THREAD +%token <kwd> RELOAD +%token <kwd> REMOVE_SYM +%token <kwd> REORGANIZE_SYM +%token <kwd> REPAIR +%token <kwd> REPEATABLE_SYM /* SQL-2003-N */ +%token <kwd> REPLICATION +%token <kwd> RESET_SYM +%token <kwd> RESTART_SYM +%token <kwd> RESOURCES +%token <kwd> RESTORE_SYM +%token <kwd> RESUME_SYM +%token <kwd> RETURNED_SQLSTATE_SYM /* SQL-2003-N */ +%token <kwd> RETURNS_SYM /* SQL-2003-R */ +%token <kwd> REUSE_SYM /* Oracle-R */ +%token <kwd> REVERSE_SYM +%token <kwd> ROLE_SYM +%token <kwd> ROLLBACK_SYM /* SQL-2003-R */ +%token <kwd> ROLLUP_SYM /* SQL-2003-R */ +%token <kwd> ROUTINE_SYM /* SQL-2003-N */ +%token <kwd> ROWCOUNT_SYM /* Oracle-N */ +%token <kwd> ROW_SYM /* SQL-2003-R */ +%token <kwd> ROW_COUNT_SYM /* SQL-2003-N */ +%token <kwd> ROW_FORMAT_SYM +%token <kwd> RTREE_SYM +%token <kwd> SAVEPOINT_SYM /* SQL-2003-R */ +%token <kwd> SCHEDULE_SYM +%token <kwd> SCHEMA_NAME_SYM /* SQL-2003-N */ +%token <kwd> SECOND_SYM /* SQL-2003-R */ +%token <kwd> SECURITY_SYM /* SQL-2003-N */ +%token <kwd> SEQUENCE_SYM +%token <kwd> SERIALIZABLE_SYM /* SQL-2003-N */ +%token <kwd> SERIAL_SYM +%token <kwd> SESSION_SYM /* SQL-2003-N */ +%token <kwd> SERVER_SYM +%token <kwd> SETVAL_SYM /* PostgreSQL sequence function */ +%token <kwd> SHARE_SYM +%token <kwd> SHUTDOWN +%token <kwd> SIGNED_SYM +%token <kwd> SIMPLE_SYM /* SQL-2003-N */ +%token <kwd> SLAVE +%token <kwd> SLAVES +%token <kwd> SLAVE_POS_SYM +%token <kwd> SLOW +%token <kwd> SNAPSHOT_SYM +%token <kwd> SOCKET_SYM +%token <kwd> SOFT_SYM +%token <kwd> SONAME_SYM +%token <kwd> SOUNDS_SYM +%token <kwd> SOURCE_SYM +%token <kwd> SQL_BUFFER_RESULT +%token <kwd> SQL_CACHE_SYM +%token <kwd> SQL_CALC_FOUND_ROWS +%token <kwd> SQL_NO_CACHE_SYM +%token <kwd> SQL_THREAD +%token <kwd> STARTS_SYM +%token <kwd> START_SYM /* SQL-2003-R */ +%token <kwd> STATEMENT_SYM +%token <kwd> STATUS_SYM +%token <kwd> STOP_SYM +%token <kwd> STORAGE_SYM +%token <kwd> STORED_SYM +%token <kwd> STRING_SYM +%token <kwd> SUBCLASS_ORIGIN_SYM /* SQL-2003-N */ +%token <kwd> SUBDATE_SYM +%token <kwd> SUBJECT_SYM +%token <kwd> SUBPARTITIONS_SYM +%token <kwd> SUBPARTITION_SYM +%token <kwd> SUPER_SYM +%token <kwd> SUSPEND_SYM +%token <kwd> SWAPS_SYM +%token <kwd> SWITCHES_SYM +%token <kwd> TABLES +%token <kwd> TABLESPACE +%token <kwd> TABLE_CHECKSUM_SYM +%token <kwd> TABLE_NAME_SYM /* SQL-2003-N */ +%token <kwd> TEMPORARY /* SQL-2003-N */ +%token <kwd> TEMPTABLE_SYM +%token <kwd> TEXT_SYM +%token <kwd> THAN_SYM +%token <kwd> TIES_SYM /* SQL-2011-N */ +%token <kwd> TIMESTAMP /* SQL-2003-R */ +%token <kwd> TIMESTAMP_ADD +%token <kwd> TIMESTAMP_DIFF +%token <kwd> TIME_SYM /* SQL-2003-R */ +%token <kwd> TRANSACTION_SYM +%token <kwd> TRANSACTIONAL_SYM +%token <kwd> TRIGGERS_SYM +%token <kwd> TRIM_ORACLE +%token <kwd> TRUNCATE_SYM +%token <kwd> TYPES_SYM +%token <kwd> TYPE_SYM /* SQL-2003-N */ +%token <kwd> UDF_RETURNS_SYM +%token <kwd> UNBOUNDED_SYM /* SQL-2011-N */ +%token <kwd> UNCOMMITTED_SYM /* SQL-2003-N */ +%token <kwd> UNDEFINED_SYM +%token <kwd> UNDOFILE_SYM +%token <kwd> UNDO_BUFFER_SIZE_SYM +%token <kwd> UNICODE_SYM +%token <kwd> UNINSTALL_SYM +%token <kwd> UNKNOWN_SYM /* SQL-2003-R */ +%token <kwd> UNTIL_SYM +%token <kwd> UPGRADE_SYM +%token <kwd> USER_SYM /* SQL-2003-R */ +%token <kwd> USE_FRM +%token <kwd> VALUE_SYM /* SQL-2003-R */ +%token <kwd> VARCHAR2 /* Oracle */ +%token <kwd> VARIABLES +%token <kwd> VIA_SYM +%token <kwd> VIEW_SYM /* SQL-2003-N */ +%token <kwd> VIRTUAL_SYM +%token <kwd> WAIT_SYM +%token <kwd> WARNINGS +%token <kwd> WEEK_SYM +%token <kwd> WEIGHT_STRING_SYM +%token <kwd> WITHIN +%token <kwd> WORK_SYM /* SQL-2003-N */ +%token <kwd> WRAPPER_SYM +%token <kwd> WRITE_SYM /* SQL-2003-N */ +%token <kwd> X509_SYM +%token <kwd> XA_SYM +%token <kwd> XML_SYM +%token <kwd> YEAR_SYM /* SQL-2003-R */ + %left JOIN_SYM INNER_SYM STRAIGHT_JOIN CROSS LEFT RIGHT /* A dummy token to force the priority of table_ref production in a join. */ @@ -1041,23 +1057,28 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); %left INTERVAL_SYM %type <lex_str> - IDENT IDENT_QUOTED DECIMAL_NUM FLOAT_NUM NUM LONG_NUM + DECIMAL_NUM FLOAT_NUM NUM LONG_NUM HEX_NUM HEX_STRING LEX_HOSTNAME ULONGLONG_NUM field_ident select_alias ident_or_text - IDENT_sys TEXT_STRING_sys TEXT_STRING_literal + TEXT_STRING_sys TEXT_STRING_literal opt_component key_cache_name - sp_opt_label BIN_NUM TEXT_STRING_filesystem ident_or_empty + sp_opt_label BIN_NUM TEXT_STRING_filesystem opt_constraint constraint opt_ident - ident_directly_assignable opt_package_routine_end_name - sp_decl_ident sp_block_label opt_place opt_db %type <lex_str> - label_ident label_declaration_oracle labels_declaration_oracle +%type <ident_sys> + IDENT_sys + ident + label_ident + ident_or_empty + sp_decl_ident + ident_directly_assignable + %type <lex_string_with_metadata> TEXT_STRING NCHAR_STRING @@ -1065,8 +1086,20 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); %type <lex_str_ptr> opt_table_alias -%type <lex_string_with_pos> - ident ident_with_tok_start +%type <ident_cli> + IDENT + IDENT_QUOTED + IDENT_cli + ident_cli + +%type <kwd> + keyword keyword_sp + keyword_directly_assignable + keyword_directly_not_assignable + keyword_sp_data_type + keyword_sp_not_data_type + keyword_sp_verb_clause + sp_decl_ident_keyword %type <table> table_ident table_ident_nodb references xid @@ -1164,11 +1197,12 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); variable variable_aux bool_pri predicate bit_expr parenthesized_expr table_wild simple_expr column_default_non_parenthesized_expr udf_expr + select_sublist_qualified_asterisk expr_or_default set_expr_or_default geometry_function signed_literal expr_or_literal opt_escape sp_opt_default - simple_ident_nospvar simple_ident_q simple_ident_q2 + simple_ident_nospvar field_or_var limit_option part_func_expr window_func_expr @@ -1253,13 +1287,6 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); opt_field_length_default_sp_param_varchar opt_field_length_default_sp_param_char -%type <symbol> keyword keyword_sp - keyword_directly_assignable - keyword_directly_not_assignable - sp_decl_ident_keyword - keyword_sp_data_type - keyword_sp_not_data_type - %type <lex_user> user grant_user grant_role user_or_role current_role admin_option_for_role user_maybe_role @@ -1445,7 +1472,6 @@ END_OF_INPUT '-' '+' '*' '/' '%' '(' ')' ',' '!' '{' '}' '&' '|' AND_SYM OR_SYM OR_OR_SYM BETWEEN_SYM CASE_SYM THEN_SYM WHEN_SYM DIV_SYM MOD_SYM OR2_SYM AND_AND_SYM DELETE_SYM - ROLE_SYM %type <with_clause> opt_with_clause with_clause @@ -3535,13 +3561,9 @@ statement_information_item: } simple_target_specification: - ident + ident_cli { - Lex_input_stream *lip= &thd->m_parser_state->m_lip; - $$= thd->lex->create_item_for_sp_var(&$1, NULL, - lip->get_tok_start(), - lip->get_ptr()); - if ($$ == NULL) + if (!($$= thd->lex->create_item_for_sp_var(&$1, NULL))) MYSQL_YYABORT; } | '@' ident_or_text @@ -3624,10 +3646,8 @@ sp_decl_ident: IDENT_sys | sp_decl_ident_keyword { - $$.str= thd->strmake($1.str, $1.length); - if ($$.str == NULL) + if ($$.copy_ident_cli(thd, &$1)) MYSQL_YYABORT; - $$.length= $1.length; } ; @@ -7689,8 +7709,8 @@ opt_ev_sql_stmt: ; ident_or_empty: - /* empty */ { $$= null_clex_str; } - | ident { $$= $1; } + /* empty */ { $$= Lex_ident_sys(); } + | ident ; alter_commands: @@ -9076,7 +9096,7 @@ select_item_list: ; select_item: - remember_name table_wild remember_end + remember_name select_sublist_qualified_asterisk remember_end { if (add_item_to_list(thd, $2)) MYSQL_YYABORT; @@ -10621,40 +10641,10 @@ function_call_generic: MYSQL_YYABORT; } } - | ident '.' ident '(' opt_expr_list ')' + | ident_cli '.' ident_cli '(' opt_expr_list ')' { - Create_qfunc *builder; - Item *item= NULL; - - /* - The following in practice calls: - <code>Create_sp_func::create()</code> - and builds a stored function. - - However, it's important to maintain the interface between the - parser and the implementation in item_create.cc clean, - since this will change with WL#2128 (SQL PATH): - - INFORMATION_SCHEMA.version() is the SQL 99 syntax for the native - function version(), - - MySQL.version() is the SQL 2003 syntax for the native function - version() (a vendor can specify any schema). - */ - - if (!$1.str || check_db_name((LEX_STRING*) &$1)) - my_yyabort_error((ER_WRONG_DB_NAME, MYF(0), $1.str)); - if (check_routine_name(&$3)) - { + if (!($$= Lex->make_item_func_call_generic(thd, &$1, &$3, $5))) MYSQL_YYABORT; - } - - builder= find_qualified_function_builder(thd); - DBUG_ASSERT(builder); - item= builder->create_with_db(thd, &$1, &$3, true, $5); - - if (! ($$= item)) - { - MYSQL_YYABORT; - } } ; @@ -11033,10 +11023,11 @@ percentile_function: { Item *args= new (thd->mem_root) Item_decimal(thd, "0.5", 3, thd->charset()); - if (($$ == NULL) || (thd->is_error())) + if ((args == NULL) || (thd->is_error())) { MYSQL_YYABORT; } + Select->prepare_add_window_spec(thd); if (add_order_to_list(thd, $3,FALSE)) MYSQL_YYABORT; $$= new (thd->mem_root) Item_sum_percentile_cont(thd, args); @@ -11065,6 +11056,7 @@ order_by_single_element_list: { if (add_order_to_list(thd, $3,(bool) $4)) MYSQL_YYABORT; } ; + window_name: ident { @@ -11187,6 +11179,8 @@ glimit_options: } ; + + in_sum_expr: opt_all { @@ -11301,7 +11295,6 @@ when_list: } ; - when_list_opt_else: when_list | when_list ELSE expr @@ -11538,6 +11531,7 @@ table_factor: table_primary_ident: { + DBUG_ASSERT(Select); SELECT_LEX *sel= Select; sel->table_join_options= 0; } @@ -12361,26 +12355,20 @@ limit_options: ; limit_option: - ident_with_tok_start - { - LEX *lex= thd->lex; - Lex_input_stream *lip= & thd->m_parser_state->m_lip; - if (!($$= lex->create_item_limit(thd, &$1, - $1.m_pos, lip->get_tok_end()))) - MYSQL_YYABORT; - } - | ident_with_tok_start '.' ident - { - LEX *lex= thd->lex; - Lex_input_stream *lip= & thd->m_parser_state->m_lip; - if (!($$= lex->create_item_limit(thd, &$1, &$3, - $1.m_pos, lip->get_ptr()))) - MYSQL_YYABORT; - } + ident_cli + { + if (!($$= Lex->create_item_limit(thd, &$1))) + MYSQL_YYABORT; + } + | ident_cli '.' ident_cli + { + if (!($$= Lex->create_item_limit(thd, &$1, &$3))) + MYSQL_YYABORT; + } | param_marker - { - $1->limit_clause_param= TRUE; - } + { + $1->limit_clause_param= TRUE; + } | ULONGLONG_NUM { $$= new (thd->mem_root) Item_uint(thd, $1.str, $1.length); @@ -12926,10 +12914,9 @@ insert_lock_option: | LOW_PRIORITY { $$= TL_WRITE_LOW_PRIORITY; } | DELAYED_SYM { - Lex->keyword_delayed_begin_offset= (uint)(YYLIP->get_tok_start() - - thd->query()); - Lex->keyword_delayed_end_offset= Lex->keyword_delayed_begin_offset + - YYLIP->yyLength() + 1; + // QQ: why was +1? + Lex->keyword_delayed_begin_offset= (uint)($1.pos() - thd->query()); + Lex->keyword_delayed_end_offset= (uint)($1.end() - thd->query()); $$= TL_WRITE_DELAYED; } | HIGH_PRIORITY { $$= TL_WRITE; } @@ -12939,10 +12926,8 @@ replace_lock_option: opt_low_priority { $$= $1; } | DELAYED_SYM { - Lex->keyword_delayed_begin_offset= (uint)(YYLIP->get_tok_start() - - thd->query()); - Lex->keyword_delayed_end_offset= Lex->keyword_delayed_begin_offset + - YYLIP->yyLength() + 1; + Lex->keyword_delayed_begin_offset= (uint)($1.pos() - thd->query()); + Lex->keyword_delayed_end_offset= (uint)($1.end() - thd->query()); $$= TL_WRITE_DELAYED; } ; @@ -14692,24 +14677,26 @@ insert_ident: table_wild: ident '.' '*' { - SELECT_LEX *sel= Select; - $$= new (thd->mem_root) Item_field(thd, Lex->current_context(), - NullS, $1.str, &star_clex_str); - if ($$ == NULL) + if (!($$= Lex->create_item_qualified_asterisk(thd, &$1))) MYSQL_YYABORT; - sel->with_wild++; } | ident '.' ident '.' '*' { - SELECT_LEX *sel= Select; - const char* schema= thd->client_capabilities & CLIENT_NO_SCHEMA ? - NullS : $1.str; - $$= new (thd->mem_root) Item_field(thd, Lex->current_context(), - schema, - $3.str, &star_clex_str); - if ($$ == NULL) + if (!($$= Lex->create_item_qualified_asterisk(thd, &$1, &$3))) + MYSQL_YYABORT; + } + ; + +select_sublist_qualified_asterisk: + ident_cli '.' '*' + { + if (!($$= Lex->create_item_qualified_asterisk(thd, &$1))) + MYSQL_YYABORT; + } + | ident_cli '.' ident_cli '.' '*' + { + if (!($$= Lex->create_item_qualified_asterisk(thd, &$1, &$3))) MYSQL_YYABORT; - sel->with_wild++; } ; @@ -14717,21 +14704,32 @@ order_ident: expr { $$=$1; } ; + simple_ident: - ident + ident_cli { - Lex_input_stream *lip= YYLIP; - if (!($$= Lex->create_item_ident(thd, &$1, - lip->get_tok_start_prev(), - lip->get_tok_end()))) + if (!($$= Lex->create_item_ident(thd, &$1))) MYSQL_YYABORT; } - | simple_ident_q2 - | ident '.' ident + | ident_cli '.' ident_cli { - LEX *lex= thd->lex; - if (!($$= lex->create_item_ident(thd, &$1, &$3, - $1.m_pos, YYLIP->get_tok_end()))) + if (!($$= Lex->create_item_ident(thd, &$1, &$3))) + MYSQL_YYABORT; + } + | '.' ident_cli '.' ident_cli + { + Lex_ident_cli empty($2.pos(), 0); + if (!($$= Lex->create_item_ident(thd, &empty, &$2, &$4))) + MYSQL_YYABORT; + } + | ident_cli '.' ident_cli '.' ident_cli + { + if (!($$= Lex->create_item_ident(thd, &$1, &$3, &$5))) + MYSQL_YYABORT; + } + | colon_with_pos ident '.' ident + { + if (!($$= Lex->make_item_colon_ident_ident(thd, &$2, &$4))) MYSQL_YYABORT; } ; @@ -14742,39 +14740,20 @@ simple_ident_nospvar: if (!($$= Lex->create_item_ident_nosp(thd, &$1))) MYSQL_YYABORT; } - | simple_ident_q { $$= $1; } - ; - -simple_ident_q: - ident '.' ident + | ident '.' ident { if (!($$= Lex->create_item_ident_nospvar(thd, &$1, &$3))) MYSQL_YYABORT; } - | simple_ident_q2 - ; - -simple_ident_q2: - colon_with_pos ident '.' ident + | colon_with_pos ident '.' ident { - LEX *lex= Lex; - if (lex->is_trigger_new_or_old_reference(&$2)) - { - bool new_row= ($2.str[0]=='N' || $2.str[0]=='n'); - if (!($$= lex->create_and_link_Item_trigger_field(thd, - &$4, - new_row))) - MYSQL_YYABORT; - } - else - { - thd->parse_error(); + if (!($$= Lex->make_item_colon_ident_ident(thd, &$2, &$4))) MYSQL_YYABORT; - } } | '.' ident '.' ident { - if (!($$= Lex->create_item_ident(thd, &null_clex_str, &$2, &$4))) + Lex_ident_sys none; + if (!($$= Lex->create_item_ident(thd, &none, &$2, &$4))) MYSQL_YYABORT; } | ident '.' ident '.' ident @@ -14853,32 +14832,22 @@ table_ident_nodb: } ; -IDENT_sys: - IDENT { $$= $1; } +IDENT_cli: + IDENT + | IDENT_QUOTED + ; + +ident_cli: + IDENT | IDENT_QUOTED + | keyword { $$= $1; } + ; + +IDENT_sys: + IDENT_cli { - if (thd->charset_is_system_charset) - { - CHARSET_INFO *cs= system_charset_info; - size_t wlen= Well_formed_prefix(cs, $1.str, $1.length).length(); - if (wlen < $1.length) - { - ErrConvString err($1.str, $1.length, &my_charset_bin); - my_error(ER_INVALID_CHARACTER_STRING, MYF(0), - cs->csname, err.ptr()); - MYSQL_YYABORT; - } - $$= $1; - } - else - { - LEX_STRING to; - if (thd->convert_with_error(system_charset_info, &to, - thd->charset(), $1.str, $1.length)) - MYSQL_YYABORT; - $$.str= to.str; - $$.length= to.length; - } + if (thd->to_ident_sys_alloc(&$$, &$1)) + MYSQL_YYABORT; } ; @@ -14936,62 +14905,34 @@ TEXT_STRING_filesystem: ident: IDENT_sys - { - (LEX_CSTRING &)$$= $1; - $$.m_pos= (char *) YYLIP->get_tok_start_prev(); - } - | keyword - { - $$.str= thd->strmake($1.str, $1.length); - if ($$.str == NULL) - MYSQL_YYABORT; - $$.length= $1.length; - $$.m_pos= (char *) YYLIP->get_tok_start_prev(); - } - ; - -ident_with_tok_start: - IDENT_sys - { - (LEX_CSTRING &)$$= $1; - $$.m_pos= (char *) YYLIP->get_tok_start(); - } | keyword { - if (!($$.str= thd->strmake($1.str, $1.length))) + if ($$.copy_keyword(thd, &$1)) MYSQL_YYABORT; - $$.length= $1.length; - $$.m_pos= (char *) YYLIP->get_tok_start(); } ; ident_directly_assignable: - IDENT_sys { $$=$1; } + IDENT_sys | keyword_directly_assignable { - $$.str= thd->strmake($1.str, $1.length); - if ($$.str == NULL) + if ($$.copy_keyword(thd, &$1)) MYSQL_YYABORT; - $$.length= $1.length; } | keyword_sp { - $$.str= thd->strmake($1.str, $1.length); - if ($$.str == NULL) + if ($$.copy_keyword(thd, &$1)) MYSQL_YYABORT; - $$.length= $1.length; } ; label_ident: - IDENT_sys { $$=$1; } + IDENT_sys | keyword_sp { - $$.str= thd->strmake($1.str, $1.length); - if ($$.str == NULL) + if ($$.copy_keyword(thd, &$1)) MYSQL_YYABORT; - $$.length= $1.length; } ; @@ -15081,9 +15022,9 @@ user: user_maybe_role /* Keyword that we allow for identifiers (except SP labels) */ keyword: - keyword_sp {} - | keyword_directly_assignable {} - | keyword_directly_not_assignable {} + keyword_sp + | keyword_directly_assignable + | keyword_directly_not_assignable ; @@ -15092,57 +15033,59 @@ keyword: xxx := 10; */ keyword_directly_assignable: - ASCII_SYM {} - | BACKUP_SYM {} - | BINLOG_SYM {} - | BYTE_SYM {} - | CACHE_SYM {} - | CHECKSUM_SYM {} - | CHECKPOINT_SYM {} - | COLUMN_ADD_SYM {} - | COLUMN_CHECK_SYM {} - | COLUMN_CREATE_SYM {} - | COLUMN_DELETE_SYM {} - | COLUMN_GET_SYM {} - | DEALLOCATE_SYM {} - | EXAMINED_SYM {} - | EXCLUDE_SYM {} - | EXECUTE_SYM {} - | FLUSH_SYM {} - | FOLLOWING_SYM {} - | FORMAT_SYM {} - | GET_SYM {} - | HELP_SYM {} - | HOST_SYM {} - | INSTALL_SYM {} - | OPTION {} - | OPTIONS_SYM {} - | OWNER_SYM {} - | PARSER_SYM {} - | PORT_SYM {} - | PRECEDING_SYM {} - | PREPARE_SYM {} - | REMOVE_SYM {} - | RESET_SYM {} - | RESTORE_SYM {} - | SECURITY_SYM {} - | SERVER_SYM {} - | SIGNED_SYM {} - | SOCKET_SYM {} - | SLAVE {} - | SLAVES {} - | SONAME_SYM {} - | START_SYM {} - | STOP_SYM {} - | STORED_SYM {} - | TIES_SYM {} - | UNICODE_SYM {} - | UNINSTALL_SYM {} - | UNBOUNDED_SYM {} - | WITHIN {} - | WRAPPER_SYM {} - | XA_SYM {} - | UPGRADE_SYM {} + + + ASCII_SYM + | BACKUP_SYM + | BINLOG_SYM + | BYTE_SYM + | CACHE_SYM + | CHECKSUM_SYM + | CHECKPOINT_SYM + | COLUMN_ADD_SYM + | COLUMN_CHECK_SYM + | COLUMN_CREATE_SYM + | COLUMN_DELETE_SYM + | COLUMN_GET_SYM + | DEALLOCATE_SYM + | EXAMINED_SYM + | EXCLUDE_SYM + | EXECUTE_SYM + | FLUSH_SYM + | FOLLOWING_SYM + | FORMAT_SYM + | GET_SYM + | HELP_SYM + | HOST_SYM + | INSTALL_SYM + | OPTION + | OPTIONS_SYM + | OWNER_SYM + | PARSER_SYM + | PORT_SYM + | PRECEDING_SYM + | PREPARE_SYM + | REMOVE_SYM + | RESET_SYM + | RESTORE_SYM + | SECURITY_SYM + | SERVER_SYM + | SIGNED_SYM + | SOCKET_SYM + | SLAVE + | SLAVES + | SONAME_SYM + | START_SYM + | STOP_SYM + | STORED_SYM + | TIES_SYM + | UNICODE_SYM + | UNINSTALL_SYM + | UNBOUNDED_SYM + | WITHIN + | WRAPPER_SYM + | XA_SYM + | UPGRADE_SYM ; /* @@ -15182,13 +15125,13 @@ keyword_directly_assignable: CREATE TRIGGER .. FOR EACH ROW FOLLOWS tr1 a:= 10; */ keyword_directly_not_assignable: - CONTAINS_SYM { /* SP characteristic */ } - | LANGUAGE_SYM { /* SP characteristic */ } - | NO_SYM { /* SP characteristic */ } - | CHARSET { /* SET CHARSET utf8; */ } - | FOLLOWS_SYM { /* Conflicts with assignment in FOR EACH */} - | PRECEDES_SYM { /* Conflicts with assignment in FOR EACH */} - | keyword_sp_verb_clause { } + CONTAINS_SYM /* SP characteristic */ + | LANGUAGE_SYM /* SP characteristic */ + | NO_SYM /* SP characteristic */ + | CHARSET /* SET CHARSET utf8; */ + | FOLLOWS_SYM /* Conflicts with assignment in FOR EACH */ + | PRECEDES_SYM /* Conflicts with assignment in FOR EACH */ + | keyword_sp_verb_clause ; /* @@ -15200,7 +15143,7 @@ keyword_directly_not_assignable: keyword_sp: keyword_sp_data_type | keyword_sp_not_data_type - | FUNCTION_SYM { /* Oracle-PLSQL-R */} + | FUNCTION_SYM /* Oracle-PLSQL-R */ ; @@ -15212,19 +15155,19 @@ keyword_sp: xxx:=10 */ keyword_sp_verb_clause: - BEGIN_SYM { /* Compound. Reserved in Oracle */ } - | CLOSE_SYM { /* Verb clause. Reserved in Oracle */ } - | COMMIT_SYM { /* Verb clause. Reserved in Oracle */ } - | EXCEPTION_SYM { /* EXCEPTION section in SP blocks */ } - | DO_SYM { /* Verb clause */ } - | END { /* Compound. Reserved in Oracle */ } - | HANDLER_SYM { /* Verb clause */ } - | OPEN_SYM { /* Verb clause. Reserved in Oracle */ } - | REPAIR { /* Verb clause */ } - | ROLLBACK_SYM { /* Verb clause. Reserved in Oracle */ } - | SAVEPOINT_SYM { /* Verb clause. Reserved in Oracle */ } - | SHUTDOWN { /* Verb clause */ } - | TRUNCATE_SYM { /* Verb clause. Reserved in Oracle */ } + BEGIN_SYM /* Compound. Reserved in Oracle */ + | CLOSE_SYM /* Verb clause. Reserved in Oracle */ + | COMMIT_SYM /* Verb clause. Reserved in Oracle */ + | EXCEPTION_SYM /* EXCEPTION section in SP blocks */ + | DO_SYM /* Verb clause */ + | END /* Compound. Reserved in Oracle */ + | HANDLER_SYM /* Verb clause */ + | OPEN_SYM /* Verb clause. Reserved in Oracle */ + | REPAIR /* Verb clause */ + | ROLLBACK_SYM /* Verb clause. Reserved in Oracle */ + | SAVEPOINT_SYM /* Verb clause. Reserved in Oracle */ + | SHUTDOWN /* Verb clause */ + | TRUNCATE_SYM /* Verb clause. Reserved in Oracle */ ; @@ -15233,349 +15176,352 @@ keyword_sp_verb_clause: but not allowed as non-delimited SP variable names in sql_mode=ORACLE. */ keyword_sp_data_type: - BIT_SYM {} - | BOOLEAN_SYM {} /* PLSQL-R */ - | BOOL_SYM {} - | CLOB {} - | DATE_SYM {} /* Oracle-R, PLSQL-R */ - | DATETIME {} - | ENUM {} - | FIXED_SYM {} - | GEOMETRYCOLLECTION {} - | GEOMETRY_SYM {} - | JSON_SYM {} - | LINESTRING {} - | MEDIUM_SYM {} - | MULTILINESTRING {} - | MULTIPOINT {} - | MULTIPOLYGON {} - | NATIONAL_SYM {} - | NCHAR_SYM {} - | NUMBER_SYM {} /* Oracle-R, PLSQL-R */ - | NVARCHAR_SYM {} - | POINT_SYM {} - | POLYGON {} - | RAW {} /* Oracle-R */ - | ROW_SYM {} - | SERIAL_SYM {} - | TEXT_SYM {} - | TIMESTAMP {} - | TIME_SYM {} /* Oracle-R */ - | VARCHAR2 {} /* Oracle-R, PLSQL-R */ - | YEAR_SYM {} + BIT_SYM + | BOOLEAN_SYM /* PLSQL-R */ + | BOOL_SYM + | CLOB + | DATE_SYM /* Oracle-R, PLSQL-R */ + | DATETIME + | ENUM + | FIXED_SYM + | GEOMETRYCOLLECTION + | GEOMETRY_SYM + | JSON_SYM + | LINESTRING + | MEDIUM_SYM + | MULTILINESTRING + | MULTIPOINT + | MULTIPOLYGON + | NATIONAL_SYM + | NCHAR_SYM + | NUMBER_SYM /* Oracle-R, PLSQL-R */ + | NVARCHAR_SYM + | POINT_SYM + | POLYGON + | RAW /* Oracle-R */ + | ROW_SYM + | SERIAL_SYM + | TEXT_SYM + | TIMESTAMP + | TIME_SYM /* Oracle-R */ + | VARCHAR2 /* Oracle-R, PLSQL-R */ + | YEAR_SYM ; keyword_sp_not_data_type: - ACTION {} - | ADDDATE_SYM {} - | ADMIN_SYM {} - | AFTER_SYM {} - | AGAINST {} - | AGGREGATE_SYM {} - | ALGORITHM_SYM {} - | ALWAYS_SYM {} - | ANY_SYM {} - | AT_SYM {} - | ATOMIC_SYM {} - | AUTHORS_SYM {} - | AUTO_INC {} - | AUTOEXTEND_SIZE_SYM {} - | AUTO_SYM {} - | AVG_ROW_LENGTH {} - | AVG_SYM {} - | BLOCK_SYM {} - | BTREE_SYM {} - | CASCADED {} - | CATALOG_NAME_SYM {} - | CHAIN_SYM {} - | CHANGED {} - | CIPHER_SYM {} - | CLIENT_SYM {} - | CLASS_ORIGIN_SYM {} - | COALESCE {} - | CODE_SYM {} - | COLLATION_SYM {} - | COLUMN_NAME_SYM {} - | COLUMNS {} - | COMMITTED_SYM {} - | COMPACT_SYM {} - | COMPLETION_SYM {} - | COMPRESSED_SYM {} - | CONCURRENT {} - | CONNECTION_SYM {} - | CONSISTENT_SYM {} - | CONSTRAINT_CATALOG_SYM {} - | CONSTRAINT_SCHEMA_SYM {} - | CONSTRAINT_NAME_SYM {} - | CONTEXT_SYM {} - | CONTRIBUTORS_SYM {} - | CURRENT_POS_SYM {} - | CPU_SYM {} - | CUBE_SYM {} + ACTION + | ADDDATE_SYM + | ADMIN_SYM + | AFTER_SYM + | AGAINST + | AGGREGATE_SYM + | ALGORITHM_SYM + | ALWAYS_SYM + | ANY_SYM + | AT_SYM + | ATOMIC_SYM + | AUTHORS_SYM + | AUTO_INC + | AUTOEXTEND_SIZE_SYM + | AUTO_SYM + | AVG_ROW_LENGTH + | AVG_SYM + | BLOCK_SYM + | BTREE_SYM + | CASCADED + | CATALOG_NAME_SYM + | CHAIN_SYM + | CHANGED + | CIPHER_SYM + | CLIENT_SYM + | CLASS_ORIGIN_SYM + | COALESCE + | CODE_SYM + | COLLATION_SYM + | COLUMN_NAME_SYM + | COLUMNS + | COMMITTED_SYM + | COMPACT_SYM + | COMPLETION_SYM + | COMPRESSED_SYM + | CONCURRENT + | CONNECTION_SYM + | CONSISTENT_SYM + | CONSTRAINT_CATALOG_SYM + | CONSTRAINT_SCHEMA_SYM + | CONSTRAINT_NAME_SYM + | CONTEXT_SYM + | CONTRIBUTORS_SYM + | CURRENT_POS_SYM + | CPU_SYM + | CUBE_SYM /* Although a reserved keyword in SQL:2003 (and :2008), not reserved in MySQL per WL#2111 specification. */ - | CURRENT_SYM {} - | CURSOR_NAME_SYM {} - | CYCLE_SYM {} - | DATA_SYM {} - | DATAFILE_SYM {} - | DATE_FORMAT_SYM {} - | DAY_SYM {} - | DECODE_SYM {} - | DEFINER_SYM {} - | DELAY_KEY_WRITE_SYM {} - | DES_KEY_FILE {} - | DIAGNOSTICS_SYM {} - | DIRECTORY_SYM {} - | DISABLE_SYM {} - | DISCARD {} - | DISK_SYM {} - | DUMPFILE {} - | DUPLICATE_SYM {} - | DYNAMIC_SYM {} - | ENDS_SYM {} - | ENGINE_SYM {} - | ENGINES_SYM {} - | ERROR_SYM {} - | ERRORS {} - | ESCAPE_SYM {} - | EVENT_SYM {} - | EVENTS_SYM {} - | EVERY_SYM {} - | EXCHANGE_SYM {} - | EXPANSION_SYM {} - | EXPORT_SYM {} - | EXTENDED_SYM {} - | EXTENT_SIZE_SYM {} - | FAULTS_SYM {} - | FAST_SYM {} - | FOUND_SYM {} - | ENABLE_SYM {} - | FULL {} - | FILE_SYM {} - | FIRST_SYM {} - | GENERAL {} - | GENERATED_SYM {} - | GET_FORMAT {} - | GRANTS {} - | GLOBAL_SYM {} - | HASH_SYM {} - | HARD_SYM {} - | INVISIBLE_SYM {} - | HOSTS_SYM {} - | HOUR_SYM {} - | ID_SYM {} - | IDENTIFIED_SYM {} - | IGNORE_SERVER_IDS_SYM {} - | INCREMENT_SYM {} - | IMMEDIATE_SYM {} /* SQL-2003-R */ - | INVOKER_SYM {} - | IMPORT {} - | INDEXES {} - | INITIAL_SIZE_SYM {} - | IO_SYM {} - | IPC_SYM {} - | ISOLATION {} - | ISOPEN_SYM {} - | ISSUER_SYM {} - | INSERT_METHOD {} - | KEY_BLOCK_SIZE {} - | LAST_VALUE {} - | LAST_SYM {} - | LASTVAL_SYM {} - | LEAVES {} - | LESS_SYM {} - | LEVEL_SYM {} - | LIST_SYM {} - | LOCAL_SYM {} - | LOCKS_SYM {} - | LOGFILE_SYM {} - | LOGS_SYM {} - | MAX_ROWS {} - | MASTER_SYM {} - | MASTER_HEARTBEAT_PERIOD_SYM {} - | MASTER_GTID_POS_SYM {} - | MASTER_HOST_SYM {} - | MASTER_PORT_SYM {} - | MASTER_LOG_FILE_SYM {} - | MASTER_LOG_POS_SYM {} - | MASTER_USER_SYM {} - | MASTER_USE_GTID_SYM {} - | MASTER_PASSWORD_SYM {} - | MASTER_SERVER_ID_SYM {} - | MASTER_CONNECT_RETRY_SYM {} - | MASTER_DELAY_SYM {} - | MASTER_SSL_SYM {} - | MASTER_SSL_CA_SYM {} - | MASTER_SSL_CAPATH_SYM {} - | MASTER_SSL_CERT_SYM {} - | MASTER_SSL_CIPHER_SYM {} - | MASTER_SSL_CRL_SYM {} - | MASTER_SSL_CRLPATH_SYM {} - | MASTER_SSL_KEY_SYM {} - | MAX_CONNECTIONS_PER_HOUR {} - | MAX_QUERIES_PER_HOUR {} - | MAX_SIZE_SYM {} - | MAX_STATEMENT_TIME_SYM {} - | MAX_UPDATES_PER_HOUR {} - | MAX_USER_CONNECTIONS_SYM {} - | MEMORY_SYM {} - | MERGE_SYM {} - | MESSAGE_TEXT_SYM {} - | MICROSECOND_SYM {} - | MIGRATE_SYM {} - | MINUTE_SYM {} - | MINVALUE_SYM {} - | MIN_ROWS {} - | MODIFY_SYM {} - | MODE_SYM {} - | MONTH_SYM {} - | MUTEX_SYM {} - | MYSQL_SYM {} - | MYSQL_ERRNO_SYM {} - | NAME_SYM {} - | NAMES_SYM {} - | NEXT_SYM {} - | NEXTVAL_SYM {} - | NEW_SYM {} - | NOCACHE_SYM {} - | NOCYCLE_SYM {} - | NOMINVALUE_SYM {} - | NOMAXVALUE_SYM {} - | NO_WAIT_SYM {} - | NOWAIT_SYM {} - | NODEGROUP_SYM {} - | NONE_SYM {} - | NOTFOUND_SYM {} - | OF_SYM {} /* SQL-1999-R, Oracle-R */ - | OFFSET_SYM {} - | OLD_PASSWORD_SYM {} - | ONE_SYM {} - | ONLINE_SYM {} - | ONLY_SYM {} - | PACK_KEYS_SYM {} - | PAGE_SYM {} - | PARTIAL {} - | PARTITIONING_SYM {} - | PARTITIONS_SYM {} - | PASSWORD_SYM {} - | PERSISTENT_SYM {} - | PHASE_SYM {} - | PLUGIN_SYM {} - | PLUGINS_SYM {} - | PRESERVE_SYM {} - | PREV_SYM {} - | PREVIOUS_SYM {} - | PRIVILEGES {} - | PROCESS {} - | PROCESSLIST_SYM {} - | PROFILE_SYM {} - | PROFILES_SYM {} - | PROXY_SYM {} - | QUARTER_SYM {} - | QUERY_SYM {} - | QUICK {} - | READ_ONLY_SYM {} - | REBUILD_SYM {} - | RECOVER_SYM {} - | REDO_BUFFER_SIZE_SYM {} - | REDOFILE_SYM {} - | REDUNDANT_SYM {} - | RELAY {} - | RELAYLOG_SYM {} - | RELAY_LOG_FILE_SYM {} - | RELAY_LOG_POS_SYM {} - | RELAY_THREAD {} - | RELOAD {} - | REORGANIZE_SYM {} - | REPEATABLE_SYM {} - | REPLICATION {} - | RESOURCES {} - | RESTART_SYM {} - | RESUME_SYM {} - | RETURNED_SQLSTATE_SYM {} - | RETURNS_SYM {} - | REUSE_SYM {} - | REVERSE_SYM {} - | ROLE_SYM {} - | ROLLUP_SYM {} - | ROUTINE_SYM {} - | ROWCOUNT_SYM {} - | ROW_COUNT_SYM {} - | ROW_FORMAT_SYM {} - | RTREE_SYM {} - | SCHEDULE_SYM {} - | SCHEMA_NAME_SYM {} - | SECOND_SYM {} - | SEQUENCE_SYM {} - | SERIALIZABLE_SYM {} - | SESSION_SYM {} - | SETVAL_SYM {} - | SIMPLE_SYM {} - | SHARE_SYM {} - | SLAVE_POS_SYM {} - | SLOW {} - | SNAPSHOT_SYM {} - | SOFT_SYM {} - | SOUNDS_SYM {} - | SOURCE_SYM {} - | SQL_CACHE_SYM {} - | SQL_BUFFER_RESULT {} - | SQL_NO_CACHE_SYM {} - | SQL_THREAD {} - | STARTS_SYM {} - | STATEMENT_SYM {} - | STATUS_SYM {} - | STORAGE_SYM {} - | STRING_SYM {} - | SUBCLASS_ORIGIN_SYM {} - | SUBDATE_SYM {} - | SUBJECT_SYM {} - | SUBPARTITION_SYM {} - | SUBPARTITIONS_SYM {} - | SUPER_SYM {} - | SUSPEND_SYM {} - | SWAPS_SYM {} - | SWITCHES_SYM {} - | TABLE_NAME_SYM {} - | TABLES {} - | TABLE_CHECKSUM_SYM {} - | TABLESPACE {} - | TEMPORARY {} - | TEMPTABLE_SYM {} - | THAN_SYM {} - | TRANSACTION_SYM {} - | TRANSACTIONAL_SYM {} - | TRIGGERS_SYM {} - | TRIM_ORACLE {} - | TIMESTAMP_ADD {} - | TIMESTAMP_DIFF {} - | TYPES_SYM {} - | TYPE_SYM {} - | UDF_RETURNS_SYM {} - | UNCOMMITTED_SYM {} - | UNDEFINED_SYM {} - | UNDO_BUFFER_SIZE_SYM {} - | UNDOFILE_SYM {} - | UNKNOWN_SYM {} - | UNTIL_SYM {} - | USER_SYM {} - | USE_FRM {} - | VARIABLES {} - | VIEW_SYM {} - | VIRTUAL_SYM {} - | VALUE_SYM {} - | WARNINGS {} - | WAIT_SYM {} - | WEEK_SYM {} - | WEIGHT_STRING_SYM {} - | WORK_SYM {} - | X509_SYM {} - | XML_SYM {} - | VIA_SYM {} + | CURRENT_SYM + | CURSOR_NAME_SYM + | CYCLE_SYM + | DATA_SYM + | DATAFILE_SYM + | DATE_FORMAT_SYM + | DAY_SYM + | DECODE_SYM + | DEFINER_SYM + | DELAY_KEY_WRITE_SYM + | DES_KEY_FILE + | DIAGNOSTICS_SYM + | DIRECTORY_SYM + | DISABLE_SYM + | DISCARD + | DISK_SYM + | DUMPFILE + | DUPLICATE_SYM + | DYNAMIC_SYM + | ENDS_SYM + | ENGINE_SYM + | ENGINES_SYM + | ERROR_SYM + | ERRORS + | ESCAPE_SYM + | EVENT_SYM + | EVENTS_SYM + | EVERY_SYM + + | EXCHANGE_SYM + | EXPANSION_SYM + | EXPORT_SYM + | EXTENDED_SYM + | EXTENT_SIZE_SYM + | FAULTS_SYM + | FAST_SYM + | FOUND_SYM + | ENABLE_SYM + | FULL + | FILE_SYM + | FIRST_SYM + | GENERAL + | GENERATED_SYM + | GET_FORMAT + | GRANTS + | GLOBAL_SYM + | HASH_SYM + | HARD_SYM + | HOSTS_SYM + | HOUR_SYM + | ID_SYM + | IDENTIFIED_SYM + | IGNORE_SERVER_IDS_SYM + | INCREMENT_SYM + | IMMEDIATE_SYM /* SQL-2003-R */ + | INVOKER_SYM + | IMPORT + | INDEXES + | INITIAL_SIZE_SYM + | IO_SYM + | IPC_SYM + | ISOLATION + | ISOPEN_SYM + | ISSUER_SYM + | INSERT_METHOD + | INVISIBLE_SYM + | KEY_BLOCK_SIZE + | LAST_VALUE + | LAST_SYM + | LASTVAL_SYM + | LEAVES + | LESS_SYM + | LEVEL_SYM + | LIST_SYM + | LOCAL_SYM + | LOCKS_SYM + | LOGFILE_SYM + | LOGS_SYM + | MAX_ROWS + | MASTER_SYM + | MASTER_HEARTBEAT_PERIOD_SYM + | MASTER_GTID_POS_SYM + | MASTER_HOST_SYM + | MASTER_PORT_SYM + | MASTER_LOG_FILE_SYM + | MASTER_LOG_POS_SYM + | MASTER_USER_SYM + | MASTER_USE_GTID_SYM + | MASTER_PASSWORD_SYM + | MASTER_SERVER_ID_SYM + | MASTER_CONNECT_RETRY_SYM + | MASTER_DELAY_SYM + | MASTER_SSL_SYM + | MASTER_SSL_CA_SYM + | MASTER_SSL_CAPATH_SYM + | MASTER_SSL_CERT_SYM + | MASTER_SSL_CIPHER_SYM + | MASTER_SSL_CRL_SYM + | MASTER_SSL_CRLPATH_SYM + | MASTER_SSL_KEY_SYM + | MAX_CONNECTIONS_PER_HOUR + | MAX_QUERIES_PER_HOUR + | MAX_SIZE_SYM + | MAX_STATEMENT_TIME_SYM + | MAX_UPDATES_PER_HOUR + | MAX_USER_CONNECTIONS_SYM + | MEMORY_SYM + | MERGE_SYM + | MESSAGE_TEXT_SYM + | MICROSECOND_SYM + | MIGRATE_SYM + | MINUTE_SYM + | MINVALUE_SYM + | MIN_ROWS + | MODIFY_SYM + | MODE_SYM + | MONTH_SYM + | MUTEX_SYM + | MYSQL_SYM + | MYSQL_ERRNO_SYM + | NAME_SYM + | NAMES_SYM + | NEXT_SYM + | NEXTVAL_SYM + | NEW_SYM + | NOCACHE_SYM + | NOCYCLE_SYM + | NOMINVALUE_SYM + | NOMAXVALUE_SYM + | NO_WAIT_SYM + | NOWAIT_SYM + | NODEGROUP_SYM + | NONE_SYM + | NOTFOUND_SYM + | OF_SYM /* SQL-1999-R, Oracle-R */ + | OFFSET_SYM + | OLD_PASSWORD_SYM + | ONE_SYM + | ONLINE_SYM + | ONLY_SYM + + | PACK_KEYS_SYM + | PAGE_SYM + | PARTIAL + | PARTITIONING_SYM + | PARTITIONS_SYM + | PASSWORD_SYM + | PERSISTENT_SYM + | PHASE_SYM + | PLUGIN_SYM + | PLUGINS_SYM + | PRESERVE_SYM + | PREV_SYM + | PREVIOUS_SYM + | PRIVILEGES + | PROCESS + | PROCESSLIST_SYM + | PROFILE_SYM + | PROFILES_SYM + | PROXY_SYM + | QUARTER_SYM + | QUERY_SYM + | QUICK + + | READ_ONLY_SYM + | REBUILD_SYM + | RECOVER_SYM + | REDO_BUFFER_SIZE_SYM + | REDOFILE_SYM + | REDUNDANT_SYM + | RELAY + | RELAYLOG_SYM + | RELAY_LOG_FILE_SYM + | RELAY_LOG_POS_SYM + | RELAY_THREAD + | RELOAD + | REORGANIZE_SYM + | REPEATABLE_SYM + | REPLICATION + | RESOURCES + | RESTART_SYM + | RESUME_SYM + | RETURNED_SQLSTATE_SYM + | RETURNS_SYM + | REUSE_SYM /* Oracle-R */ + | REVERSE_SYM + | ROLE_SYM + | ROLLUP_SYM + | ROUTINE_SYM + | ROWCOUNT_SYM + | ROW_COUNT_SYM + | ROW_FORMAT_SYM + | RTREE_SYM + | SCHEDULE_SYM + | SCHEMA_NAME_SYM + | SECOND_SYM + | SEQUENCE_SYM + | SERIALIZABLE_SYM + | SESSION_SYM + | SETVAL_SYM + | SIMPLE_SYM + | SHARE_SYM + | SLAVE_POS_SYM + | SLOW + | SNAPSHOT_SYM + | SOFT_SYM + | SOUNDS_SYM + | SOURCE_SYM + | SQL_CACHE_SYM + | SQL_BUFFER_RESULT + | SQL_NO_CACHE_SYM + | SQL_THREAD + | STARTS_SYM + | STATEMENT_SYM + | STATUS_SYM + | STORAGE_SYM + | STRING_SYM + | SUBCLASS_ORIGIN_SYM + | SUBDATE_SYM + | SUBJECT_SYM + | SUBPARTITION_SYM + | SUBPARTITIONS_SYM + | SUPER_SYM + | SUSPEND_SYM + | SWAPS_SYM + | SWITCHES_SYM + | TABLE_NAME_SYM + | TABLES + | TABLE_CHECKSUM_SYM + | TABLESPACE + | TEMPORARY + | TEMPTABLE_SYM + | THAN_SYM + | TRANSACTION_SYM + | TRANSACTIONAL_SYM + | TRIGGERS_SYM + | TRIM_ORACLE + | TIMESTAMP_ADD + | TIMESTAMP_DIFF + | TYPES_SYM + | TYPE_SYM + | UDF_RETURNS_SYM + | UNCOMMITTED_SYM + | UNDEFINED_SYM + | UNDO_BUFFER_SIZE_SYM + | UNDOFILE_SYM + | UNKNOWN_SYM + | UNTIL_SYM + | USER_SYM + | USE_FRM + | VARIABLES + | VIEW_SYM + | VIRTUAL_SYM + | VALUE_SYM + | WARNINGS + | WAIT_SYM + | WEEK_SYM + | WEIGHT_STRING_SYM + | WORK_SYM + | X509_SYM + | XML_SYM + | VIA_SYM ; /* @@ -16986,7 +16932,7 @@ query_expression_option: STRAIGHT_JOIN { Select->options|= SELECT_STRAIGHT_JOIN; } | HIGH_PRIORITY { - if (check_simple_select()) + if (Lex->check_simple_select(&$1)) MYSQL_YYABORT; YYPS->m_lock_type= TL_READ_HIGH_PRIORITY; YYPS->m_mdl_type= MDL_SHARED_READ; @@ -16998,13 +16944,13 @@ query_expression_option: | SQL_BIG_RESULT { Select->options|= SELECT_BIG_RESULT; } | SQL_BUFFER_RESULT { - if (check_simple_select()) + if (Lex->check_simple_select(&$1)) MYSQL_YYABORT; Select->options|= OPTION_BUFFER_RESULT; } | SQL_CALC_FOUND_ROWS { - if (check_simple_select()) + if (Lex->check_simple_select(&$1)) MYSQL_YYABORT; Select->options|= OPTION_FOUND_ROWS; } diff --git a/sql/structs.h b/sql/structs.h index 01d99517fed..d530dd73b7c 100644 --- a/sql/structs.h +++ b/sql/structs.h @@ -754,12 +754,6 @@ public: }; -struct Lex_string_with_pos_st: public LEX_CSTRING -{ - const char *m_pos; -}; - - class Load_data_param { protected: |