Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
e6a450af
T
TDengine
项目概览
taosdata
/
TDengine
1 年多 前同步成功
通知
1185
Star
22017
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看板
未验证
提交
e6a450af
编写于
5月 19, 2022
作者:
X
Xiaoyu Wang
提交者:
GitHub
5月 19, 2022
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #12709 from taosdata/feature/3.0_wxy
fix: some problems of parser and planner
上级
040817a2
d8cd3f02
变更
8
隐藏空白更改
内联
并排
Showing
8 changed file
with
89 addition
and
25 deletion
+89
-25
include/libs/nodes/querynodes.h
include/libs/nodes/querynodes.h
+1
-0
include/util/taoserror.h
include/util/taoserror.h
+1
-0
source/libs/parser/src/parTranslater.c
source/libs/parser/src/parTranslater.c
+46
-7
source/libs/parser/src/parUtil.c
source/libs/parser/src/parUtil.c
+3
-0
source/libs/parser/test/parSelectTest.cpp
source/libs/parser/test/parSelectTest.cpp
+20
-0
source/libs/planner/src/planSpliter.c
source/libs/planner/src/planSpliter.c
+3
-3
tests/system-test/0-others/udfTest.py
tests/system-test/0-others/udfTest.py
+14
-14
tests/system-test/2-query/nestedQuery.py
tests/system-test/2-query/nestedQuery.py
+1
-1
未找到文件。
include/libs/nodes/querynodes.h
浏览文件 @
e6a450af
...
...
@@ -236,6 +236,7 @@ typedef struct SSelectStmt {
bool
isTimeOrderQuery
;
bool
hasAggFuncs
;
bool
hasRepeatScanFuncs
;
bool
hasNonstdSQLFunc
;
}
SSelectStmt
;
typedef
enum
ESetOperatorType
{
SET_OP_TYPE_UNION_ALL
=
1
,
SET_OP_TYPE_UNION
}
ESetOperatorType
;
...
...
include/util/taoserror.h
浏览文件 @
e6a450af
...
...
@@ -649,6 +649,7 @@ int32_t* taosGetErrno();
#define TSDB_CODE_PAR_INVALID_TBNAME TAOS_DEF_ERROR_CODE(0, 0x264C)
#define TSDB_CODE_PAR_INVALID_FUNCTION_NAME TAOS_DEF_ERROR_CODE(0, 0x264D)
#define TSDB_CODE_PAR_COMMENT_TOO_LONG TAOS_DEF_ERROR_CODE(0, 0x264E)
#define TSDB_CODE_PAR_NOT_ALLOWED_FUNC TAOS_DEF_ERROR_CODE(0, 0x264F)
//planner
#define TSDB_CODE_PLAN_INTERNAL_ERROR TAOS_DEF_ERROR_CODE(0, 0x2700)
...
...
source/libs/parser/src/parTranslater.c
浏览文件 @
e6a450af
...
...
@@ -53,6 +53,8 @@ static bool afterGroupBy(ESqlClause clause) { return clause > SQL_CLAUSE_GROUP_B
static
bool
beforeHaving
(
ESqlClause
clause
)
{
return
clause
<
SQL_CLAUSE_HAVING
;
}
static
bool
afterHaving
(
ESqlClause
clause
)
{
return
clause
>
SQL_CLAUSE_HAVING
;
}
static
int32_t
addNamespace
(
STranslateContext
*
pCxt
,
void
*
pTable
)
{
size_t
currTotalLevel
=
taosArrayGetSize
(
pCxt
->
pNsLevel
);
if
(
currTotalLevel
>
pCxt
->
currLevel
)
{
...
...
@@ -276,6 +278,10 @@ static bool isScanPseudoColumnFunc(const SNode* pNode) {
return
(
QUERY_NODE_FUNCTION
==
nodeType
(
pNode
)
&&
fmIsScanPseudoColumnFunc
(((
SFunctionNode
*
)
pNode
)
->
funcId
));
}
static
bool
isNonstandardSQLFunc
(
const
SNode
*
pNode
)
{
return
(
QUERY_NODE_FUNCTION
==
nodeType
(
pNode
)
&&
fmIsNonstandardSQLFunc
(((
SFunctionNode
*
)
pNode
)
->
funcId
));
}
static
bool
isDistinctOrderBy
(
STranslateContext
*
pCxt
)
{
return
(
SQL_CLAUSE_ORDER_BY
==
pCxt
->
currClause
&&
pCxt
->
pCurrStmt
->
isDistinct
);
}
...
...
@@ -433,6 +439,7 @@ static EDealRes translateColumnWithoutPrefix(STranslateContext* pCxt, SColumnNod
SArray
*
pTables
=
taosArrayGetP
(
pCxt
->
pNsLevel
,
pCxt
->
currLevel
);
size_t
nums
=
taosArrayGetSize
(
pTables
);
bool
found
=
false
;
bool
isInternalPk
=
isInternalPrimaryKey
(
pCol
);
for
(
size_t
i
=
0
;
i
<
nums
;
++
i
)
{
STableNode
*
pTable
=
taosArrayGetP
(
pTables
,
i
);
if
(
findAndSetColumn
(
pCol
,
pTable
))
{
...
...
@@ -440,10 +447,13 @@ static EDealRes translateColumnWithoutPrefix(STranslateContext* pCxt, SColumnNod
return
generateDealNodeErrMsg
(
pCxt
,
TSDB_CODE_PAR_AMBIGUOUS_COLUMN
,
pCol
->
colName
);
}
found
=
true
;
if
(
isInternalPk
)
{
break
;
}
}
}
if
(
!
found
)
{
if
(
isInternalP
rimaryKey
(
pCol
)
)
{
if
(
isInternalP
k
)
{
return
generateDealNodeErrMsg
(
pCxt
,
TSDB_CODE_PAR_INVALID_INTERNAL_PK
);
}
else
{
return
generateDealNodeErrMsg
(
pCxt
,
TSDB_CODE_PAR_INVALID_COLUMN
,
pCol
->
colName
);
...
...
@@ -703,10 +713,13 @@ static EDealRes translateOperator(STranslateContext* pCxt, SOperatorNode* pOp) {
return
DEAL_RES_CONTINUE
;
}
static
EDealRes
haveAggFunction
(
SNode
*
pNode
,
void
*
pContext
)
{
static
EDealRes
haveAgg
OrNonstd
Function
(
SNode
*
pNode
,
void
*
pContext
)
{
if
(
isAggFunc
(
pNode
))
{
*
((
bool
*
)
pContext
)
=
true
;
return
DEAL_RES_END
;
}
else
if
(
isNonstandardSQLFunc
(
pNode
))
{
*
((
bool
*
)
pContext
)
=
true
;
return
DEAL_RES_END
;
}
return
DEAL_RES_CONTINUE
;
}
...
...
@@ -743,6 +756,12 @@ static int32_t rewriteCountStar(STranslateContext* pCxt, SFunctionNode* pCount)
return
code
;
}
static
bool
hasInvalidFuncNesting
(
SNodeList
*
pParameterList
)
{
bool
hasInvalidFunc
=
false
;
nodesWalkExprs
(
pParameterList
,
haveAggOrNonstdFunction
,
&
hasInvalidFunc
);
return
hasInvalidFunc
;
}
static
EDealRes
translateFunction
(
STranslateContext
*
pCxt
,
SFunctionNode
*
pFunc
)
{
SFmGetFuncInfoParam
param
=
{.
pCtg
=
pCxt
->
pParseCxt
->
pCatalog
,
.
pRpc
=
pCxt
->
pParseCxt
->
pTransporter
,
...
...
@@ -754,11 +773,12 @@ static EDealRes translateFunction(STranslateContext* pCxt, SFunctionNode* pFunc)
if
(
beforeHaving
(
pCxt
->
currClause
))
{
return
generateDealNodeErrMsg
(
pCxt
,
TSDB_CODE_PAR_ILLEGAL_USE_AGG_FUNCTION
);
}
bool
haveAggFunc
=
false
;
nodesWalkExprs
(
pFunc
->
pParameterList
,
haveAggFunction
,
&
haveAggFunc
);
if
(
haveAggFunc
)
{
if
(
hasInvalidFuncNesting
(
pFunc
->
pParameterList
))
{
return
generateDealNodeErrMsg
(
pCxt
,
TSDB_CODE_PAR_AGG_FUNC_NESTING
);
}
if
(
pCxt
->
pCurrStmt
->
hasNonstdSQLFunc
)
{
return
generateDealNodeErrMsg
(
pCxt
,
TSDB_CODE_PAR_NOT_ALLOWED_FUNC
);
}
pCxt
->
pCurrStmt
->
hasAggFuncs
=
true
;
pCxt
->
pCurrStmt
->
isTimeOrderQuery
=
false
;
...
...
@@ -784,6 +804,15 @@ static EDealRes translateFunction(STranslateContext* pCxt, SFunctionNode* pFunc)
}
}
}
if
(
TSDB_CODE_SUCCESS
==
pCxt
->
errCode
&&
fmIsNonstandardSQLFunc
(
pFunc
->
funcId
))
{
if
(
SQL_CLAUSE_SELECT
!=
pCxt
->
currClause
||
pCxt
->
pCurrStmt
->
hasNonstdSQLFunc
||
pCxt
->
pCurrStmt
->
hasAggFuncs
)
{
return
generateDealNodeErrMsg
(
pCxt
,
TSDB_CODE_PAR_NOT_ALLOWED_FUNC
);
}
if
(
hasInvalidFuncNesting
(
pFunc
->
pParameterList
))
{
return
generateDealNodeErrMsg
(
pCxt
,
TSDB_CODE_PAR_AGG_FUNC_NESTING
);
}
pCxt
->
pCurrStmt
->
hasNonstdSQLFunc
=
true
;
}
return
TSDB_CODE_SUCCESS
==
pCxt
->
errCode
?
DEAL_RES_CONTINUE
:
DEAL_RES_ERROR
;
}
...
...
@@ -952,6 +981,7 @@ typedef struct CheckAggColCoexistCxt {
STranslateContext
*
pTranslateCxt
;
bool
existAggFunc
;
bool
existCol
;
bool
existNonstdFunc
;
int32_t
selectFuncNum
;
}
CheckAggColCoexistCxt
;
...
...
@@ -962,6 +992,10 @@ static EDealRes doCheckAggColCoexist(SNode* pNode, void* pContext) {
pCxt
->
existAggFunc
=
true
;
return
DEAL_RES_IGNORE_CHILD
;
}
if
(
isNonstandardSQLFunc
(
pNode
))
{
pCxt
->
existNonstdFunc
=
true
;
return
DEAL_RES_IGNORE_CHILD
;
}
if
(
isScanPseudoColumnFunc
(
pNode
)
||
QUERY_NODE_COLUMN
==
nodeType
(
pNode
))
{
pCxt
->
existCol
=
true
;
}
...
...
@@ -972,16 +1006,21 @@ static int32_t checkAggColCoexist(STranslateContext* pCxt, SSelectStmt* pSelect)
if
(
NULL
!=
pSelect
->
pGroupByList
)
{
return
TSDB_CODE_SUCCESS
;
}
CheckAggColCoexistCxt
cxt
=
{.
pTranslateCxt
=
pCxt
,
.
existAggFunc
=
false
,
.
existCol
=
false
};
CheckAggColCoexistCxt
cxt
=
{
.
pTranslateCxt
=
pCxt
,
.
existAggFunc
=
false
,
.
existCol
=
false
,
.
existNonstdFunc
=
false
};
nodesWalkExprs
(
pSelect
->
pProjectionList
,
doCheckAggColCoexist
,
&
cxt
);
if
(
!
pSelect
->
isDistinct
)
{
nodesWalkExprs
(
pSelect
->
pOrderByList
,
doCheckAggColCoexist
,
&
cxt
);
}
if
(
1
==
cxt
.
selectFuncNum
)
{
return
rewriteColsToSelectValFunc
(
pCxt
,
pSelect
);
}
else
if
((
cxt
.
selectFuncNum
>
1
||
cxt
.
existAggFunc
||
NULL
!=
pSelect
->
pWindow
)
&&
cxt
.
existCol
)
{
}
if
((
cxt
.
selectFuncNum
>
1
||
cxt
.
existAggFunc
||
NULL
!=
pSelect
->
pWindow
)
&&
cxt
.
existCol
)
{
return
generateSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_NOT_SINGLE_GROUP
);
}
if
(
cxt
.
existNonstdFunc
&&
cxt
.
existCol
)
{
return
generateSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_NOT_ALLOWED_FUNC
);
}
return
TSDB_CODE_SUCCESS
;
}
...
...
source/libs/parser/src/parUtil.c
浏览文件 @
e6a450af
...
...
@@ -164,6 +164,9 @@ static char* getSyntaxErrFormat(int32_t errCode) {
return
"Invalid function name"
;
case
TSDB_CODE_PAR_COMMENT_TOO_LONG
:
return
"Comment too long"
;
case
TSDB_CODE_PAR_NOT_ALLOWED_FUNC
:
return
"Some functions are allowed only in the SELECT list of a query. "
"And, cannot be mixed with other non scalar functions or columns."
;
case
TSDB_CODE_OUT_OF_MEMORY
:
return
"Out of memory"
;
default:
...
...
source/libs/parser/test/parSelectTest.cpp
浏览文件 @
e6a450af
...
...
@@ -121,6 +121,26 @@ TEST_F(ParserSelectTest, selectFunc) {
run
(
"SELECT MAX(c1), c2 FROM t1 STATE_WINDOW(c3)"
);
}
TEST_F
(
ParserSelectTest
,
nonstdFunc
)
{
useDb
(
"root"
,
"test"
);
run
(
"SELECT DIFF(c1) FROM t1"
);
// run("SELECT DIFF(c1) FROM t1 INTERVAL(10s)");
}
TEST_F
(
ParserSelectTest
,
nonstdFuncSemanticCheck
)
{
useDb
(
"root"
,
"test"
);
run
(
"SELECT DIFF(c1), c2 FROM t1"
,
TSDB_CODE_PAR_NOT_ALLOWED_FUNC
,
PARSER_STAGE_TRANSLATE
);
run
(
"SELECT DIFF(c1), tbname FROM t1"
,
TSDB_CODE_PAR_NOT_ALLOWED_FUNC
,
PARSER_STAGE_TRANSLATE
);
run
(
"SELECT DIFF(c1), count(*) FROM t1"
,
TSDB_CODE_PAR_NOT_ALLOWED_FUNC
,
PARSER_STAGE_TRANSLATE
);
run
(
"SELECT DIFF(c1), CSUM(c1) FROM t1"
,
TSDB_CODE_PAR_NOT_ALLOWED_FUNC
,
PARSER_STAGE_TRANSLATE
);
}
TEST_F
(
ParserSelectTest
,
clause
)
{
useDb
(
"root"
,
"test"
);
...
...
source/libs/planner/src/planSpliter.c
浏览文件 @
e6a450af
...
...
@@ -24,9 +24,9 @@
#define SPLIT_FLAG_TEST_MASK(val, mask) (((val) & (mask)) != 0)
typedef
struct
SSplitContext
{
int32
_t
queryId
;
int32_t
groupId
;
bool
split
;
uint64
_t
queryId
;
int32_t
groupId
;
bool
split
;
}
SSplitContext
;
typedef
int32_t
(
*
FSplit
)(
SSplitContext
*
pCxt
,
SLogicSubplan
*
pSubplan
);
...
...
tests/system-test/0-others/udfTest.py
浏览文件 @
e6a450af
...
...
@@ -343,14 +343,14 @@ class TDTestCase:
# # bug need fix
tdSql
.
query
(
"select udf1(num1) , csum(num1) from tb;"
)
tdSql
.
checkRows
(
9
)
tdSql
.
query
(
"select ceil(num1) , csum(num1) from tb;"
)
tdSql
.
checkRows
(
9
)
tdSql
.
query
(
"select udf1(c1) , csum(c1) from stb1;"
)
tdSql
.
checkRows
(
22
)
tdSql
.
query
(
"select floor(c1) , csum(c1) from stb1;"
)
tdSql
.
checkRows
(
22
)
#
tdSql.query("select udf1(num1) , csum(num1) from tb;")
#
tdSql.checkRows(9)
#
tdSql.query("select ceil(num1) , csum(num1) from tb;")
#
tdSql.checkRows(9)
#
tdSql.query("select udf1(c1) , csum(c1) from stb1;")
#
tdSql.checkRows(22)
#
tdSql.query("select floor(c1) , csum(c1) from stb1;")
#
tdSql.checkRows(22)
# stable with compute functions
tdSql
.
query
(
"select udf1(c1) , abs(c1) from stb1;"
)
...
...
@@ -477,15 +477,15 @@ class TDTestCase:
"select c1 , udf1(c1) ,c2 ,udf1(c2), c3 ,udf1(c3), c4 ,udf1(c4) from stb1 order by c1"
,
"select udf1(num1) , max(num1) from tb;"
,
"select udf1(num1) , min(num1) from tb;"
,
"select udf1(num1) , top(num1,1) from tb;"
,
"select udf1(num1) , bottom(num1,1) from tb;"
,
#
"select udf1(num1) , top(num1,1) from tb;" ,
#
"select udf1(num1) , bottom(num1,1) from tb;" ,
"select udf1(c1) , max(c1) from stb1;"
,
"select udf1(c1) , min(c1) from stb1;"
,
"select udf1(c1) , top(c1 ,1) from stb1;"
,
"select udf1(c1) , bottom(c1,1) from stb1;"
,
#
"select udf1(c1) , top(c1 ,1) from stb1;" ,
#
"select udf1(c1) , bottom(c1,1) from stb1;" ,
"select udf1(num1) , abs(num1) from tb;"
,
"select udf1(num1) , csum(num1) from tb;"
,
"select udf1(c1) , csum(c1) from stb1;"
,
#
"select udf1(num1) , csum(num1) from tb;" ,
#
"select udf1(c1) , csum(c1) from stb1;" ,
"select udf1(c1) , abs(c1) from stb1;"
,
"select abs(udf1(c1)) , abs(ceil(c1)) from stb1 order by ts;"
,
"select abs(udf1(c1)) , abs(ceil(c1)) from ct1 order by ts;"
,
...
...
tests/system-test/2-query/nestedQuery.py
浏览文件 @
e6a450af
...
...
@@ -736,7 +736,7 @@ class TDTestCase:
sql
+=
")"
tdLog
.
info
(
sql
)
tdLog
.
info
(
len
(
sql
))
tdSql
.
error
(
sql
)
#
tdSql.error(sql)
#TD-15610 tdSql.query(sql)
# tdSql.checkRows(100)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录