mariadb/include/data0type.ic
mmakela d08cd430ba branches/innodb+: Merge revisions 6853:6897 from branches/zip:
Skip r6860, which was merged from branches/innodb+ to branches/zip,
and r6857, which is only applicable to branches/zip.
  ------------------------------------------------------------------------
  r6858 | mmakela | 2010-03-23 14:09:24 +0200 (Tue, 23 Mar 2010) | 1 line
  Changed paths:
     M /branches/zip/handler/ha_innodb.cc

  branches/zip: innodb_read_ahead_threshold: Add missing space to help string.
  ------------------------------------------------------------------------
  r6861 | vdimov | 2010-03-23 19:31:02 +0200 (Tue, 23 Mar 2010) | 36 lines
  Changed paths:
     M /branches/zip/trx/trx0i_s.c

  branches/zip:

  Merge joerg@mysql.com-20100322150231-vdq0afbqtmbs6phy from BZR,

  Including univ.i before mysql/plugin.h is needed to avoid this
  compiler error:

  o  This is how gcc puts it:
  o  > > ccache /usr/local/gcc-4.3.2/bin/gcc -static-libgcc -DHAVE_CONFIG_H -I. -I../../include -I../../include -I../../include -I../../regex -I./include -I../../sql -I. -I../../zlib    -g -O3 -march=i686   -DUNIV_LINUX -MT libinnobase_a-trx0i_s.o -MD -MP -MF .deps/libinnobase_a-trx0i_s.Tpo -c -o libinnobase_a-trx0i_s.o `test -f 'trx/trx0i_s.c' || echo './'`trx/trx0i_s.c
  o  > > In file included from ./include/univ.i:114,
  o  > >                  from trx/trx0i_s.c:36:
  o  > > ../../include/my_pthread.h:628: error: expected ')' before '*' token
  o  > > In file included from ../../include/my_pthread.h:732,
  o  > >                  from ./include/univ.i:114,
  o  > >                  from trx/trx0i_s.c:36:
  o  > > ../../include/mysql/psi/mysql_thread.h💯 error: expected specifier-qualifier-list before 'pthread_rwlock_t'
  o  > > ../../include/mysql/psi/mysql_thread.h:116: error: expected specifier-qualifier-list before 'pthread_rwlock_t'
  o  > > ../../include/mysql/psi/mysql_thread.h: In function 'inline_mysql_rwlock_init':
  o  > > ../../include/mysql/psi/mysql_thread.h:711: error: 'mysql_rwlock_t' has no member named 'm_psi'
  o  > > ../../include/mysql/psi/mysql_thread.h:716: error: 'mysql_rwlock_t' has no member named 'm_rwlock'
  o  > > .... ((continued))
  o  
  o  Intel's icc gives slightly clearer messages:
  o  > > icc -static-intel -static-libgcc -DHAVE_CONFIG_H -I. -I../../include -I../../include -I../../include -I../../regex -I./include -I../../sql -I. -I../../zlib    -O3 -g -unroll2 -ip -mp -restrict -no-ftz -no-prefetch   -DUNIV_LINUX -MT libinnobase_a-trx0i_s.o -MD -MP -MF .deps/libinnobase_a-trx0i_s.Tpo -c -o libinnobase_a-trx0i_s.o `test -f 'trx/trx0i_s.c' || echo './'`trx/trx0i_s.c
  o  > > ../../include/my_pthread.h(628): error: identifier "pthread_rwlock_t" is undefined
  o  > >   extern int rw_pr_init(rw_pr_lock_t *);
  o  > >                         ^
  o  > > 
  o  > > ../../include/mysql/psi/mysql_thread.h(100): error: identifier "pthread_rwlock_t" is undefined
  o  > >     rw_lock_t m_rwlock;
  o  > >     ^
  o  > > 
  o  > > ../../include/mysql/psi/mysql_thread.h(116): error: identifier "pthread_rwlock_t" is undefined
  o  > >     rw_pr_lock_t m_prlock;
  o  > >     ^
  ------------------------------------------------------------------------
  r6864 | mmakela | 2010-03-24 14:05:53 +0200 (Wed, 24 Mar 2010) | 1 line
  Changed paths:
     M /branches/zip/include/data0type.ic

  branches/zip: dtype_new_store_for_order_and_null_size(): Add ut_ad() on mtype.
  ------------------------------------------------------------------------
  r6868 | mmakela | 2010-03-25 13:03:08 +0200 (Thu, 25 Mar 2010) | 1 line
  Changed paths:
     M /branches/zip/page/page0page.c

  branches/zip: page_validate(): Check the buf[] bounds.
  ------------------------------------------------------------------------
  r6871 | vdimov | 2010-03-25 16:39:44 +0200 (Thu, 25 Mar 2010) | 4 lines
  Changed paths:
     M /branches/zip/ChangeLog

  branches/zip:

  Whitespace fixup to be consistent with the rest of the file.
  ------------------------------------------------------------------------
  r6872 | vdimov | 2010-03-25 17:03:17 +0200 (Thu, 25 Mar 2010) | 4 lines
  Changed paths:
     M /branches/zip/ChangeLog

  branches/zip:

  Fix ChangeLog - write only the bug title in bugs.mysql.com-related entires.
  ------------------------------------------------------------------------
  r6873 | vdimov | 2010-03-25 17:06:56 +0200 (Thu, 25 Mar 2010) | 4 lines
  Changed paths:
     M /branches/zip/ChangeLog

  branches/zip:

  Use Bug#N instead of Bug #N to be consistent with the rest of the fil.
  ------------------------------------------------------------------------
  r6874 | vdimov | 2010-03-25 17:17:52 +0200 (Thu, 25 Mar 2010) | 4 lines
  Changed paths:
     M /branches/zip/ChangeLog

  branches/zip:

  Wrap ChangeLog at 78th column
  ------------------------------------------------------------------------
  r6875 | vdimov | 2010-03-25 18:18:15 +0200 (Thu, 25 Mar 2010) | 4 lines
  Changed paths:
     M /branches/zip/ChangeLog

  branches/zip:

  Wrap line at 78 column in ChangeLog.
  ------------------------------------------------------------------------
  r6891 | vdimov | 2010-03-26 16:19:01 +0200 (Fri, 26 Mar 2010) | 5 lines
  Changed paths:
     M /branches/innodb+/buf/buf0buddy.c
     M /branches/innodb+/include/btr0btr.ic
     M /branches/innodb+/include/buf0buf.ic
     M /branches/innodb+/include/handler0alter.h
     M /branches/innodb+/include/mtr0mtr.ic
     M /branches/innodb+/include/pars0pars.h
     M /branches/innodb+/include/row0merge.h
     M /branches/innodb+/include/row0row.h
     M /branches/innodb+/include/row0sel.h
     M /branches/innodb+/include/row0types.h
     M /branches/innodb+/include/sync0rw.h
     M /branches/innodb+/include/ut0lst.h
     M /branches/innodb+/include/ut0ut.h
     M /branches/innodb+/os/os0thread.c
     M /branches/innodb+/pars/pars0pars.c
     M /branches/innodb+/plug.in
     M /branches/innodb+/row/row0purge.c
     M /branches/innodb+/row/row0row.c
     M /branches/innodb+/row/row0uins.c
     M /branches/innodb+/trx/trx0rec.c
     M /branches/innodb+/ut/ut0ut.c
     M /branches/innodb+_persistent_stats/buf/buf0buddy.c
     M /branches/innodb+_persistent_stats/include/btr0btr.ic
     M /branches/innodb+_persistent_stats/include/buf0buf.ic
     M /branches/innodb+_persistent_stats/include/handler0alter.h
     M /branches/innodb+_persistent_stats/include/mtr0mtr.ic
     M /branches/innodb+_persistent_stats/include/row0merge.h
     M /branches/innodb+_persistent_stats/include/row0row.h
     M /branches/innodb+_persistent_stats/include/row0sel.h
     M /branches/innodb+_persistent_stats/include/row0types.h
     M /branches/innodb+_persistent_stats/include/sync0rw.h
     M /branches/innodb+_persistent_stats/os/os0thread.c
     M /branches/innodb+_persistent_stats/plug.in
     M /branches/innodb+_persistent_stats/row/row0purge.c
     M /branches/innodb+_persistent_stats/row/row0row.c
     M /branches/innodb+_persistent_stats/row/row0uins.c
     M /branches/innodb+_persistent_stats/trx/trx0rec.c
     M /branches/performance_schema/buf/buf0buddy.c
     M /branches/performance_schema/buf/buf0flu.c
     M /branches/performance_schema/compile-innodb-debug
     M /branches/performance_schema/include/btr0btr.ic
     M /branches/performance_schema/include/buf0buf.ic
     M /branches/performance_schema/include/dict0boot.ic
     M /branches/performance_schema/include/dict0dict.h
     M /branches/performance_schema/include/os0file.ic
     M /branches/performance_schema/include/os0thread.h
     M /branches/performance_schema/include/row0sel.h
     M /branches/performance_schema/include/trx0purge.h
     M /branches/performance_schema/include/trx0sys.ic
     M /branches/performance_schema/include/ut0wqueue.h
     M /branches/performance_schema/lock/lock0iter.c
     M /branches/performance_schema/mem/mem0pool.c
     M /branches/performance_schema/os/os0thread.c
     M /branches/performance_schema/page/page0zip.c
     M /branches/performance_schema/que/que0que.c
     M /branches/performance_schema/read/read0read.c
     M /branches/performance_schema/row/row0purge.c
     M /branches/performance_schema/row/row0row.c
     M /branches/performance_schema/row/row0vers.c
     M /branches/performance_schema/sync/sync0arr.c
     M /branches/performance_schema/thr/thr0loc.c
     M /branches/performance_schema/trx/trx0rec.c
     M /branches/performance_schema/trx/trx0roll.c
     M /branches/performance_schema/trx/trx0undo.c
     M /branches/performance_schema/ut/ut0wqueue.c
     M /branches/perfschema/btr/btr0sea.c
     M /branches/perfschema/buf/buf0buddy.c
     M /branches/perfschema/buf/buf0flu.c
     M /branches/perfschema/compile-innodb-debug
     M /branches/perfschema/ha/hash0hash.c
     M /branches/perfschema/include/buf0buf.ic
     M /branches/perfschema/include/buf0flu.ic
     M /branches/perfschema/include/dict0boot.ic
     M /branches/perfschema/include/os0thread.h
     M /branches/perfschema/include/sync0rw.h
     M /branches/perfschema/include/sync0rw.ic
     M /branches/perfschema/include/sync0sync.ic
     M /branches/perfschema/mem/mem0pool.c
     M /branches/perfschema/os/os0thread.c
     M /branches/perfschema/page/page0zip.c
     M /branches/perfschema/que/que0que.c
     M /branches/perfschema/read/read0read.c
     M /branches/perfschema/row/row0purge.c
     M /branches/perfschema/row/row0vers.c
     M /branches/perfschema/sync/sync0arr.c
     M /branches/perfschema/sync/sync0rw.c
     M /branches/perfschema/thr/thr0loc.c
     M /branches/perfschema/trx/trx0purge.c
     M /branches/perfschema/trx/trx0rec.c
     M /branches/perfschema/trx/trx0roll.c
     M /branches/perfschema/trx/trx0undo.c
     M /branches/perfschema/ut/ut0wqueue.c
     M /branches/zip/buf/buf0buddy.c
     M /branches/zip/buf/buf0flu.c
     M /branches/zip/buf/buf0rea.c
     M /branches/zip/fil/fil0fil.c
     M /branches/zip/include/btr0btr.ic
     M /branches/zip/include/buf0buf.ic
     M /branches/zip/include/buf0flu.h
     M /branches/zip/include/data0type.ic
     M /branches/zip/include/mtr0mtr.ic
     M /branches/zip/include/row0sel.h
     M /branches/zip/include/sync0rw.h
     M /branches/zip/plug.in
     M /branches/zip/row/row0row.c
     M /branches/zip/trx/trx0i_s.c
     M /branches/zip/trx/trx0rec.c
     M /branches/zip/trx/trx0sys.c

  Non-functional change: update copyright year to 2010 of the files
  that have been modified after 2010-01-01 according to svn.

  for f in $(svn log -v -r{2010-01-01}:HEAD |grep "^   M " |cut -b 16- |sort -u) ; do sed -i "" -E 's/(Copyright \(c\) [0-9]{4},) [0-9]{4}, (.*Innobase Oy.+All Rights Reserved)/\1 2010, \2/' $f ; done
  ------------------------------------------------------------------------
  r6897 | mmakela | 2010-03-29 11:36:19 +0300 (Mon, 29 Mar 2010) | 3 lines
  Changed paths:
     M /branches/zip/handler/ha_innodb.cc

  branches/zip: innodb_mutex_show_status(): Fix a condition
  that was accidentally negated in r6781, making SHOW ENGINE INNODB MUTEX STATUS
  display only locks with no OS waits.
  ------------------------------------------------------------------------
