summaryrefslogtreecommitdiff
path: root/innobase/include/row0vers.ic
diff options
context:
space:
mode:
Diffstat (limited to 'innobase/include/row0vers.ic')
-rw-r--r--innobase/include/row0vers.ic83
1 files changed, 83 insertions, 0 deletions
diff --git a/innobase/include/row0vers.ic b/innobase/include/row0vers.ic
new file mode 100644
index 00000000000..aa7a7aa2299
--- /dev/null
+++ b/innobase/include/row0vers.ic
@@ -0,0 +1,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);
+}