merge develop
This commit is contained in:
commit
ea5597b3a0
|
@ -698,7 +698,7 @@ Query OK, 1 row(s) in set (0.001091s)
|
|||
- 输出结果缺省按首列时间戳升序排序,但可以指定按降序排序( _c0 指首列时间戳)。使用 ORDER BY 对其他字段进行排序为非法操作。
|
||||
- 参数 LIMIT 控制输出条数,OFFSET 指定从第几条开始输出。LIMIT/OFFSET 对结果集的执行顺序在 ORDER BY 之后。且 `LIMIT 5 OFFSET 2` 可以简写为 `LIMIT 2, 5`。
|
||||
* 在有 GROUP BY 子句的情况下,LIMIT 参数控制的是每个分组中至多允许输出的条数。
|
||||
- 参数 SLIMIT 控制由 GROUP BY 指令划分的分组中,至多允许输出几个分组的数据。且 `SLIMIT 5 OFFSET 2` 可以简写为 `SLIMIT 2, 5`。
|
||||
- 参数 SLIMIT 控制由 GROUP BY 指令划分的分组中,至多允许输出几个分组的数据。且 `SLIMIT 5 SOFFSET 2` 可以简写为 `SLIMIT 2, 5`。
|
||||
- 通过 “>>” 输出结果可以导出到指定文件。
|
||||
|
||||
### 支持的条件过滤操作
|
||||
|
@ -1342,7 +1342,7 @@ SELECT function_list FROM stb_name
|
|||
- 在聚合查询中,function_list 位置允许使用聚合和选择函数,并要求每个函数仅输出单个结果(例如:COUNT、AVG、SUM、STDDEV、LEASTSQUARES、PERCENTILE、MIN、MAX、FIRST、LAST),而不能使用具有多行输出结果的函数(例如:TOP、BOTTOM、DIFF 以及四则运算)。
|
||||
- 查询过滤、聚合等操作按照每个切分窗口为独立的单位执行。聚合查询目前支持三种窗口的划分方式:
|
||||
1. 时间窗口:聚合时间段的窗口宽度由关键词 INTERVAL 指定,最短时间间隔 10 毫秒(10a);并且支持偏移 offset(偏移必须小于间隔),也即时间窗口划分与“UTC 时刻 0”相比的偏移量。SLIDING 语句用于指定聚合时间段的前向增量,也即每次窗口向前滑动的时长。当 SLIDING 与 INTERVAL 取值相等的时候,滑动窗口即为翻转窗口。
|
||||
2. 状态窗口:使用整数(布尔值)或字符串来标识产生记录时设备的状态量,产生的记录如果具有相同的状态量取值则归属于同一个状态窗口,数值改变后该窗口关闭。状态量所对应的列作为 STAT_WINDOW 语句的参数来指定。
|
||||
2. 状态窗口:使用整数(布尔值)或字符串来标识产生记录时设备的状态量,产生的记录如果具有相同的状态量取值则归属于同一个状态窗口,数值改变后该窗口关闭。状态量所对应的列作为 STATE_WINDOW 语句的参数来指定。
|
||||
3. 会话窗口:时间戳所在的列由 SESSION 语句的 ts_col 参数指定,会话窗口根据相邻两条记录的时间戳差值来确定是否属于同一个会话——如果时间戳差异在 tol_val 以内,则认为记录仍属于同一个窗口;如果时间变化超过 tol_val,则自动开启下一个窗口。
|
||||
- WHERE 语句可以指定查询的起止时间和其他过滤条件。
|
||||
- FILL 语句指定某一窗口区间数据缺失的情况下的填充模式。填充模式包括以下几种:
|
||||
|
|
|
@ -270,6 +270,13 @@ function install_jemalloc() {
|
|||
${csudo} /usr/bin/install -c -d /usr/local/share/man/man3
|
||||
${csudo} /usr/bin/install -c -m 644 ${jemalloc_dir}/share/man/man3/jemalloc.3 /usr/local/share/man/man3
|
||||
fi
|
||||
|
||||
if [ -d /etc/ld.so.conf.d ]; then
|
||||
${csudo} echo "/usr/local/lib" > /etc/ld.so.conf.d/jemalloc.conf
|
||||
${csudo} ldconfig
|
||||
else
|
||||
echo "/etc/ld.so.conf.d not found!"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
|
@ -783,7 +790,6 @@ function update_TDengine() {
|
|||
echo "File taos.tar.gz does not exist"
|
||||
exit 1
|
||||
fi
|
||||
install_jemalloc
|
||||
tar -zxf taos.tar.gz
|
||||
install_jemalloc
|
||||
|
||||
|
|
|
@ -165,6 +165,13 @@ function install_jemalloc() {
|
|||
${csudo} /usr/bin/install -c -d /usr/local/share/man/man3
|
||||
${csudo} /usr/bin/install -c -m 644 ${jemalloc_dir}/share/man/man3/jemalloc.3 /usr/local/share/man/man3
|
||||
fi
|
||||
|
||||
if [ -d /etc/ld.so.conf.d ]; then
|
||||
${csudo} echo "/usr/local/lib" > /etc/ld.so.conf.d/jemalloc.conf
|
||||
${csudo} ldconfig
|
||||
else
|
||||
echo "/etc/ld.so.conf.d not found!"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
|
|
|
@ -158,6 +158,13 @@ function install_jemalloc() {
|
|||
${csudo} /usr/bin/install -c -d /usr/local/share/man/man3
|
||||
${csudo} /usr/bin/install -c -m 644 ${jemalloc_dir}/share/man/man3/jemalloc.3 /usr/local/share/man/man3
|
||||
fi
|
||||
|
||||
if [ -d /etc/ld.so.conf.d ]; then
|
||||
${csudo} echo "/usr/local/lib" > /etc/ld.so.conf.d/jemalloc.conf
|
||||
${csudo} ldconfig
|
||||
else
|
||||
echo "/etc/ld.so.conf.d not found!"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
|
|
|
@ -182,6 +182,7 @@ function install_jemalloc() {
|
|||
${csudo} /usr/bin/install -c -d /usr/local/share/man/man3
|
||||
${csudo} /usr/bin/install -c -m 644 ${jemalloc_dir}/share/man/man3/jemalloc.3 /usr/local/share/man/man3
|
||||
fi
|
||||
${csudo} ldconfig
|
||||
fi
|
||||
}
|
||||
|
||||
|
|
|
@ -182,6 +182,13 @@ function install_jemalloc() {
|
|||
${csudo} /usr/bin/install -c -d /usr/local/share/man/man3
|
||||
${csudo} /usr/bin/install -c -m 644 ${jemalloc_dir}/share/man/man3/jemalloc.3 /usr/local/share/man/man3
|
||||
fi
|
||||
|
||||
if [ -d /etc/ld.so.conf.d ]; then
|
||||
${csudo} echo "/usr/local/lib" > /etc/ld.so.conf.d/jemalloc.conf
|
||||
${csudo} ldconfig
|
||||
else
|
||||
echo "/etc/ld.so.conf.d not found!"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
|
@ -227,6 +234,7 @@ function update_PowerDB() {
|
|||
exit 1
|
||||
fi
|
||||
tar -zxf power.tar.gz
|
||||
install_jemalloc
|
||||
|
||||
echo -e "${GREEN}Start to update PowerDB client...${NC}"
|
||||
# Stop the client shell if running
|
||||
|
@ -240,7 +248,6 @@ function update_PowerDB() {
|
|||
install_log
|
||||
install_header
|
||||
install_lib
|
||||
install_jemalloc
|
||||
if [ "$pagMode" != "lite" ]; then
|
||||
install_connector
|
||||
fi
|
||||
|
|
|
@ -263,6 +263,13 @@ function install_jemalloc() {
|
|||
${csudo} /usr/bin/install -c -d /usr/local/share/man/man3
|
||||
${csudo} /usr/bin/install -c -m 644 ${jemalloc_dir}/share/man/man3/jemalloc.3 /usr/local/share/man/man3
|
||||
fi
|
||||
|
||||
if [ -d /etc/ld.so.conf.d ]; then
|
||||
${csudo} echo "/usr/local/lib" > /etc/ld.so.conf.d/jemalloc.conf
|
||||
${csudo} ldconfig
|
||||
else
|
||||
echo "/etc/ld.so.conf.d not found!"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
|
@ -752,7 +759,6 @@ function update_PowerDB() {
|
|||
echo "File power.tar.gz does not exist"
|
||||
exit 1
|
||||
fi
|
||||
install_jemalloc
|
||||
tar -zxf power.tar.gz
|
||||
install_jemalloc
|
||||
|
||||
|
|
|
@ -270,6 +270,13 @@ function install_jemalloc() {
|
|||
${csudo} /usr/bin/install -c -d /usr/local/share/man/man3
|
||||
${csudo} /usr/bin/install -c -m 644 ${jemalloc_dir}/share/man/man3/jemalloc.3 /usr/local/share/man/man3
|
||||
fi
|
||||
|
||||
if [ -d /etc/ld.so.conf.d ]; then
|
||||
${csudo} echo "/usr/local/lib" > /etc/ld.so.conf.d/jemalloc.conf
|
||||
${csudo} ldconfig
|
||||
else
|
||||
echo "/etc/ld.so.conf.d not found!"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
|
@ -752,7 +759,6 @@ function update_tq() {
|
|||
echo "File tq.tar.gz does not exist"
|
||||
exit 1
|
||||
fi
|
||||
install_jemalloc
|
||||
tar -zxf tq.tar.gz
|
||||
install_jemalloc
|
||||
|
||||
|
|
|
@ -176,6 +176,7 @@ function install_bin() {
|
|||
[ -x ${install_main_dir}/bin/remove_client.sh ] && ${csudo} ln -s ${install_main_dir}/bin/remove_client.sh ${bin_link_dir}/rmtaos || :
|
||||
fi
|
||||
}
|
||||
|
||||
function install_jemalloc() {
|
||||
if [ "$osType" != "Darwin" ]; then
|
||||
/usr/bin/install -c -d /usr/local/bin
|
||||
|
@ -217,6 +218,13 @@ function install_jemalloc() {
|
|||
/usr/bin/install -c -d /usr/local/share/man/man3
|
||||
/usr/bin/install -c -m 644 ${binary_dir}/build/share/man/man3/jemalloc.3 /usr/local/share/man/man3
|
||||
fi
|
||||
|
||||
if [ -d /etc/ld.so.conf.d ]; then
|
||||
${csudo} echo "/usr/local/lib" > /etc/ld.so.conf.d/jemalloc.conf
|
||||
${csudo} ldconfig
|
||||
else
|
||||
echo "/etc/ld.so.conf.d not found!"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
|
|
|
@ -188,7 +188,7 @@ int32_t tscGetResRowLength(SArray* pExprList);
|
|||
SExprInfo* tscExprInsert(SQueryInfo* pQueryInfo, int32_t index, int16_t functionId, SColumnIndex* pColIndex, int16_t type,
|
||||
int16_t size, int16_t resColId, int16_t interSize, bool isTagCol);
|
||||
|
||||
SExprInfo* tscExprCreate(SQueryInfo* pQueryInfo, int16_t functionId, SColumnIndex* pColIndex, int16_t type,
|
||||
SExprInfo* tscExprCreate(STableMetaInfo* pTableMetaInfo, int16_t functionId, SColumnIndex* pColIndex, int16_t type,
|
||||
int16_t size, int16_t resColId, int16_t interSize, int32_t colType);
|
||||
|
||||
void tscExprAddParams(SSqlExpr* pExpr, char* argument, int32_t type, int32_t bytes);
|
||||
|
|
|
@ -20,7 +20,12 @@
|
|||
#define _GNU_SOURCE
|
||||
#endif // __APPLE__
|
||||
|
||||
#include <qSqlparser.h>
|
||||
#include "os.h"
|
||||
#include "qPlan.h"
|
||||
#include "qSqlparser.h"
|
||||
#include "qTableMeta.h"
|
||||
#include "qUtil.h"
|
||||
#include "taos.h"
|
||||
#include "taosmsg.h"
|
||||
#include "tcompare.h"
|
||||
|
@ -28,15 +33,12 @@
|
|||
#include "tname.h"
|
||||
#include "tscLog.h"
|
||||
#include "tscUtil.h"
|
||||
#include "qTableMeta.h"
|
||||
#include "tsclient.h"
|
||||
#include "tstrbuild.h"
|
||||
#include "ttoken.h"
|
||||
#include "ttokendef.h"
|
||||
#include "qScript.h"
|
||||
#include "ttype.h"
|
||||
#include "qUtil.h"
|
||||
#include "qPlan.h"
|
||||
|
||||
#define DEFAULT_PRIMARY_TIMESTAMP_COL_NAME "_c0"
|
||||
|
||||
|
@ -64,8 +66,8 @@ static SExprInfo* doAddProjectCol(SQueryInfo* pQueryInfo, int32_t colIndex, int3
|
|||
static int32_t setShowInfo(SSqlObj* pSql, SSqlInfo* pInfo);
|
||||
static char* getAccountId(SSqlObj* pSql);
|
||||
|
||||
static int convertTimestampStrToInt64(tVariant *pVar, int32_t precision);
|
||||
static bool serializeExprListToVariant(SArray* pList, tVariant **dest, int16_t colType, uint8_t precision);
|
||||
static int convertTimestampStrToInt64(tVariant *pVar, int32_t precision);
|
||||
static bool serializeExprListToVariant(SArray* pList, tVariant **dst, int16_t colType, uint8_t precision);
|
||||
|
||||
static bool has(SArray* pFieldList, int32_t startIdx, const char* name);
|
||||
static char* cloneCurrentDBName(SSqlObj* pSql);
|
||||
|
@ -81,7 +83,7 @@ static int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int3
|
|||
static int32_t insertResultField(SQueryInfo* pQueryInfo, int32_t outputIndex, SColumnList* pIdList, int16_t bytes,
|
||||
int8_t type, char* fieldName, SExprInfo* pSqlExpr);
|
||||
|
||||
static uint8_t convertOptr(SStrToken *pToken);
|
||||
static uint8_t convertRelationalOperator(SStrToken *pToken);
|
||||
|
||||
static int32_t validateSelectNodeList(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SArray* pSelNodeList, bool isSTable, bool joinQuery, bool timeWindowQuery);
|
||||
|
||||
|
@ -94,7 +96,7 @@ static int32_t validateGroupbyNode(SQueryInfo* pQueryInfo, SArray* pList, SSqlCm
|
|||
static int32_t validateIntervalNode(SSqlObj* pSql, SQueryInfo* pQueryInfo, SSqlNode* pSqlNode);
|
||||
static int32_t parseIntervalOffset(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SStrToken* offsetToken);
|
||||
static int32_t parseSlidingClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SStrToken* pSliding);
|
||||
static int32_t validateStateWindowNode(SSqlCmd* pSql, SQueryInfo* pQueryInfo, SSqlNode* pSqlNode, bool isStable);
|
||||
static int32_t validateStateWindowNode(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SSqlNode* pSqlNode, bool isStable);
|
||||
|
||||
static int32_t addProjectionExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSqlExprItem* pItem);
|
||||
|
||||
|
@ -134,6 +136,7 @@ static int32_t doCheckForCreateTable(SSqlObj* pSql, int32_t subClauseIndex, SSql
|
|||
static int32_t doCheckForCreateFromStable(SSqlObj* pSql, SSqlInfo* pInfo);
|
||||
static int32_t doCheckForStream(SSqlObj* pSql, SSqlInfo* pInfo);
|
||||
static int32_t validateSqlNode(SSqlObj* pSql, SSqlNode* pSqlNode, SQueryInfo* pQueryInfo);
|
||||
|
||||
static int32_t exprTreeFromSqlExpr(SSqlCmd* pCmd, tExprNode **pExpr, const tSqlExpr* pSqlExpr, SQueryInfo* pQueryInfo, SArray* pCols, uint64_t *uid);
|
||||
static bool validateDebugFlag(int32_t v);
|
||||
static int32_t checkQueryRangeForFill(SSqlCmd* pCmd, SQueryInfo* pQueryInfo);
|
||||
|
@ -149,7 +152,7 @@ int16_t getNewResColId(SSqlCmd* pCmd) {
|
|||
}
|
||||
|
||||
// serialize expr in exprlist to binary
|
||||
// formate "type | size | value"
|
||||
// format "type | size | value"
|
||||
bool serializeExprListToVariant(SArray* pList, tVariant **dst, int16_t colType, uint8_t precision) {
|
||||
bool ret = false;
|
||||
if (!pList || pList->size <= 0 || colType < 0) {
|
||||
|
@ -173,7 +176,7 @@ bool serializeExprListToVariant(SArray* pList, tVariant **dst, int16_t colType,
|
|||
tSqlExpr* pSub = ((tSqlExprItem*)(taosArrayGet(pList, i)))->pNode;
|
||||
tVariant* var = &pSub->value;
|
||||
|
||||
// check all the token type in expr list same or not
|
||||
// check all the exprToken type in expr list same or not
|
||||
if (firstVarType != var->nType) {
|
||||
break;
|
||||
}
|
||||
|
@ -240,7 +243,7 @@ bool serializeExprListToVariant(SArray* pList, tVariant **dst, int16_t colType,
|
|||
}
|
||||
|
||||
|
||||
static uint8_t convertOptr(SStrToken *pToken) {
|
||||
static uint8_t convertRelationalOperator(SStrToken *pToken) {
|
||||
switch (pToken->type) {
|
||||
case TK_LT:
|
||||
return TSDB_RELATION_LESS;
|
||||
|
@ -896,6 +899,8 @@ int32_t tscValidateSqlInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) {
|
|||
SSqlNode* pSqlNode = taosArrayGetP(pInfo->list, i);
|
||||
|
||||
tscTrace("%p start to parse %dth subclause, total:%"PRIzu, pSql, i, size);
|
||||
|
||||
// normalizeSqlNode(pSqlNode); // normalize the column name in each function
|
||||
if ((code = validateSqlNode(pSql, pSqlNode, pQueryInfo)) != TSDB_CODE_SUCCESS) {
|
||||
return code;
|
||||
}
|
||||
|
@ -1773,8 +1778,8 @@ static int32_t handleArithmeticExpr(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32
|
|||
SExprInfo* pExpr = tscExprAppend(pQueryInfo, TSDB_FUNC_ARITHM, &index, TSDB_DATA_TYPE_DOUBLE, sizeof(double),
|
||||
getNewResColId(pCmd), sizeof(double), false);
|
||||
|
||||
char* name = (pItem->aliasName != NULL)? pItem->aliasName:pItem->pNode->token.z;
|
||||
size_t len = MIN(sizeof(pExpr->base.aliasName), pItem->pNode->token.n + 1);
|
||||
char* name = (pItem->aliasName != NULL)? pItem->aliasName:pItem->pNode->exprToken.z;
|
||||
size_t len = MIN(sizeof(pExpr->base.aliasName), pItem->pNode->exprToken.n + 1);
|
||||
tstrncpy(pExpr->base.aliasName, name, len);
|
||||
|
||||
tExprNode* pNode = NULL;
|
||||
|
@ -2049,7 +2054,7 @@ int32_t validateSelectNodeList(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SArray* pS
|
|||
|
||||
int32_t type = pItem->pNode->type;
|
||||
if (type == SQL_NODE_SQLFUNCTION) {
|
||||
pItem->pNode->functionId = isValidFunction(pItem->pNode->operand.z, pItem->pNode->operand.n);
|
||||
pItem->pNode->functionId = isValidFunction(pItem->pNode->Expr.operand.z, pItem->pNode->Expr.operand.n);
|
||||
SUdfInfo* pUdfInfo = NULL;
|
||||
if (pItem->pNode->functionId < 0) {
|
||||
pUdfInfo = isValidUdf(pQueryInfo->pUdfInfo, pItem->pNode->operand.z, pItem->pNode->operand.n);
|
||||
|
@ -2066,10 +2071,10 @@ int32_t validateSelectNodeList(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SArray* pS
|
|||
}
|
||||
} else if (type == SQL_NODE_TABLE_COLUMN || type == SQL_NODE_VALUE) {
|
||||
// use the dynamic array list to decide if the function is valid or not
|
||||
// select table_name1.field_name1, table_name2.field_name2 from table_name1, table_name2
|
||||
if (addProjectionExprAndResultField(pCmd, pQueryInfo, pItem) != TSDB_CODE_SUCCESS) {
|
||||
return TSDB_CODE_TSC_INVALID_OPERATION;
|
||||
}
|
||||
// select table_name1.field_name1, table_name2.field_name2 from table_name1, table_name2
|
||||
if (addProjectionExprAndResultField(pCmd, pQueryInfo, pItem) != TSDB_CODE_SUCCESS) {
|
||||
return TSDB_CODE_TSC_INVALID_OPERATION;
|
||||
}
|
||||
} else if (type == SQL_NODE_EXPR) {
|
||||
int32_t code = handleArithmeticExpr(pCmd, pQueryInfo, i, pItem);
|
||||
if (code != TSDB_CODE_SUCCESS) {
|
||||
|
@ -2088,6 +2093,7 @@ int32_t validateSelectNodeList(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SArray* pS
|
|||
if (!isValidDistinctSql(pQueryInfo)) {
|
||||
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg4);
|
||||
}
|
||||
|
||||
pQueryInfo->distinctTag = true;
|
||||
}
|
||||
|
||||
|
@ -2203,8 +2209,8 @@ static int32_t doAddProjectionExprAndResultFields(SQueryInfo* pQueryInfo, SColum
|
|||
}
|
||||
|
||||
int32_t addProjectionExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSqlExprItem* pItem) {
|
||||
const char* msg0 = "invalid column name";
|
||||
const char* msg1 = "tag for normal table query is not allowed";
|
||||
const char* msg2 = "invalid column name";
|
||||
|
||||
int32_t startPos = (int32_t)tscNumOfExprs(pQueryInfo);
|
||||
int32_t optr = pItem->pNode->tokenId;
|
||||
|
@ -2213,8 +2219,8 @@ int32_t addProjectionExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, t
|
|||
TSDB_QUERY_SET_TYPE(pQueryInfo->type, TSDB_QUERY_TYPE_PROJECTION_QUERY);
|
||||
|
||||
SColumnIndex index = COLUMN_INDEX_INITIALIZER;
|
||||
if (getTableIndexByName(&pItem->pNode->colInfo, pQueryInfo, &index) != TSDB_CODE_SUCCESS) {
|
||||
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg0);
|
||||
if (getTableIndexByName(&pItem->pNode->columnName, pQueryInfo, &index) != TSDB_CODE_SUCCESS) {
|
||||
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg2);
|
||||
}
|
||||
|
||||
// all meters columns are required
|
||||
|
@ -2240,7 +2246,7 @@ int32_t addProjectionExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, t
|
|||
index.columnIndex = (pQueryInfo->udColumnId--);
|
||||
index.tableIndex = 0;
|
||||
|
||||
SSchema colSchema = tGetUserSpecifiedColumnSchema(&pItem->pNode->value, &pItem->pNode->token, pItem->aliasName);
|
||||
SSchema colSchema = tGetUserSpecifiedColumnSchema(&pItem->pNode->value, &pItem->pNode->exprToken, pItem->aliasName);
|
||||
SExprInfo* pExpr =
|
||||
tscAddFuncInSelectClause(pQueryInfo, startPos, TSDB_FUNC_PRJ, &index, &colSchema, TSDB_COL_UDC, getNewResColId(pCmd));
|
||||
|
||||
|
@ -2250,8 +2256,8 @@ int32_t addProjectionExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, t
|
|||
} else if (optr == TK_ID) {
|
||||
SColumnIndex index = COLUMN_INDEX_INITIALIZER;
|
||||
|
||||
if (getColumnIndexByName(&pItem->pNode->colInfo, pQueryInfo, &index, tscGetErrorMsgPayload(pCmd)) != TSDB_CODE_SUCCESS) {
|
||||
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg0);
|
||||
if (getColumnIndexByName(&pItem->pNode->columnName, pQueryInfo, &index, tscGetErrorMsgPayload(pCmd)) != TSDB_CODE_SUCCESS) {
|
||||
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg2);
|
||||
}
|
||||
|
||||
if (index.columnIndex == TSDB_TBNAME_COLUMN_INDEX) {
|
||||
|
@ -2351,8 +2357,8 @@ void setResultColName(char* name, tSqlExprItem* pItem, int32_t functionId, SStrT
|
|||
tstrncpy(name, tmp, TSDB_COL_NAME_LEN);
|
||||
}
|
||||
} else { // use the user-input result column name
|
||||
int32_t len = MIN(pItem->pNode->token.n + 1, TSDB_COL_NAME_LEN);
|
||||
tstrncpy(name, pItem->pNode->token.z, len);
|
||||
int32_t len = MIN(pItem->pNode->exprToken.n + 1, TSDB_COL_NAME_LEN);
|
||||
tstrncpy(name, pItem->pNode->exprToken.z, len);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2406,27 +2412,26 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
|
|||
|
||||
switch (functionId) {
|
||||
case TSDB_FUNC_COUNT: {
|
||||
/* more than one parameter for count() function */
|
||||
if (pItem->pNode->pParam != NULL && taosArrayGetSize(pItem->pNode->pParam) != 1) {
|
||||
/* more than one parameter for count() function */
|
||||
if (pItem->pNode->Expr.paramList != NULL && taosArrayGetSize(pItem->pNode->Expr.paramList) != 1) {
|
||||
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg2);
|
||||
}
|
||||
|
||||
SExprInfo* pExpr = NULL;
|
||||
SColumnIndex index = COLUMN_INDEX_INITIALIZER;
|
||||
|
||||
if (pItem->pNode->pParam != NULL) {
|
||||
tSqlExprItem* pParamElem = taosArrayGet(pItem->pNode->pParam, 0);
|
||||
SStrToken* pToken = &pParamElem->pNode->colInfo;
|
||||
if (pItem->pNode->Expr.paramList != NULL) {
|
||||
tSqlExprItem* pParamElem = taosArrayGet(pItem->pNode->Expr.paramList, 0);
|
||||
SStrToken* pToken = &pParamElem->pNode->columnName;
|
||||
int16_t tokenId = pParamElem->pNode->tokenId;
|
||||
if ((pToken->z == NULL || pToken->n == 0) && (TK_INTEGER != tokenId)) {
|
||||
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg3);
|
||||
}
|
||||
|
||||
// select count(table.*)
|
||||
// select count(1)|count(2)
|
||||
// select count(table.*), select count(1), count(2)
|
||||
if (tokenId == TK_ALL || tokenId == TK_INTEGER) {
|
||||
// check if the table name is valid or not
|
||||
SStrToken tmpToken = pParamElem->pNode->colInfo;
|
||||
SStrToken tmpToken = pParamElem->pNode->columnName;
|
||||
|
||||
if (getTableIndexByName(&tmpToken, pQueryInfo, &index) != TSDB_CODE_SUCCESS) {
|
||||
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg4);
|
||||
|
@ -2483,6 +2488,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
|
|||
|
||||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
case TSDB_FUNC_SUM:
|
||||
case TSDB_FUNC_AVG:
|
||||
case TSDB_FUNC_RATE:
|
||||
|
@ -2495,22 +2501,22 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
|
|||
case TSDB_FUNC_STDDEV:
|
||||
case TSDB_FUNC_LEASTSQR: {
|
||||
// 1. valid the number of parameters
|
||||
int32_t numOfParams = (pItem->pNode->pParam == NULL)? 0: (int32_t) taosArrayGetSize(pItem->pNode->pParam);
|
||||
int32_t numOfParams = (pItem->pNode->Expr.paramList == NULL)? 0: (int32_t) taosArrayGetSize(pItem->pNode->Expr.paramList);
|
||||
|
||||
// no parameters or more than one parameter for function
|
||||
if (pItem->pNode->pParam == NULL ||
|
||||
if (pItem->pNode->Expr.paramList == NULL ||
|
||||
(functionId != TSDB_FUNC_LEASTSQR && functionId != TSDB_FUNC_DERIVATIVE && numOfParams != 1) ||
|
||||
((functionId == TSDB_FUNC_LEASTSQR || functionId == TSDB_FUNC_DERIVATIVE) && numOfParams != 3)) {
|
||||
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg2);
|
||||
}
|
||||
|
||||
tSqlExprItem* pParamElem = taosArrayGet(pItem->pNode->pParam, 0);
|
||||
tSqlExprItem* pParamElem = taosArrayGet(pItem->pNode->Expr.paramList, 0);
|
||||
if (pParamElem->pNode->tokenId != TK_ALL && pParamElem->pNode->tokenId != TK_ID) {
|
||||
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg2);
|
||||
}
|
||||
|
||||
SColumnIndex index = COLUMN_INDEX_INITIALIZER;
|
||||
if ((getColumnIndexByName(&pParamElem->pNode->colInfo, pQueryInfo, &index, tscGetErrorMsgPayload(pCmd)) != TSDB_CODE_SUCCESS)) {
|
||||
if ((getColumnIndexByName(&pParamElem->pNode->columnName, pQueryInfo, &index, tscGetErrorMsgPayload(pCmd)) != TSDB_CODE_SUCCESS)) {
|
||||
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg3);
|
||||
}
|
||||
|
||||
|
@ -2620,12 +2626,13 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
|
|||
tscInsertPrimaryTsSourceColumn(pQueryInfo, pExpr->base.uid);
|
||||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
case TSDB_FUNC_FIRST:
|
||||
case TSDB_FUNC_LAST:
|
||||
case TSDB_FUNC_SPREAD:
|
||||
case TSDB_FUNC_LAST_ROW:
|
||||
case TSDB_FUNC_INTERP: {
|
||||
bool requireAllFields = (pItem->pNode->pParam == NULL);
|
||||
bool requireAllFields = (pItem->pNode->Expr.paramList == NULL);
|
||||
|
||||
// NOTE: has time range condition or normal column filter condition, the last_row query will be transferred to last query
|
||||
SConvertFunc cvtFunc = {.originFuncId = functionId, .execFuncId = functionId};
|
||||
|
@ -2636,17 +2643,17 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
|
|||
}
|
||||
|
||||
if (!requireAllFields) {
|
||||
if (taosArrayGetSize(pItem->pNode->pParam) < 1) {
|
||||
if (taosArrayGetSize(pItem->pNode->Expr.paramList) < 1) {
|
||||
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg3);
|
||||
}
|
||||
|
||||
if (taosArrayGetSize(pItem->pNode->pParam) > 1 && (pItem->aliasName != NULL && strlen(pItem->aliasName) > 0)) {
|
||||
if (taosArrayGetSize(pItem->pNode->Expr.paramList) > 1 && (pItem->aliasName != NULL && strlen(pItem->aliasName) > 0)) {
|
||||
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg8);
|
||||
}
|
||||
|
||||
/* in first/last function, multiple columns can be add to resultset */
|
||||
for (int32_t i = 0; i < taosArrayGetSize(pItem->pNode->pParam); ++i) {
|
||||
tSqlExprItem* pParamElem = taosArrayGet(pItem->pNode->pParam, i);
|
||||
for (int32_t i = 0; i < taosArrayGetSize(pItem->pNode->Expr.paramList); ++i) {
|
||||
tSqlExprItem* pParamElem = taosArrayGet(pItem->pNode->Expr.paramList, i);
|
||||
if (pParamElem->pNode->tokenId != TK_ALL && pParamElem->pNode->tokenId != TK_ID) {
|
||||
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg3);
|
||||
}
|
||||
|
@ -2654,7 +2661,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
|
|||
SColumnIndex index = COLUMN_INDEX_INITIALIZER;
|
||||
|
||||
if (pParamElem->pNode->tokenId == TK_ALL) { // select table.*
|
||||
SStrToken tmpToken = pParamElem->pNode->colInfo;
|
||||
SStrToken tmpToken = pParamElem->pNode->columnName;
|
||||
|
||||
if (getTableIndexByName(&tmpToken, pQueryInfo, &index) != TSDB_CODE_SUCCESS) {
|
||||
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg4);
|
||||
|
@ -2676,7 +2683,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
|
|||
}
|
||||
|
||||
} else {
|
||||
if (getColumnIndexByName(&pParamElem->pNode->colInfo, pQueryInfo, &index, tscGetErrorMsgPayload(pCmd)) != TSDB_CODE_SUCCESS) {
|
||||
if (getColumnIndexByName(&pParamElem->pNode->columnName, pQueryInfo, &index, tscGetErrorMsgPayload(pCmd)) != TSDB_CODE_SUCCESS) {
|
||||
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg3);
|
||||
}
|
||||
|
||||
|
@ -2690,16 +2697,15 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
|
|||
char name[TSDB_COL_NAME_LEN] = {0};
|
||||
SSchema* pSchema = tscGetTableColumnSchema(pTableMetaInfo->pTableMeta, index.columnIndex);
|
||||
|
||||
bool multiColOutput = taosArrayGetSize(pItem->pNode->pParam) > 1;
|
||||
setResultColName(name, pItem, cvtFunc.originFuncId, &pParamElem->pNode->colInfo, multiColOutput);
|
||||
bool multiColOutput = taosArrayGetSize(pItem->pNode->Expr.paramList) > 1;
|
||||
setResultColName(name, pItem, cvtFunc.originFuncId, &pParamElem->pNode->columnName, multiColOutput);
|
||||
|
||||
if (setExprInfoForFunctions(pCmd, pQueryInfo, pSchema, cvtFunc, name, colIndex++, &index, finalResult, pUdfInfo) != 0) {
|
||||
return TSDB_CODE_TSC_INVALID_OPERATION;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return TSDB_CODE_SUCCESS;
|
||||
|
||||
} else { // select * from xxx
|
||||
int32_t numOfFields = 0;
|
||||
|
||||
|
@ -2728,9 +2734,8 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
|
|||
|
||||
numOfFields += tscGetNumOfColumns(pTableMetaInfo->pTableMeta);
|
||||
}
|
||||
|
||||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
case TSDB_FUNC_TOP:
|
||||
|
@ -2738,18 +2743,18 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
|
|||
case TSDB_FUNC_PERCT:
|
||||
case TSDB_FUNC_APERCT: {
|
||||
// 1. valid the number of parameters
|
||||
if (pItem->pNode->pParam == NULL || taosArrayGetSize(pItem->pNode->pParam) != 2) {
|
||||
if (pItem->pNode->Expr.paramList == NULL || taosArrayGetSize(pItem->pNode->Expr.paramList) != 2) {
|
||||
/* no parameters or more than one parameter for function */
|
||||
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg2);
|
||||
}
|
||||
|
||||
tSqlExprItem* pParamElem = taosArrayGet(pItem->pNode->pParam, 0);
|
||||
tSqlExprItem* pParamElem = taosArrayGet(pItem->pNode->Expr.paramList, 0);
|
||||
if (pParamElem->pNode->tokenId != TK_ID) {
|
||||
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg2);
|
||||
}
|
||||
|
||||
SColumnIndex index = COLUMN_INDEX_INITIALIZER;
|
||||
if (getColumnIndexByName(&pParamElem->pNode->colInfo, pQueryInfo, &index, tscGetErrorMsgPayload(pCmd)) != TSDB_CODE_SUCCESS) {
|
||||
if (getColumnIndexByName(&pParamElem->pNode->columnName, pQueryInfo, &index, tscGetErrorMsgPayload(pCmd)) != TSDB_CODE_SUCCESS) {
|
||||
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg3);
|
||||
}
|
||||
|
||||
|
@ -2845,7 +2850,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
|
|||
}
|
||||
|
||||
return TSDB_CODE_SUCCESS;
|
||||
};
|
||||
}
|
||||
|
||||
case TSDB_FUNC_TID_TAG: {
|
||||
pTableMetaInfo = tscGetMetaInfo(pQueryInfo, 0);
|
||||
|
@ -2854,15 +2859,15 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
|
|||
}
|
||||
|
||||
// no parameters or more than one parameter for function
|
||||
if (pItem->pNode->pParam == NULL || taosArrayGetSize(pItem->pNode->pParam) != 1) {
|
||||
if (pItem->pNode->Expr.paramList == NULL || taosArrayGetSize(pItem->pNode->Expr.paramList) != 1) {
|
||||
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg2);
|
||||
}
|
||||
|
||||
tSqlExprItem* pParamItem = taosArrayGet(pItem->pNode->pParam, 0);
|
||||
tSqlExprItem* pParamItem = taosArrayGet(pItem->pNode->Expr.paramList, 0);
|
||||
tSqlExpr* pParam = pParamItem->pNode;
|
||||
|
||||
SColumnIndex index = COLUMN_INDEX_INITIALIZER;
|
||||
if (getColumnIndexByName(&pParam->colInfo, pQueryInfo, &index, tscGetErrorMsgPayload(pCmd)) != TSDB_CODE_SUCCESS) {
|
||||
if (getColumnIndexByName(&pParam->columnName, pQueryInfo, &index, tscGetErrorMsgPayload(pCmd)) != TSDB_CODE_SUCCESS) {
|
||||
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg3);
|
||||
}
|
||||
|
||||
|
@ -2917,25 +2922,26 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
|
|||
|
||||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
case TSDB_FUNC_BLKINFO: {
|
||||
// no parameters or more than one parameter for function
|
||||
if (pItem->pNode->pParam != NULL && taosArrayGetSize(pItem->pNode->pParam) != 0) {
|
||||
if (pItem->pNode->Expr.paramList != NULL && taosArrayGetSize(pItem->pNode->Expr.paramList) != 0) {
|
||||
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg2);
|
||||
}
|
||||
|
||||
SColumnIndex index = {.tableIndex = 0, .columnIndex = 0,};
|
||||
pTableMetaInfo = tscGetMetaInfo(pQueryInfo, index.tableIndex);
|
||||
|
||||
SSchema s = {.name = "block_dist", .type = TSDB_DATA_TYPE_BINARY};
|
||||
int32_t inter = 0;
|
||||
int16_t resType = 0;
|
||||
int16_t bytes = 0;
|
||||
getResultDataInfo(TSDB_DATA_TYPE_INT, 4, TSDB_FUNC_BLKINFO, 0, &resType, &bytes, &inter, 0, 0, NULL);
|
||||
s.bytes = bytes;
|
||||
s.type = (uint8_t)resType;
|
||||
|
||||
SExprInfo* pExpr = tscExprInsert(pQueryInfo, 0, TSDB_FUNC_BLKINFO, &index, resType,
|
||||
bytes, getNewResColId(pCmd), bytes, 0);
|
||||
getResultDataInfo(TSDB_DATA_TYPE_INT, 4, TSDB_FUNC_BLKINFO, 0, &resType, &bytes, &inter, 0, 0);
|
||||
|
||||
SSchema s = {.name = "block_dist", .type = TSDB_DATA_TYPE_BINARY, .bytes = bytes};
|
||||
|
||||
SExprInfo* pExpr =
|
||||
tscExprInsert(pQueryInfo, 0, TSDB_FUNC_BLKINFO, &index, resType, bytes, getNewResColId(pCmd), bytes, 0);
|
||||
tstrncpy(pExpr->base.aliasName, s.name, sizeof(pExpr->base.aliasName));
|
||||
|
||||
SColumnList ids = createColumnList(1, index.tableIndex, index.columnIndex);
|
||||
|
@ -3023,8 +3029,8 @@ static SColumnList createColumnList(int32_t num, int16_t tableIndex, int32_t col
|
|||
}
|
||||
|
||||
void getColumnName(tSqlExprItem* pItem, char* resultFieldName, char* rawName, int32_t nameLength) {
|
||||
int32_t len = ((int32_t)pItem->pNode->token.n < nameLength) ? (int32_t)pItem->pNode->token.n : nameLength;
|
||||
strncpy(rawName, pItem->pNode->token.z, len);
|
||||
int32_t len = ((int32_t)pItem->pNode->exprToken.n < nameLength) ? (int32_t)pItem->pNode->exprToken.n : nameLength;
|
||||
strncpy(rawName, pItem->pNode->exprToken.z, len);
|
||||
|
||||
if (pItem->aliasName != NULL) {
|
||||
int32_t aliasNameLen = (int32_t) strlen(pItem->aliasName);
|
||||
|
@ -3675,8 +3681,8 @@ static int32_t doExtractColumnFilterInfo(SSqlCmd* pCmd, SQueryInfo* pQueryInfo,
|
|||
|
||||
// TK_GT,TK_GE,TK_EQ,TK_NE are based on the pColumn->lowerBndd
|
||||
} else if (pExpr->tokenId == TK_IN) {
|
||||
tVariant *pVal;
|
||||
if (pRight->tokenId != TK_SET || !serializeExprListToVariant(pRight->pParam, &pVal, colType, timePrecision)) {
|
||||
tVariant *pVal;
|
||||
if (pRight->tokenId != TK_SET || !serializeExprListToVariant(pRight->Expr.paramList, &pVal, colType, timePrecision)) {
|
||||
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg);
|
||||
}
|
||||
pColumnFilter->pz = (int64_t)calloc(1, pVal->nLen + 1);
|
||||
|
@ -3763,7 +3769,7 @@ typedef struct SCondExpr {
|
|||
static int32_t getTimeRange(STimeWindow* win, tSqlExpr* pRight, int32_t optr, int16_t timePrecision);
|
||||
|
||||
static int32_t tablenameListToString(tSqlExpr* pExpr, SStringBuilder* sb) {
|
||||
SArray* pList = pExpr->pParam;
|
||||
SArray* pList = pExpr->Expr.paramList;
|
||||
|
||||
int32_t size = (int32_t) taosArrayGetSize(pList);
|
||||
if (size <= 0) {
|
||||
|
@ -3891,7 +3897,7 @@ static int32_t getTablenameCond(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSqlExpr*
|
|||
tSqlExpr* pLeft = pTableCond->pLeft;
|
||||
tSqlExpr* pRight = pTableCond->pRight;
|
||||
|
||||
if (!isTablenameToken(&pLeft->colInfo)) {
|
||||
if (!isTablenameToken(&pLeft->columnName)) {
|
||||
return TSDB_CODE_TSC_INVALID_OPERATION;
|
||||
}
|
||||
|
||||
|
@ -3928,7 +3934,7 @@ static int32_t getColumnQueryCondInfo(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSq
|
|||
return getColumnQueryCondInfo(pCmd, pQueryInfo, pExpr->pRight, pExpr->tokenId);
|
||||
} else { // handle leaf node
|
||||
SColumnIndex index = COLUMN_INDEX_INITIALIZER;
|
||||
if (getColumnIndexByName(&pExpr->pLeft->colInfo, pQueryInfo, &index, tscGetErrorMsgPayload(pCmd)) != TSDB_CODE_SUCCESS) {
|
||||
if (getColumnIndexByName(&pExpr->pLeft->columnName, pQueryInfo, &index, tscGetErrorMsgPayload(pCmd)) != TSDB_CODE_SUCCESS) {
|
||||
return TSDB_CODE_TSC_INVALID_OPERATION;
|
||||
}
|
||||
|
||||
|
@ -3957,7 +3963,7 @@ static int32_t checkAndSetJoinCondInfo(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tS
|
|||
}
|
||||
|
||||
SColumnIndex index = COLUMN_INDEX_INITIALIZER;
|
||||
if (getColumnIndexByName(&pExpr->pLeft->colInfo, pQueryInfo, &index, tscGetErrorMsgPayload(pCmd)) != TSDB_CODE_SUCCESS) {
|
||||
if (getColumnIndexByName(&pExpr->pLeft->columnName, pQueryInfo, &index, tscGetErrorMsgPayload(pCmd)) != TSDB_CODE_SUCCESS) {
|
||||
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg4);
|
||||
}
|
||||
|
||||
|
@ -3990,7 +3996,7 @@ static int32_t checkAndSetJoinCondInfo(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tS
|
|||
int16_t leftIdx = index.tableIndex;
|
||||
|
||||
index = (SColumnIndex)COLUMN_INDEX_INITIALIZER;
|
||||
if (getColumnIndexByName(&pExpr->pRight->colInfo, pQueryInfo, &index, tscGetErrorMsgPayload(pCmd)) != TSDB_CODE_SUCCESS) {
|
||||
if (getColumnIndexByName(&pExpr->pRight->columnName, pQueryInfo, &index, tscGetErrorMsgPayload(pCmd)) != TSDB_CODE_SUCCESS) {
|
||||
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg4);
|
||||
}
|
||||
|
||||
|
@ -4060,7 +4066,7 @@ static int32_t validateSQLExpr(SSqlCmd* pCmd, tSqlExpr* pExpr, SQueryInfo* pQuer
|
|||
}
|
||||
|
||||
SColumnIndex index = COLUMN_INDEX_INITIALIZER;
|
||||
if (getColumnIndexByName(&pExpr->colInfo, pQueryInfo, &index, tscGetErrorMsgPayload(pCmd)) != TSDB_CODE_SUCCESS) {
|
||||
if (getColumnIndexByName(&pExpr->columnName, pQueryInfo, &index, tscGetErrorMsgPayload(pCmd)) != TSDB_CODE_SUCCESS) {
|
||||
return TSDB_CODE_TSC_INVALID_OPERATION;
|
||||
}
|
||||
|
||||
|
@ -4090,7 +4096,7 @@ static int32_t validateSQLExpr(SSqlCmd* pCmd, tSqlExpr* pExpr, SQueryInfo* pQuer
|
|||
|
||||
// sql function list in selection clause.
|
||||
// Append the sqlExpr into exprList of pQueryInfo structure sequentially
|
||||
pExpr->functionId = isValidFunction(pExpr->operand.z, pExpr->operand.n);
|
||||
pExpr->functionId = isValidFunction(pExpr->Expr.operand.z, pExpr->Expr.operand.n);
|
||||
if (pExpr->functionId < 0) {
|
||||
return TSDB_CODE_TSC_INVALID_OPERATION;
|
||||
}
|
||||
|
@ -4256,7 +4262,7 @@ static bool validateJoinExprNode(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSqlExpr
|
|||
|
||||
SColumnIndex rightIndex = COLUMN_INDEX_INITIALIZER;
|
||||
|
||||
if (getColumnIndexByName(&pRight->colInfo, pQueryInfo, &rightIndex, tscGetErrorMsgPayload(pCmd)) != TSDB_CODE_SUCCESS) {
|
||||
if (getColumnIndexByName(&pRight->columnName, pQueryInfo, &rightIndex, tscGetErrorMsgPayload(pCmd)) != TSDB_CODE_SUCCESS) {
|
||||
invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg1);
|
||||
return false;
|
||||
}
|
||||
|
@ -4342,7 +4348,7 @@ static int32_t validateLikeExpr(tSqlExpr* pExpr, STableMeta* pTableMeta, int32_t
|
|||
}
|
||||
|
||||
SSchema* pSchema = tscGetTableSchema(pTableMeta);
|
||||
if ((!isTablenameToken(&pLeft->colInfo)) && !IS_VAR_DATA_TYPE(pSchema[index].type)) {
|
||||
if ((!isTablenameToken(&pLeft->columnName)) && !IS_VAR_DATA_TYPE(pSchema[index].type)) {
|
||||
return invalidOperationMsg(msgBuf, msg2);
|
||||
}
|
||||
}
|
||||
|
@ -4366,7 +4372,7 @@ static int32_t handleExprInQueryCond(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSql
|
|||
int32_t ret = TSDB_CODE_SUCCESS;
|
||||
|
||||
SColumnIndex index = COLUMN_INDEX_INITIALIZER;
|
||||
if (getColumnIndexByName(&pLeft->colInfo, pQueryInfo, &index, tscGetErrorMsgPayload(pCmd)) != TSDB_CODE_SUCCESS) {
|
||||
if (getColumnIndexByName(&pLeft->columnName, pQueryInfo, &index, tscGetErrorMsgPayload(pCmd)) != TSDB_CODE_SUCCESS) {
|
||||
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg2);
|
||||
}
|
||||
|
||||
|
@ -4409,7 +4415,7 @@ static int32_t handleExprInQueryCond(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSql
|
|||
|
||||
int16_t leftIdx = index.tableIndex;
|
||||
|
||||
if (getColumnIndexByName(&pRight->colInfo, pQueryInfo, &index, tscGetErrorMsgPayload(pCmd)) != TSDB_CODE_SUCCESS) {
|
||||
if (getColumnIndexByName(&pRight->columnName, pQueryInfo, &index, tscGetErrorMsgPayload(pCmd)) != TSDB_CODE_SUCCESS) {
|
||||
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg2);
|
||||
}
|
||||
|
||||
|
@ -4572,7 +4578,7 @@ static void doExtractExprForSTable(SSqlCmd* pCmd, tSqlExpr** pExpr, SQueryInfo*
|
|||
tSqlExpr* pLeft = (*pExpr)->pLeft;
|
||||
|
||||
SColumnIndex index = COLUMN_INDEX_INITIALIZER;
|
||||
if (getColumnIndexByName(&pLeft->colInfo, pQueryInfo, &index, tscGetErrorMsgPayload(pCmd)) != TSDB_CODE_SUCCESS) {
|
||||
if (getColumnIndexByName(&pLeft->columnName, pQueryInfo, &index, tscGetErrorMsgPayload(pCmd)) != TSDB_CODE_SUCCESS) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -4739,7 +4745,7 @@ static int32_t getTimeRangeFromExpr(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSqlE
|
|||
return getTimeRangeFromExpr(pCmd, pQueryInfo, pExpr->pRight);
|
||||
} else {
|
||||
SColumnIndex index = COLUMN_INDEX_INITIALIZER;
|
||||
if (getColumnIndexByName(&pExpr->pLeft->colInfo, pQueryInfo, &index, tscGetErrorMsgPayload(pCmd)) != TSDB_CODE_SUCCESS) {
|
||||
if (getColumnIndexByName(&pExpr->pLeft->columnName, pQueryInfo, &index, tscGetErrorMsgPayload(pCmd)) != TSDB_CODE_SUCCESS) {
|
||||
return TSDB_CODE_TSC_INVALID_OPERATION;
|
||||
}
|
||||
|
||||
|
@ -4822,7 +4828,7 @@ static void doAddJoinTagsColumnsIntoTagList(SSqlCmd* pCmd, SQueryInfo* pQueryInf
|
|||
if (QUERY_IS_JOIN_QUERY(pQueryInfo->type) && UTIL_TABLE_IS_SUPER_TABLE(pTableMetaInfo)) {
|
||||
SColumnIndex index = COLUMN_INDEX_INITIALIZER;
|
||||
|
||||
if (getColumnIndexByName(pCmd, &pCondExpr->pJoinExpr->pLeft->colInfo, pQueryInfo, &index) != TSDB_CODE_SUCCESS) {
|
||||
if (getColumnIndexByName(pCmd, &pCondExpr->pJoinExpr->pLeft->ColName, pQueryInfo, &index) != TSDB_CODE_SUCCESS) {
|
||||
tscError("%p: invalid column name (left)", pQueryInfo);
|
||||
}
|
||||
|
||||
|
@ -4832,7 +4838,7 @@ static void doAddJoinTagsColumnsIntoTagList(SSqlCmd* pCmd, SQueryInfo* pQueryInf
|
|||
SSchema* pSchema = tscGetTableTagSchema(pTableMetaInfo->pTableMeta);
|
||||
tscColumnListInsert(pTableMetaInfo->tagColList, &index, &pSchema[index.columnIndex]);
|
||||
|
||||
if (getColumnIndexByName(pCmd, &pCondExpr->pJoinExpr->pRight->colInfo, pQueryInfo, &index) != TSDB_CODE_SUCCESS) {
|
||||
if (getColumnIndexByName(pCmd, &pCondExpr->pJoinExpr->pRight->ColName, pQueryInfo, &index) != TSDB_CODE_SUCCESS) {
|
||||
tscError("%p: invalid column name (right)", pQueryInfo);
|
||||
}
|
||||
|
||||
|
@ -6981,9 +6987,9 @@ int32_t doLocalQueryProcess(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SSqlNode* pSq
|
|||
bool server_status = false;
|
||||
tSqlExprItem* pExprItem = taosArrayGet(pExprList, 0);
|
||||
tSqlExpr* pExpr = pExprItem->pNode;
|
||||
if (pExpr->operand.z == NULL) {
|
||||
if (pExpr->Expr.operand.z == NULL) {
|
||||
//handle 'select 1'
|
||||
if (pExpr->token.n == 1 && 0 == strncasecmp(pExpr->token.z, "1", 1)) {
|
||||
if (pExpr->exprToken.n == 1 && 0 == strncasecmp(pExpr->exprToken.z, "1", 1)) {
|
||||
server_status = true;
|
||||
} else {
|
||||
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg2);
|
||||
|
@ -7001,8 +7007,8 @@ int32_t doLocalQueryProcess(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SSqlNode* pSq
|
|||
index = 2;
|
||||
} else {
|
||||
for (int32_t i = 0; i < tListLen(functionsInfo); ++i) {
|
||||
if (strncasecmp(functionsInfo[i].name, pExpr->token.z, functionsInfo[i].len) == 0 &&
|
||||
functionsInfo[i].len == pExpr->token.n) {
|
||||
if (strncasecmp(functionsInfo[i].name, pExpr->exprToken.z, functionsInfo[i].len) == 0 &&
|
||||
functionsInfo[i].len == pExpr->exprToken.n) {
|
||||
index = i;
|
||||
break;
|
||||
}
|
||||
|
@ -7014,7 +7020,7 @@ int32_t doLocalQueryProcess(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SSqlNode* pSq
|
|||
pQueryInfo->command = TSDB_SQL_CURRENT_DB;break;
|
||||
case 1:
|
||||
pQueryInfo->command = TSDB_SQL_SERV_VERSION;break;
|
||||
case 2:
|
||||
case 2:
|
||||
pQueryInfo->command = TSDB_SQL_SERV_STATUS;break;
|
||||
case 3:
|
||||
pQueryInfo->command = TSDB_SQL_CLI_VERSION;break;
|
||||
|
@ -7606,48 +7612,80 @@ int32_t checkQueryRangeForFill(SSqlCmd* pCmd, SQueryInfo* pQueryInfo) {
|
|||
}
|
||||
|
||||
// TODO normalize the function expression and compare it
|
||||
int32_t tscGetExprFilters(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SArray* pSelectNodeList, tSqlExpr* pSqlExpr,
|
||||
SExprInfo** pExpr) {
|
||||
int32_t tscGetExprFilters(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SArray* pSelectNodeList, tSqlExpr* pSqlExpr, SExprInfo** pExpr) {
|
||||
const char* msg1 = "invalid sql expression in having";
|
||||
|
||||
*pExpr = NULL;
|
||||
size_t nx = tscNumOfExprs(pQueryInfo);
|
||||
|
||||
size_t num = taosArrayGetSize(pSelectNodeList);
|
||||
for(int32_t i = 0; i < num; ++i) {
|
||||
tSqlExprItem* pItem = taosArrayGet(pSelectNodeList, i);
|
||||
if (tSqlExprCompare(pItem->pNode, pSqlExpr) == 0) { // exists, not added it,
|
||||
// parameters is needed for functions
|
||||
if (pSqlExpr->Expr.paramList == NULL && pSqlExpr->functionId != TSDB_FUNC_COUNT) {
|
||||
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg1);
|
||||
}
|
||||
|
||||
SColumnIndex index = COLUMN_INDEX_INITIALIZER;
|
||||
int32_t functionId = pSqlExpr->functionId;
|
||||
if (pSqlExpr->pParam == NULL) {
|
||||
index.columnIndex = 0;
|
||||
index.tableIndex = 0;
|
||||
} else {
|
||||
tSqlExprItem* pParamElem = taosArrayGet(pSqlExpr->pParam, 0);
|
||||
SStrToken* pToken = &pParamElem->pNode->colInfo;
|
||||
getColumnIndexByName(pToken, pQueryInfo, &index, tscGetErrorMsgPayload(pCmd));
|
||||
}
|
||||
tSqlExprItem *pParam = NULL;
|
||||
SSchema schema = {0};
|
||||
|
||||
size_t numOfNodeInSel = tscNumOfExprs(pQueryInfo);
|
||||
for(int32_t k = 0; k < numOfNodeInSel; ++k) {
|
||||
SExprInfo* pExpr1 = tscExprGet(pQueryInfo, k);
|
||||
if (pSqlExpr->Expr.paramList != NULL) {
|
||||
pParam = taosArrayGet(pSqlExpr->Expr.paramList, 0);
|
||||
SStrToken* pToken = &pParam->pNode->columnName;
|
||||
|
||||
if (pExpr1->base.functionId != functionId) {
|
||||
continue;
|
||||
}
|
||||
SColumnIndex index = COLUMN_INDEX_INITIALIZER;
|
||||
getColumnIndexByName(pToken, pQueryInfo, &index, tscGetErrorMsgPayload(pCmd));
|
||||
STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, index.tableIndex);
|
||||
schema = *tscGetTableColumnSchema(pTableMetaInfo->pTableMeta, index.columnIndex);
|
||||
} else {
|
||||
schema = (SSchema) {.colId = PRIMARYKEY_TIMESTAMP_COL_INDEX, .type = TSDB_DATA_TYPE_TIMESTAMP, .bytes = TSDB_KEYSIZE};
|
||||
}
|
||||
|
||||
if (pExpr1->base.colInfo.colIndex != index.columnIndex) {
|
||||
continue;
|
||||
}
|
||||
|
||||
++pQueryInfo->havingFieldNum;
|
||||
*pExpr = pExpr1;
|
||||
break;
|
||||
}
|
||||
|
||||
assert(*pExpr != NULL);
|
||||
for(int32_t i = 0; i < nx; ++i) {
|
||||
SExprInfo* pExprInfo = tscExprGet(pQueryInfo, i);
|
||||
if (pExprInfo->base.functionId == pSqlExpr->functionId && pExprInfo->base.colInfo.colId == schema.colId) {
|
||||
++pQueryInfo->havingFieldNum;
|
||||
*pExpr = pExprInfo;
|
||||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
// size_t num = taosArrayGetSize(pSelectNodeList);
|
||||
// for(int32_t i = 0; i < num; ++i) {
|
||||
// tSqlExprItem* pItem = taosArrayGet(pSelectNodeList, i);
|
||||
//
|
||||
// if (tSqlExprCompare(pItem->pNode, pSqlExpr) == 0) { // exists, not added it,
|
||||
//
|
||||
// SColumnIndex index = COLUMN_INDEX_INITIALIZER;
|
||||
// int32_t functionId = pSqlExpr->functionId;
|
||||
// if (pSqlExpr->Expr.paramList == NULL) {
|
||||
// index.columnIndex = 0;
|
||||
// index.tableIndex = 0;
|
||||
// } else {
|
||||
// tSqlExprItem* pParamElem = taosArrayGet(pSqlExpr->Expr.paramList, 0);
|
||||
// SStrToken* pToken = &pParamElem->pNode->columnName;
|
||||
// getColumnIndexByName(pToken, pQueryInfo, &index, tscGetErrorMsgPayload(pCmd));
|
||||
// }
|
||||
//
|
||||
// size_t numOfNodeInSel = tscNumOfExprs(pQueryInfo);
|
||||
// for(int32_t k = 0; k < numOfNodeInSel; ++k) {
|
||||
// SExprInfo* pExpr1 = tscExprGet(pQueryInfo, k);
|
||||
//
|
||||
// if (pExpr1->base.functionId != functionId) {
|
||||
// continue;
|
||||
// }
|
||||
//
|
||||
// if (pExpr1->base.colInfo.colIndex != index.columnIndex) {
|
||||
// continue;
|
||||
// }
|
||||
//
|
||||
// ++pQueryInfo->havingFieldNum;
|
||||
// *pExpr = pExpr1;
|
||||
// break;
|
||||
// }
|
||||
//
|
||||
// assert(*pExpr != NULL);
|
||||
// return TSDB_CODE_SUCCESS;
|
||||
// }
|
||||
// }
|
||||
|
||||
tSqlExprItem item = {.pNode = pSqlExpr, .aliasName = NULL, .distinct = false};
|
||||
|
||||
int32_t outputIndex = (int32_t)tscNumOfExprs(pQueryInfo);
|
||||
|
@ -7791,10 +7829,10 @@ int32_t getHavingExpr(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SArray* pSelectNode
|
|||
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg1);
|
||||
}
|
||||
|
||||
if (pLeft->pParam) {
|
||||
size_t size = taosArrayGetSize(pLeft->pParam);
|
||||
if (pLeft->Expr.paramList) {
|
||||
size_t size = taosArrayGetSize(pLeft->Expr.paramList);
|
||||
for (int32_t i = 0; i < size; i++) {
|
||||
tSqlExprItem* pParamItem = taosArrayGet(pLeft->pParam, i);
|
||||
tSqlExprItem* pParamItem = taosArrayGet(pLeft->Expr.paramList, i);
|
||||
|
||||
tSqlExpr* pExpr1 = pParamItem->pNode;
|
||||
if (pExpr1->tokenId != TK_ALL &&
|
||||
|
@ -7805,13 +7843,13 @@ int32_t getHavingExpr(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SArray* pSelectNode
|
|||
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg1);
|
||||
}
|
||||
|
||||
if (pExpr1->tokenId == TK_ID && (pExpr1->colInfo.z == NULL && pExpr1->colInfo.n == 0)) {
|
||||
if (pExpr1->tokenId == TK_ID && (pExpr1->columnName.z == NULL && pExpr1->columnName.n == 0)) {
|
||||
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg1);
|
||||
}
|
||||
|
||||
if (pExpr1->tokenId == TK_ID) {
|
||||
SColumnIndex index = COLUMN_INDEX_INITIALIZER;
|
||||
if ((getColumnIndexByName(&pExpr1->colInfo, pQueryInfo, &index, tscGetErrorMsgPayload(pCmd)) != TSDB_CODE_SUCCESS)) {
|
||||
if ((getColumnIndexByName(&pExpr1->columnName, pQueryInfo, &index, tscGetErrorMsgPayload(pCmd)) != TSDB_CODE_SUCCESS)) {
|
||||
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg1);
|
||||
}
|
||||
|
||||
|
@ -7826,7 +7864,7 @@ int32_t getHavingExpr(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SArray* pSelectNode
|
|||
}
|
||||
}
|
||||
|
||||
pLeft->functionId = isValidFunction(pLeft->operand.z, pLeft->operand.n);
|
||||
pLeft->functionId = isValidFunction(pLeft->Expr.operand.z, pLeft->Expr.operand.n);
|
||||
if (pLeft->functionId < 0) {
|
||||
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg1);
|
||||
}
|
||||
|
@ -8290,11 +8328,6 @@ int32_t validateSqlNode(SSqlObj* pSql, SSqlNode* pSqlNode, SQueryInfo* pQueryInf
|
|||
return TSDB_CODE_TSC_INVALID_OPERATION;
|
||||
}
|
||||
|
||||
// parse the window_state
|
||||
if (validateStateWindowNode(pCmd, pQueryInfo, pSqlNode, false) != TSDB_CODE_SUCCESS) {
|
||||
return TSDB_CODE_TSC_INVALID_OPERATION;
|
||||
}
|
||||
|
||||
// todo NOT support yet
|
||||
for (int32_t i = 0; i < tscNumOfExprs(pQueryInfo); ++i) {
|
||||
SExprInfo* pExpr = tscExprGet(pQueryInfo, i);
|
||||
|
@ -8345,6 +8378,11 @@ int32_t validateSqlNode(SSqlObj* pSql, SSqlNode* pSqlNode, SQueryInfo* pQueryInf
|
|||
return TSDB_CODE_TSC_INVALID_OPERATION;
|
||||
}
|
||||
|
||||
// parse the window_state
|
||||
if (validateStateWindowNode(pCmd, pQueryInfo, pSqlNode, false) != TSDB_CODE_SUCCESS) {
|
||||
return TSDB_CODE_TSC_INVALID_OPERATION;
|
||||
}
|
||||
|
||||
if (isTimeWindowQuery(pQueryInfo)) {
|
||||
// check if the first column of the nest query result is timestamp column
|
||||
SColumn* pCol = taosArrayGetP(pQueryInfo->colList, 0);
|
||||
|
@ -8365,6 +8403,10 @@ int32_t validateSqlNode(SSqlObj* pSql, SSqlNode* pSqlNode, SQueryInfo* pQueryInf
|
|||
return TSDB_CODE_TSC_INVALID_OPERATION;
|
||||
}
|
||||
|
||||
if ((code = validateLimitNode(pCmd, pQueryInfo, pSqlNode, pSql)) != TSDB_CODE_SUCCESS) {
|
||||
return code;
|
||||
}
|
||||
|
||||
// set order by info
|
||||
if (validateOrderbyNode(pCmd, pQueryInfo, pSqlNode, tscGetTableSchema(pTableMeta)) != TSDB_CODE_SUCCESS) {
|
||||
return TSDB_CODE_TSC_INVALID_OPERATION;
|
||||
|
@ -8376,6 +8418,10 @@ int32_t validateSqlNode(SSqlObj* pSql, SSqlNode* pSqlNode, SQueryInfo* pQueryInf
|
|||
|
||||
// updateFunctionInterBuf(pQueryInfo, false);
|
||||
updateLastScanOrderIfNeeded(pQueryInfo);
|
||||
|
||||
if ((code = validateFillNode(pCmd, pQueryInfo, pSqlNode)) != TSDB_CODE_SUCCESS) {
|
||||
return code;
|
||||
}
|
||||
} else {
|
||||
pQueryInfo->command = TSDB_SQL_SELECT;
|
||||
|
||||
|
@ -8421,10 +8467,12 @@ int32_t validateSqlNode(SSqlObj* pSql, SSqlNode* pSqlNode, SQueryInfo* pQueryInf
|
|||
TSDB_CODE_SUCCESS) {
|
||||
return TSDB_CODE_TSC_INVALID_OPERATION;
|
||||
}
|
||||
|
||||
// parse the window_state
|
||||
if (validateStateWindowNode(pCmd, pQueryInfo, pSqlNode, isSTable) != TSDB_CODE_SUCCESS) {
|
||||
return TSDB_CODE_TSC_INVALID_OPERATION;
|
||||
}
|
||||
|
||||
// set order by info
|
||||
if (validateOrderbyNode(pCmd, pQueryInfo, pSqlNode, tscGetTableSchema(pTableMetaInfo->pTableMeta)) !=
|
||||
TSDB_CODE_SUCCESS) {
|
||||
|
@ -8592,7 +8640,7 @@ int32_t exprTreeFromSqlExpr(SSqlCmd* pCmd, tExprNode **pExpr, const tSqlExpr* pS
|
|||
*pExpr = calloc(1, sizeof(tExprNode));
|
||||
(*pExpr)->nodeType = TSQL_NODE_COL;
|
||||
(*pExpr)->pSchema = calloc(1, sizeof(SSchema));
|
||||
strncpy((*pExpr)->pSchema->name, pSqlExpr->token.z, pSqlExpr->token.n);
|
||||
strncpy((*pExpr)->pSchema->name, pSqlExpr->exprToken.z, pSqlExpr->exprToken.n);
|
||||
|
||||
// set the input column data byte and type.
|
||||
size_t size = taosArrayGetSize(pQueryInfo->exprList);
|
||||
|
@ -8614,7 +8662,7 @@ int32_t exprTreeFromSqlExpr(SSqlCmd* pCmd, tExprNode **pExpr, const tSqlExpr* pS
|
|||
}
|
||||
} else if (pSqlExpr->type == SQL_NODE_TABLE_COLUMN) { // column name, normal column arithmetic expression
|
||||
SColumnIndex index = COLUMN_INDEX_INITIALIZER;
|
||||
int32_t ret = getColumnIndexByName(&pSqlExpr->colInfo, pQueryInfo, &index, tscGetErrorMsgPayload(pCmd));
|
||||
int32_t ret = getColumnIndexByName(&pSqlExpr->columnName, pQueryInfo, &index, tscGetErrorMsgPayload(pCmd));
|
||||
if (ret != TSDB_CODE_SUCCESS) {
|
||||
return ret;
|
||||
}
|
||||
|
@ -8658,7 +8706,7 @@ int32_t exprTreeFromSqlExpr(SSqlCmd* pCmd, tExprNode **pExpr, const tSqlExpr* pS
|
|||
}
|
||||
STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, 0);
|
||||
STableComInfo tinfo = tscGetTableInfo(pTableMetaInfo->pTableMeta);
|
||||
if (serializeExprListToVariant(pSqlExpr->pParam, &pVal, colType, tinfo.precision) == false) {
|
||||
if (serializeExprListToVariant(pSqlExpr->Expr.paramList, &pVal, colType, tinfo.precision) == false) {
|
||||
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), "not support filter expression");
|
||||
}
|
||||
*pExpr = calloc(1, sizeof(tExprNode));
|
||||
|
@ -8677,7 +8725,7 @@ int32_t exprTreeFromSqlExpr(SSqlCmd* pCmd, tExprNode **pExpr, const tSqlExpr* pS
|
|||
(*pExpr)->_node.pRight = pRight;
|
||||
|
||||
SStrToken t = {.type = pSqlExpr->tokenId};
|
||||
(*pExpr)->_node.optr = convertOptr(&t);
|
||||
(*pExpr)->_node.optr = convertRelationalOperator(&t);
|
||||
|
||||
assert((*pExpr)->_node.optr != 0);
|
||||
|
||||
|
@ -8716,3 +8764,39 @@ bool hasNormalColumnFilter(SQueryInfo* pQueryInfo) {
|
|||
|
||||
return false;
|
||||
}
|
||||
|
||||
#if 0
|
||||
void normalizeSqlNode(SSqlNode* pSqlNode, const char* dbName) {
|
||||
assert(pSqlNode != NULL);
|
||||
|
||||
if (pSqlNode->from->type == SQL_NODE_FROM_TABLELIST) {
|
||||
// SRelElementPair *item = taosArrayGet(pSqlNode->from->list, 0);
|
||||
// item->TableName.name;
|
||||
}
|
||||
|
||||
// 1. pSqlNode->pSelNodeList
|
||||
if (pSqlNode->pSelNodeList != NULL && taosArrayGetSize(pSqlNode->pSelNodeList) > 0) {
|
||||
SArray* pSelNodeList = pSqlNode->pSelNodeList;
|
||||
size_t numOfExpr = taosArrayGetSize(pSelNodeList);
|
||||
for (int32_t i = 0; i < numOfExpr; ++i) {
|
||||
tSqlExprItem* pItem = taosArrayGet(pSelNodeList, i);
|
||||
int32_t type = pItem->pNode->type;
|
||||
if (type == SQL_NODE_VALUE || type == SQL_NODE_EXPR) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (type == SQL_NODE_TABLE_COLUMN) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 2. pSqlNode->pWhere
|
||||
// 3. pSqlNode->pHaving
|
||||
// 4. pSqlNode->pSortOrder
|
||||
|
||||
// pSqlNode->from
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
@ -693,7 +693,7 @@ void tscSetResRawPtrRv(SSqlRes* pRes, SQueryInfo* pQueryInfo, SSDataBlock* pBloc
|
|||
setResRawPtrImpl(pRes, pInfo, i, convertNchar);
|
||||
/*
|
||||
// generated the user-defined column result
|
||||
if (pInfo->pExpr->pExpr == NULL && TSDB_COL_IS_UD_COL(pInfo->pExpr->base.colInfo.flag)) {
|
||||
if (pInfo->pExpr->pExpr == NULL && TSDB_COL_IS_UD_COL(pInfo->pExpr->base.ColName.flag)) {
|
||||
if (pInfo->pExpr->base.param[1].nType == TSDB_DATA_TYPE_NULL) {
|
||||
setNullN(pRes->urow[i], pInfo->field.type, pInfo->field.bytes, (int32_t) pRes->numOfRows);
|
||||
} else {
|
||||
|
@ -2175,10 +2175,8 @@ void tscFieldInfoCopy(SFieldInfo* pFieldInfo, const SFieldInfo* pSrc, const SArr
|
|||
}
|
||||
|
||||
|
||||
SExprInfo* tscExprCreate(SQueryInfo* pQueryInfo, int16_t functionId, SColumnIndex* pColIndex, int16_t type,
|
||||
SExprInfo* tscExprCreate(STableMetaInfo* pTableMetaInfo, int16_t functionId, SColumnIndex* pColIndex, int16_t type,
|
||||
int16_t size, int16_t resColId, int16_t interSize, int32_t colType) {
|
||||
STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, pColIndex->tableIndex);
|
||||
|
||||
SExprInfo* pExpr = calloc(1, sizeof(SExprInfo));
|
||||
if (pExpr == NULL) {
|
||||
return NULL;
|
||||
|
@ -2200,21 +2198,22 @@ SExprInfo* tscExprCreate(SQueryInfo* pQueryInfo, int16_t functionId, SColumnInde
|
|||
} else if (functionId == TSDB_FUNC_BLKINFO) {
|
||||
p->colInfo.colId = pColIndex->columnIndex;
|
||||
p->colBytes = TSDB_MAX_BINARY_LEN;
|
||||
p->colType = TSDB_DATA_TYPE_BINARY;
|
||||
p->colType = TSDB_DATA_TYPE_BINARY;
|
||||
} else {
|
||||
int32_t len = tListLen(p->colInfo.name);
|
||||
if (TSDB_COL_IS_TAG(colType)) {
|
||||
SSchema* pSchema = tscGetTableTagSchema(pTableMetaInfo->pTableMeta);
|
||||
p->colInfo.colId = pSchema[pColIndex->columnIndex].colId;
|
||||
p->colBytes = pSchema[pColIndex->columnIndex].bytes;
|
||||
p->colType = pSchema[pColIndex->columnIndex].type;
|
||||
tstrncpy(p->colInfo.name, pSchema[pColIndex->columnIndex].name, sizeof(p->colInfo.name));
|
||||
snprintf(p->colInfo.name, len, "%s.%s", pTableMetaInfo->aliasName, pSchema[pColIndex->columnIndex].name);
|
||||
} else if (pTableMetaInfo->pTableMeta != NULL) {
|
||||
// in handling select database/version/server_status(), the pTableMeta is NULL
|
||||
SSchema* pSchema = tscGetTableColumnSchema(pTableMetaInfo->pTableMeta, pColIndex->columnIndex);
|
||||
p->colInfo.colId = pSchema->colId;
|
||||
p->colBytes = pSchema->bytes;
|
||||
p->colType = pSchema->type;
|
||||
tstrncpy(p->colInfo.name, pSchema->name, sizeof(p->colInfo.name));
|
||||
p->colType = pSchema->type;
|
||||
snprintf(p->colInfo.name, len, "%s.%s", pTableMetaInfo->aliasName, pSchema->name);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2239,15 +2238,17 @@ SExprInfo* tscExprInsert(SQueryInfo* pQueryInfo, int32_t index, int16_t function
|
|||
if (index == num) {
|
||||
return tscExprAppend(pQueryInfo, functionId, pColIndex, type, size, resColId, interSize, isTagCol);
|
||||
}
|
||||
|
||||
SExprInfo* pExpr = tscExprCreate(pQueryInfo, functionId, pColIndex, type, size, resColId, interSize, isTagCol);
|
||||
|
||||
STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, pColIndex->tableIndex);
|
||||
SExprInfo* pExpr = tscExprCreate(pTableMetaInfo, functionId, pColIndex, type, size, resColId, interSize, isTagCol);
|
||||
taosArrayInsert(pQueryInfo->exprList, index, &pExpr);
|
||||
return pExpr;
|
||||
}
|
||||
|
||||
SExprInfo* tscExprAppend(SQueryInfo* pQueryInfo, int16_t functionId, SColumnIndex* pColIndex, int16_t type,
|
||||
int16_t size, int16_t resColId, int16_t interSize, bool isTagCol) {
|
||||
SExprInfo* pExpr = tscExprCreate(pQueryInfo, functionId, pColIndex, type, size, resColId, interSize, isTagCol);
|
||||
STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, pColIndex->tableIndex);
|
||||
SExprInfo* pExpr = tscExprCreate(pTableMetaInfo, functionId, pColIndex, type, size, resColId, interSize, isTagCol);
|
||||
taosArrayPush(pQueryInfo->exprList, &pExpr);
|
||||
return pExpr;
|
||||
}
|
||||
|
|
|
@ -46,7 +46,7 @@ typedef struct SSqlExpr {
|
|||
char aliasName[TSDB_COL_NAME_LEN]; // as aliasName
|
||||
char token[TSDB_COL_NAME_LEN]; // original token
|
||||
SColIndex colInfo;
|
||||
uint64_t uid; // refactor use the pointer
|
||||
uint64_t uid; // table uid, todo refactor use the pointer
|
||||
|
||||
int16_t functionId; // function id in aAgg array
|
||||
|
||||
|
|
|
@ -180,15 +180,15 @@ int8_t tsEnableStream = 1;
|
|||
int8_t tsCompactMnodeWal = 0;
|
||||
int8_t tsPrintAuth = 0;
|
||||
int8_t tscEmbedded = 0;
|
||||
char configDir[TSDB_FILENAME_LEN] = {0};
|
||||
char tsVnodeDir[TSDB_FILENAME_LEN] = {0};
|
||||
char tsDnodeDir[TSDB_FILENAME_LEN] = {0};
|
||||
char tsMnodeDir[TSDB_FILENAME_LEN] = {0};
|
||||
char tsMnodeTmpDir[TSDB_FILENAME_LEN] = {0};
|
||||
char tsMnodeBakDir[TSDB_FILENAME_LEN] = {0};
|
||||
char tsDataDir[TSDB_FILENAME_LEN] = {0};
|
||||
char tsScriptDir[TSDB_FILENAME_LEN] = {0};
|
||||
char tsTempDir[TSDB_FILENAME_LEN] = "/tmp/";
|
||||
char configDir[PATH_MAX] = {0};
|
||||
char tsVnodeDir[PATH_MAX] = {0};
|
||||
char tsDnodeDir[PATH_MAX] = {0};
|
||||
char tsMnodeDir[PATH_MAX] = {0};
|
||||
char tsMnodeTmpDir[PATH_MAX] = {0};
|
||||
char tsMnodeBakDir[PATH_MAX] = {0};
|
||||
char tsDataDir[PATH_MAX] = {0};
|
||||
char tsScriptDir[PATH_MAX] = {0};
|
||||
char tsTempDir[PATH_MAX] = "/tmp/";
|
||||
|
||||
int32_t tsDiskCfgNum = 0;
|
||||
|
||||
|
|
|
@ -405,7 +405,7 @@ typedef struct SColIndex {
|
|||
int16_t colId; // column id
|
||||
int16_t colIndex; // column index in colList if it is a normal column or index in tagColList if a tag
|
||||
uint16_t flag; // denote if it is a tag or a normal column
|
||||
char name[TSDB_COL_NAME_LEN]; // TODO remove it
|
||||
char name[TSDB_COL_NAME_LEN + TSDB_DB_NAME_LEN + 1];
|
||||
} SColIndex;
|
||||
|
||||
typedef struct SColumnFilterInfo {
|
||||
|
|
|
@ -3216,6 +3216,13 @@ static int readTagFromCsvFileToMem(SSuperTable * superTblInfo) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
#if 0
|
||||
int readSampleFromJsonFileToMem(SSuperTable * superTblInfo) {
|
||||
// TODO
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
Read 10000 lines at most. If more than 10000 lines, continue to read after using
|
||||
*/
|
||||
|
@ -5331,7 +5338,7 @@ static int64_t generateInterlaceDataWithoutStb(
|
|||
|
||||
#if STMT_IFACE_ENABLED == 1
|
||||
static int32_t prepareStmtBindArrayByType(TAOS_BIND *bind,
|
||||
char *dataType, int32_t dataLen, char **ptr, char *value)
|
||||
char *dataType, int32_t dataLen, char **ptr)
|
||||
{
|
||||
if (0 == strncasecmp(dataType,
|
||||
"BINARY", strlen("BINARY"))) {
|
||||
|
@ -5341,18 +5348,12 @@ static int32_t prepareStmtBindArrayByType(TAOS_BIND *bind,
|
|||
return -1;
|
||||
}
|
||||
char *bind_binary = (char *)*ptr;
|
||||
rand_string(bind_binary, dataLen);
|
||||
|
||||
bind->buffer_type = TSDB_DATA_TYPE_BINARY;
|
||||
if (value) {
|
||||
strncpy(bind_binary, value, strlen(value));
|
||||
bind->buffer_length = strlen(bind_binary);
|
||||
} else {
|
||||
rand_string(bind_binary, dataLen);
|
||||
bind->buffer_length = dataLen;
|
||||
}
|
||||
|
||||
bind->length = &bind->buffer_length;
|
||||
bind->buffer_length = dataLen;
|
||||
bind->buffer = bind_binary;
|
||||
bind->length = &bind->buffer_length;
|
||||
bind->is_null = NULL;
|
||||
|
||||
*ptr += bind->buffer_length;
|
||||
|
@ -5364,14 +5365,9 @@ static int32_t prepareStmtBindArrayByType(TAOS_BIND *bind,
|
|||
return -1;
|
||||
}
|
||||
char *bind_nchar = (char *)*ptr;
|
||||
rand_string(bind_nchar, dataLen);
|
||||
|
||||
bind->buffer_type = TSDB_DATA_TYPE_NCHAR;
|
||||
if (value) {
|
||||
strncpy(bind_nchar, value, strlen(value));
|
||||
} else {
|
||||
rand_string(bind_nchar, dataLen);
|
||||
}
|
||||
|
||||
bind->buffer_length = strlen(bind_nchar);
|
||||
bind->buffer = bind_nchar;
|
||||
bind->length = &bind->buffer_length;
|
||||
|
@ -5382,11 +5378,7 @@ static int32_t prepareStmtBindArrayByType(TAOS_BIND *bind,
|
|||
"INT", strlen("INT"))) {
|
||||
int32_t *bind_int = (int32_t *)*ptr;
|
||||
|
||||
if (value) {
|
||||
*bind_int = atoi(value);
|
||||
} else {
|
||||
*bind_int = rand_int();
|
||||
}
|
||||
*bind_int = rand_int();
|
||||
bind->buffer_type = TSDB_DATA_TYPE_INT;
|
||||
bind->buffer_length = sizeof(int32_t);
|
||||
bind->buffer = bind_int;
|
||||
|
@ -5398,11 +5390,7 @@ static int32_t prepareStmtBindArrayByType(TAOS_BIND *bind,
|
|||
"BIGINT", strlen("BIGINT"))) {
|
||||
int64_t *bind_bigint = (int64_t *)*ptr;
|
||||
|
||||
if (value) {
|
||||
*bind_bigint = atoll(value);
|
||||
} else {
|
||||
*bind_bigint = rand_bigint();
|
||||
}
|
||||
*bind_bigint = rand_bigint();
|
||||
bind->buffer_type = TSDB_DATA_TYPE_BIGINT;
|
||||
bind->buffer_length = sizeof(int64_t);
|
||||
bind->buffer = bind_bigint;
|
||||
|
@ -5414,11 +5402,7 @@ static int32_t prepareStmtBindArrayByType(TAOS_BIND *bind,
|
|||
"FLOAT", strlen("FLOAT"))) {
|
||||
float *bind_float = (float *) *ptr;
|
||||
|
||||
if (value) {
|
||||
*bind_float = (float)atof(value);
|
||||
} else {
|
||||
*bind_float = rand_float();
|
||||
}
|
||||
*bind_float = rand_float();
|
||||
bind->buffer_type = TSDB_DATA_TYPE_FLOAT;
|
||||
bind->buffer_length = sizeof(float);
|
||||
bind->buffer = bind_float;
|
||||
|
@ -5430,11 +5414,7 @@ static int32_t prepareStmtBindArrayByType(TAOS_BIND *bind,
|
|||
"DOUBLE", strlen("DOUBLE"))) {
|
||||
double *bind_double = (double *)*ptr;
|
||||
|
||||
if (value) {
|
||||
*bind_double = atof(value);
|
||||
} else {
|
||||
*bind_double = rand_double();
|
||||
}
|
||||
*bind_double = rand_double();
|
||||
bind->buffer_type = TSDB_DATA_TYPE_DOUBLE;
|
||||
bind->buffer_length = sizeof(double);
|
||||
bind->buffer = bind_double;
|
||||
|
@ -5446,11 +5426,7 @@ static int32_t prepareStmtBindArrayByType(TAOS_BIND *bind,
|
|||
"SMALLINT", strlen("SMALLINT"))) {
|
||||
int16_t *bind_smallint = (int16_t *)*ptr;
|
||||
|
||||
if (value) {
|
||||
*bind_smallint = (int16_t)atoi(value);
|
||||
} else {
|
||||
*bind_smallint = rand_smallint();
|
||||
}
|
||||
*bind_smallint = rand_smallint();
|
||||
bind->buffer_type = TSDB_DATA_TYPE_SMALLINT;
|
||||
bind->buffer_length = sizeof(int16_t);
|
||||
bind->buffer = bind_smallint;
|
||||
|
@ -5462,11 +5438,7 @@ static int32_t prepareStmtBindArrayByType(TAOS_BIND *bind,
|
|||
"TINYINT", strlen("TINYINT"))) {
|
||||
int8_t *bind_tinyint = (int8_t *)*ptr;
|
||||
|
||||
if (value) {
|
||||
*bind_tinyint = (int8_t)atoi(value);
|
||||
} else {
|
||||
*bind_tinyint = rand_tinyint();
|
||||
}
|
||||
*bind_tinyint = rand_tinyint();
|
||||
bind->buffer_type = TSDB_DATA_TYPE_TINYINT;
|
||||
bind->buffer_length = sizeof(int8_t);
|
||||
bind->buffer = bind_tinyint;
|
||||
|
@ -5489,11 +5461,7 @@ static int32_t prepareStmtBindArrayByType(TAOS_BIND *bind,
|
|||
"TIMESTAMP", strlen("TIMESTAMP"))) {
|
||||
int64_t *bind_ts2 = (int64_t *) *ptr;
|
||||
|
||||
if (value) {
|
||||
*bind_ts2 = atoll(value);
|
||||
} else {
|
||||
*bind_ts2 = rand_bigint();
|
||||
}
|
||||
*bind_ts2 = rand_bigint();
|
||||
bind->buffer_type = TSDB_DATA_TYPE_TIMESTAMP;
|
||||
bind->buffer_length = sizeof(int64_t);
|
||||
bind->buffer = bind_ts2;
|
||||
|
@ -5559,13 +5527,12 @@ static int32_t prepareStmtWithoutStb(
|
|||
ptr += bind->buffer_length;
|
||||
|
||||
for (int i = 0; i < g_args.num_of_CPR; i ++) {
|
||||
bind = (TAOS_BIND *)((char *)bindArray
|
||||
+ (sizeof(TAOS_BIND) * (i + 1)));
|
||||
bind = (TAOS_BIND *)((char *)bindArray + (sizeof(TAOS_BIND) * (i + 1)));
|
||||
if ( -1 == prepareStmtBindArrayByType(
|
||||
bind,
|
||||
data_type[i],
|
||||
g_args.len_of_binary,
|
||||
&ptr, NULL)) {
|
||||
&ptr)) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
@ -5584,14 +5551,12 @@ static int32_t prepareStmtWithoutStb(
|
|||
return k;
|
||||
}
|
||||
|
||||
static int32_t prepareStbStmt(
|
||||
SSuperTable *stbInfo,
|
||||
static int32_t prepareStbStmt(SSuperTable *stbInfo,
|
||||
TAOS_STMT *stmt,
|
||||
char *tableName, uint32_t batch,
|
||||
uint64_t insertRows,
|
||||
uint64_t recordFrom,
|
||||
int64_t startTime,
|
||||
int64_t *pSamplePos)
|
||||
int64_t startTime, char *buffer)
|
||||
{
|
||||
int ret = taos_stmt_set_tbname(stmt, tableName);
|
||||
if (ret != 0) {
|
||||
|
@ -5602,24 +5567,16 @@ static int32_t prepareStbStmt(
|
|||
|
||||
char *bindArray = malloc(sizeof(TAOS_BIND) * (stbInfo->columnCount + 1));
|
||||
if (bindArray == NULL) {
|
||||
errorPrint("%s() LN%d, Failed to allocate %d bind params\n",
|
||||
__func__, __LINE__, (stbInfo->columnCount + 1));
|
||||
errorPrint("Failed to allocate %d bind params\n",
|
||||
(stbInfo->columnCount + 1));
|
||||
return -1;
|
||||
}
|
||||
|
||||
bool sourceRand;
|
||||
bool tsRand;
|
||||
if (0 == strncasecmp(stbInfo->dataSource, "rand", strlen("rand"))) {
|
||||
sourceRand = true;
|
||||
tsRand = true;
|
||||
} else {
|
||||
sourceRand = false; // from sample data file
|
||||
}
|
||||
|
||||
char *bindBuffer = malloc(g_args.len_of_binary);
|
||||
if (bindBuffer == NULL) {
|
||||
errorPrint("%s() LN%d, Failed to allocate %d bind buffer\n",
|
||||
__func__, __LINE__, g_args.len_of_binary);
|
||||
free(bindArray);
|
||||
return -1;
|
||||
tsRand = false;
|
||||
}
|
||||
|
||||
uint32_t k;
|
||||
|
@ -5635,7 +5592,7 @@ static int32_t prepareStbStmt(
|
|||
|
||||
bind_ts = (int64_t *)ptr;
|
||||
bind->buffer_type = TSDB_DATA_TYPE_TIMESTAMP;
|
||||
if (sourceRand) {
|
||||
if (tsRand) {
|
||||
*bind_ts = startTime + getTSRandTail(
|
||||
stbInfo->timeStampStep, k,
|
||||
stbInfo->disorderRatio,
|
||||
|
@ -5650,46 +5607,14 @@ static int32_t prepareStbStmt(
|
|||
|
||||
ptr += bind->buffer_length;
|
||||
|
||||
int cursor = 0;
|
||||
for (int i = 0; i < stbInfo->columnCount; i ++) {
|
||||
bind = (TAOS_BIND *)((char *)bindArray + (sizeof(TAOS_BIND) * (i + 1)));
|
||||
|
||||
if (sourceRand) {
|
||||
if ( -1 == prepareStmtBindArrayByType(
|
||||
bind,
|
||||
stbInfo->columns[i].dataType,
|
||||
stbInfo->columns[i].dataLen,
|
||||
&ptr,
|
||||
NULL)) {
|
||||
free(bindArray);
|
||||
free(bindBuffer);
|
||||
return -1;
|
||||
}
|
||||
} else {
|
||||
char *restStr = stbInfo->sampleDataBuf + cursor;
|
||||
int lengthOfRest = strlen(restStr);
|
||||
|
||||
int index = 0;
|
||||
for (index = 0; index < lengthOfRest; index ++) {
|
||||
if (restStr[index] == ',') {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
memset(bindBuffer, 0, g_args.len_of_binary);
|
||||
strncpy(bindBuffer, restStr, index);
|
||||
cursor += index + 1; // skip ',' too
|
||||
|
||||
if ( -1 == prepareStmtBindArrayByType(
|
||||
bind,
|
||||
stbInfo->columns[i].dataType,
|
||||
stbInfo->columns[i].dataLen,
|
||||
&ptr,
|
||||
bindBuffer)) {
|
||||
free(bindArray);
|
||||
free(bindBuffer);
|
||||
return -1;
|
||||
}
|
||||
if ( -1 == prepareStmtBindArrayByType(
|
||||
bind,
|
||||
stbInfo->columns[i].dataType,
|
||||
stbInfo->columns[i].dataLen,
|
||||
&ptr)) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
taos_stmt_bind_param(stmt, (TAOS_BIND *)bindArray);
|
||||
|
@ -5698,16 +5623,11 @@ static int32_t prepareStbStmt(
|
|||
|
||||
k++;
|
||||
recordFrom ++;
|
||||
|
||||
if (!sourceRand) {
|
||||
(*pSamplePos) ++;
|
||||
}
|
||||
if (recordFrom >= insertRows) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
free(bindBuffer);
|
||||
free(bindArray);
|
||||
return k;
|
||||
}
|
||||
|
@ -5900,14 +5820,13 @@ static void* syncWriteInterlace(threadInfo *pThreadInfo) {
|
|||
if (superTblInfo) {
|
||||
if (superTblInfo->iface == STMT_IFACE) {
|
||||
#if STMT_IFACE_ENABLED == 1
|
||||
generated = prepareStbStmt(
|
||||
superTblInfo,
|
||||
generated = prepareStbStmt(superTblInfo,
|
||||
pThreadInfo->stmt,
|
||||
tableName,
|
||||
batchPerTbl,
|
||||
insertRows, i,
|
||||
startTime,
|
||||
&(pThreadInfo->samplePos));
|
||||
pThreadInfo->buffer);
|
||||
#else
|
||||
generated = -1;
|
||||
#endif
|
||||
|
@ -6132,8 +6051,7 @@ static void* syncWriteProgressive(threadInfo *pThreadInfo) {
|
|||
pThreadInfo->stmt,
|
||||
tableName,
|
||||
g_args.num_of_RPR,
|
||||
insertRows, i, start_time,
|
||||
&(pThreadInfo->samplePos));
|
||||
insertRows, i, start_time, pstr);
|
||||
#else
|
||||
generated = -1;
|
||||
#endif
|
||||
|
|
|
@ -226,15 +226,16 @@ static struct argp_option options[] = {
|
|||
{"schemaonly", 's', 0, 0, "Only dump schema.", 2},
|
||||
{"without-property", 'N', 0, 0, "Dump schema without properties.", 2},
|
||||
{"avro", 'V', 0, 0, "Dump apache avro format data file. By default, dump sql command sequence.", 2},
|
||||
{"start-time", 'S', "START_TIME", 0, "Start time to dump. Either Epoch or ISO8601/RFC3339 format is acceptable. Epoch precision millisecond. ISO8601 format example: 2017-10-01T18:00:00.000+0800 or 2017-10-0100:00:00.000+0800 or '2017-10-01 00:00:00.000+0800'", 3},
|
||||
{"end-time", 'E', "END_TIME", 0, "End time to dump. Either Epoch or ISO8601/RFC3339 format is acceptable. Epoch precision millisecond. ISO8601 format example: 2017-10-01T18:00:00.000+0800 or 2017-10-0100:00:00.000+0800 or '2017-10-01 00:00:00.000+0800'", 3},
|
||||
{"start-time", 'S', "START_TIME", 0, "Start time to dump. Either epoch or ISO8601/RFC3339 format is acceptable. ISO8601 format example: 2017-10-01T18:00:00.000+0800 or 2017-10-0100:00:00.000+0800 or '2017-10-01 00:00:00.000+0800'", 4},
|
||||
{"end-time", 'E', "END_TIME", 0, "End time to dump. Either epoch or ISO8601/RFC3339 format is acceptable. ISO8601 format example: 2017-10-01T18:00:00.000+0800 or 2017-10-0100:00:00.000+0800 or '2017-10-01 00:00:00.000+0800'", 5},
|
||||
{"precision", 'C', "PRECISION", 0, "Epoch precision. Valid value is one of ms, us, and ns. Default is ms.", 6},
|
||||
{"data-batch", 'B', "DATA_BATCH", 0, "Number of data point per insert statement. Max value is 32766. Default is 1.", 3},
|
||||
{"max-sql-len", 'L', "SQL_LEN", 0, "Max length of one sql. Default is 65480.", 3},
|
||||
{"table-batch", 't', "TABLE_BATCH", 0, "Number of table dumpout into one output file. Default is 1.", 3},
|
||||
{"thread_num", 'T', "THREAD_NUM", 0, "Number of thread for dump in file. Default is 5.", 3},
|
||||
{"debug", 'g', 0, 0, "Print debug info.", 4},
|
||||
{"verbose", 'b', 0, 0, "Print verbose debug info.", 5},
|
||||
{"performanceprint", 'm', 0, 0, "Print performance debug info.", 5},
|
||||
{"debug", 'g', 0, 0, "Print debug info.", 8},
|
||||
{"verbose", 'b', 0, 0, "Print verbose debug info.", 9},
|
||||
{"performanceprint", 'm', 0, 0, "Print performance debug info.", 10},
|
||||
{0}
|
||||
};
|
||||
|
||||
|
@ -262,6 +263,7 @@ typedef struct arguments {
|
|||
bool avro;
|
||||
int64_t start_time;
|
||||
int64_t end_time;
|
||||
char precision[8];
|
||||
int32_t data_batch;
|
||||
int32_t max_sql_len;
|
||||
int32_t table_batch; // num of table which will be dump into one output file.
|
||||
|
@ -329,8 +331,9 @@ struct arguments g_args = {
|
|||
false, // schemeonly
|
||||
true, // with_property
|
||||
false, // avro format
|
||||
0, // start_time
|
||||
-INT64_MAX, // start_time
|
||||
INT64_MAX, // end_time
|
||||
"ms", // precision
|
||||
1, // data_batch
|
||||
TSDB_MAX_SQL_LEN, // max_sql_len
|
||||
1, // table_batch
|
||||
|
@ -508,41 +511,84 @@ static int queryDbImpl(TAOS *taos, char *command) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void parse_args(int argc, char *argv[], SArguments *arguments) {
|
||||
static void parse_precision_first(
|
||||
int argc, char *argv[], SArguments *arguments) {
|
||||
for (int i = 1; i < argc; i++) {
|
||||
if ((strcmp(argv[i], "-S") == 0)
|
||||
|| (strcmp(argv[i], "-E") == 0)) {
|
||||
if (argv[i+1]) {
|
||||
char *tmp = strdup(argv[++i]);
|
||||
|
||||
if (tmp) {
|
||||
int64_t tmpEpoch;
|
||||
if (strchr(tmp, ':') && strchr(tmp, '-')) {
|
||||
if (TSDB_CODE_SUCCESS != taosParseTime(
|
||||
tmp, &tmpEpoch, strlen(tmp), TSDB_TIME_PRECISION_MILLI, 0)) {
|
||||
errorPrint("Input %s, end time error!\n", tmp);
|
||||
free(tmp);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
tmpEpoch = atoll(tmp);
|
||||
}
|
||||
|
||||
sprintf(argv[i], "%"PRId64"", tmpEpoch);
|
||||
debugPrint("%s() LN%d, tmp is: %s, argv[%d]: %s\n",
|
||||
__func__, __LINE__, tmp, i, argv[i]);
|
||||
|
||||
free(tmp);
|
||||
} else {
|
||||
errorPrint("%s() LN%d, strdup() cannot allocate memory\n", __func__, __LINE__);
|
||||
exit(-1);
|
||||
}
|
||||
} else {
|
||||
if (strcmp(argv[i], "-C") == 0) {
|
||||
if (NULL == argv[i+1]) {
|
||||
errorPrint("%s need a valid value following!\n", argv[i]);
|
||||
exit(-1);
|
||||
}
|
||||
} else if (strcmp(argv[i], "-g") == 0) {
|
||||
g_args.debug_print = true;
|
||||
char *tmp = strdup(argv[i+1]);
|
||||
if (tmp == NULL) {
|
||||
errorPrint("%s() LN%d, strdup() cannot allocate memory\n",
|
||||
__func__, __LINE__);
|
||||
exit(-1);
|
||||
}
|
||||
if ((0 != strncasecmp(tmp, "ms", strlen("ms")))
|
||||
&& (0 != strncasecmp(tmp, "us", strlen("us")))
|
||||
&& (0 != strncasecmp(tmp, "ns", strlen("ns")))) {
|
||||
//
|
||||
errorPrint("input precision: %s is invalid value\n", tmp);
|
||||
free(tmp);
|
||||
exit(-1);
|
||||
}
|
||||
strncpy(g_args.precision, tmp, strlen(tmp));
|
||||
free(tmp);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void parse_timestamp(
|
||||
int argc, char *argv[], SArguments *arguments) {
|
||||
for (int i = 1; i < argc; i++) {
|
||||
if ((strcmp(argv[i], "-S") == 0)
|
||||
|| (strcmp(argv[i], "-E") == 0)) {
|
||||
if (NULL == argv[i+1]) {
|
||||
errorPrint("%s need a valid value following!\n", argv[i]);
|
||||
exit(-1);
|
||||
}
|
||||
char *tmp = strdup(argv[i+1]);
|
||||
if (NULL == tmp) {
|
||||
errorPrint("%s() LN%d, strdup() cannot allocate memory\n",
|
||||
__func__, __LINE__);
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
int64_t tmpEpoch;
|
||||
if (strchr(tmp, ':') && strchr(tmp, '-')) {
|
||||
int32_t timePrec;
|
||||
if (0 == strncasecmp(arguments->precision,
|
||||
"ms", strlen("ms"))) {
|
||||
timePrec = TSDB_TIME_PRECISION_MILLI;
|
||||
} else if (0 == strncasecmp(arguments->precision,
|
||||
"us", strlen("us"))) {
|
||||
timePrec = TSDB_TIME_PRECISION_MICRO;
|
||||
} else if (0 == strncasecmp(arguments->precision,
|
||||
"ns", strlen("ns"))) {
|
||||
timePrec = TSDB_TIME_PRECISION_NANO;
|
||||
} else {
|
||||
errorPrint("Invalid time precision: %s",
|
||||
arguments->precision);
|
||||
free(tmp);
|
||||
return;
|
||||
}
|
||||
|
||||
if (TSDB_CODE_SUCCESS != taosParseTime(
|
||||
tmp, &tmpEpoch, strlen(tmp),
|
||||
timePrec, 0)) {
|
||||
errorPrint("Input %s, end time error!\n", tmp);
|
||||
free(tmp);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
tmpEpoch = atoll(tmp);
|
||||
}
|
||||
|
||||
sprintf(argv[i], "%"PRId64"", tmpEpoch);
|
||||
debugPrint("%s() LN%d, tmp is: %s, argv[%d]: %s\n",
|
||||
__func__, __LINE__, tmp, i, argv[i]);
|
||||
free(tmp);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -552,8 +598,10 @@ int main(int argc, char *argv[]) {
|
|||
int ret = 0;
|
||||
/* Parse our arguments; every option seen by parse_opt will be
|
||||
reflected in arguments. */
|
||||
if (argc > 2)
|
||||
parse_args(argc, argv, &g_args);
|
||||
if (argc > 2) {
|
||||
parse_precision_first(argc, argv, &g_args);
|
||||
parse_timestamp(argc, argv, &g_args);
|
||||
}
|
||||
|
||||
argp_parse(&argp, argc, argv, 0, 0, &g_args);
|
||||
|
||||
|
@ -584,6 +632,7 @@ int main(int argc, char *argv[]) {
|
|||
printf("avro format: %s\n", g_args.avro?"true":"false");
|
||||
printf("start_time: %" PRId64 "\n", g_args.start_time);
|
||||
printf("end_time: %" PRId64 "\n", g_args.end_time);
|
||||
printf("precision: %s\n", g_args.precision);
|
||||
printf("data_batch: %d\n", g_args.data_batch);
|
||||
printf("max_sql_len: %d\n", g_args.max_sql_len);
|
||||
printf("table_batch: %d\n", g_args.table_batch);
|
||||
|
@ -634,6 +683,7 @@ int main(int argc, char *argv[]) {
|
|||
fprintf(g_fpOfResult, "avro format: %s\n", g_args.avro?"true":"false");
|
||||
fprintf(g_fpOfResult, "start_time: %" PRId64 "\n", g_args.start_time);
|
||||
fprintf(g_fpOfResult, "end_time: %" PRId64 "\n", g_args.end_time);
|
||||
fprintf(g_fpOfResult, "precision: %s\n", g_args.precision);
|
||||
fprintf(g_fpOfResult, "data_batch: %d\n", g_args.data_batch);
|
||||
fprintf(g_fpOfResult, "max_sql_len: %d\n", g_args.max_sql_len);
|
||||
fprintf(g_fpOfResult, "table_batch: %d\n", g_args.table_batch);
|
||||
|
|
|
@ -1036,6 +1036,20 @@ static int32_t mnodeCreateSuperTableCb(SMnodeMsg *pMsg, int32_t code) {
|
|||
return code;
|
||||
}
|
||||
|
||||
static uint64_t mnodeCreateSuperTableUid() {
|
||||
int64_t us = taosGetTimestampUs();
|
||||
uint64_t x = (us & ((((uint64_t)1)<<40) - 1));
|
||||
x = x << 24;
|
||||
|
||||
return x + ((sdbGetVersion() & ((1ul << 16) - 1ul)) << 8) + (taosRand() & ((1ul << 8) - 1ul));
|
||||
}
|
||||
|
||||
static uint64_t mnodeCreateTableUid(int32_t vgId, int32_t tid) {
|
||||
uint64_t uid = (((uint64_t)vgId) << 48) + ((((uint64_t)tid) & ((1ul << 24) - 1ul)) << 24) +
|
||||
((sdbGetVersion() & ((1ul << 16) - 1ul)) << 8) + (taosRand() & ((1ul << 8) - 1ul));
|
||||
return uid;
|
||||
}
|
||||
|
||||
static int32_t mnodeProcessCreateSuperTableMsg(SMnodeMsg *pMsg) {
|
||||
if (pMsg == NULL) return TSDB_CODE_MND_APP_ERROR;
|
||||
|
||||
|
@ -1065,15 +1079,10 @@ static int32_t mnodeProcessCreateSuperTableMsg(SMnodeMsg *pMsg) {
|
|||
return TSDB_CODE_MND_OUT_OF_MEMORY;
|
||||
}
|
||||
|
||||
int64_t us = taosGetTimestampUs();
|
||||
pStable->info.tableId = strdup(pCreate->tableName);
|
||||
pStable->info.type = TSDB_SUPER_TABLE;
|
||||
pStable->createdTime = taosGetTimestampMs();
|
||||
|
||||
uint64_t x = (us & ((((uint64_t)1)<<40) - 1)); // todo refactor
|
||||
x = x << 24;
|
||||
|
||||
pStable->uid = x + ((sdbGetVersion() & ((1ul << 16) - 1ul)) << 8) + (taosRand() & ((1ul << 8) - 1ul));
|
||||
pStable->uid = mnodeCreateSuperTableUid();
|
||||
pStable->sversion = 0;
|
||||
pStable->tversion = 0;
|
||||
pStable->numOfColumns = numOfColumns;
|
||||
|
@ -2076,20 +2085,13 @@ static int32_t mnodeDoCreateChildTable(SMnodeMsg *pMsg, int32_t tid) {
|
|||
}
|
||||
|
||||
pTable->suid = pMsg->pSTable->uid;
|
||||
pTable->uid = (((uint64_t)pTable->vgId) << 48) + ((((uint64_t)pTable->tid) & ((1ul << 24) - 1ul)) << 24) +
|
||||
((sdbGetVersion() & ((1ul << 16) - 1ul)) << 8) + (taosRand() & ((1ul << 8) - 1ul));
|
||||
pTable->uid = mnodeCreateTableUid(pTable->vgId, pTable->tid);
|
||||
pTable->superTable = pMsg->pSTable;
|
||||
} else {
|
||||
if (pTable->info.type == TSDB_SUPER_TABLE) {
|
||||
uint64_t us = (uint64_t) taosGetTimestampUs();
|
||||
|
||||
uint64_t x = (us & ((((uint64_t)1)<<40) - 1));
|
||||
x = x << 24;
|
||||
|
||||
pTable->uid = x + ((sdbGetVersion() & ((1ul << 16) - 1ul)) << 8) + (taosRand() & ((1ul << 8) - 1ul));
|
||||
pTable->uid = mnodeCreateSuperTableUid();
|
||||
} else {
|
||||
pTable->uid = (((uint64_t)pTable->vgId) << 48) + ((((uint64_t)pTable->tid) & ((1ul << 24) - 1ul)) << 24) +
|
||||
((sdbGetVersion() & ((1ul << 16) - 1ul)) << 8) + (taosRand() & ((1ul << 8) - 1ul));
|
||||
pTable->uid = mnodeCreateTableUid(pTable->vgId, pTable->tid);
|
||||
}
|
||||
|
||||
pTable->sversion = 0;
|
||||
|
|
|
@ -248,18 +248,20 @@ typedef struct tSqlExpr {
|
|||
uint16_t type; // sql node type
|
||||
uint32_t tokenId; // TK_LE: less than(binary expr)
|
||||
|
||||
// the whole string of the function(col, param), while the function name is kept in token
|
||||
SStrToken operand;
|
||||
int32_t functionId; // function id
|
||||
// the whole string of the function(col, param), while the function name is kept in exprToken
|
||||
struct {
|
||||
SStrToken operand;
|
||||
struct SArray *paramList; // function parameters list
|
||||
} Expr;
|
||||
|
||||
SStrToken colInfo; // table column info
|
||||
uint32_t functionId; // function id, todo remove it
|
||||
SStrToken columnName; // table column info
|
||||
tVariant value; // the use input value
|
||||
SStrToken token; // original sql expr string
|
||||
uint32_t flags;
|
||||
SStrToken exprToken; // original sql expr string
|
||||
uint32_t flags; // todo remove it
|
||||
|
||||
struct tSqlExpr *pLeft; // left child
|
||||
struct tSqlExpr *pRight; // right child
|
||||
struct SArray *pParam; // function parameters list
|
||||
} tSqlExpr;
|
||||
|
||||
// used in select clause. select <SArray> from xxx
|
||||
|
|
|
@ -688,7 +688,7 @@ where_opt(A) ::= WHERE expr(X). {A = X;}
|
|||
%type expr {tSqlExpr*}
|
||||
%destructor expr {tSqlExprDestroy($$);}
|
||||
|
||||
expr(A) ::= LP(X) expr(Y) RP(Z). {A = Y; A->token.z = X.z; A->token.n = (Z.z - X.z + 1);}
|
||||
expr(A) ::= LP(X) expr(Y) RP(Z). {A = Y; A->exprToken.z = X.z; A->exprToken.n = (Z.z - X.z + 1);}
|
||||
|
||||
expr(A) ::= ID(X). { A = tSqlExprCreateIdValue(&X, TK_ID);}
|
||||
expr(A) ::= ID(X) DOT ID(Y). { X.n += (1+Y.n); A = tSqlExprCreateIdValue(&X, TK_ID);}
|
||||
|
|
|
@ -127,7 +127,8 @@ static SQueryNode* doAddTableColumnNode(SQueryInfo* pQueryInfo, STableMetaInfo*
|
|||
SColumn* pCol = taosArrayGetP(tableCols, i);
|
||||
|
||||
SColumnIndex index = {.tableIndex = 0, .columnIndex = pCol->columnIndex};
|
||||
SExprInfo* p = tscExprCreate(pQueryInfo, TSDB_FUNC_PRJ, &index, pCol->info.type, pCol->info.bytes,
|
||||
STableMetaInfo* pTableMetaInfo1 = tscGetMetaInfo(pQueryInfo, index.tableIndex);
|
||||
SExprInfo* p = tscExprCreate(pTableMetaInfo1, TSDB_FUNC_PRJ, &index, pCol->info.type, pCol->info.bytes,
|
||||
pCol->info.colId, 0, TSDB_COL_NORMAL);
|
||||
strncpy(p->base.aliasName, pSchema[pCol->columnIndex].name, tListLen(p->base.aliasName));
|
||||
|
||||
|
|
|
@ -138,7 +138,7 @@ tSqlExpr *tSqlExprCreateIdValue(SStrToken *pToken, int32_t optrType) {
|
|||
tSqlExpr *pSqlExpr = calloc(1, sizeof(tSqlExpr));
|
||||
|
||||
if (pToken != NULL) {
|
||||
pSqlExpr->token = *pToken;
|
||||
pSqlExpr->exprToken = *pToken;
|
||||
}
|
||||
|
||||
if (optrType == TK_NULL) {
|
||||
|
@ -175,7 +175,7 @@ tSqlExpr *tSqlExprCreateIdValue(SStrToken *pToken, int32_t optrType) {
|
|||
// Here it must be the column name (tk_id) if it is not a number or string.
|
||||
assert(optrType == TK_ID || optrType == TK_ALL);
|
||||
if (pToken != NULL) {
|
||||
pSqlExpr->colInfo = *pToken;
|
||||
pSqlExpr->columnName = *pToken;
|
||||
}
|
||||
|
||||
pSqlExpr->tokenId = optrType;
|
||||
|
@ -194,17 +194,17 @@ tSqlExpr *tSqlExprCreateFunction(SArray *pParam, SStrToken *pFuncToken, SStrToke
|
|||
return NULL;
|
||||
}
|
||||
|
||||
tSqlExpr *pExpr = calloc(1, sizeof(tSqlExpr));
|
||||
pExpr->tokenId = optType;
|
||||
pExpr->type = SQL_NODE_SQLFUNCTION;
|
||||
pExpr->pParam = pParam;
|
||||
tSqlExpr *pExpr = calloc(1, sizeof(tSqlExpr));
|
||||
pExpr->tokenId = optType;
|
||||
pExpr->type = SQL_NODE_SQLFUNCTION;
|
||||
pExpr->Expr.paramList = pParam;
|
||||
|
||||
int32_t len = (int32_t)((endToken->z + endToken->n) - pFuncToken->z);
|
||||
pExpr->operand = (*pFuncToken);
|
||||
pExpr->Expr.operand = (*pFuncToken);
|
||||
|
||||
pExpr->token.n = len;
|
||||
pExpr->token.z = pFuncToken->z;
|
||||
pExpr->token.type = pFuncToken->type;
|
||||
pExpr->exprToken.n = len;
|
||||
pExpr->exprToken.z = pFuncToken->z;
|
||||
pExpr->exprToken.type = pFuncToken->type;
|
||||
|
||||
return pExpr;
|
||||
}
|
||||
|
@ -218,16 +218,16 @@ tSqlExpr *tSqlExprCreate(tSqlExpr *pLeft, tSqlExpr *pRight, int32_t optrType) {
|
|||
|
||||
pExpr->type = SQL_NODE_EXPR;
|
||||
if (pLeft != NULL && pRight != NULL && (optrType != TK_IN)) {
|
||||
char* endPos = pRight->token.z + pRight->token.n;
|
||||
pExpr->token.z = pLeft->token.z;
|
||||
pExpr->token.n = (uint32_t)(endPos - pExpr->token.z);
|
||||
pExpr->token.type = pLeft->token.type;
|
||||
char* endPos = pRight->exprToken.z + pRight->exprToken.n;
|
||||
pExpr->exprToken.z = pLeft->exprToken.z;
|
||||
pExpr->exprToken.n = (uint32_t)(endPos - pExpr->exprToken.z);
|
||||
pExpr->exprToken.type = pLeft->exprToken.type;
|
||||
}
|
||||
|
||||
if ((pLeft != NULL && pRight != NULL) &&
|
||||
(optrType == TK_PLUS || optrType == TK_MINUS || optrType == TK_STAR || optrType == TK_DIVIDE || optrType == TK_REM)) {
|
||||
/*
|
||||
* if a token is noted as the TK_TIMESTAMP, the time precision is microsecond
|
||||
* if a exprToken is noted as the TK_TIMESTAMP, the time precision is microsecond
|
||||
* Otherwise, the time precision is adaptive, determined by the time precision from databases.
|
||||
*/
|
||||
if ((pLeft->tokenId == TK_INTEGER && pRight->tokenId == TK_INTEGER) ||
|
||||
|
@ -318,7 +318,7 @@ tSqlExpr *tSqlExprCreate(tSqlExpr *pLeft, tSqlExpr *pRight, int32_t optrType) {
|
|||
|
||||
tSqlExpr *pRSub = calloc(1, sizeof(tSqlExpr));
|
||||
pRSub->tokenId = TK_SET; // TODO refactor .....
|
||||
pRSub->pParam = (SArray *)pRight;
|
||||
pRSub->Expr.paramList = (SArray *)pRight;
|
||||
|
||||
pExpr->pRight = pRSub;
|
||||
} else {
|
||||
|
@ -360,8 +360,8 @@ int32_t tSqlExprCompare(tSqlExpr *left, tSqlExpr *right) {
|
|||
|| (left->pLeft == NULL && right->pLeft)
|
||||
|| (left->pRight && right->pRight == NULL)
|
||||
|| (left->pRight == NULL && right->pRight)
|
||||
|| (left->pParam && right->pParam == NULL)
|
||||
|| (left->pParam == NULL && right->pParam)) {
|
||||
|| (left->Expr.paramList && right->Expr.paramList == NULL)
|
||||
|| (left->Expr.paramList == NULL && right->Expr.paramList)) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -369,20 +369,20 @@ int32_t tSqlExprCompare(tSqlExpr *left, tSqlExpr *right) {
|
|||
return 1;
|
||||
}
|
||||
|
||||
if (tStrTokenCompare(&left->colInfo, &right->colInfo)) {
|
||||
if (tStrTokenCompare(&left->columnName, &right->columnName)) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (right->pParam && left->pParam) {
|
||||
size_t size = taosArrayGetSize(right->pParam);
|
||||
if (left->pParam && taosArrayGetSize(left->pParam) != size) {
|
||||
if (right->Expr.paramList && left->Expr.paramList) {
|
||||
size_t size = taosArrayGetSize(right->Expr.paramList);
|
||||
if (left->Expr.paramList && taosArrayGetSize(left->Expr.paramList) != size) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
for (int32_t i = 0; i < size; i++) {
|
||||
tSqlExprItem* pLeftElem = taosArrayGet(left->pParam, i);
|
||||
tSqlExprItem* pLeftElem = taosArrayGet(left->Expr.paramList, i);
|
||||
tSqlExpr* pSubLeft = pLeftElem->pNode;
|
||||
tSqlExprItem* pRightElem = taosArrayGet(right->pParam, i);
|
||||
tSqlExprItem* pRightElem = taosArrayGet(right->Expr.paramList, i);
|
||||
tSqlExpr* pSubRight = pRightElem->pNode;
|
||||
|
||||
if (tSqlExprCompare(pSubLeft, pSubRight)) {
|
||||
|
@ -415,8 +415,8 @@ tSqlExpr *tSqlExprClone(tSqlExpr *pSrc) {
|
|||
pExpr->pRight = tSqlExprClone(pSrc->pRight);
|
||||
}
|
||||
|
||||
//we don't clone pParam now because clone is only used for between/and
|
||||
assert(pSrc->pParam == NULL);
|
||||
//we don't clone paramList now because clone is only used for between/and
|
||||
assert(pSrc->Expr.paramList == NULL);
|
||||
return pExpr;
|
||||
}
|
||||
|
||||
|
@ -474,7 +474,7 @@ static void doDestroySqlExprNode(tSqlExpr *pExpr) {
|
|||
tVariantDestroy(&pExpr->value);
|
||||
}
|
||||
|
||||
tSqlExprListDestroy(pExpr->pParam);
|
||||
tSqlExprListDestroy(pExpr->Expr.paramList);
|
||||
free(pExpr);
|
||||
}
|
||||
|
||||
|
|
|
@ -2967,9 +2967,9 @@ static void yy_reduce(
|
|||
case 226: /* slimit_opt ::= SLIMIT signed COMMA signed */
|
||||
{yymsp[-3].minor.yy126.limit = yymsp[0].minor.yy501; yymsp[-3].minor.yy126.offset = yymsp[-2].minor.yy501;}
|
||||
break;
|
||||
case 229: /* expr ::= LP expr RP */
|
||||
{yylhsminor.yy370 = yymsp[-1].minor.yy370; yylhsminor.yy370->token.z = yymsp[-2].minor.yy0.z; yylhsminor.yy370->token.n = (yymsp[0].minor.yy0.z - yymsp[-2].minor.yy0.z + 1);}
|
||||
yymsp[-2].minor.yy370 = yylhsminor.yy370;
|
||||
case 223: /* expr ::= LP expr RP */
|
||||
{yylhsminor.yy166 = yymsp[-1].minor.yy166; yylhsminor.yy166->exprToken.z = yymsp[-2].minor.yy0.z; yylhsminor.yy166->exprToken.n = (yymsp[0].minor.yy0.z - yymsp[-2].minor.yy0.z + 1);}
|
||||
yymsp[-2].minor.yy166 = yylhsminor.yy166;
|
||||
break;
|
||||
case 230: /* expr ::= ID */
|
||||
{ yylhsminor.yy370 = tSqlExprCreateIdValue(&yymsp[0].minor.yy0, TK_ID);}
|
||||
|
|
|
@ -86,7 +86,7 @@ char tsLogDir[TSDB_FILENAME_LEN] = "/var/log/power";
|
|||
#elif (_TD_TQ_ == true)
|
||||
char tsLogDir[TSDB_FILENAME_LEN] = "/var/log/tq";
|
||||
#else
|
||||
char tsLogDir[TSDB_FILENAME_LEN] = "/var/log/taos";
|
||||
char tsLogDir[PATH_MAX] = "/var/log/taos";
|
||||
#endif
|
||||
|
||||
static SLogObj tsLogObj = { .fileNum = 1 };
|
||||
|
|
|
@ -49,8 +49,8 @@ class TDTestCase:
|
|||
tdSql.checkRows(10)
|
||||
|
||||
# bug: https://jira.taosdata.com:18080/browse/TD-5043
|
||||
# tdSql.query("select * from (select * from st order by ts desc limit 10 offset 1000)")
|
||||
# tdSql.checkRows(0)
|
||||
tdSql.query("select * from (select * from st order by ts desc limit 10 offset 1000)")
|
||||
tdSql.checkRows(0)
|
||||
|
||||
tdSql.query("select avg(value), sum(value) from st group by tbname")
|
||||
tdSql.checkRows(self.tables)
|
||||
|
|
|
@ -1835,5 +1835,8 @@ if $data04 != 1 then
|
|||
endi
|
||||
|
||||
sql_error select top(f1,2) from tb1 group by f1 having count(f1) > 0;
|
||||
sql_error select count(*) from tb1 group by f1 having last(*) > 0;
|
||||
|
||||
print bug for select count(*) k from tb1 group by f1 having k > 0;
|
||||
|
||||
system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
||||
|
|
Loading…
Reference in New Issue