/* * Copyright (c) 2019 TAOS Data, Inc. * * 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 . */ #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 } SExplainGroup; typedef struct SExplainResNode { SNodeList* pChildren; SPhysiNode* pNode; SSubplan* pPlan; SArray* pExecInfo; // Array } 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 } 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_*/