[MDEV-19996] Bison grammar: turn singe-character operators into <kwd> Created: 2019-07-09  Updated: 2019-07-10  Resolved: 2019-07-10

Status: Closed
Project: MariaDB Server
Component/s: Parser
Fix Version/s: 10.4.7

Type: Task Priority: Major
Reporter: Alexander Barkov Assignee: Alexander Barkov
Resolution: Fixed Votes: 0
Labels: None

Issue Links:
Blocks
blocks MDEV-19956 Queries with subqueries containing UN... Closed

 Description   

The rule remember_tok_start in the bison grammar may cause shift/reduce conflicts.
In order to fix MDEV-19956 easier, lets get rid of remember_tok_start gradually.

As the first step let's change the token type for the following single-character operators from <NONE> to <kwd>.

%type <kwd>
        '-' '+' '*' '/' '%' '(' ')'
        ',' '!' '{' '}' '&' '|'

and replace remember_tok_start to token positions in with_list_element (to prove the conceipt), as follows:

@@ -15262,16 +15262,16 @@ with_list_element:
               MYSQL_YYABORT;
             Lex->with_column_list.empty();
           }
-          AS '(' remember_tok_start query_expression remember_tok_end ')'
+          AS '(' query_expression ')'
          {
             LEX *lex= thd->lex;
             const char *query_start= lex->sphead ? lex->sphead->m_tmp_query
                                                  : thd->query();
-            char *spec_start= $6 + 1;
-            With_element *elem= new With_element($1, *$2, $7);
+            const char *spec_start= $5.pos() + 1;
+            With_element *elem= new With_element($1, *$2, $6);
            if (elem == NULL || Lex->curr_with_clause->add_with_element(elem))
              MYSQL_YYABORT;
-            if (elem->set_unparsed_spec(thd, spec_start, $8,
+            if (elem->set_unparsed_spec(thd, spec_start, $7.pos(),
                                         spec_start - query_start))
               MYSQL_YYABORT;
          }

Lex_input_stream::lex_one_token() will be changed to assign positions to the mentioned tokens, like this:

--- a/sql/sql_lex.cc
+++ b/sql/sql_lex.cc
@@ -1510,6 +1510,7 @@ int Lex_input_stream::lex_one_token(YYSTYPE *yylval, THD *thd)
     case MY_LEX_SKIP:                          // This should not happen
       if (c != ')')
         next_state= MY_LEX_START;         // Allow signed numbers
+      yylval->kwd.set_keyword(m_tok_start, 1);
       return((int) c);
 
     case MY_LEX_MINUS_OR_COMMENT:

Note, this change will not immediately resolve any conflicts.

Conflicts should be resolved in a separate patch by effectively replacing remember_tok_start to token positions in these grammar rules:

parenthesized_expr:
          remember_tok_start
          query_expression
          {
            if (!($$= Lex->create_item_query_expression(thd, $1, $2)))
              MYSQL_YYABORT;
          }

subselect:
          remember_tok_start
          query_expression
          {
            if (!($$= Lex->parsed_subselect($2, $1)))
              YYABORT;
          }
        ;


Generated at Thu Feb 08 08:55:57 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.