MySQL 8.0.39
Source Code Documentation
lock0prdt.h
Go to the documentation of this file.
1/*****************************************************************************
2
3Copyright (c) 2014, 2024, 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 "lock0lock.h"
37#include "univ.i"
38
39/* Predicate lock data */
40typedef struct lock_prdt {
41 void *data; /* Predicate data */
42 uint16 op; /* Predicate operator */
44
45/** Acquire a predicate lock on a block
46 @return DB_SUCCESS, DB_SUCCESS_LOCKED_REC, DB_LOCK_WAIT, or DB_DEADLOCK */
47dberr_t lock_prdt_lock(buf_block_t *block, /*!< in/out: buffer block of rec */
48 lock_prdt_t *prdt, /*!< in: Predicate for the lock */
49 dict_index_t *index, /*!< in: secondary index */
50 enum lock_mode mode, /*!< in: mode of the lock which
51 the read cursor should set on
52 records: LOCK_S or LOCK_X; the
53 latter is possible in
54 SELECT FOR UPDATE */
55 ulint type_mode,
56 /*!< in: LOCK_PREDICATE or LOCK_PRDT_PAGE */
57 que_thr_t *thr); /*!< in: query thread
58 (can be NULL if BTR_NO_LOCKING_FLAG) */
59
60/** Acquire a "Page" lock on a block
61@param[in] page_id id of the page to lock
62@param[in] index secondary index
63@param[in] thr query thread
64@return DB_SUCCESS */
66 que_thr_t *thr);
67
68/** Initiate a Predicate lock from a MBR */
70 lock_prdt_t *prdt, /*!< in/out: predicate to initialized */
71 rtr_mbr_t *mbr, /*!< in: Minimum Bounding Rectangle */
72 ulint mode, /*!< in: Search mode */
73 mem_heap_t *heap); /*!< in: heap for allocating memory */
74
75/** Get predicate lock's minimum bounding box
76 @return the minimum bounding box*/
77lock_prdt_t *lock_get_prdt_from_lock(const lock_t *lock); /*!< in: the lock */
78
79/** Checks if a predicate lock request for a new lock has to wait for
80 request lock2.
81 @return true if new lock has to wait for lock2 to be removed */
83 const trx_t *trx, /*!< in: trx of new lock */
84 ulint type_mode, /*!< in: precise mode of the new lock
85 to set: LOCK_S or LOCK_X, possibly
86 ORed to LOCK_PREDICATE or LOCK_PRDT_PAGE,
87 LOCK_INSERT_INTENTION */
88 lock_prdt_t *prdt, /*!< in: lock predicate to check */
89 const lock_t *lock2); /*!< in: another record lock; NOTE that
90 it is assumed that this has a lock bit
91 set on the same record as in the new
92 lock we are setting */
93
94/** Update predicate lock when page splits
95
96@param[in,out] block page to be split
97@param[in,out] new_block the new half page
98@param[in] prdt MBR on the old page
99@param[in] new_prdt MBR on the new page
100*/
101void lock_prdt_update_split(buf_block_t *block, buf_block_t *new_block,
102 lock_prdt_t *prdt, lock_prdt_t *new_prdt);
103
104/** Adjust locks from an ancestor page of Rtree on the appropriate level .
105Check whether any predicate lock in parent needs to propagate to child page
106after split.
107
108@param[in,out] left_block page to be split
109@param[in,out] right_block the new half page
110@param[in] left_prdt MBR on the old page
111@param[in] right_prdt MBR on the new page
112@param[in] page_id the parent's page id
113*/
114void lock_prdt_update_parent(buf_block_t *left_block, buf_block_t *right_block,
115 lock_prdt_t *left_prdt, lock_prdt_t *right_prdt,
116 const page_id_t &page_id);
117
118/** Checks if locks of other transactions prevent an immediate insert of
119 a predicate record.
120 @return DB_SUCCESS, DB_LOCK_WAIT, or DB_DEADLOCK */
122 ulint flags, /*!< in: if BTR_NO_LOCKING_FLAG bit is
123 set, does nothing */
124 const rec_t *rec, /*!< in: record after which to insert */
125 buf_block_t *block, /*!< in/out: buffer block of rec */
126 dict_index_t *index, /*!< in: index */
127 que_thr_t *thr, /*!< in: query thread */
128 mtr_t *mtr, /*!< in/out: mini-transaction */
129 lock_prdt_t *prdt); /*!< in: Minimum Bound Rectangle */
130
131/** Append a predicate to the lock
132@param[in] lock Lock
133@param[in] prdt Predicate */
134void lock_prdt_set_prdt(lock_t *lock, const lock_prdt_t *prdt);
135
136#if 0
137
138/*********************************************************************//**
139Get predicate lock's minimum bounding box
140@return the minimum bounding box*/
141static inline
144 const lock_prdt_t* prdt); /*!< in: the lock predicate */
145
146#endif
147/** Moves the locks of a record to another record and resets the lock bits of
148 the donating record. */
150 const buf_block_t *receiver, /*!< in: buffer block containing
151 the receiving record */
152 const buf_block_t *donator); /*!< in: buffer block containing
153 the donating record */
154
155/** Check whether there are no R-tree Page locks on a page by other transactions
156@param[in] trx trx to test the lock
157@param[in] page_id id of the page
158@retval true if there is no lock
159@retval false if some transaction other than trx holds a page lock */
160bool lock_test_prdt_page_lock(const trx_t *trx, const page_id_t &page_id);
161
162/** Removes predicate lock objects set on an index page which is discarded.
163@param[in] block page to be discarded
164@param[in] lock_hash lock hash */
166 hash_table_t *lock_hash);
167
168#endif
Definition: hash0hash.h:374
Page identifier.
Definition: buf0types.h:207
dberr_t
Definition: db0err.h:39
static int flags[50]
Definition: hp_test1.cc:40
The transaction lock system.
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:63
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:633
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:519
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:622
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:146
void lock_prdt_page_free_from_discard(const buf_block_t *block, hash_table_t *lock_hash)
Removes predicate lock objects set on an index page which is discarded.
Definition: lock0prdt.cc:842
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:746
bool lock_test_prdt_page_lock(const trx_t *trx, const page_id_t &page_id)
Check whether there are no R-tree Page locks on a page by other transactions.
Definition: lock0prdt.cc:798
dberr_t lock_prdt_lock(buf_block_t *block, lock_prdt_t *prdt, dict_index_t *index, enum lock_mode mode, ulint type_mode, que_thr_t *thr)
Acquire a predicate lock on a block.
Definition: lock0prdt.cc:654
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:813
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:432
void lock_prdt_set_prdt(lock_t *lock, const lock_prdt_t *prdt)
Append a predicate to the lock.
Definition: lock0prdt.cc:89
lock_mode
Definition: lock0types.h:52
uint16_t uint16
Definition: my_inttypes.h:65
Provides atomic access in shared-exclusive modes.
Definition: shared_spin_lock.h:79
mode
Definition: file_handle.h:60
byte rec_t
Definition: rem0types.h:41
The buffer control block structure.
Definition: buf0buf.h:1690
Data structure for an index.
Definition: dict0mem.h:1046
Definition: lock0prdt.h:40
uint16 op
Definition: lock0prdt.h:42
void * data
Definition: lock0prdt.h:41
Lock struct; protected by lock_sys latches.
Definition: lock0priv.h:136
The info structure stored at the beginning of a heap block.
Definition: mem0mem.h:302
Mini-transaction handle and buffer.
Definition: mtr0mtr.h:177
Definition: que0que.h:242
In memory representation of a minimum bounding rectangle.
Definition: rtree_support.h:40
Definition: trx0trx.h:684
Version control for database, common definitions, and include files.
unsigned long int ulint
Definition: univ.i:406