mariadb/innobase/rem/ts/tsrem.c
2001-02-17 14:19:19 +02:00

464 lines
11 KiB
C

/************************************************************************
The test for the record manager
(c) 1994-1996 Innobase Oy
Created 1/25/1994 Heikki Tuuri
*************************************************************************/
#include "sync0sync.h"
#include "mem0mem.h"
#include "data0data.h"
#include "data0type.h"
#include "dict0dict.h"
#include "buf0buf.h"
#include "fil0fil.h"
#include "../rem0rec.h"
#include "../rem0cmp.h"
byte buf1[100000];
/*********************************************************************
Test for data tuples. */
void
test1(void)
/*=======*/
{
dtype_t* type;
dtuple_t* tuple, *tuple2;
dfield_t* field;
mem_heap_t* heap;
ulint i, j;
ulint n;
char* p_Pascal;
char* p_Cobol;
heap = mem_heap_create(0);
printf("-------------------------------------------\n");
printf("DATA TUPLE-TEST 1. Basic tests.\n");
tuple = dtuple_create(heap, 2);
field = dtuple_get_nth_field(tuple, 0);
dfield_set_data(field, "Pascal", 7);
dtype_set(dfield_get_type(field), DATA_CHAR, DATA_ENGLISH, 7, 0);
field = dtuple_get_nth_field(tuple, 1);
dfield_set_data(field, "Cobol", 6);
dtype_set(dfield_get_type(field), DATA_CHAR, DATA_ENGLISH, 6, 0);
dtuple_validate(tuple);
dtuple_print(tuple);
tuple2 = dtuple_create(heap, 10);
for (i = 0; i < 10; i++) {
field = dtuple_get_nth_field(tuple2, i);
dfield_set_data(field, NULL, UNIV_SQL_NULL);
dtype_set(dfield_get_type(field), DATA_CHAR, DATA_ENGLISH,
6, 0);
}
dtuple_print(tuple2);
printf("-------------------------------------------\n");
printf("DATA TUPLE-TEST 2. Accessor function tests.\n");
tuple = dtuple_create(heap, 2);
p_Pascal = "Pascal";
p_Cobol = "Cobol";
field = dtuple_get_nth_field(tuple, 0);
dfield_set_data(field, p_Pascal, 7);
dtype_set(dfield_get_type(field), DATA_CHAR, DATA_ENGLISH, 7, 0);
field = dtuple_get_nth_field(tuple, 1);
dfield_set_data(field, p_Cobol, 6);
dtype_set(dfield_get_type(field), DATA_VARCHAR, DATA_ENGLISH, 16, 3);
ut_a(dtuple_get_n_fields(tuple) == 2);
field = dtuple_get_nth_field(tuple, 0);
ut_a(p_Pascal == dfield_get_data(field));
ut_a(7 == dfield_get_len(field));
type = dfield_get_type(field);
ut_a(type->mtype == DATA_CHAR);
ut_a(type->prtype == DATA_ENGLISH);
ut_a(type->len == 7);
ut_a(type->prec == 0);
field = dtuple_get_nth_field(tuple, 1);
ut_a(p_Cobol == dfield_get_data(field));
ut_a(6 == dfield_get_len(field));
type = dfield_get_type(field);
ut_a(type->mtype == DATA_VARCHAR);
ut_a(type->prtype == DATA_ENGLISH);
ut_a(type->len == 16);
ut_a(type->prec == 3);
printf("-------------------------------------------\n");
printf("DATA TYPE-TEST 3. Other function tests\n");
ut_a(dtuple_get_data_size(tuple) == 13);
ut_a(dtuple_fold(tuple, 2) == dtuple_fold(tuple, 2));
ut_a(dtuple_fold(tuple, 1) != dtuple_fold(tuple, 2));
printf("-------------------------------------------\n");
printf("DATA TUPLE-TEST 4. Random tuple generation test\n");
for (i = 0; i < 500; i++) {
tuple = dtuple_gen_rnd_tuple(heap);
printf("%lu ", i);
dtuple_validate(tuple);
n = dtuple_get_n_fields(tuple);
if (n < 25) {
tuple2 = dtuple_create(heap, n);
for (j = 0; j < n; j++) {
dfield_copy(
dtuple_get_nth_field(tuple2, j),
dtuple_get_nth_field(tuple, j));
}
dtuple_validate(tuple2);
ut_a(dtuple_fold(tuple, n) ==
dtuple_fold(tuple2, n));
}
}
mem_print_info();
mem_heap_free(heap);
}
/**********************************************************************
Test for physical records. */
void
test2(void)
/*=======*/
{
dtuple_t* tuple, *tuple2;
dfield_t* field;
mem_heap_t* heap;
ulint i, n;
char* p_Pascal;
char* p_Cobol;
rec_t* rec, *rec2;
byte* data;
ulint len;
byte* buf;
heap = mem_heap_create(0);
printf("-------------------------------------------\n");
printf("REC-TEST 1. Basic tests.\n");
tuple = dtuple_create(heap, 2);
p_Pascal = "Pascal";
p_Cobol = "Cobol";
field = dtuple_get_nth_field(tuple, 0);
dfield_set_data(field, "Pascal", 7);
dtype_set(dfield_get_type(field), DATA_CHAR, DATA_ENGLISH, 7, 0);
field = dtuple_get_nth_field(tuple, 1);
dfield_set_data(field, "Cobol", 6);
dtype_set(dfield_get_type(field), DATA_CHAR, DATA_ENGLISH, 6, 0);
tuple2 = dtuple_create(heap, 37);
for (i = 0; i < 37; i++) {
field = dtuple_get_nth_field(tuple2, i);
dfield_set_data(field, NULL, UNIV_SQL_NULL);
dtype_set(dfield_get_type(field), DATA_CHAR,
DATA_ENGLISH, 6, 0);
}
rec = rec_convert_dtuple_to_rec(buf1, tuple);
rec_validate(rec);
rec_print(rec);
rec2 = rec_convert_dtuple_to_rec(buf1 + 1000, tuple2);
rec_validate(rec2);
data = rec_get_nth_field(rec, 0, &len);
ut_a(0 == memcmp(p_Pascal, data, 7));
ut_a(len == 7);
data = rec_get_nth_field(rec, 1, &len);
ut_a(0 == memcmp(p_Cobol, data, 6));
ut_a(len == 6);
ut_a(2 == rec_get_n_fields(rec));
for (i = 0; i < 37; i++) {
data = rec_get_nth_field(rec2, i, &len);
ut_a(len == UNIV_SQL_NULL);
}
printf("-------------------------------------------\n");
printf("REC-TEST 2. Test of accessor functions\n");
rec_set_next_offs(rec, 8190);
rec_set_n_owned(rec, 15);
rec_set_heap_no(rec, 0);
ut_a(rec_get_next_offs(rec) == 8190);
ut_a(rec_get_n_owned(rec) == 15);
ut_a(rec_get_heap_no(rec) == 0);
rec_set_next_offs(rec, 1);
rec_set_n_owned(rec, 1);
rec_set_heap_no(rec, 8190);
ut_a(rec_get_next_offs(rec) == 1);
ut_a(rec_get_n_owned(rec) == 1);
ut_a(rec_get_heap_no(rec) == 8190);
buf = mem_heap_alloc(heap, 6);
rec_copy_nth_field(buf, rec, 1, &len);
ut_a(ut_memcmp(p_Cobol, buf, len) == 0);
ut_a(len == 6);
rec_set_nth_field(rec, 1, "Algol", 6);
rec_validate(rec);
rec_copy_nth_field(buf, rec, 1, &len);
ut_a(ut_memcmp("Algol", buf, len) == 0);
ut_a(len == 6);
ut_a(rec_get_data_size(rec) == 13);
ut_a((ulint)(rec_get_end(rec) - rec) == 13);
ut_a(14 == (ulint)(rec - rec_get_start(rec)));
ut_a(rec_get_size(rec) == 27);
mem_heap_free(heap);
printf("-------------------------------------------\n");
printf("REC-TEST 3. Massive test of conversions \n");
heap = mem_heap_create(0);
for (i = 0; i < 100; i++) {
tuple = dtuple_gen_rnd_tuple(heap);
if (i % 10 == 0) {
printf("%lu ", i);
}
if (i % 10 == 0) {
printf(
"data tuple generated: %lu fields, data size %lu\n",
dtuple_get_n_fields(tuple),
dtuple_get_data_size(tuple));
}
dtuple_validate(tuple);
rec = rec_convert_dtuple_to_rec(buf1, tuple);
rec_validate(rec);
n = dtuple_get_n_fields(tuple);
ut_a(cmp_dtuple_rec_prefix_equal(tuple, rec, n));
ut_a(dtuple_fold(tuple, n) == rec_fold(rec, n));
ut_a(rec_get_converted_size(tuple) == rec_get_size(rec));
ut_a(rec_get_data_size(rec) == dtuple_get_data_size(tuple));
}
mem_print_info();
mem_heap_free(heap);
}
/**********************************************************************
Test for comparisons. */
void
test3(void)
/*=======*/
{
dtuple_t* tuple, *tuple2, *tuple3;
dfield_t* field;
mem_heap_t* heap;
ulint i, j;
ulint field_match, byte_match;
rec_t* rec;
rec_t* rec2;
ulint tm, oldtm;
dict_index_t* index;
dict_table_t* table;
heap = mem_heap_create(0);
printf("-------------------------------------------\n");
printf("CMP-TEST 1. Basic tests.\n");
tuple = dtuple_create(heap, 2);
field = dtuple_get_nth_field(tuple, 0);
dfield_set_data(field, "Pascal", 7);
dtype_set(dfield_get_type(field), DATA_CHAR, DATA_ENGLISH, 7, 0);
field = dtuple_get_nth_field(tuple, 1);
dfield_set_data(field, "Cobol", 6);
dtype_set(dfield_get_type(field), DATA_CHAR, DATA_ENGLISH, 6, 0);
tuple2 = dtuple_create(heap, 2);
field = dtuple_get_nth_field(tuple2, 0);
dfield_set_data(field, "Pascal", 7);
dtype_set(dfield_get_type(field), DATA_CHAR, DATA_ENGLISH, 7, 0);
field = dtuple_get_nth_field(tuple2, 1);
dfield_set_data(field, "Cobom", 6);
dtype_set(dfield_get_type(field), DATA_CHAR, DATA_ENGLISH, 6, 0);
tuple3 = dtuple_create(heap, 2);
field = dtuple_get_nth_field(tuple3, 0);
dfield_set_data(field, "PaSCal", 7);
dtype_set(dfield_get_type(field), DATA_CHAR, DATA_ENGLISH, 7, 0);
field = dtuple_get_nth_field(tuple3, 1);
dfield_set_data(field, "CobOL", 6);
dtype_set(dfield_get_type(field), DATA_CHAR, DATA_ENGLISH, 6, 0);
rec = rec_convert_dtuple_to_rec(buf1, tuple);
rec_validate(rec);
ut_a(!cmp_dtuple_rec_prefix_equal(tuple2, rec, 2));
ut_a(cmp_dtuple_rec_prefix_equal(tuple, rec, 2));
ut_a(cmp_dtuple_rec_prefix_equal(tuple3, rec, 2));
oldtm = ut_clock();
j = 0;
for (i = 0; i < 1000; i++) {
field_match = 1;
byte_match = 4;
if (1 == cmp_dtuple_rec_with_match(tuple2, rec,
&field_match, &byte_match)) {
j++;
}
}
tm = ut_clock();
printf("Time for fast comp. %lu records = %lu\n", j, tm - oldtm);
ut_a(field_match == 1);
ut_a(byte_match == 4);
oldtm = ut_clock();
j = 0;
for (i = 0; i < 1000; i++) {
field_match = 0;
byte_match = 0;
if (1 == cmp_dtuple_rec_with_match(tuple2, rec,
&field_match, &byte_match)) {
j++;
}
}
tm = ut_clock();
printf("Time for test comp. %lu records = %lu\n", j, tm - oldtm);
ut_a(field_match == 1);
ut_a(byte_match == 4);
printf("-------------------------------------------\n");
printf(
"CMP-TEST 2. A systematic test of comparisons and conversions\n");
tuple = dtuple_create(heap, 3);
tuple2 = dtuple_create(heap, 3);
table = dict_table_create("TS_TABLE1", 3);
dict_table_add_col(table, "COL1", DATA_VARCHAR, DATA_ENGLISH, 10, 0);
dict_table_add_col(table, "COL2", DATA_VARCHAR, DATA_ENGLISH, 10, 0);
dict_table_add_col(table, "COL3", DATA_VARCHAR, DATA_ENGLISH, 10, 0);
ut_a(0 == dict_table_publish(table));
index = dict_index_create("TS_TABLE1", "IND1", 0, 3, 0);
dict_index_add_field(index, "COL1", 0);
dict_index_add_field(index, "COL2", 0);
dict_index_add_field(index, "COL3", 0);
ut_a(0 == dict_index_publish(index));
index = dict_index_get("TS_TABLE1", "IND1");
ut_a(index);
/* Compare all test data tuples to each other */
for (i = 0; i < 512; i++) {
dtuple_gen_test_tuple(tuple, i);
rec = rec_convert_dtuple_to_rec(buf1, tuple);
ut_a(rec_validate(rec));
ut_a(0 == cmp_dtuple_rec(tuple, rec));
for (j = 0; j < 512; j++) {
dtuple_gen_test_tuple(tuple2, j);
ut_a(dtuple_validate(tuple2));
rec2 = rec_convert_dtuple_to_rec(buf1 + 500, tuple2);
if (j < i) {
ut_a(-1 == cmp_dtuple_rec(tuple2, rec));
ut_a(-1 == cmp_rec_rec(rec2, rec, index));
} else if (j == i) {
ut_a(0 == cmp_dtuple_rec(tuple2, rec));
ut_a(0 == cmp_rec_rec(rec2, rec, index));
} else if (j > i) {
ut_a(1 == cmp_dtuple_rec(tuple2, rec));
ut_a(1 == cmp_rec_rec(rec2, rec, index));
}
}
}
mem_heap_free(heap);
}
/********************************************************************
Main test function. */
void
main(void)
/*======*/
{
ulint tm, oldtm;
sync_init();
mem_init();
fil_init(25);
buf_pool_init(100, 100);
dict_init();
oldtm = ut_clock();
ut_rnd_set_seed(19);
test1();
test2();
test3();
tm = ut_clock();
printf("CPU time for test %lu microseconds\n", tm - oldtm);
printf("TESTS COMPLETED SUCCESSFULLY!\n");
}