diff --git a/include/libs/executor/executor.h b/include/libs/executor/executor.h index 4d289147d03840c7d8edf2868d90682d32b2db75..0cd1a9265da36d1f65e0c312fdf06342e34b8cd5 100644 --- a/include/libs/executor/executor.h +++ b/include/libs/executor/executor.h @@ -32,6 +32,7 @@ typedef struct SReadHandle { void* reader; void* meta; void* config; + void* vnode; } SReadHandle; #define STREAM_DATA_TYPE_SUBMIT_BLOCK 0x1 diff --git a/source/dnode/mnode/impl/src/mndInfoSchema.c b/source/dnode/mnode/impl/src/mndInfoSchema.c index 2b46fc9274dae5407deccc7a362672db1005f8f0..52efac883d1d456f3d2c3e7f76de9c3e43ed404a 100644 --- a/source/dnode/mnode/impl/src/mndInfoSchema.c +++ b/source/dnode/mnode/impl/src/mndInfoSchema.c @@ -142,6 +142,7 @@ static const SInfosTableSchema userTblsSchema[] = { {.name = "vgroup_id", .bytes = 4, .type = TSDB_DATA_TYPE_INT}, {.name = "ttl", .bytes = 4, .type = TSDB_DATA_TYPE_INT}, {.name = "table_comment", .bytes = 4, .type = TSDB_DATA_TYPE_INT}, + {.name = "type", .bytes = 20 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR}, }; static const SInfosTableSchema userTblDistSchema[] = { diff --git a/source/dnode/vnode/inc/vnode.h b/source/dnode/vnode/inc/vnode.h index 8984b3d8ae7d2d3b1d58769fc5f69ebb9cb46919..935bcb245affa73e2a2a73bc699fc272107cbba6 100644 --- a/source/dnode/vnode/inc/vnode.h +++ b/source/dnode/vnode/inc/vnode.h @@ -68,6 +68,7 @@ void vnodeStop(SVnode *pVnode); int64_t vnodeGetSyncHandle(SVnode *pVnode); void vnodeGetSnapshot(SVnode *pVnode, SSnapshot *pSnapshot); +void vnodeGetInfo(SVnode *pVnode, const char **dbname, int32_t *vgId); // meta typedef struct SMeta SMeta; // todo: remove diff --git a/source/dnode/vnode/src/meta/metaTable.c b/source/dnode/vnode/src/meta/metaTable.c index 014af4b10d3c4346a8d25c8fe15d3b428e0c5d80..4c5eedf9ea765a5757610d34b20aa6e3a7c32b81 100644 --- a/source/dnode/vnode/src/meta/metaTable.c +++ b/source/dnode/vnode/src/meta/metaTable.c @@ -88,7 +88,7 @@ int metaCreateTable(SMeta *pMeta, int64_t version, SVCreateTbReq *pReq) { // preprocess req pReq->uid = tGenIdPI64(); - pReq->ctime = taosGetTimestampSec(); + pReq->ctime = taosGetTimestampMs(); // validate req metaReaderInit(&mr, pMeta->pVnode, 0); diff --git a/source/dnode/vnode/src/vnd/vnodeQuery.c b/source/dnode/vnode/src/vnd/vnodeQuery.c index bcb424d133c85f519c568aca97725498a0d2125c..101683815153219621a13cec9909250e1e516a10 100644 --- a/source/dnode/vnode/src/vnd/vnodeQuery.c +++ b/source/dnode/vnode/src/vnd/vnodeQuery.c @@ -136,3 +136,13 @@ int32_t vnodeGetLoad(SVnode *pVnode, SVnodeLoad *pLoad) { pLoad->numOfBatchInsertSuccessReqs = 4; return 0; } + +void vnodeGetInfo(SVnode *pVnode, const char **dbname, int32_t *vgId) { + if (dbname) { + *dbname = pVnode->config.dbname; + } + + if (vgId) { + *vgId = TD_VID(pVnode); + } +} \ No newline at end of file diff --git a/source/dnode/vnode/src/vnd/vnodeSvr.c b/source/dnode/vnode/src/vnd/vnodeSvr.c index 61cedc6b50f90b2a5484227478ab29f99c5223a1..d22c8c37d5a8ebb7cd9a9a7846c31623bfc31ef9 100644 --- a/source/dnode/vnode/src/vnd/vnodeSvr.c +++ b/source/dnode/vnode/src/vnd/vnodeSvr.c @@ -144,7 +144,7 @@ _err: int vnodeProcessQueryMsg(SVnode *pVnode, SRpcMsg *pMsg) { vTrace("message in vnode query queue is processing"); - SReadHandle handle = {.reader = pVnode->pTsdb, .meta = pVnode->pMeta, .config = &pVnode->config}; + SReadHandle handle = {.reader = pVnode->pTsdb, .meta = pVnode->pMeta, .config = &pVnode->config, .vnode = pVnode}; switch (pMsg->msgType) { case TDMT_VND_QUERY: diff --git a/source/libs/executor/inc/executorimpl.h b/source/libs/executor/inc/executorimpl.h index b841224fe4047c48a52cc0d9c1c8c5de2cf70bfd..7a6432a06cadf7195448f730c3b7dd66e285a0f5 100644 --- a/source/libs/executor/inc/executorimpl.h +++ b/source/libs/executor/inc/executorimpl.h @@ -380,7 +380,7 @@ typedef struct SStreamBlockScanInfo { typedef struct SSysTableScanInfo { union { void* pTransporter; - void* readHandle; + SReadHandle readHandle; }; SRetrieveMetaTableRsp* pRsp; diff --git a/source/libs/executor/src/executorimpl.c b/source/libs/executor/src/executorimpl.c index 44c46785cc18296402908b5ea60c2a396dd442f8..acbf8b05f6b19a3811c9d05365bfcadb9b53f1bc 100644 --- a/source/libs/executor/src/executorimpl.c +++ b/source/libs/executor/src/executorimpl.c @@ -6497,7 +6497,7 @@ SOperatorInfo* createOperatorTree(SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo SArray* colList = extractScanColumnId(pScanNode->pScanCols); SOperatorInfo* pOperator = createSysTableScanOperatorInfo( - pHandle->meta, pResBlock, &pScanNode->tableName, pScanNode->node.pConditions, pSysScanPhyNode->mgmtEpSet, + pHandle, pResBlock, &pScanNode->tableName, pScanNode->node.pConditions, pSysScanPhyNode->mgmtEpSet, colList, pTaskInfo, pSysScanPhyNode->showRewrite, pSysScanPhyNode->accountId); return pOperator; } else { diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c index f4eee01007fa353afc59d4ba0e9bb2ef3aeaf7f9..9600cbc99aa14d9278cc6f6d85a849bce66e8b75 100644 --- a/source/libs/executor/src/scanoperator.c +++ b/source/libs/executor/src/scanoperator.c @@ -811,7 +811,7 @@ static SSDataBlock* doSysTableScan(SOperatorInfo* pOperator, bool* newgroup) { const char* name = tNameGetTableName(&pInfo->name); if (strncasecmp(name, TSDB_INS_TABLE_USER_TABLES, TSDB_TABLE_FNAME_LEN) == 0) { if (pInfo->pCur == NULL) { - pInfo->pCur = metaOpenTbCursor(pInfo->readHandle); + pInfo->pCur = metaOpenTbCursor(pInfo->readHandle.meta); } blockDataCleanup(pInfo->pRes); @@ -819,32 +819,93 @@ static SSDataBlock* doSysTableScan(SOperatorInfo* pOperator, bool* newgroup) { int32_t tableNameSlotId = 1; SColumnInfoData* pTableNameCol = taosArrayGet(pInfo->pRes->pDataBlock, tableNameSlotId); - char* tb = NULL; int32_t numOfRows = 0; + const char* db = NULL; + int32_t vgId = 0; + vnodeGetInfo(pInfo->readHandle.vnode, &db, &vgId); + + SName sn = {0}; + char dbname[TSDB_DB_FNAME_LEN + VARSTR_HEADER_SIZE] = {0}; + tNameFromString(&sn, db, T_NAME_ACCT|T_NAME_DB); + + tNameGetDbName(&sn, varDataVal(dbname)); + varDataSetLen(dbname, strlen(varDataVal(dbname))); + char n[TSDB_TABLE_NAME_LEN] = {0}; while (metaTbCursorNext(pInfo->pCur) == 0) { STR_TO_VARSTR(n, pInfo->pCur->mr.me.name); colDataAppend(pTableNameCol, numOfRows, n, false); - numOfRows += 1; - if (numOfRows >= pInfo->capacity) { - break; + + int32_t tableType = pInfo->pCur->mr.me.type; + + // database name + SColumnInfoData* pColInfoData = taosArrayGet(pInfo->pRes->pDataBlock, 0); + colDataAppend(pColInfoData, numOfRows, dbname, false); + + // vgId + pColInfoData = taosArrayGet(pInfo->pRes->pDataBlock, 6); + colDataAppend(pColInfoData, numOfRows, (char*) &vgId, false); + + // table comment + // todo: set the correct comment + pColInfoData = taosArrayGet(pInfo->pRes->pDataBlock, 8); + colDataAppendNULL(pColInfoData, numOfRows); + + char typestr[256] = {0}; + if (tableType == TSDB_CHILD_TABLE) { + SMetaReader mr = {0}; + + metaReaderInit(&mr, pInfo->readHandle.meta, 0); +// metaGetTableEntryByUid(&mr, pInfo->pCur->mr.me.ctbEntry.suid); + metaReaderClear(&mr); + + pColInfoData = taosArrayGet(pInfo->pRes->pDataBlock, 3); + colDataAppend(pColInfoData, numOfRows, (char*) &mr.me.stbEntry.schema.nCols, false); + + // create time + int64_t ts = pInfo->pCur->mr.me.ctbEntry.ctime; + pColInfoData = taosArrayGet(pInfo->pRes->pDataBlock, 2); + colDataAppend(pColInfoData, numOfRows, (char*) &ts, false); + + // uid + pColInfoData = taosArrayGet(pInfo->pRes->pDataBlock, 5); + colDataAppend(pColInfoData, numOfRows, (char*) &pInfo->pCur->mr.me.uid, false); + + // ttl + pColInfoData = taosArrayGet(pInfo->pRes->pDataBlock, 7); + colDataAppend(pColInfoData, numOfRows, (char*) &pInfo->pCur->mr.me.ctbEntry.ttlDays, false); + + STR_TO_VARSTR(typestr, "CHILD_TABLE"); + } else if (tableType == TSDB_NORMAL_TABLE) { + // create time + pColInfoData = taosArrayGet(pInfo->pRes->pDataBlock, 2); + colDataAppend(pColInfoData, numOfRows, (char*) &pInfo->pCur->mr.me.ntbEntry.ctime, false); + + // number of columns + pColInfoData = taosArrayGet(pInfo->pRes->pDataBlock, 3); + colDataAppend(pColInfoData, numOfRows, (char*) &pInfo->pCur->mr.me.ntbEntry.schema.nCols, false); + + // super table name + pColInfoData = taosArrayGet(pInfo->pRes->pDataBlock, 4); + colDataAppendNULL(pColInfoData, numOfRows); + + // uid + pColInfoData = taosArrayGet(pInfo->pRes->pDataBlock, 5); + colDataAppend(pColInfoData, numOfRows, (char*) &pInfo->pCur->mr.me.uid, false); + + // ttl + pColInfoData = taosArrayGet(pInfo->pRes->pDataBlock, 7); + colDataAppend(pColInfoData, numOfRows, (char*) &pInfo->pCur->mr.me.ntbEntry.ttlDays, false); + + STR_TO_VARSTR(typestr, "NORMAL_TABLE"); } - for (int32_t i = 0; i < pInfo->pRes->info.numOfCols; ++i) { - if (i == tableNameSlotId) { - continue; - } + pColInfoData = taosArrayGet(pInfo->pRes->pDataBlock, 9); + colDataAppend(pColInfoData, numOfRows, typestr, false); - SColumnInfoData* pColInfoData = taosArrayGet(pInfo->pRes->pDataBlock, i); - int64_t tmp = 0; - char t[10] = {0}; - STR_TO_VARSTR(t, "_"); // TODO - if (IS_VAR_DATA_TYPE(pColInfoData->info.type)) { - colDataAppend(pColInfoData, numOfRows, t, false); - } else { - colDataAppend(pColInfoData, numOfRows, (char*)&tmp, false); - } + if (++numOfRows >= pInfo->capacity) { + break; } } @@ -923,7 +984,7 @@ static SSDataBlock* doSysTableScan(SOperatorInfo* pOperator, bool* newgroup) { } } -SOperatorInfo* createSysTableScanOperatorInfo(void* pSysTableReadHandle, SSDataBlock* pResBlock, const SName* pName, +SOperatorInfo* createSysTableScanOperatorInfo(void* readHandle, SSDataBlock* pResBlock, const SName* pName, SNode* pCondition, SEpSet epset, SArray* colList, SExecTaskInfo* pTaskInfo, bool showRewrite, int32_t accountId) { SSysTableScanInfo* pInfo = taosMemoryCalloc(1, sizeof(SSysTableScanInfo)); @@ -945,7 +1006,7 @@ SOperatorInfo* createSysTableScanOperatorInfo(void* pSysTableReadHandle, SSDataB tNameAssign(&pInfo->name, pName); const char* name = tNameGetTableName(&pInfo->name); if (strncasecmp(name, TSDB_INS_TABLE_USER_TABLES, TSDB_TABLE_FNAME_LEN) == 0) { - pInfo->readHandle = pSysTableReadHandle; + pInfo->readHandle = *(SReadHandle*) readHandle; blockDataEnsureCapacity(pInfo->pRes, pInfo->capacity); } else { tsem_init(&pInfo->ready, 0, 0);