2001-02-17 14:19:19 +02:00
|
|
|
/************************************************************************
|
|
|
|
SQL data field and tuple
|
|
|
|
|
|
|
|
(c) 1994-1996 Innobase Oy
|
|
|
|
|
|
|
|
Created 5/30/1994 Heikki Tuuri
|
|
|
|
*************************************************************************/
|
|
|
|
|
|
|
|
#include "mem0mem.h"
|
|
|
|
#include "ut0rnd.h"
|
|
|
|
|
|
|
|
extern byte data_error;
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
Gets pointer to the type struct of SQL data field. */
|
|
|
|
UNIV_INLINE
|
|
|
|
dtype_t*
|
|
|
|
dfield_get_type(
|
|
|
|
/*============*/
|
|
|
|
/* out: pointer to the type struct */
|
|
|
|
dfield_t* field) /* in: SQL data field */
|
|
|
|
{
|
|
|
|
ut_ad(field);
|
|
|
|
|
|
|
|
return(&(field->type));
|
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
Gets pointer to the data in a field. */
|
|
|
|
UNIV_INLINE
|
|
|
|
void*
|
|
|
|
dfield_get_data(
|
|
|
|
/*============*/
|
|
|
|
/* out: pointer to data */
|
|
|
|
dfield_t* field) /* in: field */
|
|
|
|
{
|
|
|
|
ut_ad(field);
|
|
|
|
ut_ad((field->len == UNIV_SQL_NULL)
|
|
|
|
|| (field->data != &data_error));
|
|
|
|
|
|
|
|
return(field->data);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
Gets length of field data. */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dfield_get_len(
|
|
|
|
/*===========*/
|
|
|
|
/* out: length of data; UNIV_SQL_NULL if
|
|
|
|
SQL null data */
|
|
|
|
dfield_t* field) /* in: field */
|
|
|
|
{
|
|
|
|
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);
|
|
|
|
|
|
|
|
field->len = len;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
Sets pointer to the data and length in a field. */
|
|
|
|
UNIV_INLINE
|
|
|
|
void
|
|
|
|
dfield_set_data(
|
|
|
|
/*============*/
|
|
|
|
dfield_t* field, /* in: field */
|
2004-05-17 14:40:31 +03:00
|
|
|
const void* data, /* in: data */
|
2001-02-17 14:19:19 +02:00
|
|
|
ulint len) /* in: length or UNIV_SQL_NULL */
|
|
|
|
{
|
|
|
|
ut_ad(field);
|
|
|
|
|
2004-05-24 14:42:34 +03:00
|
|
|
field->data = (void*) data;
|
2001-02-17 14:19:19 +02:00
|
|
|
field->len = len;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
Copies the data and len fields. */
|
|
|
|
UNIV_INLINE
|
|
|
|
void
|
|
|
|
dfield_copy_data(
|
|
|
|
/*=============*/
|
|
|
|
dfield_t* field1, /* in: field to copy to */
|
|
|
|
dfield_t* field2) /* in: field to copy from */
|
|
|
|
{
|
|
|
|
ut_ad(field1 && field2);
|
|
|
|
|
|
|
|
field1->data = field2->data;
|
|
|
|
field1->len = field2->len;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
Copies a data field to another. */
|
|
|
|
UNIV_INLINE
|
|
|
|
void
|
|
|
|
dfield_copy(
|
|
|
|
/*========*/
|
|
|
|
dfield_t* field1, /* in: field to copy to */
|
|
|
|
dfield_t* field2) /* in: field to copy from */
|
|
|
|
{
|
|
|
|
*field1 = *field2;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
Tests if data length and content is equal for two dfields. */
|
|
|
|
UNIV_INLINE
|
|
|
|
ibool
|
2001-10-10 22:47:08 +03:00
|
|
|
dfield_datas_are_binary_equal(
|
|
|
|
/*==========================*/
|
2001-02-17 14:19:19 +02:00
|
|
|
/* out: TRUE if equal */
|
|
|
|
dfield_t* field1, /* in: field */
|
|
|
|
dfield_t* field2) /* in: field */
|
|
|
|
{
|
|
|
|
ulint len;
|
|
|
|
|
|
|
|
len = field1->len;
|
|
|
|
|
|
|
|
if ((len != field2->len)
|
|
|
|
|| ((len != UNIV_SQL_NULL)
|
|
|
|
&& (0 != ut_memcmp(field1->data, field2->data, len)))) {
|
|
|
|
|
|
|
|
return(FALSE);
|
|
|
|
}
|
|
|
|
|
|
|
|
return(TRUE);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
Gets info bits in a data tuple. */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dtuple_get_info_bits(
|
|
|
|
/*=================*/
|
|
|
|
/* out: info bits */
|
|
|
|
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. */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dtuple_get_n_fields_cmp(
|
|
|
|
/*====================*/
|
|
|
|
/* out: number of fields used in comparisons
|
|
|
|
in rem0cmp.* */
|
|
|
|
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. */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dtuple_get_n_fields(
|
|
|
|
/*================*/
|
|
|
|
/* out: number of fields */
|
|
|
|
dtuple_t* tuple) /* in: tuple */
|
|
|
|
{
|
|
|
|
ut_ad(tuple);
|
|
|
|
|
|
|
|
return(tuple->n_fields);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
Gets nth field of a tuple. */
|
|
|
|
UNIV_INLINE
|
|
|
|
dfield_t*
|
|
|
|
dtuple_get_nth_field(
|
|
|
|
/*=================*/
|
|
|
|
/* out: nth field */
|
|
|
|
dtuple_t* tuple, /* in: tuple */
|
|
|
|
ulint n) /* in: index of field */
|
|
|
|
{
|
|
|
|
ut_ad(tuple);
|
|
|
|
ut_ad(n < tuple->n_fields);
|
|
|
|
|
|
|
|
return(tuple->fields + n);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**************************************************************
|
|
|
|
Creates a data tuple to a memory heap. The default value for number
|
|
|
|
of fields used in record comparisons for this tuple is n_fields. */
|
|
|
|
UNIV_INLINE
|
|
|
|
dtuple_t*
|
|
|
|
dtuple_create(
|
|
|
|
/*==========*/
|
|
|
|
/* out, own: created tuple */
|
|
|
|
mem_heap_t* heap, /* in: memory heap where the tuple
|
|
|
|
is created */
|
|
|
|
ulint n_fields) /* in: number of fields */
|
|
|
|
{
|
|
|
|
dtuple_t* tuple;
|
|
|
|
|
|
|
|
ut_ad(heap);
|
|
|
|
|
|
|
|
tuple = (dtuple_t*) mem_heap_alloc(heap, sizeof(dtuple_t)
|
|
|
|
+ n_fields * sizeof(dfield_t));
|
|
|
|
tuple->info_bits = 0;
|
|
|
|
tuple->n_fields = n_fields;
|
|
|
|
tuple->n_fields_cmp = n_fields;
|
|
|
|
tuple->fields = (dfield_t*)(((byte*)tuple) + sizeof(dtuple_t));
|
|
|
|
|
|
|
|
#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++) {
|
|
|
|
(tuple->fields + i)->data = &data_error;
|
|
|
|
dfield_get_type(tuple->fields + i)->mtype = DATA_ERROR;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
return(tuple);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**************************************************************
|
|
|
|
The following function returns the sum of data lengths of a tuple. The space
|
srv0srv.h Support raw disk partitions as data files
srv0start.c Support raw disk partitions as data files
srv0srv.c Support raw disk partitions as data files
row0purge.c < 4 GB rows, doublewrite, hang fixes
row0row.c < 4 GB rows, doublewrite, hang fixes
row0sel.c < 4 GB rows, doublewrite, hang fixes
row0uins.c < 4 GB rows, doublewrite, hang fixes
row0umod.c < 4 GB rows, doublewrite, hang fixes
row0undo.c < 4 GB rows, doublewrite, hang fixes
row0upd.c < 4 GB rows, doublewrite, hang fixes
srv0srv.c < 4 GB rows, doublewrite, hang fixes
srv0start.c < 4 GB rows, doublewrite, hang fixes
sync0rw.c < 4 GB rows, doublewrite, hang fixes
sync0sync.c < 4 GB rows, doublewrite, hang fixes
trx0purge.c < 4 GB rows, doublewrite, hang fixes
trx0rec.c < 4 GB rows, doublewrite, hang fixes
trx0sys.c < 4 GB rows, doublewrite, hang fixes
btr0btr.c < 4 GB rows, doublewrite, hang fixes
btr0cur.c < 4 GB rows, doublewrite, hang fixes
buf0buf.c < 4 GB rows, doublewrite, hang fixes
buf0flu.c < 4 GB rows, doublewrite, hang fixes
buf0rea.c < 4 GB rows, doublewrite, hang fixes
data0data.c < 4 GB rows, doublewrite, hang fixes
fil0fil.c < 4 GB rows, doublewrite, hang fixes
fsp0fsp.c < 4 GB rows, doublewrite, hang fixes
ibuf0ibuf.c < 4 GB rows, doublewrite, hang fixes
lock0lock.c < 4 GB rows, doublewrite, hang fixes
log0log.c < 4 GB rows, doublewrite, hang fixes
log0recv.c < 4 GB rows, doublewrite, hang fixes
os0file.c < 4 GB rows, doublewrite, hang fixes
page0cur.c < 4 GB rows, doublewrite, hang fixes
pars0pars.c < 4 GB rows, doublewrite, hang fixes
rem0cmp.c < 4 GB rows, doublewrite, hang fixes
rem0rec.c < 4 GB rows, doublewrite, hang fixes
row0ins.c < 4 GB rows, doublewrite, hang fixes
row0mysql.c < 4 GB rows, doublewrite, hang fixes
univ.i < 4 GB rows, doublewrite, hang fixes
data0data.ic < 4 GB rows, doublewrite, hang fixes
mach0data.ic < 4 GB rows, doublewrite, hang fixes
rem0rec.ic < 4 GB rows, doublewrite, hang fixes
row0upd.ic < 4 GB rows, doublewrite, hang fixes
trx0rec.ic < 4 GB rows, doublewrite, hang fixes
rem0cmp.h < 4 GB rows, doublewrite, hang fixes
rem0rec.h < 4 GB rows, doublewrite, hang fixes
row0ins.h < 4 GB rows, doublewrite, hang fixes
row0mysql.h < 4 GB rows, doublewrite, hang fixes
row0row.h < 4 GB rows, doublewrite, hang fixes
row0upd.h < 4 GB rows, doublewrite, hang fixes
srv0srv.h < 4 GB rows, doublewrite, hang fixes
sync0sync.h < 4 GB rows, doublewrite, hang fixes
trx0rec.h < 4 GB rows, doublewrite, hang fixes
trx0sys.h < 4 GB rows, doublewrite, hang fixes
trx0types.h < 4 GB rows, doublewrite, hang fixes
trx0undo.h < 4 GB rows, doublewrite, hang fixes
ut0dbg.h < 4 GB rows, doublewrite, hang fixes
ut0ut.h < 4 GB rows, doublewrite, hang fixes
btr0btr.h < 4 GB rows, doublewrite, hang fixes
btr0cur.h < 4 GB rows, doublewrite, hang fixes
buf0buf.h < 4 GB rows, doublewrite, hang fixes
buf0flu.h < 4 GB rows, doublewrite, hang fixes
data0data.h < 4 GB rows, doublewrite, hang fixes
dict0mem.h < 4 GB rows, doublewrite, hang fixes
fil0fil.h < 4 GB rows, doublewrite, hang fixes
fsp0fsp.h < 4 GB rows, doublewrite, hang fixes
os0file.h < 4 GB rows, doublewrite, hang fixes
innobase/include/btr0btr.h:
< 4 GB rows, doublewrite, hang fixes
innobase/include/btr0cur.h:
< 4 GB rows, doublewrite, hang fixes
innobase/include/buf0buf.h:
< 4 GB rows, doublewrite, hang fixes
innobase/include/buf0flu.h:
< 4 GB rows, doublewrite, hang fixes
innobase/include/data0data.h:
< 4 GB rows, doublewrite, hang fixes
innobase/include/dict0mem.h:
< 4 GB rows, doublewrite, hang fixes
innobase/include/fil0fil.h:
< 4 GB rows, doublewrite, hang fixes
innobase/include/fsp0fsp.h:
< 4 GB rows, doublewrite, hang fixes
innobase/include/os0file.h:
< 4 GB rows, doublewrite, hang fixes
innobase/include/rem0cmp.h:
< 4 GB rows, doublewrite, hang fixes
innobase/include/rem0rec.h:
< 4 GB rows, doublewrite, hang fixes
innobase/include/row0ins.h:
< 4 GB rows, doublewrite, hang fixes
innobase/include/row0mysql.h:
< 4 GB rows, doublewrite, hang fixes
innobase/include/row0row.h:
< 4 GB rows, doublewrite, hang fixes
innobase/include/row0upd.h:
< 4 GB rows, doublewrite, hang fixes
innobase/include/sync0sync.h:
< 4 GB rows, doublewrite, hang fixes
innobase/include/trx0rec.h:
< 4 GB rows, doublewrite, hang fixes
innobase/include/trx0sys.h:
< 4 GB rows, doublewrite, hang fixes
innobase/include/trx0types.h:
< 4 GB rows, doublewrite, hang fixes
innobase/include/trx0undo.h:
< 4 GB rows, doublewrite, hang fixes
innobase/include/ut0dbg.h:
< 4 GB rows, doublewrite, hang fixes
innobase/include/ut0ut.h:
< 4 GB rows, doublewrite, hang fixes
innobase/include/data0data.ic:
< 4 GB rows, doublewrite, hang fixes
innobase/include/mach0data.ic:
< 4 GB rows, doublewrite, hang fixes
innobase/include/rem0rec.ic:
< 4 GB rows, doublewrite, hang fixes
innobase/include/row0upd.ic:
< 4 GB rows, doublewrite, hang fixes
innobase/include/trx0rec.ic:
< 4 GB rows, doublewrite, hang fixes
innobase/include/univ.i:
< 4 GB rows, doublewrite, hang fixes
innobase/btr/btr0btr.c:
< 4 GB rows, doublewrite, hang fixes
innobase/btr/btr0cur.c:
< 4 GB rows, doublewrite, hang fixes
innobase/buf/buf0buf.c:
< 4 GB rows, doublewrite, hang fixes
innobase/buf/buf0flu.c:
< 4 GB rows, doublewrite, hang fixes
innobase/buf/buf0rea.c:
< 4 GB rows, doublewrite, hang fixes
innobase/data/data0data.c:
< 4 GB rows, doublewrite, hang fixes
innobase/fil/fil0fil.c:
< 4 GB rows, doublewrite, hang fixes
innobase/fsp/fsp0fsp.c:
< 4 GB rows, doublewrite, hang fixes
innobase/ibuf/ibuf0ibuf.c:
< 4 GB rows, doublewrite, hang fixes
innobase/lock/lock0lock.c:
< 4 GB rows, doublewrite, hang fixes
innobase/log/log0log.c:
< 4 GB rows, doublewrite, hang fixes
innobase/log/log0recv.c:
< 4 GB rows, doublewrite, hang fixes
innobase/os/os0file.c:
< 4 GB rows, doublewrite, hang fixes
innobase/page/page0cur.c:
< 4 GB rows, doublewrite, hang fixes
innobase/pars/pars0pars.c:
< 4 GB rows, doublewrite, hang fixes
innobase/rem/rem0cmp.c:
< 4 GB rows, doublewrite, hang fixes
innobase/rem/rem0rec.c:
< 4 GB rows, doublewrite, hang fixes
innobase/row/row0ins.c:
< 4 GB rows, doublewrite, hang fixes
innobase/row/row0mysql.c:
< 4 GB rows, doublewrite, hang fixes
innobase/row/row0purge.c:
< 4 GB rows, doublewrite, hang fixes
innobase/row/row0row.c:
< 4 GB rows, doublewrite, hang fixes
innobase/row/row0sel.c:
< 4 GB rows, doublewrite, hang fixes
innobase/row/row0uins.c:
< 4 GB rows, doublewrite, hang fixes
innobase/row/row0umod.c:
< 4 GB rows, doublewrite, hang fixes
innobase/row/row0undo.c:
< 4 GB rows, doublewrite, hang fixes
innobase/row/row0upd.c:
< 4 GB rows, doublewrite, hang fixes
innobase/sync/sync0rw.c:
< 4 GB rows, doublewrite, hang fixes
innobase/sync/sync0sync.c:
< 4 GB rows, doublewrite, hang fixes
innobase/trx/trx0purge.c:
< 4 GB rows, doublewrite, hang fixes
innobase/trx/trx0rec.c:
< 4 GB rows, doublewrite, hang fixes
innobase/trx/trx0sys.c:
< 4 GB rows, doublewrite, hang fixes
innobase/srv/srv0srv.c:
Support raw disk partitions as data files
innobase/srv/srv0start.c:
Support raw disk partitions as data files
innobase/include/srv0srv.h:
Support raw disk partitions as data files
2001-08-04 19:36:14 +03:00
|
|
|
occupied by the field structs or the tuple struct is not counted. Neither
|
|
|
|
is possible space in externally stored parts of the field. */
|
2001-02-17 14:19:19 +02:00
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dtuple_get_data_size(
|
|
|
|
/*=================*/
|
srv0srv.h Support raw disk partitions as data files
srv0start.c Support raw disk partitions as data files
srv0srv.c Support raw disk partitions as data files
row0purge.c < 4 GB rows, doublewrite, hang fixes
row0row.c < 4 GB rows, doublewrite, hang fixes
row0sel.c < 4 GB rows, doublewrite, hang fixes
row0uins.c < 4 GB rows, doublewrite, hang fixes
row0umod.c < 4 GB rows, doublewrite, hang fixes
row0undo.c < 4 GB rows, doublewrite, hang fixes
row0upd.c < 4 GB rows, doublewrite, hang fixes
srv0srv.c < 4 GB rows, doublewrite, hang fixes
srv0start.c < 4 GB rows, doublewrite, hang fixes
sync0rw.c < 4 GB rows, doublewrite, hang fixes
sync0sync.c < 4 GB rows, doublewrite, hang fixes
trx0purge.c < 4 GB rows, doublewrite, hang fixes
trx0rec.c < 4 GB rows, doublewrite, hang fixes
trx0sys.c < 4 GB rows, doublewrite, hang fixes
btr0btr.c < 4 GB rows, doublewrite, hang fixes
btr0cur.c < 4 GB rows, doublewrite, hang fixes
buf0buf.c < 4 GB rows, doublewrite, hang fixes
buf0flu.c < 4 GB rows, doublewrite, hang fixes
buf0rea.c < 4 GB rows, doublewrite, hang fixes
data0data.c < 4 GB rows, doublewrite, hang fixes
fil0fil.c < 4 GB rows, doublewrite, hang fixes
fsp0fsp.c < 4 GB rows, doublewrite, hang fixes
ibuf0ibuf.c < 4 GB rows, doublewrite, hang fixes
lock0lock.c < 4 GB rows, doublewrite, hang fixes
log0log.c < 4 GB rows, doublewrite, hang fixes
log0recv.c < 4 GB rows, doublewrite, hang fixes
os0file.c < 4 GB rows, doublewrite, hang fixes
page0cur.c < 4 GB rows, doublewrite, hang fixes
pars0pars.c < 4 GB rows, doublewrite, hang fixes
rem0cmp.c < 4 GB rows, doublewrite, hang fixes
rem0rec.c < 4 GB rows, doublewrite, hang fixes
row0ins.c < 4 GB rows, doublewrite, hang fixes
row0mysql.c < 4 GB rows, doublewrite, hang fixes
univ.i < 4 GB rows, doublewrite, hang fixes
data0data.ic < 4 GB rows, doublewrite, hang fixes
mach0data.ic < 4 GB rows, doublewrite, hang fixes
rem0rec.ic < 4 GB rows, doublewrite, hang fixes
row0upd.ic < 4 GB rows, doublewrite, hang fixes
trx0rec.ic < 4 GB rows, doublewrite, hang fixes
rem0cmp.h < 4 GB rows, doublewrite, hang fixes
rem0rec.h < 4 GB rows, doublewrite, hang fixes
row0ins.h < 4 GB rows, doublewrite, hang fixes
row0mysql.h < 4 GB rows, doublewrite, hang fixes
row0row.h < 4 GB rows, doublewrite, hang fixes
row0upd.h < 4 GB rows, doublewrite, hang fixes
srv0srv.h < 4 GB rows, doublewrite, hang fixes
sync0sync.h < 4 GB rows, doublewrite, hang fixes
trx0rec.h < 4 GB rows, doublewrite, hang fixes
trx0sys.h < 4 GB rows, doublewrite, hang fixes
trx0types.h < 4 GB rows, doublewrite, hang fixes
trx0undo.h < 4 GB rows, doublewrite, hang fixes
ut0dbg.h < 4 GB rows, doublewrite, hang fixes
ut0ut.h < 4 GB rows, doublewrite, hang fixes
btr0btr.h < 4 GB rows, doublewrite, hang fixes
btr0cur.h < 4 GB rows, doublewrite, hang fixes
buf0buf.h < 4 GB rows, doublewrite, hang fixes
buf0flu.h < 4 GB rows, doublewrite, hang fixes
data0data.h < 4 GB rows, doublewrite, hang fixes
dict0mem.h < 4 GB rows, doublewrite, hang fixes
fil0fil.h < 4 GB rows, doublewrite, hang fixes
fsp0fsp.h < 4 GB rows, doublewrite, hang fixes
os0file.h < 4 GB rows, doublewrite, hang fixes
innobase/include/btr0btr.h:
< 4 GB rows, doublewrite, hang fixes
innobase/include/btr0cur.h:
< 4 GB rows, doublewrite, hang fixes
innobase/include/buf0buf.h:
< 4 GB rows, doublewrite, hang fixes
innobase/include/buf0flu.h:
< 4 GB rows, doublewrite, hang fixes
innobase/include/data0data.h:
< 4 GB rows, doublewrite, hang fixes
innobase/include/dict0mem.h:
< 4 GB rows, doublewrite, hang fixes
innobase/include/fil0fil.h:
< 4 GB rows, doublewrite, hang fixes
innobase/include/fsp0fsp.h:
< 4 GB rows, doublewrite, hang fixes
innobase/include/os0file.h:
< 4 GB rows, doublewrite, hang fixes
innobase/include/rem0cmp.h:
< 4 GB rows, doublewrite, hang fixes
innobase/include/rem0rec.h:
< 4 GB rows, doublewrite, hang fixes
innobase/include/row0ins.h:
< 4 GB rows, doublewrite, hang fixes
innobase/include/row0mysql.h:
< 4 GB rows, doublewrite, hang fixes
innobase/include/row0row.h:
< 4 GB rows, doublewrite, hang fixes
innobase/include/row0upd.h:
< 4 GB rows, doublewrite, hang fixes
innobase/include/sync0sync.h:
< 4 GB rows, doublewrite, hang fixes
innobase/include/trx0rec.h:
< 4 GB rows, doublewrite, hang fixes
innobase/include/trx0sys.h:
< 4 GB rows, doublewrite, hang fixes
innobase/include/trx0types.h:
< 4 GB rows, doublewrite, hang fixes
innobase/include/trx0undo.h:
< 4 GB rows, doublewrite, hang fixes
innobase/include/ut0dbg.h:
< 4 GB rows, doublewrite, hang fixes
innobase/include/ut0ut.h:
< 4 GB rows, doublewrite, hang fixes
innobase/include/data0data.ic:
< 4 GB rows, doublewrite, hang fixes
innobase/include/mach0data.ic:
< 4 GB rows, doublewrite, hang fixes
innobase/include/rem0rec.ic:
< 4 GB rows, doublewrite, hang fixes
innobase/include/row0upd.ic:
< 4 GB rows, doublewrite, hang fixes
innobase/include/trx0rec.ic:
< 4 GB rows, doublewrite, hang fixes
innobase/include/univ.i:
< 4 GB rows, doublewrite, hang fixes
innobase/btr/btr0btr.c:
< 4 GB rows, doublewrite, hang fixes
innobase/btr/btr0cur.c:
< 4 GB rows, doublewrite, hang fixes
innobase/buf/buf0buf.c:
< 4 GB rows, doublewrite, hang fixes
innobase/buf/buf0flu.c:
< 4 GB rows, doublewrite, hang fixes
innobase/buf/buf0rea.c:
< 4 GB rows, doublewrite, hang fixes
innobase/data/data0data.c:
< 4 GB rows, doublewrite, hang fixes
innobase/fil/fil0fil.c:
< 4 GB rows, doublewrite, hang fixes
innobase/fsp/fsp0fsp.c:
< 4 GB rows, doublewrite, hang fixes
innobase/ibuf/ibuf0ibuf.c:
< 4 GB rows, doublewrite, hang fixes
innobase/lock/lock0lock.c:
< 4 GB rows, doublewrite, hang fixes
innobase/log/log0log.c:
< 4 GB rows, doublewrite, hang fixes
innobase/log/log0recv.c:
< 4 GB rows, doublewrite, hang fixes
innobase/os/os0file.c:
< 4 GB rows, doublewrite, hang fixes
innobase/page/page0cur.c:
< 4 GB rows, doublewrite, hang fixes
innobase/pars/pars0pars.c:
< 4 GB rows, doublewrite, hang fixes
innobase/rem/rem0cmp.c:
< 4 GB rows, doublewrite, hang fixes
innobase/rem/rem0rec.c:
< 4 GB rows, doublewrite, hang fixes
innobase/row/row0ins.c:
< 4 GB rows, doublewrite, hang fixes
innobase/row/row0mysql.c:
< 4 GB rows, doublewrite, hang fixes
innobase/row/row0purge.c:
< 4 GB rows, doublewrite, hang fixes
innobase/row/row0row.c:
< 4 GB rows, doublewrite, hang fixes
innobase/row/row0sel.c:
< 4 GB rows, doublewrite, hang fixes
innobase/row/row0uins.c:
< 4 GB rows, doublewrite, hang fixes
innobase/row/row0umod.c:
< 4 GB rows, doublewrite, hang fixes
innobase/row/row0undo.c:
< 4 GB rows, doublewrite, hang fixes
innobase/row/row0upd.c:
< 4 GB rows, doublewrite, hang fixes
innobase/sync/sync0rw.c:
< 4 GB rows, doublewrite, hang fixes
innobase/sync/sync0sync.c:
< 4 GB rows, doublewrite, hang fixes
innobase/trx/trx0purge.c:
< 4 GB rows, doublewrite, hang fixes
innobase/trx/trx0rec.c:
< 4 GB rows, doublewrite, hang fixes
innobase/trx/trx0sys.c:
< 4 GB rows, doublewrite, hang fixes
innobase/srv/srv0srv.c:
Support raw disk partitions as data files
innobase/srv/srv0start.c:
Support raw disk partitions as data files
innobase/include/srv0srv.h:
Support raw disk partitions as data files
2001-08-04 19:36:14 +03:00
|
|
|
/* out: sum of data lengths */
|
2001-02-17 14:19:19 +02:00
|
|
|
dtuple_t* tuple) /* in: typed data tuple */
|
|
|
|
{
|
|
|
|
dfield_t* field;
|
|
|
|
ulint n_fields;
|
|
|
|
ulint len;
|
|
|
|
ulint i;
|
|
|
|
ulint sum = 0;
|
|
|
|
|
|
|
|
ut_ad(tuple);
|
|
|
|
ut_ad(dtuple_check_typed(tuple));
|
InnoDB cleanup: fixing buffer overflows and quoting of quotes
innobase/dict/dict0crea.c:
Remove unneeded prototypes for static functions
Remove unused parameters from some functions
Replace some assertions with compile-time checks
dict_create_add_foreigns_to_dictionary():
allocate space dynamically for the SQL, and quote quotes
innobase/dict/dict0dict.c:
Remove unnecessary prototypes for static functions
dict_tables_have_same_db(): Remove length limitation
dict_remove_db_name(): Use strchr()
dict_get_db_name_len(): Use strchr()
Replace mem_heap_alloc()+strlen()+memcpy() with mem_heap_strdup()
Remove unnecessary strlen() calls
Allocate space dynamically for generated strings
dict_scan_id(): allow quotes within quoted strings
innobase/dict/dict0load.c:
Remove unnecessary strlen() calls
Replace mem_heap_alloc()+strlen()+memcpy() with mem_heap_strdup()
innobase/dict/dict0mem.c:
Replace mem_heap_alloc()+strlen()+memcpy() with mem_heap_strdup()
innobase/eval/eval0eval.c:
Make TO_CHAR() work with any machine word width
innobase/fil/fil0fil.c:
Replace mem_alloc()+strlen()+strcpy() with mem_strdup()
innobase/ibuf/ibuf0ibuf.c:
Make some global variables static
Add #ifdef UNIV_IBUF_DEBUG around debug statements
innobase/include/data0data.h:
Add #ifdef UNIV_DEBUG around dtuple_validate()
innobase/include/data0data.ic:
Replace = with == in ut_ad(tuple->magic_n == DATA_TUPLE_MAGIC_N)
innobase/include/dict0dict.h:
Add const qualifiers
innobase/include/lock0lock.h:
Add UL suffixes to unsigned long masks
innobase/include/log0log.h:
Remove unused parameter "type" of log_group_write_buf()
innobase/include/mem0mem.h:
Add mem_strdup(), mem_strdupl(), mem_strdupq(), mem_heap_strdup(),
and mem_heap_strdupl()
innobase/include/mem0mem.ic:
Add mem_strdup(), mem_strdupl(), mem_strdupq(), mem_heap_strdup(),
and mem_heap_strdupl()
innobase/include/row0uins.h:
Remove unused parameter "thr" of row_undo_ins()
innobase/include/row0undo.h:
Remvoe unused parameter "thr" of row_undo_search_clust_to_pcur()
innobase/include/ut0byte.h:
Add const qualifier to ut_cpy_in_lower_case()
Remove parameter "len" of ut_cmp_in_lower_case()
innobase/include/ut0mem.h:
Add ut_strlenq(), ut_strcpyq() and ut_memcpyq()
innobase/include/ut0mem.ic:
Add ut_strlenq()
innobase/include/ut0ut.h:
Declare ut_sprintf() as a printf-style function
innobase/lock/lock0lock.c:
lock_clust_rec_modify_check_and_lock(): Remove unused variable "trx"
innobase/log/log0log.c:
Remove unused parameters
innobase/log/log0recv.c:
Remove parameter "type" from log_group_write_buf()
innobase/mem/mem0mem.c:
Simplify the initialization of block->init_block
innobase/mtr/mtr0log.c:
Add a debug assertion to mlog_parse_initial_log_record()
innobase/page/page0cur.c:
Add debug assertion to page_cur_insert_rec_write_log()
Remove hard-coded buffer size in page_cur_parse_insert_rec()
innobase/page/page0page.c:
Remove unneeded variable rec
innobase/pars/pars0opt.c:
Correct a potential buffer overflow
innobase/pars/pars0pars.c:
Replace mem_heap_alloc()+strlen()+memcpy() with mem_heap_strdup()
innobase/row/row0ins.c:
Replace parameter "thr" with "trx" in row_ins_foreign_report_add_err()
Remove unnecessary strlen() call
Use strchr()
innobase/row/row0mysql.c:
Add row_mysql_is_recovered_tmp_table()
Add row_mysql_is_system_table()
Compare reserved table names with exact match
Use strstr() and strchr() and mem_strdupl()
Compute space needed for generated SQL, and allocate it dynamically
innobase/row/row0purge.c:
Remove unused parameters "thr"
innobase/row/row0row.c:
Simplify row_get_clust_rec()
innobase/row/row0uins.c:
Remove unused parameters "thr"
innobase/row/row0umod.c:
Remove unused variable "index"
row_undo_mod_del_unmark_sec_and_undo_update():
Remove parameter "node" and variable "rec"
Remove unused parameters "thr"
innobase/row/row0undo.c:
Remove unused parameters "thr"
innobase/srv/srv0srv.c:
Replace UT_NOT_USED() with __attribute__((unused))
innobase/srv/srv0start.c:
Remove unnecessary strlen() calls
Remove unused parameter "create_new_db" of open_or_create_log_file()
innobase/trx/trx0roll.c:
Replace mem_alloc()+strlen()+memcpy() with mem_strdup()
innobase/trx/trx0sys.c:
Remove unnecessary strlen() call
innobase/ut/ut0byte.c:
Add const qualifier to ut_cpy_in_lower_case()
Remove parameter "len" of ut_cmp_in_lower_case()
innobase/ut/ut0mem.c:
Add ut_strlenq() and ut_memcpyq()
sql/ha_innodb.cc:
Remove parameter "len" of ut_cmp_in_lower_case()
2004-04-01 16:51:34 +03:00
|
|
|
ut_ad(tuple->magic_n == DATA_TUPLE_MAGIC_N);
|
2001-02-17 14:19:19 +02:00
|
|
|
|
|
|
|
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));
|
|
|
|
}
|
|
|
|
|
|
|
|
sum += len;
|
|
|
|
}
|
|
|
|
|
|
|
|
return(sum);
|
|
|
|
}
|
|
|
|
|
|
|
|
/***********************************************************************
|
|
|
|
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, 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/****************************************************************
|
|
|
|
Folds a prefix given as the number of fields of a tuple. */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dtuple_fold(
|
|
|
|
/*========*/
|
|
|
|
/* out: the folded value */
|
|
|
|
dtuple_t* tuple, /* in: the tuple */
|
|
|
|
ulint n_fields,/* in: number of complete fields to fold */
|
|
|
|
ulint n_bytes,/* in: number of bytes to fold in an
|
|
|
|
incomplete last field */
|
|
|
|
dulint tree_id)/* in: index tree id */
|
|
|
|
{
|
|
|
|
dfield_t* field;
|
|
|
|
ulint i;
|
|
|
|
byte* data;
|
|
|
|
ulint len;
|
|
|
|
ulint fold;
|
|
|
|
|
|
|
|
ut_ad(tuple);
|
InnoDB cleanup: fixing buffer overflows and quoting of quotes
innobase/dict/dict0crea.c:
Remove unneeded prototypes for static functions
Remove unused parameters from some functions
Replace some assertions with compile-time checks
dict_create_add_foreigns_to_dictionary():
allocate space dynamically for the SQL, and quote quotes
innobase/dict/dict0dict.c:
Remove unnecessary prototypes for static functions
dict_tables_have_same_db(): Remove length limitation
dict_remove_db_name(): Use strchr()
dict_get_db_name_len(): Use strchr()
Replace mem_heap_alloc()+strlen()+memcpy() with mem_heap_strdup()
Remove unnecessary strlen() calls
Allocate space dynamically for generated strings
dict_scan_id(): allow quotes within quoted strings
innobase/dict/dict0load.c:
Remove unnecessary strlen() calls
Replace mem_heap_alloc()+strlen()+memcpy() with mem_heap_strdup()
innobase/dict/dict0mem.c:
Replace mem_heap_alloc()+strlen()+memcpy() with mem_heap_strdup()
innobase/eval/eval0eval.c:
Make TO_CHAR() work with any machine word width
innobase/fil/fil0fil.c:
Replace mem_alloc()+strlen()+strcpy() with mem_strdup()
innobase/ibuf/ibuf0ibuf.c:
Make some global variables static
Add #ifdef UNIV_IBUF_DEBUG around debug statements
innobase/include/data0data.h:
Add #ifdef UNIV_DEBUG around dtuple_validate()
innobase/include/data0data.ic:
Replace = with == in ut_ad(tuple->magic_n == DATA_TUPLE_MAGIC_N)
innobase/include/dict0dict.h:
Add const qualifiers
innobase/include/lock0lock.h:
Add UL suffixes to unsigned long masks
innobase/include/log0log.h:
Remove unused parameter "type" of log_group_write_buf()
innobase/include/mem0mem.h:
Add mem_strdup(), mem_strdupl(), mem_strdupq(), mem_heap_strdup(),
and mem_heap_strdupl()
innobase/include/mem0mem.ic:
Add mem_strdup(), mem_strdupl(), mem_strdupq(), mem_heap_strdup(),
and mem_heap_strdupl()
innobase/include/row0uins.h:
Remove unused parameter "thr" of row_undo_ins()
innobase/include/row0undo.h:
Remvoe unused parameter "thr" of row_undo_search_clust_to_pcur()
innobase/include/ut0byte.h:
Add const qualifier to ut_cpy_in_lower_case()
Remove parameter "len" of ut_cmp_in_lower_case()
innobase/include/ut0mem.h:
Add ut_strlenq(), ut_strcpyq() and ut_memcpyq()
innobase/include/ut0mem.ic:
Add ut_strlenq()
innobase/include/ut0ut.h:
Declare ut_sprintf() as a printf-style function
innobase/lock/lock0lock.c:
lock_clust_rec_modify_check_and_lock(): Remove unused variable "trx"
innobase/log/log0log.c:
Remove unused parameters
innobase/log/log0recv.c:
Remove parameter "type" from log_group_write_buf()
innobase/mem/mem0mem.c:
Simplify the initialization of block->init_block
innobase/mtr/mtr0log.c:
Add a debug assertion to mlog_parse_initial_log_record()
innobase/page/page0cur.c:
Add debug assertion to page_cur_insert_rec_write_log()
Remove hard-coded buffer size in page_cur_parse_insert_rec()
innobase/page/page0page.c:
Remove unneeded variable rec
innobase/pars/pars0opt.c:
Correct a potential buffer overflow
innobase/pars/pars0pars.c:
Replace mem_heap_alloc()+strlen()+memcpy() with mem_heap_strdup()
innobase/row/row0ins.c:
Replace parameter "thr" with "trx" in row_ins_foreign_report_add_err()
Remove unnecessary strlen() call
Use strchr()
innobase/row/row0mysql.c:
Add row_mysql_is_recovered_tmp_table()
Add row_mysql_is_system_table()
Compare reserved table names with exact match
Use strstr() and strchr() and mem_strdupl()
Compute space needed for generated SQL, and allocate it dynamically
innobase/row/row0purge.c:
Remove unused parameters "thr"
innobase/row/row0row.c:
Simplify row_get_clust_rec()
innobase/row/row0uins.c:
Remove unused parameters "thr"
innobase/row/row0umod.c:
Remove unused variable "index"
row_undo_mod_del_unmark_sec_and_undo_update():
Remove parameter "node" and variable "rec"
Remove unused parameters "thr"
innobase/row/row0undo.c:
Remove unused parameters "thr"
innobase/srv/srv0srv.c:
Replace UT_NOT_USED() with __attribute__((unused))
innobase/srv/srv0start.c:
Remove unnecessary strlen() calls
Remove unused parameter "create_new_db" of open_or_create_log_file()
innobase/trx/trx0roll.c:
Replace mem_alloc()+strlen()+memcpy() with mem_strdup()
innobase/trx/trx0sys.c:
Remove unnecessary strlen() call
innobase/ut/ut0byte.c:
Add const qualifier to ut_cpy_in_lower_case()
Remove parameter "len" of ut_cmp_in_lower_case()
innobase/ut/ut0mem.c:
Add ut_strlenq() and ut_memcpyq()
sql/ha_innodb.cc:
Remove parameter "len" of ut_cmp_in_lower_case()
2004-04-01 16:51:34 +03:00
|
|
|
ut_ad(tuple->magic_n == DATA_TUPLE_MAGIC_N);
|
2001-02-17 14:19:19 +02:00
|
|
|
ut_ad(dtuple_check_typed(tuple));
|
|
|
|
|
|
|
|
fold = ut_fold_dulint(tree_id);
|
|
|
|
|
|
|
|
for (i = 0; i < n_fields; i++) {
|
|
|
|
field = dtuple_get_nth_field(tuple, i);
|
|
|
|
|
|
|
|
data = (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 = (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 */
|
|
|
|
{
|
|
|
|
ulint j;
|
|
|
|
|
|
|
|
for (j = 0; j < len; j++) {
|
|
|
|
data[j] = '\0';
|
|
|
|
}
|
|
|
|
}
|
data0data.ic, data0data.h, row0sel.c:
Fix bug #2483 with InnoDB, UNIQUE secondary index, and NULL values in that unique index; with the IS NULL predicate, InnoDB returned only the first matching row, though there can be many
innobase/row/row0sel.c:
Fix bug #2483 with InnoDB, UNIQUE secondary index, and NULL values in that unique index; with the IS NULL predicate, InnoDB returned only the first matching row, though there can be many
innobase/include/data0data.h:
Fix bug #2483 with InnoDB, UNIQUE secondary index, and NULL values in that unique index; with the IS NULL predicate, InnoDB returned only the first matching row, though there can be many
innobase/include/data0data.ic:
Fix bug #2483 with InnoDB, UNIQUE secondary index, and NULL values in that unique index; with the IS NULL predicate, InnoDB returned only the first matching row, though there can be many
2004-01-27 20:10:04 +02:00
|
|
|
|
|
|
|
/**************************************************************************
|
|
|
|
Checks if a dtuple contains an SQL null value. */
|
|
|
|
UNIV_INLINE
|
|
|
|
ibool
|
|
|
|
dtuple_contains_null(
|
|
|
|
/*=================*/
|
|
|
|
/* out: TRUE if some field is SQL null */
|
|
|
|
dtuple_t* tuple) /* in: dtuple */
|
|
|
|
{
|
|
|
|
ulint n;
|
|
|
|
ulint i;
|
|
|
|
|
|
|
|
n = dtuple_get_n_fields(tuple);
|
|
|
|
|
|
|
|
for (i = 0; i < n; i++) {
|
|
|
|
if (dfield_get_len(dtuple_get_nth_field(tuple, i))
|
|
|
|
== UNIV_SQL_NULL) {
|
|
|
|
|
|
|
|
return(TRUE);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return(FALSE);
|
2004-02-05 09:12:23 +01:00
|
|
|
}
|