data0data.h 15.7 KB
Newer Older
vasil's avatar
vasil committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/*****************************************************************************

Copyright (c) 1994, 2009, Innobase Oy. All Rights Reserved.

This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation; version 2 of the License.

This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place, Suite 330, Boston, MA 02111-1307 USA

*****************************************************************************/

osku's avatar
osku committed
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
/************************************************************************
SQL data field and tuple

Created 5/30/1994 Heikki Tuuri
*************************************************************************/

#ifndef data0data_h
#define data0data_h

#include "univ.i"

#include "data0types.h"
#include "data0type.h"
#include "mem0mem.h"
#include "dict0types.h"

typedef struct big_rec_struct		big_rec_t;

37
#ifdef UNIV_DEBUG
osku's avatar
osku committed
38
/*************************************************************************
39 40
Gets pointer to the type struct of SQL data field.
@return	pointer to the type struct */
osku's avatar
osku committed
41
UNIV_INLINE
42
dtype_t*
osku's avatar
osku committed
43 44
dfield_get_type(
/*============*/
45
	const dfield_t*	field);	/*!< in: SQL data field */
osku's avatar
osku committed
46
/*************************************************************************
47 48
Gets pointer to the data in a field.
@return	pointer to data */
49 50 51 52
UNIV_INLINE
void*
dfield_get_data(
/*============*/
53
	const dfield_t* field);	/*!< in: field */
54 55 56 57 58
#else /* UNIV_DEBUG */
# define dfield_get_type(field) (&(field)->type)
# define dfield_get_data(field) ((field)->data)
#endif /* UNIV_DEBUG */
/*************************************************************************
osku's avatar
osku committed
59 60 61 62 63
Sets the type struct of SQL data field. */
UNIV_INLINE
void
dfield_set_type(
/*============*/
64 65
	dfield_t*	field,	/*!< in: SQL data field */
	dtype_t*	type);	/*!< in: pointer to data type struct */
osku's avatar
osku committed
66
/*************************************************************************
67 68
Gets length of field data.
@return	length of data; UNIV_SQL_NULL if SQL null data */
osku's avatar
osku committed
69 70 71 72
UNIV_INLINE
ulint
dfield_get_len(
/*===========*/
73
	const dfield_t* field);	/*!< in: field */
osku's avatar
osku committed
74 75 76
/*************************************************************************
Sets length in a field. */
UNIV_INLINE
77
void
osku's avatar
osku committed
78 79
dfield_set_len(
/*===========*/
80 81
	dfield_t*	field,	/*!< in: field */
	ulint		len);	/*!< in: length or UNIV_SQL_NULL */
osku's avatar
osku committed
82
/*************************************************************************
83 84
Determines if a field is SQL NULL
@return	nonzero if SQL null data */
85 86 87 88
UNIV_INLINE
ulint
dfield_is_null(
/*===========*/
89
	const dfield_t* field);	/*!< in: field */
90
/*************************************************************************
91 92
Determines if a field is externally stored
@return	nonzero if externally stored */
93 94 95 96
UNIV_INLINE
ulint
dfield_is_ext(
/*==========*/
97
	const dfield_t* field);	/*!< in: field */
98 99 100 101 102 103
/*************************************************************************
Sets the "external storage" flag */
UNIV_INLINE
void
dfield_set_ext(
/*===========*/
104
	dfield_t*	field);	/*!< in/out: field */
105
/*************************************************************************
osku's avatar
osku committed
106 107
Sets pointer to the data and length in a field. */
UNIV_INLINE
108
void
osku's avatar
osku committed
109 110
dfield_set_data(
/*============*/
111 112 113
	dfield_t*	field,	/*!< in: field */
	const void*	data,	/*!< in: data */
	ulint		len);	/*!< in: length or UNIV_SQL_NULL */
114 115 116 117 118 119
/*************************************************************************
Sets a data field to SQL NULL. */
UNIV_INLINE
void
dfield_set_null(
/*============*/
120
	dfield_t*	field);	/*!< in/out: field */
