Changeset: c5ac27d51925 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c5ac27d51925 Modified Files: ctest/tools/monetdbe/cmocka_test.c ctest/tools/monetdbe/test_helper.c ctest/tools/monetdbe/test_helper.h ctest/tools/monetdbe/test_helper_template.h Branch: default Log Message:
Support NULL values in expected column syntax. diffs (truncated from 321 to 300 lines): diff --git a/ctest/tools/monetdbe/cmocka_test.c b/ctest/tools/monetdbe/cmocka_test.c --- a/ctest/tools/monetdbe/cmocka_test.c +++ b/ctest/tools/monetdbe/cmocka_test.c @@ -40,7 +40,7 @@ static void create_table_test(void **sta monetdbe_database mdbe = *state; char* err; - err = monetdbe_query(mdbe, "CREATE TABLE test (x integer, y string)", NULL, NULL); + err = monetdbe_query(mdbe, "CREATE TABLE test (si SMALLINT,i INTEGER, bi BIGINT, c CLOB, b BLOB, d DATE, t TIME, ts TIMESTAMP)", NULL, NULL); assert_null(err); } @@ -49,7 +49,13 @@ static void populate_table_test(void **s monetdbe_database mdbe = *state; char* err; - err = monetdbe_query(mdbe, "INSERT INTO test VALUES (42, 'Hello, '), (58, 'World!')", NULL, NULL); + err = monetdbe_query(mdbe, + "INSERT INTO test VALUES " + "(4, 40, 400, 'aaa', x'aaaaaa', '2020-06-17', '12:00:00', '2020-06-17 12:00:00')," + "(6, 60, 600, 'ccc', x'cccccc', '2022-06-17', '14:00:00', '2022-06-17 14:00:00')," + "(5, 50, 500, 'bbb', x'bbbbbb', '2021-06-17', '13:00:00', '2021-06-17 13:00:00')," + "(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)", + NULL, NULL); assert_null(err); } @@ -60,22 +66,14 @@ static void query_table_test(void **stat monetdbe_database mdbe = *state; char* err; - err = monetdbe_query(mdbe, "SELECT MIN(x), CONCAT(MIN(y), MAX(y)) FROM test; ", &result, NULL); + err = monetdbe_query(mdbe, "SELECT MIN(si), MAX(i) FROM test; ", &result, NULL); assert_null(err); - assert_int_equal((int) result->nrows, 1); assert_int_equal((int) result->ncols, 2); - monetdbe_column* rcol; - - CHECK_COLUMN(mdbe, result, 0, int32_t, {42}); - err = monetdbe_result_fetch(result, &rcol, 1); - assert_null(err); - - monetdbe_column_str * col_y = (monetdbe_column_str *) rcol; - - assert_string_equal((const char*) col_y->data[0], "Hello, World!"); + assert_true(CHECK_COLUMN(result, 0, int16_t, {{4}})); + assert_true(CHECK_COLUMN(result, 1, int32_t, {{60}})); err = monetdbe_cleanup_result(mdbe, result); @@ -88,15 +86,43 @@ static void query_table_test2(void **sta monetdbe_database mdbe = *state; char* err; - err = monetdbe_query(mdbe, "SELECT x, y FROM test; ", &result, NULL); + err = monetdbe_query(mdbe, "SELECT si, i, bi, c, b, d, t, ts FROM test; ", &result, NULL); assert_null(err); - assert_int_equal((int) result->nrows, 2); - assert_int_equal((int) result->ncols, 2); + assert_int_equal((int) result->ncols, 8); + + int a; + + assert_true(CHECK_COLUMN(result, 0, int16_t, {{(a=3,a+1)}, {6}, {5}, Null})); + assert_true(CHECK_COLUMN(result, 1, int32_t, {{40}, {60}, {50}, Null})); + assert_true(CHECK_COLUMN(result, 2, int64_t, {{400}, {600}, {500}, Null})); + assert_true(CHECK_COLUMN(result, 3, str, {{"aaa"}, {"ccc"}, {"bbb"}, Null})); + assert_true(CHECK_COLUMN(result, 4, blob, {{{3, "\xaa\xaa\xaa"}}, {{3, "\xcc\xcc\xcc"}}, {{3, "\xbb\xbb\xbb"}}, Null})); + assert_true(CHECK_COLUMN(result, 5, date, {{{17, 6, 2020}}, {{17, 6, 2022}}, {{17, 6, 2021}}, Null})); + assert_true(CHECK_COLUMN(result, 6, time, {{{0, 0, 0, 12}}, {{0, 0, 0, 14}}, {{0, 0, 0, 13}}, Null})); + assert_true(CHECK_COLUMN(result, 7, timestamp, {{{{17, 6, 2020}, {0, 0, 0, 12}}}, {{{17, 6, 2022}, {0, 0, 0, 14}}}, {{{17, 6, 2021}, {0, 0, 0, 13}}}, Null})); + + err = monetdbe_cleanup_result(mdbe, result); - assert_true(CHECK_COLUMN(mdbe, result, 0, int32_t, {42, 58})); - assert_true(CHECK_COLUMN(mdbe, result, 1, str, {"Hello, ", "World!"})); + assert_null(err); +} + +static void query_table_test3(void **state) { + + monetdbe_result* result = NULL; + monetdbe_database mdbe = *state; + char* err; + + err = monetdbe_query(mdbe, "SELECT SUM(si), SUM(i), SUM(bi) FROM test; ", &result, NULL); + + assert_null(err); + + assert_int_equal((int) result->ncols, 3); + + assert_true(CHECK_COLUMN(result, 0, BIGGEST_INTEGER_TPE, {{15}})); + assert_true(CHECK_COLUMN(result, 1, BIGGEST_INTEGER_TPE, {{150}})); + /* FAIL assert_true(CHECK_COLUMN(result, 2, BIGGEST_INTEGER_TPE, {1500})); */ err = monetdbe_cleanup_result(mdbe, result); @@ -110,7 +136,8 @@ main(void) cmocka_unit_test(create_table_test), cmocka_unit_test(populate_table_test), cmocka_unit_test(query_table_test), - cmocka_unit_test(query_table_test2) + cmocka_unit_test(query_table_test2), + cmocka_unit_test(query_table_test3) }; return cmocka_run_group_tests_name("SQL queries for MonetDBe", tests, setup, teardown); diff --git a/ctest/tools/monetdbe/test_helper.c b/ctest/tools/monetdbe/test_helper.c --- a/ctest/tools/monetdbe/test_helper.c +++ b/ctest/tools/monetdbe/test_helper.c @@ -6,77 +6,77 @@ #define GET_TPE_ENUM(TPE) CONCAT(monetdb_, TPE) -#define TPE int8_t +#define TPE TEST_TPE_ID(int8_t) #define CHECK_COLUMN_FUNC check_column_bool #define TPE_ENUM monetdbe_bool #define MONETDB_COLUMN_TPE monetdbe_column_bool #include "test_helper_template.h" -#define TPE int8_t +#define TPE TEST_TPE_ID(int8_t) #define CHECK_COLUMN_FUNC check_column_int8_t #define TPE_ENUM monetdbe_int8_t #define MONETDB_COLUMN_TPE monetdbe_column_int8_t #include "test_helper_template.h" -#define TPE int16_t +#define TPE TEST_TPE_ID(int16_t) #define CHECK_COLUMN_FUNC check_column_int16_t #define TPE_ENUM monetdbe_int16_t #define MONETDB_COLUMN_TPE monetdbe_column_int16_t #include "test_helper_template.h" -#define TPE int32_t +#define TPE TEST_TPE_ID(int32_t) #define CHECK_COLUMN_FUNC check_column_int32_t #define TPE_ENUM monetdbe_int32_t #define MONETDB_COLUMN_TPE monetdbe_column_int32_t #include "test_helper_template.h" -#define TPE int64_t +#define TPE TEST_TPE_ID(int64_t) #define CHECK_COLUMN_FUNC check_column_int64_t #define TPE_ENUM monetdbe_int64_t #define MONETDB_COLUMN_TPE monetdbe_column_int64_t #include "test_helper_template.h" #if HAVE_HGE -#define TPE __int128 +#define TPE TEST_TPE_ID(int128_t) #define CHECK_COLUMN_FUNC check_column_int128_t #define TPE_ENUM monetdbe_int128_t #define MONETDB_COLUMN_TPE monetdbe_column_int128_t #include "test_helper_template.h" #endif -#define TPE size_t +#define TPE TEST_TPE_ID(size_t) #define CHECK_COLUMN_FUNC check_column_size_t #define TPE_ENUM monetdbe_size_t #define MONETDB_COLUMN_TPE monetdbe_column_size_t #include "test_helper_template.h" -#define TPE float +#define TPE TEST_TPE_ID(float) #define CHECK_COLUMN_FUNC check_column_float #define TPE_ENUM monetdbe_float #define MONETDB_COLUMN_TPE monetdbe_column_float #include "test_helper_template.h" -#define TPE double +#define TPE TEST_TPE_ID(double) #define CHECK_COLUMN_FUNC check_column_double #define TPE_ENUM monetdbe_double #define MONETDB_COLUMN_TPE monetdbe_column_double #include "test_helper_template.h" -#define TPE char* +#define TPE TEST_TPE_ID(str) #define CHECK_COLUMN_FUNC check_column_str #define TPE_ENUM monetdbe_str #define MONETDB_COLUMN_TPE monetdbe_column_str #define EQUALS(A,B) (strcmp(A, B)==0) #include "test_helper_template.h" -#define TPE monetdbe_data_blob +#define TPE TEST_TPE_ID(blob) #define CHECK_COLUMN_FUNC check_column_blob #define TPE_ENUM monetdbe_blob #define EQUALS(A,B) ((A).size != (B).size?false:(memcmp((A).data, (B).data, (A).size)) == 0) #define MONETDB_COLUMN_TPE monetdbe_column_blob #include "test_helper_template.h" -#define TPE monetdbe_data_date +#define TPE TEST_TPE_ID(date) #define CHECK_COLUMN_FUNC check_column_date #define TPE_ENUM monetdbe_date #define EQUALS_DATE(A,B) (((A).day == (B).day) && ((A).month == (B).month) && ((A).year == (B).year)) @@ -84,7 +84,7 @@ #define MONETDB_COLUMN_TPE monetdbe_column_date #include "test_helper_template.h" -#define TPE monetdbe_data_time +#define TPE TEST_TPE_ID(time) #define CHECK_COLUMN_FUNC check_column_time #define TPE_ENUM monetdbe_time #define EQUALS_TIME(A,B) (((A).ms == (B).ms) && ((A).seconds == (B).seconds) && ((A).minutes == (B).minutes) && ((A).hours == (B).hours)) @@ -92,7 +92,7 @@ #define MONETDB_COLUMN_TPE monetdbe_column_time #include "test_helper_template.h" -#define TPE monetdbe_data_timestamp +#define TPE TEST_TPE_ID(timestamp) #define CHECK_COLUMN_FUNC check_column_timestamp #define TPE_ENUM monetdbe_timestamp #define EQUALS(A,B) (EQUALS_DATE(A.date, B.date) && EQUALS_TIME(A.time, B.time)) diff --git a/ctest/tools/monetdbe/test_helper.h b/ctest/tools/monetdbe/test_helper.h --- a/ctest/tools/monetdbe/test_helper.h +++ b/ctest/tools/monetdbe/test_helper.h @@ -1,30 +1,63 @@ #include "monetdbe.h" -monetdbe_export bool check_column_bool (monetdbe_result* result, size_t column_index, size_t expected_nr_column_entries, int8_t* expected_column); -monetdbe_export bool check_column_int8_t (monetdbe_result* result, size_t column_index, size_t expected_nr_column_entries, int8_t* expected_column); -monetdbe_export bool check_column_int16_t (monetdbe_result* result, size_t column_index, size_t expected_nr_column_entries, int16_t* expected_column); -monetdbe_export bool check_column_int32_t (monetdbe_result* result, size_t column_index, size_t expected_nr_column_entries, int32_t* expected_column); -monetdbe_export bool check_column_int64_t (monetdbe_result* result, size_t column_index, size_t expected_nr_column_entries, int64_t* expected_column); +#define TEST_TPE(TPE) struct {TPE data; char _is_null;} + +#define TEST_TPE_ID(TPE) TEST_##TPE + +#define TYPE_DEFTEST_TPE(TPE, ACTUAL_TPE) typedef TEST_TPE(ACTUAL_TPE) TEST_TPE_ID(TPE) + + +TYPE_DEFTEST_TPE(bool, int8_t); +TYPE_DEFTEST_TPE(int8_t, int8_t); +TYPE_DEFTEST_TPE(int16_t, int16_t); +TYPE_DEFTEST_TPE(int32_t, int32_t); +TYPE_DEFTEST_TPE(int64_t, int64_t); #if HAVE_HGE -monetdbe_export bool check_column_int128_t (monetdbe_result* result, size_t column_index, size_t expected_nr_column_entries, __int128* expected_column); +TYPE_DEFTEST_TPE(int128_t, __int128); #endif -monetdbe_export bool check_column_size_t (monetdbe_result* result, size_t column_index, size_t expected_nr_column_entries, size_t* expected_column); -monetdbe_export bool check_column_float (monetdbe_result* result, size_t column_index, size_t expected_nr_column_entries, float* expected_column); -monetdbe_export bool check_column_double (monetdbe_result* result, size_t column_index, size_t expected_nr_column_entries, double* expected_column); -monetdbe_export bool check_column_str (monetdbe_result* result, size_t column_index, size_t expected_nr_column_entries, char ** expected_column); -monetdbe_export bool check_column_blob (monetdbe_result* result, size_t column_index, size_t expected_nr_column_entries, monetdbe_data_blob* expected_column); -monetdbe_export bool check_column_date (monetdbe_result* result, size_t column_index, size_t expected_nr_column_entries, monetdbe_data_date* expected_column); -monetdbe_export bool check_column_time (monetdbe_result* result, size_t column_index, size_t expected_nr_column_entries, monetdbe_data_time* expected_column); -monetdbe_export bool check_column_timestamp (monetdbe_result* result, size_t column_index, size_t expected_nr_column_entries, monetdbe_data_timestamp* expected_column); +TYPE_DEFTEST_TPE(size_t, size_t); +TYPE_DEFTEST_TPE(float, float); +TYPE_DEFTEST_TPE(double, double); +TYPE_DEFTEST_TPE(str, char*); +TYPE_DEFTEST_TPE(blob, monetdbe_data_blob); +TYPE_DEFTEST_TPE(date, monetdbe_data_date); +TYPE_DEFTEST_TPE(time, monetdbe_data_time); +TYPE_DEFTEST_TPE(timestamp, monetdbe_data_timestamp); + +#define GET_ACTUAL_TPE(TPE_ID) ACTUAL_TPE_monetdb_##TPE_ID + +#define Null {._is_null = 1} -#ifndef str -#define str char* +monetdbe_export bool check_column_bool (monetdbe_result* result, size_t column_index, size_t expected_nr_column_entries, TEST_TPE_ID(int8_t) expected_column[]); +monetdbe_export bool check_column_int8_t (monetdbe_result* result, size_t column_index, size_t expected_nr_column_entries, TEST_TPE_ID(int8_t)* expected_column); +monetdbe_export bool check_column_int16_t (monetdbe_result* result, size_t column_index, size_t expected_nr_column_entries, TEST_TPE_ID(int16_t)* expected_column); +monetdbe_export bool check_column_int32_t (monetdbe_result* result, size_t column_index, size_t expected_nr_column_entries, TEST_TPE_ID(int32_t)* expected_column); +monetdbe_export bool check_column_int64_t (monetdbe_result* result, size_t column_index, size_t expected_nr_column_entries, TEST_TPE_ID(int64_t)* expected_column); +#if HAVE_HGE +monetdbe_export bool check_column_int128_t (monetdbe_result* result, size_t column_index, size_t expected_nr_column_entries, TEST_TPE_ID(int128_t)* expected_column); +#endif +monetdbe_export bool check_column_size_t (monetdbe_result* result, size_t column_index, size_t expected_nr_column_entries, TEST_TPE_ID(size_t)* expected_column); +monetdbe_export bool check_column_float (monetdbe_result* result, size_t column_index, size_t expected_nr_column_entries, TEST_TPE_ID(float)* expected_column); +monetdbe_export bool check_column_double (monetdbe_result* result, size_t column_index, size_t expected_nr_column_entries, TEST_TPE_ID(double)* expected_column); +monetdbe_export bool check_column_str (monetdbe_result* result, size_t column_index, size_t expected_nr_column_entries, TEST_TPE_ID(str)* expected_column); +monetdbe_export bool check_column_blob (monetdbe_result* result, size_t column_index, size_t expected_nr_column_entries, TEST_TPE_ID(blob)* expected_column); +monetdbe_export bool check_column_date (monetdbe_result* result, size_t column_index, size_t expected_nr_column_entries, TEST_TPE_ID(date)* expected_column); +monetdbe_export bool check_column_time (monetdbe_result* result, size_t column_index, size_t expected_nr_column_entries, TEST_TPE_ID(time)* expected_column); +monetdbe_export bool check_column_timestamp (monetdbe_result* result, size_t column_index, size_t expected_nr_column_entries, TEST_TPE_ID(timestamp)* expected_column); + +#if HAVE_HGE +#define BIGGEST_INTEGER_TPE int128_t +#define check_column_BIGGEST_INTEGER_TPE check_column_int128_t +#else +#define BIGGEST_INTEGER_TPE int64_t +#define check_column_BIGGEST_INTEGER_TPE check_column_int64_t #endif -#define CHECK_COLUMN(conn, result, column_index, TPE, ...) \ _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list