1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
|
#include "capi_tester.hpp"
using namespace duckdb;
using namespace std;
TEST_CASE("Test casting columns in AppendDataChunk in C API", "[capi]") {
duckdb::vector<string> tables;
tables.push_back("CREATE TABLE test(i BIGINT, j VARCHAR);");
tables.push_back("CREATE TABLE test(i BIGINT, j BOOLEAN);");
for (idx_t i = 0; i < tables.size(); i++) {
CAPITester tester;
REQUIRE(tester.OpenDatabase(nullptr));
REQUIRE(duckdb_vector_size() == STANDARD_VECTOR_SIZE);
tester.Query(tables[i]);
duckdb_logical_type types[2];
types[0] = duckdb_create_logical_type(DUCKDB_TYPE_SMALLINT);
types[1] = duckdb_create_logical_type(DUCKDB_TYPE_BOOLEAN);
auto data_chunk = duckdb_create_data_chunk(types, 2);
REQUIRE(data_chunk);
auto smallint_col = duckdb_data_chunk_get_vector(data_chunk, 0);
auto boolean_col = duckdb_data_chunk_get_vector(data_chunk, 1);
auto smallint_data = reinterpret_cast<int16_t *>(duckdb_vector_get_data(smallint_col));
smallint_data[0] = 15;
smallint_data[1] = -15;
auto boolean_data = reinterpret_cast<bool *>(duckdb_vector_get_data(boolean_col));
boolean_data[0] = false;
boolean_data[1] = true;
duckdb_data_chunk_set_size(data_chunk, 2);
duckdb_appender appender;
auto status = duckdb_appender_create(tester.connection, nullptr, "test", &appender);
REQUIRE(status == DuckDBSuccess);
REQUIRE(duckdb_append_data_chunk(appender, data_chunk) == DuckDBSuccess);
duckdb_appender_close(appender);
auto result = tester.Query("SELECT i, j FROM test;");
REQUIRE(result->Fetch<int64_t>(0, 0) == 15);
REQUIRE(result->Fetch<int64_t>(0, 1) == -15);
auto str = result->Fetch<string>(1, 0);
REQUIRE(str.compare("false") == 0);
str = result->Fetch<string>(1, 1);
REQUIRE(str.compare("true") == 0);
duckdb_appender_destroy(&appender);
duckdb_destroy_data_chunk(&data_chunk);
duckdb_destroy_logical_type(&types[0]);
duckdb_destroy_logical_type(&types[1]);
}
}
TEST_CASE("Test casting error in AppendDataChunk in C API", "[capi]") {
CAPITester tester;
REQUIRE(tester.OpenDatabase(nullptr));
REQUIRE(duckdb_vector_size() == STANDARD_VECTOR_SIZE);
tester.Query("CREATE TABLE test(i BIGINT, j BOOLEAN[]);");
duckdb_logical_type types[2];
types[0] = duckdb_create_logical_type(DUCKDB_TYPE_SMALLINT);
types[1] = duckdb_create_logical_type(DUCKDB_TYPE_BOOLEAN);
auto data_chunk = duckdb_create_data_chunk(types, 2);
REQUIRE(data_chunk);
auto smallint_col = duckdb_data_chunk_get_vector(data_chunk, 0);
auto boolean_col = duckdb_data_chunk_get_vector(data_chunk, 1);
auto smallint_data = reinterpret_cast<int16_t *>(duckdb_vector_get_data(smallint_col));
smallint_data[0] = 15;
smallint_data[1] = -15;
auto boolean_data = reinterpret_cast<bool *>(duckdb_vector_get_data(boolean_col));
boolean_data[0] = false;
boolean_data[1] = true;
duckdb_data_chunk_set_size(data_chunk, 2);
duckdb_appender appender;
auto status = duckdb_appender_create(tester.connection, nullptr, "test", &appender);
REQUIRE(status == DuckDBSuccess);
REQUIRE(duckdb_append_data_chunk(appender, data_chunk) == DuckDBError);
auto error_msg = duckdb_appender_error(appender);
REQUIRE(string(error_msg) == "type mismatch in AppendDataChunk, expected BOOLEAN[], got BOOLEAN for column 1");
duckdb_appender_close(appender);
duckdb_appender_destroy(&appender);
duckdb_destroy_data_chunk(&data_chunk);
duckdb_destroy_logical_type(&types[0]);
duckdb_destroy_logical_type(&types[1]);
}
TEST_CASE("Test casting timestamps in AppendDataChunk in C API", "[capi]") {
CAPITester tester;
REQUIRE(tester.OpenDatabase(nullptr));
REQUIRE(duckdb_vector_size() == STANDARD_VECTOR_SIZE);
tester.Query("CREATE TABLE test(i TIMESTAMP, j DATE);");
duckdb_logical_type types[2];
types[0] = duckdb_create_logical_type(DUCKDB_TYPE_VARCHAR);
types[1] = duckdb_create_logical_type(DUCKDB_TYPE_VARCHAR);
auto data_chunk = duckdb_create_data_chunk(types, 2);
REQUIRE(data_chunk);
auto ts_column = duckdb_data_chunk_get_vector(data_chunk, 0);
auto date_column = duckdb_data_chunk_get_vector(data_chunk, 1);
duckdb_vector_assign_string_element(ts_column, 0, "2017-07-23 13:10:11");
duckdb_vector_assign_string_element(date_column, 0, "1993-08-14");
duckdb_data_chunk_set_size(data_chunk, 1);
duckdb_appender appender;
auto status = duckdb_appender_create(tester.connection, nullptr, "test", &appender);
REQUIRE(status == DuckDBSuccess);
REQUIRE(duckdb_append_data_chunk(appender, data_chunk) == DuckDBSuccess);
duckdb_appender_close(appender);
auto result = tester.Query("SELECT i::VARCHAR, j::VARCHAR FROM test;");
auto str = result->Fetch<string>(0, 0);
REQUIRE(str.compare("2017-07-23 13:10:11") == 0);
str = result->Fetch<string>(1, 0);
REQUIRE(str.compare("1993-08-14") == 0);
duckdb_appender_destroy(&appender);
duckdb_destroy_data_chunk(&data_chunk);
duckdb_destroy_logical_type(&types[0]);
duckdb_destroy_logical_type(&types[1]);
}
|