~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to storage/innobase/include/row0row.h

Imported InnoDB plugin with changes.

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
#include "mtr0mtr.h"
18
18
#include "rem0types.h"
19
19
#include "read0types.h"
 
20
#include "row0types.h"
20
21
#include "btr0types.h"
21
22
 
22
23
/*************************************************************************
 
24
Gets the offset of the trx id field, in bytes relative to the origin of
 
25
a clustered index record. */
 
26
UNIV_INTERN
 
27
ulint
 
28
row_get_trx_id_offset(
 
29
/*==================*/
 
30
                                /* out: offset of DATA_TRX_ID */
 
31
        const rec_t*    rec,    /* in: record */
 
32
        dict_index_t*   index,  /* in: clustered index */
 
33
        const ulint*    offsets);/* in: rec_get_offsets(rec, index) */
 
34
/*************************************************************************
23
35
Reads the trx id field from a clustered index record. */
24
36
UNIV_INLINE
25
37
dulint
26
38
row_get_rec_trx_id(
27
39
/*===============*/
28
40
                                /* out: value of the field */
29
 
        rec_t*          rec,    /* in: record */
 
41
        const rec_t*    rec,    /* in: record */
30
42
        dict_index_t*   index,  /* in: clustered index */
31
43
        const ulint*    offsets);/* in: rec_get_offsets(rec, index) */
32
44
/*************************************************************************
36
48
row_get_rec_roll_ptr(
37
49
/*=================*/
38
50
                                /* out: value of the field */
39
 
        rec_t*          rec,    /* in: record */
 
51
        const rec_t*    rec,    /* in: record */
40
52
        dict_index_t*   index,  /* in: clustered index */
41
53
        const ulint*    offsets);/* in: rec_get_offsets(rec, index) */
42
 
/*************************************************************************
43
 
Writes the trx id field to a clustered index record. */
44
 
UNIV_INLINE
45
 
void
46
 
row_set_rec_trx_id(
47
 
/*===============*/
48
 
        rec_t*          rec,    /* in: record */
49
 
        dict_index_t*   index,  /* in: clustered index */
50
 
        const ulint*    offsets,/* in: rec_get_offsets(rec, index) */
51
 
        dulint          trx_id);/* in: value of the field */
52
 
/*************************************************************************
53
 
Sets the roll pointer field in a clustered index record. */
54
 
UNIV_INLINE
55
 
void
56
 
row_set_rec_roll_ptr(
57
 
/*=================*/
58
 
        rec_t*          rec,    /* in: record */
59
 
        dict_index_t*   index,  /* in: clustered index */
60
 
        const ulint*    offsets,/* in: rec_get_offsets(rec, index) */
61
 
        dulint          roll_ptr);/* in: value of the field */
62
54
/*********************************************************************
63
 
When an insert to a table is performed, this function builds the entry which
64
 
has to be inserted to an index on the table. */
65
 
 
 
55
When an insert or purge to a table is performed, this function builds
 
56
the entry to be inserted into or purged from an index on the table. */
 
57
UNIV_INTERN
66
58
dtuple_t*
67
59
row_build_index_entry(
68
60
/*==================*/
69
 
                                /* out: index entry which should be inserted */
70
 
        dtuple_t*       row,    /* in: row which should be inserted to the
71
 
                                table */
 
61
                                /* out: index entry which should be
 
62
                                inserted or purged, or NULL if the
 
63
                                externally stored columns in the
 
64
                                clustered index record are unavailable
 
65
                                and ext != NULL */
 
66
        const dtuple_t* row,    /* in: row which should be
 
67
                                inserted or purged */
 
68
        row_ext_t*      ext,    /* in: externally stored column prefixes,
 
69
                                or NULL */
72
70
        dict_index_t*   index,  /* in: index on the table */
73
71
        mem_heap_t*     heap);  /* in: memory heap from which the memory for
74
72
                                the index entry is allocated */
75
73
/***********************************************************************
76
 
An inverse function to dict_row_build_index_entry. Builds a row from a
 
74
An inverse function to row_build_index_entry. Builds a row from a
77
75
record in a clustered index. */
78
 
 
 
