2009-05-27 15:15:59 +05:30
|
|
|
/*****************************************************************************
|
|
|
|
|
|
|
|
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
|
2013-06-10 22:29:41 +02:00
|
|
|
this program; if not, write to the Free Software Foundation, Inc.,
|
|
|
|
51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
2009-05-27 15:15:59 +05:30
|
|
|
|
|
|
|
*****************************************************************************/
|
|
|
|
|
|
|
|
/********************************************************************//**
|
|
|
|
@file include/data0data.ic
|
|
|
|
SQL data field and tuple
|
|
|
|
|
|
|
|
Created 5/30/1994 Heikki Tuuri
|
|
|
|
*************************************************************************/
|
|
|
|
|
|
|
|
#include "mem0mem.h"
|
|
|
|
#include "ut0rnd.h"
|
|
|
|
|
|
|
|
#ifdef UNIV_DEBUG
|
|
|
|
/** Dummy variable to catch access to uninitialized fields. In the
|
|
|
|
debug version, dtuple_create() will make all fields of dtuple_t point
|
|
|
|
to data_error. */
|
|
|
|
extern byte data_error;
|
|
|
|
|
|
|
|
/*********************************************************************//**
|
|
|
|
Gets pointer to the type struct of SQL data field.
|
|
|
|
@return pointer to the type struct */
|
|
|
|
UNIV_INLINE
|
|
|
|
dtype_t*
|
|
|
|
dfield_get_type(
|
|
|
|
/*============*/
|
|
|
|
const dfield_t* field) /*!< in: SQL data field */
|
|
|
|
{
|
|
|
|
ut_ad(field);
|
|
|
|
|
|
|
|
return((dtype_t*) &(field->type));
|
|
|
|
}
|
|
|
|
#endif /* UNIV_DEBUG */
|
|
|
|
|
|
|
|
/*********************************************************************//**
|
|
|
|
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 */
|
|
|
|
{
|
|
|
|
ut_ad(field && type);
|
|
|
|
|
|
|
|
field->type = *type;
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef UNIV_DEBUG
|
|
|
|
/*********************************************************************//**
|
|
|
|
Gets pointer to the data in a field.
|
|
|
|
@return pointer to data */
|
|
|
|
UNIV_INLINE
|
|
|
|
void*
|
|
|
|
dfield_get_data(
|
|
|
|
/*============*/
|
|
|
|
const dfield_t* field) /*!< in: field */
|
|
|
|
{
|
|
|
|
ut_ad(field);
|
|
|
|
ut_ad((field->len == UNIV_SQL_NULL)
|
|
|
|
|| (field->data != &data_error));
|
|
|
|
|
|
|
|
return((void*) field->data);
|
|
|
|
}
|
|
|
|
#endif /* UNIV_DEBUG */
|
|
|
|
|
|
|
|
/*********************************************************************//**
|
|
|
|
Gets length of field data.
|
|
|
|
@return length of data; UNIV_SQL_NULL if SQL null data */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dfield_get_len(
|
|
|
|
/*===========*/
|
|
|
|
const dfield_t* field) /*!< in: field */
|
|
|
|
{
|
|
|
|
ut_ad(field);
|
|
|
|
ut_ad((field->len == UNIV_SQL_NULL)
|
|
|
|
|| (field->data != &data_error));
|
|
|
|
|
|
|
|
return(field->len);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************//**
|
|
|
|
Sets length in a field. */
|
|
|
|
UNIV_INLINE
|
|
|
|
void
|
|
|
|
dfield_set_len(
|
|
|
|
/*===========*/
|
|
|
|
dfield_t* field, /*!< in: field */
|
|
|
|
ulint len) /*!< in: length or UNIV_SQL_NULL */
|
|
|
|
{
|
|
|
|
ut_ad(field);
|
|
|
|
#ifdef UNIV_VALGRIND_DEBUG
|
|
|
|
if (len != UNIV_SQL_NULL) UNIV_MEM_ASSERT_RW(field->data, len);
|
|
|
|
#endif /* UNIV_VALGRIND_DEBUG */
|
|
|
|
|
|
|
|
field->ext = 0;
|
|
|
|
field->len = len;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************//**
|
|
|
|
Determines if a field is SQL NULL
|
|
|
|
@return nonzero if SQL null data */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dfield_is_null(
|
|
|
|
/*===========*/
|
|
|
|
const dfield_t* field) /*!< in: field */
|
|
|
|
{
|
|
|
|
ut_ad(field);
|
|
|
|
|
|
|
|
return(field->len == UNIV_SQL_NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************//**
|
|
|
|
Determines if a field is externally stored
|
|
|
|
@return nonzero if externally stored */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dfield_is_ext(
|
|
|
|
/*==========*/
|
|
|
|
const dfield_t* field) /*!< in: field */
|
|
|
|
{
|
|
|
|
ut_ad(field);
|
|
|
|
|
|
|
|
return(UNIV_UNLIKELY(field->ext));
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************//**
|
|
|
|
Sets the "external storage" flag */
|
|
|
|
UNIV_INLINE
|
|
|
|
void
|
|
|
|
dfield_set_ext(
|
|
|
|
/*===========*/
|
|
|
|
dfield_t* field) /*!< in/out: field */
|
|
|
|
{
|
|
|
|
ut_ad(field);
|
|
|
|
|
|
|
|
field->ext = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************//**
|
|
|
|
Sets pointer to the data and length in a field. */
|
|
|
|
UNIV_INLINE
|
|
|
|
void
|
|
|
|
dfield_set_data(
|
|
|
|
/*============*/
|
|
|
|
dfield_t* field, /*!< in: field */
|
|
|
|
const void* data, /*!< in: data */
|
|
|
|
ulint len) /*!< in: length or UNIV_SQL_NULL */
|
|
|
|
{
|
|
|
|
ut_ad(field);
|
|
|
|
|
|
|
|
#ifdef UNIV_VALGRIND_DEBUG
|
|
|
|
if (len != UNIV_SQL_NULL) UNIV_MEM_ASSERT_RW(data, len);
|
|
|
|
#endif /* UNIV_VALGRIND_DEBUG */
|
|
|
|
field->data = (void*) data;
|
|
|
|
field->ext = 0;
|
|
|
|
field->len = len;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************//**
|
|
|
|
Sets a data field to SQL NULL. */
|
|
|
|
UNIV_INLINE
|
|
|
|
void
|
|
|
|
dfield_set_null(
|
|
|
|
/*============*/
|
|
|
|
dfield_t* field) /*!< in/out: field */
|
|
|
|
{
|
|
|
|
dfield_set_data(field, NULL, UNIV_SQL_NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************//**
|
|
|
|
Copies the data and len fields. */
|
|
|
|
UNIV_INLINE
|
|
|
|
void
|
|
|
|
dfield_copy_data(
|
|
|
|
/*=============*/
|
|
|
|
dfield_t* field1, /*!< out: field to copy to */
|
|
|
|
const dfield_t* field2) /*!< in: field to copy from */
|
|
|
|
{
|
|
|
|
ut_ad(field1 && field2);
|
|
|
|
|
|
|
|
field1->data = field2->data;
|
|
|
|
field1->len = field2->len;
|
|
|
|
field1->ext = field2->ext;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************//**
|
|
|
|
Copies a data field to another. */
|
|
|
|
UNIV_INLINE
|
|
|
|
void
|
|
|
|
dfield_copy(
|
|
|
|
/*========*/
|
|
|
|
dfield_t* field1, /*!< out: field to copy to */
|
|
|
|
const dfield_t* field2) /*!< in: field to copy from */
|
|
|
|
{
|
|
|
|
*field1 = *field2;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************//**
|
|
|
|
Copies the data pointed to by a data field. */
|
|
|
|
UNIV_INLINE
|
|
|
|
void
|
|
|
|
dfield_dup(
|
|
|
|
/*=======*/
|
|
|
|
dfield_t* field, /*!< in/out: data field */
|
|
|
|
mem_heap_t* heap) /*!< in: memory heap where allocated */
|
|
|
|
{
|
|
|
|
if (!dfield_is_null(field)) {
|
|
|
|
UNIV_MEM_ASSERT_RW(field->data, field->len);
|
|
|
|
field->data = mem_heap_dup(heap, field->data, field->len);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************//**
|
2010-12-21 14:05:10 +02:00
|
|
|
Tests if two data fields are equal.
|
|
|
|
If len==0, tests the data length and content for equality.
|
|
|
|
If len>0, tests the first len bytes of the content for equality.
|
|
|
|
@return TRUE if both fields are NULL or if they are equal */
|
2009-05-27 15:15:59 +05:30
|
|
|
UNIV_INLINE
|
|
|
|
ibool
|
|
|
|
dfield_datas_are_binary_equal(
|
|
|
|
/*==========================*/
|
|
|
|
const dfield_t* field1, /*!< in: field */
|
2010-12-21 14:05:10 +02:00
|
|
|
const dfield_t* field2, /*!< in: field */
|
|
|
|
ulint len) /*!< in: maximum prefix to compare,
|
|
|
|
or 0 to compare the whole field length */
|
2009-05-27 15:15:59 +05:30
|
|
|
{
|
2010-12-21 14:05:10 +02:00
|
|
|
ulint len2 = len;
|
2009-05-27 15:15:59 +05:30
|
|
|
|
2010-12-21 14:05:10 +02:00
|
|
|
if (field1->len == UNIV_SQL_NULL || len == 0 || field1->len < len) {
|
|
|
|
len = field1->len;
|
|
|
|
}
|
Applied innodb-5.1-ss269 snapshot.
Fixed BUGS:
#3300: "UPDATE statement with no index column in where condition locks
all rows"
Implement semi-consistent read to reduce lock conflicts at the cost
of breaking serializability.
ha_innobase::unlock_row(): reset the "did semi consistent read" flag
ha_innobase::was_semi_consistent_read(),
ha_innobase::try_semi_consistent_read(): new methods
row_prebuilt_t, row_create_prebuilt(): add field row_read_type for
keeping track of semi-consistent reads
row_vers_build_for_semi_consistent_read(),
row_sel_build_committed_vers_for_mysql(): new functions
row_search_for_mysql(): implement semi-consistent reads
#9802: "Foreign key checks disallow alter table".
Added test cases.
#12456: "Cursor shows incorrect data - DML does not affect,
probably caching"
This patch implements a high-granularity read view to be used with
cursors. In this high-granularity consistent read view modifications
done by the creating transaction after the cursor is created or
future transactions are not visible. But those modifications that
transaction did before the cursor was created are visible.
#12701: "Support >4GB buffer pool and log files on 64-bit Windows"
Do not call os_file_create_tmpfile() at runtime. Instead, create all
tempfiles at startup and guard access to them with mutexes.
#13778: "If FOREIGN_KEY_CHECKS=0, one can create inconsistent FOREIGN KEYs".
When FOREIGN_KEY_CHECKS=0 we still need to check that datatypes between
foreign key references are compatible.
#14189: "VARBINARY and BINARY variables: trailing space ignored with InnoDB"
innobase_init(): Assert that
DATA_MYSQL_BINARY_CHARSET_COLL == my_charset_bin.number.
dtype_get_pad_char(): Do not pad VARBINARY or BINARY columns.
row_ins_cascade_calc_update_vec(): Refuse ON UPDATE CASCADE when trying
to change the length of a VARBINARY column that refers to or is referenced
by a BINARY column. BINARY columns are no longer padded on comparison,
and thus they cannot be padded on storage either.
#14747: "Race condition can cause btr_search_drop_page_hash_index() to crash"
Note that buf_block_t::index should be protected by btr_search_latch
or an s-latch or x-latch on the index page.
btr_search_drop_page_hash_index(): Read block->index while holding
btr_search_latch and use the cached value in the loop. Remove some
redundant assertions.
#15108: "mysqld crashes when innodb_log_file_size is set > 4G"
#15308: "Problem of Order with Enum Column in Primary Key"
#15550: "mysqld crashes in printing a FOREIGN KEY error in InnoDB"
row_ins_foreign_report_add_err(): When printing the parent record,
use the index in the parent table rather than the index in the child table.
#15653: "Slow inserts to InnoDB if many thousands of .ibd files"
Keep track on unflushed modifications to file spaces. When there are tens
of thousands of file spaces, flushing all files in fil_flush_file_spaces()
would be very slow.
fil_flush_file_spaces(): Only flush unflushed file spaces.
fil_space_t, fil_system_t: Add a list of unflushed spaces.
#15991: "innodb-file-per-table + symlink database + rename = cr"
os_file_handle_error(): Map the error codes EXDEV, ENOTDIR, and EISDIR
to the new code OS_FILE_PATH_ERROR. Treat this code as OS_FILE_PATH_ERROR.
This fixes the crash on RENAME TABLE when the .ibd file is a symbolic link
to a different file system.
#16157: "InnoDB crashes when main location settings are empty"
This patch is from Heikki.
#16298: "InnoDB segfaults in INSERTs in upgrade of 4.0 -> 5.0 tables
with VARCHAR BINARY"
dict_load_columns(): Set the charset-collation code
DATA_MYSQL_BINARY_CHARSET_COLL for those binary string columns
that lack a charset-collation code, i.e., the tables were created
with an older version of MySQL/InnoDB than 4.1.2.
#16229: "MySQL/InnoDB uses full explicit table locks in trigger processing"
Take a InnoDB table lock only if user has explicitly requested a table
lock. Added some additional comments to store_lock() and external_lock().
#16387: "InnoDB crash when dropping a foreign key <table>_ibfk_0"
Do not mistake TABLENAME_ibfk_0 for auto-generated id.
dict_table_get_highest_foreign_id(): Ignore foreign constraint
identifiers starting with the pattern TABLENAME_ibfk_0.
#16582: "InnoDB: Error in an adaptive hash index pointer to page"
Account for a race condition when dropping the adaptive hash index
for a B-tree page.
btr_search_drop_page_hash_index(): Retry the operation if a hash index
with different parameters was built meanwhile. Add diagnostics for the
case that hash node pointers to the page remain.
btr_search_info_update_hash(), btr_search_info_update_slow():
Document the parameter "info" as in/out.
#16814: "SHOW INNODB STATUS format error in LATEST FOREIGN KEY ERROR
section"
Add a missing newline to the LAST FOREIGN KEY ERROR section in SHOW
INNODB STATUS output.
dict_foreign_error_report(): Always print a newline after invoking
dict_print_info_on_foreign_key_in_create_format().
#16827: "Better InnoDB error message if ibdata files omitted from my.cnf"
#17126: "CHECK TABLE on InnoDB causes a short hang during check of adaptive
hash"
CHECK TABLE blocking other queries, by releasing the btr_search_latch
periodically during the adaptive hash table validation.
#17405: "Valgrind: conditional jump or move depends on unititialised values"
buf_block_init(): Reset magic_n, buf_fix_count and io_fix to avoid
testing uninitialized variables.
mysql-test/r/innodb.result:
Applied innodb-5.1-ss269 snapshot.
mysql-test/t/innodb.test:
Applied innodb-5.1-ss269 snapshot.
sql/ha_innodb.cc:
Applied innodb-5.1-ss269 snapshot.
sql/ha_innodb.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/btr/btr0btr.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/btr/btr0cur.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/btr/btr0pcur.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/btr/btr0sea.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/buf/buf0buf.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/buf/buf0flu.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/buf/buf0lru.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/buf/buf0rea.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/data/data0data.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/data/data0type.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/dict/dict0boot.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/dict/dict0crea.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/dict/dict0dict.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/dict/dict0load.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/dict/dict0mem.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/dyn/dyn0dyn.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/eval/eval0eval.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/eval/eval0proc.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/fil/fil0fil.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/fsp/fsp0fsp.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/fut/fut0lst.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/ha/ha0ha.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/ha/hash0hash.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/ibuf/ibuf0ibuf.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/btr0btr.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/btr0btr.ic:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/btr0cur.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/btr0cur.ic:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/btr0pcur.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/btr0pcur.ic:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/btr0sea.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/btr0sea.ic:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/btr0types.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/buf0buf.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/buf0buf.ic:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/buf0flu.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/buf0flu.ic:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/buf0lru.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/data0data.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/data0data.ic:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/data0type.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/data0type.ic:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/db0err.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/dict0boot.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/dict0boot.ic:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/dict0crea.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/dict0dict.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/dict0dict.ic:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/dict0load.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/dict0mem.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/dyn0dyn.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/dyn0dyn.ic:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/eval0eval.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/eval0eval.ic:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/eval0proc.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/eval0proc.ic:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/fil0fil.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/fsp0fsp.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/fut0lst.ic:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/ha0ha.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/hash0hash.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/hash0hash.ic:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/ibuf0ibuf.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/ibuf0ibuf.ic:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/lock0lock.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/lock0types.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/log0log.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/log0log.ic:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/log0recv.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/mach0data.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/mach0data.ic:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/mem0dbg.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/mem0dbg.ic:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/mem0mem.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/mem0mem.ic:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/mem0pool.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/mtr0log.ic:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/mtr0mtr.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/mtr0mtr.ic:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/os0file.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/os0proc.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/os0sync.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/os0sync.ic:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/os0thread.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/page0cur.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/page0cur.ic:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/page0page.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/page0page.ic:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/page0types.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/pars0grm.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/pars0opt.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/pars0pars.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/pars0sym.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/pars0types.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/que0que.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/que0que.ic:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/que0types.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/read0read.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/read0read.ic:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/rem0cmp.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/rem0cmp.ic:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/rem0rec.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/rem0rec.ic:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/row0ins.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/row0mysql.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/row0purge.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/row0row.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/row0row.ic:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/row0sel.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/row0sel.ic:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/row0types.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/row0uins.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/row0umod.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/row0undo.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/row0upd.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/row0upd.ic:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/row0vers.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/srv0srv.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/srv0start.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/sync0arr.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/sync0rw.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/sync0rw.ic:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/sync0sync.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/sync0sync.ic:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/trx0purge.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/trx0purge.ic:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/trx0rec.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/trx0roll.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/trx0rseg.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/trx0rseg.ic:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/trx0sys.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/trx0sys.ic:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/trx0trx.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/trx0trx.ic:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/trx0types.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/trx0undo.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/trx0undo.ic:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/trx0xa.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/univ.i:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/usr0sess.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/usr0types.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/ut0byte.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/ut0byte.ic:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/ut0dbg.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/ut0lst.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/ut0mem.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/ut0mem.ic:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/ut0rnd.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/ut0rnd.ic:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/ut0sort.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/ut0ut.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/include/ut0ut.ic:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/lock/lock0lock.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/log/log0log.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/log/log0recv.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/mach/mach0data.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/mem/mem0dbg.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/mem/mem0mem.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/mem/mem0pool.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/mtr/mtr0log.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/mtr/mtr0mtr.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/os/os0file.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/os/os0proc.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/os/os0sync.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/os/os0thread.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/page/page0cur.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/page/page0page.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/pars/lexyy.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/pars/pars0grm.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/pars/pars0grm.h:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/pars/pars0grm.y:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/pars/pars0lex.l:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/pars/pars0opt.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/pars/pars0pars.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/pars/pars0sym.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/que/que0que.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/read/read0read.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/rem/rem0cmp.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/rem/rem0rec.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/row/row0ins.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/row/row0mysql.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/row/row0purge.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/row/row0row.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/row/row0sel.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/row/row0uins.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/row/row0umod.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/row/row0undo.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/row/row0upd.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/row/row0vers.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/srv/srv0que.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/srv/srv0srv.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/srv/srv0start.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/sync/sync0arr.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/sync/sync0rw.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/sync/sync0sync.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/thr/thr0loc.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/trx/trx0purge.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/trx/trx0rec.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/trx/trx0roll.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/trx/trx0rseg.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/trx/trx0sys.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/trx/trx0trx.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/trx/trx0undo.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/usr/usr0sess.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/ut/ut0byte.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/ut/ut0dbg.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/ut/ut0mem.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/ut/ut0rnd.c:
Applied innodb-5.1-ss269 snapshot.
storage/innobase/ut/ut0ut.c:
Applied innodb-5.1-ss269 snapshot.
mysql-test/r/innodb_unsafe_binlog.result:
New BitKeeper file ``mysql-test/r/innodb_unsafe_binlog.result''
mysql-test/t/innodb_unsafe_binlog-master.opt:
New BitKeeper file ``mysql-test/t/innodb_unsafe_binlog-master.opt''
mysql-test/t/innodb_unsafe_binlog.test:
New BitKeeper file ``mysql-test/t/innodb_unsafe_binlog.test''
storage/innobase/pars/make_bison.sh:
New BitKeeper file ``storage/innobase/pars/make_bison.sh''
2006-03-10 19:22:21 +03:00
|
|
|
|
2010-12-21 14:05:10 +02:00
|
|
|
if (field2->len == UNIV_SQL_NULL || len2 == 0 || field2->len < len2) {
|
|
|
|
len2 = field2->len;
|
2001-02-17 14:19:19 +02:00
|
|
|
}
|
2009-05-27 15:15:59 +05:30
|
|
|
|
2010-12-21 14:05:10 +02:00
|
|
|
return(len == len2
|
2009-05-27 15:15:59 +05:30
|
|
|
&& (len == UNIV_SQL_NULL
|
|
|
|
|| !memcmp(field1->data, field2->data, len)));
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************//**
|
|
|
|
Gets info bits in a data tuple.
|
|
|
|
@return info bits */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dtuple_get_info_bits(
|
|
|
|
/*=================*/
|
|
|
|
const dtuple_t* tuple) /*!< in: tuple */
|
|
|
|
{
|
|
|
|
ut_ad(tuple);
|
|
|
|
|
|
|
|
return(tuple->info_bits);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************//**
|
|
|
|
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 */
|
|
|
|
{
|
|
|
|
ut_ad(tuple);
|
|
|
|
|
|
|
|
tuple->info_bits = info_bits;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************//**
|
|
|
|
Gets number of fields used in record comparisons.
|
|
|
|
@return number of fields used in comparisons in rem0cmp.* */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dtuple_get_n_fields_cmp(
|
|
|
|
/*====================*/
|
|
|
|
const dtuple_t* tuple) /*!< in: tuple */
|
|
|
|
{
|
|
|
|
ut_ad(tuple);
|
|
|
|
|
|
|
|
return(tuple->n_fields_cmp);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************//**
|
|
|
|
Sets 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.* */
|
|
|
|
{
|
|
|
|
ut_ad(tuple);
|
|
|
|
ut_ad(n_fields_cmp <= tuple->n_fields);
|
|
|
|
|
|
|
|
tuple->n_fields_cmp = n_fields_cmp;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************//**
|
|
|
|
Gets number of fields in a data tuple.
|
|
|
|
@return number of fields */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dtuple_get_n_fields(
|
|
|
|
/*================*/
|
|
|
|
const dtuple_t* tuple) /*!< in: tuple */
|
|
|
|
{
|
|
|
|
ut_ad(tuple);
|
|
|
|
|
|
|
|
return(tuple->n_fields);
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef UNIV_DEBUG
|
|
|
|
/*********************************************************************//**
|
|
|
|
Gets nth field of a tuple.
|
|
|
|
@return nth field */
|
|
|
|
UNIV_INLINE
|
|
|
|
dfield_t*
|
|
|
|
dtuple_get_nth_field(
|
|
|
|
/*=================*/
|
|
|
|
const dtuple_t* tuple, /*!< in: tuple */
|
|
|
|
ulint n) /*!< in: index of field */
|
|
|
|
{
|
|
|
|
ut_ad(tuple);
|
|
|
|
ut_ad(n < tuple->n_fields);
|
|
|
|
|
|
|
|
return((dfield_t*) tuple->fields + n);
|
|
|
|
}
|
|
|
|
#endif /* UNIV_DEBUG */
|
|
|
|
|
|
|
|
/**********************************************************//**
|
2011-12-29 16:14:45 +02:00
|
|
|
Creates a data tuple from an already allocated chunk of memory.
|
|
|
|
The size of the chunk must be at least DTUPLE_EST_ALLOC(n_fields).
|
|
|
|
The default value for number of fields used in record comparisons
|
|
|
|
for this tuple is n_fields.
|
|
|
|
@return created tuple (inside buf) */
|
2009-05-27 15:15:59 +05:30
|
|
|
UNIV_INLINE
|
|
|
|
dtuple_t*
|
2011-12-29 16:14:45 +02:00
|
|
|
dtuple_create_from_mem(
|
|
|
|
/*===================*/
|
|
|
|
void* buf, /*!< in, out: buffer to use */
|
|
|
|
ulint buf_size, /*!< in: buffer size */
|
|
|
|
ulint n_fields) /*!< in: number of fields */
|
2009-05-27 15:15:59 +05:30
|
|
|
{
|
|
|
|
dtuple_t* tuple;
|
|
|
|
|
2011-12-29 16:14:45 +02:00
|
|
|
ut_ad(buf != NULL);
|
|
|
|
ut_a(buf_size >= DTUPLE_EST_ALLOC(n_fields));
|
2009-05-27 15:15:59 +05:30
|
|
|
|
2011-12-29 16:14:45 +02:00
|
|
|
tuple = (dtuple_t*) buf;
|
2009-05-27 15:15:59 +05:30
|
|
|
tuple->info_bits = 0;
|
|
|
|
tuple->n_fields = n_fields;
|
|
|
|
tuple->n_fields_cmp = n_fields;
|
|
|
|
tuple->fields = (dfield_t*) &tuple[1];
|
|
|
|
|
|
|
|
#ifdef UNIV_DEBUG
|
|
|
|
tuple->magic_n = DATA_TUPLE_MAGIC_N;
|
|
|
|
|
|
|
|
{ /* In the debug version, initialize fields to an error value */
|
|
|
|
ulint i;
|
|
|
|
|
|
|
|
for (i = 0; i < n_fields; i++) {
|
|
|
|
dfield_t* field;
|
|
|
|
|
|
|
|
field = dtuple_get_nth_field(tuple, i);
|
|
|
|
|
|
|
|
dfield_set_len(field, UNIV_SQL_NULL);
|
|
|
|
field->data = &data_error;
|
|
|
|
dfield_get_type(field)->mtype = DATA_ERROR;
|
|
|
|
}
|
|
|
|
}
|
2011-12-29 16:14:45 +02:00
|
|
|
#endif
|
|
|
|
return(tuple);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**********************************************************//**
|
|
|
|
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.
|
|
|
|
@return own: created tuple */
|
|
|
|
UNIV_INLINE
|
|
|
|
dtuple_t*
|
|
|
|
dtuple_create(
|
|
|
|
/*==========*/
|
|
|
|
mem_heap_t* heap, /*!< in: memory heap where the tuple
|
|
|
|
is created, DTUPLE_EST_ALLOC(n_fields)
|
|
|
|
bytes will be allocated from this heap */
|
|
|
|
ulint n_fields) /*!< in: number of fields */
|
|
|
|
{
|
|
|
|
void* buf;
|
|
|
|
ulint buf_size;
|
|
|
|
dtuple_t* tuple;
|
|
|
|
|
|
|
|
ut_ad(heap);
|
2009-05-27 15:15:59 +05:30
|
|
|
|
2011-12-29 16:14:45 +02:00
|
|
|
buf_size = DTUPLE_EST_ALLOC(n_fields);
|
|
|
|
buf = mem_heap_alloc(heap, buf_size);
|
|
|
|
|
|
|
|
tuple = dtuple_create_from_mem(buf, buf_size, n_fields);
|
|
|
|
|
|
|
|
#ifdef UNIV_DEBUG
|
2009-05-27 15:15:59 +05:30
|
|
|
UNIV_MEM_INVALID(tuple->fields, n_fields * sizeof *tuple->fields);
|
|
|
|
#endif
|
2011-12-29 16:14:45 +02:00
|
|
|
|
2009-05-27 15:15:59 +05:30
|
|
|
return(tuple);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**********************************************************//**
|
|
|
|
Wrap data fields in a tuple. The default value for number
|
|
|
|
of fields used in record comparisons for this tuple is n_fields.
|
|
|
|
@return data tuple */
|
|
|
|
UNIV_INLINE
|
|
|
|
const dtuple_t*
|
|
|
|
dtuple_from_fields(
|
|
|
|
/*===============*/
|
|
|
|
dtuple_t* tuple, /*!< in: storage for data tuple */
|
|
|
|
const dfield_t* fields, /*!< in: fields */
|
|
|
|
ulint n_fields) /*!< in: number of fields */
|
|
|
|
{
|
|
|
|
tuple->info_bits = 0;
|
|
|
|
tuple->n_fields = tuple->n_fields_cmp = n_fields;
|
|
|
|
tuple->fields = (dfield_t*) fields;
|
|
|
|
ut_d(tuple->magic_n = DATA_TUPLE_MAGIC_N);
|
|
|
|
|
|
|
|
return(tuple);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************//**
|
|
|
|
Copies a data tuple to another. This is a shallow copy; if a deep copy
|
|
|
|
is desired, dfield_dup() will have to be invoked on each field.
|
|
|
|
@return own: copy of tuple */
|
|
|
|
UNIV_INLINE
|
|
|
|
dtuple_t*
|
|
|
|
dtuple_copy(
|
|
|
|
/*========*/
|
|
|
|
const dtuple_t* tuple, /*!< in: tuple to copy from */
|
|
|
|
mem_heap_t* heap) /*!< in: memory heap
|
|
|
|
where the tuple is created */
|
|
|
|
{
|
|
|
|
ulint n_fields = dtuple_get_n_fields(tuple);
|
|
|
|
dtuple_t* new_tuple = dtuple_create(heap, n_fields);
|
|
|
|
ulint i;
|
|
|
|
|
|
|
|
for (i = 0; i < n_fields; i++) {
|
|
|
|
dfield_copy(dtuple_get_nth_field(new_tuple, i),
|
|
|
|
dtuple_get_nth_field(tuple, i));
|
|
|
|
}
|
|
|
|
|
|
|
|
return(new_tuple);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**********************************************************//**
|
|
|
|
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. Neither
|
|
|
|
is possible space in externally stored parts of the field.
|
|
|
|
@return sum of data lengths */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dtuple_get_data_size(
|
|
|
|
/*=================*/
|
|
|
|
const dtuple_t* tuple, /*!< in: typed data tuple */
|
|
|
|
ulint comp) /*!< in: nonzero=ROW_FORMAT=COMPACT */
|
|
|
|
{
|
|
|
|
const dfield_t* field;
|
|
|
|
ulint n_fields;
|
|
|
|
ulint len;
|
|
|
|
ulint i;
|
|
|
|
ulint sum = 0;
|
|
|
|
|
|
|
|
ut_ad(tuple);
|
|
|
|
ut_ad(dtuple_check_typed(tuple));
|
|
|
|
ut_ad(tuple->magic_n == DATA_TUPLE_MAGIC_N);
|
|
|
|
|
|
|
|
n_fields = tuple->n_fields;
|
|
|
|
|
|
|
|
for (i = 0; i < n_fields; i++) {
|
|
|
|
field = dtuple_get_nth_field(tuple, i);
|
|
|
|
len = dfield_get_len(field);
|
|
|
|
|
|
|
|
if (len == UNIV_SQL_NULL) {
|
|
|
|
len = dtype_get_sql_null_size(dfield_get_type(field),
|
|
|
|
comp);
|
|
|
|
}
|
|
|
|
|
|
|
|
sum += len;
|
|
|
|
}
|
|
|
|
|
|
|
|
return(sum);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************//**
|
|
|
|
Computes the number of externally stored fields in a data tuple.
|
|
|
|
@return number of externally stored fields */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dtuple_get_n_ext(
|
|
|
|
/*=============*/
|
|
|
|
const dtuple_t* tuple) /*!< in: tuple */
|
|
|
|
{
|
|
|
|
ulint n_ext = 0;
|
|
|
|
ulint n_fields = tuple->n_fields;
|
|
|
|
ulint i;
|
|
|
|
|
|
|
|
ut_ad(tuple);
|
|
|
|
ut_ad(dtuple_check_typed(tuple));
|
|
|
|
ut_ad(tuple->magic_n == DATA_TUPLE_MAGIC_N);
|
|
|
|
|
|
|
|
for (i = 0; i < n_fields; i++) {
|
|
|
|
n_ext += dtuple_get_nth_field(tuple, i)->ext;
|
|
|
|
}
|
|
|
|
|
|
|
|
return(n_ext);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*******************************************************************//**
|
|
|
|
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 */
|
|
|
|
{
|
|
|
|
dtype_t* dfield_type;
|
|
|
|
ulint i;
|
|
|
|
|
|
|
|
for (i = 0; i < n; i++) {
|
|
|
|
dfield_type = dfield_get_type(dtuple_get_nth_field(tuple, i));
|
|
|
|
dtype_set(dfield_type, DATA_BINARY, 0, 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/************************************************************//**
|
|
|
|
Folds a prefix given as the number of fields of a tuple.
|
|
|
|
@return the folded value */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dtuple_fold(
|
|
|
|
/*========*/
|
|
|
|
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
|
|
|
|
incomplete last field */
|
2010-06-23 14:06:59 +03:00
|
|
|
index_id_t tree_id)/*!< in: index tree id */
|
2009-05-27 15:15:59 +05:30
|
|
|
{
|
|
|
|
const dfield_t* field;
|
|
|
|
ulint i;
|
|
|
|
const byte* data;
|
|
|
|
ulint len;
|
|
|
|
ulint fold;
|
|
|
|
|
|
|
|
ut_ad(tuple);
|
|
|
|
ut_ad(tuple->magic_n == DATA_TUPLE_MAGIC_N);
|
|
|
|
ut_ad(dtuple_check_typed(tuple));
|
|
|
|
|
2010-06-23 14:06:59 +03:00
|
|
|
fold = ut_fold_ull(tree_id);
|
2009-05-27 15:15:59 +05:30
|
|
|
|
|
|
|
for (i = 0; i < n_fields; i++) {
|
|
|
|
field = dtuple_get_nth_field(tuple, i);
|
|
|
|
|
|
|
|
data = (const byte*) dfield_get_data(field);
|
|
|
|
len = dfield_get_len(field);
|
|
|
|
|
|
|
|
if (len != UNIV_SQL_NULL) {
|
|
|
|
fold = ut_fold_ulint_pair(fold,
|
|
|
|
ut_fold_binary(data, len));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (n_bytes > 0) {
|
|
|
|
field = dtuple_get_nth_field(tuple, i);
|
|
|
|
|
|
|
|
data = (const byte*) dfield_get_data(field);
|
|
|
|
len = dfield_get_len(field);
|
|
|
|
|
|
|
|
if (len != UNIV_SQL_NULL) {
|
|
|
|
if (len > n_bytes) {
|
|
|
|
len = n_bytes;
|
|
|
|
}
|
|
|
|
|
|
|
|
fold = ut_fold_ulint_pair(fold,
|
|
|
|
ut_fold_binary(data, len));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return(fold);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**********************************************************************//**
|
|
|
|
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 */
|
|
|
|
{
|
|
|
|
memset(data, 0, len);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**********************************************************************//**
|
|
|
|
Checks if a dtuple contains an SQL null value.
|
|
|
|
@return TRUE if some field is SQL null */
|
|
|
|
UNIV_INLINE
|
|
|
|
ibool
|
|
|
|
dtuple_contains_null(
|
|
|
|
/*=================*/
|
|
|
|
const dtuple_t* tuple) /*!< in: dtuple */
|
|
|
|
{
|
|
|
|
ulint n;
|
|
|
|
ulint i;
|
|
|
|
|
|
|
|
n = dtuple_get_n_fields(tuple);
|
|
|
|
|
|
|
|
for (i = 0; i < n; i++) {
|
|
|
|
if (dfield_is_null(dtuple_get_nth_field(tuple, i))) {
|
|
|
|
|
|
|
|
return(TRUE);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return(FALSE);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**************************************************************//**
|
|
|
|
Frees the memory in a big rec vector. */
|
|
|
|
UNIV_INLINE
|
|
|
|
void
|
|
|
|
dtuple_big_rec_free(
|
|
|
|
/*================*/
|
|
|
|
big_rec_t* vector) /*!< in, own: big rec vector; it is
|
|
|
|
freed in this function */
|
|
|
|
{
|
|
|
|
mem_heap_free(vector->heap);
|
|
|
|
}
|