Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
慢慢CG
TDengine
提交
5501982f
T
TDengine
项目概览
慢慢CG
/
TDengine
与 Fork 源项目一致
Fork自
taosdata / TDengine
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
5501982f
编写于
3月 07, 2021
作者:
H
Haojun Liao
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[td-2895] refactor.
上级
e313cf3b
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
410 addition
and
603 deletion
+410
-603
src/client/src/tscSQLParser.c
src/client/src/tscSQLParser.c
+135
-246
src/query/inc/qSqlparser.h
src/query/inc/qSqlparser.h
+20
-17
src/query/src/qExecutor.c
src/query/src/qExecutor.c
+71
-165
src/query/src/qParserImpl.c
src/query/src/qParserImpl.c
+55
-46
src/query/src/qTokenizer.c
src/query/src/qTokenizer.c
+43
-43
tests/script/general/parser/testSuite.sim
tests/script/general/parser/testSuite.sim
+86
-86
未找到文件。
src/client/src/tscSQLParser.c
浏览文件 @
5501982f
...
...
@@ -75,7 +75,6 @@ static int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int3
static
int32_t
insertResultField
(
SQueryInfo
*
pQueryInfo
,
int32_t
outputIndex
,
SColumnList
*
pIdList
,
int16_t
bytes
,
int8_t
type
,
char
*
fieldName
,
SSqlExpr
*
pSqlExpr
);
static
int32_t
convertFunctionId
(
int32_t
optr
,
int16_t
*
functionId
);
static
uint8_t
convertOptr
(
SStrToken
*
pToken
);
static
int32_t
parseSelectClause
(
SSqlCmd
*
pCmd
,
int32_t
clauseIndex
,
tSQLExprList
*
pSelection
,
bool
isSTable
,
bool
joinQuery
,
bool
intervalQuery
);
...
...
@@ -1549,26 +1548,24 @@ int32_t parseSelectClause(SSqlCmd* pCmd, int32_t clauseIndex, tSQLExprList* pSel
hasDistinct
=
(
pItem
->
distinct
==
true
);
}
int32_t
optr
=
pItem
->
pNode
->
nSQLOptr
;
if
(
optr
==
TK_
FUNCTION
)
{
int32_t
functId
=
isValidFunction
(
pItem
->
pNode
->
token
.
z
,
pItem
->
pNode
->
token
.
n
);
if
(
funct
Id
<
0
)
{
int32_t
type
=
pItem
->
pNode
->
type
;
if
(
type
==
SQL_NODE_SQL
FUNCTION
)
{
pItem
->
pNode
->
functionId
=
isValidFunction
(
pItem
->
pNode
->
operand
.
z
,
pItem
->
pNode
->
operand
.
n
);
if
(
pItem
->
pNode
->
function
Id
<
0
)
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg5
);
}
pItem
->
pNode
->
nSQLOptr
=
functId
;
// sql function in selection clause, append sql function info in pSqlCmd structure sequentially
if
(
addExprAndResultField
(
pCmd
,
pQueryInfo
,
outputIndex
,
pItem
,
true
)
!=
TSDB_CODE_SUCCESS
)
{
return
TSDB_CODE_TSC_INVALID_SQL
;
}
}
else
if
(
optr
==
TK_ALL
||
optr
==
TK_ID
||
optr
==
TK_STRING
||
optr
==
TK_INTEGER
||
optr
==
TK_FLOAT
)
{
}
else
if
(
type
==
SQL_NODE_TABLE_COLUMN
||
type
==
SQL_NODE_VALUE
)
{
// 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
if
(
addProjectionExprAndResultField
(
pCmd
,
pQueryInfo
,
pItem
)
!=
TSDB_CODE_SUCCESS
)
{
return
TSDB_CODE_TSC_INVALID_SQL
;
}
}
else
if
(
pItem
->
pNode
->
nSQLOptr
>=
TK_PLUS
&&
pItem
->
pNode
->
nSQLOptr
<=
TK_REM
)
{
}
else
if
(
type
==
SQL_NODE_EXPR
)
{
int32_t
code
=
handleArithmeticExpr
(
pCmd
,
clauseIndex
,
i
,
pItem
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
return
code
;
...
...
@@ -1718,7 +1715,7 @@ int32_t addProjectionExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, t
const
char
*
msg1
=
"tag for normal table query is not allowed"
;
int32_t
startPos
=
(
int32_t
)
tscSqlExprNumOfExprs
(
pQueryInfo
);
int32_t
optr
=
pItem
->
pNode
->
nSQLOptr
;
int32_t
optr
=
pItem
->
pNode
->
tokenId
;
if
(
optr
==
TK_ALL
)
{
// project on all fields
TSDB_QUERY_SET_TYPE
(
pQueryInfo
->
type
,
TSDB_QUERY_TYPE_PROJECTION_QUERY
);
...
...
@@ -1748,13 +1745,13 @@ int32_t addProjectionExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, t
index
.
columnIndex
=
(
pQueryInfo
->
udColumnId
--
);
index
.
tableIndex
=
0
;
SSchema
colSchema
=
tGetUserSpecifiedColumnSchema
(
&
pItem
->
pNode
->
val
,
&
pItem
->
pNode
->
token
,
pItem
->
aliasName
);
SSchema
colSchema
=
tGetUserSpecifiedColumnSchema
(
&
pItem
->
pNode
->
val
ue
,
&
pItem
->
pNode
->
token
,
pItem
->
aliasName
);
SSqlExpr
*
pExpr
=
tscAddFuncInSelectClause
(
pQueryInfo
,
startPos
,
TSDB_FUNC_PRJ
,
&
index
,
&
colSchema
,
TSDB_COL_UDC
);
// NOTE: the first parameter is reserved for the tag column id during join query process.
pExpr
->
numOfParams
=
2
;
tVariantAssign
(
&
pExpr
->
param
[
1
],
&
pItem
->
pNode
->
val
);
tVariantAssign
(
&
pExpr
->
param
[
1
],
&
pItem
->
pNode
->
val
ue
);
}
else
if
(
optr
==
TK_ID
)
{
SColumnIndex
index
=
COLUMN_INDEX_INITIALIZER
;
...
...
@@ -1865,7 +1862,7 @@ void setResultColName(char* name, tSqlExprItem* pItem, int32_t functionId, SStrT
int32_t
addExprAndResultField
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
,
int32_t
colIndex
,
tSqlExprItem
*
pItem
,
bool
finalResult
)
{
STableMetaInfo
*
pTableMetaInfo
=
NULL
;
int32_t
optr
=
pItem
->
pNode
->
nSQLOptr
;
int32_t
functionId
=
pItem
->
pNode
->
functionId
;
const
char
*
msg1
=
"not support column types"
;
const
char
*
msg2
=
"invalid parameters"
;
...
...
@@ -1875,27 +1872,21 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
const
char
*
msg6
=
"function applied to tags not allowed"
;
const
char
*
msg7
=
"normal table can not apply this function"
;
const
char
*
msg8
=
"multi-columns selection does not support alias column name"
;
const
char
*
msg9
=
"invalid function"
;
switch
(
optr
)
{
switch
(
functionId
)
{
case
TSDB_FUNC_COUNT
:
{
/* more than one parameter for count() function */
if
(
pItem
->
pNode
->
pParam
!=
NULL
&&
pItem
->
pNode
->
pParam
->
nExpr
!=
1
)
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg2
);
}
int16_t
functionID
=
0
;
if
(
convertFunctionId
(
optr
,
&
functionID
)
!=
TSDB_CODE_SUCCESS
)
{
return
TSDB_CODE_TSC_INVALID_SQL
;
}
SSqlExpr
*
pExpr
=
NULL
;
SColumnIndex
index
=
COLUMN_INDEX_INITIALIZER
;
if
(
pItem
->
pNode
->
pParam
!=
NULL
)
{
tSqlExprItem
*
pParamElem
=
&
pItem
->
pNode
->
pParam
->
a
[
0
];
SStrToken
*
pToken
=
&
pParamElem
->
pNode
->
colInfo
;
int16_t
sqlOptr
=
pParamElem
->
pNode
->
nSQLOptr
;
int16_t
sqlOptr
=
pParamElem
->
pNode
->
tokenId
;
if
((
pToken
->
z
==
NULL
||
pToken
->
n
==
0
)
&&
(
TK_INTEGER
!=
sqlOptr
))
/*select count(1) from table*/
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg3
);
...
...
@@ -1911,11 +1902,11 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
index
=
(
SColumnIndex
){
0
,
PRIMARYKEY_TIMESTAMP_COL_INDEX
};
int32_t
size
=
tDataTypes
[
TSDB_DATA_TYPE_BIGINT
].
bytes
;
pExpr
=
tscSqlExprAppend
(
pQueryInfo
,
functionI
D
,
&
index
,
TSDB_DATA_TYPE_BIGINT
,
size
,
getNewResColId
(
pQueryInfo
),
size
,
false
);
pExpr
=
tscSqlExprAppend
(
pQueryInfo
,
functionI
d
,
&
index
,
TSDB_DATA_TYPE_BIGINT
,
size
,
getNewResColId
(
pQueryInfo
),
size
,
false
);
}
else
if
(
sqlOptr
==
TK_INTEGER
)
{
// select count(1) from table1
char
buf
[
8
]
=
{
0
};
int64_t
val
=
-
1
;
tVariant
*
pVariant
=
&
pParamElem
->
pNode
->
val
;
tVariant
*
pVariant
=
&
pParamElem
->
pNode
->
val
ue
;
if
(
pVariant
->
nType
==
TSDB_DATA_TYPE_BIGINT
)
{
tVariantDump
(
pVariant
,
buf
,
TSDB_DATA_TYPE_BIGINT
,
true
);
val
=
GET_INT64_VAL
(
buf
);
...
...
@@ -1923,7 +1914,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
if
(
val
==
1
)
{
index
=
(
SColumnIndex
){
0
,
PRIMARYKEY_TIMESTAMP_COL_INDEX
};
int32_t
size
=
tDataTypes
[
TSDB_DATA_TYPE_BIGINT
].
bytes
;
pExpr
=
tscSqlExprAppend
(
pQueryInfo
,
functionI
D
,
&
index
,
TSDB_DATA_TYPE_BIGINT
,
size
,
getNewResColId
(
pQueryInfo
),
size
,
false
);
pExpr
=
tscSqlExprAppend
(
pQueryInfo
,
functionI
d
,
&
index
,
TSDB_DATA_TYPE_BIGINT
,
size
,
getNewResColId
(
pQueryInfo
),
size
,
false
);
}
else
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg3
);
}
...
...
@@ -1943,12 +1934,12 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
}
int32_t
size
=
tDataTypes
[
TSDB_DATA_TYPE_BIGINT
].
bytes
;
pExpr
=
tscSqlExprAppend
(
pQueryInfo
,
functionI
D
,
&
index
,
TSDB_DATA_TYPE_BIGINT
,
size
,
getNewResColId
(
pQueryInfo
),
size
,
isTag
);
pExpr
=
tscSqlExprAppend
(
pQueryInfo
,
functionI
d
,
&
index
,
TSDB_DATA_TYPE_BIGINT
,
size
,
getNewResColId
(
pQueryInfo
),
size
,
isTag
);
}
}
else
{
// count(*) is equalled to count(primary_timestamp_key)
index
=
(
SColumnIndex
){
0
,
PRIMARYKEY_TIMESTAMP_COL_INDEX
};
int32_t
size
=
tDataTypes
[
TSDB_DATA_TYPE_BIGINT
].
bytes
;
pExpr
=
tscSqlExprAppend
(
pQueryInfo
,
functionI
D
,
&
index
,
TSDB_DATA_TYPE_BIGINT
,
size
,
getNewResColId
(
pQueryInfo
),
size
,
false
);
pExpr
=
tscSqlExprAppend
(
pQueryInfo
,
functionI
d
,
&
index
,
TSDB_DATA_TYPE_BIGINT
,
size
,
getNewResColId
(
pQueryInfo
),
size
,
false
);
}
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
index
.
tableIndex
);
...
...
@@ -1988,14 +1979,14 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
case
TSDB_FUNC_STDDEV
:
case
TSDB_FUNC_LEASTSQR
:
{
// 1. valid the number of parameters
if
(
pItem
->
pNode
->
pParam
==
NULL
||
(
optr
!=
TSDB_FUNC_LEASTSQR
&&
pItem
->
pNode
->
pParam
->
nExpr
!=
1
)
||
(
optr
==
TSDB_FUNC_LEASTSQR
&&
pItem
->
pNode
->
pParam
->
nExpr
!=
3
))
{
if
(
pItem
->
pNode
->
pParam
==
NULL
||
(
functionId
!=
TSDB_FUNC_LEASTSQR
&&
pItem
->
pNode
->
pParam
->
nExpr
!=
1
)
||
(
functionId
==
TSDB_FUNC_LEASTSQR
&&
pItem
->
pNode
->
pParam
->
nExpr
!=
3
))
{
/* no parameters or more than one parameter for function */
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg2
);
}
tSqlExprItem
*
pParamElem
=
&
(
pItem
->
pNode
->
pParam
->
a
[
0
]);
if
(
pParamElem
->
pNode
->
nSQLOptr
!=
TK_ALL
&&
pParamElem
->
pNode
->
nSQLOptr
!=
TK_ID
)
{
if
(
pParamElem
->
pNode
->
tokenId
!=
TK_ALL
&&
pParamElem
->
pNode
->
tokenId
!=
TK_ID
)
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg2
);
}
...
...
@@ -2020,18 +2011,13 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
int16_t
resultSize
=
0
;
int32_t
intermediateResSize
=
0
;
int16_t
functionID
=
0
;
if
(
convertFunctionId
(
optr
,
&
functionID
)
!=
TSDB_CODE_SUCCESS
)
{
return
TSDB_CODE_TSC_INVALID_SQL
;
}
if
(
getResultDataInfo
(
pSchema
->
type
,
pSchema
->
bytes
,
functionID
,
0
,
&
resultType
,
&
resultSize
,
if
(
getResultDataInfo
(
pSchema
->
type
,
pSchema
->
bytes
,
functionId
,
0
,
&
resultType
,
&
resultSize
,
&
intermediateResSize
,
0
,
false
)
!=
TSDB_CODE_SUCCESS
)
{
return
TSDB_CODE_TSC_INVALID_SQL
;
}
// set the first column ts for diff query
if
(
optr
==
TSDB_FUNC_DIFF
)
{
if
(
functionId
==
TSDB_FUNC_DIFF
)
{
colIndex
+=
1
;
SColumnIndex
indexTS
=
{.
tableIndex
=
index
.
tableIndex
,
.
columnIndex
=
0
};
SSqlExpr
*
pExpr
=
tscSqlExprAppend
(
pQueryInfo
,
TSDB_FUNC_TS_DUMMY
,
&
indexTS
,
TSDB_DATA_TYPE_TIMESTAMP
,
TSDB_KEYSIZE
,
...
...
@@ -2046,19 +2032,19 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg6
);
}
SSqlExpr
*
pExpr
=
tscSqlExprAppend
(
pQueryInfo
,
functionI
D
,
&
index
,
resultType
,
resultSize
,
getNewResColId
(
pQueryInfo
),
resultSize
,
false
);
SSqlExpr
*
pExpr
=
tscSqlExprAppend
(
pQueryInfo
,
functionI
d
,
&
index
,
resultType
,
resultSize
,
getNewResColId
(
pQueryInfo
),
resultSize
,
false
);
if
(
optr
==
TSDB_FUNC_LEASTSQR
)
{
if
(
functionId
==
TSDB_FUNC_LEASTSQR
)
{
/* set the leastsquares parameters */
char
val
[
8
]
=
{
0
};
if
(
tVariantDump
(
&
pParamElem
[
1
].
pNode
->
val
,
val
,
TSDB_DATA_TYPE_DOUBLE
,
true
)
<
0
)
{
if
(
tVariantDump
(
&
pParamElem
[
1
].
pNode
->
val
ue
,
val
,
TSDB_DATA_TYPE_DOUBLE
,
true
)
<
0
)
{
return
TSDB_CODE_TSC_INVALID_SQL
;
}
addExprParams
(
pExpr
,
val
,
TSDB_DATA_TYPE_DOUBLE
,
DOUBLE_BYTES
);
memset
(
val
,
0
,
tListLen
(
val
));
if
(
tVariantDump
(
&
pParamElem
[
2
].
pNode
->
val
,
val
,
TSDB_DATA_TYPE_DOUBLE
,
true
)
<
0
)
{
if
(
tVariantDump
(
&
pParamElem
[
2
].
pNode
->
val
ue
,
val
,
TSDB_DATA_TYPE_DOUBLE
,
true
)
<
0
)
{
return
TSDB_CODE_TSC_INVALID_SQL
;
}
...
...
@@ -2091,14 +2077,9 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
case
TSDB_FUNC_INTERP
:
{
bool
requireAllFields
=
(
pItem
->
pNode
->
pParam
==
NULL
);
int16_t
functionID
=
0
;
if
(
convertFunctionId
(
optr
,
&
functionID
)
!=
TSDB_CODE_SUCCESS
)
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg9
);
}
// NOTE: has time range condition or normal column filter condition, the last_row query will be transferred to last query
SConvertFunc
cvtFunc
=
{.
originFuncId
=
functionI
D
,
.
execFuncId
=
functionID
};
if
(
functionI
D
==
TSDB_FUNC_LAST_ROW
&&
((
!
TSWINDOW_IS_EQUAL
(
pQueryInfo
->
window
,
TSWINDOW_INITIALIZER
))
||
(
hasNormalColumnFilter
(
pQueryInfo
))))
{
SConvertFunc
cvtFunc
=
{.
originFuncId
=
functionI
d
,
.
execFuncId
=
functionId
};
if
(
functionI
d
==
TSDB_FUNC_LAST_ROW
&&
((
!
TSWINDOW_IS_EQUAL
(
pQueryInfo
->
window
,
TSWINDOW_INITIALIZER
))
||
(
hasNormalColumnFilter
(
pQueryInfo
))))
{
cvtFunc
.
execFuncId
=
TSDB_FUNC_LAST
;
}
...
...
@@ -2114,13 +2095,13 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
/* in first/last function, multiple columns can be add to resultset */
for
(
int32_t
i
=
0
;
i
<
pItem
->
pNode
->
pParam
->
nExpr
;
++
i
)
{
tSqlExprItem
*
pParamElem
=
&
(
pItem
->
pNode
->
pParam
->
a
[
i
]);
if
(
pParamElem
->
pNode
->
nSQLOptr
!=
TK_ALL
&&
pParamElem
->
pNode
->
nSQLOptr
!=
TK_ID
)
{
if
(
pParamElem
->
pNode
->
tokenId
!=
TK_ALL
&&
pParamElem
->
pNode
->
tokenId
!=
TK_ID
)
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg3
);
}
SColumnIndex
index
=
COLUMN_INDEX_INITIALIZER
;
if
(
pParamElem
->
pNode
->
nSQLOptr
==
TK_ALL
)
{
// select table.*
if
(
pParamElem
->
pNode
->
tokenId
==
TK_ALL
)
{
// select table.*
SStrToken
tmpToken
=
pParamElem
->
pNode
->
colInfo
;
if
(
getTableIndexByName
(
&
tmpToken
,
pQueryInfo
,
&
index
)
!=
TSDB_CODE_SUCCESS
)
{
...
...
@@ -2164,7 +2145,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
return
TSDB_CODE_TSC_INVALID_SQL
;
}
if
(
optr
==
TSDB_FUNC_LAST
)
{
// todo refactor
if
(
functionId
==
TSDB_FUNC_LAST
)
{
// todo refactor
SSqlGroupbyExpr
*
pGroupBy
=
&
pQueryInfo
->
groupbyExpr
;
if
(
pGroupBy
->
numOfGroupCols
>
0
)
{
for
(
int32_t
k
=
0
;
k
<
pGroupBy
->
numOfGroupCols
;
++
k
)
{
...
...
@@ -2226,7 +2207,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
}
tSqlExprItem
*
pParamElem
=
&
(
pItem
->
pNode
->
pParam
->
a
[
0
]);
if
(
pParamElem
->
pNode
->
nSQLOptr
!=
TK_ID
)
{
if
(
pParamElem
->
pNode
->
tokenId
!=
TK_ID
)
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg2
);
}
...
...
@@ -2254,11 +2235,11 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
}
// 3. valid the parameters
if
(
pParamElem
[
1
].
pNode
->
nSQLOptr
==
TK_ID
)
{
if
(
pParamElem
[
1
].
pNode
->
tokenId
==
TK_ID
)
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg2
);
}
tVariant
*
pVariant
=
&
pParamElem
[
1
].
pNode
->
val
;
tVariant
*
pVariant
=
&
pParamElem
[
1
].
pNode
->
val
ue
;
int8_t
resultType
=
pSchema
[
index
.
columnIndex
].
type
;
int16_t
resultSize
=
pSchema
[
index
.
columnIndex
].
bytes
;
...
...
@@ -2266,7 +2247,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
char
val
[
8
]
=
{
0
};
SSqlExpr
*
pExpr
=
NULL
;
if
(
optr
==
TSDB_FUNC_PERCT
||
optr
==
TSDB_FUNC_APERCT
)
{
if
(
functionId
==
TSDB_FUNC_PERCT
||
functionId
==
TSDB_FUNC_APERCT
)
{
tVariantDump
(
pVariant
,
val
,
TSDB_DATA_TYPE_DOUBLE
,
true
);
double
dp
=
GET_DOUBLE_VAL
(
val
);
...
...
@@ -2282,10 +2263,6 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
* for dp = 0, it is actually min,
* for dp = 100, it is max,
*/
int16_t
functionId
=
0
;
if
(
convertFunctionId
(
optr
,
&
functionId
)
!=
TSDB_CODE_SUCCESS
)
{
return
TSDB_CODE_TSC_INVALID_SQL
;
}
tscInsertPrimaryTsSourceColumn
(
pQueryInfo
,
&
index
);
colIndex
+=
1
;
// the first column is ts
...
...
@@ -2299,11 +2276,6 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg5
);
}
int16_t
functionId
=
0
;
if
(
convertFunctionId
(
optr
,
&
functionId
)
!=
TSDB_CODE_SUCCESS
)
{
return
TSDB_CODE_TSC_INVALID_SQL
;
}
// todo REFACTOR
// set the first column ts for top/bottom query
SColumnIndex
index1
=
{
0
,
PRIMARYKEY_TIMESTAMP_COL_INDEX
};
...
...
@@ -2454,8 +2426,8 @@ void getColumnName(tSqlExprItem* pItem, char* resultFieldName, int32_t nameLengt
if
(
pItem
->
aliasName
!=
NULL
)
{
strncpy
(
resultFieldName
,
pItem
->
aliasName
,
nameLength
);
}
else
{
int32_t
len
=
((
int32_t
)
pItem
->
pNode
->
operand
.
n
<
nameLength
)
?
(
int32_t
)
pItem
->
pNode
->
operand
.
n
:
nameLength
;
strncpy
(
resultFieldName
,
pItem
->
pNode
->
operand
.
z
,
len
);
int32_t
len
=
((
int32_t
)
pItem
->
pNode
->
token
.
n
<
nameLength
)
?
(
int32_t
)
pItem
->
pNode
->
token
.
n
:
nameLength
;
strncpy
(
resultFieldName
,
pItem
->
pNode
->
token
.
z
,
len
);
}
}
...
...
@@ -2595,87 +2567,6 @@ int32_t getColumnIndexByName(SSqlCmd* pCmd, const SStrToken* pToken, SQueryInfo*
return
doGetColumnIndexByName
(
pCmd
,
&
tmpToken
,
pQueryInfo
,
pIndex
);
}
int32_t
convertFunctionId
(
int32_t
optr
,
int16_t
*
functionId
)
{
switch
(
optr
)
{
case
TSDB_FUNC_COUNT
:
*
functionId
=
TSDB_FUNC_COUNT
;
break
;
case
TSDB_FUNC_SUM
:
*
functionId
=
TSDB_FUNC_SUM
;
break
;
case
TSDB_FUNC_AVG
:
*
functionId
=
TSDB_FUNC_AVG
;
break
;
case
TSDB_FUNC_RATE
:
*
functionId
=
TSDB_FUNC_RATE
;
break
;
case
TSDB_FUNC_IRATE
:
*
functionId
=
TSDB_FUNC_IRATE
;
break
;
case
TSDB_FUNC_SUM_RATE
:
*
functionId
=
TSDB_FUNC_SUM_RATE
;
break
;
case
TSDB_FUNC_SUM_IRATE
:
*
functionId
=
TSDB_FUNC_SUM_IRATE
;
break
;
case
TSDB_FUNC_AVG_RATE
:
*
functionId
=
TSDB_FUNC_AVG_RATE
;
break
;
case
TSDB_FUNC_AVG_IRATE
:
*
functionId
=
TSDB_FUNC_AVG_IRATE
;
break
;
case
TSDB_FUNC_MIN
:
*
functionId
=
TSDB_FUNC_MIN
;
break
;
case
TSDB_FUNC_MAX
:
*
functionId
=
TSDB_FUNC_MAX
;
break
;
case
TSDB_FUNC_STDDEV
:
*
functionId
=
TSDB_FUNC_STDDEV
;
break
;
case
TSDB_FUNC_PERCT
:
*
functionId
=
TSDB_FUNC_PERCT
;
break
;
case
TSDB_FUNC_APERCT
:
*
functionId
=
TSDB_FUNC_APERCT
;
break
;
case
TSDB_FUNC_FIRST
:
*
functionId
=
TSDB_FUNC_FIRST
;
break
;
case
TSDB_FUNC_LAST
:
*
functionId
=
TSDB_FUNC_LAST
;
break
;
case
TSDB_FUNC_LEASTSQR
:
*
functionId
=
TSDB_FUNC_LEASTSQR
;
break
;
case
TSDB_FUNC_TOP
:
*
functionId
=
TSDB_FUNC_TOP
;
break
;
case
TSDB_FUNC_BOTTOM
:
*
functionId
=
TSDB_FUNC_BOTTOM
;
break
;
case
TSDB_FUNC_DIFF
:
*
functionId
=
TSDB_FUNC_DIFF
;
break
;
case
TSDB_FUNC_SPREAD
:
*
functionId
=
TSDB_FUNC_SPREAD
;
break
;
case
TSDB_FUNC_TWA
:
*
functionId
=
TSDB_FUNC_TWA
;
break
;
case
TSDB_FUNC_INTERP
:
*
functionId
=
TSDB_FUNC_INTERP
;
break
;
case
TSDB_FUNC_LAST_ROW
:
*
functionId
=
TSDB_FUNC_LAST_ROW
;
break
;
default:
return
-
1
;
}
return
TSDB_CODE_SUCCESS
;
}
int32_t
setShowInfo
(
SSqlObj
*
pSql
,
struct
SSqlInfo
*
pInfo
)
{
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
STableMetaInfo
*
pTableMetaInfo
=
tscGetTableMetaInfoFromCmd
(
pCmd
,
pCmd
->
clauseIndex
,
0
);
...
...
@@ -3109,39 +3000,39 @@ static int32_t doExtractColumnFilterInfo(SSqlCmd* pCmd, SQueryInfo* pQueryInfo,
colType
=
TSDB_DATA_TYPE_BIGINT
;
}
else
if
(
colType
==
TSDB_DATA_TYPE_FLOAT
||
colType
==
TSDB_DATA_TYPE_DOUBLE
)
{
colType
=
TSDB_DATA_TYPE_DOUBLE
;
}
else
if
((
colType
==
TSDB_DATA_TYPE_TIMESTAMP
)
&&
(
TSDB_DATA_TYPE_BINARY
==
pRight
->
val
.
nType
))
{
int
retVal
=
setColumnFilterInfoForTimestamp
(
pCmd
,
pQueryInfo
,
&
pRight
->
val
);
}
else
if
((
colType
==
TSDB_DATA_TYPE_TIMESTAMP
)
&&
(
TSDB_DATA_TYPE_BINARY
==
pRight
->
val
ue
.
nType
))
{
int
retVal
=
setColumnFilterInfoForTimestamp
(
pCmd
,
pQueryInfo
,
&
pRight
->
val
ue
);
if
(
TSDB_CODE_SUCCESS
!=
retVal
)
{
return
retVal
;
}
}
int32_t
retVal
=
TSDB_CODE_SUCCESS
;
if
(
pExpr
->
nSQLOptr
==
TK_LE
||
pExpr
->
nSQLOptr
==
TK_LT
)
{
retVal
=
tVariantDump
(
&
pRight
->
val
,
(
char
*
)
&
pColumnFilter
->
upperBndd
,
colType
,
false
);
if
(
pExpr
->
tokenId
==
TK_LE
||
pExpr
->
tokenId
==
TK_LT
)
{
retVal
=
tVariantDump
(
&
pRight
->
val
ue
,
(
char
*
)
&
pColumnFilter
->
upperBndd
,
colType
,
false
);
// TK_GT,TK_GE,TK_EQ,TK_NE are based on the pColumn->lowerBndd
}
else
if
(
colType
==
TSDB_DATA_TYPE_BINARY
)
{
pColumnFilter
->
pz
=
(
int64_t
)
calloc
(
1
,
pRight
->
val
.
nLen
+
TSDB_NCHAR_SIZE
);
pColumnFilter
->
len
=
pRight
->
val
.
nLen
;
retVal
=
tVariantDump
(
&
pRight
->
val
,
(
char
*
)
pColumnFilter
->
pz
,
colType
,
false
);
pColumnFilter
->
pz
=
(
int64_t
)
calloc
(
1
,
pRight
->
val
ue
.
nLen
+
TSDB_NCHAR_SIZE
);
pColumnFilter
->
len
=
pRight
->
val
ue
.
nLen
;
retVal
=
tVariantDump
(
&
pRight
->
val
ue
,
(
char
*
)
pColumnFilter
->
pz
,
colType
,
false
);
}
else
if
(
colType
==
TSDB_DATA_TYPE_NCHAR
)
{
// pRight->val.nLen + 1 is larger than the actual nchar string length
pColumnFilter
->
pz
=
(
int64_t
)
calloc
(
1
,
(
pRight
->
val
.
nLen
+
1
)
*
TSDB_NCHAR_SIZE
);
retVal
=
tVariantDump
(
&
pRight
->
val
,
(
char
*
)
pColumnFilter
->
pz
,
colType
,
false
);
// pRight->val
ue
.nLen + 1 is larger than the actual nchar string length
pColumnFilter
->
pz
=
(
int64_t
)
calloc
(
1
,
(
pRight
->
val
ue
.
nLen
+
1
)
*
TSDB_NCHAR_SIZE
);
retVal
=
tVariantDump
(
&
pRight
->
val
ue
,
(
char
*
)
pColumnFilter
->
pz
,
colType
,
false
);
size_t
len
=
twcslen
((
wchar_t
*
)
pColumnFilter
->
pz
);
pColumnFilter
->
len
=
len
*
TSDB_NCHAR_SIZE
;
}
else
{
retVal
=
tVariantDump
(
&
pRight
->
val
,
(
char
*
)
&
pColumnFilter
->
lowerBndd
,
colType
,
false
);
retVal
=
tVariantDump
(
&
pRight
->
val
ue
,
(
char
*
)
&
pColumnFilter
->
lowerBndd
,
colType
,
false
);
}
if
(
retVal
!=
TSDB_CODE_SUCCESS
)
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg
);
}
switch
(
pExpr
->
nSQLOptr
)
{
switch
(
pExpr
->
tokenId
)
{
case
TK_LE
:
pColumnFilter
->
upperRelOptr
=
TSDB_RELATION_LESS_EQUAL
;
break
;
...
...
@@ -3194,14 +3085,14 @@ typedef struct SCondExpr {
static
int32_t
getTimeRange
(
STimeWindow
*
win
,
tSQLExpr
*
pRight
,
int32_t
optr
,
int16_t
timePrecision
);
static
int32_t
tSQLExprNodeToString
(
tSQLExpr
*
pExpr
,
char
**
str
)
{
if
(
pExpr
->
nSQLOptr
==
TK_ID
)
{
// column name
if
(
pExpr
->
tokenId
==
TK_ID
)
{
// column name
strncpy
(
*
str
,
pExpr
->
colInfo
.
z
,
pExpr
->
colInfo
.
n
);
*
str
+=
pExpr
->
colInfo
.
n
;
}
else
if
(
pExpr
->
nSQLOptr
>=
TK_BOOL
&&
pExpr
->
nSQLOptr
<=
TK_STRING
)
{
// value
*
str
+=
tVariantToString
(
&
pExpr
->
val
,
*
str
);
}
else
if
(
pExpr
->
tokenId
>=
TK_BOOL
&&
pExpr
->
tokenId
<=
TK_STRING
)
{
// value
*
str
+=
tVariantToString
(
&
pExpr
->
val
ue
,
*
str
);
}
else
if
(
pExpr
->
nSQLOptr
>=
TSDB_FUNC_COUNT
&&
pExpr
->
nSQLOptr
<=
TSDB_FUNC_BLKINFO
)
{
}
else
if
(
pExpr
->
tokenId
>=
TSDB_FUNC_COUNT
&&
pExpr
->
tokenId
<=
TSDB_FUNC_BLKINFO
)
{
/*
* arithmetic expression of aggregation, such as count(ts) + count(ts) *2
*/
...
...
@@ -3214,10 +3105,10 @@ static int32_t tSQLExprNodeToString(tSQLExpr* pExpr, char** str) {
return
TSDB_CODE_SUCCESS
;
}
// pExpr->
nSQLOptr
== 0 while handling "is null" query
// pExpr->
tokenId
== 0 while handling "is null" query
static
bool
isExprLeafNode
(
tSQLExpr
*
pExpr
)
{
return
(
pExpr
->
pRight
==
NULL
&&
pExpr
->
pLeft
==
NULL
)
&&
(
pExpr
->
nSQLOptr
==
0
||
pExpr
->
nSQLOptr
==
TK_ID
||
(
pExpr
->
nSQLOptr
>=
TK_BOOL
&&
pExpr
->
nSQLOptr
<=
TK_NCHAR
)
||
pExpr
->
nSQLOptr
==
TK_SET
);
(
pExpr
->
tokenId
==
0
||
pExpr
->
tokenId
==
TK_ID
||
(
pExpr
->
tokenId
>=
TK_BOOL
&&
pExpr
->
tokenId
<=
TK_NCHAR
)
||
pExpr
->
tokenId
==
TK_SET
);
}
static
bool
isExprDirectParentOfLeafNode
(
tSQLExpr
*
pExpr
)
{
...
...
@@ -3259,7 +3150,7 @@ static int32_t optrToString(tSQLExpr* pExpr, char** exprString) {
const
char
*
ne
=
"<>"
;
const
char
*
likeOptr
=
"LIKE"
;
switch
(
pExpr
->
nSQLOptr
)
{
switch
(
pExpr
->
tokenId
)
{
case
TK_LE
:
{
*
(
int16_t
*
)(
*
exprString
)
=
*
(
int16_t
*
)
le
;
*
exprString
+=
1
;
...
...
@@ -3326,13 +3217,13 @@ static int32_t tablenameListToString(tSQLExpr* pExpr, SStringBuilder* sb) {
for
(
int32_t
i
=
0
;
i
<
pList
->
nExpr
;
++
i
)
{
tSQLExpr
*
pSub
=
pList
->
a
[
i
].
pNode
;
taosStringBuilderAppendStringLen
(
sb
,
pSub
->
val
.
pz
,
pSub
->
val
.
nLen
);
taosStringBuilderAppendStringLen
(
sb
,
pSub
->
val
ue
.
pz
,
pSub
->
value
.
nLen
);
if
(
i
<
pList
->
nExpr
-
1
)
{
taosStringBuilderAppendString
(
sb
,
TBNAME_LIST_SEP
);
}
if
(
pSub
->
val
.
nLen
<=
0
||
!
tscValidateTableNameLength
(
pSub
->
val
.
nLen
))
{
if
(
pSub
->
val
ue
.
nLen
<=
0
||
!
tscValidateTableNameLength
(
pSub
->
value
.
nLen
))
{
return
TSDB_CODE_TSC_INVALID_SQL
;
}
}
...
...
@@ -3342,7 +3233,7 @@ static int32_t tablenameListToString(tSQLExpr* pExpr, SStringBuilder* sb) {
static
int32_t
tablenameCondToString
(
tSQLExpr
*
pExpr
,
SStringBuilder
*
sb
)
{
taosStringBuilderAppendStringLen
(
sb
,
QUERY_COND_REL_PREFIX_LIKE
,
QUERY_COND_REL_PREFIX_LIKE_LEN
);
taosStringBuilderAppendString
(
sb
,
pExpr
->
val
.
pz
);
taosStringBuilderAppendString
(
sb
,
pExpr
->
val
ue
.
pz
);
return
TSDB_CODE_SUCCESS
;
}
...
...
@@ -3396,21 +3287,21 @@ static int32_t extractColumnFilterInfo(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SC
((
pSchema
->
type
==
TSDB_DATA_TYPE_BINARY
||
pSchema
->
type
==
TSDB_DATA_TYPE_NCHAR
)
?
1
:
0
);
if
(
pColFilter
->
filterstr
)
{
if
(
pExpr
->
nSQLOptr
!=
TK_EQ
&&
pExpr
->
nSQLOptr
!=
TK_NE
&&
pExpr
->
nSQLOptr
!=
TK_ISNULL
&&
pExpr
->
nSQLOptr
!=
TK_NOTNULL
&&
pExpr
->
nSQLOptr
!=
TK_LIKE
if
(
pExpr
->
tokenId
!=
TK_EQ
&&
pExpr
->
tokenId
!=
TK_NE
&&
pExpr
->
tokenId
!=
TK_ISNULL
&&
pExpr
->
tokenId
!=
TK_NOTNULL
&&
pExpr
->
tokenId
!=
TK_LIKE
)
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg2
);
}
}
else
{
if
(
pExpr
->
nSQLOptr
==
TK_LIKE
)
{
if
(
pExpr
->
tokenId
==
TK_LIKE
)
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg1
);
}
if
(
pSchema
->
type
==
TSDB_DATA_TYPE_BOOL
)
{
if
(
pExpr
->
nSQLOptr
!=
TK_EQ
&&
pExpr
->
nSQLOptr
!=
TK_NE
)
{
if
(
pExpr
->
tokenId
!=
TK_EQ
&&
pExpr
->
tokenId
!=
TK_NE
)
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg3
);
}
}
...
...
@@ -3421,13 +3312,13 @@ static int32_t extractColumnFilterInfo(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SC
}
static
void
relToString
(
tSQLExpr
*
pExpr
,
char
**
str
)
{
assert
(
pExpr
->
nSQLOptr
==
TK_AND
||
pExpr
->
nSQLOptr
==
TK_OR
);
assert
(
pExpr
->
tokenId
==
TK_AND
||
pExpr
->
tokenId
==
TK_OR
);
const
char
*
or
=
"OR"
;
const
char
*
and
=
"AND"
;
// if (pQueryInfo->tagCond.relType == TSQL_STABLE_QTYPE_COND) {
if
(
pExpr
->
nSQLOptr
==
TK_AND
)
{
if
(
pExpr
->
tokenId
==
TK_AND
)
{
strcpy
(
*
str
,
and
);
*
str
+=
strlen
(
and
);
}
else
{
...
...
@@ -3481,10 +3372,10 @@ static int32_t getTablenameCond(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSQLExpr*
int32_t
ret
=
TSDB_CODE_SUCCESS
;
if
(
pTableCond
->
nSQLOptr
==
TK_IN
)
{
if
(
pTableCond
->
tokenId
==
TK_IN
)
{
ret
=
tablenameListToString
(
pRight
,
sb
);
}
else
if
(
pTableCond
->
nSQLOptr
==
TK_LIKE
)
{
if
(
pRight
->
nSQLOptr
!=
TK_STRING
)
{
}
else
if
(
pTableCond
->
tokenId
==
TK_LIKE
)
{
if
(
pRight
->
tokenId
!=
TK_STRING
)
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg1
);
}
...
...
@@ -3504,12 +3395,12 @@ static int32_t getColumnQueryCondInfo(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSQ
}
if
(
!
isExprDirectParentOfLeafNode
(
pExpr
))
{
// internal node
int32_t
ret
=
getColumnQueryCondInfo
(
pCmd
,
pQueryInfo
,
pExpr
->
pLeft
,
pExpr
->
nSQLOptr
);
int32_t
ret
=
getColumnQueryCondInfo
(
pCmd
,
pQueryInfo
,
pExpr
->
pLeft
,
pExpr
->
tokenId
);
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
return
ret
;
}
return
getColumnQueryCondInfo
(
pCmd
,
pQueryInfo
,
pExpr
->
pRight
,
pExpr
->
nSQLOptr
);
return
getColumnQueryCondInfo
(
pCmd
,
pQueryInfo
,
pExpr
->
pRight
,
pExpr
->
tokenId
);
}
else
{
// handle leaf node
SColumnIndex
index
=
COLUMN_INDEX_INITIALIZER
;
if
(
getColumnIndexByName
(
pCmd
,
&
pExpr
->
pLeft
->
colInfo
,
pQueryInfo
,
&
index
)
!=
TSDB_CODE_SUCCESS
)
{
...
...
@@ -3579,8 +3470,8 @@ static int32_t getJoinCondInfo(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSQLExpr*
}
static
int32_t
validateSQLExpr
(
SSqlCmd
*
pCmd
,
tSQLExpr
*
pExpr
,
SQueryInfo
*
pQueryInfo
,
SColumnList
*
pList
,
int32_t
*
type
,
uint64_t
*
uid
)
{
if
(
pExpr
->
nSQLOptr
==
TK_ID
)
{
int32_t
*
type
,
uint64_t
*
uid
)
{
if
(
pExpr
->
type
==
SQL_NODE_TABLE_COLUMN
)
{
if
(
*
type
==
NON_ARITHMEIC_EXPR
)
{
*
type
=
NORMAL_ARITHMETIC
;
}
else
if
(
*
type
==
AGG_ARIGHTMEIC
)
{
...
...
@@ -3602,9 +3493,9 @@ static int32_t validateSQLExpr(SSqlCmd* pCmd, tSQLExpr* pExpr, SQueryInfo* pQuer
}
pList
->
ids
[
pList
->
num
++
]
=
index
;
}
else
if
(
pExpr
->
nSQLOptr
==
TK_FLOAT
&&
(
isnan
(
pExpr
->
val
.
dKey
)
||
isinf
(
pExpr
->
val
.
dKey
)))
{
}
else
if
(
pExpr
->
tokenId
==
TK_FLOAT
&&
(
isnan
(
pExpr
->
value
.
dKey
)
||
isinf
(
pExpr
->
value
.
dKey
)))
{
return
TSDB_CODE_TSC_INVALID_SQL
;
}
else
if
(
pExpr
->
nSQLOptr
>=
TSDB_FUNC_COUNT
&&
pExpr
->
nSQLOptr
<=
TSDB_FUNC_AVG_IRATE
)
{
}
else
if
(
pExpr
->
type
==
SQL_NODE_SQLFUNCTION
)
{
if
(
*
type
==
NON_ARITHMEIC_EXPR
)
{
*
type
=
AGG_ARIGHTMEIC
;
}
else
if
(
*
type
==
NORMAL_ARITHMETIC
)
{
...
...
@@ -3617,6 +3508,11 @@ static int32_t validateSQLExpr(SSqlCmd* pCmd, tSQLExpr* pExpr, SQueryInfo* pQuer
// sql function list in selection clause.
// Append the sqlExpr into exprList of pQueryInfo structure sequentially
pExpr
->
functionId
=
isValidFunction
(
pExpr
->
operand
.
z
,
pExpr
->
operand
.
n
);
if
(
pExpr
->
functionId
<
0
)
{
return
TSDB_CODE_TSC_INVALID_SQL
;
}
if
(
addExprAndResultField
(
pCmd
,
pQueryInfo
,
outputIndex
,
&
item
,
false
)
!=
TSDB_CODE_SUCCESS
)
{
return
TSDB_CODE_TSC_INVALID_SQL
;
}
...
...
@@ -3658,7 +3554,7 @@ static int32_t validateArithmeticSQLExpr(SSqlCmd* pCmd, tSQLExpr* pExpr, SQueryI
uint64_t
uidLeft
=
0
;
uint64_t
uidRight
=
0
;
if
(
pLeft
->
nSQLOptr
>=
TK_PLUS
&&
pLeft
->
nSQLOptr
<=
TK_REM
)
{
if
(
pLeft
->
type
==
SQL_NODE_EXPR
)
{
int32_t
ret
=
validateArithmeticSQLExpr
(
pCmd
,
pLeft
,
pQueryInfo
,
pList
,
type
);
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
return
ret
;
...
...
@@ -3671,7 +3567,7 @@ static int32_t validateArithmeticSQLExpr(SSqlCmd* pCmd, tSQLExpr* pExpr, SQueryI
}
tSQLExpr
*
pRight
=
pExpr
->
pRight
;
if
(
pRight
->
nSQLOptr
>=
TK_PLUS
&&
pRight
->
nSQLOptr
<=
TK_REM
)
{
if
(
pRight
->
type
==
SQL_NODE_EXPR
)
{
int32_t
ret
=
validateArithmeticSQLExpr
(
pCmd
,
pRight
,
pQueryInfo
,
pList
,
type
);
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
return
ret
;
...
...
@@ -3704,22 +3600,15 @@ static bool isValidExpr(tSQLExpr* pLeft, tSQLExpr* pRight, int32_t optr) {
*
* However, columnA < 4+12 is valid
*/
if
(
pLeft
->
nSQLOptr
>=
TSDB_FUNC_COUNT
&&
pLeft
->
nSQLOptr
<=
TSDB_FUNC_AVG_IRATE
)
{
if
(
pLeft
->
type
==
SQL_NODE_SQLFUNCTION
)
{
return
false
;
}
if
(
pRight
==
NULL
)
{
return
true
;
}
if
(
pRight
->
nSQLOptr
>=
TSDB_FUNC_COUNT
&&
pRight
->
nSQLOptr
<=
TSDB_FUNC_AVG_IRATE
)
{
return
false
;
}
if
(
pLeft
->
nSQLOptr
>=
TK_BOOL
&&
pLeft
->
nSQLOptr
<=
TK_BINARY
&&
pRight
->
nSQLOptr
>=
TK_BOOL
&&
pRight
->
nSQLOptr
<=
TK_BINARY
)
{
if
(
pLeft
->
tokenId
>=
TK_BOOL
&&
pLeft
->
tokenId
<=
TK_BINARY
&&
pRight
->
tokenId
>=
TK_BOOL
&&
pRight
->
tokenId
<=
TK_BINARY
)
{
return
false
;
}
...
...
@@ -3730,8 +3619,8 @@ static void exchangeExpr(tSQLExpr* pExpr) {
tSQLExpr
*
pLeft
=
pExpr
->
pLeft
;
tSQLExpr
*
pRight
=
pExpr
->
pRight
;
if
(
pRight
->
nSQLOptr
==
TK_ID
&&
(
pLeft
->
nSQLOptr
==
TK_INTEGER
||
pLeft
->
nSQLOptr
==
TK_FLOAT
||
pLeft
->
nSQLOptr
==
TK_STRING
||
pLeft
->
nSQLOptr
==
TK_BOOL
))
{
if
(
pRight
->
tokenId
==
TK_ID
&&
(
pLeft
->
tokenId
==
TK_INTEGER
||
pLeft
->
tokenId
==
TK_FLOAT
||
pLeft
->
tokenId
==
TK_STRING
||
pLeft
->
tokenId
==
TK_BOOL
))
{
/*
* exchange value of the left handside and the value of the right-handside
* to make sure that the value of filter expression always locates in
...
...
@@ -3739,7 +3628,7 @@ static void exchangeExpr(tSQLExpr* pExpr) {
* the column-id is at the left handside.
*/
uint32_t
optr
=
0
;
switch
(
pExpr
->
nSQLOptr
)
{
switch
(
pExpr
->
tokenId
)
{
case
TK_LE
:
optr
=
TK_GE
;
break
;
...
...
@@ -3753,10 +3642,10 @@ static void exchangeExpr(tSQLExpr* pExpr) {
optr
=
TK_LE
;
break
;
default:
optr
=
pExpr
->
nSQLOptr
;
optr
=
pExpr
->
tokenId
;
}
pExpr
->
nSQLOptr
=
optr
;
pExpr
->
tokenId
=
optr
;
SWAP
(
pExpr
->
pLeft
,
pExpr
->
pRight
,
void
*
);
}
}
...
...
@@ -3770,11 +3659,11 @@ static bool validateJoinExprNode(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSQLExpr
tSQLExpr
*
pRight
=
pExpr
->
pRight
;
if
(
pRight
->
nSQLOptr
!=
TK_ID
)
{
if
(
pRight
->
tokenId
!=
TK_ID
)
{
return
true
;
}
if
(
pExpr
->
nSQLOptr
!=
TK_EQ
)
{
if
(
pExpr
->
tokenId
!=
TK_EQ
)
{
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg2
);
return
false
;
}
...
...
@@ -3816,7 +3705,7 @@ static bool validTableNameOptr(tSQLExpr* pExpr) {
const
char
nameFilterOptr
[]
=
{
TK_IN
,
TK_LIKE
};
for
(
int32_t
i
=
0
;
i
<
tListLen
(
nameFilterOptr
);
++
i
)
{
if
(
pExpr
->
nSQLOptr
==
nameFilterOptr
[
i
])
{
if
(
pExpr
->
tokenId
==
nameFilterOptr
[
i
])
{
return
true
;
}
}
...
...
@@ -3870,7 +3759,7 @@ static int32_t handleExprInQueryCond(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSQL
}
// set join query condition
if
(
pRight
->
nSQLOptr
==
TK_ID
)
{
// no need to keep the timestamp join condition
if
(
pRight
->
tokenId
==
TK_ID
)
{
// no need to keep the timestamp join condition
TSDB_QUERY_SET_TYPE
(
pQueryInfo
->
type
,
TSDB_QUERY_TYPE_JOIN_QUERY
);
pCondExpr
->
tsJoin
=
true
;
...
...
@@ -3892,8 +3781,8 @@ static int32_t handleExprInQueryCond(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSQL
}
// check for like expression
if
((
*
pExpr
)
->
nSQLOptr
==
TK_LIKE
)
{
if
(
pRight
->
val
.
nLen
>
TSDB_PATTERN_STRING_MAX_LEN
)
{
if
((
*
pExpr
)
->
tokenId
==
TK_LIKE
)
{
if
(
pRight
->
val
ue
.
nLen
>
TSDB_PATTERN_STRING_MAX_LEN
)
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg8
);
}
...
...
@@ -3926,7 +3815,7 @@ static int32_t handleExprInQueryCond(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSQL
*
type
=
TSQL_EXPR_TBNAME
;
*
pExpr
=
NULL
;
}
else
{
if
(
pRight
!=
NULL
&&
pRight
->
nSQLOptr
==
TK_ID
)
{
// join on tag columns for stable query
if
(
pRight
!=
NULL
&&
pRight
->
tokenId
==
TK_ID
)
{
// join on tag columns for stable query
if
(
!
validateJoinExprNode
(
pCmd
,
pQueryInfo
,
*
pExpr
,
&
index
))
{
return
TSDB_CODE_TSC_INVALID_SQL
;
}
...
...
@@ -3950,7 +3839,7 @@ static int32_t handleExprInQueryCond(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSQL
}
else
{
// query on other columns
*
type
=
TSQL_EXPR_COLUMN
;
if
(
pRight
->
nSQLOptr
==
TK_ID
)
{
// other column cannot be served as the join column
if
(
pRight
->
tokenId
==
TK_ID
)
{
// other column cannot be served as the join column
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg5
);
}
...
...
@@ -3972,7 +3861,7 @@ int32_t getQueryCondExpr(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSQLExpr** pExpr
tSQLExpr
*
pLeft
=
(
*
pExpr
)
->
pLeft
;
tSQLExpr
*
pRight
=
(
*
pExpr
)
->
pRight
;
if
(
!
isValidExpr
(
pLeft
,
pRight
,
(
*
pExpr
)
->
nSQLOptr
))
{
if
(
!
isValidExpr
(
pLeft
,
pRight
,
(
*
pExpr
)
->
tokenId
))
{
return
TSDB_CODE_TSC_INVALID_SQL
;
}
...
...
@@ -3980,12 +3869,12 @@ int32_t getQueryCondExpr(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSQLExpr** pExpr
int32_t
rightType
=
-
1
;
if
(
!
isExprDirectParentOfLeafNode
(
*
pExpr
))
{
int32_t
ret
=
getQueryCondExpr
(
pCmd
,
pQueryInfo
,
&
(
*
pExpr
)
->
pLeft
,
pCondExpr
,
&
leftType
,
(
*
pExpr
)
->
nSQLOptr
);
int32_t
ret
=
getQueryCondExpr
(
pCmd
,
pQueryInfo
,
&
(
*
pExpr
)
->
pLeft
,
pCondExpr
,
&
leftType
,
(
*
pExpr
)
->
tokenId
);
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
return
ret
;
}
ret
=
getQueryCondExpr
(
pCmd
,
pQueryInfo
,
&
(
*
pExpr
)
->
pRight
,
pCondExpr
,
&
rightType
,
(
*
pExpr
)
->
nSQLOptr
);
ret
=
getQueryCondExpr
(
pCmd
,
pQueryInfo
,
&
(
*
pExpr
)
->
pRight
,
pCondExpr
,
&
rightType
,
(
*
pExpr
)
->
tokenId
);
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
return
ret
;
}
...
...
@@ -3995,7 +3884,7 @@ int32_t getQueryCondExpr(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSQLExpr** pExpr
* expression is not valid for parent node, it must be TK_AND operator.
*/
if
(
leftType
!=
rightType
)
{
if
((
*
pExpr
)
->
nSQLOptr
==
TK_OR
&&
(
leftType
+
rightType
!=
TSQL_EXPR_TBNAME
+
TSQL_EXPR_TAG
))
{
if
((
*
pExpr
)
->
tokenId
==
TK_OR
&&
(
leftType
+
rightType
!=
TSQL_EXPR_TBNAME
+
TSQL_EXPR_TAG
))
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg1
);
}
}
...
...
@@ -4023,7 +3912,7 @@ static void doCompactQueryExpr(tSQLExpr** pExpr) {
}
if
((
*
pExpr
)
->
pLeft
==
NULL
&&
(
*
pExpr
)
->
pRight
==
NULL
&&
((
*
pExpr
)
->
nSQLOptr
==
TK_OR
||
(
*
pExpr
)
->
nSQLOptr
==
TK_AND
))
{
((
*
pExpr
)
->
tokenId
==
TK_OR
||
(
*
pExpr
)
->
tokenId
==
TK_AND
))
{
tSqlExprNodeDestroy
(
*
pExpr
);
*
pExpr
=
NULL
;
...
...
@@ -4057,7 +3946,7 @@ static void doExtractExprForSTable(SSqlCmd* pCmd, tSQLExpr** pExpr, SQueryInfo*
(
*
pExpr
)
=
NULL
;
}
else
{
*
pOut
=
tSqlExprCreate
(
NULL
,
NULL
,
(
*
pExpr
)
->
nSQLOptr
);
*
pOut
=
tSqlExprCreate
(
NULL
,
NULL
,
(
*
pExpr
)
->
tokenId
);
doExtractExprForSTable
(
pCmd
,
&
(
*
pExpr
)
->
pLeft
,
pQueryInfo
,
&
((
*
pOut
)
->
pLeft
),
tableIndex
);
doExtractExprForSTable
(
pCmd
,
&
(
*
pExpr
)
->
pRight
,
pQueryInfo
,
&
((
*
pOut
)
->
pRight
),
tableIndex
);
...
...
@@ -4101,9 +3990,9 @@ static int32_t setTableCondForSTableQuery(SSqlCmd* pCmd, SQueryInfo* pQueryInfo,
STagCond
*
pTagCond
=
&
pQueryInfo
->
tagCond
;
pTagCond
->
tbnameCond
.
uid
=
pTableMetaInfo
->
pTableMeta
->
id
.
uid
;
assert
(
pExpr
->
nSQLOptr
==
TK_LIKE
||
pExpr
->
nSQLOptr
==
TK_IN
);
assert
(
pExpr
->
tokenId
==
TK_LIKE
||
pExpr
->
tokenId
==
TK_IN
);
if
(
pExpr
->
nSQLOptr
==
TK_LIKE
)
{
if
(
pExpr
->
tokenId
==
TK_LIKE
)
{
char
*
str
=
taosStringBuilderGetResult
(
sb
,
NULL
);
pQueryInfo
->
tagCond
.
tbnameCond
.
cond
=
strdup
(
str
);
pQueryInfo
->
tagCond
.
tbnameCond
.
len
=
(
int32_t
)
strlen
(
str
);
...
...
@@ -4199,7 +4088,7 @@ static int32_t getTimeRangeFromExpr(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSQLE
}
if
(
!
isExprDirectParentOfLeafNode
(
pExpr
))
{
if
(
pExpr
->
nSQLOptr
==
TK_OR
)
{
if
(
pExpr
->
tokenId
==
TK_OR
)
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg1
);
}
...
...
@@ -4218,7 +4107,7 @@ static int32_t getTimeRangeFromExpr(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSQLE
tSQLExpr
*
pRight
=
pExpr
->
pRight
;
STimeWindow
win
=
{.
skey
=
INT64_MIN
,
.
ekey
=
INT64_MAX
};
if
(
getTimeRange
(
&
win
,
pRight
,
pExpr
->
nSQLOptr
,
tinfo
.
precision
)
!=
TSDB_CODE_SUCCESS
)
{
if
(
getTimeRange
(
&
win
,
pRight
,
pExpr
->
tokenId
,
tinfo
.
precision
)
!=
TSDB_CODE_SUCCESS
)
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg0
);
}
...
...
@@ -4362,7 +4251,7 @@ static int32_t validateTagCondExpr(SSqlCmd* pCmd, tExprNode *p) {
retVal
=
tVariantDump
(
vVariant
,
tmp
,
schemaType
,
false
);
free
(
tmp
);
}
else
if
(
schemaType
==
TSDB_DATA_TYPE_NCHAR
)
{
// pRight->val.nLen + 1 is larger than the actual nchar string length
// pRight->val
ue
.nLen + 1 is larger than the actual nchar string length
char
*
tmp
=
calloc
(
1
,
(
vVariant
->
nLen
+
1
)
*
TSDB_NCHAR_SIZE
);
retVal
=
tVariantDump
(
vVariant
,
tmp
,
schemaType
,
false
);
free
(
tmp
);
...
...
@@ -4461,7 +4350,7 @@ int32_t parseWhereClause(SQueryInfo* pQueryInfo, tSQLExpr** pExpr, SSqlObj* pSql
}
int32_t
type
=
0
;
if
((
ret
=
getQueryCondExpr
(
&
pSql
->
cmd
,
pQueryInfo
,
pExpr
,
&
condExpr
,
&
type
,
(
*
pExpr
)
->
nSQLOptr
))
!=
TSDB_CODE_SUCCESS
)
{
if
((
ret
=
getQueryCondExpr
(
&
pSql
->
cmd
,
pQueryInfo
,
pExpr
,
&
condExpr
,
&
type
,
(
*
pExpr
)
->
tokenId
))
!=
TSDB_CODE_SUCCESS
)
{
return
ret
;
}
...
...
@@ -4518,7 +4407,7 @@ int32_t parseWhereClause(SQueryInfo* pQueryInfo, tSQLExpr** pExpr, SSqlObj* pSql
int32_t
getTimeRange
(
STimeWindow
*
win
,
tSQLExpr
*
pRight
,
int32_t
optr
,
int16_t
timePrecision
)
{
// this is join condition, do nothing
if
(
pRight
->
nSQLOptr
==
TK_ID
)
{
if
(
pRight
->
tokenId
==
TK_ID
)
{
return
TSDB_CODE_SUCCESS
;
}
...
...
@@ -4526,42 +4415,42 @@ int32_t getTimeRange(STimeWindow* win, tSQLExpr* pRight, int32_t optr, int16_t t
* filter primary ts filter expression like:
* where ts in ('2015-12-12 4:8:12')
*/
if
(
pRight
->
nSQLOptr
==
TK_SET
||
optr
==
TK_IN
)
{
if
(
pRight
->
tokenId
==
TK_SET
||
optr
==
TK_IN
)
{
return
TSDB_CODE_TSC_INVALID_SQL
;
}
int64_t
val
=
0
;
bool
parsed
=
false
;
if
(
pRight
->
val
.
nType
==
TSDB_DATA_TYPE_BINARY
)
{
pRight
->
val
.
nLen
=
strdequote
(
pRight
->
val
.
pz
);
if
(
pRight
->
val
ue
.
nType
==
TSDB_DATA_TYPE_BINARY
)
{
pRight
->
val
ue
.
nLen
=
strdequote
(
pRight
->
value
.
pz
);
char
*
seg
=
strnchr
(
pRight
->
val
.
pz
,
'-'
,
pRight
->
val
.
nLen
,
false
);
char
*
seg
=
strnchr
(
pRight
->
val
ue
.
pz
,
'-'
,
pRight
->
value
.
nLen
,
false
);
if
(
seg
!=
NULL
)
{
if
(
taosParseTime
(
pRight
->
val
.
pz
,
&
val
,
pRight
->
val
.
nLen
,
TSDB_TIME_PRECISION_MICRO
,
tsDaylight
)
==
TSDB_CODE_SUCCESS
)
{
if
(
taosParseTime
(
pRight
->
val
ue
.
pz
,
&
val
,
pRight
->
value
.
nLen
,
TSDB_TIME_PRECISION_MICRO
,
tsDaylight
)
==
TSDB_CODE_SUCCESS
)
{
parsed
=
true
;
}
else
{
return
TSDB_CODE_TSC_INVALID_SQL
;
}
}
else
{
SStrToken
token
=
{.
z
=
pRight
->
val
.
pz
,
.
n
=
pRight
->
val
.
nLen
,
.
type
=
TK_ID
};
int32_t
len
=
tSQLGetToken
(
pRight
->
val
.
pz
,
&
token
.
type
);
SStrToken
token
=
{.
z
=
pRight
->
val
ue
.
pz
,
.
n
=
pRight
->
value
.
nLen
,
.
type
=
TK_ID
};
int32_t
len
=
tSQLGetToken
(
pRight
->
val
ue
.
pz
,
&
token
.
type
);
if
((
token
.
type
!=
TK_INTEGER
&&
token
.
type
!=
TK_FLOAT
)
||
len
!=
pRight
->
val
.
nLen
)
{
if
((
token
.
type
!=
TK_INTEGER
&&
token
.
type
!=
TK_FLOAT
)
||
len
!=
pRight
->
val
ue
.
nLen
)
{
return
TSDB_CODE_TSC_INVALID_SQL
;
}
}
}
else
if
(
pRight
->
nSQLOptr
==
TK_INTEGER
&&
timePrecision
==
TSDB_TIME_PRECISION_MILLI
)
{
}
else
if
(
pRight
->
tokenId
==
TK_INTEGER
&&
timePrecision
==
TSDB_TIME_PRECISION_MILLI
)
{
/*
* if the pRight->
nSQLOptr
== TK_INTEGER/TK_FLOAT, the value is adaptive, we
* if the pRight->
tokenId
== TK_INTEGER/TK_FLOAT, the value is adaptive, we
* need the time precision in metermeta to transfer the value in MICROSECOND
*
* Additional check to avoid data overflow
*/
if
(
pRight
->
val
.
i64
<=
INT64_MAX
/
1000
)
{
pRight
->
val
.
i64
*=
1000
;
if
(
pRight
->
val
ue
.
i64
<=
INT64_MAX
/
1000
)
{
pRight
->
val
ue
.
i64
*=
1000
;
}
}
else
if
(
pRight
->
nSQLOptr
==
TK_FLOAT
&&
timePrecision
==
TSDB_TIME_PRECISION_MILLI
)
{
pRight
->
val
.
dKey
*=
1000
;
}
else
if
(
pRight
->
tokenId
==
TK_FLOAT
&&
timePrecision
==
TSDB_TIME_PRECISION_MILLI
)
{
pRight
->
val
ue
.
dKey
*=
1000
;
}
if
(
!
parsed
)
{
...
...
@@ -4569,7 +4458,7 @@ int32_t getTimeRange(STimeWindow* win, tSQLExpr* pRight, int32_t optr, int16_t t
* failed to parse timestamp in regular formation, try next
* it may be a epoch time in string format
*/
tVariantDump
(
&
pRight
->
val
,
(
char
*
)
&
val
,
TSDB_DATA_TYPE_BIGINT
,
true
);
tVariantDump
(
&
pRight
->
val
ue
,
(
char
*
)
&
val
,
TSDB_DATA_TYPE_BIGINT
,
true
);
/*
* transfer it into MICROSECOND format if it is a string, since for
...
...
@@ -4577,7 +4466,7 @@ int32_t getTimeRange(STimeWindow* win, tSQLExpr* pRight, int32_t optr, int16_t t
*
* additional check to avoid data overflow
*/
if
(
pRight
->
nSQLOptr
==
TK_STRING
&&
timePrecision
==
TSDB_TIME_PRECISION_MILLI
)
{
if
(
pRight
->
tokenId
==
TK_STRING
&&
timePrecision
==
TSDB_TIME_PRECISION_MILLI
)
{
if
(
val
<=
INT64_MAX
/
1000
)
{
val
*=
1000
;
}
...
...
@@ -6860,25 +6749,25 @@ int32_t exprTreeFromSqlExpr(SSqlCmd* pCmd, tExprNode **pExpr, const tSQLExpr* pS
}
}
if
(
pSqlExpr
->
pLeft
==
NULL
&&
pSqlExpr
->
pRight
==
NULL
&&
pSqlExpr
->
nSQLOptr
==
0
)
{
if
(
pSqlExpr
->
pLeft
==
NULL
&&
pSqlExpr
->
pRight
==
NULL
&&
pSqlExpr
->
tokenId
==
0
)
{
*
pExpr
=
calloc
(
1
,
sizeof
(
tExprNode
));
return
TSDB_CODE_SUCCESS
;
}
if
(
pSqlExpr
->
pLeft
==
NULL
)
{
if
(
pSqlExpr
->
nSQLOptr
>=
TK_BOOL
&&
pSqlExpr
->
nSQLOptr
<=
TK_STRING
)
{
if
(
pSqlExpr
->
type
==
SQL_NODE_VALUE
)
{
*
pExpr
=
calloc
(
1
,
sizeof
(
tExprNode
));
(
*
pExpr
)
->
nodeType
=
TSQL_NODE_VALUE
;
(
*
pExpr
)
->
pVal
=
calloc
(
1
,
sizeof
(
tVariant
));
tVariantAssign
((
*
pExpr
)
->
pVal
,
&
pSqlExpr
->
val
);
tVariantAssign
((
*
pExpr
)
->
pVal
,
&
pSqlExpr
->
val
ue
);
return
TSDB_CODE_SUCCESS
;
}
else
if
(
pSqlExpr
->
nSQLOptr
>=
TSDB_FUNC_COUNT
&&
pSqlExpr
->
nSQLOptr
<=
TSDB_FUNC_BLKINFO
)
{
}
else
if
(
pSqlExpr
->
type
==
SQL_NODE_SQLFUNCTION
)
{
// arithmetic expression on the results of aggregation functions
*
pExpr
=
calloc
(
1
,
sizeof
(
tExprNode
));
(
*
pExpr
)
->
nodeType
=
TSQL_NODE_COL
;
(
*
pExpr
)
->
pSchema
=
calloc
(
1
,
sizeof
(
SSchema
));
strncpy
((
*
pExpr
)
->
pSchema
->
name
,
pSqlExpr
->
operand
.
z
,
pSqlExpr
->
operand
.
n
);
strncpy
((
*
pExpr
)
->
pSchema
->
name
,
pSqlExpr
->
token
.
z
,
pSqlExpr
->
token
.
n
);
// set the input column data byte and type.
size_t
size
=
taosArrayGetSize
(
pQueryInfo
->
exprList
);
...
...
@@ -6898,7 +6787,7 @@ int32_t exprTreeFromSqlExpr(SSqlCmd* pCmd, tExprNode **pExpr, const tSQLExpr* pS
break
;
}
}
}
else
if
(
pSqlExpr
->
nSQLOptr
==
TK_ID
)
{
// column name, normal column arithmetic expression
}
else
if
(
pSqlExpr
->
type
==
SQL_NODE_TABLE_COLUMN
)
{
// column name, normal column arithmetic expression
SColumnIndex
index
=
COLUMN_INDEX_INITIALIZER
;
int32_t
ret
=
getColumnIndexByName
(
pCmd
,
&
pSqlExpr
->
colInfo
,
pQueryInfo
,
&
index
);
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
...
...
@@ -6938,7 +6827,7 @@ int32_t exprTreeFromSqlExpr(SSqlCmd* pCmd, tExprNode **pExpr, const tSQLExpr* pS
(
*
pExpr
)
->
_node
.
pLeft
=
pLeft
;
(
*
pExpr
)
->
_node
.
pRight
=
pRight
;
SStrToken
t
=
{.
type
=
pSqlExpr
->
nSQLOptr
};
SStrToken
t
=
{.
type
=
pSqlExpr
->
tokenId
};
(
*
pExpr
)
->
_node
.
optr
=
convertOptr
(
&
t
);
assert
((
*
pExpr
)
->
_node
.
optr
!=
0
);
...
...
src/query/inc/qSqlparser.h
浏览文件 @
5501982f
...
...
@@ -181,19 +181,32 @@ typedef struct SSqlInfo {
};
}
SSqlInfo
;
#define NON_ARITHMEIC_EXPR 0
#define NORMAL_ARITHMETIC 1
#define AGG_ARIGHTMEIC 2
enum
SQL_NODE_TYPE
{
SQL_NODE_TABLE_COLUMN
=
1
,
SQL_NODE_SQLFUNCTION
=
2
,
SQL_NODE_VALUE
=
3
,
SQL_NODE_EXPR
=
4
,
};
typedef
struct
tSQLExpr
{
uint
32_t
nSQLOptr
;
// TK_FUNCTION: sql function, TK_LE: less than(binary expr)
// the full sql string of function(col, param), which is actually the raw
//
field name, since the function name is kept in nSQLOptr already
uint
16_t
type
;
// sql node type
uint32_t
tokenId
;
// TK_FUNCTION: sql function, TK_LE: less than(binary expr)
//
the whole string of the function(col, param), while the function name is kept in token
SStrToken
operand
;
SStrToken
colInfo
;
// field id
tVariant
val
;
// value only for string, float, int
uint32_t
functionId
;
// function id
SStrToken
colInfo
;
// table column info
tVariant
value
;
// the use input value
SStrToken
token
;
// original sql expr string
struct
tSQLExpr
*
pLeft
;
// left child
struct
tSQLExpr
*
pRight
;
// right child
struct
tSQLExprList
*
pParam
;
// function parameters
struct
tSQLExprList
*
pParam
;
// function parameters
list
}
tSQLExpr
;
// used in select clause. select <tSQLExprList> from xxx
...
...
@@ -287,16 +300,6 @@ void tSqlSetColumnType(TAOS_FIELD *pField, SStrToken *type);
void
*
ParseAlloc
(
void
*
(
*
mallocProc
)(
size_t
));
enum
{
TSQL_NODE_TYPE_EXPR
=
0x1
,
TSQL_NODE_TYPE_ID
=
0x2
,
TSQL_NODE_TYPE_VALUE
=
0x4
,
};
#define NON_ARITHMEIC_EXPR 0
#define NORMAL_ARITHMETIC 1
#define AGG_ARIGHTMEIC 2
SSqlInfo
qSQLParse
(
const
char
*
str
);
#ifdef __cplusplus
...
...
src/query/src/qExecutor.c
浏览文件 @
5501982f
...
...
@@ -137,7 +137,7 @@ static void getNextTimeWindow(SQuery* pQuery, STimeWindow* tw) {
}
static
void
doSetTagValueToResultBuf
(
char
*
output
,
const
char
*
val
,
int16_t
type
,
int16_t
bytes
);
static
void
setResultOutputBuf
_rv
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SResultRow
*
pResult
,
SQLFunctionCtx
*
pCtx
,
static
void
setResultOutputBuf
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SResultRow
*
pResult
,
SQLFunctionCtx
*
pCtx
,
int32_t
numOfCols
,
int32_t
*
rowCellInfoOffset
);
void
setResultRowOutputBufInitCtx
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SResultRow
*
pResult
,
SQLFunctionCtx
*
pCtx
,
int32_t
numOfOutput
,
int32_t
*
rowCellInfoOffset
);
...
...
@@ -180,14 +180,14 @@ static void destroySFillOperatorInfo(void* param, int32_t numOfOutput);
static
void
destroyGroupbyOperatorInfo
(
void
*
param
,
int32_t
numOfOutput
);
static
void
destroyArithOperatorInfo
(
void
*
param
,
int32_t
numOfOutput
);
static
int32_t
doCopyToSData
_rv
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SGroupResInfo
*
pGroupResInfo
,
int32_t
orderType
,
SSDataBlock
*
pBlock
);
static
int32_t
doCopyToSData
Block
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SGroupResInfo
*
pGroupResInfo
,
int32_t
orderType
,
SSDataBlock
*
pBlock
);
static
int32_t
getGroupbyColumn
Data_rv
(
SSqlGroupbyExpr
*
pGroupbyExpr
,
SSDataBlock
*
pDataBlock
);
static
int32_t
getGroupbyColumn
Index
(
SSqlGroupbyExpr
*
pGroupbyExpr
,
SSDataBlock
*
pDataBlock
);
static
int32_t
setGroupResultOutputBuf
_rv
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SResultRowInfo
*
pResultRowInfo
,
static
int32_t
setGroupResultOutputBuf
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SResultRowInfo
*
pResultRowInfo
,
SQLFunctionCtx
*
pCtx
,
int32_t
numOfCols
,
char
*
pData
,
int16_t
type
,
int16_t
bytes
,
int32_t
groupIndex
,
int32_t
*
offset
);
static
void
destroyOperatorInfo
(
SOperatorInfo
*
pOperator
);
void
initCtxOutputBuf
_rv
(
SQLFunctionCtx
*
pCtx
,
int32_t
size
);
void
initCtxOutputBuf
fer
(
SQLFunctionCtx
*
pCtx
,
int32_t
size
);
void
getAlignQueryTimeWindow
(
SQuery
*
pQuery
,
int64_t
key
,
int64_t
keyFirst
,
int64_t
keyLast
,
STimeWindow
*
win
);
static
bool
isPointInterpoQuery
(
SQuery
*
pQuery
);
...
...
@@ -268,7 +268,7 @@ bool doFilterData(SQuery *pQuery, int32_t elemPos) {
return
true
;
}
int64_t
getNumOfResult
_rv
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SQLFunctionCtx
*
pCtx
,
int32_t
numOfOutput
)
{
int64_t
getNumOfResult
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SQLFunctionCtx
*
pCtx
,
int32_t
numOfOutput
)
{
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
bool
hasMainFunction
=
hasMainOutput
(
pQuery
);
...
...
@@ -816,8 +816,8 @@ static int32_t getNumOfRowsInTimeWindow(SQuery *pQuery, SDataBlockInfo *pDataBlo
return
num
;
}
static
void
do
BlockwiseApplyFunctions_rv
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SQLFunctionCtx
*
pCtx
,
STimeWindow
*
pWin
,
int32_t
offset
,
int32_t
forwardStep
,
TSKEY
*
tsCol
,
int32_t
numOfTotal
,
int32_t
numOfOutput
)
{
static
void
do
ApplyFunctions
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SQLFunctionCtx
*
pCtx
,
STimeWindow
*
pWin
,
int32_t
offset
,
int32_t
forwardStep
,
TSKEY
*
tsCol
,
int32_t
numOfTotal
,
int32_t
numOfOutput
)
{
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
bool
hasPrev
=
pCtx
[
0
].
preAggVals
.
isSet
;
...
...
@@ -1307,7 +1307,7 @@ static void hashIntervalAgg(SOperatorInfo* pOperatorInfo, SResultRowInfo* pResul
setResultRowInterpo
(
pResult
,
RESULT_ROW_END_INTERP
);
setNotInterpoWindowKey
(
pInfo
->
pCtx
,
pQuery
->
numOfOutput
,
RESULT_ROW_START_INTERP
);
do
BlockwiseApplyFunctions_rv
(
pRuntimeEnv
,
pInfo
->
pCtx
,
&
w
,
startPos
,
0
,
tsCols
,
pSDataBlock
->
info
.
rows
,
do
ApplyFunctions
(
pRuntimeEnv
,
pInfo
->
pCtx
,
&
w
,
startPos
,
0
,
tsCols
,
pSDataBlock
->
info
.
rows
,
numOfOutput
);
}
...
...
@@ -1319,7 +1319,7 @@ static void hashIntervalAgg(SOperatorInfo* pOperatorInfo, SResultRowInfo* pResul
// window start key interpolation
doWindowBorderInterpolation
(
pOperatorInfo
,
pSDataBlock
,
pInfo
->
pCtx
,
pResult
,
&
win
,
startPos
,
forwardStep
);
do
BlockwiseApplyFunctions_rv
(
pRuntimeEnv
,
pInfo
->
pCtx
,
&
win
,
startPos
,
forwardStep
,
tsCols
,
pSDataBlock
->
info
.
rows
,
do
ApplyFunctions
(
pRuntimeEnv
,
pInfo
->
pCtx
,
&
win
,
startPos
,
forwardStep
,
tsCols
,
pSDataBlock
->
info
.
rows
,
numOfOutput
);
STimeWindow
nextWin
=
win
;
...
...
@@ -1343,7 +1343,7 @@ static void hashIntervalAgg(SOperatorInfo* pOperatorInfo, SResultRowInfo* pResul
// window start(end) key interpolation
doWindowBorderInterpolation
(
pOperatorInfo
,
pSDataBlock
,
pInfo
->
pCtx
,
pResult
,
&
nextWin
,
startPos
,
forwardStep
);
do
BlockwiseApplyFunctions_rv
(
pRuntimeEnv
,
pInfo
->
pCtx
,
&
nextWin
,
startPos
,
forwardStep
,
tsCols
,
do
ApplyFunctions
(
pRuntimeEnv
,
pInfo
->
pCtx
,
&
nextWin
,
startPos
,
forwardStep
,
tsCols
,
pSDataBlock
->
info
.
rows
,
numOfOutput
);
}
...
...
@@ -1365,12 +1365,12 @@ static void hashGroupbyAgg(SQueryRuntimeEnv *pRuntimeEnv, SOperatorInfo* pOperat
for
(
int32_t
j
=
0
;
j
<
pSDataBlock
->
info
.
rows
;
++
j
)
{
char
*
val
=
pColInfoData
->
pData
+
bytes
*
j
;
if
(
isNull
(
val
,
type
))
{
// ignore the null value
if
(
isNull
(
val
,
type
))
{
//
TODO:
ignore the null value
continue
;
}
// TODO compare with the previous value to speedup the query processing
int32_t
ret
=
setGroupResultOutputBuf
_rv
(
pRuntimeEnv
,
&
pInfo
->
binfo
.
resultRowInfo
,
pInfo
->
binfo
.
pCtx
,
pOperator
->
numOfOutput
,
val
,
type
,
bytes
,
item
->
groupIndex
,
pInfo
->
binfo
.
rowCellInfoOffset
);
int32_t
ret
=
setGroupResultOutputBuf
(
pRuntimeEnv
,
&
pInfo
->
binfo
.
resultRowInfo
,
pInfo
->
binfo
.
pCtx
,
pOperator
->
numOfOutput
,
val
,
type
,
bytes
,
item
->
groupIndex
,
pInfo
->
binfo
.
rowCellInfoOffset
);
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
// null data, too many state code
longjmp
(
pRuntimeEnv
->
env
,
TSDB_CODE_QRY_APP_ERROR
);
}
...
...
@@ -1385,7 +1385,7 @@ static void hashGroupbyAgg(SQueryRuntimeEnv *pRuntimeEnv, SOperatorInfo* pOperat
}
}
static
int32_t
setGroupResultOutputBuf
_rv
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SResultRowInfo
*
pResultRowInfo
,
static
int32_t
setGroupResultOutputBuf
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SResultRowInfo
*
pResultRowInfo
,
SQLFunctionCtx
*
pCtx
,
int32_t
numOfCols
,
char
*
pData
,
int16_t
type
,
int16_t
bytes
,
int32_t
groupIndex
,
int32_t
*
rowCellInfoOffset
)
{
SDiskbasedResultBuf
*
pResultBuf
=
pRuntimeEnv
->
pResultBuf
;
...
...
@@ -1425,12 +1425,12 @@ static int32_t setGroupResultOutputBuf_rv(SQueryRuntimeEnv *pRuntimeEnv, SResult
}
}
setResultOutputBuf
_rv
(
pRuntimeEnv
,
pResultRow
,
pCtx
,
numOfCols
,
rowCellInfoOffset
);
initCtxOutputBuf
_rv
(
pCtx
,
numOfCols
);
setResultOutputBuf
(
pRuntimeEnv
,
pResultRow
,
pCtx
,
numOfCols
,
rowCellInfoOffset
);
initCtxOutputBuf
fer
(
pCtx
,
numOfCols
);
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
getGroupbyColumn
Data_rv
(
SSqlGroupbyExpr
*
pGroupbyExpr
,
SSDataBlock
*
pDataBlock
)
{
static
int32_t
getGroupbyColumn
Index
(
SSqlGroupbyExpr
*
pGroupbyExpr
,
SSDataBlock
*
pDataBlock
)
{
for
(
int32_t
k
=
0
;
k
<
pGroupbyExpr
->
numOfGroupCols
;
++
k
)
{
SColIndex
*
pColIndex
=
taosArrayGet
(
pGroupbyExpr
->
columnInfo
,
k
);
if
(
TSDB_COL_IS_TAG
(
pColIndex
->
flag
))
{
...
...
@@ -1496,14 +1496,12 @@ void setBlockStatisInfo(SQLFunctionCtx *pCtx, SSDataBlock* pSDataBlock, SColInde
pCtx
->
hasNull
=
hasNullRv
(
pColIndex
,
pStatis
);
#if 0
// set the statistics data for primary time stamp column
if (pCtx->functionId == TSDB_FUNC_SPREAD &&colId == PRIMARYKEY_TIMESTAMP_COL_INDEX) {
if
(
pCtx
->
functionId
==
TSDB_FUNC_SPREAD
&&
pColIndex
->
colId
==
PRIMARYKEY_TIMESTAMP_COL_INDEX
)
{
pCtx
->
preAggVals
.
isSet
=
true
;
pCtx->preAggVals.statis.min = p
BlockInfo->
window.skey;
pCtx->preAggVals.statis.max = p
BlockInfo->
window.ekey;
pCtx
->
preAggVals
.
statis
.
min
=
p
SDataBlock
->
info
.
window
.
skey
;
pCtx
->
preAggVals
.
statis
.
max
=
p
SDataBlock
->
info
.
window
.
ekey
;
}
#endif
}
// set the output buffer for the selectivity + tag query
...
...
@@ -2308,7 +2306,7 @@ static int32_t doTSJoinFilter(SQueryRuntimeEnv *pRuntimeEnv, TSKEY key, bool asc
return
TS_JOIN_TS_EQUAL
;
}
void
filter
DataBlock_rv
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SSingleColumnFilterInfo
*
pFilterInfo
,
int32_t
numOfFilterCols
,
void
filter
RowsInDataBlock
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SSingleColumnFilterInfo
*
pFilterInfo
,
int32_t
numOfFilterCols
,
SSDataBlock
*
pBlock
,
STSBuf
*
pTsBuf
,
bool
ascQuery
)
{
int32_t
numOfRows
=
pBlock
->
info
.
rows
;
...
...
@@ -2437,8 +2435,8 @@ static SColumnInfo* doGetTagColumnInfoById(SColumnInfo* pTagColList, int32_t num
static
void
doSetTagValueInParam
(
void
*
pTable
,
int32_t
tagColId
,
tVariant
*
tag
,
int16_t
type
,
int16_t
bytes
);
//TODO refactor
int32_t
loadDataBlockOnDemand
_rv
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
STableScanInfo
*
pTableScanInfo
,
SSDataBlock
*
pBlock
,
uint32_t
*
status
)
{
int32_t
loadDataBlockOnDemand
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
STableScanInfo
*
pTableScanInfo
,
SSDataBlock
*
pBlock
,
uint32_t
*
status
)
{
*
status
=
BLK_DATA_NO_NEEDED
;
pBlock
->
pDataBlock
=
NULL
;
pBlock
->
pBlockStatis
=
NULL
;
...
...
@@ -2589,7 +2587,7 @@ int32_t loadDataBlockOnDemand_rv(SQueryRuntimeEnv* pRuntimeEnv, STableScanInfo*
}
if
(
pQuery
->
numOfFilterCols
>
0
||
pRuntimeEnv
->
pTsBuf
!=
NULL
)
{
filter
DataBlock_rv
(
pRuntimeEnv
,
pQuery
->
pFilterInfo
,
pQuery
->
numOfFilterCols
,
pBlock
,
pRuntimeEnv
->
pTsBuf
,
filter
RowsInDataBlock
(
pRuntimeEnv
,
pQuery
->
pFilterInfo
,
pQuery
->
numOfFilterCols
,
pBlock
,
pRuntimeEnv
->
pTsBuf
,
QUERY_IS_ASC_QUERY
(
pQuery
));
}
}
...
...
@@ -2709,8 +2707,7 @@ static SColumnInfo* doGetTagColumnInfoById(SColumnInfo* pTagColList, int32_t num
return
NULL
;
}
void
setTagVal_rv
(
SOperatorInfo
*
pOperatorInfo
,
void
*
pTable
,
SQLFunctionCtx
*
pCtx
,
int32_t
numOfOutput
)
{
void
setTagValue
(
SOperatorInfo
*
pOperatorInfo
,
void
*
pTable
,
SQLFunctionCtx
*
pCtx
,
int32_t
numOfOutput
)
{
SQueryRuntimeEnv
*
pRuntimeEnv
=
pOperatorInfo
->
pRuntimeEnv
;
SExprInfo
*
pExpr
=
pOperatorInfo
->
pExpr
;
...
...
@@ -2908,7 +2905,7 @@ void UNUSED_FUNC displayInterResult(tFilePage **pdata, SQueryRuntimeEnv* pRuntim
}
}
void
copy
ResToQueryResultBuf_rv
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
int32_t
threshold
,
SSDataBlock
*
pBlock
,
int32_t
*
offset
)
{
void
copy
ToSDataBlock
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
int32_t
threshold
,
SSDataBlock
*
pBlock
,
int32_t
*
offset
)
{
SGroupResInfo
*
pGroupResInfo
=
&
pRuntimeEnv
->
groupResInfo
;
pBlock
->
info
.
rows
=
0
;
...
...
@@ -2922,7 +2919,7 @@ void copyResToQueryResultBuf_rv(SQueryRuntimeEnv* pRuntimeEnv, int32_t threshold
}
}
doCopyToSData
_rv
(
pRuntimeEnv
,
pGroupResInfo
,
TSDB_ORDER_ASC
,
pBlock
);
doCopyToSData
Block
(
pRuntimeEnv
,
pGroupResInfo
,
TSDB_ORDER_ASC
,
pBlock
);
// current data are all dumped to result buffer, clear it
if
(
!
hasRemainDataInCurrentGroup
(
pGroupResInfo
))
{
...
...
@@ -2951,14 +2948,14 @@ static void updateTableQueryInfoForReverseScan(SQuery *pQuery, STableQueryInfo *
SWITCH_ORDER
(
pTableQueryInfo
->
cur
.
order
);
pTableQueryInfo
->
cur
.
vgroupIndex
=
-
1
;
// set the index
at the end of time window
// set the index
to be the end slot of result rows array
pTableQueryInfo
->
resInfo
.
curIndex
=
pTableQueryInfo
->
resInfo
.
size
-
1
;
}
static
void
setupQueryRangeForReverseScan
(
SQueryRuntimeEnv
*
pRuntimeEnv
)
{
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
int32_t
numOfGroups
=
(
int32_t
)(
GET_NUM_OF_TABLEGROUP
(
pRuntimeEnv
));
int32_t
numOfGroups
=
(
int32_t
)(
GET_NUM_OF_TABLEGROUP
(
pRuntimeEnv
));
for
(
int32_t
i
=
0
;
i
<
numOfGroups
;
++
i
)
{
SArray
*
group
=
GET_TABLEGROUP
(
pRuntimeEnv
,
i
);
SArray
*
tableKeyGroup
=
taosArrayGetP
(
pQuery
->
tableGroupInfo
.
pGroupList
,
i
);
...
...
@@ -3021,7 +3018,7 @@ void setDefaultOutputBuf(SQueryRuntimeEnv *pRuntimeEnv, SOptrBasicInfo *pInfo, i
}
}
initCtxOutputBuf
_rv
(
pCtx
,
pDataBlock
->
info
.
numOfCols
);
initCtxOutputBuf
fer
(
pCtx
,
pDataBlock
->
info
.
numOfCols
);
}
void
updateOutputBuf
(
SArithOperatorInfo
*
pInfo
,
int32_t
numOfInputRows
)
{
...
...
@@ -3057,7 +3054,7 @@ void updateOutputBuf(SArithOperatorInfo* pInfo, int32_t numOfInputRows) {
}
}
void
initCtxOutputBuf
_rv
(
SQLFunctionCtx
*
pCtx
,
int32_t
size
)
{
void
initCtxOutputBuf
fer
(
SQLFunctionCtx
*
pCtx
,
int32_t
size
)
{
for
(
int32_t
j
=
0
;
j
<
size
;
++
j
)
{
SResultRowCellInfo
*
pResInfo
=
GET_RES_INFO
(
&
pCtx
[
j
]);
if
(
pResInfo
->
initialized
)
{
...
...
@@ -3078,7 +3075,7 @@ void setQueryStatus(SQueryRuntimeEnv *pRuntimeEnv, int8_t status) {
}
}
static
void
set
EnvBeforeReverseScan_rv
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SResultRowInfo
*
pResultRowInfo
,
SQLFunctionCtx
*
pCtx
,
int32_t
numOfOutput
)
{
static
void
set
upEnvForReverseScan
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SResultRowInfo
*
pResultRowInfo
,
SQLFunctionCtx
*
pCtx
,
int32_t
numOfOutput
)
{
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
if
(
pRuntimeEnv
->
pTsBuf
)
{
...
...
@@ -3089,17 +3086,17 @@ static void setEnvBeforeReverseScan_rv(SQueryRuntimeEnv *pRuntimeEnv, SResultRow
// reverse order time range
SWAP
(
pQuery
->
window
.
skey
,
pQuery
->
window
.
ekey
,
TSKEY
);
SWITCH_ORDER
(
pQuery
->
order
.
order
);
SET_REVERSE_SCAN_FLAG
(
pRuntimeEnv
);
setQueryStatus
(
pRuntimeEnv
,
QUERY_NOT_COMPLETED
);
switchCtxOrder
(
pCtx
,
numOfOutput
);
SWITCH_ORDER
(
pQuery
->
order
.
order
);
// disableFuncInReverseScan(pRuntimeEnv, pResultRowInfo, pCtx, numOfOutput);
setupQueryRangeForReverseScan
(
pRuntimeEnv
);
}
void
finalizeQueryResult
_rv
(
SOperatorInfo
*
pOperator
,
SQLFunctionCtx
*
pCtx
,
SResultRowInfo
*
pResultRowInfo
,
int32_t
*
rowCellInfoOffset
)
{
void
finalizeQueryResult
(
SOperatorInfo
*
pOperator
,
SQLFunctionCtx
*
pCtx
,
SResultRowInfo
*
pResultRowInfo
,
int32_t
*
rowCellInfoOffset
)
{
SQueryRuntimeEnv
*
pRuntimeEnv
=
pOperator
->
pRuntimeEnv
;
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
...
...
@@ -3116,7 +3113,7 @@ void finalizeQueryResult_rv(SOperatorInfo* pOperator, SQLFunctionCtx* pCtx, SRes
continue
;
}
setResultOutputBuf
_rv
(
pRuntimeEnv
,
buf
,
pCtx
,
numOfOutput
,
rowCellInfoOffset
);
setResultOutputBuf
(
pRuntimeEnv
,
buf
,
pCtx
,
numOfOutput
,
rowCellInfoOffset
);
for
(
int32_t
j
=
0
;
j
<
numOfOutput
;
++
j
)
{
aAggs
[
pCtx
[
j
].
functionId
].
xFinalize
(
&
pCtx
[
j
]);
...
...
@@ -3126,7 +3123,7 @@ void finalizeQueryResult_rv(SOperatorInfo* pOperator, SQLFunctionCtx* pCtx, SRes
* set the number of output results for group by normal columns, the number of output rows usually is 1 except
* the top and bottom query
*/
buf
->
numOfRows
=
(
uint16_t
)
getNumOfResult
_rv
(
pRuntimeEnv
,
pCtx
,
numOfOutput
);
buf
->
numOfRows
=
(
uint16_t
)
getNumOfResult
(
pRuntimeEnv
,
pCtx
,
numOfOutput
);
}
}
else
{
...
...
@@ -3206,8 +3203,8 @@ void setResultRowOutputBufInitCtx(SQueryRuntimeEnv *pRuntimeEnv, SResultRow *pRe
}
}
void
setExecutionContext
_rv
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SOptrBasicInfo
*
pInfo
,
int32_t
numOfOutput
,
int32_t
groupIndex
,
TSKEY
nextKey
)
{
void
setExecutionContext
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SOptrBasicInfo
*
pInfo
,
int32_t
numOfOutput
,
int32_t
groupIndex
,
TSKEY
nextKey
)
{
STableQueryInfo
*
pTableQueryInfo
=
pRuntimeEnv
->
pQuery
->
current
;
// lastKey needs to be updated
...
...
@@ -3234,11 +3231,11 @@ void setExecutionContext_rv(SQueryRuntimeEnv *pRuntimeEnv, SOptrBasicInfo *pInfo
// record the current active group id
pRuntimeEnv
->
prevGroupId
=
groupIndex
;
setResultOutputBuf
_rv
(
pRuntimeEnv
,
pResultRow
,
pInfo
->
pCtx
,
numOfOutput
,
pInfo
->
rowCellInfoOffset
);
initCtxOutputBuf
_rv
(
pInfo
->
pCtx
,
numOfOutput
);
setResultOutputBuf
(
pRuntimeEnv
,
pResultRow
,
pInfo
->
pCtx
,
numOfOutput
,
pInfo
->
rowCellInfoOffset
);
initCtxOutputBuf
fer
(
pInfo
->
pCtx
,
numOfOutput
);
}
void
setResultOutputBuf
_rv
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SResultRow
*
pResult
,
SQLFunctionCtx
*
pCtx
,
void
setResultOutputBuf
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SResultRow
*
pResult
,
SQLFunctionCtx
*
pCtx
,
int32_t
numOfCols
,
int32_t
*
rowCellInfoOffset
)
{
// Note: pResult->pos[i]->num == 0, there is only fixed number of results for each group
tFilePage
*
page
=
getResBufPage
(
pRuntimeEnv
->
pResultBuf
,
pResult
->
pageId
);
...
...
@@ -3400,61 +3397,6 @@ bool requireTimestamp(SQuery *pQuery) {
return
false
;
}
//static int32_t doCopyToSData(SQueryRuntimeEnv* pRuntimeEnv, SGroupResInfo* pGroupResInfo, int32_t orderType) {
// void* qinfo = pRuntimeEnv->qinfo;
// SQuery *pQuery = pRuntimeEnv->pQuery;
//
// int32_t numOfRows = getNumOfTotalRes(pGroupResInfo);
// int32_t numOfResult = pRuntimeEnv->resultInfo.rows; // there are already exists result rows
//
// int32_t start = 0;
// int32_t step = -1;
//
// qDebug("QInfo:%p start to copy data from windowResInfo to output buf", qinfo);
// if (orderType == TSDB_ORDER_ASC) {
// start = pGroupResInfo->index;
// step = 1;
// } else { // desc order copy all data
// start = numOfRows - pGroupResInfo->index - 1;
// step = -1;
// }
//
// for (int32_t i = start; (i < numOfRows) && (i >= 0); i += step) {
// SResultRow* pRow = taosArrayGetP(pGroupResInfo->pRows, i);
// if (pRow->numOfRows == 0) {
// pGroupResInfo->index += 1;
// continue;
// }
//
// int32_t numOfRowsToCopy = pRow->numOfRows;
//
// //current output space is not enough to accommodate all data of this page, prepare more space
// if (numOfRowsToCopy > (pRuntimeEnv->resultInfo.capacity - numOfResult)) {
// int32_t newSize = pRuntimeEnv->resultInfo.capacity + (numOfRowsToCopy - numOfResult);
// expandBuffer(pRuntimeEnv, newSize, pRuntimeEnv->qinfo);
// }
//
// pGroupResInfo->index += 1;
//
// tFilePage *page = getResBufPage(pRuntimeEnv->pResultBuf, pRow->pageId);
// for (int32_t j = 0; j < pQuery->numOfOutput; ++j) {
// int32_t size = pRuntimeEnv->pCtx[j].outputBytes;
//
// char *out = pQuery->sdata[j]->data + numOfResult * size;
// char *in = getPosInResultPage(pRuntimeEnv, j, pRow, page);
// memcpy(out, in, size * numOfRowsToCopy);
// }
//
// numOfResult += numOfRowsToCopy;
// if (numOfResult == pRuntimeEnv->resultInfo.capacity) { // output buffer is full
// break;
// }
// }
//
// qDebug("QInfo:%p copy data to query buf completed", qinfo);
// return numOfResult;
//}
/**
* copyToOutputBuf support copy data in ascending/descending order
* For interval query of both super table and table, copy the data in ascending order, since the output results are
...
...
@@ -3465,7 +3407,7 @@ bool requireTimestamp(SQuery *pQuery) {
* @param result
*/
static
int32_t
doCopyToSData
_rv
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SGroupResInfo
*
pGroupResInfo
,
int32_t
orderType
,
SSDataBlock
*
pBlock
)
{
static
int32_t
doCopyToSData
Block
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SGroupResInfo
*
pGroupResInfo
,
int32_t
orderType
,
SSDataBlock
*
pBlock
)
{
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
int32_t
numOfRows
=
getNumOfTotalRes
(
pGroupResInfo
);
...
...
@@ -3529,7 +3471,7 @@ static void toSSDataBlock(SGroupResInfo *pGroupResInfo, SQueryRuntimeEnv* pRunti
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
int32_t
orderType
=
(
pQuery
->
pGroupbyExpr
!=
NULL
)
?
pQuery
->
pGroupbyExpr
->
orderType
:
TSDB_ORDER_ASC
;
doCopyToSData
_rv
(
pRuntimeEnv
,
pGroupResInfo
,
orderType
,
pBlock
);
doCopyToSData
Block
(
pRuntimeEnv
,
pGroupResInfo
,
orderType
,
pBlock
);
SColumnInfoData
*
pInfoData
=
taosArrayGet
(
pBlock
->
pDataBlock
,
0
);
...
...
@@ -3540,7 +3482,7 @@ static void toSSDataBlock(SGroupResInfo *pGroupResInfo, SQueryRuntimeEnv* pRunti
}
}
static
void
update
WindowResNumOfRes_rv
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
static
void
update
NumOfRowsInResultRows
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SQLFunctionCtx
*
pCtx
,
int32_t
numOfOutput
,
SResultRowInfo
*
pResultRowInfo
,
int32_t
*
rowCellInfoOffset
)
{
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
...
...
@@ -3564,45 +3506,6 @@ static void updateWindowResNumOfRes_rv(SQueryRuntimeEnv *pRuntimeEnv,
}
}
//bool hasNotReturnedResults(SQueryRuntimeEnv* pRuntimeEnv, SGroupResInfo* pGroupResInfo) {
// SQuery *pQuery = pRuntimeEnv->pQuery;
//// SFillInfo *pFillInfo = pRuntimeEnv->pFillInfo;
//
// if (!Q_STATUS_EQUAL(pRuntimeEnv->status, QUERY_COMPLETED)) {
// return false;
// }
//
// if (pQuery->limit.limit > 0 && pRuntimeEnv->resultInfo.total >= pQuery->limit.limit) {
// return false;
// }
//
// if (pQuery->fillType != TSDB_FILL_NONE && !isPointInterpoQuery(pQuery)) {
// // There are results not returned to client yet, so filling applied to the remain result is required firstly.
// if (taosFillHasMoreResults(pFillInfo)) {
// return true;
// }
//
// /*
// * While the code reaches here, there are no results remains now.
// * If query is not completed yet, the gaps between two results blocks need to be handled after next data block
// * is retrieved from TSDB.
// *
// * NOTE: If the result set is not the first block, the gap in front of the result set will be filled. If the result
// * set is the FIRST result block, the gap between the start time of query time window and the timestamp of the
// * first result row in the actual result set will fill nothing.
// */
// int32_t numOfTotal = (int32_t)getNumOfResultsAfterFillGap(pFillInfo, pQuery->window.ekey, (int32_t)pRuntimeEnv->resultInfo.capacity);
// return numOfTotal > 0;
// } else { // there are results waiting for returned to client.
// if (Q_STATUS_EQUAL(pRuntimeEnv->status, QUERY_COMPLETED) && hasRemainDataInCurrentGroup(pGroupResInfo) &&
// (pQuery->groupbyColumn || QUERY_IS_INTERVAL_QUERY(pQuery))) {
// return true;
// }
// }
//
// return false;
//}
static
void
doCopyQueryResultToMsg
(
SQInfo
*
pQInfo
,
int32_t
numOfRows
,
char
*
data
)
{
SQueryRuntimeEnv
*
pRuntimeEnv
=
&
pQInfo
->
runtimeEnv
;
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
...
...
@@ -3650,7 +3553,7 @@ static void doCopyQueryResultToMsg(SQInfo *pQInfo, int32_t numOfRows, char *data
}
}
int32_t
doFill
GapsInResults_rv
(
SFillInfo
*
pFillInfo
,
SSDataBlock
*
pOutput
,
int32_t
capacity
)
{
int32_t
doFill
TimeIntervalGapsInResults
(
SFillInfo
*
pFillInfo
,
SSDataBlock
*
pOutput
,
int32_t
capacity
)
{
void
**
p
=
calloc
(
pFillInfo
->
numOfCols
,
POINTER_BYTES
);
for
(
int32_t
i
=
0
;
i
<
pFillInfo
->
numOfCols
;
++
i
)
{
SColumnInfoData
*
pColInfoData
=
taosArrayGet
(
pOutput
->
pDataBlock
,
i
);
...
...
@@ -4251,7 +4154,7 @@ static SSDataBlock* doTableScanImpl(STableScanInfo *pTableScanInfo) {
// this function never returns error?
uint32_t
status
;
int32_t
code
=
loadDataBlockOnDemand
_rv
(
pTableScanInfo
->
pRuntimeEnv
,
pTableScanInfo
,
pBlock
,
&
status
);
int32_t
code
=
loadDataBlockOnDemand
(
pTableScanInfo
->
pRuntimeEnv
,
pTableScanInfo
,
pBlock
,
&
status
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
longjmp
(
pTableScanInfo
->
pRuntimeEnv
->
env
,
code
);
}
...
...
@@ -4328,7 +4231,7 @@ static SSDataBlock* doTableScan(void* param) {
}
if
(
pTableScanInfo
->
reverseTimes
>
0
)
{
set
EnvBeforeReverseScan_rv
(
pRuntimeEnv
,
pTableScanInfo
->
pResultRowInfo
,
pTableScanInfo
->
pCtx
,
pTableScanInfo
->
numOfOutput
);
set
upEnvForReverseScan
(
pRuntimeEnv
,
pTableScanInfo
->
pResultRowInfo
,
pTableScanInfo
->
pCtx
,
pTableScanInfo
->
numOfOutput
);
STsdbQueryCond
cond
=
createTsdbQueryCond
(
pQuery
,
&
pQuery
->
window
);
tsdbResetQueryHandle
(
pTableScanInfo
->
pQueryHandle
,
&
cond
);
...
...
@@ -4583,7 +4486,7 @@ static SSDataBlock* doAggregate(void* param) {
break
;
}
setTagVal
_rv
(
pOperator
,
pQuery
->
current
->
pTable
,
pInfo
->
pCtx
,
pOperator
->
numOfOutput
);
setTagVal
ue
(
pOperator
,
pQuery
->
current
->
pTable
,
pInfo
->
pCtx
,
pOperator
->
numOfOutput
);
if
(
upstream
->
operatorType
==
OP_DataBlocksOptScan
)
{
STableScanInfo
*
pScanInfo
=
upstream
->
info
;
...
...
@@ -4598,8 +4501,8 @@ static SSDataBlock* doAggregate(void* param) {
pOperator
->
status
=
OP_EXEC_DONE
;
setQueryStatus
(
pRuntimeEnv
,
QUERY_COMPLETED
);
finalizeQueryResult
_rv
(
pOperator
,
pInfo
->
pCtx
,
&
pInfo
->
resultRowInfo
,
pInfo
->
rowCellInfoOffset
);
pInfo
->
pRes
->
info
.
rows
=
getNumOfResult
_rv
(
pRuntimeEnv
,
pInfo
->
pCtx
,
pOperator
->
numOfOutput
);
finalizeQueryResult
(
pOperator
,
pInfo
->
pCtx
,
&
pInfo
->
resultRowInfo
,
pInfo
->
rowCellInfoOffset
);
pInfo
->
pRes
->
info
.
rows
=
getNumOfResult
(
pRuntimeEnv
,
pInfo
->
pCtx
,
pOperator
->
numOfOutput
);
return
pInfo
->
pRes
;
}
...
...
@@ -4636,7 +4539,7 @@ static SSDataBlock* doSTableAggregate(void* param) {
break
;
}
setTagVal
_rv
(
pOperator
,
pRuntimeEnv
->
pQuery
->
current
->
pTable
,
pInfo
->
pCtx
,
pOperator
->
numOfOutput
);
setTagVal
ue
(
pOperator
,
pRuntimeEnv
->
pQuery
->
current
->
pTable
,
pInfo
->
pCtx
,
pOperator
->
numOfOutput
);
if
(
upstream
->
operatorType
==
OP_DataBlocksOptScan
)
{
STableScanInfo
*
pScanInfo
=
upstream
->
info
;
...
...
@@ -4647,14 +4550,14 @@ static SSDataBlock* doSTableAggregate(void* param) {
setInputDataBlock
(
pOperator
,
pInfo
->
pCtx
,
pBlock
,
order
);
TSKEY
k
=
(
pQuery
->
order
.
order
==
TSDB_ORDER_ASC
)
?
pBlock
->
info
.
window
.
ekey
+
1
:
pBlock
->
info
.
window
.
skey
-
1
;
setExecutionContext
_rv
(
pRuntimeEnv
,
pInfo
,
pOperator
->
numOfOutput
,
pQuery
->
current
->
groupIndex
,
k
);
setExecutionContext
(
pRuntimeEnv
,
pInfo
,
pOperator
->
numOfOutput
,
pQuery
->
current
->
groupIndex
,
k
);
doAggregateImpl
(
pOperator
,
pQuery
->
window
.
skey
,
pInfo
->
pCtx
,
pBlock
);
}
pOperator
->
status
=
OP_RES_TO_RETURN
;
closeAllResultRows
(
&
pInfo
->
resultRowInfo
);
update
WindowResNumOfRes_rv
(
pRuntimeEnv
,
pInfo
->
pCtx
,
pOperator
->
numOfOutput
,
&
pInfo
->
resultRowInfo
,
update
NumOfRowsInResultRows
(
pRuntimeEnv
,
pInfo
->
pCtx
,
pOperator
->
numOfOutput
,
&
pInfo
->
resultRowInfo
,
pInfo
->
rowCellInfoOffset
);
initGroupResInfo
(
&
pRuntimeEnv
->
groupResInfo
,
&
pInfo
->
resultRowInfo
);
...
...
@@ -4683,14 +4586,14 @@ static SSDataBlock* doArithmeticOperation(void* param) {
break
;
}
setTagVal
_rv
(
pOperator
,
pRuntimeEnv
->
pQuery
->
current
->
pTable
,
pInfo
->
pCtx
,
pOperator
->
numOfOutput
);
setTagVal
ue
(
pOperator
,
pRuntimeEnv
->
pQuery
->
current
->
pTable
,
pInfo
->
pCtx
,
pOperator
->
numOfOutput
);
// the pDataBlock are always the same one, no need to call this again
setInputDataBlock
(
pOperator
,
pInfo
->
pCtx
,
pBlock
,
pRuntimeEnv
->
pQuery
->
order
.
order
);
updateOutputBuf
(
pArithInfo
,
pBlock
->
info
.
rows
);
arithmeticApplyFunctions
(
pRuntimeEnv
,
pInfo
->
pCtx
,
pOperator
->
numOfOutput
);
pInfo
->
pRes
->
info
.
rows
=
getNumOfResult
_rv
(
pRuntimeEnv
,
pInfo
->
pCtx
,
pOperator
->
numOfOutput
);
pInfo
->
pRes
->
info
.
rows
=
getNumOfResult
(
pRuntimeEnv
,
pInfo
->
pCtx
,
pOperator
->
numOfOutput
);
if
(
pInfo
->
pRes
->
info
.
rows
>=
4096
)
{
break
;
}
...
...
@@ -4810,7 +4713,7 @@ static SSDataBlock* doIntervalAgg(void* param) {
pOperator
->
status
=
OP_RES_TO_RETURN
;
closeAllResultRows
(
&
pIntervalInfo
->
resultRowInfo
);
setQueryStatus
(
pRuntimeEnv
,
QUERY_COMPLETED
);
finalizeQueryResult
_rv
(
pOperator
,
pIntervalInfo
->
pCtx
,
&
pIntervalInfo
->
resultRowInfo
,
pIntervalInfo
->
rowCellInfoOffset
);
finalizeQueryResult
(
pOperator
,
pIntervalInfo
->
pCtx
,
&
pIntervalInfo
->
resultRowInfo
,
pIntervalInfo
->
rowCellInfoOffset
);
initGroupResInfo
(
&
pRuntimeEnv
->
groupResInfo
,
&
pIntervalInfo
->
resultRowInfo
);
toSSDataBlock
(
&
pRuntimeEnv
->
groupResInfo
,
pRuntimeEnv
,
pIntervalInfo
->
pRes
);
...
...
@@ -4832,7 +4735,7 @@ static SSDataBlock* doSTableIntervalAgg(void* param) {
SQueryRuntimeEnv
*
pRuntimeEnv
=
pOperator
->
pRuntimeEnv
;
if
(
pOperator
->
status
==
OP_RES_TO_RETURN
)
{
copy
ResToQueryResultBuf_rv
(
pRuntimeEnv
,
3000
,
pIntervalInfo
->
pRes
,
pIntervalInfo
->
rowCellInfoOffset
);
copy
ToSDataBlock
(
pRuntimeEnv
,
3000
,
pIntervalInfo
->
pRes
,
pIntervalInfo
->
rowCellInfoOffset
);
if
(
pIntervalInfo
->
pRes
->
info
.
rows
==
0
||
!
hasRemainData
(
&
pRuntimeEnv
->
groupResInfo
))
{
pOperator
->
status
=
OP_EXEC_DONE
;
}
...
...
@@ -4854,7 +4757,7 @@ static SSDataBlock* doSTableIntervalAgg(void* param) {
// the pDataBlock are always the same one, no need to call this again
STableQueryInfo
*
pTableQueryInfo
=
pRuntimeEnv
->
pQuery
->
current
;
setTagVal
_rv
(
pOperator
,
pTableQueryInfo
->
pTable
,
pIntervalInfo
->
pCtx
,
pOperator
->
numOfOutput
);
setTagVal
ue
(
pOperator
,
pTableQueryInfo
->
pTable
,
pIntervalInfo
->
pCtx
,
pOperator
->
numOfOutput
);
setInputDataBlock
(
pOperator
,
pIntervalInfo
->
pCtx
,
pBlock
,
pQuery
->
order
.
order
);
setIntervalQueryRange
(
pRuntimeEnv
,
pBlock
->
info
.
window
.
skey
);
...
...
@@ -4866,7 +4769,7 @@ static SSDataBlock* doSTableIntervalAgg(void* param) {
doCloseAllTimeWindow
(
pRuntimeEnv
);
setQueryStatus
(
pRuntimeEnv
,
QUERY_COMPLETED
);
copy
ResToQueryResultBuf_rv
(
pRuntimeEnv
,
3000
,
pIntervalInfo
->
pRes
,
pIntervalInfo
->
rowCellInfoOffset
);
copy
ToSDataBlock
(
pRuntimeEnv
,
3000
,
pIntervalInfo
->
pRes
,
pIntervalInfo
->
rowCellInfoOffset
);
if
(
pIntervalInfo
->
pRes
->
info
.
rows
==
0
||
!
hasRemainData
(
&
pRuntimeEnv
->
groupResInfo
))
{
pOperator
->
status
=
OP_EXEC_DONE
;
}
...
...
@@ -4903,9 +4806,9 @@ static SSDataBlock* doHashGroupbyAgg(void* param) {
// the pDataBlock are always the same one, no need to call this again
setInputDataBlock
(
pOperator
,
pInfo
->
binfo
.
pCtx
,
pBlock
,
pRuntimeEnv
->
pQuery
->
order
.
order
);
setTagVal
_rv
(
pOperator
,
pRuntimeEnv
->
pQuery
->
current
->
pTable
,
pInfo
->
binfo
.
pCtx
,
pOperator
->
numOfOutput
);
setTagVal
ue
(
pOperator
,
pRuntimeEnv
->
pQuery
->
current
->
pTable
,
pInfo
->
binfo
.
pCtx
,
pOperator
->
numOfOutput
);
if
(
pInfo
->
colIndex
==
-
1
)
{
pInfo
->
colIndex
=
getGroupbyColumn
Data_rv
(
pRuntimeEnv
->
pQuery
->
pGroupbyExpr
,
pBlock
);
pInfo
->
colIndex
=
getGroupbyColumn
Index
(
pRuntimeEnv
->
pQuery
->
pGroupbyExpr
,
pBlock
);
}
hashGroupbyAgg
(
pRuntimeEnv
,
pOperator
,
pInfo
,
pBlock
);
...
...
@@ -4915,12 +4818,14 @@ static SSDataBlock* doHashGroupbyAgg(void* param) {
closeAllResultRows
(
&
pInfo
->
binfo
.
resultRowInfo
);
setQueryStatus
(
pRuntimeEnv
,
QUERY_COMPLETED
);
// todo need finalize the result
if
(
!
pRuntimeEnv
->
pQuery
->
stableQuery
)
{
finalizeQueryResult_rv
(
pOperator
,
pInfo
->
binfo
.
pCtx
,
&
pInfo
->
binfo
.
resultRowInfo
,
pInfo
->
binfo
.
rowCellInfoOffset
);
// finalize include the update of result rows
finalizeQueryResult
(
pOperator
,
pInfo
->
binfo
.
pCtx
,
&
pInfo
->
binfo
.
resultRowInfo
,
pInfo
->
binfo
.
rowCellInfoOffset
);
}
else
{
updateNumOfRowsInResultRows
(
pRuntimeEnv
,
pInfo
->
binfo
.
pCtx
,
pOperator
->
numOfOutput
,
&
pInfo
->
binfo
.
resultRowInfo
,
pInfo
->
binfo
.
rowCellInfoOffset
);
}
updateWindowResNumOfRes_rv
(
pRuntimeEnv
,
pInfo
->
binfo
.
pCtx
,
pOperator
->
numOfOutput
,
&
pInfo
->
binfo
.
resultRowInfo
,
pInfo
->
binfo
.
rowCellInfoOffset
);
initGroupResInfo
(
&
pRuntimeEnv
->
groupResInfo
,
&
pInfo
->
binfo
.
resultRowInfo
);
toSSDataBlock
(
&
pRuntimeEnv
->
groupResInfo
,
pRuntimeEnv
,
pInfo
->
binfo
.
pRes
);
...
...
@@ -4941,7 +4846,7 @@ static SSDataBlock* doFill(void* param) {
SQueryRuntimeEnv
*
pRuntimeEnv
=
pOperator
->
pRuntimeEnv
;
if
(
taosFillHasMoreResults
(
pInfo
->
pFillInfo
))
{
doFill
GapsInResults_rv
(
pInfo
->
pFillInfo
,
pInfo
->
pRes
,
pRuntimeEnv
->
resultInfo
.
capacity
);
doFill
TimeIntervalGapsInResults
(
pInfo
->
pFillInfo
,
pInfo
->
pRes
,
pRuntimeEnv
->
resultInfo
.
capacity
);
return
pInfo
->
pRes
;
}
...
...
@@ -4963,7 +4868,7 @@ static SSDataBlock* doFill(void* param) {
taosFillSetInputDataBlock
(
pInfo
->
pFillInfo
,
pBlock
);
}
doFill
GapsInResults_rv
(
pInfo
->
pFillInfo
,
pInfo
->
pRes
,
pRuntimeEnv
->
resultInfo
.
capacity
);
doFill
TimeIntervalGapsInResults
(
pInfo
->
pFillInfo
,
pInfo
->
pRes
,
pRuntimeEnv
->
resultInfo
.
capacity
);
return
(
pInfo
->
pRes
->
info
.
rows
>
0
)
?
pInfo
->
pRes
:
NULL
;
}
}
...
...
@@ -6004,7 +5909,8 @@ int32_t createQueryFuncExprFromMsg(SQueryTableMsg* pQueryMsg, int32_t numOfOutpu
}
int32_t
param
=
(
int32_t
)
pExprs
[
i
].
base
.
arg
[
0
].
argValue
.
i64
;
if
(
type
!=
pExprs
[
i
].
base
.
colType
||
bytes
!=
pExprs
[
i
].
base
.
colBytes
)
{
if
(
pExprs
[
i
].
base
.
functionId
!=
TSDB_FUNC_ARITHM
&&
(
type
!=
pExprs
[
i
].
base
.
colType
||
bytes
!=
pExprs
[
i
].
base
.
colBytes
))
{
tfree
(
pExprs
);
return
TSDB_CODE_QRY_INVALID_MSG
;
}
...
...
src/query/src/qParserImpl.c
浏览文件 @
5501982f
...
...
@@ -126,28 +126,33 @@ tSQLExpr *tSqlExprIdValueCreate(SStrToken *pToken, int32_t optrType) {
if
(
optrType
==
TK_INTEGER
||
optrType
==
TK_STRING
||
optrType
==
TK_FLOAT
||
optrType
==
TK_BOOL
)
{
toTSDBType
(
pToken
->
type
);
tVariantCreate
(
&
pSqlExpr
->
val
,
pToken
);
pSqlExpr
->
nSQLOptr
=
optrType
;
tVariantCreate
(
&
pSqlExpr
->
value
,
pToken
);
pSqlExpr
->
tokenId
=
optrType
;
pSqlExpr
->
type
=
SQL_NODE_VALUE
;
}
else
if
(
optrType
==
TK_NOW
)
{
// use microsecond by default
pSqlExpr
->
val
.
i64
=
taosGetTimestamp
(
TSDB_TIME_PRECISION_MICRO
);
pSqlExpr
->
val
.
nType
=
TSDB_DATA_TYPE_BIGINT
;
pSqlExpr
->
nSQLOptr
=
TK_TIMESTAMP
;
// TK_TIMESTAMP used to denote the time value is in microsecond
pSqlExpr
->
value
.
i64
=
taosGetTimestamp
(
TSDB_TIME_PRECISION_MICRO
);
pSqlExpr
->
value
.
nType
=
TSDB_DATA_TYPE_BIGINT
;
pSqlExpr
->
tokenId
=
TK_TIMESTAMP
;
// TK_TIMESTAMP used to denote the time value is in microsecond
pSqlExpr
->
type
=
SQL_NODE_VALUE
;
}
else
if
(
optrType
==
TK_VARIABLE
)
{
int32_t
ret
=
parseAbsoluteDuration
(
pToken
->
z
,
pToken
->
n
,
&
pSqlExpr
->
val
.
i64
);
int32_t
ret
=
parseAbsoluteDuration
(
pToken
->
z
,
pToken
->
n
,
&
pSqlExpr
->
val
ue
.
i64
);
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
terrno
=
TSDB_CODE_TSC_SQL_SYNTAX_ERROR
;
}
pSqlExpr
->
val
.
nType
=
TSDB_DATA_TYPE_BIGINT
;
pSqlExpr
->
nSQLOptr
=
TK_TIMESTAMP
;
}
else
{
// it must be the column name (tk_id) if it is not the number
pSqlExpr
->
value
.
nType
=
TSDB_DATA_TYPE_BIGINT
;
pSqlExpr
->
tokenId
=
TK_TIMESTAMP
;
pSqlExpr
->
type
=
SQL_NODE_VALUE
;
}
else
{
// Here it must be the column name (tk_id) if it is not a number or string.
assert
(
optrType
==
TK_ID
||
optrType
==
TK_ALL
);
if
(
pToken
!=
NULL
)
{
pSqlExpr
->
colInfo
=
*
pToken
;
}
pSqlExpr
->
nSQLOptr
=
optrType
;
pSqlExpr
->
tokenId
=
optrType
;
pSqlExpr
->
type
=
SQL_NODE_TABLE_COLUMN
;
}
return
pSqlExpr
;
...
...
@@ -162,18 +167,18 @@ tSQLExpr *tSqlExprCreateFunction(tSQLExprList *pList, SStrToken *pFuncToken, SSt
return
NULL
;
}
assert
(
optType
==
TK_ID
);
tSQLExpr
*
pExpr
=
calloc
(
1
,
sizeof
(
tSQLExpr
));
pExpr
->
nSQLOptr
=
TK_FUNCTION
;
pExpr
->
pParam
=
pList
;
pExpr
->
tokenId
=
optType
;
pExpr
->
type
=
SQL_NODE_SQLFUNCTION
;
pExpr
->
pParam
=
pList
;
int32_t
len
=
(
int32_t
)((
endToken
->
z
+
endToken
->
n
)
-
pFuncToken
->
z
);
pExpr
->
operand
.
z
=
pFuncToken
->
z
;
pExpr
->
operand
.
n
=
len
;
// raw field name
pExpr
->
operand
.
type
=
pFuncToken
->
type
;
pExpr
->
operand
=
(
*
pFuncToken
);
pExpr
->
token
.
n
=
len
;
pExpr
->
token
.
z
=
pFuncToken
->
z
;
pExpr
->
token
.
type
=
pFuncToken
->
type
;
pExpr
->
token
=
(
*
pFuncToken
);
return
pExpr
;
}
...
...
@@ -184,6 +189,7 @@ tSQLExpr *tSqlExprCreateFunction(tSQLExprList *pList, SStrToken *pFuncToken, SSt
tSQLExpr
*
tSqlExprCreate
(
tSQLExpr
*
pLeft
,
tSQLExpr
*
pRight
,
int32_t
optrType
)
{
tSQLExpr
*
pExpr
=
calloc
(
1
,
sizeof
(
tSQLExpr
));
pExpr
->
type
=
SQL_NODE_EXPR
;
if
(
pLeft
!=
NULL
&&
pRight
!=
NULL
&&
(
optrType
!=
TK_IN
))
{
char
*
endPos
=
pRight
->
token
.
z
+
pRight
->
token
.
n
;
pExpr
->
token
.
z
=
pLeft
->
token
.
z
;
...
...
@@ -197,32 +203,33 @@ tSQLExpr *tSqlExprCreate(tSQLExpr *pLeft, tSQLExpr *pRight, int32_t optrType) {
* if a token is noted as the TK_TIMESTAMP, the time precision is microsecond
* Otherwise, the time precision is adaptive, determined by the time precision from databases.
*/
if
((
pLeft
->
nSQLOptr
==
TK_INTEGER
&&
pRight
->
nSQLOptr
==
TK_INTEGER
)
||
(
pLeft
->
nSQLOptr
==
TK_TIMESTAMP
&&
pRight
->
nSQLOptr
==
TK_TIMESTAMP
))
{
pExpr
->
val
.
nType
=
TSDB_DATA_TYPE_BIGINT
;
pExpr
->
nSQLOptr
=
pLeft
->
nSQLOptr
;
if
((
pLeft
->
tokenId
==
TK_INTEGER
&&
pRight
->
tokenId
==
TK_INTEGER
)
||
(
pLeft
->
tokenId
==
TK_TIMESTAMP
&&
pRight
->
tokenId
==
TK_TIMESTAMP
))
{
pExpr
->
value
.
nType
=
TSDB_DATA_TYPE_BIGINT
;
pExpr
->
tokenId
=
pLeft
->
tokenId
;
pExpr
->
type
=
SQL_NODE_VALUE
;
switch
(
optrType
)
{
case
TK_PLUS
:
{
pExpr
->
val
.
i64
=
pLeft
->
val
.
i64
+
pRight
->
val
.
i64
;
pExpr
->
val
ue
.
i64
=
pLeft
->
value
.
i64
+
pRight
->
value
.
i64
;
break
;
}
case
TK_MINUS
:
{
pExpr
->
val
.
i64
=
pLeft
->
val
.
i64
-
pRight
->
val
.
i64
;
pExpr
->
val
ue
.
i64
=
pLeft
->
value
.
i64
-
pRight
->
value
.
i64
;
break
;
}
case
TK_STAR
:
{
pExpr
->
val
.
i64
=
pLeft
->
val
.
i64
*
pRight
->
val
.
i64
;
pExpr
->
val
ue
.
i64
=
pLeft
->
value
.
i64
*
pRight
->
value
.
i64
;
break
;
}
case
TK_DIVIDE
:
{
pExpr
->
nSQLOptr
=
TK_FLOAT
;
pExpr
->
val
.
nType
=
TSDB_DATA_TYPE_DOUBLE
;
pExpr
->
val
.
dKey
=
(
double
)
pLeft
->
val
.
i64
/
pRight
->
val
.
i64
;
pExpr
->
tokenId
=
TK_FLOAT
;
pExpr
->
val
ue
.
nType
=
TSDB_DATA_TYPE_DOUBLE
;
pExpr
->
val
ue
.
dKey
=
(
double
)
pLeft
->
value
.
i64
/
pRight
->
value
.
i64
;
break
;
}
case
TK_REM
:
{
pExpr
->
val
.
i64
=
pLeft
->
val
.
i64
%
pRight
->
val
.
i64
;
pExpr
->
val
ue
.
i64
=
pLeft
->
value
.
i64
%
pRight
->
value
.
i64
;
break
;
}
}
...
...
@@ -230,33 +237,35 @@ tSQLExpr *tSqlExprCreate(tSQLExpr *pLeft, tSQLExpr *pRight, int32_t optrType) {
tSqlExprDestroy
(
pLeft
);
tSqlExprDestroy
(
pRight
);
}
else
if
((
pLeft
->
nSQLOptr
==
TK_FLOAT
&&
pRight
->
nSQLOptr
==
TK_INTEGER
)
||
(
pLeft
->
nSQLOptr
==
TK_INTEGER
&&
pRight
->
nSQLOptr
==
TK_FLOAT
)
||
(
pLeft
->
nSQLOptr
==
TK_FLOAT
&&
pRight
->
nSQLOptr
==
TK_FLOAT
))
{
pExpr
->
val
.
nType
=
TSDB_DATA_TYPE_DOUBLE
;
pExpr
->
nSQLOptr
=
TK_FLOAT
;
}
else
if
((
pLeft
->
tokenId
==
TK_FLOAT
&&
pRight
->
tokenId
==
TK_INTEGER
)
||
(
pLeft
->
tokenId
==
TK_INTEGER
&&
pRight
->
tokenId
==
TK_FLOAT
)
||
(
pLeft
->
tokenId
==
TK_FLOAT
&&
pRight
->
tokenId
==
TK_FLOAT
))
{
pExpr
->
value
.
nType
=
TSDB_DATA_TYPE_DOUBLE
;
pExpr
->
tokenId
=
TK_FLOAT
;
pExpr
->
type
=
SQL_NODE_VALUE
;
double
left
=
(
pLeft
->
val
.
nType
==
TSDB_DATA_TYPE_DOUBLE
)
?
pLeft
->
val
.
dKey
:
pLeft
->
val
.
i64
;
double
right
=
(
pRight
->
val
.
nType
==
TSDB_DATA_TYPE_DOUBLE
)
?
pRight
->
val
.
dKey
:
pRight
->
val
.
i64
;
double
left
=
(
pLeft
->
val
ue
.
nType
==
TSDB_DATA_TYPE_DOUBLE
)
?
pLeft
->
value
.
dKey
:
pLeft
->
value
.
i64
;
double
right
=
(
pRight
->
val
ue
.
nType
==
TSDB_DATA_TYPE_DOUBLE
)
?
pRight
->
value
.
dKey
:
pRight
->
value
.
i64
;
switch
(
optrType
)
{
case
TK_PLUS
:
{
pExpr
->
val
.
dKey
=
left
+
right
;
pExpr
->
val
ue
.
dKey
=
left
+
right
;
break
;
}
case
TK_MINUS
:
{
pExpr
->
val
.
dKey
=
left
-
right
;
pExpr
->
val
ue
.
dKey
=
left
-
right
;
break
;
}
case
TK_STAR
:
{
pExpr
->
val
.
dKey
=
left
*
right
;
pExpr
->
val
ue
.
dKey
=
left
*
right
;
break
;
}
case
TK_DIVIDE
:
{
pExpr
->
val
.
dKey
=
left
/
right
;
pExpr
->
val
ue
.
dKey
=
left
/
right
;
break
;
}
case
TK_REM
:
{
pExpr
->
val
.
dKey
=
left
-
((
int64_t
)(
left
/
right
))
*
right
;
pExpr
->
val
ue
.
dKey
=
left
-
((
int64_t
)(
left
/
right
))
*
right
;
break
;
}
}
...
...
@@ -265,21 +274,21 @@ tSQLExpr *tSqlExprCreate(tSQLExpr *pLeft, tSQLExpr *pRight, int32_t optrType) {
tSqlExprDestroy
(
pRight
);
}
else
{
pExpr
->
nSQLOptr
=
optrType
;
pExpr
->
tokenId
=
optrType
;
pExpr
->
pLeft
=
pLeft
;
pExpr
->
pRight
=
pRight
;
}
}
else
if
(
optrType
==
TK_IN
)
{
pExpr
->
nSQLOptr
=
optrType
;
pExpr
->
tokenId
=
optrType
;
pExpr
->
pLeft
=
pLeft
;
tSQLExpr
*
pRSub
=
calloc
(
1
,
sizeof
(
tSQLExpr
));
pRSub
->
nSQLOptr
=
TK_SET
;
// TODO refactor .....
pRSub
->
tokenId
=
TK_SET
;
// TODO refactor .....
pRSub
->
pParam
=
(
tSQLExprList
*
)
pRight
;
pExpr
->
pRight
=
pRSub
;
}
else
{
pExpr
->
nSQLOptr
=
optrType
;
pExpr
->
tokenId
=
optrType
;
pExpr
->
pLeft
=
pLeft
;
if
(
pLeft
!=
NULL
&&
pRight
==
NULL
)
{
...
...
@@ -297,8 +306,8 @@ void tSqlExprNodeDestroy(tSQLExpr *pExpr) {
return
;
}
if
(
pExpr
->
nSQLOptr
==
TK_STRING
)
{
tVariantDestroy
(
&
pExpr
->
val
);
if
(
pExpr
->
tokenId
==
TK_STRING
)
{
tVariantDestroy
(
&
pExpr
->
val
ue
);
}
tSqlExprListDestroy
(
pExpr
->
pParam
);
...
...
src/query/src/qTokenizer.c
浏览文件 @
5501982f
...
...
@@ -268,7 +268,7 @@ int tSQLKeywordCode(const char* z, int n) {
* Return the length of the token that begins at z[0].
* Store the token type in *type before returning.
*/
uint32_t
tSQLGetToken
(
char
*
z
,
uint32_t
*
token
Type
)
{
uint32_t
tSQLGetToken
(
char
*
z
,
uint32_t
*
token
Id
)
{
uint32_t
i
;
switch
(
*
z
)
{
case
' '
:
...
...
@@ -278,121 +278,121 @@ uint32_t tSQLGetToken(char* z, uint32_t* tokenType) {
case
'\r'
:
{
for
(
i
=
1
;
isspace
(
z
[
i
]);
i
++
)
{
}
*
token
Type
=
TK_SPACE
;
*
token
Id
=
TK_SPACE
;
return
i
;
}
case
':'
:
{
*
token
Type
=
TK_COLON
;
*
token
Id
=
TK_COLON
;
return
1
;
}
case
'-'
:
{
if
(
z
[
1
]
==
'-'
)
{
for
(
i
=
2
;
z
[
i
]
&&
z
[
i
]
!=
'\n'
;
i
++
)
{
}
*
token
Type
=
TK_COMMENT
;
*
token
Id
=
TK_COMMENT
;
return
i
;
}
*
token
Type
=
TK_MINUS
;
*
token
Id
=
TK_MINUS
;
return
1
;
}
case
'('
:
{
*
token
Type
=
TK_LP
;
*
token
Id
=
TK_LP
;
return
1
;
}
case
')'
:
{
*
token
Type
=
TK_RP
;
*
token
Id
=
TK_RP
;
return
1
;
}
case
';'
:
{
*
token
Type
=
TK_SEMI
;
*
token
Id
=
TK_SEMI
;
return
1
;
}
case
'+'
:
{
*
token
Type
=
TK_PLUS
;
*
token
Id
=
TK_PLUS
;
return
1
;
}
case
'*'
:
{
*
token
Type
=
TK_STAR
;
*
token
Id
=
TK_STAR
;
return
1
;
}
case
'/'
:
{
if
(
z
[
1
]
!=
'*'
||
z
[
2
]
==
0
)
{
*
token
Type
=
TK_SLASH
;
*
token
Id
=
TK_SLASH
;
return
1
;
}
for
(
i
=
3
;
z
[
i
]
&&
(
z
[
i
]
!=
'/'
||
z
[
i
-
1
]
!=
'*'
);
i
++
)
{
}
if
(
z
[
i
])
i
++
;
*
token
Type
=
TK_COMMENT
;
*
token
Id
=
TK_COMMENT
;
return
i
;
}
case
'%'
:
{
*
token
Type
=
TK_REM
;
*
token
Id
=
TK_REM
;
return
1
;
}
case
'='
:
{
*
token
Type
=
TK_EQ
;
*
token
Id
=
TK_EQ
;
return
1
+
(
z
[
1
]
==
'='
);
}
case
'<'
:
{
if
(
z
[
1
]
==
'='
)
{
*
token
Type
=
TK_LE
;
*
token
Id
=
TK_LE
;
return
2
;
}
else
if
(
z
[
1
]
==
'>'
)
{
*
token
Type
=
TK_NE
;
*
token
Id
=
TK_NE
;
return
2
;
}
else
if
(
z
[
1
]
==
'<'
)
{
*
token
Type
=
TK_LSHIFT
;
*
token
Id
=
TK_LSHIFT
;
return
2
;
}
else
{
*
token
Type
=
TK_LT
;
*
token
Id
=
TK_LT
;
return
1
;
}
}
case
'>'
:
{
if
(
z
[
1
]
==
'='
)
{
*
token
Type
=
TK_GE
;
*
token
Id
=
TK_GE
;
return
2
;
}
else
if
(
z
[
1
]
==
'>'
)
{
*
token
Type
=
TK_RSHIFT
;
*
token
Id
=
TK_RSHIFT
;
return
2
;
}
else
{
*
token
Type
=
TK_GT
;
*
token
Id
=
TK_GT
;
return
1
;
}
}
case
'!'
:
{
if
(
z
[
1
]
!=
'='
)
{
*
token
Type
=
TK_ILLEGAL
;
*
token
Id
=
TK_ILLEGAL
;
return
2
;
}
else
{
*
token
Type
=
TK_NE
;
*
token
Id
=
TK_NE
;
return
2
;
}
}
case
'|'
:
{
if
(
z
[
1
]
!=
'|'
)
{
*
token
Type
=
TK_BITOR
;
*
token
Id
=
TK_BITOR
;
return
1
;
}
else
{
*
token
Type
=
TK_CONCAT
;
*
token
Id
=
TK_CONCAT
;
return
2
;
}
}
case
','
:
{
*
token
Type
=
TK_COMMA
;
*
token
Id
=
TK_COMMA
;
return
1
;
}
case
'&'
:
{
*
token
Type
=
TK_BITAND
;
*
token
Id
=
TK_BITAND
;
return
1
;
}
case
'~'
:
{
*
token
Type
=
TK_BITNOT
;
*
token
Id
=
TK_BITNOT
;
return
1
;
}
case
'?'
:
{
*
token
Type
=
TK_QUESTION
;
*
token
Id
=
TK_QUESTION
;
return
1
;
}
case
'\''
:
...
...
@@ -418,7 +418,7 @@ uint32_t tSQLGetToken(char* z, uint32_t* tokenType) {
if
(
z
[
i
])
i
++
;
if
(
strEnd
)
{
*
token
Type
=
TK_STRING
;
*
token
Id
=
TK_STRING
;
return
i
;
}
...
...
@@ -442,10 +442,10 @@ uint32_t tSQLGetToken(char* z, uint32_t* tokenType) {
}
}
*
token
Type
=
TK_FLOAT
;
*
token
Id
=
TK_FLOAT
;
return
i
;
}
else
{
*
token
Type
=
TK_DOT
;
*
token
Id
=
TK_DOT
;
return
1
;
}
}
...
...
@@ -454,7 +454,7 @@ uint32_t tSQLGetToken(char* z, uint32_t* tokenType) {
char
next
=
z
[
1
];
if
(
next
==
'b'
)
{
// bin number
*
token
Type
=
TK_BIN
;
*
token
Id
=
TK_BIN
;
for
(
i
=
2
;
(
z
[
i
]
==
'0'
||
z
[
i
]
==
'1'
);
++
i
)
{
}
...
...
@@ -464,7 +464,7 @@ uint32_t tSQLGetToken(char* z, uint32_t* tokenType) {
return
i
;
}
else
if
(
next
==
'x'
)
{
//hex number
*
token
Type
=
TK_HEX
;
*
token
Id
=
TK_HEX
;
for
(
i
=
2
;
isdigit
(
z
[
i
])
||
(
z
[
i
]
>=
'a'
&&
z
[
i
]
<=
'f'
)
||
(
z
[
i
]
>=
'A'
&&
z
[
i
]
<=
'F'
);
++
i
)
{
}
...
...
@@ -484,7 +484,7 @@ uint32_t tSQLGetToken(char* z, uint32_t* tokenType) {
case
'7'
:
case
'8'
:
case
'9'
:
{
*
token
Type
=
TK_INTEGER
;
*
token
Id
=
TK_INTEGER
;
for
(
i
=
1
;
isdigit
(
z
[
i
]);
i
++
)
{
}
...
...
@@ -494,7 +494,7 @@ uint32_t tSQLGetToken(char* z, uint32_t* tokenType) {
z
[
i
]
==
'U'
||
z
[
i
]
==
'A'
||
z
[
i
]
==
'S'
||
z
[
i
]
==
'M'
||
z
[
i
]
==
'H'
||
z
[
i
]
==
'D'
||
z
[
i
]
==
'N'
||
z
[
i
]
==
'Y'
||
z
[
i
]
==
'W'
)
&&
(
isIdChar
[(
uint8_t
)
z
[
i
+
1
]]
==
0
))
{
*
token
Type
=
TK_VARIABLE
;
*
token
Id
=
TK_VARIABLE
;
i
+=
1
;
return
i
;
}
...
...
@@ -505,12 +505,12 @@ uint32_t tSQLGetToken(char* z, uint32_t* tokenType) {
while
(
isdigit
(
z
[
i
]))
{
i
++
;
}
*
token
Type
=
TK_FLOAT
;
*
token
Id
=
TK_FLOAT
;
seg
++
;
}
if
(
seg
==
4
)
{
// ip address
*
token
Type
=
TK_IPTOKEN
;
*
token
Id
=
TK_IPTOKEN
;
return
i
;
}
...
...
@@ -520,14 +520,14 @@ uint32_t tSQLGetToken(char* z, uint32_t* tokenType) {
while
(
isdigit
(
z
[
i
]))
{
i
++
;
}
*
token
Type
=
TK_FLOAT
;
*
token
Id
=
TK_FLOAT
;
}
return
i
;
}
case
'['
:
{
for
(
i
=
1
;
z
[
i
]
&&
z
[
i
-
1
]
!=
']'
;
i
++
)
{
}
*
token
Type
=
TK_ID
;
*
token
Id
=
TK_ID
;
return
i
;
}
case
'T'
:
...
...
@@ -538,7 +538,7 @@ uint32_t tSQLGetToken(char* z, uint32_t* tokenType) {
}
if
((
i
==
4
&&
strncasecmp
(
z
,
"true"
,
4
)
==
0
)
||
(
i
==
5
&&
strncasecmp
(
z
,
"false"
,
5
)
==
0
))
{
*
token
Type
=
TK_BOOL
;
*
token
Id
=
TK_BOOL
;
return
i
;
}
}
...
...
@@ -548,12 +548,12 @@ uint32_t tSQLGetToken(char* z, uint32_t* tokenType) {
}
for
(
i
=
1
;
((
z
[
i
]
&
0x80
)
==
0
)
&&
isIdChar
[(
uint8_t
)
z
[
i
]];
i
++
)
{
}
*
token
Type
=
tSQLKeywordCode
(
z
,
i
);
*
token
Id
=
tSQLKeywordCode
(
z
,
i
);
return
i
;
}
}
*
token
Type
=
TK_ILLEGAL
;
*
token
Id
=
TK_ILLEGAL
;
return
0
;
}
...
...
tests/script/general/parser/testSuite.sim
浏览文件 @
5501982f
run general/parser/alter.sim
sleep 100
run general/parser/alter1.sim
sleep 100
run general/parser/alter_stable.sim
sleep 100
run general/parser/auto_create_tb.sim
sleep 100
run general/parser/auto_create_tb_drop_tb.sim
sleep 100
run general/parser/col_arithmetic_operation.sim
sleep 100
run general/parser/columnValue.sim
sleep 100
run general/parser/commit.sim
sleep 100
run general/parser/create_db.sim
sleep 100
run general/parser/create_mt.sim
sleep 100
run general/parser/create_tb.sim
sleep 100
run general/parser/dbtbnameValidate.sim
sleep 100
run general/parser/fill.sim
sleep 100
run general/parser/fill_stb.sim
sleep 100
#run general/parser/fill_us.sim #
sleep 100
run general/parser/first_last.sim
sleep 100
run general/parser/import_commit1.sim
sleep 100
run general/parser/import_commit2.sim
sleep 100
run general/parser/import_commit3.sim
sleep 100
#run general/parser/import_file.sim
sleep 100
run general/parser/insert_tb.sim
sleep 100
run general/parser/tags_dynamically_specifiy.sim
sleep 100
run general/parser/interp.sim
sleep 100
run general/parser/lastrow.sim
sleep 100
run general/parser/limit.sim
sleep 100
run general/parser/limit1.sim
sleep 100
run general/parser/limit1_tblocks100.sim
sleep 100
run general/parser/limit2.sim
sleep 100
run general/parser/mixed_blocks.sim
sleep 100
run general/parser/nchar.sim
sleep 100
run general/parser/null_char.sim
sleep 100
run general/parser/selectResNum.sim
sleep 100
run general/parser/select_across_vnodes.sim
sleep 100
run general/parser/select_from_cache_disk.sim
sleep 100
run general/parser/set_tag_vals.sim
sleep 100
run general/parser/single_row_in_tb.sim
sleep 100
run general/parser/slimit.sim
sleep 100
run general/parser/slimit1.sim
sleep 100
run general/parser/slimit_alter_tags.sim
sleep 100
run general/parser/tbnameIn.sim
sleep 100
run general/parser/slimit_alter_tags.sim # persistent failed
sleep 100
run general/parser/join.sim
sleep 100
run general/parser/join_multivnode.sim
sleep 100
#
run general/parser/alter.sim
#
sleep 100
#
run general/parser/alter1.sim
#
sleep 100
#
run general/parser/alter_stable.sim
#
sleep 100
#
run general/parser/auto_create_tb.sim
#
sleep 100
#
run general/parser/auto_create_tb_drop_tb.sim
#
sleep 100
#
run general/parser/col_arithmetic_operation.sim
#
sleep 100
#
run general/parser/columnValue.sim
#
sleep 100
#
run general/parser/commit.sim
#
sleep 100
#
run general/parser/create_db.sim
#
sleep 100
#
run general/parser/create_mt.sim
#
sleep 100
#
run general/parser/create_tb.sim
#
sleep 100
#
run general/parser/dbtbnameValidate.sim
#
sleep 100
#
run general/parser/fill.sim
#
sleep 100
#
run general/parser/fill_stb.sim
#
sleep 100
#
#
run general/parser/fill_us.sim #
#
sleep 100
#
run general/parser/first_last.sim
#
sleep 100
#
run general/parser/import_commit1.sim
#
sleep 100
#
run general/parser/import_commit2.sim
#
sleep 100
#
run general/parser/import_commit3.sim
#
sleep 100
#
#
run general/parser/import_file.sim
#
sleep 100
#
run general/parser/insert_tb.sim
#
sleep 100
#
run general/parser/tags_dynamically_specifiy.sim
#
sleep 100
#
run general/parser/interp.sim
#
sleep 100
#
run general/parser/lastrow.sim
#
sleep 100
#
run general/parser/limit.sim
#
sleep 100
#
run general/parser/limit1.sim
#
sleep 100
#
run general/parser/limit1_tblocks100.sim
#
sleep 100
#
run general/parser/limit2.sim
#
sleep 100
#
run general/parser/mixed_blocks.sim
#
sleep 100
#
run general/parser/nchar.sim
#
sleep 100
#
run general/parser/null_char.sim
#
sleep 100
#
run general/parser/selectResNum.sim
#
sleep 100
#
run general/parser/select_across_vnodes.sim
#
sleep 100
#
run general/parser/select_from_cache_disk.sim
#
sleep 100
#
run general/parser/set_tag_vals.sim
#
sleep 100
#
run general/parser/single_row_in_tb.sim
#
sleep 100
#
run general/parser/slimit.sim
#
sleep 100
#
run general/parser/slimit1.sim
#
sleep 100
#
run general/parser/slimit_alter_tags.sim
#
sleep 100
#
run general/parser/tbnameIn.sim
#
sleep 100
#
run general/parser/slimit_alter_tags.sim # persistent failed
#
sleep 100
#
run general/parser/join.sim
#
sleep 100
#
run general/parser/join_multivnode.sim
#
sleep 100
run general/parser/projection_limit_offset.sim
sleep 100
run general/parser/select_with_tags.sim
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录