Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
f3aa56ae
T
TDengine
项目概览
taosdata
/
TDengine
1 年多 前同步成功
通知
1187
Star
22018
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
f3aa56ae
编写于
11月 24, 2020
作者:
H
haojun Liao
提交者:
GitHub
11月 24, 2020
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #4327 from taosdata/feature/query
Feature/query
上级
11a5fe27
c3fd294c
变更
18
隐藏空白更改
内联
并排
Showing
18 changed file
with
890 addition
and
213 deletion
+890
-213
src/client/src/tscPrepare.c
src/client/src/tscPrepare.c
+34
-38
src/client/src/tscSQLParser.c
src/client/src/tscSQLParser.c
+15
-16
src/client/src/tscServer.c
src/client/src/tscServer.c
+6
-3
src/client/src/tscSql.c
src/client/src/tscSql.c
+10
-1
src/client/src/tscUtil.c
src/client/src/tscUtil.c
+5
-2
src/client/tests/resultFieldTest.cpp
src/client/tests/resultFieldTest.cpp
+138
-0
src/common/src/tvariant.c
src/common/src/tvariant.c
+3
-1
src/inc/taosmsg.h
src/inc/taosmsg.h
+2
-0
src/query/inc/qUtil.h
src/query/inc/qUtil.h
+4
-1
src/query/inc/sql.y
src/query/inc/sql.y
+4
-4
src/query/src/qExecutor.c
src/query/src/qExecutor.c
+43
-25
src/query/src/qParserImpl.c
src/query/src/qParserImpl.c
+2
-1
src/query/src/qResultbuf.c
src/query/src/qResultbuf.c
+6
-3
src/query/src/qTsbuf.c
src/query/src/qTsbuf.c
+3
-1
src/query/src/qUtil.c
src/query/src/qUtil.c
+47
-29
src/query/src/sql.c
src/query/src/sql.c
+5
-6
tests/script/general/parser/col_arithmetic_operation.sim
tests/script/general/parser/col_arithmetic_operation.sim
+85
-82
tests/script/general/parser/col_arithmetic_query.sim
tests/script/general/parser/col_arithmetic_query.sim
+478
-0
未找到文件。
src/client/src/tscPrepare.c
浏览文件 @
f3aa56ae
...
...
@@ -258,11 +258,7 @@ static char* normalStmtBuildSql(STscStmt* stmt) {
static
int
doBindParam
(
char
*
data
,
SParamInfo
*
param
,
TAOS_BIND
*
bind
)
{
if
(
bind
->
is_null
!=
NULL
&&
*
(
bind
->
is_null
))
{
if
(
param
->
type
==
TSDB_DATA_TYPE_BINARY
||
param
->
type
==
TSDB_DATA_TYPE_NCHAR
)
{
setVardataNull
(
data
+
param
->
offset
,
param
->
type
);
}
else
{
setNull
(
data
+
param
->
offset
,
param
->
type
,
param
->
bytes
);
}
setNull
(
data
+
param
->
offset
,
param
->
type
,
param
->
bytes
);
return
TSDB_CODE_SUCCESS
;
}
...
...
@@ -312,13 +308,13 @@ static int doBindParam(char* data, SParamInfo* param, TAOS_BIND* bind) {
break
;
}
return
TSDB_CODE_TSC_INVALID_VALUE
;
}
break
;
}
case
TSDB_DATA_TYPE_FLOAT
:
case
TSDB_DATA_TYPE_DOUBLE
:
case
TSDB_DATA_TYPE_TIMESTAMP
:
default:
{
return
TSDB_CODE_TSC_INVALID_VALUE
;
}
break
;
}
}
memcpy
(
data
+
param
->
offset
,
&
u
.
v1
,
sizeof
(
u
.
v1
));
return
TSDB_CODE_SUCCESS
;
...
...
@@ -336,40 +332,40 @@ static int doBindParam(char* data, SParamInfo* param, TAOS_BIND* bind) {
u
.
v1
=
(
int8_t
)
v
;
if
(
v
>=
SCHAR_MIN
&&
v
<=
SCHAR_MAX
)
break
;
return
TSDB_CODE_TSC_INVALID_VALUE
;
}
break
;
}
case
TSDB_DATA_TYPE_INT
:
{
int32_t
v
=
*
(
int32_t
*
)
bind
->
buffer
;
u
.
v1
=
(
int8_t
)
v
;
if
(
v
>=
SCHAR_MIN
&&
v
<=
SCHAR_MAX
)
break
;
return
TSDB_CODE_TSC_INVALID_VALUE
;
}
break
;
}
case
TSDB_DATA_TYPE_BIGINT
:
{
int64_t
v
=
*
(
int64_t
*
)
bind
->
buffer
;
u
.
v1
=
(
int8_t
)
v
;
if
(
v
>=
SCHAR_MIN
&&
v
<=
SCHAR_MAX
)
break
;
return
TSDB_CODE_TSC_INVALID_VALUE
;
}
break
;
}
case
TSDB_DATA_TYPE_BINARY
:
case
TSDB_DATA_TYPE_NCHAR
:
{
int64_t
v
;
int
n
,
r
;
int
n
,
r
;
r
=
sscanf
((
const
char
*
)
bind
->
buffer
,
"%"
PRId64
"%n"
,
&
v
,
&
n
);
if
(
r
==
1
&&
n
==
strlen
((
const
char
*
)
bind
->
buffer
))
{
if
(
r
==
1
&&
n
==
strlen
((
const
char
*
)
bind
->
buffer
))
{
u
.
v1
=
(
int8_t
)
v
;
if
(
v
>=
SCHAR_MIN
&&
v
<=
SCHAR_MAX
)
break
;
}
return
TSDB_CODE_TSC_INVALID_VALUE
;
}
break
;
}
case
TSDB_DATA_TYPE_FLOAT
:
case
TSDB_DATA_TYPE_DOUBLE
:
case
TSDB_DATA_TYPE_TIMESTAMP
:
default:
{
return
TSDB_CODE_TSC_INVALID_VALUE
;
}
break
;
}
}
memcpy
(
data
+
param
->
offset
,
&
u
.
v1
,
sizeof
(
u
.
v1
));
return
TSDB_CODE_SUCCESS
;
}
break
;
}
case
TSDB_DATA_TYPE_SMALLINT
:
{
switch
(
bind
->
buffer_type
)
{
case
TSDB_DATA_TYPE_BOOL
:
...
...
@@ -383,34 +379,34 @@ static int doBindParam(char* data, SParamInfo* param, TAOS_BIND* bind) {
u
.
v2
=
(
int16_t
)
v
;
if
(
v
>=
SHRT_MIN
&&
v
<=
SHRT_MAX
)
break
;
return
TSDB_CODE_TSC_INVALID_VALUE
;
}
break
;
}
case
TSDB_DATA_TYPE_BIGINT
:
{
int64_t
v
=
*
(
int64_t
*
)
bind
->
buffer
;
u
.
v2
=
(
int16_t
)
v
;
if
(
v
>=
SHRT_MIN
&&
v
<=
SHRT_MAX
)
break
;
return
TSDB_CODE_TSC_INVALID_VALUE
;
}
break
;
}
case
TSDB_DATA_TYPE_BINARY
:
case
TSDB_DATA_TYPE_NCHAR
:
{
int64_t
v
;
int
n
,
r
;
int
n
,
r
;
r
=
sscanf
((
const
char
*
)
bind
->
buffer
,
"%"
PRId64
"%n"
,
&
v
,
&
n
);
if
(
r
==
1
&&
n
==
strlen
((
const
char
*
)
bind
->
buffer
))
{
if
(
r
==
1
&&
n
==
strlen
((
const
char
*
)
bind
->
buffer
))
{
u
.
v2
=
(
int16_t
)
v
;
if
(
v
>=
SHRT_MIN
&&
v
<=
SHRT_MAX
)
break
;
}
return
TSDB_CODE_TSC_INVALID_VALUE
;
}
break
;
}
case
TSDB_DATA_TYPE_FLOAT
:
case
TSDB_DATA_TYPE_DOUBLE
:
case
TSDB_DATA_TYPE_TIMESTAMP
:
default:
{
return
TSDB_CODE_TSC_INVALID_VALUE
;
}
break
;
}
}
memcpy
(
data
+
param
->
offset
,
&
u
.
v2
,
sizeof
(
u
.
v2
));
return
TSDB_CODE_SUCCESS
;
}
break
;
}
case
TSDB_DATA_TYPE_INT
:
{
switch
(
bind
->
buffer_type
)
{
case
TSDB_DATA_TYPE_BOOL
:
...
...
@@ -514,17 +510,17 @@ static int doBindParam(char* data, SParamInfo* param, TAOS_BIND* bind) {
break
;
}
return
TSDB_CODE_TSC_INVALID_VALUE
;
}
break
;
}
case
TSDB_DATA_TYPE_FLOAT
:
case
TSDB_DATA_TYPE_DOUBLE
:
case
TSDB_DATA_TYPE_TIMESTAMP
:
default:
{
return
TSDB_CODE_TSC_INVALID_VALUE
;
}
break
;
}
}
memcpy
(
data
+
param
->
offset
,
&
u
.
v8
,
sizeof
(
u
.
v8
));
return
TSDB_CODE_SUCCESS
;
}
break
;
}
case
TSDB_DATA_TYPE_DOUBLE
:
{
switch
(
bind
->
buffer_type
)
{
case
TSDB_DATA_TYPE_BOOL
:
...
...
@@ -556,15 +552,15 @@ static int doBindParam(char* data, SParamInfo* param, TAOS_BIND* bind) {
break
;
}
return
TSDB_CODE_TSC_INVALID_VALUE
;
}
break
;
}
case
TSDB_DATA_TYPE_TIMESTAMP
:
default:
{
return
TSDB_CODE_TSC_INVALID_VALUE
;
}
break
;
}
break
;
}
}
memcpy
(
data
+
param
->
offset
,
&
u
.
f8
,
sizeof
(
u
.
f8
));
return
TSDB_CODE_SUCCESS
;
}
break
;
}
case
TSDB_DATA_TYPE_TIMESTAMP
:
{
switch
(
bind
->
buffer_type
)
{
case
TSDB_DATA_TYPE_TIMESTAMP
:
{
...
...
@@ -589,10 +585,10 @@ static int doBindParam(char* data, SParamInfo* param, TAOS_BIND* bind) {
default:
{
return
TSDB_CODE_TSC_INVALID_VALUE
;
}
break
;
}
break
;
};
memcpy
(
data
+
param
->
offset
,
&
u
.
v8
,
sizeof
(
u
.
v8
));
return
TSDB_CODE_SUCCESS
;
}
break
;
}
case
TSDB_DATA_TYPE_BINARY
:
{
switch
(
bind
->
buffer_type
)
{
case
TSDB_DATA_TYPE_BINARY
:
{
...
...
@@ -602,7 +598,7 @@ static int doBindParam(char* data, SParamInfo* param, TAOS_BIND* bind) {
short
size
=
(
short
)
*
bind
->
length
;
STR_WITH_SIZE_TO_VARSTR
(
data
+
param
->
offset
,
bind
->
buffer
,
size
);
return
TSDB_CODE_SUCCESS
;
}
break
;
}
case
TSDB_DATA_TYPE_BOOL
:
case
TSDB_DATA_TYPE_TINYINT
:
case
TSDB_DATA_TYPE_SMALLINT
:
...
...
@@ -614,9 +610,9 @@ static int doBindParam(char* data, SParamInfo* param, TAOS_BIND* bind) {
case
TSDB_DATA_TYPE_NCHAR
:
default:
{
return
TSDB_CODE_TSC_INVALID_VALUE
;
}
break
;
}
}
}
break
;
}
case
TSDB_DATA_TYPE_NCHAR
:
{
switch
(
bind
->
buffer_type
)
{
case
TSDB_DATA_TYPE_NCHAR
:
{
...
...
@@ -626,7 +622,7 @@ static int doBindParam(char* data, SParamInfo* param, TAOS_BIND* bind) {
}
varDataSetLen
(
data
+
param
->
offset
,
output
);
return
TSDB_CODE_SUCCESS
;
}
break
;
}
case
TSDB_DATA_TYPE_BOOL
:
case
TSDB_DATA_TYPE_TINYINT
:
case
TSDB_DATA_TYPE_SMALLINT
:
...
...
@@ -638,12 +634,12 @@ static int doBindParam(char* data, SParamInfo* param, TAOS_BIND* bind) {
case
TSDB_DATA_TYPE_BINARY
:
default:
{
return
TSDB_CODE_TSC_INVALID_VALUE
;
}
break
;
}
}
}
break
;
}
default:
{
return
TSDB_CODE_TSC_INVALID_VALUE
;
}
break
;
}
}
}
...
...
src/client/src/tscSQLParser.c
浏览文件 @
f3aa56ae
...
...
@@ -80,7 +80,6 @@ static int32_t parseSelectClause(SSqlCmd* pCmd, int32_t clauseIndex, tSQLExprLis
static
bool
validateIpAddress
(
const
char
*
ip
,
size_t
size
);
static
bool
hasUnsupportFunctionsForSTableQuery
(
SSqlCmd
*
pCmd
,
SQueryInfo
*
pQueryInfo
);
static
bool
functionCompatibleCheck
(
SQueryInfo
*
pQueryInfo
,
bool
joinQuery
);
static
void
setColumnOffsetValueInResultset
(
SQueryInfo
*
pQueryInfo
);
static
int32_t
parseGroupbyClause
(
SQueryInfo
*
pQueryInfo
,
SArray
*
pList
,
SSqlCmd
*
pCmd
);
...
...
@@ -1768,10 +1767,10 @@ static int32_t setExprInfoForFunctions(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SS
return
TSDB_CODE_SUCCESS
;
}
void
setResultColName
(
char
*
name
,
tSQLExprItem
*
pItem
,
int32_t
functionId
,
SStrToken
*
pToken
)
{
void
setResultColName
(
char
*
name
,
tSQLExprItem
*
pItem
,
int32_t
functionId
,
SStrToken
*
pToken
,
bool
multiCols
)
{
if
(
pItem
->
aliasName
!=
NULL
)
{
tstrncpy
(
name
,
pItem
->
aliasName
,
TSDB_COL_NAME_LEN
);
}
else
{
}
else
if
(
multiCols
)
{
char
uname
[
TSDB_COL_NAME_LEN
]
=
{
0
};
int32_t
len
=
MIN
(
pToken
->
n
+
1
,
TSDB_COL_NAME_LEN
);
tstrncpy
(
uname
,
pToken
->
z
,
len
);
...
...
@@ -1782,6 +1781,9 @@ void setResultColName(char* name, tSQLExprItem* pItem, int32_t functionId, SStrT
snprintf
(
tmp
,
size
,
"%s(%s)"
,
aAggs
[
functionId
].
aName
,
uname
);
tstrncpy
(
name
,
tmp
,
TSDB_COL_NAME_LEN
);
}
else
{
// use the user-input result column name
int32_t
len
=
MIN
(
pItem
->
pNode
->
token
.
n
+
1
,
TSDB_COL_NAME_LEN
);
tstrncpy
(
name
,
pItem
->
pNode
->
token
.
z
,
len
);
}
}
...
...
@@ -2056,7 +2058,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
for
(
int32_t
j
=
0
;
j
<
tscGetNumOfColumns
(
pTableMetaInfo
->
pTableMeta
);
++
j
)
{
index
.
columnIndex
=
j
;
SStrToken
t
=
{.
z
=
pSchema
[
j
].
name
,
.
n
=
(
uint32_t
)
strnlen
(
pSchema
[
j
].
name
,
TSDB_COL_NAME_LEN
)};
setResultColName
(
name
,
pItem
,
cvtFunc
.
originFuncId
,
&
t
);
setResultColName
(
name
,
pItem
,
cvtFunc
.
originFuncId
,
&
t
,
true
);
if
(
setExprInfoForFunctions
(
pCmd
,
pQueryInfo
,
&
pSchema
[
j
],
cvtFunc
,
name
,
colIndex
++
,
&
index
,
finalResult
)
!=
0
)
{
return
TSDB_CODE_TSC_INVALID_SQL
;
...
...
@@ -2078,7 +2080,9 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
char
name
[
TSDB_COL_NAME_LEN
]
=
{
0
};
SSchema
*
pSchema
=
tscGetTableColumnSchema
(
pTableMetaInfo
->
pTableMeta
,
index
.
columnIndex
);
setResultColName
(
name
,
pItem
,
cvtFunc
.
originFuncId
,
&
pParamElem
->
pNode
->
colInfo
);
bool
multiColOutput
=
pItem
->
pNode
->
pParam
->
nExpr
>
1
;
setResultColName
(
name
,
pItem
,
cvtFunc
.
originFuncId
,
&
pParamElem
->
pNode
->
colInfo
,
multiColOutput
);
if
(
setExprInfoForFunctions
(
pCmd
,
pQueryInfo
,
pSchema
,
cvtFunc
,
name
,
colIndex
+
i
,
&
index
,
finalResult
)
!=
0
)
{
return
TSDB_CODE_TSC_INVALID_SQL
;
...
...
@@ -2120,7 +2124,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
char
name
[
TSDB_COL_NAME_LEN
]
=
{
0
};
SStrToken
t
=
{.
z
=
pSchema
[
i
].
name
,
.
n
=
(
uint32_t
)
strnlen
(
pSchema
[
i
].
name
,
TSDB_COL_NAME_LEN
)};
setResultColName
(
name
,
pItem
,
cvtFunc
.
originFuncId
,
&
t
);
setResultColName
(
name
,
pItem
,
cvtFunc
.
originFuncId
,
&
t
,
true
);
if
(
setExprInfoForFunctions
(
pCmd
,
pQueryInfo
,
&
pSchema
[
index
.
columnIndex
],
cvtFunc
,
name
,
colIndex
,
&
index
,
finalResult
)
!=
0
)
{
return
TSDB_CODE_TSC_INVALID_SQL
;
...
...
@@ -2951,14 +2955,6 @@ int32_t parseGroupbyClause(SQueryInfo* pQueryInfo, SArray* pList, SSqlCmd* pCmd)
return
TSDB_CODE_SUCCESS
;
}
void
setColumnOffsetValueInResultset
(
SQueryInfo
*
pQueryInfo
)
{
if
(
QUERY_IS_STABLE_QUERY
(
pQueryInfo
->
type
))
{
tscFieldInfoUpdateOffset
(
pQueryInfo
);
}
else
{
tscFieldInfoUpdateOffset
(
pQueryInfo
);
}
}
static
SColumnFilterInfo
*
addColumnFilterInfo
(
SColumn
*
pColumn
)
{
if
(
pColumn
==
NULL
)
{
return
NULL
;
...
...
@@ -3537,7 +3533,7 @@ static int32_t validateSQLExpr(SSqlCmd* pCmd, tSQLExpr* pExpr, SQueryInfo* pQuer
if
(
i
==
0
)
{
id
=
p1
->
uid
;
}
else
if
(
id
!=
p1
->
uid
){
}
else
if
(
id
!=
p1
->
uid
)
{
return
TSDB_CODE_TSC_INVALID_SQL
;
}
}
...
...
@@ -4252,6 +4248,9 @@ static int32_t getTagQueryCondExpr(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SCondE
tExprTreeDestroy
(
&
p
,
NULL
);
taosArrayDestroy
(
colList
);
if
(
taosArrayGetSize
(
pQueryInfo
->
tagCond
.
pCond
)
>
0
&&
!
UTIL_TABLE_IS_SUPER_TABLE
(
pTableMetaInfo
))
{
return
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
"filter on tag not supported for normal table"
);
}
}
pCondExpr
->
pTagCond
=
NULL
;
...
...
@@ -6531,7 +6530,7 @@ int32_t doCheckForQuery(SSqlObj* pSql, SQuerySQL* pQuerySql, int32_t index) {
return
code
;
}
setColumnOffsetValueInResult
set
(
pQueryInfo
);
tscFieldInfoUpdateOff
set
(
pQueryInfo
);
/*
* fill options are set at the end position, when all columns are set properly
...
...
src/client/src/tscServer.c
浏览文件 @
f3aa56ae
...
...
@@ -62,7 +62,7 @@ static void tscSetDnodeEpSet(SSqlObj* pSql, SVgroupInfo* pVgroupInfo) {
pEpSet
->
numOfEps
=
pVgroupInfo
->
numOfEps
;
for
(
int32_t
i
=
0
;
i
<
pVgroupInfo
->
numOfEps
;
++
i
)
{
strcpy
(
pEpSet
->
fqdn
[
i
],
pVgroupInfo
->
epAddr
[
i
].
fqdn
);
tstrncpy
(
pEpSet
->
fqdn
[
i
],
pVgroupInfo
->
epAddr
[
i
].
fqdn
,
tListLen
(
pEpSet
->
fqdn
[
i
])
);
pEpSet
->
port
[
i
]
=
pVgroupInfo
->
epAddr
[
i
].
port
;
if
(
!
hasFqdn
)
{
...
...
@@ -669,6 +669,7 @@ int tscBuildQueryMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
}
SQueryTableMsg
*
pQueryMsg
=
(
SQueryTableMsg
*
)
pCmd
->
payload
;
tstrncpy
(
pQueryMsg
->
version
,
version
,
tListLen
(
pQueryMsg
->
version
));
int32_t
numOfTags
=
(
int32_t
)
taosArrayGetSize
(
pTableMetaInfo
->
tagColList
);
...
...
@@ -693,8 +694,8 @@ int tscBuildQueryMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
pQueryMsg
->
interval
.
slidingUnit
=
pQueryInfo
->
interval
.
slidingUnit
;
pQueryMsg
->
interval
.
offsetUnit
=
pQueryInfo
->
interval
.
offsetUnit
;
pQueryMsg
->
numOfGroupCols
=
htons
(
pQueryInfo
->
groupbyExpr
.
numOfGroupCols
);
pQueryMsg
->
numOfTags
=
htonl
(
numOfTags
);
pQueryMsg
->
tagNameRelType
=
htons
(
pQueryInfo
->
tagCond
.
relType
);
pQueryMsg
->
numOfTags
=
htonl
(
numOfTags
);
pQueryMsg
->
queryType
=
htonl
(
pQueryInfo
->
type
);
size_t
numOfOutput
=
tscSqlExprNumOfExprs
(
pQueryInfo
);
...
...
@@ -2030,7 +2031,8 @@ static void createHBObj(STscObj* pObj) {
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfoDetailSafely
(
&
pSql
->
cmd
,
0
);
if
(
pQueryInfo
==
NULL
)
{
pSql
->
res
.
code
=
terrno
;
terrno
=
TSDB_CODE_TSC_OUT_OF_MEMORY
;
tfree
(
pSql
);
return
;
}
...
...
@@ -2038,6 +2040,7 @@ static void createHBObj(STscObj* pObj) {
pSql
->
cmd
.
command
=
pQueryInfo
->
command
;
if
(
TSDB_CODE_SUCCESS
!=
tscAllocPayload
(
&
(
pSql
->
cmd
),
TSDB_DEFAULT_PAYLOAD_SIZE
))
{
terrno
=
TSDB_CODE_TSC_OUT_OF_MEMORY
;
tfree
(
pSql
);
return
;
}
...
...
src/client/src/tscSql.c
浏览文件 @
f3aa56ae
...
...
@@ -420,7 +420,16 @@ TAOS_FIELD *taos_fetch_fields(TAOS_RES *res) {
for
(
int32_t
i
=
0
;
i
<
pFieldInfo
->
numOfOutput
;
++
i
)
{
SInternalField
*
pField
=
tscFieldInfoGetInternalField
(
pFieldInfo
,
i
);
if
(
pField
->
visible
)
{
f
[
j
++
]
=
pField
->
field
;
f
[
j
]
=
pField
->
field
;
// revise the length for binary and nchar fields
if
(
f
[
j
].
type
==
TSDB_DATA_TYPE_BINARY
)
{
f
[
j
].
bytes
-=
VARSTR_HEADER_SIZE
;
}
else
if
(
f
[
j
].
type
==
TSDB_DATA_TYPE_NCHAR
)
{
f
[
j
].
bytes
=
(
f
[
j
].
bytes
-
VARSTR_HEADER_SIZE
)
/
TSDB_NCHAR_SIZE
;
}
j
+=
1
;
}
}
...
...
src/client/src/tscUtil.c
浏览文件 @
f3aa56ae
...
...
@@ -451,14 +451,16 @@ void tscFreeRegisteredSqlObj(void *pSql) {
STscObj
*
pTscObj
=
(
*
p
)
->
pTscObj
;
assert
((
*
p
)
->
self
!=
0
&&
(
*
p
)
->
self
==
(
p
));
SSqlObj
*
ptr
=
*
p
;
tscFreeSqlObj
(
*
p
);
int32_t
ref
=
T_REF_DEC
(
pTscObj
);
assert
(
ref
>=
0
);
tscDebug
(
"%p free sqlObj completed, tscObj:%p ref:%d"
,
*
p
,
pTscObj
,
ref
);
tscDebug
(
"%p free sqlObj completed, tscObj:%p ref:%d"
,
ptr
,
pTscObj
,
ref
);
if
(
ref
==
0
)
{
tscDebug
(
"%p all sqlObj freed, free tscObj:%p"
,
*
p
,
pTscObj
);
tscDebug
(
"%p all sqlObj freed, free tscObj:%p"
,
ptr
,
pTscObj
);
taosRemoveRef
(
tscRefId
,
pTscObj
->
rid
);
}
}
...
...
@@ -644,6 +646,7 @@ int32_t tscCreateDataBlock(size_t initialSize, int32_t rowSize, int32_t startOff
dataBuf
->
pData
=
calloc
(
1
,
dataBuf
->
nAllocSize
);
if
(
dataBuf
->
pData
==
NULL
)
{
tscError
(
"failed to allocated memory, reason:%s"
,
strerror
(
errno
));
tfree
(
dataBuf
);
return
TSDB_CODE_TSC_OUT_OF_MEMORY
;
}
...
...
src/client/tests/resultFieldTest.cpp
0 → 100644
浏览文件 @
f3aa56ae
#include <gtest/gtest.h>
#include <iostream>
#include "taos.h"
namespace
{
static
int64_t
start_ts
=
1433955661000
;
}
/* test parse time function */
TEST
(
testCase
,
result_field_test
)
{
taos_options
(
TSDB_OPTION_CONFIGDIR
,
"~/first/cfg"
);
taos_init
();
TAOS
*
conn
=
taos_connect
(
"ubuntu"
,
"root"
,
"taosdata"
,
0
,
0
);
if
(
conn
==
NULL
)
{
printf
(
"Failed to connect to DB, reason:%s"
,
taos_errstr
(
conn
));
exit
(
-
1
);
}
TAOS_RES
*
res
=
taos_query
(
conn
,
"create database if not exists test"
);
ASSERT_EQ
(
taos_errno
(
res
),
0
);
taos_free_result
(
res
);
res
=
taos_query
(
conn
,
"use test"
);
ASSERT_EQ
(
taos_errno
(
res
),
0
);
taos_free_result
(
res
);
res
=
taos_query
(
conn
,
"create table if not exists t1(ts timestamp, k int, a binary(11), b nchar(4))"
);
ASSERT_EQ
(
taos_errno
(
res
),
0
);
taos_free_result
(
res
);
char
sql
[
512
]
=
{
0
};
sprintf
(
sql
,
"insert into t1 values(%ld, 99, 'abc', 'test')"
,
start_ts
);
res
=
taos_query
(
conn
,
sql
);
ASSERT_EQ
(
taos_errno
(
res
),
0
);
taos_free_result
(
res
);
res
=
taos_query
(
conn
,
"select count(*), spread(ts)/(1000 * 3600 * 24), first(a), last(b) from t1"
);
ASSERT_EQ
(
taos_num_fields
(
res
),
4
);
TAOS_FIELD
*
fields
=
taos_fetch_fields
(
res
);
ASSERT_EQ
(
fields
[
0
].
bytes
,
8
);
ASSERT_EQ
(
fields
[
0
].
type
,
TSDB_DATA_TYPE_BIGINT
);
ASSERT_STREQ
(
fields
[
0
].
name
,
"count(*)"
);
ASSERT_EQ
(
fields
[
1
].
bytes
,
8
);
ASSERT_EQ
(
fields
[
1
].
type
,
TSDB_DATA_TYPE_DOUBLE
);
ASSERT_STREQ
(
fields
[
1
].
name
,
"spread(ts)/(1000 * 3600 * 24)"
);
ASSERT_EQ
(
fields
[
2
].
bytes
,
11
);
ASSERT_EQ
(
fields
[
2
].
type
,
TSDB_DATA_TYPE_BINARY
);
ASSERT_STREQ
(
fields
[
2
].
name
,
"first(a)"
);
ASSERT_EQ
(
fields
[
3
].
bytes
,
4
);
ASSERT_EQ
(
fields
[
3
].
type
,
TSDB_DATA_TYPE_NCHAR
);
ASSERT_STREQ
(
fields
[
3
].
name
,
"last(b)"
);
taos_free_result
(
res
);
res
=
taos_query
(
conn
,
"select last_row(*) from t1"
);
ASSERT_EQ
(
taos_num_fields
(
res
),
4
);
fields
=
taos_fetch_fields
(
res
);
ASSERT_EQ
(
fields
[
0
].
bytes
,
8
);
ASSERT_EQ
(
fields
[
0
].
type
,
TSDB_DATA_TYPE_TIMESTAMP
);
ASSERT_STREQ
(
fields
[
0
].
name
,
"last_row(ts)"
);
ASSERT_EQ
(
fields
[
1
].
bytes
,
4
);
ASSERT_EQ
(
fields
[
1
].
type
,
TSDB_DATA_TYPE_INT
);
ASSERT_STREQ
(
fields
[
1
].
name
,
"last_row(k)"
);
ASSERT_EQ
(
fields
[
2
].
bytes
,
11
);
ASSERT_EQ
(
fields
[
2
].
type
,
TSDB_DATA_TYPE_BINARY
);
ASSERT_STREQ
(
fields
[
2
].
name
,
"last_row(a)"
);
ASSERT_EQ
(
fields
[
3
].
bytes
,
4
);
ASSERT_EQ
(
fields
[
3
].
type
,
TSDB_DATA_TYPE_NCHAR
);
ASSERT_STREQ
(
fields
[
3
].
name
,
"last_row(b)"
);
taos_free_result
(
res
);
res
=
taos_query
(
conn
,
"select first(*), last(*) from t1"
);
ASSERT_EQ
(
taos_num_fields
(
res
),
8
);
fields
=
taos_fetch_fields
(
res
);
ASSERT_EQ
(
fields
[
0
].
bytes
,
8
);
ASSERT_EQ
(
fields
[
0
].
type
,
TSDB_DATA_TYPE_TIMESTAMP
);
ASSERT_STREQ
(
fields
[
0
].
name
,
"first(ts)"
);
ASSERT_EQ
(
fields
[
1
].
bytes
,
4
);
ASSERT_EQ
(
fields
[
1
].
type
,
TSDB_DATA_TYPE_INT
);
ASSERT_STREQ
(
fields
[
1
].
name
,
"first(k)"
);
ASSERT_EQ
(
fields
[
2
].
bytes
,
11
);
ASSERT_EQ
(
fields
[
2
].
type
,
TSDB_DATA_TYPE_BINARY
);
ASSERT_STREQ
(
fields
[
2
].
name
,
"first(a)"
);
ASSERT_EQ
(
fields
[
3
].
bytes
,
4
);
ASSERT_EQ
(
fields
[
3
].
type
,
TSDB_DATA_TYPE_NCHAR
);
ASSERT_STREQ
(
fields
[
3
].
name
,
"first(b)"
);
taos_free_result
(
res
);
res
=
taos_query
(
conn
,
"select first(ts, a, k, k, b, b, ts) from t1"
);
ASSERT_EQ
(
taos_num_fields
(
res
),
7
);
fields
=
taos_fetch_fields
(
res
);
ASSERT_EQ
(
fields
[
0
].
bytes
,
8
);
ASSERT_EQ
(
fields
[
0
].
type
,
TSDB_DATA_TYPE_TIMESTAMP
);
ASSERT_STREQ
(
fields
[
0
].
name
,
"first(ts)"
);
ASSERT_EQ
(
fields
[
1
].
bytes
,
11
);
ASSERT_EQ
(
fields
[
1
].
type
,
TSDB_DATA_TYPE_BINARY
);
ASSERT_STREQ
(
fields
[
1
].
name
,
"first(a)"
);
ASSERT_EQ
(
fields
[
2
].
bytes
,
4
);
ASSERT_EQ
(
fields
[
2
].
type
,
TSDB_DATA_TYPE_INT
);
ASSERT_STREQ
(
fields
[
2
].
name
,
"first(k)"
);
ASSERT_EQ
(
fields
[
3
].
bytes
,
4
);
ASSERT_EQ
(
fields
[
3
].
type
,
TSDB_DATA_TYPE_INT
);
ASSERT_STREQ
(
fields
[
3
].
name
,
"first(k)"
);
ASSERT_EQ
(
fields
[
4
].
bytes
,
4
);
ASSERT_EQ
(
fields
[
4
].
type
,
TSDB_DATA_TYPE_NCHAR
);
ASSERT_STREQ
(
fields
[
4
].
name
,
"first(b)"
);
ASSERT_EQ
(
fields
[
5
].
bytes
,
4
);
ASSERT_EQ
(
fields
[
5
].
type
,
TSDB_DATA_TYPE_NCHAR
);
ASSERT_STREQ
(
fields
[
5
].
name
,
"first(b)"
);
ASSERT_EQ
(
fields
[
6
].
bytes
,
8
);
ASSERT_EQ
(
fields
[
6
].
type
,
TSDB_DATA_TYPE_TIMESTAMP
);
ASSERT_STREQ
(
fields
[
6
].
name
,
"first(ts)"
);
taos_free_result
(
res
);
taos_close
(
conn
);
}
src/common/src/tvariant.c
浏览文件 @
f3aa56ae
...
...
@@ -171,7 +171,9 @@ void tVariantAssign(tVariant *pDst, const tVariant *pSrc) {
}
}
pDst
->
nLen
=
tDataTypeDesc
[
pDst
->
nType
].
nSize
;
if
(
pDst
->
nType
!=
TSDB_DATA_TYPE_ARRAY
)
{
pDst
->
nLen
=
tDataTypeDesc
[
pDst
->
nType
].
nSize
;
}
}
int32_t
tVariantCompare
(
const
tVariant
*
p1
,
const
tVariant
*
p2
)
{
...
...
src/inc/taosmsg.h
浏览文件 @
f3aa56ae
...
...
@@ -464,6 +464,8 @@ typedef struct STimeWindow {
typedef
struct
{
SMsgHead
head
;
char
version
[
TSDB_VERSION_LEN
];
STimeWindow
window
;
int32_t
numOfTables
;
int16_t
order
;
...
...
src/query/inc/qUtil.h
浏览文件 @
f3aa56ae
...
...
@@ -26,7 +26,7 @@
int32_t
getOutputInterResultBufSize
(
SQuery
*
pQuery
);
void
clearResultRow
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SResultRow
*
pRow
);
void
clearResultRow
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SResultRow
*
pRow
,
int16_t
type
);
void
copyResultRow
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SResultRow
*
dst
,
const
SResultRow
*
src
);
SResultRowCellInfo
*
getResultCell
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
const
SResultRow
*
pRow
,
int32_t
index
);
...
...
@@ -80,5 +80,8 @@ void* destroyResultRowPool(SResultRowPool* p);
int32_t
getNumOfAllocatedResultRows
(
SResultRowPool
*
p
);
int32_t
getNumOfUsedResultRows
(
SResultRowPool
*
p
);
uint64_t
getResultInfoUId
(
SQueryRuntimeEnv
*
pRuntimeEnv
);
bool
isPointInterpoQuery
(
SQuery
*
pQuery
);
#endif // TDENGINE_QUERYUTIL_H
src/query/inc/sql.y
浏览文件 @
f3aa56ae
...
...
@@ -556,11 +556,11 @@ having_opt(A) ::= HAVING expr(X). {A = X;}
//limit-offset subclause
%type limit_opt {SLimitVal}
limit_opt(A) ::= . {A.limit = -1; A.offset = 0;}
limit_opt(A) ::= LIMIT signed(X). {
printf("aa1, %d\n", X);
A.limit = X; A.offset = 0;}
limit_opt(A) ::= LIMIT signed(X). {A.limit = X; A.offset = 0;}
limit_opt(A) ::= LIMIT signed(X) OFFSET signed(Y).
{
printf("aa2\n, %d\n", X);
A.limit = X; A.offset = Y;}
{ A.limit = X; A.offset = Y;}
limit_opt(A) ::= LIMIT signed(X) COMMA signed(Y).
{
printf("aa3\n, %d\n", X);
A.limit = Y; A.offset = X;}
{ A.limit = Y; A.offset = X;}
%type slimit_opt {SLimitVal}
slimit_opt(A) ::= . {A.limit = -1; A.offset = 0;}
...
...
@@ -581,7 +581,7 @@ where_opt(A) ::= WHERE expr(X). {A = X;}
%type expr {tSQLExpr*}
%destructor expr {tSQLExprDestroy($$);}
expr(A) ::= LP
expr(X) RP. {A = X;
}
expr(A) ::= LP
(X) expr(Y) RP(Z). {A = Y; A->token.z = X.z; A->token.n = (Z.z - X.z + 1);
}
expr(A) ::= ID(X). {A = tSQLExprIdValueCreate(&X, TK_ID);}
expr(A) ::= ID(X) DOT ID(Y). {X.n += (1+Y.n); A = tSQLExprIdValueCreate(&X, TK_ID);}
...
...
src/query/src/qExecutor.c
浏览文件 @
f3aa56ae
...
...
@@ -186,7 +186,7 @@ static void setExecParams(SQuery *pQuery, SQLFunctionCtx *pCtx, void* inputData,
static
void
initCtxOutputBuf
(
SQueryRuntimeEnv
*
pRuntimeEnv
);
static
void
destroyTableQueryInfoImpl
(
STableQueryInfo
*
pTableQueryInfo
);
static
void
reset
Ctx
OutputBuf
(
SQueryRuntimeEnv
*
pRuntimeEnv
);
static
void
reset
DefaultResInfo
OutputBuf
(
SQueryRuntimeEnv
*
pRuntimeEnv
);
static
bool
hasMainOutput
(
SQuery
*
pQuery
);
static
void
buildTagQueryResult
(
SQInfo
*
pQInfo
);
...
...
@@ -283,8 +283,8 @@ void updateNumOfResult(SQueryRuntimeEnv *pRuntimeEnv, int32_t numOfRes) {
}
}
static
UNUSED_FUNC
int32_t
getGroupResult
Id
(
int32_t
groupIndex
)
{
int32_t
base
=
2
0000000
;
static
int32_t
getMergeResultGroup
Id
(
int32_t
groupIndex
)
{
int32_t
base
=
5
0000000
;
return
base
+
(
groupIndex
*
10000
);
}
...
...
@@ -947,10 +947,10 @@ static char *getDataBlock(SQueryRuntimeEnv *pRuntimeEnv, SArithmeticSupport *sas
if
(
functionId
==
TSDB_FUNC_ARITHM
)
{
sas
->
pArithExpr
=
&
pQuery
->
pExpr1
[
col
];
sas
->
offset
=
0
;
sas
->
colList
=
pQuery
->
colList
;
sas
->
offset
=
(
QUERY_IS_ASC_QUERY
(
pQuery
))
?
pQuery
->
pos
:
pQuery
->
pos
-
(
size
-
1
)
;
sas
->
colList
=
pQuery
->
colList
;
sas
->
numOfCols
=
pQuery
->
numOfCols
;
sas
->
data
=
calloc
(
pQuery
->
numOfCols
,
POINTER_BYTES
);
sas
->
data
=
calloc
(
pQuery
->
numOfCols
,
POINTER_BYTES
);
if
(
sas
->
data
==
NULL
)
{
longjmp
(
pRuntimeEnv
->
env
,
TSDB_CODE_QRY_OUT_OF_MEMORY
);
...
...
@@ -1115,7 +1115,7 @@ static int32_t setGroupResultOutputBuf(SQueryRuntimeEnv *pRuntimeEnv, char *pDat
SDiskbasedResultBuf
*
pResultBuf
=
pRuntimeEnv
->
pResultBuf
;
// not assign result buffer yet, add new result buffer
// not assign result buffer yet, add new result buffer
, TODO remove it
char
*
d
=
pData
;
int16_t
len
=
bytes
;
if
(
type
==
TSDB_DATA_TYPE_BINARY
||
type
==
TSDB_DATA_TYPE_NCHAR
)
{
...
...
@@ -1128,7 +1128,7 @@ static int32_t setGroupResultOutputBuf(SQueryRuntimeEnv *pRuntimeEnv, char *pDat
longjmp
(
pRuntimeEnv
->
env
,
TSDB_CODE_QRY_APP_ERROR
);
}
uint64_t
uid
=
groupIndex
;
// uid is always set to be 0.
uint64_t
uid
=
groupIndex
;
SResultRow
*
pResultRow
=
doPrepareResultRowFromKey
(
pRuntimeEnv
,
&
pRuntimeEnv
->
windowResInfo
,
d
,
len
,
true
,
uid
);
if
(
pResultRow
==
NULL
)
{
return
-
1
;
...
...
@@ -1714,7 +1714,7 @@ static int32_t setupQueryRuntimeEnv(SQueryRuntimeEnv *pRuntimeEnv, int16_t order
// if it is group by normal column, do not set output buffer, the output buffer is pResult
// fixed output query/multi-output query for normal table
if
(
!
pRuntimeEnv
->
groupbyNormalCol
&&
!
pRuntimeEnv
->
stableQuery
&&
!
QUERY_IS_INTERVAL_QUERY
(
pRuntimeEnv
->
pQuery
))
{
reset
Ctx
OutputBuf
(
pRuntimeEnv
);
reset
DefaultResInfo
OutputBuf
(
pRuntimeEnv
);
}
if
(
setCtxTagColumnInfo
(
pRuntimeEnv
,
pRuntimeEnv
->
pCtx
)
!=
TSDB_CODE_SUCCESS
)
{
...
...
@@ -1825,7 +1825,7 @@ static bool isFixedOutputQuery(SQueryRuntimeEnv* pRuntimeEnv) {
}
// todo refactor with isLastRowQuery
static
bool
isPointInterpoQuery
(
SQuery
*
pQuery
)
{
bool
isPointInterpoQuery
(
SQuery
*
pQuery
)
{
for
(
int32_t
i
=
0
;
i
<
pQuery
->
numOfOutput
;
++
i
)
{
int32_t
functionID
=
pQuery
->
pExpr1
[
i
].
base
.
functionId
;
if
(
functionID
==
TSDB_FUNC_INTERP
)
{
...
...
@@ -2936,10 +2936,24 @@ void copyResToQueryResultBuf(SQInfo *pQInfo, SQuery *pQuery) {
assert
(
size
==
pGroupResInfo
->
numOfDataPages
);
bool
done
=
false
;
//TODO add API for release none-dirty pages
// SPageInfo* prev = NULL;
for
(
int32_t
j
=
pGroupResInfo
->
pageId
;
j
<
size
;
++
j
)
{
SPageInfo
*
pi
=
*
(
SPageInfo
**
)
taosArrayGet
(
list
,
j
);
tFilePage
*
pData
=
getResBufPage
(
pResultBuf
,
pi
->
pageId
);
// release previous buffer pages
// if (prev == NULL) {
// prev = pi;
// } else {
// if (prev->pageId != pi->pageId) {
// releaseResBufPageInfo(pResultBuf, prev);
// prev = pi;
// }
// }
assert
(
pData
->
num
>
0
&&
pData
->
num
<=
pRuntimeEnv
->
numOfRowsPerPage
&&
pGroupResInfo
->
rowId
<
pData
->
num
);
int32_t
numOfRes
=
(
int32_t
)(
pData
->
num
-
pGroupResInfo
->
rowId
);
...
...
@@ -3058,7 +3072,7 @@ int32_t mergeIntoGroupResultImpl(SQInfo *pQInfo, SArray *pGroup) {
SResultRow
*
pRow
=
getNewResultRow
(
pRuntimeEnv
->
pool
);
resetMergeResultBuf
(
pRuntimeEnv
,
pRuntimeEnv
->
pCtx
,
pRow
);
pQInfo
->
groupResInfo
.
groupId
=
get
GroupResult
Id
(
pQInfo
->
groupIndex
);
pQInfo
->
groupResInfo
.
groupId
=
get
MergeResultGroup
Id
(
pQInfo
->
groupIndex
);
// todo add windowRes iterator
int64_t
lastTimestamp
=
-
1
;
...
...
@@ -3339,12 +3353,12 @@ int32_t initResultRow(SResultRow *pResultRow) {
return
TSDB_CODE_SUCCESS
;
}
void
reset
Ctx
OutputBuf
(
SQueryRuntimeEnv
*
pRuntimeEnv
)
{
void
reset
DefaultResInfo
OutputBuf
(
SQueryRuntimeEnv
*
pRuntimeEnv
)
{
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
int32_t
groupIndex
=
0
;
int
32_t
uid
=
0
;
SResultRow
*
pRow
=
doPrepareResultRowFromKey
(
pRuntimeEnv
,
&
pRuntimeEnv
->
windowResInfo
,
(
char
*
)
&
groupIndex
,
sizeof
(
groupIndex
),
true
,
uid
);
int32_t
tid
=
0
;
int
64_t
uid
=
getResultInfoUId
(
pRuntimeEnv
)
;
SResultRow
*
pRow
=
doPrepareResultRowFromKey
(
pRuntimeEnv
,
&
pRuntimeEnv
->
windowResInfo
,
(
char
*
)
&
tid
,
sizeof
(
tid
),
true
,
uid
);
for
(
int32_t
i
=
0
;
i
<
pQuery
->
numOfOutput
;
++
i
)
{
SQLFunctionCtx
*
pCtx
=
&
pRuntimeEnv
->
pCtx
[
i
];
...
...
@@ -3427,7 +3441,7 @@ void skipResults(SQueryRuntimeEnv *pRuntimeEnv) {
pQuery
->
limit
.
offset
-=
pQuery
->
rec
.
rows
;
pQuery
->
rec
.
rows
=
0
;
reset
Ctx
OutputBuf
(
pRuntimeEnv
);
reset
DefaultResInfo
OutputBuf
(
pRuntimeEnv
);
// clear the buffer full flag if exists
CLEAR_QUERY_STATUS
(
pQuery
,
QUERY_RESBUF_FULL
);
...
...
@@ -3792,7 +3806,7 @@ void setExecutionContext(SQInfo *pQInfo, int32_t groupIndex, TSKEY nextKey) {
return
;
}
uint64_t
uid
=
0
;
// uid is always set to be 0
uint64_t
uid
=
getResultInfoUId
(
pRuntimeEnv
);
SResultRow
*
pResultRow
=
doPrepareResultRowFromKey
(
pRuntimeEnv
,
pWindowResInfo
,
(
char
*
)
&
groupIndex
,
sizeof
(
groupIndex
),
true
,
uid
);
if
(
pResultRow
==
NULL
)
{
...
...
@@ -4629,10 +4643,10 @@ int32_t doInitQInfo(SQInfo *pQInfo, STSBuf *pTsBuf, void *tsdb, int32_t vgId, bo
int32_t
ps
=
DEFAULT_PAGE_SIZE
;
int32_t
rowsize
=
0
;
getIntermediateBufInfo
(
pRuntimeEnv
,
&
ps
,
&
rowsize
);
int32_t
T
WOMB
=
1024
*
1024
*
2
;
int32_t
T
ENMB
=
1024
*
1024
*
10
;
if
(
isSTableQuery
&&
!
onlyQueryTags
(
pRuntimeEnv
->
pQuery
))
{
code
=
createDiskbasedResultBuffer
(
&
pRuntimeEnv
->
pResultBuf
,
rowsize
,
ps
,
T
WO
MB
,
pQInfo
);
code
=
createDiskbasedResultBuffer
(
&
pRuntimeEnv
->
pResultBuf
,
rowsize
,
ps
,
T
EN
MB
,
pQInfo
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
return
code
;
}
...
...
@@ -4660,7 +4674,7 @@ int32_t doInitQInfo(SQInfo *pQInfo, STSBuf *pTsBuf, void *tsdb, int32_t vgId, bo
}
else
if
(
pRuntimeEnv
->
groupbyNormalCol
||
QUERY_IS_INTERVAL_QUERY
(
pQuery
)
||
(
!
isSTableQuery
))
{
int32_t
numOfResultRows
=
getInitialPageNum
(
pQInfo
);
getIntermediateBufInfo
(
pRuntimeEnv
,
&
ps
,
&
rowsize
);
code
=
createDiskbasedResultBuffer
(
&
pRuntimeEnv
->
pResultBuf
,
rowsize
,
ps
,
T
WO
MB
,
pQInfo
);
code
=
createDiskbasedResultBuffer
(
&
pRuntimeEnv
->
pResultBuf
,
rowsize
,
ps
,
T
EN
MB
,
pQInfo
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
return
code
;
}
...
...
@@ -4930,7 +4944,7 @@ static void sequentialTableProcess(SQInfo *pQInfo) {
size_t
numOfGroups
=
GET_NUM_OF_TABLEGROUP
(
pQInfo
);
if
(
isPointInterpoQuery
(
pQuery
))
{
reset
Ctx
OutputBuf
(
pRuntimeEnv
);
reset
DefaultResInfo
OutputBuf
(
pRuntimeEnv
);
assert
(
pQuery
->
limit
.
offset
==
0
&&
pQuery
->
limit
.
limit
!=
0
);
while
(
pQInfo
->
groupIndex
<
numOfGroups
)
{
...
...
@@ -5096,7 +5110,7 @@ static void sequentialTableProcess(SQInfo *pQInfo) {
return
;
}
reset
Ctx
OutputBuf
(
pRuntimeEnv
);
reset
DefaultResInfo
OutputBuf
(
pRuntimeEnv
);
resetTimeWindowInfo
(
pRuntimeEnv
,
&
pRuntimeEnv
->
windowResInfo
);
SArray
*
group
=
GET_TABLEGROUP
(
pQInfo
,
0
);
...
...
@@ -5456,7 +5470,7 @@ static void tableMultiOutputProcess(SQInfo *pQInfo, STableQueryInfo* pTableInfo)
// for ts_comp query, re-initialized is not allowed
if
(
!
isTSCompQuery
(
pQuery
))
{
reset
Ctx
OutputBuf
(
pRuntimeEnv
);
reset
DefaultResInfo
OutputBuf
(
pRuntimeEnv
);
}
// skip blocks without load the actual data block from file if no filter condition present
...
...
@@ -5486,7 +5500,7 @@ static void tableMultiOutputProcess(SQInfo *pQInfo, STableQueryInfo* pTableInfo)
qDebug
(
"QInfo:%p skip current result, offset:%"
PRId64
", next qrange:%"
PRId64
"-%"
PRId64
,
pQInfo
,
pQuery
->
limit
.
offset
,
pQuery
->
current
->
lastKey
,
pQuery
->
current
->
win
.
ekey
);
reset
Ctx
OutputBuf
(
pRuntimeEnv
);
reset
DefaultResInfo
OutputBuf
(
pRuntimeEnv
);
}
limitResults
(
pRuntimeEnv
);
...
...
@@ -5811,6 +5825,10 @@ static int32_t convertQueryMsg(SQueryTableMsg *pQueryMsg, SArray **pTableIdList,
char
**
tagCond
,
char
**
tbnameCond
,
SColIndex
**
groupbyCols
,
SColumnInfo
**
tagCols
)
{
int32_t
code
=
TSDB_CODE_SUCCESS
;
if
(
taosCheckVersion
(
pQueryMsg
->
version
,
version
,
3
)
!=
0
)
{
return
TSDB_CODE_QRY_INVALID_MSG
;
}
pQueryMsg
->
numOfTables
=
htonl
(
pQueryMsg
->
numOfTables
);
pQueryMsg
->
window
.
skey
=
htobe64
(
pQueryMsg
->
window
.
skey
);
...
...
@@ -6796,7 +6814,7 @@ static int32_t doDumpQueryResult(SQInfo *pQInfo, char *data) {
qDebug
(
"QInfo:%p ts comp data return, file:%s, size:%"
PRId64
,
pQInfo
,
pQuery
->
sdata
[
0
]
->
data
,
s
);
if
(
lseek
(
fd
,
0
,
SEEK_SET
)
>=
0
)
{
size_t
sz
=
read
(
fd
,
data
,
(
uint32_t
)
s
);
size_t
sz
=
read
(
fd
,
data
,
(
uint32_t
)
s
);
if
(
sz
<
s
)
{
// todo handle error
assert
(
0
);
}
...
...
src/query/src/qParserImpl.c
浏览文件 @
f3aa56ae
...
...
@@ -187,7 +187,8 @@ tSQLExpr *tSQLExprCreate(tSQLExpr *pLeft, tSQLExpr *pRight, int32_t optrType) {
pExpr
->
token
.
type
=
pLeft
->
token
.
type
;
}
if
(
optrType
==
TK_PLUS
||
optrType
==
TK_MINUS
||
optrType
==
TK_STAR
||
optrType
==
TK_DIVIDE
||
optrType
==
TK_REM
)
{
if
((
pLeft
!=
NULL
&&
pRight
!=
NULL
)
&&
(
optrType
==
TK_PLUS
||
optrType
==
TK_MINUS
||
optrType
==
TK_STAR
||
optrType
==
TK_DIVIDE
||
optrType
==
TK_REM
))
{
/*
* 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.
...
...
src/query/src/qResultbuf.c
浏览文件 @
f3aa56ae
...
...
@@ -119,8 +119,11 @@ static char* doFlushPageToDisk(SDiskbasedResultBuf* pResultBuf, SPageInfo* pg) {
pg
->
info
.
offset
=
allocatePositionInFile
(
pResultBuf
,
size
);
pResultBuf
->
nextPos
+=
size
;
fseek
(
pResultBuf
->
file
,
pg
->
info
.
offset
,
SEEK_SET
);
/*int32_t ret =*/
fwrite
(
t
,
1
,
size
,
pResultBuf
->
file
);
int32_t
ret
=
fseek
(
pResultBuf
->
file
,
pg
->
info
.
offset
,
SEEK_SET
);
assert
(
ret
==
0
);
ret
=
(
int32_t
)
fwrite
(
t
,
1
,
size
,
pResultBuf
->
file
);
assert
(
ret
==
size
);
if
(
pResultBuf
->
fileSize
<
pg
->
info
.
offset
+
pg
->
info
.
length
)
{
pResultBuf
->
fileSize
=
pg
->
info
.
offset
+
pg
->
info
.
length
;
...
...
@@ -407,7 +410,7 @@ void destroyResultBuf(SDiskbasedResultBuf* pResultBuf) {
}
if
(
pResultBuf
->
file
!=
NULL
)
{
qDebug
(
"QInfo:%p res output buffer closed, total:%.2f Kb, inmem size:%.2f Kb, file size:%.2f"
,
qDebug
(
"QInfo:%p res output buffer closed, total:%.2f Kb, inmem size:%.2f Kb, file size:%.2f
Kb
"
,
pResultBuf
->
handle
,
pResultBuf
->
totalBufSize
/
1024
.
0
,
listNEles
(
pResultBuf
->
lruList
)
*
pResultBuf
->
pageSize
/
1024
.
0
,
pResultBuf
->
fileSize
/
1024
.
0
);
...
...
src/query/src/qTsbuf.c
浏览文件 @
f3aa56ae
...
...
@@ -341,8 +341,10 @@ STSBlock* readDataFromDisk(STSBuf* pTSBuf, int32_t order, bool decomp) {
pBlock
->
tag
.
pz
=
tp
;
sz
=
fread
(
pBlock
->
tag
.
pz
,
(
size_t
)
pBlock
->
tag
.
nLen
,
1
,
pTSBuf
->
f
);
}
else
if
(
pBlock
->
tag
.
nType
!=
TSDB_DATA_TYPE_NULL
)
{
UNUSED
(
sz
);
}
else
if
(
pBlock
->
tag
.
nType
!=
TSDB_DATA_TYPE_NULL
)
{
//TODO check the return value
sz
=
fread
(
&
pBlock
->
tag
.
i64Key
,
(
size_t
)
pBlock
->
tag
.
nLen
,
1
,
pTSBuf
->
f
);
UNUSED
(
sz
);
}
sz
=
fread
(
&
pBlock
->
numOfElem
,
sizeof
(
pBlock
->
numOfElem
),
1
,
pTSBuf
->
f
);
...
...
src/query/src/qUtil.c
浏览文件 @
f3aa56ae
...
...
@@ -20,6 +20,18 @@
#include "qExecutor.h"
#include "qUtil.h"
static
int32_t
getResultRowKeyInfo
(
SResultRow
*
pResult
,
int16_t
type
,
char
**
key
,
int16_t
*
bytes
)
{
if
(
type
==
TSDB_DATA_TYPE_BINARY
||
type
==
TSDB_DATA_TYPE_NCHAR
)
{
*
key
=
varDataVal
(
pResult
->
key
);
*
bytes
=
varDataLen
(
pResult
->
key
);
}
else
{
*
key
=
(
char
*
)
&
pResult
->
win
.
skey
;
*
bytes
=
tDataTypeDesc
[
type
].
nSize
;
}
return
0
;
}
int32_t
getOutputInterResultBufSize
(
SQuery
*
pQuery
)
{
int32_t
size
=
0
;
...
...
@@ -56,6 +68,12 @@ void cleanupTimeWindowInfo(SWindowResInfo *pWindowResInfo) {
assert
(
pWindowResInfo
->
pResult
==
NULL
);
return
;
}
if
(
pWindowResInfo
->
type
==
TSDB_DATA_TYPE_BINARY
||
pWindowResInfo
->
type
==
TSDB_DATA_TYPE_NCHAR
)
{
for
(
int32_t
i
=
0
;
i
<
pWindowResInfo
->
size
;
++
i
)
{
tfree
(
pWindowResInfo
->
pResult
[
i
]
->
key
);
}
}
tfree
(
pWindowResInfo
->
pResult
);
}
...
...
@@ -69,7 +87,7 @@ void resetTimeWindowInfo(SQueryRuntimeEnv *pRuntimeEnv, SWindowResInfo *pWindowR
for
(
int32_t
i
=
0
;
i
<
pWindowResInfo
->
size
;
++
i
)
{
SResultRow
*
pWindowRes
=
pWindowResInfo
->
pResult
[
i
];
clearResultRow
(
pRuntimeEnv
,
pWindowRes
);
clearResultRow
(
pRuntimeEnv
,
pWindowRes
,
pWindowResInfo
->
type
);
int32_t
groupIndex
=
0
;
int64_t
uid
=
0
;
...
...
@@ -94,12 +112,8 @@ void clearFirstNWindowRes(SQueryRuntimeEnv *pRuntimeEnv, int32_t num) {
int32_t
numOfClosed
=
numOfClosedTimeWindow
(
pWindowResInfo
);
assert
(
num
>=
0
&&
num
<=
numOfClosed
);
int16_t
type
=
pWindowResInfo
->
type
;
STableId
*
id
=
TSDB_TABLEID
(
pRuntimeEnv
->
pQuery
->
current
->
pTable
);
// uid is always set to be 0.
int64_t
uid
=
id
->
uid
;
if
(
pRuntimeEnv
->
groupbyNormalCol
)
{
uid
=
0
;
}
int16_t
type
=
pWindowResInfo
->
type
;
int64_t
uid
=
getResultInfoUId
(
pRuntimeEnv
);
char
*
key
=
NULL
;
int16_t
bytes
=
-
1
;
...
...
@@ -107,16 +121,7 @@ void clearFirstNWindowRes(SQueryRuntimeEnv *pRuntimeEnv, int32_t num) {
for
(
int32_t
i
=
0
;
i
<
num
;
++
i
)
{
SResultRow
*
pResult
=
pWindowResInfo
->
pResult
[
i
];
if
(
pResult
->
closed
)
{
// remove the window slot from hash table
// todo refactor
if
(
type
==
TSDB_DATA_TYPE_BINARY
||
type
==
TSDB_DATA_TYPE_NCHAR
)
{
key
=
varDataVal
(
pResult
->
key
);
bytes
=
varDataLen
(
pResult
->
key
);
}
else
{
key
=
(
char
*
)
&
pResult
->
win
.
skey
;
bytes
=
tDataTypeDesc
[
pWindowResInfo
->
type
].
nSize
;
}
getResultRowKeyInfo
(
pResult
,
type
,
&
key
,
&
bytes
);
SET_RES_WINDOW_KEY
(
pRuntimeEnv
->
keyBuf
,
key
,
bytes
,
uid
);
taosHashRemove
(
pRuntimeEnv
->
pResultRowHashTable
,
(
const
char
*
)
pRuntimeEnv
->
keyBuf
,
GET_RES_WINDOW_KEY_LEN
(
bytes
));
}
else
{
...
...
@@ -134,23 +139,16 @@ void clearFirstNWindowRes(SQueryRuntimeEnv *pRuntimeEnv, int32_t num) {
// move the unclosed window in the front of the window list
for
(
int32_t
k
=
remain
;
k
<
pWindowResInfo
->
size
;
++
k
)
{
SResultRow
*
pWindowRes
=
pWindowResInfo
->
pResult
[
k
];
clearResultRow
(
pRuntimeEnv
,
pWindowRes
);
clearResultRow
(
pRuntimeEnv
,
pWindowRes
,
pWindowResInfo
->
type
);
}
pWindowResInfo
->
size
=
remain
;
for
(
int32_t
k
=
0
;
k
<
pWindowResInfo
->
size
;
++
k
)
{
SResultRow
*
pResult
=
pWindowResInfo
->
pResult
[
k
];
if
(
type
==
TSDB_DATA_TYPE_BINARY
||
type
==
TSDB_DATA_TYPE_NCHAR
)
{
key
=
varDataVal
(
pResult
->
key
);
bytes
=
varDataLen
(
pResult
->
key
);
}
else
{
key
=
(
char
*
)
&
pResult
->
win
.
skey
;
bytes
=
tDataTypeDesc
[
pWindowResInfo
->
type
].
nSize
;
}
getResultRowKeyInfo
(
pResult
,
type
,
&
key
,
&
bytes
);
SET_RES_WINDOW_KEY
(
pRuntimeEnv
->
keyBuf
,
key
,
bytes
,
uid
);
int32_t
*
p
=
(
int32_t
*
)
taosHashGet
(
pRuntimeEnv
->
pResultRowHashTable
,
(
const
char
*
)
pRuntimeEnv
->
keyBuf
,
GET_RES_WINDOW_KEY_LEN
(
bytes
));
assert
(
p
!=
NULL
);
...
...
@@ -237,7 +235,7 @@ void closeTimeWindow(SWindowResInfo *pWindowResInfo, int32_t slot) {
getResultRow
(
pWindowResInfo
,
slot
)
->
closed
=
true
;
}
void
clearResultRow
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SResultRow
*
pWindowRes
)
{
void
clearResultRow
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SResultRow
*
pWindowRes
,
int16_t
type
)
{
if
(
pWindowRes
==
NULL
)
{
return
;
}
...
...
@@ -261,7 +259,12 @@ void clearResultRow(SQueryRuntimeEnv *pRuntimeEnv, SResultRow *pWindowRes) {
pWindowRes
->
pageId
=
-
1
;
pWindowRes
->
rowId
=
-
1
;
pWindowRes
->
closed
=
false
;
pWindowRes
->
win
=
TSWINDOW_INITIALIZER
;
if
(
type
==
TSDB_DATA_TYPE_BINARY
||
type
==
TSDB_DATA_TYPE_NCHAR
)
{
tfree
(
pWindowRes
->
key
);
}
else
{
pWindowRes
->
win
=
TSWINDOW_INITIALIZER
;
}
}
/**
...
...
@@ -379,3 +382,18 @@ void* destroyResultRowPool(SResultRowPool* p) {
tfree
(
p
);
return
NULL
;
}
uint64_t
getResultInfoUId
(
SQueryRuntimeEnv
*
pRuntimeEnv
)
{
if
(
!
pRuntimeEnv
->
stableQuery
)
{
return
0
;
// for simple table query, the uid is always set to be 0;
}
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
if
((
pQuery
->
checkBuffer
==
1
&&
pQuery
->
interval
.
interval
==
0
)
||
isPointInterpoQuery
(
pQuery
)
||
pRuntimeEnv
->
groupbyNormalCol
)
{
return
0
;
}
STableId
*
id
=
TSDB_TABLEID
(
pRuntimeEnv
->
pQuery
->
current
);
return
id
->
uid
;
}
\ No newline at end of file
src/query/src/sql.c
浏览文件 @
f3aa56ae
...
...
@@ -2628,16 +2628,14 @@ static void yy_reduce(
{
yymsp
[
1
].
minor
.
yy216
.
limit
=
-
1
;
yymsp
[
1
].
minor
.
yy216
.
offset
=
0
;}
break
;
case
177
:
/* limit_opt ::= LIMIT signed */
case
181
:
/* slimit_opt ::= SLIMIT signed */
yytestcase
(
yyruleno
==
181
);
{
yymsp
[
-
1
].
minor
.
yy216
.
limit
=
yymsp
[
0
].
minor
.
yy207
;
yymsp
[
-
1
].
minor
.
yy216
.
offset
=
0
;}
break
;
case
178
:
/* limit_opt ::= LIMIT signed OFFSET signed */
{
yymsp
[
-
3
].
minor
.
yy216
.
limit
=
yymsp
[
-
2
].
minor
.
yy207
;
yymsp
[
-
3
].
minor
.
yy216
.
offset
=
yymsp
[
0
].
minor
.
yy207
;}
{
yymsp
[
-
3
].
minor
.
yy216
.
limit
=
yymsp
[
-
2
].
minor
.
yy207
;
yymsp
[
-
3
].
minor
.
yy216
.
offset
=
yymsp
[
0
].
minor
.
yy207
;}
break
;
case
179
:
/* limit_opt ::= LIMIT signed COMMA signed */
{
yymsp
[
-
3
].
minor
.
yy216
.
limit
=
yymsp
[
0
].
minor
.
yy207
;
yymsp
[
-
3
].
minor
.
yy216
.
offset
=
yymsp
[
-
2
].
minor
.
yy207
;}
break
;
case
181
:
/* slimit_opt ::= SLIMIT signed */
{
yymsp
[
-
1
].
minor
.
yy216
.
limit
=
yymsp
[
0
].
minor
.
yy207
;
yymsp
[
-
1
].
minor
.
yy216
.
offset
=
0
;}
{
yymsp
[
-
3
].
minor
.
yy216
.
limit
=
yymsp
[
0
].
minor
.
yy207
;
yymsp
[
-
3
].
minor
.
yy216
.
offset
=
yymsp
[
-
2
].
minor
.
yy207
;}
break
;
case
182
:
/* slimit_opt ::= SLIMIT signed SOFFSET signed */
{
yymsp
[
-
3
].
minor
.
yy216
.
limit
=
yymsp
[
-
2
].
minor
.
yy207
;
yymsp
[
-
3
].
minor
.
yy216
.
offset
=
yymsp
[
0
].
minor
.
yy207
;}
...
...
@@ -2646,7 +2644,8 @@ static void yy_reduce(
{
yymsp
[
-
3
].
minor
.
yy216
.
limit
=
yymsp
[
0
].
minor
.
yy207
;
yymsp
[
-
3
].
minor
.
yy216
.
offset
=
yymsp
[
-
2
].
minor
.
yy207
;}
break
;
case
186
:
/* expr ::= LP expr RP */
{
yymsp
[
-
2
].
minor
.
yy64
=
yymsp
[
-
1
].
minor
.
yy64
;
}
{
yylhsminor
.
yy64
=
yymsp
[
-
1
].
minor
.
yy64
;
yylhsminor
.
yy64
->
token
.
z
=
yymsp
[
-
2
].
minor
.
yy0
.
z
;
yylhsminor
.
yy64
->
token
.
n
=
(
yymsp
[
0
].
minor
.
yy0
.
z
-
yymsp
[
-
2
].
minor
.
yy0
.
z
+
1
);}
yymsp
[
-
2
].
minor
.
yy64
=
yylhsminor
.
yy64
;
break
;
case
187
:
/* expr ::= ID */
{
yylhsminor
.
yy64
=
tSQLExprIdValueCreate
(
&
yymsp
[
0
].
minor
.
yy0
,
TK_ID
);}
...
...
tests/script/general/parser/col_arithmetic_operation.sim
浏览文件 @
f3aa56ae
...
...
@@ -5,6 +5,7 @@ system sh/cfg.sh -n dnode1 -c walLevel -v 0
system sh/exec.sh -n dnode1 -s start
sleep 500
sql connect
#========================================= setup environment ================================
$dbPrefix = ca_db
$tbPrefix = ca_tb
...
...
@@ -28,12 +29,41 @@ sql create table $stb (ts timestamp, c1 int, c2 bigint, c3 float, c4 double, c5
$i = 0
$ts = $ts0
$halfTbNum = $tbNum / 2
while $i < $halfTbNum
$tbId = $i + $halfTbNum
$tb = $tbPrefix . $i
$tb1 = $tbPrefix . $tbId
sql create table $tb using $stb tags( $i )
sql create table $tb1 using $stb tags( $tbId )
#while $i < $halfTbNum
$t1 = $i + 1
$t2 = $i + 2
$t3 = $i + 3
$t4 = $i + 4
$t5 = $i + $halfTbNum
$t6 = $t5 + 1
$t7 = $t6 + 1
$t8 = $t7 + 1
$t9 = $t8 + 1
$tb0 = $tbPrefix . $i
$tb1 = $tbPrefix . $t1
$tb2 = $tbPrefix . $t2
$tb3 = $tbPrefix . $t3
$tb4 = $tbPrefix . $t4
$tb5 = $tbPrefix . $t5
$tb6 = $tbPrefix . $t6
$tb7 = $tbPrefix . $t7
$tb8 = $tbPrefix . $t8
$tb9 = $tbPrefix . $t9
sql create table $tb0 using $stb tags( $i )
sql create table $tb1 using $stb tags( $t1 )
sql create table $tb2 using $stb tags( $t2 )
sql create table $tb3 using $stb tags( $t3 )
sql create table $tb4 using $stb tags( $t4 )
sql create table $tb5 using $stb tags( $t5 )
sql create table $tb6 using $stb tags( $t6 )
sql create table $tb7 using $stb tags( $t7 )
sql create table $tb8 using $stb tags( $t8 )
sql create table $tb9 using $stb tags( $t9 )
$x = 0
while $x < $rowNum
...
...
@@ -46,50 +76,61 @@ while $i < $halfTbNum
$binary = $binary . '
$nchar = 'nchar . $c
$nchar = $nchar . '
sql insert into $tb
values ( $ts , $c , $c , $c , $c , $c , $c , true, $binary , $nchar ) $tb1 values ( $ts , NULL , $c , NULL , $c , NULL , $c , NULL, NULL
, $nchar )
sql insert into $tb
0 values ( $ts , $c , $c , $c , $c , $c , $c , true, $binary , $nchar ) $tb1 values ( $ts , $c , $c , $c , $c , $c , $c , true, $binary , $nchar ) $tb2 values ( $ts , $c , $c , $c , $c , $c , $c , true, $binary , $nchar ) $tb3 values ( $ts , $c , $c , $c , $c , $c , $c , true, $binary , $nchar ) $tb4 values ( $ts , $c , $c , $c , $c , $c , $c , true, $binary
, $nchar )
$x = $x + 1
endw
$i = $i + 1
endw
##### select from table
$tb = $tbPrefix . 0
## TBASE-344
sql select c1*2 from $tb
if $rows != $rowNum then
return -1
endi
if $data00 != 0.000000000 then
return -1
endi
if $data10 != 2.000000000 then
return -1
endi
if $data20 != 4.000000000 then
return -1
endi
if $data90 != 18.000000000 then
return -1
endi
endw
#$i = $i + 1
sql select c4*1+1/2 from $tb
if $rows != $rowNum then
return -1
endi
if $data00 != 0.500000000 then
return -1
endi
if $data10 != 1.500000000 then
return -1
endi
if $data90 != 9.500000000 then
return -1
endi
$x = 0
while $x < $rowNum
$xs = $x * $delta
$ts = $ts0 + $xs
$c = $x / 10
$c = $c * 10
$c = $x - $c
$binary = 'binary . $c
$binary = $binary . '
$nchar = 'nchar . $c
$nchar = $nchar . '
sql insert into $tb5 values ( $ts , NULL , $c , NULL , $c , NULL , $c , NULL, NULL , $nchar ) $tb6 values ( $ts , NULL , $c , NULL , $c , NULL , $c , NULL, NULL , $nchar ) $tb7 values ( $ts , NULL , $c , NULL , $c , NULL , $c , NULL, NULL , $nchar ) $tb8 values ( $ts , NULL , $c , NULL , $c , NULL , $c , NULL, NULL , $nchar ) $tb9 values ( $ts , NULL , $c , NULL , $c , NULL , $c , NULL, NULL , $nchar )
$x = $x + 1
endw
#endw
#=================================== above are setup test environment =============================
run general/parser/col_arithmetic_query.sim
#======================================= all in files query =======================================
print ================== restart server to commit data into disk
system sh/exec.sh -n dnode1 -s stop -x SIGINT
sleep 3000
system sh/exec.sh -n dnode1 -s start
print ================== server restart completed
sql connect
sleep 500c
run general/parser/col_arithmetic_query.sim
# ================================================================================================
print ====================> crash
# sql select spread(ts )/(1000*3600*24) from ca_stb0 interval(1y)
#### illegal operations
sql_error select first(c1, c2) - last(c1, c2) from stb interval(1y)
sql_error select first(ts) - last(ts) from stb interval(1y)
sql_error select top(c1, 2) - last(c1) from stb;
sql_error select stddev(c1) - last(c1) from stb;
sql_error select diff(c1) - last(c1) from stb;
sql_error select first(c7) - last(c7) from stb;
sql_error select first(c8) - last(c8) from stb;
sql_error select first(c9) - last(c9) from stb;
sql_error select max(c2*2) from $tb
sql_error select max(c1-c2) from $tb
#========================================regression test cases====================================
print =====================> td-1764
sql select sum(c1)/count(*), sum(c1) as b, count(*) as b from $stb interval(1y)
if $rows != 1 then
...
...
@@ -108,42 +149,4 @@ if $data02 != 225000 then
return -1
endi
sql select first(c1) - last(c1), first(c1) as b, last(c1) as b, min(c1) - max(c1), spread(c1) from ca_stb0 interval(1y)
if $rows != 1 then
return -1
endi
if $data00 != @18-01-01 00:00:00.000@ then
return -1
endi
if $data01 != -9.000000000 then
return -1
endi
if $data02 != 0 then
return -1
endi
if $data03 != 9 then
return -1
endi
if $data04 != -9.000000000 then
return -1
endi
if $data05 != 9.000000000 then
return -1
endi
sql_error select first(c1, c2) - last(c1, c2) from stb interval(1y)
sql_error select first(ts) - last(ts) from stb interval(1y)
sql_error select top(c1, 2) - last(c1) from stb;
sql_error select stddev(c1) - last(c1) from stb;
sql_error select diff(c1) - last(c1) from stb;
sql_error select first(c7) - last(c7) from stb;
sql_error select first(c8) - last(c8) from stb;
sql_error select first(c9) - last(c9) from stb;
system sh/exec.sh -n dnode1 -s stop -x SIGINT
\ No newline at end of file
tests/script/general/parser/col_arithmetic_query.sim
0 → 100644
浏览文件 @
f3aa56ae
# ======================================= query test cases ========================================
# select from table
$dbPrefix = ca_db
$tbPrefix = ca_tb
$stbPrefix = ca_stb
$rowNum = 10000
$i = 0
$db = $dbPrefix . $i
sql use $db
$tb = $tbPrefix . 0
$stb = $stbPrefix . $i
## TBASE-344
sql select c1*2 from $tb
if $rows != $rowNum then
return -1
endi
if $data00 != 0.000000000 then
return -1
endi
if $data10 != 2.000000000 then
return -1
endi
if $data20 != 4.000000000 then
return -1
endi
if $data90 != 18.000000000 then
return -1
endi
# asc/desc order [d.2] ======================================================
sql select c1 *( 2 / 3 ), c1/c1 from $tb order by ts asc;
if $rows != 10000 then
return -1
endi
if $data00 != 0.000000000 then
return -1
endi
if $data01 != -nan then
print expect -nan, actual: $data01
return -1
endi
if $data10 != 0.666666667 then
return -1
endi
if $data11 != 1.000000000 then
return -1
endi
if $data90 != 6.000000000 then
return -1
endi
if $data91 != 1.000000000 then
return -1
endi
sql select (c1 * 2) % 7.9 from $tb order by ts desc;
if $rows != 10000 then
return -1
endi
if $data00 != 0.100000000 then
print expect 0.100000000, acutal:$data00
return -1
endi
if $data10 != 2.100000000 then
return -1
endi
if $data90 != 6.000000000 then
return -1
endi
# [d.3]
sql select c1 * c2 /4 from $tb where ts < 1537166000000 and ts > 1537156000000
if $rows != 17 then
return -1
endi
if $data00 != 12.250000000 then
return -1
endi
if $data10 != 16.000000000 then
return -1
endi
if $data20 != 20.250000000 then
print expect 20.250000000, acutal:$data21
return -1
endi
if $data30 != 0.000000000 then
return -1
endi
# no result return [d.3] ==============================================================
sql select c1 * 91- 7 from $tb where ts < 1537146000000
if $rows != 0 then
return -1
endi
# no result return [d.3]
sql select c2 - c2 from $tb where ts > '2018-09-17 12:50:00.000' and ts<'2018-09-17 13:00:00.000'
if $rows != 0 then
return -1
endi
# single row result aggregation [d.4] =================================================
# not available
# error cases
# not available
# multi row result aggregation [d.4]
sql_error select top(c1, 1) - bottom(c1, 1) from $tb
sql_error select top(c1, 99) - bottom(c1, 99) from $tb
sql_error select top(c1,1) - 88 from $tb
# all data types [d.6] ================================================================
sql select c2-c1*1.1, c3/c2, c4*c3, c5%c4, (c6+c4)%22, c2-c2 from $tb
if $rows != 10000 then
return -1
endi
if $data00 != 0.000000000 then
return -1
endi
if $data01 != -nan then
return -1
endi
if $data02 != 0.000000000 then
return -1
endi
if $data03 != 0.000000000 then
return -1
endi
if $data04 != 0.000000000 then
return -1
endi
if $data05 != 0.000000000 then
return -1
endi
if $data90 != -0.900000000 then
return -1
endi
if $data91 != 1.000000000 then
return -1
endi
if $data92 != 81.000000000 then
return -1
endi
if $data93 != 0.000000000 then
return -1
endi
if $data94 != 18.000000000 then
return -1
endi
# error case, ts/bool/binary/nchar not support arithmetic expression
sql_error select ts+ts from $tb
sql_error select ts+22 from $tb
sql_error select c7*12 from $tb
sql_error select c8/55 from $tb
sql_error select c9+c8 from $tb
sql_error select c7-c8, c9-c8 from $tb
sql_error select ts-c9 from $tb
sql_error select c8+c7, c9+c9+c8+c7/c6 from $tb
# arithmetic expression in join [d.7]==================================================
# arithmetic expression in union [d.8]=================================================
# arithmetic expression in group by [d.9]==============================================
# in group by tag, not support for normal table
sql_error select c5*99 from $tb group by t1
# in group by column
sql_error select c6-(c6+c3)*12 from $tb group by c3;
# limit offset [d.10]==================================================================
sql select c6 * c1 + 12 from $tb limit 12 offset 99;
if $rows != 12 then
return -1
endi
if $data00 != 93.000000000 then
return -1
endi
if $data90 != 76.000000000 then
return -1
endi
sql select c4 / 99.123 from $tb limit 10 offset 9999;
if $rows != 1 then
return -1
endi
if $data00 != 0.090796283 then
return -1
endi
# slimit/soffset not support for normal table query. [d.11]============================
sql_error select sum(c1) from $tb slimit 1 soffset 19;
# fill [d.12]==========================================================================
sql_error select c2-c2, c3-c4, c5%c3 from $tb fill(value, 12);
# constant column. [d.13]==============================================================
sql select c1, c2+c6, 12.9876545678, 1, 1.1 from $tb
if $rows != 10000 then
return -1
endi
if $data00 != 0 then
return -1
endi
if $data01 != 0.000000000 then
return -1
endi
if $data02 != 12.987654568 then
return -1
endi
if $data03 != 1 then
return -1
endi
if $data04 != 1.100000000 then
return -1
endi
if $data10 != 1 then
return -1
endi
# column value filter [d.14]===========================================================
sql select c1, c2+c6, 12.9876545678, 1, 1.1 from $tb where c1<2
if $rows != 2000 then
return -1
endi
if $data00 != 0 then
return -1
endi
if $data01 != 0.000000000 then
return -1
endi
if $data02 != 12.987654568 then
return -1
endi
if $data03 != 1 then
return -1
endi
if $data10 != 1 then
return -1
endi
if $data20 != 0 then
return -1
endi
# tag filter(not support for normal table). [d.15]=====================================
sql_error select c2+99 from $tb where t1=12;
# multi-field output [d.16]============================================================
sql select c4*1+1/2,c4*1+1/2,c4*1+1/2,c4*1+1/2,c4*1+1/2 from $tb
if $rows != $rowNum then
return -1
endi
if $data00 != 0.500000000 then
return -1
endi
if $data10 != 1.500000000 then
return -1
endi
if $data90 != 9.500000000 then
return -1
endi
# interval query [d.17]==================================================================
sql_error select c2*c2, c3-c3, c4+9 from $tb interval(1s)
sql_error select c7-c9 from $tb interval(2y)
# aggregation query [d.18]===============================================================
# see test cases below
# first/last query [d.19]===============================================================
# see test cases below
# multiple retrieve [d.20]===============================================================
sql select c2-c2, 911 from $tb
#======================================= aggregation function arithmetic query cases ================
# asc/desc order [d.2]
sql select first(c1) * ( 2 / 3 ) from $stb order by ts asc;
if $rows != 1 then
return -1
endi
if $data00 != 0.000000000 then
return -1
endi
sql select first(c1) * (2/99) from $stb order by ts desc;
if $rows != 1 then
return -1
endi
if $data00 != 0.000000000 then
return -1
endi
sql select (count(c1) * 2) % 7.9, (count(c1) * 2), ( count(1)*2) from $stb order by ts desc;
if $rows != 1 then
return -1
endi
if $data00 != 1.800000000 then
return -1
endi
if $data01 != 100000 then
return -1
endi
if $data02 != 200000 then
return -1
endi
sql select spread( c1 )/44, spread(c1), 0.204545455 * 44 from $stb order by ts asc;
if $rows != 1 then
return -1
endi
if $data00 != 0.204545455 then
return -1
endi
if $data01 != 9.000000000 then
return -1
endi
if $data02 != 9.000000020 then
return -1
endi
# all possible function in the arithmetic expressioin
sql select min(c1) * max(c2) /4, sum(c1) * percentile(c2, 20), apercentile(c4, 33) + 52/9, spread(c5)/min(c2) from $stb where ts < and ts >
# no result return [d.3]
sql select first(c1) * 91 - 7, last(c3) from $stb where ts < 1537146000000
if $rows != 0 then
return -1
endi
# no result return [d.3]
sql select sum(c2) - avg(c2) from $tb where ts>xxx
if $rows != 0 then
return -1
endi
# single row result aggregation [d.4]
sql select
# error cases
sql_error select first(c1, c2) - last(c1, c2) from $tb
# multi row result aggregation [d.4]
sql select top(c1, 1) - bottom(c1, 1) from $tb
sql select top(c1, 99) - bottom(c1, 99) from $tb
# all data types [d.6]
sql select c2-c1, c3/c2, c4*c3, c5%c4, c6+99%22 from $tb
# error case, ts/bool/binary/nchar not support arithmetic expression
sql_error select ts+ts from $tb
sql_error select ts+22 from $tb
sql_error select c7*12 from $tb
sql_error select c8/55 from $tb
sql_error select c9+c8 from $tb
# arithmetic expression in join [d.7]
# arithmetic expression in union [d.8]
# arithmetic expression in group by [d.9]
# in group by tag
# not support for normal table
sql_error select c5*99 from $tb group by t1
# in group by column
sql_error select c6-c6+c3*12 from $tb group by c3;
sql select first(c6) - last(c6) *12 / count(*) from $tb group by c3;
# limit offset [d.10]
sql select c6-c6+12 from $tb limit 12 offset 99;
sql select c4/99.123 from $tb limit 1 offset 9999;
# slimit/soffset not suport for normal table query. [d.11]
sql_error select sum(c1) from $tb slimit 1 soffset 19;
# fill [d.12]
sql_error select c2-c2, c3-c4, c5%c6 from $tb fill(value, 12);
# constant column. [d.13]
# column value filter [d.14]
# tag filter(not support for normal table). [d.15]
sql_error select sum(c2)+99 from $tb where t1=12;
# multi-field output [d.16]
sql select count(*), sum(c1)*avg(c2), avg(c3)*count(c3), sum(c3), sum(c4), first(c7), last(c8), first(c9), first(c7), last(c8) from $tb
sql select c4*1+1/2 from $tb
if $rows != $rowNum then
return -1
endi
if $data00 != 0.500000000 then
return -1
endi
if $data10 != 1.500000000 then
return -1
endi
if $data90 != 9.500000000 then
return -1
endi
# interval query [d.17]
sql_error select c2*c2, c3-c3, c4+9 from $tb interval(1s)
sql_error select c7-c9 from $tb interval(2y)
# aggregation query [d.18]
# see test cases below
# first/last query [d.19]
# see test cases below
# multiple retrieve [d.20]
sql select c2-c2 from $tb;
sql select first(c1)-last(c1), spread(c2), max(c3) - min(c3), avg(c4)*count(c4) from $tb
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录