2022-04-04 06:54:39 +00:00
/*
* Copyright ( c ) 2019 TAOS Data , Inc . < jhtao @ taosdata . com >
*
* This program is free software : you can use , redistribute , and / or modify
* it under the terms of the GNU Affero General Public License , version 3
* or later ( " AGPL " ) , as published by the Free Software Foundation .
*
* This program is distributed in the hope that it will be useful , but WITHOUT
* ANY WARRANTY ; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE .
*
* You should have received a copy of the GNU Affero General Public License
* along with this program . If not , see < http : //www.gnu.org/licenses/>.
*/
2022-06-28 15:24:20 +00:00
# include "executorimpl.h"
2022-05-26 08:29:52 +00:00
# include "function.h"
2022-04-15 12:06:27 +00:00
# include "functionMgt.h"
2022-04-04 06:54:39 +00:00
# include "os.h"
# include "querynodes.h"
2022-05-05 15:47:44 +00:00
# include "systable.h"
2022-04-04 06:54:39 +00:00
# include "tname.h"
2022-05-05 15:47:44 +00:00
# include "ttime.h"
2022-04-04 06:54:39 +00:00
# include "tdatablock.h"
# include "tmsg.h"
# include "query.h"
# include "tcompare.h"
# include "thash.h"
# include "ttypes.h"
2022-04-21 06:30:37 +00:00
# include "vnode.h"
2022-04-04 06:54:39 +00:00
# define SET_REVERSE_SCAN_FLAG(_info) ((_info)->scanFlag = REVERSE_SCAN)
2022-04-21 06:30:37 +00:00
# define SWITCH_ORDER(n) (((n) = ((n) == TSDB_ORDER_ASC) ? TSDB_ORDER_DESC : TSDB_ORDER_ASC))
2022-04-06 09:59:08 +00:00
2022-05-03 15:23:49 +00:00
static int32_t buildSysDbTableInfo ( const SSysTableScanInfo * pInfo , int32_t capacity ) ;
2022-05-07 16:21:17 +00:00
static int32_t buildDbTableInfoBlock ( const SSDataBlock * p , const SSysTableMeta * pSysDbTableMeta , size_t size ,
const char * dbName ) ;
2022-04-28 07:30:18 +00:00
2022-07-14 09:34:06 +00:00
static bool processBlockWithProbability ( const SSampleExecInfo * pInfo ) ;
2022-06-05 07:24:57 +00:00
2022-06-07 12:59:44 +00:00
bool processBlockWithProbability ( const SSampleExecInfo * pInfo ) {
2022-06-05 07:24:57 +00:00
#if 0
if ( pInfo - > sampleRatio = = 1 ) {
return true ;
}
uint32_t val = taosRandR ( ( uint32_t * ) & pInfo - > seed ) ;
return ( val % ( ( uint32_t ) ( 1 / pInfo - > sampleRatio ) ) ) = = 0 ;
# else
return true ;
# endif
}
2022-05-03 15:23:49 +00:00
static void switchCtxOrder ( SqlFunctionCtx * pCtx , int32_t numOfOutput ) {
2022-04-04 06:54:39 +00:00
for ( int32_t i = 0 ; i < numOfOutput ; + + i ) {
SWITCH_ORDER ( pCtx [ i ] . order ) ;
}
}
static void setupQueryRangeForReverseScan ( STableScanInfo * pTableScanInfo ) {
#if 0
int32_t numOfGroups = ( int32_t ) ( GET_NUM_OF_TABLEGROUP ( pRuntimeEnv ) ) ;
for ( int32_t i = 0 ; i < numOfGroups ; + + i ) {
SArray * group = GET_TABLEGROUP ( pRuntimeEnv , i ) ;
SArray * tableKeyGroup = taosArrayGetP ( pQueryAttr - > tableGroupInfo . pGroupList , i ) ;
size_t t = taosArrayGetSize ( group ) ;
for ( int32_t j = 0 ; j < t ; + + j ) {
STableQueryInfo * pCheckInfo = taosArrayGetP ( group , j ) ;
updateTableQueryInfoForReverseScan ( pCheckInfo ) ;
// update the last key in tableKeyInfo list, the tableKeyInfo is used to build the tsdbQueryHandle and decide
// the start check timestamp of tsdbQueryHandle
// STableKeyInfo *pTableKeyInfo = taosArrayGet(tableKeyGroup, j);
// pTableKeyInfo->lastKey = pCheckInfo->lastKey;
//
// assert(pCheckInfo->pTable == pTableKeyInfo->pTable);
}
}
# endif
}
2022-04-16 14:50:08 +00:00
static void getNextTimeWindow ( SInterval * pInterval , STimeWindow * tw , int32_t order ) {
int32_t factor = GET_FORWARD_DIRECTION_FACTOR ( order ) ;
if ( pInterval - > intervalUnit ! = ' n ' & & pInterval - > intervalUnit ! = ' y ' ) {
tw - > skey + = pInterval - > sliding * factor ;
tw - > ekey = tw - > skey + pInterval - > interval - 1 ;
return ;
}
int64_t key = tw - > skey , interval = pInterval - > interval ;
2022-04-21 06:30:37 +00:00
// convert key to second
2022-04-16 14:50:08 +00:00
key = convertTimePrecision ( key , pInterval - > precision , TSDB_TIME_PRECISION_MILLI ) / 1000 ;
if ( pInterval - > intervalUnit = = ' y ' ) {
interval * = 12 ;
}
struct tm tm ;
2022-04-21 06:30:37 +00:00
time_t t = ( time_t ) key ;
2022-04-16 14:50:08 +00:00
taosLocalTime ( & t , & tm ) ;
int mon = ( int ) ( tm . tm_year * 12 + tm . tm_mon + interval * factor ) ;
tm . tm_year = mon / 12 ;
tm . tm_mon = mon % 12 ;
2022-06-21 12:04:55 +00:00
tw - > skey = convertTimePrecision ( ( int64_t ) taosMktime ( & tm ) * 1000LL , TSDB_TIME_PRECISION_MILLI , pInterval - > precision ) ;
2022-04-16 14:50:08 +00:00
mon = ( int ) ( mon + interval ) ;
tm . tm_year = mon / 12 ;
tm . tm_mon = mon % 12 ;
2022-06-21 12:04:55 +00:00
tw - > ekey = convertTimePrecision ( ( int64_t ) taosMktime ( & tm ) * 1000LL , TSDB_TIME_PRECISION_MILLI , pInterval - > precision ) ;
2022-04-16 14:50:08 +00:00
tw - > ekey - = 1 ;
}
2022-05-17 04:16:44 +00:00
static bool overlapWithTimeWindow ( SInterval * pInterval , SDataBlockInfo * pBlockInfo , int32_t order ) {
2022-04-16 14:50:08 +00:00
STimeWindow w = { 0 } ;
// 0 by default, which means it is not a interval operator of the upstream operator.
if ( pInterval - > interval = = 0 ) {
return false ;
}
2022-05-17 04:16:44 +00:00
if ( order = = TSDB_ORDER_ASC ) {
2022-07-20 07:30:52 +00:00
w = getAlignQueryTimeWindow ( pInterval , pInterval - > precision , pBlockInfo - > window . skey ) ;
2022-04-16 14:50:08 +00:00
assert ( w . ekey > = pBlockInfo - > window . skey ) ;
if ( w . ekey < pBlockInfo - > window . ekey ) {
return true ;
}
2022-05-17 04:16:44 +00:00
while ( 1 ) {
getNextTimeWindow ( pInterval , & w , order ) ;
2022-04-16 14:50:08 +00:00
if ( w . skey > pBlockInfo - > window . ekey ) {
break ;
}
assert ( w . ekey > pBlockInfo - > window . ekey ) ;
if ( w . skey < = pBlockInfo - > window . ekey & & w . skey > pBlockInfo - > window . skey ) {
return true ;
}
}
} else {
2022-07-20 07:30:52 +00:00
w = getAlignQueryTimeWindow ( pInterval , pInterval - > precision , pBlockInfo - > window . ekey ) ;
2022-05-17 04:16:44 +00:00
assert ( w . skey < = pBlockInfo - > window . ekey ) ;
if ( w . skey > pBlockInfo - > window . skey ) {
return true ;
}
2022-05-26 08:29:52 +00:00
while ( 1 ) {
2022-05-17 04:16:44 +00:00
getNextTimeWindow ( pInterval , & w , order ) ;
if ( w . ekey < pBlockInfo - > window . skey ) {
break ;
}
assert ( w . skey < pBlockInfo - > window . skey ) ;
if ( w . ekey < pBlockInfo - > window . ekey & & w . ekey > = pBlockInfo - > window . skey ) {
return true ;
}
}
2022-04-16 14:50:08 +00:00
}
return false ;
}
2022-07-29 01:56:03 +00:00
// this function is for table scanner to extract temporary results of upstream aggregate results.
static SResultRow * getTableGroupOutputBuf ( SOperatorInfo * pOperator , uint64_t groupId , SFilePage * * pPage ) {
if ( pOperator - > operatorType ! = QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN ) {
return NULL ;
}
int64_t buf [ 2 ] = { 0 } ;
SET_RES_WINDOW_KEY ( ( char * ) buf , & groupId , sizeof ( groupId ) , groupId ) ;
STableScanInfo * pTableScanInfo = pOperator - > info ;
SResultRowPosition * p1 =
( SResultRowPosition * ) taosHashGet ( pTableScanInfo - > pdInfo . pAggSup - > pResultRowHashTable , buf , GET_RES_WINDOW_KEY_LEN ( sizeof ( groupId ) ) ) ;
if ( p1 = = NULL ) {
return NULL ;
}
* pPage = getBufPage ( pTableScanInfo - > pdInfo . pAggSup - > pResultBuf , p1 - > pageId ) ;
return ( SResultRow * ) ( ( char * ) ( * pPage ) + p1 - > offset ) ;
}
static int32_t doDynamicPruneDataBlock ( SOperatorInfo * pOperator , SDataBlockInfo * pBlockInfo , uint32_t * status ) {
STableScanInfo * pTableScanInfo = pOperator - > info ;
if ( pTableScanInfo - > pdInfo . pExprSup = = NULL ) {
return TSDB_CODE_SUCCESS ;
}
SExprSupp * pSup1 = pTableScanInfo - > pdInfo . pExprSup ;
SFilePage * pPage = NULL ;
SResultRow * pRow = getTableGroupOutputBuf ( pOperator , pBlockInfo - > groupId , & pPage ) ;
if ( pRow = = NULL ) {
return TSDB_CODE_SUCCESS ;
}
bool notLoadBlock = true ;
for ( int32_t i = 0 ; i < pSup1 - > numOfExprs ; + + i ) {
int32_t functionId = pSup1 - > pCtx [ i ] . functionId ;
SResultRowEntryInfo * pEntry = getResultEntryInfo ( pRow , i , pTableScanInfo - > pdInfo . pExprSup - > rowEntryInfoOffset ) ;
int32_t reqStatus = fmFuncDynDataRequired ( functionId , pEntry , & pBlockInfo - > window ) ;
if ( reqStatus ! = FUNC_DATA_REQUIRED_NOT_LOAD ) {
notLoadBlock = false ;
break ;
}
}
// release buffer pages
releaseBufPage ( pTableScanInfo - > pdInfo . pAggSup - > pResultBuf , pPage ) ;
if ( notLoadBlock ) {
* status = FUNC_DATA_REQUIRED_NOT_LOAD ;
}
return TSDB_CODE_SUCCESS ;
}
2022-05-07 16:21:17 +00:00
static int32_t loadDataBlock ( SOperatorInfo * pOperator , STableScanInfo * pTableScanInfo , SSDataBlock * pBlock ,
uint32_t * status ) {
2022-04-21 06:30:37 +00:00
SExecTaskInfo * pTaskInfo = pOperator - > pTaskInfo ;
2022-04-15 10:06:49 +00:00
STableScanInfo * pInfo = pOperator - > info ;
2022-05-03 15:52:17 +00:00
SFileBlockLoadRecorder * pCost = & pTableScanInfo - > readRecorder ;
2022-04-04 06:54:39 +00:00
pCost - > totalBlocks + = 1 ;
2022-04-15 10:06:49 +00:00
pCost - > totalRows + = pBlock - > info . rows ;
2022-04-04 06:54:39 +00:00
2022-04-15 10:06:49 +00:00
* status = pInfo - > dataBlockLoadFlag ;
2022-05-17 04:16:44 +00:00
if ( pTableScanInfo - > pFilterNode ! = NULL | |
2022-07-29 01:56:03 +00:00
overlapWithTimeWindow ( & pTableScanInfo - > pdInfo . interval , & pBlock - > info , pTableScanInfo - > cond . order ) ) {
2022-04-15 12:06:27 +00:00
( * status ) = FUNC_DATA_REQUIRED_DATA_LOAD ;
}
SDataBlockInfo * pBlockInfo = & pBlock - > info ;
2022-04-16 03:47:50 +00:00
taosMemoryFreeClear ( pBlock - > pBlockAgg ) ;
2022-04-15 12:06:27 +00:00
if ( * status = = FUNC_DATA_REQUIRED_FILTEROUT ) {
2022-04-21 06:30:37 +00:00
qDebug ( " %s data block filter out, brange:% " PRId64 " -% " PRId64 " , rows:%d " , GET_TASKID ( pTaskInfo ) ,
pBlockInfo - > window . skey , pBlockInfo - > window . ekey , pBlockInfo - > rows ) ;
2022-04-15 12:06:27 +00:00
pCost - > filterOutBlocks + = 1 ;
return TSDB_CODE_SUCCESS ;
} else if ( * status = = FUNC_DATA_REQUIRED_NOT_LOAD ) {
2022-04-21 06:30:37 +00:00
qDebug ( " %s data block skipped, brange:% " PRId64 " -% " PRId64 " , rows:%d " , GET_TASKID ( pTaskInfo ) ,
pBlockInfo - > window . skey , pBlockInfo - > window . ekey , pBlockInfo - > rows ) ;
2022-04-15 12:06:27 +00:00
pCost - > skipBlocks + = 1 ;
2022-05-17 04:16:44 +00:00
2022-04-15 12:06:27 +00:00
return TSDB_CODE_SUCCESS ;
} else if ( * status = = FUNC_DATA_REQUIRED_STATIS_LOAD ) {
pCost - > loadBlockStatis + = 1 ;
2022-05-07 16:21:17 +00:00
bool allColumnsHaveAgg = true ;
2022-04-29 12:07:33 +00:00
SColumnDataAgg * * pColAgg = NULL ;
2022-07-09 03:11:11 +00:00
2022-07-07 07:56:43 +00:00
int32_t code = tsdbRetrieveDatablockSMA ( pTableScanInfo - > dataReader , & pColAgg , & allColumnsHaveAgg ) ;
2022-07-07 07:38:17 +00:00
if ( code ! = TSDB_CODE_SUCCESS ) {
longjmp ( pTaskInfo - > env , code ) ;
}
2022-04-16 03:47:50 +00:00
2022-05-03 15:52:17 +00:00
if ( allColumnsHaveAgg = = true ) {
2022-06-22 09:21:04 +00:00
int32_t numOfCols = taosArrayGetSize ( pBlock - > pDataBlock ) ;
2022-04-16 03:47:50 +00:00
// todo create this buffer during creating operator
2022-04-29 12:07:33 +00:00
if ( pBlock - > pBlockAgg = = NULL ) {
pBlock - > pBlockAgg = taosMemoryCalloc ( numOfCols , POINTER_BYTES ) ;
}
2022-06-22 01:31:45 +00:00
for ( int32_t i = 0 ; i < taosArrayGetSize ( pTableScanInfo - > pColMatchInfo ) ; + + i ) {
2022-04-16 03:47:50 +00:00
SColMatchInfo * pColMatchInfo = taosArrayGet ( pTableScanInfo - > pColMatchInfo , i ) ;
if ( ! pColMatchInfo - > output ) {
continue ;
}
pBlock - > pBlockAgg [ pColMatchInfo - > targetSlotId ] = pColAgg [ i ] ;
}
2022-04-04 06:54:39 +00:00
2022-04-15 12:06:27 +00:00
return TSDB_CODE_SUCCESS ;
2022-04-21 06:30:37 +00:00
} else { // failed to load the block sma data, data block statistics does not exist, load data block instead
2022-04-16 11:10:21 +00:00
* status = FUNC_DATA_REQUIRED_DATA_LOAD ;
2022-04-15 12:06:27 +00:00
}
2022-04-16 11:10:21 +00:00
}
2022-04-15 12:06:27 +00:00
2022-04-21 06:30:37 +00:00
ASSERT ( * status = = FUNC_DATA_REQUIRED_DATA_LOAD ) ;
2022-04-15 12:06:27 +00:00
2022-04-16 11:10:21 +00:00
// todo filter data block according to the block sma data firstly
2022-07-29 01:56:03 +00:00
doDynamicPruneDataBlock ( pOperator , pBlockInfo , status ) ;
if ( * status = = FUNC_DATA_REQUIRED_NOT_LOAD ) {
2022-08-03 09:12:10 +00:00
qDebug ( " %s data block skipped due to dynamic prune, brange:% " PRId64 " -% " PRId64 " , rows:%d " , GET_TASKID ( pTaskInfo ) ,
2022-07-29 01:56:03 +00:00
pBlockInfo - > window . skey , pBlockInfo - > window . ekey , pBlockInfo - > rows ) ;
pCost - > skipBlocks + = 1 ;
return TSDB_CODE_SUCCESS ;
}
2022-04-16 11:10:21 +00:00
#if 0
if ( ! doFilterByBlockStatistics ( pBlock - > pBlockStatis , pTableScanInfo - > pCtx , pBlockInfo - > rows ) ) {
pCost - > filterOutBlocks + = 1 ;
qDebug ( " %s data block filter out, brange:% " PRId64 " -% " PRId64 " , rows:%d " , GET_TASKID ( pTaskInfo ) , pBlockInfo - > window . skey ,
pBlockInfo - > window . ekey , pBlockInfo - > rows ) ;
( * status ) = FUNC_DATA_REQUIRED_FILTEROUT ;
return TSDB_CODE_SUCCESS ;
}
# endif
2022-04-04 06:54:39 +00:00
2022-04-16 11:10:21 +00:00
pCost - > totalCheckedRows + = pBlock - > info . rows ;
pCost - > loadBlocks + = 1 ;
2022-04-15 12:06:27 +00:00
2022-04-16 11:10:21 +00:00
SArray * pCols = tsdbRetrieveDataBlock ( pTableScanInfo - > dataReader , NULL ) ;
if ( pCols = = NULL ) {
return terrno ;
2022-04-04 06:54:39 +00:00
}
2022-06-20 08:39:19 +00:00
relocateColumnData ( pBlock , pTableScanInfo - > pColMatchInfo , pCols , true ) ;
2022-05-14 11:21:12 +00:00
// currently only the tbname pseudo column
2022-06-17 15:23:37 +00:00
if ( pTableScanInfo - > pseudoSup . numOfExprs > 0 ) {
2022-06-18 04:00:41 +00:00
SExprSupp * pSup = & pTableScanInfo - > pseudoSup ;
2022-07-09 04:13:21 +00:00
2022-07-10 05:21:37 +00:00
int32_t code = addTagPseudoColumnData ( & pTableScanInfo - > readHandle , pSup - > pExprInfo , pSup - > numOfExprs , pBlock ,
GET_TASKID ( pTaskInfo ) ) ;
2022-07-09 04:13:21 +00:00
if ( code ! = TSDB_CODE_SUCCESS ) {
longjmp ( pTaskInfo - > env , code ) ;
}
2022-05-14 11:21:12 +00:00
}
2022-07-29 01:56:03 +00:00
if ( pTableScanInfo - > pFilterNode ! = NULL ) {
int64_t st = taosGetTimestampUs ( ) ;
doFilter ( pTableScanInfo - > pFilterNode , pBlock , pTableScanInfo - > pColMatchInfo ) ;
2022-05-14 11:21:12 +00:00
2022-07-29 01:56:03 +00:00
double el = ( taosGetTimestampUs ( ) - st ) / 1000.0 ;
pTableScanInfo - > readRecorder . filterTime + = el ;
2022-05-24 03:29:51 +00:00
2022-07-29 01:56:03 +00:00
if ( pBlock - > info . rows = = 0 ) {
pCost - > filterOutBlocks + = 1 ;
qDebug ( " %s data block filter out, brange:% " PRId64 " -% " PRId64 " , rows:%d, elapsed time:%.2f ms " ,
GET_TASKID ( pTaskInfo ) , pBlockInfo - > window . skey , pBlockInfo - > window . ekey , pBlockInfo - > rows , el ) ;
} else {
qDebug ( " %s data block filter applied, elapsed time:%.2f ms " , GET_TASKID ( pTaskInfo ) , el ) ;
}
2022-04-15 12:06:27 +00:00
}
2022-04-04 06:54:39 +00:00
return TSDB_CODE_SUCCESS ;
}
2022-04-26 05:09:29 +00:00
static void prepareForDescendingScan ( STableScanInfo * pTableScanInfo , SqlFunctionCtx * pCtx , int32_t numOfOutput ) {
2022-04-04 06:54:39 +00:00
SET_REVERSE_SCAN_FLAG ( pTableScanInfo ) ;
switchCtxOrder ( pCtx , numOfOutput ) ;
2022-04-26 09:19:30 +00:00
// setupQueryRangeForReverseScan(pTableScanInfo);
2022-04-04 06:54:39 +00:00
2022-04-26 05:09:29 +00:00
pTableScanInfo - > cond . order = TSDB_ORDER_DESC ;
2022-07-10 02:15:27 +00:00
STimeWindow * pTWindow = & pTableScanInfo - > cond . twindows ;
TSWAP ( pTWindow - > skey , pTWindow - > ekey ) ;
2022-04-04 06:54:39 +00:00
}
2022-07-09 04:13:21 +00:00
int32_t addTagPseudoColumnData ( SReadHandle * pHandle , SExprInfo * pPseudoExpr , int32_t numOfPseudoExpr ,
2022-07-10 05:21:37 +00:00
SSDataBlock * pBlock , const char * idStr ) {
2022-05-13 04:17:09 +00:00
// currently only the tbname pseudo column
2022-05-28 09:28:47 +00:00
if ( numOfPseudoExpr = = 0 ) {
2022-07-09 04:13:21 +00:00
return TSDB_CODE_SUCCESS ;
2022-05-13 04:17:09 +00:00
}
SMetaReader mr = { 0 } ;
2022-05-28 09:28:47 +00:00
metaReaderInit ( & mr , pHandle - > meta , 0 ) ;
2022-07-09 04:13:21 +00:00
int32_t code = metaGetTableEntryByUid ( & mr , pBlock - > info . uid ) ;
if ( code ! = TSDB_CODE_SUCCESS ) {
2022-07-10 05:21:37 +00:00
qError ( " failed to get table meta, uid:0x% " PRIx64 " , code:%s, %s " , pBlock - > info . uid , tstrerror ( terrno ) , idStr ) ;
2022-07-09 04:13:21 +00:00
metaReaderClear ( & mr ) ;
return terrno ;
}
2022-05-13 04:17:09 +00:00
2022-05-28 09:28:47 +00:00
for ( int32_t j = 0 ; j < numOfPseudoExpr ; + + j ) {
SExprInfo * pExpr = & pPseudoExpr [ j ] ;
2022-05-13 04:17:09 +00:00
int32_t dstSlotId = pExpr - > base . resSchema . slotId ;
SColumnInfoData * pColInfoData = taosArrayGet ( pBlock - > pDataBlock , dstSlotId ) ;
2022-05-31 06:03:47 +00:00
colInfoDataCleanup ( pColInfoData , pBlock - > info . rows ) ;
2022-05-13 04:17:09 +00:00
int32_t functionId = pExpr - > pExpr - > _function . functionId ;
// this is to handle the tbname
if ( fmIsScanPseudoColumnFunc ( functionId ) ) {
2022-05-28 09:28:47 +00:00
setTbNameColData ( pHandle - > meta , pBlock , pColInfoData , functionId ) ;
2022-05-13 04:17:09 +00:00
} else { // these are tags
2022-05-31 09:49:33 +00:00
STagVal tagVal = { 0 } ;
tagVal . cid = pExpr - > base . pParam [ 0 ] . pCol - > colId ;
2022-06-05 07:24:57 +00:00
const char * p = metaGetTableTagVal ( & mr . me , pColInfoData - > info . type , & tagVal ) ;
2022-05-31 09:49:33 +00:00
2022-06-05 07:24:57 +00:00
char * data = NULL ;
if ( pColInfoData - > info . type ! = TSDB_DATA_TYPE_JSON & & p ! = NULL ) {
data = tTagValToData ( ( const STagVal * ) p , false ) ;
} else {
2022-05-31 09:49:33 +00:00
data = ( char * ) p ;
2022-05-19 14:10:20 +00:00
}
2022-05-26 03:51:32 +00:00
2022-05-13 04:17:09 +00:00
for ( int32_t i = 0 ; i < pBlock - > info . rows ; + + i ) {
2022-06-23 07:46:42 +00:00
colDataAppend ( pColInfoData , i , data ,
( data = = NULL ) | | ( pColInfoData - > info . type = = TSDB_DATA_TYPE_JSON & & tTagIsJsonNull ( data ) ) ) ;
2022-05-13 04:17:09 +00:00
}
2022-06-05 07:24:57 +00:00
2022-06-02 02:22:34 +00:00
if ( data & & ( pColInfoData - > info . type ! = TSDB_DATA_TYPE_JSON ) & & p ! = NULL & &
IS_VAR_DATA_TYPE ( ( ( const STagVal * ) p ) - > type ) ) {
2022-05-31 09:49:33 +00:00
taosMemoryFree ( data ) ;
2022-05-19 14:10:20 +00:00
}
2022-05-13 04:17:09 +00:00
}
}
metaReaderClear ( & mr ) ;
2022-07-09 04:13:21 +00:00
return TSDB_CODE_SUCCESS ;
2022-05-13 04:17:09 +00:00
}
2022-05-16 09:16:20 +00:00
void setTbNameColData ( void * pMeta , const SSDataBlock * pBlock , SColumnInfoData * pColInfoData , int32_t functionId ) {
struct SScalarFuncExecFuncs fpSet = { 0 } ;
fmGetScalarFuncExecFuncs ( functionId , & fpSet ) ;
2022-06-22 09:21:04 +00:00
SColumnInfoData infoData = createColumnInfoData ( TSDB_DATA_TYPE_BIGINT , sizeof ( uint64_t ) , 1 ) ;
colInfoDataEnsureCapacity ( & infoData , 1 ) ;
2022-05-16 09:16:20 +00:00
2022-05-26 08:29:52 +00:00
colDataAppendInt64 ( & infoData , 0 , ( int64_t * ) & pBlock - > info . uid ) ;
2022-05-26 03:51:32 +00:00
SScalarParam srcParam = { . numOfRows = pBlock - > info . rows , . param = pMeta , . columnData = & infoData } ;
2022-05-16 09:16:20 +00:00
SScalarParam param = { . columnData = pColInfoData } ;
fpSet . process ( & srcParam , 1 , & param ) ;
2022-07-20 05:54:06 +00:00
colDataDestroy ( & infoData ) ;
2022-05-16 09:16:20 +00:00
}
2022-05-03 07:27:13 +00:00
static SSDataBlock * doTableScanImpl ( SOperatorInfo * pOperator ) {
2022-04-04 06:54:39 +00:00
STableScanInfo * pTableScanInfo = pOperator - > info ;
2022-06-18 12:03:27 +00:00
SExecTaskInfo * pTaskInfo = pOperator - > pTaskInfo ;
2022-05-07 16:21:17 +00:00
SSDataBlock * pBlock = pTableScanInfo - > pResBlock ;
2022-04-04 06:54:39 +00:00
2022-05-24 03:29:51 +00:00
int64_t st = taosGetTimestampUs ( ) ;
2022-05-27 11:50:22 +00:00
while ( tsdbNextDataBlock ( pTableScanInfo - > dataReader ) ) {
2022-06-18 12:03:27 +00:00
if ( isTaskKilled ( pTaskInfo ) ) {
longjmp ( pTaskInfo - > env , TSDB_CODE_TSC_QUERY_CANCELLED ) ;
2022-05-27 11:50:22 +00:00
}
2022-04-04 06:54:39 +00:00
2022-06-05 07:24:57 +00:00
// process this data block based on the probabilities
bool processThisBlock = processBlockWithProbability ( & pTableScanInfo - > sample ) ;
if ( ! processThisBlock ) {
continue ;
}
2022-06-22 01:31:45 +00:00
blockDataCleanup ( pBlock ) ;
SDataBlockInfo binfo = pBlock - > info ;
tsdbRetrieveDataBlockInfo ( pTableScanInfo - > dataReader , & binfo ) ;
binfo . capacity = binfo . rows ;
blockDataEnsureCapacity ( pBlock , binfo . rows ) ;
pBlock - > info = binfo ;
2022-06-30 08:40:17 +00:00
ASSERT ( binfo . uid ! = 0 ) ;
2022-04-04 06:54:39 +00:00
2022-08-02 06:19:15 +00:00
uint64_t * groupId = taosHashGet ( pTaskInfo - > tableqinfoList . map , & pBlock - > info . uid , sizeof ( int64_t ) ) ;
if ( groupId ) {
pBlock - > info . groupId = * groupId ;
}
2022-05-27 11:50:22 +00:00
uint32_t status = 0 ;
int32_t code = loadDataBlock ( pOperator , pTableScanInfo , pBlock , & status ) ;
// int32_t code = loadDataBlockOnDemand(pOperator->pRuntimeEnv, pTableScanInfo, pBlock, &status);
if ( code ! = TSDB_CODE_SUCCESS ) {
longjmp ( pOperator - > pTaskInfo - > env , code ) ;
}
2022-05-24 03:29:51 +00:00
2022-05-27 11:50:22 +00:00
// current block is filter out according to filter condition, continue load the next block
if ( status = = FUNC_DATA_REQUIRED_FILTEROUT | | pBlock - > info . rows = = 0 ) {
continue ;
2022-05-27 09:57:27 +00:00
}
2022-05-27 11:50:22 +00:00
pOperator - > resultInfo . totalRows = pTableScanInfo - > readRecorder . totalRows ;
pTableScanInfo - > readRecorder . elapsedTime + = ( taosGetTimestampUs ( ) - st ) / 1000.0 ;
pOperator - > cost . totalCost = pTableScanInfo - > readRecorder . elapsedTime ;
2022-06-29 08:19:19 +00:00
// todo refactor
2022-07-10 06:10:39 +00:00
/*pTableScanInfo->lastStatus.uid = pBlock->info.uid;*/
/*pTableScanInfo->lastStatus.ts = pBlock->info.window.ekey;*/
pTaskInfo - > streamInfo . lastStatus . type = TMQ_OFFSET__SNAPSHOT_DATA ;
pTaskInfo - > streamInfo . lastStatus . uid = pBlock - > info . uid ;
pTaskInfo - > streamInfo . lastStatus . ts = pBlock - > info . window . ekey ;
2022-06-29 08:19:19 +00:00
2022-06-30 08:40:17 +00:00
ASSERT ( pBlock - > info . uid ! = 0 ) ;
2022-05-27 11:50:22 +00:00
return pBlock ;
2022-04-04 06:54:39 +00:00
}
return NULL ;
}
2022-06-23 11:58:12 +00:00
static SSDataBlock * doTableScanGroup ( SOperatorInfo * pOperator ) {
2022-04-04 06:54:39 +00:00
STableScanInfo * pTableScanInfo = pOperator - > info ;
SExecTaskInfo * pTaskInfo = pOperator - > pTaskInfo ;
// The read handle is not initialized yet, since no qualified tables exists
2022-04-21 09:43:46 +00:00
if ( pTableScanInfo - > dataReader = = NULL | | pOperator - > status = = OP_EXEC_DONE ) {
2022-04-04 06:54:39 +00:00
return NULL ;
}
2022-05-03 15:23:49 +00:00
// do the ascending order traverse in the first place.
while ( pTableScanInfo - > scanTimes < pTableScanInfo - > scanInfo . numOfAsc ) {
2022-07-10 02:15:27 +00:00
SSDataBlock * p = doTableScanImpl ( pOperator ) ;
if ( p ! = NULL ) {
ASSERT ( p - > info . uid ! = 0 ) ;
return p ;
2022-04-04 06:54:39 +00:00
}
2022-05-03 15:23:49 +00:00
pTableScanInfo - > scanTimes + = 1 ;
2022-04-26 05:09:29 +00:00
2022-05-03 15:23:49 +00:00
if ( pTableScanInfo - > scanTimes < pTableScanInfo - > scanInfo . numOfAsc ) {
2022-04-26 05:09:29 +00:00
setTaskStatus ( pTaskInfo , TASK_NOT_COMPLETED ) ;
pTableScanInfo - > scanFlag = REPEAT_SCAN ;
2022-08-03 07:34:42 +00:00
qDebug ( " %s start to repeat ascending order scan data SELECT last_row(*),hostname from cpu group by hostname;blocks due to query func required " , GET_TASKID ( pTaskInfo ) ) ;
2022-07-10 02:15:27 +00:00
2022-05-27 14:22:23 +00:00
// do prepare for the next round table scan operation
2022-07-10 02:15:27 +00:00
tsdbReaderReset ( pTableScanInfo - > dataReader , & pTableScanInfo - > cond ) ;
2022-04-04 06:54:39 +00:00
}
2022-04-26 05:09:29 +00:00
}
2022-04-04 06:54:39 +00:00
2022-04-26 05:09:29 +00:00
int32_t total = pTableScanInfo - > scanInfo . numOfAsc + pTableScanInfo - > scanInfo . numOfDesc ;
2022-05-03 15:23:49 +00:00
if ( pTableScanInfo - > scanTimes < total ) {
2022-04-26 05:09:29 +00:00
if ( pTableScanInfo - > cond . order = = TSDB_ORDER_ASC ) {
2022-07-10 02:15:27 +00:00
prepareForDescendingScan ( pTableScanInfo , pOperator - > exprSupp . pCtx , 0 ) ;
tsdbReaderReset ( pTableScanInfo - > dataReader , & pTableScanInfo - > cond ) ;
2022-08-03 07:34:42 +00:00
qDebug ( " %s start to descending order scan data blocks due to query func required " , GET_TASKID ( pTaskInfo ) ) ;
2022-04-26 05:09:29 +00:00
}
2022-04-04 06:54:39 +00:00
2022-05-03 15:23:49 +00:00
while ( pTableScanInfo - > scanTimes < total ) {
2022-07-10 02:15:27 +00:00
SSDataBlock * p = doTableScanImpl ( pOperator ) ;
if ( p ! = NULL ) {
return p ;
2022-04-26 05:09:29 +00:00
}
2022-04-04 06:54:39 +00:00
2022-05-03 15:23:49 +00:00
pTableScanInfo - > scanTimes + = 1 ;
2022-04-04 06:54:39 +00:00
2022-05-27 11:50:22 +00:00
if ( pTableScanInfo - > scanTimes < total ) {
2022-04-26 05:09:29 +00:00
setTaskStatus ( pTaskInfo , TASK_NOT_COMPLETED ) ;
pTableScanInfo - > scanFlag = REPEAT_SCAN ;
2022-04-04 06:54:39 +00:00
2022-06-07 12:59:44 +00:00
qDebug ( " %s start to repeat descending order scan data blocks due to query func required " ,
GET_TASKID ( pTaskInfo ) ) ;
2022-07-10 02:15:27 +00:00
tsdbReaderReset ( pTableScanInfo - > dataReader , & pTableScanInfo - > cond ) ;
2022-04-26 05:09:29 +00:00
}
2022-04-04 06:54:39 +00:00
}
}
2022-06-23 11:58:12 +00:00
return NULL ;
}
static SSDataBlock * doTableScan ( SOperatorInfo * pOperator ) {
STableScanInfo * pInfo = pOperator - > info ;
SExecTaskInfo * pTaskInfo = pOperator - > pTaskInfo ;
2022-06-30 06:41:50 +00:00
// if scan table by table
if ( pInfo - > scanMode = = TABLE_SCAN__TABLE_ORDER ) {
2022-07-01 06:39:21 +00:00
if ( pInfo - > noTable ) return NULL ;
2022-06-30 08:40:17 +00:00
while ( 1 ) {
2022-06-30 06:41:50 +00:00
SSDataBlock * result = doTableScanGroup ( pOperator ) ;
if ( result ) {
return result ;
}
// if no data, switch to next table and continue scan
pInfo - > currentTable + + ;
if ( pInfo - > currentTable > = taosArrayGetSize ( pTaskInfo - > tableqinfoList . pTableList ) ) {
return NULL ;
}
STableKeyInfo * pTableInfo = taosArrayGet ( pTaskInfo - > tableqinfoList . pTableList , pInfo - > currentTable ) ;
tsdbSetTableId ( pInfo - > dataReader , pTableInfo - > uid ) ;
2022-07-10 02:15:27 +00:00
tsdbReaderReset ( pInfo - > dataReader , & pInfo - > cond ) ;
2022-06-30 06:41:50 +00:00
pInfo - > scanTimes = 0 ;
}
}
2022-06-25 12:02:57 +00:00
if ( pInfo - > currentGroupId = = - 1 ) {
2022-06-23 11:58:12 +00:00
pInfo - > currentGroupId + + ;
2022-06-23 12:46:11 +00:00
if ( pInfo - > currentGroupId > = taosArrayGetSize ( pTaskInfo - > tableqinfoList . pGroupList ) ) {
2022-06-24 03:24:31 +00:00
setTaskStatus ( pTaskInfo , TASK_COMPLETED ) ;
2022-06-23 12:46:11 +00:00
return NULL ;
}
2022-06-28 07:22:32 +00:00
2022-06-25 12:02:57 +00:00
SArray * tableList = taosArrayGetP ( pTaskInfo - > tableqinfoList . pGroupList , pInfo - > currentGroupId ) ;
2022-06-28 07:22:32 +00:00
tsdbReaderClose ( pInfo - > dataReader ) ;
2022-07-04 03:42:50 +00:00
int32_t code = tsdbReaderOpen ( pInfo - > readHandle . vnode , & pInfo - > cond , tableList , ( STsdbReader * * ) & pInfo - > dataReader ,
GET_TASKID ( pTaskInfo ) ) ;
2022-07-16 06:05:26 +00:00
if ( code ! = TSDB_CODE_SUCCESS ) {
longjmp ( pTaskInfo - > env , code ) ;
return NULL ;
}
2022-06-23 11:58:12 +00:00
}
SSDataBlock * result = doTableScanGroup ( pOperator ) ;
2022-06-25 12:02:57 +00:00
if ( result ) {
2022-06-23 11:58:12 +00:00
return result ;
}
pInfo - > currentGroupId + + ;
if ( pInfo - > currentGroupId > = taosArrayGetSize ( pTaskInfo - > tableqinfoList . pGroupList ) ) {
2022-06-24 03:24:31 +00:00
setTaskStatus ( pTaskInfo , TASK_COMPLETED ) ;
2022-06-23 11:58:12 +00:00
return NULL ;
}
2022-06-25 12:02:57 +00:00
SArray * tableList = taosArrayGetP ( pTaskInfo - > tableqinfoList . pGroupList , pInfo - > currentGroupId ) ;
2022-07-04 03:42:50 +00:00
// tsdbSetTableList(pInfo->dataReader, tableList);
2022-06-23 11:58:12 +00:00
2022-07-10 02:15:27 +00:00
tsdbReaderReset ( pInfo - > dataReader , & pInfo - > cond ) ;
2022-06-23 11:58:12 +00:00
pInfo - > scanTimes = 0 ;
result = doTableScanGroup ( pOperator ) ;
2022-06-25 12:02:57 +00:00
if ( result ) {
2022-06-23 11:58:12 +00:00
return result ;
}
2022-04-26 05:09:29 +00:00
setTaskStatus ( pTaskInfo , TASK_COMPLETED ) ;
return NULL ;
2022-04-04 06:54:39 +00:00
}
2022-05-24 03:29:51 +00:00
static int32_t getTableScannerExecInfo ( struct SOperatorInfo * pOptr , void * * pOptrExplain , uint32_t * len ) {
SFileBlockLoadRecorder * pRecorder = taosMemoryCalloc ( 1 , sizeof ( SFileBlockLoadRecorder ) ) ;
2022-05-26 08:29:52 +00:00
STableScanInfo * pTableScanInfo = pOptr - > info ;
2022-05-24 03:29:51 +00:00
* pRecorder = pTableScanInfo - > readRecorder ;
* pOptrExplain = pRecorder ;
* len = sizeof ( SFileBlockLoadRecorder ) ;
return 0 ;
}
2022-05-12 16:32:02 +00:00
static void destroyTableScanOperatorInfo ( void * param , int32_t numOfOutput ) {
STableScanInfo * pTableScanInfo = ( STableScanInfo * ) param ;
2022-06-13 01:33:08 +00:00
blockDataDestroy ( pTableScanInfo - > pResBlock ) ;
2022-06-17 11:01:45 +00:00
cleanupQueryTableDataCond ( & pTableScanInfo - > cond ) ;
2022-06-12 15:37:29 +00:00
2022-06-16 11:14:56 +00:00
tsdbReaderClose ( pTableScanInfo - > dataReader ) ;
2022-05-12 16:32:02 +00:00
if ( pTableScanInfo - > pColMatchInfo ! = NULL ) {
taosArrayDestroy ( pTableScanInfo - > pColMatchInfo ) ;
}
2022-07-08 13:37:15 +00:00
2022-07-11 11:36:19 +00:00
cleanupExprSupp ( & pTableScanInfo - > pseudoSup ) ;
2022-07-08 06:26:53 +00:00
taosMemoryFreeClear ( param ) ;
2022-05-12 16:32:02 +00:00
}
2022-06-23 11:58:12 +00:00
SOperatorInfo * createTableScanOperatorInfo ( STableScanPhysiNode * pTableScanNode , SReadHandle * readHandle ,
2022-07-04 03:42:50 +00:00
SExecTaskInfo * pTaskInfo ) {
2022-04-04 06:54:39 +00:00
STableScanInfo * pInfo = taosMemoryCalloc ( 1 , sizeof ( STableScanInfo ) ) ;
SOperatorInfo * pOperator = taosMemoryCalloc ( 1 , sizeof ( SOperatorInfo ) ) ;
if ( pInfo = = NULL | | pOperator = = NULL ) {
2022-06-05 07:24:57 +00:00
goto _error ;
2022-04-04 06:54:39 +00:00
}
2022-05-12 09:33:36 +00:00
SDataBlockDescNode * pDescNode = pTableScanNode - > scan . node . pOutputDataBlockDesc ;
2022-06-22 13:21:39 +00:00
int32_t numOfCols = 0 ;
2022-06-17 11:01:45 +00:00
SArray * pColList = extractColMatchInfo ( pTableScanNode - > scan . pScanCols , pDescNode , & numOfCols , COL_MATCH_FROM_COL_ID ) ;
2022-05-07 16:21:17 +00:00
2022-05-12 09:33:36 +00:00
int32_t code = initQueryTableDataCond ( & pInfo - > cond , pTableScanNode ) ;
if ( code ! = TSDB_CODE_SUCCESS ) {
2022-06-05 07:24:57 +00:00
goto _error ;
2022-05-12 09:33:36 +00:00
}
if ( pTableScanNode - > scan . pScanPseudoCols ! = NULL ) {
2022-06-18 04:00:41 +00:00
SExprSupp * pSup = & pInfo - > pseudoSup ;
2022-06-17 15:23:37 +00:00
pSup - > pExprInfo = createExprInfo ( pTableScanNode - > scan . pScanPseudoCols , NULL , & pSup - > numOfExprs ) ;
pSup - > pCtx = createSqlFunctionCtx ( pSup - > pExprInfo , pSup - > numOfExprs , & pSup - > rowEntryInfoOffset ) ;
2022-05-12 09:33:36 +00:00
}
2022-05-30 12:10:30 +00:00
pInfo - > scanInfo = ( SScanInfo ) { . numOfAsc = pTableScanNode - > scanSeq [ 0 ] , . numOfDesc = pTableScanNode - > scanSeq [ 1 ] } ;
2022-07-29 11:00:12 +00:00
// pInfo->scanInfo = (SScanInfo){.numOfAsc = 0, .numOfDesc = 1}; // for debug purpose
// pInfo->cond.order = TSDB_ORDER_DESC;
2022-05-12 09:33:36 +00:00
2022-07-29 01:56:03 +00:00
pInfo - > pdInfo . interval = extractIntervalInfo ( pTableScanNode ) ;
2022-06-07 12:59:44 +00:00
pInfo - > readHandle = * readHandle ;
pInfo - > sample . sampleRatio = pTableScanNode - > ratio ;
pInfo - > sample . seed = taosGetTimestampSec ( ) ;
2022-06-05 07:24:57 +00:00
2022-05-12 09:33:36 +00:00
pInfo - > dataBlockLoadFlag = pTableScanNode - > dataRequired ;
2022-06-07 12:59:44 +00:00
pInfo - > pResBlock = createResDataBlock ( pDescNode ) ;
pInfo - > pFilterNode = pTableScanNode - > scan . node . pConditions ;
pInfo - > scanFlag = MAIN_SCAN ;
pInfo - > pColMatchInfo = pColList ;
2022-06-23 11:58:12 +00:00
pInfo - > currentGroupId = - 1 ;
2022-07-28 09:07:47 +00:00
pInfo - > assignBlockUid = pTableScanNode - > assignBlockUid ;
2022-06-07 12:59:44 +00:00
pOperator - > name = " TableScanOperator " ; // for debug purpose
2022-05-07 16:21:17 +00:00
pOperator - > operatorType = QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN ;
2022-06-07 12:59:44 +00:00
pOperator - > blocking = false ;
pOperator - > status = OP_NOT_OPENED ;
pOperator - > info = pInfo ;
2022-06-18 04:00:41 +00:00
pOperator - > exprSupp . numOfExprs = numOfCols ;
2022-06-07 12:59:44 +00:00
pOperator - > pTaskInfo = pTaskInfo ;
2022-05-03 15:23:49 +00:00
2022-05-26 08:29:52 +00:00
pOperator - > fpSet = createOperatorFpSet ( operatorDummyOpenFn , doTableScan , NULL , NULL , destroyTableScanOperatorInfo ,
NULL , NULL , getTableScannerExecInfo ) ;
2022-05-03 15:23:49 +00:00
// for non-blocking operator, the open cost is always 0
pOperator - > cost . openCost = 0 ;
2022-04-04 06:54:39 +00:00
return pOperator ;
2022-06-05 07:24:57 +00:00
2022-06-07 12:59:44 +00:00
_error :
2022-06-05 07:24:57 +00:00
taosMemoryFreeClear ( pInfo ) ;
taosMemoryFreeClear ( pOperator ) ;
pTaskInfo - > code = TSDB_CODE_QRY_OUT_OF_MEMORY ;
return NULL ;
2022-04-04 06:54:39 +00:00
}
2022-05-03 15:23:49 +00:00
SOperatorInfo * createTableSeqScanOperatorInfo ( void * pReadHandle , SExecTaskInfo * pTaskInfo ) {
2022-04-04 06:54:39 +00:00
STableScanInfo * pInfo = taosMemoryCalloc ( 1 , sizeof ( STableScanInfo ) ) ;
2022-05-07 16:21:17 +00:00
SOperatorInfo * pOperator = taosMemoryCalloc ( 1 , sizeof ( SOperatorInfo ) ) ;
2022-04-04 06:54:39 +00:00
2022-05-07 16:21:17 +00:00
pInfo - > dataReader = pReadHandle ;
// pInfo->prevGroupId = -1;
2022-04-04 06:54:39 +00:00
2022-06-22 10:51:16 +00:00
pOperator - > name = " TableSeqScanOperator " ;
2022-04-04 06:54:39 +00:00
pOperator - > operatorType = QUERY_NODE_PHYSICAL_PLAN_TABLE_SEQ_SCAN ;
2022-06-22 10:51:16 +00:00
pOperator - > blocking = false ;
pOperator - > status = OP_NOT_OPENED ;
pOperator - > info = pInfo ;
pOperator - > pTaskInfo = pTaskInfo ;
2022-04-04 06:54:39 +00:00
2022-05-03 15:23:49 +00:00
pOperator - > fpSet = createOperatorFpSet ( operatorDummyOpenFn , doTableScanImpl , NULL , NULL , NULL , NULL , NULL , NULL ) ;
2022-04-04 06:54:39 +00:00
return pOperator ;
}
2022-07-09 04:13:21 +00:00
static int32_t doGetTableRowSize ( void * pMeta , uint64_t uid , int32_t * rowLen , const char * idstr ) {
* rowLen = 0 ;
2022-04-04 06:54:39 +00:00
2022-06-20 04:54:46 +00:00
SMetaReader mr = { 0 } ;
2022-06-20 05:47:13 +00:00
metaReaderInit ( & mr , pMeta , 0 ) ;
2022-07-09 04:13:21 +00:00
int32_t code = metaGetTableEntryByUid ( & mr , uid ) ;
if ( code ! = TSDB_CODE_SUCCESS ) {
2022-07-10 05:21:37 +00:00
qError ( " failed to get table meta, uid:0x% " PRIx64 " , code:%s, %s " , uid , tstrerror ( terrno ) , idstr ) ;
2022-07-09 04:13:21 +00:00
metaReaderClear ( & mr ) ;
return terrno ;
}
2022-06-20 04:54:46 +00:00
if ( mr . me . type = = TSDB_SUPER_TABLE ) {
int32_t numOfCols = mr . me . stbEntry . schemaRow . nCols ;
2022-06-22 10:51:16 +00:00
for ( int32_t i = 0 ; i < numOfCols ; + + i ) {
2022-07-09 04:13:21 +00:00
( * rowLen ) + = mr . me . stbEntry . schemaRow . pSchema [ i ] . bytes ;
2022-06-20 04:54:46 +00:00
}
} else if ( mr . me . type = = TSDB_CHILD_TABLE ) {
uint64_t suid = mr . me . ctbEntry . suid ;
2022-07-09 04:13:21 +00:00
code = metaGetTableEntryByUid ( & mr , suid ) ;
if ( code ! = TSDB_CODE_SUCCESS ) {
2022-07-10 05:21:37 +00:00
qError ( " failed to get table meta, uid:0x% " PRIx64 " , code:%s, %s " , suid , tstrerror ( terrno ) , idstr ) ;
2022-07-09 04:13:21 +00:00
metaReaderClear ( & mr ) ;
return terrno ;
}
2022-06-20 04:54:46 +00:00
int32_t numOfCols = mr . me . stbEntry . schemaRow . nCols ;
2022-06-22 10:51:16 +00:00
for ( int32_t i = 0 ; i < numOfCols ; + + i ) {
2022-07-09 04:13:21 +00:00
( * rowLen ) + = mr . me . stbEntry . schemaRow . pSchema [ i ] . bytes ;
2022-06-20 04:54:46 +00:00
}
} else if ( mr . me . type = = TSDB_NORMAL_TABLE ) {
int32_t numOfCols = mr . me . ntbEntry . schemaRow . nCols ;
2022-06-22 10:51:16 +00:00
for ( int32_t i = 0 ; i < numOfCols ; + + i ) {
2022-07-09 04:13:21 +00:00
( * rowLen ) + = mr . me . ntbEntry . schemaRow . pSchema [ i ] . bytes ;
2022-06-20 04:54:46 +00:00
}
}
metaReaderClear ( & mr ) ;
2022-07-09 04:13:21 +00:00
return TSDB_CODE_SUCCESS ;
2022-06-20 05:47:13 +00:00
}
static SSDataBlock * doBlockInfoScan ( SOperatorInfo * pOperator ) {
if ( pOperator - > status = = OP_EXEC_DONE ) {
return NULL ;
}
SBlockDistInfo * pBlockScanInfo = pOperator - > info ;
2022-07-10 05:21:37 +00:00
SExecTaskInfo * pTaskInfo = pOperator - > pTaskInfo ;
2022-06-20 05:47:13 +00:00
STableBlockDistInfo blockDistInfo = { . minRows = INT_MAX , . maxRows = INT_MIN } ;
2022-07-10 05:21:37 +00:00
int32_t code = doGetTableRowSize ( pBlockScanInfo - > readHandle . meta , pBlockScanInfo - > uid , & blockDistInfo . rowSize ,
GET_TASKID ( pTaskInfo ) ) ;
2022-07-09 04:13:21 +00:00
if ( code ! = TSDB_CODE_SUCCESS ) {
2022-07-10 05:21:37 +00:00
longjmp ( pTaskInfo - > env , code ) ;
2022-07-09 04:13:21 +00:00
}
2022-06-20 04:54:46 +00:00
tsdbGetFileBlocksDistInfo ( pBlockScanInfo - > pHandle , & blockDistInfo ) ;
blockDistInfo . numOfInmemRows = ( int32_t ) tsdbGetNumOfRowsInMemTable ( pBlockScanInfo - > pHandle ) ;
2022-04-04 06:54:39 +00:00
2022-06-20 04:54:46 +00:00
SSDataBlock * pBlock = pBlockScanInfo - > pResBlock ;
2022-04-04 06:54:39 +00:00
2022-06-22 10:51:16 +00:00
int32_t slotId = pOperator - > exprSupp . pExprInfo - > base . resSchema . slotId ;
2022-06-20 05:42:59 +00:00
SColumnInfoData * pColInfo = taosArrayGet ( pBlock - > pDataBlock , slotId ) ;
2022-04-04 06:54:39 +00:00
2022-06-10 02:29:53 +00:00
int32_t len = tSerializeBlockDistInfo ( NULL , 0 , & blockDistInfo ) ;
2022-06-14 10:17:18 +00:00
char * p = taosMemoryCalloc ( 1 , len + VARSTR_HEADER_SIZE ) ;
2022-06-10 02:29:53 +00:00
tSerializeBlockDistInfo ( varDataVal ( p ) , len , & blockDistInfo ) ;
varDataSetLen ( p , len ) ;
2022-06-20 05:42:59 +00:00
blockDataEnsureCapacity ( pBlock , 1 ) ;
2022-06-10 02:29:53 +00:00
colDataAppend ( pColInfo , 0 , p , false ) ;
taosMemoryFree ( p ) ;
2022-04-04 06:54:39 +00:00
2022-06-20 05:42:59 +00:00
pBlock - > info . rows = 1 ;
2022-04-04 06:54:39 +00:00
pOperator - > status = OP_EXEC_DONE ;
return pBlock ;
}
2022-06-10 02:29:53 +00:00
static void destroyBlockDistScanOperatorInfo ( void * param , int32_t numOfOutput ) {
2022-06-14 10:17:18 +00:00
SBlockDistInfo * pDistInfo = ( SBlockDistInfo * ) param ;
2022-06-10 02:29:53 +00:00
blockDataDestroy ( pDistInfo - > pResBlock ) ;
2022-07-22 02:28:39 +00:00
tsdbReaderClose ( pDistInfo - > pHandle ) ;
2022-07-08 06:26:53 +00:00
taosMemoryFreeClear ( param ) ;
2022-06-10 02:29:53 +00:00
}
2022-06-20 05:42:59 +00:00
SOperatorInfo * createDataBlockInfoScanOperator ( void * dataReader , SReadHandle * readHandle , uint64_t uid ,
SBlockDistScanPhysiNode * pBlockScanNode , SExecTaskInfo * pTaskInfo ) {
2022-06-10 02:29:53 +00:00
SBlockDistInfo * pInfo = taosMemoryCalloc ( 1 , sizeof ( SBlockDistInfo ) ) ;
2022-04-21 06:30:37 +00:00
SOperatorInfo * pOperator = taosMemoryCalloc ( 1 , sizeof ( SOperatorInfo ) ) ;
2022-04-04 06:54:39 +00:00
if ( pInfo = = NULL | | pOperator = = NULL ) {
pTaskInfo - > code = TSDB_CODE_OUT_OF_MEMORY ;
goto _error ;
}
2022-06-22 10:51:16 +00:00
pInfo - > pHandle = dataReader ;
2022-06-20 04:54:46 +00:00
pInfo - > readHandle = * readHandle ;
2022-06-22 10:51:16 +00:00
pInfo - > uid = uid ;
pInfo - > pResBlock = createResDataBlock ( pBlockScanNode - > node . pOutputDataBlockDesc ) ;
2022-06-10 02:29:53 +00:00
2022-06-22 10:51:16 +00:00
int32_t numOfCols = 0 ;
2022-06-20 05:42:59 +00:00
SExprInfo * pExprInfo = createExprInfo ( pBlockScanNode - > pScanPseudoCols , NULL , & numOfCols ) ;
2022-06-22 10:51:16 +00:00
int32_t code = initExprSupp ( & pOperator - > exprSupp , pExprInfo , numOfCols ) ;
2022-06-20 15:22:28 +00:00
if ( code ! = TSDB_CODE_SUCCESS ) {
goto _error ;
}
2022-04-04 06:54:39 +00:00
2022-06-22 10:51:16 +00:00
pOperator - > name = " DataBlockDistScanOperator " ;
2022-06-20 04:54:46 +00:00
pOperator - > operatorType = QUERY_NODE_PHYSICAL_PLAN_BLOCK_DIST_SCAN ;
2022-06-22 10:51:16 +00:00
pOperator - > blocking = false ;
pOperator - > status = OP_NOT_OPENED ;
pOperator - > info = pInfo ;
2022-06-14 10:17:18 +00:00
pOperator - > pTaskInfo = pTaskInfo ;
pOperator - > fpSet = createOperatorFpSet ( operatorDummyOpenFn , doBlockInfoScan , NULL , NULL ,
destroyBlockDistScanOperatorInfo , NULL , NULL , NULL ) ;
2022-04-04 06:54:39 +00:00
return pOperator ;
2022-04-21 06:30:37 +00:00
_error :
2022-04-04 06:54:39 +00:00
taosMemoryFreeClear ( pInfo ) ;
taosMemoryFreeClear ( pOperator ) ;
return NULL ;
}
2022-07-06 06:20:07 +00:00
static void doClearBufferedBlocks ( SStreamScanInfo * pInfo ) {
2022-04-04 06:54:39 +00:00
size_t total = taosArrayGetSize ( pInfo - > pBlockLists ) ;
pInfo - > validBlockIndex = 0 ;
for ( int32_t i = 0 ; i < total ; + + i ) {
SSDataBlock * p = taosArrayGetP ( pInfo - > pBlockLists , i ) ;
blockDataDestroy ( p ) ;
}
taosArrayClear ( pInfo - > pBlockLists ) ;
}
2022-07-06 06:20:07 +00:00
static bool isSessionWindow ( SStreamScanInfo * pInfo ) {
2022-07-06 13:25:34 +00:00
return pInfo - > sessionSup . parentType = = QUERY_NODE_PHYSICAL_PLAN_STREAM_SESSION | |
pInfo - > sessionSup . parentType = = QUERY_NODE_PHYSICAL_PLAN_STREAM_SESSION ;
2022-06-04 12:06:07 +00:00
}
2022-07-06 06:20:07 +00:00
static bool isStateWindow ( SStreamScanInfo * pInfo ) {
2022-06-07 12:59:44 +00:00
return pInfo - > sessionSup . parentType = = QUERY_NODE_PHYSICAL_PLAN_STREAM_STATE ;
2022-06-04 12:06:07 +00:00
}
2022-05-20 11:34:39 +00:00
2022-07-06 13:25:34 +00:00
static bool isIntervalWindow ( SStreamScanInfo * pInfo ) {
return pInfo - > sessionSup . parentType = = QUERY_NODE_PHYSICAL_PLAN_STREAM_INTERVAL | |
2022-07-16 01:28:15 +00:00
pInfo - > sessionSup . parentType = = QUERY_NODE_PHYSICAL_PLAN_STREAM_SEMI_INTERVAL | |
pInfo - > sessionSup . parentType = = QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_INTERVAL ;
}
static bool isSignleIntervalWindow ( SStreamScanInfo * pInfo ) {
return pInfo - > sessionSup . parentType = = QUERY_NODE_PHYSICAL_PLAN_STREAM_INTERVAL ;
2022-07-06 13:25:34 +00:00
}
2022-07-22 08:55:14 +00:00
static bool isSlidingWindow ( SStreamScanInfo * pInfo ) {
return isIntervalWindow ( pInfo ) & & pInfo - > interval . interval ! = pInfo - > interval . sliding ;
}
2022-07-05 09:53:52 +00:00
static uint64_t getGroupId ( SOperatorInfo * pOperator , uint64_t uid ) {
uint64_t * groupId = taosHashGet ( pOperator - > pTaskInfo - > tableqinfoList . map , & uid , sizeof ( int64_t ) ) ;
if ( groupId ) {
return * groupId ;
}
return 0 ;
/* Todo(liuyao) for partition by column
recordNewGroupKeys ( pTableScanInfo - > pGroupCols , pTableScanInfo - > pGroupColVals , pBlock , rowId ) ;
int32_t len = buildGroupKeys ( pTableScanInfo - > keyBuf , pTableScanInfo - > pGroupColVals ) ;
uint64_t resId = 0 ;
uint64_t * groupId = taosHashGet ( pTableScanInfo - > pGroupSet , pTableScanInfo - > keyBuf , len ) ;
if ( groupId ) {
return * groupId ;
} else if ( len ! = 0 ) {
resId = calcGroupId ( pTableScanInfo - > keyBuf , len ) ;
taosHashPut ( pTableScanInfo - > pGroupSet , pTableScanInfo - > keyBuf , len , & resId , sizeof ( uint64_t ) ) ;
}
return resId ;
*/
}
2022-07-06 06:20:07 +00:00
static void setGroupId ( SStreamScanInfo * pInfo , SSDataBlock * pBlock , int32_t groupColIndex , int32_t rowIndex ) {
2022-07-22 08:55:14 +00:00
SColumnInfoData * pColInfo = taosArrayGet ( pBlock - > pDataBlock , groupColIndex ) ;
uint64_t * groupCol = ( uint64_t * ) pColInfo - > pData ;
2022-07-02 07:28:21 +00:00
ASSERT ( rowIndex < pBlock - > info . rows ) ;
2022-07-22 08:55:14 +00:00
pInfo - > groupId = groupCol [ rowIndex ] ;
2022-07-02 07:28:21 +00:00
}
2022-07-06 13:25:34 +00:00
void resetTableScanInfo ( STableScanInfo * pTableScanInfo , STimeWindow * pWin ) {
2022-07-10 02:15:27 +00:00
pTableScanInfo - > cond . twindows = * pWin ;
2022-07-06 13:25:34 +00:00
pTableScanInfo - > scanTimes = 0 ;
pTableScanInfo - > currentGroupId = - 1 ;
}
static bool prepareRangeScan ( SStreamScanInfo * pInfo , SSDataBlock * pBlock , int32_t * pRowIndex ) {
if ( ( * pRowIndex ) = = pBlock - > info . rows ) {
return false ;
}
ASSERT ( taosArrayGetSize ( pBlock - > pDataBlock ) > = 3 ) ;
SColumnInfoData * pStartTsCol = taosArrayGet ( pBlock - > pDataBlock , START_TS_COLUMN_INDEX ) ;
TSKEY * startData = ( TSKEY * ) pStartTsCol - > pData ;
SColumnInfoData * pEndTsCol = taosArrayGet ( pBlock - > pDataBlock , END_TS_COLUMN_INDEX ) ;
TSKEY * endData = ( TSKEY * ) pEndTsCol - > pData ;
STimeWindow win = { . skey = startData [ * pRowIndex ] , . ekey = endData [ * pRowIndex ] } ;
2022-07-22 08:55:14 +00:00
SColumnInfoData * pCalStartTsCol = taosArrayGet ( pBlock - > pDataBlock , CALCULATE_START_TS_COLUMN_INDEX ) ;
TSKEY * calStartData = ( TSKEY * ) pCalStartTsCol - > pData ;
SColumnInfoData * pCalEndTsCol = taosArrayGet ( pBlock - > pDataBlock , CALCULATE_END_TS_COLUMN_INDEX ) ;
TSKEY * calEndData = ( TSKEY * ) pCalEndTsCol - > pData ;
2022-07-06 13:25:34 +00:00
setGroupId ( pInfo , pBlock , GROUPID_COLUMN_INDEX , * pRowIndex ) ;
2022-07-22 08:55:14 +00:00
if ( isSlidingWindow ( pInfo ) ) {
pInfo - > updateWin . skey = calStartData [ * pRowIndex ] ;
pInfo - > updateWin . ekey = calEndData [ * pRowIndex ] ;
}
2022-07-06 13:25:34 +00:00
( * pRowIndex ) + + ;
for ( ; * pRowIndex < pBlock - > info . rows ; ( * pRowIndex ) + + ) {
if ( win . skey = = startData [ * pRowIndex ] ) {
win . ekey = TMAX ( win . ekey , endData [ * pRowIndex ] ) ;
continue ;
}
if ( win . skey = = endData [ * pRowIndex ] ) {
win . skey = TMIN ( win . skey , startData [ * pRowIndex ] ) ;
continue ;
}
2022-07-22 08:55:14 +00:00
ASSERT ( ! ( win . skey > startData [ * pRowIndex ] & & win . ekey < endData [ * pRowIndex ] ) | |
! ( isInTimeWindow ( & win , startData [ * pRowIndex ] , 0 ) | | isInTimeWindow ( & win , endData [ * pRowIndex ] , 0 ) ) ) ;
2022-07-06 13:25:34 +00:00
break ;
}
resetTableScanInfo ( pInfo - > pTableScanOp - > info , & win ) ;
2022-07-14 11:29:23 +00:00
pInfo - > pTableScanOp - > status = OP_OPENED ;
2022-07-06 13:25:34 +00:00
return true ;
}
2022-07-14 07:32:21 +00:00
static STimeWindow getSlidingWindow ( TSKEY * tsCol , SInterval * pInterval , SDataBlockInfo * pDataBlockInfo ,
int32_t * pRowIndex ) {
SResultRowInfo dumyInfo ;
2022-07-12 07:36:48 +00:00
dumyInfo . cur . pageId = - 1 ;
2022-07-14 07:32:21 +00:00
STimeWindow win = getActiveTimeWindow ( NULL , & dumyInfo , tsCol [ * pRowIndex ] , pInterval , TSDB_ORDER_ASC ) ;
2022-07-12 07:36:48 +00:00
STimeWindow endWin = win ;
STimeWindow preWin = win ;
while ( 1 ) {
2022-07-14 07:32:21 +00:00
( * pRowIndex ) + = getNumOfRowsInTimeWindow ( pDataBlockInfo , tsCol , * pRowIndex , endWin . ekey , binarySearchForKey , NULL ,
TSDB_ORDER_ASC ) ;
2022-07-12 07:36:48 +00:00
do {
preWin = endWin ;
getNextTimeWindow ( pInterval , & endWin , TSDB_ORDER_ASC ) ;
} while ( tsCol [ ( * pRowIndex ) - 1 ] > = endWin . skey ) ;
endWin = preWin ;
2022-07-14 07:32:21 +00:00
if ( win . ekey = = endWin . ekey | | ( * pRowIndex ) = = pDataBlockInfo - > rows ) {
2022-07-12 07:36:48 +00:00
win . ekey = endWin . ekey ;
return win ;
}
win . ekey = endWin . ekey ;
}
}
2022-05-10 07:34:41 +00:00
2022-07-06 13:25:34 +00:00
static SSDataBlock * doRangeScan ( SStreamScanInfo * pInfo , SSDataBlock * pSDB , int32_t tsColIndex , int32_t * pRowIndex ) {
while ( 1 ) {
SSDataBlock * pResult = NULL ;
pResult = doTableScan ( pInfo - > pTableScanOp ) ;
if ( ! pResult & & prepareRangeScan ( pInfo , pSDB , pRowIndex ) ) {
// scan next window data
pResult = doTableScan ( pInfo - > pTableScanOp ) ;
}
if ( ! pResult ) {
blockDataCleanup ( pSDB ) ;
* pRowIndex = 0 ;
2022-07-12 07:36:48 +00:00
pInfo - > updateWin = ( STimeWindow ) { . skey = INT64_MIN , . ekey = INT64_MAX } ;
2022-07-22 02:45:11 +00:00
STableScanInfo * pTableScanInfo = pInfo - > pTableScanOp - > info ;
tsdbReaderClose ( pTableScanInfo - > dataReader ) ;
pTableScanInfo - > dataReader = NULL ;
2022-06-15 02:44:36 +00:00
return NULL ;
}
2022-06-20 06:29:18 +00:00
2022-06-15 02:44:36 +00:00
if ( pResult - > info . groupId = = pInfo - > groupId ) {
2022-07-12 07:36:48 +00:00
pResult - > info . calWin = pInfo - > updateWin ;
2022-06-15 02:44:36 +00:00
return pResult ;
2022-05-05 11:50:11 +00:00
}
}
2022-06-15 02:44:36 +00:00
}
2022-07-05 09:53:52 +00:00
2022-07-22 08:55:14 +00:00
static int32_t generateSessionScanRange ( SStreamScanInfo * pInfo , SSDataBlock * pSrcBlock , SSDataBlock * pDestBlock ) {
if ( pSrcBlock - > info . rows = = 0 ) {
return TSDB_CODE_SUCCESS ;
2022-07-05 09:53:52 +00:00
}
2022-07-22 08:55:14 +00:00
blockDataCleanup ( pDestBlock ) ;
int32_t code = blockDataEnsureCapacity ( pDestBlock , pSrcBlock - > info . rows ) ;
2022-07-23 12:07:16 +00:00
if ( code ! = TSDB_CODE_SUCCESS ) {
2022-07-22 08:55:14 +00:00
return code ;
2022-07-06 13:25:34 +00:00
}
2022-07-22 08:55:14 +00:00
ASSERT ( taosArrayGetSize ( pSrcBlock - > pDataBlock ) > = 3 ) ;
SColumnInfoData * pStartTsCol = taosArrayGet ( pSrcBlock - > pDataBlock , START_TS_COLUMN_INDEX ) ;
2022-07-06 13:25:34 +00:00
TSKEY * startData = ( TSKEY * ) pStartTsCol - > pData ;
2022-07-22 08:55:14 +00:00
SColumnInfoData * pEndTsCol = taosArrayGet ( pSrcBlock - > pDataBlock , END_TS_COLUMN_INDEX ) ;
2022-07-06 13:25:34 +00:00
TSKEY * endData = ( TSKEY * ) pEndTsCol - > pData ;
2022-07-22 08:55:14 +00:00
SColumnInfoData * pUidCol = taosArrayGet ( pSrcBlock - > pDataBlock , UID_COLUMN_INDEX ) ;
uint64_t * uidCol = ( uint64_t * ) pUidCol - > pData ;
2022-07-06 13:25:34 +00:00
2022-07-22 08:55:14 +00:00
SColumnInfoData * pDestStartCol = taosArrayGet ( pDestBlock - > pDataBlock , START_TS_COLUMN_INDEX ) ;
SColumnInfoData * pDestEndCol = taosArrayGet ( pDestBlock - > pDataBlock , END_TS_COLUMN_INDEX ) ;
SColumnInfoData * pDestGpCol = taosArrayGet ( pDestBlock - > pDataBlock , GROUPID_COLUMN_INDEX ) ;
2022-07-06 13:25:34 +00:00
int32_t dummy = 0 ;
2022-07-22 08:55:14 +00:00
for ( int32_t i = 0 ; i < pSrcBlock - > info . rows ; i + + ) {
uint64_t groupId = getGroupId ( pInfo - > pTableScanOp , uidCol [ i ] ) ;
2022-07-06 13:25:34 +00:00
// gap must be 0.
SResultWindowInfo * pStartWin =
getCurSessionWindow ( pInfo - > sessionSup . pStreamAggSup , startData [ i ] , endData [ i ] , groupId , 0 , & dummy ) ;
if ( ! pStartWin ) {
// window has been closed.
continue ;
}
SResultWindowInfo * pEndWin =
getCurSessionWindow ( pInfo - > sessionSup . pStreamAggSup , endData [ i ] , endData [ i ] , groupId , 0 , & dummy ) ;
ASSERT ( pEndWin ) ;
colDataAppend ( pDestStartCol , i , ( const char * ) & pStartWin - > win . skey , false ) ;
colDataAppend ( pDestEndCol , i , ( const char * ) & pEndWin - > win . ekey , false ) ;
colDataAppend ( pDestGpCol , i , ( const char * ) & groupId , false ) ;
2022-07-22 08:55:14 +00:00
pDestBlock - > info . rows + + ;
2022-07-06 13:25:34 +00:00
}
2022-07-22 08:55:14 +00:00
return TSDB_CODE_SUCCESS ;
2022-07-06 13:25:34 +00:00
}
2022-07-22 08:55:14 +00:00
static int32_t generateIntervalScanRange ( SStreamScanInfo * pInfo , SSDataBlock * pSrcBlock , SSDataBlock * pDestBlock ) {
blockDataCleanup ( pDestBlock ) ;
int32_t rows = pSrcBlock - > info . rows ;
if ( rows = = 0 ) {
return TSDB_CODE_SUCCESS ;
2022-06-15 02:44:36 +00:00
}
2022-07-22 08:55:14 +00:00
int32_t code = blockDataEnsureCapacity ( pDestBlock , rows ) ;
if ( code ! = TSDB_CODE_SUCCESS ) {
return code ;
}
SColumnInfoData * pTsCol = ( SColumnInfoData * ) taosArrayGet ( pSrcBlock - > pDataBlock , START_TS_COLUMN_INDEX ) ;
SColumnInfoData * pUidCol = taosArrayGet ( pSrcBlock - > pDataBlock , UID_COLUMN_INDEX ) ;
2022-07-23 12:07:16 +00:00
uint64_t * uidCol = ( uint64_t * ) pUidCol - > pData ;
2022-07-22 08:55:14 +00:00
ASSERT ( pTsCol - > info . type = = TSDB_DATA_TYPE_TIMESTAMP ) ;
2022-07-23 12:07:16 +00:00
TSKEY * tsCol = ( TSKEY * ) pTsCol - > pData ;
2022-07-22 08:55:14 +00:00
SColumnInfoData * pStartTsCol = taosArrayGet ( pDestBlock - > pDataBlock , START_TS_COLUMN_INDEX ) ;
SColumnInfoData * pEndTsCol = taosArrayGet ( pDestBlock - > pDataBlock , END_TS_COLUMN_INDEX ) ;
SColumnInfoData * pGpCol = taosArrayGet ( pDestBlock - > pDataBlock , GROUPID_COLUMN_INDEX ) ;
SColumnInfoData * pCalStartTsCol = taosArrayGet ( pDestBlock - > pDataBlock , CALCULATE_START_TS_COLUMN_INDEX ) ;
SColumnInfoData * pCalEndTsCol = taosArrayGet ( pDestBlock - > pDataBlock , CALCULATE_END_TS_COLUMN_INDEX ) ;
2022-07-23 12:07:16 +00:00
uint64_t groupId = getGroupId ( pInfo - > pTableScanOp , uidCol [ 0 ] ) ;
for ( int32_t i = 0 ; i < rows ; ) {
2022-07-22 08:55:14 +00:00
colDataAppend ( pCalStartTsCol , pDestBlock - > info . rows , ( const char * ) ( tsCol + i ) , false ) ;
STimeWindow win = getSlidingWindow ( tsCol , & pInfo - > interval , & pSrcBlock - > info , & i ) ;
colDataAppend ( pCalEndTsCol , pDestBlock - > info . rows , ( const char * ) ( tsCol + i - 1 ) , false ) ;
colDataAppend ( pStartTsCol , pDestBlock - > info . rows , ( const char * ) ( & win . skey ) , false ) ;
colDataAppend ( pEndTsCol , pDestBlock - > info . rows , ( const char * ) ( & win . ekey ) , false ) ;
colDataAppend ( pGpCol , pDestBlock - > info . rows , ( const char * ) ( & groupId ) , false ) ;
pDestBlock - > info . rows + + ;
2022-05-05 11:50:11 +00:00
}
2022-07-22 08:55:14 +00:00
// all rows have same group id
pDestBlock - > info . groupId = groupId ;
return TSDB_CODE_SUCCESS ;
}
2022-07-05 09:53:52 +00:00
2022-07-22 08:55:14 +00:00
static int32_t generateScanRange ( SStreamScanInfo * pInfo , SSDataBlock * pSrcBlock , SSDataBlock * pDestBlock ) {
int32_t code = TSDB_CODE_SUCCESS ;
if ( isIntervalWindow ( pInfo ) ) {
code = generateIntervalScanRange ( pInfo , pSrcBlock , pDestBlock ) ;
} else {
code = generateSessionScanRange ( pInfo , pSrcBlock , pDestBlock ) ;
2022-07-05 09:53:52 +00:00
}
2022-07-22 08:55:14 +00:00
pDestBlock - > info . type = STREAM_CLEAR ;
blockDataUpdateTsWindow ( pDestBlock , 0 ) ;
return code ;
}
void appendOneRow ( SSDataBlock * pBlock , TSKEY * pStartTs , TSKEY * pEndTs , uint64_t * pUid ) {
SColumnInfoData * pStartTsCol = taosArrayGet ( pBlock - > pDataBlock , START_TS_COLUMN_INDEX ) ;
SColumnInfoData * pEndTsCol = taosArrayGet ( pBlock - > pDataBlock , END_TS_COLUMN_INDEX ) ;
SColumnInfoData * pUidCol = taosArrayGet ( pBlock - > pDataBlock , UID_COLUMN_INDEX ) ;
colDataAppend ( pStartTsCol , pBlock - > info . rows , ( const char * ) pStartTs , false ) ;
colDataAppend ( pEndTsCol , pBlock - > info . rows , ( const char * ) pEndTs , false ) ;
colDataAppend ( pUidCol , pBlock - > info . rows , ( const char * ) pUid , false ) ;
pBlock - > info . rows + + ;
2022-05-05 11:50:11 +00:00
}
2022-07-06 06:20:07 +00:00
static void checkUpdateData ( SStreamScanInfo * pInfo , bool invertible , SSDataBlock * pBlock , bool out ) {
2022-07-22 08:55:14 +00:00
if ( out ) {
blockDataCleanup ( pInfo - > pUpdateDataRes ) ;
blockDataEnsureCapacity ( pInfo - > pUpdateDataRes , pBlock - > info . rows ) ;
}
2022-06-15 02:44:36 +00:00
SColumnInfoData * pColDataInfo = taosArrayGet ( pBlock - > pDataBlock , pInfo - > primaryTsIndex ) ;
ASSERT ( pColDataInfo - > info . type = = TSDB_DATA_TYPE_TIMESTAMP ) ;
2022-07-16 01:28:15 +00:00
TSKEY * tsCol = ( TSKEY * ) pColDataInfo - > pData ;
2022-06-15 02:44:36 +00:00
for ( int32_t rowId = 0 ; rowId < pBlock - > info . rows ; rowId + + ) {
2022-07-16 01:28:15 +00:00
SResultRowInfo dumyInfo ;
dumyInfo . cur . pageId = - 1 ;
STimeWindow win = getActiveTimeWindow ( NULL , & dumyInfo , tsCol [ rowId ] , & pInfo - > interval , TSDB_ORDER_ASC ) ;
// must check update info first.
bool update = updateInfoIsUpdated ( pInfo - > pUpdateInfo , pBlock - > info . uid , tsCol [ rowId ] ) ;
2022-08-01 08:52:37 +00:00
if ( ( update | | ( isSignleIntervalWindow ( pInfo ) & & isCloseWindow ( & win , & pInfo - > twAggSup ) & &
isDeletedWindow ( & win , pBlock - > info . groupId , pInfo - > sessionSup . pIntervalAggSup ) ) ) & & out ) {
2022-07-22 08:55:14 +00:00
appendOneRow ( pInfo - > pUpdateDataRes , tsCol + rowId , tsCol + rowId , & pBlock - > info . uid ) ;
2022-06-15 02:44:36 +00:00
}
}
2022-07-22 08:55:14 +00:00
if ( out ) {
blockDataUpdateTsWindow ( pInfo - > pUpdateDataRes , 0 ) ;
pInfo - > pUpdateDataRes - > info . type = STREAM_CLEAR ;
}
2022-07-05 09:53:52 +00:00
}
static void setBlockGroupId ( SOperatorInfo * pOperator , SSDataBlock * pBlock , int32_t uidColIndex ) {
ASSERT ( taosArrayGetSize ( pBlock - > pDataBlock ) > = 3 ) ;
SColumnInfoData * pColDataInfo = taosArrayGet ( pBlock - > pDataBlock , uidColIndex ) ;
uint64_t * uidCol = ( uint64_t * ) pColDataInfo - > pData ;
ASSERT ( pBlock - > info . rows > 0 ) ;
2022-07-06 06:20:07 +00:00
for ( int32_t i = 0 ; i < pBlock - > info . rows ; i + + ) {
2022-07-05 09:53:52 +00:00
uidCol [ i ] = getGroupId ( pOperator , uidCol [ i ] ) ;
2022-05-05 11:50:11 +00:00
}
}
2022-07-10 12:48:02 +00:00
2022-07-08 09:48:34 +00:00
static int32_t setBlockIntoRes ( SStreamScanInfo * pInfo , const SSDataBlock * pBlock ) {
SDataBlockInfo * pBlockInfo = & pInfo - > pRes - > info ;
SOperatorInfo * pOperator = pInfo - > pStreamScanOp ;
SExecTaskInfo * pTaskInfo = pInfo - > pStreamScanOp - > pTaskInfo ;
2022-07-13 07:06:27 +00:00
blockDataEnsureCapacity ( pInfo - > pRes , pBlock - > info . rows ) ;
2022-07-08 09:48:34 +00:00
pInfo - > pRes - > info . rows = pBlock - > info . rows ;
pInfo - > pRes - > info . uid = pBlock - > info . uid ;
pInfo - > pRes - > info . type = STREAM_NORMAL ;
2022-07-22 09:39:59 +00:00
pInfo - > pRes - > info . version = pBlock - > info . version ;
2022-07-08 09:48:34 +00:00
uint64_t * groupIdPre = taosHashGet ( pOperator - > pTaskInfo - > tableqinfoList . map , & pBlock - > info . uid , sizeof ( int64_t ) ) ;
if ( groupIdPre ) {
pInfo - > pRes - > info . groupId = * groupIdPre ;
} else {
pInfo - > pRes - > info . groupId = 0 ;
}
// todo extract method
for ( int32_t i = 0 ; i < taosArrayGetSize ( pInfo - > pColMatchInfo ) ; + + i ) {
SColMatchInfo * pColMatchInfo = taosArrayGet ( pInfo - > pColMatchInfo , i ) ;
if ( ! pColMatchInfo - > output ) {
continue ;
}
bool colExists = false ;
for ( int32_t j = 0 ; j < blockDataGetNumOfCols ( pBlock ) ; + + j ) {
SColumnInfoData * pResCol = bdGetColumnInfoData ( pBlock , j ) ;
if ( pResCol - > info . colId = = pColMatchInfo - > colId ) {
2022-07-13 11:58:07 +00:00
SColumnInfoData * pDst = taosArrayGet ( pInfo - > pRes - > pDataBlock , pColMatchInfo - > targetSlotId ) ;
colDataAssign ( pDst , pResCol , pBlock - > info . rows , & pInfo - > pRes - > info ) ;
2022-07-08 09:48:34 +00:00
colExists = true ;
break ;
}
}
// the required column does not exists in submit block, let's set it to be all null value
if ( ! colExists ) {
SColumnInfoData * pDst = taosArrayGet ( pInfo - > pRes - > pDataBlock , pColMatchInfo - > targetSlotId ) ;
colDataAppendNNULL ( pDst , 0 , pBlockInfo - > rows ) ;
}
}
// currently only the tbname pseudo column
if ( pInfo - > numOfPseudoExpr > 0 ) {
2022-07-10 05:21:37 +00:00
int32_t code = addTagPseudoColumnData ( & pInfo - > readHandle , pInfo - > pPseudoExpr , pInfo - > numOfPseudoExpr , pInfo - > pRes ,
GET_TASKID ( pTaskInfo ) ) ;
2022-07-09 04:13:21 +00:00
if ( code ! = TSDB_CODE_SUCCESS ) {
2022-07-14 09:34:06 +00:00
blockDataFreeRes ( ( SSDataBlock * ) pBlock ) ;
2022-07-09 04:13:21 +00:00
longjmp ( pTaskInfo - > env , code ) ;
}
2022-07-08 09:48:34 +00:00
}
2022-07-22 15:52:48 +00:00
doFilter ( pInfo - > pCondition , pInfo - > pRes , NULL ) ;
2022-07-08 09:48:34 +00:00
blockDataUpdateTsWindow ( pInfo - > pRes , pInfo - > primaryTsIndex ) ;
2022-07-14 09:34:06 +00:00
blockDataFreeRes ( ( SSDataBlock * ) pBlock ) ;
2022-07-08 09:48:34 +00:00
return 0 ;
}
2022-05-05 11:50:11 +00:00
2022-07-06 06:20:07 +00:00
static SSDataBlock * doStreamScan ( SOperatorInfo * pOperator ) {
2022-04-04 06:54:39 +00:00
// NOTE: this operator does never check if current status is done or not
2022-07-06 06:20:07 +00:00
SExecTaskInfo * pTaskInfo = pOperator - > pTaskInfo ;
SStreamScanInfo * pInfo = pOperator - > info ;
2022-04-04 06:54:39 +00:00
2022-07-12 06:10:22 +00:00
qDebug ( " stream scan called " ) ;
2022-07-08 09:48:34 +00:00
if ( pTaskInfo - > streamInfo . prepareStatus . type = = TMQ_OFFSET__LOG ) {
while ( 1 ) {
SFetchRet ret = { 0 } ;
tqNextBlock ( pInfo - > tqReader , & ret ) ;
if ( ret . fetchType = = FETCH_TYPE__DATA ) {
blockDataCleanup ( pInfo - > pRes ) ;
if ( setBlockIntoRes ( pInfo , & ret . data ) < 0 ) {
ASSERT ( 0 ) ;
}
2022-07-10 12:48:02 +00:00
// TODO clean data block
2022-07-08 09:48:34 +00:00
if ( pInfo - > pRes - > info . rows > 0 ) {
2022-07-12 09:28:14 +00:00
qDebug ( " stream scan log return %d rows " , pInfo - > pRes - > info . rows ) ;
2022-07-08 09:48:34 +00:00
return pInfo - > pRes ;
}
} else if ( ret . fetchType = = FETCH_TYPE__META ) {
ASSERT ( 0 ) ;
pTaskInfo - > streamInfo . lastStatus = ret . offset ;
pTaskInfo - > streamInfo . metaBlk = ret . meta ;
return NULL ;
} else if ( ret . fetchType = = FETCH_TYPE__NONE ) {
2022-07-10 03:18:15 +00:00
pTaskInfo - > streamInfo . lastStatus = ret . offset ;
2022-07-23 12:07:16 +00:00
ASSERT ( pTaskInfo - > streamInfo . lastStatus . version > = pTaskInfo - > streamInfo . prepareStatus . version ) ;
ASSERT ( pTaskInfo - > streamInfo . lastStatus . version + 1 = = pInfo - > tqReader - > pWalReader - > curVersion ) ;
char formatBuf [ 80 ] ;
tFormatOffset ( formatBuf , 80 , & ret . offset ) ;
qDebug ( " stream scan log return null, offset %s " , formatBuf ) ;
2022-07-08 09:48:34 +00:00
return NULL ;
} else {
ASSERT ( 0 ) ;
}
}
2022-07-10 03:18:15 +00:00
} else if ( pTaskInfo - > streamInfo . prepareStatus . type = = TMQ_OFFSET__SNAPSHOT_DATA ) {
SSDataBlock * pResult = doTableScan ( pInfo - > pTableScanOp ) ;
2022-07-12 09:28:14 +00:00
if ( pResult & & pResult - > info . rows > 0 ) {
qDebug ( " stream scan tsdb return %d rows " , pResult - > info . rows ) ;
return pResult ;
}
qDebug ( " stream scan tsdb return null " ) ;
return NULL ;
2022-07-10 12:48:02 +00:00
} else if ( pTaskInfo - > streamInfo . prepareStatus . type = = TMQ_OFFSET__SNAPSHOT_META ) {
// TODO scan meta
ASSERT ( 0 ) ;
return NULL ;
2022-04-04 06:54:39 +00:00
}
2022-07-15 09:48:48 +00:00
if ( pTaskInfo - > streamInfo . recoverStep = = STREAM_RECOVER_STEP__PREPARE ) {
STableScanInfo * pTSInfo = pInfo - > pTableScanOp - > info ;
memcpy ( & pTSInfo - > cond , & pTaskInfo - > streamInfo . tableCond , sizeof ( SQueryTableDataCond ) ) ;
pTSInfo - > scanTimes = 0 ;
pTSInfo - > currentGroupId = - 1 ;
pTaskInfo - > streamInfo . recoverStep = STREAM_RECOVER_STEP__SCAN ;
}
if ( pTaskInfo - > streamInfo . recoverStep = = STREAM_RECOVER_STEP__SCAN ) {
SSDataBlock * pBlock = doTableScan ( pInfo - > pTableScanOp ) ;
if ( pBlock ! = NULL ) {
return pBlock ;
}
// TODO fill in bloom filter
pTaskInfo - > streamInfo . recoverStep = STREAM_RECOVER_STEP__NONE ;
return NULL ;
}
2022-05-05 11:50:11 +00:00
size_t total = taosArrayGetSize ( pInfo - > pBlockLists ) ;
2022-06-22 13:21:39 +00:00
// TODO: refactor
2022-06-29 12:57:15 +00:00
if ( pInfo - > blockType = = STREAM_INPUT__DATA_BLOCK ) {
2022-04-04 06:54:39 +00:00
if ( pInfo - > validBlockIndex > = total ) {
2022-06-09 03:45:06 +00:00
/*doClearBufferedBlocks(pInfo);*/
2022-07-08 09:48:34 +00:00
/*pOperator->status = OP_EXEC_DONE;*/
2022-04-04 06:54:39 +00:00
return NULL ;
}
2022-06-14 10:17:18 +00:00
int32_t current = pInfo - > validBlockIndex + + ;
2022-06-10 07:54:20 +00:00
SSDataBlock * pBlock = taosArrayGetP ( pInfo - > pBlockLists , current ) ;
2022-07-06 06:20:07 +00:00
// TODO move into scan
2022-07-12 07:36:48 +00:00
pBlock - > info . calWin . skey = INT64_MIN ;
pBlock - > info . calWin . ekey = INT64_MAX ;
2022-06-10 07:54:20 +00:00
blockDataUpdateTsWindow ( pBlock , 0 ) ;
2022-07-05 09:53:52 +00:00
switch ( pBlock - > info . type ) {
2022-07-12 06:10:22 +00:00
case STREAM_NORMAL :
case STREAM_GET_ALL :
return pBlock ;
2022-07-06 06:20:07 +00:00
case STREAM_RETRIEVE : {
pInfo - > blockType = STREAM_INPUT__DATA_SUBMIT ;
pInfo - > scanMode = STREAM_SCAN_FROM_DATAREADER_RETRIEVE ;
2022-07-22 08:55:14 +00:00
copyDataBlock ( pInfo - > pUpdateRes , pBlock ) ;
prepareRangeScan ( pInfo , pInfo - > pUpdateRes , & pInfo - > updateResIndex ) ;
2022-07-06 06:20:07 +00:00
updateInfoAddCloseWindowSBF ( pInfo - > pUpdateInfo ) ;
} break ;
case STREAM_DELETE_DATA : {
pInfo - > blockType = STREAM_INPUT__DATA_SUBMIT ;
pInfo - > updateResIndex = 0 ;
2022-07-22 08:55:14 +00:00
generateScanRange ( pInfo , pBlock , pInfo - > pUpdateRes ) ;
prepareRangeScan ( pInfo , pInfo - > pUpdateRes , & pInfo - > updateResIndex ) ;
copyDataBlock ( pInfo - > pDeleteDataRes , pInfo - > pUpdateRes ) ;
pInfo - > scanMode = STREAM_SCAN_FROM_DATAREADER_RANGE ;
return pInfo - > pDeleteDataRes ;
2022-07-06 06:20:07 +00:00
} break ;
default :
break ;
2022-06-25 08:12:00 +00:00
}
2022-06-10 07:54:20 +00:00
return pBlock ;
2022-06-29 12:57:15 +00:00
} else if ( pInfo - > blockType = = STREAM_INPUT__DATA_SUBMIT ) {
2022-07-12 09:28:14 +00:00
qDebug ( " scan mode %d " , pInfo - > scanMode ) ;
2022-07-22 11:20:22 +00:00
switch ( pInfo - > scanMode ) {
case STREAM_SCAN_FROM_RES : {
blockDataDestroy ( pInfo - > pUpdateRes ) ;
pInfo - > scanMode = STREAM_SCAN_FROM_READERHANDLE ;
return pInfo - > pRes ;
} break ;
case STREAM_SCAN_FROM_UPDATERES : {
generateScanRange ( pInfo , pInfo - > pUpdateDataRes , pInfo - > pUpdateRes ) ;
prepareRangeScan ( pInfo , pInfo - > pUpdateRes , & pInfo - > updateResIndex ) ;
pInfo - > scanMode = STREAM_SCAN_FROM_DATAREADER_RANGE ;
return pInfo - > pUpdateRes ;
} break ;
case STREAM_SCAN_FROM_DATAREADER_RANGE :
case STREAM_SCAN_FROM_DATAREADER_RETRIEVE : {
SSDataBlock * pSDB = doRangeScan ( pInfo , pInfo - > pUpdateRes , pInfo - > primaryTsIndex , & pInfo - > updateResIndex ) ;
if ( pSDB ) {
2022-08-01 08:52:37 +00:00
STableScanInfo * pTableScanInfo = pInfo - > pTableScanOp - > info ;
uint64_t version = getReaderMaxVersion ( pTableScanInfo - > dataReader ) ;
updateInfoSetScanRange ( pInfo - > pUpdateInfo , & pTableScanInfo - > cond . twindows , pInfo - > groupId , version ) ;
2022-07-22 11:20:22 +00:00
pSDB - > info . type = pInfo - > scanMode = = STREAM_SCAN_FROM_DATAREADER_RANGE ? STREAM_NORMAL : STREAM_PULL_DATA ;
checkUpdateData ( pInfo , true , pSDB , false ) ;
return pSDB ;
}
pInfo - > scanMode = STREAM_SCAN_FROM_READERHANDLE ;
} break ;
default :
break ;
2022-07-22 08:55:14 +00:00
}
2022-07-23 12:07:16 +00:00
2022-07-22 11:20:22 +00:00
SStreamAggSupporter * pSup = pInfo - > sessionSup . pStreamAggSup ;
if ( isStateWindow ( pInfo ) & & pSup - > pScanBlock - > info . rows > 0 ) {
2022-07-22 08:55:14 +00:00
pInfo - > scanMode = STREAM_SCAN_FROM_DATAREADER_RANGE ;
pInfo - > updateResIndex = 0 ;
2022-07-22 11:20:22 +00:00
copyDataBlock ( pInfo - > pUpdateRes , pSup - > pScanBlock ) ;
blockDataCleanup ( pSup - > pScanBlock ) ;
2022-07-22 08:55:14 +00:00
prepareRangeScan ( pInfo , pInfo - > pUpdateRes , & pInfo - > updateResIndex ) ;
return pInfo - > pUpdateRes ;
2022-05-05 11:50:11 +00:00
}
2022-05-10 07:34:41 +00:00
2022-04-04 06:54:39 +00:00
SDataBlockInfo * pBlockInfo = & pInfo - > pRes - > info ;
2022-07-19 07:52:08 +00:00
int32_t totBlockNum = taosArrayGetSize ( pInfo - > pBlockLists ) ;
2022-05-06 15:40:26 +00:00
2022-07-19 07:52:08 +00:00
while ( 1 ) {
if ( pInfo - > tqReader - > pMsg = = NULL ) {
if ( pInfo - > validBlockIndex > = totBlockNum ) {
return NULL ;
}
2022-06-25 12:02:57 +00:00
2022-07-19 07:52:08 +00:00
int32_t current = pInfo - > validBlockIndex + + ;
SSubmitReq * pSubmit = taosArrayGetP ( pInfo - > pBlockLists , current ) ;
if ( tqReaderSetDataMsg ( pInfo - > tqReader , pSubmit , 0 ) < 0 ) {
qError ( " submit msg messed up when initing stream submit block %p, current %d, total %d " , pSubmit , current ,
totBlockNum ) ;
pInfo - > tqReader - > pMsg = NULL ;
continue ;
}
2022-04-04 06:54:39 +00:00
}
2022-07-19 07:52:08 +00:00
blockDataCleanup ( pInfo - > pRes ) ;
while ( tqNextDataBlock ( pInfo - > tqReader ) ) {
SSDataBlock block = { 0 } ;
2022-05-28 09:28:47 +00:00
2022-07-19 07:52:08 +00:00
int32_t code = tqRetrieveDataBlock ( & block , pInfo - > tqReader ) ;
if ( code ! = TSDB_CODE_SUCCESS | | block . info . rows = = 0 ) {
continue ;
}
setBlockIntoRes ( pInfo , & block ) ;
2022-08-01 08:52:37 +00:00
if ( updateInfoIgnore ( pInfo - > pUpdateInfo , & pInfo - > pRes - > info . window , pInfo - > pRes - > info . groupId , pInfo - > pRes - > info . version ) ) {
printDataBlock ( pInfo - > pRes , " stream scan ignore " ) ;
blockDataCleanup ( pInfo - > pRes ) ;
continue ;
}
2022-07-19 07:52:08 +00:00
if ( pBlockInfo - > rows > 0 ) {
break ;
}
}
2022-06-21 10:10:36 +00:00
if ( pBlockInfo - > rows > 0 ) {
break ;
2022-07-19 08:54:19 +00:00
} else {
pInfo - > tqReader - > pMsg = NULL ;
2022-07-19 10:29:12 +00:00
continue ;
2022-06-21 10:10:36 +00:00
}
2022-07-19 07:52:08 +00:00
/*blockDataCleanup(pInfo->pRes);*/
2022-04-04 06:54:39 +00:00
}
// record the scan action.
pInfo - > numOfExec + + ;
2022-05-27 02:03:45 +00:00
pOperator - > resultInfo . totalRows + = pBlockInfo - > rows ;
2022-08-01 08:52:37 +00:00
printDataBlock ( pInfo - > pRes , " stream scan " ) ;
2022-04-04 06:54:39 +00:00
2022-06-21 10:10:36 +00:00
if ( pBlockInfo - > rows = = 0 ) {
2022-06-25 08:12:00 +00:00
updateInfoDestoryColseWinSBF ( pInfo - > pUpdateInfo ) ;
2022-07-08 09:48:34 +00:00
/*pOperator->status = OP_EXEC_DONE;*/
2022-05-20 11:34:39 +00:00
} else if ( pInfo - > pUpdateInfo ) {
2022-07-05 09:53:52 +00:00
checkUpdateData ( pInfo , true , pInfo - > pRes , true ) ;
2022-07-16 01:28:15 +00:00
pInfo - > twAggSup . maxTs = TMAX ( pInfo - > twAggSup . maxTs , pBlockInfo - > window . ekey ) ;
2022-07-22 08:55:14 +00:00
if ( pInfo - > pUpdateDataRes - > info . rows > 0 ) {
if ( pInfo - > pUpdateDataRes - > info . type = = STREAM_CLEAR ) {
2022-05-10 07:34:41 +00:00
pInfo - > updateResIndex = 0 ;
pInfo - > scanMode = STREAM_SCAN_FROM_UPDATERES ;
2022-07-22 08:55:14 +00:00
} else if ( pInfo - > pUpdateDataRes - > info . type = = STREAM_INVERT ) {
2022-05-10 07:34:41 +00:00
pInfo - > scanMode = STREAM_SCAN_FROM_RES ;
2022-07-22 08:55:14 +00:00
return pInfo - > pUpdateDataRes ;
2022-05-10 07:34:41 +00:00
}
2022-05-05 11:50:11 +00:00
}
2022-04-19 08:11:16 +00:00
}
2022-07-18 12:06:29 +00:00
2022-07-12 09:28:14 +00:00
qDebug ( " scan rows: %d " , pBlockInfo - > rows ) ;
2022-06-21 10:10:36 +00:00
return ( pBlockInfo - > rows = = 0 ) ? NULL : pInfo - > pRes ;
2022-07-06 06:20:07 +00:00
2022-06-23 05:35:24 +00:00
} else {
ASSERT ( 0 ) ;
return NULL ;
2022-04-04 06:54:39 +00:00
}
}
2022-07-10 12:48:02 +00:00
static SSDataBlock * doRawScan ( SOperatorInfo * pInfo ) {
//
return NULL ;
}
2022-06-14 05:36:54 +00:00
static SArray * extractTableIdList ( const STableListInfo * pTableGroupInfo ) {
SArray * tableIdList = taosArrayInit ( 4 , sizeof ( uint64_t ) ) ;
// Transfer the Array of STableKeyInfo into uid list.
for ( int32_t i = 0 ; i < taosArrayGetSize ( pTableGroupInfo - > pTableList ) ; + + i ) {
STableKeyInfo * pkeyInfo = taosArrayGet ( pTableGroupInfo - > pTableList , i ) ;
taosArrayPush ( tableIdList , & pkeyInfo - > uid ) ;
}
return tableIdList ;
}
2022-07-10 12:48:02 +00:00
// for subscribing db or stb (not including column),
// if this scan is used, meta data can be return
// and schemas are decided when scanning
SOperatorInfo * createRawScanOperatorInfo ( SReadHandle * pHandle , STableScanPhysiNode * pTableScanNode ,
SExecTaskInfo * pTaskInfo , STimeWindowAggSupp * pTwSup ) {
// create operator
// create tb reader
// create meta reader
// create tq reader
return NULL ;
}
2022-07-14 07:32:21 +00:00
static void destroyStreamScanOperatorInfo ( void * param , int32_t numOfOutput ) {
SStreamScanInfo * pStreamScan = ( SStreamScanInfo * ) param ;
if ( pStreamScan - > pTableScanOp & & pStreamScan - > pTableScanOp - > info ) {
STableScanInfo * pTableScanInfo = pStreamScan - > pTableScanOp - > info ;
2022-07-22 11:20:22 +00:00
destroyTableScanOperatorInfo ( pTableScanInfo , numOfOutput ) ;
2022-07-23 01:57:27 +00:00
taosMemoryFreeClear ( pStreamScan - > pTableScanOp ) ;
2022-07-14 07:32:21 +00:00
}
if ( pStreamScan - > tqReader ) {
tqCloseReader ( pStreamScan - > tqReader ) ;
}
if ( pStreamScan - > pColMatchInfo ) {
taosArrayDestroy ( pStreamScan - > pColMatchInfo ) ;
}
2022-07-14 09:34:06 +00:00
updateInfoDestroy ( pStreamScan - > pUpdateInfo ) ;
2022-07-14 07:32:21 +00:00
blockDataDestroy ( pStreamScan - > pRes ) ;
blockDataDestroy ( pStreamScan - > pUpdateRes ) ;
blockDataDestroy ( pStreamScan - > pPullDataRes ) ;
blockDataDestroy ( pStreamScan - > pDeleteDataRes ) ;
2022-07-22 11:20:22 +00:00
blockDataDestroy ( pStreamScan - > pUpdateDataRes ) ;
2022-07-14 07:32:21 +00:00
taosArrayDestroy ( pStreamScan - > pBlockLists ) ;
taosMemoryFree ( pStreamScan ) ;
}
2022-07-18 07:31:39 +00:00
SOperatorInfo * createStreamScanOperatorInfo ( SReadHandle * pHandle , STableScanPhysiNode * pTableScanNode , SNode * pTagCond ,
2022-07-23 01:59:37 +00:00
SExecTaskInfo * pTaskInfo ) {
2022-07-06 06:20:07 +00:00
SStreamScanInfo * pInfo = taosMemoryCalloc ( 1 , sizeof ( SStreamScanInfo ) ) ;
SOperatorInfo * pOperator = taosMemoryCalloc ( 1 , sizeof ( SOperatorInfo ) ) ;
2022-06-14 05:36:54 +00:00
2022-04-04 06:54:39 +00:00
if ( pInfo = = NULL | | pOperator = = NULL ) {
terrno = TSDB_CODE_QRY_OUT_OF_MEMORY ;
2022-05-06 15:40:26 +00:00
goto _error ;
2022-04-04 06:54:39 +00:00
}
2022-07-18 12:06:29 +00:00
SScanPhysiNode * pScanPhyNode = & pTableScanNode - > scan ;
2022-05-28 09:28:47 +00:00
SDataBlockDescNode * pDescNode = pScanPhyNode - > node . pOutputDataBlockDesc ;
2022-04-04 06:54:39 +00:00
2022-07-18 07:31:39 +00:00
pInfo - > pTagCond = pTagCond ;
2022-07-22 06:38:28 +00:00
pInfo - > pGroupTags = pTableScanNode - > pGroupTags ;
2022-07-23 01:59:37 +00:00
pInfo - > twAggSup = ( STimeWindowAggSupp ) {
. waterMark = pTableScanNode - > watermark ,
. calTrigger = pTableScanNode - > triggerType ,
. maxTs = INT64_MIN ,
} ;
2022-07-21 05:51:39 +00:00
2022-05-28 09:28:47 +00:00
int32_t numOfCols = 0 ;
2022-06-17 11:01:45 +00:00
pInfo - > pColMatchInfo = extractColMatchInfo ( pScanPhyNode - > pScanCols , pDescNode , & numOfCols , COL_MATCH_FROM_COL_ID ) ;
2022-05-28 09:28:47 +00:00
int32_t numOfOutput = taosArrayGetSize ( pInfo - > pColMatchInfo ) ;
SArray * pColIds = taosArrayInit ( numOfOutput , sizeof ( int16_t ) ) ;
2022-04-21 06:30:37 +00:00
for ( int32_t i = 0 ; i < numOfOutput ; + + i ) {
2022-05-28 09:28:47 +00:00
SColMatchInfo * id = taosArrayGet ( pInfo - > pColMatchInfo , i ) ;
int16_t colId = id - > colId ;
2022-05-07 15:49:29 +00:00
taosArrayPush ( pColIds , & colId ) ;
2022-06-30 08:16:05 +00:00
if ( id - > colId = = PRIMARYKEY_TIMESTAMP_COL_ID ) {
2022-06-04 12:06:07 +00:00
pInfo - > primaryTsIndex = id - > targetSlotId ;
}
2022-04-04 06:54:39 +00:00
}
pInfo - > pBlockLists = taosArrayInit ( 4 , POINTER_BYTES ) ;
if ( pInfo - > pBlockLists = = NULL ) {
2022-05-06 15:40:26 +00:00
terrno = TSDB_CODE_OUT_OF_MEMORY ;
goto _error ;
2022-04-04 06:54:39 +00:00
}
2022-07-19 06:17:53 +00:00
if ( pHandle - > vnode ) {
2022-07-06 13:12:46 +00:00
SOperatorInfo * pTableScanOp = createTableScanOperatorInfo ( pTableScanNode , pHandle , pTaskInfo ) ;
2022-07-10 12:48:02 +00:00
STableScanInfo * pTSInfo = ( STableScanInfo * ) pTableScanOp - > info ;
2022-07-10 08:34:45 +00:00
if ( pHandle - > version > 0 ) {
2022-07-10 12:48:02 +00:00
pTSInfo - > cond . endVersion = pHandle - > version ;
2022-07-10 08:34:45 +00:00
}
2022-06-30 06:41:50 +00:00
SArray * tableList = taosArrayGetP ( pTaskInfo - > tableqinfoList . pGroupList , 0 ) ;
2022-07-06 06:20:07 +00:00
if ( pHandle - > initTableReader ) {
2022-07-10 12:48:02 +00:00
pTSInfo - > scanMode = TABLE_SCAN__TABLE_ORDER ;
pTSInfo - > dataReader = NULL ;
if ( tsdbReaderOpen ( pHandle - > vnode , & pTSInfo - > cond , tableList , & pTSInfo - > dataReader , NULL ) < 0 ) {
2022-07-06 13:12:46 +00:00
ASSERT ( 0 ) ;
}
2022-06-30 06:41:50 +00:00
}
2022-07-07 09:16:12 +00:00
if ( pHandle - > initTqReader ) {
ASSERT ( pHandle - > tqReader = = NULL ) ;
pInfo - > tqReader = tqOpenReader ( pHandle - > vnode ) ;
ASSERT ( pInfo - > tqReader ) ;
2022-07-06 06:20:07 +00:00
} else {
2022-07-07 09:16:12 +00:00
ASSERT ( pHandle - > tqReader ) ;
pInfo - > tqReader = pHandle - > tqReader ;
2022-07-06 06:20:07 +00:00
}
2022-07-29 01:56:03 +00:00
if ( pTSInfo - > pdInfo . interval . interval > 0 ) {
pInfo - > pUpdateInfo = updateInfoInitP ( & pTSInfo - > pdInfo . interval , pInfo - > twAggSup . waterMark ) ;
2022-06-20 06:29:18 +00:00
} else {
pInfo - > pUpdateInfo = NULL ;
}
2022-07-06 06:20:07 +00:00
pInfo - > pTableScanOp = pTableScanOp ;
2022-07-29 01:56:03 +00:00
pInfo - > interval = pTSInfo - > pdInfo . interval ;
2022-06-20 06:29:18 +00:00
2022-06-20 06:40:13 +00:00
pInfo - > readHandle = * pHandle ;
pInfo - > tableUid = pScanPhyNode - > uid ;
2022-06-20 06:29:18 +00:00
// set the extract column id to streamHandle
2022-07-07 09:16:12 +00:00
tqReaderSetColIdList ( pInfo - > tqReader , pColIds ) ;
2022-06-20 06:29:18 +00:00
SArray * tableIdList = extractTableIdList ( & pTaskInfo - > tableqinfoList ) ;
2022-07-07 09:16:12 +00:00
int32_t code = tqReaderSetTbUidList ( pInfo - > tqReader , tableIdList ) ;
2022-06-20 06:29:18 +00:00
if ( code ! = 0 ) {
taosArrayDestroy ( tableIdList ) ;
goto _error ;
}
taosArrayDestroy ( tableIdList ) ;
2022-07-15 09:48:48 +00:00
memcpy ( & pTaskInfo - > streamInfo . tableCond , & pTSInfo - > cond , sizeof ( SQueryTableDataCond ) ) ;
2022-05-05 11:50:11 +00:00
}
2022-05-28 09:28:47 +00:00
// create the pseduo columns info
if ( pTableScanNode - > scan . pScanPseudoCols ! = NULL ) {
pInfo - > pPseudoExpr = createExprInfo ( pTableScanNode - > scan . pScanPseudoCols , NULL , & pInfo - > numOfPseudoExpr ) ;
}
2022-06-07 12:59:44 +00:00
pInfo - > pRes = createResDataBlock ( pDescNode ) ;
2022-07-22 08:55:14 +00:00
pInfo - > pUpdateRes = createSpecialDataBlock ( STREAM_CLEAR ) ;
2022-06-07 12:59:44 +00:00
pInfo - > pCondition = pScanPhyNode - > node . pConditions ;
pInfo - > scanMode = STREAM_SCAN_FROM_READERHANDLE ;
2022-07-16 21:30:20 +00:00
pInfo - > sessionSup =
( SessionWindowSupporter ) { . pStreamAggSup = NULL , . gap = - 1 , . parentType = QUERY_NODE_PHYSICAL_PLAN } ;
2022-06-15 02:44:36 +00:00
pInfo - > groupId = 0 ;
2022-07-22 08:55:14 +00:00
pInfo - > pPullDataRes = createSpecialDataBlock ( STREAM_RETRIEVE ) ;
2022-07-02 02:55:01 +00:00
pInfo - > pStreamScanOp = pOperator ;
2022-07-05 09:53:52 +00:00
pInfo - > deleteDataIndex = 0 ;
2022-07-22 08:55:14 +00:00
pInfo - > pDeleteDataRes = createSpecialDataBlock ( STREAM_DELETE_DATA ) ;
2022-07-12 07:36:48 +00:00
pInfo - > updateWin = ( STimeWindow ) { . skey = INT64_MAX , . ekey = INT64_MAX } ;
2022-07-22 08:55:14 +00:00
pInfo - > pUpdateDataRes = createSpecialDataBlock ( STREAM_CLEAR ) ;
2022-07-27 03:55:19 +00:00
pInfo - > assignBlockUid = pTableScanNode - > assignBlockUid ;
2022-06-20 06:29:18 +00:00
2022-07-06 06:20:07 +00:00
pOperator - > name = " StreamScanOperator " ;
2022-05-07 16:21:17 +00:00
pOperator - > operatorType = QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN ;
2022-06-07 12:59:44 +00:00
pOperator - > blocking = false ;
pOperator - > status = OP_NOT_OPENED ;
pOperator - > info = pInfo ;
2022-06-22 09:21:04 +00:00
pOperator - > exprSupp . numOfExprs = taosArrayGetSize ( pInfo - > pRes - > pDataBlock ) ;
2022-06-07 12:59:44 +00:00
pOperator - > pTaskInfo = pTaskInfo ;
2022-04-04 06:54:39 +00:00
2022-07-14 07:32:21 +00:00
pOperator - > fpSet = createOperatorFpSet ( operatorDummyOpenFn , doStreamScan , NULL , NULL , destroyStreamScanOperatorInfo ,
NULL , NULL , NULL ) ;
2022-05-03 15:23:49 +00:00
2022-04-04 06:54:39 +00:00
return pOperator ;
2022-05-06 15:40:26 +00:00
2022-05-07 16:21:17 +00:00
_error :
2022-05-06 15:40:26 +00:00
taosMemoryFreeClear ( pInfo ) ;
taosMemoryFreeClear ( pOperator ) ;
return NULL ;
2022-04-04 06:54:39 +00:00
}
static void destroySysScanOperator ( void * param , int32_t numOfOutput ) {
SSysTableScanInfo * pInfo = ( SSysTableScanInfo * ) param ;
tsem_destroy ( & pInfo - > ready ) ;
blockDataDestroy ( pInfo - > pRes ) ;
2022-04-20 12:41:53 +00:00
const char * name = tNameGetTableName ( & pInfo - > name ) ;
2022-07-16 08:03:45 +00:00
if ( strncasecmp ( name , TSDB_INS_TABLE_USER_TABLES , TSDB_TABLE_FNAME_LEN ) = = 0 | |
2022-07-16 09:25:05 +00:00
strncasecmp ( name , TSDB_INS_TABLE_USER_TAGS , TSDB_TABLE_FNAME_LEN ) = = 0 | | pInfo - > pCur ! = NULL ) {
2022-04-04 06:54:39 +00:00
metaCloseTbCursor ( pInfo - > pCur ) ;
2022-05-24 15:10:51 +00:00
pInfo - > pCur = NULL ;
2022-04-04 06:54:39 +00:00
}
2022-05-07 07:11:49 +00:00
taosArrayDestroy ( pInfo - > scanCols ) ;
2022-07-05 15:14:16 +00:00
taosMemoryFreeClear ( pInfo - > pUser ) ;
2022-07-08 06:26:53 +00:00
taosMemoryFreeClear ( param ) ;
2022-04-04 06:54:39 +00:00
}
2022-07-02 11:01:16 +00:00
static int32_t getSysTableDbNameColId ( const char * pTable ) {
2022-07-02 11:16:03 +00:00
// if (0 == strcmp(TSDB_INS_TABLE_USER_INDEXES, pTable)) {
// return 1;
// }
2022-07-02 11:01:16 +00:00
return TSDB_INS_USER_STABLES_DBNAME_COLID ;
}
2022-04-04 06:54:39 +00:00
EDealRes getDBNameFromConditionWalker ( SNode * pNode , void * pContext ) {
int32_t code = TSDB_CODE_SUCCESS ;
ENodeType nType = nodeType ( pNode ) ;
switch ( nType ) {
case QUERY_NODE_OPERATOR : {
SOperatorNode * node = ( SOperatorNode * ) pNode ;
if ( OP_TYPE_EQUAL = = node - > opType ) {
* ( int32_t * ) pContext = 1 ;
return DEAL_RES_CONTINUE ;
}
* ( int32_t * ) pContext = 0 ;
return DEAL_RES_IGNORE_CHILD ;
}
case QUERY_NODE_COLUMN : {
if ( 1 ! = * ( int32_t * ) pContext ) {
return DEAL_RES_CONTINUE ;
}
SColumnNode * node = ( SColumnNode * ) pNode ;
2022-07-02 11:01:16 +00:00
if ( getSysTableDbNameColId ( node - > tableName ) = = node - > colId ) {
2022-04-04 06:54:39 +00:00
* ( int32_t * ) pContext = 2 ;
return DEAL_RES_CONTINUE ;
}
* ( int32_t * ) pContext = 0 ;
return DEAL_RES_CONTINUE ;
}
case QUERY_NODE_VALUE : {
if ( 2 ! = * ( int32_t * ) pContext ) {
return DEAL_RES_CONTINUE ;
}
SValueNode * node = ( SValueNode * ) pNode ;
char * dbName = nodesGetValueFromNode ( node ) ;
strncpy ( pContext , varDataVal ( dbName ) , varDataLen ( dbName ) ) ;
* ( ( char * ) pContext + varDataLen ( dbName ) ) = 0 ;
2022-04-13 11:04:25 +00:00
return DEAL_RES_END ; // stop walk
2022-04-04 06:54:39 +00:00
}
default :
break ;
}
return DEAL_RES_CONTINUE ;
}
2022-05-03 15:23:49 +00:00
static void getDBNameFromCondition ( SNode * pCondition , const char * dbName ) {
2022-04-04 06:54:39 +00:00
if ( NULL = = pCondition ) {
return ;
}
2022-05-07 16:21:17 +00:00
nodesWalkExpr ( pCondition , getDBNameFromConditionWalker , ( char * ) dbName ) ;
2022-04-04 06:54:39 +00:00
}
2022-06-29 09:15:08 +00:00
static int32_t loadSysTableCallback ( void * param , SDataBuf * pMsg , int32_t code ) {
2022-04-04 06:54:39 +00:00
SOperatorInfo * operator = ( SOperatorInfo * ) param ;
SSysTableScanInfo * pScanResInfo = ( SSysTableScanInfo * ) operator - > info ;
if ( TSDB_CODE_SUCCESS = = code ) {
pScanResInfo - > pRsp = pMsg - > pData ;
SRetrieveMetaTableRsp * pRsp = pScanResInfo - > pRsp ;
pRsp - > numOfRows = htonl ( pRsp - > numOfRows ) ;
2022-04-21 06:30:37 +00:00
pRsp - > useconds = htobe64 ( pRsp - > useconds ) ;
pRsp - > handle = htobe64 ( pRsp - > handle ) ;
pRsp - > compLen = htonl ( pRsp - > compLen ) ;
2022-04-04 06:54:39 +00:00
} else {
operator - > pTaskInfo - > code = code ;
}
tsem_post ( & pScanResInfo - > ready ) ;
2022-04-06 11:51:28 +00:00
return TSDB_CODE_SUCCESS ;
2022-04-04 06:54:39 +00:00
}
static SSDataBlock * doFilterResult ( SSysTableScanInfo * pInfo ) {
if ( pInfo - > pCondition = = NULL ) {
return pInfo - > pRes - > info . rows = = 0 ? NULL : pInfo - > pRes ;
}
2022-07-22 15:52:48 +00:00
doFilter ( pInfo - > pCondition , pInfo - > pRes , NULL ) ;
2022-04-04 06:54:39 +00:00
return pInfo - > pRes - > info . rows = = 0 ? NULL : pInfo - > pRes ;
}
2022-07-16 06:38:03 +00:00
static SSDataBlock * buildInfoSchemaTableMetaBlock ( char * tableName ) {
2022-05-07 16:21:17 +00:00
size_t size = 0 ;
const SSysTableMeta * pMeta = NULL ;
2022-05-03 15:23:49 +00:00
getInfosDbMeta ( & pMeta , & size ) ;
int32_t index = 0 ;
2022-05-07 16:21:17 +00:00
for ( int32_t i = 0 ; i < size ; + + i ) {
2022-07-16 06:38:03 +00:00
if ( strcmp ( pMeta [ i ] . name , tableName ) = = 0 ) {
2022-05-03 15:23:49 +00:00
index = i ;
break ;
}
}
2022-04-28 07:30:18 +00:00
2022-06-22 09:21:04 +00:00
SSDataBlock * pBlock = createDataBlock ( ) ;
2022-05-07 16:21:17 +00:00
for ( int32_t i = 0 ; i < pMeta [ index ] . colNum ; + + i ) {
2022-06-23 14:05:00 +00:00
SColumnInfoData colInfoData =
createColumnInfoData ( pMeta [ index ] . schema [ i ] . type , pMeta [ index ] . schema [ i ] . bytes , i + 1 ) ;
2022-06-22 09:21:04 +00:00
blockDataAppendColInfo ( pBlock , & colInfoData ) ;
2022-05-03 15:23:49 +00:00
}
2022-04-28 07:30:18 +00:00
return pBlock ;
}
2022-07-24 11:59:19 +00:00
int32_t convertTagDataToStr ( char * str , int type , void * buf , int32_t bufSize , int32_t * len ) {
int32_t n = 0 ;
switch ( type ) {
case TSDB_DATA_TYPE_NULL :
n = sprintf ( str , " null " ) ;
break ;
case TSDB_DATA_TYPE_BOOL :
n = sprintf ( str , ( * ( int8_t * ) buf ) ? " true " : " false " ) ;
break ;
case TSDB_DATA_TYPE_TINYINT :
n = sprintf ( str , " %d " , * ( int8_t * ) buf ) ;
break ;
case TSDB_DATA_TYPE_SMALLINT :
n = sprintf ( str , " %d " , * ( int16_t * ) buf ) ;
break ;
case TSDB_DATA_TYPE_INT :
n = sprintf ( str , " %d " , * ( int32_t * ) buf ) ;
break ;
case TSDB_DATA_TYPE_BIGINT :
case TSDB_DATA_TYPE_TIMESTAMP :
n = sprintf ( str , " % " PRId64 , * ( int64_t * ) buf ) ;
break ;
case TSDB_DATA_TYPE_FLOAT :
n = sprintf ( str , " %.5f " , GET_FLOAT_VAL ( buf ) ) ;
break ;
case TSDB_DATA_TYPE_DOUBLE :
n = sprintf ( str , " %.9f " , GET_DOUBLE_VAL ( buf ) ) ;
break ;
case TSDB_DATA_TYPE_BINARY :
if ( bufSize < 0 ) {
return TSDB_CODE_TSC_INVALID_VALUE ;
}
memcpy ( str , buf , bufSize ) ;
n = bufSize ;
break ;
case TSDB_DATA_TYPE_NCHAR :
if ( bufSize < 0 ) {
return TSDB_CODE_TSC_INVALID_VALUE ;
}
int32_t length = taosUcs4ToMbs ( ( TdUcs4 * ) buf , bufSize , str ) ;
if ( length < = 0 ) {
return TSDB_CODE_TSC_INVALID_VALUE ;
}
n = length ;
break ;
case TSDB_DATA_TYPE_UTINYINT :
n = sprintf ( str , " %u " , * ( uint8_t * ) buf ) ;
break ;
case TSDB_DATA_TYPE_USMALLINT :
n = sprintf ( str , " %u " , * ( uint16_t * ) buf ) ;
break ;
case TSDB_DATA_TYPE_UINT :
n = sprintf ( str , " %u " , * ( uint32_t * ) buf ) ;
break ;
case TSDB_DATA_TYPE_UBIGINT :
n = sprintf ( str , " % " PRIu64 , * ( uint64_t * ) buf ) ;
break ;
default :
return TSDB_CODE_TSC_INVALID_VALUE ;
}
if ( len ) * len = n ;
return TSDB_CODE_SUCCESS ;
}
2022-07-15 13:33:30 +00:00
static SSDataBlock * sysTableScanUserTags ( SOperatorInfo * pOperator ) {
SExecTaskInfo * pTaskInfo = pOperator - > pTaskInfo ;
SSysTableScanInfo * pInfo = pOperator - > info ;
if ( pOperator - > status = = OP_EXEC_DONE ) {
return NULL ;
}
if ( pInfo - > pCur = = NULL ) {
pInfo - > pCur = metaOpenTbCursor ( pInfo - > readHandle . meta ) ;
}
blockDataCleanup ( pInfo - > pRes ) ;
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 ) ) ) ;
2022-07-16 06:38:03 +00:00
SSDataBlock * p = buildInfoSchemaTableMetaBlock ( TSDB_INS_TABLE_USER_TAGS ) ;
2022-07-15 13:33:30 +00:00
blockDataEnsureCapacity ( p , pOperator - > resultInfo . capacity ) ;
int32_t ret = 0 ;
while ( ( ret = metaTbCursorNext ( pInfo - > pCur ) ) = = 0 ) {
2022-07-16 06:38:03 +00:00
if ( pInfo - > pCur - > mr . me . type ! = TSDB_CHILD_TABLE ) {
continue ;
}
2022-07-15 13:33:30 +00:00
2022-07-16 06:38:03 +00:00
char tableName [ TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE ] = { 0 } ;
STR_TO_VARSTR ( tableName , pInfo - > pCur - > mr . me . name ) ;
2022-07-15 13:33:30 +00:00
2022-07-16 06:38:03 +00:00
SMetaReader smr = { 0 } ;
metaReaderInit ( & smr , pInfo - > readHandle . meta , 0 ) ;
2022-07-15 13:33:30 +00:00
2022-07-16 06:38:03 +00:00
uint64_t suid = pInfo - > pCur - > mr . me . ctbEntry . suid ;
int32_t code = metaGetTableEntryByUid ( & smr , suid ) ;
if ( code ! = TSDB_CODE_SUCCESS ) {
qError ( " failed to get super table meta, uid:0x% " PRIx64 " , code:%s, %s " , suid , tstrerror ( terrno ) ,
GET_TASKID ( pTaskInfo ) ) ;
metaReaderClear ( & smr ) ;
metaCloseTbCursor ( pInfo - > pCur ) ;
pInfo - > pCur = NULL ;
longjmp ( pTaskInfo - > env , terrno ) ;
}
2022-07-15 13:33:30 +00:00
2022-07-16 06:38:03 +00:00
char stableName [ TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE ] = { 0 } ;
STR_TO_VARSTR ( stableName , smr . me . name ) ;
2022-07-15 13:33:30 +00:00
2022-07-16 06:38:03 +00:00
int32_t numOfTags = smr . me . stbEntry . schemaTag . nCols ;
for ( int32_t i = 0 ; i < numOfTags ; + + i ) {
SColumnInfoData * pColInfoData = NULL ;
2022-07-15 13:33:30 +00:00
2022-07-16 06:38:03 +00:00
// table name
pColInfoData = taosArrayGet ( p - > pDataBlock , 0 ) ;
colDataAppend ( pColInfoData , numOfRows , tableName , false ) ;
2022-07-15 13:33:30 +00:00
2022-07-16 06:38:03 +00:00
// database name
pColInfoData = taosArrayGet ( p - > pDataBlock , 1 ) ;
colDataAppend ( pColInfoData , numOfRows , dbname , false ) ;
2022-07-15 13:33:30 +00:00
// super table name
pColInfoData = taosArrayGet ( p - > pDataBlock , 2 ) ;
2022-07-16 06:38:03 +00:00
colDataAppend ( pColInfoData , numOfRows , stableName , false ) ;
2022-07-15 13:33:30 +00:00
2022-07-24 11:59:19 +00:00
// tag name
2022-07-16 06:38:03 +00:00
char tagName [ TSDB_COL_NAME_LEN + VARSTR_HEADER_SIZE ] = { 0 } ;
STR_TO_VARSTR ( tagName , smr . me . stbEntry . schemaTag . pSchema [ i ] . name ) ;
2022-07-15 13:33:30 +00:00
pColInfoData = taosArrayGet ( p - > pDataBlock , 3 ) ;
2022-07-16 06:38:03 +00:00
colDataAppend ( pColInfoData , numOfRows , tagName , false ) ;
2022-07-15 13:33:30 +00:00
2022-07-24 11:59:19 +00:00
// tag type
2022-07-16 06:38:03 +00:00
int8_t tagType = smr . me . stbEntry . schemaTag . pSchema [ i ] . type ;
2022-07-15 13:33:30 +00:00
pColInfoData = taosArrayGet ( p - > pDataBlock , 4 ) ;
2022-07-24 11:59:19 +00:00
char tagTypeStr [ VARSTR_HEADER_SIZE + 32 ] ;
2022-07-25 07:17:53 +00:00
int tagTypeLen = sprintf ( varDataVal ( tagTypeStr ) , " %s " , tDataTypes [ tagType ] . name ) ;
2022-07-24 11:59:19 +00:00
if ( tagType = = TSDB_DATA_TYPE_VARCHAR ) {
2022-07-25 07:17:53 +00:00
tagTypeLen + = sprintf ( varDataVal ( tagTypeStr ) + tagTypeLen , " (%d) " ,
( int32_t ) ( smr . me . stbEntry . schemaTag . pSchema [ i ] . bytes - VARSTR_HEADER_SIZE ) ) ;
2022-07-24 11:59:19 +00:00
} else if ( tagType = = TSDB_DATA_TYPE_NCHAR ) {
2022-07-25 07:17:53 +00:00
tagTypeLen + =
sprintf ( varDataVal ( tagTypeStr ) + tagTypeLen , " (%d) " ,
( int32_t ) ( ( smr . me . stbEntry . schemaTag . pSchema [ i ] . bytes - VARSTR_HEADER_SIZE ) / TSDB_NCHAR_SIZE ) ) ;
2022-07-24 11:59:19 +00:00
}
varDataSetLen ( tagTypeStr , tagTypeLen ) ;
colDataAppend ( pColInfoData , numOfRows , ( char * ) tagTypeStr , false ) ;
2022-07-16 06:38:03 +00:00
STagVal tagVal = { 0 } ;
tagVal . cid = smr . me . stbEntry . schemaTag . pSchema [ i ] . colId ;
2022-07-16 20:57:16 +00:00
char * tagData = NULL ;
uint32_t tagLen = 0 ;
2022-07-17 13:37:59 +00:00
2022-07-16 20:57:16 +00:00
if ( tagType = = TSDB_DATA_TYPE_JSON ) {
2022-07-17 13:37:59 +00:00
tagData = ( char * ) pInfo - > pCur - > mr . me . ctbEntry . pTags ;
2022-07-15 13:33:30 +00:00
} else {
2022-07-16 20:57:16 +00:00
bool exist = tTagGet ( ( STag * ) pInfo - > pCur - > mr . me . ctbEntry . pTags , & tagVal ) ;
if ( exist ) {
if ( IS_VAR_DATA_TYPE ( tagType ) ) {
tagData = ( char * ) tagVal . pData ;
tagLen = tagVal . nData ;
} else {
tagData = ( char * ) & tagVal . i64 ;
tagLen = tDataTypes [ tagType ] . bytes ;
}
}
2022-07-15 13:33:30 +00:00
}
2022-07-17 13:37:59 +00:00
char * tagVarChar = NULL ;
2022-07-16 20:57:16 +00:00
if ( tagData ! = NULL ) {
2022-07-17 13:37:59 +00:00
if ( tagType = = TSDB_DATA_TYPE_JSON ) {
char * tagJson = parseTagDatatoJson ( tagData ) ;
tagVarChar = taosMemoryMalloc ( strlen ( tagJson ) + VARSTR_HEADER_SIZE ) ;
memcpy ( varDataVal ( tagVarChar ) , tagJson , strlen ( tagJson ) ) ;
varDataSetLen ( tagVarChar , strlen ( tagJson ) ) ;
taosMemoryFree ( tagJson ) ;
} else {
int32_t bufSize = IS_VAR_DATA_TYPE ( tagType ) ? ( tagLen + VARSTR_HEADER_SIZE )
: ( 3 + DBL_MANT_DIG - DBL_MIN_EXP + VARSTR_HEADER_SIZE ) ;
tagVarChar = taosMemoryMalloc ( bufSize ) ;
int32_t len = - 1 ;
2022-07-24 11:59:19 +00:00
convertTagDataToStr ( varDataVal ( tagVarChar ) , tagType , tagData , tagLen , & len ) ;
2022-07-17 13:37:59 +00:00
varDataSetLen ( tagVarChar , len ) ;
2022-07-16 20:57:16 +00:00
}
2022-07-16 06:38:03 +00:00
}
2022-07-16 20:57:16 +00:00
pColInfoData = taosArrayGet ( p - > pDataBlock , 5 ) ;
colDataAppend ( pColInfoData , numOfRows , tagVarChar ,
( tagData = = NULL ) | | ( tagType = = TSDB_DATA_TYPE_JSON & & tTagIsJsonNull ( tagData ) ) ) ;
taosMemoryFree ( tagVarChar ) ;
2022-07-16 06:38:03 +00:00
+ + numOfRows ;
2022-07-15 13:33:30 +00:00
}
2022-07-16 06:38:03 +00:00
metaReaderClear ( & smr ) ;
2022-07-15 13:33:30 +00:00
2022-07-16 06:38:03 +00:00
if ( numOfRows > = pOperator - > resultInfo . capacity ) {
2022-07-15 13:33:30 +00:00
break ;
}
}
// todo temporarily free the cursor here, the true reason why the free is not valid needs to be found
if ( ret ! = 0 ) {
metaCloseTbCursor ( pInfo - > pCur ) ;
pInfo - > pCur = NULL ;
doSetOperatorCompleted ( pOperator ) ;
}
p - > info . rows = numOfRows ;
pInfo - > pRes - > info . rows = numOfRows ;
relocateColumnData ( pInfo - > pRes , pInfo - > scanCols , p - > pDataBlock , false ) ;
doFilterResult ( pInfo ) ;
blockDataDestroy ( p ) ;
pInfo - > loadInfo . totalRows + = pInfo - > pRes - > info . rows ;
return ( pInfo - > pRes - > info . rows = = 0 ) ? NULL : pInfo - > pRes ;
}
2022-07-16 06:38:03 +00:00
static SSDataBlock * sysTableScanUserTables ( SOperatorInfo * pOperator ) {
2022-04-04 06:54:39 +00:00
SExecTaskInfo * pTaskInfo = pOperator - > pTaskInfo ;
SSysTableScanInfo * pInfo = pOperator - > info ;
2022-07-16 06:38:03 +00:00
if ( pOperator - > status = = OP_EXEC_DONE ) {
return NULL ;
}
2022-04-04 06:54:39 +00:00
2022-07-16 06:38:03 +00:00
// the retrieve is executed on the mnode, so return tables that belongs to the information schema database.
if ( pInfo - > readHandle . mnd ! = NULL ) {
buildSysDbTableInfo ( pInfo , pOperator - > resultInfo . capacity ) ;
doFilterResult ( pInfo ) ;
pInfo - > loadInfo . totalRows + = pInfo - > pRes - > info . rows ;
doSetOperatorCompleted ( pOperator ) ;
return ( pInfo - > pRes - > info . rows = = 0 ) ? NULL : pInfo - > pRes ;
} else {
if ( pInfo - > pCur = = NULL ) {
pInfo - > pCur = metaOpenTbCursor ( pInfo - > readHandle . meta ) ;
2022-05-26 03:51:32 +00:00
}
2022-07-16 06:38:03 +00:00
blockDataCleanup ( pInfo - > pRes ) ;
int32_t numOfRows = 0 ;
2022-04-27 07:17:15 +00:00
2022-07-16 06:38:03 +00:00
const char * db = NULL ;
int32_t vgId = 0 ;
vnodeGetInfo ( pInfo - > readHandle . vnode , & db , & vgId ) ;
2022-04-27 07:17:15 +00:00
2022-07-16 06:38:03 +00:00
SName sn = { 0 } ;
char dbname [ TSDB_DB_FNAME_LEN + VARSTR_HEADER_SIZE ] = { 0 } ;
tNameFromString ( & sn , db , T_NAME_ACCT | T_NAME_DB ) ;
2022-04-27 07:17:15 +00:00
2022-07-16 06:38:03 +00:00
tNameGetDbName ( & sn , varDataVal ( dbname ) ) ;
varDataSetLen ( dbname , strlen ( varDataVal ( dbname ) ) ) ;
2022-04-27 07:17:15 +00:00
2022-07-16 06:38:03 +00:00
SSDataBlock * p = buildInfoSchemaTableMetaBlock ( TSDB_INS_TABLE_USER_TABLES ) ;
blockDataEnsureCapacity ( p , pOperator - > resultInfo . capacity ) ;
2022-04-27 07:17:15 +00:00
2022-07-16 06:38:03 +00:00
char n [ TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE ] = { 0 } ;
2022-04-27 07:17:15 +00:00
2022-07-16 06:38:03 +00:00
int32_t ret = 0 ;
while ( ( ret = metaTbCursorNext ( pInfo - > pCur ) ) = = 0 ) {
STR_TO_VARSTR ( n , pInfo - > pCur - > mr . me . name ) ;
2022-04-27 07:17:15 +00:00
2022-07-16 06:38:03 +00:00
// table name
SColumnInfoData * pColInfoData = taosArrayGet ( p - > pDataBlock , 0 ) ;
colDataAppend ( pColInfoData , numOfRows , n , false ) ;
2022-04-27 07:31:04 +00:00
2022-07-16 06:38:03 +00:00
// database name
pColInfoData = taosArrayGet ( p - > pDataBlock , 1 ) ;
colDataAppend ( pColInfoData , numOfRows , dbname , false ) ;
// vgId
pColInfoData = taosArrayGet ( p - > pDataBlock , 6 ) ;
colDataAppend ( pColInfoData , numOfRows , ( char * ) & vgId , false ) ;
int32_t tableType = pInfo - > pCur - > mr . me . type ;
if ( tableType = = TSDB_CHILD_TABLE ) {
// create time
int64_t ts = pInfo - > pCur - > mr . me . ctbEntry . ctime ;
pColInfoData = taosArrayGet ( p - > pDataBlock , 2 ) ;
colDataAppend ( pColInfoData , numOfRows , ( char * ) & ts , false ) ;
SMetaReader mr = { 0 } ;
metaReaderInit ( & mr , pInfo - > readHandle . meta , 0 ) ;
uint64_t suid = pInfo - > pCur - > mr . me . ctbEntry . suid ;
int32_t code = metaGetTableEntryByUid ( & mr , suid ) ;
if ( code ! = TSDB_CODE_SUCCESS ) {
2022-07-22 02:28:39 +00:00
qError ( " failed to get super table meta, cname:%s, suid:0x% " PRIx64 " , code:%s, %s " , pInfo - > pCur - > mr . me . name ,
suid , tstrerror ( terrno ) , GET_TASKID ( pTaskInfo ) ) ;
2022-07-16 06:38:03 +00:00
metaReaderClear ( & mr ) ;
metaCloseTbCursor ( pInfo - > pCur ) ;
pInfo - > pCur = NULL ;
longjmp ( pTaskInfo - > env , terrno ) ;
}
2022-05-26 03:51:32 +00:00
2022-07-16 06:38:03 +00:00
// number of columns
pColInfoData = taosArrayGet ( p - > pDataBlock , 3 ) ;
colDataAppend ( pColInfoData , numOfRows , ( char * ) & mr . me . stbEntry . schemaRow . nCols , false ) ;
2022-04-27 07:17:15 +00:00
2022-07-16 06:38:03 +00:00
// super table name
STR_TO_VARSTR ( n , mr . me . name ) ;
pColInfoData = taosArrayGet ( p - > pDataBlock , 4 ) ;
2022-04-28 07:30:18 +00:00
colDataAppend ( pColInfoData , numOfRows , n , false ) ;
2022-07-16 06:38:03 +00:00
metaReaderClear ( & mr ) ;
2022-04-27 07:17:15 +00:00
2022-07-16 06:38:03 +00:00
// table comment
pColInfoData = taosArrayGet ( p - > pDataBlock , 8 ) ;
if ( pInfo - > pCur - > mr . me . ctbEntry . commentLen > 0 ) {
char comment [ TSDB_TB_COMMENT_LEN + VARSTR_HEADER_SIZE ] = { 0 } ;
STR_TO_VARSTR ( comment , pInfo - > pCur - > mr . me . ctbEntry . comment ) ;
colDataAppend ( pColInfoData , numOfRows , comment , false ) ;
} else if ( pInfo - > pCur - > mr . me . ctbEntry . commentLen = = 0 ) {
char comment [ VARSTR_HEADER_SIZE + VARSTR_HEADER_SIZE ] = { 0 } ;
STR_TO_VARSTR ( comment , " " ) ;
colDataAppend ( pColInfoData , numOfRows , comment , false ) ;
} else {
2022-04-28 07:30:18 +00:00
colDataAppendNULL ( pColInfoData , numOfRows ) ;
}
2022-04-27 07:17:15 +00:00
2022-07-16 06:38:03 +00:00
// uid
pColInfoData = taosArrayGet ( p - > pDataBlock , 5 ) ;
colDataAppend ( pColInfoData , numOfRows , ( char * ) & pInfo - > pCur - > mr . me . uid , false ) ;
// ttl
pColInfoData = taosArrayGet ( p - > pDataBlock , 7 ) ;
colDataAppend ( pColInfoData , numOfRows , ( char * ) & pInfo - > pCur - > mr . me . ctbEntry . ttlDays , false ) ;
STR_TO_VARSTR ( n , " CHILD_TABLE " ) ;
} else if ( tableType = = TSDB_NORMAL_TABLE ) {
// create time
pColInfoData = taosArrayGet ( p - > pDataBlock , 2 ) ;
colDataAppend ( pColInfoData , numOfRows , ( char * ) & pInfo - > pCur - > mr . me . ntbEntry . ctime , false ) ;
// number of columns
pColInfoData = taosArrayGet ( p - > pDataBlock , 3 ) ;
colDataAppend ( pColInfoData , numOfRows , ( char * ) & pInfo - > pCur - > mr . me . ntbEntry . schemaRow . nCols , false ) ;
// super table name
pColInfoData = taosArrayGet ( p - > pDataBlock , 4 ) ;
colDataAppendNULL ( pColInfoData , numOfRows ) ;
2022-04-27 07:17:15 +00:00
2022-07-16 06:38:03 +00:00
// table comment
pColInfoData = taosArrayGet ( p - > pDataBlock , 8 ) ;
if ( pInfo - > pCur - > mr . me . ntbEntry . commentLen > 0 ) {
char comment [ TSDB_TB_COMMENT_LEN + VARSTR_HEADER_SIZE ] = { 0 } ;
STR_TO_VARSTR ( comment , pInfo - > pCur - > mr . me . ntbEntry . comment ) ;
colDataAppend ( pColInfoData , numOfRows , comment , false ) ;
} else if ( pInfo - > pCur - > mr . me . ntbEntry . commentLen = = 0 ) {
char comment [ VARSTR_HEADER_SIZE + VARSTR_HEADER_SIZE ] = { 0 } ;
STR_TO_VARSTR ( comment , " " ) ;
colDataAppend ( pColInfoData , numOfRows , comment , false ) ;
} else {
colDataAppendNULL ( pColInfoData , numOfRows ) ;
2022-04-28 07:30:18 +00:00
}
2022-07-16 06:38:03 +00:00
// uid
pColInfoData = taosArrayGet ( p - > pDataBlock , 5 ) ;
colDataAppend ( pColInfoData , numOfRows , ( char * ) & pInfo - > pCur - > mr . me . uid , false ) ;
// ttl
pColInfoData = taosArrayGet ( p - > pDataBlock , 7 ) ;
colDataAppend ( pColInfoData , numOfRows , ( char * ) & pInfo - > pCur - > mr . me . ntbEntry . ttlDays , false ) ;
STR_TO_VARSTR ( n , " NORMAL_TABLE " ) ;
2022-04-04 06:54:39 +00:00
}
2022-07-16 06:38:03 +00:00
pColInfoData = taosArrayGet ( p - > pDataBlock , 9 ) ;
colDataAppend ( pColInfoData , numOfRows , n , false ) ;
if ( + + numOfRows > = pOperator - > resultInfo . capacity ) {
break ;
2022-05-26 03:51:32 +00:00
}
2022-07-16 06:38:03 +00:00
}
2022-05-26 03:51:32 +00:00
2022-07-16 06:38:03 +00:00
// todo temporarily free the cursor here, the true reason why the free is not valid needs to be found
if ( ret ! = 0 ) {
metaCloseTbCursor ( pInfo - > pCur ) ;
pInfo - > pCur = NULL ;
doSetOperatorCompleted ( pOperator ) ;
}
2022-04-04 06:54:39 +00:00
2022-07-16 06:38:03 +00:00
p - > info . rows = numOfRows ;
pInfo - > pRes - > info . rows = numOfRows ;
2022-04-04 06:54:39 +00:00
2022-07-16 06:38:03 +00:00
relocateColumnData ( pInfo - > pRes , pInfo - > scanCols , p - > pDataBlock , false ) ;
doFilterResult ( pInfo ) ;
2022-06-15 15:00:31 +00:00
2022-07-16 06:38:03 +00:00
blockDataDestroy ( p ) ;
pInfo - > loadInfo . totalRows + = pInfo - > pRes - > info . rows ;
return ( pInfo - > pRes - > info . rows = = 0 ) ? NULL : pInfo - > pRes ;
}
}
2022-07-18 06:25:00 +00:00
static SSDataBlock * sysTableScanUserSTables ( SOperatorInfo * pOperator ) {
SExecTaskInfo * pTaskInfo = pOperator - > pTaskInfo ;
SSysTableScanInfo * pInfo = pOperator - > info ;
if ( pOperator - > status = = OP_EXEC_DONE ) {
return NULL ;
}
pInfo - > pRes - > info . rows = 0 ;
2022-07-21 06:06:38 +00:00
pOperator - > status = OP_EXEC_DONE ;
2022-07-18 06:25:00 +00:00
pInfo - > loadInfo . totalRows + = pInfo - > pRes - > info . rows ;
return ( pInfo - > pRes - > info . rows = = 0 ) ? NULL : pInfo - > pRes ;
}
2022-07-16 06:38:03 +00:00
static SSDataBlock * doSysTableScan ( SOperatorInfo * pOperator ) {
// build message and send to mnode to fetch the content of system tables.
SExecTaskInfo * pTaskInfo = pOperator - > pTaskInfo ;
SSysTableScanInfo * pInfo = pOperator - > info ;
const char * name = tNameGetTableName ( & pInfo - > name ) ;
2022-07-20 01:46:53 +00:00
if ( pInfo - > showRewrite ) {
char dbName [ TSDB_DB_NAME_LEN ] = { 0 } ;
getDBNameFromCondition ( pInfo - > pCondition , dbName ) ;
sprintf ( pInfo - > req . db , " %d.%s " , pInfo - > accountId , dbName ) ;
}
2022-07-22 02:28:39 +00:00
2022-07-16 06:38:03 +00:00
if ( strncasecmp ( name , TSDB_INS_TABLE_USER_TABLES , TSDB_TABLE_FNAME_LEN ) = = 0 ) {
return sysTableScanUserTables ( pOperator ) ;
} else if ( strncasecmp ( name , TSDB_INS_TABLE_USER_TAGS , TSDB_TABLE_FNAME_LEN ) = = 0 ) {
return sysTableScanUserTags ( pOperator ) ;
2022-07-22 02:28:39 +00:00
} else if ( strncasecmp ( name , TSDB_INS_TABLE_USER_STABLES , TSDB_TABLE_FNAME_LEN ) = = 0 & &
IS_SYS_DBNAME ( pInfo - > req . db ) ) {
2022-07-18 06:25:00 +00:00
return sysTableScanUserSTables ( pOperator ) ;
2022-04-04 06:54:39 +00:00
} else { // load the meta from mnode of the given epset
if ( pOperator - > status = = OP_EXEC_DONE ) {
return NULL ;
}
2022-04-14 06:34:02 +00:00
while ( 1 ) {
int64_t startTs = taosGetTimestampUs ( ) ;
strncpy ( pInfo - > req . tb , tNameGetTableName ( & pInfo - > name ) , tListLen ( pInfo - > req . tb ) ) ;
2022-06-25 04:10:34 +00:00
strcpy ( pInfo - > req . user , pInfo - > pUser ) ;
2022-04-04 06:54:39 +00:00
2022-04-14 06:34:02 +00:00
int32_t contLen = tSerializeSRetrieveTableReq ( NULL , 0 , & pInfo - > req ) ;
char * buf1 = taosMemoryCalloc ( 1 , contLen ) ;
tSerializeSRetrieveTableReq ( buf1 , contLen , & pInfo - > req ) ;
// send the fetch remote task result reques
SMsgSendInfo * pMsgSendInfo = taosMemoryCalloc ( 1 , sizeof ( SMsgSendInfo ) ) ;
if ( NULL = = pMsgSendInfo ) {
qError ( " %s prepare message %d failed " , GET_TASKID ( pTaskInfo ) , ( int32_t ) sizeof ( SMsgSendInfo ) ) ;
pTaskInfo - > code = TSDB_CODE_QRY_OUT_OF_MEMORY ;
return NULL ;
}
2022-04-04 06:54:39 +00:00
2022-06-23 07:46:42 +00:00
int32_t msgType = ( strcasecmp ( name , TSDB_INS_TABLE_DNODE_VARIABLES ) = = 0 ) ? TDMT_DND_SYSTABLE_RETRIEVE
: TDMT_MND_SYSTABLE_RETRIEVE ;
2022-06-22 09:17:18 +00:00
2022-04-14 06:34:02 +00:00
pMsgSendInfo - > param = pOperator ;
pMsgSendInfo - > msgInfo . pData = buf1 ;
pMsgSendInfo - > msgInfo . len = contLen ;
2022-06-22 09:17:18 +00:00
pMsgSendInfo - > msgType = msgType ;
2022-05-03 15:23:49 +00:00
pMsgSendInfo - > fp = loadSysTableCallback ;
2022-06-22 09:17:18 +00:00
pMsgSendInfo - > requestId = pTaskInfo - > id . queryId ;
2022-04-04 06:54:39 +00:00
2022-04-14 06:34:02 +00:00
int64_t transporterId = 0 ;
2022-05-09 10:10:54 +00:00
int32_t code =
asyncSendMsgToServer ( pInfo - > readHandle . pMsgCb - > clientRpc , & pInfo - > epSet , & transporterId , pMsgSendInfo ) ;
2022-04-14 06:34:02 +00:00
tsem_wait ( & pInfo - > ready ) ;
2022-04-04 06:54:39 +00:00
2022-04-14 06:34:02 +00:00
if ( pTaskInfo - > code ) {
qDebug ( " %s load meta data from mnode failed, totalRows:% " PRIu64 " , code:%s " , GET_TASKID ( pTaskInfo ) ,
pInfo - > loadInfo . totalRows , tstrerror ( pTaskInfo - > code ) ) ;
return NULL ;
}
2022-04-04 06:54:39 +00:00
2022-04-14 06:34:02 +00:00
SRetrieveMetaTableRsp * pRsp = pInfo - > pRsp ;
pInfo - > req . showId = pRsp - > handle ;
2022-04-04 06:54:39 +00:00
2022-04-14 06:34:02 +00:00
if ( pRsp - > numOfRows = = 0 | | pRsp - > completed ) {
pOperator - > status = OP_EXEC_DONE ;
2022-06-22 11:34:56 +00:00
qDebug ( " %s load meta data from mnode completed, rowsOfSource:%d, totalRows:% " PRIu64 , GET_TASKID ( pTaskInfo ) ,
2022-04-14 06:34:02 +00:00
pRsp - > numOfRows , pInfo - > loadInfo . totalRows ) ;
2022-04-04 06:54:39 +00:00
2022-04-14 06:34:02 +00:00
if ( pRsp - > numOfRows = = 0 ) {
2022-06-12 15:37:29 +00:00
taosMemoryFree ( pRsp ) ;
2022-04-14 06:34:02 +00:00
return NULL ;
}
}
2022-04-04 06:54:39 +00:00
2022-06-17 11:01:45 +00:00
extractDataBlockFromFetchRsp ( pInfo - > pRes , & pInfo - > loadInfo , pRsp - > numOfRows , pRsp - > data , pRsp - > compLen ,
2022-06-20 06:40:13 +00:00
pOperator - > exprSupp . numOfExprs , startTs , NULL , pInfo - > scanCols ) ;
2022-04-04 06:54:39 +00:00
2022-04-14 06:34:02 +00:00
// todo log the filter info
doFilterResult ( pInfo ) ;
2022-06-12 15:37:29 +00:00
taosMemoryFree ( pRsp ) ;
2022-04-14 06:34:02 +00:00
if ( pInfo - > pRes - > info . rows > 0 ) {
return pInfo - > pRes ;
2022-06-22 09:17:18 +00:00
} else if ( pOperator - > status = = OP_EXEC_DONE ) {
return NULL ;
2022-04-14 06:34:02 +00:00
}
2022-04-14 03:36:06 +00:00
}
2022-04-04 06:54:39 +00:00
}
}
2022-05-03 15:23:49 +00:00
int32_t buildSysDbTableInfo ( const SSysTableScanInfo * pInfo , int32_t capacity ) {
2022-07-16 06:38:03 +00:00
SSDataBlock * p = buildInfoSchemaTableMetaBlock ( TSDB_INS_TABLE_USER_TABLES ) ;
2022-05-03 15:23:49 +00:00
blockDataEnsureCapacity ( p , capacity ) ;
2022-04-28 07:30:18 +00:00
2022-05-07 16:21:17 +00:00
size_t size = 0 ;
2022-04-28 07:30:18 +00:00
const SSysTableMeta * pSysDbTableMeta = NULL ;
getInfosDbMeta ( & pSysDbTableMeta , & size ) ;
p - > info . rows = buildDbTableInfoBlock ( p , pSysDbTableMeta , size , TSDB_INFORMATION_SCHEMA_DB ) ;
getPerfDbMeta ( & pSysDbTableMeta , & size ) ;
p - > info . rows = buildDbTableInfoBlock ( p , pSysDbTableMeta , size , TSDB_PERFORMANCE_SCHEMA_DB ) ;
pInfo - > pRes - > info . rows = p - > info . rows ;
2022-07-05 10:02:38 +00:00
relocateColumnData ( pInfo - > pRes , pInfo - > scanCols , p - > pDataBlock , false ) ;
2022-06-15 15:00:31 +00:00
blockDataDestroy ( p ) ;
return pInfo - > pRes - > info . rows ;
2022-04-28 07:30:18 +00:00
}
2022-05-07 16:21:17 +00:00
int32_t buildDbTableInfoBlock ( const SSDataBlock * p , const SSysTableMeta * pSysDbTableMeta , size_t size ,
const char * dbName ) {
char n [ TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE ] = { 0 } ;
2022-04-28 07:30:18 +00:00
int32_t numOfRows = p - > info . rows ;
2022-05-07 16:21:17 +00:00
for ( int32_t i = 0 ; i < size ; + + i ) {
2022-04-28 07:30:18 +00:00
const SSysTableMeta * pm = & pSysDbTableMeta [ i ] ;
SColumnInfoData * pColInfoData = taosArrayGet ( p - > pDataBlock , 0 ) ;
STR_TO_VARSTR ( n , pm - > name ) ;
colDataAppend ( pColInfoData , numOfRows , n , false ) ;
// database name
STR_TO_VARSTR ( n , dbName ) ;
pColInfoData = taosArrayGet ( p - > pDataBlock , 1 ) ;
colDataAppend ( pColInfoData , numOfRows , n , false ) ;
// create time
pColInfoData = taosArrayGet ( p - > pDataBlock , 2 ) ;
colDataAppendNULL ( pColInfoData , numOfRows ) ;
// number of columns
pColInfoData = taosArrayGet ( p - > pDataBlock , 3 ) ;
colDataAppend ( pColInfoData , numOfRows , ( char * ) & pm - > colNum , false ) ;
2022-05-07 16:21:17 +00:00
for ( int32_t j = 4 ; j < = 8 ; + + j ) {
2022-04-28 07:30:18 +00:00
pColInfoData = taosArrayGet ( p - > pDataBlock , j ) ;
colDataAppendNULL ( pColInfoData , numOfRows ) ;
}
STR_TO_VARSTR ( n , " SYSTEM_TABLE " ) ;
pColInfoData = taosArrayGet ( p - > pDataBlock , 9 ) ;
colDataAppend ( pColInfoData , numOfRows , n , false ) ;
numOfRows + = 1 ;
}
return numOfRows ;
}
2022-06-07 12:59:44 +00:00
SOperatorInfo * createSysTableScanOperatorInfo ( void * readHandle , SSystemTableScanPhysiNode * pScanPhyNode ,
2022-06-25 04:10:34 +00:00
const char * pUser , SExecTaskInfo * pTaskInfo ) {
2022-04-04 06:54:39 +00:00
SSysTableScanInfo * pInfo = taosMemoryCalloc ( 1 , sizeof ( SSysTableScanInfo ) ) ;
SOperatorInfo * pOperator = taosMemoryCalloc ( 1 , sizeof ( SOperatorInfo ) ) ;
if ( pInfo = = NULL | | pOperator = = NULL ) {
2022-06-05 06:48:15 +00:00
goto _error ;
2022-04-04 06:54:39 +00:00
}
2022-06-05 06:48:15 +00:00
SScanPhysiNode * pScanNode = & pScanPhyNode - > scan ;
SDataBlockDescNode * pDescNode = pScanNode - > node . pOutputDataBlockDesc ;
2022-06-07 12:59:44 +00:00
SSDataBlock * pResBlock = createResDataBlock ( pDescNode ) ;
2022-06-05 06:48:15 +00:00
int32_t num = 0 ;
2022-06-25 12:02:57 +00:00
SArray * colList = extractColMatchInfo ( pScanNode - > pScanCols , pDescNode , & num , COL_MATCH_FROM_COL_ID ) ;
2022-06-05 06:48:15 +00:00
2022-06-25 12:02:57 +00:00
pInfo - > accountId = pScanPhyNode - > accountId ;
pInfo - > pUser = taosMemoryStrDup ( ( void * ) pUser ) ;
2022-06-05 06:48:15 +00:00
pInfo - > showRewrite = pScanPhyNode - > showRewrite ;
2022-06-25 12:02:57 +00:00
pInfo - > pRes = pResBlock ;
pInfo - > pCondition = pScanNode - > node . pConditions ;
pInfo - > scanCols = colList ;
2022-05-03 15:23:49 +00:00
2022-07-20 06:07:48 +00:00
initResultSizeInfo ( & pOperator - > resultInfo , 4096 ) ;
2022-04-04 06:54:39 +00:00
2022-06-05 06:48:15 +00:00
tNameAssign ( & pInfo - > name , & pScanNode - > tableName ) ;
2022-04-20 12:41:53 +00:00
const char * name = tNameGetTableName ( & pInfo - > name ) ;
2022-06-05 06:48:15 +00:00
2022-07-16 08:03:45 +00:00
if ( strncasecmp ( name , TSDB_INS_TABLE_USER_TABLES , TSDB_TABLE_FNAME_LEN ) = = 0 | |
strncasecmp ( name , TSDB_INS_TABLE_USER_TAGS , TSDB_TABLE_FNAME_LEN ) = = 0 ) {
2022-05-07 16:21:17 +00:00
pInfo - > readHandle = * ( SReadHandle * ) readHandle ;
2022-05-03 15:23:49 +00:00
blockDataEnsureCapacity ( pInfo - > pRes , pOperator - > resultInfo . capacity ) ;
2022-04-04 06:54:39 +00:00
} else {
tsem_init ( & pInfo - > ready , 0 , 0 ) ;
2022-06-05 06:48:15 +00:00
pInfo - > epSet = pScanPhyNode - > mgmtEpSet ;
2022-05-07 12:19:40 +00:00
pInfo - > readHandle = * ( SReadHandle * ) readHandle ;
2022-04-04 06:54:39 +00:00
}
2022-06-25 12:02:57 +00:00
pOperator - > name = " SysTableScanOperator " ;
2022-04-04 06:54:39 +00:00
pOperator - > operatorType = QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN ;
2022-06-25 12:02:57 +00:00
pOperator - > blocking = false ;
pOperator - > status = OP_NOT_OPENED ;
pOperator - > info = pInfo ;
2022-06-22 09:21:04 +00:00
pOperator - > exprSupp . numOfExprs = taosArrayGetSize ( pResBlock - > pDataBlock ) ;
2022-06-25 12:02:57 +00:00
pOperator - > pTaskInfo = pTaskInfo ;
2022-06-05 06:48:15 +00:00
2022-05-07 16:21:17 +00:00
pOperator - > fpSet =
createOperatorFpSet ( operatorDummyOpenFn , doSysTableScan , NULL , NULL , destroySysScanOperator , NULL , NULL , NULL ) ;
2022-04-04 06:54:39 +00:00
return pOperator ;
2022-06-05 06:48:15 +00:00
2022-06-07 12:59:44 +00:00
_error :
2022-06-05 06:48:15 +00:00
taosMemoryFreeClear ( pInfo ) ;
taosMemoryFreeClear ( pOperator ) ;
terrno = TSDB_CODE_QRY_OUT_OF_MEMORY ;
return NULL ;
2022-04-04 06:54:39 +00:00
}
2022-04-25 01:44:39 +00:00
2022-05-03 07:27:13 +00:00
static SSDataBlock * doTagScan ( SOperatorInfo * pOperator ) {
2022-04-25 01:44:39 +00:00
if ( pOperator - > status = = OP_EXEC_DONE ) {
return NULL ;
}
2022-05-05 15:47:44 +00:00
SExecTaskInfo * pTaskInfo = pOperator - > pTaskInfo ;
#if 0
2022-04-25 01:44:39 +00:00
int32_t maxNumOfTables = ( int32_t ) pResultInfo - > capacity ;
STagScanInfo * pInfo = pOperator - > info ;
SSDataBlock * pRes = pInfo - > pRes ;
int32_t count = 0 ;
SArray * pa = GET_TABLEGROUP ( pRuntimeEnv , 0 ) ;
2022-06-18 04:00:41 +00:00
int32_t functionId = getExprFunctionId ( & pOperator - > exprSupp . pExprInfo [ 0 ] ) ;
2022-04-25 01:44:39 +00:00
if ( functionId = = FUNCTION_TID_TAG ) { // return the tags & table Id
assert ( pQueryAttr - > numOfOutput = = 1 ) ;
2022-06-18 04:00:41 +00:00
SExprInfo * pExprInfo = & pOperator - > exprSupp . pExprInfo [ 0 ] ;
2022-04-25 01:44:39 +00:00
int32_t rsize = pExprInfo - > base . resSchema . bytes ;
count = 0 ;
int16_t bytes = pExprInfo - > base . resSchema . bytes ;
int16_t type = pExprInfo - > base . resSchema . type ;
for ( int32_t i = 0 ; i < pQueryAttr - > numOfTags ; + + i ) {
if ( pQueryAttr - > tagColList [ i ] . colId = = pExprInfo - > base . pColumns - > info . colId ) {
bytes = pQueryAttr - > tagColList [ i ] . bytes ;
type = pQueryAttr - > tagColList [ i ] . type ;
break ;
}
}
SColumnInfoData * pColInfo = taosArrayGet ( pRes - > pDataBlock , 0 ) ;
while ( pInfo - > curPos < pInfo - > totalTables & & count < maxNumOfTables ) {
int32_t i = pInfo - > curPos + + ;
STableQueryInfo * item = taosArrayGetP ( pa , i ) ;
char * output = pColInfo - > pData + count * rsize ;
varDataSetLen ( output , rsize - VARSTR_HEADER_SIZE ) ;
output = varDataVal ( output ) ;
STableId * id = TSDB_TABLEID ( item - > pTable ) ;
* ( int16_t * ) output = 0 ;
output + = sizeof ( int16_t ) ;
* ( int64_t * ) output = id - > uid ; // memory align problem, todo serialize
output + = sizeof ( id - > uid ) ;
* ( int32_t * ) output = id - > tid ;
output + = sizeof ( id - > tid ) ;
* ( int32_t * ) output = pQueryAttr - > vgId ;
output + = sizeof ( pQueryAttr - > vgId ) ;
char * data = NULL ;
if ( pExprInfo - > base . pColumns - > info . colId = = TSDB_TBNAME_COLUMN_INDEX ) {
data = tsdbGetTableName ( item - > pTable ) ;
} else {
data = tsdbGetTableTagVal ( item - > pTable , pExprInfo - > base . pColumns - > info . colId , type , bytes ) ;
}
doSetTagValueToResultBuf ( output , data , type , bytes ) ;
count + = 1 ;
}
//qDebug("QInfo:0x%"PRIx64" create (tableId, tag) info completed, rows:%d", GET_TASKID(pRuntimeEnv), count);
} else if ( functionId = = FUNCTION_COUNT ) { // handle the "count(tbname)" query
SColumnInfoData * pColInfo = taosArrayGet ( pRes - > pDataBlock , 0 ) ;
* ( int64_t * ) pColInfo - > pData = pInfo - > totalTables ;
count = 1 ;
pOperator - > status = OP_EXEC_DONE ;
//qDebug("QInfo:0x%"PRIx64" create count(tbname) query, res:%d rows:1", GET_TASKID(pRuntimeEnv), count);
} else { // return only the tags|table name etc.
2022-05-05 15:47:44 +00:00
# endif
2022-04-25 01:44:39 +00:00
2022-05-05 15:47:44 +00:00
STagScanInfo * pInfo = pOperator - > info ;
2022-06-18 04:00:41 +00:00
SExprInfo * pExprInfo = & pOperator - > exprSupp . pExprInfo [ 0 ] ;
2022-05-05 15:47:44 +00:00
SSDataBlock * pRes = pInfo - > pRes ;
2022-04-25 01:44:39 +00:00
2022-05-26 08:05:27 +00:00
int32_t size = taosArrayGetSize ( pInfo - > pTableList - > pTableList ) ;
if ( size = = 0 ) {
2022-05-07 07:11:49 +00:00
setTaskStatus ( pTaskInfo , TASK_COMPLETED ) ;
return NULL ;
}
2022-05-05 15:47:44 +00:00
char str [ 512 ] = { 0 } ;
int32_t count = 0 ;
SMetaReader mr = { 0 } ;
2022-05-13 01:53:19 +00:00
metaReaderInit ( & mr , pInfo - > readHandle . meta , 0 ) ;
2022-04-25 01:44:39 +00:00
2022-05-26 08:05:27 +00:00
while ( pInfo - > curPos < size & & count < pOperator - > resultInfo . capacity ) {
STableKeyInfo * item = taosArrayGet ( pInfo - > pTableList - > pTableList , pInfo - > curPos ) ;
2022-07-10 05:21:37 +00:00
int32_t code = metaGetTableEntryByUid ( & mr , item - > uid ) ;
2022-07-09 04:13:21 +00:00
if ( code ! = TSDB_CODE_SUCCESS ) {
2022-07-10 05:21:37 +00:00
qError ( " failed to get table meta, uid:0x% " PRIx64 " , code:%s, %s " , item - > uid , tstrerror ( terrno ) ,
GET_TASKID ( pTaskInfo ) ) ;
2022-07-09 04:13:21 +00:00
metaReaderClear ( & mr ) ;
longjmp ( pTaskInfo - > env , terrno ) ;
}
2022-04-25 01:44:39 +00:00
2022-06-18 04:00:41 +00:00
for ( int32_t j = 0 ; j < pOperator - > exprSupp . numOfExprs ; + + j ) {
2022-05-05 15:47:44 +00:00
SColumnInfoData * pDst = taosArrayGet ( pRes - > pDataBlock , pExprInfo [ j ] . base . resSchema . slotId ) ;
// refactor later
if ( fmIsScanPseudoColumnFunc ( pExprInfo [ j ] . pExpr - > _function . functionId ) ) {
STR_TO_VARSTR ( str , mr . me . name ) ;
colDataAppend ( pDst , count , str , false ) ;
2022-05-26 08:29:52 +00:00
} else { // it is a tag value
2022-05-31 09:49:33 +00:00
STagVal val = { 0 } ;
val . cid = pExprInfo [ j ] . base . pParam [ 0 ] . pCol - > colId ;
const char * p = metaGetTableTagVal ( & mr . me , pDst - > info . type , & val ) ;
2022-06-07 12:59:44 +00:00
char * data = NULL ;
if ( pDst - > info . type ! = TSDB_DATA_TYPE_JSON & & p ! = NULL ) {
data = tTagValToData ( ( const STagVal * ) p , false ) ;
} else {
2022-05-31 09:49:33 +00:00
data = ( char * ) p ;
}
2022-06-23 07:46:42 +00:00
colDataAppend ( pDst , count , data ,
( data = = NULL ) | | ( pDst - > info . type = = TSDB_DATA_TYPE_JSON & & tTagIsJsonNull ( data ) ) ) ;
2022-05-24 03:29:51 +00:00
2022-06-07 12:59:44 +00:00
if ( pDst - > info . type ! = TSDB_DATA_TYPE_JSON & & p ! = NULL & & IS_VAR_DATA_TYPE ( ( ( const STagVal * ) p ) - > type ) & &
data ! = NULL ) {
2022-05-19 09:57:14 +00:00
taosMemoryFree ( data ) ;
2022-05-18 14:13:38 +00:00
}
2022-04-25 01:44:39 +00:00
}
}
2022-05-13 01:53:19 +00:00
count + = 1 ;
2022-05-26 08:05:27 +00:00
if ( + + pInfo - > curPos > = size ) {
2022-05-24 07:54:39 +00:00
doSetOperatorCompleted ( pOperator ) ;
2022-04-25 01:44:39 +00:00
}
}
2022-05-13 01:53:19 +00:00
metaReaderClear ( & mr ) ;
2022-05-05 15:47:44 +00:00
// qDebug("QInfo:0x%"PRIx64" create tag values results completed, rows:%d", GET_TASKID(pRuntimeEnv), count);
2022-04-25 01:44:39 +00:00
if ( pOperator - > status = = OP_EXEC_DONE ) {
2022-05-05 15:47:44 +00:00
setTaskStatus ( pTaskInfo , TASK_COMPLETED ) ;
2022-04-25 01:44:39 +00:00
}
pRes - > info . rows = count ;
2022-06-21 12:53:19 +00:00
pOperator - > resultInfo . totalRows + = count ;
2022-05-24 07:54:39 +00:00
2022-05-05 15:47:44 +00:00
return ( pRes - > info . rows = = 0 ) ? NULL : pInfo - > pRes ;
2022-04-25 01:44:39 +00:00
}
static void destroyTagScanOperatorInfo ( void * param , int32_t numOfOutput ) {
STagScanInfo * pInfo = ( STagScanInfo * ) param ;
pInfo - > pRes = blockDataDestroy ( pInfo - > pRes ) ;
2022-07-08 13:37:15 +00:00
2022-07-08 06:26:53 +00:00
taosMemoryFreeClear ( param ) ;
2022-04-25 01:44:39 +00:00
}
2022-06-07 12:59:44 +00:00
SOperatorInfo * createTagScanOperatorInfo ( SReadHandle * pReadHandle , STagScanPhysiNode * pPhyNode ,
STableListInfo * pTableListInfo , SExecTaskInfo * pTaskInfo ) {
2022-04-26 05:49:42 +00:00
STagScanInfo * pInfo = taosMemoryCalloc ( 1 , sizeof ( STagScanInfo ) ) ;
2022-04-25 01:44:39 +00:00
SOperatorInfo * pOperator = taosMemoryCalloc ( 1 , sizeof ( SOperatorInfo ) ) ;
if ( pInfo = = NULL | | pOperator = = NULL ) {
goto _error ;
}
2022-06-05 06:48:15 +00:00
SDataBlockDescNode * pDescNode = pPhyNode - > node . pOutputDataBlockDesc ;
2022-06-17 11:01:45 +00:00
int32_t num = 0 ;
2022-06-05 06:48:15 +00:00
int32_t numOfExprs = 0 ;
SExprInfo * pExprInfo = createExprInfo ( pPhyNode - > pScanPseudoCols , NULL , & numOfExprs ) ;
2022-06-20 06:40:13 +00:00
SArray * colList = extractColMatchInfo ( pPhyNode - > pScanPseudoCols , pDescNode , & num , COL_MATCH_FROM_COL_ID ) ;
2022-06-05 06:48:15 +00:00
2022-06-20 15:22:28 +00:00
int32_t code = initExprSupp ( & pOperator - > exprSupp , pExprInfo , numOfExprs ) ;
if ( code ! = TSDB_CODE_SUCCESS ) {
goto _error ;
}
2022-06-20 05:42:59 +00:00
2022-06-25 12:02:57 +00:00
pInfo - > pTableList = pTableListInfo ;
pInfo - > pColMatchInfo = colList ;
pInfo - > pRes = createResDataBlock ( pDescNode ) ;
pInfo - > readHandle = * pReadHandle ;
pInfo - > curPos = 0 ;
2022-06-05 06:48:15 +00:00
2022-06-07 12:59:44 +00:00
pOperator - > name = " TagScanOperator " ;
2022-04-26 05:49:42 +00:00
pOperator - > operatorType = QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN ;
2022-06-20 07:34:04 +00:00
2022-06-22 10:51:16 +00:00
pOperator - > blocking = false ;
pOperator - > status = OP_NOT_OPENED ;
pOperator - > info = pInfo ;
pOperator - > pTaskInfo = pTaskInfo ;
2022-04-26 12:26:32 +00:00
2022-07-20 06:07:48 +00:00
initResultSizeInfo ( & pOperator - > resultInfo , 4096 ) ;
2022-05-05 15:47:44 +00:00
blockDataEnsureCapacity ( pInfo - > pRes , pOperator - > resultInfo . capacity ) ;
2022-04-26 12:26:32 +00:00
pOperator - > fpSet =
createOperatorFpSet ( operatorDummyOpenFn , doTagScan , NULL , NULL , destroyTagScanOperatorInfo , NULL , NULL , NULL ) ;
2022-04-25 01:44:39 +00:00
return pOperator ;
2022-05-03 15:23:49 +00:00
2022-04-26 05:49:42 +00:00
_error :
2022-04-25 01:44:39 +00:00
taosMemoryFree ( pInfo ) ;
taosMemoryFree ( pOperator ) ;
terrno = TSDB_CODE_OUT_OF_MEMORY ;
return NULL ;
}
2022-06-14 10:17:18 +00:00
2022-07-15 03:43:06 +00:00
int32_t createScanTableListInfo ( SScanPhysiNode * pScanNode , SNodeList * pGroupTags , bool groupSort , SReadHandle * pHandle ,
2022-07-19 07:52:08 +00:00
STableListInfo * pTableListInfo , SNode * pTagCond , SNode * pTagIndexCond ,
const char * idStr ) {
2022-07-18 07:31:39 +00:00
int32_t code = getTableList ( pHandle - > meta , pHandle - > vnode , pScanNode , pTagCond , pTagIndexCond , pTableListInfo ) ;
2022-06-14 10:17:18 +00:00
if ( code ! = TSDB_CODE_SUCCESS ) {
2022-06-22 10:51:16 +00:00
return code ;
2022-06-14 10:17:18 +00:00
}
if ( taosArrayGetSize ( pTableListInfo - > pTableList ) = = 0 ) {
2022-07-18 07:31:39 +00:00
qDebug ( " no table qualified for query, %s " PRIx64 , idStr ) ;
2022-06-22 10:51:16 +00:00
return TSDB_CODE_SUCCESS ;
}
2022-07-13 07:06:27 +00:00
2022-07-15 03:43:06 +00:00
pTableListInfo - > needSortTableByGroupId = groupSort ;
code = generateGroupIdMap ( pTableListInfo , pHandle , pGroupTags ) ;
2022-06-14 10:17:18 +00:00
if ( code ! = TSDB_CODE_SUCCESS ) {
2022-06-23 11:58:12 +00:00
return code ;
2022-06-22 12:26:44 +00:00
}
return TSDB_CODE_SUCCESS ;
}
2022-06-25 05:52:52 +00:00
int32_t createMultipleDataReaders ( SQueryTableDataCond * pQueryCond , SReadHandle * pHandle , STableListInfo * pTableListInfo ,
2022-06-28 07:22:32 +00:00
int32_t tableStartIdx , int32_t tableEndIdx , SArray * arrayReader , const char * idstr ) {
2022-06-25 05:52:52 +00:00
for ( int32_t i = tableStartIdx ; i < = tableEndIdx ; + + i ) {
SArray * subTableList = taosArrayInit ( 1 , sizeof ( STableKeyInfo ) ) ;
taosArrayPush ( subTableList , taosArrayGet ( pTableListInfo - > pTableList , i ) ) ;
2022-06-28 07:22:32 +00:00
STsdbReader * pReader = NULL ;
tsdbReaderOpen ( pHandle - > vnode , pQueryCond , subTableList , & pReader , idstr ) ;
2022-06-25 05:52:52 +00:00
taosArrayPush ( arrayReader , & pReader ) ;
taosArrayDestroy ( subTableList ) ;
}
return TSDB_CODE_SUCCESS ;
}
2022-06-23 02:37:07 +00:00
// todo refactor
2022-06-14 10:17:18 +00:00
static int32_t loadDataBlockFromOneTable ( SOperatorInfo * pOperator , STableMergeScanInfo * pTableScanInfo ,
int32_t readerIdx , SSDataBlock * pBlock , uint32_t * status ) {
2022-06-20 06:29:18 +00:00
SExecTaskInfo * pTaskInfo = pOperator - > pTaskInfo ;
2022-06-14 15:34:50 +00:00
STableMergeScanInfo * pInfo = pOperator - > info ;
2022-06-14 10:17:18 +00:00
SFileBlockLoadRecorder * pCost = & pTableScanInfo - > readRecorder ;
pCost - > totalBlocks + = 1 ;
pCost - > totalRows + = pBlock - > info . rows ;
* status = pInfo - > dataBlockLoadFlag ;
if ( pTableScanInfo - > pFilterNode ! = NULL | |
overlapWithTimeWindow ( & pTableScanInfo - > interval , & pBlock - > info , pTableScanInfo - > cond . order ) ) {
( * status ) = FUNC_DATA_REQUIRED_DATA_LOAD ;
}
SDataBlockInfo * pBlockInfo = & pBlock - > info ;
taosMemoryFreeClear ( pBlock - > pBlockAgg ) ;
if ( * status = = FUNC_DATA_REQUIRED_FILTEROUT ) {
qDebug ( " %s data block filter out, brange:% " PRId64 " -% " PRId64 " , rows:%d " , GET_TASKID ( pTaskInfo ) ,
pBlockInfo - > window . skey , pBlockInfo - > window . ekey , pBlockInfo - > rows ) ;
pCost - > filterOutBlocks + = 1 ;
return TSDB_CODE_SUCCESS ;
} else if ( * status = = FUNC_DATA_REQUIRED_NOT_LOAD ) {
qDebug ( " %s data block skipped, brange:% " PRId64 " -% " PRId64 " , rows:%d " , GET_TASKID ( pTaskInfo ) ,
pBlockInfo - > window . skey , pBlockInfo - > window . ekey , pBlockInfo - > rows ) ;
pCost - > skipBlocks + = 1 ;
// clear all data in pBlock that are set when handing the previous block
2022-06-22 09:21:04 +00:00
for ( int32_t i = 0 ; i < taosArrayGetSize ( pBlock - > pDataBlock ) ; + + i ) {
2022-06-14 10:17:18 +00:00
SColumnInfoData * pcol = taosArrayGet ( pBlock - > pDataBlock , i ) ;
pcol - > pData = NULL ;
}
return TSDB_CODE_SUCCESS ;
} else if ( * status = = FUNC_DATA_REQUIRED_STATIS_LOAD ) {
pCost - > loadBlockStatis + = 1 ;
bool allColumnsHaveAgg = true ;
SColumnDataAgg * * pColAgg = NULL ;
2022-06-16 06:29:28 +00:00
STsdbReader * reader = taosArrayGetP ( pTableScanInfo - > dataReaders , readerIdx ) ;
2022-07-07 07:56:43 +00:00
tsdbRetrieveDatablockSMA ( reader , & pColAgg , & allColumnsHaveAgg ) ;
2022-06-14 10:17:18 +00:00
if ( allColumnsHaveAgg = = true ) {
2022-06-22 09:21:04 +00:00
int32_t numOfCols = taosArrayGetSize ( pBlock - > pDataBlock ) ;
2022-06-14 10:17:18 +00:00
// todo create this buffer during creating operator
if ( pBlock - > pBlockAgg = = NULL ) {
pBlock - > pBlockAgg = taosMemoryCalloc ( numOfCols , POINTER_BYTES ) ;
}
for ( int32_t i = 0 ; i < numOfCols ; + + i ) {
SColMatchInfo * pColMatchInfo = taosArrayGet ( pTableScanInfo - > pColMatchInfo , i ) ;
if ( ! pColMatchInfo - > output ) {
continue ;
}
pBlock - > pBlockAgg [ pColMatchInfo - > targetSlotId ] = pColAgg [ i ] ;
}
return TSDB_CODE_SUCCESS ;
} else { // failed to load the block sma data, data block statistics does not exist, load data block instead
* status = FUNC_DATA_REQUIRED_DATA_LOAD ;
}
}
ASSERT ( * status = = FUNC_DATA_REQUIRED_DATA_LOAD ) ;
// todo filter data block according to the block sma data firstly
#if 0
if ( ! doFilterByBlockStatistics ( pBlock - > pBlockStatis , pTableScanInfo - > pCtx , pBlockInfo - > rows ) ) {
pCost - > filterOutBlocks + = 1 ;
qDebug ( " %s data block filter out, brange:% " PRId64 " -% " PRId64 " , rows:%d " , GET_TASKID ( pTaskInfo ) , pBlockInfo - > window . skey ,
pBlockInfo - > window . ekey , pBlockInfo - > rows ) ;
( * status ) = FUNC_DATA_REQUIRED_FILTEROUT ;
return TSDB_CODE_SUCCESS ;
}
# endif
pCost - > totalCheckedRows + = pBlock - > info . rows ;
pCost - > loadBlocks + = 1 ;
2022-06-16 06:29:28 +00:00
STsdbReader * reader = taosArrayGetP ( pTableScanInfo - > dataReaders , readerIdx ) ;
2022-06-14 10:17:18 +00:00
SArray * pCols = tsdbRetrieveDataBlock ( reader , NULL ) ;
if ( pCols = = NULL ) {
return terrno ;
}
2022-06-20 08:39:19 +00:00
relocateColumnData ( pBlock , pTableScanInfo - > pColMatchInfo , pCols , true ) ;
2022-06-14 10:17:18 +00:00
// currently only the tbname pseudo column
2022-07-25 07:34:11 +00:00
if ( pTableScanInfo - > pseudoSup . numOfExprs > 0 ) {
int32_t code = addTagPseudoColumnData ( & pTableScanInfo - > readHandle , pTableScanInfo - > pseudoSup . pExprInfo ,
pTableScanInfo - > pseudoSup . numOfExprs , pBlock , GET_TASKID ( pTaskInfo ) ) ;
2022-07-09 04:13:21 +00:00
if ( code ! = TSDB_CODE_SUCCESS ) {
longjmp ( pTaskInfo - > env , code ) ;
}
2022-06-14 10:17:18 +00:00
}
2022-07-29 01:56:03 +00:00
if ( pTableScanInfo - > pFilterNode ! = NULL ) {
int64_t st = taosGetTimestampMs ( ) ;
doFilter ( pTableScanInfo - > pFilterNode , pBlock , pTableScanInfo - > pColMatchInfo ) ;
2022-06-14 10:17:18 +00:00
2022-07-29 01:56:03 +00:00
double el = ( taosGetTimestampUs ( ) - st ) / 1000.0 ;
pTableScanInfo - > readRecorder . filterTime + = el ;
2022-06-14 10:17:18 +00:00
2022-07-29 01:56:03 +00:00
if ( pBlock - > info . rows = = 0 ) {
pCost - > filterOutBlocks + = 1 ;
qDebug ( " %s data block filter out, brange:% " PRId64 " -% " PRId64 " , rows:%d, elapsed time:%.2f ms " ,
GET_TASKID ( pTaskInfo ) , pBlockInfo - > window . skey , pBlockInfo - > window . ekey , pBlockInfo - > rows , el ) ;
} else {
qDebug ( " %s data block filter applied, elapsed time:%.2f ms " , GET_TASKID ( pTaskInfo ) , el ) ;
}
2022-06-14 10:17:18 +00:00
}
return TSDB_CODE_SUCCESS ;
}
typedef struct STableMergeScanSortSourceParam {
SOperatorInfo * pOperator ;
int32_t readerIdx ;
2022-06-15 12:12:04 +00:00
SSDataBlock * inputBlock ;
2022-06-14 10:17:18 +00:00
} STableMergeScanSortSourceParam ;
static SSDataBlock * getTableDataBlock ( void * param ) {
STableMergeScanSortSourceParam * source = param ;
SOperatorInfo * pOperator = source - > pOperator ;
int32_t readerIdx = source - > readerIdx ;
2022-06-15 12:12:04 +00:00
SSDataBlock * pBlock = source - > inputBlock ;
2022-06-14 10:17:18 +00:00
STableMergeScanInfo * pTableScanInfo = pOperator - > info ;
int64_t st = taosGetTimestampUs ( ) ;
2022-06-15 12:12:04 +00:00
blockDataCleanup ( pBlock ) ;
2022-06-16 06:29:28 +00:00
STsdbReader * reader = taosArrayGetP ( pTableScanInfo - > dataReaders , readerIdx ) ;
2022-06-14 10:17:18 +00:00
while ( tsdbNextDataBlock ( reader ) ) {
if ( isTaskKilled ( pOperator - > pTaskInfo ) ) {
longjmp ( pOperator - > pTaskInfo - > env , TSDB_CODE_TSC_QUERY_CANCELLED ) ;
}
// process this data block based on the probabilities
bool processThisBlock = processBlockWithProbability ( & pTableScanInfo - > sample ) ;
if ( ! processThisBlock ) {
continue ;
}
2022-06-23 01:42:29 +00:00
blockDataCleanup ( pBlock ) ;
SDataBlockInfo binfo = pBlock - > info ;
tsdbRetrieveDataBlockInfo ( reader , & binfo ) ;
2022-07-13 12:58:14 +00:00
blockDataEnsureCapacity ( pBlock , binfo . rows ) ;
2022-07-13 11:58:07 +00:00
pBlock - > info . type = binfo . type ;
pBlock - > info . uid = binfo . uid ;
pBlock - > info . window = binfo . window ;
pBlock - > info . rows = binfo . rows ;
2022-06-14 10:17:18 +00:00
uint32_t status = 0 ;
int32_t code = loadDataBlockFromOneTable ( pOperator , pTableScanInfo , readerIdx , pBlock , & status ) ;
// int32_t code = loadDataBlockOnDemand(pOperator->pRuntimeEnv, pTableScanInfo, pBlock, &status);
if ( code ! = TSDB_CODE_SUCCESS ) {
longjmp ( pOperator - > pTaskInfo - > env , code ) ;
}
// current block is filter out according to filter condition, continue load the next block
if ( status = = FUNC_DATA_REQUIRED_FILTEROUT | | pBlock - > info . rows = = 0 ) {
continue ;
}
uint64_t * groupId = taosHashGet ( pOperator - > pTaskInfo - > tableqinfoList . map , & pBlock - > info . uid , sizeof ( int64_t ) ) ;
if ( groupId ) {
pBlock - > info . groupId = * groupId ;
}
pOperator - > resultInfo . totalRows = pTableScanInfo - > readRecorder . totalRows ;
pTableScanInfo - > readRecorder . elapsedTime + = ( taosGetTimestampUs ( ) - st ) / 1000.0 ;
return pBlock ;
}
return NULL ;
}
2022-07-14 01:19:36 +00:00
SArray * generateSortByTsInfo ( SArray * colMatchInfo , int32_t order ) {
int32_t tsTargetSlotId = 0 ;
for ( int32_t i = 0 ; i < taosArrayGetSize ( colMatchInfo ) ; + + i ) {
SColMatchInfo * colInfo = taosArrayGet ( colMatchInfo , i ) ;
if ( colInfo - > colId = = PRIMARYKEY_TIMESTAMP_COL_ID ) {
tsTargetSlotId = colInfo - > targetSlotId ;
}
}
2022-06-14 10:17:18 +00:00
SArray * pList = taosArrayInit ( 1 , sizeof ( SBlockOrderInfo ) ) ;
SBlockOrderInfo bi = { 0 } ;
bi . order = order ;
2022-07-14 01:19:36 +00:00
bi . slotId = tsTargetSlotId ;
2022-06-14 10:17:18 +00:00
bi . nullFirst = NULL_ORDER_FIRST ;
taosArrayPush ( pList , & bi ) ;
return pList ;
}
2022-06-22 12:26:44 +00:00
int32_t startGroupTableMergeScan ( SOperatorInfo * pOperator ) {
2022-06-14 10:17:18 +00:00
STableMergeScanInfo * pInfo = pOperator - > info ;
SExecTaskInfo * pTaskInfo = pOperator - > pTaskInfo ;
2022-06-25 05:52:52 +00:00
{
size_t tableListSize = taosArrayGetSize ( pInfo - > tableListInfo - > pTableList ) ;
int32_t i = pInfo - > tableStartIndex + 1 ;
for ( ; i < tableListSize ; + + i ) {
STableKeyInfo * tableKeyInfo = taosArrayGet ( pInfo - > tableListInfo - > pTableList , i ) ;
if ( tableKeyInfo - > groupId ! = pInfo - > groupId ) {
break ;
}
}
pInfo - > tableEndIndex = i - 1 ;
}
2022-06-14 10:17:18 +00:00
2022-06-25 05:52:52 +00:00
int32_t tableStartIdx = pInfo - > tableStartIndex ;
int32_t tableEndIdx = pInfo - > tableEndIndex ;
2022-06-14 10:17:18 +00:00
2022-06-25 05:52:52 +00:00
STableListInfo * tableListInfo = pInfo - > tableListInfo ;
2022-07-22 09:06:08 +00:00
pInfo - > dataReaders = taosArrayInit ( 64 , POINTER_BYTES ) ;
2022-06-25 05:52:52 +00:00
createMultipleDataReaders ( & pInfo - > cond , & pInfo - > readHandle , tableListInfo , tableStartIdx , tableEndIdx ,
2022-07-04 03:42:50 +00:00
pInfo - > dataReaders , GET_TASKID ( pTaskInfo ) ) ;
2022-06-14 10:17:18 +00:00
2022-06-22 12:26:44 +00:00
// todo the total available buffer should be determined by total capacity of buffer of this task.
// the additional one is reserved for merge result
2022-06-25 05:52:52 +00:00
pInfo - > sortBufSize = pInfo - > bufPageSize * ( tableEndIdx - tableStartIdx + 1 + 1 ) ;
2022-06-22 12:26:44 +00:00
int32_t numOfBufPage = pInfo - > sortBufSize / pInfo - > bufPageSize ;
2022-06-20 06:40:13 +00:00
pInfo - > pSortHandle = tsortCreateSortHandle ( pInfo - > pSortInfo , SORT_MULTISOURCE_MERGE , pInfo - > bufPageSize , numOfBufPage ,
pInfo - > pSortInputBlock , pTaskInfo - > id . str ) ;
2022-06-14 10:17:18 +00:00
tsortSetFetchRawDataFp ( pInfo - > pSortHandle , getTableDataBlock , NULL , NULL ) ;
size_t numReaders = taosArrayGetSize ( pInfo - > dataReaders ) ;
2022-06-22 12:26:44 +00:00
for ( int32_t i = 0 ; i < numReaders ; + + i ) {
STableMergeScanSortSourceParam param = { 0 } ;
param . readerIdx = i ;
param . pOperator = pOperator ;
param . inputBlock = createOneDataBlock ( pInfo - > pResBlock , false ) ;
taosArrayPush ( pInfo - > sortSourceParams , & param ) ;
}
2022-06-14 10:17:18 +00:00
for ( int32_t i = 0 ; i < numReaders ; + + i ) {
SSortSource * ps = taosMemoryCalloc ( 1 , sizeof ( SSortSource ) ) ;
2022-06-15 12:12:04 +00:00
STableMergeScanSortSourceParam * param = taosArrayGet ( pInfo - > sortSourceParams , i ) ;
2022-06-14 10:17:18 +00:00
ps - > param = param ;
tsortAddSource ( pInfo - > pSortHandle , ps ) ;
}
int32_t code = tsortOpen ( pInfo - > pSortHandle ) ;
if ( code ! = TSDB_CODE_SUCCESS ) {
longjmp ( pTaskInfo - > env , terrno ) ;
}
2022-06-22 12:26:44 +00:00
return TSDB_CODE_SUCCESS ;
}
int32_t stopGroupTableMergeScan ( SOperatorInfo * pOperator ) {
STableMergeScanInfo * pInfo = pOperator - > info ;
SExecTaskInfo * pTaskInfo = pOperator - > pTaskInfo ;
2022-07-25 08:41:32 +00:00
size_t numReaders = taosArrayGetSize ( pInfo - > dataReaders ) ;
2022-07-26 03:14:17 +00:00
SSortExecInfo sortExecInfo = tsortGetSortExecInfo ( pInfo - > pSortHandle ) ;
pInfo - > sortExecInfo . sortMethod = sortExecInfo . sortMethod ;
pInfo - > sortExecInfo . sortBuffer = sortExecInfo . sortBuffer ;
pInfo - > sortExecInfo . loops + = sortExecInfo . loops ;
pInfo - > sortExecInfo . readBytes + = sortExecInfo . readBytes ;
pInfo - > sortExecInfo . writeBytes + = sortExecInfo . writeBytes ;
2022-07-25 08:41:32 +00:00
for ( int32_t i = 0 ; i < numReaders ; + + i ) {
STableMergeScanSortSourceParam * param = taosArrayGet ( pInfo - > sortSourceParams , i ) ;
blockDataDestroy ( param - > inputBlock ) ;
}
2022-06-22 12:26:44 +00:00
taosArrayClear ( pInfo - > sortSourceParams ) ;
2022-07-25 08:41:32 +00:00
tsortDestroySortHandle ( pInfo - > pSortHandle ) ;
for ( int32_t i = 0 ; i < numReaders ; + + i ) {
2022-06-28 07:22:32 +00:00
STsdbReader * reader = taosArrayGetP ( pInfo - > dataReaders , i ) ;
tsdbReaderClose ( reader ) ;
2022-06-22 12:26:44 +00:00
}
2022-07-06 05:33:21 +00:00
taosArrayDestroy ( pInfo - > dataReaders ) ;
pInfo - > dataReaders = NULL ;
2022-06-14 10:17:18 +00:00
return TSDB_CODE_SUCCESS ;
}
2022-07-27 02:52:25 +00:00
SSDataBlock * getSortedTableMergeScanBlockData ( SSortHandle * pHandle , SSDataBlock * pResBlock , int32_t capacity ,
SOperatorInfo * pOperator ) {
2022-06-14 10:17:18 +00:00
STableMergeScanInfo * pInfo = pOperator - > info ;
SExecTaskInfo * pTaskInfo = pOperator - > pTaskInfo ;
2022-07-25 08:41:32 +00:00
blockDataCleanup ( pResBlock ) ;
blockDataEnsureCapacity ( pResBlock , capacity ) ;
2022-06-14 10:17:18 +00:00
while ( 1 ) {
2022-06-17 01:18:53 +00:00
STupleHandle * pTupleHandle = tsortNextTuple ( pHandle ) ;
2022-06-14 10:17:18 +00:00
if ( pTupleHandle = = NULL ) {
break ;
}
2022-07-25 08:41:32 +00:00
appendOneRowToDataBlock ( pResBlock , pTupleHandle ) ;
if ( pResBlock - > info . rows > = capacity ) {
2022-06-14 10:17:18 +00:00
break ;
}
}
2022-07-25 08:41:32 +00:00
qDebug ( " %s get sorted row blocks, rows:%d " , GET_TASKID ( pTaskInfo ) , pResBlock - > info . rows ) ;
return ( pResBlock - > info . rows > 0 ) ? pResBlock : NULL ;
2022-06-14 10:17:18 +00:00
}
SSDataBlock * doTableMergeScan ( SOperatorInfo * pOperator ) {
if ( pOperator - > status = = OP_EXEC_DONE ) {
return NULL ;
}
SExecTaskInfo * pTaskInfo = pOperator - > pTaskInfo ;
STableMergeScanInfo * pInfo = pOperator - > info ;
int32_t code = pOperator - > fpSet . _openFn ( pOperator ) ;
if ( code ! = TSDB_CODE_SUCCESS ) {
longjmp ( pTaskInfo - > env , code ) ;
}
2022-06-25 05:52:52 +00:00
size_t tableListSize = taosArrayGetSize ( pInfo - > tableListInfo - > pTableList ) ;
if ( ! pInfo - > hasGroupId ) {
pInfo - > hasGroupId = true ;
2022-06-14 10:17:18 +00:00
2022-06-25 05:52:52 +00:00
if ( tableListSize = = 0 ) {
2022-06-22 14:32:29 +00:00
doSetOperatorCompleted ( pOperator ) ;
return NULL ;
}
2022-06-25 05:52:52 +00:00
pInfo - > tableStartIndex = 0 ;
pInfo - > groupId = ( ( STableKeyInfo * ) taosArrayGet ( pInfo - > tableListInfo - > pTableList , pInfo - > tableStartIndex ) ) - > groupId ;
2022-06-22 12:26:44 +00:00
startGroupTableMergeScan ( pOperator ) ;
}
2022-06-25 05:52:52 +00:00
SSDataBlock * pBlock = NULL ;
while ( pInfo - > tableStartIndex < tableListSize ) {
2022-07-27 02:52:25 +00:00
pBlock = getSortedTableMergeScanBlockData ( pInfo - > pSortHandle , pInfo - > pResBlock , pOperator - > resultInfo . capacity ,
pOperator ) ;
2022-06-25 05:52:52 +00:00
if ( pBlock ! = NULL ) {
pBlock - > info . groupId = pInfo - > groupId ;
pOperator - > resultInfo . totalRows + = pBlock - > info . rows ;
return pBlock ;
} else {
stopGroupTableMergeScan ( pOperator ) ;
if ( pInfo - > tableEndIndex > = tableListSize - 1 ) {
doSetOperatorCompleted ( pOperator ) ;
break ;
}
pInfo - > tableStartIndex = pInfo - > tableEndIndex + 1 ;
pInfo - > groupId =
( ( STableKeyInfo * ) taosArrayGet ( pInfo - > tableListInfo - > pTableList , pInfo - > tableStartIndex ) ) - > groupId ;
startGroupTableMergeScan ( pOperator ) ;
}
2022-06-23 11:58:12 +00:00
}
2022-06-14 10:17:18 +00:00
return pBlock ;
}
void destroyTableMergeScanOperatorInfo ( void * param , int32_t numOfOutput ) {
STableMergeScanInfo * pTableScanInfo = ( STableMergeScanInfo * ) param ;
2022-06-17 11:01:45 +00:00
cleanupQueryTableDataCond ( & pTableScanInfo - > cond ) ;
2022-07-25 08:41:32 +00:00
taosArrayDestroy ( pTableScanInfo - > sortSourceParams ) ;
2022-06-14 10:17:18 +00:00
for ( int32_t i = 0 ; i < taosArrayGetSize ( pTableScanInfo - > dataReaders ) ; + + i ) {
2022-06-16 06:29:28 +00:00
STsdbReader * reader = taosArrayGetP ( pTableScanInfo - > dataReaders , i ) ;
2022-06-16 11:14:56 +00:00
tsdbReaderClose ( reader ) ;
2022-06-14 10:17:18 +00:00
}
taosArrayDestroy ( pTableScanInfo - > dataReaders ) ;
if ( pTableScanInfo - > pColMatchInfo ! = NULL ) {
taosArrayDestroy ( pTableScanInfo - > pColMatchInfo ) ;
}
pTableScanInfo - > pResBlock = blockDataDestroy ( pTableScanInfo - > pResBlock ) ;
pTableScanInfo - > pSortInputBlock = blockDataDestroy ( pTableScanInfo - > pSortInputBlock ) ;
taosArrayDestroy ( pTableScanInfo - > pSortInfo ) ;
2022-07-25 07:23:43 +00:00
cleanupExprSupp ( & pTableScanInfo - > pseudoSup ) ;
2022-07-08 13:37:15 +00:00
2022-07-25 07:17:53 +00:00
taosMemoryFreeClear ( pTableScanInfo - > rowEntryInfoOffset ) ;
2022-07-08 06:26:53 +00:00
taosMemoryFreeClear ( param ) ;
2022-06-14 10:17:18 +00:00
}
2022-06-14 11:44:48 +00:00
typedef struct STableMergeScanExecInfo {
SFileBlockLoadRecorder blockRecorder ;
2022-06-20 06:29:18 +00:00
SSortExecInfo sortExecInfo ;
2022-06-14 11:44:48 +00:00
} STableMergeScanExecInfo ;
2022-06-14 10:17:18 +00:00
int32_t getTableMergeScanExplainExecInfo ( SOperatorInfo * pOptr , void * * pOptrExplain , uint32_t * len ) {
ASSERT ( pOptr ! = NULL ) ;
2022-06-14 11:44:48 +00:00
// TODO: merge these two info into one struct
STableMergeScanExecInfo * execInfo = taosMemoryCalloc ( 1 , sizeof ( STableMergeScanExecInfo ) ) ;
2022-06-20 06:29:18 +00:00
STableMergeScanInfo * pInfo = pOptr - > info ;
2022-06-14 11:44:48 +00:00
execInfo - > blockRecorder = pInfo - > readRecorder ;
2022-07-26 03:14:17 +00:00
execInfo - > sortExecInfo = pInfo - > sortExecInfo ;
2022-06-14 11:44:48 +00:00
* pOptrExplain = execInfo ;
* len = sizeof ( STableMergeScanExecInfo ) ;
2022-06-20 06:29:18 +00:00
2022-06-14 10:17:18 +00:00
return TSDB_CODE_SUCCESS ;
}
2022-06-25 05:52:52 +00:00
int32_t compareTableKeyInfoByGid ( const void * p1 , const void * p2 ) {
const STableKeyInfo * info1 = p1 ;
const STableKeyInfo * info2 = p2 ;
2022-07-22 09:06:08 +00:00
if ( info1 - > groupId < info2 - > groupId ) {
return - 1 ;
} else if ( info1 - > groupId > info2 - > groupId ) {
return 1 ;
} else {
return 0 ;
}
2022-06-25 05:52:52 +00:00
}
2022-06-22 12:26:44 +00:00
SOperatorInfo * createTableMergeScanOperatorInfo ( STableScanPhysiNode * pTableScanNode , STableListInfo * pTableListInfo ,
2022-07-18 07:31:39 +00:00
SReadHandle * readHandle , SExecTaskInfo * pTaskInfo ) {
2022-06-14 10:17:18 +00:00
STableMergeScanInfo * pInfo = taosMemoryCalloc ( 1 , sizeof ( STableMergeScanInfo ) ) ;
SOperatorInfo * pOperator = taosMemoryCalloc ( 1 , sizeof ( SOperatorInfo ) ) ;
if ( pInfo = = NULL | | pOperator = = NULL ) {
goto _error ;
}
2022-06-27 07:57:02 +00:00
if ( pTableScanNode - > pGroupTags ) {
2022-06-25 05:52:52 +00:00
taosArraySort ( pTableListInfo - > pTableList , compareTableKeyInfoByGid ) ;
}
2022-06-14 10:17:18 +00:00
SDataBlockDescNode * pDescNode = pTableScanNode - > scan . node . pOutputDataBlockDesc ;
int32_t numOfCols = 0 ;
2022-06-20 06:40:13 +00:00
SArray * pColList = extractColMatchInfo ( pTableScanNode - > scan . pScanCols , pDescNode , & numOfCols , COL_MATCH_FROM_COL_ID ) ;
2022-06-14 10:17:18 +00:00
int32_t code = initQueryTableDataCond ( & pInfo - > cond , pTableScanNode ) ;
if ( code ! = TSDB_CODE_SUCCESS ) {
goto _error ;
}
if ( pTableScanNode - > scan . pScanPseudoCols ! = NULL ) {
2022-07-25 07:23:43 +00:00
SExprSupp * pSup = & pInfo - > pseudoSup ;
pSup - > pExprInfo = createExprInfo ( pTableScanNode - > scan . pScanPseudoCols , NULL , & pSup - > numOfExprs ) ;
pSup - > pCtx = createSqlFunctionCtx ( pSup - > pExprInfo , pSup - > numOfExprs , & pSup - > rowEntryInfoOffset ) ;
2022-06-14 10:17:18 +00:00
}
pInfo - > scanInfo = ( SScanInfo ) { . numOfAsc = pTableScanNode - > scanSeq [ 0 ] , . numOfDesc = pTableScanNode - > scanSeq [ 1 ] } ;
2022-06-20 06:29:18 +00:00
pInfo - > readHandle = * readHandle ;
pInfo - > interval = extractIntervalInfo ( pTableScanNode ) ;
2022-06-14 10:17:18 +00:00
pInfo - > sample . sampleRatio = pTableScanNode - > ratio ;
2022-06-20 06:29:18 +00:00
pInfo - > sample . seed = taosGetTimestampSec ( ) ;
pInfo - > dataBlockLoadFlag = pTableScanNode - > dataRequired ;
pInfo - > pFilterNode = pTableScanNode - > scan . node . pConditions ;
2022-06-22 12:26:44 +00:00
pInfo - > tableListInfo = pTableListInfo ;
2022-06-20 06:29:18 +00:00
pInfo - > scanFlag = MAIN_SCAN ;
pInfo - > pColMatchInfo = pColList ;
2022-06-14 10:17:18 +00:00
pInfo - > pResBlock = createResDataBlock ( pDescNode ) ;
2022-06-22 12:26:44 +00:00
pInfo - > sortSourceParams = taosArrayInit ( 64 , sizeof ( STableMergeScanSortSourceParam ) ) ;
2022-06-17 01:18:53 +00:00
2022-07-14 01:19:36 +00:00
pInfo - > pSortInfo = generateSortByTsInfo ( pInfo - > pColMatchInfo , pInfo - > cond . order ) ;
2022-06-14 10:17:18 +00:00
pInfo - > pSortInputBlock = createOneDataBlock ( pInfo - > pResBlock , false ) ;
2022-06-17 01:18:53 +00:00
2022-06-14 10:17:18 +00:00
int32_t rowSize = pInfo - > pResBlock - > info . rowSize ;
2022-06-20 06:29:18 +00:00
pInfo - > bufPageSize = getProperSortPageSize ( rowSize ) ;
2022-06-17 01:20:19 +00:00
2022-06-20 06:29:18 +00:00
pOperator - > name = " TableMergeScanOperator " ;
2022-06-16 11:49:42 +00:00
pOperator - > operatorType = QUERY_NODE_PHYSICAL_PLAN_TABLE_MERGE_SCAN ;
2022-06-20 06:29:18 +00:00
pOperator - > blocking = false ;
pOperator - > status = OP_NOT_OPENED ;
pOperator - > info = pInfo ;
2022-06-20 06:40:13 +00:00
pOperator - > exprSupp . numOfExprs = numOfCols ;
2022-06-20 06:29:18 +00:00
pOperator - > pTaskInfo = pTaskInfo ;
2022-07-20 06:07:48 +00:00
initResultSizeInfo ( & pOperator - > resultInfo , 1024 ) ;
2022-06-14 10:17:18 +00:00
pOperator - > fpSet =
2022-06-22 13:56:55 +00:00
createOperatorFpSet ( operatorDummyOpenFn , doTableMergeScan , NULL , NULL , destroyTableMergeScanOperatorInfo , NULL ,
NULL , getTableMergeScanExplainExecInfo ) ;
2022-06-14 10:17:18 +00:00
pOperator - > cost . openCost = 0 ;
return pOperator ;
_error :
pTaskInfo - > code = TSDB_CODE_OUT_OF_MEMORY ;
taosMemoryFree ( pInfo ) ;
taosMemoryFree ( pOperator ) ;
return NULL ;
}