• Oleksandr Byelkin's avatar
    MDEV-33861 main.query_cache fails with embedded after enabling WITH_PROTECT_STATEMENT_MEMROOT · 50998a6c
    Oleksandr Byelkin authored
    Synopsis: If SELECT returned answer from Query Cache it is not really executed.
    
    The reason for firing of assertion
      DBUG_ASSERT((mem_root->flags & ROOT_FLAG_READ_ONLY) == 0);
    is that in case the query_cache is on and the same query run by different
    stored routines the following use case can take place:
    First, lets say that bodies of routines used by the test case are the same
    and contains the only query 'SELECT * FROM t1';
      call p1() -- a result set is stored in query cache for further use.
      call p2() -- the same query is run against the table t1, that result in
                   not running the actual query but using its cached result.
                   On finishing execution of this routine, its memory root is
                   marked for read only since every SP instruction that this
                   routine contains has been executed.
      INSERT INT t1 VALUE (1); -- force following invalidation of query cache
      call p2() -- query the table t1 will result in assertion failure since its
                   execution would require allocation on the memory root that
                   has been already marked as read only memory root
    
    The root cause of firing the assertion is that memory root of the stored
    routine 'p2' was marked as read only although actual execution of the query
    contained inside hadn't been performed.
    
    To fix the issue, mark a SP instruction as not yet run in case its execution
    doesn't result in real query processing and a result set got from query cache
    instead.
    
    Note that, this issue relates server built in debug mode AND with the protect
    statement memory root feature turned on. It doesn't affect server built
    in release mode.
    50998a6c
query_cache.result 117 KB