Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Rattenking
TDengine
提交
2d6ad4d8
T
TDengine
项目概览
Rattenking
/
TDengine
与 Fork 源项目一致
Fork自
taosdata / TDengine
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
2d6ad4d8
编写于
7月 16, 2021
作者:
H
Haojun Liao
提交者:
GitHub
7月 16, 2021
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #6825 from taosdata/fix/TD-5134
[TD-5134]<fix> fix runtime error
上级
17ba264b
361f81e4
变更
8
隐藏空白更改
内联
并排
Showing
8 changed file
with
149 addition
and
32 deletion
+149
-32
src/client/src/tscSQLParser.c
src/client/src/tscSQLParser.c
+30
-12
src/client/src/tscServer.c
src/client/src/tscServer.c
+5
-0
src/client/src/tscSubquery.c
src/client/src/tscSubquery.c
+16
-7
src/client/src/tscUtil.c
src/client/src/tscUtil.c
+10
-4
src/common/src/tarithoperator.c
src/common/src/tarithoperator.c
+70
-1
src/query/inc/qTableMeta.h
src/query/inc/qTableMeta.h
+4
-1
src/query/src/qExecutor.c
src/query/src/qExecutor.c
+12
-5
tests/script/general/parser/col_arithmetic_query.sim
tests/script/general/parser/col_arithmetic_query.sim
+2
-2
未找到文件。
src/client/src/tscSQLParser.c
浏览文件 @
2d6ad4d8
...
...
@@ -2795,8 +2795,7 @@ static bool isTablenameToken(SStrToken* token) {
SStrToken
tableToken
=
{
0
};
extractTableNameFromToken
(
&
tmpToken
,
&
tableToken
);
return
(
strncasecmp
(
TSQL_TBNAME_L
,
tmpToken
.
z
,
tmpToken
.
n
)
==
0
&&
tmpToken
.
n
==
strlen
(
TSQL_TBNAME_L
));
return
(
tmpToken
.
n
==
strlen
(
TSQL_TBNAME_L
)
&&
strncasecmp
(
TSQL_TBNAME_L
,
tmpToken
.
z
,
tmpToken
.
n
)
==
0
);
}
static
int16_t
doGetColumnIndex
(
SQueryInfo
*
pQueryInfo
,
int32_t
index
,
SStrToken
*
pToken
)
{
...
...
@@ -2827,8 +2826,11 @@ int32_t doGetColumnIndexByName(SStrToken* pToken, SQueryInfo* pQueryInfo, SColum
if
(
isTablenameToken
(
pToken
))
{
pIndex
->
columnIndex
=
TSDB_TBNAME_COLUMN_INDEX
;
}
else
if
(
strncasecmp
(
pToken
->
z
,
DEFAULT_PRIMARY_TIMESTAMP_COL_NAME
,
pToken
->
n
)
==
0
)
{
pIndex
->
columnIndex
=
PRIMARYKEY_TIMESTAMP_COL_INDEX
;
}
else
if
(
strlen
(
DEFAULT_PRIMARY_TIMESTAMP_COL_NAME
)
==
pToken
->
n
&&
strncasecmp
(
pToken
->
z
,
DEFAULT_PRIMARY_TIMESTAMP_COL_NAME
,
pToken
->
n
)
==
0
)
{
pIndex
->
columnIndex
=
PRIMARYKEY_TIMESTAMP_COL_INDEX
;
// just make runtime happy, need fix java test case InsertSpecialCharacterJniTest
}
else
if
(
pToken
->
n
==
0
)
{
pIndex
->
columnIndex
=
PRIMARYKEY_TIMESTAMP_COL_INDEX
;
// just make runtime happy, need fix java test case InsertSpecialCharacterJniTest
}
else
{
// not specify the table name, try to locate the table index by column name
if
(
pIndex
->
tableIndex
==
COLUMN_INDEX_INITIAL_VAL
)
{
...
...
@@ -3393,7 +3395,14 @@ static int32_t doExtractColumnFilterInfo(SSqlCmd* pCmd, SQueryInfo* pQueryInfo,
if
(
IS_NUMERIC_TYPE
(
pRight
->
value
.
nType
))
{
bufLen
=
60
;
}
else
{
bufLen
=
pRight
->
value
.
nLen
+
1
;
/*
* make memory sanitizer happy;
*/
if
(
pRight
->
value
.
nLen
==
0
)
{
bufLen
=
pRight
->
value
.
nLen
+
2
;
}
else
{
bufLen
=
pRight
->
value
.
nLen
+
1
;
}
}
if
(
pExpr
->
tokenId
==
TK_LE
||
pExpr
->
tokenId
==
TK_LT
)
{
...
...
@@ -4832,7 +4841,7 @@ int32_t validateWhereNode(SQueryInfo* pQueryInfo, tSqlExpr** pExpr, SSqlObj* pSq
int32_t
type
=
0
;
if
((
ret
=
getQueryCondExpr
(
&
pSql
->
cmd
,
pQueryInfo
,
pExpr
,
&
condExpr
,
&
type
,
(
*
pExpr
)
->
tokenId
))
!=
TSDB_CODE_SUCCESS
)
{
return
ret
;
goto
PARSE_WHERE_EXIT
;
}
tSqlExprCompact
(
pExpr
);
...
...
@@ -4842,7 +4851,7 @@ int32_t validateWhereNode(SQueryInfo* pQueryInfo, tSqlExpr** pExpr, SSqlObj* pSq
// 1. check if it is a join query
if
((
ret
=
validateJoinExpr
(
&
pSql
->
cmd
,
pQueryInfo
,
&
condExpr
))
!=
TSDB_CODE_SUCCESS
)
{
return
ret
;
goto
PARSE_WHERE_EXIT
;
}
// 2. get the query time range
...
...
@@ -5043,7 +5052,8 @@ int32_t validateFillNode(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SSqlNode* pSqlNo
size_t
numOfFields
=
tscNumOfFields
(
pQueryInfo
);
if
(
pQueryInfo
->
fillVal
==
NULL
)
{
pQueryInfo
->
fillVal
=
calloc
(
numOfFields
,
sizeof
(
int64_t
));
pQueryInfo
->
fillVal
=
calloc
(
numOfFields
,
sizeof
(
int64_t
));
pQueryInfo
->
numOfFillVal
=
(
int32_t
)
numOfFields
;
if
(
pQueryInfo
->
fillVal
==
NULL
)
{
return
TSDB_CODE_TSC_OUT_OF_MEMORY
;
}
...
...
@@ -7725,11 +7735,18 @@ int32_t loadAllTableMeta(SSqlObj* pSql, struct SSqlInfo* pInfo) {
taosArrayPush
(
pVgroupList
,
&
t
);
}
STableMeta
*
pMeta
=
tscTableMetaDup
(
pTableMeta
);
STableMetaVgroupInfo
p
=
{
.
pTableMeta
=
pMeta
};
//
STableMeta* pMeta = tscTableMetaDup(pTableMeta);
//
STableMetaVgroupInfo p = { .pTableMeta = pMeta };
//const char* px = tNameGetTableName(pname);
//taosHashPut(pCmd->pTableMetaMap, px, strlen(px), &p, sizeof(STableMetaVgroupInfo));
// avoid mem leak, may should update pTableMeta
const
char
*
px
=
tNameGetTableName
(
pname
);
taosHashPut
(
pCmd
->
pTableMetaMap
,
px
,
strlen
(
px
),
&
p
,
sizeof
(
STableMetaVgroupInfo
));
if
(
taosHashGet
(
pCmd
->
pTableMetaMap
,
px
,
strlen
(
px
))
==
NULL
)
{
STableMeta
*
pMeta
=
tscTableMetaDup
(
pTableMeta
);
STableMetaVgroupInfo
p
=
{
.
pTableMeta
=
pMeta
,
.
pVgroupInfo
=
NULL
};
taosHashPut
(
pCmd
->
pTableMetaMap
,
px
,
strlen
(
px
),
&
p
,
sizeof
(
STableMetaVgroupInfo
));
}
}
else
{
// add to the retrieve table meta array list.
char
*
t
=
strdup
(
name
);
taosArrayPush
(
plist
,
&
t
);
...
...
@@ -8185,7 +8202,7 @@ int32_t validateSqlNode(SSqlObj* pSql, SSqlNode* pSqlNode, SQueryInfo* pQueryInf
// in case of join query, time range is required.
if
(
QUERY_IS_JOIN_QUERY
(
pQueryInfo
->
type
))
{
int64_t
timeRange
=
ABS
(
pQueryInfo
->
window
.
skey
-
pQueryInfo
->
window
.
ekey
)
;
uint64_t
timeRange
=
(
uint64_t
)
pQueryInfo
->
window
.
ekey
-
pQueryInfo
->
window
.
skey
;
if
(
timeRange
==
0
&&
pQueryInfo
->
window
.
skey
==
0
)
{
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg3
);
}
...
...
@@ -8227,6 +8244,7 @@ int32_t validateSqlNode(SSqlObj* pSql, SSqlNode* pSqlNode, SQueryInfo* pQueryInf
}
taosArrayAddBatch
(
pQueryInfo
->
exprList1
,
(
void
*
)
p
,
numOfExpr
);
tfree
(
p
);
}
#if 0
...
...
src/client/src/tscServer.c
浏览文件 @
2d6ad4d8
...
...
@@ -2076,6 +2076,7 @@ int tscProcessMultiTableMetaRsp(SSqlObj *pSql) {
STableMeta
*
pTableMeta
=
tscCreateTableMetaFromMsg
(
pMetaMsg
);
if
(
!
tIsValidSchema
(
pTableMeta
->
schema
,
pTableMeta
->
tableInfo
.
numOfColumns
,
pTableMeta
->
tableInfo
.
numOfTags
))
{
tscError
(
"0x%"
PRIx64
" invalid table meta from mnode, name:%s"
,
pSql
->
self
,
pMetaMsg
->
tableFname
);
tfree
(
pTableMeta
);
taosHashCleanup
(
pSet
);
taosReleaseRef
(
tscObjRef
,
pParentSql
->
self
);
...
...
@@ -2119,6 +2120,10 @@ int tscProcessMultiTableMetaRsp(SSqlObj *pSql) {
assert
(
p
!=
NULL
);
int32_t
size
=
0
;
if
(
p
->
pVgroupInfo
!=
NULL
)
{
tscVgroupInfoClear
(
p
->
pVgroupInfo
);
//tfree(p->pTableMeta);
}
p
->
pVgroupInfo
=
createVgroupInfoFromMsg
(
pMsg
,
&
size
,
pSql
->
self
);
pMsg
+=
size
;
}
...
...
src/client/src/tscSubquery.c
浏览文件 @
2d6ad4d8
...
...
@@ -107,6 +107,9 @@ bool subAndCheckDone(SSqlObj *pSql, SSqlObj *pParentSql, int idx) {
subState
->
states
[
idx
]
=
1
;
bool
done
=
allSubqueryDone
(
pParentSql
);
if
(
!
done
)
{
tscDebug
(
"0x%"
PRIx64
" sub:%p,%d completed, total:%d"
,
pParentSql
->
self
,
pSql
,
idx
,
pParentSql
->
subState
.
numOfSub
);
}
pthread_mutex_unlock
(
&
subState
->
mutex
);
return
done
;
}
...
...
@@ -416,7 +419,9 @@ static void tscDestroyJoinSupporter(SJoinSupporter* pSupporter) {
}
// tscFieldInfoClear(&pSupporter->fieldsInfo);
if
(
pSupporter
->
fieldsInfo
.
internalField
!=
NULL
)
{
taosArrayDestroy
(
pSupporter
->
fieldsInfo
.
internalField
);
}
if
(
pSupporter
->
pTSBuf
!=
NULL
)
{
tsBufDestroy
(
pSupporter
->
pTSBuf
);
pSupporter
->
pTSBuf
=
NULL
;
...
...
@@ -430,7 +435,8 @@ static void tscDestroyJoinSupporter(SJoinSupporter* pSupporter) {
}
if
(
pSupporter
->
pVgroupTables
!=
NULL
)
{
taosArrayDestroy
(
pSupporter
->
pVgroupTables
);
//taosArrayDestroy(pSupporter->pVgroupTables);
tscFreeVgroupTableInfo
(
pSupporter
->
pVgroupTables
);
pSupporter
->
pVgroupTables
=
NULL
;
}
...
...
@@ -889,7 +895,9 @@ static int32_t getIntersectionOfTableTuple(SQueryInfo* pQueryInfo, SSqlObj* pPar
tscDebug
(
"Join %d - num:%d"
,
i
,
p
->
num
);
// sort according to the tag valu
qsort
(
p
->
pIdTagList
,
p
->
num
,
p
->
tagSize
,
tagValCompar
);
if
(
p
->
pIdTagList
!=
NULL
)
{
qsort
(
p
->
pIdTagList
,
p
->
num
,
p
->
tagSize
,
tagValCompar
);
}
if
(
!
checkForDuplicateTagVal
(
pColSchema
,
p
,
pParentSql
))
{
for
(
int32_t
j
=
0
;
j
<=
i
;
j
++
)
{
...
...
@@ -1173,7 +1181,7 @@ static void tidTagRetrieveCallback(void* param, TAOS_RES* tres, int32_t numOfRow
// no data exists in next vnode, mark the <tid, tags> query completed
// only when there is no subquery exits any more, proceeds to get the intersect of the <tid, tags> tuple sets.
if
(
!
subAndCheckDone
(
pSql
,
pParentSql
,
pSupporter
->
subqueryIndex
))
{
tscDebug
(
"0x%"
PRIx64
" tagRetrieve:%p,%d completed, total:%d"
,
pParentSql
->
self
,
tres
,
pSupporter
->
subqueryIndex
,
pParentSql
->
subState
.
numOfSub
);
//
tscDebug("0x%"PRIx64" tagRetrieve:%p,%d completed, total:%d", pParentSql->self, tres, pSupporter->subqueryIndex, pParentSql->subState.numOfSub);
return
;
}
...
...
@@ -1441,7 +1449,7 @@ static void joinRetrieveFinalResCallback(void* param, TAOS_RES* tres, int numOfR
}
if
(
!
subAndCheckDone
(
pSql
,
pParentSql
,
pSupporter
->
subqueryIndex
))
{
tscDebug
(
"0x%"
PRIx64
" sub:0x%"
PRIx64
",%d completed, total:%d"
,
pParentSql
->
self
,
pSql
->
self
,
pSupporter
->
subqueryIndex
,
pState
->
numOfSub
);
//
tscDebug("0x%"PRIx64" sub:0x%"PRIx64",%d completed, total:%d", pParentSql->self, pSql->self, pSupporter->subqueryIndex, pState->numOfSub);
return
;
}
...
...
@@ -3047,9 +3055,10 @@ static void multiVnodeInsertFinalize(void* param, TAOS_RES* tres, int numOfRows)
pParentObj
->
cmd
.
insertParam
.
schemaAttached
=
1
;
}
}
if
(
!
subAndCheckDone
(
tres
,
pParentObj
,
pSupporter
->
index
))
{
tscDebug
(
"0x%"
PRIx64
" insert:%p,%d completed, total:%d"
,
pParentObj
->
self
,
tres
,
pSupporter
->
index
,
pParentObj
->
subState
.
numOfSub
);
// concurrency problem, other thread already release pParentObj
//tscDebug("0x%"PRIx64" insert:%p,%d completed, total:%d", pParentObj->self, tres, suppIdx, pParentObj->subState.numOfSub);
return
;
}
...
...
src/client/src/tscUtil.c
浏览文件 @
2d6ad4d8
...
...
@@ -297,7 +297,7 @@ bool tscHasColumnFilter(SQueryInfo* pQueryInfo) {
size_t
size
=
taosArrayGetSize
(
pQueryInfo
->
colList
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
SColumn
*
pCol
=
taosArrayGet
(
pQueryInfo
->
colList
,
i
);
SColumn
*
pCol
=
taosArrayGet
P
(
pQueryInfo
->
colList
,
i
);
if
(
pCol
->
info
.
flist
.
numOfFilters
>
0
)
{
return
true
;
}
...
...
@@ -2985,6 +2985,7 @@ int32_t tscQueryInfoCopy(SQueryInfo* pQueryInfo, const SQueryInfo* pSrc) {
pQueryInfo
->
tsBuf
=
NULL
;
pQueryInfo
->
fillType
=
pSrc
->
fillType
;
pQueryInfo
->
fillVal
=
NULL
;
pQueryInfo
->
numOfFillVal
=
0
;;
pQueryInfo
->
clauseLimit
=
pSrc
->
clauseLimit
;
pQueryInfo
->
prjOffset
=
pSrc
->
prjOffset
;
pQueryInfo
->
numOfTables
=
0
;
...
...
@@ -3020,11 +3021,12 @@ int32_t tscQueryInfoCopy(SQueryInfo* pQueryInfo, const SQueryInfo* pSrc) {
}
if
(
pSrc
->
fillType
!=
TSDB_FILL_NONE
)
{
pQueryInfo
->
fillVal
=
malloc
(
pSrc
->
fieldsInfo
.
numOfOutput
*
sizeof
(
int64_t
));
pQueryInfo
->
fillVal
=
calloc
(
1
,
pSrc
->
fieldsInfo
.
numOfOutput
*
sizeof
(
int64_t
));
if
(
pQueryInfo
->
fillVal
==
NULL
)
{
code
=
TSDB_CODE_TSC_OUT_OF_MEMORY
;
goto
_error
;
}
pQueryInfo
->
numOfFillVal
=
pSrc
->
fieldsInfo
.
numOfOutput
;
memcpy
(
pQueryInfo
->
fillVal
,
pSrc
->
fillVal
,
pSrc
->
fieldsInfo
.
numOfOutput
*
sizeof
(
int64_t
));
}
...
...
@@ -3366,6 +3368,7 @@ SSqlObj* createSubqueryObj(SSqlObj* pSql, int16_t tableIndex, __async_cb_func_t
pNewQueryInfo
->
tsBuf
=
NULL
;
pNewQueryInfo
->
fillType
=
pQueryInfo
->
fillType
;
pNewQueryInfo
->
fillVal
=
NULL
;
pNewQueryInfo
->
numOfFillVal
=
0
;
pNewQueryInfo
->
clauseLimit
=
pQueryInfo
->
clauseLimit
;
pNewQueryInfo
->
prjOffset
=
pQueryInfo
->
prjOffset
;
pNewQueryInfo
->
numOfTables
=
0
;
...
...
@@ -3396,11 +3399,14 @@ SSqlObj* createSubqueryObj(SSqlObj* pSql, int16_t tableIndex, __async_cb_func_t
}
if
(
pQueryInfo
->
fillType
!=
TSDB_FILL_NONE
)
{
pNewQueryInfo
->
fillVal
=
malloc
(
pQueryInfo
->
fieldsInfo
.
numOfOutput
*
sizeof
(
int64_t
));
//just make memory memory sanitizer happy
//refator later
pNewQueryInfo
->
fillVal
=
calloc
(
1
,
pQueryInfo
->
fieldsInfo
.
numOfOutput
*
sizeof
(
int64_t
));
if
(
pNewQueryInfo
->
fillVal
==
NULL
)
{
terrno
=
TSDB_CODE_TSC_OUT_OF_MEMORY
;
goto
_error
;
}
pNewQueryInfo
->
numOfFillVal
=
pQueryInfo
->
fieldsInfo
.
numOfOutput
;
memcpy
(
pNewQueryInfo
->
fillVal
,
pQueryInfo
->
fillVal
,
pQueryInfo
->
fieldsInfo
.
numOfOutput
*
sizeof
(
int64_t
));
}
...
...
@@ -4420,7 +4426,7 @@ int32_t tscCreateQueryFromQueryInfo(SQueryInfo* pQueryInfo, SQueryAttr* pQueryAt
if
(
pQueryAttr
->
fillType
!=
TSDB_FILL_NONE
)
{
pQueryAttr
->
fillVal
=
calloc
(
pQueryAttr
->
numOfOutput
,
sizeof
(
int64_t
));
memcpy
(
pQueryAttr
->
fillVal
,
pQueryInfo
->
fillVal
,
pQuery
Attr
->
numOfOutput
*
sizeof
(
int64_t
));
memcpy
(
pQueryAttr
->
fillVal
,
pQueryInfo
->
fillVal
,
pQuery
Info
->
numOfFillVal
*
sizeof
(
int64_t
));
}
pQueryAttr
->
srcRowSize
=
0
;
...
...
src/common/src/tarithoperator.c
浏览文件 @
2d6ad4d8
...
...
@@ -18,7 +18,58 @@
#include "ttype.h"
#include "tutil.h"
#include "tarithoperator.h"
#include "tcompare.h"
//GET_TYPED_DATA(v, double, _right_type, (char *)&((right)[i]));
#define ARRAY_LIST_OP_DIV(left, right, _left_type, _right_type, len1, len2, out, op, _res_type, _ord) \
{ \
int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : MAX(len1, len2) - 1; \
int32_t step = ((_ord) == TSDB_ORDER_ASC) ? 1 : -1; \
\
if ((len1) == (len2)) { \
for (; i < (len2) && i >= 0; i += step, (out) += 1) { \
if (isNull((char *)&((left)[i]), _left_type) || isNull((char *)&((right)[i]), _right_type)) { \
SET_DOUBLE_NULL(out); \
continue; \
} \
double v, z = 0.0; \
GET_TYPED_DATA(v, double, _right_type, (char *)&((right)[i])); \
if (getComparFunc(TSDB_DATA_TYPE_DOUBLE, 0)(&v, &z) == 0) { \
SET_DOUBLE_NULL(out); \
continue; \
} \
*(out) = (double)(left)[i] op(right)[i]; \
} \
} else if ((len1) == 1) { \
for (; i >= 0 && i < (len2); i += step, (out) += 1) { \
if (isNull((char *)(left), _left_type) || isNull((char *)&(right)[i], _right_type)) { \
SET_DOUBLE_NULL(out); \
continue; \
} \
double v, z = 0.0; \
GET_TYPED_DATA(v, double, _right_type, (char *)&((right)[i])); \
if (getComparFunc(TSDB_DATA_TYPE_DOUBLE, 0)(&v, &z) == 0) { \
SET_DOUBLE_NULL(out); \
continue; \
} \
*(out) = (double)(left)[0] op(right)[i]; \
} \
} else if ((len2) == 1) { \
for (; i >= 0 && i < (len1); i += step, (out) += 1) { \
if (isNull((char *)&(left)[i], _left_type) || isNull((char *)(right), _right_type)) { \
SET_DOUBLE_NULL(out); \
continue; \
} \
double v, z = 0.0; \
GET_TYPED_DATA(v, double, _right_type, (char *)&((right)[0])); \
if (getComparFunc(TSDB_DATA_TYPE_DOUBLE, 0)(&v, &z) == 0) { \
SET_DOUBLE_NULL(out); \
continue; \
} \
*(out) = (double)(left)[i] op(right)[0]; \
} \
} \
}
#define ARRAY_LIST_OP(left, right, _left_type, _right_type, len1, len2, out, op, _res_type, _ord) \
{ \
int32_t i = ((_ord) == TSDB_ORDER_ASC) ? 0 : MAX(len1, len2) - 1; \
...
...
@@ -62,6 +113,12 @@
SET_DOUBLE_NULL(out); \
continue; \
} \
double v, z = 0.0; \
GET_TYPED_DATA(v, double, _right_type, (char *)&((right)[i])); \
if (getComparFunc(TSDB_DATA_TYPE_DOUBLE, 0)(&v, &z) == 0) { \
SET_DOUBLE_NULL(out); \
continue; \
} \
*(out) = (double)(left)[i] - ((int64_t)(((double)(left)[i]) / (right)[i])) * (right)[i]; \
} \
} else if (len1 == 1) { \
...
...
@@ -70,6 +127,12 @@
SET_DOUBLE_NULL(out); \
continue; \
} \
double v, z = 0.0; \
GET_TYPED_DATA(v, double, _right_type, (char *)&((right)[i])); \
if (getComparFunc(TSDB_DATA_TYPE_DOUBLE, 0)(&v, &z) == 0) { \
SET_DOUBLE_NULL(out); \
continue; \
} \
*(out) = (double)(left)[0] - ((int64_t)(((double)(left)[0]) / (right)[i])) * (right)[i]; \
} \
} else if ((len2) == 1) { \
...
...
@@ -78,6 +141,12 @@
SET_DOUBLE_NULL(out); \
continue; \
} \
double v, z = 0.0; \
GET_TYPED_DATA(v, double, _right_type, (char *)&((right)[0])); \
if (getComparFunc(TSDB_DATA_TYPE_DOUBLE, 0)(&v, &z) == 0) { \
SET_DOUBLE_NULL(out); \
continue; \
} \
*(out) = (double)(left)[i] - ((int64_t)(((double)(left)[i]) / (right)[0])) * (right)[0]; \
} \
} \
...
...
@@ -90,7 +159,7 @@
#define ARRAY_LIST_MULTI(left, right, _left_type, _right_type, len1, len2, out, _ord) \
ARRAY_LIST_OP(left, right, _left_type, _right_type, len1, len2, out, *, TSDB_DATA_TYPE_DOUBLE, _ord)
#define ARRAY_LIST_DIV(left, right, _left_type, _right_type, len1, len2, out, _ord) \
ARRAY_LIST_OP(left, right, _left_type, _right_type, len1, len2, out, /, TSDB_DATA_TYPE_DOUBLE, _ord)
ARRAY_LIST_OP
_DIV
(left, right, _left_type, _right_type, len1, len2, out, /, TSDB_DATA_TYPE_DOUBLE, _ord)
#define ARRAY_LIST_REM(left, right, _left_type, _right_type, len1, len2, out, _ord) \
ARRAY_LIST_OP_REM(left, right, _left_type, _right_type, len1, len2, out, %, TSDB_DATA_TYPE_DOUBLE, _ord)
...
...
src/query/inc/qTableMeta.h
浏览文件 @
2d6ad4d8
...
...
@@ -106,11 +106,14 @@ typedef struct SQueryInfo {
STagCond
tagCond
;
SOrderVal
order
;
int16_t
fillType
;
// final result fill type
int16_t
numOfTables
;
STableMetaInfo
**
pTableMetaInfo
;
struct
STSBuf
*
tsBuf
;
int16_t
fillType
;
// final result fill type
int64_t
*
fillVal
;
// default value for fill
int32_t
numOfFillVal
;
// fill value size
char
*
msg
;
// pointer to the pCmd->payload to keep error message temporarily
int64_t
clauseLimit
;
// limit for current sub clause
...
...
src/query/src/qExecutor.c
浏览文件 @
2d6ad4d8
...
...
@@ -951,7 +951,9 @@ static TSKEY getStartTsKey(SQueryAttr* pQueryAttr, STimeWindow* win, const TSKEY
static
void
setArithParams
(
SArithmeticSupport
*
sas
,
SExprInfo
*
pExprInfo
,
SSDataBlock
*
pSDataBlock
)
{
sas
->
numOfCols
=
(
int32_t
)
pSDataBlock
->
info
.
numOfCols
;
sas
->
pExprInfo
=
pExprInfo
;
if
(
sas
->
colList
!=
NULL
)
{
return
;
}
sas
->
colList
=
calloc
(
1
,
pSDataBlock
->
info
.
numOfCols
*
sizeof
(
SColumnInfo
));
for
(
int32_t
i
=
0
;
i
<
sas
->
numOfCols
;
++
i
)
{
SColumnInfoData
*
pColData
=
taosArrayGet
(
pSDataBlock
->
pDataBlock
,
i
);
...
...
@@ -5984,8 +5986,13 @@ SColumnInfo* extractColumnFilterInfo(SExprInfo* pExpr, int32_t numOfOutput, int3
pCols
[
i
].
colId
=
pExpr
[
i
].
base
.
resColId
;
pCols
[
i
].
flist
.
numOfFilters
=
pExpr
[
i
].
base
.
flist
.
numOfFilters
;
pCols
[
i
].
flist
.
filterInfo
=
calloc
(
pCols
[
i
].
flist
.
numOfFilters
,
sizeof
(
SColumnFilterInfo
));
memcpy
(
pCols
[
i
].
flist
.
filterInfo
,
pExpr
[
i
].
base
.
flist
.
filterInfo
,
pCols
[
i
].
flist
.
numOfFilters
*
sizeof
(
SColumnFilterInfo
));
if
(
pCols
[
i
].
flist
.
numOfFilters
!=
0
)
{
pCols
[
i
].
flist
.
filterInfo
=
calloc
(
pCols
[
i
].
flist
.
numOfFilters
,
sizeof
(
SColumnFilterInfo
));
memcpy
(
pCols
[
i
].
flist
.
filterInfo
,
pExpr
[
i
].
base
.
flist
.
filterInfo
,
pCols
[
i
].
flist
.
numOfFilters
*
sizeof
(
SColumnFilterInfo
));
}
else
{
// avoid runtime error
pCols
[
i
].
flist
.
filterInfo
=
NULL
;
}
}
assert
(
numOfFilter
>
0
);
...
...
@@ -6444,10 +6451,10 @@ static SSDataBlock* hashDistinct(void* param, bool* newgroup) {
if
(
isNull
(
val
,
type
))
{
continue
;
}
int
dummy
;
void
*
res
=
taosHashGet
(
pInfo
->
pSet
,
val
,
bytes
);
if
(
res
==
NULL
)
{
taosHashPut
(
pInfo
->
pSet
,
val
,
bytes
,
NULL
,
0
);
taosHashPut
(
pInfo
->
pSet
,
val
,
bytes
,
&
dummy
,
sizeof
(
dummy
)
);
char
*
start
=
pResultColInfoData
->
pData
+
bytes
*
pInfo
->
pRes
->
info
.
rows
;
memcpy
(
start
,
val
,
bytes
);
pRes
->
info
.
rows
+=
1
;
...
...
tests/script/general/parser/col_arithmetic_query.sim
浏览文件 @
2d6ad4d8
...
...
@@ -193,7 +193,7 @@ if $data02 != 0.000000000 then
return -1
endi
if $data03 !=
0.000000000
then
if $data03 !=
NULL
then
return -1
endi
...
...
@@ -444,7 +444,7 @@ if $data02 != 8.077777778 then
return -1
endi
if $data03 !=
inf
then
if $data03 !=
NULL
then
return -1
endi
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录