76
UNIV_INTERN
79
77
dtuple_t*
80
78
row_build(
81
79
/*======*/
82
 
                                /* out, own: row built; see the NOTE below! */
83
 
        ulint           type,   /* in: ROW_COPY_POINTERS or ROW_COPY_DATA;
84
 
                                the latter copies also the data fields to
85
 
                                heap while the first only places pointers to
86
 
                                data fields on the index page, and thus is
87
 
                                more efficient */
88
 
        dict_index_t*   index,  /* in: clustered index */
89
 
        rec_t*          rec,    /* in: record in the clustered index;
90
 
                                NOTE: in the case ROW_COPY_POINTERS
91
 
                                the data fields in the row will point
92
 
                                directly into this record, therefore,
93
 
                                the buffer page of this record must be
94
 
                                at least s-latched and the latch held
95
 
                                as long as the row dtuple is used! */
96
 
        const ulint*    offsets,/* in: rec_get_offsets(rec, index)
97
 
                                or NULL, in which case this function
98
 
                                will invoke rec_get_offsets() */
99
 
        mem_heap_t*     heap);  /* in: memory heap from which the memory
100
 
                                needed is allocated */
 
80
                                        /* out, own: row built;
 
81
                                        see the NOTE below! */
 
82
        ulint                   type,   /* in: ROW_COPY_POINTERS or
 
83
                                        ROW_COPY_DATA; the latter
 
84
                                        copies also the data fields to
 
85
                                        heap while the first only
 
86
                                        places pointers to data fields
 
87
                                        on the index page, and thus is
 
88
                                        more efficient */
 
89
        const dict_index_t*     index,  /* in: clustered index */
 
90
        const rec_t*            rec,    /* in: record in the clustered
 
91
                                        index; NOTE: in the case
 
92
                                        ROW_COPY_POINTERS the data
 
93
                                        fields in the row will point
 
94
                                        directly into this record,
 
95
                                        therefore, the buffer page of
 
96
                                        this record must be at least
 
97
                                        s-latched and the latch held
 
98
                                        as long as the row dtuple is used! */
 
99
        const ulint*            offsets,/* in: rec_get_offsets(rec,index)
 
100
                                        or NULL, in which case this function
 
101
                                        will invoke rec_get_offsets() */
 
102
        const dict_table_t*     col_table,
 
103
                                        /* in: table, to check which
 
104
                                        externally stored columns
 
105
                                        occur in the ordering columns
 
106
                                        of an index, or NULL if
 
107
                                        index->table should be
 
108
                                        consulted instead; the user
 
109
                                        columns in this table should be
 
110
                                        the same columns as in index->table */
 
111
        row_ext_t**             ext,    /* out, own: cache of
 
112
                                        externally stored column
 
113
                                        prefixes, or NULL */
 
114
        mem_heap_t*             heap);  /* in: memory heap from which
 
115
                                        the memory needed is allocated */
101
116
/***********************************************************************
102
117
Converts an index record to a typed data tuple. */
103
 
 
 
118
UNIV_INTERN
 
119
dtuple_t*
 
120
row_rec_to_index_entry_low(
 
121
/*=======================*/
 
122
                                        /* out: index entry built; does not
 
123
                                        set info_bits, and the data fields in
 
124
                                        the entry will point directly to rec */
 
125
        const rec_t*            rec,    /* in: record in the index */
 
126
        const dict_index_t*     index,  /* in: index */
 
127
        const ulint*            offsets,/* in: rec_get_offsets(rec, index) */
 
128
        ulint*                  n_ext,  /* out: number of externally
 
129
                                        stored columns */
 
130
        mem_heap_t*             heap);  /* in: memory heap from which
 
131
                                        the memory needed is allocated */
 
132
/***********************************************************************
 
133
Converts an index record to a typed data tuple. NOTE that externally
 
134
stored (often big) fields are NOT copied to heap. */
 
135
UNIV_INTERN
104
136
dtuple_t*
105
137
row_rec_to_index_entry(
106
138
/*===================*/
107
 
                                /* out, own: index entry built; see the
108
 
                                NOTE below! */
109
 
        ulint           type,   /* in: ROW_COPY_DATA, or ROW_COPY_POINTERS:
110
 
                                the former copies also the data fields to
111
 
                                heap as the latter only places pointers to
112
 
                                data fields on the index page */
113
 
        dict_index_t*   index,  /* in: index */
114
 
        rec_t*          rec,    /* in: record in the index;
115
 
                                NOTE: in the case ROW_COPY_POINTERS
116
 
                                the data fields in the row will point
117
 
                                directly into this record, therefore,
118
 
                                the buffer page of this record must be
119
 
                                at least s-latched and the latch held
120
 
                                as long as the dtuple is used! */
121
 
        mem_heap_t*     heap);  /* in: memory heap from which the memory
122
 
                                needed is allocated */
 
139
                                        /* out, own: index entry
 
140
                                        built; see the NOTE below! */
 
