Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
a0d3fa46
T
TDengine
项目概览
taosdata
/
TDengine
12 个月 前同步成功
通知
1180
Star
22014
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看板
体验新版 GitCode,发现更多精彩内容 >>
提交
a0d3fa46
编写于
11月 10, 2021
作者:
H
Haojun Liao
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[td-10564] refactor code and fix bug in parse sql.
上级
6fedb60e
变更
14
展开全部
隐藏空白更改
内联
并排
Showing
14 changed file
with
779 addition
and
742 deletion
+779
-742
include/libs/function/function.h
include/libs/function/function.h
+2
-1
source/libs/parser/inc/astGenerator.h
source/libs/parser/inc/astGenerator.h
+24
-14
source/libs/parser/inc/sql.y
source/libs/parser/inc/sql.y
+3
-3
source/libs/parser/src/astGenerator.c
source/libs/parser/src/astGenerator.c
+34
-26
source/libs/parser/src/astValidate.c
source/libs/parser/src/astValidate.c
+21
-11
source/libs/parser/src/parser.c
source/libs/parser/src/parser.c
+9
-9
source/libs/parser/src/queryInfoUtil.c
source/libs/parser/src/queryInfoUtil.c
+1
-1
source/libs/parser/src/sql.c
source/libs/parser/src/sql.c
+610
-605
source/libs/parser/test/parserTests.cpp
source/libs/parser/test/parserTests.cpp
+28
-26
source/libs/parser/test/plannerTest.cpp
source/libs/parser/test/plannerTest.cpp
+16
-16
source/libs/parser/test/tokenizerTest.cpp
source/libs/parser/test/tokenizerTest.cpp
+3
-3
src/client/src/tscSQLParser.c
src/client/src/tscSQLParser.c
+15
-15
src/query/inc/qSqlparser.h
src/query/inc/qSqlparser.h
+5
-5
src/query/src/qSqlParser.c
src/query/src/qSqlParser.c
+8
-7
未找到文件。
include/libs/function/function.h
浏览文件 @
a0d3fa46
...
...
@@ -235,11 +235,12 @@ typedef struct SMultiFunctionsDesc {
bool
hasFilter
;
bool
onlyTagQuery
;
bool
orderProjectQuery
;
bool
stateWindow
;
bool
globalMerge
;
bool
multigroupResult
;
bool
blockDistribution
;
bool
stateWindow
;
bool
timewindow
;
bool
sessionWindow
;
bool
topbotQuery
;
bool
interpQuery
;
bool
distinct
;
...
...
source/libs/parser/inc/astGenerator.h
浏览文件 @
a0d3fa46
...
...
@@ -37,9 +37,14 @@ enum SQL_NODE_TYPE {
SQL_NODE_EXPR
=
4
,
};
enum
SQL_NODE_FROM_TYPE
{
SQL_NODE_FROM_SUBQUERY
=
1
,
SQL_NODE_FROM_TABLELIST
=
2
,
enum
SQL_FROM_NODE_TYPE
{
SQL_FROM_NODE_SUBQUERY
=
1
,
SQL_FROM_NODE_TABLES
=
2
,
};
enum
SQL_UNION_TYPE
{
SQL_TYPE_UNIONALL
=
1
,
SQL_TYPE_UNION
=
2
,
};
extern
char
tTokenTypeSwitcher
[
13
];
...
...
@@ -79,8 +84,8 @@ typedef struct SWindowStateVal {
struct
SRelationInfo
;
typedef
struct
SSqlNode
{
struct
SArray
*
pSelNodeList
;
// select clause
struct
SRelationInfo
*
from
;
// from clause SArray<SSqlNode>
struct
SArray
*
pSelNodeList
;
// select clause
struct
tSqlExpr
*
pWhere
;
// where clause [optional]
SArray
*
pGroupby
;
// groupby clause, only for tags[optional], SArray<SListItem>
SArray
*
pSortOrder
;
// orderby [optional], SArray<SListItem>
...
...
@@ -95,18 +100,23 @@ typedef struct SSqlNode {
struct
tSqlExpr
*
pHaving
;
// having clause [optional]
}
SSqlNode
;
typedef
struct
SRelElementPair
{
typedef
struct
SSubclause
{
int32_t
unionType
;
SArray
*
node
;
}
SSubclause
;
typedef
struct
SRelElement
{
union
{
SToken
tableName
;
S
Array
*
pSubquery
;
SToken
tableName
;
S
Subclause
*
pSubquery
;
};
SToken
aliasName
;
}
SRelElement
Pair
;
}
SRelElement
;
typedef
struct
SRelationInfo
{
int32_t
type
;
// nested query|table name list
SArray
*
list
;
// SArray<SRelElement
Pair
>
SArray
*
list
;
// SArray<SRelElement>
}
SRelationInfo
;
typedef
struct
SCreatedTableInfo
{
...
...
@@ -216,7 +226,7 @@ typedef struct SMiscInfo {
typedef
struct
SSqlInfo
{
int32_t
type
;
bool
valid
;
S
Array
*
list
;
// todo refactor
S
Subclause
sub
;
char
msg
[
256
];
SArray
*
funcs
;
union
{
...
...
@@ -257,7 +267,7 @@ SArray *tListItemAppendToken(SArray *pList, SToken *pAliasToken, uint8_t sortOrd
SRelationInfo
*
setTableNameList
(
SRelationInfo
*
pRelationInfo
,
SToken
*
pName
,
SToken
*
pAlias
);
void
*
destroyRelationInfo
(
SRelationInfo
*
pFromInfo
);
SRelationInfo
*
addSubquery
(
SRelationInfo
*
pRelationInfo
,
S
Array
*
pSub
,
SToken
*
pAlias
);
SRelationInfo
*
addSubquery
(
SRelationInfo
*
pRelationInfo
,
S
Subclause
*
pSub
,
SToken
*
pAlias
);
// sql expr leaf node
tSqlExpr
*
tSqlExprCreateIdValue
(
SToken
*
pToken
,
int32_t
optrType
);
...
...
@@ -285,13 +295,13 @@ SAlterTableInfo * tSetAlterTableInfo(SToken *pTableName, SArray *pCols, SArray *
SCreatedTableInfo
createNewChildTableInfo
(
SToken
*
pTableName
,
SArray
*
pTagNames
,
SArray
*
pTagVals
,
SToken
*
pToken
,
SToken
*
igExists
);
void
destroyAllSqlNode
(
SArray
*
pSqlNode
);
void
destroyAllSqlNode
(
struct
SSubclause
*
pSqlNode
);
void
destroySqlNode
(
SSqlNode
*
pSql
);
void
freeCreateTableInfo
(
void
*
p
);
SSqlInfo
*
setSqlInfo
(
SSqlInfo
*
pInfo
,
void
*
pSqlExprInfo
,
SToken
*
pTableName
,
int32_t
type
);
S
Array
*
setSubclause
(
SArray
*
pList
,
void
*
pSqlNode
);
S
Array
*
appendSelectClause
(
SArray
*
pList
,
void
*
pSubclause
);
S
Subclause
*
setSubclause
(
SSubclause
*
sub
,
void
*
pSqlNode
);
S
Subclause
*
appendSelectClause
(
SSubclause
*
sub
,
int32_t
unionType
,
void
*
pSubclause
);
void
setCreatedTableName
(
SSqlInfo
*
pInfo
,
SToken
*
pTableNameToken
,
SToken
*
pIfNotExists
);
void
*
destroyCreateTableSql
(
SCreateTableSql
*
pCreate
);
...
...
source/libs/parser/inc/sql.y
浏览文件 @
a0d3fa46
...
...
@@ -487,11 +487,11 @@ select(A) ::= SELECT(T) selcollist(W) from(X) where_opt(Y) interval_option(K) sl
select(A) ::= LP select(B) RP. {A = B;}
%type union {S
Array
*}
%type union {S
Subclause
*}
%destructor union {destroyAllSqlNode($$);}
union(Y) ::= select(X). { Y = setSubclause(NULL, X); }
union(Y) ::= union(Z) UNION ALL select(X). { Y = appendSelectClause(Z,
X);
}
union(Y) ::= union(Z) UNION ALL select(X). { Y = appendSelectClause(Z,
SQL_TYPE_UNIONALL, X);
}
union(Y) ::= union(Z) UNION select(X). { Y = appendSelectClause(Z, SQL_TYPE_UNION, X); }
cmd ::= union(X). { setSqlInfo(pInfo, X, NULL, TSDB_SQL_SELECT); }
// Support for the SQL exprssion without from & where subclauses, e.g.,
...
...
source/libs/parser/src/astGenerator.c
浏览文件 @
a0d3fa46
...
...
@@ -72,11 +72,11 @@ SArray *tListItemAppendToken(SArray *pList, SToken *pAliasToken, uint8_t sortOrd
SRelationInfo
*
setTableNameList
(
SRelationInfo
*
pRelationInfo
,
SToken
*
pName
,
SToken
*
pAlias
)
{
if
(
pRelationInfo
==
NULL
)
{
pRelationInfo
=
calloc
(
1
,
sizeof
(
SRelationInfo
));
pRelationInfo
->
list
=
taosArrayInit
(
4
,
sizeof
(
SRelElement
Pair
));
pRelationInfo
->
list
=
taosArrayInit
(
4
,
sizeof
(
SRelElement
));
}
pRelationInfo
->
type
=
SQL_
NODE_FROM_TABLELIST
;
SRelElement
Pair
p
=
{.
tableName
=
*
pName
};
pRelationInfo
->
type
=
SQL_
FROM_NODE_TABLES
;
SRelElement
p
=
{.
tableName
=
*
pName
};
if
(
pAlias
!=
NULL
)
{
p
.
aliasName
=
*
pAlias
;
}
else
{
...
...
@@ -92,12 +92,12 @@ void *destroyRelationInfo(SRelationInfo *pRelationInfo) {
return
NULL
;
}
if
(
pRelationInfo
->
type
==
SQL_
NODE_FROM_TABLELIST
)
{
if
(
pRelationInfo
->
type
==
SQL_
FROM_NODE_TABLES
)
{
taosArrayDestroy
(
pRelationInfo
->
list
);
}
else
{
size_t
size
=
taosArrayGetSize
(
pRelationInfo
->
list
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
S
Array
*
pa
=
taosArrayGetP
(
pRelationInfo
->
list
,
i
);
S
Subclause
*
pa
=
taosArrayGetP
(
pRelationInfo
->
list
,
i
);
destroyAllSqlNode
(
pa
);
}
taosArrayDestroy
(
pRelationInfo
->
list
);
...
...
@@ -107,15 +107,15 @@ void *destroyRelationInfo(SRelationInfo *pRelationInfo) {
return
NULL
;
}
SRelationInfo
*
addSubquery
(
SRelationInfo
*
pRelationInfo
,
S
Array
*
pSub
,
SToken
*
pAlias
)
{
SRelationInfo
*
addSubquery
(
SRelationInfo
*
pRelationInfo
,
S
Subclause
*
pSub
,
SToken
*
pAlias
)
{
if
(
pRelationInfo
==
NULL
)
{
pRelationInfo
=
calloc
(
1
,
sizeof
(
SRelationInfo
));
pRelationInfo
->
list
=
taosArrayInit
(
4
,
sizeof
(
SRelElement
Pair
));
pRelationInfo
->
list
=
taosArrayInit
(
4
,
sizeof
(
SRelElement
));
}
pRelationInfo
->
type
=
SQL_
NODE_FROM
_SUBQUERY
;
pRelationInfo
->
type
=
SQL_
FROM_NODE
_SUBQUERY
;
SRelElement
Pair
p
=
{.
pSubquery
=
pSub
};
SRelElement
p
=
{.
pSubquery
=
pSub
};
if
(
pAlias
!=
NULL
)
{
p
.
aliasName
=
*
pAlias
;
}
else
{
...
...
@@ -641,18 +641,18 @@ SCreatedTableInfo createNewChildTableInfo(SToken *pTableName, SArray *pTagNames,
return
info
;
}
void
destroyAllSqlNode
(
SArray
*
pList
)
{
if
(
p
List
==
NULL
)
{
void
destroyAllSqlNode
(
struct
SSubclause
*
pSub
)
{
if
(
p
Sub
->
node
==
NULL
)
{
return
;
}
size_t
size
=
taosArrayGetSize
(
p
List
);
size_t
size
=
taosArrayGetSize
(
p
Sub
->
node
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
SSqlNode
*
pNode
=
taosArrayGetP
(
p
List
,
i
);
SSqlNode
*
pNode
=
taosArrayGetP
(
p
Sub
->
node
,
i
);
destroySqlNode
(
pNode
);
}
taosArrayDestroy
(
p
List
);
taosArrayDestroy
(
p
Sub
->
node
);
}
static
void
freeItem
(
void
*
pItem
)
{
...
...
@@ -698,7 +698,8 @@ SSqlInfo* setSqlInfo(SSqlInfo *pInfo, void *pSqlExprInfo, SToken *pTableName, in
pInfo
->
type
=
type
;
if
(
type
==
TSDB_SQL_SELECT
)
{
pInfo
->
list
=
(
SArray
*
)
pSqlExprInfo
;
pInfo
->
sub
=
*
(
SSubclause
*
)
pSqlExprInfo
;
tfree
(
pSqlExprInfo
);
}
else
{
pInfo
->
pCreateTableInfo
=
pSqlExprInfo
;
}
...
...
@@ -710,18 +711,25 @@ SSqlInfo* setSqlInfo(SSqlInfo *pInfo, void *pSqlExprInfo, SToken *pTableName, in
return
pInfo
;
}
SArray
*
setSubclause
(
SArray
*
pList
,
void
*
pSqlNode
)
{
if
(
pList
==
NULL
)
{
pList
=
taosArrayInit
(
1
,
POINTER_BYTES
);
SSubclause
*
setSubclause
(
SSubclause
*
pSub
,
void
*
pSqlNode
)
{
if
(
pSub
==
NULL
)
{
pSub
=
malloc
(
sizeof
(
SSubclause
));
pSub
->
unionType
=
SQL_TYPE_UNIONALL
;
pSub
->
node
=
taosArrayInit
(
1
,
POINTER_BYTES
);
}
taosArrayPush
(
p
List
,
&
pSqlNode
);
return
p
List
;
taosArrayPush
(
p
Sub
->
node
,
&
pSqlNode
);
return
p
Sub
;
}
SArray
*
appendSelectClause
(
SArray
*
pList
,
void
*
pSubclause
)
{
taosArrayPush
(
pList
,
&
pSubclause
);
return
pList
;
SSubclause
*
appendSelectClause
(
SSubclause
*
pSub
,
int32_t
type
,
void
*
pSubclause
)
{
taosArrayPush
(
pSub
->
node
,
&
pSubclause
);
if
(
type
==
SQL_TYPE_UNION
)
{
pSub
->
unionType
=
type
;
}
return
pSub
;
}
void
setCreatedTableName
(
SSqlInfo
*
pInfo
,
SToken
*
pTableNameToken
,
SToken
*
pIfNotExists
)
{
...
...
@@ -776,7 +784,7 @@ void destroySqlInfo(SSqlInfo *pInfo) {
taosArrayDestroy
(
pInfo
->
funcs
);
if
(
pInfo
->
type
==
TSDB_SQL_SELECT
)
{
destroyAllSqlNode
(
pInfo
->
list
);
destroyAllSqlNode
(
&
pInfo
->
sub
);
}
else
if
(
pInfo
->
type
==
TSDB_SQL_CREATE_TABLE
)
{
pInfo
->
pCreateTableInfo
=
destroyCreateTableSql
(
pInfo
->
pCreateTableInfo
);
}
else
if
(
pInfo
->
type
==
TSDB_SQL_ALTER_TABLE
)
{
...
...
@@ -785,7 +793,7 @@ void destroySqlInfo(SSqlInfo *pInfo) {
tfree
(
pInfo
->
pAlterInfo
->
tagData
.
data
);
tfree
(
pInfo
->
pAlterInfo
);
}
else
if
(
pInfo
->
type
==
TSDB_SQL_COMPACT_VNODE
)
{
tSqlExprListDestroy
(
pInfo
->
list
);
tSqlExprListDestroy
(
pInfo
->
sub
.
node
);
}
else
{
if
(
pInfo
->
pMiscInfo
!=
NULL
)
{
taosArrayDestroy
(
pInfo
->
pMiscInfo
->
a
);
...
...
@@ -935,7 +943,7 @@ void setAlterUserSql(SSqlInfo *pInfo, int16_t type, SToken *pName, SToken* pPwd,
void
setCompactVnodeSql
(
SSqlInfo
*
pInfo
,
int32_t
type
,
SArray
*
pParam
)
{
pInfo
->
type
=
type
;
pInfo
->
list
=
pParam
;
pInfo
->
sub
.
node
=
pParam
;
}
void
setDefaultCreateDbOption
(
SCreateDbInfo
*
pDBInfo
)
{
...
...
source/libs/parser/src/astValidate.c
浏览文件 @
a0d3fa46
...
...
@@ -268,11 +268,11 @@ void destroyQueryInfo(SQueryStmtInfo* pQueryInfo) {
}
static
int32_t
doValidateSubquery
(
SSqlNode
*
pSqlNode
,
int32_t
index
,
SQueryStmtInfo
*
pQueryInfo
,
SMsgBuf
*
pMsgBuf
)
{
SRelElement
Pair
*
subInfo
=
taosArrayGet
(
pSqlNode
->
from
->
list
,
index
);
SRelElement
*
subInfo
=
taosArrayGet
(
pSqlNode
->
from
->
list
,
index
);
// union all is not support currently
SSqlNode
*
p
=
taosArrayGetP
(
subInfo
->
pSubquery
,
0
);
if
(
taosArrayGetSize
(
subInfo
->
pSubquery
)
>=
2
)
{
SSqlNode
*
p
=
taosArrayGetP
(
subInfo
->
pSubquery
->
node
,
0
);
if
(
taosArrayGetSize
(
subInfo
->
pSubquery
->
node
)
>=
2
)
{
return
buildInvalidOperationMsg
(
pMsgBuf
,
"not support union in subquery"
);
}
...
...
@@ -804,6 +804,7 @@ int32_t validateSessionNode(SQueryStmtInfo *pQueryInfo, SSessionWindowVal* pSess
SSchema
*
pSchema
=
getOneColumnSchema
(
pTableMeta
,
index
.
columnIndex
);
pQueryInfo
->
sessionWindow
.
col
=
createColumn
(
pTableMetaInfo
->
pTableMeta
->
uid
,
pTableMetaInfo
->
aliasName
,
index
.
type
,
pSchema
);
pQueryInfo
->
info
.
sessionWindow
=
true
;
return
TSDB_CODE_SUCCESS
;
}
...
...
@@ -1401,13 +1402,13 @@ int32_t validateSqlNode(SSqlNode* pSqlNode, SQueryStmtInfo* pQueryInfo, SMsgBuf*
// return doLocalQueryProcess(pCmd, pQueryInfo, pSqlNode);
}
if
(
pSqlNode
->
from
->
type
==
SQL_
NODE_FROM
_SUBQUERY
)
{
if
(
pSqlNode
->
from
->
type
==
SQL_
FROM_NODE
_SUBQUERY
)
{
pQueryInfo
->
numOfTables
=
0
;
// parse the subquery in the first place
int32_t
numOfSub
=
(
int32_t
)
taosArrayGetSize
(
pSqlNode
->
from
->
list
);
for
(
int32_t
i
=
0
;
i
<
numOfSub
;
++
i
)
{
SRelElement
Pair
*
subInfo
=
taosArrayGet
(
pSqlNode
->
from
->
list
,
i
);
SRelElement
*
subInfo
=
taosArrayGet
(
pSqlNode
->
from
->
list
,
i
);
code
=
doValidateSubquery
(
pSqlNode
,
i
,
pQueryInfo
,
pMsgBuf
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
return
code
;
...
...
@@ -1574,7 +1575,8 @@ int32_t checkForInvalidExpr(SQueryStmtInfo* pQueryInfo, SMsgBuf* pMsgBuf) {
const
char
*
msg5
=
"scalar function can not be used in time window query"
;
const
char
*
msg6
=
"not support distinct mixed with join"
;
const
char
*
msg7
=
"not support distinct mixed with groupby"
;
const
char
*
msg8
=
"_block_dist not support subquery, only support stable/table"
;
const
char
*
msg8
=
"block_dist not support subquery, only support stable/table"
;
const
char
*
msg9
=
"time window aggregate can not be mixed up with group by column"
;
if
(
pQueryInfo
->
info
.
topbotQuery
)
{
...
...
@@ -1656,6 +1658,15 @@ int32_t checkForInvalidExpr(SQueryStmtInfo* pQueryInfo, SMsgBuf* pMsgBuf) {
* nested subquery not support block_dist query
* select block_dist() from (select * from table_name)
*/
/*
* 8. invalid sql:
* select count(*) from table_name [interval(10s)|session(ts, 10s)|state_window(col_name)] group by col_name
*/
if
((
pQueryInfo
->
info
.
timewindow
||
pQueryInfo
->
info
.
stateWindow
||
pQueryInfo
->
info
.
sessionWindow
)
&&
pQueryInfo
->
info
.
groupbyColumn
)
{
return
buildInvalidOperationMsg
(
pMsgBuf
,
msg9
);
}
}
static
int32_t
resColId
=
5000
;
...
...
@@ -3790,7 +3801,7 @@ int32_t qParserValidateSqlNode(struct SCatalog* pCatalog, SSqlInfo* pInfo, SQuer
tscTrace("0x%"PRIx64" start to parse the %dth subclause, total:%"PRIzu, pSql->self, i, size);
if (size > 1 && pSqlNode->from && pSqlNode->from->type == SQL_
NODE_FROM
_SUBQUERY) {
if (size > 1 && pSqlNode->from && pSqlNode->from->type == SQL_
FROM_NODE
_SUBQUERY) {
return setInvalidOperatorMsg(pMsgBuf, msg1);
}
...
...
@@ -3895,9 +3906,9 @@ int32_t qParserValidateSqlNode(struct SCatalog* pCatalog, SSqlInfo* pInfo, SQuer
SMsgBuf
buf
=
{.
buf
=
msgBuf
,
.
len
=
msgBufLen
};
size_t
len
=
taosArrayGetSize
(
pInfo
->
list
);
size_t
len
=
taosArrayGetSize
(
pInfo
->
sub
.
node
);
for
(
int32_t
i
=
0
;
i
<
len
;
++
i
)
{
SSqlNode
*
p
=
taosArrayGetP
(
pInfo
->
list
,
i
);
SSqlNode
*
p
=
taosArrayGetP
(
pInfo
->
sub
.
node
,
i
);
code
=
evaluateSqlNode
(
p
,
pTableMeta
->
tableInfo
.
precision
,
&
buf
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
return
code
;
...
...
@@ -3905,7 +3916,7 @@ int32_t qParserValidateSqlNode(struct SCatalog* pCatalog, SSqlInfo* pInfo, SQuer
}
for
(
int32_t
i
=
0
;
i
<
len
;
++
i
)
{
SSqlNode
*
p
=
taosArrayGetP
(
pInfo
->
list
,
i
);
SSqlNode
*
p
=
taosArrayGetP
(
pInfo
->
sub
.
node
,
i
);
validateSqlNode
(
p
,
pQueryInfo
,
&
buf
);
}
...
...
@@ -3916,6 +3927,5 @@ int32_t qParserValidateSqlNode(struct SCatalog* pCatalog, SSqlInfo* pInfo, SQuer
return
code
;
}
// convert the sqlnode into queryinfo
return
code
;
}
source/libs/parser/src/parser.c
浏览文件 @
a0d3fa46
...
...
@@ -82,12 +82,12 @@ static int32_t getTableNameFromSubquery(SSqlNode* pSqlNode, SArray* tableNameLis
int32_t
numOfSub
=
(
int32_t
)
taosArrayGetSize
(
pSqlNode
->
from
->
list
);
for
(
int32_t
j
=
0
;
j
<
numOfSub
;
++
j
)
{
SRelElement
Pair
*
sub
=
taosArrayGet
(
pSqlNode
->
from
->
list
,
j
);
SRelElement
*
sub
=
taosArrayGet
(
pSqlNode
->
from
->
list
,
j
);
int32_t
num
=
(
int32_t
)
taosArrayGetSize
(
sub
->
pSubquery
);
int32_t
num
=
(
int32_t
)
taosArrayGetSize
(
sub
->
pSubquery
->
node
);
for
(
int32_t
i
=
0
;
i
<
num
;
++
i
)
{
SSqlNode
*
p
=
taosArrayGetP
(
sub
->
pSubquery
,
i
);
if
(
p
->
from
->
type
==
SQL_
NODE_FROM_TABLELIST
)
{
SSqlNode
*
p
=
taosArrayGetP
(
sub
->
pSubquery
->
node
,
i
);
if
(
p
->
from
->
type
==
SQL_
FROM_NODE_TABLES
)
{
int32_t
code
=
getTableNameFromSqlNode
(
p
,
tableNameList
,
pMsgBuf
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
return
code
;
...
...
@@ -105,10 +105,10 @@ int32_t getTableNameFromSqlNode(SSqlNode* pSqlNode, SArray* tableNameList, SMsgB
const
char
*
msg1
=
"invalid table name"
;
int32_t
numOfTables
=
(
int32_t
)
taosArrayGetSize
(
pSqlNode
->
from
->
list
);
assert
(
pSqlNode
->
from
->
type
==
SQL_
NODE_FROM_TABLELIST
);
assert
(
pSqlNode
->
from
->
type
==
SQL_
FROM_NODE_TABLES
);
for
(
int32_t
j
=
0
;
j
<
numOfTables
;
++
j
)
{
SRelElement
Pair
*
item
=
taosArrayGet
(
pSqlNode
->
from
->
list
,
j
);
SRelElement
*
item
=
taosArrayGet
(
pSqlNode
->
from
->
list
,
j
);
SToken
*
t
=
&
item
->
tableName
;
if
(
t
->
type
==
TK_INTEGER
||
t
->
type
==
TK_FLOAT
||
t
->
type
==
TK_STRING
)
{
...
...
@@ -138,15 +138,15 @@ int32_t qParserExtractRequestedMetaInfo(const SSqlInfo* pSqlInfo, SMetaReq* pMet
pMetaInfo
->
pTableName
=
taosArrayInit
(
4
,
sizeof
(
SName
));
pMetaInfo
->
pUdf
=
taosArrayInit
(
4
,
POINTER_BYTES
);
size_t
size
=
taosArrayGetSize
(
pSqlInfo
->
list
);
size_t
size
=
taosArrayGetSize
(
pSqlInfo
->
sub
.
node
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
SSqlNode
*
pSqlNode
=
taosArrayGetP
(
pSqlInfo
->
list
,
i
);
SSqlNode
*
pSqlNode
=
taosArrayGetP
(
pSqlInfo
->
sub
.
node
,
i
);
if
(
pSqlNode
->
from
==
NULL
)
{
return
buildInvalidOperationMsg
(
&
msgBuf
,
"invalid from clause"
);
}
// load the table meta in the FROM clause
if
(
pSqlNode
->
from
->
type
==
SQL_
NODE_FROM_TABLELIST
)
{
if
(
pSqlNode
->
from
->
type
==
SQL_
FROM_NODE_TABLES
)
{
code
=
getTableNameFromSqlNode
(
pSqlNode
,
pMetaInfo
->
pTableName
,
&
msgBuf
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
return
code
;
...
...
source/libs/parser/src/queryInfoUtil.c
浏览文件 @
a0d3fa46
...
...
@@ -182,7 +182,7 @@ void updateExprInfo(SExprInfo* pExprInfo, int16_t functionId, int32_t colId, int
SExprInfo
*
getExprInfo
(
SQueryStmtInfo
*
pQueryInfo
,
int32_t
index
)
{
assert
(
pQueryInfo
!=
NULL
&&
pQueryInfo
->
exprList
&&
index
>=
0
);
return
taosArrayGetP
(
getCurrentExprList
(
pQueryInfo
->
exprList
),
index
);
return
taosArrayGetP
(
getCurrentExprList
(
pQueryInfo
),
index
);
}
void
destroyExprInfo
(
SExprInfo
*
pExprInfo
)
{
...
...
source/libs/parser/src/sql.c
浏览文件 @
a0d3fa46
此差异已折叠。
点击以展开。
source/libs/parser/test/parserTests.cpp
浏览文件 @
a0d3fa46
...
...
@@ -75,7 +75,7 @@ void sqlCheck(const char* sql, bool valid) {
buf
.
len
=
128
;
buf
.
buf
=
msg
;
SSqlNode
*
pNode
=
(
SSqlNode
*
)
taosArrayGetP
(((
SArray
*
)
info1
.
list
),
0
);
SSqlNode
*
pNode
=
(
SSqlNode
*
)
taosArrayGetP
(((
SArray
*
)
info1
.
sub
.
node
),
0
);
int32_t
code
=
evaluateSqlNode
(
pNode
,
TSDB_TIME_PRECISION_NANO
,
&
buf
);
ASSERT_EQ
(
code
,
0
);
...
...
@@ -87,7 +87,7 @@ void sqlCheck(const char* sql, bool valid) {
SQueryStmtInfo
*
pQueryInfo
=
createQueryInfo
();
setTableMetaInfo
(
pQueryInfo
,
&
req
);
SSqlNode
*
pSqlNode
=
(
SSqlNode
*
)
taosArrayGetP
(
info1
.
list
,
0
);
SSqlNode
*
pSqlNode
=
(
SSqlNode
*
)
taosArrayGetP
(
info1
.
sub
.
node
,
0
);
ret
=
validateSqlNode
(
pSqlNode
,
pQueryInfo
,
&
buf
);
if
(
valid
)
{
...
...
@@ -112,7 +112,7 @@ TEST(testCase, validateAST_test) {
buf
.
len
=
128
;
buf
.
buf
=
msg
;
SSqlNode
*
pNode
=
(
SSqlNode
*
)
taosArrayGetP
(((
SArray
*
)
info1
.
list
),
0
);
SSqlNode
*
pNode
=
(
SSqlNode
*
)
taosArrayGetP
(((
SArray
*
)
info1
.
sub
.
node
),
0
);
int32_t
code
=
evaluateSqlNode
(
pNode
,
TSDB_TIME_PRECISION_NANO
,
&
buf
);
ASSERT_EQ
(
code
,
0
);
...
...
@@ -124,7 +124,7 @@ TEST(testCase, validateAST_test) {
SQueryStmtInfo
*
pQueryInfo
=
createQueryInfo
();
setTableMetaInfo
(
pQueryInfo
,
&
req
);
SSqlNode
*
pSqlNode
=
(
SSqlNode
*
)
taosArrayGetP
(
info1
.
list
,
0
);
SSqlNode
*
pSqlNode
=
(
SSqlNode
*
)
taosArrayGetP
(
info1
.
sub
.
node
,
0
);
ret
=
validateSqlNode
(
pSqlNode
,
pQueryInfo
,
&
buf
);
SArray
*
pExprList
=
pQueryInfo
->
exprList
[
0
];
...
...
@@ -170,7 +170,7 @@ TEST(testCase, function_Test) {
buf
.
len
=
128
;
buf
.
buf
=
msg
;
SSqlNode
*
pNode
=
(
SSqlNode
*
)
taosArrayGetP
(((
SArray
*
)
info1
.
list
),
0
);
SSqlNode
*
pNode
=
(
SSqlNode
*
)
taosArrayGetP
(((
SArray
*
)
info1
.
sub
.
node
),
0
);
int32_t
code
=
evaluateSqlNode
(
pNode
,
TSDB_TIME_PRECISION_NANO
,
&
buf
);
ASSERT_EQ
(
code
,
0
);
...
...
@@ -182,7 +182,7 @@ TEST(testCase, function_Test) {
SQueryStmtInfo
*
pQueryInfo
=
createQueryInfo
();
setTableMetaInfo
(
pQueryInfo
,
&
req
);
SSqlNode
*
pSqlNode
=
(
SSqlNode
*
)
taosArrayGetP
(
info1
.
list
,
0
);
SSqlNode
*
pSqlNode
=
(
SSqlNode
*
)
taosArrayGetP
(
info1
.
sub
.
node
,
0
);
ret
=
validateSqlNode
(
pSqlNode
,
pQueryInfo
,
&
buf
);
SArray
*
pExprList
=
pQueryInfo
->
exprList
[
0
];
...
...
@@ -216,7 +216,7 @@ TEST(testCase, function_Test2) {
buf
.
len
=
128
;
buf
.
buf
=
msg
;
SSqlNode
*
pNode
=
(
SSqlNode
*
)
taosArrayGetP
(((
SArray
*
)
info1
.
list
),
0
);
SSqlNode
*
pNode
=
(
SSqlNode
*
)
taosArrayGetP
(((
SArray
*
)
info1
.
sub
.
node
),
0
);
int32_t
code
=
evaluateSqlNode
(
pNode
,
TSDB_TIME_PRECISION_NANO
,
&
buf
);
ASSERT_EQ
(
code
,
0
);
...
...
@@ -228,7 +228,7 @@ TEST(testCase, function_Test2) {
SQueryStmtInfo
*
pQueryInfo
=
createQueryInfo
();
setTableMetaInfo
(
pQueryInfo
,
&
req
);
SSqlNode
*
pSqlNode
=
(
SSqlNode
*
)
taosArrayGetP
(
info1
.
list
,
0
);
SSqlNode
*
pSqlNode
=
(
SSqlNode
*
)
taosArrayGetP
(
info1
.
sub
.
node
,
0
);
ret
=
validateSqlNode
(
pSqlNode
,
pQueryInfo
,
&
buf
);
SArray
*
pExprList
=
pQueryInfo
->
exprList
[
0
];
...
...
@@ -262,7 +262,7 @@ TEST(testCase, function_Test3) {
buf
.
len
=
128
;
buf
.
buf
=
msg
;
SSqlNode
*
pNode
=
(
SSqlNode
*
)
taosArrayGetP
(((
SArray
*
)
info1
.
list
),
0
);
SSqlNode
*
pNode
=
(
SSqlNode
*
)
taosArrayGetP
(((
SArray
*
)
info1
.
sub
.
node
),
0
);
int32_t
code
=
evaluateSqlNode
(
pNode
,
TSDB_TIME_PRECISION_NANO
,
&
buf
);
ASSERT_EQ
(
code
,
0
);
...
...
@@ -274,7 +274,7 @@ TEST(testCase, function_Test3) {
SQueryStmtInfo
*
pQueryInfo
=
createQueryInfo
();
setTableMetaInfo
(
pQueryInfo
,
&
req
);
SSqlNode
*
pSqlNode
=
(
SSqlNode
*
)
taosArrayGetP
(
info1
.
list
,
0
);
SSqlNode
*
pSqlNode
=
(
SSqlNode
*
)
taosArrayGetP
(
info1
.
sub
.
node
,
0
);
ret
=
validateSqlNode
(
pSqlNode
,
pQueryInfo
,
&
buf
);
SArray
*
pExprList
=
pQueryInfo
->
exprList
[
0
];
...
...
@@ -307,7 +307,7 @@ TEST(testCase, function_Test4) {
buf
.
len
=
128
;
buf
.
buf
=
msg
;
SSqlNode
*
pNode
=
(
SSqlNode
*
)
taosArrayGetP
(((
SArray
*
)
info1
.
list
),
0
);
SSqlNode
*
pNode
=
(
SSqlNode
*
)
taosArrayGetP
(((
SArray
*
)
info1
.
sub
.
node
),
0
);
int32_t
code
=
evaluateSqlNode
(
pNode
,
TSDB_TIME_PRECISION_NANO
,
&
buf
);
ASSERT_EQ
(
code
,
0
);
...
...
@@ -319,7 +319,7 @@ TEST(testCase, function_Test4) {
SQueryStmtInfo
*
pQueryInfo
=
createQueryInfo
();
setTableMetaInfo
(
pQueryInfo
,
&
req
);
SSqlNode
*
pSqlNode
=
(
SSqlNode
*
)
taosArrayGetP
(
info1
.
list
,
0
);
SSqlNode
*
pSqlNode
=
(
SSqlNode
*
)
taosArrayGetP
(
info1
.
sub
.
node
,
0
);
ret
=
validateSqlNode
(
pSqlNode
,
pQueryInfo
,
&
buf
);
SArray
*
pExprList
=
pQueryInfo
->
exprList
[
0
];
...
...
@@ -355,7 +355,7 @@ TEST(testCase, function_Test5) {
buf
.
len
=
128
;
buf
.
buf
=
msg
;
SSqlNode
*
pNode
=
(
SSqlNode
*
)
taosArrayGetP
(((
SArray
*
)
info1
.
list
),
0
);
SSqlNode
*
pNode
=
(
SSqlNode
*
)
taosArrayGetP
(((
SArray
*
)
info1
.
sub
.
node
),
0
);
int32_t
code
=
evaluateSqlNode
(
pNode
,
TSDB_TIME_PRECISION_NANO
,
&
buf
);
ASSERT_EQ
(
code
,
0
);
...
...
@@ -367,7 +367,7 @@ TEST(testCase, function_Test5) {
SQueryStmtInfo
*
pQueryInfo
=
createQueryInfo
();
setTableMetaInfo
(
pQueryInfo
,
&
req
);
SSqlNode
*
pSqlNode
=
(
SSqlNode
*
)
taosArrayGetP
(
info1
.
list
,
0
);
SSqlNode
*
pSqlNode
=
(
SSqlNode
*
)
taosArrayGetP
(
info1
.
sub
.
node
,
0
);
ret
=
validateSqlNode
(
pSqlNode
,
pQueryInfo
,
&
buf
);
ASSERT_EQ
(
ret
,
0
);
...
...
@@ -410,6 +410,8 @@ TEST(testCase, function_Test10) {
sqlCheck
(
"select length(length(length(a))) from `t.1abc`"
,
true
);
sqlCheck
(
"select count() from `t.1abc`"
,
false
);
sqlCheck
(
"select block_dist() from `t.1abc`"
,
true
);
sqlCheck
(
"select block_dist(a) from `t.1abc`"
,
false
);
sqlCheck
(
"select count(*) from `t.1abc` interval(1s) group by a"
,
false
);
}
TEST
(
testCase
,
function_Test6
)
{
...
...
@@ -422,7 +424,7 @@ TEST(testCase, function_Test6) {
buf
.
len
=
128
;
buf
.
buf
=
msg
;
SSqlNode
*
pNode
=
(
SSqlNode
*
)
taosArrayGetP
(((
SArray
*
)
info1
.
list
),
0
);
SSqlNode
*
pNode
=
(
SSqlNode
*
)
taosArrayGetP
(((
SArray
*
)
info1
.
sub
.
node
),
0
);
int32_t
code
=
evaluateSqlNode
(
pNode
,
TSDB_TIME_PRECISION_NANO
,
&
buf
);
ASSERT_EQ
(
code
,
0
);
...
...
@@ -434,7 +436,7 @@ TEST(testCase, function_Test6) {
SQueryStmtInfo
*
pQueryInfo
=
createQueryInfo
();
setTableMetaInfo
(
pQueryInfo
,
&
req
);
SSqlNode
*
pSqlNode
=
(
SSqlNode
*
)
taosArrayGetP
(
info1
.
list
,
0
);
SSqlNode
*
pSqlNode
=
(
SSqlNode
*
)
taosArrayGetP
(
info1
.
sub
.
node
,
0
);
ret
=
validateSqlNode
(
pSqlNode
,
pQueryInfo
,
&
buf
);
ASSERT_EQ
(
ret
,
0
);
...
...
@@ -492,7 +494,7 @@ TEST(testCase, function_Test6) {
buf
.
len
=
128
;
buf
.
buf
=
msg
;
SSqlNode
*
pNode
=
(
SSqlNode
*
)
taosArrayGetP
(((
SArray
*
)
info1
.
list
),
0
);
SSqlNode
*
pNode
=
(
SSqlNode
*
)
taosArrayGetP
(((
SArray
*
)
info1
.
sub
.
node
),
0
);
int32_t
code
=
evaluateSqlNode
(
pNode
,
TSDB_TIME_PRECISION_NANO
,
&
buf
);
ASSERT_EQ
(
code
,
0
);
...
...
@@ -504,7 +506,7 @@ TEST(testCase, function_Test6) {
SQueryStmtInfo
*
pQueryInfo
=
createQueryInfo
();
setTableMetaInfo
(
pQueryInfo
,
&
req
);
SSqlNode
*
pSqlNode
=
(
SSqlNode
*
)
taosArrayGetP
(
info1
.
list
,
0
);
SSqlNode
*
pSqlNode
=
(
SSqlNode
*
)
taosArrayGetP
(
info1
.
sub
.
node
,
0
);
ret
=
validateSqlNode
(
pSqlNode
,
pQueryInfo
,
&
buf
);
ASSERT_EQ
(
ret
,
0
);
...
...
@@ -551,7 +553,7 @@ TEST(testCase, function_Test6) {
buf
.
len
=
128
;
buf
.
buf
=
msg
;
SSqlNode
*
pNode
=
(
SSqlNode
*
)
taosArrayGetP
(((
SArray
*
)
info1
.
list
),
0
);
SSqlNode
*
pNode
=
(
SSqlNode
*
)
taosArrayGetP
(((
SArray
*
)
info1
.
sub
.
node
),
0
);
int32_t
code
=
evaluateSqlNode
(
pNode
,
TSDB_TIME_PRECISION_NANO
,
&
buf
);
ASSERT_EQ
(
code
,
0
);
...
...
@@ -563,7 +565,7 @@ TEST(testCase, function_Test6) {
SQueryStmtInfo
*
pQueryInfo
=
createQueryInfo
();
setTableMetaInfo
(
pQueryInfo
,
&
req
);
SSqlNode
*
pSqlNode
=
(
SSqlNode
*
)
taosArrayGetP
(
info1
.
list
,
0
);
SSqlNode
*
pSqlNode
=
(
SSqlNode
*
)
taosArrayGetP
(
info1
.
sub
.
node
,
0
);
ret
=
validateSqlNode
(
pSqlNode
,
pQueryInfo
,
&
buf
);
ASSERT_EQ
(
ret
,
0
);
...
...
@@ -601,7 +603,7 @@ TEST(testCase, function_Test6) {
info1
=
doGenerateAST
(
"select sum(length(a)+length(b)) from `t.1abc` interval(10s, 1s)"
);
ASSERT_EQ
(
info1
.
valid
,
true
);
pNode
=
(
SSqlNode
*
)
taosArrayGetP
(((
SArray
*
)
info1
.
list
),
0
);
pNode
=
(
SSqlNode
*
)
taosArrayGetP
(((
SArray
*
)
info1
.
sub
.
node
),
0
);
code
=
evaluateSqlNode
(
pNode
,
TSDB_TIME_PRECISION_NANO
,
&
buf
);
ASSERT_EQ
(
code
,
0
);
...
...
@@ -612,7 +614,7 @@ TEST(testCase, function_Test6) {
pQueryInfo
=
createQueryInfo
();
setTableMetaInfo
(
pQueryInfo
,
&
req
);
pSqlNode
=
(
SSqlNode
*
)
taosArrayGetP
(
info1
.
list
,
0
);
pSqlNode
=
(
SSqlNode
*
)
taosArrayGetP
(
info1
.
sub
.
node
,
0
);
ret
=
validateSqlNode
(
pSqlNode
,
pQueryInfo
,
&
buf
);
ASSERT_EQ
(
ret
,
0
);
...
...
@@ -630,7 +632,7 @@ TEST(testCase, function_Test6) {
SSqlInfo
info1
=
doGenerateAST
(
"select count(k) from `t.1abc` interval(10s, 1s)"
);
ASSERT_EQ
(
info1
.
valid
,
true
);
SSqlNode
*
pNode
=
(
SSqlNode
*
)
taosArrayGetP
(((
SArray
*
)
info1
.
list
),
0
);
SSqlNode
*
pNode
=
(
SSqlNode
*
)
taosArrayGetP
(((
SArray
*
)
info1
.
sub
.
node
),
0
);
int32_t
code
=
evaluateSqlNode
(
pNode
,
TSDB_TIME_PRECISION_NANO
,
&
buf
);
ASSERT_EQ
(
code
,
0
);
...
...
@@ -642,7 +644,7 @@ TEST(testCase, function_Test6) {
SQueryStmtInfo
*
pQueryInfo
=
createQueryInfo
();
setTableMetaInfo
(
pQueryInfo
,
&
req
);
SSqlNode
*
pSqlNode
=
(
SSqlNode
*
)
taosArrayGetP
(
info1
.
list
,
0
);
SSqlNode
*
pSqlNode
=
(
SSqlNode
*
)
taosArrayGetP
(
info1
.
sub
.
node
,
0
);
ret
=
validateSqlNode
(
pSqlNode
,
pQueryInfo
,
&
buf
);
ASSERT_NE
(
ret
,
0
);
...
...
@@ -653,7 +655,7 @@ TEST(testCase, function_Test6) {
info1
=
doGenerateAST
(
"select top(a*b, ABC) from `t.1abc` interval(10s, 1s)"
);
ASSERT_EQ
(
info1
.
valid
,
true
);
pNode
=
(
SSqlNode
*
)
taosArrayGetP
(((
SArray
*
)
info1
.
list
),
0
);
pNode
=
(
SSqlNode
*
)
taosArrayGetP
(((
SArray
*
)
info1
.
sub
.
node
),
0
);
code
=
evaluateSqlNode
(
pNode
,
TSDB_TIME_PRECISION_NANO
,
&
buf
);
ASSERT_EQ
(
code
,
0
);
...
...
@@ -664,7 +666,7 @@ TEST(testCase, function_Test6) {
pQueryInfo
=
createQueryInfo
();
setTableMetaInfo
(
pQueryInfo
,
&
req
);
pSqlNode
=
(
SSqlNode
*
)
taosArrayGetP
(
info1
.
list
,
0
);
pSqlNode
=
(
SSqlNode
*
)
taosArrayGetP
(
info1
.
sub
.
node
,
0
);
ret
=
validateSqlNode
(
pSqlNode
,
pQueryInfo
,
&
buf
);
ASSERT_NE
(
ret
,
0
);
...
...
source/libs/parser/test/plannerTest.cpp
浏览文件 @
a0d3fa46
...
...
@@ -75,7 +75,7 @@ void generateLogicplan(const char* sql) {
buf
.
len
=
128
;
buf
.
buf
=
msg
;
SSqlNode
*
pNode
=
(
SSqlNode
*
)
taosArrayGetP
(((
SArray
*
)
info1
.
list
),
0
);
SSqlNode
*
pNode
=
(
SSqlNode
*
)
taosArrayGetP
(((
SArray
*
)
info1
.
sub
.
node
),
0
);
int32_t
code
=
evaluateSqlNode
(
pNode
,
TSDB_TIME_PRECISION_NANO
,
&
buf
);
ASSERT_EQ
(
code
,
0
);
...
...
@@ -87,7 +87,7 @@ void generateLogicplan(const char* sql) {
SQueryStmtInfo
*
pQueryInfo
=
createQueryInfo
();
setTableMetaInfo
(
pQueryInfo
,
&
req
);
SSqlNode
*
pSqlNode
=
(
SSqlNode
*
)
taosArrayGetP
(
info1
.
list
,
0
);
SSqlNode
*
pSqlNode
=
(
SSqlNode
*
)
taosArrayGetP
(
info1
.
sub
.
node
,
0
);
ret
=
validateSqlNode
(
pSqlNode
,
pQueryInfo
,
&
buf
);
ASSERT_EQ
(
ret
,
0
);
...
...
@@ -115,7 +115,7 @@ TEST(testCase, planner_test) {
buf
.
len
=
128
;
buf
.
buf
=
msg
;
SSqlNode
*
pNode
=
(
SSqlNode
*
)
taosArrayGetP
(((
SArray
*
)
info1
.
list
),
0
);
SSqlNode
*
pNode
=
(
SSqlNode
*
)
taosArrayGetP
(((
SArray
*
)
info1
.
sub
.
node
),
0
);
int32_t
code
=
evaluateSqlNode
(
pNode
,
TSDB_TIME_PRECISION_NANO
,
&
buf
);
ASSERT_EQ
(
code
,
0
);
...
...
@@ -127,7 +127,7 @@ TEST(testCase, planner_test) {
SQueryStmtInfo
*
pQueryInfo
=
createQueryInfo
();
setTableMetaInfo
(
pQueryInfo
,
&
req
);
SSqlNode
*
pSqlNode
=
(
SSqlNode
*
)
taosArrayGetP
(
info1
.
list
,
0
);
SSqlNode
*
pSqlNode
=
(
SSqlNode
*
)
taosArrayGetP
(
info1
.
sub
.
node
,
0
);
ret
=
validateSqlNode
(
pSqlNode
,
pQueryInfo
,
&
buf
);
ASSERT_EQ
(
ret
,
0
);
...
...
@@ -165,18 +165,18 @@ TEST(testCase, planner_test) {
}
TEST
(
testCase
,
displayPlan
)
{
//
generateLogicplan("select count(*) from `t.1abc`");
//
generateLogicplan("select count(*)+ 22 from `t.1abc`");
//
generateLogicplan("select count(*)+ 22 from `t.1abc` interval(1h, 20s) sliding(10m) limit 20,30");
//
generateLogicplan("select count(*) from `t.1abc` group by a");
//
generateLogicplan("select count(A+B) from `t.1abc` group by a");
//
generateLogicplan("select count(length(a)+b) from `t.1abc` group by a");
//
generateLogicplan("select count(*) from `t.1abc` interval(10s, 5s) sliding(7s)");
//
generateLogicplan("select count(*),sum(a),avg(b),min(a+b)+99 from `t.1abc`");
//
generateLogicplan("select count(*), min(a) + 99 from `t.1abc`");
//
generateLogicplan("select count(length(count(*) + 22)) from `t.1abc`");
//
generateLogicplan("select concat(concat(a,b), concat(a,b)) from `t.1abc` limit 20");
//
generateLogicplan("select count(*), first(a), last(b) from `t.1abc` state_window(a)");
generateLogicplan
(
"select count(*) from `t.1abc`"
);
generateLogicplan
(
"select count(*)+ 22 from `t.1abc`"
);
generateLogicplan
(
"select count(*)+ 22 from `t.1abc` interval(1h, 20s) sliding(10m) limit 20,30"
);
generateLogicplan
(
"select count(*) from `t.1abc` group by a"
);
generateLogicplan
(
"select count(A+B) from `t.1abc` group by a"
);
generateLogicplan
(
"select count(length(a)+b) from `t.1abc` group by a"
);
generateLogicplan
(
"select count(*) from `t.1abc` interval(10s, 5s) sliding(7s)"
);
generateLogicplan
(
"select count(*),sum(a),avg(b),min(a+b)+99 from `t.1abc`"
);
generateLogicplan
(
"select count(*), min(a) + 99 from `t.1abc`"
);
generateLogicplan
(
"select count(length(count(*) + 22)) from `t.1abc`"
);
generateLogicplan
(
"select concat(concat(a,b), concat(a,b)) from `t.1abc` limit 20"
);
generateLogicplan
(
"select count(*), first(a), last(b) from `t.1abc` state_window(a)"
);
generateLogicplan
(
"select count(*), first(a), last(b) from `t.1abc` session(ts, 20s)"
);
// order by + group by column + limit offset + fill
...
...
source/libs/parser/test/tokenizerTest.cpp
浏览文件 @
a0d3fa46
...
...
@@ -680,12 +680,12 @@ TEST(testCase, generateAST_test) {
msgBuf
.
buf
=
msg
;
msgBuf
.
len
=
128
;
SSqlNode
*
pNode
=
(
SSqlNode
*
)
taosArrayGetP
(((
SArray
*
)
info1
.
list
),
0
);
SSqlNode
*
pNode
=
(
SSqlNode
*
)
taosArrayGetP
(((
SArray
*
)
info1
.
sub
.
node
),
0
);
int32_t
code
=
evaluateSqlNode
(
pNode
,
TSDB_TIME_PRECISION_NANO
,
&
msgBuf
);
ASSERT_EQ
(
code
,
0
);
SSqlInfo
info2
=
doGenerateAST
(
"select * from abc where ts<now+2"
);
SSqlNode
*
pNode2
=
(
SSqlNode
*
)
taosArrayGetP
(((
SArray
*
)
info2
.
list
),
0
);
SSqlNode
*
pNode2
=
(
SSqlNode
*
)
taosArrayGetP
(((
SArray
*
)
info2
.
sub
.
node
),
0
);
code
=
evaluateSqlNode
(
pNode2
,
TSDB_TIME_PRECISION_MILLI
,
&
msgBuf
);
ASSERT_NE
(
code
,
0
);
...
...
@@ -703,7 +703,7 @@ TEST(testCase, evaluateAST_test) {
msgBuf
.
buf
=
msg
;
msgBuf
.
len
=
128
;
SSqlNode
*
pNode
=
(
SSqlNode
*
)
taosArrayGetP
(((
SArray
*
)
info1
.
list
),
0
);
SSqlNode
*
pNode
=
(
SSqlNode
*
)
taosArrayGetP
(((
SArray
*
)
info1
.
sub
.
node
),
0
);
int32_t
code
=
evaluateSqlNode
(
pNode
,
TSDB_TIME_PRECISION_NANO
,
&
msgBuf
);
ASSERT_EQ
(
code
,
0
);
destroySqlInfo
(
&
info1
);
...
...
src/client/src/tscSQLParser.c
浏览文件 @
a0d3fa46
...
...
@@ -912,7 +912,7 @@ int32_t tscValidateSqlInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) {
tscTrace
(
"0x%"
PRIx64
" start to parse the %dth subclause, total:%"
PRIzu
,
pSql
->
self
,
i
,
size
);
if
(
size
>
1
&&
pSqlNode
->
from
&&
pSqlNode
->
from
->
type
==
SQL_
NODE_FROM
_SUBQUERY
)
{
if
(
size
>
1
&&
pSqlNode
->
from
&&
pSqlNode
->
from
->
type
==
SQL_
FROM_NODE
_SUBQUERY
)
{
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg1
);
}
...
...
@@ -7981,11 +7981,11 @@ int32_t doCheckForStream(SSqlObj* pSql, SSqlInfo* pInfo) {
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg6
);
}
if
(
pFromInfo
->
type
==
SQL_
NODE_FROM
_SUBQUERY
){
if
(
pFromInfo
->
type
==
SQL_
FROM_NODE
_SUBQUERY
){
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg9
);
}
SRelElement
Pair
*
p1
=
taosArrayGet
(
pFromInfo
->
list
,
0
);
SRelElement
*
p1
=
taosArrayGet
(
pFromInfo
->
list
,
0
);
SStrToken
srcToken
=
{.
z
=
p1
->
tableName
.
z
,
.
n
=
p1
->
tableName
.
n
,
.
type
=
TK_STRING
};
if
(
tscValidateName
(
&
srcToken
)
!=
TSDB_CODE_SUCCESS
)
{
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg1
);
...
...
@@ -8415,10 +8415,10 @@ static int32_t getTableNameFromSqlNode(SSqlNode* pSqlNode, SArray* tableNameList
const
char
*
msg1
=
"invalid table name"
;
int32_t
numOfTables
=
(
int32_t
)
taosArrayGetSize
(
pSqlNode
->
from
->
list
);
assert
(
pSqlNode
->
from
->
type
==
SQL_
NODE_FROM_TABLELIST
);
assert
(
pSqlNode
->
from
->
type
==
SQL_
FROM_NODE_TABLES
);
for
(
int32_t
j
=
0
;
j
<
numOfTables
;
++
j
)
{
SRelElement
Pair
*
item
=
taosArrayGet
(
pSqlNode
->
from
->
list
,
j
);
SRelElement
*
item
=
taosArrayGet
(
pSqlNode
->
from
->
list
,
j
);
SStrToken
*
t
=
&
item
->
tableName
;
if
(
t
->
type
==
TK_INTEGER
||
t
->
type
==
TK_FLOAT
)
{
...
...
@@ -8446,12 +8446,12 @@ static int32_t getTableNameFromSubquery(SSqlNode* pSqlNode, SArray* tableNameLis
int32_t
numOfSub
=
(
int32_t
)
taosArrayGetSize
(
pSqlNode
->
from
->
list
);
for
(
int32_t
j
=
0
;
j
<
numOfSub
;
++
j
)
{
SRelElement
Pair
*
sub
=
taosArrayGet
(
pSqlNode
->
from
->
list
,
j
);
SRelElement
*
sub
=
taosArrayGet
(
pSqlNode
->
from
->
list
,
j
);
int32_t
num
=
(
int32_t
)
taosArrayGetSize
(
sub
->
pSubquery
);
for
(
int32_t
i
=
0
;
i
<
num
;
++
i
)
{
SSqlNode
*
p
=
taosArrayGetP
(
sub
->
pSubquery
,
i
);
if
(
p
->
from
->
type
==
SQL_
NODE_FROM_TABLELIST
)
{
if
(
p
->
from
->
type
==
SQL_
FROM_NODE_TABLES
)
{
int32_t
code
=
getTableNameFromSqlNode
(
p
,
tableNameList
,
msgBuf
,
pSql
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
return
code
;
...
...
@@ -8520,7 +8520,7 @@ int32_t loadAllTableMeta(SSqlObj* pSql, struct SSqlInfo* pInfo) {
}
// load the table meta in the from clause
if
(
pSqlNode
->
from
->
type
==
SQL_
NODE_FROM_TABLELIST
)
{
if
(
pSqlNode
->
from
->
type
==
SQL_
FROM_NODE_TABLES
)
{
code
=
getTableNameFromSqlNode
(
pSqlNode
,
tableNameList
,
tscGetErrorMsgPayload
(
pCmd
),
pSql
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
goto
_end
;
...
...
@@ -8678,7 +8678,7 @@ static int32_t doLoadAllTableMeta(SSqlObj* pSql, SQueryInfo* pQueryInfo, SSqlNod
tscAddEmptyMetaInfo
(
pQueryInfo
);
}
SRelElement
Pair
*
item
=
taosArrayGet
(
pSqlNode
->
from
->
list
,
i
);
SRelElement
*
item
=
taosArrayGet
(
pSqlNode
->
from
->
list
,
i
);
SStrToken
*
oriName
=
&
item
->
tableName
;
if
(
oriName
->
type
==
TK_INTEGER
||
oriName
->
type
==
TK_FLOAT
)
{
...
...
@@ -8786,7 +8786,7 @@ static STableMeta* extractTempTableMetaFromSubquery(SQueryInfo* pUpstream) {
}
static
int32_t
doValidateSubquery
(
SSqlNode
*
pSqlNode
,
int32_t
index
,
SSqlObj
*
pSql
,
SQueryInfo
*
pQueryInfo
,
char
*
msgBuf
)
{
SRelElement
Pair
*
subInfo
=
taosArrayGet
(
pSqlNode
->
from
->
list
,
index
);
SRelElement
*
subInfo
=
taosArrayGet
(
pSqlNode
->
from
->
list
,
index
);
// union all is not support currently
SSqlNode
*
p
=
taosArrayGetP
(
subInfo
->
pSubquery
,
0
);
...
...
@@ -8890,7 +8890,7 @@ int32_t validateSqlNode(SSqlObj* pSql, SSqlNode* pSqlNode, SQueryInfo* pQueryInf
return
doLocalQueryProcess
(
pCmd
,
pQueryInfo
,
pSqlNode
);
}
if
(
pSqlNode
->
from
->
type
==
SQL_
NODE_FROM
_SUBQUERY
)
{
if
(
pSqlNode
->
from
->
type
==
SQL_
FROM_NODE
_SUBQUERY
)
{
clearAllTableMetaInfo
(
pQueryInfo
,
false
,
pSql
->
self
);
pQueryInfo
->
numOfTables
=
0
;
...
...
@@ -8898,9 +8898,9 @@ int32_t validateSqlNode(SSqlObj* pSql, SSqlNode* pSqlNode, SQueryInfo* pQueryInf
int32_t
numOfSub
=
(
int32_t
)
taosArrayGetSize
(
pSqlNode
->
from
->
list
);
for
(
int32_t
i
=
0
;
i
<
numOfSub
;
++
i
)
{
// check if there is 3 level select
SRelElement
Pair
*
subInfo
=
taosArrayGet
(
pSqlNode
->
from
->
list
,
i
);
SRelElement
*
subInfo
=
taosArrayGet
(
pSqlNode
->
from
->
list
,
i
);
SSqlNode
*
p
=
taosArrayGetP
(
subInfo
->
pSubquery
,
0
);
if
(
p
->
from
->
type
==
SQL_
NODE_FROM
_SUBQUERY
)
{
if
(
p
->
from
->
type
==
SQL_
FROM_NODE
_SUBQUERY
)
{
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg9
);
}
...
...
@@ -9379,8 +9379,8 @@ bool hasNormalColumnFilter(SQueryInfo* pQueryInfo) {
void normalizeSqlNode(SSqlNode* pSqlNode, const char* dbName) {
assert(pSqlNode != NULL);
if (pSqlNode->from->type == SQL_
NODE_FROM_TABLELIST
) {
// SRelElement
Pair
*item = taosArrayGet(pSqlNode->from->list, 0);
if (pSqlNode->from->type == SQL_
FROM_NODE_TABLES
) {
// SRelElement *item = taosArrayGet(pSqlNode->from->list, 0);
// item->TableName.name;
}
...
...
src/query/inc/qSqlparser.h
浏览文件 @
a0d3fa46
...
...
@@ -40,8 +40,8 @@ enum SQL_NODE_TYPE {
};
enum
SQL_NODE_FROM_TYPE
{
SQL_
NODE_FROM
_SUBQUERY
=
1
,
SQL_
NODE_FROM_TABLELIST
=
2
,
SQL_
FROM_NODE
_SUBQUERY
=
1
,
SQL_
FROM_NODE_TABLES
=
2
,
};
enum
SQL_EXPR_FLAG
{
...
...
@@ -113,18 +113,18 @@ typedef struct SSqlNode {
struct
tSqlExpr
*
pHaving
;
// having clause [optional]
}
SSqlNode
;
typedef
struct
SRelElement
Pair
{
typedef
struct
SRelElement
{
union
{
SStrToken
tableName
;
SArray
*
pSubquery
;
};
SStrToken
aliasName
;
}
SRelElement
Pair
;
}
SRelElement
;
typedef
struct
SRelationInfo
{
int32_t
type
;
// nested query|table name list
SArray
*
list
;
// SArray<SRelElement
Pair
>
SArray
*
list
;
// SArray<SRelElement>
}
SRelationInfo
;
typedef
struct
SCreatedTableInfo
{
...
...
src/query/src/qSqlParser.c
浏览文件 @
a0d3fa46
...
...
@@ -556,11 +556,11 @@ SArray *tVariantListInsert(SArray *pList, tVariant *pVar, uint8_t sortOrder, int
SRelationInfo
*
setTableNameList
(
SRelationInfo
*
pRelationInfo
,
SStrToken
*
pName
,
SStrToken
*
pAlias
)
{
if
(
pRelationInfo
==
NULL
)
{
pRelationInfo
=
calloc
(
1
,
sizeof
(
SRelationInfo
));
pRelationInfo
->
list
=
taosArrayInit
(
4
,
sizeof
(
SRelElement
Pair
));
pRelationInfo
->
list
=
taosArrayInit
(
4
,
sizeof
(
SRelElement
));
}
pRelationInfo
->
type
=
SQL_
NODE_FROM_TABLELIST
;
SRelElement
Pair
p
=
{.
tableName
=
*
pName
};
pRelationInfo
->
type
=
SQL_
FROM_NODE_TABLES
;
SRelElement
p
=
{.
tableName
=
*
pName
};
if
(
pAlias
!=
NULL
)
{
p
.
aliasName
=
*
pAlias
;
}
else
{
...
...
@@ -576,7 +576,7 @@ void* destroyRelationInfo(SRelationInfo* pRelationInfo) {
return
NULL
;
}
if
(
pRelationInfo
->
type
==
SQL_
NODE_FROM_TABLELIST
)
{
if
(
pRelationInfo
->
type
==
SQL_
FROM_NODE_TABLES
)
{
taosArrayDestroy
(
pRelationInfo
->
list
);
}
else
{
size_t
size
=
taosArrayGetSize
(
pRelationInfo
->
list
);
...
...
@@ -594,12 +594,12 @@ void* destroyRelationInfo(SRelationInfo* pRelationInfo) {
SRelationInfo
*
addSubqueryElem
(
SRelationInfo
*
pRelationInfo
,
SArray
*
pSub
,
SStrToken
*
pAlias
)
{
if
(
pRelationInfo
==
NULL
)
{
pRelationInfo
=
calloc
(
1
,
sizeof
(
SRelationInfo
));
pRelationInfo
->
list
=
taosArrayInit
(
4
,
sizeof
(
SRelElement
Pair
));
pRelationInfo
->
list
=
taosArrayInit
(
4
,
sizeof
(
SRelElement
));
}
pRelationInfo
->
type
=
SQL_
NODE_FROM
_SUBQUERY
;
pRelationInfo
->
type
=
SQL_
FROM_NODE
_SUBQUERY
;
SRelElement
Pair
p
=
{.
pSubquery
=
pSub
};
SRelElement
p
=
{.
pSubquery
=
pSub
};
if
(
pAlias
!=
NULL
)
{
p
.
aliasName
=
*
pAlias
;
}
else
{
...
...
@@ -972,6 +972,7 @@ void SqlInfoDestroy(SSqlInfo *pInfo) {
SArray
*
setSubclause
(
SArray
*
pList
,
void
*
pSqlNode
)
{
if
(
pList
==
NULL
)
{
pList
=
taosArrayInit
(
1
,
POINTER_BYTES
);
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录