1
0
mirror of https://github.com/MariaDB/server.git synced 2025-09-11 05:52:26 +03:00
Commit Graph

2 Commits

Author SHA1 Message Date
Aleksey Midenkov
a1da6555fb MDEV-16686 DDL in procedure propagates no locking to tables locked by DML
TABLE_LIST parsed from procedure code is transferred into tables to
lock for INSERT. The procedure code is CREATE VIEW so its TABLE_LIST
is parsed as TL_IGNORE, but same view exists and when existing view is
opened mysql_make_view() uses same TABLE_LIST that was initialized
from CREATE VIEW and then added as part of prelocking context. So
existing view is opened and its table is assigned TL_IGNORE from
prelocking context. Finally, INSERT has TABLE_LIST duplication: the
one that was parsed from INSERT; the another one came from procedure
prelocking, its lock_type came from the procedure code and the real
table was found via existing view.

The sequence of execution:

1. Procedure p is compiled as part of open_and_process_routine(), its
   code is parsed and create_or_alter_view_finalize() initializes v
   TABLE_LIST as TL_IGNORE;
2. Procedure p prelocking adds v to prelocking_ctx with TL_IGNORE;
3. DML prelocking adds v from prelocking_ctx;
4. View is opened, mysql_make_view() assigns t lock_type from v;
5. open_and_lock_tables() attempts to lock t with TL_IGNORE.

The fix skips TL_IGNORE at 2. when table list parsed by procedure is
added for prelocking:

        if (my_hash_insert(&m_sptabs, (uchar *)tab))
          return FALSE;

m_sptabs designation was defined as strictly for prelocking:

  /**
    Multi-set representing optimized list of tables to be locked by this
    routine. Does not include tables which are used by invoked routines.

    @note
    For prelocking-free SPs this multiset is constructed too.
    We do so because the same instance of sp_head may be called both
    in prelocked mode and in non-prelocked mode.
  */
  HASH m_sptabs;

The fix was proposed by Sergei Golubchik <serg@mariadb.org>.
2025-09-01 22:18:35 +03:00
Michael Widenius
a7abddeffa Create 'main' test directory and move 't' and 'r' there 2018-03-29 13:59:44 +03:00