diff options
Diffstat (limited to 'innobase/include/row0mysql.h')
-rw-r--r-- | innobase/include/row0mysql.h | 359 |
1 files changed, 359 insertions, 0 deletions
diff --git a/innobase/include/row0mysql.h b/innobase/include/row0mysql.h new file mode 100644 index 00000000000..ee631bc02dc --- /dev/null +++ b/innobase/include/row0mysql.h @@ -0,0 +1,359 @@ +/****************************************************** +Interface between Innobase row operations and MySQL. +Contains also create table and other data dictionary operations. + +(c) 2000 Innobase Oy + +Created 9/17/2000 Heikki Tuuri +*******************************************************/ + +#ifndef row0mysql_h +#define row0mysql_h + +#include "univ.i" +#include "data0data.h" +#include "que0types.h" +#include "dict0types.h" +#include "trx0types.h" +#include "row0types.h" +#include "btr0pcur.h" +#include "trx0types.h" + +typedef struct row_prebuilt_struct row_prebuilt_t; + +/*********************************************************************** +Stores a variable-length field (like VARCHAR) length to dest, in the +MySQL format. */ +UNIV_INLINE +byte* +row_mysql_store_var_len( +/*====================*/ + /* out: dest + 2 */ + byte* dest, /* in: where to store */ + ulint len); /* in: length, must fit in two bytes */ +/*********************************************************************** +Reads a MySQL format variable-length field (like VARCHAR) length and +returns pointer to the field data. */ +UNIV_INLINE +byte* +row_mysql_read_var_ref( +/*===================*/ + /* out: field + 2 */ + ulint* len, /* out: variable-length field length */ + byte* field); /* in: field */ +/*********************************************************************** +Reads a MySQL format variable-length field (like VARCHAR) length and +returns pointer to the field data. */ + +byte* +row_mysql_read_var_ref_noninline( +/*=============================*/ + /* out: field + 2 */ + ulint* len, /* out: variable-length field length */ + byte* field); /* in: field */ +/*********************************************************************** +Stores a reference to a BLOB in the MySQL format. */ + +void +row_mysql_store_blob_ref( +/*=====================*/ + byte* dest, /* in: where to store */ + ulint col_len, /* in: dest buffer size: determines into + how many bytes the BLOB length is stored, + this may vary from 1 to 4 bytes */ + byte* data, /* in: BLOB data */ + ulint len); /* in: BLOB length */ +/*********************************************************************** +Reads a reference to a BLOB in the MySQL format. */ + +byte* +row_mysql_read_blob_ref( +/*====================*/ + /* out: pointer to BLOB data */ + ulint* len, /* out: BLOB length */ + byte* ref, /* in: BLOB reference in the MySQL format */ + ulint col_len); /* in: BLOB reference length (not BLOB + length) */ +/****************************************************************** +Stores a non-SQL-NULL field given in the MySQL format in the Innobase +format. */ +UNIV_INLINE +void +row_mysql_store_col_in_innobase_format( +/*===================================*/ + dfield_t* dfield, /* in/out: dfield */ + byte* buf, /* in/out: buffer for the converted + value */ + byte* mysql_data, /* in: MySQL column value, not + SQL NULL; NOTE that dfield may also + get a pointer to mysql_data, + therefore do not discard this as long + as dfield is used! */ + ulint col_len, /* in: MySQL column length */ + ulint type, /* in: data type */ + ulint is_unsigned); /* in: != 0 if unsigned integer type */ +/******************************************************************** +Handles user errors and lock waits detected by the database engine. */ + +ibool +row_mysql_handle_errors( +/*====================*/ + /* out: TRUE if it was a lock wait and + we should continue running the query thread */ + ulint* new_err,/* out: possible new error encountered in + rollback, or the old error which was + during the function entry */ + trx_t* trx, /* in: transaction */ + que_thr_t* thr, /* in: query thread */ + trx_savept_t* savept);/* in: savepoint */ +/************************************************************************ +Create a prebuilt struct for a MySQL table handle. */ + +row_prebuilt_t* +row_create_prebuilt( +/*================*/ + /* out, own: a prebuilt struct */ + dict_table_t* table); /* in: Innobase table handle */ +/************************************************************************ +Free a prebuilt struct for a MySQL table handle. */ + +void +row_prebuilt_free( +/*==============*/ + row_prebuilt_t* prebuilt); /* in, own: prebuilt struct */ +/************************************************************************* +Updates the transaction pointers in query graphs stored in the prebuilt +struct. */ + +void +row_update_prebuilt_trx( +/*====================*/ + /* out: prebuilt dtuple */ + row_prebuilt_t* prebuilt, /* in: prebuilt struct in MySQL + handle */ + trx_t* trx); /* in: transaction handle */ +/************************************************************************* +Does an insert for MySQL. */ + +int +row_insert_for_mysql( +/*=================*/ + /* out: error code or DB_SUCCESS */ + byte* mysql_rec, /* in: row in the MySQL format */ + row_prebuilt_t* prebuilt); /* in: prebuilt struct in MySQL + handle */ +/************************************************************************* +Builds a dummy query graph used in selects. */ + +void +row_prebuild_sel_graph( +/*===================*/ + row_prebuilt_t* prebuilt); /* in: prebuilt struct in MySQL + handle */ +/************************************************************************* +Gets pointer to a prebuilt update vector used in updates. If the update +graph has not yet been built in the prebuilt struct, then this function +first builds it. */ + +upd_t* +row_get_prebuilt_update_vector( +/*===========================*/ + /* out: prebuilt update vector */ + row_prebuilt_t* prebuilt); /* in: prebuilt struct in MySQL + handle */ +/************************************************************************* +Checks if a table is such that we automatically created a clustered +index on it (on row id). */ + +ibool +row_table_got_default_clust_index( +/*==============================*/ + dict_table_t* table); +/************************************************************************* +Does an update or delete of a row for MySQL. */ + +int +row_update_for_mysql( +/*=================*/ + /* out: error code or DB_SUCCESS */ + byte* mysql_rec, /* in: the row to be updated, in + the MySQL format */ + row_prebuilt_t* prebuilt); /* in: prebuilt struct in MySQL + handle */ +/************************************************************************* +Does a table creation operation for MySQL. */ + +int +row_create_table_for_mysql( +/*=======================*/ + /* out: error code or DB_SUCCESS */ + dict_table_t* table, /* in: table definition */ + trx_t* trx); /* in: transaction handle */ +/************************************************************************* +Does an index creation operation for MySQL. TODO: currently failure +to create an index results in dropping the whole table! This is no problem +currently as all indexes must be created at the same time as the table. */ + +int +row_create_index_for_mysql( +/*=======================*/ + /* out: error number or DB_SUCCESS */ + dict_index_t* index, /* in: index defintion */ + trx_t* trx); /* in: transaction handle */ +/************************************************************************* +Drops a table for MySQL. */ + +int +row_drop_table_for_mysql( +/*=====================*/ + /* out: error code or DB_SUCCESS */ + char* name, /* in: table name */ + trx_t* trx, /* in: transaction handle */ + ibool has_dict_mutex);/* in: TRUE if the caller already owns the + dictionary system mutex */ +/************************************************************************* +Renames a table for MySQL. */ + +int +row_rename_table_for_mysql( +/*=======================*/ + /* out: error code or DB_SUCCESS */ + char* old_name, /* in: old table name */ + char* new_name, /* in: new table name */ + trx_t* trx); /* in: transaction handle */ + +/* A struct describing a place for an individual column in the MySQL +row format which is presented to the table handler in ha_innobase. +This template struct is used to speed up row transformations between +Innobase and MySQL. */ + +typedef struct mysql_row_templ_struct mysql_row_templ_t; +struct mysql_row_templ_struct { + ulint col_no; /* column number of the column */ + ulint rec_field_no; /* field number of the column in an + Innobase record in the current index; + not defined if template_type is + ROW_MYSQL_WHOLE_ROW */ + ulint mysql_col_offset; /* offset of the column in the MySQL + row format */ + ulint mysql_col_len; /* length of the column in the MySQL + row format */ + ulint mysql_null_byte_offset; /* MySQL NULL bit byte offset in a + MySQL record */ + ulint mysql_null_bit_mask; /* bit mask to get the NULL bit, + zero if column cannot be NULL */ + ulint type; /* column type in Innobase mtype + numbers DATA_CHAR... */ + ulint is_unsigned; /* if a column type is an integer + type and this field is != 0, then + it is an unsigned integer type */ +}; + +#define MYSQL_FETCH_CACHE_SIZE 8 +/* After fetching this many rows, we start caching them in fetch_cache */ +#define MYSQL_FETCH_CACHE_THRESHOLD 4 + + +/* A struct for (sometimes lazily) prebuilt structures in an Innobase table +handle used within MySQL; these are used to save CPU time. */ + +struct row_prebuilt_struct { + dict_table_t* table; /* Innobase table handle */ + trx_t* trx; /* current transaction handle */ + ibool sql_stat_start; /* TRUE when we start processing of + an SQL statement: we may have to set + an intention lock on the table, + create a consistent read view etc. */ + ibool clust_index_was_generated; + /* if the user did not define a + primary key in MySQL, then Innobase + automatically generated a clustered + index where the ordering column is + the row id: in this case this flag + is set to TRUE */ + dict_index_t* index; /* current index for a search, if any */ + ulint template_type; /* ROW_MYSQL_WHOLE_ROW, + ROW_MYSQL_REC_FIELDS or + ROW_MYSQL_NO_TEMPLATE */ + ulint n_template; /* number of elements in the + template */ + ulint null_bitmap_len;/* number of bytes in the SQL NULL + bitmap at the start of a row in the + MySQL format */ + ibool need_to_access_clustered; /* if we are fetching + columns through a secondary index + and at least one column is not in + the secondary index, then this is + set to TRUE */ + ibool templ_contains_blob;/* TRUE if the template contains + BLOB column(s) */ + mysql_row_templ_t* mysql_template;/* template used to transform + rows fast between MySQL and Innobase + formats; memory for this template + is not allocated from 'heap' */ + mem_heap_t* heap; /* memory heap from which + these auxiliary structures are + allocated when needed */ + ins_node_t* ins_node; /* Innobase SQL insert node + used to perform inserts + to the table */ + byte* ins_upd_rec_buff;/* buffer for storing data converted + to the Innobase format from the MySQL + format */ + ibool in_update_remember_pos; + /* if an update is processed, then if + this flag is set to TRUE, it means + that the stored cursor position in + SELECT is the right position also + for the update: we can just restore + the cursor and save CPU time */ + upd_node_t* upd_node; /* Innobase SQL update node used + to perform updates and deletes */ + que_fork_t* ins_graph; /* Innobase SQL query graph used + in inserts */ + que_fork_t* upd_graph; /* Innobase SQL query graph used + in updates or deletes */ + btr_pcur_t* pcur; /* persistent cursor used in selects + and updates */ + btr_pcur_t* clust_pcur; /* persistent cursor used in + some selects and updates */ + que_fork_t* sel_graph; /* dummy query graph used in + selects */ + dtuple_t* search_tuple; /* prebuilt dtuple used in selects */ + byte row_id[DATA_ROW_ID_LEN]; + /* if the clustered index was generated, + the row id of the last row fetched is + stored here */ + dtuple_t* clust_ref; /* prebuilt dtuple used in + sel/upd/del */ + ulint select_lock_type;/* LOCK_NONE, LOCK_S, or LOCK_X */ + ulint mysql_row_len; /* length in bytes of a row in the + MySQL format */ + ulint n_rows_fetched; /* number of rows fetched after + positioning the current cursor */ + ulint fetch_direction;/* ROW_SEL_NEXT or ROW_SEL_PREV */ + byte* fetch_cache[MYSQL_FETCH_CACHE_SIZE]; + /* a cache for fetched rows if we + fetch many rows from the same cursor: + it saves CPU time to fetch them in a + batch; we reserve mysql_row_len + bytes for each such row */ + ulint fetch_cache_first;/* position of the first not yet + fetched row in fetch_cache */ + ulint n_fetch_cached; /* number of not yet fetched rows + in fetch_cache */ + mem_heap_t* blob_heap; /* in SELECTS BLOB fields are copied + to this heap */ + mem_heap_t* old_vers_heap; /* memory heap where a previous + version is built in consistent read */ +}; + +#define ROW_MYSQL_WHOLE_ROW 0 +#define ROW_MYSQL_REC_FIELDS 1 +#define ROW_MYSQL_NO_TEMPLATE 2 + +#ifndef UNIV_NONINL +#include "row0mysql.ic" +#endif + +#endif |