summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Barkov <bar@mariadb.com>2018-04-27 22:11:18 +0400
committerAlexander Barkov <bar@mariadb.com>2018-04-27 22:11:18 +0400
commit96a301bbbe5713fc0f1a79a80e29d7733e9e5966 (patch)
treeb1cf39b9686392d6e227bae2d0fbe37966bf4b46
parent6c5e60f1b198ff846ee5595927ff5a74c6b08e91 (diff)
downloadmariadb-git-96a301bbbe5713fc0f1a79a80e29d7733e9e5966.tar.gz
MDEV-16020 SP variables inside GROUP BY..WITH ROLLUP break replication
The code passing positions in the query to constructors of Rewritable_query_parameter descendants (e.g. Item_splocal) was not reliable. It used various Lex_input_stream methods: - get_tok_start() - get_tok_start_prev() - get_tok_end() - get_ptr() to find positions of the recently scanned tokens. The challenge was mostly to choose between get_tok_start() and get_tok_start_prev(), taking into account to the current grammar (depending if lookahead takes place before or after we read the positions in every particular rule). But this approach did not work at all in combination with token contractions, when MYSQLlex() translates two tokens into one token ID, for example: WITH ROLLUP -> WITH_ROLLUP_SYM As a result, the tokenizer is already one more token ahead. So in query fragment: "GROUP BY d, spvar WITH ROLLUP" get_tok_start() points to "ROLLUP". get_tok_start_prev() points to "WITH". As a result, it was "WITH" who was erroneously replaced to NAME_CONST() instead of "spvar". This patch modifies the code to do it a different way. Changes: 1. For keywords and identifiers, the tokenizer now returns LEX_CTRING pointing directly to the query fragment. So query positions are now just available using: - $1.str - for the beginning of a token - $1.str+$1.length - for the end of a token 2. Identifiers are not allocated on the THD memory root in the tokenizer any more. Allocation is now done on later stages, in methods like LEX::create_item_ident(). 3. Two LEX_CSTRING based structures were added: - Lex_ident_cli_st - used to store the "client side" identifier representation, pointing to the query fragment. Note, these identifiers are encoded in @@character_set_client and can have broken byte sequences. - Lex_ident_sys_st - used to store the "server side" identifier representation, pointing to the THD allocated memory. This representation guarantees that the identifier was checked for being well-formed, and is encoded in utf8. 4. To distinguish between two identifier types in the grammar, two Bison types were added: <ident_cli> and <ident_sys> 5. All non-reserved keywords were marked as being of the type <ident_cli>. All reserved keywords are still of the type NONE. 6. All curly brackets in rules collecting non-reserved keywords into non-terminal symbols were removed, e.g.: Was: keyword_sp_data_type: BIT_SYM {} | BOOLEAN_SYM {} Now: keyword_sp_data_type: BIT_SYM | BOOLEAN_SYM This is important NOT to have brackets here!!!! This is needed to make sure that the underlying Lex_ident_cli_ststructure correctly passes up to the calling rule. 6. The code to scan identifiers and keywords was moved from lex_one_token() into new Lex_input_stream methods: scan_ident_sysvar() scan_ident_start() scan_ident_middle() scan_ident_delimited() This was done to: - get rid of enormous amount of references to &yylval->lex_str - and remove a lot of references like lip->xxx 7. The allocating functionality which puts identifiers on the THD memory root now resides in methods of Lex_ident_sys_st, and in THD::to_ident_sys_alloc(). get_quoted_token() was removed. 8. Cleanup: check_simple_select() was moved as a method to LEX. 9. Cleanup: Some more functionality was moved from *.yy to new methods were added to LEX: make_item_colon_ident_ident() make_item_func_call_generic() create_item_qualified_asterisk()
-rw-r--r--mysql-test/suite/binlog/r/binlog_stm_sp.result88
-rw-r--r--mysql-test/suite/binlog/t/binlog_stm_sp.test41
-rw-r--r--mysql-test/suite/compat/oracle/r/binlog_stm_sp.result33
-rw-r--r--mysql-test/suite/compat/oracle/t/binlog_stm_sp.test23
-rw-r--r--sql/sql_class.cc33
-rw-r--r--sql/sql_class.h34
-rw-r--r--sql/sql_lex.cc706
-rw-r--r--sql/sql_lex.h211
-rw-r--r--sql/sql_parse.cc26
-rw-r--r--sql/sql_parse.h1
-rw-r--r--sql/sql_yacc.yy2017
-rw-r--r--sql/sql_yacc_ora.yy2028
-rw-r--r--sql/structs.h6
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: