An error occurred fetching the project authors.
  1. 18 May, 2022 1 commit
  2. 25 Apr, 2022 1 commit
    • Sergei Golubchik's avatar
      MDEV-6899 extra semicolon in show create event syntax · 3988dfff
      Sergei Golubchik authored
      to detect the end of SP definition correctly we need to know where
      the parser stopped parsing the SP. lip->get_cpp_ptr() shows the
      current parsing position, lip->get_cpp_tok_start() shows the start of
      the last parsed token. The actual value depends on whether
      the parser has performed a look-ahead. For example, in
      
        CREATE PROCEDURE ... BEGIN ... END ;
      
      the parser reads 'END' and knows that this ends the procedure definition,
      it does not need to read the next token for this. But in
      
        CREATE PROCEDURE ... SELECT 1 ;
      
      the parser cannot know that the procedure ends at '1'. It has to read
      the semicolon first (it could be '1 + 2' for example).
      
      In the first case, the "current parsing position" is after END, before
      the semicolon, in the second case it's *after* the semicolon. Note that
      SP definition in both cases ends before the semicolon.
      
      To be able to detect the end of SP deterministically, we need the parser
      to do the look-ahead always or never.
      
      The bug fix introduces a new parser token FORCE_LOOKAHEAD. Lexer never
      returns it, so this token can never match. But the parser cannot know
      it so it will have to perform a look-ahead to determine that the next
      token is not FORCE_LOOKAHEAD. This way we deterministically end
      SP parsing with a look-ahead.
      3988dfff
  3. 24 Nov, 2021 1 commit
    • Marc Olivier Bergeron's avatar
      MDEV-27066: Fixed scientific notation parsing bug · 749d8ded
      Marc Olivier Bergeron authored
      The bug occurs where the float token containing a dot with an 'e'
      notation was dropped from the request completely.
      
      This causes a manner of invalid SQL statements like:
      
      select id 1.e, char 10.e(id 2.e), concat 3.e('a'12356.e,'b'1.e,'c'1.1234e)1.e, 12 1.e*2 1.e, 12 1.e/2 1.e, 12 1.e|2 1.e, 12 1.e^2 1.e, 12 1.e%2 1.e, 12 1.e&2 from test;
      
      To be parsed correctly as if it was:
      
      select id, char(id), concat('a','b','c'), 12*2, 12/2, 12|2, 12^2, 12%2, 12&2 from test.test;
      
      This correct parsing occurs when e is followed by any of:
      
      ( ) . , | & % * ^ /
      749d8ded
  4. 23 Oct, 2020 1 commit
    • Sergei Golubchik's avatar
      precedence bugfixing · 05a878c1
      Sergei Golubchik authored
      fix printing precedence for BETWEEN, LIKE/ESCAPE, REGEXP, IN
      don't use precedence for printing CASE/WHEN/THEN/ELSE/END
      
      fix parsing precedence of BETWEEN, LIKE/ESCAPE, REGEXP, IN
      support predicate arguments for IN, BETWEEN, SOUNDS LIKE, LIKE/ESCAPE,
      REGEXP
      
      use %nonassoc for unary operators
      
      fix parsing of IS TRUE/FALSE/UNKNOWN/NULL
      
      remove parser_precedence test as superseded by the precedence test
      05a878c1
  5. 09 Jul, 2020 1 commit
  6. 27 Mar, 2018 1 commit
  7. 14 Feb, 2017 1 commit
    • Vicențiu Ciorbaru's avatar
      MDEV-10122: MariaDB does not support group functions in some contexts where MySQL does · f675eab7
      Vicențiu Ciorbaru authored
      The problematic queries involve unions. For unions we have an
      optimization where we skip the ORDER BY clause in a query from one side
      of the union if it will be performed later due to UNION.
      EX:
      (SELECT a from t1 ORDER BY a) ORDER BY b;
      The first ordering by a is not necessary and it gets removed.
      
      The problem is that we still need to resolve the Items before removing the
      ORDER BY list from the
      SELECT_LEX structure. During this final resolve step however, we forgot to
      allow SET functions within the ORDER BY clause. This caused us to return
      an "Invalid use of group function" error during the checking performed
      by fix_fields in Item_sum::init_sum_func_check.
      f675eab7
  8. 13 Feb, 2017 1 commit
  9. 28 Nov, 2016 1 commit
  10. 13 Sep, 2016 1 commit
    • Alexander Barkov's avatar
      MDEV-10779 Failing assertion lex->proc_list.elements == 0 or syntax error on... · a0db19be
      Alexander Barkov authored
      MDEV-10779 Failing assertion lex->proc_list.elements == 0 or syntax error on PROCEDURE ANALYSE in UNION
      
      Reverting a part of the patch for "MDEV-8909union parser cleanup",
      as a parenthesized SELECT with PROCEDURE followed by UNION is not
      disallowed by the grammar (only a non-parenthesized SELECT with PROCEDURE
      followed by a UNION is disallowed grammatically).
      a0db19be
  11. 14 Jun, 2016 1 commit
  12. 01 Jun, 2016 1 commit
  13. 25 May, 2016 1 commit
  14. 24 May, 2016 2 commits
  15. 23 May, 2016 1 commit
  16. 21 May, 2016 1 commit
  17. 20 May, 2016 1 commit
    • Alexander Barkov's avatar
      MDEV-10080 Derived tables allow double LIMIT clause · f6a7c1c7
      Alexander Barkov authored
      1. Moving the "| get_select_lex_derived select_derived_init" part of
      select_derived into a separate new rule derived_query_specification.
      2. Using derived_query_specification directly in select_derived_union
      rather than in select_derived.
      3. Moving the sequence "opt_order_clause opt_limit_clause opt_select_lock_type"
      from select_derived2 to select_derived_union,
      after derived_query_specification.
      
      Effectively, the parser now does not go through the sequence
      "opt_order_clause opt_limit_clause ... opt_union_order_or_limit" any more.
      
      This fixes the problem with double LIMIT clause and removes 2 shift/reduce
      conflicts.
      f6a7c1c7
  18. 10 May, 2016 1 commit
  19. 08 May, 2016 1 commit
  20. 06 May, 2016 1 commit
    • Alexander Barkov's avatar
      MDEV-10030 sql_yacc.yy: Split table_expression and remove PROCEDURE from... · c0a59b46
      Alexander Barkov authored
      MDEV-10030 sql_yacc.yy: Split table_expression and remove PROCEDURE from create_select, select_paren_derived, select_derived2, query_specification
      
      This change refactors the "table_expression" rule in sql_yacc.yy.
      
      Queries with subselects and derived tables, as well as "CREATE TABLE ... SELECT"
      now return syntax error instead of "Incorrect usage of PROCEDURE and ...".
      c0a59b46
  21. 06 Oct, 2015 1 commit
  22. 29 Jun, 2015 1 commit
    • Sergey Vojtovich's avatar
      MDEV-7792 - SQL Parsing Error - UNION AND ORDER BY WITH JOIN · 0865e3de
      Sergey Vojtovich authored
      ORDER BY against union may confuse name resolution context, causing valid
      SQL statements to fail.
      
      The purpose of context change was presumably intended for the duration of
      gathering field list for ORDER BY. However it isn't actually required (name
      resolution context is never accessed by the latter).
      
      See also alternative solution (in MySQL 5.7): 92145b95.
      0865e3de
  23. 12 Feb, 2014 2 commits
    • Neeraj Bisht's avatar
      Bug#17075846 - UNQUOTED FILE NAMES FOR VARIABLE VALUES ARE · e13b28af
      Neeraj Bisht authored
      	       ACCEPTED BUT PARSED INCORRECTLY
      
      When we are setting the value in a system variable, 
      We can set it like 
      
      set sys_var="Iden1.Iden2";		//1
      set sys_var='Iden1.Iden2';		//2
      set sys_var=Iden1.Iden2;		//3
      set sys_var=.ident1.ident2; 		//4
      set sys_var=`Iden1.Iden2`;		//5
      
      
      While parsing, for case 1(when ANSI_QUOTES is enable) and 2,
      we will take as string literal(we will make item of type Item_string).
      for case 3 & 4, taken as Item_field, where Iden1 is a table name and
      iden2 is a field name.
      for case 5, again Item_field type, where iden1.iden2 is taken as
      field name.
      
      
      Now in case 1, when we are assigning some value to system variable
      (which can take string or enumerate type data), we are setting only 
      field part.
      This means only iden2 value will be set for system variable. This 
      result in wrong result.
      
      Solution:
      
      (for string type) We need to Document that we are not allowed to set 
      system variable which takes string as identifier, otherwise result 
      in unexpected behaviour.
      
      (for enumerate type)
      if we pass iden1.iden2, we will give an error ER_WRONG_TYPE_FOR_VAR
      (Incorrect argument type to variable).
      
      mysql-test/suite/sys_vars/t/general_log_file_basic.test:
        Earlier we used to give ER_WRONG_VALUE_FOR_VAR error, but in the patch of
        (Bug32748-Inconsistent handling of assignments to general_log_file/slow_query_log_file)
        they quoted this line.But i am not able to find any relation of this with the changes of
        patch. So i think We should give error in this case.
      mysql-test/suite/sys_vars/t/slow_query_log_file_basic.test:
        Earlier we used to give ER_WRONG_VALUE_FOR_VAR error, but in the patch of
        (Bug32748-Inconsistent handling of assignments to general_log_file/slow_query_log_file)
        they quoted this line.But i am not able to find any relation of this with the changes of
        patch. So i think We should give error in this case.
      e13b28af
    • Neeraj Bisht's avatar
      Bug#17075846 - UNQUOTED FILE NAMES FOR VARIABLE VALUES ARE · a3123b84
      Neeraj Bisht authored
      	       ACCEPTED BUT PARSED INCORRECTLY
      
      When we are setting the value in a system variable, 
      We can set it like 
      
      set sys_var="Iden1.Iden2";		//1
      set sys_var='Iden1.Iden2';		//2
      set sys_var=Iden1.Iden2;		//3
      set sys_var=.ident1.ident2; 		//4
      set sys_var=`Iden1.Iden2`;		//5
      
      
      While parsing, for case 1(when ANSI_QUOTES is enable) and 2,
      we will take as string literal(we will make item of type Item_string).
      for case 3 & 4, taken as Item_field, where Iden1 is a table name and
      iden2 is a field name.
      for case 5, again Item_field type, where iden1.iden2 is taken as
      field name.
      
      
      Now in case 1, when we are assigning some value to system variable
      (which can take string or enumerate type data), we are setting only 
      field part.
      This means only iden2 value will be set for system variable. This 
      result in wrong result.
      
      Solution:
      
      (for string type) We need to Document that we are not allowed to set 
      system variable which takes string as identifier, otherwise result 
      in unexpected behaviour.
      
      (for enumerate type)
      if we pass iden1.iden2, we will give an error ER_WRONG_TYPE_FOR_VAR
      (Incorrect argument type to variable).
      a3123b84
  24. 27 Sep, 2012 1 commit
    • Michael Widenius's avatar
      Implementation of Multi-source replication (MDEV:253) · 1864d959
      Michael Widenius authored
      Documentation of the feature can be found at: http://kb.askmonty.org/en/multi-source-replication/
      This code is based on code from Taobao, developed by Plinux
      
      BUILD/SETUP.sh:
        Added -Wno-invalid-offsetof to get rid of warning of offsetof() on C++ class (safe in the contex we use it)
      client/mysqltest.cc:
        Added support for error names starting with 'W'
        Added connection_name support to --sync_with_master
      cmake/maintainer.cmake:
        Added -Wno-invalid-offsetof to get rid of warning of offsetof() on C++ class (safe in the contex we use it)
      mysql-test/r/mysqltest.result:
        Updated results
      mysql-test/r/parser.result:
        Updated results
      mysql-test/suite/multi_source/my.cnf:
        Setup of multi-master tests
      mysql-test/suite/multi_source/simple.result:
        Simple basic test of multi-source functionality
      mysql-test/suite/multi_source/simple.test:
        Simple basic test of multi-source functionality
      mysql-test/suite/multi_source/syntax.result:
        Test of multi-source syntax
      mysql-test/suite/multi_source/syntax.test:
        Test of multi-source syntax
      mysql-test/suite/rpl/r/rpl_rotate_logs.result:
        Updated results because of new error messages
      mysql-test/t/parser.test:
        Updated test as master_pos_wait() now takes more arguments than before
      sql/event_scheduler.cc:
        No reason to initialize slave_thread (it's guaranteed to be zero here)
      sql/item_create.cc:
        Added connection_name argument to master_pos_wait()
        Simplified code
      sql/item_func.cc:
        Added connection_name argument to master_pos_wait()
      sql/item_func.h:
        Added connection_name argument to master_pos_wait()
      sql/log.cc:
        Added tag "Master 'connection_name'" to slave errors that has a connection name.
      sql/mysqld.cc:
        Added variable mysqld_server_initialized so that other functions can test if server is fully initialized.
        Free all slave data in one place (fewer ifdef's)
        Removed not needed call to close_active_mi()
        Initialize slaves() later in startup to ensure that everthing is really initialized when slaves start.
        Made status variable slave_running multi-source safe
      sql/mysqld.h:
        Added mysqld_server_initialized
      sql/rpl_mi.cc:
        Store connection name and cmp_connection_name (only used for show full slave status) in Master_info
        Added code for Master_info_index, which handles storage of multi-master information
        Don't write the empty "" connection_name to multi-master.info file. This is handled by the original code.
      sql/rpl_mi.h:
        Added connection_name and Master_info_index
      sql/rpl_rli.cc:
        Added connection_name to relay log files.
      sql/rpl_rli.h:
        Fixed type of slave_skip_counter as we now access it directly in sys_vars.cc, so it must be uint
      sql/share/errmsg-utf8.txt:
        Added new error messages needed for multi-source
        Added multi-source name to error ER_MASTER_INFO and WARN_NO_MASTER_INFO
      sql/slave.cc:
        Moved things a bit around to make it easier to handle error conditions.
        Create a global master_info_index and add the "" connection to it
        Ensure that new Master_info doesn't fail.
        Don't call terminate_slave_threads(active_mi..) on end_slave() as this is now done automaticly when deleting master_info_index.
        Delete not needed function close_active_mi(). One can achive same thing by calling end_slave().
        Added support for SHOW FULL SLAVE STATUS (show status for all master connections with connection_name as first column)
      sql/slave.h:
        Added new prototypes
      sql/sql_base.cc:
        More DBUG_PRINT
      sql/sql_class.cc:
        Reset thd->connection_name and thd-->default_master_connection
      sql/sql_class.h:
        Added thd->connection_name and thd-->default_master_connection
        Added slave_skip_count to variables to make changing the @@sql_slave_skip_count variable thread safe
      sql/sql_const.h:
        Added MAX_CONNECTION_NAME
      sql/sql_lex.cc:
        Reset 'lex->verbose' (to simplify some sql_yacc.yy code)
      sql/sql_lex.h:
        Added connection_name
      sql/sql_parse.cc:
        Added support for connection_name to all SLAVE commands.
        - Instead of using active_mi, we now get the current Master_info from master_info_index.
        - Create new replication threads with CHANGE MASTER
        - Added support for show_all_master_info()
      sql/sql_reload.cc:
        Made reset/full slave use master_info_index->get_master_info() instead of active_mi.
        If one uses 'RESET SLAVE "connection_name" all' the connection is removed from master_info_index.
      sql/sql_repl.cc:
        sql_slave_skip_counter is moved to thd->variables to make it thread safe and fix some bugs with it
        Add connection name to relay log files.
        Added connection name to errors.
        Added some logging for multi-master if log_warnings > 1
        stop_slave():
        - Don't check if thd is set. It's guaranteed to always be set.
        change_master():
        - Check for duplicate connection names in change_master()
        - Check for wrong arguments first in file (to simplify error handling)
        - Register new connections in master_info_index
      sql/sql_yacc.yy:
        Added optional connection_name to a all relevant master/slave commands
      sql/strfunc.cc:
        my_global.h shoud always be included first.
      sql/sys_vars.cc:
        Added variable default_master_connection
        Made variable sql_slave_skip_counter multi-source safe
      sql/sys_vars.h:
        Added Sys_var_session_lexstring (needed for default_master_connection)
        Added Sys_var_multi_source_uint (needed for sql_slave_skip_counter).
      1864d959
  25. 09 Jun, 2010 2 commits
    • Magne Mahre's avatar
      Post-commit fixes after the push for Bug#20837 et. al. · 75d7bb91
      Magne Mahre authored
      mysql-test/suite/innodb/r/innodb_information_schema.result:
        The transaction is in REPEATABLE READ, since the
        iso level was changed to SERIALIZABLE only for the 
        previous trx.
      mysql-test/suite/innodb/t/innodb-semi-consistent.test:
        'commit' was missing from the original patch
      mysql-test/t/parser.test:
        Moved the test for Bug#46527 to parser_not_embedded,
        since "disconnect default" isn't allowed with
        the embedded server.
      mysql-test/t/parser_not_embedded.test:
        Moved the test for Bug#46527 to parser_not_embedded,
        since "disconnect default" isn't allowed with
        the embedded server.
      75d7bb91
    • Magne Mahre's avatar
      fdd7c28b
  26. 07 May, 2010 2 commits
    • Konstantin Osipov's avatar
      Draft patch that fixes and a sketches test cases for: · 946fad35
      Konstantin Osipov authored
      Bug#20837 Apparent change of isolation level during transaction,
      Bug#46527 COMMIT AND CHAIN RELEASE does not make sense,
      Bug#53343 completion_type=1, COMMIT/ROLLBACK AND CHAIN don't 
      preserve the isolation level
      Bug#53346 completion_type has strange effect in a stored 
      procedure/prepared statement
      
      Make thd->tx_isolation mean strictly "current transaction 
      isolation level"
      Make thd->variables.tx_isolation mean "current session isolation
      level".
      The current transaction isolation level is now established
      at transaction start. If there was a SET TRANSACTION
      ISOLATION LEVEL statement, the value is taken from it.
      Otherwise, the session value is used.
      A change in a session value, made while a transaction is active,
      whereas still allowed, no longer has any effect on the
      current transaction isolation level. This is an incompatible
      change.
      A change in a session isolation level, made while there is
      no active transaction, overrides SET TRANSACTION statement,
      if there was any.
      Changed the impelmentation to not look at @@session.completion_type
      in the parser, and thus fixed Bug#53346.
      Changed the parser to not allow AND NO CHAIN RELEASE,
      and thus fixed Bug#46527.
      Changed the transaction API to take the current transaction
      isolation level into account:
      - BEGIN/COMMIT now do preserve the current transaction
      isolation level if chaining is on.
      - implicit commit, XA COMMIT or XA ROLLBACK or autocommit don't.
      946fad35
    • Konstantin Osipov's avatar
      Draft patch that fixes and a sketches test cases for: · 5ac769be
      Konstantin Osipov authored
      Bug#20837 Apparent change of isolation level during transaction,
      Bug#46527 COMMIT AND CHAIN RELEASE does not make sense,
      Bug#53343 completion_type=1, COMMIT/ROLLBACK AND CHAIN don't 
      preserve the isolation level
      Bug#53346 completion_type has strange effect in a stored 
      procedure/prepared statement
      
      Make thd->tx_isolation mean strictly "current transaction 
      isolation level"
      Make thd->variables.tx_isolation mean "current session isolation
      level".
      The current transaction isolation level is now established
      at transaction start. If there was a SET TRANSACTION
      ISOLATION LEVEL statement, the value is taken from it.
      Otherwise, the session value is used.
      A change in a session value, made while a transaction is active,
      whereas still allowed, no longer has any effect on the
      current transaction isolation level. This is an incompatible
      change.
      A change in a session isolation level, made while there is
      no active transaction, overrides SET TRANSACTION statement,
      if there was any.
      Changed the impelmentation to not look at @@session.completion_type
      in the parser, and thus fixed Bug#53346.
      Changed the parser to not allow AND NO CHAIN RELEASE,
      and thus fixed Bug#46527.
      Changed the transaction API to take the current transaction
      isolation level into account:
      - BEGIN/COMMIT now do preserve the current transaction
      isolation level if chaining is on.
      - implicit commit, XA COMMIT or XA ROLLBACK or autocommit don't.
      5ac769be
  27. 22 Dec, 2009 2 commits
    • Alexey Kopytov's avatar
      Backport of WL #2934: Make/find library for doing float/double · 12f364ec
      Alexey Kopytov authored
                            to string conversions and vice versa" 
      Initial import of the dtoa.c code and custom wrappers around it 
      to allow its usage from the server code. 
       
      Conversion of FLOAT/DOUBLE values to DECIMAL ones or strings 
      and vice versa has been significantly reworked. As the new 
      algoritms are more precise than the older ones, results of such 
      conversions may not always match those obtained from older 
      server versions. This in turn may break compatibility for some 
      applications. 
       
      This patch also fixes the following bugs: 
      - bug #12860 "Difference in zero padding of exponent between 
      Unix and Windows" 
      - bug #21497 "DOUBLE truncated to unusable value" 
      - bug #26788 "mysqld (debug) aborts when inserting specific 
      numbers into char fields" 
      - bug #24541 "Data truncated..." on decimal type columns 
      without any good reason" 
      12f364ec
    • Alexey Kopytov's avatar
      Backport of WL #2934: Make/find library for doing float/double · f02525be
      Alexey Kopytov authored
                            to string conversions and vice versa" 
      Initial import of the dtoa.c code and custom wrappers around it 
      to allow its usage from the server code. 
       
      Conversion of FLOAT/DOUBLE values to DECIMAL ones or strings 
      and vice versa has been significantly reworked. As the new 
      algoritms are more precise than the older ones, results of such 
      conversions may not always match those obtained from older 
      server versions. This in turn may break compatibility for some 
      applications. 
       
      This patch also fixes the following bugs: 
      - bug #12860 "Difference in zero padding of exponent between 
      Unix and Windows" 
      - bug #21497 "DOUBLE truncated to unusable value" 
      - bug #26788 "mysqld (debug) aborts when inserting specific 
      numbers into char fields" 
      - bug #24541 "Data truncated..." on decimal type columns 
      without any good reason" 
      f02525be
  28. 17 Apr, 2009 2 commits
  29. 10 Apr, 2009 2 commits
    • Chad MILLER's avatar
      Bug#39559: dump of stored procedures / functions with C-style \ · 8c828507
      Chad MILLER authored
      	comment can't be read back
      
      A change to the lexer in 5.1 caused slash-asterisk-bang-version
      sections to be terminated early if there exists a slash-asterisk-
      style comment inside it.  Nesting comments is usually illegal,
      but we rely on versioned comment blocks in mysqldump, and the
      contents of those sections must be allowed to have comments.
      
      The problem was that when encountering open-comment tokens and
      consuming -or- passing through the contents, the "in_comment"
      state at the end was clobbered with the not-in-a-comment value,
      regardless of whether we were in a comment before this or not.  
      
      So, """/*!VER one /* two */ three */""" would lose its in-comment
      state between "two" and "three".  Save the echo and in-comment
      state, and restore it at the end of the comment if we consume a 
      comment.
      8c828507
    • Chad MILLER's avatar
      Bug#39559: dump of stored procedures / functions with C-style \ · aa449c10
      Chad MILLER authored
      	comment can't be read back
      
      A change to the lexer in 5.1 caused slash-asterisk-bang-version
      sections to be terminated early if there exists a slash-asterisk-
      style comment inside it.  Nesting comments is usually illegal,
      but we rely on versioned comment blocks in mysqldump, and the
      contents of those sections must be allowed to have comments.
      
      The problem was that when encountering open-comment tokens and
      consuming -or- passing through the contents, the "in_comment"
      state at the end was clobbered with the not-in-a-comment value,
      regardless of whether we were in a comment before this or not.  
      
      So, """/*!VER one /* two */ three */""" would lose its in-comment
      state between "two" and "three".  Save the echo and in-comment
      state, and restore it at the end of the comment if we consume a 
      comment.
      aa449c10
  30. 08 Jul, 2008 2 commits
  31. 07 Jul, 2008 2 commits
    • Marc Alff's avatar
      Bug#26030 (Parsing fails for stored routine w/multi-statement execution · c7724872
      Marc Alff authored
      enabled)
      
      Before this fix, the lexer and parser would treat the ';' character as a
      different token (either ';' or END_OF_INPUT), based on convoluted logic,
      which failed in simple cases where a stored procedure is implemented as a
      single statement, and used in a multi query.
      
      With this fix:
      - the character ';' is always parsed as a ';' token in the lexer,
      - parsing multi queries is implemented in the parser, in the 'query:' rules,
      - the value of thd->client_capabilities, which is the capabilities
        negotiated between the client and the server during bootstrap,
        is immutable and not arbitrarily modified during parsing (which was the
        root cause of the bug)
      
      c7724872
    • Marc Alff's avatar
      Bug#26030 (Parsing fails for stored routine w/multi-statement execution · f3ff1aeb
      Marc Alff authored
      enabled)
      
      Before this fix, the lexer and parser would treat the ';' character as a
      different token (either ';' or END_OF_INPUT), based on convoluted logic,
      which failed in simple cases where a stored procedure is implemented as a
      single statement, and used in a multi query.
      
      With this fix:
      - the character ';' is always parsed as a ';' token in the lexer,
      - parsing multi queries is implemented in the parser, in the 'query:' rules,
      - the value of thd->client_capabilities, which is the capabilities
        negotiated between the client and the server during bootstrap,
        is immutable and not arbitrarily modified during parsing (which was the
        root cause of the bug)
      f3ff1aeb