osku's avatar
osku committed
121 122 123 124 125 126
/**************************************************************************
Writes an SQL null field full of zeros. */
UNIV_INLINE
void
data_write_sql_null(
/*================*/
127 128
	byte*	data,	/*!< in: pointer to a buffer of size len */
	ulint	len);	/*!< in: SQL null size in bytes */
osku's avatar
osku committed
129 130 131
/*************************************************************************
Copies the data and len fields. */
UNIV_INLINE
132
void
osku's avatar
osku committed
133 134
dfield_copy_data(
/*=============*/
135 136
	dfield_t*	field1,	/*!< out: field to copy to */
	const dfield_t*	field2);/*!< in: field to copy from */
osku's avatar
osku committed
137 138 139 140 141 142
/*************************************************************************
Copies a data field to another. */
UNIV_INLINE
void
dfield_copy(
/*========*/
143 144
	dfield_t*	field1,	/*!< out: field to copy to */
	const dfield_t*	field2);/*!< in: field to copy from */
osku's avatar
osku committed
145
/*************************************************************************
146 147 148 149 150
Copies the data pointed to by a data field. */
UNIV_INLINE
void
dfield_dup(
/*=======*/
151 152
	dfield_t*	field,	/*!< in/out: data field */
	mem_heap_t*	heap);	/*!< in: memory heap where allocated */
153
/*************************************************************************
154 155
Tests if data length and content is equal for two dfields.
@return	TRUE if equal */
osku's avatar
osku committed
156 157 158 159
UNIV_INLINE
ibool
dfield_datas_are_binary_equal(
/*==========================*/
160 161
	const dfield_t*	field1,	/*!< in: field */
	const dfield_t*	field2);/*!< in: field */
osku's avatar
osku committed
162
/*************************************************************************
163 164
Tests if dfield data length and content is equal to the given.
@return	TRUE if equal */
165
UNIV_INTERN
osku's avatar
osku committed
166 167 168
ibool
dfield_data_is_binary_equal(
/*========================*/
169 170 171
	const dfield_t*	field,	/*!< in: field */
	ulint		len,	/*!< in: data length or UNIV_SQL_NULL */
	const byte*	data);	/*!< in: data */
osku's avatar
osku committed
172
/*************************************************************************
173 174
Gets number of fields in a data tuple.
@return	number of fields */
osku's avatar
osku committed
175
UNIV_INLINE
176
ulint
osku's avatar
osku committed
177 178
dtuple_get_n_fields(
/*================*/
179
	const dtuple_t*	tuple);	/*!< in: tuple */
180
#ifdef UNIV_DEBUG
osku's avatar
osku committed
181
/*************************************************************************
182 183
Gets nth field of a tuple.
@return	nth field */
osku's avatar
osku committed
184
UNIV_INLINE
185
dfield_t*
osku's avatar
osku committed
186 187
dtuple_get_nth_field(
/*=================*/
188 189
	const dtuple_t*	tuple,	/*!< in: tuple */
	ulint		n);	/*!< in: index of field */
190 191 192
#else /* UNIV_DEBUG */
# define dtuple_get_nth_field(tuple, n) ((tuple)->fields + (n))
#endif /* UNIV_DEBUG */
osku's avatar
osku committed
193
/*************************************************************************
194 195
Gets info bits in a data tuple.
@return	info bits */
osku's avatar
osku committed
196 197 198 199
UNIV_INLINE
ulint
dtuple_get_info_bits(
/*=================*/
200
	const dtuple_t*	tuple);	/*!< in: tuple */
osku's avatar
osku committed
201 202 203 204 205 206
/*************************************************************************
Sets info bits in a data tuple. */
UNIV_INLINE
void
dtuple_set_info_bits(
/*=================*/
207 208
	dtuple_t*	tuple,		/*!< in: tuple */
	ulint		info_bits);	/*!< in: info bits */
