Merge branch '3.0' of https://github.com/taosdata/TDengine into fix/stt_trigger_config
This commit is contained in:
commit
9e33dfbc90
|
@ -69,7 +69,18 @@ static FORCE_INLINE void taosEncryptPass_c(uint8_t *inBuf, size_t len, char *tar
|
||||||
memcpy(target, buf, TSDB_PASSWORD_LEN);
|
memcpy(target, buf, TSDB_PASSWORD_LEN);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define taosGetTbHashVal(tbname, tblen, method, prefix, suffix) MurmurHash3_32((tbname), (tblen))
|
static FORCE_INLINE int32_t taosGetTbHashVal(const char *tbname, int32_t tblen, int32_t method, int32_t prefix,
|
||||||
|
int32_t suffix) {
|
||||||
|
if (prefix == 0 && suffix == 0) {
|
||||||
|
return MurmurHash3_32(tbname, tblen);
|
||||||
|
} else {
|
||||||
|
if (tblen <= (prefix + suffix)) {
|
||||||
|
return MurmurHash3_32(tbname, tblen);
|
||||||
|
} else {
|
||||||
|
return MurmurHash3_32(tbname + prefix, tblen - prefix - suffix);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -103,6 +103,8 @@ static const SSysDbTableSchema userDBSchema[] = {
|
||||||
{.name = "wal_roll_period", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = true},
|
{.name = "wal_roll_period", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = true},
|
||||||
{.name = "wal_segment_size", .bytes = 8, .type = TSDB_DATA_TYPE_BIGINT, .sysInfo = true},
|
{.name = "wal_segment_size", .bytes = 8, .type = TSDB_DATA_TYPE_BIGINT, .sysInfo = true},
|
||||||
{.name = "sst_trigger", .bytes = 2, .type = TSDB_DATA_TYPE_SMALLINT, .sysInfo = true},
|
{.name = "sst_trigger", .bytes = 2, .type = TSDB_DATA_TYPE_SMALLINT, .sysInfo = true},
|
||||||
|
{.name = "table_prefix", .bytes = 2, .type = TSDB_DATA_TYPE_SMALLINT, .sysInfo = true},
|
||||||
|
{.name = "table_suffix", .bytes = 2, .type = TSDB_DATA_TYPE_SMALLINT, .sysInfo = true},
|
||||||
};
|
};
|
||||||
|
|
||||||
static const SSysDbTableSchema userFuncSchema[] = {
|
static const SSysDbTableSchema userFuncSchema[] = {
|
||||||
|
|
|
@ -513,6 +513,12 @@ static int32_t mndCreateDb(SMnode *pMnode, SRpcMsg *pReq, SCreateDbReq *pCreate,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (dbObj.cfg.hashPrefix > 0) {
|
||||||
|
int32_t dbLen = strlen(dbObj.name) + 1;
|
||||||
|
mInfo("db:%s, hashPrefix adjust from %d to %d", dbObj.name, dbObj.cfg.hashPrefix, dbObj.cfg.hashPrefix + dbLen);
|
||||||
|
dbObj.cfg.hashPrefix += dbLen;
|
||||||
|
}
|
||||||
|
|
||||||
SVgObj *pVgroups = NULL;
|
SVgObj *pVgroups = NULL;
|
||||||
if (mndAllocVgroup(pMnode, &dbObj, &pVgroups) != 0) {
|
if (mndAllocVgroup(pMnode, &dbObj, &pVgroups) != 0) {
|
||||||
mError("db:%s, failed to create since %s", pCreate->db, terrstr());
|
mError("db:%s, failed to create since %s", pCreate->db, terrstr());
|
||||||
|
@ -1710,6 +1716,16 @@ static void mndDumpDbInfoData(SMnode *pMnode, SSDataBlock *pBlock, SDbObj *pDb,
|
||||||
|
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.sstTrigger, false);
|
colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.sstTrigger, false);
|
||||||
|
|
||||||
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
|
int16_t hashPrefix = pDb->cfg.hashPrefix;
|
||||||
|
if (hashPrefix > 0) {
|
||||||
|
hashPrefix = pDb->cfg.hashPrefix - strlen(pDb->name) - 1;
|
||||||
|
}
|
||||||
|
colDataAppend(pColInfo, rows, (const char *)&hashPrefix, false);
|
||||||
|
|
||||||
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
|
colDataAppend(pColInfo, rows, (const char *)&pDb->cfg.hashSuffix, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
taosMemoryFree(buf);
|
taosMemoryFree(buf);
|
||||||
|
|
|
@ -82,6 +82,8 @@ typedef struct SLDataIter SLDataIter;
|
||||||
#define TSDBKEY_MIN ((TSDBKEY){.ts = TSKEY_MIN, .version = VERSION_MIN})
|
#define TSDBKEY_MIN ((TSDBKEY){.ts = TSKEY_MIN, .version = VERSION_MIN})
|
||||||
#define TSDBKEY_MAX ((TSDBKEY){.ts = TSKEY_MAX, .version = VERSION_MAX})
|
#define TSDBKEY_MAX ((TSDBKEY){.ts = TSKEY_MAX, .version = VERSION_MAX})
|
||||||
|
|
||||||
|
#define TABLE_SAME_SCHEMA(SUID1, UID1, SUID2, UID2) ((SUID1) ? (SUID1) == (SUID2) : (UID1) == (UID2))
|
||||||
|
|
||||||
#define PAGE_CONTENT_SIZE(PAGE) ((PAGE) - sizeof(TSCKSUM))
|
#define PAGE_CONTENT_SIZE(PAGE) ((PAGE) - sizeof(TSCKSUM))
|
||||||
#define LOGIC_TO_FILE_OFFSET(LOFFSET, PAGE) \
|
#define LOGIC_TO_FILE_OFFSET(LOFFSET, PAGE) \
|
||||||
((LOFFSET) / PAGE_CONTENT_SIZE(PAGE) * (PAGE) + (LOFFSET) % PAGE_CONTENT_SIZE(PAGE))
|
((LOFFSET) / PAGE_CONTENT_SIZE(PAGE) * (PAGE) + (LOFFSET) % PAGE_CONTENT_SIZE(PAGE))
|
||||||
|
@ -260,7 +262,7 @@ int32_t tsdbDataFWriterOpen(SDataFWriter **ppWriter, STsdb *pTsdb, SDFileSet *pS
|
||||||
int32_t tsdbDataFWriterClose(SDataFWriter **ppWriter, int8_t sync);
|
int32_t tsdbDataFWriterClose(SDataFWriter **ppWriter, int8_t sync);
|
||||||
int32_t tsdbUpdateDFileSetHeader(SDataFWriter *pWriter);
|
int32_t tsdbUpdateDFileSetHeader(SDataFWriter *pWriter);
|
||||||
int32_t tsdbWriteBlockIdx(SDataFWriter *pWriter, SArray *aBlockIdx);
|
int32_t tsdbWriteBlockIdx(SDataFWriter *pWriter, SArray *aBlockIdx);
|
||||||
int32_t tsdbWriteBlock(SDataFWriter *pWriter, SMapData *pMapData, SBlockIdx *pBlockIdx);
|
int32_t tsdbWriteDataBlk(SDataFWriter *pWriter, SMapData *mDataBlk, SBlockIdx *pBlockIdx);
|
||||||
int32_t tsdbWriteSttBlk(SDataFWriter *pWriter, SArray *aSttBlk);
|
int32_t tsdbWriteSttBlk(SDataFWriter *pWriter, SArray *aSttBlk);
|
||||||
int32_t tsdbWriteBlockData(SDataFWriter *pWriter, SBlockData *pBlockData, SBlockInfo *pBlkInfo, SSmaInfo *pSmaInfo,
|
int32_t tsdbWriteBlockData(SDataFWriter *pWriter, SBlockData *pBlockData, SBlockInfo *pBlkInfo, SSmaInfo *pSmaInfo,
|
||||||
int8_t cmprAlg, int8_t toLast);
|
int8_t cmprAlg, int8_t toLast);
|
||||||
|
@ -270,7 +272,7 @@ int32_t tsdbDFileSetCopy(STsdb *pTsdb, SDFileSet *pSetFrom, SDFileSet *pSetTo);
|
||||||
int32_t tsdbDataFReaderOpen(SDataFReader **ppReader, STsdb *pTsdb, SDFileSet *pSet);
|
int32_t tsdbDataFReaderOpen(SDataFReader **ppReader, STsdb *pTsdb, SDFileSet *pSet);
|
||||||
int32_t tsdbDataFReaderClose(SDataFReader **ppReader);
|
int32_t tsdbDataFReaderClose(SDataFReader **ppReader);
|
||||||
int32_t tsdbReadBlockIdx(SDataFReader *pReader, SArray *aBlockIdx);
|
int32_t tsdbReadBlockIdx(SDataFReader *pReader, SArray *aBlockIdx);
|
||||||
int32_t tsdbReadBlock(SDataFReader *pReader, SBlockIdx *pBlockIdx, SMapData *pMapData);
|
int32_t tsdbReadDataBlk(SDataFReader *pReader, SBlockIdx *pBlockIdx, SMapData *mDataBlk);
|
||||||
int32_t tsdbReadSttBlk(SDataFReader *pReader, int32_t iStt, SArray *aSttBlk);
|
int32_t tsdbReadSttBlk(SDataFReader *pReader, int32_t iStt, SArray *aSttBlk);
|
||||||
int32_t tsdbReadBlockSma(SDataFReader *pReader, SDataBlk *pBlock, SArray *aColumnDataAgg);
|
int32_t tsdbReadBlockSma(SDataFReader *pReader, SDataBlk *pBlock, SArray *aColumnDataAgg);
|
||||||
int32_t tsdbReadDataBlock(SDataFReader *pReader, SDataBlk *pBlock, SBlockData *pBlockData);
|
int32_t tsdbReadDataBlock(SDataFReader *pReader, SDataBlk *pBlock, SBlockData *pBlockData);
|
||||||
|
@ -660,6 +662,12 @@ typedef struct SMergeTree {
|
||||||
const char *idStr;
|
const char *idStr;
|
||||||
} SMergeTree;
|
} SMergeTree;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int64_t suid;
|
||||||
|
int64_t uid;
|
||||||
|
STSchema *pTSchema;
|
||||||
|
} SSkmInfo;
|
||||||
|
|
||||||
int32_t tMergeTreeOpen(SMergeTree *pMTree, int8_t backward, SDataFReader *pFReader, uint64_t suid, uint64_t uid,
|
int32_t tMergeTreeOpen(SMergeTree *pMTree, int8_t backward, SDataFReader *pFReader, uint64_t suid, uint64_t uid,
|
||||||
STimeWindow *pTimeWindow, SVersionRange *pVerRange, void *pLoadInfo, const char *idStr);
|
STimeWindow *pTimeWindow, SVersionRange *pVerRange, void *pLoadInfo, const char *idStr);
|
||||||
void tMergeTreeAddIter(SMergeTree *pMTree, SLDataIter *pIter);
|
void tMergeTreeAddIter(SMergeTree *pMTree, SLDataIter *pIter);
|
||||||
|
|
|
@ -104,7 +104,7 @@ int metaCreateSTable(SMeta* pMeta, int64_t version, SVCreateStbReq*
|
||||||
int metaAlterSTable(SMeta* pMeta, int64_t version, SVCreateStbReq* pReq);
|
int metaAlterSTable(SMeta* pMeta, int64_t version, SVCreateStbReq* pReq);
|
||||||
int metaDropSTable(SMeta* pMeta, int64_t verison, SVDropStbReq* pReq, SArray* tbUidList);
|
int metaDropSTable(SMeta* pMeta, int64_t verison, SVDropStbReq* pReq, SArray* tbUidList);
|
||||||
int metaCreateTable(SMeta* pMeta, int64_t version, SVCreateTbReq* pReq, STableMetaRsp** pMetaRsp);
|
int metaCreateTable(SMeta* pMeta, int64_t version, SVCreateTbReq* pReq, STableMetaRsp** pMetaRsp);
|
||||||
int metaDropTable(SMeta* pMeta, int64_t version, SVDropTbReq* pReq, SArray* tbUids, int64_t *tbUid);
|
int metaDropTable(SMeta* pMeta, int64_t version, SVDropTbReq* pReq, SArray* tbUids, int64_t* tbUid);
|
||||||
int metaTtlDropTable(SMeta* pMeta, int64_t ttl, SArray* tbUids);
|
int metaTtlDropTable(SMeta* pMeta, int64_t ttl, SArray* tbUids);
|
||||||
int metaAlterTable(SMeta* pMeta, int64_t version, SVAlterTbReq* pReq, STableMetaRsp* pMetaRsp);
|
int metaAlterTable(SMeta* pMeta, int64_t version, SVAlterTbReq* pReq, STableMetaRsp* pMetaRsp);
|
||||||
SSchemaWrapper* metaGetTableSchema(SMeta* pMeta, tb_uid_t uid, int32_t sver, bool isinline);
|
SSchemaWrapper* metaGetTableSchema(SMeta* pMeta, tb_uid_t uid, int32_t sver, bool isinline);
|
||||||
|
|
|
@ -589,7 +589,7 @@ static int32_t getNextRowFromFS(void *iter, TSDBROW **ppRow) {
|
||||||
}
|
}
|
||||||
|
|
||||||
tMapDataReset(&state->blockMap);
|
tMapDataReset(&state->blockMap);
|
||||||
code = tsdbReadBlock(state->pDataFReader, state->pBlockIdx, &state->blockMap);
|
code = tsdbReadDataBlk(state->pDataFReader, state->pBlockIdx, &state->blockMap);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
state->nBlock = state->blockMap.nItem;
|
state->nBlock = state->blockMap.nItem;
|
||||||
|
|
|
@ -14,13 +14,8 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "tsdb.h"
|
#include "tsdb.h"
|
||||||
typedef struct {
|
|
||||||
int64_t suid;
|
|
||||||
int64_t uid;
|
|
||||||
STSchema *pTSchema;
|
|
||||||
} SSkmInfo;
|
|
||||||
|
|
||||||
typedef enum { MEMORY_DATA_ITER = 0, LAST_DATA_ITER } EDataIterT;
|
typedef enum { MEMORY_DATA_ITER = 0, STT_DATA_ITER } EDataIterT;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
SRBTreeNode n;
|
SRBTreeNode n;
|
||||||
|
@ -99,7 +94,7 @@ static int32_t tsdbCommitCache(SCommitter *pCommitter);
|
||||||
static int32_t tsdbEndCommit(SCommitter *pCommitter, int32_t eno);
|
static int32_t tsdbEndCommit(SCommitter *pCommitter, int32_t eno);
|
||||||
static int32_t tsdbNextCommitRow(SCommitter *pCommitter);
|
static int32_t tsdbNextCommitRow(SCommitter *pCommitter);
|
||||||
|
|
||||||
static int32_t tRowInfoCmprFn(const void *p1, const void *p2) {
|
int32_t tRowInfoCmprFn(const void *p1, const void *p2) {
|
||||||
SRowInfo *pInfo1 = (SRowInfo *)p1;
|
SRowInfo *pInfo1 = (SRowInfo *)p1;
|
||||||
SRowInfo *pInfo2 = (SRowInfo *)p2;
|
SRowInfo *pInfo2 = (SRowInfo *)p2;
|
||||||
|
|
||||||
|
@ -325,22 +320,22 @@ _err:
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t tsdbCommitterUpdateTableSchema(SCommitter *pCommitter, int64_t suid, int64_t uid) {
|
int32_t tsdbUpdateTableSchema(SMeta *pMeta, int64_t suid, int64_t uid, SSkmInfo *pSkmInfo) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
if (suid) {
|
if (suid) {
|
||||||
if (pCommitter->skmTable.suid == suid) {
|
if (pSkmInfo->suid == suid) {
|
||||||
pCommitter->skmTable.uid = uid;
|
pSkmInfo->uid = uid;
|
||||||
goto _exit;
|
goto _exit;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (pCommitter->skmTable.uid == uid) goto _exit;
|
if (pSkmInfo->uid == uid) goto _exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
pCommitter->skmTable.suid = suid;
|
pSkmInfo->suid = suid;
|
||||||
pCommitter->skmTable.uid = uid;
|
pSkmInfo->uid = uid;
|
||||||
tTSchemaDestroy(pCommitter->skmTable.pTSchema);
|
tTSchemaDestroy(pSkmInfo->pTSchema);
|
||||||
code = metaGetTbTSchemaEx(pCommitter->pTsdb->pVnode->pMeta, suid, uid, -1, &pCommitter->skmTable.pTSchema);
|
code = metaGetTbTSchemaEx(pMeta, suid, uid, -1, &pSkmInfo->pTSchema);
|
||||||
if (code) goto _exit;
|
if (code) goto _exit;
|
||||||
|
|
||||||
_exit:
|
_exit:
|
||||||
|
@ -382,7 +377,7 @@ static int32_t tsdbCommitterNextTableData(SCommitter *pCommitter) {
|
||||||
pCommitter->dReader.pBlockIdx =
|
pCommitter->dReader.pBlockIdx =
|
||||||
(SBlockIdx *)taosArrayGet(pCommitter->dReader.aBlockIdx, pCommitter->dReader.iBlockIdx);
|
(SBlockIdx *)taosArrayGet(pCommitter->dReader.aBlockIdx, pCommitter->dReader.iBlockIdx);
|
||||||
|
|
||||||
code = tsdbReadBlock(pCommitter->dReader.pReader, pCommitter->dReader.pBlockIdx, &pCommitter->dReader.mBlock);
|
code = tsdbReadDataBlk(pCommitter->dReader.pReader, pCommitter->dReader.pBlockIdx, &pCommitter->dReader.mBlock);
|
||||||
if (code) goto _exit;
|
if (code) goto _exit;
|
||||||
|
|
||||||
ASSERT(pCommitter->dReader.mBlock.nItem > 0);
|
ASSERT(pCommitter->dReader.mBlock.nItem > 0);
|
||||||
|
@ -432,7 +427,7 @@ static int32_t tsdbOpenCommitIter(SCommitter *pCommitter) {
|
||||||
int8_t iIter = 0;
|
int8_t iIter = 0;
|
||||||
for (int32_t iStt = 0; iStt < pReader->pSet->nSttF; iStt++) {
|
for (int32_t iStt = 0; iStt < pReader->pSet->nSttF; iStt++) {
|
||||||
pIter = &pCommitter->aDataIter[iIter];
|
pIter = &pCommitter->aDataIter[iIter];
|
||||||
pIter->type = LAST_DATA_ITER;
|
pIter->type = STT_DATA_ITER;
|
||||||
pIter->iStt = iStt;
|
pIter->iStt = iStt;
|
||||||
|
|
||||||
code = tsdbReadSttBlk(pCommitter->dReader.pReader, iStt, pIter->aSttBlk);
|
code = tsdbReadSttBlk(pCommitter->dReader.pReader, iStt, pIter->aSttBlk);
|
||||||
|
@ -498,7 +493,7 @@ static int32_t tsdbCommitFileDataStart(SCommitter *pCommitter) {
|
||||||
pCommitter->dReader.iBlockIdx = 0;
|
pCommitter->dReader.iBlockIdx = 0;
|
||||||
if (taosArrayGetSize(pCommitter->dReader.aBlockIdx) > 0) {
|
if (taosArrayGetSize(pCommitter->dReader.aBlockIdx) > 0) {
|
||||||
pCommitter->dReader.pBlockIdx = (SBlockIdx *)taosArrayGet(pCommitter->dReader.aBlockIdx, 0);
|
pCommitter->dReader.pBlockIdx = (SBlockIdx *)taosArrayGet(pCommitter->dReader.aBlockIdx, 0);
|
||||||
code = tsdbReadBlock(pCommitter->dReader.pReader, pCommitter->dReader.pBlockIdx, &pCommitter->dReader.mBlock);
|
code = tsdbReadDataBlk(pCommitter->dReader.pReader, pCommitter->dReader.pBlockIdx, &pCommitter->dReader.mBlock);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
} else {
|
} else {
|
||||||
pCommitter->dReader.pBlockIdx = NULL;
|
pCommitter->dReader.pBlockIdx = NULL;
|
||||||
|
@ -556,46 +551,45 @@ _err:
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t tsdbCommitDataBlock(SCommitter *pCommitter) {
|
int32_t tsdbWriteDataBlock(SDataFWriter *pWriter, SBlockData *pBlockData, SMapData *mDataBlk, int8_t cmprAlg) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
SBlockData *pBlockData = &pCommitter->dWriter.bData;
|
|
||||||
SDataBlk block;
|
|
||||||
|
|
||||||
ASSERT(pBlockData->nRow > 0);
|
if (pBlockData->nRow == 0) return code;
|
||||||
|
|
||||||
tDataBlkReset(&block);
|
SDataBlk dataBlk;
|
||||||
|
tDataBlkReset(&dataBlk);
|
||||||
|
|
||||||
// info
|
// info
|
||||||
block.nRow += pBlockData->nRow;
|
dataBlk.nRow += pBlockData->nRow;
|
||||||
for (int32_t iRow = 0; iRow < pBlockData->nRow; iRow++) {
|
for (int32_t iRow = 0; iRow < pBlockData->nRow; iRow++) {
|
||||||
TSDBKEY key = {.ts = pBlockData->aTSKEY[iRow], .version = pBlockData->aVersion[iRow]};
|
TSDBKEY key = {.ts = pBlockData->aTSKEY[iRow], .version = pBlockData->aVersion[iRow]};
|
||||||
|
|
||||||
if (iRow == 0) {
|
if (iRow == 0) {
|
||||||
if (tsdbKeyCmprFn(&block.minKey, &key) > 0) {
|
if (tsdbKeyCmprFn(&dataBlk.minKey, &key) > 0) {
|
||||||
block.minKey = key;
|
dataBlk.minKey = key;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (pBlockData->aTSKEY[iRow] == pBlockData->aTSKEY[iRow - 1]) {
|
if (pBlockData->aTSKEY[iRow] == pBlockData->aTSKEY[iRow - 1]) {
|
||||||
block.hasDup = 1;
|
dataBlk.hasDup = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (iRow == pBlockData->nRow - 1 && tsdbKeyCmprFn(&block.maxKey, &key) < 0) {
|
if (iRow == pBlockData->nRow - 1 && tsdbKeyCmprFn(&dataBlk.maxKey, &key) < 0) {
|
||||||
block.maxKey = key;
|
dataBlk.maxKey = key;
|
||||||
}
|
}
|
||||||
|
|
||||||
block.minVer = TMIN(block.minVer, key.version);
|
dataBlk.minVer = TMIN(dataBlk.minVer, key.version);
|
||||||
block.maxVer = TMAX(block.maxVer, key.version);
|
dataBlk.maxVer = TMAX(dataBlk.maxVer, key.version);
|
||||||
}
|
}
|
||||||
|
|
||||||
// write
|
// write
|
||||||
block.nSubBlock++;
|
dataBlk.nSubBlock++;
|
||||||
code = tsdbWriteBlockData(pCommitter->dWriter.pWriter, pBlockData, &block.aSubBlock[block.nSubBlock - 1],
|
code = tsdbWriteBlockData(pWriter, pBlockData, &dataBlk.aSubBlock[dataBlk.nSubBlock - 1],
|
||||||
((block.nSubBlock == 1) && !block.hasDup) ? &block.smaInfo : NULL, pCommitter->cmprAlg, 0);
|
((dataBlk.nSubBlock == 1) && !dataBlk.hasDup) ? &dataBlk.smaInfo : NULL, cmprAlg, 0);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
// put SDataBlk
|
// put SDataBlk
|
||||||
code = tMapDataPutItem(&pCommitter->dWriter.mBlock, &block, tPutDataBlk);
|
code = tMapDataPutItem(mDataBlk, &dataBlk, tPutDataBlk);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
// clear
|
// clear
|
||||||
|
@ -604,39 +598,38 @@ static int32_t tsdbCommitDataBlock(SCommitter *pCommitter) {
|
||||||
return code;
|
return code;
|
||||||
|
|
||||||
_err:
|
_err:
|
||||||
tsdbError("vgId:%d tsdb commit data block failed since %s", TD_VID(pCommitter->pTsdb->pVnode), tstrerror(code));
|
tsdbError("vgId:%d tsdb commit data block failed since %s", TD_VID(pWriter->pTsdb->pVnode), tstrerror(code));
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t tsdbCommitLastBlock(SCommitter *pCommitter) {
|
int32_t tsdbWriteSttBlock(SDataFWriter *pWriter, SBlockData *pBlockData, SArray *aSttBlk, int8_t cmprAlg) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
SSttBlk blockL;
|
SSttBlk sstBlk;
|
||||||
SBlockData *pBlockData = &pCommitter->dWriter.bDatal;
|
|
||||||
|
|
||||||
ASSERT(pBlockData->nRow > 0);
|
if (pBlockData->nRow == 0) return code;
|
||||||
|
|
||||||
// info
|
// info
|
||||||
blockL.suid = pBlockData->suid;
|
sstBlk.suid = pBlockData->suid;
|
||||||
blockL.nRow = pBlockData->nRow;
|
sstBlk.nRow = pBlockData->nRow;
|
||||||
blockL.minKey = TSKEY_MAX;
|
sstBlk.minKey = TSKEY_MAX;
|
||||||
blockL.maxKey = TSKEY_MIN;
|
sstBlk.maxKey = TSKEY_MIN;
|
||||||
blockL.minVer = VERSION_MAX;
|
sstBlk.minVer = VERSION_MAX;
|
||||||
blockL.maxVer = VERSION_MIN;
|
sstBlk.maxVer = VERSION_MIN;
|
||||||
for (int32_t iRow = 0; iRow < pBlockData->nRow; iRow++) {
|
for (int32_t iRow = 0; iRow < pBlockData->nRow; iRow++) {
|
||||||
blockL.minKey = TMIN(blockL.minKey, pBlockData->aTSKEY[iRow]);
|
sstBlk.minKey = TMIN(sstBlk.minKey, pBlockData->aTSKEY[iRow]);
|
||||||
blockL.maxKey = TMAX(blockL.maxKey, pBlockData->aTSKEY[iRow]);
|
sstBlk.maxKey = TMAX(sstBlk.maxKey, pBlockData->aTSKEY[iRow]);
|
||||||
blockL.minVer = TMIN(blockL.minVer, pBlockData->aVersion[iRow]);
|
sstBlk.minVer = TMIN(sstBlk.minVer, pBlockData->aVersion[iRow]);
|
||||||
blockL.maxVer = TMAX(blockL.maxVer, pBlockData->aVersion[iRow]);
|
sstBlk.maxVer = TMAX(sstBlk.maxVer, pBlockData->aVersion[iRow]);
|
||||||
}
|
}
|
||||||
blockL.minUid = pBlockData->uid ? pBlockData->uid : pBlockData->aUid[0];
|
sstBlk.minUid = pBlockData->uid ? pBlockData->uid : pBlockData->aUid[0];
|
||||||
blockL.maxUid = pBlockData->uid ? pBlockData->uid : pBlockData->aUid[pBlockData->nRow - 1];
|
sstBlk.maxUid = pBlockData->uid ? pBlockData->uid : pBlockData->aUid[pBlockData->nRow - 1];
|
||||||
|
|
||||||
// write
|
// write
|
||||||
code = tsdbWriteBlockData(pCommitter->dWriter.pWriter, pBlockData, &blockL.bInfo, NULL, pCommitter->cmprAlg, 1);
|
code = tsdbWriteBlockData(pWriter, pBlockData, &sstBlk.bInfo, NULL, cmprAlg, 1);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
// push SSttBlk
|
// push SSttBlk
|
||||||
if (taosArrayPush(pCommitter->dWriter.aSttBlk, &blockL) == NULL) {
|
if (taosArrayPush(aSttBlk, &sstBlk) == NULL) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
|
@ -647,7 +640,7 @@ static int32_t tsdbCommitLastBlock(SCommitter *pCommitter) {
|
||||||
return code;
|
return code;
|
||||||
|
|
||||||
_err:
|
_err:
|
||||||
tsdbError("vgId:%d tsdb commit last block failed since %s", TD_VID(pCommitter->pTsdb->pVnode), tstrerror(code));
|
tsdbError("vgId:%d tsdb commit last block failed since %s", TD_VID(pWriter->pTsdb->pVnode), tstrerror(code));
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -692,7 +685,7 @@ static int32_t tsdbMoveCommitData(SCommitter *pCommitter, TABLEID toTable) {
|
||||||
|
|
||||||
while (pCommitter->dReader.pBlockIdx && tTABLEIDCmprFn(pCommitter->dReader.pBlockIdx, &toTable) < 0) {
|
while (pCommitter->dReader.pBlockIdx && tTABLEIDCmprFn(pCommitter->dReader.pBlockIdx, &toTable) < 0) {
|
||||||
SBlockIdx blockIdx = *pCommitter->dReader.pBlockIdx;
|
SBlockIdx blockIdx = *pCommitter->dReader.pBlockIdx;
|
||||||
code = tsdbWriteBlock(pCommitter->dWriter.pWriter, &pCommitter->dReader.mBlock, &blockIdx);
|
code = tsdbWriteDataBlk(pCommitter->dWriter.pWriter, &pCommitter->dReader.mBlock, &blockIdx);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
if (taosArrayPush(pCommitter->dWriter.aBlockIdx, &blockIdx) == NULL) {
|
if (taosArrayPush(pCommitter->dWriter.aBlockIdx, &blockIdx) == NULL) {
|
||||||
|
@ -1046,7 +1039,7 @@ static int32_t tsdbNextCommitRow(SCommitter *pCommitter) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (pCommitter->pIter->type == LAST_DATA_ITER) { // last file
|
} else if (pCommitter->pIter->type == STT_DATA_ITER) { // last file
|
||||||
pIter->iRow++;
|
pIter->iRow++;
|
||||||
if (pIter->iRow < pIter->bData.nRow) {
|
if (pIter->iRow < pIter->bData.nRow) {
|
||||||
pIter->r.uid = pIter->bData.uid ? pIter->bData.uid : pIter->bData.aUid[pIter->iRow];
|
pIter->r.uid = pIter->bData.uid ? pIter->bData.uid : pIter->bData.aUid[pIter->iRow];
|
||||||
|
@ -1124,15 +1117,14 @@ static int32_t tsdbCommitAheadBlock(SCommitter *pCommitter, SDataBlk *pDataBlk)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pBlockData->nRow >= pCommitter->maxRow) {
|
if (pBlockData->nRow >= pCommitter->maxRow) {
|
||||||
code = tsdbCommitDataBlock(pCommitter);
|
code =
|
||||||
|
tsdbWriteDataBlock(pCommitter->dWriter.pWriter, pBlockData, &pCommitter->dWriter.mBlock, pCommitter->cmprAlg);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pBlockData->nRow) {
|
code = tsdbWriteDataBlock(pCommitter->dWriter.pWriter, pBlockData, &pCommitter->dWriter.mBlock, pCommitter->cmprAlg);
|
||||||
code = tsdbCommitDataBlock(pCommitter);
|
if (code) goto _err;
|
||||||
if (code) goto _err;
|
|
||||||
}
|
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
|
|
||||||
|
@ -1193,7 +1185,7 @@ static int32_t tsdbCommitMergeBlock(SCommitter *pCommitter, SDataBlk *pDataBlk)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pBDataW->nRow >= pCommitter->maxRow) {
|
if (pBDataW->nRow >= pCommitter->maxRow) {
|
||||||
code = tsdbCommitDataBlock(pCommitter);
|
code = tsdbWriteDataBlock(pCommitter->dWriter.pWriter, pBDataW, &pCommitter->dWriter.mBlock, pCommitter->cmprAlg);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1210,15 +1202,13 @@ static int32_t tsdbCommitMergeBlock(SCommitter *pCommitter, SDataBlk *pDataBlk)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pBDataW->nRow >= pCommitter->maxRow) {
|
if (pBDataW->nRow >= pCommitter->maxRow) {
|
||||||
code = tsdbCommitDataBlock(pCommitter);
|
code = tsdbWriteDataBlock(pCommitter->dWriter.pWriter, pBDataW, &pCommitter->dWriter.mBlock, pCommitter->cmprAlg);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pBDataW->nRow) {
|
code = tsdbWriteDataBlock(pCommitter->dWriter.pWriter, pBDataW, &pCommitter->dWriter.mBlock, pCommitter->cmprAlg);
|
||||||
code = tsdbCommitDataBlock(pCommitter);
|
if (code) goto _err;
|
||||||
if (code) goto _err;
|
|
||||||
}
|
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
|
|
||||||
|
@ -1306,10 +1296,8 @@ static int32_t tsdbInitLastBlockIfNeed(SCommitter *pCommitter, TABLEID id) {
|
||||||
SBlockData *pBDatal = &pCommitter->dWriter.bDatal;
|
SBlockData *pBDatal = &pCommitter->dWriter.bDatal;
|
||||||
if (pBDatal->suid || pBDatal->uid) {
|
if (pBDatal->suid || pBDatal->uid) {
|
||||||
if ((pBDatal->suid != id.suid) || (id.suid == 0)) {
|
if ((pBDatal->suid != id.suid) || (id.suid == 0)) {
|
||||||
if (pBDatal->nRow) {
|
code = tsdbWriteSttBlock(pCommitter->dWriter.pWriter, pBDatal, pCommitter->dWriter.aSttBlk, pCommitter->cmprAlg);
|
||||||
code = tsdbCommitLastBlock(pCommitter);
|
if (code) goto _exit;
|
||||||
if (code) goto _exit;
|
|
||||||
}
|
|
||||||
tBlockDataReset(pBDatal);
|
tBlockDataReset(pBDatal);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1341,7 +1329,7 @@ static int32_t tsdbAppendLastBlock(SCommitter *pCommitter) {
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
if (pBDatal->nRow >= pCommitter->maxRow) {
|
if (pBDatal->nRow >= pCommitter->maxRow) {
|
||||||
code = tsdbCommitLastBlock(pCommitter);
|
code = tsdbWriteSttBlock(pCommitter->dWriter.pWriter, pBDatal, pCommitter->dWriter.aSttBlk, pCommitter->cmprAlg);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1393,10 +1381,11 @@ static int32_t tsdbCommitTableData(SCommitter *pCommitter, TABLEID id) {
|
||||||
|
|
||||||
if (pBData->nRow >= pCommitter->maxRow) {
|
if (pBData->nRow >= pCommitter->maxRow) {
|
||||||
if (pCommitter->toLastOnly) {
|
if (pCommitter->toLastOnly) {
|
||||||
code = tsdbCommitLastBlock(pCommitter);
|
code = tsdbWriteSttBlock(pCommitter->dWriter.pWriter, pBData, pCommitter->dWriter.aSttBlk, pCommitter->cmprAlg);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
} else {
|
} else {
|
||||||
code = tsdbCommitDataBlock(pCommitter);
|
code =
|
||||||
|
tsdbWriteDataBlock(pCommitter->dWriter.pWriter, pBData, &pCommitter->dWriter.mBlock, pCommitter->cmprAlg);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1404,7 +1393,7 @@ static int32_t tsdbCommitTableData(SCommitter *pCommitter, TABLEID id) {
|
||||||
|
|
||||||
if (!pCommitter->toLastOnly && pBData->nRow) {
|
if (!pCommitter->toLastOnly && pBData->nRow) {
|
||||||
if (pBData->nRow > pCommitter->minRow) {
|
if (pBData->nRow > pCommitter->minRow) {
|
||||||
code = tsdbCommitDataBlock(pCommitter);
|
code = tsdbWriteDataBlock(pCommitter->dWriter.pWriter, pBData, &pCommitter->dWriter.mBlock, pCommitter->cmprAlg);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
} else {
|
} else {
|
||||||
code = tsdbAppendLastBlock(pCommitter);
|
code = tsdbAppendLastBlock(pCommitter);
|
||||||
|
@ -1437,7 +1426,7 @@ static int32_t tsdbCommitFileDataImpl(SCommitter *pCommitter) {
|
||||||
tMapDataReset(&pCommitter->dWriter.mBlock);
|
tMapDataReset(&pCommitter->dWriter.mBlock);
|
||||||
|
|
||||||
// impl
|
// impl
|
||||||
code = tsdbCommitterUpdateTableSchema(pCommitter, id.suid, id.uid);
|
code = tsdbUpdateTableSchema(pCommitter->pTsdb->pVnode->pMeta, id.suid, id.uid, &pCommitter->skmTable);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
code = tBlockDataInit(&pCommitter->dReader.bData, id.suid, id.uid, pCommitter->skmTable.pTSchema);
|
code = tBlockDataInit(&pCommitter->dReader.bData, id.suid, id.uid, pCommitter->skmTable.pTSchema);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
@ -1455,7 +1444,7 @@ static int32_t tsdbCommitFileDataImpl(SCommitter *pCommitter) {
|
||||||
// end
|
// end
|
||||||
if (pCommitter->dWriter.mBlock.nItem > 0) {
|
if (pCommitter->dWriter.mBlock.nItem > 0) {
|
||||||
SBlockIdx blockIdx = {.suid = id.suid, .uid = id.uid};
|
SBlockIdx blockIdx = {.suid = id.suid, .uid = id.uid};
|
||||||
code = tsdbWriteBlock(pCommitter->dWriter.pWriter, &pCommitter->dWriter.mBlock, &blockIdx);
|
code = tsdbWriteDataBlk(pCommitter->dWriter.pWriter, &pCommitter->dWriter.mBlock, &blockIdx);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
if (taosArrayPush(pCommitter->dWriter.aBlockIdx, &blockIdx) == NULL) {
|
if (taosArrayPush(pCommitter->dWriter.aBlockIdx, &blockIdx) == NULL) {
|
||||||
|
@ -1470,10 +1459,9 @@ static int32_t tsdbCommitFileDataImpl(SCommitter *pCommitter) {
|
||||||
code = tsdbMoveCommitData(pCommitter, id);
|
code = tsdbMoveCommitData(pCommitter, id);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
if (pCommitter->dWriter.bDatal.nRow > 0) {
|
code = tsdbWriteSttBlock(pCommitter->dWriter.pWriter, &pCommitter->dWriter.bDatal, pCommitter->dWriter.aSttBlk,
|
||||||
code = tsdbCommitLastBlock(pCommitter);
|
pCommitter->cmprAlg);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
}
|
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
#include "osDef.h"
|
#include "osDef.h"
|
||||||
#include "tsdb.h"
|
#include "tsdb.h"
|
||||||
|
|
||||||
#define ASCENDING_TRAVERSE(o) (o == TSDB_ORDER_ASC)
|
#define ASCENDING_TRAVERSE(o) (o == TSDB_ORDER_ASC)
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
EXTERNAL_ROWS_PREV = 0x1,
|
EXTERNAL_ROWS_PREV = 0x1,
|
||||||
|
@ -83,11 +83,11 @@ typedef struct SBlockLoadSuppInfo {
|
||||||
} SBlockLoadSuppInfo;
|
} SBlockLoadSuppInfo;
|
||||||
|
|
||||||
typedef struct SLastBlockReader {
|
typedef struct SLastBlockReader {
|
||||||
STimeWindow window;
|
STimeWindow window;
|
||||||
SVersionRange verRange;
|
SVersionRange verRange;
|
||||||
int32_t order;
|
int32_t order;
|
||||||
uint64_t uid;
|
uint64_t uid;
|
||||||
SMergeTree mergeTree;
|
SMergeTree mergeTree;
|
||||||
SSttBlockLoadInfo* pInfo;
|
SSttBlockLoadInfo* pInfo;
|
||||||
} SLastBlockReader;
|
} SLastBlockReader;
|
||||||
|
|
||||||
|
@ -231,10 +231,10 @@ static SHashObj* createDataBlockScanInfo(STsdbReader* pTsdbReader, const STableK
|
||||||
STableBlockScanInfo info = {.lastKey = 0, .uid = idList[j].uid};
|
STableBlockScanInfo info = {.lastKey = 0, .uid = idList[j].uid};
|
||||||
if (ASCENDING_TRAVERSE(pTsdbReader->order)) {
|
if (ASCENDING_TRAVERSE(pTsdbReader->order)) {
|
||||||
int64_t skey = pTsdbReader->window.skey;
|
int64_t skey = pTsdbReader->window.skey;
|
||||||
info.lastKey = (skey > INT64_MIN)? (skey - 1):skey;
|
info.lastKey = (skey > INT64_MIN) ? (skey - 1) : skey;
|
||||||
} else {
|
} else {
|
||||||
int64_t ekey = pTsdbReader->window.ekey;
|
int64_t ekey = pTsdbReader->window.ekey;
|
||||||
info.lastKey = (ekey < INT64_MAX)? (ekey + 1):ekey;
|
info.lastKey = (ekey < INT64_MAX) ? (ekey + 1) : ekey;
|
||||||
}
|
}
|
||||||
|
|
||||||
taosHashPut(pTableMap, &info.uid, sizeof(uint64_t), &info, sizeof(info));
|
taosHashPut(pTableMap, &info.uid, sizeof(uint64_t), &info, sizeof(info));
|
||||||
|
@ -601,7 +601,7 @@ static int32_t doLoadFileBlock(STsdbReader* pReader, SArray* pIndexList, SBlockN
|
||||||
STableBlockScanInfo* pScanInfo = taosHashGet(pReader->status.pTableMap, &pBlockIdx->uid, sizeof(int64_t));
|
STableBlockScanInfo* pScanInfo = taosHashGet(pReader->status.pTableMap, &pBlockIdx->uid, sizeof(int64_t));
|
||||||
|
|
||||||
tMapDataReset(&pScanInfo->mapData);
|
tMapDataReset(&pScanInfo->mapData);
|
||||||
tsdbReadBlock(pReader->pFileReader, pBlockIdx, &pScanInfo->mapData);
|
tsdbReadDataBlk(pReader->pFileReader, pBlockIdx, &pScanInfo->mapData);
|
||||||
|
|
||||||
sizeInDisk += pScanInfo->mapData.nData;
|
sizeInDisk += pScanInfo->mapData.nData;
|
||||||
for (int32_t j = 0; j < pScanInfo->mapData.nItem; ++j) {
|
for (int32_t j = 0; j < pScanInfo->mapData.nItem; ++j) {
|
||||||
|
@ -1933,7 +1933,7 @@ static bool initLastBlockReader(SLastBlockReader* pLBlockReader, STableBlockScan
|
||||||
initMemDataIterator(pScanInfo, pReader);
|
initMemDataIterator(pScanInfo, pReader);
|
||||||
pLBlockReader->uid = pScanInfo->uid;
|
pLBlockReader->uid = pScanInfo->uid;
|
||||||
|
|
||||||
int32_t step = ASCENDING_TRAVERSE(pLBlockReader->order)? 1:-1;
|
int32_t step = ASCENDING_TRAVERSE(pLBlockReader->order) ? 1 : -1;
|
||||||
STimeWindow w = pLBlockReader->window;
|
STimeWindow w = pLBlockReader->window;
|
||||||
if (ASCENDING_TRAVERSE(pLBlockReader->order)) {
|
if (ASCENDING_TRAVERSE(pLBlockReader->order)) {
|
||||||
w.skey = pScanInfo->lastKey + step;
|
w.skey = pScanInfo->lastKey + step;
|
||||||
|
@ -3621,7 +3621,7 @@ int32_t tsdbReaderReset(STsdbReader* pReader, SQueryTableDataCond* pCond) {
|
||||||
initFilesetIterator(&pReader->status.fileIter, pReader->pReadSnap->fs.aDFileSet, pReader);
|
initFilesetIterator(&pReader->status.fileIter, pReader->pReadSnap->fs.aDFileSet, pReader);
|
||||||
resetDataBlockIterator(&pReader->status.blockIter, pReader->order);
|
resetDataBlockIterator(&pReader->status.blockIter, pReader->order);
|
||||||
|
|
||||||
int64_t ts = ASCENDING_TRAVERSE(pReader->order)?pReader->window.skey-1:pReader->window.ekey+1;
|
int64_t ts = ASCENDING_TRAVERSE(pReader->order) ? pReader->window.skey - 1 : pReader->window.ekey + 1;
|
||||||
resetDataBlockScanInfo(pReader->status.pTableMap, ts);
|
resetDataBlockScanInfo(pReader->status.pTableMap, ts);
|
||||||
|
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
|
@ -418,21 +418,21 @@ _err:
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tsdbWriteBlock(SDataFWriter *pWriter, SMapData *mBlock, SBlockIdx *pBlockIdx) {
|
int32_t tsdbWriteDataBlk(SDataFWriter *pWriter, SMapData *mDataBlk, SBlockIdx *pBlockIdx) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
SHeadFile *pHeadFile = &pWriter->fHead;
|
SHeadFile *pHeadFile = &pWriter->fHead;
|
||||||
int64_t size;
|
int64_t size;
|
||||||
int64_t n;
|
int64_t n;
|
||||||
|
|
||||||
ASSERT(mBlock->nItem > 0);
|
ASSERT(mDataBlk->nItem > 0);
|
||||||
|
|
||||||
// alloc
|
// alloc
|
||||||
size = tPutMapData(NULL, mBlock);
|
size = tPutMapData(NULL, mDataBlk);
|
||||||
code = tRealloc(&pWriter->aBuf[0], size);
|
code = tRealloc(&pWriter->aBuf[0], size);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
// build
|
// build
|
||||||
n = tPutMapData(pWriter->aBuf[0], mBlock);
|
n = tPutMapData(pWriter->aBuf[0], mDataBlk);
|
||||||
|
|
||||||
// write
|
// write
|
||||||
code = tsdbWriteFile(pWriter->pHeadFD, pHeadFile->size, pWriter->aBuf[0], size);
|
code = tsdbWriteFile(pWriter->pHeadFD, pHeadFile->size, pWriter->aBuf[0], size);
|
||||||
|
@ -446,7 +446,7 @@ int32_t tsdbWriteBlock(SDataFWriter *pWriter, SMapData *mBlock, SBlockIdx *pBloc
|
||||||
tsdbTrace("vgId:%d, write block, file ID:%d commit ID:%d suid:%" PRId64 " uid:%" PRId64 " offset:%" PRId64
|
tsdbTrace("vgId:%d, write block, file ID:%d commit ID:%d suid:%" PRId64 " uid:%" PRId64 " offset:%" PRId64
|
||||||
" size:%" PRId64 " nItem:%d",
|
" size:%" PRId64 " nItem:%d",
|
||||||
TD_VID(pWriter->pTsdb->pVnode), pWriter->wSet.fid, pHeadFile->commitID, pBlockIdx->suid, pBlockIdx->uid,
|
TD_VID(pWriter->pTsdb->pVnode), pWriter->wSet.fid, pHeadFile->commitID, pBlockIdx->suid, pBlockIdx->uid,
|
||||||
pBlockIdx->offset, pBlockIdx->size, mBlock->nItem);
|
pBlockIdx->offset, pBlockIdx->size, mDataBlk->nItem);
|
||||||
return code;
|
return code;
|
||||||
|
|
||||||
_err:
|
_err:
|
||||||
|
@ -872,7 +872,7 @@ _err:
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tsdbReadBlock(SDataFReader *pReader, SBlockIdx *pBlockIdx, SMapData *mBlock) {
|
int32_t tsdbReadDataBlk(SDataFReader *pReader, SBlockIdx *pBlockIdx, SMapData *mDataBlk) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
int64_t offset = pBlockIdx->offset;
|
int64_t offset = pBlockIdx->offset;
|
||||||
int64_t size = pBlockIdx->size;
|
int64_t size = pBlockIdx->size;
|
||||||
|
@ -886,7 +886,7 @@ int32_t tsdbReadBlock(SDataFReader *pReader, SBlockIdx *pBlockIdx, SMapData *mBl
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
// decode
|
// decode
|
||||||
int64_t n = tGetMapData(pReader->aBuf[0], mBlock);
|
int64_t n = tGetMapData(pReader->aBuf[0], mDataBlk);
|
||||||
if (n < 0) {
|
if (n < 0) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
goto _err;
|
goto _err;
|
||||||
|
@ -1053,6 +1053,29 @@ _err:
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t tsdbReadDataBlockEx(SDataFReader *pReader, SDataBlk *pDataBlk, SBlockData *pBlockData) {
|
||||||
|
int32_t code = 0;
|
||||||
|
SBlockInfo *pBlockInfo = &pDataBlk->aSubBlock[0];
|
||||||
|
|
||||||
|
// alloc
|
||||||
|
code = tRealloc(&pReader->aBuf[0], pBlockInfo->szBlock);
|
||||||
|
if (code) goto _err;
|
||||||
|
|
||||||
|
// read
|
||||||
|
code = tsdbReadFile(pReader->pDataFD, pBlockInfo->offset, pReader->aBuf[0], pBlockInfo->szBlock);
|
||||||
|
if (code) goto _err;
|
||||||
|
|
||||||
|
// decmpr
|
||||||
|
code = tDecmprBlockData(pReader->aBuf[0], pBlockInfo->szBlock, pBlockData, &pReader->aBuf[1]);
|
||||||
|
if (code) goto _err;
|
||||||
|
|
||||||
|
return code;
|
||||||
|
|
||||||
|
_err:
|
||||||
|
tsdbError("vgId:%d tsdb read data block ex failed since %s", TD_VID(pReader->pTsdb->pVnode), tstrerror(code));
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t tsdbReadDataBlock(SDataFReader *pReader, SDataBlk *pDataBlk, SBlockData *pBlockData) {
|
int32_t tsdbReadDataBlock(SDataFReader *pReader, SDataBlk *pDataBlk, SBlockData *pBlockData) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
|
@ -1147,8 +1170,8 @@ int32_t tsdbDelFWriterOpen(SDelFWriter **ppWriter, SDelFile *pFile, STsdb *pTsdb
|
||||||
pDelFWriter->fDel = *pFile;
|
pDelFWriter->fDel = *pFile;
|
||||||
|
|
||||||
tsdbDelFileName(pTsdb, pFile, fname);
|
tsdbDelFileName(pTsdb, pFile, fname);
|
||||||
code =
|
int32_t flag = TD_FILE_READ | TD_FILE_WRITE | TD_FILE_CREATE;
|
||||||
tsdbOpenFile(fname, TSDB_DEFAULT_PAGE_SIZE, TD_FILE_READ | TD_FILE_WRITE | TD_FILE_CREATE, &pDelFWriter->pWriteH);
|
code = tsdbOpenFile(fname, TSDB_DEFAULT_PAGE_SIZE, flag, &pDelFWriter->pWriteH);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
// update header
|
// update header
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -354,7 +354,8 @@ int32_t vnodeSnapWrite(SVSnapWriter *pWriter, uint8_t *pData, uint32_t nData) {
|
||||||
code = metaSnapWrite(pWriter->pMetaSnapWriter, pData, nData);
|
code = metaSnapWrite(pWriter->pMetaSnapWriter, pData, nData);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
} break;
|
} break;
|
||||||
case SNAP_DATA_TSDB: {
|
case SNAP_DATA_TSDB:
|
||||||
|
case SNAP_DATA_DEL: {
|
||||||
// tsdb
|
// tsdb
|
||||||
if (pWriter->pTsdbSnapWriter == NULL) {
|
if (pWriter->pTsdbSnapWriter == NULL) {
|
||||||
code = tsdbSnapWriterOpen(pVnode->pTsdb, pWriter->sver, pWriter->ever, &pWriter->pTsdbSnapWriter);
|
code = tsdbSnapWriterOpen(pVnode->pTsdb, pWriter->sver, pWriter->ever, &pWriter->pTsdbSnapWriter);
|
||||||
|
|
|
@ -221,6 +221,7 @@
|
||||||
./test.sh -f tsim/table/describe.sim
|
./test.sh -f tsim/table/describe.sim
|
||||||
./test.sh -f tsim/table/double.sim
|
./test.sh -f tsim/table/double.sim
|
||||||
./test.sh -f tsim/table/float.sim
|
./test.sh -f tsim/table/float.sim
|
||||||
|
./test.sh -f tsim/table/hash.sim
|
||||||
./test.sh -f tsim/table/int.sim
|
./test.sh -f tsim/table/int.sim
|
||||||
./test.sh -f tsim/table/limit.sim
|
./test.sh -f tsim/table/limit.sim
|
||||||
./test.sh -f tsim/table/smallint.sim
|
./test.sh -f tsim/table/smallint.sim
|
||||||
|
|
|
@ -1,88 +0,0 @@
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
typedef struct SUdfInit{
|
|
||||||
int maybe_null; /* 1 if function can return NULL */
|
|
||||||
int decimals; /* for real functions */
|
|
||||||
long long length; /* For string functions */
|
|
||||||
char *ptr; /* free pointer for function data */
|
|
||||||
int const_item; /* 0 if result is independent of arguments */
|
|
||||||
} SUdfInit;
|
|
||||||
|
|
||||||
|
|
||||||
#define TSDB_DATA_INT_NULL 0x80000000LL
|
|
||||||
#define TSDB_DATA_BIGINT_NULL 0x8000000000000000LL
|
|
||||||
|
|
||||||
void abs_max(char* data, short itype, short ibytes, int numOfRows, long long* ts, char* dataOutput, char* interBuf, char* tsOutput,
|
|
||||||
int* numOfOutput, short otype, short obytes, SUdfInit* buf) {
|
|
||||||
int i;
|
|
||||||
int r = 0;
|
|
||||||
printf("abs_max input data:%p, type:%d, rows:%d, ts:%p,%lld, dataoutput:%p, tsOutput:%p, numOfOutput:%p, buf:%p\n", data, itype, numOfRows, ts, *ts, dataOutput, tsOutput, numOfOutput, buf);
|
|
||||||
if (itype == 5) {
|
|
||||||
r=*(long *)dataOutput;
|
|
||||||
*numOfOutput=0;
|
|
||||||
|
|
||||||
for(i=0;i<numOfRows;++i) {
|
|
||||||
if (*((long *)data + i) == TSDB_DATA_BIGINT_NULL) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
*numOfOutput=1;
|
|
||||||
long v = abs(*((long *)data + i));
|
|
||||||
if (v > r) {
|
|
||||||
r = v;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
*(long *)dataOutput=r;
|
|
||||||
|
|
||||||
printf("abs_max out, dataoutput:%ld, numOfOutput:%d\n", *(long *)dataOutput, *numOfOutput);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void abs_max_finalize(char* dataOutput, char* interBuf, int* numOfOutput, SUdfInit* buf) {
|
|
||||||
int i;
|
|
||||||
int r = 0;
|
|
||||||
printf("abs_max_finalize dataoutput:%p:%d, numOfOutput:%d, buf:%p\n", dataOutput, *dataOutput, *numOfOutput, buf);
|
|
||||||
*numOfOutput=1;
|
|
||||||
printf("abs_max finalize, dataoutput:%ld, numOfOutput:%d\n", *(long *)dataOutput, *numOfOutput);
|
|
||||||
}
|
|
||||||
|
|
||||||
void abs_max_merge(char* data, int32_t numOfRows, char* dataOutput, int32_t* numOfOutput, SUdfInit* buf) {
|
|
||||||
int r = 0;
|
|
||||||
|
|
||||||
if (numOfRows > 0) {
|
|
||||||
r = *((long *)data);
|
|
||||||
}
|
|
||||||
printf("abs_max_merge numOfRows:%d, dataoutput:%p, buf:%p\n", numOfRows, dataOutput, buf);
|
|
||||||
for (int i = 1; i < numOfRows; ++i) {
|
|
||||||
printf("abs_max_merge %d - %ld\n", i, *((long *)data + i));
|
|
||||||
if (*((long*)data + i) > r) {
|
|
||||||
r= *((long*)data + i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
*(long*)dataOutput=r;
|
|
||||||
if (numOfRows > 0) {
|
|
||||||
*numOfOutput=1;
|
|
||||||
} else {
|
|
||||||
*numOfOutput=0;
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("abs_max_merge, dataoutput:%ld, numOfOutput:%d\n", *(long *)dataOutput, *numOfOutput);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int abs_max_init(SUdfInit* buf) {
|
|
||||||
printf("abs_max init\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void abs_max_destroy(SUdfInit* buf) {
|
|
||||||
printf("abs_max destroy\n");
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,33 +0,0 @@
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
typedef struct SUdfInit{
|
|
||||||
int maybe_null; /* 1 if function can return NULL */
|
|
||||||
int decimals; /* for real functions */
|
|
||||||
long long length; /* For string functions */
|
|
||||||
char *ptr; /* free pointer for function data */
|
|
||||||
int const_item; /* 0 if result is independent of arguments */
|
|
||||||
} SUdfInit;
|
|
||||||
|
|
||||||
void add_one(char* data, short itype, short ibytes, int numOfRows, long long* ts, char* dataOutput, char* interBUf, char* tsOutput,
|
|
||||||
int* numOfOutput, short otype, short obytes, SUdfInit* buf) {
|
|
||||||
int i;
|
|
||||||
int r = 0;
|
|
||||||
printf("add_one input data:%p, type:%d, rows:%d, ts:%p,%lld, dataoutput:%p, tsOutput:%p, numOfOutput:%p, buf:%p\n", data, itype, numOfRows, ts, *ts, dataOutput, tsOutput, numOfOutput, buf);
|
|
||||||
if (itype == 4) {
|
|
||||||
for(i=0;i<numOfRows;++i) {
|
|
||||||
printf("input %d - %d", i, *((int *)data + i));
|
|
||||||
*((int *)dataOutput+i)=*((int *)data + i) + 1;
|
|
||||||
printf(", output %d\n", *((int *)dataOutput+i));
|
|
||||||
if (tsOutput) {
|
|
||||||
*(long long*)tsOutput=1000000;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*numOfOutput=numOfRows;
|
|
||||||
|
|
||||||
printf("add_one out, numOfOutput:%d\n", *numOfOutput);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -1,112 +0,0 @@
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
typedef struct SUdfInit{
|
|
||||||
int maybe_null; /* 1 if function can return NULL */
|
|
||||||
int decimals; /* for real functions */
|
|
||||||
long long length; /* For string functions */
|
|
||||||
char *ptr; /* free pointer for function data */
|
|
||||||
int const_item; /* 0 if result is independent of arguments */
|
|
||||||
} SUdfInit;
|
|
||||||
|
|
||||||
typedef struct SDemo{
|
|
||||||
double sum;
|
|
||||||
int num;
|
|
||||||
short otype;
|
|
||||||
}SDemo;
|
|
||||||
|
|
||||||
#define FLOAT_NULL 0x7FF00000 // it is an NAN
|
|
||||||
#define DOUBLE_NULL 0x7FFFFF0000000000LL // it is an NAN
|
|
||||||
|
|
||||||
|
|
||||||
void demo(char* data, short itype, short ibytes, int numOfRows, long long* ts, char* dataOutput, char* interBuf, char* tsOutput,
|
|
||||||
int* numOfOutput, short otype, short obytes, SUdfInit* buf) {
|
|
||||||
int i;
|
|
||||||
double r = 0;
|
|
||||||
SDemo *p = (SDemo *)interBuf;
|
|
||||||
SDemo *q = (SDemo *)dataOutput;
|
|
||||||
printf("demo input data:%p, type:%d, rows:%d, ts:%p,%lld, dataoutput:%p, interBUf:%p, tsOutput:%p, numOfOutput:%p, buf:%p\n", data, itype, numOfRows, ts, *ts, dataOutput, interBuf, tsOutput, numOfOutput, buf);
|
|
||||||
|
|
||||||
for(i=0;i<numOfRows;++i) {
|
|
||||||
if (itype == 4) {
|
|
||||||
r=*((int *)data+i);
|
|
||||||
} else if (itype == 6) {
|
|
||||||
r=*((float *)data+i);
|
|
||||||
} else if (itype == 7) {
|
|
||||||
r=*((double *)data+i);
|
|
||||||
}
|
|
||||||
|
|
||||||
p->sum += r*r;
|
|
||||||
}
|
|
||||||
|
|
||||||
p->otype = otype;
|
|
||||||
p->num += numOfRows;
|
|
||||||
|
|
||||||
q->sum = p->sum;
|
|
||||||
q->num = p->num;
|
|
||||||
q->otype = p->otype;
|
|
||||||
|
|
||||||
*numOfOutput=1;
|
|
||||||
|
|
||||||
printf("demo out, sum:%f, num:%d, numOfOutput:%d\n", p->sum, p->num, *numOfOutput);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void demo_merge(char* data, int32_t numOfRows, char* dataOutput, int32_t* numOfOutput, SUdfInit* buf) {
|
|
||||||
int i;
|
|
||||||
SDemo *p = (SDemo *)data;
|
|
||||||
SDemo res = {0};
|
|
||||||
printf("demo_merge input data:%p, rows:%d, dataoutput:%p, numOfOutput:%p, buf:%p\n", data, numOfRows, dataOutput, numOfOutput, buf);
|
|
||||||
|
|
||||||
for(i=0;i<numOfRows;++i) {
|
|
||||||
res.sum += p->sum * p->sum;
|
|
||||||
res.num += p->num;
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
|
|
||||||
p->sum = res.sum;
|
|
||||||
p->num = res.num;
|
|
||||||
|
|
||||||
*numOfOutput=1;
|
|
||||||
|
|
||||||
printf("demo out, sum:%f, num:%d, numOfOutput:%d\n", p->sum, p->num, *numOfOutput);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void demo_finalize(char* dataOutput, char* interBuf, int* numOfOutput, SUdfInit* buf) {
|
|
||||||
SDemo *p = (SDemo *)interBuf;
|
|
||||||
printf("demo_finalize interbuf:%p, numOfOutput:%p, buf:%p, sum:%f, num:%d\n", interBuf, numOfOutput, buf, p->sum, p->num);
|
|
||||||
if (p->otype == 6) {
|
|
||||||
if (p->num != 30000) {
|
|
||||||
*(unsigned int *)dataOutput = FLOAT_NULL;
|
|
||||||
} else {
|
|
||||||
*(float *)dataOutput = (float)(p->sum / p->num);
|
|
||||||
}
|
|
||||||
printf("finalize values:%f\n", *(float *)dataOutput);
|
|
||||||
} else if (p->otype == 7) {
|
|
||||||
if (p->num != 30000) {
|
|
||||||
*(unsigned long long *)dataOutput = DOUBLE_NULL;
|
|
||||||
} else {
|
|
||||||
*(double *)dataOutput = (double)(p->sum / p->num);
|
|
||||||
}
|
|
||||||
printf("finalize values:%f\n", *(double *)dataOutput);
|
|
||||||
}
|
|
||||||
|
|
||||||
*numOfOutput=1;
|
|
||||||
|
|
||||||
printf("demo finalize, numOfOutput:%d\n", *numOfOutput);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int demo_init(SUdfInit* buf) {
|
|
||||||
printf("demo init\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void demo_destroy(SUdfInit* buf) {
|
|
||||||
printf("demo destroy\n");
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,43 +0,0 @@
|
||||||
funcName = "test"
|
|
||||||
|
|
||||||
global = {}
|
|
||||||
|
|
||||||
function test_init()
|
|
||||||
return global
|
|
||||||
end
|
|
||||||
|
|
||||||
function test_add(rows, ans, key)
|
|
||||||
t = {}
|
|
||||||
t["sum"] = 0.0
|
|
||||||
t["num"] = 0
|
|
||||||
for i=1, #rows do
|
|
||||||
t["sum"] = t["sum"] + rows[i] * rows[i]
|
|
||||||
end
|
|
||||||
t["num"] = #rows
|
|
||||||
|
|
||||||
|
|
||||||
if (ans[key] ~= nil)
|
|
||||||
then
|
|
||||||
ans[key]["sum"] = ans[key]["sum"] + t["sum"]
|
|
||||||
ans[key]["num"] = ans[key]["num"] + t["num"]
|
|
||||||
else
|
|
||||||
ans[key] = t
|
|
||||||
end
|
|
||||||
|
|
||||||
return ans;
|
|
||||||
end
|
|
||||||
|
|
||||||
function test_finalize(ans, key)
|
|
||||||
local ret = 0.0
|
|
||||||
|
|
||||||
if (ans[key] ~= nil and ans[key]["num"] == 30000)
|
|
||||||
then
|
|
||||||
ret = ans[key]["sum"]/ans[key]["num"]
|
|
||||||
ans[key]["sum"] = 0.0
|
|
||||||
ans[key]["num"] = 0
|
|
||||||
else
|
|
||||||
ret = inf
|
|
||||||
end
|
|
||||||
|
|
||||||
return ret, ans
|
|
||||||
end
|
|
|
@ -1,84 +0,0 @@
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
typedef struct SUdfInit{
|
|
||||||
int maybe_null; /* 1 if function can return NULL */
|
|
||||||
int decimals; /* for real functions */
|
|
||||||
long long length; /* For string functions */
|
|
||||||
char *ptr; /* free pointer for function data */
|
|
||||||
int const_item; /* 0 if result is independent of arguments */
|
|
||||||
} SUdfInit;
|
|
||||||
|
|
||||||
#define TSDB_DATA_INT_NULL 0x80000000LL
|
|
||||||
|
|
||||||
|
|
||||||
void sum_double(char* data, short itype, short ibytes, int numOfRows, long long* ts, char* dataOutput, char* interBuf, char* tsOutput,
|
|
||||||
int* numOfOutput, short otype, short obytes, SUdfInit* buf) {
|
|
||||||
int i;
|
|
||||||
int r = 0;
|
|
||||||
printf("sum_double input data:%p, type:%d, rows:%d, ts:%p,%lld, dataoutput:%p, tsOutput:%p, numOfOutput:%p, buf:%p\n", data, itype, numOfRows, ts, *ts, dataOutput, tsOutput, numOfOutput, buf);
|
|
||||||
if (itype == 4) {
|
|
||||||
r=*(int *)dataOutput;
|
|
||||||
*numOfOutput=0;
|
|
||||||
|
|
||||||
for(i=0;i<numOfRows;++i) {
|
|
||||||
if (*((int *)data + i) == TSDB_DATA_INT_NULL) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
*numOfOutput=1;
|
|
||||||
r+=*((int *)data + i);
|
|
||||||
*(int *)dataOutput=r;
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("sum_double out, dataoutput:%d, numOfOutput:%d\n", *(int *)dataOutput, *numOfOutput);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void sum_double_finalize(char* dataOutput, char* interBuf, int* numOfOutput, SUdfInit* buf) {
|
|
||||||
int i;
|
|
||||||
int r = 0;
|
|
||||||
printf("sum_double_finalize dataoutput:%p:%d, numOfOutput:%d, buf:%p\n", dataOutput, *dataOutput, *numOfOutput, buf);
|
|
||||||
*numOfOutput=1;
|
|
||||||
*(int*)(buf->ptr)=*(int*)dataOutput*2;
|
|
||||||
*(int*)dataOutput=*(int*)(buf->ptr);
|
|
||||||
printf("sum_double finalize, dataoutput:%d, numOfOutput:%d\n", *(int *)dataOutput, *numOfOutput);
|
|
||||||
}
|
|
||||||
|
|
||||||
void sum_double_merge(char* data, int32_t numOfRows, char* dataOutput, int32_t* numOfOutput, SUdfInit* buf) {
|
|
||||||
int r = 0;
|
|
||||||
int sum = 0;
|
|
||||||
|
|
||||||
printf("sum_double_merge numOfRows:%d, dataoutput:%p, buf:%p\n", numOfRows, dataOutput, buf);
|
|
||||||
for (int i = 0; i < numOfRows; ++i) {
|
|
||||||
printf("sum_double_merge %d - %d\n", i, *((int*)data + i));
|
|
||||||
sum +=*((int*)data + i);
|
|
||||||
}
|
|
||||||
|
|
||||||
*(int*)dataOutput+=sum;
|
|
||||||
if (numOfRows > 0) {
|
|
||||||
*numOfOutput=1;
|
|
||||||
} else {
|
|
||||||
*numOfOutput=0;
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("sum_double_merge, dataoutput:%d, numOfOutput:%d\n", *(int *)dataOutput, *numOfOutput);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int sum_double_init(SUdfInit* buf) {
|
|
||||||
buf->maybe_null=1;
|
|
||||||
buf->ptr = taosMemoryMalloc(sizeof(int));
|
|
||||||
printf("sum_double init\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void sum_double_destroy(SUdfInit* buf) {
|
|
||||||
taosMemoryFree(buf->ptr);
|
|
||||||
printf("sum_double destroy\n");
|
|
||||||
}
|
|
||||||
|
|
|
@ -0,0 +1,84 @@
|
||||||
|
system sh/stop_dnodes.sh
|
||||||
|
system sh/deploy.sh -n dnode1 -i 1
|
||||||
|
system sh/exec.sh -n dnode1 -s start
|
||||||
|
sql connect
|
||||||
|
|
||||||
|
#=========== prepare
|
||||||
|
#sql create database d1 vgroups 2
|
||||||
|
sql create database d1 vgroups 2 table_prefix 3 table_suffix 2
|
||||||
|
sql select * from information_schema.ins_databases
|
||||||
|
print $data(d1)[27] $data(d1)[28]
|
||||||
|
if $data(d1)[27] != 3 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
if $data(d1)[28] != 2 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql use d1;
|
||||||
|
sql create table st (ts timestamp, i int) tags (j int);
|
||||||
|
sql create table st_ct_1 using st tags(3) st_ct_2 using st tags(4) st_ct_3 using st tags(5) st_ct_4 using st tags(6) st_ct_5 using st tags(7)
|
||||||
|
sql insert into st_ct_1 values(now+1s, 1)
|
||||||
|
sql insert into st_ct_1 values(now+2s, 2)
|
||||||
|
sql insert into st_ct_1 values(now+3s, 3)
|
||||||
|
sql insert into st_ct_2 values(now+1s, 1)
|
||||||
|
sql insert into st_ct_2 values(now+2s, 2)
|
||||||
|
sql insert into st_ct_2 values(now+3s, 3)
|
||||||
|
sql insert into st_ct_3 values(now+1s, 1)
|
||||||
|
sql insert into st_ct_3 values(now+2s, 2)
|
||||||
|
sql insert into st_ct_3 values(now+3s, 2)
|
||||||
|
sql insert into st_ct_4 values(now+1s, 1)
|
||||||
|
sql insert into st_ct_4 values(now+2s, 2)
|
||||||
|
sql insert into st_ct_4 values(now+3s, 2)
|
||||||
|
sql insert into st_ct_5 values(now+1s, 1)
|
||||||
|
sql insert into st_ct_5 values(now+2s, 2)
|
||||||
|
sql insert into st_ct_5 values(now+3s, 2)
|
||||||
|
|
||||||
|
# check query
|
||||||
|
sql select * from st
|
||||||
|
if $rows != 15 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
# check table vgroup
|
||||||
|
sql select * from information_schema.ins_tables where db_name = 'd1'
|
||||||
|
if $data(st_ct_1)[6] != 2 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
if $data(st_ct_2)[6] != 2 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
if $data(st_ct_3)[6] != 2 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
if $data(st_ct_4)[6] != 2 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
if $data(st_ct_5)[6] != 2 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
# check invalid table name
|
||||||
|
sql create table c1 using st tags(3)
|
||||||
|
sql create table c12 using st tags(3)
|
||||||
|
sql create table c123 using st tags(3)
|
||||||
|
sql create table c1234 using st tags(3)
|
||||||
|
sql create table c12345 using st tags(3)
|
||||||
|
sql select * from information_schema.ins_tables where db_name = 'd1'
|
||||||
|
if $data(c1)[6] != 2 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
if $data(c12)[6] != 3 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
if $data(c123)[6] != 2 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
if $data(c1234)[6] != 3 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
if $data(c12345)[6] != 3 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
Loading…
Reference in New Issue