Skip to content
Open
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
5 changes: 5 additions & 0 deletions iotdb-client/client-cpp/src/include/Column.h
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,9 @@ class IntColumn : public Column {
ColumnEncoding getEncoding() const override;

int32_t getInt(int32_t position) const override;
int64_t getLong(int32_t position) const override;
float getFloat(int32_t position) const override;
double getDouble(int32_t position) const override;
std::vector<int32_t> getInts() const override;

bool mayHaveNull() const override;
Expand All @@ -220,6 +223,7 @@ class FloatColumn : public Column {
ColumnEncoding getEncoding() const override;

float getFloat(int32_t position) const override;
double getDouble(int32_t position) const override;
std::vector<float> getFloats() const override;

bool mayHaveNull() const override;
Expand All @@ -244,6 +248,7 @@ class LongColumn : public Column {
ColumnEncoding getEncoding() const override;

int64_t getLong(int32_t position) const override;
double getDouble(int32_t position) const override;
std::vector<int64_t> getLongs() const override;

bool mayHaveNull() const override;
Expand Down
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
20 changes: 20 additions & 0 deletions iotdb-client/client-cpp/src/session/Column.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,18 @@ int32_t IntColumn::getInt(int32_t position) const {
return values_[position + arrayOffset_];
}

int64_t IntColumn::getLong(int32_t position) const {
return values_[position + arrayOffset_];
}

float IntColumn::getFloat(int32_t position) const {
return values_[position + arrayOffset_];
}

double IntColumn::getDouble(int32_t position) const {
return values_[position + arrayOffset_];
}

std::vector<int32_t> IntColumn::getInts() const {
return values_;
}
Expand Down Expand Up @@ -204,6 +216,10 @@ float FloatColumn::getFloat(int32_t position) const {
return values_[position + arrayOffset_];
}

double FloatColumn::getDouble(int32_t position) const {
return values_[position + arrayOffset_];
}

std::vector<float> FloatColumn::getFloats() const {
return values_;
}
Expand Down Expand Up @@ -256,6 +272,10 @@ int64_t LongColumn::getLong(int32_t position) const {
return values_[position + arrayOffset_];
}

double LongColumn::getDouble(int32_t position) const {
return values_[position + arrayOffset_];
}

std::vector<int64_t> LongColumn::getLongs() const {
return values_;
}
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 @@ -1487,8 +1487,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 @@ -771,3 +771,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 @@ -1037,3 +1037,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