29 #include "data0data.ic"
32 #ifndef UNIV_HOTBACKUP
47 UNIV_INTERN byte data_error;
49 # ifndef UNIV_DEBUG_VALGRIND
51 UNIV_INTERN ulint data_dummy;
55 #ifndef UNIV_HOTBACKUP
61 dfield_data_is_binary_equal(
72 if (len == UNIV_SQL_NULL) {
77 if (0 != memcmp(dfield_get_data(field), data, len)) {
99 ut_ad(tuple1 && tuple2);
100 ut_ad(tuple1->magic_n == DATA_TUPLE_MAGIC_N);
101 ut_ad(tuple2->magic_n == DATA_TUPLE_MAGIC_N);
112 for (i = 0; i < n_fields; i++) {
114 const dfield_t* field1 = dtuple_get_nth_field(tuple1, i);
115 const dfield_t* field2 = dtuple_get_nth_field(tuple2, i);
148 dfield_check_typed_no_assert(
152 if (dfield_get_type(field)->mtype > DATA_MYSQL
153 || dfield_get_type(field)->mtype < DATA_VARCHAR) {
156 "InnoDB: Error: data field type %lu, len %lu\n",
157 (ulong) dfield_get_type(field)->mtype,
170 dtuple_check_typed_no_assert(
179 "InnoDB: Error: index entry has %lu fields\n",
182 fputs(
"InnoDB: Tuple contents: ", stderr);
183 dtuple_print(stderr, tuple);
191 field = dtuple_get_nth_field(tuple, i);
193 if (!dfield_check_typed_no_assert(field)) {
212 if (dfield_get_type(field)->mtype > DATA_MYSQL
213 || dfield_get_type(field)->mtype < DATA_VARCHAR) {
216 "InnoDB: Error: data field type %lu, len %lu\n",
217 (ulong) dfield_get_type(field)->mtype,
240 field = dtuple_get_nth_field(tuple, i);
263 ut_ad(tuple->magic_n == DATA_TUPLE_MAGIC_N);
270 for (i = 0; i < n_fields; i++) {
272 field = dtuple_get_nth_field(tuple, i);
277 const byte* data = dfield_get_data(field);
278 #ifndef UNIV_DEBUG_VALGRIND
281 for (j = 0; j < len; j++) {
290 UNIV_MEM_ASSERT_RW(data, len);
300 #ifndef UNIV_HOTBACKUP
312 const byte *data =
static_cast<const byte *
>(dfield_get_data(dfield));
315 fputs(
"NULL", stderr);
323 for (i = 0; i < len; i++) {
325 putc(isprint(c) ? c :
' ', stderr);
329 fputs(
"(external)", stderr);
346 dfield_print_also_hex(
354 ibool print_also_hex;
357 data =
static_cast<const byte *
>(dfield_get_data(dfield));
360 fputs(
"NULL", stderr);
369 static const ulint UNSIGNED_MASK= 0x80000000;
377 if (!(prtype & DATA_UNSIGNED)) {
379 fprintf(stderr,
"%ld", (
long) val);
381 fprintf(stderr,
"%lu", (ulong) val);
388 if (!(prtype & DATA_UNSIGNED)) {
390 fprintf(stderr,
"%ld", (
long) val);
392 fprintf(stderr,
"%lu", (ulong) val);
399 if (!(prtype & DATA_UNSIGNED)) {
401 fprintf(stderr,
"%ld", (
long) val);
403 fprintf(stderr,
"%lu", (ulong) val);
410 if (!(prtype & DATA_UNSIGNED)) {
411 val &= ~UNSIGNED_MASK;
412 fprintf(stderr,
"%ld", (
long) val);
414 fprintf(stderr,
"%lu", (ulong) val);
420 fprintf(stderr,
"%llu", (ullint)
id);
425 fprintf(stderr,
"%llu", (ullint)
id);
429 fprintf(stderr,
"%llu", (ullint)
id);
437 switch (prtype & DATA_SYS_PRTYPE_MASK) {
465 print_also_hex = FALSE;
467 for (i = 0; i < len; i++) {
471 print_also_hex = TRUE;
473 fprintf(stderr,
"\\x%02x", (
unsigned char) c);
480 fputs(
"(external)", stderr);
483 if (!print_also_hex) {
487 data =
static_cast<const byte *
>(dfield_get_data(dfield));
493 fputs(
" Hex: ",stderr);
495 for (i = 0; i < len; i++) {
496 fprintf(stderr,
"%02lx", (ulint) *data++);
500 fputs(
"(external)", stderr);
516 ulint print_len =
ut_min(len, 1000);
518 if (len != print_len) {
519 fprintf(f,
"(total %lu bytes%s)",
524 fputs(
" SQL NULL", f);
542 fprintf(f,
"DATA TUPLE: %lu fields;\n", (ulong) n_fields);
544 for (i = 0; i < n_fields; i++) {
545 fprintf(f,
" %lu:", (ulong) i);
547 dfield_print_raw(f, dtuple_get_nth_field(tuple, i));
553 ut_ad(dtuple_validate(tuple));
566 dtuple_convert_big_rec(
580 ulint local_prefix_len;
594 ut_a(dtuple_check_typed_no_assert(entry));
598 if (UNIV_UNLIKELY(size > 1000000000)) {
600 "InnoDB: Warning: tuple size very big: %lu\n",
602 fputs(
"InnoDB: Tuple contents: ", stderr);
603 dtuple_print(stderr, entry);
629 ulint longest_i = ULINT_MAX;
637 dfield = dtuple_get_nth_field(entry, i);
638 ifield = dict_index_get_nth_field(index, i);
655 if (longest >= savings) {
670 && ifield->
col->
len < 256) {
685 && ifield->
col->
len < 256) {
700 && ifield->
col->
len < 256) {
725 dfield = dtuple_get_nth_field(entry, longest_i);
726 ifield = dict_index_get_nth_field(index, longest_i);
729 b = &vector->
fields[n_fields];
732 b->
data = (
char*) dfield_get_data(dfield) + local_prefix_len;
735 data =
static_cast<unsigned char *
>(
mem_heap_alloc(heap, local_len));
738 memcpy(data, dfield_get_data(dfield), local_prefix_len);
740 memset(data + local_prefix_len, 0, BTR_EXTERN_FIELD_REF_SIZE);
746 UNIV_MEM_ALLOC(data + local_prefix_len,
747 BTR_EXTERN_FIELD_REF_SIZE);
768 dtuple_convert_back_big_rec(
778 for (; b < end; b++) {
782 dfield = dtuple_get_nth_field(entry, b->
field_no);
793 (
char*) b->
data - local_len,