141
        ulint                   type,   /* in: ROW_COPY_DATA, or
 
142
                                        ROW_COPY_POINTERS: the former
 
143
                                        copies also the data fields to
 
144
                                        heap as the latter only places
 
145
                                        pointers to data fields on the
 
146
                                        index page */
 
147
        const rec_t*            rec,    /* in: record in the index;
 
148
                                        NOTE: in the case
 
149
                                        ROW_COPY_POINTERS the data
 
150
                                        fields in the row will point
 
151
                                        directly into this record,
 
152
                                        therefore, the buffer page of
 
153
                                        this record must be at least
 
154
                                        s-latched and the latch held
 
155
                                        as long as the dtuple is used! */
 
156
        const dict_index_t*     index,  /* in: index */
 
157
        ulint*                  offsets,/* in/out: rec_get_offsets(rec) */
 
158
        ulint*                  n_ext,  /* out: number of externally
 
159
                                        stored columns */
 
160
        mem_heap_t*             heap);  /* in: memory heap from which
 
161
                                        the memory needed is allocated */
123
162
/***********************************************************************
124
163
Builds from a secondary index record a row reference with which we can
125
164
search the clustered index record. */
126
 
 
 
165
UNIV_INTERN
127
166
dtuple_t*
128
167
row_build_row_ref(
129
168
/*==============*/
133
172
                                the former copies also the data fields to
134
173
                                heap, whereas the latter only places pointers
135
174
                                to data fields on the index page */
136
 
        dict_index_t*   index,  /* in: index */
137
 
        rec_t*          rec,    /* in: record in the index;
 
175
        dict_index_t*   index,  /* in: secondary index */
 
176
        const rec_t*    rec,    /* in: record in the index;
138
177
                                NOTE: in the case ROW_COPY_POINTERS
139
178
                                the data fields in the row will point
140
179
                                directly into this record, therefore,
146
185
/***********************************************************************
147
186
Builds from a secondary index record a row reference with which we can
148
187
search the clustered index record. */
149
 
 
 
188
UNIV_INTERN
150
189
void
151
190
row_build_row_ref_in_tuple(
152
191
/*=======================*/
153
 
        dtuple_t*       ref,    /* in/out: row reference built; see the
154
 
                                NOTE below! */
155
 
        dict_index_t*   index,  /* in: index */
156
 
        rec_t*          rec,    /* in: record in the index;
157
 
                                NOTE: the data fields in ref will point
158
 
                                directly into this record, therefore,
159
 
                                the buffer page of this record must be
160
 
                                at least s-latched and the latch held
161
 
                                as long as the row reference is used! */
162
 
        trx_t*          trx);   /* in: transaction */
 
192
        dtuple_t*               ref,    /* in/out: row reference built;
 
193
                                        see the NOTE below! */
 
194
        const rec_t*            rec,    /* in: record in the index;
 
195
                                        NOTE: the data fields in ref
 
196
                                        will point directly into this
 
197
                                        record, therefore, the buffer
 
198
                                        page of this record must be at
 
199
                                        least s-latched and the latch
 
200
                                        held as long as the row
 
201
                                        reference is used! */
 
202
        const dict_index_t*     index,  /* in: secondary index */
 
203
        ulint*                  offsets,/* in: rec_get_offsets(rec, index)
 
204
                                        or NULL */
 
205
        trx_t*                  trx);   /* in: transaction */
163
206
/***********************************************************************
164
207
From a row build a row reference with which we can search the clustered
165
208
index record. */
166
 
 
 
209
UNIV_INTERN
167
210
void
168
211
row_build_row_ref_from_row(
169
212
/*=======================*/
170
 
        dtuple_t*       ref,    /* in/out: row reference built; see the
171
 
                                NOTE below! ref must have the right number
172
 
                                of fields! */
173
 
        dict_table_t*   table,  /* in: table */
174
 
        dtuple_t*       row);   /* in: row
175
 
                                NOTE: the data fields in ref will point
176
 
                                directly into data of this row */
 
213
        dtuple_t*               ref,    /* in/out: row reference built;
 
214
                                        see the NOTE below!
 
215
                                        ref must have the right number
 
216
                                        of fields! */
 
217
        const dict_table_t*     table,  /* in: table */
 
218
        const dtuple_t*         row);   /* in: row
 
219
                                        NOTE: the data fields in ref will point
 
220
                                        directly into data of this row */
