Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
慢慢CG
TDengine
提交
9e87f232
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看板
提交
9e87f232
编写于
11月 14, 2020
作者:
H
Hongze Cheng
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'develop' into feature/TD-2088
上级
a3580fd0
45039b1c
变更
36
展开全部
隐藏空白更改
内联
并排
Showing
36 changed file
with
1628 addition
and
2013 deletion
+1628
-2013
src/client/src/tscFunctionImpl.c
src/client/src/tscFunctionImpl.c
+12
-150
src/client/src/tscLocalMerge.c
src/client/src/tscLocalMerge.c
+5
-5
src/client/src/tscSQLParser.c
src/client/src/tscSQLParser.c
+231
-134
src/client/src/tscSchemaUtil.c
src/client/src/tscSchemaUtil.c
+0
-10
src/client/src/tscServer.c
src/client/src/tscServer.c
+2
-2
src/client/src/tscUtil.c
src/client/src/tscUtil.c
+2
-5
src/common/inc/tname.h
src/common/inc/tname.h
+1
-1
src/common/src/tname.c
src/common/src/tname.c
+11
-0
src/common/src/ttypes.c
src/common/src/ttypes.c
+2
-32
src/inc/taosdef.h
src/inc/taosdef.h
+43
-40
src/inc/taosmsg.h
src/inc/taosmsg.h
+8
-8
src/inc/ttokendef.h
src/inc/ttokendef.h
+1
-1
src/inc/ttype.h
src/inc/ttype.h
+36
-0
src/query/inc/qAst.h
src/query/inc/qAst.h
+4
-6
src/query/inc/qFill.h
src/query/inc/qFill.h
+28
-24
src/query/inc/qSqlparser.h
src/query/inc/qSqlparser.h
+37
-62
src/query/inc/sql.y
src/query/inc/sql.y
+27
-27
src/query/src/qAst.c
src/query/src/qAst.c
+15
-429
src/query/src/qExecutor.c
src/query/src/qExecutor.c
+71
-27
src/query/src/qFill.c
src/query/src/qFill.c
+270
-281
src/query/src/qParserImpl.c
src/query/src/qParserImpl.c
+60
-132
src/query/src/sql.c
src/query/src/sql.c
+60
-59
src/rpc/src/rpcTcp.c
src/rpc/src/rpcTcp.c
+1
-1
src/tsdb/src/tsdbMemTable.c
src/tsdb/src/tsdbMemTable.c
+1
-1
src/tsdb/src/tsdbRead.c
src/tsdb/src/tsdbRead.c
+108
-90
src/util/inc/tarray.h
src/util/inc/tarray.h
+14
-0
src/util/src/tarray.c
src/util/src/tarray.c
+21
-0
src/util/src/tcache.c
src/util/src/tcache.c
+5
-0
src/util/src/tcompare.c
src/util/src/tcompare.c
+0
-1
src/vnode/src/vnodeMain.c
src/vnode/src/vnodeMain.c
+13
-2
src/wal/src/walMgmt.c
src/wal/src/walMgmt.c
+0
-8
src/wal/src/walWrite.c
src/wal/src/walWrite.c
+4
-0
tests/pytest/update/allow_update-0.py
tests/pytest/update/allow_update-0.py
+170
-170
tests/pytest/update/allow_update.py
tests/pytest/update/allow_update.py
+266
-266
tests/script/general/parser/constCol.sim
tests/script/general/parser/constCol.sim
+11
-0
tests/script/general/parser/sliding.sim
tests/script/general/parser/sliding.sim
+88
-39
未找到文件。
src/client/src/tscFunctionImpl.c
浏览文件 @
9e87f232
...
...
@@ -28,6 +28,7 @@
#include "tscompression.h"
#include "tsqlfunction.h"
#include "tutil.h"
#include "ttype.h"
#define GET_INPUT_CHAR(x) (((char *)((x)->aInputElemBuf)) + ((x)->startOffset) * ((x)->inputBytes))
#define GET_INPUT_CHAR_INDEX(x, y) (GET_INPUT_CHAR(x) + (y) * (x)->inputBytes)
...
...
@@ -2479,28 +2480,8 @@ static void percentile_function(SQLFunctionCtx *pCtx) {
continue
;
}
// TODO extract functions
double
v
=
0
;
switch
(
pCtx
->
inputType
)
{
case
TSDB_DATA_TYPE_TINYINT
:
v
=
GET_INT8_VAL
(
data
);
break
;
case
TSDB_DATA_TYPE_SMALLINT
:
v
=
GET_INT16_VAL
(
data
);
break
;
case
TSDB_DATA_TYPE_BIGINT
:
v
=
(
double
)(
GET_INT64_VAL
(
data
));
break
;
case
TSDB_DATA_TYPE_FLOAT
:
v
=
GET_FLOAT_VAL
(
data
);
break
;
case
TSDB_DATA_TYPE_DOUBLE
:
v
=
GET_DOUBLE_VAL
(
data
);
break
;
default:
v
=
GET_INT32_VAL
(
data
);
break
;
}
GET_TYPED_DATA
(
v
,
double
,
pCtx
->
inputType
,
data
);
if
(
v
<
GET_DOUBLE_VAL
(
&
pInfo
->
minval
))
{
SET_DOUBLE_VAL
(
&
pInfo
->
minval
,
v
);
...
...
@@ -2541,30 +2522,10 @@ static void percentile_function_f(SQLFunctionCtx *pCtx, int32_t index) {
SResultRowCellInfo
*
pResInfo
=
GET_RES_INFO
(
pCtx
);
SPercentileInfo
*
pInfo
=
(
SPercentileInfo
*
)
GET_ROWCELL_INTERBUF
(
pResInfo
);
if
(
pInfo
->
stage
==
0
)
{
// TODO extract functions
double
v
=
0
;
switch
(
pCtx
->
inputType
)
{
case
TSDB_DATA_TYPE_TINYINT
:
v
=
GET_INT8_VAL
(
pData
);
break
;
case
TSDB_DATA_TYPE_SMALLINT
:
v
=
GET_INT16_VAL
(
pData
);
break
;
case
TSDB_DATA_TYPE_BIGINT
:
v
=
(
double
)(
GET_INT64_VAL
(
pData
));
break
;
case
TSDB_DATA_TYPE_FLOAT
:
v
=
GET_FLOAT_VAL
(
pData
);
break
;
case
TSDB_DATA_TYPE_DOUBLE
:
v
=
GET_DOUBLE_VAL
(
pData
);
break
;
default:
v
=
GET_INT32_VAL
(
pData
);
break
;
}
GET_TYPED_DATA
(
v
,
double
,
pCtx
->
inputType
,
pData
);
if
(
v
<
GET_DOUBLE_VAL
(
&
pInfo
->
minval
))
{
SET_DOUBLE_VAL
(
&
pInfo
->
minval
,
v
);
...
...
@@ -2653,29 +2614,9 @@ static void apercentile_function(SQLFunctionCtx *pCtx) {
}
notNullElems
+=
1
;
double
v
=
0
;
switch
(
pCtx
->
inputType
)
{
case
TSDB_DATA_TYPE_TINYINT
:
v
=
GET_INT8_VAL
(
data
);
break
;
case
TSDB_DATA_TYPE_SMALLINT
:
v
=
GET_INT16_VAL
(
data
);
break
;
case
TSDB_DATA_TYPE_BIGINT
:
v
=
(
double
)(
GET_INT64_VAL
(
data
));
break
;
case
TSDB_DATA_TYPE_FLOAT
:
v
=
GET_FLOAT_VAL
(
data
);
break
;
case
TSDB_DATA_TYPE_DOUBLE
:
v
=
GET_DOUBLE_VAL
(
data
);
break
;
default:
v
=
GET_INT32_VAL
(
data
);
break
;
}
GET_TYPED_DATA
(
v
,
double
,
pCtx
->
inputType
,
data
);
tHistogramAdd
(
&
pInfo
->
pHisto
,
v
);
}
...
...
@@ -2700,26 +2641,7 @@ static void apercentile_function_f(SQLFunctionCtx *pCtx, int32_t index) {
SAPercentileInfo
*
pInfo
=
getAPerctInfo
(
pCtx
);
double
v
=
0
;
switch
(
pCtx
->
inputType
)
{
case
TSDB_DATA_TYPE_TINYINT
:
v
=
GET_INT8_VAL
(
pData
);
break
;
case
TSDB_DATA_TYPE_SMALLINT
:
v
=
GET_INT16_VAL
(
pData
);
break
;
case
TSDB_DATA_TYPE_BIGINT
:
v
=
(
double
)(
GET_INT64_VAL
(
pData
));
break
;
case
TSDB_DATA_TYPE_FLOAT
:
v
=
GET_FLOAT_VAL
(
pData
);
break
;
case
TSDB_DATA_TYPE_DOUBLE
:
v
=
GET_DOUBLE_VAL
(
pData
);
break
;
default:
v
=
GET_INT32_VAL
(
pData
);
break
;
}
GET_TYPED_DATA
(
v
,
double
,
pCtx
->
inputType
,
pData
);
tHistogramAdd
(
&
pInfo
->
pHisto
,
v
);
...
...
@@ -4142,22 +4064,7 @@ static void rate_function(SQLFunctionCtx *pCtx) {
notNullElems
++
;
int64_t
v
=
0
;
switch
(
pCtx
->
inputType
)
{
case
TSDB_DATA_TYPE_TINYINT
:
v
=
(
int64_t
)
GET_INT8_VAL
(
pData
);
break
;
case
TSDB_DATA_TYPE_SMALLINT
:
v
=
(
int64_t
)
GET_INT16_VAL
(
pData
);
break
;
case
TSDB_DATA_TYPE_INT
:
v
=
(
int64_t
)
GET_INT32_VAL
(
pData
);
break
;
case
TSDB_DATA_TYPE_BIGINT
:
v
=
(
int64_t
)
GET_INT64_VAL
(
pData
);
break
;
default:
assert
(
0
);
}
GET_TYPED_DATA
(
v
,
int64_t
,
pCtx
->
inputType
,
pData
);
if
((
INT64_MIN
==
pRateInfo
->
firstValue
)
||
(
INT64_MIN
==
pRateInfo
->
firstKey
))
{
pRateInfo
->
firstValue
=
v
;
...
...
@@ -4207,22 +4114,7 @@ static void rate_function_f(SQLFunctionCtx *pCtx, int32_t index) {
TSKEY
*
primaryKey
=
pCtx
->
ptsList
;
int64_t
v
=
0
;
switch
(
pCtx
->
inputType
)
{
case
TSDB_DATA_TYPE_TINYINT
:
v
=
(
int64_t
)
GET_INT8_VAL
(
pData
);
break
;
case
TSDB_DATA_TYPE_SMALLINT
:
v
=
(
int64_t
)
GET_INT16_VAL
(
pData
);
break
;
case
TSDB_DATA_TYPE_INT
:
v
=
(
int64_t
)
GET_INT32_VAL
(
pData
);
break
;
case
TSDB_DATA_TYPE_BIGINT
:
v
=
(
int64_t
)
GET_INT64_VAL
(
pData
);
break
;
default:
assert
(
0
);
}
GET_TYPED_DATA
(
v
,
int64_t
,
pCtx
->
inputType
,
pData
);
if
((
INT64_MIN
==
pRateInfo
->
firstValue
)
||
(
INT64_MIN
==
pRateInfo
->
firstKey
))
{
pRateInfo
->
firstValue
=
v
;
...
...
@@ -4349,22 +4241,7 @@ static void irate_function(SQLFunctionCtx *pCtx) {
notNullElems
++
;
int64_t
v
=
0
;
switch
(
pCtx
->
inputType
)
{
case
TSDB_DATA_TYPE_TINYINT
:
v
=
(
int64_t
)
GET_INT8_VAL
(
pData
);
break
;
case
TSDB_DATA_TYPE_SMALLINT
:
v
=
(
int64_t
)
GET_INT16_VAL
(
pData
);
break
;
case
TSDB_DATA_TYPE_INT
:
v
=
(
int64_t
)
GET_INT32_VAL
(
pData
);
break
;
case
TSDB_DATA_TYPE_BIGINT
:
v
=
(
int64_t
)
GET_INT64_VAL
(
pData
);
break
;
default:
assert
(
0
);
}
GET_TYPED_DATA
(
v
,
int64_t
,
pCtx
->
inputType
,
pData
);
// TODO: calc once if only call this function once ????
if
((
INT64_MIN
==
pRateInfo
->
lastKey
)
||
(
INT64_MIN
==
pRateInfo
->
lastValue
))
{
...
...
@@ -4409,23 +4286,8 @@ static void irate_function_f(SQLFunctionCtx *pCtx, int32_t index) {
TSKEY
*
primaryKey
=
pCtx
->
ptsList
;
int64_t
v
=
0
;
switch
(
pCtx
->
inputType
)
{
case
TSDB_DATA_TYPE_TINYINT
:
v
=
(
int64_t
)
GET_INT8_VAL
(
pData
);
break
;
case
TSDB_DATA_TYPE_SMALLINT
:
v
=
(
int64_t
)
GET_INT16_VAL
(
pData
);
break
;
case
TSDB_DATA_TYPE_INT
:
v
=
(
int64_t
)
GET_INT32_VAL
(
pData
);
break
;
case
TSDB_DATA_TYPE_BIGINT
:
v
=
(
int64_t
)
GET_INT64_VAL
(
pData
);
break
;
default:
assert
(
0
);
}
GET_TYPED_DATA
(
v
,
int64_t
,
pCtx
->
inputType
,
pData
);
pRateInfo
->
firstKey
=
pRateInfo
->
lastKey
;
pRateInfo
->
firstValue
=
pRateInfo
->
lastValue
;
...
...
src/client/src/tscLocalMerge.c
浏览文件 @
9e87f232
...
...
@@ -373,7 +373,7 @@ void tscCreateLocalReducer(tExtMemBuffer **pMemBuffer, int32_t numOfBuffer, tOrd
SFillColInfo
*
pFillCol
=
createFillColInfo
(
pQueryInfo
);
pReducer
->
pFillInfo
=
taosInitFillInfo
(
pQueryInfo
->
order
.
order
,
revisedSTime
,
pQueryInfo
->
groupbyExpr
.
numOfGroupCols
,
4096
,
(
int32_t
)
numOfCols
,
pQueryInfo
->
interval
.
sliding
,
pQueryInfo
->
interval
.
slidingUnit
,
tinfo
.
precision
,
pQueryInfo
->
fillType
,
pFillCol
);
tinfo
.
precision
,
pQueryInfo
->
fillType
,
pFillCol
,
pSql
);
}
}
...
...
@@ -916,7 +916,7 @@ static void doFillResult(SSqlObj *pSql, SLocalReducer *pLocalReducer, bool doneO
}
while
(
1
)
{
int64_t
newRows
=
taos
Generate
DataBlock
(
pFillInfo
,
pResPages
,
pLocalReducer
->
resColModel
->
capacity
);
int64_t
newRows
=
taos
FillResult
DataBlock
(
pFillInfo
,
pResPages
,
pLocalReducer
->
resColModel
->
capacity
);
if
(
pQueryInfo
->
limit
.
offset
<
newRows
)
{
newRows
-=
pQueryInfo
->
limit
.
offset
;
...
...
@@ -945,7 +945,7 @@ static void doFillResult(SSqlObj *pSql, SLocalReducer *pLocalReducer, bool doneO
}
// all output in current group are completed
int32_t
totalRemainRows
=
(
int32_t
)
get
FilledNumOfRes
(
pFillInfo
,
actualETime
,
pLocalReducer
->
resColModel
->
capacity
);
int32_t
totalRemainRows
=
(
int32_t
)
get
NumOfResWithFill
(
pFillInfo
,
actualETime
,
pLocalReducer
->
resColModel
->
capacity
);
if
(
totalRemainRows
<=
0
)
{
break
;
}
...
...
@@ -1294,7 +1294,7 @@ static bool doBuildFilledResultForGroup(SSqlObj *pSql) {
int64_t
etime
=
*
(
int64_t
*
)(
pFinalDataBuf
->
data
+
TSDB_KEYSIZE
*
(
pFillInfo
->
numOfRows
-
1
));
// the first column must be the timestamp column
int32_t
rows
=
(
int32_t
)
getFilledNumOfRes
(
pFillInfo
,
etime
,
pLocalReducer
->
resColModel
->
capacity
);
int32_t
rows
=
(
int32_t
)
getNumOfResWithFill
(
pFillInfo
,
etime
,
pLocalReducer
->
resColModel
->
capacity
);
if
(
rows
>
0
)
{
// do fill gap
doFillResult
(
pSql
,
pLocalReducer
,
false
);
}
...
...
@@ -1323,7 +1323,7 @@ static bool doHandleLastRemainData(SSqlObj *pSql) {
((
pRes
->
numOfRowsGroup
<
pQueryInfo
->
limit
.
limit
&&
pQueryInfo
->
limit
.
limit
>
0
)
||
(
pQueryInfo
->
limit
.
limit
<
0
)))
{
int64_t
etime
=
(
pQueryInfo
->
order
.
order
==
TSDB_ORDER_ASC
)
?
pQueryInfo
->
window
.
ekey
:
pQueryInfo
->
window
.
skey
;
int32_t
rows
=
(
int32_t
)
get
FilledNumOfRes
(
pFillInfo
,
etime
,
pLocalReducer
->
resColModel
->
capacity
);
int32_t
rows
=
(
int32_t
)
get
NumOfResWithFill
(
pFillInfo
,
etime
,
pLocalReducer
->
resColModel
->
capacity
);
if
(
rows
>
0
)
{
doFillResult
(
pSql
,
pLocalReducer
,
true
);
}
...
...
src/client/src/tscSQLParser.c
浏览文件 @
9e87f232
此差异已折叠。
点击以展开。
src/client/src/tscSchemaUtil.c
浏览文件 @
9e87f232
...
...
@@ -130,16 +130,6 @@ SSchema* tscGetColumnSchemaById(STableMeta* pTableMeta, int16_t colId) {
return
NULL
;
}
struct
SSchema
tscGetTbnameColumnSchema
()
{
struct
SSchema
s
=
{
.
colId
=
TSDB_TBNAME_COLUMN_INDEX
,
.
type
=
TSDB_DATA_TYPE_BINARY
,
.
bytes
=
TSDB_TABLE_NAME_LEN
};
strcpy
(
s
.
name
,
TSQL_TBNAME_L
);
return
s
;
}
static
void
tscInitCorVgroupInfo
(
SCorVgroupInfo
*
corVgroupInfo
,
SVgroupInfo
*
vgroupInfo
)
{
corVgroupInfo
->
version
=
0
;
corVgroupInfo
->
inUse
=
0
;
...
...
src/client/src/tscServer.c
浏览文件 @
9e87f232
...
...
@@ -361,7 +361,7 @@ void tscProcessMsgFromServer(SRpcMsg *rpcMsg, SRpcEpSet *pEpSet) {
memcpy
(
pRes
->
pRsp
,
rpcMsg
->
pCont
,
pRes
->
rspLen
);
}
}
else
{
pRes
->
pRsp
=
NULL
;
tfree
(
pRes
->
pRsp
)
;
}
/*
...
...
@@ -892,7 +892,7 @@ int tscBuildQueryMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
int32_t
msgLen
=
(
int32_t
)(
pMsg
-
pCmd
->
payload
);
tscDebug
(
"%p msg built success,len:%d bytes"
,
pSql
,
msgLen
);
tscDebug
(
"%p msg built success,
len:%d bytes"
,
pSql
,
msgLen
);
pCmd
->
payloadLen
=
msgLen
;
pSql
->
cmd
.
msgType
=
TSDB_MSG_TYPE_QUERY
;
...
...
src/client/src/tscUtil.c
浏览文件 @
9e87f232
...
...
@@ -71,7 +71,8 @@ void tsSetSTableQueryCond(STagCond* pTagCond, uint64_t uid, SBufferWriter* bw) {
}
bool
tscQueryTags
(
SQueryInfo
*
pQueryInfo
)
{
for
(
int32_t
i
=
0
;
i
<
pQueryInfo
->
fieldsInfo
.
numOfOutput
;
++
i
)
{
int32_t
numOfCols
=
(
int32_t
)
tscSqlExprNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
numOfCols
;
++
i
)
{
SSqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
int32_t
functId
=
pExpr
->
functionId
;
...
...
@@ -201,13 +202,9 @@ bool tscIsProjectionQuery(SQueryInfo* pQueryInfo) {
bool
tscIsPointInterpQuery
(
SQueryInfo
*
pQueryInfo
)
{
size_t
size
=
tscSqlExprNumOfExprs
(
pQueryInfo
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
SSqlExpr
*
pExpr
=
tscSqlExprGet
(
pQueryInfo
,
i
);
assert
(
pExpr
!=
NULL
);
// if (pExpr == NULL) {
// return false;
// }
int32_t
functionId
=
pExpr
->
functionId
;
if
(
functionId
==
TSDB_FUNC_TAG
)
{
...
...
src/common/inc/tname.h
浏览文件 @
9e87f232
...
...
@@ -35,6 +35,6 @@ bool tscValidateTableNameLength(size_t len);
SColumnFilterInfo
*
tscFilterInfoClone
(
const
SColumnFilterInfo
*
src
,
int32_t
numOfFilters
);
// int64_t taosGetIntervalStartTimestamp(int64_t startTime, int64_t slidingTime, int64_t intervalTime, char timeUnit, int16_t precision
);
SSchema
tscGetTbnameColumnSchema
(
);
#endif // TDENGINE_NAME_H
src/common/src/tname.c
浏览文件 @
9e87f232
...
...
@@ -188,3 +188,14 @@ void extractTableNameFromToken(SStrToken* pToken, SStrToken* pTable) {
pToken
->
z
=
r
;
}
}
SSchema
tscGetTbnameColumnSchema
()
{
struct
SSchema
s
=
{
.
colId
=
TSDB_TBNAME_COLUMN_INDEX
,
.
type
=
TSDB_DATA_TYPE_BINARY
,
.
bytes
=
TSDB_TABLE_NAME_LEN
};
strcpy
(
s
.
name
,
TSQL_TBNAME_L
);
return
s
;
}
\ No newline at end of file
src/common/src/ttypes.c
浏览文件 @
9e87f232
...
...
@@ -355,32 +355,6 @@ bool isValidDataType(int32_t type) {
return
type
>=
TSDB_DATA_TYPE_NULL
&&
type
<=
TSDB_DATA_TYPE_NCHAR
;
}
//bool isNull(const char *val, int32_t type) {
// switch (type) {
// case TSDB_DATA_TYPE_BOOL:
// return *(uint8_t *)val == TSDB_DATA_BOOL_NULL;
// case TSDB_DATA_TYPE_TINYINT:
// return *(uint8_t *)val == TSDB_DATA_TINYINT_NULL;
// case TSDB_DATA_TYPE_SMALLINT:
// return *(uint16_t *)val == TSDB_DATA_SMALLINT_NULL;
// case TSDB_DATA_TYPE_INT:
// return *(uint32_t *)val == TSDB_DATA_INT_NULL;
// case TSDB_DATA_TYPE_BIGINT:
// case TSDB_DATA_TYPE_TIMESTAMP:
// return *(uint64_t *)val == TSDB_DATA_BIGINT_NULL;
// case TSDB_DATA_TYPE_FLOAT:
// return *(uint32_t *)val == TSDB_DATA_FLOAT_NULL;
// case TSDB_DATA_TYPE_DOUBLE:
// return *(uint64_t *)val == TSDB_DATA_DOUBLE_NULL;
// case TSDB_DATA_TYPE_NCHAR:
// return *(uint32_t*) varDataVal(val) == TSDB_DATA_NCHAR_NULL;
// case TSDB_DATA_TYPE_BINARY:
// return *(uint8_t *) varDataVal(val) == TSDB_DATA_BINARY_NULL;
// default:
// return false;
// };
//}
void
setVardataNull
(
char
*
val
,
int32_t
type
)
{
if
(
type
==
TSDB_DATA_TYPE_BINARY
)
{
varDataSetLen
(
val
,
sizeof
(
int8_t
));
...
...
@@ -433,14 +407,10 @@ void setNullN(char *val, int32_t type, int32_t bytes, int32_t numOfElems) {
*
(
uint64_t
*
)(
val
+
i
*
tDataTypeDesc
[
type
].
nSize
)
=
TSDB_DATA_DOUBLE_NULL
;
}
break
;
case
TSDB_DATA_TYPE_NCHAR
:
// todo : without length?
for
(
int32_t
i
=
0
;
i
<
numOfElems
;
++
i
)
{
*
(
uint32_t
*
)(
val
+
i
*
bytes
)
=
TSDB_DATA_NCHAR_NULL
;
}
break
;
case
TSDB_DATA_TYPE_NCHAR
:
case
TSDB_DATA_TYPE_BINARY
:
for
(
int32_t
i
=
0
;
i
<
numOfElems
;
++
i
)
{
*
(
uint8_t
*
)(
val
+
i
*
bytes
)
=
TSDB_DATA_BINARY_NULL
;
setVardataNull
(
val
+
i
*
bytes
,
type
)
;
}
break
;
default:
{
...
...
src/inc/taosdef.h
浏览文件 @
9e87f232
...
...
@@ -61,13 +61,23 @@ typedef struct tstr {
// Bytes for each type.
extern
const
int32_t
TYPE_BYTES
[
11
];
// TODO: replace and remove code below
#define CHAR_BYTES sizeof(char)
#define SHORT_BYTES sizeof(int16_t)
#define INT_BYTES sizeof(int32_t)
#define LONG_BYTES sizeof(int64_t)
#define FLOAT_BYTES sizeof(float)
#define DOUBLE_BYTES sizeof(double)
#define CHAR_BYTES sizeof(char)
#define SHORT_BYTES sizeof(int16_t)
#define INT_BYTES sizeof(int32_t)
#define LONG_BYTES sizeof(int64_t)
#define FLOAT_BYTES sizeof(float)
#define DOUBLE_BYTES sizeof(double)
#define POINTER_BYTES sizeof(void *) // 8 by default assert(sizeof(ptrdiff_t) == sizseof(void*)
#define TSDB_KEYSIZE sizeof(TSKEY)
#if LINUX
#define TSDB_NCHAR_SIZE sizeof(wchar_t)
#else
#define TSDB_NCHAR_SIZE sizeof(int32_t)
#endif
// NULL definition
#define TSDB_DATA_BOOL_NULL 0x02
...
...
@@ -102,10 +112,12 @@ extern const int32_t TYPE_BYTES[11];
#define TSDB_TIME_PRECISION_MILLI 0
#define TSDB_TIME_PRECISION_MICRO 1
#define TSDB_TIME_PRECISION_NANO 2
#define TSDB_TICK_PER_SECOND(precision) ((precision)==TSDB_TIME_PRECISION_MILLI ? 1e3L : ((precision)==TSDB_TIME_PRECISION_MICRO ? 1e6L : 1e9L))
#define TSDB_TIME_PRECISION_MILLI_STR "ms"
#define TSDB_TIME_PRECISION_MICRO_STR "us"
#define TSDB_TIME_PRECISION_NANO_STR "ns"
#define TSDB_TICK_PER_SECOND(precision) ((precision)==TSDB_TIME_PRECISION_MILLI ? 1e3L : ((precision)==TSDB_TIME_PRECISION_MICRO ? 1e6L : 1e9L))
#define T_MEMBER_SIZE(type, member) sizeof(((type *)0)->member)
#define T_APPEND_MEMBER(dst, ptr, type, member) \
...
...
@@ -119,15 +131,6 @@ do { \
(src) = (void *)((char *)src + sizeof(type));\
} while(0)
#define TSDB_KEYSIZE sizeof(TSKEY)
#if LINUX
#define TSDB_NCHAR_SIZE sizeof(wchar_t)
#else
#define TSDB_NCHAR_SIZE 4
#endif
//#define TSDB_CHAR_TERMINATED_SPACE 1
#define GET_INT8_VAL(x) (*(int8_t *)(x))
#define GET_INT16_VAL(x) (*(int16_t *)(x))
#define GET_INT32_VAL(x) (*(int32_t *)(x))
...
...
@@ -173,7 +176,6 @@ typedef struct tDataTypeDescriptor {
}
tDataTypeDescriptor
;
extern
tDataTypeDescriptor
tDataTypeDesc
[
11
];
#define POINTER_BYTES sizeof(void *) // 8 by default assert(sizeof(ptrdiff_t) == sizseof(void*)
bool
isValidDataType
(
int32_t
type
);
//bool isNull(const char *val, int32_t type);
...
...
@@ -267,10 +269,6 @@ void tsDataSwap(void *pLeft, void *pRight, int32_t type, int32_t size, void* buf
#define TSDB_AUTH_LEN 16
#define TSDB_KEY_LEN 16
#define TSDB_VERSION_LEN 12
#define TSDB_STREET_LEN 64
#define TSDB_CITY_LEN 20
#define TSDB_STATE_LEN 20
#define TSDB_COUNTRY_LEN 20
#define TSDB_LOCALE_LEN 64
#define TSDB_TIMEZONE_LEN 96
#define TSDB_LABEL_LEN 8
...
...
@@ -393,27 +391,27 @@ void tsDataSwap(void *pLeft, void *pRight, int32_t type, int32_t size, void* buf
* 1. ordinary sub query for select * from super_table
* 2. all sqlobj generated by createSubqueryObj with this flag
*/
#define TSDB_QUERY_TYPE_SUBQUERY
0x02u
#define TSDB_QUERY_TYPE_STABLE_SUBQUERY
0x04u // two-stage subquery for super table
#define TSDB_QUERY_TYPE_SUBQUERY 0x02u
#define TSDB_QUERY_TYPE_STABLE_SUBQUERY 0x04u // two-stage subquery for super table
#define TSDB_QUERY_TYPE_TABLE_QUERY
0x08u // query ordinary table; below only apply to client side
#define TSDB_QUERY_TYPE_STABLE_QUERY
0x10u // query on super table
#define TSDB_QUERY_TYPE_JOIN_QUERY
0x20u // join query
#define TSDB_QUERY_TYPE_PROJECTION_QUERY
0x40u // select *,columns... query
#define TSDB_QUERY_TYPE_JOIN_SEC_STAGE
0x80u // join sub query at the second stage
#define TSDB_QUERY_TYPE_TABLE_QUERY 0x08u // query ordinary table; below only apply to client side
#define TSDB_QUERY_TYPE_STABLE_QUERY 0x10u // query on super table
#define TSDB_QUERY_TYPE_JOIN_QUERY 0x20u // join query
#define TSDB_QUERY_TYPE_PROJECTION_QUERY 0x40u // select *,columns... query
#define TSDB_QUERY_TYPE_JOIN_SEC_STAGE 0x80u // join sub query at the second stage
#define TSDB_QUERY_TYPE_TAG_FILTER_QUERY
0x400u
#define TSDB_QUERY_TYPE_INSERT
0x100u // insert type
#define TSDB_QUERY_TYPE_MULTITABLE_QUERY
0x200u
#define TSDB_QUERY_TYPE_STMT_INSERT
0x800u // stmt insert type
#define TSDB_QUERY_TYPE_TAG_FILTER_QUERY 0x400u
#define TSDB_QUERY_TYPE_INSERT 0x100u // insert type
#define TSDB_QUERY_TYPE_MULTITABLE_QUERY 0x200u
#define TSDB_QUERY_TYPE_STMT_INSERT 0x800u // stmt insert type
#define TSDB_QUERY_HAS_TYPE(x, _type) (((x) & (_type)) != 0)
#define TSDB_QUERY_SET_TYPE(x, _type) ((x) |= (_type))
#define TSDB_QUERY_CLEAR_TYPE(x, _type) ((x) &= (~_type))
#define TSDB_QUERY_RESET_TYPE(x) ((x) = TSDB_QUERY_TYPE_NON_TYPE)
#define TSDB_ORDER_ASC 1
#define TSDB_ORDER_DESC 2
#define TSDB_ORDER_ASC
1
#define TSDB_ORDER_DESC
2
#define TSDB_DEFAULT_CLUSTER_HASH_SIZE 1
#define TSDB_DEFAULT_MNODES_HASH_SIZE 5
...
...
@@ -425,10 +423,15 @@ void tsDataSwap(void *pLeft, void *pRight, int32_t type, int32_t size, void* buf
#define TSDB_DEFAULT_STABLES_HASH_SIZE 100
#define TSDB_DEFAULT_CTABLES_HASH_SIZE 20000
#define TSDB_PORT_DNODESHELL 0
#define TSDB_PORT_DNODEDNODE 5
#define TSDB_PORT_SYNC 10
#define TSDB_PORT_HTTP 11
#define TSDB_PORT_DNODESHELL 0
#define TSDB_PORT_DNODEDNODE 5
#define TSDB_PORT_SYNC 10
#define TSDB_PORT_HTTP 11
#define TSDB_PORT_ARBITRATOR 12
#define TSDB_PORT_DNODESHELL 0
#define TSDB_PORT_DNODEDNODE 5
#define TSDB_PORT_SYNC 10
#define TSDB_PORT_HTTP 11
#define TSDB_PORT_ARBITRATOR 12
#define TSDB_MAX_WAL_SIZE (1024*1024)
...
...
@@ -462,8 +465,8 @@ typedef enum {
TSDB_CHECK_ITEM_MEM
,
TSDB_CHECK_ITEM_CPU
,
TSDB_CHECK_ITEM_DISK
,
TSDB_CHECK_ITEM_OS
,
TSDB_CHECK_ITEM_ACCESS
,
TSDB_CHECK_ITEM_OS
,
TSDB_CHECK_ITEM_ACCESS
,
TSDB_CHECK_ITEM_VERSION
,
TSDB_CHECK_ITEM_DATAFILE
,
TSDB_CHECK_ITEM_MAX
...
...
src/inc/taosmsg.h
浏览文件 @
9e87f232
...
...
@@ -481,15 +481,15 @@ typedef struct {
int64_t
limit
;
int64_t
offset
;
uint32_t
queryType
;
// denote another query process
int16_t
numOfOutput
;
// final output columns numbers
int16_t
numOfOutput
;
// final output columns numbers
int16_t
tagNameRelType
;
// relation of tag criteria and tbname criteria
int16_t
fillType
;
// interpolate type
uint64_t
fillVal
;
// default value array list
int32_t
tsOffset
;
// offset value in current msg body, NOTE: ts list is compressed
int32_t
tsLen
;
// total length of ts comp block
int32_t
tsNumOfBlocks
;
// ts comp block numbers
int32_t
tsOrder
;
// ts comp block order
int32_t
numOfTags
;
// number of tags columns involved
int16_t
fillType
;
// interpolate type
uint64_t
fillVal
;
// default value array list
int32_t
tsOffset
;
// offset value in current msg body, NOTE: ts list is compressed
int32_t
tsLen
;
// total length of ts comp block
int32_t
tsNumOfBlocks
;
// ts comp block numbers
int32_t
tsOrder
;
// ts comp block order
int32_t
numOfTags
;
// number of tags columns involved
SColumnInfo
colList
[];
}
SQueryTableMsg
;
...
...
src/inc/ttokendef.h
浏览文件 @
9e87f232
...
...
@@ -16,7 +16,6 @@
#ifndef TDENGINE_TTOKENDEF_H
#define TDENGINE_TTOKENDEF_H
#define TK_ID 1
#define TK_BOOL 2
#define TK_TINYINT 3
...
...
@@ -224,6 +223,7 @@
#define TK_INTO 205
#define TK_VALUES 206
#define TK_SPACE 300
#define TK_COMMENT 301
#define TK_ILLEGAL 302
...
...
src/inc/ttype.h
0 → 100644
浏览文件 @
9e87f232
#ifndef TDENGINE_TTYPE_H
#define TDENGINE_TTYPE_H
#ifdef __cplusplus
extern
"C"
{
#endif
#include "taosdef.h"
#define GET_TYPED_DATA(_v, _finalType, _type, _data) \
switch (_type) { \
case TSDB_DATA_TYPE_TINYINT: \
(_v) = (_finalType)GET_INT8_VAL(_data); \
break; \
case TSDB_DATA_TYPE_SMALLINT: \
(_v) = (_finalType)GET_INT16_VAL(_data); \
break; \
case TSDB_DATA_TYPE_BIGINT: \
(_v) = (_finalType)(GET_INT64_VAL(_data)); \
break; \
case TSDB_DATA_TYPE_FLOAT: \
(_v) = (_finalType)GET_FLOAT_VAL(_data); \
break; \
case TSDB_DATA_TYPE_DOUBLE: \
(_v) = (_finalType)GET_DOUBLE_VAL(_data); \
break; \
default: \
(_v) = (_finalType)GET_INT32_VAL(_data); \
break; \
};
#ifdef __cplusplus
}
#endif
#endif // TDENGINE_TTYPE_H
src/query/inc/qAst.h
浏览文件 @
9e87f232
...
...
@@ -74,20 +74,18 @@ typedef struct tExprNode {
};
}
tExprNode
;
void
tExprTreeDestroy
(
tExprNode
**
pExprs
,
void
(
*
fp
)(
void
*
));
void
tExprTreeTraverse
(
tExprNode
*
pExpr
,
SSkipList
*
pSkipList
,
SArray
*
result
,
SExprTraverseSupp
*
param
);
void
tExprTreeCalcTraverse
(
tExprNode
*
pExprs
,
int32_t
numOfRows
,
char
*
pOutput
,
void
*
param
,
int32_t
order
,
char
*
(
*
cb
)(
void
*
,
const
char
*
,
int32_t
));
uint8_t
getBinaryExprOptr
(
SStrToken
*
pToken
);
tExprNode
*
exprTreeFromBinary
(
const
void
*
data
,
size_t
size
);
tExprNode
*
exprTreeFromTableName
(
const
char
*
tbnameCond
);
void
tExprNodeDestroy
(
tExprNode
*
pNode
,
void
(
*
fp
)(
void
*
));
void
exprTreeToBinary
(
SBufferWriter
*
bw
,
tExprNode
*
pExprTree
);
tExprNode
*
exprTreeFromBinary
(
const
void
*
data
,
size_t
size
);
tExprNode
*
exprTreeFromTableName
(
const
char
*
tbnameCond
);
void
tExprNodeDestroy
(
tExprNode
*
pNode
,
void
(
*
fp
)(
void
*
)
);
void
tExprTreeDestroy
(
tExprNode
**
pExprs
,
void
(
*
fp
)(
void
*
)
);
#ifdef __cplusplus
}
...
...
src/query/inc/qFill.h
浏览文件 @
9e87f232
...
...
@@ -28,6 +28,7 @@ typedef struct {
STColumn
col
;
// column info
int16_t
functionId
;
// sql function id
int16_t
flag
;
// column flag: TAG COLUMN|NORMAL COLUMN
int16_t
tagIndex
;
// index of current tag in SFillTagColInfo array list
union
{
int64_t
i
;
double
d
;}
fillVal
;
}
SFillColInfo
;
...
...
@@ -37,26 +38,29 @@ typedef struct {
}
SFillTagColInfo
;
typedef
struct
SFillInfo
{
TSKEY
start
;
// start timestamp
TSKEY
endKey
;
// endKey for fill
int32_t
order
;
// order [TSDB_ORDER_ASC|TSDB_ORDER_DESC]
int32_t
fillType
;
// fill type
int32_t
numOfRows
;
// number of rows in the input data block
int32_t
rowIdx
;
// rowIdx
int32_t
numOfTotal
;
// number of filled rows in one round
int32_t
numOfCurrent
;
// number of filled rows in current results
int32_t
numOfTags
;
// number of tags
int32_t
numOfCols
;
// number of columns, including the tags column
s
int32_t
rowSize
;
// size of each row
SFillTagColInfo
*
pTags
;
// tags value for filling gap
TSKEY
start
;
// start timestamp
TSKEY
end
;
// endKey for fill
TSKEY
currentKey
;
// current active timestamp, the value may be changed during the fill procedure.
int32_t
order
;
// order [TSDB_ORDER_ASC|TSDB_ORDER_DESC]
int32_t
type
;
// fill type
int32_t
numOfRows
;
// number of rows in the input data block
int32_t
index
;
// active row index
int32_t
numOfTotal
;
// number of filled rows in one round
int32_t
numOfCurrent
;
// number of filled rows in current results
int32_t
numOfTags
;
// number of tag
s
int32_t
numOfCols
;
// number of columns, including the tags columns
int32_t
rowSize
;
// size of each row
SInterval
interval
;
char
*
prevValues
;
// previous row of data, to generate the interpolation results
char
*
nextValues
;
// next row of data
char
**
pData
;
// original result data block involved in filling data
int32_t
capacityInRows
;
// data buffer size in rows
int8_t
precision
;
// time resoluation
SFillColInfo
*
pFillCol
;
// column info for fill operations
char
*
prevValues
;
// previous row of data, to generate the interpolation results
char
*
nextValues
;
// next row of data
char
**
pData
;
// original result data block involved in filling data
int32_t
alloc
;
// data buffer size in rows
int8_t
precision
;
// time resoluation
SFillColInfo
*
pFillCol
;
// column info for fill operations
SFillTagColInfo
*
pTags
;
// tags value for filling gap
void
*
handle
;
// for dubug purpose
}
SFillInfo
;
typedef
struct
SPoint
{
...
...
@@ -66,7 +70,7 @@ typedef struct SPoint {
SFillInfo
*
taosInitFillInfo
(
int32_t
order
,
TSKEY
skey
,
int32_t
numOfTags
,
int32_t
capacity
,
int32_t
numOfCols
,
int64_t
slidingTime
,
int8_t
slidingUnit
,
int8_t
precision
,
int32_t
fillType
,
SFillColInfo
*
pFillCol
);
SFillColInfo
*
pFillCol
,
void
*
handle
);
void
taosResetFillInfo
(
SFillInfo
*
pFillInfo
,
TSKEY
startTimestamp
);
...
...
@@ -74,17 +78,17 @@ void* taosDestroyFillInfo(SFillInfo *pFillInfo);
void
taosFillSetStartInfo
(
SFillInfo
*
pFillInfo
,
int32_t
numOfRows
,
TSKEY
endKey
);
void
taosFillCopyInputDataFromFilePage
(
SFillInfo
*
pFillInfo
,
tFilePage
**
pInput
);
void
taosFillCopyInputDataFromFilePage
(
SFillInfo
*
pFillInfo
,
const
tFilePage
**
pInput
);
void
taosFillCopyInputDataFromOneFilePage
(
SFillInfo
*
pFillInfo
,
tFilePage
*
pInput
);
void
taosFillCopyInputDataFromOneFilePage
(
SFillInfo
*
pFillInfo
,
const
tFilePage
*
pInput
);
int64_t
get
FilledNumOfRes
(
SFillInfo
*
pFillInfo
,
int64_t
ekey
,
int32_t
maxNumOfRows
);
int64_t
get
NumOfResWithFill
(
SFillInfo
*
pFillInfo
,
int64_t
ekey
,
int32_t
maxNumOfRows
);
int32_t
taosNumOfRemainRows
(
SFillInfo
*
pFillInfo
);
int32_t
taosGetLinearInterpolationVal
(
int32_t
type
,
SPoint
*
point1
,
SPoint
*
point2
,
SPoint
*
point
);
int64_t
taos
Generate
DataBlock
(
SFillInfo
*
pFillInfo
,
tFilePage
**
output
,
int32_t
capacity
);
int64_t
taos
FillResult
DataBlock
(
SFillInfo
*
pFillInfo
,
tFilePage
**
output
,
int32_t
capacity
);
#ifdef __cplusplus
}
...
...
src/query/inc/qSqlparser.h
浏览文件 @
9e87f232
...
...
@@ -20,10 +20,10 @@
extern
"C"
{
#endif
#include <tstrbuild.h>
#include "taos.h"
#include "taosmsg.h"
#include "tstoken.h"
#include "tstrbuild.h"
#include "tvariant.h"
#define ParseTOKENTYPE SStrToken
...
...
@@ -37,12 +37,6 @@ extern char tTokenTypeSwitcher[13];
(x) = tTokenTypeSwitcher[(x)]; \
} \
} while (0)
typedef
struct
tFieldList
{
int32_t
nField
;
int32_t
nAlloc
;
TAOS_FIELD
*
p
;
}
tFieldList
;
typedef
struct
SLimitVal
{
int64_t
limit
;
...
...
@@ -59,12 +53,6 @@ typedef struct tVariantListItem {
uint8_t
sortOrder
;
}
tVariantListItem
;
typedef
struct
tVariantList
{
int32_t
nExpr
;
/* Number of expressions on the list */
int32_t
nAlloc
;
/* Number of entries allocated below */
tVariantListItem
*
a
;
/* One entry for each expression */
}
tVariantList
;
typedef
struct
SIntervalVal
{
SStrToken
interval
;
SStrToken
offset
;
...
...
@@ -72,16 +60,16 @@ typedef struct SIntervalVal {
typedef
struct
SQuerySQL
{
struct
tSQLExprList
*
pSelection
;
// select clause
tVariantList
*
from
;
// from clause
SArray
*
from
;
// from clause SArray<tVariantListItem>
struct
tSQLExpr
*
pWhere
;
// where clause [optional]
tVariantList
*
pGroupby
;
// groupby clause, only for tags[optional]
tVariantList
*
pSortOrder
;
// orderby [optional]
SArray
*
pGroupby
;
// groupby clause, only for tags[optional], SArray<tVariantListItem>
SArray
*
pSortOrder
;
// orderby [optional], SArray<tVariantListItem>
SStrToken
interval
;
// interval [optional]
SStrToken
offset
;
// offset window [optional]
SStrToken
sliding
;
// sliding window [optional]
SLimitVal
limit
;
// limit offset [optional]
SLimitVal
slimit
;
// group limit offset [optional]
tVariantList
*
fillType
;
// fill type[optional]
SArray
*
fillType
;
// fill type[optional], SArray<tVariantListItem>
SStrToken
selectToken
;
// sql string
}
SQuerySQL
;
...
...
@@ -91,26 +79,25 @@ typedef struct SCreateTableSQL {
int8_t
type
;
// create normal table/from super table/ stream
struct
{
tFieldList
*
pTagColumns
;
// for normal table, pTagColumns = NULL;
tFieldList
*
pColumns
;
SArray
*
pTagColumns
;
// SArray<TAOS_FIELD>
SArray
*
pColumns
;
// SArray<TAOS_FIELD>
}
colInfo
;
struct
{
SStrToken
stableName
;
// super table name, for using clause
tVariantList
*
pTagVals
;
// create by using metric, tag value
STagData
tagdata
;
SStrToken
stableName
;
// super table name, for using clause
SArray
*
pTagVals
;
// create by using metric, tag value
STagData
tagdata
;
}
usingInfo
;
SQuerySQL
*
pSelect
;
SQuerySQL
*
pSelect
;
}
SCreateTableSQL
;
typedef
struct
SAlterTableSQL
{
SStrToken
name
;
int16_t
type
;
STagData
tagData
;
tFieldList
*
pAddColumns
;
tVariantList
*
varList
;
// set t=val or: change src dst
SArray
*
pAddColumns
;
// SArray<TAOS_FIELD>
SArray
*
varList
;
// set t=val or: change src dst, SArray<tVariantListItem>
}
SAlterTableSQL
;
typedef
struct
SCreateDBInfo
{
...
...
@@ -131,7 +118,7 @@ typedef struct SCreateDBInfo {
bool
ignoreExists
;
int8_t
update
;
tVariantList
*
keep
;
SArray
*
keep
;
}
SCreateDBInfo
;
typedef
struct
SCreateAcctSQL
{
...
...
@@ -169,7 +156,7 @@ typedef struct tDCLSQL {
SCreateDBInfo
dbOpt
;
SCreateAcctSQL
acctOpt
;
SShowInfo
showOpt
;
SStrToken
ip
;
SStrToken
ip
;
};
SUserInfo
user
;
...
...
@@ -182,33 +169,32 @@ typedef struct SSubclauseInfo { // "UNION" multiple select sub-clause
}
SSubclauseInfo
;
typedef
struct
SSqlInfo
{
int32_t
type
;
bool
valid
;
int32_t
type
;
bool
valid
;
union
{
SCreateTableSQL
*
pCreateTableInfo
;
SAlterTableSQL
*
pAlterInfo
;
tDCLSQL
*
pDCLInfo
;
SAlterTableSQL
*
pAlterInfo
;
tDCLSQL
*
pDCLInfo
;
};
SSubclauseInfo
subclauseInfo
;
char
pzErrMsg
[
256
];
SSubclauseInfo
subclauseInfo
;
char
pzErrMsg
[
256
];
}
SSqlInfo
;
typedef
struct
tSQLExpr
{
// TK_FUNCTION: sql function, TK_LE: less than(binary expr)
uint32_t
nSQLOptr
;
uint32_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
SStrToken
operand
;
SStrToken
colInfo
;
// field id
tVariant
val
;
// value only for string, float, int
SStrToken
operand
;
SStrToken
colInfo
;
// field id
tVariant
val
;
// value only for string, float, int
SStrToken
token
;
// original sql expr string
struct
tSQLExpr
*
pLeft
;
// left child
struct
tSQLExpr
*
pRight
;
// right child
struct
tSQLExprList
*
pParam
;
// function parameters
SStrToken
token
;
// original sql expr string
}
tSQLExpr
;
// used in select clause. select <tSQLExprList> from xxx
...
...
@@ -239,16 +225,9 @@ void Parse(void *yyp, int yymajor, ParseTOKENTYPE yyminor, SSqlInfo *);
*/
void
ParseFree
(
void
*
p
,
void
(
*
freeProc
)(
void
*
));
tVariantList
*
tVariantListAppend
(
tVariantList
*
pList
,
tVariant
*
pVar
,
uint8_t
sortOrder
);
tVariantList
*
tVariantListInsert
(
tVariantList
*
pList
,
tVariant
*
pVar
,
uint8_t
sortOrder
,
int32_t
index
);
tVariantList
*
tVariantListAppendToken
(
tVariantList
*
pList
,
SStrToken
*
pAliasToken
,
uint8_t
sortOrder
);
void
tVariantListDestroy
(
tVariantList
*
pList
);
tFieldList
*
tFieldListAppend
(
tFieldList
*
pList
,
TAOS_FIELD
*
pField
);
void
tFieldListDestroy
(
tFieldList
*
pList
);
SArray
*
tVariantListAppend
(
SArray
*
pList
,
tVariant
*
pVar
,
uint8_t
sortOrder
);
SArray
*
tVariantListInsert
(
SArray
*
pList
,
tVariant
*
pVar
,
uint8_t
sortOrder
,
int32_t
index
);
SArray
*
tVariantListAppendToken
(
SArray
*
pList
,
SStrToken
*
pAliasToken
,
uint8_t
sortOrder
);
tSQLExpr
*
tSQLExprCreate
(
tSQLExpr
*
pLeft
,
tSQLExpr
*
pRight
,
int32_t
optType
);
...
...
@@ -258,17 +237,16 @@ tSQLExprList *tSQLExprListAppend(tSQLExprList *pList, tSQLExpr *pNode, SStrToken
void
tSQLExprListDestroy
(
tSQLExprList
*
pList
);
SQuerySQL
*
tSetQuerySQLElems
(
SStrToken
*
pSelectToken
,
tSQLExprList
*
pSelection
,
tVariantList
*
pFrom
,
tSQLExpr
*
pWhere
,
tVariantList
*
pGroupby
,
tVariantList
*
pSortOrder
,
SIntervalVal
*
pInterval
,
SStrToken
*
pSliding
,
tVariantList
*
pFill
,
SLimitVal
*
pLimit
,
SLimitVal
*
pGLimit
);
SQuerySQL
*
tSetQuerySQLElems
(
SStrToken
*
pSelectToken
,
tSQLExprList
*
pSelection
,
SArray
*
pFrom
,
tSQLExpr
*
pWhere
,
SArray
*
pGroupby
,
SArray
*
pSortOrder
,
SIntervalVal
*
pInterval
,
SStrToken
*
pSliding
,
SArray
*
pFill
,
SLimitVal
*
pLimit
,
SLimitVal
*
pGLimit
);
SCreateTableSQL
*
tSetCreateSQLElems
(
tFieldList
*
pCols
,
tFieldList
*
pTags
,
SStrToken
*
pMetricName
,
tVariantList
*
pTagVals
,
SQuerySQL
*
pSelect
,
int32_t
type
);
SCreateTableSQL
*
tSetCreateSQLElems
(
SArray
*
pCols
,
SArray
*
pTags
,
SStrToken
*
pMetricName
,
SArray
*
pTagVals
,
SQuerySQL
*
pSelect
,
int32_t
type
);
void
tSQLExprNodeDestroy
(
tSQLExpr
*
pExpr
);
tSQLExpr
*
tSQLExprNodeClone
(
tSQLExpr
*
pExpr
);
void
tSQLExprNodeDestroy
(
tSQLExpr
*
pExpr
);
SAlterTableSQL
*
tAlterTableSQLElems
(
SStrToken
*
pMeterName
,
tFieldList
*
pCols
,
tVariantList
*
pVals
,
int32_t
type
);
SAlterTableSQL
*
tAlterTableSQLElems
(
SStrToken
*
pMeterName
,
SArray
*
pCols
,
SArray
*
pVals
,
int32_t
type
);
void
destroyAllSelectClause
(
SSubclauseInfo
*
pSql
);
void
doDestroyQuerySql
(
SQuerySQL
*
pSql
);
...
...
@@ -310,9 +288,6 @@ void tSQLSetColumnType(TAOS_FIELD *pField, SStrToken *pToken);
void
*
ParseAlloc
(
void
*
(
*
mallocProc
)(
size_t
));
// convert the sql filter expression into binary data
int32_t
tSQLExprToBinary
(
tSQLExpr
*
pExpr
,
SStringBuilder
*
sb
);
enum
{
TSQL_NODE_TYPE_EXPR
=
0x1
,
TSQL_NODE_TYPE_ID
=
0x2
,
...
...
src/query/inc/sql.y
浏览文件 @
9e87f232
...
...
@@ -223,8 +223,8 @@ acct_optr(Y) ::= pps(C) tseries(D) storage(P) streams(F) qtime(Q) dbs(E) users(K
Y.stat = M;
}
%type keep {
tVariantList
*}
%destructor keep {t
VariantList
Destroy($$);}
%type keep {
SArray
*}
%destructor keep {t
aosArray
Destroy($$);}
keep(Y) ::= KEEP tagitemlist(X). { Y = X; }
cache(Y) ::= CACHE INTEGER(X). { Y = X; }
...
...
@@ -327,10 +327,10 @@ create_table_args(A) ::= AS select(S). {
}
%type column{TAOS_FIELD}
%type columnlist{
tFieldList
*}
%destructor columnlist {t
FieldList
Destroy($$);}
columnlist(A) ::= columnlist(X) COMMA column(Y). {
A = tFieldListAppend(X, &Y);
}
columnlist(A) ::= column(X). {A = t
FieldListAppend(NULL
, &X);}
%type columnlist{
SArray
*}
%destructor columnlist {t
aosArray
Destroy($$);}
columnlist(A) ::= columnlist(X) COMMA column(Y). {
taosArrayPush(X, &Y); A = X;
}
columnlist(A) ::= column(X). {A = t
aosArrayInit(4, sizeof(TAOS_FIELD)); taosArrayPush(A
, &X);}
// The information used for a column is the name and type of column:
// tinyint smallint int bigint float double bool timestamp binary(x) nchar(x)
...
...
@@ -338,8 +338,8 @@ column(A) ::= ids(X) typename(Y). {
tSQLSetColumnInfo(&A, &X, &Y);
}
%type tagitemlist {
tVariantList
*}
%destructor tagitemlist {t
VariantList
Destroy($$);}
%type tagitemlist {
SArray
*}
%destructor tagitemlist {t
aosArray
Destroy($$);}
%type tagitem {tVariant}
tagitemlist(A) ::= tagitemlist(X) COMMA tagitem(Y). { A = tVariantListAppend(X, &Y, -1); }
...
...
@@ -432,11 +432,11 @@ as(X) ::= ids(Y). { X = Y; }
as(X) ::= . { X.n = 0; }
// A complete FROM clause.
%type from {
tVariantList
*}
%type from {
SArray
*}
// current not support query from no-table
from(A) ::= FROM tablelist(X). {A = X;}
%type tablelist {
tVariantList
*}
%type tablelist {
SArray
*}
tablelist(A) ::= ids(X) cpxName(Y). {
toTSDBType(X.type);
X.n += Y.n;
...
...
@@ -476,8 +476,8 @@ interval_opt(N) ::= INTERVAL LP tmvar(E) RP. {N.interval = E; N.offset.n = 0;
interval_opt(N) ::= INTERVAL LP tmvar(E) COMMA tmvar(O) RP. {N.interval = E; N.offset = O;}
interval_opt(N) ::= . {memset(&N, 0, sizeof(N));}
%type fill_opt {
tVariantList
*}
%destructor fill_opt {t
VariantList
Destroy($$);}
%type fill_opt {
SArray
*}
%destructor fill_opt {t
aosArray
Destroy($$);}
fill_opt(N) ::= . {N = 0; }
fill_opt(N) ::= FILL LP ID(Y) COMMA tagitemlist(X) RP. {
tVariant A = {0};
...
...
@@ -497,11 +497,11 @@ fill_opt(N) ::= FILL LP ID(Y) RP. {
sliding_opt(K) ::= SLIDING LP tmvar(E) RP. {K = E; }
sliding_opt(K) ::= . {K.n = 0; K.z = NULL; K.type = 0; }
%type orderby_opt {
tVariantList
*}
%destructor orderby_opt {t
VariantList
Destroy($$);}
%type orderby_opt {
SArray
*}
%destructor orderby_opt {t
aosArray
Destroy($$);}
%type sortlist {
tVariantList
*}
%destructor sortlist {t
VariantList
Destroy($$);}
%type sortlist {
SArray
*}
%destructor sortlist {t
aosArray
Destroy($$);}
%type sortitem {tVariant}
%destructor sortitem {tVariantDestroy(&$$);}
...
...
@@ -531,10 +531,10 @@ sortorder(A) ::= DESC. {A = TSDB_ORDER_DESC;}
sortorder(A) ::= . {A = TSDB_ORDER_ASC;} //default is descend order
//group by clause
%type groupby_opt {
tVariantList
*}
%destructor groupby_opt {t
VariantList
Destroy($$);}
%type grouplist {
tVariantList
*}
%destructor grouplist {t
VariantList
Destroy($$);}
%type groupby_opt {
SArray
*}
%destructor groupby_opt {t
aosArray
Destroy($$);}
%type grouplist {
SArray
*}
%destructor grouplist {t
aosArray
Destroy($$);}
groupby_opt(A) ::= . {A = 0;}
groupby_opt(A) ::= GROUP BY grouplist(X). {A = X;}
...
...
@@ -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). {A.limit = X; 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) OFFSET signed(Y).
{A.limit = X; A.offset = Y;}
{
printf("aa2\n, %d\n", X);
A.limit = X; A.offset = Y;}
limit_opt(A) ::= LIMIT signed(X) COMMA signed(Y).
{A.limit = Y; A.offset = X;}
{
printf("aa3\n, %d\n", X);
A.limit = Y; A.offset = X;}
%type slimit_opt {SLimitVal}
slimit_opt(A) ::= . {A.limit = -1; A.offset = 0;}
...
...
@@ -657,7 +657,7 @@ cmd ::= ALTER TABLE ids(X) cpxName(F) DROP COLUMN ids(A). {
X.n += F.n;
toTSDBType(A.type);
tVariantList
* K = tVariantListAppendToken(NULL, &A, -1);
SArray
* K = tVariantListAppendToken(NULL, &A, -1);
SAlterTableSQL* pAlterTable = tAlterTableSQLElems(&X, NULL, K, TSDB_ALTER_TABLE_DROP_COLUMN);
setSQLInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
...
...
@@ -673,7 +673,7 @@ cmd ::= ALTER TABLE ids(X) cpxName(Z) DROP TAG ids(Y). {
X.n += Z.n;
toTSDBType(Y.type);
tVariantList
* A = tVariantListAppendToken(NULL, &Y, -1);
SArray
* A = tVariantListAppendToken(NULL, &Y, -1);
SAlterTableSQL* pAlterTable = tAlterTableSQLElems(&X, NULL, A, TSDB_ALTER_TABLE_DROP_TAG_COLUMN);
setSQLInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
...
...
@@ -683,7 +683,7 @@ cmd ::= ALTER TABLE ids(X) cpxName(F) CHANGE TAG ids(Y) ids(Z). {
X.n += F.n;
toTSDBType(Y.type);
tVariantList
* A = tVariantListAppendToken(NULL, &Y, -1);
SArray
* A = tVariantListAppendToken(NULL, &Y, -1);
toTSDBType(Z.type);
A = tVariantListAppendToken(A, &Z, -1);
...
...
@@ -696,7 +696,7 @@ cmd ::= ALTER TABLE ids(X) cpxName(F) SET TAG ids(Y) EQ tagitem(Z). {
X.n += F.n;
toTSDBType(Y.type);
tVariantList
* A = tVariantListAppendToken(NULL, &Y, -1);
SArray
* A = tVariantListAppendToken(NULL, &Y, -1);
A = tVariantListAppend(A, &Z, -1);
SAlterTableSQL* pAlterTable = tAlterTableSQLElems(&X, NULL, A, TSDB_ALTER_TABLE_UPDATE_TAG_VAL);
...
...
src/query/src/qAst.c
浏览文件 @
9e87f232
...
...
@@ -13,12 +13,10 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "os.h"
#include "exception.h"
#include "qAst.h"
#include "qSqlparser.h"
#include "qSyntaxtreefunction.h"
#include "taosdef.h"
#include "taosmsg.h"
...
...
@@ -30,200 +28,19 @@
#include "tskiplist.h"
#include "tsqlfunction.h"
#include "tstoken.h"
#include "ttokendef.h"
#include "tulog.h"
/*
*
* @date 2018-2-15
* @version 0.2 operation for column filter
*
* @Description parse tag query expression to build ast
* ver 0.2, filter the result on first column with high priority to limit the candidate set
* ver 0.3, pipeline filter in the form of: (a+2)/9 > 14
*
*/
static
tExprNode
*
tExprNodeCreate
(
SSchema
*
pSchema
,
int32_t
numOfCols
,
SStrToken
*
pToken
);
static
tExprNode
*
createSyntaxTree
(
SSchema
*
pSchema
,
int32_t
numOfCols
,
char
*
str
,
int32_t
*
i
);
static
void
destroySyntaxTree
(
tExprNode
*
);
static
uint8_t
isQueryOnPrimaryKey
(
const
char
*
primaryColumnName
,
const
tExprNode
*
pLeft
,
const
tExprNode
*
pRight
);
/*
* Check the filter value type on the right hand side based on the column id on the left hand side,
* the filter value type must be identical to field type for relational operation
* As for binary arithmetic operation, it is not necessary to do so.
*/
static
void
reviseBinaryExprIfNecessary
(
tExprNode
**
pLeft
,
tExprNode
**
pRight
,
uint8_t
*
optr
)
{
if
(
*
optr
>=
TSDB_RELATION_LESS
&&
*
optr
<=
TSDB_RELATION_LIKE
)
{
// make sure that the type of data on both sides of relational comparision are identical
if
((
*
pLeft
)
->
nodeType
==
TSQL_NODE_VALUE
)
{
tVariantTypeSetType
((
*
pLeft
)
->
pVal
,
(
*
pRight
)
->
pSchema
->
type
);
}
else
if
((
*
pRight
)
->
nodeType
==
TSQL_NODE_VALUE
)
{
tVariantTypeSetType
((
*
pRight
)
->
pVal
,
(
*
pLeft
)
->
pSchema
->
type
);
}
}
else
if
(
*
optr
>=
TSDB_BINARY_OP_ADD
&&
*
optr
<=
TSDB_BINARY_OP_REMAINDER
)
{
if
((
*
pLeft
)
->
nodeType
==
TSQL_NODE_VALUE
)
{
/* convert to int/bigint may cause the precision loss */
tVariantTypeSetType
((
*
pLeft
)
->
pVal
,
TSDB_DATA_TYPE_DOUBLE
);
}
else
if
((
*
pRight
)
->
nodeType
==
TSQL_NODE_VALUE
)
{
/* convert to int/bigint may cause the precision loss */
tVariantTypeSetType
((
*
pRight
)
->
pVal
,
TSDB_DATA_TYPE_DOUBLE
);
}
}
/*
* for expressions that are suitable for switch principle,
* switch left and left and right hand side in expr if possible
*/
if
((
*
pLeft
)
->
nodeType
==
TSQL_NODE_VALUE
&&
(
*
pRight
)
->
nodeType
==
TSQL_NODE_COL
)
{
if
(
*
optr
>=
TSDB_RELATION_GREATER
&&
*
optr
<=
TSDB_RELATION_GREATER_EQUAL
&&
*
optr
!=
TSDB_RELATION_EQUAL
)
{
SWAP
(
*
pLeft
,
*
pRight
,
tExprNode
*
);
}
switch
(
*
optr
)
{
case
TSDB_RELATION_GREATER
:
(
*
optr
)
=
TSDB_RELATION_LESS
;
break
;
case
TSDB_RELATION_LESS
:
(
*
optr
)
=
TSDB_RELATION_GREATER
;
break
;
case
TSDB_RELATION_GREATER_EQUAL
:
(
*
optr
)
=
TSDB_RELATION_LESS_EQUAL
;
break
;
case
TSDB_RELATION_LESS_EQUAL
:
(
*
optr
)
=
TSDB_RELATION_GREATER_EQUAL
;
break
;
default:
;
// for other type of operations, do nothing
}
}
}
static
tExprNode
*
tExprNodeCreate
(
SSchema
*
pSchema
,
int32_t
numOfCols
,
SStrToken
*
pToken
)
{
/* if the token is not a value, return false */
if
(
pToken
->
type
==
TK_RP
||
(
pToken
->
type
!=
TK_INTEGER
&&
pToken
->
type
!=
TK_FLOAT
&&
pToken
->
type
!=
TK_ID
&&
pToken
->
type
!=
TK_TBNAME
&&
pToken
->
type
!=
TK_STRING
&&
pToken
->
type
!=
TK_BOOL
))
{
return
NULL
;
}
size_t
nodeSize
=
sizeof
(
tExprNode
);
tExprNode
*
pNode
=
NULL
;
if
(
pToken
->
type
==
TK_ID
||
pToken
->
type
==
TK_TBNAME
)
{
int32_t
i
=
0
;
if
(
pToken
->
type
==
TK_ID
)
{
do
{
SStrToken
tableToken
=
{
0
};
extractTableNameFromToken
(
pToken
,
&
tableToken
);
size_t
len
=
strlen
(
pSchema
[
i
].
name
);
if
(
strncmp
(
pToken
->
z
,
pSchema
[
i
].
name
,
pToken
->
n
)
==
0
&&
pToken
->
n
==
len
)
break
;
}
while
(
++
i
<
numOfCols
);
if
(
i
==
numOfCols
)
{
// column name is not valid, parse the expression failed
return
NULL
;
}
}
nodeSize
+=
sizeof
(
SSchema
);
#include "tschemautil.h"
pNode
=
calloc
(
1
,
nodeSize
);
pNode
->
pSchema
=
(
struct
SSchema
*
)((
char
*
)
pNode
+
sizeof
(
tExprNode
));
pNode
->
nodeType
=
TSQL_NODE_COL
;
if
(
pToken
->
type
==
TK_ID
)
{
memcpy
(
pNode
->
pSchema
,
&
pSchema
[
i
],
sizeof
(
SSchema
));
}
else
{
pNode
->
pSchema
->
type
=
TSDB_DATA_TYPE_BINARY
;
pNode
->
pSchema
->
bytes
=
TSDB_TABLE_NAME_LEN
-
1
;
strcpy
(
pNode
->
pSchema
->
name
,
TSQL_TBNAME_L
);
pNode
->
pSchema
->
colId
=
-
1
;
}
}
else
{
nodeSize
+=
sizeof
(
tVariant
);
pNode
=
calloc
(
1
,
nodeSize
);
pNode
->
pVal
=
(
tVariant
*
)((
char
*
)
pNode
+
sizeof
(
tExprNode
));
toTSDBType
(
pToken
->
type
);
tVariantCreate
(
pNode
->
pVal
,
pToken
);
pNode
->
nodeType
=
TSQL_NODE_VALUE
;
}
return
pNode
;
}
uint8_t
getBinaryExprOptr
(
SStrToken
*
pToken
)
{
switch
(
pToken
->
type
)
{
case
TK_LT
:
return
TSDB_RELATION_LESS
;
case
TK_LE
:
return
TSDB_RELATION_LESS_EQUAL
;
case
TK_GT
:
return
TSDB_RELATION_GREATER
;
case
TK_GE
:
return
TSDB_RELATION_GREATER_EQUAL
;
case
TK_NE
:
return
TSDB_RELATION_NOT_EQUAL
;
case
TK_AND
:
return
TSDB_RELATION_AND
;
case
TK_OR
:
return
TSDB_RELATION_OR
;
case
TK_EQ
:
return
TSDB_RELATION_EQUAL
;
case
TK_PLUS
:
return
TSDB_BINARY_OP_ADD
;
case
TK_MINUS
:
return
TSDB_BINARY_OP_SUBTRACT
;
case
TK_STAR
:
return
TSDB_BINARY_OP_MULTIPLY
;
case
TK_SLASH
:
case
TK_DIVIDE
:
return
TSDB_BINARY_OP_DIVIDE
;
case
TK_REM
:
return
TSDB_BINARY_OP_REMAINDER
;
case
TK_LIKE
:
return
TSDB_RELATION_LIKE
;
case
TK_ISNULL
:
return
TSDB_RELATION_ISNULL
;
case
TK_NOTNULL
:
return
TSDB_RELATION_NOTNULL
;
default:
{
return
0
;
}
}
}
// previous generated expr is reduced as the left child
static
tExprNode
*
parseRemainStr
(
char
*
pstr
,
tExprNode
*
pExpr
,
SSchema
*
pSchema
,
int32_t
optr
,
int32_t
numOfCols
,
int32_t
*
i
)
{
// set the previous generated node as the left child of new root
pExpr
->
nodeType
=
TSQL_NODE_EXPR
;
// remain is the right child
tExprNode
*
pRight
=
createSyntaxTree
(
pSchema
,
numOfCols
,
pstr
,
i
);
if
(
pRight
==
NULL
||
(
pRight
->
nodeType
==
TSQL_NODE_COL
&&
pExpr
->
nodeType
!=
TSQL_NODE_VALUE
)
||
(
pExpr
->
nodeType
==
TSQL_NODE_VALUE
&&
pRight
->
nodeType
!=
TSQL_NODE_COL
))
{
tExprNodeDestroy
(
pExpr
,
NULL
);
tExprNodeDestroy
(
pRight
,
NULL
);
return
NULL
;
}
tExprNode
*
pNewExpr
=
(
tExprNode
*
)
calloc
(
1
,
sizeof
(
tExprNode
));
uint8_t
k
=
optr
;
reviseBinaryExprIfNecessary
(
&
pExpr
,
&
pRight
,
&
k
);
pNewExpr
->
_node
.
pLeft
=
pExpr
;
pNewExpr
->
_node
.
pRight
=
pRight
;
pNewExpr
->
_node
.
optr
=
k
;
pNewExpr
->
_node
.
hasPK
=
isQueryOnPrimaryKey
(
pSchema
[
0
].
name
,
pExpr
,
pRight
);
pNewExpr
->
nodeType
=
TSQL_NODE_EXPR
;
typedef
struct
{
char
*
v
;
int32_t
optr
;
}
SEndPoint
;
return
pNewExpr
;
}
typedef
struct
{
SEndPoint
*
start
;
SEndPoint
*
end
;
}
SQueryCond
;
uint8_t
isQueryOnPrimaryKey
(
const
char
*
primaryColumnName
,
const
tExprNode
*
pLeft
,
const
tExprNode
*
pRight
)
{
static
uint8_t
UNUSED_FUNC
isQueryOnPrimaryKey
(
const
char
*
primaryColumnName
,
const
tExprNode
*
pLeft
,
const
tExprNode
*
pRight
)
{
if
(
pLeft
->
nodeType
==
TSQL_NODE_COL
)
{
// if left node is the primary column,return true
return
(
strcmp
(
primaryColumnName
,
pLeft
->
pSchema
->
name
)
==
0
)
?
1
:
0
;
...
...
@@ -236,103 +53,6 @@ uint8_t isQueryOnPrimaryKey(const char *primaryColumnName, const tExprNode *pLef
}
}
static
tExprNode
*
createSyntaxTree
(
SSchema
*
pSchema
,
int32_t
numOfCols
,
char
*
str
,
int32_t
*
i
)
{
SStrToken
t0
=
tStrGetToken
(
str
,
i
,
false
,
0
,
NULL
);
if
(
t0
.
n
==
0
)
{
return
NULL
;
}
tExprNode
*
pLeft
=
NULL
;
if
(
t0
.
type
==
TK_LP
)
{
// start new left child branch
pLeft
=
createSyntaxTree
(
pSchema
,
numOfCols
,
str
,
i
);
}
else
{
if
(
t0
.
type
==
TK_RP
)
{
return
NULL
;
}
pLeft
=
tExprNodeCreate
(
pSchema
,
numOfCols
,
&
t0
);
}
if
(
pLeft
==
NULL
)
{
return
NULL
;
}
t0
=
tStrGetToken
(
str
,
i
,
false
,
0
,
NULL
);
if
(
t0
.
n
==
0
||
t0
.
type
==
TK_RP
)
{
if
(
pLeft
->
nodeType
!=
TSQL_NODE_EXPR
)
{
// if left is not the expr, it is not a legal expr
tExprNodeDestroy
(
pLeft
,
NULL
);
return
NULL
;
}
return
pLeft
;
}
// get the operator of expr
uint8_t
optr
=
getBinaryExprOptr
(
&
t0
);
if
(
optr
==
0
)
{
uError
(
"not support binary operator:%d"
,
t0
.
type
);
tExprNodeDestroy
(
pLeft
,
NULL
);
return
NULL
;
}
assert
(
pLeft
!=
NULL
);
tExprNode
*
pRight
=
NULL
;
if
(
t0
.
type
==
TK_AND
||
t0
.
type
==
TK_OR
||
t0
.
type
==
TK_LP
)
{
pRight
=
createSyntaxTree
(
pSchema
,
numOfCols
,
str
,
i
);
}
else
{
/*
* In case that pLeft is a field identification,
* we parse the value in expression according to queried field type,
* if we do not get the information, in case of value of field presented first,
* we revised the value after the binary expression is completed.
*/
t0
=
tStrGetToken
(
str
,
i
,
true
,
0
,
NULL
);
if
(
t0
.
n
==
0
)
{
tExprNodeDestroy
(
pLeft
,
NULL
);
// illegal expression
return
NULL
;
}
if
(
t0
.
type
==
TK_LP
)
{
pRight
=
createSyntaxTree
(
pSchema
,
numOfCols
,
str
,
i
);
}
else
{
pRight
=
tExprNodeCreate
(
pSchema
,
numOfCols
,
&
t0
);
}
}
if
(
pRight
==
NULL
)
{
tExprNodeDestroy
(
pLeft
,
NULL
);
return
NULL
;
}
/* create binary expr as the child of new parent node */
tExprNode
*
pExpr
=
(
tExprNode
*
)
calloc
(
1
,
sizeof
(
tExprNode
));
reviseBinaryExprIfNecessary
(
&
pLeft
,
&
pRight
,
&
optr
);
pExpr
->
_node
.
hasPK
=
isQueryOnPrimaryKey
(
pSchema
[
0
].
name
,
pLeft
,
pRight
);
pExpr
->
_node
.
pLeft
=
pLeft
;
pExpr
->
_node
.
pRight
=
pRight
;
pExpr
->
_node
.
optr
=
optr
;
t0
=
tStrGetToken
(
str
,
i
,
true
,
0
,
NULL
);
if
(
t0
.
n
==
0
||
t0
.
type
==
TK_RP
)
{
pExpr
->
nodeType
=
TSQL_NODE_EXPR
;
return
pExpr
;
}
else
{
uint8_t
localOptr
=
getBinaryExprOptr
(
&
t0
);
if
(
localOptr
==
0
)
{
uError
(
"not support binary operator:%d"
,
t0
.
type
);
free
(
pExpr
);
return
NULL
;
}
return
parseRemainStr
(
str
,
pExpr
,
pSchema
,
localOptr
,
numOfCols
,
i
);
}
}
static
void
UNUSED_FUNC
destroySyntaxTree
(
tExprNode
*
pNode
)
{
tExprNodeDestroy
(
pNode
,
NULL
);
}
void
tExprNodeDestroy
(
tExprNode
*
pNode
,
void
(
*
fp
)(
void
*
))
{
if
(
pNode
==
NULL
)
{
return
;
...
...
@@ -372,16 +92,6 @@ void tExprTreeDestroy(tExprNode **pExpr, void (*fp)(void *)) {
*
pExpr
=
NULL
;
}
typedef
struct
{
char
*
v
;
int32_t
optr
;
}
SEndPoint
;
typedef
struct
{
SEndPoint
*
start
;
SEndPoint
*
end
;
}
SQueryCond
;
// todo check for malloc failure
static
int32_t
setQueryCond
(
tQueryInfo
*
queryColInfo
,
SQueryCond
*
pCond
)
{
int32_t
optr
=
queryColInfo
->
optr
;
...
...
@@ -395,13 +105,10 @@ static int32_t setQueryCond(tQueryInfo *queryColInfo, SQueryCond* pCond) {
pCond
->
end
=
calloc
(
1
,
sizeof
(
SEndPoint
));
pCond
->
end
->
optr
=
queryColInfo
->
optr
;
pCond
->
end
->
v
=
queryColInfo
->
q
;
}
else
if
(
optr
==
TSDB_RELATION_IN
)
{
printf
(
"relation is in
\n
"
);
assert
(
0
);
}
else
if
(
optr
==
TSDB_RELATION_LIKE
)
{
printf
(
"relation is like
\n
"
);
}
else
if
(
optr
==
TSDB_RELATION_IN
||
optr
==
TSDB_RELATION_LIKE
)
{
assert
(
0
);
}
return
TSDB_CODE_SUCCESS
;
}
...
...
@@ -529,99 +236,6 @@ static void tQueryIndexColumn(SSkipList* pSkipList, tQueryInfo* pQueryInfo, SArr
tSkipListDestroyIter
(
iter
);
}
int32_t
merge
(
SArray
*
pLeft
,
SArray
*
pRight
,
SArray
*
pFinalRes
)
{
// assert(pFinalRes->pRes == 0);
//
// pFinalRes->pRes = calloc((size_t)(pLeft->num + pRight->num), POINTER_BYTES);
// pFinalRes->num = 0;
//
// // sort according to address
// tSkipListNode **pLeftNodes = (tSkipListNode **)pLeft->pRes;
// qsort(pLeftNodes, pLeft->num, sizeof(pLeft->pRes[0]), compareByAddr);
//
// tSkipListNode **pRightNodes = (tSkipListNode **)pRight->pRes;
// qsort(pRightNodes, pRight->num, sizeof(pRight->pRes[0]), compareByAddr);
//
// int32_t i = 0, j = 0;
//
// // merge two sorted arrays in O(n) time
// while (i < pLeft->num && j < pRight->num) {
// int64_t ret = (int64_t)pLeftNodes[i] - (int64_t)pRightNodes[j];
//
// if (ret < 0) {
// pFinalRes->pRes[pFinalRes->num++] = pLeftNodes[i++];
// } else if (ret > 0) {
// pFinalRes->pRes[pFinalRes->num++] = pRightNodes[j++];
// } else { // pNode->key > pkey[i]
// pFinalRes->pRes[pFinalRes->num++] = pRightNodes[j++];
// i++;
// }
// }
//
// while (i < pLeft->num) {
// pFinalRes->pRes[pFinalRes->num++] = pLeftNodes[i++];
// }
//
// while (j < pRight->num) {
// pFinalRes->pRes[pFinalRes->num++] = pRightNodes[j++];
// }
//
// return pFinalRes->num;
return
0
;
}
int32_t
intersect
(
SArray
*
pLeft
,
SArray
*
pRight
,
SArray
*
pFinalRes
)
{
// int64_t num = MIN(pLeft->num, pRight->num);
//
// assert(pFinalRes->pRes == 0);
//
// pFinalRes->pRes = calloc(num, POINTER_BYTES);
// pFinalRes->num = 0;
//
// // sort according to address
// tSkipListNode **pLeftNodes = (tSkipListNode **)pLeft->pRes;
// qsort(pLeftNodes, pLeft->num, sizeof(pLeft->pRes[0]), compareByAddr);
//
// tSkipListNode **pRightNodes = (tSkipListNode **)pRight->pRes;
// qsort(pRightNodes, pRight->num, sizeof(pRight->pRes[0]), compareByAddr);
//
// int32_t i = 0, j = 0;
// // merge two sorted arrays in O(n) time
// while (i < pLeft->num && j < pRight->num) {
// int64_t ret = (int64_t)pLeftNodes[i] - (int64_t)pRightNodes[j];
//
// if (ret < 0) {
// i++;
// } else if (ret > 0) {
// j++;
// } else { // pNode->key > pkey[i]
// pFinalRes->pRes[pFinalRes->num++] = pRightNodes[j];
// i++;
// j++;
// }
// }
//
// return pFinalRes->num;
return
0
;
}
/*
* traverse the result and apply the function to each item to check if the item is qualified or not
*/
static
UNUSED_FUNC
void
tArrayTraverse
(
tExprNode
*
pExpr
,
__result_filter_fn_t
fp
,
SArray
*
pResult
)
{
assert
(
pExpr
->
_node
.
pLeft
->
nodeType
==
TSQL_NODE_COL
&&
pExpr
->
_node
.
pRight
->
nodeType
==
TSQL_NODE_VALUE
&&
fp
!=
NULL
);
// scan the result array list and check for each item in the list
for
(
int32_t
i
=
0
;
i
<
taosArrayGetSize
(
pResult
);
++
i
)
{
void
*
item
=
taosArrayGet
(
pResult
,
i
);
if
(
fp
(
item
,
pExpr
->
_node
.
info
))
{
i
++
;
}
else
{
taosArrayRemove
(
pResult
,
i
);
}
}
}
static
bool
filterItem
(
tExprNode
*
pExpr
,
const
void
*
pItem
,
SExprTraverseSupp
*
param
)
{
tExprNode
*
pLeft
=
pExpr
->
_node
.
pLeft
;
tExprNode
*
pRight
=
pExpr
->
_node
.
pRight
;
...
...
@@ -649,32 +263,6 @@ static bool filterItem(tExprNode *pExpr, const void *pItem, SExprTraverseSupp *p
return
param
->
nodeFilterFn
(
pItem
,
pExpr
->
_node
.
info
);
}
/**
* Apply the filter expression on non-indexed tag columns to each element in the result list, which is generated
* by filtering on indexed tag column. So the whole result set only needs to be iterated once to generate
* result that is satisfied to the filter expression, no matter how the filter expression consisting of.
*
* @param pExpr filter expression on non-indexed tag columns.
* @param pResult results from filter on the indexed tag column, which is usually the first tag column
* @param pSchema tag schemas
* @param fp filter callback function
*/
static
UNUSED_FUNC
void
exprTreeTraverseImpl
(
tExprNode
*
pExpr
,
SArray
*
pResult
,
SExprTraverseSupp
*
param
)
{
size_t
size
=
taosArrayGetSize
(
pResult
);
SArray
*
array
=
taosArrayInit
(
size
,
POINTER_BYTES
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
void
*
pItem
=
taosArrayGetP
(
pResult
,
i
);
if
(
filterItem
(
pExpr
,
pItem
,
param
))
{
taosArrayPush
(
array
,
&
pItem
);
}
}
taosArrayCopy
(
pResult
,
array
);
taosArrayDestroy
(
array
);
}
static
void
tSQLBinaryTraverseOnSkipList
(
tExprNode
*
pExpr
,
SArray
*
pResult
,
SSkipList
*
pSkipList
,
SExprTraverseSupp
*
param
)
{
SSkipListIterator
*
iter
=
tSkipListCreateIter
(
pSkipList
);
...
...
@@ -750,7 +338,7 @@ void tExprTreeTraverse(tExprNode *pExpr, SSkipList *pSkipList, SArray *result, S
//apply the hierarchical expression to every node in skiplist for find the qualified nodes
tSQLBinaryTraverseOnSkipList
(
pExpr
,
result
,
pSkipList
,
param
);
#if 0
#if 0
/*
* (weight == 1 && pExpr->nSQLBinaryOptr == TSDB_RELATION_AND) is handled here
*
...
...
@@ -972,6 +560,7 @@ tExprNode* exprTreeFromBinary(const void* data, size_t size) {
if
(
size
==
0
)
{
return
NULL
;
}
SBufferReader
br
=
tbufInitReader
(
data
,
size
,
false
);
return
exprTreeFromBinaryImpl
(
&
br
);
}
...
...
@@ -995,10 +584,7 @@ tExprNode* exprTreeFromTableName(const char* tbnameCond) {
SSchema
*
pSchema
=
exception_calloc
(
1
,
sizeof
(
SSchema
));
left
->
pSchema
=
pSchema
;
pSchema
->
type
=
TSDB_DATA_TYPE_BINARY
;
pSchema
->
bytes
=
TSDB_TABLE_NAME_LEN
-
1
;
strcpy
(
pSchema
->
name
,
TSQL_TBNAME_L
);
pSchema
->
colId
=
-
1
;
*
pSchema
=
tscGetTbnameColumnSchema
();
tExprNode
*
right
=
exception_calloc
(
1
,
sizeof
(
tExprNode
));
expr
->
_node
.
pRight
=
right
;
...
...
src/query/src/qExecutor.c
浏览文件 @
9e87f232
...
...
@@ -170,8 +170,6 @@ static void getNextTimeWindow(SQuery* pQuery, STimeWindow* tw) {
tw
->
ekey
-=
1
;
}
#define GET_NEXT_TIMEWINDOW(_q, tw) getNextTimeWindow((_q), (tw))
#define SET_STABLE_QUERY_OVER(_q) ((_q)->tableIndex = (int32_t)((_q)->tableqinfoGroupInfo.numOfTables))
#define IS_STASBLE_QUERY_OVER(_q) ((_q)->tableIndex >= (int32_t)((_q)->tableqinfoGroupInfo.numOfTables))
...
...
@@ -827,7 +825,7 @@ static int32_t getNextQualifiedWindow(SQueryRuntimeEnv *pRuntimeEnv, STimeWindow
TSKEY
*
primaryKeys
,
__block_search_fn_t
searchFn
,
int32_t
prevPosition
)
{
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
GET_NEXT_TIMEWINDOW
(
pQuery
,
pNext
);
getNextTimeWindow
(
pQuery
,
pNext
);
// next time window is not in current block
if
((
pNext
->
skey
>
pDataBlockInfo
->
window
.
ekey
&&
QUERY_IS_ASC_QUERY
(
pQuery
))
||
...
...
@@ -1342,9 +1340,9 @@ static void rowwiseApplyFunctions(SQueryRuntimeEnv *pRuntimeEnv, SDataStatis *pS
int32_t
index
=
pWindowResInfo
->
curIndex
;
while
(
1
)
{
GET_NEXT_TIMEWINDOW
(
pQuery
,
&
nextWin
);
getNextTimeWindow
(
pQuery
,
&
nextWin
);
if
((
nextWin
.
skey
>
pQuery
->
window
.
ekey
&&
QUERY_IS_ASC_QUERY
(
pQuery
))
||
(
nextWin
.
s
key
<
pQuery
->
window
.
ekey
&&
!
QUERY_IS_ASC_QUERY
(
pQuery
)))
{
(
nextWin
.
e
key
<
pQuery
->
window
.
ekey
&&
!
QUERY_IS_ASC_QUERY
(
pQuery
)))
{
break
;
}
...
...
@@ -2202,7 +2200,7 @@ static bool overlapWithTimeWindow(SQuery* pQuery, SDataBlockInfo* pBlockInfo) {
}
while
(
1
)
{
GET_NEXT_TIMEWINDOW
(
pQuery
,
&
w
);
getNextTimeWindow
(
pQuery
,
&
w
);
if
(
w
.
skey
>
pBlockInfo
->
window
.
ekey
)
{
break
;
}
...
...
@@ -2221,7 +2219,7 @@ static bool overlapWithTimeWindow(SQuery* pQuery, SDataBlockInfo* pBlockInfo) {
}
while
(
1
)
{
GET_NEXT_TIMEWINDOW
(
pQuery
,
&
w
);
getNextTimeWindow
(
pQuery
,
&
w
);
if
(
w
.
ekey
<
pBlockInfo
->
window
.
skey
)
{
break
;
}
...
...
@@ -2536,7 +2534,7 @@ static int64_t doScanAllDataBlocks(SQueryRuntimeEnv *pRuntimeEnv) {
setQueryStatus
(
pQuery
,
QUERY_COMPLETED
);
}
if
(
QUERY_IS_INTERVAL_QUERY
(
pQuery
)
&&
IS_MASTER_SCAN
(
pRuntimeEnv
))
{
if
(
QUERY_IS_INTERVAL_QUERY
(
pQuery
)
&&
(
IS_MASTER_SCAN
(
pRuntimeEnv
)
||
pRuntimeEnv
->
scanFlag
==
REPEAT_SCAN
))
{
if
(
Q_STATUS_EQUAL
(
pQuery
->
status
,
QUERY_COMPLETED
))
{
closeAllTimeWindow
(
&
pRuntimeEnv
->
windowResInfo
);
pRuntimeEnv
->
windowResInfo
.
curIndex
=
pRuntimeEnv
->
windowResInfo
.
size
-
1
;
// point to the last time window
...
...
@@ -4116,7 +4114,7 @@ bool queryHasRemainResForTableQuery(SQueryRuntimeEnv* pRuntimeEnv) {
* first result row in the actual result set will fill nothing.
*/
if
(
Q_STATUS_EQUAL
(
pQuery
->
status
,
QUERY_COMPLETED
))
{
int32_t
numOfTotal
=
(
int32_t
)
get
FilledNumOfRes
(
pFillInfo
,
pQuery
->
window
.
ekey
,
(
int32_t
)
pQuery
->
rec
.
capacity
);
int32_t
numOfTotal
=
(
int32_t
)
get
NumOfResWithFill
(
pFillInfo
,
pQuery
->
window
.
ekey
,
(
int32_t
)
pQuery
->
rec
.
capacity
);
return
numOfTotal
>
0
;
}
...
...
@@ -4174,7 +4172,7 @@ int32_t doFillGapsInResults(SQueryRuntimeEnv* pRuntimeEnv, tFilePage **pDst, int
SFillInfo
*
pFillInfo
=
pRuntimeEnv
->
pFillInfo
;
while
(
1
)
{
int32_t
ret
=
(
int32_t
)
taos
Generate
DataBlock
(
pFillInfo
,
(
tFilePage
**
)
pQuery
->
sdata
,
(
int32_t
)
pQuery
->
rec
.
capacity
);
int32_t
ret
=
(
int32_t
)
taos
FillResult
DataBlock
(
pFillInfo
,
(
tFilePage
**
)
pQuery
->
sdata
,
(
int32_t
)
pQuery
->
rec
.
capacity
);
// todo apply limit output function
/* reached the start position of according to offset value, return immediately */
...
...
@@ -4354,14 +4352,17 @@ static bool skipTimeInterval(SQueryRuntimeEnv *pRuntimeEnv, TSKEY* start) {
STimeWindow
win
=
getActiveTimeWindow
(
pWindowResInfo
,
pWindowResInfo
->
prevSKey
,
pQuery
);
while
(
pQuery
->
limit
.
offset
>
0
)
{
STimeWindow
tw
=
win
;
if
((
win
.
ekey
<=
blockInfo
.
window
.
ekey
&&
QUERY_IS_ASC_QUERY
(
pQuery
))
||
(
win
.
ekey
>=
blockInfo
.
window
.
skey
&&
!
QUERY_IS_ASC_QUERY
(
pQuery
)))
{
pQuery
->
limit
.
offset
-=
1
;
pWindowResInfo
->
prevSKey
=
win
.
skey
;
}
STimeWindow
tw
=
win
;
GET_NEXT_TIMEWINDOW
(
pQuery
,
&
tw
);
getNextTimeWindow
(
pQuery
,
&
tw
);
}
else
{
// current window does not ended in current data block, try next data block
getNextTimeWindow
(
pQuery
,
&
tw
);
}
if
(
pQuery
->
limit
.
offset
==
0
)
{
if
((
tw
.
skey
<=
blockInfo
.
window
.
ekey
&&
QUERY_IS_ASC_QUERY
(
pQuery
))
||
...
...
@@ -4414,16 +4415,60 @@ static bool skipTimeInterval(SQueryRuntimeEnv *pRuntimeEnv, TSKEY* start) {
SArray
*
pDataBlock
=
tsdbRetrieveDataBlock
(
pRuntimeEnv
->
pQueryHandle
,
NULL
);
SColumnInfoData
*
pColInfoData
=
taosArrayGet
(
pDataBlock
,
0
);
tw
=
win
;
int32_t
startPos
=
getNextQualifiedWindow
(
pRuntimeEnv
,
&
tw
,
&
blockInfo
,
pColInfoData
->
pData
,
binarySearchForKey
,
-
1
)
;
assert
(
startPos
>=
0
);
if
((
win
.
ekey
>
blockInfo
.
window
.
ekey
&&
QUERY_IS_ASC_QUERY
(
pQuery
))
||
(
win
.
ekey
<
blockInfo
.
window
.
skey
&&
!
QUERY_IS_ASC_QUERY
(
pQuery
)))
{
pQuery
->
limit
.
offset
-=
1
;
}
// set the abort info
pQuery
->
pos
=
startPos
;
pTableQueryInfo
->
lastKey
=
((
TSKEY
*
)
pColInfoData
->
pData
)[
startPos
];
pWindowResInfo
->
prevSKey
=
tw
.
skey
;
win
=
tw
;
if
(
pQuery
->
limit
.
offset
==
0
)
{
if
((
tw
.
skey
<=
blockInfo
.
window
.
ekey
&&
QUERY_IS_ASC_QUERY
(
pQuery
))
||
(
tw
.
ekey
>=
blockInfo
.
window
.
skey
&&
!
QUERY_IS_ASC_QUERY
(
pQuery
)))
{
// load the data block and check data remaining in current data block
// TODO optimize performance
SArray
*
pDataBlock
=
tsdbRetrieveDataBlock
(
pRuntimeEnv
->
pQueryHandle
,
NULL
);
SColumnInfoData
*
pColInfoData
=
taosArrayGet
(
pDataBlock
,
0
);
tw
=
win
;
int32_t
startPos
=
getNextQualifiedWindow
(
pRuntimeEnv
,
&
tw
,
&
blockInfo
,
pColInfoData
->
pData
,
binarySearchForKey
,
-
1
);
assert
(
startPos
>=
0
);
// set the abort info
pQuery
->
pos
=
startPos
;
// reset the query start timestamp
pTableQueryInfo
->
win
.
skey
=
((
TSKEY
*
)
pColInfoData
->
pData
)[
startPos
];
pQuery
->
window
.
skey
=
pTableQueryInfo
->
win
.
skey
;
*
start
=
pTableQueryInfo
->
win
.
skey
;
pWindowResInfo
->
prevSKey
=
tw
.
skey
;
int32_t
index
=
pRuntimeEnv
->
windowResInfo
.
curIndex
;
int32_t
numOfRes
=
tableApplyFunctionsOnBlock
(
pRuntimeEnv
,
&
blockInfo
,
NULL
,
binarySearchForKey
,
pDataBlock
);
pRuntimeEnv
->
windowResInfo
.
curIndex
=
index
;
// restore the window index
qDebug
(
"QInfo:%p check data block, brange:%"
PRId64
"-%"
PRId64
", numOfRows:%d, numOfRes:%d, lastKey:%"
PRId64
,
GET_QINFO_ADDR
(
pRuntimeEnv
),
blockInfo
.
window
.
skey
,
blockInfo
.
window
.
ekey
,
blockInfo
.
rows
,
numOfRes
,
pQuery
->
current
->
lastKey
);
return
true
;
}
else
{
// do nothing
*
start
=
tw
.
skey
;
pQuery
->
window
.
skey
=
tw
.
skey
;
pWindowResInfo
->
prevSKey
=
tw
.
skey
;
return
true
;
}
}
else
{
tw
=
win
;
int32_t
startPos
=
getNextQualifiedWindow
(
pRuntimeEnv
,
&
tw
,
&
blockInfo
,
pColInfoData
->
pData
,
binarySearchForKey
,
-
1
);
assert
(
startPos
>=
0
);
// set the abort info
pQuery
->
pos
=
startPos
;
pTableQueryInfo
->
lastKey
=
((
TSKEY
*
)
pColInfoData
->
pData
)[
startPos
];
pWindowResInfo
->
prevSKey
=
tw
.
skey
;
win
=
tw
;
}
}
else
{
break
;
// offset is not 0, and next time window begins or ends in the next block.
}
...
...
@@ -4519,6 +4564,7 @@ static SFillColInfo* taosCreateFillColInfo(SQuery* pQuery) {
pFillCol
[
i
].
col
.
bytes
=
pExprInfo
->
bytes
;
pFillCol
[
i
].
col
.
type
=
(
int8_t
)
pExprInfo
->
type
;
pFillCol
[
i
].
col
.
offset
=
offset
;
pFillCol
[
i
].
tagIndex
=
-
2
;
pFillCol
[
i
].
flag
=
TSDB_COL_NORMAL
;
// always be ta normal column for table query
pFillCol
[
i
].
functionId
=
pExprInfo
->
base
.
functionId
;
pFillCol
[
i
].
fillVal
.
i
=
pQuery
->
fillVal
[
i
];
...
...
@@ -4532,7 +4578,6 @@ static SFillColInfo* taosCreateFillColInfo(SQuery* pQuery) {
int32_t
doInitQInfo
(
SQInfo
*
pQInfo
,
STSBuf
*
pTsBuf
,
void
*
tsdb
,
int32_t
vgId
,
bool
isSTableQuery
)
{
SQueryRuntimeEnv
*
pRuntimeEnv
=
&
pQInfo
->
runtimeEnv
;
int32_t
code
=
TSDB_CODE_SUCCESS
;
SQuery
*
pQuery
=
pQInfo
->
runtimeEnv
.
pQuery
;
pRuntimeEnv
->
topBotQuery
=
isTopBottomQuery
(
pQuery
);
...
...
@@ -4540,7 +4585,7 @@ int32_t doInitQInfo(SQInfo *pQInfo, STSBuf *pTsBuf, void *tsdb, int32_t vgId, bo
setScanLimitationByResultBuffer
(
pQuery
);
code
=
setupQueryHandle
(
tsdb
,
pQInfo
,
isSTableQuery
);
int32_t
code
=
setupQueryHandle
(
tsdb
,
pQInfo
,
isSTableQuery
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
return
code
;
}
...
...
@@ -4628,7 +4673,7 @@ int32_t doInitQInfo(SQInfo *pQInfo, STSBuf *pTsBuf, void *tsdb, int32_t vgId, bo
pRuntimeEnv
->
pFillInfo
=
taosInitFillInfo
(
pQuery
->
order
.
order
,
w
.
skey
,
0
,
(
int32_t
)
pQuery
->
rec
.
capacity
,
pQuery
->
numOfOutput
,
pQuery
->
interval
.
sliding
,
pQuery
->
interval
.
slidingUnit
,
(
int8_t
)
pQuery
->
precision
,
pQuery
->
fillType
,
pColInfo
);
pQuery
->
fillType
,
pColInfo
,
pQInfo
);
}
setQueryStatus
(
pQuery
,
QUERY_NOT_COMPLETED
);
...
...
@@ -5430,7 +5475,7 @@ static void tableIntervalProcess(SQInfo *pQInfo, STableQueryInfo* pTableInfo) {
break
;
}
else
{
taosFillSetStartInfo
(
pRuntimeEnv
->
pFillInfo
,
(
int32_t
)
pQuery
->
rec
.
rows
,
pQuery
->
window
.
ekey
);
taosFillCopyInputDataFromFilePage
(
pRuntimeEnv
->
pFillInfo
,
(
tFilePage
**
)
pQuery
->
sdata
);
taosFillCopyInputDataFromFilePage
(
pRuntimeEnv
->
pFillInfo
,
(
const
tFilePage
**
)
pQuery
->
sdata
);
numOfFilled
=
0
;
pQuery
->
rec
.
rows
=
doFillGapsInResults
(
pRuntimeEnv
,
(
tFilePage
**
)
pQuery
->
sdata
,
&
numOfFilled
);
...
...
@@ -6926,7 +6971,6 @@ int32_t qDumpRetrieveResult(qinfo_t qinfo, SRetrieveTableRsp **pRsp, int32_t *co
if
(
IS_QUERY_KILLED
(
pQInfo
)
||
Q_STATUS_EQUAL
(
pQuery
->
status
,
QUERY_OVER
))
{
// here current thread hold the refcount, so it is safe to free tsdbQueryHandle.
doFreeQueryHandle
(
pQInfo
);
*
continueExec
=
false
;
(
*
pRsp
)
->
completed
=
1
;
// notify no more result to client
}
else
{
...
...
src/query/src/qFill.c
浏览文件 @
9e87f232
此差异已折叠。
点击以展开。
src/query/src/qParserImpl.c
浏览文件 @
9e87f232
...
...
@@ -15,11 +15,9 @@
#include "os.h"
#include "qSqlparser.h"
#include "queryLog.h"
#include "taosdef.h"
#include "taosmsg.h"
#include "tcmdtype.h"
#include "tglobal.h"
#include "tstoken.h"
#include "tstrbuild.h"
#include "ttokendef.h"
...
...
@@ -227,13 +225,12 @@ tSQLExpr *tSQLExprCreate(tSQLExpr *pLeft, tSQLExpr *pRight, int32_t optrType) {
tSQLExprDestroy
(
pLeft
);
tSQLExprDestroy
(
pRight
);
}
else
if
((
pLeft
->
val
.
nType
==
TSDB_DATA_TYPE_DOUBLE
&&
pRight
->
val
.
nType
==
TSDB_DATA_TYPE_BIGINT
)
||
(
pRight
->
val
.
nType
==
TSDB_DATA_TYPE_DOUBLE
&&
pLeft
->
val
.
nType
==
TSDB_DATA_TYPE_BIGINT
))
{
}
else
if
(
pLeft
->
nSQLOptr
==
TK_FLOAT
||
pRight
->
nSQLOptr
==
TK_FLOAT
)
{
pExpr
->
val
.
nType
=
TSDB_DATA_TYPE_DOUBLE
;
pExpr
->
nSQLOptr
=
TK_FLOAT
;
pExpr
->
nSQLOptr
=
TK_FLOAT
;
double
left
=
pLeft
->
val
.
nType
==
TSDB_DATA_TYPE_DOUBLE
?
pLeft
->
val
.
dKey
:
pLeft
->
val
.
i64Key
;
double
right
=
pRight
->
val
.
nType
==
TSDB_DATA_TYPE_DOUBLE
?
pRight
->
val
.
dKey
:
pRight
->
val
.
i64Key
;
double
left
=
(
pLeft
->
val
.
nType
==
TSDB_DATA_TYPE_DOUBLE
)
?
pLeft
->
val
.
dKey
:
pLeft
->
val
.
i64Key
;
double
right
=
(
pRight
->
val
.
nType
==
TSDB_DATA_TYPE_DOUBLE
)
?
pRight
->
val
.
dKey
:
pRight
->
val
.
i64Key
;
switch
(
optrType
)
{
case
TK_PLUS
:
{
...
...
@@ -314,130 +311,57 @@ void tSQLExprDestroy(tSQLExpr *pExpr) {
tSQLExprNodeDestroy
(
pExpr
);
}
static
void
*
tVariantListExpand
(
tVariantList
*
pList
)
{
if
(
pList
->
nAlloc
<=
pList
->
nExpr
)
{
//
int32_t
newSize
=
(
pList
->
nAlloc
<<
1
)
+
4
;
void
*
ptr
=
realloc
(
pList
->
a
,
newSize
*
sizeof
(
pList
->
a
[
0
]));
if
(
ptr
==
0
)
{
return
NULL
;
}
pList
->
nAlloc
=
newSize
;
pList
->
a
=
ptr
;
}
assert
(
pList
->
a
!=
0
);
return
pList
;
}
tVariantList
*
tVariantListAppend
(
tVariantList
*
pList
,
tVariant
*
pVar
,
uint8_t
sortOrder
)
{
SArray
*
tVariantListAppendToken
(
SArray
*
pList
,
SStrToken
*
pToken
,
uint8_t
order
)
{
if
(
pList
==
NULL
)
{
pList
=
calloc
(
1
,
sizeof
(
tVariantList
));
}
if
(
tVariantListExpand
(
pList
)
==
NULL
)
{
return
pList
;
pList
=
taosArrayInit
(
4
,
sizeof
(
tVariantListItem
));
}
if
(
pVar
)
{
tVariantListItem
*
pItem
=
&
pList
->
a
[
pList
->
nExpr
++
];
/*
* Here we do not employ the assign function, since we need the pz attribute of structure
* , which is the point to char string, to free it!
*
* Otherwise, the original pointer may be lost, which causes memory leak.
*/
memcpy
(
pItem
,
pVar
,
sizeof
(
tVariant
));
pItem
->
sortOrder
=
sortOrder
;
}
return
pList
;
}
tVariantList
*
tVariantListInsert
(
tVariantList
*
pList
,
tVariant
*
pVar
,
uint8_t
sortOrder
,
int32_t
index
)
{
if
(
pList
==
NULL
||
index
>=
pList
->
nExpr
)
{
return
tVariantListAppend
(
NULL
,
pVar
,
sortOrder
);
}
if
(
tVariantListExpand
(
pList
)
==
NULL
)
{
return
pList
;
}
if
(
pVar
)
{
memmove
(
&
pList
->
a
[
index
+
1
],
&
pList
->
a
[
index
],
sizeof
(
tVariantListItem
)
*
(
pList
->
nExpr
-
index
));
tVariantListItem
*
pItem
=
&
pList
->
a
[
index
];
/*
* Here we do not employ the assign function, since we need the pz attribute of structure
* , which is the point to char string, to free it!
*
* Otherwise, the original pointer may be lost, which causes memory leak.
*/
memcpy
(
pItem
,
pVar
,
sizeof
(
tVariant
));
pItem
->
sortOrder
=
sortOrder
;
if
(
pToken
)
{
tVariantListItem
item
;
tVariantCreate
(
&
item
.
pVar
,
pToken
);
item
.
sortOrder
=
order
;
pList
->
nExpr
++
;
taosArrayPush
(
pList
,
&
item
)
;
}
return
pList
;
}
void
tVariantListDestroy
(
tVariantList
*
pList
)
{
if
(
pList
==
NULL
)
return
;
for
(
int32_t
i
=
0
;
i
<
pList
->
nExpr
;
++
i
)
{
tVariantDestroy
(
&
pList
->
a
[
i
].
pVar
);
}
free
(
pList
->
a
);
free
(
pList
);
}
tVariantList
*
tVariantListAppendToken
(
tVariantList
*
pList
,
SStrToken
*
pToken
,
uint8_t
sortOrder
)
{
SArray
*
tVariantListAppend
(
SArray
*
pList
,
tVariant
*
pVar
,
uint8_t
sortOrder
)
{
if
(
pList
==
NULL
)
{
pList
=
calloc
(
1
,
sizeof
(
tVariantList
));
pList
=
taosArrayInit
(
4
,
sizeof
(
tVariantListItem
));
}
if
(
tVariantListExpand
(
pList
)
==
NULL
)
{
if
(
pVar
==
NULL
)
{
return
pList
;
}
if
(
pToken
)
{
tVariant
t
=
{
0
};
tVariantCreate
(
&
t
,
pToken
);
/*
* Here we do not employ the assign function, since we need the pz attribute of structure
* , which is the point to char string, to free it!
*
* Otherwise, the original pointer may be lost, which causes memory leak.
*/
tVariantListItem
item
;
item
.
pVar
=
*
pVar
;
item
.
sortOrder
=
sortOrder
;
tVariantListItem
*
pItem
=
&
pList
->
a
[
pList
->
nExpr
++
];
memcpy
(
pItem
,
&
t
,
sizeof
(
tVariant
));
pItem
->
sortOrder
=
sortOrder
;
}
taosArrayPush
(
pList
,
&
item
);
return
pList
;
}
tFieldList
*
tFieldListAppend
(
tFieldList
*
pList
,
TAOS_FIELD
*
pField
)
{
if
(
pList
==
NULL
)
pList
=
calloc
(
1
,
sizeof
(
tFieldList
));
if
(
pList
->
nAlloc
<=
pList
->
nField
)
{
//
pList
->
nAlloc
=
(
pList
->
nAlloc
<<
1
)
+
4
;
pList
->
p
=
realloc
(
pList
->
p
,
pList
->
nAlloc
*
sizeof
(
pList
->
p
[
0
]));
if
(
pList
->
p
==
0
)
{
pList
->
nField
=
pList
->
nAlloc
=
0
;
return
pList
;
}
SArray
*
tVariantListInsert
(
SArray
*
pList
,
tVariant
*
pVar
,
uint8_t
sortOrder
,
int32_t
index
)
{
if
(
pList
==
NULL
||
pVar
==
NULL
||
index
>=
taosArrayGetSize
(
pList
))
{
return
tVariantListAppend
(
NULL
,
pVar
,
sortOrder
);
}
assert
(
pList
->
p
!=
0
);
if
(
pField
)
{
struct
TAOS_FIELD
*
pItem
=
(
struct
TAOS_FIELD
*
)
&
pList
->
p
[
pList
->
nField
++
];
memcpy
(
pItem
,
pField
,
sizeof
(
TAOS_FIELD
));
}
return
pList
;
}
tVariantListItem
item
;
void
tFieldListDestroy
(
tFieldList
*
pList
)
{
i
f
(
pList
==
NULL
)
return
;
item
.
pVar
=
*
pVar
;
i
tem
.
sortOrder
=
sortOrder
;
free
(
pList
->
p
);
free
(
pList
)
;
taosArrayInsert
(
pList
,
index
,
&
item
);
return
pList
;
}
void
setDBName
(
SStrToken
*
pCpxName
,
SStrToken
*
pDB
)
{
...
...
@@ -464,8 +388,6 @@ void tSQLSetColumnInfo(TAOS_FIELD *pField, SStrToken *pName, TAOS_FIELD *pType)
void
tSQLSetColumnType
(
TAOS_FIELD
*
pField
,
SStrToken
*
type
)
{
pField
->
type
=
-
1
;
int32_t
LENGTH_SIZE_OF_STR
=
2
;
// in case of nchar and binary, there two bytes to keep the length of binary|nchar.
for
(
int8_t
i
=
0
;
i
<
tListLen
(
tDataTypeDesc
);
++
i
)
{
if
((
strncasecmp
(
type
->
z
,
tDataTypeDesc
[
i
].
aName
,
tDataTypeDesc
[
i
].
nameLen
)
==
0
)
&&
(
type
->
n
==
tDataTypeDesc
[
i
].
nameLen
))
{
...
...
@@ -481,14 +403,14 @@ void tSQLSetColumnType(TAOS_FIELD *pField, SStrToken *type) {
if
(
type
->
type
==
0
)
{
pField
->
bytes
=
0
;
}
else
{
pField
->
bytes
=
-
(
int32_t
)
type
->
type
*
TSDB_NCHAR_SIZE
+
LENGTH_SIZE_OF_STR
;
pField
->
bytes
=
(
int16_t
)(
-
(
int32_t
)
type
->
type
*
TSDB_NCHAR_SIZE
+
VARSTR_HEADER_SIZE
)
;
}
}
else
if
(
i
==
TSDB_DATA_TYPE_BINARY
)
{
/* for binary, the TOKENTYPE is the length of binary */
if
(
type
->
type
==
0
)
{
pField
->
bytes
=
0
;
}
else
{
pField
->
bytes
=
-
(
int32_t
)
type
->
type
+
LENGTH_SIZE_OF_STR
;
pField
->
bytes
=
(
int16_t
)
(
-
(
int32_t
)
type
->
type
+
VARSTR_HEADER_SIZE
)
;
}
}
break
;
...
...
@@ -499,9 +421,9 @@ void tSQLSetColumnType(TAOS_FIELD *pField, SStrToken *type) {
/*
* extract the select info out of sql string
*/
SQuerySQL
*
tSetQuerySQLElems
(
SStrToken
*
pSelectToken
,
tSQLExprList
*
pSelection
,
tVariantList
*
pFrom
,
tSQLExpr
*
pWhere
,
tVariantList
*
pGroupby
,
tVariantList
*
pSortOrder
,
SIntervalVal
*
pInterval
,
SStrToken
*
pSliding
,
tVariantList
*
pFill
,
SLimitVal
*
pLimit
,
SLimitVal
*
pGLimit
)
{
SQuerySQL
*
tSetQuerySQLElems
(
SStrToken
*
pSelectToken
,
tSQLExprList
*
pSelection
,
SArray
*
pFrom
,
tSQLExpr
*
pWhere
,
SArray
*
pGroupby
,
SArray
*
pSortOrder
,
SIntervalVal
*
pInterval
,
SStrToken
*
pSliding
,
SArray
*
pFill
,
SLimitVal
*
pLimit
,
SLimitVal
*
pGLimit
)
{
assert
(
pSelection
!=
NULL
);
SQuerySQL
*
pQuery
=
calloc
(
1
,
sizeof
(
SQuerySQL
));
...
...
@@ -535,6 +457,11 @@ SQuerySQL *tSetQuerySQLElems(SStrToken *pSelectToken, tSQLExprList *pSelection,
return
pQuery
;
}
void
freeVariant
(
void
*
pItem
)
{
tVariantListItem
*
p
=
(
tVariantListItem
*
)
pItem
;
tVariantDestroy
(
&
p
->
pVar
);
}
void
doDestroyQuerySql
(
SQuerySQL
*
pQuerySql
)
{
if
(
pQuerySql
==
NULL
)
{
return
;
...
...
@@ -547,17 +474,18 @@ void doDestroyQuerySql(SQuerySQL *pQuerySql) {
tSQLExprDestroy
(
pQuerySql
->
pWhere
);
pQuerySql
->
pWhere
=
NULL
;
t
VariantListDestroy
(
pQuerySql
->
pSortOrder
);
t
aosArrayDestroyEx
(
pQuerySql
->
pSortOrder
,
freeVariant
);
pQuerySql
->
pSortOrder
=
NULL
;
t
VariantListDestroy
(
pQuerySql
->
pGroupby
);
t
aosArrayDestroyEx
(
pQuerySql
->
pGroupby
,
freeVariant
);
pQuerySql
->
pGroupby
=
NULL
;
t
VariantListDestroy
(
pQuerySql
->
from
);
t
aosArrayDestroyEx
(
pQuerySql
->
from
,
freeVariant
);
pQuerySql
->
from
=
NULL
;
tVariantListDestroy
(
pQuerySql
->
fillType
);
taosArrayDestroyEx
(
pQuerySql
->
fillType
,
freeVariant
);
pQuerySql
->
fillType
=
NULL
;
free
(
pQuerySql
);
}
...
...
@@ -574,8 +502,8 @@ void destroyAllSelectClause(SSubclauseInfo *pClause) {
tfree
(
pClause
->
pClause
);
}
SCreateTableSQL
*
tSetCreateSQLElems
(
tFieldList
*
pCols
,
tFieldList
*
pTags
,
SStrToken
*
pStableName
,
tVariantList
*
pTagVals
,
SQuerySQL
*
pSelect
,
int32_t
type
)
{
SCreateTableSQL
*
tSetCreateSQLElems
(
SArray
*
pCols
,
SArray
*
pTags
,
SStrToken
*
pStableName
,
SArray
*
pTagVals
,
SQuerySQL
*
pSelect
,
int32_t
type
)
{
SCreateTableSQL
*
pCreate
=
calloc
(
1
,
sizeof
(
SCreateTableSQL
));
switch
(
type
)
{
...
...
@@ -607,7 +535,7 @@ SCreateTableSQL *tSetCreateSQLElems(tFieldList *pCols, tFieldList *pTags, SStrTo
return
pCreate
;
}
SAlterTableSQL
*
tAlterTableSQLElems
(
SStrToken
*
pMeterName
,
tFieldList
*
pCols
,
tVariantList
*
pVals
,
int32_t
type
)
{
SAlterTableSQL
*
tAlterTableSQLElems
(
SStrToken
*
pMeterName
,
SArray
*
pCols
,
SArray
*
pVals
,
int32_t
type
)
{
SAlterTableSQL
*
pAlterTable
=
calloc
(
1
,
sizeof
(
SAlterTableSQL
));
pAlterTable
->
name
=
*
pMeterName
;
...
...
@@ -637,14 +565,14 @@ void SQLInfoDestroy(SSqlInfo *pInfo) {
SCreateTableSQL
*
pCreateTableInfo
=
pInfo
->
pCreateTableInfo
;
doDestroyQuerySql
(
pCreateTableInfo
->
pSelect
);
t
FieldList
Destroy
(
pCreateTableInfo
->
colInfo
.
pColumns
);
t
FieldList
Destroy
(
pCreateTableInfo
->
colInfo
.
pTagColumns
);
t
aosArray
Destroy
(
pCreateTableInfo
->
colInfo
.
pColumns
);
t
aosArray
Destroy
(
pCreateTableInfo
->
colInfo
.
pTagColumns
);
t
VariantListDestroy
(
pCreateTableInfo
->
usingInfo
.
pTagVals
);
t
aosArrayDestroyEx
(
pCreateTableInfo
->
usingInfo
.
pTagVals
,
freeVariant
);
tfree
(
pInfo
->
pCreateTableInfo
);
}
else
if
(
pInfo
->
type
==
TSDB_SQL_ALTER_TABLE
)
{
t
VariantListDestroy
(
pInfo
->
pAlterInfo
->
varLis
t
);
t
FieldList
Destroy
(
pInfo
->
pAlterInfo
->
pAddColumns
);
t
aosArrayDestroyEx
(
pInfo
->
pAlterInfo
->
varList
,
freeVarian
t
);
t
aosArray
Destroy
(
pInfo
->
pAlterInfo
->
pAddColumns
);
tfree
(
pInfo
->
pAlterInfo
);
}
else
{
...
...
@@ -653,7 +581,7 @@ void SQLInfoDestroy(SSqlInfo *pInfo) {
}
if
(
pInfo
->
pDCLInfo
!=
NULL
&&
pInfo
->
type
==
TSDB_SQL_CREATE_DB
)
{
t
VariantListDestroy
(
pInfo
->
pDCLInfo
->
dbOpt
.
keep
);
t
aosArrayDestroyEx
(
pInfo
->
pDCLInfo
->
dbOpt
.
keep
,
freeVariant
);
}
tfree
(
pInfo
->
pDCLInfo
);
...
...
src/query/src/sql.c
浏览文件 @
9e87f232
...
...
@@ -107,6 +107,7 @@ typedef union {
tSQLExpr
*
yy64
;
tVariant
yy134
;
SCreateAcctSQL
yy149
;
SArray
*
yy165
;
int64_t
yy207
;
SLimitVal
yy216
;
TAOS_FIELD
yy223
;
...
...
@@ -115,8 +116,6 @@ typedef union {
tSQLExprList
*
yy290
;
SQuerySQL
*
yy414
;
SCreateTableSQL
*
yy470
;
tVariantList
*
yy498
;
tFieldList
*
yy523
;
SIntervalVal
yy532
;
}
YYMINORTYPE
;
#ifndef YYSTACKDEPTH
...
...
@@ -1368,18 +1367,14 @@ static void yy_destructor(
/********* Begin destructor definitions ***************************************/
case
227
:
/* keep */
case
228
:
/* tagitemlist */
case
245
:
/* columnlist */
case
253
:
/* fill_opt */
case
255
:
/* groupby_opt */
case
256
:
/* orderby_opt */
case
266
:
/* sortlist */
case
270
:
/* grouplist */
{
tVariantListDestroy
((
yypminor
->
yy498
));
}
break
;
case
245
:
/* columnlist */
{
tFieldListDestroy
((
yypminor
->
yy523
));
taosArrayDestroy
((
yypminor
->
yy165
));
}
break
;
case
246
:
/* select */
...
...
@@ -2238,7 +2233,7 @@ static void yy_reduce(
yymsp
[
-
8
].
minor
.
yy149
=
yylhsminor
.
yy149
;
break
;
case
72
:
/* keep ::= KEEP tagitemlist */
{
yymsp
[
-
1
].
minor
.
yy
498
=
yymsp
[
0
].
minor
.
yy498
;
}
{
yymsp
[
-
1
].
minor
.
yy
165
=
yymsp
[
0
].
minor
.
yy165
;
}
break
;
case
73
:
/* cache ::= CACHE INTEGER */
case
74
:
/* replica ::= REPLICA INTEGER */
yytestcase
(
yyruleno
==
74
);
...
...
@@ -2314,7 +2309,7 @@ static void yy_reduce(
break
;
case
99
:
/* db_optr ::= db_optr keep */
case
104
:
/* alter_db_optr ::= alter_db_optr keep */
yytestcase
(
yyruleno
==
104
);
{
yylhsminor
.
yy268
=
yymsp
[
-
1
].
minor
.
yy268
;
yylhsminor
.
yy268
.
keep
=
yymsp
[
0
].
minor
.
yy
498
;
}
{
yylhsminor
.
yy268
=
yymsp
[
-
1
].
minor
.
yy268
;
yylhsminor
.
yy268
.
keep
=
yymsp
[
0
].
minor
.
yy
165
;
}
yymsp
[
-
1
].
minor
.
yy268
=
yylhsminor
.
yy268
;
break
;
case
100
:
/* db_optr ::= db_optr update */
...
...
@@ -2362,20 +2357,20 @@ static void yy_reduce(
break
;
case
116
:
/* create_table_args ::= LP columnlist RP */
{
yymsp
[
-
2
].
minor
.
yy470
=
tSetCreateSQLElems
(
yymsp
[
-
1
].
minor
.
yy
523
,
NULL
,
NULL
,
NULL
,
NULL
,
TSQL_CREATE_TABLE
);
yymsp
[
-
2
].
minor
.
yy470
=
tSetCreateSQLElems
(
yymsp
[
-
1
].
minor
.
yy
165
,
NULL
,
NULL
,
NULL
,
NULL
,
TSQL_CREATE_TABLE
);
setSQLInfo
(
pInfo
,
yymsp
[
-
2
].
minor
.
yy470
,
NULL
,
TSDB_SQL_CREATE_TABLE
);
}
break
;
case
117
:
/* create_table_args ::= LP columnlist RP TAGS LP columnlist RP */
{
yymsp
[
-
6
].
minor
.
yy470
=
tSetCreateSQLElems
(
yymsp
[
-
5
].
minor
.
yy
523
,
yymsp
[
-
1
].
minor
.
yy523
,
NULL
,
NULL
,
NULL
,
TSQL_CREATE_STABLE
);
yymsp
[
-
6
].
minor
.
yy470
=
tSetCreateSQLElems
(
yymsp
[
-
5
].
minor
.
yy
165
,
yymsp
[
-
1
].
minor
.
yy165
,
NULL
,
NULL
,
NULL
,
TSQL_CREATE_STABLE
);
setSQLInfo
(
pInfo
,
yymsp
[
-
6
].
minor
.
yy470
,
NULL
,
TSDB_SQL_CREATE_TABLE
);
}
break
;
case
118
:
/* create_table_args ::= USING ids cpxName TAGS LP tagitemlist RP */
{
yymsp
[
-
5
].
minor
.
yy0
.
n
+=
yymsp
[
-
4
].
minor
.
yy0
.
n
;
yymsp
[
-
6
].
minor
.
yy470
=
tSetCreateSQLElems
(
NULL
,
NULL
,
&
yymsp
[
-
5
].
minor
.
yy0
,
yymsp
[
-
1
].
minor
.
yy
498
,
NULL
,
TSQL_CREATE_TABLE_FROM_STABLE
);
yymsp
[
-
6
].
minor
.
yy470
=
tSetCreateSQLElems
(
NULL
,
NULL
,
&
yymsp
[
-
5
].
minor
.
yy0
,
yymsp
[
-
1
].
minor
.
yy
165
,
NULL
,
TSQL_CREATE_TABLE_FROM_STABLE
);
setSQLInfo
(
pInfo
,
yymsp
[
-
6
].
minor
.
yy470
,
NULL
,
TSDB_SQL_CREATE_TABLE
);
}
break
;
...
...
@@ -2386,12 +2381,12 @@ static void yy_reduce(
}
break
;
case
120
:
/* columnlist ::= columnlist COMMA column */
{
yylhsminor
.
yy523
=
tFieldListAppend
(
yymsp
[
-
2
].
minor
.
yy523
,
&
yymsp
[
0
].
minor
.
yy223
);
}
yymsp
[
-
2
].
minor
.
yy
523
=
yylhsminor
.
yy523
;
{
taosArrayPush
(
yymsp
[
-
2
].
minor
.
yy165
,
&
yymsp
[
0
].
minor
.
yy223
);
yylhsminor
.
yy165
=
yymsp
[
-
2
].
minor
.
yy165
;
}
yymsp
[
-
2
].
minor
.
yy
165
=
yylhsminor
.
yy165
;
break
;
case
121
:
/* columnlist ::= column */
{
yylhsminor
.
yy
523
=
tFieldListAppend
(
NULL
,
&
yymsp
[
0
].
minor
.
yy223
);}
yymsp
[
0
].
minor
.
yy
523
=
yylhsminor
.
yy523
;
{
yylhsminor
.
yy
165
=
taosArrayInit
(
4
,
sizeof
(
TAOS_FIELD
));
taosArrayPush
(
yylhsminor
.
yy165
,
&
yymsp
[
0
].
minor
.
yy223
);}
yymsp
[
0
].
minor
.
yy
165
=
yylhsminor
.
yy165
;
break
;
case
122
:
/* column ::= ids typename */
{
...
...
@@ -2400,12 +2395,12 @@ static void yy_reduce(
yymsp
[
-
1
].
minor
.
yy223
=
yylhsminor
.
yy223
;
break
;
case
123
:
/* tagitemlist ::= tagitemlist COMMA tagitem */
{
yylhsminor
.
yy
498
=
tVariantListAppend
(
yymsp
[
-
2
].
minor
.
yy498
,
&
yymsp
[
0
].
minor
.
yy134
,
-
1
);
}
yymsp
[
-
2
].
minor
.
yy
498
=
yylhsminor
.
yy498
;
{
yylhsminor
.
yy
165
=
tVariantListAppend
(
yymsp
[
-
2
].
minor
.
yy165
,
&
yymsp
[
0
].
minor
.
yy134
,
-
1
);
}
yymsp
[
-
2
].
minor
.
yy
165
=
yylhsminor
.
yy165
;
break
;
case
124
:
/* tagitemlist ::= tagitem */
{
yylhsminor
.
yy
498
=
tVariantListAppend
(
NULL
,
&
yymsp
[
0
].
minor
.
yy134
,
-
1
);
}
yymsp
[
0
].
minor
.
yy
498
=
yylhsminor
.
yy498
;
{
yylhsminor
.
yy
165
=
tVariantListAppend
(
NULL
,
&
yymsp
[
0
].
minor
.
yy134
,
-
1
);
}
yymsp
[
0
].
minor
.
yy
165
=
yylhsminor
.
yy165
;
break
;
case
125
:
/* tagitem ::= INTEGER */
case
126
:
/* tagitem ::= FLOAT */
yytestcase
(
yyruleno
==
126
);
...
...
@@ -2432,7 +2427,7 @@ static void yy_reduce(
break
;
case
134
:
/* select ::= SELECT selcollist from where_opt interval_opt fill_opt sliding_opt groupby_opt orderby_opt having_opt slimit_opt limit_opt */
{
yylhsminor
.
yy414
=
tSetQuerySQLElems
(
&
yymsp
[
-
11
].
minor
.
yy0
,
yymsp
[
-
10
].
minor
.
yy290
,
yymsp
[
-
9
].
minor
.
yy
498
,
yymsp
[
-
8
].
minor
.
yy64
,
yymsp
[
-
4
].
minor
.
yy498
,
yymsp
[
-
3
].
minor
.
yy498
,
&
yymsp
[
-
7
].
minor
.
yy532
,
&
yymsp
[
-
5
].
minor
.
yy0
,
yymsp
[
-
6
].
minor
.
yy498
,
&
yymsp
[
0
].
minor
.
yy216
,
&
yymsp
[
-
1
].
minor
.
yy216
);
yylhsminor
.
yy414
=
tSetQuerySQLElems
(
&
yymsp
[
-
11
].
minor
.
yy0
,
yymsp
[
-
10
].
minor
.
yy290
,
yymsp
[
-
9
].
minor
.
yy
165
,
yymsp
[
-
8
].
minor
.
yy64
,
yymsp
[
-
4
].
minor
.
yy165
,
yymsp
[
-
3
].
minor
.
yy165
,
&
yymsp
[
-
7
].
minor
.
yy532
,
&
yymsp
[
-
5
].
minor
.
yy0
,
yymsp
[
-
6
].
minor
.
yy165
,
&
yymsp
[
0
].
minor
.
yy216
,
&
yymsp
[
-
1
].
minor
.
yy216
);
}
yymsp
[
-
11
].
minor
.
yy414
=
yylhsminor
.
yy414
;
break
;
...
...
@@ -2491,45 +2486,45 @@ static void yy_reduce(
{
yymsp
[
1
].
minor
.
yy0
.
n
=
0
;
}
break
;
case
148
:
/* from ::= FROM tablelist */
{
yymsp
[
-
1
].
minor
.
yy
498
=
yymsp
[
0
].
minor
.
yy498
;}
{
yymsp
[
-
1
].
minor
.
yy
165
=
yymsp
[
0
].
minor
.
yy165
;}
break
;
case
149
:
/* tablelist ::= ids cpxName */
{
toTSDBType
(
yymsp
[
-
1
].
minor
.
yy0
.
type
);
yymsp
[
-
1
].
minor
.
yy0
.
n
+=
yymsp
[
0
].
minor
.
yy0
.
n
;
yylhsminor
.
yy
498
=
tVariantListAppendToken
(
NULL
,
&
yymsp
[
-
1
].
minor
.
yy0
,
-
1
);
yylhsminor
.
yy
498
=
tVariantListAppendToken
(
yylhsminor
.
yy498
,
&
yymsp
[
-
1
].
minor
.
yy0
,
-
1
);
// table alias name
yylhsminor
.
yy
165
=
tVariantListAppendToken
(
NULL
,
&
yymsp
[
-
1
].
minor
.
yy0
,
-
1
);
yylhsminor
.
yy
165
=
tVariantListAppendToken
(
yylhsminor
.
yy165
,
&
yymsp
[
-
1
].
minor
.
yy0
,
-
1
);
// table alias name
}
yymsp
[
-
1
].
minor
.
yy
498
=
yylhsminor
.
yy498
;
yymsp
[
-
1
].
minor
.
yy
165
=
yylhsminor
.
yy165
;
break
;
case
150
:
/* tablelist ::= ids cpxName ids */
{
toTSDBType
(
yymsp
[
-
2
].
minor
.
yy0
.
type
);
toTSDBType
(
yymsp
[
0
].
minor
.
yy0
.
type
);
yymsp
[
-
2
].
minor
.
yy0
.
n
+=
yymsp
[
-
1
].
minor
.
yy0
.
n
;
yylhsminor
.
yy
498
=
tVariantListAppendToken
(
NULL
,
&
yymsp
[
-
2
].
minor
.
yy0
,
-
1
);
yylhsminor
.
yy
498
=
tVariantListAppendToken
(
yylhsminor
.
yy498
,
&
yymsp
[
0
].
minor
.
yy0
,
-
1
);
yylhsminor
.
yy
165
=
tVariantListAppendToken
(
NULL
,
&
yymsp
[
-
2
].
minor
.
yy0
,
-
1
);
yylhsminor
.
yy
165
=
tVariantListAppendToken
(
yylhsminor
.
yy165
,
&
yymsp
[
0
].
minor
.
yy0
,
-
1
);
}
yymsp
[
-
2
].
minor
.
yy
498
=
yylhsminor
.
yy498
;
yymsp
[
-
2
].
minor
.
yy
165
=
yylhsminor
.
yy165
;
break
;
case
151
:
/* tablelist ::= tablelist COMMA ids cpxName */
{
toTSDBType
(
yymsp
[
-
1
].
minor
.
yy0
.
type
);
yymsp
[
-
1
].
minor
.
yy0
.
n
+=
yymsp
[
0
].
minor
.
yy0
.
n
;
yylhsminor
.
yy
498
=
tVariantListAppendToken
(
yymsp
[
-
3
].
minor
.
yy498
,
&
yymsp
[
-
1
].
minor
.
yy0
,
-
1
);
yylhsminor
.
yy
498
=
tVariantListAppendToken
(
yylhsminor
.
yy498
,
&
yymsp
[
-
1
].
minor
.
yy0
,
-
1
);
yylhsminor
.
yy
165
=
tVariantListAppendToken
(
yymsp
[
-
3
].
minor
.
yy165
,
&
yymsp
[
-
1
].
minor
.
yy0
,
-
1
);
yylhsminor
.
yy
165
=
tVariantListAppendToken
(
yylhsminor
.
yy165
,
&
yymsp
[
-
1
].
minor
.
yy0
,
-
1
);
}
yymsp
[
-
3
].
minor
.
yy
498
=
yylhsminor
.
yy498
;
yymsp
[
-
3
].
minor
.
yy
165
=
yylhsminor
.
yy165
;
break
;
case
152
:
/* tablelist ::= tablelist COMMA ids cpxName ids */
{
toTSDBType
(
yymsp
[
-
2
].
minor
.
yy0
.
type
);
toTSDBType
(
yymsp
[
0
].
minor
.
yy0
.
type
);
yymsp
[
-
2
].
minor
.
yy0
.
n
+=
yymsp
[
-
1
].
minor
.
yy0
.
n
;
yylhsminor
.
yy
498
=
tVariantListAppendToken
(
yymsp
[
-
4
].
minor
.
yy498
,
&
yymsp
[
-
2
].
minor
.
yy0
,
-
1
);
yylhsminor
.
yy
498
=
tVariantListAppendToken
(
yylhsminor
.
yy498
,
&
yymsp
[
0
].
minor
.
yy0
,
-
1
);
yylhsminor
.
yy
165
=
tVariantListAppendToken
(
yymsp
[
-
4
].
minor
.
yy165
,
&
yymsp
[
-
2
].
minor
.
yy0
,
-
1
);
yylhsminor
.
yy
165
=
tVariantListAppendToken
(
yylhsminor
.
yy165
,
&
yymsp
[
0
].
minor
.
yy0
,
-
1
);
}
yymsp
[
-
4
].
minor
.
yy
498
=
yylhsminor
.
yy498
;
yymsp
[
-
4
].
minor
.
yy
165
=
yylhsminor
.
yy165
;
break
;
case
153
:
/* tmvar ::= VARIABLE */
{
yylhsminor
.
yy0
=
yymsp
[
0
].
minor
.
yy0
;}
...
...
@@ -2545,7 +2540,7 @@ static void yy_reduce(
{
memset
(
&
yymsp
[
1
].
minor
.
yy532
,
0
,
sizeof
(
yymsp
[
1
].
minor
.
yy532
));}
break
;
case
157
:
/* fill_opt ::= */
{
yymsp
[
1
].
minor
.
yy
498
=
0
;
}
{
yymsp
[
1
].
minor
.
yy
165
=
0
;
}
break
;
case
158
:
/* fill_opt ::= FILL LP ID COMMA tagitemlist RP */
{
...
...
@@ -2553,14 +2548,14 @@ static void yy_reduce(
toTSDBType
(
yymsp
[
-
3
].
minor
.
yy0
.
type
);
tVariantCreate
(
&
A
,
&
yymsp
[
-
3
].
minor
.
yy0
);
tVariantListInsert
(
yymsp
[
-
1
].
minor
.
yy
498
,
&
A
,
-
1
,
0
);
yymsp
[
-
5
].
minor
.
yy
498
=
yymsp
[
-
1
].
minor
.
yy498
;
tVariantListInsert
(
yymsp
[
-
1
].
minor
.
yy
165
,
&
A
,
-
1
,
0
);
yymsp
[
-
5
].
minor
.
yy
165
=
yymsp
[
-
1
].
minor
.
yy165
;
}
break
;
case
159
:
/* fill_opt ::= FILL LP ID RP */
{
toTSDBType
(
yymsp
[
-
1
].
minor
.
yy0
.
type
);
yymsp
[
-
3
].
minor
.
yy
498
=
tVariantListAppendToken
(
NULL
,
&
yymsp
[
-
1
].
minor
.
yy0
,
-
1
);
yymsp
[
-
3
].
minor
.
yy
165
=
tVariantListAppendToken
(
NULL
,
&
yymsp
[
-
1
].
minor
.
yy0
,
-
1
);
}
break
;
case
160
:
/* sliding_opt ::= SLIDING LP tmvar RP */
...
...
@@ -2571,23 +2566,23 @@ static void yy_reduce(
break
;
case
162
:
/* orderby_opt ::= */
case
170
:
/* groupby_opt ::= */
yytestcase
(
yyruleno
==
170
);
{
yymsp
[
1
].
minor
.
yy
498
=
0
;}
{
yymsp
[
1
].
minor
.
yy
165
=
0
;}
break
;
case
163
:
/* orderby_opt ::= ORDER BY sortlist */
case
171
:
/* groupby_opt ::= GROUP BY grouplist */
yytestcase
(
yyruleno
==
171
);
{
yymsp
[
-
2
].
minor
.
yy
498
=
yymsp
[
0
].
minor
.
yy498
;}
{
yymsp
[
-
2
].
minor
.
yy
165
=
yymsp
[
0
].
minor
.
yy165
;}
break
;
case
164
:
/* sortlist ::= sortlist COMMA item sortorder */
{
yylhsminor
.
yy
498
=
tVariantListAppend
(
yymsp
[
-
3
].
minor
.
yy498
,
&
yymsp
[
-
1
].
minor
.
yy134
,
yymsp
[
0
].
minor
.
yy46
);
yylhsminor
.
yy
165
=
tVariantListAppend
(
yymsp
[
-
3
].
minor
.
yy165
,
&
yymsp
[
-
1
].
minor
.
yy134
,
yymsp
[
0
].
minor
.
yy46
);
}
yymsp
[
-
3
].
minor
.
yy
498
=
yylhsminor
.
yy498
;
yymsp
[
-
3
].
minor
.
yy
165
=
yylhsminor
.
yy165
;
break
;
case
165
:
/* sortlist ::= item sortorder */
{
yylhsminor
.
yy
498
=
tVariantListAppend
(
NULL
,
&
yymsp
[
-
1
].
minor
.
yy134
,
yymsp
[
0
].
minor
.
yy46
);
yylhsminor
.
yy
165
=
tVariantListAppend
(
NULL
,
&
yymsp
[
-
1
].
minor
.
yy134
,
yymsp
[
0
].
minor
.
yy46
);
}
yymsp
[
-
1
].
minor
.
yy
498
=
yylhsminor
.
yy498
;
yymsp
[
-
1
].
minor
.
yy
165
=
yylhsminor
.
yy165
;
break
;
case
166
:
/* item ::= ids cpxName */
{
...
...
@@ -2609,15 +2604,15 @@ static void yy_reduce(
break
;
case
172
:
/* grouplist ::= grouplist COMMA item */
{
yylhsminor
.
yy
498
=
tVariantListAppend
(
yymsp
[
-
2
].
minor
.
yy498
,
&
yymsp
[
0
].
minor
.
yy134
,
-
1
);
yylhsminor
.
yy
165
=
tVariantListAppend
(
yymsp
[
-
2
].
minor
.
yy165
,
&
yymsp
[
0
].
minor
.
yy134
,
-
1
);
}
yymsp
[
-
2
].
minor
.
yy
498
=
yylhsminor
.
yy498
;
yymsp
[
-
2
].
minor
.
yy
165
=
yylhsminor
.
yy165
;
break
;
case
173
:
/* grouplist ::= item */
{
yylhsminor
.
yy
498
=
tVariantListAppend
(
NULL
,
&
yymsp
[
0
].
minor
.
yy134
,
-
1
);
yylhsminor
.
yy
165
=
tVariantListAppend
(
NULL
,
&
yymsp
[
0
].
minor
.
yy134
,
-
1
);
}
yymsp
[
0
].
minor
.
yy
498
=
yylhsminor
.
yy498
;
yymsp
[
0
].
minor
.
yy
165
=
yylhsminor
.
yy165
;
break
;
case
174
:
/* having_opt ::= */
case
184
:
/* where_opt ::= */
yytestcase
(
yyruleno
==
184
);
...
...
@@ -2633,15 +2628,21 @@ 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 */
case
182
:
/* slimit_opt ::= SLIMIT signed SOFFSET signed */
yytestcase
(
yyruleno
==
182
);
{
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 */
case
183
:
/* slimit_opt ::= SLIMIT signed COMMA signed */
yytestcase
(
yyruleno
==
183
);
{
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
;}
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
;}
break
;
case
183
:
/* slimit_opt ::= SLIMIT signed COMMA signed */
{
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 */
...
...
@@ -2787,7 +2788,7 @@ static void yy_reduce(
case
224
:
/* cmd ::= ALTER TABLE ids cpxName ADD COLUMN columnlist */
{
yymsp
[
-
4
].
minor
.
yy0
.
n
+=
yymsp
[
-
3
].
minor
.
yy0
.
n
;
SAlterTableSQL
*
pAlterTable
=
tAlterTableSQLElems
(
&
yymsp
[
-
4
].
minor
.
yy0
,
yymsp
[
0
].
minor
.
yy
523
,
NULL
,
TSDB_ALTER_TABLE_ADD_COLUMN
);
SAlterTableSQL
*
pAlterTable
=
tAlterTableSQLElems
(
&
yymsp
[
-
4
].
minor
.
yy0
,
yymsp
[
0
].
minor
.
yy
165
,
NULL
,
TSDB_ALTER_TABLE_ADD_COLUMN
);
setSQLInfo
(
pInfo
,
pAlterTable
,
NULL
,
TSDB_SQL_ALTER_TABLE
);
}
break
;
...
...
@@ -2796,7 +2797,7 @@ static void yy_reduce(
yymsp
[
-
4
].
minor
.
yy0
.
n
+=
yymsp
[
-
3
].
minor
.
yy0
.
n
;
toTSDBType
(
yymsp
[
0
].
minor
.
yy0
.
type
);
tVariantList
*
K
=
tVariantListAppendToken
(
NULL
,
&
yymsp
[
0
].
minor
.
yy0
,
-
1
);
SArray
*
K
=
tVariantListAppendToken
(
NULL
,
&
yymsp
[
0
].
minor
.
yy0
,
-
1
);
SAlterTableSQL
*
pAlterTable
=
tAlterTableSQLElems
(
&
yymsp
[
-
4
].
minor
.
yy0
,
NULL
,
K
,
TSDB_ALTER_TABLE_DROP_COLUMN
);
setSQLInfo
(
pInfo
,
pAlterTable
,
NULL
,
TSDB_SQL_ALTER_TABLE
);
...
...
@@ -2805,7 +2806,7 @@ static void yy_reduce(
case
226
:
/* cmd ::= ALTER TABLE ids cpxName ADD TAG columnlist */
{
yymsp
[
-
4
].
minor
.
yy0
.
n
+=
yymsp
[
-
3
].
minor
.
yy0
.
n
;
SAlterTableSQL
*
pAlterTable
=
tAlterTableSQLElems
(
&
yymsp
[
-
4
].
minor
.
yy0
,
yymsp
[
0
].
minor
.
yy
523
,
NULL
,
TSDB_ALTER_TABLE_ADD_TAG_COLUMN
);
SAlterTableSQL
*
pAlterTable
=
tAlterTableSQLElems
(
&
yymsp
[
-
4
].
minor
.
yy0
,
yymsp
[
0
].
minor
.
yy
165
,
NULL
,
TSDB_ALTER_TABLE_ADD_TAG_COLUMN
);
setSQLInfo
(
pInfo
,
pAlterTable
,
NULL
,
TSDB_SQL_ALTER_TABLE
);
}
break
;
...
...
@@ -2814,7 +2815,7 @@ static void yy_reduce(
yymsp
[
-
4
].
minor
.
yy0
.
n
+=
yymsp
[
-
3
].
minor
.
yy0
.
n
;
toTSDBType
(
yymsp
[
0
].
minor
.
yy0
.
type
);
tVariantList
*
A
=
tVariantListAppendToken
(
NULL
,
&
yymsp
[
0
].
minor
.
yy0
,
-
1
);
SArray
*
A
=
tVariantListAppendToken
(
NULL
,
&
yymsp
[
0
].
minor
.
yy0
,
-
1
);
SAlterTableSQL
*
pAlterTable
=
tAlterTableSQLElems
(
&
yymsp
[
-
4
].
minor
.
yy0
,
NULL
,
A
,
TSDB_ALTER_TABLE_DROP_TAG_COLUMN
);
setSQLInfo
(
pInfo
,
pAlterTable
,
NULL
,
TSDB_SQL_ALTER_TABLE
);
...
...
@@ -2825,7 +2826,7 @@ static void yy_reduce(
yymsp
[
-
5
].
minor
.
yy0
.
n
+=
yymsp
[
-
4
].
minor
.
yy0
.
n
;
toTSDBType
(
yymsp
[
-
1
].
minor
.
yy0
.
type
);
tVariantList
*
A
=
tVariantListAppendToken
(
NULL
,
&
yymsp
[
-
1
].
minor
.
yy0
,
-
1
);
SArray
*
A
=
tVariantListAppendToken
(
NULL
,
&
yymsp
[
-
1
].
minor
.
yy0
,
-
1
);
toTSDBType
(
yymsp
[
0
].
minor
.
yy0
.
type
);
A
=
tVariantListAppendToken
(
A
,
&
yymsp
[
0
].
minor
.
yy0
,
-
1
);
...
...
@@ -2839,7 +2840,7 @@ static void yy_reduce(
yymsp
[
-
6
].
minor
.
yy0
.
n
+=
yymsp
[
-
5
].
minor
.
yy0
.
n
;
toTSDBType
(
yymsp
[
-
2
].
minor
.
yy0
.
type
);
tVariantList
*
A
=
tVariantListAppendToken
(
NULL
,
&
yymsp
[
-
2
].
minor
.
yy0
,
-
1
);
SArray
*
A
=
tVariantListAppendToken
(
NULL
,
&
yymsp
[
-
2
].
minor
.
yy0
,
-
1
);
A
=
tVariantListAppend
(
A
,
&
yymsp
[
0
].
minor
.
yy134
,
-
1
);
SAlterTableSQL
*
pAlterTable
=
tAlterTableSQLElems
(
&
yymsp
[
-
6
].
minor
.
yy0
,
NULL
,
A
,
TSDB_ALTER_TABLE_UPDATE_TAG_VAL
);
...
...
@@ -3146,4 +3147,4 @@ void Parse(
}
#endif
return
;
}
\ No newline at end of file
}
src/rpc/src/rpcTcp.c
浏览文件 @
9e87f232
...
...
@@ -373,8 +373,8 @@ void *taosOpenTcpClientConnection(void *shandle, void *thandle, uint32_t ip, uin
tDebug
(
"%s %p TCP connection to 0x%x:%hu is created, localPort:%hu FD:%p numOfFds:%d"
,
pThreadObj
->
label
,
thandle
,
ip
,
port
,
localPort
,
pFdObj
,
pThreadObj
->
numOfFds
);
}
else
{
taosCloseSocket
(
fd
);
tError
(
"%s failed to malloc client FdObj(%s)"
,
pThreadObj
->
label
,
strerror
(
errno
));
taosCloseSocket
(
fd
);
}
return
pFdObj
;
...
...
src/tsdb/src/tsdbMemTable.c
浏览文件 @
9e87f232
...
...
@@ -143,7 +143,7 @@ void tsdbUnTakeMemSnapShot(STsdbRepo *pRepo, SMemTable *pMem, SMemTable *pIMem)
tsdbUnRefMemTable
(
pRepo
,
pIMem
);
}
tsdbDebug
(
"vgId:%d utake memory snapshot, pMem %p pIMem %p"
,
REPO_ID
(
pRepo
),
pMem
,
pIMem
);
tsdbDebug
(
"vgId:%d u
n
take memory snapshot, pMem %p pIMem %p"
,
REPO_ID
(
pRepo
),
pMem
,
pIMem
);
}
void
*
tsdbAllocBytes
(
STsdbRepo
*
pRepo
,
int
bytes
)
{
...
...
src/tsdb/src/tsdbRead.c
浏览文件 @
9e87f232
...
...
@@ -120,8 +120,6 @@ typedef struct STsdbQueryHandle {
SDataCols
*
pDataCols
;
// in order to hold current file data block
int32_t
allocSize
;
// allocated data block size
SMemRef
*
pMemRef
;
// SMemTable *mem; // mem-table
// SMemTable *imem; // imem-table, acquired from snapshot
SArray
*
defaultLoadColumn
;
// default load column
SDataBlockLoadInfo
dataBlockLoadInfo
;
/* record current block load information */
SLoadCompBlockInfo
compBlockLoadInfo
;
/* record current compblock information in SQuery */
...
...
@@ -194,9 +192,12 @@ static void tsdbMayTakeMemSnapshot(STsdbQueryHandle* pQueryHandle) {
}
static
void
tsdbMayUnTakeMemSnapshot
(
STsdbQueryHandle
*
pQueryHandle
)
{
assert
(
pQueryHandle
!=
NULL
&&
pQueryHandle
->
pMemRef
!=
NULL
);
assert
(
pQueryHandle
!=
NULL
);
SMemRef
*
pMemRef
=
pQueryHandle
->
pMemRef
;
if
(
pMemRef
==
NULL
)
{
// it has been freed
return
;
}
if
(
--
pMemRef
->
ref
==
0
)
{
tsdbUnTakeMemSnapShot
(
pQueryHandle
->
pTsdb
,
pMemRef
->
mem
,
pMemRef
->
imem
);
pMemRef
->
mem
=
NULL
;
...
...
@@ -205,6 +206,7 @@ static void tsdbMayUnTakeMemSnapshot(STsdbQueryHandle* pQueryHandle) {
pQueryHandle
->
pMemRef
=
NULL
;
}
static
SArray
*
createCheckInfoFromTableGroup
(
STsdbQueryHandle
*
pQueryHandle
,
STableGroupInfo
*
pGroupList
,
STsdbMeta
*
pMeta
)
{
size_t
sizeOfGroup
=
taosArrayGetSize
(
pGroupList
->
pGroupList
);
assert
(
sizeOfGroup
>=
1
&&
pMeta
!=
NULL
);
...
...
@@ -1849,6 +1851,8 @@ static bool doHasDataInBuffer(STsdbQueryHandle* pQueryHandle) {
pQueryHandle
->
activeIndex
+=
1
;
}
// no data in memtable or imemtable, decrease the memory reference.
tsdbMayUnTakeMemSnapshot
(
pQueryHandle
);
return
false
;
}
...
...
@@ -1976,116 +1980,130 @@ static void destroyHelper(void* param) {
free
(
param
);
}
// handle data in cache situation
bool
tsdbNextDataBlock
(
TsdbQueryHandleT
*
pHandle
)
{
STsdbQueryHandle
*
pQueryHandle
=
(
STsdbQueryHandle
*
)
pHandle
;
static
bool
getNeighborRows
(
STsdbQueryHandle
*
pQueryHandle
)
{
assert
(
pQueryHandle
->
type
==
TSDB_QUERY_TYPE_EXTERNAL
);
int64_t
stime
=
taosGetTimestampUs
();
int64_t
elapsedTime
=
stime
;
SDataBlockInfo
blockInfo
=
{{
0
},
0
};
size_t
numOfTables
=
taosArrayGetSize
(
pQueryHandle
->
pTableCheckInfo
)
;
assert
(
numOfTables
>
0
)
;
pQueryHandle
->
type
=
TSDB_QUERY_TYPE_ALL
;
pQueryHandle
->
order
=
TSDB_ORDER_DESC
;
SDataBlockInfo
blockInfo
=
{{
0
},
0
};
if
(
pQueryHandle
->
type
==
TSDB_QUERY_TYPE_EXTERNAL
)
{
pQueryHandle
->
type
=
TSDB_QUERY_TYPE_ALL
;
pQueryHandle
->
order
=
TSDB_ORDER_DESC
;
if
(
!
tsdbNextDataBlock
((
void
*
)
pQueryHandle
))
{
return
false
;
}
if
(
!
tsdbNextDataBlock
(
pHandle
))
{
return
false
;
tsdbRetrieveDataBlockInfo
((
void
*
)
pQueryHandle
,
&
blockInfo
);
/*SArray *pDataBlock = */
tsdbRetrieveDataBlock
((
void
*
)
pQueryHandle
,
pQueryHandle
->
defaultLoadColumn
);
if
(
terrno
!=
TSDB_CODE_SUCCESS
)
{
return
false
;
}
if
(
pQueryHandle
->
cur
.
win
.
ekey
==
pQueryHandle
->
window
.
skey
)
{
// data already retrieve, discard other data rows and return
int32_t
numOfCols
=
(
int32_t
)(
QH_GET_NUM_OF_COLS
(
pQueryHandle
));
for
(
int32_t
i
=
0
;
i
<
numOfCols
;
++
i
)
{
SColumnInfoData
*
pCol
=
taosArrayGet
(
pQueryHandle
->
pColumns
,
i
);
memcpy
((
char
*
)
pCol
->
pData
,
(
char
*
)
pCol
->
pData
+
pCol
->
info
.
bytes
*
(
pQueryHandle
->
cur
.
rows
-
1
),
pCol
->
info
.
bytes
);
}
tsdbRetrieveDataBlockInfo
(
pHandle
,
&
blockInfo
);
/*SArray *pDataBlock = */
tsdbRetrieveDataBlock
(
pHandle
,
pQueryHandle
->
defaultLoadColumn
);
if
(
terrno
!=
TSDB_CODE_SUCCESS
)
{
pQueryHandle
->
cur
.
win
=
(
STimeWindow
){
pQueryHandle
->
window
.
skey
,
pQueryHandle
->
window
.
skey
};
pQueryHandle
->
window
=
pQueryHandle
->
cur
.
win
;
pQueryHandle
->
cur
.
rows
=
1
;
pQueryHandle
->
type
=
TSDB_QUERY_TYPE_ALL
;
return
true
;
}
else
{
STimeWindow
win
=
(
STimeWindow
)
{
pQueryHandle
->
window
.
skey
,
INT64_MAX
};
STsdbQueryCond
cond
=
{
.
order
=
TSDB_ORDER_ASC
,
.
numOfCols
=
(
int32_t
)(
QH_GET_NUM_OF_COLS
(
pQueryHandle
))
};
cond
.
twindow
=
win
;
cond
.
colList
=
calloc
(
cond
.
numOfCols
,
sizeof
(
SColumnInfo
));
if
(
cond
.
colList
==
NULL
)
{
terrno
=
TSDB_CODE_QRY_OUT_OF_MEMORY
;
return
false
;
}
if
(
pQueryHandle
->
cur
.
win
.
ekey
==
pQueryHandle
->
window
.
skey
)
{
// data already retrieve, discard other data rows and return
int32_t
numOfCols
=
(
int32_t
)(
QH_GET_NUM_OF_COLS
(
pQueryHandle
));
for
(
int32_t
i
=
0
;
i
<
numOfCols
;
++
i
)
{
SColumnInfoData
*
pCol
=
taosArrayGet
(
pQueryHandle
->
pColumns
,
i
);
memcpy
((
char
*
)
pCol
->
pData
,
(
char
*
)
pCol
->
pData
+
pCol
->
info
.
bytes
*
(
pQueryHandle
->
cur
.
rows
-
1
),
pCol
->
info
.
bytes
);
}
pQueryHandle
->
cur
.
win
=
(
STimeWindow
){
pQueryHandle
->
window
.
skey
,
pQueryHandle
->
window
.
skey
};
pQueryHandle
->
window
=
pQueryHandle
->
cur
.
win
;
pQueryHandle
->
cur
.
rows
=
1
;
pQueryHandle
->
type
=
TSDB_QUERY_TYPE_ALL
;
return
true
;
}
else
{
STimeWindow
win
=
(
STimeWindow
)
{
pQueryHandle
->
window
.
skey
,
INT64_MAX
};
STsdbQueryCond
cond
=
{
.
order
=
TSDB_ORDER_ASC
,
.
numOfCols
=
(
int32_t
)(
QH_GET_NUM_OF_COLS
(
pQueryHandle
))
};
cond
.
twindow
=
win
;
cond
.
colList
=
calloc
(
cond
.
numOfCols
,
sizeof
(
SColumnInfo
));
if
(
cond
.
colList
==
NULL
)
{
terrno
=
TSDB_CODE_QRY_OUT_OF_MEMORY
;
return
false
;
}
for
(
int32_t
i
=
0
;
i
<
cond
.
numOfCols
;
++
i
)
{
SColumnInfoData
*
pColInfoData
=
taosArrayGet
(
pQueryHandle
->
pColumns
,
i
);
memcpy
(
&
cond
.
colList
[
i
],
&
pColInfoData
->
info
,
sizeof
(
SColumnInfo
));
}
for
(
int32_t
i
=
0
;
i
<
cond
.
numOfCols
;
++
i
)
{
SColumnInfoData
*
pColInfoData
=
taosArrayGet
(
pQueryHandle
->
pColumns
,
i
);
memcpy
(
&
cond
.
colList
[
i
],
&
pColInfoData
->
info
,
sizeof
(
SColumnInfo
));
}
STsdbQueryHandle
*
pSecQueryHandle
=
tsdbQueryTablesImpl
(
pQueryHandle
->
pTsdb
,
&
cond
,
pQueryHandle
->
qinfo
,
pQueryHandle
->
pMemRef
);
tfree
(
cond
.
colList
);
pSecQueryHandle
->
pTableCheckInfo
=
createCheckInfoFromCheckInfo
(
pQueryHandle
->
pTableCheckInfo
,
pSecQueryHandle
->
window
.
skey
);
if
(
pSecQueryHandle
->
pTableCheckInfo
==
NULL
)
{
tsdbCleanupQueryHandle
(
pSecQueryHandle
);
return
false
;
}
if
(
!
tsdbNextDataBlock
((
void
*
)
pSecQueryHandle
))
{
tsdbCleanupQueryHandle
(
pSecQueryHandle
);
return
false
;
}
pSecQueryHandle
->
pTableCheckInfo
=
createCheckInfoFromCheckInfo
(
pQueryHandle
->
pTableCheckInfo
,
pSecQueryHandle
->
window
.
skey
);
if
(
pSecQueryHandle
->
pTableCheckInfo
==
NULL
)
{
tsdbCleanupQueryHandle
(
pSecQueryHandle
);
return
false
;
}
tsdbRetrieveDataBlockInfo
((
void
*
)
pSecQueryHandle
,
&
blockInfo
);
tsdbRetrieveDataBlock
((
void
*
)
pSecQueryHandle
,
pSecQueryHandle
->
defaultLoadColumn
);
if
(
!
tsdbNextDataBlock
((
void
*
)
pSecQueryHandle
))
{
tsdbCleanupQueryHandle
(
pSecQueryHandle
);
return
false
;
}
int32_t
numOfCols
=
(
int32_t
)(
QH_GET_NUM_OF_COLS
(
pSecQueryHandle
)
);
size_t
si
=
taosArrayGetSize
(
pSecQueryHandle
->
pTableCheckInfo
);
tsdbRetrieveDataBlockInfo
((
void
*
)
pSecQueryHandle
,
&
blockInfo
);
tsdbRetrieveDataBlock
((
void
*
)
pSecQueryHandle
,
pSecQueryHandle
->
defaultLoadColumn
);
for
(
int32_t
i
=
0
;
i
<
numOfCols
;
++
i
)
{
SColumnInfoData
*
pCol
=
taosArrayGet
(
pQueryHandle
->
pColumns
,
i
);
memcpy
((
char
*
)
pCol
->
pData
,
(
char
*
)
pCol
->
pData
+
pCol
->
info
.
bytes
*
(
pQueryHandle
->
cur
.
rows
-
1
),
pCol
->
info
.
bytes
);
int32_t
numOfCols
=
(
int32_t
)(
QH_GET_NUM_OF_COLS
(
pSecQueryHandle
));
size_t
si
=
taosArrayGetSize
(
pSecQueryHandle
->
pTableCheckInfo
);
SColumnInfoData
*
pCol1
=
taosArrayGet
(
pSecQueryHandle
->
pColumns
,
i
);
assert
(
pCol
->
info
.
colId
==
pCol1
->
info
.
colId
);
for
(
int32_t
i
=
0
;
i
<
numOfCols
;
++
i
)
{
SColumnInfoData
*
pCol
=
taosArrayGet
(
pQueryHandle
->
pColumns
,
i
);
memcpy
((
char
*
)
pCol
->
pData
,
(
char
*
)
pCol
->
pData
+
pCol
->
info
.
bytes
*
(
pQueryHandle
->
cur
.
rows
-
1
),
pCol
->
info
.
bytes
);
memcpy
((
char
*
)
pCol
->
pData
+
pCol
->
info
.
bytes
,
pCol1
->
pData
,
pCol1
->
info
.
bytes
);
}
SColumnInfoData
*
pCol1
=
taosArrayGet
(
pSecQueryHandle
->
pColumns
,
i
);
assert
(
pCol
->
info
.
colId
==
pCol1
->
info
.
colId
);
SColumnInfoData
*
pTSCol
=
taosArrayGet
(
pQueryHandle
->
pColumns
,
0
);
memcpy
((
char
*
)
pCol
->
pData
+
pCol
->
info
.
bytes
,
pCol1
->
pData
,
pCol1
->
info
.
bytes
);
}
// it is ascending order
pQueryHandle
->
order
=
TSDB_ORDER_DESC
;
pQueryHandle
->
window
=
pQueryHandle
->
cur
.
win
;
pQueryHandle
->
cur
.
win
=
(
STimeWindow
){((
TSKEY
*
)
pTSCol
->
pData
)[
0
],
((
TSKEY
*
)
pTSCol
->
pData
)[
1
]};
pQueryHandle
->
cur
.
rows
=
2
;
pQueryHandle
->
cur
.
mixBlock
=
true
;
SColumnInfoData
*
pTSCol
=
taosArrayGet
(
pQueryHandle
->
pColumns
,
0
);
int32_t
step
=
-
1
;
// one step for ascending order traverse
for
(
int32_t
j
=
0
;
j
<
si
;
++
j
)
{
STableCheckInfo
*
pCheckInfo
=
(
STableCheckInfo
*
)
taosArrayGet
(
pQueryHandle
->
pTableCheckInfo
,
j
);
pCheckInfo
->
lastKey
=
pQueryHandle
->
cur
.
win
.
ekey
+
step
;
}
// it is ascending order
pQueryHandle
->
order
=
TSDB_ORDER_DESC
;
pQueryHandle
->
window
=
pQueryHandle
->
cur
.
win
;
pQueryHandle
->
cur
.
win
=
(
STimeWindow
){((
TSKEY
*
)
pTSCol
->
pData
)[
0
],
((
TSKEY
*
)
pTSCol
->
pData
)[
1
]};
pQueryHandle
->
cur
.
rows
=
2
;
pQueryHandle
->
cur
.
mixBlock
=
true
;
tsdbCleanupQueryHandle
(
pSecQueryHandle
);
int32_t
step
=
-
1
;
// one step for ascending order traverse
for
(
int32_t
j
=
0
;
j
<
si
;
++
j
)
{
STableCheckInfo
*
pCheckInfo
=
(
STableCheckInfo
*
)
taosArrayGet
(
pQueryHandle
->
pTableCheckInfo
,
j
);
pCheckInfo
->
lastKey
=
pQueryHandle
->
cur
.
win
.
ekey
+
step
;
}
//disable it after retrieve data
pQueryHandle
->
type
=
TSDB_QUERY_TYPE_EXTERNAL
;
pQueryHandle
->
checkFiles
=
false
;
return
true
;
tsdbCleanupQueryHandle
(
pSecQueryHandle
);
}
//disable it after retrieve data
pQueryHandle
->
type
=
TSDB_QUERY_TYPE_EXTERNAL
;
pQueryHandle
->
checkFiles
=
false
;
return
true
;
}
// handle data in cache situation
bool
tsdbNextDataBlock
(
TsdbQueryHandleT
*
pHandle
)
{
STsdbQueryHandle
*
pQueryHandle
=
(
STsdbQueryHandle
*
)
pHandle
;
int64_t
stime
=
taosGetTimestampUs
();
int64_t
elapsedTime
=
stime
;
size_t
numOfTables
=
taosArrayGetSize
(
pQueryHandle
->
pTableCheckInfo
);
assert
(
numOfTables
>
0
);
if
(
pQueryHandle
->
type
==
TSDB_QUERY_TYPE_EXTERNAL
)
{
SMemRef
*
pMemRef
=
pQueryHandle
->
pMemRef
;
tsdbMayTakeMemSnapshot
(
pQueryHandle
);
bool
ret
=
getNeighborRows
(
pQueryHandle
);
tsdbMayUnTakeMemSnapshot
(
pQueryHandle
);
// restore the pMemRef
pQueryHandle
->
pMemRef
=
pMemRef
;
return
ret
;
}
if
(
pQueryHandle
->
checkFiles
)
{
...
...
@@ -2343,7 +2361,7 @@ void filterPrepare(void* expr, void* param) {
if
(
pInfo
->
optr
==
TSDB_RELATION_IN
)
{
pInfo
->
q
=
(
char
*
)
pCond
->
arr
;
}
else
{
}
else
if
(
pCond
!=
NULL
)
{
uint32_t
size
=
pCond
->
nLen
*
TSDB_NCHAR_SIZE
;
if
(
size
<
(
uint32_t
)
pSchema
->
bytes
)
{
size
=
pSchema
->
bytes
;
...
...
src/util/inc/tarray.h
浏览文件 @
9e87f232
...
...
@@ -70,6 +70,13 @@ void* taosArrayGet(const SArray* pArray, size_t index);
*/
void
*
taosArrayGetP
(
const
SArray
*
pArray
,
size_t
index
);
/**
* get the last element in the array list
* @param pArray
* @return
*/
void
*
taosArrayGetLast
(
const
SArray
*
pArray
);
/**
* return the size of array
* @param pArray
...
...
@@ -117,6 +124,13 @@ void taosArrayClear(SArray* pArray);
*/
void
taosArrayDestroy
(
SArray
*
pArray
);
/**
*
* @param pArray
* @param fp
*/
void
taosArrayDestroyEx
(
SArray
*
pArray
,
void
(
*
fp
)(
void
*
));
/**
* sort the array
* @param pArray
...
...
src/util/src/tarray.c
浏览文件 @
9e87f232
...
...
@@ -99,6 +99,10 @@ void* taosArrayGetP(const SArray* pArray, size_t index) {
return
*
(
void
**
)
d
;
}
void
*
taosArrayGetLast
(
const
SArray
*
pArray
)
{
return
TARRAY_GET_ELEM
(
pArray
,
pArray
->
size
-
1
);
}
size_t
taosArrayGetSize
(
const
SArray
*
pArray
)
{
return
pArray
->
size
;
}
void
*
taosArrayInsert
(
SArray
*
pArray
,
size_t
index
,
void
*
pData
)
{
...
...
@@ -189,6 +193,23 @@ void taosArrayDestroy(SArray* pArray) {
free
(
pArray
);
}
void
taosArrayDestroyEx
(
SArray
*
pArray
,
void
(
*
fp
)(
void
*
))
{
if
(
pArray
==
NULL
)
{
return
;
}
if
(
fp
==
NULL
)
{
taosArrayDestroy
(
pArray
);
return
;
}
for
(
int32_t
i
=
0
;
i
<
pArray
->
size
;
++
i
)
{
fp
(
TARRAY_GET_ELEM
(
pArray
,
i
));
}
taosArrayDestroy
(
pArray
);
}
void
taosArraySort
(
SArray
*
pArray
,
int
(
*
compar
)(
const
void
*
,
const
void
*
))
{
assert
(
pArray
!=
NULL
);
assert
(
compar
!=
NULL
);
...
...
src/util/src/tcache.c
浏览文件 @
9e87f232
...
...
@@ -658,7 +658,11 @@ void* taosCacheTimedRefresh(void *handle) {
int64_t
count
=
0
;
while
(
1
)
{
#if defined LINUX
usleep
(
500
*
1000
);
#else
taosMsleep
(
500
);
#endif
// check if current cache object will be deleted every 500ms.
if
(
pCacheObj
->
deleting
)
{
...
...
@@ -677,6 +681,7 @@ void* taosCacheTimedRefresh(void *handle) {
continue
;
}
uDebug
(
"%s refresh thread timed scan"
,
pCacheObj
->
name
);
pCacheObj
->
statistics
.
refreshCount
++
;
// refresh data in hash table
...
...
src/util/src/tcompare.c
浏览文件 @
9e87f232
#include "taosdef.h"
#include "tcompare.h"
#include "tarray.h"
#include "tutil.h"
int32_t
compareInt32Val
(
const
void
*
pLeft
,
const
void
*
pRight
)
{
int32_t
left
=
GET_INT32_VAL
(
pLeft
),
right
=
GET_INT32_VAL
(
pRight
);
...
...
src/vnode/src/vnodeMain.c
浏览文件 @
9e87f232
...
...
@@ -315,7 +315,13 @@ int32_t vnodeOpen(int32_t vnode, char *rootDir) {
pVnode
->
version
=
walGetVersion
(
pVnode
->
wal
);
}
tsdbSyncCommit
(
pVnode
->
tsdb
);
code
=
tsdbSyncCommit
(
pVnode
->
tsdb
);
if
(
code
!=
0
)
{
vError
(
"vgId:%d, failed to commit after restore from wal since %s"
,
pVnode
->
vgId
,
tstrerror
(
code
));
vnodeCleanUp
(
pVnode
);
return
code
;
}
walRemoveAllOldFiles
(
pVnode
->
wal
);
walRenew
(
pVnode
->
wal
);
...
...
@@ -412,6 +418,7 @@ void vnodeRelease(void *pVnodeRaw) {
}
if
(
pVnode
->
wal
)
{
walRemoveAllOldFiles
(
pVnode
->
wal
);
walClose
(
pVnode
->
wal
);
pVnode
->
wal
=
NULL
;
}
...
...
@@ -589,7 +596,11 @@ static int vnodeProcessTsdbStatus(void *arg, int status) {
if
(
status
==
TSDB_STATUS_COMMIT_START
)
{
pVnode
->
fversion
=
pVnode
->
version
;
vDebug
(
"vgId:%d, start commit, fver:%"
PRIu64
" vver:%"
PRIu64
,
pVnode
->
vgId
,
pVnode
->
fversion
,
pVnode
->
version
);
return
walRenew
(
pVnode
->
wal
);
if
(
pVnode
->
status
==
TAOS_VN_STATUS_INIT
)
{
return
0
;
}
else
{
return
walRenew
(
pVnode
->
wal
);
}
}
if
(
status
==
TSDB_STATUS_COMMIT_OVER
)
{
...
...
src/wal/src/walMgmt.c
浏览文件 @
9e87f232
...
...
@@ -124,15 +124,7 @@ void walClose(void *handle) {
SWal
*
pWal
=
handle
;
pthread_mutex_lock
(
&
pWal
->
mutex
);
taosClose
(
pWal
->
fd
);
if
(
pWal
->
keep
!=
TAOS_WAL_KEEP
)
{
walRemoveAllOldFiles
(
pWal
);
}
else
{
wDebug
(
"vgId:%d, wal:%p file:%s, it is closed and kept"
,
pWal
->
vgId
,
pWal
,
pWal
->
name
);
}
pthread_mutex_unlock
(
&
pWal
->
mutex
);
taosRemoveRef
(
tsWal
.
refId
,
pWal
->
rid
);
}
...
...
src/wal/src/walWrite.c
浏览文件 @
9e87f232
...
...
@@ -67,6 +67,7 @@ void walRemoveOneOldFile(void *handle) {
SWal
*
pWal
=
handle
;
if
(
pWal
==
NULL
)
return
;
if
(
pWal
->
keep
==
TAOS_WAL_KEEP
)
return
;
if
(
pWal
->
fd
<=
0
)
return
;
pthread_mutex_lock
(
&
pWal
->
mutex
);
...
...
@@ -91,6 +92,8 @@ void walRemoveAllOldFiles(void *handle) {
SWal
*
pWal
=
handle
;
int64_t
fileId
=
-
1
;
pthread_mutex_lock
(
&
pWal
->
mutex
);
while
(
walGetNextFile
(
pWal
,
&
fileId
)
>=
0
)
{
snprintf
(
pWal
->
name
,
sizeof
(
pWal
->
name
),
"%s/%s%"
PRId64
,
pWal
->
path
,
WAL_PREFIX
,
fileId
);
...
...
@@ -100,6 +103,7 @@ void walRemoveAllOldFiles(void *handle) {
wInfo
(
"vgId:%d, wal:%p file:%s, it is removed"
,
pWal
->
vgId
,
pWal
,
pWal
->
name
);
}
}
pthread_mutex_unlock
(
&
pWal
->
mutex
);
}
int32_t
walWrite
(
void
*
handle
,
SWalHead
*
pHead
)
{
...
...
tests/pytest/update/allow_update-0.py
浏览文件 @
9e87f232
###################################################################
# Copyright (c) 2016 by TAOS Technologies, Inc.
# All rights reserved.
#
# This file is proprietary and confidential to TAOS Technologies.
# No part of this file may be reproduced, stored, transmitted,
# disclosed or used in any form or by any means other than as
# expressly provided by the written permission from Jianhui Tao
#
###################################################################
# -*- coding: utf-8 -*-
import
sys
import
taos
from
util.log
import
*
from
util.cases
import
*
from
util.sql
import
*
from
util.dnodes
import
*
class
TDTestCase
:
def
init
(
self
,
conn
,
logSql
):
tdLog
.
debug
(
"start to execute %s"
%
__file__
)
tdSql
.
init
(
conn
.
cursor
(),
logSql
)
self
.
numOfRecords
=
10
self
.
ts
=
1604295582000
def
restartTaosd
(
self
):
tdDnodes
.
stop
(
1
)
tdDnodes
.
start
(
1
)
tdSql
.
execute
(
"use udb"
)
def
run
(
self
):
tdSql
.
prepare
()
startTs
=
self
.
ts
print
(
"==============step1"
)
tdSql
.
execute
(
"create database udb update 0"
)
tdSql
.
execute
(
"use udb"
)
tdSql
.
execute
(
"create table t (ts timestamp, a int)"
)
tdSql
.
execute
(
"insert into t values (%d, 1)"
%
(
startTs
))
tdSql
.
execute
(
"insert into t values (%d, 1)"
%
(
startTs
-
3
))
tdSql
.
execute
(
"insert into t values (%d, 1)"
%
(
startTs
+
3
))
tdSql
.
query
(
"select * from t"
)
tdSql
.
checkRows
(
3
)
tdSql
.
query
(
"select a from t"
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
checkData
(
1
,
0
,
1
)
tdSql
.
checkData
(
2
,
0
,
1
)
print
(
"==============step2"
)
tdSql
.
execute
(
"insert into t values (%d, 2)"
%
(
startTs
))
tdSql
.
execute
(
"insert into t values (%d, 2)"
%
(
startTs
-
3
))
tdSql
.
execute
(
"insert into t values (%d, 2)"
%
(
startTs
+
3
))
tdSql
.
query
(
"select * from t"
)
tdSql
.
checkRows
(
3
)
tdSql
.
query
(
"select a from t"
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
checkData
(
1
,
0
,
1
)
tdSql
.
checkData
(
2
,
0
,
1
)
print
(
"==============step3"
)
tdSql
.
execute
(
"insert into t values (%d, 3)"
%
(
startTs
-
4
))
tdSql
.
execute
(
"insert into t values (%d, 3)"
%
(
startTs
-
2
))
tdSql
.
execute
(
"insert into t values (%d, 3)"
%
(
startTs
+
2
))
tdSql
.
execute
(
"insert into t values (%d, 3)"
%
(
startTs
+
4
))
tdSql
.
query
(
"select * from t"
)
tdSql
.
checkRows
(
7
)
tdSql
.
query
(
"select a from t"
)
tdSql
.
checkData
(
0
,
0
,
3
)
tdSql
.
checkData
(
1
,
0
,
1
)
tdSql
.
checkData
(
2
,
0
,
3
)
tdSql
.
checkData
(
3
,
0
,
1
)
tdSql
.
checkData
(
4
,
0
,
3
)
tdSql
.
checkData
(
5
,
0
,
1
)
tdSql
.
checkData
(
6
,
0
,
3
)
print
(
"==============step4"
)
tdSql
.
execute
(
"insert into t values (%d, 4)"
%
(
startTs
-
4
))
tdSql
.
execute
(
"insert into t values (%d, 4)"
%
(
startTs
-
2
))
tdSql
.
execute
(
"insert into t values (%d, 4)"
%
(
startTs
+
2
))
tdSql
.
execute
(
"insert into t values (%d, 4)"
%
(
startTs
+
4
))
tdSql
.
query
(
"select * from t"
)
tdSql
.
checkRows
(
7
)
tdSql
.
query
(
"select a from t"
)
tdSql
.
checkData
(
0
,
0
,
3
)
tdSql
.
checkData
(
1
,
0
,
1
)
tdSql
.
checkData
(
2
,
0
,
3
)
tdSql
.
checkData
(
3
,
0
,
1
)
tdSql
.
checkData
(
4
,
0
,
3
)
tdSql
.
checkData
(
5
,
0
,
1
)
tdSql
.
checkData
(
6
,
0
,
3
)
print
(
"==============step5"
)
tdSql
.
execute
(
"insert into t values (%d, 5)"
%
(
startTs
-
1
))
tdSql
.
execute
(
"insert into t values (%d, 5)"
%
(
startTs
+
1
))
tdSql
.
query
(
"select * from t"
)
tdSql
.
checkRows
(
9
)
tdSql
.
query
(
"select a from t"
)
tdSql
.
checkData
(
0
,
0
,
3
)
tdSql
.
checkData
(
1
,
0
,
1
)
tdSql
.
checkData
(
2
,
0
,
3
)
tdSql
.
checkData
(
3
,
0
,
5
)
tdSql
.
checkData
(
4
,
0
,
1
)
tdSql
.
checkData
(
5
,
0
,
5
)
tdSql
.
checkData
(
6
,
0
,
3
)
tdSql
.
checkData
(
7
,
0
,
1
)
tdSql
.
checkData
(
8
,
0
,
3
)
print
(
"==============step6"
)
tdSql
.
execute
(
"insert into t values (%d, 6)"
%
(
startTs
-
4
))
tdSql
.
execute
(
"insert into t values (%d, 6)"
%
(
startTs
-
3
))
tdSql
.
execute
(
"insert into t values (%d, 6)"
%
(
startTs
-
2
))
tdSql
.
execute
(
"insert into t values (%d, 6)"
%
(
startTs
-
1
))
tdSql
.
execute
(
"insert into t values (%d, 6)"
%
(
startTs
))
tdSql
.
execute
(
"insert into t values (%d, 6)"
%
(
startTs
+
1
))
tdSql
.
execute
(
"insert into t values (%d, 6)"
%
(
startTs
+
2
))
tdSql
.
execute
(
"insert into t values (%d, 6)"
%
(
startTs
+
3
))
tdSql
.
execute
(
"insert into t values (%d, 6)"
%
(
startTs
+
4
))
tdSql
.
query
(
"select * from t"
)
tdSql
.
checkRows
(
9
)
tdSql
.
query
(
"select a from t"
)
tdSql
.
checkData
(
0
,
0
,
3
)
tdSql
.
checkData
(
1
,
0
,
1
)
tdSql
.
checkData
(
2
,
0
,
3
)
tdSql
.
checkData
(
3
,
0
,
5
)
tdSql
.
checkData
(
4
,
0
,
1
)
tdSql
.
checkData
(
5
,
0
,
5
)
tdSql
.
checkData
(
6
,
0
,
3
)
tdSql
.
checkData
(
7
,
0
,
1
)
tdSql
.
checkData
(
8
,
0
,
3
)
# restart taosd to commit, and check
self
.
restartTaosd
();
tdSql
.
query
(
"select * from t"
)
tdSql
.
checkRows
(
9
)
tdSql
.
query
(
"select a from t"
)
tdSql
.
checkData
(
0
,
0
,
3
)
tdSql
.
checkData
(
1
,
0
,
1
)
tdSql
.
checkData
(
2
,
0
,
3
)
tdSql
.
checkData
(
3
,
0
,
5
)
tdSql
.
checkData
(
4
,
0
,
1
)
tdSql
.
checkData
(
5
,
0
,
5
)
tdSql
.
checkData
(
6
,
0
,
3
)
tdSql
.
checkData
(
7
,
0
,
1
)
tdSql
.
checkData
(
8
,
0
,
3
)
def
stop
(
self
):
tdSql
.
close
()
tdLog
.
success
(
"%s successfully executed"
%
__file__
)
tdCases
.
addWindows
(
__file__
,
TDTestCase
())
tdCases
.
addLinux
(
__file__
,
TDTestCase
())
###################################################################
# Copyright (c) 2016 by TAOS Technologies, Inc.
# All rights reserved.
#
# This file is proprietary and confidential to TAOS Technologies.
# No part of this file may be reproduced, stored, transmitted,
# disclosed or used in any form or by any means other than as
# expressly provided by the written permission from Jianhui Tao
#
###################################################################
# -*- coding: utf-8 -*-
import
sys
import
taos
from
util.log
import
*
from
util.cases
import
*
from
util.sql
import
*
from
util.dnodes
import
*
class
TDTestCase
:
def
init
(
self
,
conn
,
logSql
):
tdLog
.
debug
(
"start to execute %s"
%
__file__
)
tdSql
.
init
(
conn
.
cursor
(),
logSql
)
self
.
numOfRecords
=
10
self
.
ts
=
1604295582000
def
restartTaosd
(
self
):
tdDnodes
.
stop
(
1
)
tdDnodes
.
start
(
1
)
tdSql
.
execute
(
"use udb"
)
def
run
(
self
):
tdSql
.
prepare
()
startTs
=
self
.
ts
print
(
"==============step1"
)
tdSql
.
execute
(
"create database udb update 0"
)
tdSql
.
execute
(
"use udb"
)
tdSql
.
execute
(
"create table t (ts timestamp, a int)"
)
tdSql
.
execute
(
"insert into t values (%d, 1)"
%
(
startTs
))
tdSql
.
execute
(
"insert into t values (%d, 1)"
%
(
startTs
-
3
))
tdSql
.
execute
(
"insert into t values (%d, 1)"
%
(
startTs
+
3
))
tdSql
.
query
(
"select * from t"
)
tdSql
.
checkRows
(
3
)
tdSql
.
query
(
"select a from t"
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
checkData
(
1
,
0
,
1
)
tdSql
.
checkData
(
2
,
0
,
1
)
print
(
"==============step2"
)
tdSql
.
execute
(
"insert into t values (%d, 2)"
%
(
startTs
))
tdSql
.
execute
(
"insert into t values (%d, 2)"
%
(
startTs
-
3
))
tdSql
.
execute
(
"insert into t values (%d, 2)"
%
(
startTs
+
3
))
tdSql
.
query
(
"select * from t"
)
tdSql
.
checkRows
(
3
)
tdSql
.
query
(
"select a from t"
)
tdSql
.
checkData
(
0
,
0
,
1
)
tdSql
.
checkData
(
1
,
0
,
1
)
tdSql
.
checkData
(
2
,
0
,
1
)
print
(
"==============step3"
)
tdSql
.
execute
(
"insert into t values (%d, 3)"
%
(
startTs
-
4
))
tdSql
.
execute
(
"insert into t values (%d, 3)"
%
(
startTs
-
2
))
tdSql
.
execute
(
"insert into t values (%d, 3)"
%
(
startTs
+
2
))
tdSql
.
execute
(
"insert into t values (%d, 3)"
%
(
startTs
+
4
))
tdSql
.
query
(
"select * from t"
)
tdSql
.
checkRows
(
7
)
tdSql
.
query
(
"select a from t"
)
tdSql
.
checkData
(
0
,
0
,
3
)
tdSql
.
checkData
(
1
,
0
,
1
)
tdSql
.
checkData
(
2
,
0
,
3
)
tdSql
.
checkData
(
3
,
0
,
1
)
tdSql
.
checkData
(
4
,
0
,
3
)
tdSql
.
checkData
(
5
,
0
,
1
)
tdSql
.
checkData
(
6
,
0
,
3
)
print
(
"==============step4"
)
tdSql
.
execute
(
"insert into t values (%d, 4)"
%
(
startTs
-
4
))
tdSql
.
execute
(
"insert into t values (%d, 4)"
%
(
startTs
-
2
))
tdSql
.
execute
(
"insert into t values (%d, 4)"
%
(
startTs
+
2
))
tdSql
.
execute
(
"insert into t values (%d, 4)"
%
(
startTs
+
4
))
tdSql
.
query
(
"select * from t"
)
tdSql
.
checkRows
(
7
)
tdSql
.
query
(
"select a from t"
)
tdSql
.
checkData
(
0
,
0
,
3
)
tdSql
.
checkData
(
1
,
0
,
1
)
tdSql
.
checkData
(
2
,
0
,
3
)
tdSql
.
checkData
(
3
,
0
,
1
)
tdSql
.
checkData
(
4
,
0
,
3
)
tdSql
.
checkData
(
5
,
0
,
1
)
tdSql
.
checkData
(
6
,
0
,
3
)
print
(
"==============step5"
)
tdSql
.
execute
(
"insert into t values (%d, 5)"
%
(
startTs
-
1
))
tdSql
.
execute
(
"insert into t values (%d, 5)"
%
(
startTs
+
1
))
tdSql
.
query
(
"select * from t"
)
tdSql
.
checkRows
(
9
)
tdSql
.
query
(
"select a from t"
)
tdSql
.
checkData
(
0
,
0
,
3
)
tdSql
.
checkData
(
1
,
0
,
1
)
tdSql
.
checkData
(
2
,
0
,
3
)
tdSql
.
checkData
(
3
,
0
,
5
)
tdSql
.
checkData
(
4
,
0
,
1
)
tdSql
.
checkData
(
5
,
0
,
5
)
tdSql
.
checkData
(
6
,
0
,
3
)
tdSql
.
checkData
(
7
,
0
,
1
)
tdSql
.
checkData
(
8
,
0
,
3
)
print
(
"==============step6"
)
tdSql
.
execute
(
"insert into t values (%d, 6)"
%
(
startTs
-
4
))
tdSql
.
execute
(
"insert into t values (%d, 6)"
%
(
startTs
-
3
))
tdSql
.
execute
(
"insert into t values (%d, 6)"
%
(
startTs
-
2
))
tdSql
.
execute
(
"insert into t values (%d, 6)"
%
(
startTs
-
1
))
tdSql
.
execute
(
"insert into t values (%d, 6)"
%
(
startTs
))
tdSql
.
execute
(
"insert into t values (%d, 6)"
%
(
startTs
+
1
))
tdSql
.
execute
(
"insert into t values (%d, 6)"
%
(
startTs
+
2
))
tdSql
.
execute
(
"insert into t values (%d, 6)"
%
(
startTs
+
3
))
tdSql
.
execute
(
"insert into t values (%d, 6)"
%
(
startTs
+
4
))
tdSql
.
query
(
"select * from t"
)
tdSql
.
checkRows
(
9
)
tdSql
.
query
(
"select a from t"
)
tdSql
.
checkData
(
0
,
0
,
3
)
tdSql
.
checkData
(
1
,
0
,
1
)
tdSql
.
checkData
(
2
,
0
,
3
)
tdSql
.
checkData
(
3
,
0
,
5
)
tdSql
.
checkData
(
4
,
0
,
1
)
tdSql
.
checkData
(
5
,
0
,
5
)
tdSql
.
checkData
(
6
,
0
,
3
)
tdSql
.
checkData
(
7
,
0
,
1
)
tdSql
.
checkData
(
8
,
0
,
3
)
# restart taosd to commit, and check
self
.
restartTaosd
();
tdSql
.
query
(
"select * from t"
)
tdSql
.
checkRows
(
9
)
tdSql
.
query
(
"select a from t"
)
tdSql
.
checkData
(
0
,
0
,
3
)
tdSql
.
checkData
(
1
,
0
,
1
)
tdSql
.
checkData
(
2
,
0
,
3
)
tdSql
.
checkData
(
3
,
0
,
5
)
tdSql
.
checkData
(
4
,
0
,
1
)
tdSql
.
checkData
(
5
,
0
,
5
)
tdSql
.
checkData
(
6
,
0
,
3
)
tdSql
.
checkData
(
7
,
0
,
1
)
tdSql
.
checkData
(
8
,
0
,
3
)
def
stop
(
self
):
tdSql
.
close
()
tdLog
.
success
(
"%s successfully executed"
%
__file__
)
tdCases
.
addWindows
(
__file__
,
TDTestCase
())
tdCases
.
addLinux
(
__file__
,
TDTestCase
())
tests/pytest/update/allow_update.py
浏览文件 @
9e87f232
此差异已折叠。
点击以展开。
tests/script/general/parser/constCol.sim
浏览文件 @
9e87f232
...
...
@@ -347,6 +347,17 @@ if $rows != 3 then
return -1
endi
sql select 0.1 + 0.2 from t1
if $rows != 3 then
return -1
endi
print =============================> td-2036
if $data00 != 0.3000000 then
print expect: 0.3000000, actual:$data00
return -1
endi
print ======================udc with normal column group by
sql_error select from t1
...
...
tests/script/general/parser/sliding.sim
浏览文件 @
9e87f232
此差异已折叠。
点击以展开。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录