osku's avatar
osku committed
209
/*************************************************************************
210 211
Gets number of fields used in record comparisons.
@return	number of fields used in comparisons in rem0cmp.* */
osku's avatar
osku committed
212 213 214 215
UNIV_INLINE
ulint
dtuple_get_n_fields_cmp(
/*====================*/
216
	const dtuple_t*	tuple);	/*!< in: tuple */
osku's avatar
osku committed
217 218 219 220 221 222
/*************************************************************************
Gets number of fields used in record comparisons. */
UNIV_INLINE
void
dtuple_set_n_fields_cmp(
/*====================*/
223 224
	dtuple_t*	tuple,		/*!< in: tuple */
	ulint		n_fields_cmp);	/*!< in: number of fields used in
osku's avatar
osku committed
225 226 227
					comparisons in rem0cmp.* */
/**************************************************************
Creates a data tuple to a memory heap. The default value for number
228 229
of fields used in record comparisons for this tuple is n_fields.
@return	own: created tuple */
osku's avatar
osku committed
230 231 232 233
UNIV_INLINE
dtuple_t*
dtuple_create(
/*==========*/
234
	mem_heap_t*	heap,	/*!< in: memory heap where the tuple
osku's avatar
osku committed
235
				is created */
236
	ulint		n_fields); /*!< in: number of fields */
osku's avatar
osku committed
237

238 239
/**************************************************************
Wrap data fields in a tuple. The default value for number
240 241
of fields used in record comparisons for this tuple is n_fields.
@return	data tuple */
242 243 244 245
UNIV_INLINE
const dtuple_t*
dtuple_from_fields(
/*===============*/
246 247 248
	dtuple_t*	tuple,		/*!< in: storage for data tuple */
	const dfield_t*	fields,		/*!< in: fields */
	ulint		n_fields);	/*!< in: number of fields */
249

osku's avatar
osku committed
250 251
/*************************************************************************
Sets number of fields used in a tuple. Normally this is set in
252
dtuple_create, but if you want later to set it smaller, you can use this. */
253
UNIV_INTERN
osku's avatar
osku committed
254 255 256
void
dtuple_set_n_fields(
/*================*/
257 258
	dtuple_t*	tuple,		/*!< in: tuple */
	ulint		n_fields);	/*!< in: number of fields */
259 260
/*************************************************************************
Copies a data tuple to another.  This is a shallow copy; if a deep copy
261 262
is desired, dfield_dup() will have to be invoked on each field.
@return	own: copy of tuple */
263 264 265 266
UNIV_INLINE
dtuple_t*
dtuple_copy(
/*========*/
267 268
	const dtuple_t*	tuple,	/*!< in: tuple to copy from */
	mem_heap_t*	heap);	/*!< in: memory heap
269
				where the tuple is created */
osku's avatar
osku committed
270 271
/**************************************************************
The following function returns the sum of data lengths of a tuple. The space
272 273
occupied by the field structs or the tuple struct is not counted.
@return	sum of data lens */
osku's avatar
osku committed
274 275 276 277
UNIV_INLINE
ulint
dtuple_get_data_size(
/*=================*/
278 279
	const dtuple_t*	tuple,	/*!< in: typed data tuple */
	ulint		comp);	/*!< in: nonzero=ROW_FORMAT=COMPACT  */
280
/*************************************************************************
281 282
Computes the number of externally stored fields in a data tuple.
@return	number of fields */
283 284 285 286
UNIV_INLINE
ulint
dtuple_get_n_ext(
/*=============*/
287
	const dtuple_t*	tuple);	/*!< in: tuple */
osku's avatar
osku committed
288
/****************************************************************
289 290
Compare two data tuples, respecting the collation of character fields.
@return	1, 0 , -1 if tuple1 is greater, equal, less, respectively, than tuple2 */
291
UNIV_INTERN
292 293 294
int
dtuple_coll_cmp(
/*============*/
295 296
	const dtuple_t*	tuple1,	/*!< in: tuple 1 */
	const dtuple_t*	tuple2);/*!< in: tuple 2 */
