Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
624fb8b3
TDengine
项目概览
taosdata
/
TDengine
1 年多 前同步成功
通知
1185
Star
22016
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
624fb8b3
编写于
3月 17, 2021
作者:
D
dapan1121
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
support multiple tables join
上级
bbfde59f
变更
7
展开全部
隐藏空白更改
内联
并排
Showing
7 changed file
with
744 addition
and
146 deletion
+744
-146
src/client/inc/tscUtil.h
src/client/inc/tscUtil.h
+17
-0
src/client/inc/tsclient.h
src/client/inc/tsclient.h
+4
-4
src/client/src/tscSQLParser.c
src/client/src/tscSQLParser.c
+167
-42
src/client/src/tscSubquery.c
src/client/src/tscSubquery.c
+483
-91
src/client/src/tscUtil.c
src/client/src/tscUtil.c
+70
-8
src/inc/taosdef.h
src/inc/taosdef.h
+1
-1
src/query/src/qExecutor.c
src/query/src/qExecutor.c
+2
-0
未找到文件。
src/client/inc/tscUtil.h
浏览文件 @
624fb8b3
...
...
@@ -83,6 +83,22 @@ typedef struct SJoinSupporter {
SArray
*
pVgroupTables
;
}
SJoinSupporter
;
typedef
struct
SMergeCtx
{
SJoinSupporter
*
p
;
int32_t
idx
;
SArray
*
res
;
int8_t
compared
;
}
SMergeCtx
;
typedef
struct
SMergeTsCtx
{
SJoinSupporter
*
p
;
STSBuf
*
res
;
int64_t
numOfInput
;
int8_t
compared
;
}
SMergeTsCtx
;
typedef
struct
SVgroupTableInfo
{
SVgroupInfo
vgInfo
;
SArray
*
itemList
;
//SArray<STableIdInfo>
...
...
@@ -183,6 +199,7 @@ int32_t tscSqlExprCopy(SArray* dst, const SArray* src, uint64_t uid, bool deep
void
tscSqlExprInfoDestroy
(
SArray
*
pExprInfo
);
SColumn
*
tscColumnClone
(
const
SColumn
*
src
);
bool
tscColumnExists
(
SArray
*
pColumnList
,
SColumnIndex
*
pColIndex
);
SColumn
*
tscColumnListInsert
(
SArray
*
pColList
,
SColumnIndex
*
colIndex
);
SArray
*
tscColumnListClone
(
const
SArray
*
src
,
int16_t
tableIndex
);
void
tscColumnListDestroy
(
SArray
*
pColList
);
...
...
src/client/inc/tsclient.h
浏览文件 @
624fb8b3
...
...
@@ -142,15 +142,15 @@ typedef struct SCond {
}
SCond
;
typedef
struct
SJoinNode
{
char
tableName
[
TSDB_TABLE_FNAME_LEN
];
uint64_t
uid
;
int16_t
tagColId
;
SArray
*
tsJoin
;
SArray
*
tagJoin
;
}
SJoinNode
;
typedef
struct
SJoinInfo
{
bool
hasJoin
;
SJoinNode
left
;
SJoinNode
right
;
bool
hasJoin
;
SJoinNode
*
joinTables
[
TSDB_MAX_JOIN_TABLE_NUM
];
}
SJoinInfo
;
typedef
struct
STagCond
{
...
...
src/client/src/tscSQLParser.c
浏览文件 @
624fb8b3
...
...
@@ -3334,24 +3334,26 @@ static int32_t getColumnQueryCondInfo(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSq
}
}
static
int32_t
g
etJoinCondInfo
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
tSqlExpr
*
pExpr
)
{
const
char
*
msg1
=
"invalid join query condition"
;
const
char
*
msg
2
=
"invalid table name in join query
"
;
static
int32_t
checkAndS
etJoinCondInfo
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
tSqlExpr
*
pExpr
)
{
int32_t
code
=
0
;
const
char
*
msg
1
=
"timestamp required for join tables
"
;
const
char
*
msg3
=
"type of join columns must be identical"
;
const
char
*
msg4
=
"invalid column name in join condition"
;
const
char
*
msg5
=
"only support one join tag for each table"
;
if
(
pExpr
==
NULL
)
{
return
TSDB_CODE_SUCCESS
;
}
if
(
!
tSqlExprIsParentOfLeaf
(
pExpr
))
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg1
);
code
=
checkAndSetJoinCondInfo
(
pCmd
,
pQueryInfo
,
pExpr
->
pLeft
);
if
(
code
)
{
return
code
;
}
return
checkAndSetJoinCondInfo
(
pCmd
,
pQueryInfo
,
pExpr
->
pRight
);
}
STagCond
*
pTagCond
=
&
pQueryInfo
->
tagCond
;
SJoinNode
*
pLeft
=
&
pTagCond
->
joinInfo
.
left
;
SJoinNode
*
pRight
=
&
pTagCond
->
joinInfo
.
right
;
SColumnIndex
index
=
COLUMN_INDEX_INITIALIZER
;
if
(
getColumnIndexByName
(
pCmd
,
&
pExpr
->
pLeft
->
colInfo
,
pQueryInfo
,
&
index
)
!=
TSDB_CODE_SUCCESS
)
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg4
);
...
...
@@ -3360,13 +3362,28 @@ static int32_t getJoinCondInfo(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSqlExpr*
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
index
.
tableIndex
);
SSchema
*
pTagSchema1
=
tscGetTableColumnSchema
(
pTableMetaInfo
->
pTableMeta
,
index
.
columnIndex
);
pLeft
->
uid
=
pTableMetaInfo
->
pTableMeta
->
id
.
uid
;
pLeft
->
tagColId
=
pTagSchema1
->
colId
;
assert
(
index
.
tableIndex
>=
0
&&
index
.
tableIndex
<
TSDB_MAX_JOIN_TABLE_NUM
);
int32_t
code
=
tNameExtractFullName
(
&
pTableMetaInfo
->
name
,
pLeft
->
tableName
)
;
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg
2
);
SJoinNode
**
leftNode
=
&
pQueryInfo
->
tagCond
.
joinInfo
.
joinTables
[
index
.
tableIndex
]
;
if
(
*
leftNode
==
NULL
)
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg
1
);
}
(
*
leftNode
)
->
uid
=
pTableMetaInfo
->
pTableMeta
->
id
.
uid
;
(
*
leftNode
)
->
tagColId
=
pTagSchema1
->
colId
;
if
(
UTIL_TABLE_IS_SUPER_TABLE
(
pTableMetaInfo
))
{
index
.
columnIndex
=
index
.
columnIndex
-
tscGetNumOfColumns
(
pTableMetaInfo
->
pTableMeta
);
if
(
!
tscColumnExists
(
pTableMetaInfo
->
tagColList
,
&
index
))
{
tscColumnListInsert
(
pTableMetaInfo
->
tagColList
,
&
index
);
if
(
taosArrayGetSize
(
pTableMetaInfo
->
tagColList
)
>
1
)
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg5
);
}
}
}
int16_t
leftIdx
=
index
.
tableIndex
;
index
=
(
SColumnIndex
)
COLUMN_INDEX_INITIALIZER
;
if
(
getColumnIndexByName
(
pCmd
,
&
pExpr
->
pRight
->
colInfo
,
pQueryInfo
,
&
index
)
!=
TSDB_CODE_SUCCESS
)
{
...
...
@@ -3376,20 +3393,55 @@ static int32_t getJoinCondInfo(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSqlExpr*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
index
.
tableIndex
);
SSchema
*
pTagSchema2
=
tscGetTableColumnSchema
(
pTableMetaInfo
->
pTableMeta
,
index
.
columnIndex
);
pRight
->
uid
=
pTableMetaInfo
->
pTableMeta
->
id
.
uid
;
pRight
->
tagColId
=
pTagSchema2
->
colId
;
assert
(
index
.
tableIndex
>=
0
&&
index
.
tableIndex
<
TSDB_MAX_JOIN_TABLE_NUM
);
code
=
tNameExtractFullName
(
&
pTableMetaInfo
->
name
,
pRight
->
tableName
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg2
);
SJoinNode
**
rightNode
=
&
pQueryInfo
->
tagCond
.
joinInfo
.
joinTables
[
index
.
tableIndex
];
if
(
*
rightNode
==
NULL
)
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg1
);
}
(
*
rightNode
)
->
uid
=
pTableMetaInfo
->
pTableMeta
->
id
.
uid
;
(
*
rightNode
)
->
tagColId
=
pTagSchema2
->
colId
;
if
(
UTIL_TABLE_IS_SUPER_TABLE
(
pTableMetaInfo
))
{
index
.
columnIndex
=
index
.
columnIndex
-
tscGetNumOfColumns
(
pTableMetaInfo
->
pTableMeta
);
if
(
!
tscColumnExists
(
pTableMetaInfo
->
tagColList
,
&
index
))
{
tscColumnListInsert
(
pTableMetaInfo
->
tagColList
,
&
index
);
if
(
taosArrayGetSize
(
pTableMetaInfo
->
tagColList
)
>
1
)
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg5
);
}
}
}
int16_t
rightIdx
=
index
.
tableIndex
;
if
(
pTagSchema1
->
type
!=
pTagSchema2
->
type
)
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg3
);
}
pTagCond
->
joinInfo
.
hasJoin
=
true
;
if
((
*
leftNode
)
->
tagJoin
==
NULL
)
{
(
*
leftNode
)
->
tagJoin
=
taosArrayInit
(
2
,
sizeof
(
int16_t
));
}
if
((
*
rightNode
)
->
tagJoin
==
NULL
)
{
(
*
rightNode
)
->
tagJoin
=
taosArrayInit
(
2
,
sizeof
(
int16_t
));
}
taosArrayPush
((
*
leftNode
)
->
tagJoin
,
&
rightIdx
);
taosArrayPush
((
*
rightNode
)
->
tagJoin
,
&
leftIdx
);
pQueryInfo
->
tagCond
.
joinInfo
.
hasJoin
=
true
;
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
getJoinCondInfo
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
tSqlExpr
*
pExpr
)
{
if
(
pExpr
==
NULL
)
{
return
TSDB_CODE_SUCCESS
;
}
return
checkAndSetJoinCondInfo
(
pCmd
,
pQueryInfo
,
pExpr
);
}
static
int32_t
validateSQLExpr
(
SSqlCmd
*
pCmd
,
tSqlExpr
*
pExpr
,
SQueryInfo
*
pQueryInfo
,
SColumnList
*
pList
,
...
...
@@ -3655,7 +3707,6 @@ static int32_t handleExprInQueryCond(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSql
const
char
*
msg1
=
"table query cannot use tags filter"
;
const
char
*
msg2
=
"illegal column name"
;
const
char
*
msg3
=
"only one query time range allowed"
;
const
char
*
msg4
=
"only one join condition allowed"
;
const
char
*
msg5
=
"not support ordinary column join"
;
const
char
*
msg6
=
"only one query condition on tbname allowed"
;
const
char
*
msg7
=
"only in/like allowed in filter table name"
;
...
...
@@ -3686,6 +3737,45 @@ static int32_t handleExprInQueryCond(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSql
TSDB_QUERY_SET_TYPE
(
pQueryInfo
->
type
,
TSDB_QUERY_TYPE_JOIN_QUERY
);
pCondExpr
->
tsJoin
=
true
;
assert
(
index
.
tableIndex
>=
0
&&
index
.
tableIndex
<
TSDB_MAX_JOIN_TABLE_NUM
);
SJoinNode
**
leftNode
=
&
pQueryInfo
->
tagCond
.
joinInfo
.
joinTables
[
index
.
tableIndex
];
if
(
*
leftNode
==
NULL
)
{
*
leftNode
=
calloc
(
1
,
sizeof
(
SJoinNode
));
if
(
*
leftNode
==
NULL
)
{
return
TSDB_CODE_TSC_OUT_OF_MEMORY
;
}
}
int16_t
leftIdx
=
index
.
tableIndex
;
SColumnIndex
index
=
COLUMN_INDEX_INITIALIZER
;
if
(
getColumnIndexByName
(
pCmd
,
&
pRight
->
colInfo
,
pQueryInfo
,
&
index
)
!=
TSDB_CODE_SUCCESS
)
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg2
);
}
assert
(
index
.
tableIndex
>=
0
&&
index
.
tableIndex
<
TSDB_MAX_JOIN_TABLE_NUM
);
SJoinNode
**
rightNode
=
&
pQueryInfo
->
tagCond
.
joinInfo
.
joinTables
[
index
.
tableIndex
];
if
(
*
rightNode
==
NULL
)
{
*
rightNode
=
calloc
(
1
,
sizeof
(
SJoinNode
));
if
(
*
rightNode
==
NULL
)
{
return
TSDB_CODE_TSC_OUT_OF_MEMORY
;
}
}
int16_t
rightIdx
=
index
.
tableIndex
;
if
((
*
leftNode
)
->
tsJoin
==
NULL
)
{
(
*
leftNode
)
->
tsJoin
=
taosArrayInit
(
2
,
sizeof
(
int16_t
));
}
if
((
*
rightNode
)
->
tsJoin
==
NULL
)
{
(
*
rightNode
)
->
tsJoin
=
taosArrayInit
(
2
,
sizeof
(
int16_t
));
}
taosArrayPush
((
*
leftNode
)
->
tsJoin
,
&
rightIdx
);
taosArrayPush
((
*
rightNode
)
->
tsJoin
,
&
leftIdx
);
/*
* to release expression, e.g., m1.ts = m2.ts,
* since this expression is used to set the join query type
...
...
@@ -3743,10 +3833,6 @@ static int32_t handleExprInQueryCond(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSql
return
TSDB_CODE_TSC_INVALID_SQL
;
}
if
(
pCondExpr
->
pJoinExpr
!=
NULL
)
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg4
);
}
pQueryInfo
->
type
|=
TSDB_QUERY_TYPE_JOIN_QUERY
;
ret
=
setExprToCond
(
&
pCondExpr
->
pJoinExpr
,
*
pExpr
,
NULL
,
parentOptr
,
pQueryInfo
->
msg
);
*
pExpr
=
NULL
;
...
...
@@ -3974,7 +4060,8 @@ static bool validateFilterExpr(SQueryInfo* pQueryInfo) {
static
int32_t
getTimeRangeFromExpr
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
tSqlExpr
*
pExpr
)
{
const
char
*
msg0
=
"invalid timestamp"
;
const
char
*
msg1
=
"only one time stamp window allowed"
;
int32_t
code
=
0
;
if
(
pExpr
==
NULL
)
{
return
TSDB_CODE_SUCCESS
;
}
...
...
@@ -3984,8 +4071,11 @@ static int32_t getTimeRangeFromExpr(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSqlE
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg1
);
}
getTimeRangeFromExpr
(
pCmd
,
pQueryInfo
,
pExpr
->
pLeft
);
code
=
getTimeRangeFromExpr
(
pCmd
,
pQueryInfo
,
pExpr
->
pLeft
);
if
(
code
)
{
return
code
;
}
return
getTimeRangeFromExpr
(
pCmd
,
pQueryInfo
,
pExpr
->
pRight
);
}
else
{
SColumnIndex
index
=
COLUMN_INDEX_INITIALIZER
;
...
...
@@ -4066,6 +4156,7 @@ static void cleanQueryExpr(SCondExpr* pCondExpr) {
}
}
/*
static void doAddJoinTagsColumnsIntoTagList(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SCondExpr* pCondExpr) {
STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, 0);
if (QUERY_IS_JOIN_QUERY(pQueryInfo->type) && UTIL_TABLE_IS_SUPER_TABLE(pTableMetaInfo)) {
...
...
@@ -4088,6 +4179,7 @@ static void doAddJoinTagsColumnsIntoTagList(SSqlCmd* pCmd, SQueryInfo* pQueryInf
tscColumnListInsert(pTableMetaInfo->tagColList, &index);
}
}
*/
static
int32_t
validateTagCondExpr
(
SSqlCmd
*
pCmd
,
tExprNode
*
p
)
{
const
char
*
msg1
=
"invalid tag operator"
;
...
...
@@ -4223,6 +4315,32 @@ static int32_t getTagQueryCondExpr(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SCondE
return
ret
;
}
int32_t
validateJoinNodes
(
SQueryInfo
*
pQueryInfo
,
SSqlObj
*
pSql
)
{
const
char
*
msg1
=
"timestamp required for join tables"
;
const
char
*
msg2
=
"tag required for join stables"
;
for
(
int32_t
i
=
0
;
i
<
pQueryInfo
->
numOfTables
;
++
i
)
{
SJoinNode
*
node
=
pQueryInfo
->
tagCond
.
joinInfo
.
joinTables
[
i
];
if
(
node
==
NULL
||
node
->
tsJoin
==
NULL
||
taosArrayGetSize
(
node
->
tsJoin
)
<=
0
)
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
&
pSql
->
cmd
),
msg1
);
}
}
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
if
(
UTIL_TABLE_IS_SUPER_TABLE
(
pTableMetaInfo
))
{
for
(
int32_t
i
=
0
;
i
<
pQueryInfo
->
numOfTables
;
++
i
)
{
SJoinNode
*
node
=
pQueryInfo
->
tagCond
.
joinInfo
.
joinTables
[
i
];
if
(
node
==
NULL
||
node
->
tagJoin
==
NULL
||
taosArrayGetSize
(
node
->
tagJoin
)
<=
0
)
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
&
pSql
->
cmd
),
msg2
);
}
}
}
return
TSDB_CODE_SUCCESS
;
}
int32_t
parseWhereClause
(
SQueryInfo
*
pQueryInfo
,
tSqlExpr
**
pExpr
,
SSqlObj
*
pSql
)
{
if
(
pExpr
==
NULL
)
{
return
TSDB_CODE_SUCCESS
;
...
...
@@ -4243,7 +4361,7 @@ int32_t parseWhereClause(SQueryInfo* pQueryInfo, tSqlExpr** pExpr, SSqlObj* pSql
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
);
...
...
@@ -4253,32 +4371,32 @@ int32_t parseWhereClause(SQueryInfo* pQueryInfo, tSqlExpr** pExpr, SSqlObj* pSql
// 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
if
((
ret
=
getTimeRangeFromExpr
(
&
pSql
->
cmd
,
pQueryInfo
,
condExpr
.
pTimewindow
))
!=
TSDB_CODE_SUCCESS
)
{
return
ret
;
goto
PARSE_WHERE_EXIT
;
}
// 3. get the tag query condition
if
((
ret
=
getTagQueryCondExpr
(
&
pSql
->
cmd
,
pQueryInfo
,
&
condExpr
,
pExpr
))
!=
TSDB_CODE_SUCCESS
)
{
return
ret
;
goto
PARSE_WHERE_EXIT
;
}
// 4. get the table name query condition
if
((
ret
=
getTablenameCond
(
&
pSql
->
cmd
,
pQueryInfo
,
condExpr
.
pTableCond
,
&
sb
))
!=
TSDB_CODE_SUCCESS
)
{
return
ret
;
goto
PARSE_WHERE_EXIT
;
}
// 5. other column query condition
if
((
ret
=
getColumnQueryCondInfo
(
&
pSql
->
cmd
,
pQueryInfo
,
condExpr
.
pColumnCond
,
TK_AND
))
!=
TSDB_CODE_SUCCESS
)
{
return
ret
;
goto
PARSE_WHERE_EXIT
;
}
// 6. join condition
if
((
ret
=
getJoinCondInfo
(
&
pSql
->
cmd
,
pQueryInfo
,
condExpr
.
pJoinExpr
))
!=
TSDB_CODE_SUCCESS
)
{
return
ret
;
goto
PARSE_WHERE_EXIT
;
}
// 7. query condition for table name
...
...
@@ -4286,12 +4404,24 @@ int32_t parseWhereClause(SQueryInfo* pQueryInfo, tSqlExpr** pExpr, SSqlObj* pSql
ret
=
setTableCondForSTableQuery
(
&
pSql
->
cmd
,
pQueryInfo
,
getAccountId
(
pSql
),
condExpr
.
pTableCond
,
condExpr
.
tableCondIndex
,
&
sb
);
taosStringBuilderDestroy
(
&
sb
);
if
(
ret
)
{
goto
PARSE_WHERE_EXIT
;
}
if
(
!
validateFilterExpr
(
pQueryInfo
))
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
&
pSql
->
cmd
),
msg2
);
ret
=
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
&
pSql
->
cmd
),
msg2
);
goto
PARSE_WHERE_EXIT
;
}
doAddJoinTagsColumnsIntoTagList
(
&
pSql
->
cmd
,
pQueryInfo
,
&
condExpr
);
//doAddJoinTagsColumnsIntoTagList(&pSql->cmd, pQueryInfo, &condExpr);
if
(
pQueryInfo
->
tagCond
.
joinInfo
.
hasJoin
)
{
ret
=
validateJoinNodes
(
pQueryInfo
,
pSql
);
if
(
ret
)
{
goto
PARSE_WHERE_EXIT
;
}
}
PARSE_WHERE_EXIT:
cleanQueryExpr
(
&
condExpr
);
return
ret
;
...
...
@@ -6504,7 +6634,6 @@ int32_t doValidateSqlNode(SSqlObj* pSql, SQuerySqlNode* pQuerySqlNode, int32_t i
const
char
*
msg1
=
"point interpolation query needs timestamp"
;
const
char
*
msg2
=
"fill only available for interval query"
;
const
char
*
msg3
=
"start(end) time of query range required or time range too large"
;
const
char
*
msg4
=
"illegal number of tables in from clause"
;
const
char
*
msg5
=
"too many columns in selection clause"
;
const
char
*
msg6
=
"too many tables in from clause"
;
const
char
*
msg7
=
"invalid table alias name"
;
...
...
@@ -6541,15 +6670,11 @@ int32_t doValidateSqlNode(SSqlObj* pSql, SQuerySqlNode* pQuerySqlNode, int32_t i
size_t
fromSize
=
taosArrayGetSize
(
pQuerySqlNode
->
from
);
if
(
fromSize
>
TSDB_MAX_JOIN_TABLE_NUM
*
2
)
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg
4
);
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg
6
);
}
pQueryInfo
->
command
=
TSDB_SQL_SELECT
;
if
(
fromSize
>
4
)
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg6
);
}
// set all query tables, which are maybe more than one.
for
(
int32_t
i
=
0
;
i
<
fromSize
;
)
{
tVariantListItem
*
item
=
taosArrayGet
(
pQuerySqlNode
->
from
,
i
);
...
...
src/client/src/tscSubquery.c
浏览文件 @
624fb8b3
此差异已折叠。
点击以展开。
src/client/src/tscUtil.c
浏览文件 @
624fb8b3
...
...
@@ -1279,6 +1279,33 @@ int32_t tscSqlExprCopy(SArray* dst, const SArray* src, uint64_t uid, bool deepco
return
0
;
}
bool
tscColumnExists
(
SArray
*
pColumnList
,
SColumnIndex
*
pColIndex
)
{
// ignore the tbname columnIndex to be inserted into source list
if
(
pColIndex
->
columnIndex
<
0
)
{
return
false
;
}
size_t
numOfCols
=
taosArrayGetSize
(
pColumnList
);
int16_t
col
=
pColIndex
->
columnIndex
;
int32_t
i
=
0
;
while
(
i
<
numOfCols
)
{
SColumn
*
pCol
=
taosArrayGetP
(
pColumnList
,
i
);
if
((
pCol
->
colIndex
.
columnIndex
!=
col
)
||
(
pCol
->
colIndex
.
tableIndex
!=
pColIndex
->
tableIndex
))
{
continue
;
}
else
{
break
;
}
}
if
(
i
>=
numOfCols
||
numOfCols
==
0
)
{
return
false
;
}
return
true
;
}
SColumn
*
tscColumnListInsert
(
SArray
*
pColumnList
,
SColumnIndex
*
pColIndex
)
{
// ignore the tbname columnIndex to be inserted into source list
if
(
pColIndex
->
columnIndex
<
0
)
{
...
...
@@ -1583,7 +1610,20 @@ int32_t tscTagCondCopy(STagCond* dest, const STagCond* src) {
dest
->
tbnameCond
.
uid
=
src
->
tbnameCond
.
uid
;
dest
->
tbnameCond
.
len
=
src
->
tbnameCond
.
len
;
memcpy
(
&
dest
->
joinInfo
,
&
src
->
joinInfo
,
sizeof
(
SJoinInfo
));
dest
->
joinInfo
.
hasJoin
=
src
->
joinInfo
.
hasJoin
;
for
(
int32_t
i
=
0
;
i
<
TSDB_MAX_JOIN_TABLE_NUM
;
++
i
)
{
if
(
src
->
joinInfo
.
joinTables
[
i
])
{
dest
->
joinInfo
.
joinTables
[
i
]
=
calloc
(
1
,
sizeof
(
SJoinNode
));
memcpy
(
dest
->
joinInfo
.
joinTables
[
i
],
src
->
joinInfo
.
joinTables
[
i
],
sizeof
(
SJoinNode
));
dest
->
joinInfo
.
joinTables
[
i
]
->
tsJoin
=
taosArrayDup
(
src
->
joinInfo
.
joinTables
[
i
]
->
tsJoin
);
dest
->
joinInfo
.
joinTables
[
i
]
->
tagJoin
=
taosArrayDup
(
src
->
joinInfo
.
joinTables
[
i
]
->
tagJoin
);
}
}
dest
->
relType
=
src
->
relType
;
if
(
src
->
pCond
==
NULL
)
{
...
...
@@ -1629,6 +1669,23 @@ void tscTagCondRelease(STagCond* pTagCond) {
taosArrayDestroy
(
pTagCond
->
pCond
);
}
for
(
int32_t
i
=
0
;
i
<
TSDB_MAX_JOIN_TABLE_NUM
;
++
i
)
{
SJoinNode
*
node
=
pTagCond
->
joinInfo
.
joinTables
[
i
];
if
(
node
==
NULL
)
{
continue
;
}
if
(
node
->
tsJoin
!=
NULL
)
{
taosArrayDestroy
(
node
->
tsJoin
);
}
if
(
node
->
tagJoin
!=
NULL
)
{
taosArrayDestroy
(
node
->
tagJoin
);
}
tfree
(
node
);
}
memset
(
pTagCond
,
0
,
sizeof
(
STagCond
));
}
...
...
@@ -2318,16 +2375,21 @@ void tscDoQuery(SSqlObj* pSql) {
}
int16_t
tscGetJoinTagColIdByUid
(
STagCond
*
pTagCond
,
uint64_t
uid
)
{
if
(
pTagCond
->
joinInfo
.
left
.
uid
==
uid
)
{
return
pTagCond
->
joinInfo
.
left
.
tagColId
;
}
else
if
(
pTagCond
->
joinInfo
.
right
.
uid
==
uid
)
{
return
pTagCond
->
joinInfo
.
right
.
tagColId
;
}
else
{
assert
(
0
);
return
-
1
;
int32_t
i
=
0
;
while
(
i
<
TSDB_MAX_JOIN_TABLE_NUM
)
{
SJoinNode
*
node
=
pTagCond
->
joinInfo
.
joinTables
[
i
];
if
(
node
&&
node
->
uid
==
uid
)
{
return
node
->
tagColId
;
}
i
++
;
}
assert
(
0
);
return
-
1
;
}
int16_t
tscGetTagColIndexById
(
STableMeta
*
pTableMeta
,
int16_t
colId
)
{
int32_t
numOfTags
=
tscGetNumOfTags
(
pTableMeta
);
...
...
src/inc/taosdef.h
浏览文件 @
624fb8b3
...
...
@@ -317,7 +317,7 @@ do { \
#define TSDB_MAX_DB_QUORUM_OPTION 2
#define TSDB_DEFAULT_DB_QUORUM_OPTION 1
#define TSDB_MAX_JOIN_TABLE_NUM
5
#define TSDB_MAX_JOIN_TABLE_NUM
10
#define TSDB_MAX_UNION_CLAUSE 5
#define TSDB_MAX_BINARY_LEN (TSDB_MAX_BYTES_PER_ROW-TSDB_KEYSIZE)
...
...
src/query/src/qExecutor.c
浏览文件 @
624fb8b3
...
...
@@ -2393,6 +2393,8 @@ void filterRowsInDataBlock(SQueryRuntimeEnv* pRuntimeEnv, SSingleColumnFilterInf
break
;
}
}
pRuntimeEnv
->
pQuery
->
current
->
cur
=
tsBufGetCursor
(
pRuntimeEnv
->
pTsBuf
);
}
else
{
for
(
int32_t
i
=
0
;
i
<
numOfRows
;
++
i
)
{
bool
qualified
=
false
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录