MySQL 26.7.0
Source Code Documentation
lock0prdt.h
Go to the documentation of this file.
1/*****************************************************************************
2
3Copyright (c) 2014, 2026, Oracle and/or its affiliates.
4
5This program is free software; you can redistribute it and/or modify it under
6the terms of the GNU General Public License, version 2.0, as published by the
7Free Software Foundation.
8
9This program is designed to work with certain software (including
10but not limited to OpenSSL) that is licensed under separate terms,
11as designated in a particular file or component or in included license
12documentation. The authors of MySQL hereby grant you an additional
13permission to link the program and your derivative works with the
14separately licensed software that they have either included with
15the program or referenced in the documentation.
16
17This program is distributed in the hope that it will be useful, but WITHOUT
18ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
19FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0,
20for more details.
21
22You should have received a copy of the GNU General Public License along with
23this program; if not, write to the Free Software Foundation, Inc.,
2451 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25
26*****************************************************************************/
27
28/** @file include/lock0prdt.h
29 The predicate lock system
30
31 Created 9/7/2013 Jimmy Yang
32 *******************************************************/
33#ifndef lock0prdt_h
34#define lock0prdt_h
35
36#include "buf0buf.h" /* buf_block_t */
37#include "lock0types.h" /* lock_prdt_t */
38#include "sql/gis/rtree_support.h" /* rtr_mbr_t */
39#include "univ.i"
40
41/* Predicate lock data */
42typedef struct lock_prdt {
43 void *data; /* Predicate data */
44 uint16 op; /* Predicate operator */
46
47/** Acquires LOCK_S | LOCK_PREDICATE on a block. Always succeeds, because it
48never has to wait, because their only purpose is to block conflicting
49LOCK_X | LOCK_PREDICATE | LOCK_INSERT_INTENTION into the locked area.
50(In other words they are conceptually similar to gap locks in regular indexes,
51which also never have to wait for similar reasons)
52@param[in] block Buffer block containing the rec
53@param[in] prdt Predicate for the lock
54@param[in] index Secondary index containing the block
55@param[in] thr The query thread requesting the lock */
57 que_thr_t *thr);
58
59/** Acquire a "Page" lock on a block
60@param[in] page_id id of the page to lock
61@param[in] index secondary index
62@param[in] thr query thread
63@return DB_SUCCESS */
65 que_thr_t *thr);
66
67/** Initiate a Predicate lock from a MBR */
69 lock_prdt_t *prdt, /*!< in/out: predicate to initialized */
70 rtr_mbr_t *mbr, /*!< in: Minimum Bounding Rectangle */
71 ulint mode, /*!< in: Search mode */
72 mem_heap_t *heap); /*!< in: heap for allocating memory */
73
74/** Get predicate lock's minimum bounding box
75 @return the minimum bounding box*/
76lock_prdt_t *lock_get_prdt_from_lock(const lock_t *lock); /*!< in: the lock */
77
78/** Checks if a predicate lock request for a new lock has to wait for
79 request lock2.
80 @return true if new lock has to wait for lock2 to be removed */
82 const trx_t *trx, /*!< in: trx of new lock */
83 ulint type_mode, /*!< in: precise mode of the new lock
84 to set: LOCK_S or LOCK_X, possibly
85 ORed to LOCK_PREDICATE or LOCK_PRDT_PAGE,
86 LOCK_INSERT_INTENTION */
87 lock_prdt_t *prdt, /*!< in: lock predicate to check */
88 const lock_t *lock2); /*!< in: another record lock; NOTE that
89 it is assumed that this has a lock bit
90 set on the same record as in the new
91 lock we are setting */
92
93/** Update predicate lock when page splits
94
95@param[in,out] block page to be split
96@param[in,out] new_block the new half page
97@param[in] prdt MBR on the old page
98@param[in] new_prdt MBR on the new page
99*/
100void lock_prdt_update_split(buf_block_t *block, buf_block_t *new_block,
101 lock_prdt_t *prdt, lock_prdt_t *new_prdt);
102
103/** Adjust locks from an ancestor page of Rtree on the appropriate level .
104Check whether any predicate lock in parent needs to propagate to child page
105after split.
106
107@param[in,out] left_block page to be split
108@param[in,out] right_block the new half page
109@param[in] left_prdt MBR on the old page
110@param[in] right_prdt MBR on the new page
111@param[in] page_id the parent's page id
112*/
113void lock_prdt_update_parent(buf_block_t *left_block, buf_block_t *right_block,
114 lock_prdt_t *left_prdt, lock_prdt_t *right_prdt,
115 const page_id_t &page_id);
116
117/** Checks if locks of other transactions prevent an immediate insert of
118 a predicate record.
119 @return DB_SUCCESS, DB_LOCK_WAIT, or DB_DEADLOCK */
121 ulint flags, /*!< in: if BTR_NO_LOCKING_FLAG bit is
122 set, does nothing */
123 const rec_t *rec, /*!< in: record after which to insert */
124 buf_block_t *block, /*!< in/out: buffer block of rec */
125 dict_index_t *index, /*!< in: index */
126 que_thr_t *thr, /*!< in: query thread */
127 mtr_t *mtr, /*!< in/out: mini-transaction */
128 lock_prdt_t *prdt); /*!< in: Minimum Bound Rectangle */
129
130/** Append a predicate to the lock
131@param[in] lock Lock
132@param[in] prdt Predicate */
133void lock_prdt_set_prdt(lock_t *lock, const lock_prdt_t *prdt);
134
135#if 0
136
137/*********************************************************************//**
138Get predicate lock's minimum bounding box
139@return the minimum bounding box*/
140static inline
143 const lock_prdt_t* prdt); /*!< in: the lock predicate */
144
145#endif
146/** Moves the locks of a record to another record and resets the lock bits of
147 the donating record. */
149 const buf_block_t *receiver, /*!< in: buffer block containing
150 the receiving record */
151 const buf_block_t *donator); /*!< in: buffer block containing
152 the donating record */
153
154/** Check whether there are R-tree Page locks on a page by other transactions
155@param[in] trx trx to test the lock
156@param[in] page_id id of the page
157@retval false if there is no lock
158@retval true if some transaction other than trx holds a page lock */
159bool lock_other_has_prdt_page_lock(const trx_t *trx, const page_id_t &page_id);
160
161/** Removes predicate lock objects set on an index page which is discarded.
162@param[in] block page to be discarded
163@param[in] lock_hash lock hash */
165 struct Locks_hashtable &lock_hash);
166
167#endif
The database buffer pool high-level routines.
Page identifier.
Definition: buf0types.h:191
dberr_t
Definition: db0err.h:39
static int flags[50]
Definition: hp_test1.cc:40
static rtr_mbr_t * prdt_get_mbr_from_prdt(const lock_prdt_t *prdt)
Get a minimum bounding box from a Predicate.
Definition: lock0prdt.cc:53
lock_prdt_t * lock_get_prdt_from_lock(const lock_t *lock)
Get predicate lock's minimum bounding box.
Definition: lock0prdt.cc:65
struct lock_prdt lock_prdt_t
void lock_init_prdt_from_mbr(lock_prdt_t *prdt, rtr_mbr_t *mbr, ulint mode, mem_heap_t *heap)
Initiate a Predicate lock from a MBR.
Definition: lock0prdt.cc:603
void lock_prdt_update_parent(buf_block_t *left_block, buf_block_t *right_block, lock_prdt_t *left_prdt, lock_prdt_t *right_prdt, const page_id_t &page_id)
Adjust locks from an ancestor page of Rtree on the appropriate level .
Definition: lock0prdt.cc:496
void lock_prdt_update_split(buf_block_t *block, buf_block_t *new_block, lock_prdt_t *prdt, lock_prdt_t *new_prdt)
Update predicate lock when page splits.
Definition: lock0prdt.cc:592
bool lock_prdt_has_to_wait(const trx_t *trx, ulint type_mode, lock_prdt_t *prdt, const lock_t *lock2)
Checks if a predicate lock request for a new lock has to wait for request lock2.
Definition: lock0prdt.cc:150
void lock_prdt_lock(buf_block_t *block, lock_prdt_t *prdt, dict_index_t *index, que_thr_t *thr)
Acquires LOCK_S | LOCK_PREDICATE on a block.
Definition: lock0prdt.cc:621
bool lock_other_has_prdt_page_lock(const trx_t *trx, const page_id_t &page_id)
Check whether there are R-tree Page locks on a page by other transactions.
Definition: lock0prdt.cc:720
dberr_t lock_place_prdt_page_lock(const page_id_t &page_id, dict_index_t *index, que_thr_t *thr)
Acquire a "Page" lock on a block.
Definition: lock0prdt.cc:677
void lock_prdt_page_free_from_discard(const buf_block_t *block, struct Locks_hashtable &lock_hash)
Removes predicate lock objects set on an index page which is discarded.
Definition: lock0prdt.cc:752
void lock_prdt_rec_move(const buf_block_t *receiver, const buf_block_t *donator)
Moves the locks of a record to another record and resets the lock bits of the donating record.
Definition: lock0prdt.cc:729
dberr_t lock_prdt_insert_check_and_lock(ulint flags, const rec_t *rec, buf_block_t *block, dict_index_t *index, que_thr_t *thr, mtr_t *mtr, lock_prdt_t *prdt)
Checks if locks of other transactions prevent an immediate insert of a predicate record.
Definition: lock0prdt.cc:416
void lock_prdt_set_prdt(lock_t *lock, const lock_prdt_t *prdt)
Append a predicate to the lock.
Definition: lock0prdt.cc:91
The transaction lock system global types.
uint16_t uint16
Definition: my_inttypes.h:65
bool index(const std::string &value, const String &search_for, uint32_t *idx)
Definition: contains.h:76
Provides atomic access in shared-exclusive modes.
Definition: shared_spin_lock.h:79
mode
Definition: file_handle.h:61
byte rec_t
Definition: rem0types.h:41
This file declares a set of functions that storage engines can call to do geometrical operations.
A hashmap used by lock sys, to organize locks by page (block), so that it is easy to maintain a list ...
Definition: lock0lock.h:1031
The buffer control block structure.
Definition: buf0buf.h:1756
Data structure for an index.
Definition: dict0mem.h:1069
Definition: lock0prdt.h:42
uint16 op
Definition: lock0prdt.h:44
void * data
Definition: lock0prdt.h:43
Lock struct; protected by lock_sys latches.
Definition: lock0priv.h:137
The info structure stored at the beginning of a heap block.
Definition: mem0mem.h:295
Mini-transaction handle and buffer.
Definition: mtr0mtr.h:174
Definition: que0que.h:242
In memory representation of a minimum bounding rectangle.
Definition: rtree_support.h:40
Definition: trx0trx.h:670
Version control for database, common definitions, and include files.
unsigned long int ulint
Definition: univ.i:403