177
221
/***********************************************************************
178
222
Builds from a secondary index record a row reference with which we can
179
223
search the clustered index record. */
181
225
void
182
226
row_build_row_ref_fast(
183
227
/*===================*/
184
 
        dtuple_t*       ref,    /* in: typed data tuple where the
 
228
        dtuple_t*       ref,    /* in/out: typed data tuple where the
185
229
                                reference is built */
186
230
        const ulint*    map,    /* in: array of field numbers in rec
187
231
                                telling how ref should be built from
188
232
                                the fields of rec */
189
 
        rec_t*          rec,    /* in: record in the index; must be
 
233
        const rec_t*    rec,    /* in: record in the index; must be
190
234
                                preserved while ref is used, as we do
191
235
                                not copy field values to heap */
192
236
        const ulint*    offsets);/* in: array returned by rec_get_offsets() */
193
237
/*******************************************************************
194
238
Searches the clustered index record for a row, if we have the row
195
239
reference. */
196
 
 
 
240
UNIV_INTERN
197
241
ibool
198
242
row_search_on_row_ref(
199
243
/*==================*/
200
 
                                /* out: TRUE if found */
201
 
        btr_pcur_t*     pcur,   /* in/out: persistent cursor, which must
202
 
                                be closed by the caller */
203
 
        ulint           mode,   /* in: BTR_MODIFY_LEAF, ... */
204
 
        dict_table_t*   table,  /* in: table */
205
 
        dtuple_t*       ref,    /* in: row reference */
206
 
        mtr_t*          mtr);   /* in: mtr */
 
244
                                        /* out: TRUE if found */
 
245
        btr_pcur_t*             pcur,   /* out: persistent cursor, which must
 
246
                                        be closed by the caller */
 
247
        ulint                   mode,   /* in: BTR_MODIFY_LEAF, ... */
 
248
        const dict_table_t*     table,  /* in: table */
 
249
        const dtuple_t*         ref,    /* in: row reference */
 
250
        mtr_t*                  mtr);   /* in/out: mtr */
207
251
/*************************************************************************
208
252
Fetches the clustered index record for a secondary index record. The latches
209
253
on the secondary index record are preserved. */
210
 
 
 
254
UNIV_INTERN
211
255
rec_t*
212
256
row_get_clust_rec(
213
257
/*==============*/
214
258
                                /* out: record or NULL, if no record found */
215
259
        ulint           mode,   /* in: BTR_MODIFY_LEAF, ... */
216
 
        rec_t*          rec,    /* in: record in a secondary index */
 
260
        const rec_t*    rec,    /* in: record in a secondary index */
217
261
        dict_index_t*   index,  /* in: secondary index */
218
262
        dict_index_t**  clust_index,/* out: clustered index */
219
263
        mtr_t*          mtr);   /* in: mtr */
220
264
/*******************************************************************
221
265
Searches an index record. */
222
 
 
 
266
UNIV_INTERN
223
267
ibool
224
268
row_search_index_entry(
225
269
/*===================*/
226
270
                                /* out: TRUE if found */
227
271
        dict_index_t*   index,  /* in: index */
228
 
        dtuple_t*       entry,  /* in: index entry */
 
272
        const dtuple_t* entry,  /* in: index entry */
229
273
        ulint           mode,   /* in: BTR_MODIFY_LEAF, ... */
230
274
        btr_pcur_t*     pcur,   /* in/out: persistent cursor, which must
231
275
                                be closed by the caller */
243
287
No new latches may be obtained while the kernel mutex is reserved.
244
288
However, the kernel mutex can be reserved while latches are owned. */
245
289
 
 
290
/***********************************************************************
 
291
Formats the raw data in "data" (in InnoDB on-disk format) using
 
292
"dict_field" and writes the result to "buf".
 
293
Not more than "buf_size" bytes are written to "buf".
 
294
The result is always '\0'-terminated (provided buf_size > 0) and the
 
295
number of bytes that were written to "buf" is returned (including the
 
296
terminating '\0'). */
 
297
UNIV_INTERN
 
298
ulint
 
299
row_raw_format(
 
300
/*===========*/
 
301
                                                /* out: number of bytes
 
302
                                                that were written */
 
303
        const char*             data,           /* in: raw data */
 
304
        ulint                   data_len,       /* in: raw data length
 
305
                                                in bytes */
 
306
        const dict_field_t*     dict_field,     /* in: index field */
 
307
        char*                   buf,            /* out: output buffer */
 
308
        ulint                   buf_size);      /* in: output buffer size
 
309
                                                in bytes */
 
310
 
246
311
#ifndef UNIV_NONINL
247
312
#include "row0row.ic"
248
313
#endif