osku's avatar
osku committed
297
/****************************************************************
298 299
Folds a prefix given as the number of fields of a tuple.
@return	the folded value */
osku's avatar
osku committed
300 301 302 303
UNIV_INLINE
ulint
dtuple_fold(
/*========*/
304 305 306
	const dtuple_t*	tuple,	/*!< in: the tuple */
	ulint		n_fields,/*!< in: number of complete fields to fold */
	ulint		n_bytes,/*!< in: number of bytes to fold in an
osku's avatar
osku committed
307
				incomplete last field */
308
	dulint		tree_id)/*!< in: index tree id */
309
	__attribute__((pure));
osku's avatar
osku committed
310 311 312 313 314 315
/***********************************************************************
Sets types of fields binary in a tuple. */
UNIV_INLINE
void
dtuple_set_types_binary(
/*====================*/
316 317
	dtuple_t*	tuple,	/*!< in: data tuple */
	ulint		n);	/*!< in: number of fields to set */
osku's avatar
osku committed
318
/**************************************************************************
319 320
Checks if a dtuple contains an SQL null value.
@return	TRUE if some field is SQL null */
osku's avatar
osku committed
321 322 323 324
UNIV_INLINE
ibool
dtuple_contains_null(
/*=================*/
325
	const dtuple_t*	tuple);	/*!< in: dtuple */
osku's avatar
osku committed
326
/**************************************************************
327 328
Checks that a data field is typed. Asserts an error if not.
@return	TRUE if ok */
329
UNIV_INTERN
osku's avatar
osku committed
330 331 332
ibool
dfield_check_typed(
/*===============*/
333
	const dfield_t*	field);	/*!< in: data field */
osku's avatar
osku committed
334
/**************************************************************
335 336
Checks that a data tuple is typed. Asserts an error if not.
@return	TRUE if ok */
337
UNIV_INTERN
osku's avatar
osku committed
338 339 340
ibool
dtuple_check_typed(
/*===============*/
341
	const dtuple_t*	tuple);	/*!< in: tuple */
osku's avatar
osku committed
342
/**************************************************************
343 344
Checks that a data tuple is typed.
@return	TRUE if ok */
345
UNIV_INTERN
osku's avatar
osku committed
346 347 348
ibool
dtuple_check_typed_no_assert(
/*=========================*/
349
	const dtuple_t*	tuple);	/*!< in: tuple */
osku's avatar
osku committed
350 351 352
#ifdef UNIV_DEBUG
/**************************************************************
Validates the consistency of a tuple which must be complete, i.e,
353 354
all fields must have been set.
@return	TRUE if ok */
355
UNIV_INTERN
osku's avatar
osku committed
356 357 358
ibool
dtuple_validate(
/*============*/
359
	const dtuple_t*	tuple);	/*!< in: tuple */
osku's avatar
osku committed
360 361 362
#endif /* UNIV_DEBUG */
/*****************************************************************
Pretty prints a dfield value according to its data type. */
363
UNIV_INTERN
osku's avatar
osku committed
364 365 366
void
dfield_print(
/*=========*/
367
	const dfield_t*	dfield);/*!< in: dfield */
osku's avatar
osku committed
368 369
/*****************************************************************
Pretty prints a dfield value according to its data type. Also the hex string
370
is printed if a string contains non-printable characters. */
371
UNIV_INTERN
osku's avatar
osku committed
372 373 374
void
dfield_print_also_hex(
/*==================*/
375
	const dfield_t*	dfield);	 /*!< in: dfield */
osku's avatar
osku committed
376 377
/**************************************************************
The following function prints the contents of a tuple. */
378
UNIV_INTERN
osku's avatar
osku committed
379 380 381
void
dtuple_print(
/*=========*/
382 383
	FILE*		f,	/*!< in: output stream */
	const dtuple_t*	tuple);	/*!< in: tuple */
