Merge pull request #22138 from taosdata/enh/TS-3625
fix: fix(value, null) output behavior
This commit is contained in:
commit
6fbf251978
|
@ -66,20 +66,25 @@ static void setNullRow(SSDataBlock* pBlock, SFillInfo* pFillInfo, int32_t rowInd
|
|||
}
|
||||
|
||||
static void doSetUserSpecifiedValue(SColumnInfoData* pDst, SVariant* pVar, int32_t rowIndex, int64_t currentKey) {
|
||||
bool isNull = (TSDB_DATA_TYPE_NULL == pVar->nType) ? true : false;
|
||||
if (pDst->info.type == TSDB_DATA_TYPE_FLOAT) {
|
||||
float v = 0;
|
||||
GET_TYPED_DATA(v, float, pVar->nType, &pVar->i);
|
||||
colDataSetVal(pDst, rowIndex, (char*)&v, false);
|
||||
GET_TYPED_DATA(v, float, pVar->nType, &pVar->f);
|
||||
colDataSetVal(pDst, rowIndex, (char*)&v, isNull);
|
||||
} else if (pDst->info.type == TSDB_DATA_TYPE_DOUBLE) {
|
||||
double v = 0;
|
||||
GET_TYPED_DATA(v, double, pVar->nType, &pVar->i);
|
||||
colDataSetVal(pDst, rowIndex, (char*)&v, false);
|
||||
GET_TYPED_DATA(v, double, pVar->nType, &pVar->d);
|
||||
colDataSetVal(pDst, rowIndex, (char*)&v, isNull);
|
||||
} else if (IS_SIGNED_NUMERIC_TYPE(pDst->info.type)) {
|
||||
int64_t v = 0;
|
||||
GET_TYPED_DATA(v, int64_t, pVar->nType, &pVar->i);
|
||||
colDataSetVal(pDst, rowIndex, (char*)&v, false);
|
||||
colDataSetVal(pDst, rowIndex, (char*)&v, isNull);
|
||||
} else if (IS_UNSIGNED_NUMERIC_TYPE(pDst->info.type)) {
|
||||
uint64_t v = 0;
|
||||
GET_TYPED_DATA(v, uint64_t, pVar->nType, &pVar->u);
|
||||
colDataSetVal(pDst, rowIndex, (char*)&v, isNull);
|
||||
} else if (pDst->info.type == TSDB_DATA_TYPE_TIMESTAMP) {
|
||||
colDataSetVal(pDst, rowIndex, (const char*)¤tKey, false);
|
||||
colDataSetVal(pDst, rowIndex, (const char*)¤tKey, isNull);
|
||||
} else { // varchar/nchar data
|
||||
colDataSetNULL(pDst, rowIndex);
|
||||
}
|
||||
|
|
|
@ -312,6 +312,7 @@ static bool genInterpolationResult(STimeSliceOperatorInfo* pSliceInfo, SExprSupp
|
|||
case TSDB_FILL_SET_VALUE_F: {
|
||||
SVariant* pVar = &pSliceInfo->pFillColInfo[fillColIndex].fillVal;
|
||||
|
||||
bool isNull = (TSDB_DATA_TYPE_NULL == pVar->nType) ? true : false;
|
||||
if (pDst->info.type == TSDB_DATA_TYPE_FLOAT) {
|
||||
float v = 0;
|
||||
if (!IS_VAR_DATA_TYPE(pVar->nType)) {
|
||||
|
@ -319,7 +320,7 @@ static bool genInterpolationResult(STimeSliceOperatorInfo* pSliceInfo, SExprSupp
|
|||
} else {
|
||||
v = taosStr2Float(varDataVal(pVar->pz), NULL);
|
||||
}
|
||||
colDataSetVal(pDst, rows, (char*)&v, false);
|
||||
colDataSetVal(pDst, rows, (char*)&v, isNull);
|
||||
} else if (pDst->info.type == TSDB_DATA_TYPE_DOUBLE) {
|
||||
double v = 0;
|
||||
if (!IS_VAR_DATA_TYPE(pVar->nType)) {
|
||||
|
@ -327,7 +328,7 @@ static bool genInterpolationResult(STimeSliceOperatorInfo* pSliceInfo, SExprSupp
|
|||
} else {
|
||||
v = taosStr2Double(varDataVal(pVar->pz), NULL);
|
||||
}
|
||||
colDataSetVal(pDst, rows, (char*)&v, false);
|
||||
colDataSetVal(pDst, rows, (char*)&v, isNull);
|
||||
} else if (IS_SIGNED_NUMERIC_TYPE(pDst->info.type)) {
|
||||
int64_t v = 0;
|
||||
if (!IS_VAR_DATA_TYPE(pVar->nType)) {
|
||||
|
@ -335,7 +336,7 @@ static bool genInterpolationResult(STimeSliceOperatorInfo* pSliceInfo, SExprSupp
|
|||
} else {
|
||||
v = taosStr2Int64(varDataVal(pVar->pz), NULL, 10);
|
||||
}
|
||||
colDataSetVal(pDst, rows, (char*)&v, false);
|
||||
colDataSetVal(pDst, rows, (char*)&v, isNull);
|
||||
} else if (IS_UNSIGNED_NUMERIC_TYPE(pDst->info.type)) {
|
||||
uint64_t v = 0;
|
||||
if (!IS_VAR_DATA_TYPE(pVar->nType)) {
|
||||
|
@ -343,7 +344,7 @@ static bool genInterpolationResult(STimeSliceOperatorInfo* pSliceInfo, SExprSupp
|
|||
} else {
|
||||
v = taosStr2UInt64(varDataVal(pVar->pz), NULL, 10);
|
||||
}
|
||||
colDataSetVal(pDst, rows, (char*)&v, false);
|
||||
colDataSetVal(pDst, rows, (char*)&v, isNull);
|
||||
} else if (IS_BOOLEAN_TYPE(pDst->info.type)) {
|
||||
bool v = false;
|
||||
if (!IS_VAR_DATA_TYPE(pVar->nType)) {
|
||||
|
@ -351,7 +352,7 @@ static bool genInterpolationResult(STimeSliceOperatorInfo* pSliceInfo, SExprSupp
|
|||
} else {
|
||||
v = taosStr2Int8(varDataVal(pVar->pz), NULL, 10);
|
||||
}
|
||||
colDataSetVal(pDst, rows, (char*)&v, false);
|
||||
colDataSetVal(pDst, rows, (char*)&v, isNull);
|
||||
}
|
||||
|
||||
++fillColIndex;
|
||||
|
|
|
@ -1224,4 +1224,104 @@ if $data42 != NULL then
|
|||
return -1
|
||||
endi
|
||||
|
||||
print ===================== TD-3625 test fill value NULL
|
||||
sql use $db
|
||||
|
||||
sql select _wstart,_wend,count(*) from tm0 where ts >= '2020-01-01 01:03:06.000' and ts <= '2020-01-01 01:03:10.000' interval(1s) fill(value, NULL);
|
||||
|
||||
if $rows != 5 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
if $data02 != NULL then
|
||||
return -1
|
||||
endi
|
||||
|
||||
if $data12 != 1 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
if $data22 != 1 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
if $data32 != 1 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
if $data42 != NULL then
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql select _wstart,_wend,count(*),sum(k),avg(k) from tm0 where ts >= '2020-01-01 01:03:06.000' and ts <= '2020-01-01 01:03:10.000' interval(1s) fill(value, 1, NULL, 1);
|
||||
|
||||
if $rows != 5 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
if $data02 != 1 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
if $data12 != 1 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
if $data22 != 1 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
if $data32 != 1 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
if $data42 != 1 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
|
||||
if $data03 != NULL then
|
||||
return -1
|
||||
endi
|
||||
|
||||
if $data13 != 7 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
if $data23 != 8 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
if $data33 != 9 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
if $data43 != NULL then
|
||||
return -1
|
||||
endi
|
||||
|
||||
|
||||
if $data04 != 1.000000000 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
if $data14 != 7.000000000 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
if $data24 != 8.000000000 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
if $data34 != 9.000000000 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
if $data44 != 1.000000000 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
|
||||
system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
||||
|
||||
|
||||
|
|
|
@ -147,6 +147,57 @@ class TDTestCase:
|
|||
tdSql.checkData(11, 0, 15)
|
||||
tdSql.checkData(12, 0, 1)
|
||||
|
||||
for col in col_list:
|
||||
tdSql.query(f"select interp({col}) from {dbname}.{tbname} range('2020-02-01 00:00:04', '2020-02-01 00:00:16') every(1s) fill(value, 1.0)")
|
||||
tdSql.checkRows(13)
|
||||
tdSql.checkData(0, 0, 1)
|
||||
tdSql.checkData(1, 0, 5)
|
||||
tdSql.checkData(2, 0, 1)
|
||||
tdSql.checkData(3, 0, 1)
|
||||
tdSql.checkData(4, 0, 1)
|
||||
tdSql.checkData(5, 0, 1)
|
||||
tdSql.checkData(6, 0, 10)
|
||||
tdSql.checkData(7, 0, 1)
|
||||
tdSql.checkData(8, 0, 1)
|
||||
tdSql.checkData(9, 0, 1)
|
||||
tdSql.checkData(10, 0, 1)
|
||||
tdSql.checkData(11, 0, 15)
|
||||
tdSql.checkData(12, 0, 1)
|
||||
|
||||
for col in col_list:
|
||||
tdSql.query(f"select interp({col}) from {dbname}.{tbname} range('2020-02-01 00:00:04', '2020-02-01 00:00:16') every(1s) fill(value, true)")
|
||||
tdSql.checkRows(13)
|
||||
tdSql.checkData(0, 0, 1)
|
||||
tdSql.checkData(1, 0, 5)
|
||||
tdSql.checkData(2, 0, 1)
|
||||
tdSql.checkData(3, 0, 1)
|
||||
tdSql.checkData(4, 0, 1)
|
||||
tdSql.checkData(5, 0, 1)
|
||||
tdSql.checkData(6, 0, 10)
|
||||
tdSql.checkData(7, 0, 1)
|
||||
tdSql.checkData(8, 0, 1)
|
||||
tdSql.checkData(9, 0, 1)
|
||||
tdSql.checkData(10, 0, 1)
|
||||
tdSql.checkData(11, 0, 15)
|
||||
tdSql.checkData(12, 0, 1)
|
||||
|
||||
for col in col_list:
|
||||
tdSql.query(f"select interp({col}) from {dbname}.{tbname} range('2020-02-01 00:00:04', '2020-02-01 00:00:16') every(1s) fill(value, NULL)")
|
||||
tdSql.checkRows(13)
|
||||
tdSql.checkData(0, 0, None)
|
||||
tdSql.checkData(1, 0, 5)
|
||||
tdSql.checkData(2, 0, None)
|
||||
tdSql.checkData(3, 0, None)
|
||||
tdSql.checkData(4, 0, None)
|
||||
tdSql.checkData(5, 0, None)
|
||||
tdSql.checkData(6, 0, 10)
|
||||
tdSql.checkData(7, 0, None)
|
||||
tdSql.checkData(8, 0, None)
|
||||
tdSql.checkData(9, 0, None)
|
||||
tdSql.checkData(10, 0, None)
|
||||
tdSql.checkData(11, 0, 15)
|
||||
tdSql.checkData(12, 0, None)
|
||||
|
||||
tdSql.query(f"select interp(c4) from {dbname}.{tbname} range('2020-02-01 00:00:04', '2020-02-01 00:00:16') every(1s) fill(value, 1)")
|
||||
tdSql.checkRows(13)
|
||||
tdSql.checkData(0, 0, 1.0)
|
||||
|
@ -163,6 +214,54 @@ class TDTestCase:
|
|||
tdSql.checkData(11, 0, 15.0)
|
||||
tdSql.checkData(12, 0, 1.0)
|
||||
|
||||
tdSql.query(f"select interp(c4) from {dbname}.{tbname} range('2020-02-01 00:00:04', '2020-02-01 00:00:16') every(1s) fill(value, 1.0)")
|
||||
tdSql.checkRows(13)
|
||||
tdSql.checkData(0, 0, 1.0)
|
||||
tdSql.checkData(1, 0, 5.0)
|
||||
tdSql.checkData(2, 0, 1.0)
|
||||
tdSql.checkData(3, 0, 1.0)
|
||||
tdSql.checkData(4, 0, 1.0)
|
||||
tdSql.checkData(5, 0, 1.0)
|
||||
tdSql.checkData(6, 0, 10.0)
|
||||
tdSql.checkData(7, 0, 1.0)
|
||||
tdSql.checkData(8, 0, 1.0)
|
||||
tdSql.checkData(9, 0, 1.0)
|
||||
tdSql.checkData(10, 0, 1.0)
|
||||
tdSql.checkData(11, 0, 15.0)
|
||||
tdSql.checkData(12, 0, 1.0)
|
||||
|
||||
tdSql.query(f"select interp(c4) from {dbname}.{tbname} range('2020-02-01 00:00:04', '2020-02-01 00:00:16') every(1s) fill(value, true)")
|
||||
tdSql.checkRows(13)
|
||||
tdSql.checkData(0, 0, 1.0)
|
||||
tdSql.checkData(1, 0, 5.0)
|
||||
tdSql.checkData(2, 0, 1.0)
|
||||
tdSql.checkData(3, 0, 1.0)
|
||||
tdSql.checkData(4, 0, 1.0)
|
||||
tdSql.checkData(5, 0, 1.0)
|
||||
tdSql.checkData(6, 0, 10.0)
|
||||
tdSql.checkData(7, 0, 1.0)
|
||||
tdSql.checkData(8, 0, 1.0)
|
||||
tdSql.checkData(9, 0, 1.0)
|
||||
tdSql.checkData(10, 0, 1.0)
|
||||
tdSql.checkData(11, 0, 15.0)
|
||||
tdSql.checkData(12, 0, 1.0)
|
||||
|
||||
tdSql.query(f"select interp(c4) from {dbname}.{tbname} range('2020-02-01 00:00:04', '2020-02-01 00:00:16') every(1s) fill(value, NULL)")
|
||||
tdSql.checkRows(13)
|
||||
tdSql.checkData(0, 0, None)
|
||||
tdSql.checkData(1, 0, 5.0)
|
||||
tdSql.checkData(2, 0, None)
|
||||
tdSql.checkData(3, 0, None)
|
||||
tdSql.checkData(4, 0, None)
|
||||
tdSql.checkData(5, 0, None)
|
||||
tdSql.checkData(6, 0, 10.0)
|
||||
tdSql.checkData(7, 0, None)
|
||||
tdSql.checkData(8, 0, None)
|
||||
tdSql.checkData(9, 0, None)
|
||||
tdSql.checkData(10, 0, None)
|
||||
tdSql.checkData(11, 0, 15.0)
|
||||
tdSql.checkData(12, 0, None)
|
||||
|
||||
tdSql.query(f"select interp(c5) from {dbname}.{tbname} range('2020-02-01 00:00:04', '2020-02-01 00:00:16') every(1s) fill(value, 1)")
|
||||
tdSql.checkRows(13)
|
||||
tdSql.checkData(0, 0, 1.0)
|
||||
|
@ -179,6 +278,54 @@ class TDTestCase:
|
|||
tdSql.checkData(11, 0, 15.0)
|
||||
tdSql.checkData(12, 0, 1.0)
|
||||
|
||||
tdSql.query(f"select interp(c5) from {dbname}.{tbname} range('2020-02-01 00:00:04', '2020-02-01 00:00:16') every(1s) fill(value, 1.0)")
|
||||
tdSql.checkRows(13)
|
||||
tdSql.checkData(0, 0, 1.0)
|
||||
tdSql.checkData(1, 0, 5.0)
|
||||
tdSql.checkData(2, 0, 1.0)
|
||||
tdSql.checkData(3, 0, 1.0)
|
||||
tdSql.checkData(4, 0, 1.0)
|
||||
tdSql.checkData(5, 0, 1.0)
|
||||
tdSql.checkData(6, 0, 10.0)
|
||||
tdSql.checkData(7, 0, 1.0)
|
||||
tdSql.checkData(8, 0, 1.0)
|
||||
tdSql.checkData(9, 0, 1.0)
|
||||
tdSql.checkData(10, 0, 1.0)
|
||||
tdSql.checkData(11, 0, 15.0)
|
||||
tdSql.checkData(12, 0, 1.0)
|
||||
|
||||
tdSql.query(f"select interp(c5) from {dbname}.{tbname} range('2020-02-01 00:00:04', '2020-02-01 00:00:16') every(1s) fill(value, true)")
|
||||
tdSql.checkRows(13)
|
||||
tdSql.checkData(0, 0, 1.0)
|
||||
tdSql.checkData(1, 0, 5.0)
|
||||
tdSql.checkData(2, 0, 1.0)
|
||||
tdSql.checkData(3, 0, 1.0)
|
||||
tdSql.checkData(4, 0, 1.0)
|
||||
tdSql.checkData(5, 0, 1.0)
|
||||
tdSql.checkData(6, 0, 10.0)
|
||||
tdSql.checkData(7, 0, 1.0)
|
||||
tdSql.checkData(8, 0, 1.0)
|
||||
tdSql.checkData(9, 0, 1.0)
|
||||
tdSql.checkData(10, 0, 1.0)
|
||||
tdSql.checkData(11, 0, 15.0)
|
||||
tdSql.checkData(12, 0, 1.0)
|
||||
|
||||
tdSql.query(f"select interp(c5) from {dbname}.{tbname} range('2020-02-01 00:00:04', '2020-02-01 00:00:16') every(1s) fill(value, NULL)")
|
||||
tdSql.checkRows(13)
|
||||
tdSql.checkData(0, 0, None)
|
||||
tdSql.checkData(1, 0, 5.0)
|
||||
tdSql.checkData(2, 0, None)
|
||||
tdSql.checkData(3, 0, None)
|
||||
tdSql.checkData(4, 0, None)
|
||||
tdSql.checkData(5, 0, None)
|
||||
tdSql.checkData(6, 0, 10.0)
|
||||
tdSql.checkData(7, 0, None)
|
||||
tdSql.checkData(8, 0, None)
|
||||
tdSql.checkData(9, 0, None)
|
||||
tdSql.checkData(10, 0, None)
|
||||
tdSql.checkData(11, 0, 15.0)
|
||||
tdSql.checkData(12, 0, None)
|
||||
|
||||
tdSql.query(f"select interp(c6) from {dbname}.{tbname} range('2020-02-01 00:00:04', '2020-02-01 00:00:16') every(1s) fill(value, 1)")
|
||||
tdSql.checkRows(13)
|
||||
tdSql.checkData(0, 0, True)
|
||||
|
@ -195,6 +342,54 @@ class TDTestCase:
|
|||
tdSql.checkData(11, 0, True)
|
||||
tdSql.checkData(12, 0, True)
|
||||
|
||||
tdSql.query(f"select interp(c6) from {dbname}.{tbname} range('2020-02-01 00:00:04', '2020-02-01 00:00:16') every(1s) fill(value, 1.0)")
|
||||
tdSql.checkRows(13)
|
||||
tdSql.checkData(0, 0, True)
|
||||
tdSql.checkData(1, 0, True)
|
||||
tdSql.checkData(2, 0, True)
|
||||
tdSql.checkData(3, 0, True)
|
||||
tdSql.checkData(4, 0, True)
|
||||
tdSql.checkData(5, 0, True)
|
||||
tdSql.checkData(6, 0, True)
|
||||
tdSql.checkData(7, 0, True)
|
||||
tdSql.checkData(8, 0, True)
|
||||
tdSql.checkData(9, 0, True)
|
||||
tdSql.checkData(10, 0, True)
|
||||
tdSql.checkData(11, 0, True)
|
||||
tdSql.checkData(12, 0, True)
|
||||
|
||||
tdSql.query(f"select interp(c6) from {dbname}.{tbname} range('2020-02-01 00:00:04', '2020-02-01 00:00:16') every(1s) fill(value, true)")
|
||||
tdSql.checkRows(13)
|
||||
tdSql.checkData(0, 0, True)
|
||||
tdSql.checkData(1, 0, True)
|
||||
tdSql.checkData(2, 0, True)
|
||||
tdSql.checkData(3, 0, True)
|
||||
tdSql.checkData(4, 0, True)
|
||||
tdSql.checkData(5, 0, True)
|
||||
tdSql.checkData(6, 0, True)
|
||||
tdSql.checkData(7, 0, True)
|
||||
tdSql.checkData(8, 0, True)
|
||||
tdSql.checkData(9, 0, True)
|
||||
tdSql.checkData(10, 0, True)
|
||||
tdSql.checkData(11, 0, True)
|
||||
tdSql.checkData(12, 0, True)
|
||||
|
||||
tdSql.query(f"select interp(c6) from {dbname}.{tbname} range('2020-02-01 00:00:04', '2020-02-01 00:00:16') every(1s) fill(value, NULL)")
|
||||
tdSql.checkRows(13)
|
||||
tdSql.checkData(0, 0, None)
|
||||
tdSql.checkData(1, 0, True)
|
||||
tdSql.checkData(2, 0, None)
|
||||
tdSql.checkData(3, 0, None)
|
||||
tdSql.checkData(4, 0, None)
|
||||
tdSql.checkData(5, 0, None)
|
||||
tdSql.checkData(6, 0, True)
|
||||
tdSql.checkData(7, 0, None)
|
||||
tdSql.checkData(8, 0, None)
|
||||
tdSql.checkData(9, 0, None)
|
||||
tdSql.checkData(10, 0, None)
|
||||
tdSql.checkData(11, 0, True)
|
||||
tdSql.checkData(12, 0, None)
|
||||
|
||||
## {} ...
|
||||
tdSql.query(f"select interp(c0) from {dbname}.{tbname} range('2020-02-01 00:00:01', '2020-02-01 00:00:04') every(1s) fill(value, 1)")
|
||||
tdSql.checkRows(4)
|
||||
|
@ -2587,25 +2782,25 @@ class TDTestCase:
|
|||
|
||||
tdSql.checkData(0, 0, '2020-02-02 00:00:00.000')
|
||||
|
||||
tdSql.checkData(0, 2, False)
|
||||
tdSql.checkData(0, 2, None)
|
||||
tdSql.checkData(1, 2, False)
|
||||
tdSql.checkData(2, 2, False)
|
||||
tdSql.checkData(2, 2, None)
|
||||
tdSql.checkData(3, 2, True)
|
||||
tdSql.checkData(4, 2, False)
|
||||
tdSql.checkData(4, 2, None)
|
||||
tdSql.checkData(5, 2, False)
|
||||
tdSql.checkData(6, 2, False)
|
||||
tdSql.checkData(6, 2, None)
|
||||
tdSql.checkData(7, 2, True)
|
||||
tdSql.checkData(8, 2, False)
|
||||
tdSql.checkData(8, 2, None)
|
||||
tdSql.checkData(9, 2, True)
|
||||
tdSql.checkData(10, 2, False)
|
||||
tdSql.checkData(10, 2, None)
|
||||
tdSql.checkData(11, 2, False)
|
||||
tdSql.checkData(12, 2, False)
|
||||
tdSql.checkData(12, 2, None)
|
||||
tdSql.checkData(13, 2, False)
|
||||
tdSql.checkData(14, 2, False)
|
||||
tdSql.checkData(14, 2, None)
|
||||
tdSql.checkData(15, 2, None)
|
||||
tdSql.checkData(16, 2, False)
|
||||
tdSql.checkData(16, 2, None)
|
||||
tdSql.checkData(17, 2, None)
|
||||
tdSql.checkData(18, 2, False)
|
||||
tdSql.checkData(18, 2, None)
|
||||
|
||||
tdSql.checkData(18, 0, '2020-02-02 00:00:18.000')
|
||||
|
||||
|
|
Loading…
Reference in New Issue