diff options
Diffstat (limited to 'innobase/include/data0data.h')
-rw-r--r-- | innobase/include/data0data.h | 430 |
1 files changed, 430 insertions, 0 deletions
diff --git a/innobase/include/data0data.h b/innobase/include/data0data.h new file mode 100644 index 00000000000..d7f0986b0b6 --- /dev/null +++ b/innobase/include/data0data.h @@ -0,0 +1,430 @@ +/************************************************************************ +SQL data field and tuple + +(c) 1994-1996 Innobase Oy + +Created 5/30/1994 Heikki Tuuri +*************************************************************************/ + +#ifndef data0data_h +#define data0data_h + +#include "univ.i" + +#include "data0types.h" +#include "data0type.h" +#include "mem0mem.h" + +/* Some non-inlined functions used in the MySQL interface: */ +void +dfield_set_data_noninline( + dfield_t* field, /* in: field */ + void* data, /* in: data */ + ulint len); /* in: length or UNIV_SQL_NULL */ +void* +dfield_get_data_noninline( + dfield_t* field); /* in: field */ +ulint +dfield_get_len_noninline( + dfield_t* field); /* in: field */ +ulint +dtuple_get_n_fields_noninline( + dtuple_t* tuple); /* in: tuple */ +dfield_t* +dtuple_get_nth_field_noninline( + dtuple_t* tuple, /* in: tuple */ + ulint n); /* in: index of field */ + +/************************************************************************* +Gets pointer to the type struct of SQL data field. */ +UNIV_INLINE +dtype_t* +dfield_get_type( +/*============*/ + /* out: pointer to the type struct */ + dfield_t* field); /* in: SQL data field */ +/************************************************************************* +Sets the type struct of SQL data field. */ +UNIV_INLINE +void +dfield_set_type( +/*============*/ + dfield_t* field, /* in: SQL data field */ + dtype_t* type); /* in: pointer to data type struct */ +/************************************************************************* +Gets pointer to the data in a field. */ +UNIV_INLINE +void* +dfield_get_data( +/*============*/ + /* out: pointer to data */ + dfield_t* field); /* in: field */ +/************************************************************************* +Gets length of field data. */ +UNIV_INLINE +ulint +dfield_get_len( +/*===========*/ + /* out: length of data; UNIV_SQL_NULL if + SQL null data */ + dfield_t* field); /* in: field */ +/************************************************************************* +Sets length in a field. */ +UNIV_INLINE +void +dfield_set_len( +/*===========*/ + dfield_t* field, /* in: field */ + ulint len); /* in: length or UNIV_SQL_NULL */ +/************************************************************************* +Sets pointer to the data and length in a field. */ +UNIV_INLINE +void +dfield_set_data( +/*============*/ + dfield_t* field, /* in: field */ + void* data, /* in: data */ + ulint len); /* in: length or UNIV_SQL_NULL */ +/************************************************************************** +Writes an SQL null field full of zeros. */ +UNIV_INLINE +void +data_write_sql_null( +/*================*/ + byte* data, /* in: pointer to a buffer of size len */ + ulint len); /* in: SQL null size in bytes */ +/************************************************************************* +Copies the data and len fields. */ +UNIV_INLINE +void +dfield_copy_data( +/*=============*/ + dfield_t* field1, /* in: field to copy to */ + dfield_t* field2);/* in: field to copy from */ +/************************************************************************* +Copies a data field to another. */ +UNIV_INLINE +void +dfield_copy( +/*========*/ + dfield_t* field1, /* in: field to copy to */ + dfield_t* field2);/* in: field to copy from */ +/************************************************************************* +Tests if data length and content is equal for two dfields. */ +UNIV_INLINE +ibool +dfield_datas_are_equal( +/*===================*/ + /* out: TRUE if equal */ + dfield_t* field1, /* in: field */ + dfield_t* field2);/* in: field */ +/************************************************************************* +Tests if dfield data length and content is equal to the given. */ +UNIV_INLINE +ibool +dfield_data_is_equal( +/*=================*/ + /* out: TRUE if equal */ + dfield_t* field, /* in: field */ + ulint len, /* in: data length or UNIV_SQL_NULL */ + byte* data); /* in: data */ +/************************************************************************* +Gets number of fields in a data tuple. */ +UNIV_INLINE +ulint +dtuple_get_n_fields( +/*================*/ + /* out: number of fields */ + dtuple_t* tuple); /* in: tuple */ +/************************************************************************* +Gets nth field of a tuple. */ +UNIV_INLINE +dfield_t* +dtuple_get_nth_field( +/*=================*/ + /* out: nth field */ + dtuple_t* tuple, /* in: tuple */ + ulint n); /* in: index of field */ +/************************************************************************* +Gets info bits in a data tuple. */ +UNIV_INLINE +ulint +dtuple_get_info_bits( +/*=================*/ + /* out: info bits */ + dtuple_t* tuple); /* in: tuple */ +/************************************************************************* +Sets info bits in a data tuple. */ +UNIV_INLINE +void +dtuple_set_info_bits( +/*=================*/ + dtuple_t* tuple, /* in: tuple */ + ulint info_bits); /* in: info bits */ +/************************************************************************* +Gets number of fields used in record comparisons. */ +UNIV_INLINE +ulint +dtuple_get_n_fields_cmp( +/*====================*/ + /* out: number of fields used in comparisons + in rem0cmp.* */ + dtuple_t* tuple); /* in: tuple */ +/************************************************************************* +Gets number of fields used in record comparisons. */ +UNIV_INLINE +void +dtuple_set_n_fields_cmp( +/*====================*/ + dtuple_t* tuple, /* in: tuple */ + ulint n_fields_cmp); /* in: number of fields used in + comparisons in rem0cmp.* */ +/************************************************************** +Creates a data tuple to a memory heap. The default value for number +of fields used in record comparisons for this tuple is n_fields. */ +UNIV_INLINE +dtuple_t* +dtuple_create( +/*==========*/ + /* out, own: created tuple */ + mem_heap_t* heap, /* in: memory heap where the tuple + is created */ + ulint n_fields); /* in: number of fields */ + +/************************************************************************* +Creates a dtuple for use in MySQL. */ + +dtuple_t* +dtuple_create_for_mysql( +/*====================*/ + /* out, own created dtuple */ + void** heap, /* out: created memory heap */ + ulint n_fields); /* in: number of fields */ +/************************************************************************* +Frees a dtuple used in MySQL. */ + +void +dtuple_free_for_mysql( +/*==================*/ + void* heap); +/************************************************************************* +Sets number of fields used in a tuple. Normally this is set in +dtuple_create, but if you want later to set it smaller, you can use this. */ + +void +dtuple_set_n_fields( +/*================*/ + dtuple_t* tuple, /* in: tuple */ + ulint n_fields); /* in: number of fields */ +/************************************************************** +The following function returns the sum of data lengths of a tuple. The space +occupied by the field structs or the tuple struct is not counted. */ +UNIV_INLINE +ulint +dtuple_get_data_size( +/*=================*/ + /* out: sum of data lens */ + dtuple_t* tuple); /* in: typed data tuple */ +/**************************************************************** +Returns TRUE if lengths of two dtuples are equal and respective data fields +in them are equal. */ +UNIV_INLINE +ibool +dtuple_datas_are_equal( +/*===================*/ + /* out: TRUE if length and datas are equal */ + dtuple_t* tuple1, /* in: tuple 1 */ + dtuple_t* tuple2); /* in: tuple 2 */ +/**************************************************************** +Folds a prefix given as the number of fields of a tuple. */ +UNIV_INLINE +ulint +dtuple_fold( +/*========*/ + /* out: the folded value */ + 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 + incomplete last field */ + dulint tree_id);/* in: index tree id */ +/*********************************************************************** +Sets types of fields binary in a tuple. */ +UNIV_INLINE +void +dtuple_set_types_binary( +/*====================*/ + dtuple_t* tuple, /* in: data tuple */ + ulint n); /* in: number of fields to set */ +/************************************************************** +Checks that a data field is typed. Asserts an error if not. */ + +ibool +dfield_check_typed( +/*===============*/ + /* out: TRUE if ok */ + dfield_t* field); /* in: data field */ +/************************************************************** +Checks that a data tuple is typed. Asserts an error if not. */ + +ibool +dtuple_check_typed( +/*===============*/ + /* out: TRUE if ok */ + dtuple_t* tuple); /* in: tuple */ +/************************************************************** +Validates the consistency of a tuple which must be complete, i.e, +all fields must have been set. */ + +ibool +dtuple_validate( +/*============*/ + /* out: TRUE if ok */ + dtuple_t* tuple); /* in: tuple */ +/***************************************************************** +Pretty prints a dfield value according to its data type. */ + +void +dfield_print( +/*=========*/ + dfield_t* dfield);/* in: dfield */ +/***************************************************************** +Pretty prints a dfield value according to its data type. Also the hex string +is printed if a string contains non-printable characters. */ + +void +dfield_print_also_hex( +/*==================*/ + dfield_t* dfield); /* in: dfield */ +/************************************************************** +The following function prints the contents of a tuple. */ + +void +dtuple_print( +/*=========*/ + dtuple_t* tuple); /* in: tuple */ +/************************************************************** +The following function prints the contents of a tuple to a buffer. */ + +ulint +dtuple_sprintf( +/*===========*/ + /* out: printed length in bytes */ + char* buf, /* in: print buffer */ + ulint buf_len,/* in: buf length in bytes */ + dtuple_t* tuple); /* in: tuple */ +/*************************************************************** +Generates a random tuple. */ + +dtuple_t* +dtuple_gen_rnd_tuple( +/*=================*/ + /* out: pointer to the tuple */ + mem_heap_t* heap); /* in: memory heap where generated */ +/******************************************************************* +Generates a test tuple for sort and comparison tests. */ + +void +dtuple_gen_test_tuple( +/*==================*/ + dtuple_t* tuple, /* in/out: a tuple with 3 fields */ + ulint i); /* in: a number, 0 <= i < 512 */ +/******************************************************************* +Generates a test tuple for B-tree speed tests. */ + +void +dtuple_gen_test_tuple3( +/*===================*/ + dtuple_t* tuple, /* in/out: a tuple with 3 fields */ + ulint i, /* in: a number < 1000000 */ + ulint type, /* in: DTUPLE_TEST_FIXED30, ... */ + byte* buf); /* in: a buffer of size >= 8 bytes */ +/******************************************************************* +Generates a test tuple for B-tree speed tests. */ + +void +dtuple_gen_search_tuple3( +/*=====================*/ + dtuple_t* tuple, /* in/out: a tuple with 1 or 2 fields */ + ulint i, /* in: a number < 1000000 */ + byte* buf); /* in: a buffer of size >= 8 bytes */ +/******************************************************************* +Generates a test tuple for TPC-A speed test. */ + +void +dtuple_gen_test_tuple_TPC_A( +/*========================*/ + dtuple_t* tuple, /* in/out: a tuple with >= 3 fields */ + ulint i, /* in: a number < 10000 */ + byte* buf); /* in: a buffer of size >= 16 bytes */ +/******************************************************************* +Generates a test tuple for B-tree speed tests. */ + +void +dtuple_gen_search_tuple_TPC_A( +/*==========================*/ + dtuple_t* tuple, /* in/out: a tuple with 1 field */ + ulint i, /* in: a number < 10000 */ + byte* buf); /* in: a buffer of size >= 16 bytes */ +/******************************************************************* +Generates a test tuple for TPC-C speed test. */ + +void +dtuple_gen_test_tuple_TPC_C( +/*========================*/ + dtuple_t* tuple, /* in/out: a tuple with >= 12 fields */ + ulint i, /* in: a number < 100000 */ + byte* buf); /* in: a buffer of size >= 16 bytes */ +/******************************************************************* +Generates a test tuple for B-tree speed tests. */ + +void +dtuple_gen_search_tuple_TPC_C( +/*==========================*/ + dtuple_t* tuple, /* in/out: a tuple with 1 field */ + ulint i, /* in: a number < 100000 */ + byte* buf); /* in: a buffer of size >= 16 bytes */ + +/* Types of the third field in dtuple_gen_test_tuple3 */ +#define DTUPLE_TEST_FIXED30 1 +#define DTUPLE_TEST_RND30 2 +#define DTUPLE_TEST_RND3500 3 +#define DTUPLE_TEST_FIXED2000 4 +#define DTUPLE_TEST_FIXED3 5 + +/*######################################################################*/ + +/* Structure for an SQL data field */ +struct dfield_struct{ + void* data; /* pointer to data */ + ulint len; /* data length; UNIV_SQL_NULL if SQL null */ + dtype_t type; /* type of data */ + ulint col_no; /* when building index entries, the column + number can be stored here */ +}; + +struct dtuple_struct { + ulint info_bits; /* info bits of an index record: + 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 */ + ulint magic_n; +}; +#define DATA_TUPLE_MAGIC_N 65478679 + +#ifndef UNIV_NONINL +#include "data0data.ic" +#endif + +#endif |