Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
56fa4e71
T
TDengine
项目概览
taosdata
/
TDengine
大约 2 年 前同步成功
通知
1193
Star
22018
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
56fa4e71
编写于
5月 07, 2022
作者:
X
xywang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat(query): added bitwise or/not/xor, left/right shift features
上级
169185c6
变更
10
展开全部
隐藏空白更改
内联
并排
Showing
10 changed file
with
2059 addition
and
1503 deletion
+2059
-1503
src/client/src/tscSQLParser.c
src/client/src/tscSQLParser.c
+34
-10
src/common/src/tarithoperator.c
src/common/src/tarithoperator.c
+380
-3
src/common/src/texpr.c
src/common/src/texpr.c
+26
-6
src/inc/taosdef.h
src/inc/taosdef.h
+6
-1
src/inc/ttokendef.h
src/inc/ttokendef.h
+167
-166
src/kit/shell/src/shellEngine.c
src/kit/shell/src/shellEngine.c
+17
-10
src/query/inc/sql.y
src/query/inc/sql.y
+6
-1
src/query/src/qSqlParser.c
src/query/src/qSqlParser.c
+71
-1
src/query/src/sql.c
src/query/src/sql.c
+1348
-1305
src/util/src/ttokenizer.c
src/util/src/ttokenizer.c
+4
-0
未找到文件。
src/client/src/tscSQLParser.c
浏览文件 @
56fa4e71
...
@@ -286,6 +286,16 @@ static uint8_t convertRelationalOperator(SStrToken *pToken) {
...
@@ -286,6 +286,16 @@ static uint8_t convertRelationalOperator(SStrToken *pToken) {
return
TSDB_BINARY_OP_REMAINDER
;
return
TSDB_BINARY_OP_REMAINDER
;
case
TK_BITAND
:
case
TK_BITAND
:
return
TSDB_BINARY_OP_BITAND
;
return
TSDB_BINARY_OP_BITAND
;
case
TK_BITOR
:
return
TSDB_BINARY_OP_BITOR
;
case
TK_BITXOR
:
return
TSDB_BINARY_OP_BITXOR
;
case
TK_BITNOT
:
return
TSDB_BINARY_OP_BITNOT
;
case
TK_LSHIFT
:
return
TSDB_BINARY_OP_LSHIFT
;
case
TK_RSHIFT
:
return
TSDB_BINARY_OP_RSHIFT
;
case
TK_LIKE
:
case
TK_LIKE
:
return
TSDB_RELATION_LIKE
;
return
TSDB_RELATION_LIKE
;
case
TK_MATCH
:
case
TK_MATCH
:
...
@@ -4707,19 +4717,23 @@ static int32_t validateSQLExprItemOperatorExpr(SSqlCmd* pCmd, tSqlExpr* pExpr, S
...
@@ -4707,19 +4717,23 @@ static int32_t validateSQLExprItemOperatorExpr(SSqlCmd* pCmd, tSqlExpr* pExpr, S
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
return
ret
;
return
ret
;
}
}
int32_t
rightHeight
=
0
;
int32_t
rightHeight
=
0
;
ret
=
validateSQLExprItem
(
pCmd
,
pExpr
->
pRight
,
pQueryInfo
,
pList
,
&
rightType
,
&
uidRight
,
&
rightHeight
);
if
(
pExpr
->
tokenId
!=
TK_BITNOT
)
{
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
ret
=
validateSQLExprItem
(
pCmd
,
pExpr
->
pRight
,
pQueryInfo
,
pList
,
&
rightType
,
&
uidRight
,
&
rightHeight
);
return
ret
;
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
}
return
ret
;
}
if
(
uidLeft
!=
uidRight
&&
uidLeft
!=
0
&&
uidRight
!=
0
)
{
if
(
uidLeft
!=
uidRight
&&
uidLeft
!=
0
&&
uidRight
!=
0
)
{
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg1
);
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg1
);
}
}
}
*
uid
=
uidLeft
;
*
uid
=
uidLeft
;
*
height
=
(
leftHeight
>
rightHeight
)
?
leftHeight
+
1
:
rightHeight
+
1
;
*
height
=
(
leftHeight
>
rightHeight
)
?
leftHeight
+
1
:
rightHeight
+
1
;
{
if
(
pExpr
->
tokenId
!=
TK_BITNOT
)
{
if
(
leftType
==
SQLEXPR_TYPE_UNASSIGNED
||
rightType
==
SQLEXPR_TYPE_UNASSIGNED
)
{
if
(
leftType
==
SQLEXPR_TYPE_UNASSIGNED
||
rightType
==
SQLEXPR_TYPE_UNASSIGNED
)
{
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
"invalid operand expression"
);
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
"invalid operand expression"
);
}
}
...
@@ -4755,8 +4769,15 @@ static int32_t validateSQLExprItemOperatorExpr(SSqlCmd* pCmd, tSqlExpr* pExpr, S
...
@@ -4755,8 +4769,15 @@ static int32_t validateSQLExprItemOperatorExpr(SSqlCmd* pCmd, tSqlExpr* pExpr, S
pExpr
->
tokenId
==
TK_MATCH
||
pExpr
->
tokenId
==
TK_NMATCH
||
pExpr
->
tokenId
==
TK_MATCH
||
pExpr
->
tokenId
==
TK_NMATCH
||
pExpr
->
tokenId
==
TK_CONTAINS
||
pExpr
->
tokenId
==
TK_IN
)
{
pExpr
->
tokenId
==
TK_CONTAINS
||
pExpr
->
tokenId
==
TK_IN
)
{
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
"unsupported filtering operations"
);
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
"unsupported filtering operations"
);
}
else
if
(
pExpr
->
tokenId
==
TK_LSHIFT
||
pExpr
->
tokenId
==
TK_RSHIFT
)
{
if
(
rightType
!=
SQLEXPR_TYPE_VALUE
)
{
return
invalidOperationMsg
(
tscGetErrorMsgPayload
(
pCmd
),
"non numeric right operand"
);
}
}
}
}
else
{
*
type
=
SQLEXPR_TYPE_SCALAR
;
}
}
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
...
@@ -10376,8 +10397,11 @@ int32_t exprTreeFromSqlExpr(SSqlCmd* pCmd, tExprNode **pExpr, const tSqlExpr* pS
...
@@ -10376,8 +10397,11 @@ int32_t exprTreeFromSqlExpr(SSqlCmd* pCmd, tExprNode **pExpr, const tSqlExpr* pS
pLeft
=
pLeft
->
_node
.
pLeft
;
pLeft
=
pLeft
->
_node
.
pLeft
;
}
}
if
(
pRight
->
pVal
->
nType
==
TSDB_DATA_TYPE_BOOL
&&
pLeft
->
nodeType
==
TSQL_NODE_COL
)
{
if
(
pRight
->
pVal
->
nType
==
TSDB_DATA_TYPE_BOOL
&&
pLeft
->
nodeType
==
TSQL_NODE_COL
)
{
if
(((
*
pExpr
)
->
_node
.
optr
!=
TSDB_BINARY_OP_BITAND
&&
pLeft
->
pSchema
->
type
==
TSDB_DATA_TYPE_BOOL
)
||
if
((((
*
pExpr
)
->
_node
.
optr
!=
TSDB_BINARY_OP_BITAND
||
(
*
pExpr
)
->
_node
.
optr
!=
TSDB_BINARY_OP_BITOR
||
pLeft
->
pSchema
->
type
==
TSDB_DATA_TYPE_JSON
)
{
(
*
pExpr
)
->
_node
.
optr
!=
TSDB_BINARY_OP_BITXOR
||
(
*
pExpr
)
->
_node
.
optr
!=
TSDB_BINARY_OP_BITNOT
||
(
*
pExpr
)
->
_node
.
optr
!=
TSDB_BINARY_OP_LSHIFT
||
(
*
pExpr
)
->
_node
.
optr
!=
TSDB_BINARY_OP_RSHIFT
)
&&
pLeft
->
pSchema
->
type
==
TSDB_DATA_TYPE_BOOL
)
||
pLeft
->
pSchema
->
type
==
TSDB_DATA_TYPE_JSON
)
{
return
TSDB_CODE_TSC_INVALID_OPERATION
;
return
TSDB_CODE_TSC_INVALID_OPERATION
;
}
}
}
}
...
...
src/common/src/tarithoperator.c
浏览文件 @
56fa4e71
...
@@ -471,7 +471,7 @@ void vectorBitand(void *left, int32_t len1, int32_t _left_type, void *right, int
...
@@ -471,7 +471,7 @@ void vectorBitand(void *left, int32_t len1, int32_t _left_type, void *right, int
if
((
len1
)
==
(
len2
))
{
if
((
len1
)
==
(
len2
))
{
for
(;
i
<
(
len2
)
&&
i
>=
0
;
i
+=
step
,
output
+=
1
)
{
for
(;
i
<
(
len2
)
&&
i
>=
0
;
i
+=
step
,
output
+=
1
)
{
if
(
isNull
(
getVectorValueAddrFnLeft
(
left
,
i
),
_left_type
)
||
isNull
(
getVectorValueAddrFnRight
(
right
,
i
),
_right_type
))
{
if
(
isNull
(
getVectorValueAddrFnLeft
(
left
,
i
),
_left_type
)
||
isNull
(
getVectorValueAddrFnRight
(
right
,
i
),
_right_type
))
{
SET_BIGINT_NULL
(
output
);
SET_BIGINT_NULL
(
output
);
continue
;
continue
;
}
}
*
(
int64_t
*
)
output
=
getVectorBigintValueFnLeft
(
left
,
i
)
&
getVectorBigintValueFnRight
(
right
,
i
);
*
(
int64_t
*
)
output
=
getVectorBigintValueFnLeft
(
left
,
i
)
&
getVectorBigintValueFnRight
(
right
,
i
);
...
@@ -482,7 +482,79 @@ void vectorBitand(void *left, int32_t len1, int32_t _left_type, void *right, int
...
@@ -482,7 +482,79 @@ void vectorBitand(void *left, int32_t len1, int32_t _left_type, void *right, int
SET_BIGINT_NULL
(
output
);
SET_BIGINT_NULL
(
output
);
continue
;
continue
;
}
}
*
(
int64_t
*
)
output
=
getVectorBigintValueFnLeft
(
left
,
0
)
&
getVectorBigintValueFnRight
(
right
,
i
);
*
(
int64_t
*
)
output
=
getVectorBigintValueFnLeft
(
left
,
0
)
&
getVectorBigintValueFnRight
(
right
,
i
);
}
}
else
if
((
len2
)
==
1
)
{
for
(;
i
>=
0
&&
i
<
(
len1
);
i
+=
step
,
output
+=
1
)
{
if
(
isNull
(
getVectorValueAddrFnLeft
(
left
,
i
),
_left_type
)
||
isNull
(
getVectorValueAddrFnRight
(
right
,
0
),
_right_type
))
{
SET_BIGINT_NULL
(
output
);
continue
;
}
*
(
int64_t
*
)
output
=
getVectorBigintValueFnLeft
(
left
,
i
)
&
getVectorBigintValueFnRight
(
right
,
0
);
}
}
}
void
vectorBitor
(
void
*
left
,
int32_t
len1
,
int32_t
_left_type
,
void
*
right
,
int32_t
len2
,
int32_t
_right_type
,
void
*
out
,
int32_t
_ord
)
{
int32_t
i
=
((
_ord
)
==
TSDB_ORDER_ASC
)
?
0
:
MAX
(
len1
,
len2
)
-
1
;
int32_t
step
=
((
_ord
)
==
TSDB_ORDER_ASC
)
?
1
:
-
1
;
double
*
output
=
(
double
*
)
out
;
_arithmetic_getVectorValueAddr_fn_t
getVectorValueAddrFnLeft
=
getVectorValueAddrFn
(
_left_type
);
_arithmetic_getVectorValueAddr_fn_t
getVectorValueAddrFnRight
=
getVectorValueAddrFn
(
_right_type
);
_arithmetic_getVectorBigintValue_fn_t
getVectorBigintValueFnLeft
=
getVectorBigintValueFn
(
_left_type
);
_arithmetic_getVectorBigintValue_fn_t
getVectorBigintValueFnRight
=
getVectorBigintValueFn
(
_right_type
);
if
((
len1
)
==
(
len2
))
{
for
(;
i
<
(
len2
)
&&
i
>=
0
;
i
+=
step
,
output
+=
1
)
{
if
(
isNull
(
getVectorValueAddrFnLeft
(
left
,
i
),
_left_type
)
||
isNull
(
getVectorValueAddrFnRight
(
right
,
i
),
_right_type
))
{
SET_BIGINT_NULL
(
output
);
continue
;
}
*
(
int64_t
*
)
output
=
getVectorBigintValueFnLeft
(
left
,
i
)
|
getVectorBigintValueFnRight
(
right
,
i
);
}
}
else
if
((
len1
)
==
1
)
{
for
(;
i
>=
0
&&
i
<
(
len2
);
i
+=
step
,
output
+=
1
)
{
if
(
isNull
(
getVectorValueAddrFnLeft
(
left
,
0
),
_left_type
)
||
isNull
(
getVectorValueAddrFnRight
(
right
,
i
),
_right_type
))
{
SET_BIGINT_NULL
(
output
);
continue
;
}
*
(
int64_t
*
)
output
=
getVectorBigintValueFnLeft
(
left
,
0
)
|
getVectorBigintValueFnRight
(
right
,
i
);
}
}
else
if
((
len2
)
==
1
)
{
for
(;
i
>=
0
&&
i
<
(
len1
);
i
+=
step
,
output
+=
1
)
{
if
(
isNull
(
getVectorValueAddrFnLeft
(
left
,
i
),
_left_type
)
||
isNull
(
getVectorValueAddrFnRight
(
right
,
0
),
_right_type
))
{
SET_BIGINT_NULL
(
output
);
continue
;
}
*
(
int64_t
*
)
output
=
getVectorBigintValueFnLeft
(
left
,
i
)
|
getVectorBigintValueFnRight
(
right
,
0
);
}
}
}
void
vectorBitxor
(
void
*
left
,
int32_t
len1
,
int32_t
_left_type
,
void
*
right
,
int32_t
len2
,
int32_t
_right_type
,
void
*
out
,
int32_t
_ord
)
{
int32_t
i
=
((
_ord
)
==
TSDB_ORDER_ASC
)
?
0
:
MAX
(
len1
,
len2
)
-
1
;
int32_t
step
=
((
_ord
)
==
TSDB_ORDER_ASC
)
?
1
:
-
1
;
double
*
output
=
(
double
*
)
out
;
_arithmetic_getVectorValueAddr_fn_t
getVectorValueAddrFnLeft
=
getVectorValueAddrFn
(
_left_type
);
_arithmetic_getVectorValueAddr_fn_t
getVectorValueAddrFnRight
=
getVectorValueAddrFn
(
_right_type
);
_arithmetic_getVectorBigintValue_fn_t
getVectorBigintValueFnLeft
=
getVectorBigintValueFn
(
_left_type
);
_arithmetic_getVectorBigintValue_fn_t
getVectorBigintValueFnRight
=
getVectorBigintValueFn
(
_right_type
);
if
((
len1
)
==
(
len2
))
{
for
(;
i
<
(
len2
)
&&
i
>=
0
;
i
+=
step
,
output
+=
1
)
{
if
(
isNull
(
getVectorValueAddrFnLeft
(
left
,
i
),
_left_type
)
||
isNull
(
getVectorValueAddrFnRight
(
right
,
i
),
_right_type
))
{
SET_BIGINT_NULL
(
output
);
continue
;
}
*
(
int64_t
*
)
output
=
getVectorBigintValueFnLeft
(
left
,
i
)
^
getVectorBigintValueFnRight
(
right
,
i
);
}
}
else
if
((
len1
)
==
1
)
{
for
(;
i
>=
0
&&
i
<
(
len2
);
i
+=
step
,
output
+=
1
)
{
if
(
isNull
(
getVectorValueAddrFnLeft
(
left
,
0
),
_left_type
)
||
isNull
(
getVectorValueAddrFnRight
(
right
,
i
),
_right_type
))
{
SET_BIGINT_NULL
(
output
);
continue
;
}
*
(
int64_t
*
)
output
=
getVectorBigintValueFnLeft
(
left
,
0
)
^
getVectorBigintValueFnRight
(
right
,
i
);
}
}
}
else
if
((
len2
)
==
1
)
{
}
else
if
((
len2
)
==
1
)
{
for
(;
i
>=
0
&&
i
<
(
len1
);
i
+=
step
,
output
+=
1
)
{
for
(;
i
>=
0
&&
i
<
(
len1
);
i
+=
step
,
output
+=
1
)
{
...
@@ -490,7 +562,302 @@ void vectorBitand(void *left, int32_t len1, int32_t _left_type, void *right, int
...
@@ -490,7 +562,302 @@ void vectorBitand(void *left, int32_t len1, int32_t _left_type, void *right, int
SET_BIGINT_NULL
(
output
);
SET_BIGINT_NULL
(
output
);
continue
;
continue
;
}
}
*
(
int64_t
*
)
output
=
getVectorBigintValueFnLeft
(
left
,
i
)
&
getVectorBigintValueFnRight
(
right
,
0
);
*
(
int64_t
*
)
output
=
getVectorBigintValueFnLeft
(
left
,
i
)
^
getVectorBigintValueFnRight
(
right
,
0
);
}
}
}
void
vectorBitnot
(
void
*
left
,
int32_t
len1
,
int32_t
_left_type
,
void
*
right
,
int32_t
len2
,
int32_t
_right_type
,
void
*
out
,
int32_t
_ord
)
{
int32_t
i
=
((
_ord
)
==
TSDB_ORDER_ASC
)
?
0
:
MAX
(
len1
,
len2
)
-
1
;
int32_t
step
=
((
_ord
)
==
TSDB_ORDER_ASC
)
?
1
:
-
1
;
char
*
output
=
(
char
*
)
out
;
_arithmetic_getVectorValueAddr_fn_t
getVectorValueAddrFnLeft
=
getVectorValueAddrFn
(
_left_type
);
for
(;
i
<
(
len1
)
&&
i
>=
0
;
i
+=
step
)
{
if
(
isNull
(
getVectorValueAddrFnLeft
(
left
,
i
),
_left_type
))
{
switch
(
_left_type
)
{
case
TSDB_DATA_TYPE_BOOL
:
*
(
bool
*
)
output
=
TSDB_DATA_BOOL_NULL
;
output
+=
sizeof
(
bool
);
break
;
case
TSDB_DATA_TYPE_TINYINT
:
*
(
int8_t
*
)
output
=
TSDB_DATA_TINYINT_NULL
;
output
+=
sizeof
(
int8_t
);
break
;
case
TSDB_DATA_TYPE_SMALLINT
:
*
(
int16_t
*
)
output
=
TSDB_DATA_SMALLINT_NULL
;
output
+=
sizeof
(
int16_t
);
break
;
case
TSDB_DATA_TYPE_INT
:
*
(
int32_t
*
)
output
=
TSDB_DATA_INT_NULL
;
output
+=
sizeof
(
int32_t
);
break
;
case
TSDB_DATA_TYPE_BIGINT
:
*
(
int64_t
*
)
output
=
TSDB_DATA_BIGINT_NULL
;
output
+=
sizeof
(
int64_t
);
break
;
case
TSDB_DATA_TYPE_UTINYINT
:
*
(
uint8_t
*
)
output
=
TSDB_DATA_UTINYINT_NULL
;
output
+=
sizeof
(
int8_t
);
break
;
case
TSDB_DATA_TYPE_USMALLINT
:
*
(
uint16_t
*
)
output
=
TSDB_DATA_USMALLINT_NULL
;
output
+=
sizeof
(
int16_t
);
break
;
case
TSDB_DATA_TYPE_UINT
:
*
(
uint32_t
*
)
output
=
TSDB_DATA_UINT_NULL
;
output
+=
sizeof
(
int32_t
);
break
;
case
TSDB_DATA_TYPE_UBIGINT
:
*
(
uint64_t
*
)
output
=
TSDB_DATA_UBIGINT_NULL
;
output
+=
sizeof
(
int64_t
);
break
;
}
continue
;
}
switch
(
_left_type
)
{
case
TSDB_DATA_TYPE_BOOL
:
if
(
*
((
bool
*
)
left
+
i
))
{
*
(
bool
*
)
output
=
0
;
}
else
{
*
(
bool
*
)
output
=
1
;
}
output
+=
sizeof
(
bool
);
break
;
case
TSDB_DATA_TYPE_TINYINT
:
*
(
int8_t
*
)
output
=
~
(
*
((
int8_t
*
)
left
+
i
));
output
+=
sizeof
(
int8_t
);
break
;
case
TSDB_DATA_TYPE_SMALLINT
:
*
(
int16_t
*
)
output
=
~
(
*
((
int16_t
*
)
left
+
i
));
output
+=
sizeof
(
int16_t
);
break
;
case
TSDB_DATA_TYPE_INT
:
*
(
int32_t
*
)
output
=
~
(
*
((
int32_t
*
)
left
+
i
));
output
+=
sizeof
(
int32_t
);
break
;
case
TSDB_DATA_TYPE_BIGINT
:
*
(
int64_t
*
)
output
=
~
(
*
((
int64_t
*
)
left
+
i
));
output
+=
sizeof
(
int64_t
);
break
;
case
TSDB_DATA_TYPE_UTINYINT
:
*
(
uint8_t
*
)
output
=
~
(
*
((
uint8_t
*
)
left
+
i
));
output
+=
sizeof
(
int8_t
);
break
;
case
TSDB_DATA_TYPE_USMALLINT
:
*
(
uint16_t
*
)
output
=
~
(
*
((
uint16_t
*
)
left
+
i
));
output
+=
sizeof
(
int16_t
);
break
;
case
TSDB_DATA_TYPE_UINT
:
*
(
uint32_t
*
)
output
=
~
(
*
((
uint32_t
*
)
left
+
i
));
output
+=
sizeof
(
int32_t
);
break
;
case
TSDB_DATA_TYPE_UBIGINT
:
*
(
uint64_t
*
)
output
=
~
(
*
((
uint64_t
*
)
left
+
i
));
output
+=
sizeof
(
int64_t
);
break
;
}
}
}
void
vectorLshift
(
void
*
left
,
int32_t
len1
,
int32_t
_left_type
,
void
*
right
,
int32_t
len2
,
int32_t
_right_type
,
void
*
out
,
int32_t
_ord
)
{
int32_t
i
=
((
_ord
)
==
TSDB_ORDER_ASC
)
?
0
:
MAX
(
len1
,
len2
)
-
1
;
int32_t
step
=
((
_ord
)
==
TSDB_ORDER_ASC
)
?
1
:
-
1
;
// the right operand is a number
if
(
len2
!=
1
)
{
return
;
}
char
*
output
=
(
char
*
)
out
;
_arithmetic_getVectorValueAddr_fn_t
getVectorValueAddrFnLeft
=
getVectorValueAddrFn
(
_left_type
);
for
(;
i
<
(
len1
)
&&
i
>=
0
;
i
+=
step
)
{
if
(
isNull
(
getVectorValueAddrFnLeft
(
left
,
i
),
_left_type
))
{
switch
(
_left_type
)
{
case
TSDB_DATA_TYPE_BOOL
:
*
(
bool
*
)
output
=
TSDB_DATA_BOOL_NULL
;
output
+=
sizeof
(
bool
);
break
;
case
TSDB_DATA_TYPE_TINYINT
:
*
(
int8_t
*
)
output
=
TSDB_DATA_TINYINT_NULL
;
output
+=
sizeof
(
int8_t
);
break
;
case
TSDB_DATA_TYPE_SMALLINT
:
*
(
int16_t
*
)
output
=
TSDB_DATA_SMALLINT_NULL
;
output
+=
sizeof
(
int16_t
);
break
;
case
TSDB_DATA_TYPE_INT
:
*
(
int32_t
*
)
output
=
TSDB_DATA_INT_NULL
;
output
+=
sizeof
(
int32_t
);
break
;
case
TSDB_DATA_TYPE_BIGINT
:
*
(
int64_t
*
)
output
=
TSDB_DATA_BIGINT_NULL
;
output
+=
sizeof
(
int64_t
);
break
;
case
TSDB_DATA_TYPE_UTINYINT
:
*
(
uint8_t
*
)
output
=
TSDB_DATA_UTINYINT_NULL
;
output
+=
sizeof
(
int8_t
);
break
;
case
TSDB_DATA_TYPE_USMALLINT
:
*
(
uint16_t
*
)
output
=
TSDB_DATA_USMALLINT_NULL
;
output
+=
sizeof
(
int16_t
);
break
;
case
TSDB_DATA_TYPE_UINT
:
*
(
uint32_t
*
)
output
=
TSDB_DATA_UINT_NULL
;
output
+=
sizeof
(
int32_t
);
break
;
case
TSDB_DATA_TYPE_UBIGINT
:
*
(
uint64_t
*
)
output
=
TSDB_DATA_UBIGINT_NULL
;
output
+=
sizeof
(
int64_t
);
break
;
}
continue
;
}
switch
(
_left_type
)
{
case
TSDB_DATA_TYPE_BOOL
:
*
(
bool
*
)
output
=
0
;
output
+=
sizeof
(
bool
);
break
;
case
TSDB_DATA_TYPE_TINYINT
:
*
(
int8_t
*
)
output
=
*
((
int8_t
*
)
left
+
i
)
<<
*
(
int8_t
*
)
right
;
output
+=
sizeof
(
int8_t
);
break
;
case
TSDB_DATA_TYPE_SMALLINT
:
*
(
int16_t
*
)
output
=
*
((
int16_t
*
)
left
+
i
)
<<
*
(
int16_t
*
)
right
;
output
+=
sizeof
(
int16_t
);
break
;
case
TSDB_DATA_TYPE_INT
:
*
(
int32_t
*
)
output
=
*
((
int32_t
*
)
left
+
i
)
<<
*
(
int32_t
*
)
right
;
output
+=
sizeof
(
int32_t
);
break
;
case
TSDB_DATA_TYPE_BIGINT
:
*
(
int64_t
*
)
output
=
*
((
int64_t
*
)
left
+
i
)
<<
*
(
int64_t
*
)
right
;
output
+=
sizeof
(
int64_t
);
break
;
case
TSDB_DATA_TYPE_UTINYINT
:
*
(
uint8_t
*
)
output
=
*
((
uint8_t
*
)
left
+
i
)
<<
*
(
uint8_t
*
)
right
;
output
+=
sizeof
(
int8_t
);
break
;
case
TSDB_DATA_TYPE_USMALLINT
:
*
(
uint16_t
*
)
output
=
*
((
uint16_t
*
)
left
+
i
)
<<
*
(
uint16_t
*
)
right
;
output
+=
sizeof
(
int16_t
);
break
;
case
TSDB_DATA_TYPE_UINT
:
*
(
uint32_t
*
)
output
=
*
((
uint32_t
*
)
left
+
i
)
<<
*
(
uint32_t
*
)
right
;
output
+=
sizeof
(
int32_t
);
break
;
case
TSDB_DATA_TYPE_UBIGINT
:
*
(
uint64_t
*
)
output
=
*
((
uint64_t
*
)
left
+
i
)
<<
*
(
uint64_t
*
)
right
;
output
+=
sizeof
(
int64_t
);
break
;
}
}
}
void
vectorRshift
(
void
*
left
,
int32_t
len1
,
int32_t
_left_type
,
void
*
right
,
int32_t
len2
,
int32_t
_right_type
,
void
*
out
,
int32_t
_ord
)
{
int32_t
i
=
((
_ord
)
==
TSDB_ORDER_ASC
)
?
0
:
MAX
(
len1
,
len2
)
-
1
;
int32_t
step
=
((
_ord
)
==
TSDB_ORDER_ASC
)
?
1
:
-
1
;
// the right operand is a number
if
(
len2
!=
1
)
{
return
;
}
char
*
output
=
(
char
*
)
out
;
_arithmetic_getVectorValueAddr_fn_t
getVectorValueAddrFnLeft
=
getVectorValueAddrFn
(
_left_type
);
for
(;
i
<
(
len1
)
&&
i
>=
0
;
i
+=
step
)
{
if
(
isNull
(
getVectorValueAddrFnLeft
(
left
,
i
),
_left_type
))
{
switch
(
_left_type
)
{
case
TSDB_DATA_TYPE_BOOL
:
*
(
bool
*
)
output
=
TSDB_DATA_BOOL_NULL
;
output
+=
sizeof
(
bool
);
break
;
case
TSDB_DATA_TYPE_TINYINT
:
*
(
int8_t
*
)
output
=
TSDB_DATA_TINYINT_NULL
;
output
+=
sizeof
(
int8_t
);
break
;
case
TSDB_DATA_TYPE_SMALLINT
:
*
(
int16_t
*
)
output
=
TSDB_DATA_SMALLINT_NULL
;
output
+=
sizeof
(
int16_t
);
break
;
case
TSDB_DATA_TYPE_INT
:
*
(
int32_t
*
)
output
=
TSDB_DATA_INT_NULL
;
output
+=
sizeof
(
int32_t
);
break
;
case
TSDB_DATA_TYPE_BIGINT
:
*
(
int64_t
*
)
output
=
TSDB_DATA_BIGINT_NULL
;
output
+=
sizeof
(
int64_t
);
break
;
case
TSDB_DATA_TYPE_UTINYINT
:
*
(
uint8_t
*
)
output
=
TSDB_DATA_UTINYINT_NULL
;
output
+=
sizeof
(
int8_t
);
break
;
case
TSDB_DATA_TYPE_USMALLINT
:
*
(
uint16_t
*
)
output
=
TSDB_DATA_USMALLINT_NULL
;
output
+=
sizeof
(
int16_t
);
break
;
case
TSDB_DATA_TYPE_UINT
:
*
(
uint32_t
*
)
output
=
TSDB_DATA_UINT_NULL
;
output
+=
sizeof
(
int32_t
);
break
;
case
TSDB_DATA_TYPE_UBIGINT
:
*
(
uint64_t
*
)
output
=
TSDB_DATA_UBIGINT_NULL
;
output
+=
sizeof
(
int64_t
);
break
;
}
continue
;
}
switch
(
_left_type
)
{
case
TSDB_DATA_TYPE_BOOL
:
*
(
bool
*
)
output
=
0
;
output
+=
sizeof
(
bool
);
break
;
case
TSDB_DATA_TYPE_TINYINT
:
*
(
int8_t
*
)
output
=
*
((
int8_t
*
)
left
+
i
)
>>
*
(
int8_t
*
)
right
;
output
+=
sizeof
(
int8_t
);
break
;
case
TSDB_DATA_TYPE_SMALLINT
:
*
(
int16_t
*
)
output
=
*
((
int16_t
*
)
left
+
i
)
>>
*
(
int16_t
*
)
right
;
output
+=
sizeof
(
int16_t
);
break
;
case
TSDB_DATA_TYPE_INT
:
*
(
int32_t
*
)
output
=
*
((
int32_t
*
)
left
+
i
)
>>
*
(
int32_t
*
)
right
;
output
+=
sizeof
(
int32_t
);
break
;
case
TSDB_DATA_TYPE_BIGINT
:
*
(
int64_t
*
)
output
=
*
((
int64_t
*
)
left
+
i
)
>>
*
(
int64_t
*
)
right
;
output
+=
sizeof
(
int64_t
);
break
;
case
TSDB_DATA_TYPE_UTINYINT
:
*
(
uint8_t
*
)
output
=
*
((
uint8_t
*
)
left
+
i
)
>>
*
(
uint8_t
*
)
right
;
output
+=
sizeof
(
int8_t
);
break
;
case
TSDB_DATA_TYPE_USMALLINT
:
*
(
uint16_t
*
)
output
=
*
((
uint16_t
*
)
left
+
i
)
>>
*
(
uint16_t
*
)
right
;
output
+=
sizeof
(
int16_t
);
break
;
case
TSDB_DATA_TYPE_UINT
:
*
(
uint32_t
*
)
output
=
*
((
uint32_t
*
)
left
+
i
)
>>
*
(
uint32_t
*
)
right
;
output
+=
sizeof
(
int32_t
);
break
;
case
TSDB_DATA_TYPE_UBIGINT
:
*
(
uint64_t
*
)
output
=
*
((
uint64_t
*
)
left
+
i
)
>>
*
(
uint64_t
*
)
right
;
output
+=
sizeof
(
int64_t
);
break
;
}
}
}
}
}
}
...
@@ -509,6 +876,16 @@ _arithmetic_operator_fn_t getArithmeticOperatorFn(int32_t arithmeticOptr) {
...
@@ -509,6 +876,16 @@ _arithmetic_operator_fn_t getArithmeticOperatorFn(int32_t arithmeticOptr) {
return
vectorRemainder
;
return
vectorRemainder
;
case
TSDB_BINARY_OP_BITAND
:
case
TSDB_BINARY_OP_BITAND
:
return
vectorBitand
;
return
vectorBitand
;
case
TSDB_BINARY_OP_BITOR
:
return
vectorBitor
;
case
TSDB_BINARY_OP_BITXOR
:
return
vectorBitxor
;
case
TSDB_BINARY_OP_BITNOT
:
return
vectorBitnot
;
case
TSDB_BINARY_OP_LSHIFT
:
return
vectorLshift
;
case
TSDB_BINARY_OP_RSHIFT
:
return
vectorRshift
;
default:
default:
assert
(
0
);
assert
(
0
);
return
NULL
;
return
NULL
;
...
...
src/common/src/texpr.c
浏览文件 @
56fa4e71
...
@@ -98,16 +98,30 @@ int32_t exprTreeValidateExprNode(tExprNode *pExpr) {
...
@@ -98,16 +98,30 @@ int32_t exprTreeValidateExprNode(tExprNode *pExpr) {
pExpr
->
resultType
=
TSDB_DATA_TYPE_DOUBLE
;
pExpr
->
resultType
=
TSDB_DATA_TYPE_DOUBLE
;
pExpr
->
resultBytes
=
tDataTypes
[
TSDB_DATA_TYPE_DOUBLE
].
bytes
;
pExpr
->
resultBytes
=
tDataTypes
[
TSDB_DATA_TYPE_DOUBLE
].
bytes
;
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
else
if
(
pExpr
->
_node
.
optr
==
TSDB_BINARY_OP_BITAND
)
{
}
else
if
(
pExpr
->
_node
.
optr
==
TSDB_BINARY_OP_BITAND
||
pExpr
->
_node
.
optr
==
TSDB_BINARY_OP_BITOR
||
if
(
!
(
IS_NUMERIC_TYPE
(
leftType
)
||
leftType
==
TSDB_DATA_TYPE_BOOL
)
pExpr
->
_node
.
optr
==
TSDB_BINARY_OP_BITXOR
||
pExpr
->
_node
.
optr
==
TSDB_BINARY_OP_LSHIFT
||
||
!
(
IS_NUMERIC_TYPE
(
rightType
)
||
rightType
==
TSDB_DATA_TYPE_BOOL
))
{
pExpr
->
_node
.
optr
==
TSDB_BINARY_OP_RSHIFT
)
{
if
(
!
IS_NUMERIC_TYPE
(
leftType
)
||
!
IS_NUMERIC_TYPE
(
rightType
))
{
return
TSDB_CODE_TSC_INVALID_OPERATION
;
return
TSDB_CODE_TSC_INVALID_OPERATION
;
}
}
if
(
IS_FLOAT_TYPE
(
leftType
)
||
IS_FLOAT_TYPE
(
rightType
))
{
if
(
IS_FLOAT_TYPE
(
leftType
)
||
IS_FLOAT_TYPE
(
rightType
))
{
return
TSDB_CODE_TSC_INVALID_OPERATION
;
return
TSDB_CODE_TSC_INVALID_OPERATION
;
}
}
pExpr
->
resultType
=
TSDB_DATA_TYPE_BIGINT
;
if
(
pExpr
->
_node
.
optr
==
TSDB_BINARY_OP_LSHIFT
||
pExpr
->
_node
.
optr
==
TSDB_BINARY_OP_RSHIFT
)
{
pExpr
->
resultBytes
=
tDataTypes
[
TSDB_DATA_TYPE_BIGINT
].
bytes
;
pExpr
->
resultType
=
leftType
;
pExpr
->
resultBytes
=
tDataTypes
[
leftType
].
bytes
;
}
else
{
pExpr
->
resultType
=
TSDB_DATA_TYPE_BIGINT
;
pExpr
->
resultBytes
=
tDataTypes
[
TSDB_DATA_TYPE_BIGINT
].
bytes
;
}
return
TSDB_CODE_SUCCESS
;
}
else
if
(
pExpr
->
_node
.
optr
==
TSDB_BINARY_OP_BITNOT
)
{
if
(
!
IS_NUMERIC_TYPE
(
leftType
)
||
IS_FLOAT_TYPE
(
leftType
))
{
return
TSDB_CODE_TSC_INVALID_OPERATION
;
}
pExpr
->
resultType
=
leftType
;
pExpr
->
resultBytes
=
tDataTypes
[
leftType
].
bytes
;
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
else
{
}
else
{
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
...
@@ -492,6 +506,9 @@ void exprTreeExprNodeTraverse(tExprNode *pExpr, int32_t numOfRows, tExprOperandI
...
@@ -492,6 +506,9 @@ void exprTreeExprNodeTraverse(tExprNode *pExpr, int32_t numOfRows, tExprOperandI
rightType
=
pRight
->
pSchema
->
type
;
rightType
=
pRight
->
pSchema
->
type
;
rightNum
=
numOfRows
;
rightNum
=
numOfRows
;
}
else
if
(
pRight
->
nodeType
==
TSQL_NODE_DUMMY
)
{
/* BITNOT */
rightNum
=
0
;
}
else
{
}
else
{
assert
(
pRight
->
nodeType
==
TSQL_NODE_VALUE
);
assert
(
pRight
->
nodeType
==
TSQL_NODE_VALUE
);
rightIn
=
(
char
*
)
&
pRight
->
pVal
->
i64
;
rightIn
=
(
char
*
)
&
pRight
->
pVal
->
i64
;
...
@@ -506,7 +523,10 @@ void exprTreeExprNodeTraverse(tExprNode *pExpr, int32_t numOfRows, tExprOperandI
...
@@ -506,7 +523,10 @@ void exprTreeExprNodeTraverse(tExprNode *pExpr, int32_t numOfRows, tExprOperandI
if
(
leftType
==
TSDB_DATA_TYPE_TIMESTAMP
||
rightType
==
TSDB_DATA_TYPE_TIMESTAMP
)
{
if
(
leftType
==
TSDB_DATA_TYPE_TIMESTAMP
||
rightType
==
TSDB_DATA_TYPE_TIMESTAMP
)
{
output
->
type
=
TSDB_DATA_TYPE_BIGINT
;
output
->
type
=
TSDB_DATA_TYPE_BIGINT
;
}
else
{
}
else
{
if
(
pExpr
->
_node
.
optr
==
TSDB_BINARY_OP_BITAND
)
{
if
(
pExpr
->
_node
.
optr
==
TSDB_BINARY_OP_BITAND
||
pExpr
->
_node
.
optr
==
TSDB_BINARY_OP_BITOR
||
pExpr
->
_node
.
optr
==
TSDB_BINARY_OP_BITXOR
||
pExpr
->
_node
.
optr
==
TSDB_BINARY_OP_BITNOT
||
pExpr
->
_node
.
optr
==
TSDB_BINARY_OP_LSHIFT
||
pExpr
->
_node
.
optr
==
TSDB_BINARY_OP_RSHIFT
)
{
output
->
type
=
leftType
;
// rightType must be the same as leftType
output
->
type
=
leftType
;
// rightType must be the same as leftType
}
else
{
}
else
{
output
->
type
=
TSDB_DATA_TYPE_DOUBLE
;
output
->
type
=
TSDB_DATA_TYPE_DOUBLE
;
...
...
src/inc/taosdef.h
浏览文件 @
56fa4e71
...
@@ -177,10 +177,15 @@ do { \
...
@@ -177,10 +177,15 @@ do { \
#define TSDB_BINARY_OP_DIVIDE 33
#define TSDB_BINARY_OP_DIVIDE 33
#define TSDB_BINARY_OP_REMAINDER 34
#define TSDB_BINARY_OP_REMAINDER 34
#define TSDB_BINARY_OP_BITAND 35
#define TSDB_BINARY_OP_BITAND 35
#define TSDB_BINARY_OP_BITOR 36
#define TSDB_BINARY_OP_BITXOR 37
#define TSDB_BINARY_OP_BITNOT 38
#define TSDB_BINARY_OP_LSHIFT 39
#define TSDB_BINARY_OP_RSHIFT 40
#define IS_RELATION_OPTR(op) (((op) >= TSDB_RELATION_LESS) && ((op) < TSDB_RELATION_IN))
#define IS_RELATION_OPTR(op) (((op) >= TSDB_RELATION_LESS) && ((op) < TSDB_RELATION_IN))
#define IS_ARITHMETIC_OPTR(op) (((op) >= TSDB_BINARY_OP_ADD) && ((op) <= TSDB_BINARY_OP_
BITAND
))
#define IS_ARITHMETIC_OPTR(op) (((op) >= TSDB_BINARY_OP_ADD) && ((op) <= TSDB_BINARY_OP_
RSHIFT
))
#define TS_PATH_DELIMITER_LEN 1
#define TS_PATH_DELIMITER_LEN 1
...
...
src/inc/ttokendef.h
浏览文件 @
56fa4e71
...
@@ -50,172 +50,173 @@
...
@@ -50,172 +50,173 @@
#define TK_LE 32
#define TK_LE 32
#define TK_BITAND 33
#define TK_BITAND 33
#define TK_BITOR 34
#define TK_BITOR 34
#define TK_LSHIFT 35
#define TK_BITXOR 35
#define TK_RSHIFT 36
#define TK_LSHIFT 36
#define TK_PLUS 37
#define TK_RSHIFT 37
#define TK_MINUS 38
#define TK_PLUS 38
#define TK_DIVIDE 39
#define TK_MINUS 39
#define TK_TIMES 40
#define TK_DIVIDE 40
#define TK_STAR 41
#define TK_TIMES 41
#define TK_SLASH 42
#define TK_STAR 42
#define TK_REM 43
#define TK_SLASH 43
#define TK_UMINUS 44
#define TK_REM 44
#define TK_UPLUS 45
#define TK_UMINUS 45
#define TK_BITNOT 46
#define TK_UPLUS 46
#define TK_ARROW 47
#define TK_BITNOT 47
#define TK_SHOW 48
#define TK_ARROW 48
#define TK_DATABASES 49
#define TK_SHOW 49
#define TK_TOPICS 50
#define TK_DATABASES 50
#define TK_FUNCTIONS 51
#define TK_TOPICS 51
#define TK_MNODES 52
#define TK_FUNCTIONS 52
#define TK_DNODES 53
#define TK_MNODES 53
#define TK_ACCOUNTS 54
#define TK_DNODES 54
#define TK_USERS 55
#define TK_ACCOUNTS 55
#define TK_MODULES 56
#define TK_USERS 56
#define TK_QUERIES 57
#define TK_MODULES 57
#define TK_CONNECTIONS 58
#define TK_QUERIES 58
#define TK_STREAMS 59
#define TK_CONNECTIONS 59
#define TK_VARIABLES 60
#define TK_STREAMS 60
#define TK_SCORES 61
#define TK_VARIABLES 61
#define TK_GRANTS 62
#define TK_SCORES 62
#define TK_VNODES 63
#define TK_GRANTS 63
#define TK_DOT 64
#define TK_VNODES 64
#define TK_CREATE 65
#define TK_DOT 65
#define TK_TABLE 66
#define TK_CREATE 66
#define TK_STABLE 67
#define TK_TABLE 67
#define TK_DATABASE 68
#define TK_STABLE 68
#define TK_TABLES 69
#define TK_DATABASE 69
#define TK_STABLES 70
#define TK_TABLES 70
#define TK_VGROUPS 71
#define TK_STABLES 71
#define TK_DROP 72
#define TK_VGROUPS 72
#define TK_TOPIC 73
#define TK_DROP 73
#define TK_FUNCTION 74
#define TK_TOPIC 74
#define TK_DNODE 75
#define TK_FUNCTION 75
#define TK_USER 76
#define TK_DNODE 76
#define TK_ACCOUNT 77
#define TK_USER 77
#define TK_USE 78
#define TK_ACCOUNT 78
#define TK_DESCRIBE 79
#define TK_USE 79
#define TK_DESC 80
#define TK_DESCRIBE 80
#define TK_ALTER 81
#define TK_DESC 81
#define TK_PASS 82
#define TK_ALTER 82
#define TK_PRIVILEGE 83
#define TK_PASS 83
#define TK_LOCAL 84
#define TK_PRIVILEGE 84
#define TK_COMPACT 85
#define TK_LOCAL 85
#define TK_LP 86
#define TK_COMPACT 86
#define TK_RP 87
#define TK_LP 87
#define TK_IF 88
#define TK_RP 88
#define TK_EXISTS 89
#define TK_IF 89
#define TK_AS 90
#define TK_EXISTS 90
#define TK_OUTPUTTYPE 91
#define TK_AS 91
#define TK_AGGREGATE 92
#define TK_OUTPUTTYPE 92
#define TK_BUFSIZE 93
#define TK_AGGREGATE 93
#define TK_PPS 94
#define TK_BUFSIZE 94
#define TK_TSERIES 95
#define TK_PPS 95
#define TK_DBS 96
#define TK_TSERIES 96
#define TK_STORAGE 97
#define TK_DBS 97
#define TK_QTIME 98
#define TK_STORAGE 98
#define TK_CONNS 99
#define TK_QTIME 99
#define TK_STATE 100
#define TK_CONNS 100
#define TK_COMMA 101
#define TK_STATE 101
#define TK_KEEP 102
#define TK_COMMA 102
#define TK_CACHE 103
#define TK_KEEP 103
#define TK_REPLICA 104
#define TK_CACHE 104
#define TK_QUORUM 105
#define TK_REPLICA 105
#define TK_DAYS 106
#define TK_QUORUM 106
#define TK_MINROWS 107
#define TK_DAYS 107
#define TK_MAXROWS 108
#define TK_MINROWS 108
#define TK_BLOCKS 109
#define TK_MAXROWS 109
#define TK_CTIME 110
#define TK_BLOCKS 110
#define TK_WAL 111
#define TK_CTIME 111
#define TK_FSYNC 112
#define TK_WAL 112
#define TK_COMP 113
#define TK_FSYNC 113
#define TK_PRECISION 114
#define TK_COMP 114
#define TK_UPDATE 115
#define TK_PRECISION 115
#define TK_CACHELAST 116
#define TK_UPDATE 116
#define TK_PARTITIONS 117
#define TK_CACHELAST 117
#define TK_UNSIGNED 118
#define TK_PARTITIONS 118
#define TK_TAGS 119
#define TK_UNSIGNED 119
#define TK_USING 120
#define TK_TAGS 120
#define TK_NULL 121
#define TK_USING 121
#define TK_NOW 122
#define TK_NULL 122
#define TK_VARIABLE 123
#define TK_NOW 123
#define TK_SELECT 124
#define TK_VARIABLE 124
#define TK_UNION 125
#define TK_SELECT 125
#define TK_ALL 126
#define TK_UNION 126
#define TK_DISTINCT 127
#define TK_ALL 127
#define TK_FROM 128
#define TK_DISTINCT 128
#define TK_RANGE 129
#define TK_FROM 129
#define TK_INTERVAL 130
#define TK_RANGE 130
#define TK_EVERY 131
#define TK_INTERVAL 131
#define TK_SESSION 132
#define TK_EVERY 132
#define TK_STATE_WINDOW 133
#define TK_SESSION 133
#define TK_FILL 134
#define TK_STATE_WINDOW 134
#define TK_SLIDING 135
#define TK_FILL 135
#define TK_ORDER 136
#define TK_SLIDING 136
#define TK_BY 137
#define TK_ORDER 137
#define TK_ASC 138
#define TK_BY 138
#define TK_GROUP 139
#define TK_ASC 139
#define TK_HAVING 140
#define TK_GROUP 140
#define TK_LIMIT 141
#define TK_HAVING 141
#define TK_OFFSET 142
#define TK_LIMIT 142
#define TK_SLIMIT 143
#define TK_OFFSET 143
#define TK_SOFFSET 144
#define TK_SLIMIT 144
#define TK_WHERE 145
#define TK_SOFFSET 145
#define TK_RESET 146
#define TK_WHERE 146
#define TK_QUERY 147
#define TK_RESET 147
#define TK_SYNCDB 148
#define TK_QUERY 148
#define TK_ADD 149
#define TK_SYNCDB 149
#define TK_COLUMN 150
#define TK_ADD 150
#define TK_MODIFY 151
#define TK_COLUMN 151
#define TK_TAG 152
#define TK_MODIFY 152
#define TK_CHANGE 153
#define TK_TAG 153
#define TK_SET 154
#define TK_CHANGE 154
#define TK_KILL 155
#define TK_SET 155
#define TK_CONNECTION 156
#define TK_KILL 156
#define TK_STREAM 157
#define TK_CONNECTION 157
#define TK_COLON 158
#define TK_STREAM 158
#define TK_ABORT 159
#define TK_COLON 159
#define TK_AFTER 160
#define TK_ABORT 160
#define TK_ATTACH 161
#define TK_AFTER 161
#define TK_BEFORE 162
#define TK_ATTACH 162
#define TK_BEGIN 163
#define TK_BEFORE 163
#define TK_CASCADE 164
#define TK_BEGIN 164
#define TK_CLUSTER 165
#define TK_CASCADE 165
#define TK_CONFLICT 166
#define TK_CLUSTER 166
#define TK_COPY 167
#define TK_CONFLICT 167
#define TK_DEFERRED 168
#define TK_COPY 168
#define TK_DELIMITERS 169
#define TK_DEFERRED 169
#define TK_DETACH 170
#define TK_DELIMITERS 170
#define TK_EACH 171
#define TK_DETACH 171
#define TK_END 172
#define TK_EACH 172
#define TK_EXPLAIN 173
#define TK_END 173
#define TK_FAIL 174
#define TK_EXPLAIN 174
#define TK_FOR 175
#define TK_FAIL 175
#define TK_IGNORE 176
#define TK_FOR 176
#define TK_IMMEDIATE 177
#define TK_IGNORE 177
#define TK_INITIALLY 178
#define TK_IMMEDIATE 178
#define TK_INSTEAD 179
#define TK_INITIALLY 179
#define TK_KEY 180
#define TK_INSTEAD 180
#define TK_OF 181
#define TK_KEY 181
#define TK_RAISE 182
#define TK_OF 182
#define TK_REPLACE 183
#define TK_RAISE 183
#define TK_RESTRICT 184
#define TK_REPLACE 184
#define TK_ROW 185
#define TK_RESTRICT 185
#define TK_STATEMENT 186
#define TK_ROW 186
#define TK_TRIGGER 187
#define TK_STATEMENT 187
#define TK_VIEW 188
#define TK_TRIGGER 188
#define TK_IPTOKEN 189
#define TK_VIEW 189
#define TK_SEMI 190
#define TK_IPTOKEN 190
#define TK_NONE 191
#define TK_SEMI 191
#define TK_PREV 192
#define TK_NONE 192
#define TK_LINEAR 193
#define TK_PREV 193
#define TK_IMPORT 194
#define TK_LINEAR 194
#define TK_TBNAME 195
#define TK_IMPORT 195
#define TK_JOIN 196
#define TK_TBNAME 196
#define TK_INSERT 197
#define TK_JOIN 197
#define TK_INTO 198
#define TK_INSERT 198
#define TK_VALUES 199
#define TK_INTO 199
#define TK_FILE 200
#define TK_VALUES 200
#define TK_FILE 201
#define TK_SPACE 300
#define TK_SPACE 300
...
...
src/kit/shell/src/shellEngine.c
浏览文件 @
56fa4e71
...
@@ -248,18 +248,25 @@ void shellRunCommandOnServer(TAOS *con, char command[]) {
...
@@ -248,18 +248,25 @@ void shellRunCommandOnServer(TAOS *con, char command[]) {
char
*
fname
=
NULL
;
char
*
fname
=
NULL
;
bool
printMode
=
false
;
bool
printMode
=
false
;
if
((
sptr
=
tstrstr
(
command
,
">>"
,
true
))
!=
NULL
)
{
sptr
=
command
;
cptr
=
tstrstr
(
command
,
";"
,
true
);
while
((
sptr
=
tstrstr
(
sptr
,
">>"
,
true
))
!=
NULL
)
{
if
(
cptr
!=
NULL
)
{
if
(
regex_match
(
sptr
+
2
,
"^
\\
s*+[a-zA-Z0-9_]+
\\
s*;
\\
s*$"
,
REG_EXTENDED
|
REG_ICASE
))
{
*
cptr
=
'\0'
;
cptr
=
tstrstr
(
command
,
";"
,
true
);
}
if
(
cptr
!=
NULL
)
{
*
cptr
=
'\0'
;
}
if
(
wordexp
(
sptr
+
2
,
&
full_path
,
0
)
!=
0
)
{
if
(
wordexp
(
sptr
+
2
,
&
full_path
,
0
)
!=
0
)
{
fprintf
(
stderr
,
"ERROR: invalid filename: %s
\n
"
,
sptr
+
2
);
fprintf
(
stderr
,
"ERROR: invalid filename: %s
\n
"
,
sptr
+
2
);
return
;
return
;
}
*
sptr
=
'\0'
;
fname
=
full_path
.
we_wordv
[
0
];
break
;
}
else
{
sptr
+=
2
;
}
}
*
sptr
=
'\0'
;
fname
=
full_path
.
we_wordv
[
0
];
}
}
if
((
sptr
=
tstrstr
(
command
,
"
\\
G"
,
true
))
!=
NULL
)
{
if
((
sptr
=
tstrstr
(
command
,
"
\\
G"
,
true
))
!=
NULL
)
{
...
...
src/query/inc/sql.y
浏览文件 @
56fa4e71
...
@@ -13,7 +13,7 @@
...
@@ -13,7 +13,7 @@
%right NOT.
%right NOT.
%left EQ NE ISNULL NOTNULL IS LIKE MATCH NMATCH CONTAINS GLOB BETWEEN IN.
%left EQ NE ISNULL NOTNULL IS LIKE MATCH NMATCH CONTAINS GLOB BETWEEN IN.
%left GT GE LT LE.
%left GT GE LT LE.
%left BITAND BITOR LSHIFT RSHIFT.
%left BITAND BITOR
BITXOR
LSHIFT RSHIFT.
%left PLUS MINUS.
%left PLUS MINUS.
%left DIVIDE TIMES.
%left DIVIDE TIMES.
%left STAR SLASH REM.
%left STAR SLASH REM.
...
@@ -787,6 +787,11 @@ expr(A) ::= expr(X) STAR expr(Y). {A = tSqlExprCreate(X, Y, TK_STAR); }
...
@@ -787,6 +787,11 @@ expr(A) ::= expr(X) STAR expr(Y). {A = tSqlExprCreate(X, Y, TK_STAR); }
expr(A) ::= expr(X) SLASH expr(Y). {A = tSqlExprCreate(X, Y, TK_DIVIDE);}
expr(A) ::= expr(X) SLASH expr(Y). {A = tSqlExprCreate(X, Y, TK_DIVIDE);}
expr(A) ::= expr(X) REM expr(Y). {A = tSqlExprCreate(X, Y, TK_REM); }
expr(A) ::= expr(X) REM expr(Y). {A = tSqlExprCreate(X, Y, TK_REM); }
expr(A) ::= expr(X) BITAND expr(Y). {A = tSqlExprCreate(X, Y, TK_BITAND);}
expr(A) ::= expr(X) BITAND expr(Y). {A = tSqlExprCreate(X, Y, TK_BITAND);}
expr(A) ::= expr(X) BITOR expr(Y). {A = tSqlExprCreate(X, Y, TK_BITOR); }
expr(A) ::= expr(X) BITXOR expr(Y). {A = tSqlExprCreate(X, Y, TK_BITXOR);}
expr(A) ::= BITNOT expr(X). {A = tSqlExprCreate(X, NULL, TK_BITNOT);}
expr(A) ::= expr(X) LSHIFT expr(Y). {A = tSqlExprCreate(X, Y, TK_LSHIFT);}
expr(A) ::= expr(X) RSHIFT expr(Y). {A = tSqlExprCreate(X, Y, TK_RSHIFT);}
// like expression
// like expression
expr(A) ::= expr(X) LIKE expr(Y). {A = tSqlExprCreate(X, Y, TK_LIKE); }
expr(A) ::= expr(X) LIKE expr(Y). {A = tSqlExprCreate(X, Y, TK_LIKE); }
...
...
src/query/src/qSqlParser.c
浏览文件 @
56fa4e71
...
@@ -321,7 +321,9 @@ tSqlExpr *tSqlExprCreate(tSqlExpr *pLeft, tSqlExpr *pRight, int32_t optrType) {
...
@@ -321,7 +321,9 @@ tSqlExpr *tSqlExprCreate(tSqlExpr *pLeft, tSqlExpr *pRight, int32_t optrType) {
if
((
pLeft
!=
NULL
&&
pRight
!=
NULL
)
&&
if
((
pLeft
!=
NULL
&&
pRight
!=
NULL
)
&&
(
optrType
==
TK_PLUS
||
optrType
==
TK_MINUS
||
optrType
==
TK_STAR
||
optrType
==
TK_DIVIDE
||
optrType
==
TK_REM
||
(
optrType
==
TK_PLUS
||
optrType
==
TK_MINUS
||
optrType
==
TK_STAR
||
optrType
==
TK_DIVIDE
||
optrType
==
TK_REM
||
optrType
==
TK_EQ
||
optrType
==
TK_NE
||
optrType
==
TK_LT
||
optrType
==
TK_GT
||
optrType
==
TK_LE
||
optrType
==
TK_GE
||
optrType
==
TK_EQ
||
optrType
==
TK_NE
||
optrType
==
TK_LT
||
optrType
==
TK_GT
||
optrType
==
TK_LE
||
optrType
==
TK_GE
||
optrType
==
TK_AND
||
optrType
==
TK_OR
))
{
optrType
==
TK_AND
||
optrType
==
TK_OR
||
optrType
==
TK_BITAND
||
optrType
==
TK_BITOR
||
optrType
==
TK_BITXOR
||
optrType
==
TK_LSHIFT
||
optrType
==
TK_RSHIFT
))
{
/*
/*
* if a exprToken is noted as the TK_TIMESTAMP, the time precision is microsecond
* if a exprToken is noted as the TK_TIMESTAMP, the time precision is microsecond
* Otherwise, the time precision is adaptive, determined by the time precision from databases.
* Otherwise, the time precision is adaptive, determined by the time precision from databases.
...
@@ -398,6 +400,61 @@ tSqlExpr *tSqlExprCreate(tSqlExpr *pLeft, tSqlExpr *pRight, int32_t optrType) {
...
@@ -398,6 +400,61 @@ tSqlExpr *tSqlExprCreate(tSqlExpr *pLeft, tSqlExpr *pRight, int32_t optrType) {
pExpr
->
value
.
i64
=
(
pLeft
->
value
.
i64
||
pRight
->
value
.
i64
)
?
1
:
0
;
pExpr
->
value
.
i64
=
(
pLeft
->
value
.
i64
||
pRight
->
value
.
i64
)
?
1
:
0
;
break
;
break
;
}
}
case
TK_BITAND
:
{
if
(
pLeft
->
tokenId
==
TK_BOOL
||
pRight
->
tokenId
==
TK_BOOL
||
pLeft
->
tokenId
==
TK_FLOAT
||
pRight
->
tokenId
==
TK_FLOAT
||
pLeft
->
tokenId
==
TK_TIMESTAMP
||
pRight
->
tokenId
==
TK_TIMESTAMP
)
{
pExpr
->
value
.
i64
=
TSDB_DATA_BIGINT_NULL
;
}
else
{
pExpr
->
value
.
i64
=
pLeft
->
value
.
i64
&
pRight
->
value
.
i64
;
}
break
;
}
case
TK_BITOR
:
{
if
(
pLeft
->
tokenId
==
TK_BOOL
||
pRight
->
tokenId
==
TK_BOOL
||
pLeft
->
tokenId
==
TK_FLOAT
||
pRight
->
tokenId
==
TK_FLOAT
||
pLeft
->
tokenId
==
TK_TIMESTAMP
||
pRight
->
tokenId
==
TK_TIMESTAMP
)
{
pExpr
->
value
.
i64
=
TSDB_DATA_BIGINT_NULL
;
}
else
{
pExpr
->
value
.
i64
=
pLeft
->
value
.
i64
|
pRight
->
value
.
i64
;
}
break
;
}
case
TK_BITXOR
:
{
if
(
pLeft
->
tokenId
==
TK_BOOL
||
pRight
->
tokenId
==
TK_BOOL
||
pLeft
->
tokenId
==
TK_FLOAT
||
pRight
->
tokenId
==
TK_FLOAT
||
pLeft
->
tokenId
==
TK_TIMESTAMP
||
pRight
->
tokenId
==
TK_TIMESTAMP
)
{
pExpr
->
value
.
i64
=
TSDB_DATA_BIGINT_NULL
;
}
else
{
pExpr
->
value
.
i64
=
pLeft
->
value
.
i64
^
pRight
->
value
.
i64
;
}
break
;
}
case
TK_LSHIFT
:
{
if
(
pLeft
->
tokenId
==
TK_BOOL
||
pRight
->
tokenId
==
TK_BOOL
||
pLeft
->
tokenId
==
TK_FLOAT
||
pRight
->
tokenId
==
TK_FLOAT
||
pLeft
->
tokenId
==
TK_TIMESTAMP
||
pRight
->
tokenId
==
TK_TIMESTAMP
)
{
pExpr
->
value
.
i64
=
TSDB_DATA_BIGINT_NULL
;
}
else
{
pExpr
->
value
.
i64
=
pLeft
->
value
.
i64
<<
pRight
->
value
.
i64
;
}
break
;
}
case
TK_RSHIFT
:
{
if
(
pLeft
->
tokenId
==
TK_BOOL
||
pRight
->
tokenId
==
TK_BOOL
||
pLeft
->
tokenId
==
TK_FLOAT
||
pRight
->
tokenId
==
TK_FLOAT
||
pLeft
->
tokenId
==
TK_TIMESTAMP
||
pRight
->
tokenId
==
TK_TIMESTAMP
)
{
pExpr
->
value
.
i64
=
TSDB_DATA_BIGINT_NULL
;
}
else
{
pExpr
->
value
.
i64
=
pLeft
->
value
.
i64
>>
pRight
->
value
.
i64
;
}
break
;
}
}
}
tSqlExprDestroy
(
pLeft
);
tSqlExprDestroy
(
pLeft
);
...
@@ -509,6 +566,13 @@ tSqlExpr *tSqlExprCreate(tSqlExpr *pLeft, tSqlExpr *pRight, int32_t optrType) {
...
@@ -509,6 +566,13 @@ tSqlExpr *tSqlExprCreate(tSqlExpr *pLeft, tSqlExpr *pRight, int32_t optrType) {
pExpr
->
value
.
i64
=
(
left
||
right
)
?
1
:
0
;
pExpr
->
value
.
i64
=
(
left
||
right
)
?
1
:
0
;
break
;
break
;
}
}
case
TK_BITAND
:
case
TK_BITOR
:
case
TK_BITXOR
:
case
TK_LSHIFT
:
case
TK_RSHIFT
:
pExpr
->
value
.
i64
=
TSDB_DATA_DOUBLE_NULL
;
break
;
}
}
tSqlExprDestroy
(
pLeft
);
tSqlExprDestroy
(
pLeft
);
...
@@ -542,6 +606,12 @@ tSqlExpr *tSqlExprCreate(tSqlExpr *pLeft, tSqlExpr *pRight, int32_t optrType) {
...
@@ -542,6 +606,12 @@ tSqlExpr *tSqlExprCreate(tSqlExpr *pLeft, tSqlExpr *pRight, int32_t optrType) {
}
}
pExpr
->
pRight
=
pRight
;
pExpr
->
pRight
=
pRight
;
if
(
optrType
==
TK_BITNOT
)
{
pExpr
->
exprToken
.
z
=
pLeft
->
exprToken
.
z
-
1
;
pExpr
->
exprToken
.
n
=
pLeft
->
exprToken
.
n
+
1
;
pExpr
->
exprToken
.
type
=
pLeft
->
exprToken
.
type
;
}
}
}
return
pExpr
;
return
pExpr
;
...
...
src/query/src/sql.c
浏览文件 @
56fa4e71
此差异已折叠。
点击以展开。
src/util/src/ttokenizer.c
浏览文件 @
56fa4e71
...
@@ -413,6 +413,10 @@ uint32_t tGetToken(char* z, uint32_t* tokenId) {
...
@@ -413,6 +413,10 @@ uint32_t tGetToken(char* z, uint32_t* tokenId) {
*
tokenId
=
TK_BITNOT
;
*
tokenId
=
TK_BITNOT
;
return
1
;
return
1
;
}
}
case
'^'
:
{
*
tokenId
=
TK_BITXOR
;
return
1
;
}
case
'?'
:
{
case
'?'
:
{
*
tokenId
=
TK_QUESTION
;
*
tokenId
=
TK_QUESTION
;
return
1
;
return
1
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录