mirror of
https://github.com/taosdata/TDengine
synced 2026-05-24 10:09:01 +00:00
306 lines
15 KiB
C
306 lines
15 KiB
C
/*
|
|
* 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/>.
|
|
*/
|
|
|
|
#ifndef _TD_QUERY_INT_H_
|
|
#define _TD_QUERY_INT_H_
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
// clang-format off
|
|
#include "nodes.h"
|
|
#include "plannodes.h"
|
|
|
|
#define EXPLAIN_MAX_GROUP_NUM 100
|
|
|
|
//newline area
|
|
#define EXPLAIN_TAG_SCAN_FORMAT "Tag Scan on %s"
|
|
#define EXPLAIN_VIRTUAL_TABLE_SCAN_FORMAT "Virtual Table Scan on %s"
|
|
#define EXPLAIN_TBL_SCAN_FORMAT "Table Scan on %s"
|
|
#define EXPLAIN_TBL_MERGE_SCAN_FORMAT "Table Merge Scan on %s"
|
|
#define EXPLAIN_SYSTBL_SCAN_FORMAT "System Table Scan on %s"
|
|
#define EXPLAIN_DISTBLK_SCAN_FORMAT "Block Dist Scan on %s"
|
|
#define EXPLAIN_LASTROW_SCAN_FORMAT "Last Row Scan on %s"
|
|
#define EXPLAIN_TABLE_COUNT_SCAN_FORMAT "Table Count Scan on %s"
|
|
#define EXPLAIN_PROJECTION_FORMAT "Projection"
|
|
#define EXPLAIN_JOIN_FORMAT "%s"
|
|
#define EXPLAIN_AGG_FORMAT "%s"
|
|
#define EXPLAIN_INDEF_ROWS_FORMAT "Indefinite Rows Function"
|
|
#define EXPLAIN_EXCHANGE_FORMAT "Data Exchange %d:1"
|
|
#define EXPLAIN_NETWORK_FORMAT "Network: "
|
|
#define EXPLAIN_EXCHANGE_MODE_FORMAT "mode=%s"
|
|
#define EXPLAIN_EXCHANGE_MODE_CONCURRENT "concurrent"
|
|
#define EXPLAIN_EXCHANGE_MODE_SEQUENCE "sequence"
|
|
#define EXPLAIN_FETCH_TIMES_FORMAT "fetch_times=%" PRIu64
|
|
#define EXPLAIN_FETCH_TIMES_FORMAT_EXT "fetch_times=%.1f(%" PRIu64 ")"
|
|
#define EXPLAIN_FETCH_ROWS_FORMAT "fetch_rows=%" PRIu64
|
|
#define EXPLAIN_FETCH_ROWS_FORMAT_EXT "fetch_rows=%.1f(%" PRIu64 ")"
|
|
#define EXPLAIN_FETCH_COST_FORMAT "fetch_cost=%.3f"
|
|
#define EXPLAIN_FETCH_COST_FORMAT_EXT "fetch_cost=%.3f(%.3f)"
|
|
#define EXPLAIN_SORT_FORMAT "Sort"
|
|
#define EXPLAIN_GROUP_SORT_FORMAT "Group Sort"
|
|
#define EXPLAIN_INTERVAL_FORMAT "Interval on Column %s"
|
|
#define EXPLAIN_MERGE_INTERVAL_FORMAT "Merge Interval on Column %s"
|
|
#define EXPLAIN_MERGE_ALIGNED_INTERVAL_FORMAT "Merge Aligned Interval on Column %s"
|
|
#define EXPLAIN_EXTERNAL_FORMAT "External on Column %s"
|
|
#define EXPLAIN_MERGE_EXTERNAL_FORMAT "Merge External on Column %s"
|
|
#define EXPLAIN_MERGE_ALIGNED_EXTERNAL_FORMAT "Merge Aligned External on Column %s"
|
|
#define EXPLAIN_FILL_FORMAT "Fill"
|
|
#define EXPLAIN_SESSION_FORMAT "Session"
|
|
#define EXPLAIN_STATE_WINDOW_FORMAT "StateWindow on Column %s"
|
|
#define EXPLAIN_PARITION_FORMAT "Partition on Column %s"
|
|
#define EXPLAIN_ORDER_FORMAT "Order: %s"
|
|
#define EXPLAIN_FILTER_FORMAT "Filter: "
|
|
#define EXPLAIN_PRIMARY_FILTER_FORMAT "Primary Filter: "
|
|
#define EXPLAIN_FILTER_CONDITIONS_FORMAT "conditions="
|
|
#define EXPLAIN_FILTER_EFFICIENCY_FORMAT "efficiency=%.1f%%"
|
|
#define EXPLAIN_TAG_INDEX_FORMAT "Tag Index Filter: "
|
|
#define EXPLAIN_MERGEBLOCKS_FORMAT "Merge ResBlocks: %s"
|
|
#define EXPLAIN_FILL_VALUE_FORMAT "Fill Values: "
|
|
#define EXPLAIN_PRIM_CONDITIONS_FORMAT "Join Prim Cond: "
|
|
#define EXPLAIN_ON_CONDITIONS_FORMAT "Join Full Cond: "
|
|
#define EXPLAIN_COL_ON_CONDITIONS_FORMAT "Join Col Cond: "
|
|
#define EXPLAIN_TIMERANGE_FORMAT "Time Range: [%" PRId64 ", %" PRId64 "]"
|
|
#define EXPLAIN_OUTPUT_FORMAT "Output: "
|
|
#define EXPLAIN_JOIN_PARAM_FORMAT "Join Param: "
|
|
#define EXPLAIN_TIME_WINDOWS_FORMAT "Time Window: interval=%" PRId64 "%c offset=%" PRId64 "%c sliding=%" PRId64 "%c"
|
|
#define EXPLAIN_WINDOW_FORMAT "Window: gap=%" PRId64
|
|
#define EXPLAIN_RATIO_TIME_FORMAT "Ratio: %f"
|
|
#define EXPLAIN_MERGE_FORMAT "Merge"
|
|
#define EXPLAIN_MERGE_KEYS_FORMAT "Merge Key: "
|
|
#define EXPLAIN_IGNORE_GROUPID_FORMAT "Ignore Group Id: %s"
|
|
#define EXPLAIN_PARTITION_KETS_FORMAT "Partition Key: "
|
|
#define EXPLAIN_INTERP_FORMAT "Interp"
|
|
#define EXPLAIN_EVENT_FORMAT "Event"
|
|
#define EXPLAIN_EVENT_START_FORMAT "Start Cond: "
|
|
#define EXPLAIN_EVENT_END_FORMAT "End Cond: "
|
|
#define EXPLAIN_GROUP_CACHE_FORMAT "Group Cache"
|
|
#define EXPLAIN_DYN_QRY_CTRL_FORMAT "Dynamic Query Control for %s"
|
|
#define EXPLAIN_COUNT_FORMAT "Count"
|
|
#define EXPLAIN_COUNT_INFO_FORMAT "Window Count Info"
|
|
#define EXPLAIN_JOIN_EQ_LEFT_FORMAT "Left Equal Cond: "
|
|
#define EXPLAIN_JOIN_EQ_RIGHT_FORMAT "Right Equal Cond: "
|
|
#define EXPLAIN_COUNT_NUM_FORMAT "Window Count=%" PRId64
|
|
#define EXPLAIN_COUNT_SLIDING_FORMAT "Window Sliding=%" PRId64
|
|
#define EXPLAIN_TABLE_TIMERANGE_FORMAT "%s Table Time Range: [%" PRId64 ", %" PRId64 "]"
|
|
|
|
#define EXPLAIN_PLANNING_TIME_FORMAT "Planning Time: %.3f ms"
|
|
#define EXPLAIN_EXEC_TIME_FORMAT "Execution Time: %.3f ms"
|
|
|
|
//append area
|
|
#define EXPLAIN_LIMIT_FORMAT "limit=%" PRId64
|
|
#define EXPLAIN_SLIMIT_FORMAT "slimit=%" PRId64
|
|
#define EXPLAIN_LEFT_PARENTHESIS_FORMAT " ("
|
|
#define EXPLAIN_RIGHT_PARENTHESIS_FORMAT ")"
|
|
#define EXPLAIN_BLANK_FORMAT " "
|
|
#define EXPLAIN_COMMA_FORMAT ", "
|
|
#define EXPLAIN_COST_FORMAT "cost=%.2f..%.2f"
|
|
#define EXPLAIN_ROWS_FORMAT "rows=%" PRIu64
|
|
#define EXPLAIN_COLUMNS_FORMAT "columns=%d"
|
|
#define EXPLAIN_PSEUDO_COLUMNS_FORMAT "pseudo_columns=%d"
|
|
#define EXPLAIN_WIDTH_FORMAT "width=%d"
|
|
#define EXPLAIN_SCAN_ORDER_FORMAT "order=[asc|%d desc|%d]"
|
|
#define EXPLAIN_SCAN_MODE_FORMAT "mode=%s"
|
|
#define EXPLAIN_SCAN_DATA_LOAD_FORMAT "data_load=%s"
|
|
#define EXPLAIN_GROUPS_FORMAT "groups=%d"
|
|
#define EXPLAIN_INTERVAL_VALUE_FORMAT "interval=%" PRId64 "%c"
|
|
#define EXPLAIN_FUNCTIONS_FORMAT "functions=%d"
|
|
#define EXPLAIN_EXECINFO_FORMAT "cost=%.3f..%.3f rows=%" PRIu64
|
|
#define EXPLAIN_EXECINFO_FORMAT_EXT "cost=%.3f(%.3f)..%.3f(%.3f) rows=%.1f(%" PRIu64 ")"
|
|
#define EXPLAIN_MODE_FORMAT "mode=%s"
|
|
#define EXPLAIN_STRING_TYPE_FORMAT "%s"
|
|
#define EXPLAIN_INPUT_ORDER_FORMAT "input_order=%s"
|
|
#define EXPLAIN_OUTPUT_ORDER_TYPE_FORMAT "output_order=%s"
|
|
#define EXPLAIN_OFFSET_FORMAT "offset=%" PRId64
|
|
#define EXPLAIN_SOFFSET_FORMAT "soffset=%" PRId64
|
|
#define EXPLAIN_PARTITIONS_FORMAT "partitions=%d"
|
|
#define EXPLAIN_GLOBAL_GROUP_FORMAT "global_group=%d"
|
|
#define EXPLAIN_GROUP_BY_UID_FORMAT "group_by_uid=%d"
|
|
#define EXPLAIN_BATCH_SCAN_FORMAT "batch_scan=%d"
|
|
#define EXPLAIN_VGROUP_SLOT_FORMAT "vgroup_slot=%d,%d"
|
|
#define EXPLAIN_UID_SLOT_FORMAT "uid_slot=%d,%d"
|
|
#define EXPLAIN_SRC_SCAN_FORMAT "src_scan=%d,%d"
|
|
#define EXPLAIN_PLAN_BLOCKING "blocking=%d"
|
|
#define EXPLAIN_MERGE_MODE_FORMAT "mode=%s"
|
|
#define EXPLAIN_ASOF_OP_FORMAT "asof_op='%s'"
|
|
#define EXPLAIN_WIN_OFFSET_FORMAT "window_offset=(%s, %s)"
|
|
#define EXPLAIN_JLIMIT_FORMAT "jlimit=%" PRId64
|
|
#define EXPLAIN_SEQ_WIN_GRP_FORMAT "seq_win_grp=%d"
|
|
#define EXPLAIN_GRP_JOIN_FORMAT "group_join=%d"
|
|
#define EXPLAIN_JOIN_ALGO "algo=%s"
|
|
#define EXPLAIN_ORIGIN_VGROUP_NUM_FORMAT "origin_vgroup_num=%d"
|
|
#define EXPLAIN_HAS_PARTITION_FORMAT "has_partition=%d"
|
|
#define EXPLAIN_BATCH_PROCESS_CHILD_FORMAT "batch_process_child=%d"
|
|
#define EXPLAIN_IO_FORMAT "I/O cost: "
|
|
#define EXPLAIN_TOTAL_BLOCKS_FORMAT "total_blocks=%" PRId64
|
|
#define EXPLAIN_TOTAL_BLOCKS_FORMAT_EXT "total_blocks=%.1f(%" PRId64 ")"
|
|
#define EXPLAIN_FILE_LOAD_BLOCKS_FORMAT "file_load_blocks=%" PRId64
|
|
#define EXPLAIN_FILE_LOAD_BLOCKS_FORMAT_EXT "file_load_blocks=%.1f(%" PRId64 ")"
|
|
#define EXPLAIN_FILE_LOAD_ELAPSED_FORMAT "file_load_elapsed=%.3f"
|
|
#define EXPLAIN_FILE_LOAD_ELAPSED_FORMAT_EXT "file_load_elapsed=%.3f(%.3f)"
|
|
#define EXPLAIN_STT_LOAD_BLOCKS_FORMAT "stt_load_blocks=%" PRId64
|
|
#define EXPLAIN_STT_LOAD_BLOCKS_FORMAT_EXT "stt_load_blocks=%.1f(%" PRId64 ")"
|
|
#define EXPLAIN_STT_LOAD_ELAPSED_FORMAT "stt_load_elapsed=%.3f"
|
|
#define EXPLAIN_STT_LOAD_ELAPSED_FORMAT_EXT "stt_load_elapsed=%.3f(%.3f)"
|
|
#define EXPLAIN_MEM_LOAD_BLOCKS_FORMAT "mem_load_blocks=%" PRId64
|
|
#define EXPLAIN_MEM_LOAD_BLOCKS_FORMAT_EXT "mem_load_blocks=%.1f(%" PRId64 ")"
|
|
#define EXPLAIN_MEM_LOAD_ELAPSED_FORMAT "mem_load_elapsed=%.3f"
|
|
#define EXPLAIN_MEM_LOAD_ELAPSED_FORMAT_EXT "mem_load_elapsed=%.3f(%.3f)"
|
|
#define EXPLAIN_COMPOSED_BLOCKS_FORMAT "composed_blocks=%" PRId64
|
|
#define EXPLAIN_COMPOSED_BLOCKS_FORMAT_EXT "composed_blocks=%.1f(%" PRId64 ")"
|
|
#define EXPLAIN_COMPOSED_ELAPSED_FORMAT "composed_elapsed=%.3f"
|
|
#define EXPLAIN_COMPOSED_ELAPSED_FORMAT_EXT "composed_elapsed=%.3f(%.3f)"
|
|
#define EXPLAIN_SMA_LOAD_BLOCKS_FORMAT "sma_load_blocks=%" PRId64
|
|
#define EXPLAIN_SMA_LOAD_BLOCKS_FORMAT_EXT "sma_load_blocks=%.1f(%" PRId64 ")"
|
|
#define EXPLAIN_SMA_LOAD_ELAPSED_FORMAT "sma_load_elapsed=%.3f"
|
|
#define EXPLAIN_SMA_LOAD_ELAPSED_FORMAT_EXT "sma_load_elapsed=%.3f(%.3f)"
|
|
#define EXPLAIN_CHECK_ROWS_FORMAT "check_rows=%" PRId64
|
|
#define EXPLAIN_CHECK_ROWS_FORMAT_EXT "check_rows=%.1f(%" PRId64 ")"
|
|
#define EXPLAIN_SLOWEST_NODE_FORMAT "slowest_vgroup_id=%d slow_deviation=%.1f%% cost_ratio=%.1f data_deviation=%.1f%%"
|
|
#define EXPLAIN_EXEC_COST_FORMAT "Exec cost: "
|
|
#define EXPLAIN_COMPUTE_FORMAT "compute=%.3f"
|
|
#define EXPLAIN_COMPUTE_FORMAT_EXT "compute=%.3f(%.3f)"
|
|
#define EXPLAIN_CREATE_FORMAT "create=%.3f"
|
|
#define EXPLAIN_CREATE_FORMAT_EXT "create=%.3f(%.3f)"
|
|
#define EXPLAIN_CREATE_TIME_FORMAT "create=%s"
|
|
#define EXPLAIN_CREATE_TIME_FORMAT_EXT "create=%s(%s)"
|
|
#define EXPLAIN_START_FORMAT "start=%.3f"
|
|
#define EXPLAIN_START_FORMAT_EXT "start=%.3f(%.3f)"
|
|
#define EXPLAIN_TIMES_FORMAT "times=%" PRId64
|
|
#define EXPLAIN_TIMES_FORMAT_EXT "times=%.1f(%" PRId64 ")"
|
|
#define EXPLAIN_INPUT_WAIT_ELAPSED_FORMAT "input_wait=%.3f"
|
|
#define EXPLAIN_INPUT_WAIT_ELAPSED_FORMAT_EXT "input_wait=%.3f(%.3f)"
|
|
#define EXPLAIN_OUTPUT_WAIT_ELAPSED_FORMAT "output_wait=%.3f"
|
|
#define EXPLAIN_OUTPUT_WAIT_ELAPSED_FORMAT_EXT "output_wait=%.3f(%.3f)"
|
|
|
|
#define COMMAND_RESET_LOG "resetLog"
|
|
#define COMMAND_SCHEDULE_POLICY "schedulePolicy"
|
|
#define COMMAND_ENABLE_RESCHEDULE "enableReSchedule"
|
|
#define COMMAND_CATALOG_DEBUG "catalogDebug"
|
|
#define COMMAND_ENABLE_MEM_DEBUG "enableMemDebug"
|
|
#define COMMAND_DISABLE_MEM_DEBUG "disableMemDebug"
|
|
|
|
typedef struct SExplainGroup {
|
|
int32_t nodeNum;
|
|
int32_t nodeIdx;
|
|
int32_t physiPlanExecNum;
|
|
int32_t physiPlanExecIdx;
|
|
bool singleChannel;
|
|
SRWLatch lock;
|
|
SSubplan *plan;
|
|
SArray *nodeExecInfo; //Array<SExplainRsp>
|
|
} SExplainGroup;
|
|
|
|
typedef struct SExplainResNode {
|
|
SNodeList* pChildren;
|
|
SPhysiNode* pNode;
|
|
SSubplan* pPlan;
|
|
SArray* pExecInfo; // Array<SExplainExecInfo>
|
|
} SExplainResNode;
|
|
|
|
typedef struct SQueryExplainRowInfo {
|
|
int32_t level;
|
|
int32_t len;
|
|
char *buf;
|
|
} SQueryExplainRowInfo;
|
|
|
|
typedef struct SExplainPlanCtx {
|
|
int32_t rootGroupId;
|
|
int32_t groupNum;
|
|
int32_t groupDoneNum;
|
|
SHashObj *groupHash; // Hash<SExplainGroup>
|
|
} SExplainPlanCtx;
|
|
|
|
typedef struct SExplainCtx {
|
|
EExplainMode mode;
|
|
double ratio;
|
|
bool verbose;
|
|
|
|
SRWLatch lock;
|
|
int32_t dataSize;
|
|
bool execDone;
|
|
int64_t reqStartTs;
|
|
int64_t jobStartTs;
|
|
int64_t jobDoneTs;
|
|
int64_t execZeroTs;
|
|
char *tbuf;
|
|
SArray *rows;
|
|
int32_t groupNum;
|
|
int32_t groupDoneNum;
|
|
int32_t currPlanId;
|
|
SExplainPlanCtx *pCurrPlanCtx;
|
|
SExplainPlanCtx planCtx;
|
|
SArray* subPlanCtxs;
|
|
} SExplainCtx;
|
|
|
|
#define EXPLAIN_ORDER_STRING(_order) ((ORDER_ASC == _order) ? "asc" : ORDER_DESC == _order ? "desc" : "unknown")
|
|
#define EXPLAIN_JOIN_STRING(_type) ((JOIN_TYPE_INNER == _type) ? "Inner join" : "Join")
|
|
#define EXPLAIN_MERGE_MODE_STRING(_mode) ((_mode) == MERGE_TYPE_SORT ? "sort" : ((_mode) == MERGE_TYPE_NON_SORT ? "merge" : "column"))
|
|
|
|
#define EXPLAIN_GET_CUR_PLAN_CTX(_ctx, _pid) ((_pid) < 0 ? &(_ctx)->planCtx : (SExplainPlanCtx*)taosArrayGet((_ctx)->subPlanCtxs, (_pid)))
|
|
|
|
#define INVERAL_TIME_FROM_PRECISION_TO_UNIT(_t, _u, _p, _r) \
|
|
do { \
|
|
if ((_u) == 'n' || (_u) == 'y') { \
|
|
_r = (_t); \
|
|
} else { \
|
|
code = convertTimeFromPrecisionToUnit(_t, _p, _u, &_r); \
|
|
} \
|
|
} while(0)
|
|
|
|
#define EXPLAIN_SUB_PLAN_LINE(_idx) \
|
|
do { \
|
|
tlen = snprintf(tbuf + VARSTR_HEADER_SIZE, TSDB_EXPLAIN_RESULT_ROW_SIZE - VARSTR_HEADER_SIZE, " InitPlan %d", (_idx)); \
|
|
varDataSetLen(tbuf, tlen); tlen += VARSTR_HEADER_SIZE; \
|
|
} while (0)
|
|
|
|
#define EXPLAIN_ROW_NEW(level, ...) \
|
|
do { \
|
|
if (isVerboseLine) { \
|
|
tlen = snprintf(tbuf + VARSTR_HEADER_SIZE, TSDB_EXPLAIN_RESULT_ROW_SIZE - VARSTR_HEADER_SIZE, "%*s", (level) * 3 + 3, ""); \
|
|
} else { \
|
|
tlen = snprintf(tbuf + VARSTR_HEADER_SIZE, TSDB_EXPLAIN_RESULT_ROW_SIZE - VARSTR_HEADER_SIZE, "%*s%s", (level) * 3, "", "-> "); \
|
|
} \
|
|
tlen += snprintf(tbuf + VARSTR_HEADER_SIZE + tlen, TSDB_EXPLAIN_RESULT_ROW_SIZE - VARSTR_HEADER_SIZE - tlen, __VA_ARGS__); \
|
|
} while (0)
|
|
|
|
#define EXPLAIN_ROW_APPEND(...) tlen += snprintf(tbuf + VARSTR_HEADER_SIZE + tlen, TSDB_EXPLAIN_RESULT_ROW_SIZE - VARSTR_HEADER_SIZE - tlen, __VA_ARGS__)
|
|
#define EXPLAIN_ROW_END() do { varDataSetLen(tbuf, tlen); tlen += VARSTR_HEADER_SIZE; isVerboseLine = true; } while (0)
|
|
|
|
#define EXPLAIN_SUM_ROW_NEW(...) tlen = snprintf(tbuf + VARSTR_HEADER_SIZE, TSDB_EXPLAIN_RESULT_ROW_SIZE - VARSTR_HEADER_SIZE, __VA_ARGS__)
|
|
#define EXPLAIN_SUM_ROW_END() do { varDataSetLen(tbuf, tlen); tlen += VARSTR_HEADER_SIZE; } while (0)
|
|
|
|
#define EXPLAIN_ROW_APPEND_LIMIT_IMPL(_pLimit, sl) do { \
|
|
if (_pLimit && ((SLimitNode*)_pLimit)->limit) { \
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT); \
|
|
SLimitNode* pLimit = (SLimitNode*)_pLimit; \
|
|
EXPLAIN_ROW_APPEND(((sl) ? EXPLAIN_SLIMIT_FORMAT : EXPLAIN_LIMIT_FORMAT), pLimit->limit->datum.i); \
|
|
if (pLimit->offset) { \
|
|
EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT); \
|
|
EXPLAIN_ROW_APPEND(((sl) ? EXPLAIN_SOFFSET_FORMAT : EXPLAIN_OFFSET_FORMAT), pLimit->offset->datum.i);\
|
|
} \
|
|
} \
|
|
} while (0)
|
|
|
|
#define EXPLAIN_ROW_APPEND_LIMIT(_pLimit) EXPLAIN_ROW_APPEND_LIMIT_IMPL(_pLimit, false)
|
|
#define EXPLAIN_ROW_APPEND_SLIMIT(_pLimit) EXPLAIN_ROW_APPEND_LIMIT_IMPL(_pLimit, true)
|
|
#define EXPLAIN_CONVERT_TS_US_TO_MS(_ts) ((double)(_ts) / 1000.0)
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /*_TD_QUERY_INT_H_*/
|