Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
2dc55641
T
TDengine
项目概览
taosdata
/
TDengine
大约 2 年 前同步成功
通知
1192
Star
22018
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看板
未验证
提交
2dc55641
编写于
3月 11, 2022
作者:
S
shenglian-zhou
提交者:
GitHub
3月 11, 2022
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #10654 from taosdata/feature/TD-11216
[TD-11216]<feature>: Time window related keywords
上级
1167a8b2
4b85b8a3
变更
12
展开全部
隐藏空白更改
内联
并排
Showing
12 changed file
with
4448 addition
and
138 deletion
+4448
-138
src/client/src/tscSQLParser.c
src/client/src/tscSQLParser.c
+70
-16
src/client/src/tscServer.c
src/client/src/tscServer.c
+2
-2
src/client/src/tscUtil.c
src/client/src/tscUtil.c
+7
-1
src/common/inc/tname.h
src/common/inc/tname.h
+1
-0
src/common/src/tname.c
src/common/src/tname.c
+23
-0
src/inc/taosdef.h
src/inc/taosdef.h
+8
-1
src/query/inc/qAggMain.h
src/query/inc/qAggMain.h
+61
-56
src/query/src/qAggMain.c
src/query/src/qAggMain.c
+118
-46
src/query/src/qExecutor.c
src/query/src/qExecutor.c
+30
-16
src/util/inc/ttoken.h
src/util/inc/ttoken.h
+4
-0
tests/develop-test/2-query/time_window_keywords.py
tests/develop-test/2-query/time_window_keywords.py
+4123
-0
tests/parallel_test/cases.task
tests/parallel_test/cases.task
+1
-0
未找到文件。
src/client/src/tscSQLParser.c
浏览文件 @
2dc55641
...
@@ -51,7 +51,7 @@
...
@@ -51,7 +51,7 @@
#define COLUMN_INDEX_INITIAL_VAL (-2)
#define COLUMN_INDEX_INITIAL_VAL (-2)
#define COLUMN_INDEX_INITIALIZER \
#define COLUMN_INDEX_INITIALIZER \
{ COLUMN_INDEX_INITIAL_VAL, COLUMN_INDEX_INITIAL_VAL }
{ COLUMN_INDEX_INITIAL_VAL, COLUMN_INDEX_INITIAL_VAL }
#define COLUMN_INDEX_VALID
E(index) (((index).tableIndex >= 0) && ((index).columnIndex >= TSDB_TBNAME
_COLUMN_INDEX))
#define COLUMN_INDEX_VALID
(index) (((index).tableIndex >= 0) && ((index).columnIndex >= TSDB_MIN_VALID
_COLUMN_INDEX))
#define TBNAME_LIST_SEP ","
#define TBNAME_LIST_SEP ","
typedef
struct
SColumnList
{
// todo refactor
typedef
struct
SColumnList
{
// todo refactor
...
@@ -98,7 +98,7 @@ static int32_t parseIntervalOffset(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SStrTo
...
@@ -98,7 +98,7 @@ static int32_t parseIntervalOffset(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SStrTo
static
int32_t
parseSlidingClause
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
SStrToken
*
pSliding
);
static
int32_t
parseSlidingClause
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
SStrToken
*
pSliding
);
static
int32_t
validateStateWindowNode
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
SSqlNode
*
pSqlNode
,
bool
isStable
);
static
int32_t
validateStateWindowNode
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
SSqlNode
*
pSqlNode
,
bool
isStable
);
static
int32_t
addProjectionExprAndResultField
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
tSqlExprItem
*
pItem
,
bool
outerQuery
);
static
int32_t
addProjectionExprAndResultField
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
tSqlExprItem
*
pItem
,
bool
outerQuery
,
bool
timeWindowQuery
);
static
int32_t
validateWhereNode
(
SQueryInfo
*
pQueryInfo
,
tSqlExpr
**
pExpr
,
SSqlObj
*
pSql
,
bool
joinQuery
);
static
int32_t
validateWhereNode
(
SQueryInfo
*
pQueryInfo
,
tSqlExpr
**
pExpr
,
SSqlObj
*
pSql
,
bool
joinQuery
);
static
int32_t
validateFillNode
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
SSqlNode
*
pSqlNode
);
static
int32_t
validateFillNode
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
SSqlNode
*
pSqlNode
);
...
@@ -2262,7 +2262,7 @@ int32_t validateSelectNodeList(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SArray* pS
...
@@ -2262,7 +2262,7 @@ int32_t validateSelectNodeList(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SArray* pS
(
type
==
SQL_NODE_EXPR
&&
pItem
->
pNode
->
tokenId
==
TK_ARROW
))
{
(
type
==
SQL_NODE_EXPR
&&
pItem
->
pNode
->
tokenId
==
TK_ARROW
))
{
// use the dynamic array list to decide if the function is valid or not
// use the dynamic array list to decide if the function is valid or not
// select table_name1.field_name1, table_name2.field_name2 from table_name1, table_name2
// select table_name1.field_name1, table_name2.field_name2 from table_name1, table_name2
if
(
addProjectionExprAndResultField
(
pCmd
,
pQueryInfo
,
pItem
,
outerQuery
)
!=
TSDB_CODE_SUCCESS
)
{
if
(
addProjectionExprAndResultField
(
pCmd
,
pQueryInfo
,
pItem
,
outerQuery
,
timeWindowQuery
)
!=
TSDB_CODE_SUCCESS
)
{
return
TSDB_CODE_TSC_INVALID_OPERATION
;
return
TSDB_CODE_TSC_INVALID_OPERATION
;
}
}
}
else
{
}
else
{
...
@@ -2405,13 +2405,14 @@ static int32_t doAddProjectionExprAndResultFields(SQueryInfo* pQueryInfo, SColum
...
@@ -2405,13 +2405,14 @@ static int32_t doAddProjectionExprAndResultFields(SQueryInfo* pQueryInfo, SColum
return
numOfTotalColumns
;
return
numOfTotalColumns
;
}
}
int32_t
addProjectionExprAndResultField
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
tSqlExprItem
*
pItem
,
bool
outerQuery
)
{
int32_t
addProjectionExprAndResultField
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
tSqlExprItem
*
pItem
,
bool
outerQuery
,
bool
timeWindowQuery
)
{
const
char
*
msg1
=
"tag for normal table query is not allowed"
;
const
char
*
msg1
=
"tag for normal table query is not allowed"
;
const
char
*
msg2
=
"invalid column name"
;
const
char
*
msg2
=
"invalid column name"
;
const
char
*
msg3
=
"tbname
not allowed in outer query
"
;
const
char
*
msg3
=
"tbname
/_wstart/_wstop/_wduration in outer query does not match inner query result
"
;
const
char
*
msg4
=
"-> operate can only used in json type"
;
const
char
*
msg4
=
"-> operate can only used in json type"
;
const
char
*
msg5
=
"the right value of -> operation must be string"
;
const
char
*
msg5
=
"the right value of -> operation must be string"
;
const
char
*
msg6
=
"select name is too long than 64, please use alias name"
;
const
char
*
msg6
=
"select name is too long than 64, please use alias name"
;
const
char
*
msg7
=
"_wstart/_wstop/_wduraion can only be applied to time window query"
;
int32_t
startPos
=
(
int32_t
)
tscNumOfExprs
(
pQueryInfo
);
int32_t
startPos
=
(
int32_t
)
tscNumOfExprs
(
pQueryInfo
);
int32_t
tokenId
=
pItem
->
pNode
->
tokenId
;
int32_t
tokenId
=
pItem
->
pNode
->
tokenId
;
...
@@ -2477,7 +2478,8 @@ int32_t addProjectionExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, t
...
@@ -2477,7 +2478,8 @@ int32_t addProjectionExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, t
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg2
);
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg2
);
}
}
if
(
index
.
columnIndex
==
TSDB_TBNAME_COLUMN_INDEX
)
{
//for tbname and other pseudo columns
if
(
index
.
columnIndex
==
TSDB_TBNAME_COLUMN_INDEX
||
TSDB_COL_IS_TSWIN_COL
(
index
.
columnIndex
))
{
if
(
outerQuery
)
{
if
(
outerQuery
)
{
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
index
.
tableIndex
);
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
index
.
tableIndex
);
int32_t
numOfCols
=
tscGetNumOfColumns
(
pTableMetaInfo
->
pTableMeta
);
int32_t
numOfCols
=
tscGetNumOfColumns
(
pTableMetaInfo
->
pTableMeta
);
...
@@ -2485,7 +2487,14 @@ int32_t addProjectionExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, t
...
@@ -2485,7 +2487,14 @@ int32_t addProjectionExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, t
bool
existed
=
false
;
bool
existed
=
false
;
SSchema
*
pSchema
=
pTableMetaInfo
->
pTableMeta
->
schema
;
SSchema
*
pSchema
=
pTableMetaInfo
->
pTableMeta
->
schema
;
for
(
int32_t
i
=
0
;
i
<
numOfCols
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
numOfCols
;
++
i
)
{
if
(
strncasecmp
(
pSchema
[
i
].
name
,
TSQL_TBNAME_L
,
tListLen
(
pSchema
[
i
].
name
))
==
0
)
{
if
((
strncasecmp
(
pSchema
[
i
].
name
,
TSQL_TBNAME_L
,
tListLen
(
pSchema
[
i
].
name
))
==
0
&&
index
.
columnIndex
==
TSDB_TBNAME_COLUMN_INDEX
)
||
(
strncasecmp
(
pSchema
[
i
].
name
,
TSQL_TSWIN_START
,
tListLen
(
pSchema
[
i
].
name
))
==
0
&&
index
.
columnIndex
==
TSDB_TSWIN_START_COLUMN_INDEX
)
||
(
strncasecmp
(
pSchema
[
i
].
name
,
TSQL_TSWIN_STOP
,
tListLen
(
pSchema
[
i
].
name
))
==
0
&&
index
.
columnIndex
==
TSDB_TSWIN_STOP_COLUMN_INDEX
)
||
(
strncasecmp
(
pSchema
[
i
].
name
,
TSQL_TSWIN_DURATION
,
tListLen
(
pSchema
[
i
].
name
))
==
0
&&
index
.
columnIndex
==
TSDB_TSWIN_DURATION_COLUMN_INDEX
))
{
existed
=
true
;
existed
=
true
;
index
.
columnIndex
=
i
;
index
.
columnIndex
=
i
;
break
;
break
;
...
@@ -2504,13 +2513,26 @@ int32_t addProjectionExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, t
...
@@ -2504,13 +2513,26 @@ int32_t addProjectionExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, t
/*SExprInfo* pExpr = */
tscAddFuncInSelectClause
(
pQueryInfo
,
startPos
,
TSDB_FUNC_PRJ
,
&
index
,
&
colSchema
,
/*SExprInfo* pExpr = */
tscAddFuncInSelectClause
(
pQueryInfo
,
startPos
,
TSDB_FUNC_PRJ
,
&
index
,
&
colSchema
,
TSDB_COL_NORMAL
,
getNewResColId
(
pCmd
));
TSDB_COL_NORMAL
,
getNewResColId
(
pCmd
));
}
else
{
}
else
{
SSchema
colSchema
=
*
tGetTbnameColumnSchema
();
SSchema
colSchema
;
char
name
[
TSDB_COL_NAME_LEN
]
=
{
0
};
int16_t
functionId
,
colType
;
if
(
index
.
columnIndex
==
TSDB_TBNAME_COLUMN_INDEX
)
{
colSchema
=
*
tGetTbnameColumnSchema
();
functionId
=
TSDB_FUNC_TAGPRJ
;
colType
=
TSDB_COL_TAG
;
}
else
{
if
(
!
timeWindowQuery
)
{
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg7
);
}
colSchema
=
*
tGetTimeWindowColumnSchema
(
index
.
columnIndex
);
functionId
=
getTimeWindowFunctionID
(
index
.
columnIndex
);
colType
=
TSDB_COL_NORMAL
;
}
char
name
[
TSDB_COL_NAME_LEN
]
=
{
0
};
getColumnName
(
pItem
,
name
,
colSchema
.
name
,
sizeof
(
colSchema
.
name
)
-
1
);
getColumnName
(
pItem
,
name
,
colSchema
.
name
,
sizeof
(
colSchema
.
name
)
-
1
);
tstrncpy
(
colSchema
.
name
,
name
,
TSDB_COL_NAME_LEN
);
tstrncpy
(
colSchema
.
name
,
name
,
TSDB_COL_NAME_LEN
);
/*SExprInfo* pExpr = */
tscAddFuncInSelectClause
(
pQueryInfo
,
startPos
,
TSDB_FUNC_TAGPRJ
,
&
index
,
&
colSchema
,
/*SExprInfo* pExpr = */
tscAddFuncInSelectClause
(
pQueryInfo
,
startPos
,
functionId
,
&
index
,
&
colSchema
,
TSDB_COL_TAG
,
getNewResColId
(
pCmd
));
colType
,
getNewResColId
(
pCmd
));
}
}
pQueryInfo
->
type
|=
TSDB_QUERY_TYPE_PROJECTION_QUERY
;
pQueryInfo
->
type
|=
TSDB_QUERY_TYPE_PROJECTION_QUERY
;
}
else
{
}
else
{
...
@@ -3817,6 +3839,25 @@ static bool isTablenameToken(SStrToken* token) {
...
@@ -3817,6 +3839,25 @@ static bool isTablenameToken(SStrToken* token) {
return
(
tmpToken
.
n
==
strlen
(
TSQL_TBNAME_L
)
&&
strncasecmp
(
TSQL_TBNAME_L
,
tmpToken
.
z
,
tmpToken
.
n
)
==
0
);
return
(
tmpToken
.
n
==
strlen
(
TSQL_TBNAME_L
)
&&
strncasecmp
(
TSQL_TBNAME_L
,
tmpToken
.
z
,
tmpToken
.
n
)
==
0
);
}
}
static
bool
isTimeWindowToken
(
SStrToken
*
token
,
int16_t
*
columnIndex
)
{
SStrToken
tmpToken
=
*
token
;
SStrToken
tableToken
=
{
0
};
extractTableNameFromToken
(
&
tmpToken
,
&
tableToken
);
if
(
tmpToken
.
n
==
strlen
(
TSQL_TSWIN_START
)
&&
strncasecmp
(
TSQL_TSWIN_START
,
tmpToken
.
z
,
tmpToken
.
n
)
==
0
)
{
*
columnIndex
=
TSDB_TSWIN_START_COLUMN_INDEX
;
return
true
;
}
else
if
(
tmpToken
.
n
==
strlen
(
TSQL_TSWIN_STOP
)
&&
strncasecmp
(
TSQL_TSWIN_STOP
,
tmpToken
.
z
,
tmpToken
.
n
)
==
0
)
{
*
columnIndex
=
TSDB_TSWIN_STOP_COLUMN_INDEX
;
return
true
;
}
else
if
(
tmpToken
.
n
==
strlen
(
TSQL_TSWIN_DURATION
)
&&
strncasecmp
(
TSQL_TSWIN_DURATION
,
tmpToken
.
z
,
tmpToken
.
n
)
==
0
)
{
*
columnIndex
=
TSDB_TSWIN_DURATION_COLUMN_INDEX
;
return
true
;
}
else
{
return
false
;
}
}
static
int16_t
doGetColumnIndex
(
SQueryInfo
*
pQueryInfo
,
int32_t
index
,
SStrToken
*
pToken
)
{
static
int16_t
doGetColumnIndex
(
SQueryInfo
*
pQueryInfo
,
int32_t
index
,
SStrToken
*
pToken
)
{
STableMeta
*
pTableMeta
=
tscGetMetaInfo
(
pQueryInfo
,
index
)
->
pTableMeta
;
STableMeta
*
pTableMeta
=
tscGetMetaInfo
(
pQueryInfo
,
index
)
->
pTableMeta
;
...
@@ -3853,11 +3894,14 @@ int32_t doGetColumnIndexByName(SStrToken* pToken, SQueryInfo* pQueryInfo, SColum
...
@@ -3853,11 +3894,14 @@ int32_t doGetColumnIndexByName(SStrToken* pToken, SQueryInfo* pQueryInfo, SColum
return
TSDB_CODE_TSC_INVALID_OPERATION
;
return
TSDB_CODE_TSC_INVALID_OPERATION
;
}
}
int16_t
tsWinColumnIndex
;
if
(
isTablenameToken
(
pToken
))
{
if
(
isTablenameToken
(
pToken
))
{
pIndex
->
columnIndex
=
TSDB_TBNAME_COLUMN_INDEX
;
pIndex
->
columnIndex
=
TSDB_TBNAME_COLUMN_INDEX
;
}
else
if
(
strlen
(
DEFAULT_PRIMARY_TIMESTAMP_COL_NAME
)
==
pToken
->
n
&&
}
else
if
(
strlen
(
DEFAULT_PRIMARY_TIMESTAMP_COL_NAME
)
==
pToken
->
n
&&
strncasecmp
(
pToken
->
z
,
DEFAULT_PRIMARY_TIMESTAMP_COL_NAME
,
pToken
->
n
)
==
0
)
{
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
pIndex
->
columnIndex
=
PRIMARYKEY_TIMESTAMP_COL_INDEX
;
// just make runtime happy, need fix java test case InsertSpecialCharacterJniTest
}
else
if
(
isTimeWindowToken
(
pToken
,
&
tsWinColumnIndex
))
{
pIndex
->
columnIndex
=
tsWinColumnIndex
;
}
else
{
}
else
{
// not specify the table name, try to locate the table index by column name
// not specify the table name, try to locate the table index by column name
if
(
pIndex
->
tableIndex
==
COLUMN_INDEX_INITIAL_VAL
)
{
if
(
pIndex
->
tableIndex
==
COLUMN_INDEX_INITIAL_VAL
)
{
...
@@ -3885,7 +3929,7 @@ int32_t doGetColumnIndexByName(SStrToken* pToken, SQueryInfo* pQueryInfo, SColum
...
@@ -3885,7 +3929,7 @@ int32_t doGetColumnIndexByName(SStrToken* pToken, SQueryInfo* pQueryInfo, SColum
}
}
}
}
if
(
COLUMN_INDEX_VALID
E
(
*
pIndex
))
{
if
(
COLUMN_INDEX_VALID
(
*
pIndex
))
{
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
else
{
}
else
{
return
TSDB_CODE_TSC_INVALID_OPERATION
;
return
TSDB_CODE_TSC_INVALID_OPERATION
;
...
@@ -8211,6 +8255,7 @@ static int32_t checkUpdateTagPrjFunctions(SQueryInfo* pQueryInfo, char* msg) {
...
@@ -8211,6 +8255,7 @@ static int32_t checkUpdateTagPrjFunctions(SQueryInfo* pQueryInfo, char* msg) {
int16_t
numOfScalar
=
0
;
int16_t
numOfScalar
=
0
;
int16_t
numOfSelectivity
=
0
;
int16_t
numOfSelectivity
=
0
;
int16_t
numOfAggregation
=
0
;
int16_t
numOfAggregation
=
0
;
int16_t
numOfTimeWindow
=
0
;
size_t
numOfExprs
=
taosArrayGetSize
(
pQueryInfo
->
exprList
);
size_t
numOfExprs
=
taosArrayGetSize
(
pQueryInfo
->
exprList
);
for
(
int32_t
i
=
0
;
i
<
numOfExprs
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
numOfExprs
;
++
i
)
{
...
@@ -8232,6 +8277,10 @@ static int32_t checkUpdateTagPrjFunctions(SQueryInfo* pQueryInfo, char* msg) {
...
@@ -8232,6 +8277,10 @@ static int32_t checkUpdateTagPrjFunctions(SQueryInfo* pQueryInfo, char* msg) {
continue
;
continue
;
}
}
if
(
functionId
==
TSDB_FUNC_WSTART
||
functionId
==
TSDB_FUNC_WSTOP
||
functionId
==
TSDB_FUNC_WDURATION
)
{
numOfTimeWindow
++
;
}
if
(
functionId
<
0
)
{
if
(
functionId
<
0
)
{
SUdfInfo
*
pUdfInfo
=
taosArrayGet
(
pQueryInfo
->
pUdfInfo
,
-
1
*
functionId
-
1
);
SUdfInfo
*
pUdfInfo
=
taosArrayGet
(
pQueryInfo
->
pUdfInfo
,
-
1
*
functionId
-
1
);
if
(
pUdfInfo
->
funcType
==
TSDB_UDF_TYPE_AGGREGATE
)
{
if
(
pUdfInfo
->
funcType
==
TSDB_UDF_TYPE_AGGREGATE
)
{
...
@@ -8302,7 +8351,7 @@ static int32_t checkUpdateTagPrjFunctions(SQueryInfo* pQueryInfo, char* msg) {
...
@@ -8302,7 +8351,7 @@ static int32_t checkUpdateTagPrjFunctions(SQueryInfo* pQueryInfo, char* msg) {
}
}
}
else
{
}
else
{
if
((
pQueryInfo
->
type
&
TSDB_QUERY_TYPE_PROJECTION_QUERY
)
!=
0
)
{
if
((
pQueryInfo
->
type
&
TSDB_QUERY_TYPE_PROJECTION_QUERY
)
!=
0
)
{
if
(
numOfAggregation
>
0
&&
pQueryInfo
->
groupbyExpr
.
numOfGroupCols
==
0
)
{
if
(
numOfAggregation
>
0
&&
pQueryInfo
->
groupbyExpr
.
numOfGroupCols
==
0
&&
numOfTimeWindow
==
0
)
{
return
invalidOperationMsg
(
msg
,
msg2
);
return
invalidOperationMsg
(
msg
,
msg2
);
}
}
...
@@ -10155,11 +10204,14 @@ int32_t validateSqlNode(SSqlObj* pSql, SSqlNode* pSqlNode, SQueryInfo* pQueryInf
...
@@ -10155,11 +10204,14 @@ int32_t validateSqlNode(SSqlObj* pSql, SSqlNode* pSqlNode, SQueryInfo* pQueryInf
}
}
int32_t
timeWindowQuery
=
int32_t
timeWindowQuery
=
(
TPARSER_HAS_TOKEN
(
pSqlNode
->
interval
.
interval
)
||
TPARSER_HAS_TOKEN
(
pSqlNode
->
sessionVal
.
gap
));
(
TPARSER_HAS_TOKEN
(
pSqlNode
->
interval
.
interval
)
||
TSDB_QUERY_SET_TYPE
(
pQueryInfo
->
type
,
TSDB_QUERY_TYPE_TABLE_QUERY
);
TPARSER_HAS_TOKEN
(
pSqlNode
->
sessionVal
.
gap
)
||
TPARSER_HAS_TOKEN
(
pSqlNode
->
windowstateVal
.
col
));
int32_t
joinQuery
=
(
pSqlNode
->
from
!=
NULL
&&
taosArrayGetSize
(
pSqlNode
->
from
->
list
)
>
1
);
int32_t
joinQuery
=
(
pSqlNode
->
from
!=
NULL
&&
taosArrayGetSize
(
pSqlNode
->
from
->
list
)
>
1
);
TSDB_QUERY_SET_TYPE
(
pQueryInfo
->
type
,
TSDB_QUERY_TYPE_TABLE_QUERY
);
// parse the group by clause in the first place
// parse the group by clause in the first place
if
(
validateGroupbyNode
(
pQueryInfo
,
pSqlNode
->
pGroupby
,
pCmd
)
!=
TSDB_CODE_SUCCESS
)
{
if
(
validateGroupbyNode
(
pQueryInfo
,
pSqlNode
->
pGroupby
,
pCmd
)
!=
TSDB_CODE_SUCCESS
)
{
return
TSDB_CODE_TSC_INVALID_OPERATION
;
return
TSDB_CODE_TSC_INVALID_OPERATION
;
...
@@ -10317,7 +10369,9 @@ int32_t validateSqlNode(SSqlObj* pSql, SSqlNode* pSqlNode, SQueryInfo* pQueryInf
...
@@ -10317,7 +10369,9 @@ int32_t validateSqlNode(SSqlObj* pSql, SSqlNode* pSqlNode, SQueryInfo* pQueryInf
}
}
int32_t
timeWindowQuery
=
int32_t
timeWindowQuery
=
(
TPARSER_HAS_TOKEN
(
pSqlNode
->
interval
.
interval
)
||
TPARSER_HAS_TOKEN
(
pSqlNode
->
sessionVal
.
gap
));
(
TPARSER_HAS_TOKEN
(
pSqlNode
->
interval
.
interval
)
||
TPARSER_HAS_TOKEN
(
pSqlNode
->
sessionVal
.
gap
)
||
TPARSER_HAS_TOKEN
(
pSqlNode
->
windowstateVal
.
col
));
if
(
validateSelectNodeList
(
pCmd
,
pQueryInfo
,
pSqlNode
->
pSelNodeList
,
joinQuery
,
timeWindowQuery
,
false
)
!=
if
(
validateSelectNodeList
(
pCmd
,
pQueryInfo
,
pSqlNode
->
pSelNodeList
,
joinQuery
,
timeWindowQuery
,
false
)
!=
TSDB_CODE_SUCCESS
)
{
TSDB_CODE_SUCCESS
)
{
...
...
src/client/src/tscServer.c
浏览文件 @
2dc55641
...
@@ -951,7 +951,7 @@ int tscBuildQueryMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
...
@@ -951,7 +951,7 @@ int tscBuildQueryMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
pQueryMsg
->
window
.
ekey
=
htobe64
(
query
.
window
.
ekey
);
pQueryMsg
->
window
.
ekey
=
htobe64
(
query
.
window
.
ekey
);
pQueryMsg
->
range
.
skey
=
htobe64
(
query
.
range
.
skey
);
pQueryMsg
->
range
.
skey
=
htobe64
(
query
.
range
.
skey
);
pQueryMsg
->
range
.
ekey
=
htobe64
(
query
.
range
.
ekey
);
pQueryMsg
->
range
.
ekey
=
htobe64
(
query
.
range
.
ekey
);
pQueryMsg
->
order
=
htons
(
query
.
order
.
order
);
pQueryMsg
->
order
=
htons
(
query
.
order
.
order
);
pQueryMsg
->
orderColId
=
htons
(
query
.
order
.
orderColId
);
pQueryMsg
->
orderColId
=
htons
(
query
.
order
.
orderColId
);
pQueryMsg
->
fillType
=
htons
(
query
.
fillType
);
pQueryMsg
->
fillType
=
htons
(
query
.
fillType
);
...
@@ -990,7 +990,7 @@ int tscBuildQueryMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
...
@@ -990,7 +990,7 @@ int tscBuildQueryMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
pQueryMsg
->
numOfGroupCols
=
htons
(
pQueryInfo
->
groupbyExpr
.
numOfGroupCols
);
pQueryMsg
->
numOfGroupCols
=
htons
(
pQueryInfo
->
groupbyExpr
.
numOfGroupCols
);
pQueryMsg
->
queryType
=
htonl
(
pQueryInfo
->
type
);
pQueryMsg
->
queryType
=
htonl
(
pQueryInfo
->
type
);
pQueryMsg
->
prevResultLen
=
htonl
(
pQueryInfo
->
bufLen
);
pQueryMsg
->
prevResultLen
=
htonl
(
pQueryInfo
->
bufLen
);
// set column list ids
// set column list ids
size_t
numOfCols
=
taosArrayGetSize
(
pQueryInfo
->
colList
);
size_t
numOfCols
=
taosArrayGetSize
(
pQueryInfo
->
colList
);
char
*
pMsg
=
(
char
*
)(
pQueryMsg
->
tableCols
)
+
numOfCols
*
sizeof
(
SColumnInfo
);
char
*
pMsg
=
(
char
*
)(
pQueryMsg
->
tableCols
)
+
numOfCols
*
sizeof
(
SColumnInfo
);
...
...
src/client/src/tscUtil.c
浏览文件 @
2dc55641
...
@@ -2551,6 +2551,11 @@ SExprInfo* tscExprCreate(STableMetaInfo* pTableMetaInfo, int16_t functionId, SCo
...
@@ -2551,6 +2551,11 @@ SExprInfo* tscExprCreate(STableMetaInfo* pTableMetaInfo, int16_t functionId, SCo
p
->
colInfo
.
colId
=
TSDB_TBNAME_COLUMN_INDEX
;
p
->
colInfo
.
colId
=
TSDB_TBNAME_COLUMN_INDEX
;
p
->
colBytes
=
s
->
bytes
;
p
->
colBytes
=
s
->
bytes
;
p
->
colType
=
s
->
type
;
p
->
colType
=
s
->
type
;
}
else
if
(
TSDB_COL_IS_TSWIN_COL
(
pColIndex
->
columnIndex
))
{
SSchema
*
s
=
tGetTimeWindowColumnSchema
(
pColIndex
->
columnIndex
);
p
->
colInfo
.
colId
=
s
->
colId
;
p
->
colBytes
=
s
->
bytes
;
p
->
colType
=
s
->
type
;
}
else
if
(
pColIndex
->
columnIndex
<=
TSDB_UD_COLUMN_INDEX
)
{
}
else
if
(
pColIndex
->
columnIndex
<=
TSDB_UD_COLUMN_INDEX
)
{
p
->
colInfo
.
colId
=
pColIndex
->
columnIndex
;
p
->
colInfo
.
colId
=
pColIndex
->
columnIndex
;
p
->
colBytes
=
size
;
p
->
colBytes
=
size
;
...
@@ -3073,7 +3078,8 @@ bool tscValidateColumnId(STableMetaInfo* pTableMetaInfo, int32_t colId) {
...
@@ -3073,7 +3078,8 @@ bool tscValidateColumnId(STableMetaInfo* pTableMetaInfo, int32_t colId) {
return
false
;
return
false
;
}
}
if
(
colId
==
TSDB_TBNAME_COLUMN_INDEX
||
colId
<=
TSDB_UD_COLUMN_INDEX
)
{
if
(
colId
==
TSDB_TBNAME_COLUMN_INDEX
||
TSDB_COL_IS_TSWIN_COL
(
colId
)
||
colId
<=
TSDB_UD_COLUMN_INDEX
)
{
return
true
;
return
true
;
}
}
...
...
src/common/inc/tname.h
浏览文件 @
2dc55641
...
@@ -103,6 +103,7 @@ bool tscValidateTableNameLength(size_t len);
...
@@ -103,6 +103,7 @@ bool tscValidateTableNameLength(size_t len);
SColumnFilterInfo
*
tFilterInfoDup
(
const
SColumnFilterInfo
*
src
,
int32_t
numOfFilters
);
SColumnFilterInfo
*
tFilterInfoDup
(
const
SColumnFilterInfo
*
src
,
int32_t
numOfFilters
);
SSchema
*
tGetTbnameColumnSchema
();
SSchema
*
tGetTbnameColumnSchema
();
SSchema
*
tGetTimeWindowColumnSchema
(
int16_t
columnIndex
);
/**
/**
* check if the schema is valid or not, including following aspects:
* check if the schema is valid or not, including following aspects:
...
...
src/common/src/tname.c
浏览文件 @
2dc55641
...
@@ -244,6 +244,29 @@ static struct SSchema _s = {
...
@@ -244,6 +244,29 @@ static struct SSchema _s = {
.
name
=
TSQL_TBNAME_L
,
.
name
=
TSQL_TBNAME_L
,
};
};
static
struct
SSchema
_tswin
[
3
]
=
{
{
TSDB_DATA_TYPE_TIMESTAMP
,
TSQL_TSWIN_START
,
TSDB_TSWIN_START_COLUMN_INDEX
,
LONG_BYTES
},
{
TSDB_DATA_TYPE_TIMESTAMP
,
TSQL_TSWIN_STOP
,
TSDB_TSWIN_STOP_COLUMN_INDEX
,
LONG_BYTES
},
{
TSDB_DATA_TYPE_BIGINT
,
TSQL_TSWIN_DURATION
,
TSDB_TSWIN_DURATION_COLUMN_INDEX
,
LONG_BYTES
},
};
SSchema
*
tGetTimeWindowColumnSchema
(
int16_t
columnIndex
)
{
switch
(
columnIndex
)
{
case
TSDB_TSWIN_START_COLUMN_INDEX
:
{
return
&
_tswin
[
0
];
}
case
TSDB_TSWIN_STOP_COLUMN_INDEX
:
{
return
&
_tswin
[
1
];
}
case
TSDB_TSWIN_DURATION_COLUMN_INDEX
:
{
return
&
_tswin
[
2
];
}
default:
{
return
NULL
;
}
}
}
SSchema
*
tGetTbnameColumnSchema
()
{
SSchema
*
tGetTbnameColumnSchema
()
{
return
&
_s
;
return
&
_s
;
}
}
...
...
src/inc/taosdef.h
浏览文件 @
2dc55641
...
@@ -276,7 +276,14 @@ do { \
...
@@ -276,7 +276,14 @@ do { \
#define TSDB_MAX_REPLICA 5
#define TSDB_MAX_REPLICA 5
#define TSDB_TBNAME_COLUMN_INDEX (-1)
#define TSDB_TBNAME_COLUMN_INDEX (-1)
#define TSDB_TSWIN_START_COLUMN_INDEX (-2)
#define TSDB_TSWIN_STOP_COLUMN_INDEX (-3)
#define TSDB_TSWIN_DURATION_COLUMN_INDEX (-4)
#define TSDB_MIN_VALID_COLUMN_INDEX (-4)
#define TSDB_COL_IS_TSWIN_COL(_i) ((_i) <= TSDB_TSWIN_START_COLUMN_INDEX && (_i) >= TSDB_TSWIN_DURATION_COLUMN_INDEX)
#define TSDB_UD_COLUMN_INDEX (-1000)
#define TSDB_UD_COLUMN_INDEX (-1000)
#define TSDB_RES_COL_ID (-5000)
#define TSDB_RES_COL_ID (-5000)
...
...
src/query/inc/qAggMain.h
浏览文件 @
2dc55641
...
@@ -30,61 +30,64 @@ extern "C" {
...
@@ -30,61 +30,64 @@ extern "C" {
#include "tsdb.h"
#include "tsdb.h"
#include "qUdf.h"
#include "qUdf.h"
#define TSDB_FUNC_INVALID_ID -1
#define TSDB_FUNC_INVALID_ID -1
#define TSDB_FUNC_COUNT 0
#define TSDB_FUNC_COUNT 0
#define TSDB_FUNC_SUM 1
#define TSDB_FUNC_SUM 1
#define TSDB_FUNC_AVG 2
#define TSDB_FUNC_AVG 2
#define TSDB_FUNC_MIN 3
#define TSDB_FUNC_MIN 3
#define TSDB_FUNC_MAX 4
#define TSDB_FUNC_MAX 4
#define TSDB_FUNC_STDDEV 5
#define TSDB_FUNC_STDDEV 5
#define TSDB_FUNC_PERCT 6
#define TSDB_FUNC_PERCT 6
#define TSDB_FUNC_APERCT 7
#define TSDB_FUNC_APERCT 7
#define TSDB_FUNC_FIRST 8
#define TSDB_FUNC_FIRST 8
#define TSDB_FUNC_LAST 9
#define TSDB_FUNC_LAST 9
#define TSDB_FUNC_LAST_ROW 10
#define TSDB_FUNC_LAST_ROW 10
#define TSDB_FUNC_TOP 11
#define TSDB_FUNC_TOP 11
#define TSDB_FUNC_BOTTOM 12
#define TSDB_FUNC_BOTTOM 12
#define TSDB_FUNC_SPREAD 13
#define TSDB_FUNC_SPREAD 13
#define TSDB_FUNC_TWA 14
#define TSDB_FUNC_TWA 14
#define TSDB_FUNC_LEASTSQR 15
#define TSDB_FUNC_LEASTSQR 15
#define TSDB_FUNC_TS 16
#define TSDB_FUNC_TS 16
#define TSDB_FUNC_TS_DUMMY 17
#define TSDB_FUNC_TS_DUMMY 17
#define TSDB_FUNC_TAG_DUMMY 18
#define TSDB_FUNC_TAG_DUMMY 18
#define TSDB_FUNC_TS_COMP 19
#define TSDB_FUNC_TS_COMP 19
#define TSDB_FUNC_TAG 20
#define TSDB_FUNC_TAG 20
#define TSDB_FUNC_PRJ 21
#define TSDB_FUNC_PRJ 21
#define TSDB_FUNC_TAGPRJ 22
#define TSDB_FUNC_TAGPRJ 22
#define TSDB_FUNC_SCALAR_EXPR 23
#define TSDB_FUNC_SCALAR_EXPR 23
#define TSDB_FUNC_DIFF 24
#define TSDB_FUNC_DIFF 24
#define TSDB_FUNC_FIRST_DST 25
#define TSDB_FUNC_FIRST_DST 25
#define TSDB_FUNC_LAST_DST 26
#define TSDB_FUNC_LAST_DST 26
#define TSDB_FUNC_STDDEV_DST 27
#define TSDB_FUNC_STDDEV_DST 27
#define TSDB_FUNC_INTERP 28
#define TSDB_FUNC_INTERP 28
#define TSDB_FUNC_RATE 29
#define TSDB_FUNC_RATE 29
#define TSDB_FUNC_IRATE 30
#define TSDB_FUNC_IRATE 30
#define TSDB_FUNC_TID_TAG 31
#define TSDB_FUNC_TID_TAG 31
#define TSDB_FUNC_DERIVATIVE 32
#define TSDB_FUNC_DERIVATIVE 32
#define TSDB_FUNC_CSUM 33
#define TSDB_FUNC_CSUM 33
#define TSDB_FUNC_MAVG 34
#define TSDB_FUNC_MAVG 34
#define TSDB_FUNC_SAMPLE 35
#define TSDB_FUNC_SAMPLE 35
#define TSDB_FUNC_BLKINFO 36
#define TSDB_FUNC_BLKINFO 36
#define TSDB_FUNC_ELAPSED 37
#define TSDB_FUNC_ELAPSED 37
#define TSDB_FUNC_HISTOGRAM 38
#define TSDB_FUNC_HISTOGRAM 38
#define TSDB_FUNC_UNIQUE 39
#define TSDB_FUNC_UNIQUE 39
#define TSDB_FUNC_MODE 40
#define TSDB_FUNC_MODE 40
#define TSDB_FUNC_TAIL 41
#define TSDB_FUNC_TAIL 41
#define TSDB_FUNC_STATE_COUNT 42
#define TSDB_FUNC_STATE_COUNT 42
#define TSDB_FUNC_STATE_DURATION 43
#define TSDB_FUNC_STATE_DURATION 43
#define TSDB_FUNC_WSTART 44
#define TSDB_FUNC_MAX_NUM 44
#define TSDB_FUNC_WSTOP 45
#define TSDB_FUNC_WDURATION 46
#define TSDB_FUNC_MAX_NUM 47
#define TSDB_FUNCSTATE_SO 0x1u // single output
#define TSDB_FUNCSTATE_SO 0x1u // single output
#define TSDB_FUNCSTATE_MO 0x2u // dynamic number of output, not multinumber of output e.g., TOP/BOTTOM
#define TSDB_FUNCSTATE_MO 0x2u // dynamic number of output, not multinumber of output e.g., TOP/BOTTOM
...
@@ -230,10 +233,12 @@ typedef struct SAggFunctionInfo {
...
@@ -230,10 +233,12 @@ typedef struct SAggFunctionInfo {
int32_t
getResultDataInfo
(
int32_t
dataType
,
int32_t
dataBytes
,
int32_t
functionId
,
int32_t
param
,
int16_t
*
type
,
int32_t
getResultDataInfo
(
int32_t
dataType
,
int32_t
dataBytes
,
int32_t
functionId
,
int32_t
param
,
int16_t
*
type
,
int32_t
*
len
,
int32_t
*
interBytes
,
int16_t
extLength
,
bool
isSuperTable
,
SUdfInfo
*
pUdfInfo
);
int32_t
*
len
,
int32_t
*
interBytes
,
int16_t
extLength
,
bool
isSuperTable
,
SUdfInfo
*
pUdfInfo
);
int
32_t
isValidFunction
(
const
char
*
name
,
int32_t
len
);
int
16_t
getTimeWindowFunctionID
(
int16_t
colIndex
);
int32_t
isValidFunction
(
const
char
*
name
,
int32_t
len
);
bool
isValidStateOper
(
char
*
oper
,
int32_t
len
);
bool
isValidStateOper
(
char
*
oper
,
int32_t
len
);
#define IS_STREAM_QUERY_VALID(x) (((x)&TSDB_FUNCSTATE_STREAM) != 0)
#define IS_STREAM_QUERY_VALID(x) (((x)&TSDB_FUNCSTATE_STREAM) != 0)
#define IS_MULTIOUTPUT(x) (((x)&TSDB_FUNCSTATE_MO) != 0)
#define IS_MULTIOUTPUT(x) (((x)&TSDB_FUNCSTATE_MO) != 0)
#define IS_SINGLEOUTPUT(x) (((x)&TSDB_FUNCSTATE_SO) != 0)
#define IS_SINGLEOUTPUT(x) (((x)&TSDB_FUNCSTATE_SO) != 0)
...
...
src/query/src/qAggMain.c
浏览文件 @
2dc55641
...
@@ -5712,6 +5712,7 @@ static void tail_func_finalizer(SQLFunctionCtx *pCtx) {
...
@@ -5712,6 +5712,7 @@ static void tail_func_finalizer(SQLFunctionCtx *pCtx) {
doFinalizer
(
pCtx
);
doFinalizer
(
pCtx
);
}
}
static
void
state_count_function
(
SQLFunctionCtx
*
pCtx
)
{
static
void
state_count_function
(
SQLFunctionCtx
*
pCtx
)
{
SResultRowCellInfo
*
pResInfo
=
GET_RES_INFO
(
pCtx
);
SResultRowCellInfo
*
pResInfo
=
GET_RES_INFO
(
pCtx
);
SStateInfo
*
pStateInfo
=
GET_ROWCELL_INTERBUF
(
pResInfo
);
SStateInfo
*
pStateInfo
=
GET_ROWCELL_INTERBUF
(
pResInfo
);
...
@@ -5775,6 +5776,41 @@ static void state_duration_function(SQLFunctionCtx *pCtx) {
...
@@ -5775,6 +5776,41 @@ static void state_duration_function(SQLFunctionCtx *pCtx) {
}
}
pResInfo
->
numOfRes
+=
pCtx
->
size
;
pResInfo
->
numOfRes
+=
pCtx
->
size
;
}
}
int16_t
getTimeWindowFunctionID
(
int16_t
colIndex
)
{
switch
(
colIndex
)
{
case
TSDB_TSWIN_START_COLUMN_INDEX
:
{
return
TSDB_FUNC_WSTART
;
}
case
TSDB_TSWIN_STOP_COLUMN_INDEX
:
{
return
TSDB_FUNC_WSTOP
;
}
case
TSDB_TSWIN_DURATION_COLUMN_INDEX
:
{
return
TSDB_FUNC_WDURATION
;
}
default:
return
TSDB_FUNC_INVALID_ID
;
}
}
static
void
wstart_function
(
SQLFunctionCtx
*
pCtx
)
{
SET_VAL
(
pCtx
,
pCtx
->
size
,
1
);
*
(
int64_t
*
)(
pCtx
->
pOutput
)
=
pCtx
->
startTs
;
}
static
void
wstop_function
(
SQLFunctionCtx
*
pCtx
)
{
SET_VAL
(
pCtx
,
pCtx
->
size
,
1
);
*
(
int64_t
*
)(
pCtx
->
pOutput
)
=
pCtx
->
endTs
;
}
static
void
wduration_function
(
SQLFunctionCtx
*
pCtx
)
{
SET_VAL
(
pCtx
,
pCtx
->
size
,
1
);
int64_t
duration
=
pCtx
->
endTs
-
pCtx
->
startTs
;
if
(
duration
<
0
)
{
duration
=
-
duration
;
}
*
(
int64_t
*
)(
pCtx
->
pOutput
)
=
duration
;
}
/////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////
/*
/*
* function compatible list.
* function compatible list.
...
@@ -5787,16 +5823,16 @@ static void state_duration_function(SQLFunctionCtx *pCtx) {
...
@@ -5787,16 +5823,16 @@ static void state_duration_function(SQLFunctionCtx *pCtx) {
*
*
*/
*/
int32_t
functionCompatList
[]
=
{
int32_t
functionCompatList
[]
=
{
// count,
sum, avg, min, max, stddev, percentile, apercentile, first,
last
// count,
sum, avg, min, max, stddev, percentile, apercentile, first,
last
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
// last_row,
top, bottom, spread, twa, leastsqr, ts, ts_dummy,
tag_dummy, ts_comp
// last_row,
top, bottom, spread, twa, leastsqr, ts, ts_dummy,
tag_dummy, ts_comp
4
,
-
1
,
-
1
,
1
,
1
,
1
,
1
,
1
,
1
,
-
1
,
4
,
-
1
,
-
1
,
1
,
1
,
1
,
1
,
1
,
1
,
-
1
,
// tag,
colprj, tagprj, arithm, diff, first_dist, last_dist, stddev_dst, interp rate,
irate
// tag,
colprj, tagprj, arithm, diff, first_dist, last_dist, stddev_dst, interp rate,
irate
1
,
1
,
1
,
1
,
-
1
,
1
,
1
,
1
,
5
,
1
,
1
,
1
,
1
,
1
,
1
,
-
1
,
1
,
1
,
1
,
5
,
1
,
1
,
// tid_tag,
deriv, csum, mavg, sample,
// tid_tag,
deriv, csum, mavg, sample, block_info, elapsed, histogram, unique, mode, tail
6
,
8
,
-
1
,
-
1
,
-
1
,
6
,
8
,
-
1
,
-
1
,
-
1
,
7
,
1
,
-
1
,
-
1
,
1
,
-
1
,
//
block_info,elapsed,histogram,unique,mode,tail, stateCount, stateDuration
//
stateCount, stateDuration, wstart, wstop, wduration,
7
,
1
,
-
1
,
-
1
,
1
,
-
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
};
};
SAggFunctionInfo
aAggs
[
TSDB_FUNC_MAX_NUM
]
=
{{
SAggFunctionInfo
aAggs
[
TSDB_FUNC_MAX_NUM
]
=
{{
...
@@ -6294,40 +6330,76 @@ SAggFunctionInfo aAggs[TSDB_FUNC_MAX_NUM] = {{
...
@@ -6294,40 +6330,76 @@ SAggFunctionInfo aAggs[TSDB_FUNC_MAX_NUM] = {{
mode_function_merge
,
mode_function_merge
,
dataBlockRequired
,
dataBlockRequired
,
},
},
{
{
// 41
// 41
"tail"
,
"tail"
,
TSDB_FUNC_TAIL
,
TSDB_FUNC_TAIL
,
TSDB_FUNC_TAIL
,
TSDB_FUNC_TAIL
,
TSDB_BASE_FUNC_MO
|
TSDB_FUNCSTATE_SELECTIVITY
,
TSDB_BASE_FUNC_MO
|
TSDB_FUNCSTATE_SELECTIVITY
,
tail_function_setup
,
tail_function_setup
,
tail_function
,
tail_function
,
tail_func_finalizer
,
tail_func_finalizer
,
tail_func_merge
,
tail_func_merge
,
tailFuncRequired
,
tailFuncRequired
,
},
},
{
{
// 42
// 42
"stateCount"
,
"stateCount"
,
TSDB_FUNC_STATE_COUNT
,
TSDB_FUNC_STATE_COUNT
,
TSDB_FUNC_INVALID_ID
,
TSDB_FUNC_INVALID_ID
,
TSDB_BASE_FUNC_SO
|
TSDB_FUNCSTATE_NEED_TS
,
TSDB_BASE_FUNC_SO
|
TSDB_FUNCSTATE_NEED_TS
,
function_setup
,
function_setup
,
state_count_function
,
state_count_function
,
doFinalizer
,
doFinalizer
,
noop1
,
noop1
,
dataBlockRequired
,
dataBlockRequired
,
},
},
{
{
// 43
// 43
"stateDuration"
,
"stateDuration"
,
TSDB_FUNC_STATE_DURATION
,
TSDB_FUNC_STATE_DURATION
,
TSDB_FUNC_INVALID_ID
,
TSDB_FUNC_INVALID_ID
,
TSDB_BASE_FUNC_SO
|
TSDB_FUNCSTATE_NEED_TS
,
TSDB_BASE_FUNC_SO
|
TSDB_FUNCSTATE_NEED_TS
,
function_setup
,
function_setup
,
state_duration_function
,
state_duration_function
,
doFinalizer
,
doFinalizer
,
noop1
,
noop1
,
dataBlockRequired
,
dataBlockRequired
,
}
},
{
// 44
"_wstart"
,
TSDB_FUNC_WSTART
,
TSDB_FUNC_WSTART
,
TSDB_BASE_FUNC_SO
|
TSDB_FUNCSTATE_SELECTIVITY
,
function_setup
,
wstart_function
,
doFinalizer
,
copy_function
,
dataBlockRequired
,
},
{
// 45
"_wstop"
,
TSDB_FUNC_WSTOP
,
TSDB_FUNC_WSTOP
,
TSDB_BASE_FUNC_SO
|
TSDB_FUNCSTATE_SELECTIVITY
,
function_setup
,
wstop_function
,
doFinalizer
,
copy_function
,
dataBlockRequired
,
},
{
// 46
"_wduration"
,
TSDB_FUNC_WDURATION
,
TSDB_FUNC_WDURATION
,
TSDB_BASE_FUNC_SO
|
TSDB_FUNCSTATE_SELECTIVITY
,
function_setup
,
wduration_function
,
doFinalizer
,
copy_function
,
dataBlockRequired
,
}
};
};
src/query/src/qExecutor.c
浏览文件 @
2dc55641
...
@@ -461,7 +461,8 @@ static bool isProjQuery(SQueryAttr *pQueryAttr) {
...
@@ -461,7 +461,8 @@ static bool isProjQuery(SQueryAttr *pQueryAttr) {
}
}
static
bool
hasNull
(
SColIndex
*
pColIndex
,
SDataStatis
*
pStatis
)
{
static
bool
hasNull
(
SColIndex
*
pColIndex
,
SDataStatis
*
pStatis
)
{
if
(
TSDB_COL_IS_TAG
(
pColIndex
->
flag
)
||
TSDB_COL_IS_UD_COL
(
pColIndex
->
flag
)
||
pColIndex
->
colId
==
PRIMARYKEY_TIMESTAMP_COL_INDEX
)
{
if
(
TSDB_COL_IS_TAG
(
pColIndex
->
flag
)
||
TSDB_COL_IS_UD_COL
(
pColIndex
->
flag
)
||
TSDB_COL_IS_TSWIN_COL
(
pColIndex
->
colId
)
||
pColIndex
->
colId
==
PRIMARYKEY_TIMESTAMP_COL_INDEX
)
{
return
false
;
return
false
;
}
}
...
@@ -953,6 +954,7 @@ static void doApplyFunctions(SQueryRuntimeEnv* pRuntimeEnv, SQLFunctionCtx* pCtx
...
@@ -953,6 +954,7 @@ static void doApplyFunctions(SQueryRuntimeEnv* pRuntimeEnv, SQLFunctionCtx* pCtx
pCtx
[
k
].
size
=
forwardStep
;
pCtx
[
k
].
size
=
forwardStep
;
pCtx
[
k
].
startTs
=
pWin
->
skey
;
pCtx
[
k
].
startTs
=
pWin
->
skey
;
pCtx
[
k
].
endTs
=
pWin
->
ekey
;
// keep it temporarialy
// keep it temporarialy
char
*
start
=
pCtx
[
k
].
pInput
;
char
*
start
=
pCtx
[
k
].
pInput
;
...
@@ -1190,7 +1192,7 @@ static void doSetInputDataBlock(SOperatorInfo* pOperator, SQLFunctionCtx* pCtx,
...
@@ -1190,7 +1192,7 @@ static void doSetInputDataBlock(SOperatorInfo* pOperator, SQLFunctionCtx* pCtx,
setArithParams
((
SScalarExprSupport
*
)
pCtx
[
i
].
param
[
1
].
pz
,
&
pOperator
->
pExpr
[
i
],
pBlock
);
setArithParams
((
SScalarExprSupport
*
)
pCtx
[
i
].
param
[
1
].
pz
,
&
pOperator
->
pExpr
[
i
],
pBlock
);
}
else
{
}
else
{
SColIndex
*
pCol
=
&
pOperator
->
pExpr
[
i
].
base
.
colInfo
;
SColIndex
*
pCol
=
&
pOperator
->
pExpr
[
i
].
base
.
colInfo
;
if
(
TSDB_COL_IS_NORMAL_COL
(
pCol
->
flag
)
||
(
pCtx
[
i
].
functionId
==
TSDB_FUNC_BLKINFO
)
||
if
(
(
TSDB_COL_IS_NORMAL_COL
(
pCol
->
flag
)
&&
!
TSDB_COL_IS_TSWIN_COL
(
pCol
->
colId
)
)
||
(
pCtx
[
i
].
functionId
==
TSDB_FUNC_BLKINFO
)
||
(
TSDB_COL_IS_TAG
(
pCol
->
flag
)
&&
pOperator
->
pRuntimeEnv
->
scanFlag
==
MERGE_STAGE
))
{
(
TSDB_COL_IS_TAG
(
pCol
->
flag
)
&&
pOperator
->
pRuntimeEnv
->
scanFlag
==
MERGE_STAGE
))
{
SColIndex
*
pColIndex
=
&
pOperator
->
pExpr
[
i
].
base
.
colInfo
;
SColIndex
*
pColIndex
=
&
pOperator
->
pExpr
[
i
].
base
.
colInfo
;
SColumnInfoData
*
p
=
taosArrayGet
(
pBlock
->
pDataBlock
,
pColIndex
->
colIndex
);
SColumnInfoData
*
p
=
taosArrayGet
(
pBlock
->
pDataBlock
,
pColIndex
->
colIndex
);
...
@@ -1698,7 +1700,6 @@ static void doSessionWindowAggImpl(SOperatorInfo* pOperator, SSWindowOperatorInf
...
@@ -1698,7 +1700,6 @@ static void doSessionWindowAggImpl(SOperatorInfo* pOperator, SSWindowOperatorInf
}
else
{
// start a new session window
}
else
{
// start a new session window
SResultRow
*
pResult
=
NULL
;
SResultRow
*
pResult
=
NULL
;
pInfo
->
curWindow
.
ekey
=
pInfo
->
curWindow
.
skey
;
int32_t
ret
=
setResultOutputBufByKey
(
pRuntimeEnv
,
&
pBInfo
->
resultRowInfo
,
pSDataBlock
->
info
.
tid
,
&
pInfo
->
curWindow
,
masterScan
,
int32_t
ret
=
setResultOutputBufByKey
(
pRuntimeEnv
,
&
pBInfo
->
resultRowInfo
,
pSDataBlock
->
info
.
tid
,
&
pInfo
->
curWindow
,
masterScan
,
&
pResult
,
item
->
groupIndex
,
pBInfo
->
pCtx
,
pOperator
->
numOfOutput
,
&
pResult
,
item
->
groupIndex
,
pBInfo
->
pCtx
,
pOperator
->
numOfOutput
,
pBInfo
->
rowCellInfoOffset
);
pBInfo
->
rowCellInfoOffset
);
...
@@ -1719,7 +1720,6 @@ static void doSessionWindowAggImpl(SOperatorInfo* pOperator, SSWindowOperatorInf
...
@@ -1719,7 +1720,6 @@ static void doSessionWindowAggImpl(SOperatorInfo* pOperator, SSWindowOperatorInf
SResultRow
*
pResult
=
NULL
;
SResultRow
*
pResult
=
NULL
;
pInfo
->
curWindow
.
ekey
=
pInfo
->
curWindow
.
skey
;
int32_t
ret
=
setResultOutputBufByKey
(
pRuntimeEnv
,
&
pBInfo
->
resultRowInfo
,
pSDataBlock
->
info
.
tid
,
&
pInfo
->
curWindow
,
masterScan
,
int32_t
ret
=
setResultOutputBufByKey
(
pRuntimeEnv
,
&
pBInfo
->
resultRowInfo
,
pSDataBlock
->
info
.
tid
,
&
pInfo
->
curWindow
,
masterScan
,
&
pResult
,
item
->
groupIndex
,
pBInfo
->
pCtx
,
pOperator
->
numOfOutput
,
&
pResult
,
item
->
groupIndex
,
pBInfo
->
pCtx
,
pOperator
->
numOfOutput
,
pBInfo
->
rowCellInfoOffset
);
pBInfo
->
rowCellInfoOffset
);
...
@@ -1842,7 +1842,7 @@ static bool functionNeedToExecute(SQueryRuntimeEnv *pRuntimeEnv, SQLFunctionCtx
...
@@ -1842,7 +1842,7 @@ static bool functionNeedToExecute(SQueryRuntimeEnv *pRuntimeEnv, SQLFunctionCtx
void
setBlockStatisInfo
(
SQLFunctionCtx
*
pCtx
,
SSDataBlock
*
pSDataBlock
,
SColIndex
*
pColIndex
)
{
void
setBlockStatisInfo
(
SQLFunctionCtx
*
pCtx
,
SSDataBlock
*
pSDataBlock
,
SColIndex
*
pColIndex
)
{
SDataStatis
*
pStatis
=
NULL
;
SDataStatis
*
pStatis
=
NULL
;
if
(
pSDataBlock
->
pBlockStatis
!=
NULL
&&
TSDB_COL_IS_NORMAL_COL
(
pColIndex
->
flag
))
{
if
(
pSDataBlock
->
pBlockStatis
!=
NULL
&&
TSDB_COL_IS_NORMAL_COL
(
pColIndex
->
flag
)
&&
!
TSDB_COL_IS_TSWIN_COL
(
pColIndex
->
colId
)
)
{
pStatis
=
&
pSDataBlock
->
pBlockStatis
[
pColIndex
->
colIndex
];
pStatis
=
&
pSDataBlock
->
pBlockStatis
[
pColIndex
->
colIndex
];
pCtx
->
preAggVals
.
statis
=
*
pStatis
;
pCtx
->
preAggVals
.
statis
=
*
pStatis
;
...
@@ -6924,7 +6924,6 @@ static void doStateWindowAggImpl(SOperatorInfo* pOperator, SStateWindowOperatorI
...
@@ -6924,7 +6924,6 @@ static void doStateWindowAggImpl(SOperatorInfo* pOperator, SStateWindowOperatorI
}
}
}
else
{
}
else
{
SResultRow
*
pResult
=
NULL
;
SResultRow
*
pResult
=
NULL
;
pInfo
->
curWindow
.
ekey
=
pInfo
->
curWindow
.
skey
;
int32_t
ret
=
setResultOutputBufByKey
(
pRuntimeEnv
,
&
pBInfo
->
resultRowInfo
,
pSDataBlock
->
info
.
tid
,
&
pInfo
->
curWindow
,
masterScan
,
int32_t
ret
=
setResultOutputBufByKey
(
pRuntimeEnv
,
&
pBInfo
->
resultRowInfo
,
pSDataBlock
->
info
.
tid
,
&
pInfo
->
curWindow
,
masterScan
,
&
pResult
,
item
->
groupIndex
,
pBInfo
->
pCtx
,
pOperator
->
numOfOutput
,
&
pResult
,
item
->
groupIndex
,
pBInfo
->
pCtx
,
pOperator
->
numOfOutput
,
pBInfo
->
rowCellInfoOffset
);
pBInfo
->
rowCellInfoOffset
);
...
@@ -6944,8 +6943,6 @@ static void doStateWindowAggImpl(SOperatorInfo* pOperator, SStateWindowOperatorI
...
@@ -6944,8 +6943,6 @@ static void doStateWindowAggImpl(SOperatorInfo* pOperator, SStateWindowOperatorI
}
}
SResultRow
*
pResult
=
NULL
;
SResultRow
*
pResult
=
NULL
;
pInfo
->
curWindow
.
ekey
=
pInfo
->
curWindow
.
skey
;
int32_t
ret
=
setResultOutputBufByKey
(
pRuntimeEnv
,
&
pBInfo
->
resultRowInfo
,
pSDataBlock
->
info
.
tid
,
&
pInfo
->
curWindow
,
masterScan
,
int32_t
ret
=
setResultOutputBufByKey
(
pRuntimeEnv
,
&
pBInfo
->
resultRowInfo
,
pSDataBlock
->
info
.
tid
,
&
pInfo
->
curWindow
,
masterScan
,
&
pResult
,
item
->
groupIndex
,
pBInfo
->
pCtx
,
pOperator
->
numOfOutput
,
&
pResult
,
item
->
groupIndex
,
pBInfo
->
pCtx
,
pOperator
->
numOfOutput
,
pBInfo
->
rowCellInfoOffset
);
pBInfo
->
rowCellInfoOffset
);
...
@@ -8388,8 +8385,9 @@ static int32_t getColumnIndexInSource(SQueriedTableInfo *pTableInfo, SSqlExpr *p
...
@@ -8388,8 +8385,9 @@ static int32_t getColumnIndexInSource(SQueriedTableInfo *pTableInfo, SSqlExpr *p
int32_t
j
=
0
;
int32_t
j
=
0
;
if
(
TSDB_COL_IS_TAG
(
pExpr
->
colInfo
.
flag
))
{
if
(
TSDB_COL_IS_TAG
(
pExpr
->
colInfo
.
flag
))
{
if
(
pExpr
->
colInfo
.
colId
==
TSDB_TBNAME_COLUMN_INDEX
)
{
if
(
pExpr
->
colInfo
.
colId
==
TSDB_TBNAME_COLUMN_INDEX
||
return
TSDB_TBNAME_COLUMN_INDEX
;
TSDB_COL_IS_TSWIN_COL
(
pExpr
->
colInfo
.
colId
))
{
return
pExpr
->
colInfo
.
colId
;
}
}
while
(
j
<
pTableInfo
->
numOfTags
)
{
while
(
j
<
pTableInfo
->
numOfTags
)
{
...
@@ -9172,6 +9170,11 @@ int32_t createQueryFunc(SQueriedTableInfo* pTableInfo, int32_t numOfOutput, SExp
...
@@ -9172,6 +9170,11 @@ int32_t createQueryFunc(SQueriedTableInfo* pTableInfo, int32_t numOfOutput, SExp
SSchema
*
s
=
tGetTbnameColumnSchema
();
SSchema
*
s
=
tGetTbnameColumnSchema
();
type
=
s
->
type
;
type
=
s
->
type
;
bytes
=
s
->
bytes
;
bytes
=
s
->
bytes
;
}
else
if
(
TSDB_COL_IS_TSWIN_COL
(
pExprs
[
i
].
base
.
colInfo
.
colId
)
&&
(
pExprs
[
i
].
base
.
functionId
>=
TSDB_FUNC_WSTART
||
pExprs
[
i
].
base
.
functionId
<=
TSDB_FUNC_WDURATION
))
{
SSchema
*
s
=
tGetTimeWindowColumnSchema
(
pExprs
[
i
].
base
.
colInfo
.
colId
);
type
=
s
->
type
;
bytes
=
s
->
bytes
;
}
else
if
(
pExprs
[
i
].
base
.
colInfo
.
colId
<=
TSDB_UD_COLUMN_INDEX
&&
pExprs
[
i
].
base
.
colInfo
.
colId
>
TSDB_RES_COL_ID
)
{
}
else
if
(
pExprs
[
i
].
base
.
colInfo
.
colId
<=
TSDB_UD_COLUMN_INDEX
&&
pExprs
[
i
].
base
.
colInfo
.
colId
>
TSDB_RES_COL_ID
)
{
// it is a user-defined constant value column
// it is a user-defined constant value column
assert
(
pExprs
[
i
].
base
.
functionId
==
TSDB_FUNC_PRJ
);
assert
(
pExprs
[
i
].
base
.
functionId
==
TSDB_FUNC_PRJ
);
...
@@ -9184,7 +9187,7 @@ int32_t createQueryFunc(SQueriedTableInfo* pTableInfo, int32_t numOfOutput, SExp
...
@@ -9184,7 +9187,7 @@ int32_t createQueryFunc(SQueriedTableInfo* pTableInfo, int32_t numOfOutput, SExp
}
else
{
}
else
{
int32_t
j
=
getColumnIndexInSource
(
pTableInfo
,
&
pExprs
[
i
].
base
,
pTagCols
);
int32_t
j
=
getColumnIndexInSource
(
pTableInfo
,
&
pExprs
[
i
].
base
,
pTagCols
);
if
(
TSDB_COL_IS_TAG
(
pExprs
[
i
].
base
.
colInfo
.
flag
))
{
if
(
TSDB_COL_IS_TAG
(
pExprs
[
i
].
base
.
colInfo
.
flag
))
{
if
(
j
<
TSDB_
TBNAME
_COLUMN_INDEX
||
j
>=
pTableInfo
->
numOfTags
)
{
if
(
j
<
TSDB_
MIN_VALID
_COLUMN_INDEX
||
j
>=
pTableInfo
->
numOfTags
)
{
tfree
(
pExprs
);
tfree
(
pExprs
);
return
TSDB_CODE_QRY_INVALID_MSG
;
return
TSDB_CODE_QRY_INVALID_MSG
;
}
}
...
@@ -9217,15 +9220,23 @@ int32_t createQueryFunc(SQueriedTableInfo* pTableInfo, int32_t numOfOutput, SExp
...
@@ -9217,15 +9220,23 @@ int32_t createQueryFunc(SQueriedTableInfo* pTableInfo, int32_t numOfOutput, SExp
}
}
int32_t
param
=
(
int32_t
)
pExprs
[
i
].
base
.
param
[
0
].
i64
;
int32_t
param
=
(
int32_t
)
pExprs
[
i
].
base
.
param
[
0
].
i64
;
if
(
pExprs
[
i
].
base
.
functionId
>
0
&&
pExprs
[
i
].
base
.
functionId
!=
TSDB_FUNC_SCALAR_EXPR
&&
if
(
pExprs
[
i
].
base
.
functionId
>
0
&&
pExprs
[
i
].
base
.
functionId
!=
TSDB_FUNC_SCALAR_EXPR
&&
pExprs
[
i
].
base
.
functionId
!=
TSDB_FUNC_WSTART
&&
pExprs
[
i
].
base
.
functionId
!=
TSDB_FUNC_WSTOP
&&
pExprs
[
i
].
base
.
functionId
!=
TSDB_FUNC_WDURATION
&&
(
type
!=
pExprs
[
i
].
base
.
colType
||
bytes
!=
pExprs
[
i
].
base
.
colBytes
))
{
(
type
!=
pExprs
[
i
].
base
.
colType
||
bytes
!=
pExprs
[
i
].
base
.
colBytes
))
{
tfree
(
pExprs
);
tfree
(
pExprs
);
return
TSDB_CODE_QRY_INVALID_MSG
;
return
TSDB_CODE_QRY_INVALID_MSG
;
}
}
// todo remove it
// todo remove it
if
(
pExprs
[
i
].
base
.
functionId
!=
TSDB_FUNC_SCALAR_EXPR
&&
getResultDataInfo
(
type
,
bytes
,
pExprs
[
i
].
base
.
functionId
,
param
,
&
pExprs
[
i
].
base
.
resType
,
&
pExprs
[
i
].
base
.
resBytes
,
if
(
pExprs
[
i
].
base
.
functionId
!=
TSDB_FUNC_SCALAR_EXPR
&&
&
pExprs
[
i
].
base
.
interBytes
,
0
,
isSuperTable
,
pUdfInfo
)
!=
TSDB_CODE_SUCCESS
)
{
pExprs
[
i
].
base
.
functionId
!=
TSDB_FUNC_WSTART
&&
pExprs
[
i
].
base
.
functionId
!=
TSDB_FUNC_WSTOP
&&
pExprs
[
i
].
base
.
functionId
!=
TSDB_FUNC_WDURATION
&&
getResultDataInfo
(
type
,
bytes
,
pExprs
[
i
].
base
.
functionId
,
param
,
&
pExprs
[
i
].
base
.
resType
,
&
pExprs
[
i
].
base
.
resBytes
,
&
pExprs
[
i
].
base
.
interBytes
,
0
,
isSuperTable
,
pUdfInfo
)
!=
TSDB_CODE_SUCCESS
)
{
tfree
(
pExprs
);
tfree
(
pExprs
);
return
TSDB_CODE_QRY_INVALID_MSG
;
return
TSDB_CODE_QRY_INVALID_MSG
;
}
}
...
@@ -9438,7 +9449,10 @@ static void doUpdateExprColumnIndex(SQueryAttr *pQueryAttr) {
...
@@ -9438,7 +9449,10 @@ static void doUpdateExprColumnIndex(SQueryAttr *pQueryAttr) {
for
(
int32_t
k
=
0
;
k
<
pQueryAttr
->
numOfOutput
;
++
k
)
{
for
(
int32_t
k
=
0
;
k
<
pQueryAttr
->
numOfOutput
;
++
k
)
{
SSqlExpr
*
pSqlExprMsg
=
&
pQueryAttr
->
pExpr1
[
k
].
base
;
SSqlExpr
*
pSqlExprMsg
=
&
pQueryAttr
->
pExpr1
[
k
].
base
;
if
(
pSqlExprMsg
->
functionId
==
TSDB_FUNC_SCALAR_EXPR
)
{
if
(
pSqlExprMsg
->
functionId
==
TSDB_FUNC_SCALAR_EXPR
||
pSqlExprMsg
->
functionId
==
TSDB_FUNC_WSTART
||
pSqlExprMsg
->
functionId
==
TSDB_FUNC_WSTOP
||
pSqlExprMsg
->
functionId
==
TSDB_FUNC_WDURATION
)
{
continue
;
continue
;
}
}
...
@@ -9465,7 +9479,7 @@ static void doUpdateExprColumnIndex(SQueryAttr *pQueryAttr) {
...
@@ -9465,7 +9479,7 @@ static void doUpdateExprColumnIndex(SQueryAttr *pQueryAttr) {
}
}
}
}
assert
(
f
<
pQueryAttr
->
numOfTags
||
pColIndex
->
colId
=
=
TSDB_TBNAME_COLUMN_INDEX
);
assert
(
f
<
pQueryAttr
->
numOfTags
||
pColIndex
->
colId
<
=
TSDB_TBNAME_COLUMN_INDEX
);
}
}
}
}
}
}
...
...
src/util/inc/ttoken.h
浏览文件 @
2dc55641
...
@@ -27,6 +27,10 @@ extern "C" {
...
@@ -27,6 +27,10 @@ extern "C" {
#define TSQL_TBNAME "TBNAME"
#define TSQL_TBNAME "TBNAME"
#define TSQL_TBNAME_L "tbname"
#define TSQL_TBNAME_L "tbname"
#define TSQL_TSWIN_START "_wstart"
#define TSQL_TSWIN_STOP "_wstop"
#define TSQL_TSWIN_DURATION "_wduration"
#define TSQL_BLOCK_DIST "_BLOCK_DIST"
#define TSQL_BLOCK_DIST "_BLOCK_DIST"
#define TSQL_BLOCK_DIST_L "_block_dist"
#define TSQL_BLOCK_DIST_L "_block_dist"
...
...
tests/develop-test/2-query/time_window_keywords.py
0 → 100644
浏览文件 @
2dc55641
此差异已折叠。
点击以展开。
tests/parallel_test/cases.task
浏览文件 @
2dc55641
...
@@ -711,6 +711,7 @@
...
@@ -711,6 +711,7 @@
5,,develop-test,python3 ./test.py -f 2-query/function_timezone.py
5,,develop-test,python3 ./test.py -f 2-query/function_timezone.py
5,,develop-test,python3 ./test.py -f 2-query/function_to_iso8601.py
5,,develop-test,python3 ./test.py -f 2-query/function_to_iso8601.py
5,,develop-test,python3 ./test.py -f 2-query/function_to_unixtimestamp.py
5,,develop-test,python3 ./test.py -f 2-query/function_to_unixtimestamp.py
5,,develop-test,python3 ./test.py -f 2-query/time_window_keywords.py
4,,system-test,python3 test.py -f 4-taosAdapter/TD-12163.py
4,,system-test,python3 test.py -f 4-taosAdapter/TD-12163.py
4,,system-test,python3 ./test.py -f 3-connectors/restful/restful_binddbname.py
4,,system-test,python3 ./test.py -f 3-connectors/restful/restful_binddbname.py
4,,system-test,python3 ./test.py -f 2-query/TD-12614.py
4,,system-test,python3 ./test.py -f 2-query/TD-12614.py
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录