Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion iotdb-client/client-cpp/src/include/Common.h
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,7 @@ class Field {
case TSDataType::BLOB:
return !stringV.is_initialized();
case TSDataType::DATE:
return !dateV.is_initialized();
return !dateV.is_initialized() || dateV.value().is_not_a_date();
default:
return true;
}
Expand Down
3 changes: 0 additions & 3 deletions iotdb-client/client-cpp/src/session/Date.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,6 @@ int32_t parseDateExpressionToInt(const IoTDBDate& date) {
}

IoTDBDate parseIntToDate(int32_t dateInt) {
if (dateInt == EMPTY_DATE_INT) {
return IoTDBDate::notADate();
}
const int year = dateInt / 10000;
const int month = (dateInt % 10000) / 100;
const int day = dateInt % 100;
Expand Down
4 changes: 3 additions & 1 deletion iotdb-client/client-cpp/src/session/SessionC.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1495,8 +1495,10 @@ int32_t ts_row_record_get_date_int32(CRowRecord* record, int index) {
if (index < 0 || index >= (int)record->cpp->fields.size())
return 0;
const Field& f = record->cpp->fields[index];
if (f.dataType != TSDataType::DATE || !f.dateV.is_initialized())
if (f.dataType != TSDataType::DATE || !f.dateV.is_initialized() ||
f.dateV.value().is_not_a_date()) {
return 0;
}
return parseDateExpressionToInt(f.dateV.value());
}

Expand Down
30 changes: 30 additions & 0 deletions iotdb-client/client-cpp/test/cpp/sessionCIT.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -792,3 +792,33 @@ TEST_CASE("C API - RowRecord and delete data APIs", "[c_rowDelete]") {
REQUIRE(ts_session_delete_timeseries(g_session, pblob) == TS_OK);
REQUIRE(ts_session_delete_database(g_session, sg) == TS_OK);
}

TEST_CASE("C API - Query DATE 1000-01-01", "[c_dateMinYear]") {
CaseReporter cr("c_dateMinYear");

const char* path = "root.ctest.d1.s_date_min";
ensureTimeseries(g_session, path, TS_TYPE_DATE, TS_ENCODING_PLAIN, TS_COMPRESSION_SNAPPY);

const char* deviceId = "root.ctest.d1";
const char* measurements[] = {"s_date_min"};
TSDataType_C types[] = {TS_TYPE_DATE};
TSDate_C dateVal = {1000, 1, 1};
const void* vals[] = {&dateVal};
REQUIRE(ts_session_insert_record(g_session, deviceId, 1000LL, 1, measurements, types, vals) ==
TS_OK);

CSessionDataSet* dataSet = nullptr;
REQUIRE(ts_session_execute_query(g_session,
"select s_date_min from root.ctest.d1 where time=1000",
&dataSet) == TS_OK);
REQUIRE(dataSet != nullptr);
REQUIRE(ts_dataset_has_next(dataSet));
CRowRecord* record = ts_dataset_next(dataSet);
REQUIRE(record != nullptr);
REQUIRE_FALSE(ts_row_record_is_null(record, 0));
REQUIRE(ts_row_record_get_date_int32(record, 0) == 10000101);
ts_row_record_destroy(record);
ts_dataset_destroy(dataSet);

REQUIRE(ts_session_delete_timeseries(g_session, path) == TS_OK);
}
28 changes: 28 additions & 0 deletions iotdb-client/client-cpp/test/cpp/sessionIT.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1062,3 +1062,31 @@ TEST_CASE("SessionPool getSession times out when exhausted", "[sessionPool]") {
reused.release();
pool->close();
}

TEST_CASE("Query DATE 1000-01-01", "[dateMinYear]") {
CaseReporter cr("dateMinYear");
const string timeseries = "root.test.d1.s_date_min";
if (session->checkTimeseriesExists(timeseries)) {
session->deleteTimeseries(timeseries);
}
session->createTimeseries(timeseries, TSDataType::DATE, TSEncoding::PLAIN,
CompressionType::SNAPPY);

const string deviceId = "root.test.d1";
const vector<string> measurements = {"s_date_min"};
const vector<TSDataType::TSDataType> types = {TSDataType::DATE};
const IoTDBDate dateValue(1000, 1, 1);
vector<char*> values = {const_cast<char*>(reinterpret_cast<const char*>(&dateValue))};
session->insertRecord(deviceId, 1000LL, measurements, types, values);

unique_ptr<SessionDataSet> sessionDataSet =
session->executeQueryStatement("select s_date_min from root.test.d1 where time=1000");
REQUIRE(sessionDataSet->hasNext());
auto record = sessionDataSet->next();
REQUIRE(record->fields.size() == 1);
REQUIRE_FALSE(record->fields[0].isNull());
REQUIRE(record->fields[0].dateV.value() == dateValue);
REQUIRE(record->fields[0].dateV.value().toIsoExtendedString() == "1000-01-01");

session->deleteTimeseries(timeseries);
}
Loading