Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
2b963dc3
T
TDengine
项目概览
taosdata
/
TDengine
1 年多 前同步成功
通知
1185
Star
22016
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
2b963dc3
编写于
7月 09, 2021
作者:
Y
yihaoDeng
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[TD-5134]<fix> fix runtime error
上级
c2f32ad9
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
97 addition
and
15 deletion
+97
-15
src/client/src/tscSQLParser.c
src/client/src/tscSQLParser.c
+3
-1
src/client/src/tscSubquery.c
src/client/src/tscSubquery.c
+8
-5
src/client/src/tscUtil.c
src/client/src/tscUtil.c
+9
-5
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
+1
-0
tests/script/general/parser/col_arithmetic_query.sim
tests/script/general/parser/col_arithmetic_query.sim
+2
-2
未找到文件。
src/client/src/tscSQLParser.c
浏览文件 @
2b963dc3
...
...
@@ -5014,7 +5014,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
=
numOfFields
;
if
(
pQueryInfo
->
fillVal
==
NULL
)
{
return
TSDB_CODE_TSC_OUT_OF_MEMORY
;
}
...
...
@@ -8191,6 +8192,7 @@ int32_t validateSqlNode(SSqlObj* pSql, SSqlNode* pSqlNode, SQueryInfo* pQueryInf
}
taosArrayAddBatch
(
pQueryInfo
->
exprList1
,
(
void
*
)
p
,
numOfExpr
);
tfree
(
p
);
}
#if 0
...
...
src/client/src/tscSubquery.c
浏览文件 @
2b963dc3
...
...
@@ -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
;
}
...
...
@@ -1173,7 +1176,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 +1444,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
;
}
...
...
@@ -3048,9 +3051,9 @@ static void multiVnodeInsertFinalize(void* param, TAOS_RES* tres, int numOfRows)
}
}
i
nt32_t
suppIdx
=
pSupporter
->
index
;
if
(
!
subAndCheckDone
(
tres
,
pParentObj
,
suppIdx
))
{
tscDebug
(
"0x%"
PRIx64
" insert:%p,%d completed, total:%d"
,
pParentObj
->
self
,
tres
,
suppIdx
,
pParentObj
->
subState
.
numOfSub
);
i
f
(
!
subAndCheckDone
(
tres
,
pParentObj
,
pSupporter
->
index
))
{
// 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
浏览文件 @
2b963dc3
...
...
@@ -2949,6 +2949,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
;
...
...
@@ -2984,11 +2985,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
));
}
...
...
@@ -3329,6 +3331,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
;
...
...
@@ -3359,11 +3362,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
));
}
...
...
@@ -4382,9 +4388,7 @@ int32_t tscCreateQueryFromQueryInfo(SQueryInfo* pQueryInfo, SQueryAttr* pQueryAt
if
(
pQueryAttr
->
fillType
!=
TSDB_FILL_NONE
)
{
pQueryAttr
->
fillVal
=
calloc
(
pQueryAttr
->
numOfOutput
,
sizeof
(
int64_t
));
int32_t
fields
=
tscNumOfFields
(
pQueryInfo
);
int32_t
cpySize
=
fields
<
pQueryAttr
->
numOfOutput
?
fields
:
pQueryAttr
->
numOfOutput
;
memcpy
(
pQueryAttr
->
fillVal
,
pQueryInfo
->
fillVal
,
cpySize
*
sizeof
(
int64_t
));
memcpy
(
pQueryAttr
->
fillVal
,
pQueryInfo
->
fillVal
,
pQueryInfo
->
numOfFillVal
*
sizeof
(
int64_t
));
}
pQueryAttr
->
srcRowSize
=
0
;
...
...
src/common/src/tarithoperator.c
浏览文件 @
2b963dc3
...
...
@@ -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
浏览文件 @
2b963dc3
...
...
@@ -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
浏览文件 @
2b963dc3
...
...
@@ -992,6 +992,7 @@ static void doSetInputDataBlock(SOperatorInfo* pOperator, SQLFunctionCtx* pCtx,
setBlockStatisInfo
(
&
pCtx
[
i
],
pBlock
,
&
pOperator
->
pExpr
[
i
].
base
.
colInfo
);
if
(
pCtx
[
i
].
functionId
==
TSDB_FUNC_ARITHM
)
{
pCtx
[
i
].
param
[
1
].
pz
=
(
char
*
)
&
Operator
->
pRuntimeEnv
->
sasArray
[
i
];
setArithParams
((
SArithmeticSupport
*
)
pCtx
[
i
].
param
[
1
].
pz
,
&
pOperator
->
pExpr
[
i
],
pBlock
);
}
else
{
SColIndex
*
pCol
=
&
pOperator
->
pExpr
[
i
].
base
.
colInfo
;
...
...
tests/script/general/parser/col_arithmetic_query.sim
浏览文件 @
2b963dc3
...
...
@@ -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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录