osku's avatar
osku committed
384 385 386 387
/******************************************************************
Moves parts of long fields in entry to the big record vector so that
the size of tuple drops below the maximum record size allowed in the
database. Moves data only from those fields which are not necessary
388 389
to determine uniquely the insertion place of the tuple in the index.
@return	own: created big record vector, NULL if we are not able to shorten the entry enough, i.e., if there are too many fixed-length or short fields in entry or the index is clustered */
390
UNIV_INTERN
osku's avatar
osku committed
391 392 393
big_rec_t*
dtuple_convert_big_rec(
/*===================*/
394 395 396
	dict_index_t*	index,	/*!< in: index */
	dtuple_t*	entry,	/*!< in/out: index entry */
	ulint*		n_ext);	/*!< in/out: number of
397
				externally stored columns */
osku's avatar
osku committed
398 399 400 401
/******************************************************************
Puts back to entry the data stored in vector. Note that to ensure the
fields in entry can accommodate the data, vector must have been created
from entry with dtuple_convert_big_rec. */
402
UNIV_INTERN
osku's avatar
osku committed
403 404 405
void
dtuple_convert_back_big_rec(
/*========================*/
406 407 408
	dict_index_t*	index,	/*!< in: index */
	dtuple_t*	entry,	/*!< in: entry whose data was put to vector */
	big_rec_t*	vector);/*!< in, own: big rec vector; it is
osku's avatar
osku committed
409 410 411
				freed in this function */
/******************************************************************
Frees the memory in a big rec vector. */
412
UNIV_INLINE
osku's avatar
osku committed
413 414 415
void
dtuple_big_rec_free(
/*================*/
416
	big_rec_t*	vector);	/*!< in, own: big rec vector; it is
osku's avatar
osku committed
417 418 419 420 421 422 423
				freed in this function */

/*######################################################################*/

/* Structure for an SQL data field */
struct dfield_struct{
	void*		data;	/* pointer to data */
424 425
	unsigned	ext:1;	/* TRUE=externally stored, FALSE=local */
	unsigned	len:32;	/* data length; UNIV_SQL_NULL if SQL null */
osku's avatar
osku committed
426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445
	dtype_t		type;	/* type of data */
};

struct dtuple_struct {
	ulint		info_bits;	/* info bits of an index record:
					the default is 0; this field is used
					if an index record is built from
					a data tuple */
	ulint		n_fields;	/* number of fields in dtuple */
	ulint		n_fields_cmp;	/* number of fields which should
					be used in comparison services
					of rem0cmp.*; the index search
					is performed by comparing only these
					fields, others are ignored; the
					default value in dtuple creation is
					the same value as n_fields */
	dfield_t*	fields;		/* fields */
	UT_LIST_NODE_T(dtuple_t) tuple_list;
					/* data tuples can be linked into a
					list using this field */
marko's avatar
marko committed
446
#ifdef UNIV_DEBUG
447
	ulint		magic_n;
marko's avatar
marko committed
448 449
# define		DATA_TUPLE_MAGIC_N	65478679
#endif /* UNIV_DEBUG */
osku's avatar
osku committed
450 451 452 453
};

/* A slot for a field in a big rec vector */

454
typedef struct big_rec_field_struct	big_rec_field_t;
osku's avatar
osku committed
455 456 457
struct big_rec_field_struct {
	ulint		field_no;	/* field number in record */
	ulint		len;		/* stored data len */
458
	const void*	data;		/* stored data */
osku's avatar
osku committed
459 460 461 462 463 464 465 466 467 468
};

/* Storage format for overflow data in a big record, that is, a record
which needs external storage of data fields */

struct big_rec_struct {
	mem_heap_t*	heap;		/* memory heap from which allocated */
	ulint		n_fields;	/* number of stored fields */
	big_rec_field_t* fields;	/* stored fields */
};
469

osku's avatar
osku committed
470 471 472 473 474
#ifndef UNIV_NONINL
#include "data0data.ic"
#endif

#endif