void test_ut_str_sql_format() { char buf[128]; ulint ret; #define CALL_AND_TEST(str, str_len, buf, buf_size, ret_expected, buf_expected)\ do {\ ibool ok = TRUE;\ memset(buf, 'x', 10);\ buf[10] = '\0';\ fprintf(stderr, "TESTING \"%s\", %lu, %lu\n",\ str, (ulint) str_len, (ulint) buf_size);\ ret = ut_str_sql_format(str, str_len, buf, buf_size);\ if (ret != ret_expected) {\ fprintf(stderr, "expected ret %lu, got %lu\n",\ (ulint) ret_expected, ret);\ ok = FALSE;\ }\ if (strcmp((char*) buf, buf_expected) != 0) {\ fprintf(stderr, "expected buf \"%s\", got \"%s\"\n",\ buf_expected, buf);\ ok = FALSE;\ }\ if (ok) {\ fprintf(stderr, "OK: %lu, \"%s\"\n\n",\ (ulint) ret, buf);\ } else {\ return;\ }\ } while (0) CALL_AND_TEST("abcd", 4, buf, 0, 0, "xxxxxxxxxx"); CALL_AND_TEST("abcd", 4, buf, 1, 1, ""); CALL_AND_TEST("abcd", 4, buf, 2, 1, ""); CALL_AND_TEST("abcd", 0, buf, 3, 3, "''"); CALL_AND_TEST("abcd", 1, buf, 3, 1, ""); CALL_AND_TEST("abcd", 2, buf, 3, 1, ""); CALL_AND_TEST("abcd", 3, buf, 3, 1, ""); CALL_AND_TEST("abcd", 4, buf, 3, 1, ""); CALL_AND_TEST("abcd", 0, buf, 4, 3, "''"); CALL_AND_TEST("abcd", 1, buf, 4, 4, "'a'"); CALL_AND_TEST("abcd", 2, buf, 4, 4, "'a'"); CALL_AND_TEST("abcd", 3, buf, 4, 4, "'a'"); CALL_AND_TEST("abcd", 4, buf, 4, 4, "'a'"); CALL_AND_TEST("abcde", 5, buf, 4, 4, "'a'"); CALL_AND_TEST("'", 1, buf, 4, 3, "''"); CALL_AND_TEST("''", 2, buf, 4, 3, "''"); CALL_AND_TEST("a'", 2, buf, 4, 4, "'a'"); CALL_AND_TEST("'a", 2, buf, 4, 3, "''"); CALL_AND_TEST("ab", 2, buf, 4, 4, "'a'"); CALL_AND_TEST("abcdef", 0, buf, 5, 3, "''"); CALL_AND_TEST("abcdef", 1, buf, 5, 4, "'a'"); CALL_AND_TEST("abcdef", 2, buf, 5, 5, "'ab'"); CALL_AND_TEST("abcdef", 3, buf, 5, 5, "'ab'"); CALL_AND_TEST("abcdef", 4, buf, 5, 5, "'ab'"); CALL_AND_TEST("abcdef", 5, buf, 5, 5, "'ab'"); CALL_AND_TEST("abcdef", 6, buf, 5, 5, "'ab'"); CALL_AND_TEST("'", 1, buf, 5, 5, "''''"); CALL_AND_TEST("''", 2, buf, 5, 5, "''''"); CALL_AND_TEST("a'", 2, buf, 5, 4, "'a'"); CALL_AND_TEST("'a", 2, buf, 5, 5, "''''"); CALL_AND_TEST("ab", 2, buf, 5, 5, "'ab'"); CALL_AND_TEST("abc", 3, buf, 5, 5, "'ab'"); CALL_AND_TEST("ab", 2, buf, 6, 5, "'ab'"); CALL_AND_TEST("a'b'c", 5, buf, 32, 10, "'a''b''c'"); CALL_AND_TEST("a'b'c'", 6, buf, 32, 12, "'a''b''c'''"); }
void test_row_raw_format_int() { ulint ret; char buf[128]; ibool format_in_hex; #define CALL_AND_TEST(data, data_len, prtype, buf, buf_size,\ ret_expected, buf_expected, format_in_hex_expected)\ do {\ ibool ok = TRUE;\ ulint i;\ memset(buf, 'x', 10);\ buf[10] = '\0';\ format_in_hex = FALSE;\ fprintf(stderr, "TESTING \"\\x");\ for (i = 0; i < data_len; i++) {\ fprintf(stderr, "%02hhX", data[i]);\ }\ fprintf(stderr, "\", %lu, %lu, %lu\n",\ (ulint) data_len, (ulint) prtype,\ (ulint) buf_size);\ ret = row_raw_format_int(data, data_len, prtype,\ buf, buf_size, &format_in_hex);\ if (ret != ret_expected) {\ fprintf(stderr, "expected ret %lu, got %lu\n",\ (ulint) ret_expected, ret);\ ok = FALSE;\ }\ if (strcmp((char*) buf, buf_expected) != 0) {\ fprintf(stderr, "expected buf \"%s\", got \"%s\"\n",\ buf_expected, buf);\ ok = FALSE;\ }\ if (format_in_hex != format_in_hex_expected) {\ fprintf(stderr, "expected format_in_hex %d, got %d\n",\ (int) format_in_hex_expected,\ (int) format_in_hex);\ ok = FALSE;\ }\ if (ok) {\ fprintf(stderr, "OK: %lu, \"%s\" %d\n\n",\ (ulint) ret, buf, (int) format_in_hex);\ } else {\ return;\ }\ } while (0) #if 1 /* min values for signed 1-8 byte integers */ CALL_AND_TEST("\x00", 1, 0, buf, sizeof(buf), 5, "-128", 0); CALL_AND_TEST("\x00\x00", 2, 0, buf, sizeof(buf), 7, "-32768", 0); CALL_AND_TEST("\x00\x00\x00", 3, 0, buf, sizeof(buf), 9, "-8388608", 0); CALL_AND_TEST("\x00\x00\x00\x00", 4, 0, buf, sizeof(buf), 12, "-2147483648", 0); CALL_AND_TEST("\x00\x00\x00\x00\x00", 5, 0, buf, sizeof(buf), 14, "-549755813888", 0); CALL_AND_TEST("\x00\x00\x00\x00\x00\x00", 6, 0, buf, sizeof(buf), 17, "-140737488355328", 0); CALL_AND_TEST("\x00\x00\x00\x00\x00\x00\x00", 7, 0, buf, sizeof(buf), 19, "-36028797018963968", 0); CALL_AND_TEST("\x00\x00\x00\x00\x00\x00\x00\x00", 8, 0, buf, sizeof(buf), 21, "-9223372036854775808", 0); /* min values for unsigned 1-8 byte integers */ CALL_AND_TEST("\x00", 1, DATA_UNSIGNED, buf, sizeof(buf), 2, "0", 0); CALL_AND_TEST("\x00\x00", 2, DATA_UNSIGNED, buf, sizeof(buf), 2, "0", 0); CALL_AND_TEST("\x00\x00\x00", 3, DATA_UNSIGNED, buf, sizeof(buf), 2, "0", 0); CALL_AND_TEST("\x00\x00\x00\x00", 4, DATA_UNSIGNED, buf, sizeof(buf), 2, "0", 0); CALL_AND_TEST("\x00\x00\x00\x00\x00", 5, DATA_UNSIGNED, buf, sizeof(buf), 2, "0", 0); CALL_AND_TEST("\x00\x00\x00\x00\x00\x00", 6, DATA_UNSIGNED, buf, sizeof(buf), 2, "0", 0); CALL_AND_TEST("\x00\x00\x00\x00\x00\x00\x00", 7, DATA_UNSIGNED, buf, sizeof(buf), 2, "0", 0); CALL_AND_TEST("\x00\x00\x00\x00\x00\x00\x00\x00", 8, DATA_UNSIGNED, buf, sizeof(buf), 2, "0", 0); /* max values for signed 1-8 byte integers */ CALL_AND_TEST("\xFF", 1, 0, buf, sizeof(buf), 4, "127", 0); CALL_AND_TEST("\xFF\xFF", 2, 0, buf, sizeof(buf), 6, "32767", 0); CALL_AND_TEST("\xFF\xFF\xFF", 3, 0, buf, sizeof(buf), 8, "8388607", 0); CALL_AND_TEST("\xFF\xFF\xFF\xFF", 4, 0, buf, sizeof(buf), 11, "2147483647", 0); CALL_AND_TEST("\xFF\xFF\xFF\xFF\xFF", 5, 0, buf, sizeof(buf), 13, "549755813887", 0); CALL_AND_TEST("\xFF\xFF\xFF\xFF\xFF\xFF", 6, 0, buf, sizeof(buf), 16, "140737488355327", 0); CALL_AND_TEST("\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 7, 0, buf, sizeof(buf), 18, "36028797018963967", 0); CALL_AND_TEST("\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8, 0, buf, sizeof(buf), 20, "9223372036854775807", 0); /* max values for unsigned 1-8 byte integers */ CALL_AND_TEST("\xFF", 1, DATA_UNSIGNED, buf, sizeof(buf), 4, "255", 0); CALL_AND_TEST("\xFF\xFF", 2, DATA_UNSIGNED, buf, sizeof(buf), 6, "65535", 0); CALL_AND_TEST("\xFF\xFF\xFF", 3, DATA_UNSIGNED, buf, sizeof(buf), 9, "16777215", 0); CALL_AND_TEST("\xFF\xFF\xFF\xFF", 4, DATA_UNSIGNED, buf, sizeof(buf), 11, "4294967295", 0); CALL_AND_TEST("\xFF\xFF\xFF\xFF\xFF", 5, DATA_UNSIGNED, buf, sizeof(buf), 14, "1099511627775", 0); CALL_AND_TEST("\xFF\xFF\xFF\xFF\xFF\xFF", 6, DATA_UNSIGNED, buf, sizeof(buf), 16, "281474976710655", 0); CALL_AND_TEST("\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 7, DATA_UNSIGNED, buf, sizeof(buf), 18, "72057594037927935", 0); CALL_AND_TEST("\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8, DATA_UNSIGNED, buf, sizeof(buf), 21, "18446744073709551615", 0); /* some random values */ CALL_AND_TEST("\x52", 1, 0, buf, sizeof(buf), 4, "-46", 0); CALL_AND_TEST("\x0E", 1, DATA_UNSIGNED, buf, sizeof(buf), 3, "14", 0); CALL_AND_TEST("\x62\xCE", 2, 0, buf, sizeof(buf), 6, "-7474", 0); CALL_AND_TEST("\x29\xD6", 2, DATA_UNSIGNED, buf, sizeof(buf), 6, "10710", 0); CALL_AND_TEST("\x7F\xFF\x90", 3, 0, buf, sizeof(buf), 5, "-112", 0); CALL_AND_TEST("\x00\xA1\x16", 3, DATA_UNSIGNED, buf, sizeof(buf), 6, "41238", 0); CALL_AND_TEST("\x7F\xFF\xFF\xF7", 4, 0, buf, sizeof(buf), 3, "-9", 0); CALL_AND_TEST("\x00\x00\x00\x5C", 4, DATA_UNSIGNED, buf, sizeof(buf), 3, "92", 0); CALL_AND_TEST("\x7F\xFF\xFF\xFF\xFF\xFF\xDC\x63", 8, 0, buf, sizeof(buf), 6, "-9117", 0); CALL_AND_TEST("\x00\x00\x00\x00\x00\x01\x64\x62", 8, DATA_UNSIGNED, buf, sizeof(buf), 6, "91234", 0); #endif /* speed test */ speedo_t speedo; ulint i; speedo_reset(&speedo); for (i = 0; i < 1000000; i++) { row_raw_format_int("\x23", 1, 0, buf, sizeof(buf), &format_in_hex); row_raw_format_int("\x23", 1, DATA_UNSIGNED, buf, sizeof(buf), &format_in_hex); row_raw_format_int("\x00\x00\x00\x00\x00\x01\x64\x62", 8, 0, buf, sizeof(buf), &format_in_hex); row_raw_format_int("\x00\x00\x00\x00\x00\x01\x64\x62", 8, DATA_UNSIGNED, buf, sizeof(buf), &format_in_hex); } speedo_show(&speedo); }