mirror of
https://github.com/MariaDB/server.git
synced 2025-07-18 23:03:28 +03:00
BitKeeper/etc/logging_ok: auto-union VC++Files/innobase/innobase.dsp: Auto merged VC++Files/libmysql/libmysql.dsp: Auto merged acinclude.m4: Auto merged configure.in: Auto merged BitKeeper/deleted/.del-com0shm.c~6a16f0c3d81de1f: Auto merged BitKeeper/deleted/.del-mysql_fix_privilege_tables.sql: Auto merged extra/replace.c: Auto merged include/my_sys.h: Auto merged innobase/btr/btr0btr.c: Auto merged innobase/btr/btr0cur.c: Auto merged innobase/btr/btr0pcur.c: Auto merged innobase/btr/btr0sea.c: Auto merged innobase/configure.in: Auto merged innobase/data/data0data.c: Auto merged innobase/dict/dict0boot.c: Auto merged innobase/dict/dict0crea.c: Auto merged innobase/dict/dict0dict.c: Auto merged innobase/dict/dict0load.c: Auto merged innobase/dict/dict0mem.c: Auto merged innobase/ha/ha0ha.c: Auto merged innobase/ha/hash0hash.c: Auto merged innobase/include/btr0btr.ic: Auto merged innobase/include/data0type.ic: Auto merged innobase/include/dict0mem.h: Auto merged innobase/include/log0log.ic: Auto merged innobase/include/mach0data.ic: Auto merged innobase/include/mtr0log.h: Auto merged innobase/include/mtr0mtr.h: Auto merged innobase/include/os0file.h: Auto merged innobase/include/row0upd.ic: Auto merged innobase/include/srv0srv.h: Auto merged innobase/include/sync0sync.h: Auto merged innobase/include/trx0rseg.ic: Auto merged innobase/lock/lock0lock.c: Auto merged innobase/log/log0recv.c: Auto merged innobase/mem/mem0dbg.c: Auto merged innobase/mtr/mtr0log.c: Auto merged innobase/mtr/mtr0mtr.c: Auto merged innobase/os/os0file.c: Auto merged innobase/page/page0cur.c: Auto merged innobase/page/page0page.c: Auto merged innobase/pars/lexyy.c: Auto merged innobase/read/read0read.c: Auto merged innobase/rem/rem0cmp.c: Auto merged innobase/rem/rem0rec.c: Auto merged innobase/row/row0ins.c: Auto merged innobase/row/row0mysql.c: Auto merged innobase/row/row0purge.c: Auto merged innobase/row/row0sel.c: Auto merged innobase/row/row0undo.c: Auto merged innobase/row/row0upd.c: Auto merged innobase/srv/srv0srv.c: Auto merged innobase/srv/srv0start.c: Auto merged innobase/sync/sync0rw.c: Auto merged innobase/thr/thr0loc.c: Auto merged innobase/trx/trx0purge.c: Auto merged innobase/trx/trx0rec.c: Auto merged innobase/trx/trx0roll.c: Auto merged innobase/trx/trx0trx.c: Auto merged innobase/trx/trx0undo.c: Auto merged myisam/mi_check.c: Auto merged myisam/myisamchk.c: Auto merged mysql-test/r/multi_update.result: Auto merged mysql-test/r/mysqlbinlog.result: Auto merged mysql-test/r/rpl_error_ignored_table.result: Auto merged mysql-test/t/multi_update.test: Auto merged mysql-test/t/rpl_error_ignored_table.test: Auto merged mysys/mf_iocache.c: Auto merged mysys/mf_pack.c: Auto merged mysys/my_getopt.c: Auto merged sql/ha_berkeley.cc: Auto merged sql/ha_myisam.cc: Auto merged sql/lock.cc: Auto merged sql/log.cc: Auto merged sql/opt_range.cc: Auto merged sql/set_var.h: Auto merged sql/sql_cache.cc: Auto merged sql/sql_cache.h: Auto merged sql/sql_delete.cc: Auto merged sql/sql_handler.cc: Auto merged sql/sql_insert.cc: Auto merged sql/sql_list.h: Auto merged sql/sql_select.cc: Auto merged sql/sql_show.cc: Auto merged sql/sql_table.cc: Auto merged sql/sql_update.cc: Auto merged tests/thread_test.c: Auto merged client/mysqldump.c: Keep original indentation mysql-test/r/merge.result: keep old file scripts/mysql_fix_privilege_tables.sh: Keep old structure in merge with 4.0 sql/table.cc: merge with 4.0 + simple optimizations
321 lines
7.3 KiB
Plaintext
321 lines
7.3 KiB
Plaintext
/******************************************************
|
|
Data types
|
|
|
|
(c) 1996 Innobase Oy
|
|
|
|
Created 1/16/1996 Heikki Tuuri
|
|
*******************************************************/
|
|
|
|
#include "mach0data.h"
|
|
|
|
/*************************************************************************
|
|
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: length of type */
|
|
ulint prec) /* in: precision of type */
|
|
{
|
|
ut_ad(type);
|
|
ut_ad(mtype <= DATA_MTYPE_MAX);
|
|
|
|
type->mtype = mtype;
|
|
type->prtype = prtype;
|
|
type->len = len;
|
|
type->prec = prec;
|
|
|
|
ut_ad(dtype_validate(type));
|
|
}
|
|
|
|
/*************************************************************************
|
|
Copies a data type structure. */
|
|
UNIV_INLINE
|
|
void
|
|
dtype_copy(
|
|
/*=======*/
|
|
dtype_t* type1, /* in: type struct to copy to */
|
|
dtype_t* type2) /* in: type struct to copy from */
|
|
{
|
|
*type1 = *type2;
|
|
|
|
ut_ad(dtype_validate(type1));
|
|
}
|
|
|
|
/*************************************************************************
|
|
Gets the SQL main data type. */
|
|
UNIV_INLINE
|
|
ulint
|
|
dtype_get_mtype(
|
|
/*============*/
|
|
dtype_t* type)
|
|
{
|
|
ut_ad(type);
|
|
|
|
return(type->mtype);
|
|
}
|
|
|
|
/*************************************************************************
|
|
Gets the precise data type. */
|
|
UNIV_INLINE
|
|
ulint
|
|
dtype_get_prtype(
|
|
/*=============*/
|
|
dtype_t* type)
|
|
{
|
|
ut_ad(type);
|
|
|
|
return(type->prtype);
|
|
}
|
|
|
|
/*************************************************************************
|
|
Gets the MySQL charset-collation code for MySQL string types. */
|
|
UNIV_INLINE
|
|
ulint
|
|
dtype_get_charset_coll(
|
|
/*===================*/
|
|
ulint prtype) /* in: precise data type */
|
|
{
|
|
return((prtype >> 16) & 0xFFUL);
|
|
}
|
|
|
|
/*************************************************************************
|
|
Gets the type length. */
|
|
UNIV_INLINE
|
|
ulint
|
|
dtype_get_len(
|
|
/*==========*/
|
|
dtype_t* type)
|
|
{
|
|
ut_ad(type);
|
|
|
|
return(type->len);
|
|
}
|
|
|
|
/*************************************************************************
|
|
Gets the type precision. */
|
|
UNIV_INLINE
|
|
ulint
|
|
dtype_get_prec(
|
|
/*===========*/
|
|
dtype_t* type)
|
|
{
|
|
ut_ad(type);
|
|
|
|
return(type->prec);
|
|
}
|
|
|
|
/*************************************************************************
|
|
Gets the padding character code for the type. */
|
|
UNIV_INLINE
|
|
ulint
|
|
dtype_get_pad_char(
|
|
/*===============*/
|
|
/* out: padding character code, or
|
|
ULINT_UNDEFINED if no padding specified */
|
|
dtype_t* type) /* in: type */
|
|
{
|
|
if (type->mtype == DATA_CHAR
|
|
|| type->mtype == DATA_VARCHAR
|
|
|| type->mtype == DATA_BINARY
|
|
|| type->mtype == DATA_FIXBINARY
|
|
|| type->mtype == DATA_MYSQL
|
|
|| type->mtype == DATA_VARMYSQL) {
|
|
|
|
/* Space is the padding character for all char and binary
|
|
strings */
|
|
|
|
return((ulint)' ');
|
|
}
|
|
|
|
/* 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 */
|
|
dtype_t* type) /* in: type struct */
|
|
{
|
|
ut_ad(6 == DATA_NEW_ORDER_NULL_TYPE_BUF_SIZE);
|
|
|
|
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);
|
|
|
|
mach_write_to_2(buf + 2, type->len & 0xFFFFUL);
|
|
|
|
mach_write_to_2(buf + 4, dtype_get_charset_coll(type->prtype));
|
|
|
|
/* Note that the second last byte is left unused, because the
|
|
charset-collation code is always < 256 */
|
|
}
|
|
|
|
/**************************************************************************
|
|
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 */
|
|
byte* buf) /* in: buffer for stored type order info */
|
|
{
|
|
ut_ad(4 == DATA_ORDER_NULL_TYPE_BUF_SIZE);
|
|
|
|
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);
|
|
}
|
|
|
|
/**************************************************************************
|
|
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 */
|
|
byte* buf) /* in: buffer for stored type order info */
|
|
{
|
|
ulint charset_coll;
|
|
|
|
ut_ad(6 == DATA_NEW_ORDER_NULL_TYPE_BUF_SIZE);
|
|
|
|
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);
|
|
|
|
mach_read_from_2(buf + 4);
|
|
|
|
charset_coll = mach_read_from_2(buf + 4);
|
|
|
|
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);
|
|
}
|
|
}
|
|
|
|
/***************************************************************************
|
|
Returns the size of a fixed size data type, 0 if not a fixed size type. */
|
|
UNIV_INLINE
|
|
ulint
|
|
dtype_get_fixed_size(
|
|
/*=================*/
|
|
/* out: fixed size, or 0 */
|
|
dtype_t* type) /* in: type */
|
|
{
|
|
ulint mtype;
|
|
|
|
mtype = dtype_get_mtype(type);
|
|
|
|
switch (mtype) {
|
|
case DATA_CHAR:
|
|
case DATA_FIXBINARY:
|
|
case DATA_INT:
|
|
case DATA_FLOAT:
|
|
case DATA_DOUBLE:
|
|
case DATA_MYSQL:
|
|
return(dtype_get_len(type));
|
|
|
|
case DATA_SYS: if (type->prtype == DATA_ROW_ID) {
|
|
return(DATA_ROW_ID_LEN);
|
|
} else if (type->prtype == DATA_TRX_ID) {
|
|
return(DATA_TRX_ID_LEN);
|
|
} else if (type->prtype == DATA_ROLL_PTR) {
|
|
return(DATA_ROLL_PTR_LEN);
|
|
} else {
|
|
return(0);
|
|
}
|
|
case DATA_VARCHAR:
|
|
case DATA_BINARY:
|
|
case DATA_DECIMAL:
|
|
case DATA_VARMYSQL:
|
|
case DATA_BLOB:
|
|
return(0);
|
|
default: ut_error;
|
|
}
|
|
|
|
return(0);
|
|
}
|
|
|
|
/***************************************************************************
|
|
Returns a stored SQL NULL size for a type. For fixed length types it is
|
|
the fixed length of the type, otherwise 0. */
|
|
UNIV_INLINE
|
|
ulint
|
|
dtype_get_sql_null_size(
|
|
/*====================*/
|
|
/* out: SQL null storage size */
|
|
dtype_t* type) /* in: type */
|
|
{
|
|
return(dtype_get_fixed_size(type));
|
|
}
|
|
|
|
/***************************************************************************
|
|
Returns TRUE if a type is of a fixed size. */
|
|
UNIV_INLINE
|
|
ibool
|
|
dtype_is_fixed_size(
|
|
/*================*/
|
|
/* out: TRUE if fixed size */
|
|
dtype_t* type) /* in: type */
|
|
{
|
|
ulint size;
|
|
|
|
size = dtype_get_fixed_size(type);
|
|
|
|
if (size) {
|
|
return(TRUE);
|
|
}
|
|
|
|
return(FALSE);
|
|
}
|