2010-03-29 07:55:02 +00:00

603 lines
15 KiB
Text

/*****************************************************************************
Copyright (c) 1996, 2010, 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
*****************************************************************************/
/**************************************************//**
@file include/data0type.ic
Data types
Created 1/16/1996 Heikki Tuuri
*******************************************************/
#include "mach0data.h"
#ifndef UNIV_HOTBACKUP
# include "ha_prototypes.h"
/*********************************************************************//**
Gets the MySQL charset-collation code for MySQL string types.
@return MySQL charset-collation code */
UNIV_INLINE
ulint
dtype_get_charset_coll(
/*===================*/
ulint prtype) /*!< in: precise data type */
{
return((prtype >> 16) & 0xFFUL);
}
/*********************************************************************//**
Determines if a MySQL string type is a subset of UTF-8. This function
may return false negatives, in case further character-set collation
codes are introduced in MySQL later.
@return TRUE if a subset of UTF-8 */
UNIV_INLINE
ibool
dtype_is_utf8(
/*==========*/
ulint prtype) /*!< in: precise data type */
{
/* These codes have been copied from strings/ctype-extra.c
and strings/ctype-utf8.c. */
switch (dtype_get_charset_coll(prtype)) {
case 11: /* ascii_general_ci */
case 65: /* ascii_bin */
case 33: /* utf8_general_ci */
case 83: /* utf8_bin */
case 254: /* utf8_general_cs */
return(TRUE);
}
return(FALSE);
}
/*********************************************************************//**
Gets the MySQL type code from a dtype.
@return MySQL type code; this is NOT an InnoDB type code! */
UNIV_INLINE
ulint
dtype_get_mysql_type(
/*=================*/
const dtype_t* type) /*!< in: type struct */
{
return(type->prtype & 0xFFUL);
}
/*********************************************************************//**
Compute the mbminlen and mbmaxlen members of a data type structure. */
UNIV_INLINE
void
dtype_get_mblen(
/*============*/
ulint mtype, /*!< in: main type */
ulint prtype, /*!< in: precise type (and collation) */
ulint* mbminlen, /*!< out: minimum length of a
multi-byte character */
ulint* mbmaxlen) /*!< out: maximum length of a
multi-byte character */
{
if (dtype_is_string_type(mtype)) {
innobase_get_cset_width(dtype_get_charset_coll(prtype),
mbminlen, mbmaxlen);
ut_ad(*mbminlen <= *mbmaxlen);
ut_ad(*mbminlen <= 2); /* mbminlen in dtype_t is 0..3 */
ut_ad(*mbmaxlen < 1 << 3); /* mbmaxlen in dtype_t is 0..7 */
} else {
*mbminlen = *mbmaxlen = 0;
}
}
/*********************************************************************//**
Compute the mbminlen and mbmaxlen members of a data type structure. */
UNIV_INLINE
void
dtype_set_mblen(
/*============*/
dtype_t* type) /*!< in/out: type */
{
ulint mbminlen;
ulint mbmaxlen;
dtype_get_mblen(type->mtype, type->prtype, &mbminlen, &mbmaxlen);
type->mbminlen = mbminlen;
type->mbmaxlen = mbmaxlen;
ut_ad(dtype_validate(type));
}
#else /* !UNIV_HOTBACKUP */
# define dtype_set_mblen(type) (void) 0
#endif /* !UNIV_HOTBACKUP */
/*********************************************************************//**
Sets a data type structure. */
UNIV_INLINE
void
dtype_set(
/*======*/
dtype_t* type, /*!< in: type struct to init */
ulint mtype, /*!< in: main data type */
ulint prtype, /*!< in: precise type */
ulint len) /*!< in: precision of type */
{
ut_ad(type);
ut_ad(mtype <= DATA_MTYPE_MAX);
type->mtype = mtype;
type->prtype = prtype;
type->len = len;
dtype_set_mblen(type);
}
/*********************************************************************//**
Copies a data type structure. */
UNIV_INLINE
void
dtype_copy(
/*=======*/
dtype_t* type1, /*!< in: type struct to copy to */
const dtype_t* type2) /*!< in: type struct to copy from */
{
*type1 = *type2;
ut_ad(dtype_validate(type1));
}
/*********************************************************************//**
Gets the SQL main data type.
@return SQL main data type */
UNIV_INLINE
ulint
dtype_get_mtype(
/*============*/
const dtype_t* type) /*!< in: data type */
{
ut_ad(type);
return(type->mtype);
}
/*********************************************************************//**
Gets the precise data type.
@return precise data type */
UNIV_INLINE
ulint
dtype_get_prtype(
/*=============*/
const dtype_t* type) /*!< in: data type */
{
ut_ad(type);
return(type->prtype);
}
/*********************************************************************//**
Gets the type length.
@return fixed length of the type, in bytes, or 0 if variable-length */
UNIV_INLINE
ulint
dtype_get_len(
/*==========*/
const dtype_t* type) /*!< in: data type */
{
ut_ad(type);
return(type->len);
}
#ifndef UNIV_HOTBACKUP
/*********************************************************************//**
Gets the minimum length of a character, in bytes.
@return minimum length of a char, in bytes, or 0 if this is not a
character type */
UNIV_INLINE
ulint
dtype_get_mbminlen(
/*===============*/
const dtype_t* type) /*!< in: type */
{
ut_ad(type);
return(type->mbminlen);
}
/*********************************************************************//**
Gets the maximum length of a character, in bytes.
@return maximum length of a char, in bytes, or 0 if this is not a
character type */
UNIV_INLINE
ulint
dtype_get_mbmaxlen(
/*===============*/
const dtype_t* type) /*!< in: type */
{
ut_ad(type);
return(type->mbmaxlen);
}
/*********************************************************************//**
Gets the padding character code for a type.
@return padding character code, or ULINT_UNDEFINED if no padding specified */
UNIV_INLINE
ulint
dtype_get_pad_char(
/*===============*/
ulint mtype, /*!< in: main type */
ulint prtype) /*!< in: precise type */
{
switch (mtype) {
case DATA_FIXBINARY:
case DATA_BINARY:
if (UNIV_UNLIKELY(dtype_get_charset_coll(prtype)
== DATA_MYSQL_BINARY_CHARSET_COLL)) {
/* Starting from 5.0.18, do not pad
VARBINARY or BINARY columns. */
return(ULINT_UNDEFINED);
}
/* Fall through */
case DATA_CHAR:
case DATA_VARCHAR:
case DATA_MYSQL:
case DATA_VARMYSQL:
/* Space is the padding character for all char and binary
strings, and starting from 5.0.3, also for TEXT strings. */
return(0x20);
case DATA_BLOB:
if (!(prtype & DATA_BINARY_TYPE)) {
return(0x20);
}
/* Fall through */
default:
/* No padding specified */
return(ULINT_UNDEFINED);
}
}
/**********************************************************************//**
Stores for a type the information which determines its alphabetical ordering
and the storage size of an SQL NULL value. This is the >= 4.1.x storage
format. */
UNIV_INLINE
void
dtype_new_store_for_order_and_null_size(
/*====================================*/
byte* buf, /*!< in: buffer for
DATA_NEW_ORDER_NULL_TYPE_BUF_SIZE
bytes where we store the info */
const dtype_t* type, /*!< in: type struct */
ulint prefix_len)/*!< in: prefix length to
replace type->len, or 0 */
{
#if 6 != DATA_NEW_ORDER_NULL_TYPE_BUF_SIZE
#error "6 != DATA_NEW_ORDER_NULL_TYPE_BUF_SIZE"
#endif
ulint len;
ut_ad(type);
ut_ad(type->mtype >= DATA_VARCHAR);
ut_ad(type->mtype <= DATA_MYSQL);
buf[0] = (byte)(type->mtype & 0xFFUL);
if (type->prtype & DATA_BINARY_TYPE) {
buf[0] = buf[0] | 128;
}
/* In versions < 4.1.2 we had: if (type->prtype & DATA_NONLATIN1) {
buf[0] = buf[0] | 64;
}
*/
buf[1] = (byte)(type->prtype & 0xFFUL);
len = prefix_len ? prefix_len : type->len;
mach_write_to_2(buf + 2, len & 0xFFFFUL);
ut_ad(dtype_get_charset_coll(type->prtype) < 256);
mach_write_to_2(buf + 4, dtype_get_charset_coll(type->prtype));
if (type->prtype & DATA_NOT_NULL) {
buf[4] |= 128;
}
}
/**********************************************************************//**
Reads to a type the stored information which determines its alphabetical
ordering and the storage size of an SQL NULL value. This is the < 4.1.x
storage format. */
UNIV_INLINE
void
dtype_read_for_order_and_null_size(
/*===============================*/
dtype_t* type, /*!< in: type struct */
const byte* buf) /*!< in: buffer for stored type order info */
{
#if 4 != DATA_ORDER_NULL_TYPE_BUF_SIZE
# error "4 != DATA_ORDER_NULL_TYPE_BUF_SIZE"
#endif
type->mtype = buf[0] & 63;
type->prtype = buf[1];
if (buf[0] & 128) {
type->prtype = type->prtype | DATA_BINARY_TYPE;
}
type->len = mach_read_from_2(buf + 2);
type->prtype = dtype_form_prtype(type->prtype,
data_mysql_default_charset_coll);
dtype_set_mblen(type);
}
/**********************************************************************//**
Reads to a type the stored information which determines its alphabetical
ordering and the storage size of an SQL NULL value. This is the >= 4.1.x
storage format. */
UNIV_INLINE
void
dtype_new_read_for_order_and_null_size(
/*===================================*/
dtype_t* type, /*!< in: type struct */
const byte* buf) /*!< in: buffer for stored type order info */
{
ulint charset_coll;
#if 6 != DATA_NEW_ORDER_NULL_TYPE_BUF_SIZE
#error "6 != DATA_NEW_ORDER_NULL_TYPE_BUF_SIZE"
#endif
type->mtype = buf[0] & 63;
type->prtype = buf[1];
if (buf[0] & 128) {
type->prtype |= DATA_BINARY_TYPE;
}
if (buf[4] & 128) {
type->prtype |= DATA_NOT_NULL;
}
type->len = mach_read_from_2(buf + 2);
charset_coll = mach_read_from_2(buf + 4) & 0x7fff;
if (dtype_is_string_type(type->mtype)) {
ut_a(charset_coll < 256);
if (charset_coll == 0) {
/* This insert buffer record was inserted with MySQL
version < 4.1.2, and the charset-collation code was not
explicitly stored to dtype->prtype at that time. It
must be the default charset-collation of this MySQL
installation. */
charset_coll = data_mysql_default_charset_coll;
}
type->prtype = dtype_form_prtype(type->prtype, charset_coll);
}
dtype_set_mblen(type);
}
#endif /* !UNIV_HOTBACKUP */
/***********************************************************************//**
Returns the size of a fixed size data type, 0 if not a fixed size type.
@return fixed size, or 0 */
UNIV_INLINE
ulint
dtype_get_fixed_size_low(
/*=====================*/
ulint mtype, /*!< in: main type */
ulint prtype, /*!< in: precise type */
ulint len, /*!< in: length */
ulint mbminlen, /*!< in: minimum length of a multibyte char */
ulint mbmaxlen, /*!< in: maximum length of a multibyte char */
ulint comp) /*!< in: nonzero=ROW_FORMAT=COMPACT */
{
switch (mtype) {
case DATA_SYS:
#ifdef UNIV_DEBUG
switch (prtype & DATA_MYSQL_TYPE_MASK) {
case DATA_ROW_ID:
ut_ad(len == DATA_ROW_ID_LEN);
break;
case DATA_TRX_ID:
ut_ad(len == DATA_TRX_ID_LEN);
break;
case DATA_ROLL_PTR:
ut_ad(len == DATA_ROLL_PTR_LEN);
break;
default:
ut_ad(0);
return(0);
}
#endif /* UNIV_DEBUG */
case DATA_CHAR:
case DATA_FIXBINARY:
case DATA_INT:
case DATA_FLOAT:
case DATA_DOUBLE:
return(len);
case DATA_MYSQL:
#ifndef UNIV_HOTBACKUP
if (prtype & DATA_BINARY_TYPE) {
return(len);
} else if (!comp) {
return(len);
} else {
/* We play it safe here and ask MySQL for
mbminlen and mbmaxlen. Although
mbminlen and mbmaxlen are
initialized if and only if prtype
is (in one of the 3 functions in this file),
it could be that none of these functions
has been called. */
ulint i_mbminlen, i_mbmaxlen;
innobase_get_cset_width(
dtype_get_charset_coll(prtype),
&i_mbminlen, &i_mbmaxlen);
if (UNIV_UNLIKELY(mbminlen != i_mbminlen)
|| UNIV_UNLIKELY(mbmaxlen != i_mbmaxlen)) {
ut_print_timestamp(stderr);
fprintf(stderr, " InnoDB: "
"mbminlen=%lu, "
"mbmaxlen=%lu, "
"type->mbminlen=%lu, "
"type->mbmaxlen=%lu\n",
(ulong) i_mbminlen,
(ulong) i_mbmaxlen,
(ulong) mbminlen,
(ulong) mbmaxlen);
}
if (mbminlen == mbmaxlen) {
return(len);
}
}
#else /* !UNIV_HOTBACKUP */
return(len);
#endif /* !UNIV_HOTBACKUP */
/* fall through for variable-length charsets */
case DATA_VARCHAR:
case DATA_BINARY:
case DATA_DECIMAL:
case DATA_VARMYSQL:
case DATA_BLOB:
return(0);
default:
ut_error;
}
return(0);
}
#ifndef UNIV_HOTBACKUP
/***********************************************************************//**
Returns the minimum size of a data type.
@return minimum size */
UNIV_INLINE
ulint
dtype_get_min_size_low(
/*===================*/
ulint mtype, /*!< in: main type */
ulint prtype, /*!< in: precise type */
ulint len, /*!< in: length */
ulint mbminlen, /*!< in: minimum length of a multibyte char */
ulint mbmaxlen) /*!< in: maximum length of a multibyte char */
{
switch (mtype) {
case DATA_SYS:
#ifdef UNIV_DEBUG
switch (prtype & DATA_MYSQL_TYPE_MASK) {
case DATA_ROW_ID:
ut_ad(len == DATA_ROW_ID_LEN);
break;
case DATA_TRX_ID:
ut_ad(len == DATA_TRX_ID_LEN);
break;
case DATA_ROLL_PTR:
ut_ad(len == DATA_ROLL_PTR_LEN);
break;
default:
ut_ad(0);
return(0);
}
#endif /* UNIV_DEBUG */
case DATA_CHAR:
case DATA_FIXBINARY:
case DATA_INT:
case DATA_FLOAT:
case DATA_DOUBLE:
return(len);
case DATA_MYSQL:
if ((prtype & DATA_BINARY_TYPE) || mbminlen == mbmaxlen) {
return(len);
}
/* this is a variable-length character set */
ut_a(mbminlen > 0);
ut_a(mbmaxlen > mbminlen);
ut_a(len % mbmaxlen == 0);
return(len * mbminlen / mbmaxlen);
case DATA_VARCHAR:
case DATA_BINARY:
case DATA_DECIMAL:
case DATA_VARMYSQL:
case DATA_BLOB:
return(0);
default:
ut_error;
}
return(0);
}
/***********************************************************************//**
Returns the maximum size of a data type. Note: types in system tables may be
incomplete and return incorrect information.
@return maximum size */
UNIV_INLINE
ulint
dtype_get_max_size_low(
/*===================*/
ulint mtype, /*!< in: main type */
ulint len) /*!< in: length */
{
switch (mtype) {
case DATA_SYS:
case DATA_CHAR:
case DATA_FIXBINARY:
case DATA_INT:
case DATA_FLOAT:
case DATA_DOUBLE:
case DATA_MYSQL:
case DATA_VARCHAR:
case DATA_BINARY:
case DATA_DECIMAL:
case DATA_VARMYSQL:
return(len);
case DATA_BLOB:
break;
default:
ut_error;
}
return(ULINT_MAX);
}
#endif /* !UNIV_HOTBACKUP */
/***********************************************************************//**
Returns the ROW_FORMAT=REDUNDANT stored SQL NULL size of a type.
For fixed length types it is the fixed length of the type, otherwise 0.
@return SQL null storage size in ROW_FORMAT=REDUNDANT */
UNIV_INLINE
ulint
dtype_get_sql_null_size(
/*====================*/
const dtype_t* type, /*!< in: type */
ulint comp) /*!< in: nonzero=ROW_FORMAT=COMPACT */
{
#ifndef UNIV_HOTBACKUP
return(dtype_get_fixed_size_low(type->mtype, type->prtype, type->len,
type->mbminlen, type->mbmaxlen, comp));
#else /* !UNIV_HOTBACKUP */
return(dtype_get_fixed_size_low(type->mtype, type->prtype, type->len,
0, 0, 0));
#endif /* !UNIV_HOTBACKUP */
}