diff options
Diffstat (limited to 'innobase/rem/ts')
-rw-r--r-- | innobase/rem/ts/makefile | 16 | ||||
-rw-r--r-- | innobase/rem/ts/tsrem.c | 464 |
2 files changed, 480 insertions, 0 deletions
diff --git a/innobase/rem/ts/makefile b/innobase/rem/ts/makefile new file mode 100644 index 00000000000..c429afa273e --- /dev/null +++ b/innobase/rem/ts/makefile @@ -0,0 +1,16 @@ + + + +include ..\..\makefile.i + +tsrem: ..\rem.lib tsrem.c + $(CCOM) $(CFL) -I.. -I..\.. ..\rem.lib ..\..\page.lib ..\..\mtr.lib ..\..\btr.lib ..\..\log.lib ..\..\dyn.lib ..\..\fil.lib ..\..\buf.lib ..\..\dict.lib ..\..\data.lib ..\..\mach.lib ..\..\ha.lib ..\..\ut.lib ..\..\sync.lib ..\..\mem.lib ..\..\os.lib tsrem.c $(LFL) + + + + + + + + + diff --git a/innobase/rem/ts/tsrem.c b/innobase/rem/ts/tsrem.c new file mode 100644 index 00000000000..4f2bdde0068 --- /dev/null +++ b/innobase/rem/ts/tsrem.c @@ -0,0 +1,464 @@ +/************************************************************************ +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"); +} |