summaryrefslogtreecommitdiff
path: root/innobase/include/row0vers.ic
blob: aa7a7aa22998c94a7197479398e41df73717ed66 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/******************************************************
Row versions

(c) 1997 Innobase Oy

Created 2/6/1997 Heikki Tuuri
*******************************************************/

#include "row0row.h"
#include "dict0dict.h"
#include "read0read.h"
#include "page0page.h"
#include "log0recv.h"

/*************************************************************************
Fetches the trx id of a clustered index record or version. */
UNIV_INLINE
dulint
row_vers_get_trx_id(
/*================*/
				/* out: trx id or ut_dulint_zero if the
				clustered index record not found */
	rec_t*		rec,	/* in: clustered index record, or an old
				version of it */
	dict_table_t*	table)	/* in: table */
{
	return(row_get_rec_trx_id(rec, dict_table_get_first_index(table)));
}

/*************************************************************************
Checks if a consistent read can be performed immediately on the index
record, or if an older version is needed. */
UNIV_INLINE
ibool
row_vers_clust_rec_sees_older(
/*==========================*/
				/* out: FALSE if can read immediately */
	rec_t*		rec,	/* in: record which should be read or passed
				over by a read cursor */
	dict_index_t*	index,	/* in: clustered index */
	read_view_t*	view)	/* in: read view */
{
	ut_ad(index->type & DICT_CLUSTERED);

	if (read_view_sees_trx_id(view, row_get_rec_trx_id(rec, index))) {

		return(FALSE);
	}

	return(TRUE);
}

/*************************************************************************
Checks if a secondary index record can be read immediately by a consistent
read, or if an older version may be needed. To be sure, we will have to
look in the clustered index. */
UNIV_INLINE
ibool
row_vers_sec_rec_may_see_older(
/*===========================*/
				/* out: FALSE if can be read immediately */
	rec_t*		rec,	/* in: record which should be read or passed */
	dict_index_t*	index,	/* in: secondary index */
	read_view_t*	view)	/* in: read view */
{
	page_t*	page;
	
	ut_ad(!(index->type & DICT_CLUSTERED));

	page = buf_frame_align(rec);

	if ((ut_dulint_cmp(page_get_max_trx_id(page), view->up_limit_id) >= 0)
	    || recv_recovery_is_on()) {

		/* It may be that the record was inserted or modified by a
		transaction the view should not see: we have to look in the
		clustered index */

		return(TRUE);
	}

	return(FALSE);
}