Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
51e61370
T
TDengine
项目概览
taosdata
/
TDengine
1 年多 前同步成功
通知
1185
Star
22016
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看板
提交
51e61370
编写于
1月 11, 2021
作者:
H
Haojun Liao
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[TD-2634]<feature>: support unsigned number.
上级
39e60bf3
变更
21
展开全部
隐藏空白更改
内联
并排
Showing
21 changed file
with
657 addition
and
767 deletion
+657
-767
src/client/inc/tschemautil.h
src/client/inc/tschemautil.h
+2
-2
src/client/src/tscAsync.c
src/client/src/tscAsync.c
+1
-1
src/client/src/tscParseInsert.c
src/client/src/tscParseInsert.c
+57
-69
src/client/src/tscPrepare.c
src/client/src/tscPrepare.c
+1
-1
src/client/src/tscSQLParser.c
src/client/src/tscSQLParser.c
+1
-1
src/client/src/tscSchemaUtil.c
src/client/src/tscSchemaUtil.c
+33
-15
src/client/src/tscServer.c
src/client/src/tscServer.c
+1
-1
src/common/inc/tvariant.h
src/common/inc/tvariant.h
+2
-2
src/common/src/ttypes.c
src/common/src/ttypes.c
+10
-7
src/common/src/tvariant.c
src/common/src/tvariant.c
+78
-30
src/inc/taoserror.h
src/inc/taoserror.h
+1
-0
src/inc/ttype.h
src/inc/ttype.h
+1
-0
src/mnode/src/mnodeTable.c
src/mnode/src/mnodeTable.c
+27
-4
src/query/inc/qExecutor.h
src/query/inc/qExecutor.h
+1
-1
src/query/inc/qUtil.h
src/query/inc/qUtil.h
+3
-4
src/query/src/qExecutor.c
src/query/src/qExecutor.c
+14
-51
src/query/src/qFilterfunc.c
src/query/src/qFilterfunc.c
+347
-510
src/query/tests/astTest.cpp
src/query/tests/astTest.cpp
+2
-2
tests/script/general/parser/null_char.sim
tests/script/general/parser/null_char.sim
+2
-5
tests/script/general/parser/testSuite.sim
tests/script/general/parser/testSuite.sim
+61
-61
tests/tsim/src/simExe.c
tests/tsim/src/simExe.c
+12
-0
未找到文件。
src/client/inc/tschemautil.h
浏览文件 @
51e61370
...
...
@@ -26,7 +26,7 @@ extern "C" {
#define VALIDNUMOFCOLS(x) ((x) >= TSDB_MIN_COLUMNS && (x) <= TSDB_MAX_COLUMNS)
//struct SSchema;
#define VALIDNUMOFTAGS(x) ((x) >= 0 && (x) <= TSDB_MAX_TAGS)
/**
* get the number of tags of this table
...
...
@@ -91,7 +91,7 @@ SSchema* tscGetColumnSchemaById(STableMeta* pTableMeta, int16_t colId);
* @param numOfCols
* @return
*/
bool
isValidSchema
(
struct
SSchema
*
pSchema
,
int32_t
numOfCol
s
);
bool
isValidSchema
(
struct
SSchema
*
pSchema
,
int32_t
numOfCols
,
int32_t
numOfTag
s
);
/**
* get the schema for the "tbname" column. it is a built column
...
...
src/client/src/tscAsync.c
浏览文件 @
51e61370
...
...
@@ -388,7 +388,7 @@ void tscAsyncResultOnError(SSqlObj *pSql) {
}
assert
(
pSql
->
res
.
code
!=
TSDB_CODE_SUCCESS
);
tscError
(
"%p
add into queued async res
, code:%s"
,
pSql
,
tstrerror
(
pSql
->
res
.
code
));
tscError
(
"%p
invoke user specified function due to error occured
, code:%s"
,
pSql
,
tstrerror
(
pSql
->
res
.
code
));
SSqlRes
*
pRes
=
&
pSql
->
res
;
if
(
pSql
->
fp
==
NULL
||
pSql
->
fetchFp
==
NULL
){
...
...
src/client/src/tscParseInsert.c
浏览文件 @
51e61370
...
...
@@ -128,13 +128,15 @@ int tsParseTime(SStrToken *pToken, int64_t *time, char **next, char *error, int1
}
// todo extract the null value check
static
bool
isNullStr
(
SStrToken
*
pToken
)
{
return
(
pToken
->
type
==
TK_NULL
)
||
((
pToken
->
type
==
TK_STRING
)
&&
(
pToken
->
n
!=
0
)
&&
(
strncasecmp
(
TSDB_DATA_NULL_STR_L
,
pToken
->
z
,
pToken
->
n
)
==
0
));
}
int32_t
tsParseOneColumnData
(
SSchema
*
pSchema
,
SStrToken
*
pToken
,
char
*
payload
,
char
*
msg
,
char
**
str
,
bool
primaryKey
,
int16_t
timePrec
)
{
int64_t
iv
;
int32_t
numType
;
int32_t
ret
;
char
*
endptr
=
NULL
;
errno
=
0
;
// clear the previous existed error information
if
(
IS_NUMERIC_TYPE
(
pSchema
->
type
)
&&
pToken
->
n
==
0
)
{
return
tscInvalidSQLErrMsg
(
msg
,
"invalid numeric data"
,
pToken
->
z
);
...
...
@@ -142,39 +144,38 @@ int32_t tsParseOneColumnData(SSchema *pSchema, SStrToken *pToken, char *payload,
switch
(
pSchema
->
type
)
{
case
TSDB_DATA_TYPE_BOOL
:
{
// bool
if
((
pToken
->
type
==
TK_BOOL
||
pToken
->
type
==
TK_STRING
)
&&
(
pToken
->
n
!=
0
))
{
if
(
strncmp
(
pToken
->
z
,
"true"
,
pToken
->
n
)
==
0
)
{
*
(
uint8_t
*
)
payload
=
TSDB_TRUE
;
}
else
if
(
strncmp
(
pToken
->
z
,
"false"
,
pToken
->
n
)
==
0
)
{
*
(
uint8_t
*
)
payload
=
TSDB_FALSE
;
}
else
if
(
strncasecmp
(
TSDB_DATA_NULL_STR_L
,
pToken
->
z
,
pToken
->
n
)
==
0
)
{
*
(
uint8_t
*
)
payload
=
TSDB_DATA_BOOL_NULL
;
if
(
isNullStr
(
pToken
))
{
*
((
uint8_t
*
)
payload
)
=
TSDB_DATA_BOOL_NULL
;
}
else
{
if
((
pToken
->
type
==
TK_BOOL
||
pToken
->
type
==
TK_STRING
)
&&
(
pToken
->
n
!=
0
))
{
if
(
strncmp
(
pToken
->
z
,
"true"
,
pToken
->
n
)
==
0
)
{
*
(
uint8_t
*
)
payload
=
TSDB_TRUE
;
}
else
if
(
strncmp
(
pToken
->
z
,
"false"
,
pToken
->
n
)
==
0
)
{
*
(
uint8_t
*
)
payload
=
TSDB_FALSE
;
}
else
{
return
tscSQLSyntaxErrMsg
(
msg
,
"invalid bool data"
,
pToken
->
z
);
}
}
else
if
(
pToken
->
type
==
TK_INTEGER
)
{
iv
=
strtoll
(
pToken
->
z
,
NULL
,
10
);
*
(
uint8_t
*
)
payload
=
(
int8_t
)((
iv
==
0
)
?
TSDB_FALSE
:
TSDB_TRUE
);
}
else
if
(
pToken
->
type
==
TK_FLOAT
)
{
double
dv
=
strtod
(
pToken
->
z
,
NULL
);
*
(
uint8_t
*
)
payload
=
(
int8_t
)((
dv
==
0
)
?
TSDB_FALSE
:
TSDB_TRUE
);
}
else
{
return
tsc
SQLSyntax
ErrMsg
(
msg
,
"invalid bool data"
,
pToken
->
z
);
return
tsc
InvalidSQL
ErrMsg
(
msg
,
"invalid bool data"
,
pToken
->
z
);
}
}
else
if
(
pToken
->
type
==
TK_INTEGER
)
{
iv
=
strtoll
(
pToken
->
z
,
NULL
,
10
);
*
(
uint8_t
*
)
payload
=
(
int8_t
)((
iv
==
0
)
?
TSDB_FALSE
:
TSDB_TRUE
);
}
else
if
(
pToken
->
type
==
TK_FLOAT
)
{
double
dv
=
strtod
(
pToken
->
z
,
NULL
);
*
(
uint8_t
*
)
payload
=
(
int8_t
)((
dv
==
0
)
?
TSDB_FALSE
:
TSDB_TRUE
);
}
else
if
(
pToken
->
type
==
TK_NULL
)
{
*
(
uint8_t
*
)
payload
=
TSDB_DATA_BOOL_NULL
;
}
else
{
return
tscInvalidSQLErrMsg
(
msg
,
"invalid bool data"
,
pToken
->
z
);
}
break
;
}
case
TSDB_DATA_TYPE_TINYINT
:
if
(
pToken
->
type
==
TK_NULL
||
((
pToken
->
type
==
TK_STRING
)
&&
(
pToken
->
n
!=
0
)
&&
(
strncasecmp
(
TSDB_DATA_NULL_STR_L
,
pToken
->
z
,
pToken
->
n
)
==
0
)))
{
if
(
isNullStr
(
pToken
))
{
*
((
uint8_t
*
)
payload
)
=
TSDB_DATA_TINYINT_NULL
;
}
else
{
numType
=
tStrToInteger
(
pToken
->
z
,
pToken
->
type
,
pToken
->
n
,
&
iv
,
true
);
if
(
TK_ILLEGAL
==
numType
)
{
ret
=
tStrToInteger
(
pToken
->
z
,
pToken
->
type
,
pToken
->
n
,
&
iv
,
true
);
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
return
tscInvalidSQLErrMsg
(
msg
,
"invalid tinyint data"
,
pToken
->
z
);
}
else
if
(
errno
==
ERANGE
||
!
IS_VALID_TINYINT
(
iv
))
{
}
else
if
(
!
IS_VALID_TINYINT
(
iv
))
{
return
tscInvalidSQLErrMsg
(
msg
,
"data overflow"
,
pToken
->
z
);
}
...
...
@@ -184,14 +185,13 @@ int32_t tsParseOneColumnData(SSchema *pSchema, SStrToken *pToken, char *payload,
break
;
case
TSDB_DATA_TYPE_UTINYINT
:
if
(
pToken
->
type
==
TK_NULL
||
((
pToken
->
type
==
TK_STRING
)
&&
(
pToken
->
n
!=
0
)
&&
(
strncasecmp
(
TSDB_DATA_NULL_STR_L
,
pToken
->
z
,
pToken
->
n
)
==
0
)))
{
if
(
isNullStr
(
pToken
))
{
*
((
uint8_t
*
)
payload
)
=
TSDB_DATA_UTINYINT_NULL
;
}
else
{
numType
=
tStrToInteger
(
pToken
->
z
,
pToken
->
type
,
pToken
->
n
,
&
iv
,
false
);
if
(
TK_ILLEGAL
==
numType
)
{
ret
=
tStrToInteger
(
pToken
->
z
,
pToken
->
type
,
pToken
->
n
,
&
iv
,
false
);
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
return
tscInvalidSQLErrMsg
(
msg
,
"invalid unsigned tinyint data"
,
pToken
->
z
);
}
else
if
(
errno
==
ERANGE
||
IS_VALID_UTINYINT
(
iv
))
{
}
else
if
(
!
IS_VALID_UTINYINT
(
iv
))
{
return
tscInvalidSQLErrMsg
(
msg
,
"unsigned tinyint data overflow"
,
pToken
->
z
);
}
...
...
@@ -201,14 +201,13 @@ int32_t tsParseOneColumnData(SSchema *pSchema, SStrToken *pToken, char *payload,
break
;
case
TSDB_DATA_TYPE_SMALLINT
:
if
((
pToken
->
type
==
TK_NULL
)
||
((
pToken
->
type
==
TK_STRING
)
&&
(
pToken
->
n
!=
0
)
&&
(
strncasecmp
(
TSDB_DATA_NULL_STR_L
,
pToken
->
z
,
pToken
->
n
)
==
0
)))
{
if
(
isNullStr
(
pToken
))
{
*
((
int16_t
*
)
payload
)
=
TSDB_DATA_SMALLINT_NULL
;
}
else
{
numType
=
tStrToInteger
(
pToken
->
z
,
pToken
->
type
,
pToken
->
n
,
&
iv
,
true
);
if
(
TK_ILLEGAL
==
numType
)
{
ret
=
tStrToInteger
(
pToken
->
z
,
pToken
->
type
,
pToken
->
n
,
&
iv
,
true
);
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
return
tscInvalidSQLErrMsg
(
msg
,
"invalid smallint data"
,
pToken
->
z
);
}
else
if
(
errno
==
ERANGE
||
iv
>
INT16_MAX
||
iv
<=
INT16_MIN
)
{
}
else
if
(
!
IS_VALID_SMALLINT
(
iv
)
)
{
return
tscInvalidSQLErrMsg
(
msg
,
"smallint data overflow"
,
pToken
->
z
);
}
...
...
@@ -218,14 +217,13 @@ int32_t tsParseOneColumnData(SSchema *pSchema, SStrToken *pToken, char *payload,
break
;
case
TSDB_DATA_TYPE_USMALLINT
:
if
((
pToken
->
type
==
TK_NULL
)
||
((
pToken
->
type
==
TK_STRING
)
&&
(
pToken
->
n
!=
0
)
&&
(
strncasecmp
(
TSDB_DATA_NULL_STR_L
,
pToken
->
z
,
pToken
->
n
)
==
0
)))
{
if
(
isNullStr
(
pToken
))
{
*
((
uint16_t
*
)
payload
)
=
TSDB_DATA_USMALLINT_NULL
;
}
else
{
numType
=
tStrToInteger
(
pToken
->
z
,
pToken
->
type
,
pToken
->
n
,
&
iv
,
false
);
if
(
TK_ILLEGAL
==
numType
)
{
ret
=
tStrToInteger
(
pToken
->
z
,
pToken
->
type
,
pToken
->
n
,
&
iv
,
false
);
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
return
tscInvalidSQLErrMsg
(
msg
,
"invalid unsigned smallint data"
,
pToken
->
z
);
}
else
if
(
errno
==
ERANGE
||
iv
>=
UINT16_MAX
)
{
}
else
if
(
!
IS_VALID_USMALLINT
(
iv
)
)
{
return
tscInvalidSQLErrMsg
(
msg
,
"unsigned smallint data overflow"
,
pToken
->
z
);
}
...
...
@@ -235,14 +233,13 @@ int32_t tsParseOneColumnData(SSchema *pSchema, SStrToken *pToken, char *payload,
break
;
case
TSDB_DATA_TYPE_INT
:
if
(
pToken
->
type
==
TK_NULL
||
((
pToken
->
type
==
TK_STRING
)
&&
(
pToken
->
n
!=
0
)
&&
(
strncasecmp
(
TSDB_DATA_NULL_STR_L
,
pToken
->
z
,
pToken
->
n
)
==
0
)))
{
if
(
isNullStr
(
pToken
))
{
*
((
int32_t
*
)
payload
)
=
TSDB_DATA_INT_NULL
;
}
else
{
numType
=
tStrToInteger
(
pToken
->
z
,
pToken
->
type
,
pToken
->
n
,
&
iv
,
true
);
if
(
TK_ILLEGAL
==
numType
)
{
ret
=
tStrToInteger
(
pToken
->
z
,
pToken
->
type
,
pToken
->
n
,
&
iv
,
true
);
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
return
tscInvalidSQLErrMsg
(
msg
,
"invalid int data"
,
pToken
->
z
);
}
else
if
(
errno
==
ERANGE
||
iv
>
INT32_MAX
||
iv
<=
INT32_MIN
)
{
}
else
if
(
!
IS_VALID_INT
(
iv
)
)
{
return
tscInvalidSQLErrMsg
(
msg
,
"int data overflow"
,
pToken
->
z
);
}
...
...
@@ -252,14 +249,13 @@ int32_t tsParseOneColumnData(SSchema *pSchema, SStrToken *pToken, char *payload,
break
;
case
TSDB_DATA_TYPE_UINT
:
if
(
pToken
->
type
==
TK_NULL
||
((
pToken
->
type
==
TK_STRING
)
&&
(
pToken
->
n
!=
0
)
&&
(
strncasecmp
(
TSDB_DATA_NULL_STR_L
,
pToken
->
z
,
pToken
->
n
)
==
0
)))
{
if
(
isNullStr
(
pToken
))
{
*
((
uint32_t
*
)
payload
)
=
TSDB_DATA_UINT_NULL
;
}
else
{
numType
=
tStrToInteger
(
pToken
->
z
,
pToken
->
type
,
pToken
->
n
,
&
iv
,
false
);
if
(
TK_ILLEGAL
==
numType
)
{
ret
=
tStrToInteger
(
pToken
->
z
,
pToken
->
type
,
pToken
->
n
,
&
iv
,
false
);
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
return
tscInvalidSQLErrMsg
(
msg
,
"invalid unsigned int data"
,
pToken
->
z
);
}
else
if
(
errno
==
ERANGE
||
iv
>=
UINT32_MAX
)
{
}
else
if
(
!
IS_VALID_UINT
(
iv
)
)
{
return
tscInvalidSQLErrMsg
(
msg
,
"unsigned int data overflow"
,
pToken
->
z
);
}
...
...
@@ -269,14 +265,13 @@ int32_t tsParseOneColumnData(SSchema *pSchema, SStrToken *pToken, char *payload,
break
;
case
TSDB_DATA_TYPE_BIGINT
:
if
(
pToken
->
type
==
TK_NULL
||
((
pToken
->
type
==
TK_STRING
)
&&
(
pToken
->
n
!=
0
)
&&
(
strncasecmp
(
TSDB_DATA_NULL_STR_L
,
pToken
->
z
,
pToken
->
n
)
==
0
)))
{
if
(
isNullStr
(
pToken
))
{
*
((
int64_t
*
)
payload
)
=
TSDB_DATA_BIGINT_NULL
;
}
else
{
numType
=
tStrToInteger
(
pToken
->
z
,
pToken
->
type
,
pToken
->
n
,
&
iv
,
true
);
if
(
TK_ILLEGAL
==
numType
)
{
ret
=
tStrToInteger
(
pToken
->
z
,
pToken
->
type
,
pToken
->
n
,
&
iv
,
true
);
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
return
tscInvalidSQLErrMsg
(
msg
,
"invalid bigint data"
,
pToken
->
z
);
}
else
if
(
errno
==
ERANGE
||
!
IS_VALID_BIGINT
(
iv
))
{
}
else
if
(
!
IS_VALID_BIGINT
(
iv
))
{
return
tscInvalidSQLErrMsg
(
msg
,
"bigint data overflow"
,
pToken
->
z
);
}
...
...
@@ -285,14 +280,13 @@ int32_t tsParseOneColumnData(SSchema *pSchema, SStrToken *pToken, char *payload,
break
;
case
TSDB_DATA_TYPE_UBIGINT
:
if
(
pToken
->
type
==
TK_NULL
||
((
pToken
->
type
==
TK_STRING
)
&&
(
pToken
->
n
!=
0
)
&&
(
strncasecmp
(
TSDB_DATA_NULL_STR_L
,
pToken
->
z
,
pToken
->
n
)
==
0
)))
{
if
(
isNullStr
(
pToken
))
{
*
((
uint64_t
*
)
payload
)
=
TSDB_DATA_UBIGINT_NULL
;
}
else
{
numType
=
tStrToInteger
(
pToken
->
z
,
pToken
->
type
,
pToken
->
n
,
&
iv
,
false
);
if
(
TK_ILLEGAL
==
numType
)
{
ret
=
tStrToInteger
(
pToken
->
z
,
pToken
->
type
,
pToken
->
n
,
&
iv
,
false
);
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
return
tscInvalidSQLErrMsg
(
msg
,
"invalid unsigned bigint data"
,
pToken
->
z
);
}
else
if
(
errno
==
ERANGE
||
!
IS_VALID_UBIGINT
((
uint64_t
)
iv
))
{
}
else
if
(
!
IS_VALID_UBIGINT
((
uint64_t
)
iv
))
{
return
tscInvalidSQLErrMsg
(
msg
,
"unsigned bigint data overflow"
,
pToken
->
z
);
}
...
...
@@ -301,10 +295,7 @@ int32_t tsParseOneColumnData(SSchema *pSchema, SStrToken *pToken, char *payload,
break
;
case
TSDB_DATA_TYPE_FLOAT
:
if
(
pToken
->
type
==
TK_NULL
)
{
*
((
int32_t
*
)
payload
)
=
TSDB_DATA_FLOAT_NULL
;
}
else
if
((
pToken
->
type
==
TK_STRING
)
&&
(
pToken
->
n
!=
0
)
&&
(
strncasecmp
(
TSDB_DATA_NULL_STR_L
,
pToken
->
z
,
pToken
->
n
)
==
0
))
{
if
(
isNullStr
(
pToken
))
{
*
((
int32_t
*
)
payload
)
=
TSDB_DATA_FLOAT_NULL
;
}
else
{
double
dv
;
...
...
@@ -321,10 +312,7 @@ int32_t tsParseOneColumnData(SSchema *pSchema, SStrToken *pToken, char *payload,
break
;
case
TSDB_DATA_TYPE_DOUBLE
:
if
(
pToken
->
type
==
TK_NULL
)
{
*
((
int64_t
*
)
payload
)
=
TSDB_DATA_DOUBLE_NULL
;
}
else
if
((
pToken
->
type
==
TK_STRING
)
&&
(
pToken
->
n
!=
0
)
&&
(
strncasecmp
(
TSDB_DATA_NULL_STR_L
,
pToken
->
z
,
pToken
->
n
)
==
0
))
{
if
(
isNullStr
(
pToken
))
{
*
((
int64_t
*
)
payload
)
=
TSDB_DATA_DOUBLE_NULL
;
}
else
{
double
dv
;
...
...
src/client/src/tscPrepare.c
浏览文件 @
51e61370
...
...
@@ -678,7 +678,7 @@ static int doBindParam(char* data, SParamInfo* param, TAOS_BIND* bind) {
return
TSDB_CODE_SUCCESS
;
case
TSDB_DATA_TYPE_NCHAR
:
{
size
_t
output
=
0
;
int32
_t
output
=
0
;
if
(
!
taosMbsToUcs4
(
bind
->
buffer
,
*
bind
->
length
,
varDataVal
(
data
+
param
->
offset
),
param
->
bytes
-
VARSTR_HEADER_SIZE
,
&
output
))
{
return
TSDB_CODE_TSC_INVALID_VALUE
;
}
...
...
src/client/src/tscSQLParser.c
浏览文件 @
51e61370
...
...
@@ -1012,7 +1012,7 @@ static bool validateTagParams(SArray* pTagsList, SArray* pFieldList, SSqlCmd* pC
return
false
;
}
if
(
p
->
type
<
TSDB_DATA_TYPE_BOOL
||
p
->
type
>
TSDB_DATA_TYPE_NCHAR
)
{
if
(
!
isValidDataType
(
p
->
type
)
)
{
invalidSqlErrMsg
(
tscGetErrorMsgPayload
(
pCmd
),
msg5
);
return
false
;
}
...
...
src/client/src/tscSchemaUtil.c
浏览文件 @
51e61370
...
...
@@ -66,30 +66,24 @@ STableComInfo tscGetTableInfo(const STableMeta* pTableMeta) {
return
pTableMeta
->
tableInfo
;
}
bool
isValidSchema
(
struct
SSchema
*
pSchema
,
int32_t
numOfCols
)
{
if
(
!
VALIDNUMOFCOLS
(
numOfCols
))
{
return
false
;
}
/* first column must be the timestamp, which is a primary key */
if
(
pSchema
[
0
].
type
!=
TSDB_DATA_TYPE_TIMESTAMP
)
{
return
false
;
}
/* type is valid, length is valid */
static
bool
doValidateSchema
(
SSchema
*
pSchema
,
int32_t
numOfCols
,
int32_t
maxLen
)
{
int32_t
rowLen
=
0
;
for
(
int32_t
i
=
0
;
i
<
numOfCols
;
++
i
)
{
// 1. valid types
if
(
pSchema
[
i
].
type
>
TSDB_DATA_TYPE_TIMESTAMP
||
pSchema
[
i
].
type
<
TSDB_DATA_TYPE_BOOL
)
{
if
(
!
isValidDataType
(
pSchema
[
i
].
type
)
)
{
return
false
;
}
// 2. valid length for each type
if
(
pSchema
[
i
].
type
==
TSDB_DATA_TYPE_
TIMESTAMP
)
{
if
(
pSchema
[
i
].
type
==
TSDB_DATA_TYPE_
BINARY
)
{
if
(
pSchema
[
i
].
bytes
>
TSDB_MAX_BINARY_LEN
)
{
return
false
;
}
}
else
if
(
pSchema
[
i
].
type
==
TSDB_DATA_TYPE_NCHAR
)
{
if
(
pSchema
[
i
].
bytes
>
TSDB_MAX_NCHAR_LEN
)
{
return
false
;
}
}
else
{
if
(
pSchema
[
i
].
bytes
!=
tDataTypeDesc
[
pSchema
[
i
].
type
].
nSize
)
{
return
false
;
...
...
@@ -106,8 +100,32 @@ bool isValidSchema(struct SSchema* pSchema, int32_t numOfCols) {
rowLen
+=
pSchema
[
i
].
bytes
;
}
// valid total length
return
(
rowLen
<=
TSDB_MAX_BYTES_PER_ROW
);
return
rowLen
<=
maxLen
;
}
bool
isValidSchema
(
struct
SSchema
*
pSchema
,
int32_t
numOfCols
,
int32_t
numOfTags
)
{
if
(
!
VALIDNUMOFCOLS
(
numOfCols
))
{
return
false
;
}
if
(
!
VALIDNUMOFTAGS
(
numOfTags
))
{
return
false
;
}
/* first column must be the timestamp, which is a primary key */
if
(
pSchema
[
0
].
type
!=
TSDB_DATA_TYPE_TIMESTAMP
)
{
return
false
;
}
if
(
!
doValidateSchema
(
pSchema
,
numOfCols
,
TSDB_MAX_BYTES_PER_ROW
))
{
return
false
;
}
if
(
!
doValidateSchema
(
&
pSchema
[
numOfCols
],
numOfTags
,
TSDB_MAX_TAGS_LEN
))
{
return
false
;
}
return
true
;
}
SSchema
*
tscGetTableColumnSchema
(
const
STableMeta
*
pTableMeta
,
int32_t
colIndex
)
{
...
...
src/client/src/tscServer.c
浏览文件 @
51e61370
...
...
@@ -942,7 +942,7 @@ int tscBuildQueryMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
SSchema
*
pColSchema
=
&
pSchema
[
pCol
->
colIndex
.
columnIndex
];
if
((
pCol
->
colIndex
.
columnIndex
>=
numOfTagColumns
||
pCol
->
colIndex
.
columnIndex
<
-
1
)
||
(
pColSchema
->
type
<
TSDB_DATA_TYPE_BOOL
||
pColSchema
->
type
>
TSDB_DATA_TYPE_NCHAR
))
{
(
!
isValidDataType
(
pColSchema
->
type
)
))
{
tscError
(
"%p tid:%d uid:%"
PRIu64
" id:%s, tag index out of range, totalCols:%d, numOfTags:%d, index:%d, column name:%s"
,
pSql
,
pTableMeta
->
id
.
tid
,
pTableMeta
->
id
.
uid
,
pTableMetaInfo
->
name
,
total
,
numOfTagColumns
,
pCol
->
colIndex
.
columnIndex
,
pColSchema
->
name
);
...
...
src/common/inc/tvariant.h
浏览文件 @
51e61370
...
...
@@ -37,9 +37,9 @@ typedef struct tVariant {
};
}
tVariant
;
void
tVariantCreate
(
tVariant
*
pVar
,
SStrToken
*
token
);
bool
tVariantIsValid
(
tVariant
*
pVar
);
void
tVariantCreate
FromString
(
tVariant
*
pVar
,
char
*
pz
,
uint32_t
len
,
uint32_t
type
);
void
tVariantCreate
(
tVariant
*
pVar
,
SStrToken
*
token
);
void
tVariantCreateFromBinary
(
tVariant
*
pVar
,
const
char
*
pz
,
size_t
len
,
uint32_t
type
);
...
...
src/common/src/ttypes.c
浏览文件 @
51e61370
...
...
@@ -603,19 +603,21 @@ void tsDataSwap(void *pLeft, void *pRight, int32_t type, int32_t size, void* buf
int32_t
tStrToInteger
(
const
char
*
z
,
int16_t
type
,
int32_t
n
,
int64_t
*
value
,
bool
issigned
)
{
errno
=
0
;
int32_t
ret
=
0
;
char
*
endPtr
=
NULL
;
if
(
type
==
TK_FLOAT
)
{
double
v
=
strtod
(
z
,
&
endPtr
);
if
((
errno
==
ERANGE
&&
v
==
HUGE_VALF
)
||
isinf
(
v
)
||
isnan
(
v
))
{
errno
=
ERANGE
;
ret
=
-
1
;
}
else
if
((
issigned
&&
(
v
<
INT64_MIN
||
v
>
INT64_MAX
))
||
((
!
issigned
)
&&
(
v
<
0
||
v
>
UINT64_MAX
)))
{
errno
=
ERANGE
;
ret
=
-
1
;
}
else
{
*
value
=
round
(
v
);
}
return
type
;
errno
=
0
;
return
ret
;
}
int32_t
radix
=
10
;
...
...
@@ -626,12 +628,13 @@ int32_t tStrToInteger(const char* z, int16_t type, int32_t n, int64_t* value, bo
}
// the string may be overflow according to errno
*
value
=
strtol
l
(
z
,
&
endPtr
,
radix
);
*
value
=
issigned
?
strtoll
(
z
,
&
endPtr
,
radix
)
:
strtou
l
(
z
,
&
endPtr
,
radix
);
// not a valid integer number, return error
if
(
endPtr
-
z
!=
n
)
{
ret
urn
TK_ILLEGAL
;
if
(
endPtr
-
z
!=
n
||
errno
==
ERANGE
)
{
ret
=
-
1
;
}
return
type
;
errno
=
0
;
return
ret
;
}
src/common/src/tvariant.c
浏览文件 @
51e61370
...
...
@@ -23,35 +23,46 @@
#include "tutil.h"
#include "ttype.h"
// todo support scientific expression number and oct number
void
tVariantCreate
(
tVariant
*
pVar
,
SStrToken
*
token
)
{
tVariantCreateFromString
(
pVar
,
token
->
z
,
token
->
n
,
token
->
type
);
}
void
tVariantCreate
(
tVariant
*
pVar
,
SStrToken
*
token
)
{
int32_t
ret
=
0
;
int32_t
type
=
token
->
type
;
void
tVariantCreateFromString
(
tVariant
*
pVar
,
char
*
pz
,
uint32_t
len
,
uint32_t
type
)
{
memset
(
pVar
,
0
,
sizeof
(
tVariant
));
switch
(
type
)
{
switch
(
t
oken
->
t
ype
)
{
case
TSDB_DATA_TYPE_BOOL
:
{
int32_t
k
=
strncasecmp
(
p
z
,
"true"
,
4
);
int32_t
k
=
strncasecmp
(
token
->
z
,
"true"
,
4
);
if
(
k
==
0
)
{
pVar
->
i64
=
TSDB_TRUE
;
}
else
{
assert
(
strncasecmp
(
p
z
,
"false"
,
5
)
==
0
);
assert
(
strncasecmp
(
token
->
z
,
"false"
,
5
)
==
0
);
pVar
->
i64
=
TSDB_FALSE
;
}
break
;
}
case
TSDB_DATA_TYPE_TINYINT
:
case
TSDB_DATA_TYPE_SMALLINT
:
case
TSDB_DATA_TYPE_BIGINT
:
case
TSDB_DATA_TYPE_INT
:
pVar
->
i64
=
strtoll
(
pz
,
NULL
,
10
);
case
TSDB_DATA_TYPE_INT
:{
ret
=
tStrToInteger
(
token
->
z
,
token
->
type
,
token
->
n
,
&
pVar
->
i64
,
true
);
if
(
ret
!=
0
)
{
pVar
->
nType
=
-
1
;
// -1 means error type
return
;
}
break
;
}
case
TSDB_DATA_TYPE_DOUBLE
:
case
TSDB_DATA_TYPE_FLOAT
:
pVar
->
dKey
=
strtod
(
p
z
,
NULL
);
case
TSDB_DATA_TYPE_FLOAT
:
{
pVar
->
dKey
=
strtod
(
token
->
z
,
NULL
);
break
;
}
case
TSDB_DATA_TYPE_BINARY
:
{
pVar
->
pz
=
strndup
(
pz
,
le
n
);
pVar
->
pz
=
strndup
(
token
->
z
,
token
->
n
);
pVar
->
nLen
=
strdequote
(
pVar
->
pz
);
break
;
}
...
...
@@ -158,6 +169,11 @@ void tVariantDestroy(tVariant *pVar) {
}
}
bool
tVariantIsValid
(
tVariant
*
pVar
)
{
assert
(
pVar
!=
NULL
);
return
isValidDataType
(
pVar
->
nType
);
}
void
tVariantAssign
(
tVariant
*
pDst
,
const
tVariant
*
pSrc
)
{
if
(
pSrc
==
NULL
||
pDst
==
NULL
)
return
;
...
...
@@ -406,7 +422,7 @@ static FORCE_INLINE int32_t convertToDouble(char *pStr, int32_t len, double *val
return
0
;
}
static
FORCE_INLINE
int32_t
convertToInteger
(
tVariant
*
pVariant
,
int64_t
*
result
,
int32_t
type
,
bool
releaseVariantPtr
)
{
static
FORCE_INLINE
int32_t
convertToInteger
(
tVariant
*
pVariant
,
int64_t
*
result
,
int32_t
type
,
bool
issigned
,
bool
releaseVariantPtr
)
{
if
(
pVariant
->
nType
==
TSDB_DATA_TYPE_NULL
)
{
setNull
((
char
*
)
result
,
type
,
tDataTypeDesc
[
type
].
nSize
);
return
0
;
...
...
@@ -440,8 +456,8 @@ static FORCE_INLINE int32_t convertToInteger(tVariant *pVariant, int64_t *result
}
int64_t
res
=
0
;
int32_t
t
=
tStrToInteger
(
token
.
z
,
token
.
type
,
token
.
n
,
&
res
,
true
);
if
(
TK_ILLEGAL
==
t
||
errno
==
ERANGE
)
{
int32_t
t
=
tStrToInteger
(
token
.
z
,
token
.
type
,
token
.
n
,
&
res
,
issigned
);
if
(
t
!=
0
)
{
return
-
1
;
}
...
...
@@ -570,37 +586,69 @@ int32_t tVariantDump(tVariant *pVariant, char *payload, int16_t type, bool inclu
}
case
TSDB_DATA_TYPE_TINYINT
:
{
if
(
convertToInteger
(
pVariant
,
&
result
,
type
,
false
)
<
0
)
{
if
(
convertToInteger
(
pVariant
,
&
result
,
type
,
true
,
false
)
<
0
)
{
return
-
1
;
}
*
((
int8_t
*
)
payload
)
=
(
int8_t
)
result
;
break
;
}
case
TSDB_DATA_TYPE_UTINYINT
:
{
if
(
convertToInteger
(
pVariant
,
&
result
,
type
,
false
,
false
)
<
0
)
{
return
-
1
;
}
*
((
int8_t
*
)
payload
)
=
(
int8_t
)
result
;
*
((
uint8_t
*
)
payload
)
=
(
uint8_t
)
result
;
break
;
}
case
TSDB_DATA_TYPE_SMALLINT
:
{
if
(
convertToInteger
(
pVariant
,
&
result
,
type
,
false
)
<
0
)
{
if
(
convertToInteger
(
pVariant
,
&
result
,
type
,
true
,
false
)
<
0
)
{
return
-
1
;
}
*
((
int16_t
*
)
payload
)
=
(
int16_t
)
result
;
break
;
}
case
TSDB_DATA_TYPE_USMALLINT
:
{
if
(
convertToInteger
(
pVariant
,
&
result
,
type
,
false
,
false
)
<
0
)
{
return
-
1
;
}
*
((
uint16_t
*
)
payload
)
=
(
uint16_t
)
result
;
break
;
}
case
TSDB_DATA_TYPE_INT
:
{
if
(
convertToInteger
(
pVariant
,
&
result
,
type
,
false
)
<
0
)
{
if
(
convertToInteger
(
pVariant
,
&
result
,
type
,
true
,
false
)
<
0
)
{
return
-
1
;
}
*
((
int32_t
*
)
payload
)
=
(
int32_t
)
result
;
break
;
}
case
TSDB_DATA_TYPE_UINT
:
{
if
(
convertToInteger
(
pVariant
,
&
result
,
type
,
false
,
false
)
<
0
)
{
return
-
1
;
}
*
((
uint32_t
*
)
payload
)
=
(
uint32_t
)
result
;
break
;
}
case
TSDB_DATA_TYPE_BIGINT
:
{
if
(
convertToInteger
(
pVariant
,
&
result
,
type
,
false
)
<
0
)
{
if
(
convertToInteger
(
pVariant
,
&
result
,
type
,
true
,
false
)
<
0
)
{
return
-
1
;
}
*
((
int64_t
*
)
payload
)
=
(
int64_t
)
result
;
break
;
}
case
TSDB_DATA_TYPE_UBIGINT
:
{
if
(
convertToInteger
(
pVariant
,
&
result
,
type
,
false
,
false
)
<
0
)
{
return
-
1
;
}
*
((
uint64_t
*
)
payload
)
=
(
uint64_t
)
result
;
break
;
}
case
TSDB_DATA_TYPE_FLOAT
:
{
if
(
pVariant
->
nType
==
TSDB_DATA_TYPE_BINARY
)
{
if
(
strncasecmp
(
TSDB_DATA_NULL_STR_L
,
pVariant
->
pz
,
pVariant
->
nLen
)
==
0
&&
...
...
@@ -609,20 +657,19 @@ int32_t tVariantDump(tVariant *pVariant, char *payload, int16_t type, bool inclu
return
0
;
}
else
{
double
value
=
-
1
;
int32_t
ret
;
ret
=
convertToDouble
(
pVariant
->
pz
,
pVariant
->
nLen
,
&
value
);
int32_t
ret
=
convertToDouble
(
pVariant
->
pz
,
pVariant
->
nLen
,
&
value
);
if
((
errno
==
ERANGE
&&
(
float
)
value
==
-
1
)
||
(
ret
!=
0
))
{
return
-
1
;
}
SET_FLOAT_VAL
(
payload
,
value
);
}
}
else
if
(
pVariant
->
nType
>=
TSDB_DATA_TYPE_BOOL
&&
pVariant
->
nType
<=
TSDB_DATA_TYPE_BIGINT
)
{
}
else
if
(
pVariant
->
nType
==
TSDB_DATA_TYPE_BOOL
||
IS_SIGNED_NUMERIC_TYPE
(
pVariant
->
nType
)
||
IS_UNSIGNED_NUMERIC_TYPE
(
pVariant
->
nType
)
)
{
SET_FLOAT_VAL
(
payload
,
pVariant
->
i64
);
}
else
if
(
pVariant
->
nType
==
TSDB_DATA_TYPE_DOUBLE
||
pVariant
->
nType
==
TSDB_DATA_TYPE_FLOAT
)
{
}
else
if
(
IS_FLOAT_TYPE
(
pVariant
->
nType
)
)
{
SET_FLOAT_VAL
(
payload
,
pVariant
->
dKey
);
}
else
if
(
pVariant
->
nType
==
TSDB_DATA_TYPE_NULL
)
{
*
((
int32_t
*
)
payload
)
=
TSDB_DATA_FLOAT_NULL
;
*
((
u
int32_t
*
)
payload
)
=
TSDB_DATA_FLOAT_NULL
;
return
0
;
}
...
...
@@ -648,9 +695,9 @@ int32_t tVariantDump(tVariant *pVariant, char *payload, int16_t type, bool inclu
SET_DOUBLE_VAL
(
payload
,
value
);
}
}
else
if
(
pVariant
->
nType
>=
TSDB_DATA_TYPE_BOOL
&&
pVariant
->
nType
<=
TSDB_DATA_TYPE_BIGINT
)
{
}
else
if
(
pVariant
->
nType
==
TSDB_DATA_TYPE_BOOL
||
IS_SIGNED_NUMERIC_TYPE
(
pVariant
->
nType
)
||
IS_UNSIGNED_NUMERIC_TYPE
(
pVariant
->
nType
)
)
{
SET_DOUBLE_VAL
(
payload
,
pVariant
->
i64
);
}
else
if
(
pVariant
->
nType
==
TSDB_DATA_TYPE_DOUBLE
||
pVariant
->
nType
==
TSDB_DATA_TYPE_FLOAT
)
{
}
else
if
(
IS_FLOAT_TYPE
(
pVariant
->
nType
)
)
{
SET_DOUBLE_VAL
(
payload
,
pVariant
->
dKey
);
}
else
if
(
pVariant
->
nType
==
TSDB_DATA_TYPE_NULL
)
{
*
((
int64_t
*
)
payload
)
=
TSDB_DATA_DOUBLE_NULL
;
...
...
@@ -658,9 +705,10 @@ int32_t tVariantDump(tVariant *pVariant, char *payload, int16_t type, bool inclu
}
double
dv
=
GET_DOUBLE_VAL
(
payload
);
if
(
isinf
(
dv
)
||
isnan
(
dv
)
||
dv
>
DBL_MAX
||
dv
<
-
DBL_MAX
)
{
if
(
errno
==
ERANGE
||
isinf
(
dv
)
||
isnan
(
dv
)
)
{
return
-
1
;
}
break
;
}
...
...
@@ -766,7 +814,7 @@ int32_t tVariantTypeSetType(tVariant *pVariant, char type) {
case
TSDB_DATA_TYPE_BIGINT
:
case
TSDB_DATA_TYPE_TINYINT
:
case
TSDB_DATA_TYPE_SMALLINT
:
{
convertToInteger
(
pVariant
,
&
(
pVariant
->
i64
),
type
,
true
);
convertToInteger
(
pVariant
,
&
(
pVariant
->
i64
),
type
,
true
,
true
);
pVariant
->
nType
=
TSDB_DATA_TYPE_BIGINT
;
break
;
}
...
...
src/inc/taoserror.h
浏览文件 @
51e61370
...
...
@@ -180,6 +180,7 @@ TAOS_DEFINE_ERROR(TSDB_CODE_MND_TAG_NOT_EXIST, 0, 0x036A, "Tag does n
TAOS_DEFINE_ERROR
(
TSDB_CODE_MND_FIELD_ALREAY_EXIST
,
0
,
0x036B
,
"Field already exists"
)
TAOS_DEFINE_ERROR
(
TSDB_CODE_MND_FIELD_NOT_EXIST
,
0
,
0x036C
,
"Field does not exist"
)
TAOS_DEFINE_ERROR
(
TSDB_CODE_MND_INVALID_STABLE_NAME
,
0
,
0x036D
,
"Super table does not exist"
)
TAOS_DEFINE_ERROR
(
TSDB_CODE_MND_INVALID_CREATE_TABLE_MSG
,
0
,
0x036E
,
"Invalid create table message"
)
TAOS_DEFINE_ERROR
(
TSDB_CODE_MND_DB_NOT_SELECTED
,
0
,
0x0380
,
"Database not specified or available"
)
TAOS_DEFINE_ERROR
(
TSDB_CODE_MND_DB_ALREADY_EXIST
,
0
,
0x0381
,
"Database already exists"
)
...
...
src/inc/ttype.h
浏览文件 @
51e61370
...
...
@@ -16,6 +16,7 @@ extern "C" {
break; \
case TSDB_DATA_TYPE_UTINYINT: \
(_v) = (_finalType)GET_UINT8_VAL(_data); \
break; \
case TSDB_DATA_TYPE_SMALLINT: \
(_v) = (_finalType)GET_INT16_VAL(_data); \
break; \
...
...
src/mnode/src/mnodeTable.c
浏览文件 @
51e61370
...
...
@@ -1000,7 +1000,7 @@ static int32_t mnodeProcessCreateSuperTableMsg(SMnodeMsg *pMsg) {
SCMCreateTableMsg
*
pCreate1
=
pMsg
->
rpcMsg
.
pCont
;
if
(
pCreate1
->
numOfTables
==
0
)
{
// todo return to error message
return
TSDB_CODE_MND_INVALID_CREATE_TABLE_MSG
;
}
SCreateTableMsg
*
pCreate
=
(
SCreateTableMsg
*
)((
char
*
)
pCreate1
+
sizeof
(
SCMCreateTableMsg
));
...
...
@@ -1029,16 +1029,39 @@ static int32_t mnodeProcessCreateSuperTableMsg(SMnodeMsg *pMsg) {
mError
(
"msg:%p, app:%p table:%s, failed to create, no schema input"
,
pMsg
,
pMsg
->
rpcMsg
.
ahandle
,
pCreate
->
tableId
);
return
TSDB_CODE_MND_INVALID_TABLE_NAME
;
}
memcpy
(
pStable
->
schema
,
pCreate
->
schema
,
numOfCols
*
sizeof
(
SSchema
));
if
(
pStable
->
numOfColumns
>
TSDB_MAX_COLUMNS
||
pStable
->
numOfTags
>
TSDB_MAX_TAGS
)
{
mError
(
"msg:%p, app:%p table:%s, failed to create, too many columns"
,
pMsg
,
pMsg
->
rpcMsg
.
ahandle
,
pCreate
->
tableId
);
return
TSDB_CODE_MND_INVALID_TABLE_NAME
;
}
pStable
->
nextColId
=
0
;
// TODO extract method to valid the schema
int32_t
schemaLen
=
0
;
int32_t
tagLen
=
0
;
for
(
int32_t
col
=
0
;
col
<
numOfCols
;
col
++
)
{
SSchema
*
tschema
=
pStable
->
schema
;
tschema
[
col
].
colId
=
pStable
->
nextColId
++
;
tschema
[
col
].
bytes
=
htons
(
tschema
[
col
].
bytes
);
// todo 1. check the length of each column; 2. check the total length of all columns
assert
(
tschema
[
col
].
type
>=
TSDB_DATA_TYPE_BOOL
&&
tschema
[
col
].
type
<=
TSDB_DATA_TYPE_NCHAR
);
if
(
col
<
pStable
->
numOfTables
)
{
schemaLen
+=
tschema
[
col
].
bytes
;
}
else
{
tagLen
+=
tschema
[
col
].
bytes
;
}
if
(
!
isValidDataType
(
tschema
[
col
].
type
))
{
mError
(
"msg:%p, app:%p table:%s, failed to create, invalid data type in schema"
,
pMsg
,
pMsg
->
rpcMsg
.
ahandle
,
pCreate
->
tableId
);
return
TSDB_CODE_MND_INVALID_CREATE_TABLE_MSG
;
}
}
if
(
schemaLen
>
(
TSDB_MAX_BYTES_PER_ROW
||
tagLen
>
TSDB_MAX_TAGS_LEN
))
{
mError
(
"msg:%p, app:%p table:%s, failed to create, schema is too long"
,
pMsg
,
pMsg
->
rpcMsg
.
ahandle
,
pCreate
->
tableId
);
return
TSDB_CODE_MND_INVALID_CREATE_TABLE_MSG
;
}
pMsg
->
pTable
=
(
STableObj
*
)
pStable
;
...
...
src/query/inc/qExecutor.h
浏览文件 @
51e61370
...
...
@@ -30,7 +30,7 @@
#include "tsqlfunction.h"
struct
SColumnFilterElem
;
typedef
bool
(
*
__filter_func_t
)(
struct
SColumnFilterElem
*
pFilter
,
c
har
*
val1
,
char
*
val2
);
typedef
bool
(
*
__filter_func_t
)(
struct
SColumnFilterElem
*
pFilter
,
c
onst
char
*
val1
,
const
char
*
val2
,
int16_t
type
);
typedef
int32_t
(
*
__block_search_fn_t
)(
char
*
data
,
int32_t
num
,
int64_t
key
,
int32_t
order
);
typedef
struct
SResultRowPool
{
...
...
src/query/inc/qUtil.h
浏览文件 @
51e61370
...
...
@@ -60,11 +60,10 @@ static FORCE_INLINE char *getPosInResultPage(SQueryRuntimeEnv *pRuntimeEnv, int3
pQuery
->
pExpr1
[
columnIndex
].
bytes
*
realRowId
;
}
bool
isNull
_filter
(
SColumnFilterElem
*
pFilter
,
char
*
minval
,
char
*
maxval
);
bool
notNull
_filter
(
SColumnFilterElem
*
pFilter
,
char
*
minval
,
char
*
maxval
);
bool
isNull
Operator
(
SColumnFilterElem
*
pFilter
,
const
char
*
minval
,
const
char
*
maxval
,
int16_t
type
);
bool
notNull
Operator
(
SColumnFilterElem
*
pFilter
,
const
char
*
minval
,
const
char
*
maxval
,
int16_t
type
);
__filter_func_t
*
getRangeFilterFuncArray
(
int32_t
type
);
__filter_func_t
*
getValueFilterFuncArray
(
int32_t
type
);
__filter_func_t
getFilterOperator
(
int32_t
lowerOptr
,
int32_t
upperOptr
);
SResultRowPool
*
initResultRowPool
(
size_t
size
);
SResultRow
*
getNewResultRow
(
SResultRowPool
*
p
);
...
...
src/query/src/qExecutor.c
浏览文件 @
51e61370
...
...
@@ -212,22 +212,22 @@ bool doFilterData(SQuery *pQuery, int32_t elemPos) {
bool
isnull
=
isNull
(
pElem
,
pFilterInfo
->
info
.
type
);
if
(
isnull
)
{
if
(
pFilterElem
->
fp
==
isNull
_filte
r
)
{
if
(
pFilterElem
->
fp
==
isNull
Operato
r
)
{
qualified
=
true
;
break
;
}
else
{
continue
;
}
}
else
{
if
(
pFilterElem
->
fp
==
notNull
_filte
r
)
{
if
(
pFilterElem
->
fp
==
notNull
Operato
r
)
{
qualified
=
true
;
break
;
}
else
if
(
pFilterElem
->
fp
==
isNull
_filte
r
)
{
}
else
if
(
pFilterElem
->
fp
==
isNull
Operato
r
)
{
continue
;
}
}
if
(
pFilterElem
->
fp
(
pFilterElem
,
pElem
,
pElem
))
{
if
(
pFilterElem
->
fp
(
pFilterElem
,
pElem
,
pElem
,
pFilterInfo
->
info
.
type
))
{
qualified
=
true
;
break
;
}
...
...
@@ -759,7 +759,7 @@ static void doUpdateResultRowIndex(SResultRowInfo*pResultRowInfo, TSKEY lastKey,
}
if
(
i
==
pResultRowInfo
->
size
-
1
)
{
pResultRowInfo
->
curIndex
=
i
;
pResultRowInfo
->
curIndex
=
i
;
}
else
{
pResultRowInfo
->
curIndex
=
i
+
1
;
// current not closed result object
}
...
...
@@ -2478,7 +2478,7 @@ static bool needToLoadDataBlock(SQueryRuntimeEnv* pRuntimeEnv, SDataStatis *pDat
// if isNULL query exists, load the null data column
for
(
int32_t
j
=
0
;
j
<
pFilterInfo
->
numOfFilters
;
++
j
)
{
SColumnFilterElem
*
pFilterElem
=
&
pFilterInfo
->
pFilters
[
j
];
if
(
pFilterElem
->
fp
==
isNull
_filte
r
)
{
if
(
pFilterElem
->
fp
==
isNull
Operato
r
)
{
return
true
;
}
}
...
...
@@ -2493,13 +2493,13 @@ static bool needToLoadDataBlock(SQueryRuntimeEnv* pRuntimeEnv, SDataStatis *pDat
float
maxval
=
(
float
)(
*
(
double
*
)(
&
pDataBlockst
->
max
));
for
(
int32_t
i
=
0
;
i
<
pFilterInfo
->
numOfFilters
;
++
i
)
{
if
(
pFilterInfo
->
pFilters
[
i
].
fp
(
&
pFilterInfo
->
pFilters
[
i
],
(
char
*
)
&
minval
,
(
char
*
)
&
maxval
))
{
if
(
pFilterInfo
->
pFilters
[
i
].
fp
(
&
pFilterInfo
->
pFilters
[
i
],
(
char
*
)
&
minval
,
(
char
*
)
&
maxval
,
TSDB_DATA_TYPE_FLOAT
))
{
return
true
;
}
}
}
else
{
for
(
int32_t
i
=
0
;
i
<
pFilterInfo
->
numOfFilters
;
++
i
)
{
if
(
pFilterInfo
->
pFilters
[
i
].
fp
(
&
pFilterInfo
->
pFilters
[
i
],
(
char
*
)
&
pDataBlockst
->
min
,
(
char
*
)
&
pDataBlockst
->
max
))
{
if
(
pFilterInfo
->
pFilters
[
i
].
fp
(
&
pFilterInfo
->
pFilters
[
i
],
(
char
*
)
&
pDataBlockst
->
min
,
(
char
*
)
&
pDataBlockst
->
max
,
pFilterInfo
->
info
.
type
))
{
return
true
;
}
}
...
...
@@ -6115,7 +6115,7 @@ static int32_t convertQueryMsg(SQueryTableMsg *pQueryMsg, SArray **pTableIdList,
if
(
pQueryMsg
->
secondStageOutput
)
{
pExprMsg
=
(
SSqlFuncMsg
*
)
pMsg
;
*
pSecStageExpr
=
calloc
(
pQueryMsg
->
secondStageOutput
,
POINTER_BYTES
);
for
(
int32_t
i
=
0
;
i
<
pQueryMsg
->
secondStageOutput
;
++
i
)
{
(
*
pSecStageExpr
)[
i
]
=
pExprMsg
;
...
...
@@ -6449,55 +6449,18 @@ static int32_t createFilterInfo(void *pQInfo, SQuery *pQuery) {
int32_t
lower
=
pSingleColFilter
->
filterInfo
.
lowerRelOptr
;
int32_t
upper
=
pSingleColFilter
->
filterInfo
.
upperRelOptr
;
if
(
lower
==
TSDB_RELATION_INVALID
&&
upper
==
TSDB_RELATION_INVALID
)
{
qError
(
"QInfo:%p invalid filter info"
,
pQInfo
);
return
TSDB_CODE_QRY_INVALID_MSG
;
}
int16_t
type
=
pQuery
->
colList
[
i
].
type
;
int16_t
bytes
=
pQuery
->
colList
[
i
].
bytes
;
// todo refactor
__filter_func_t
*
rangeFilterArray
=
getRangeFilterFuncArray
(
type
);
__filter_func_t
*
filterArray
=
getValueFilterFuncArray
(
type
);
if
(
rangeFilterArray
==
NULL
&&
filterArray
==
NULL
)
{
qError
(
"QInfo:%p failed to get filter function, invalid data type:%d"
,
pQInfo
,
type
);
pSingleColFilter
->
fp
=
getFilterOperator
(
lower
,
upper
);
if
(
pSingleColFilter
->
fp
==
NULL
)
{
qError
(
"QInfo:%p invalid filter info"
,
pQInfo
);
return
TSDB_CODE_QRY_INVALID_MSG
;
}
if
((
lower
==
TSDB_RELATION_GREATER_EQUAL
||
lower
==
TSDB_RELATION_GREATER
)
&&
(
upper
==
TSDB_RELATION_LESS_EQUAL
||
upper
==
TSDB_RELATION_LESS
))
{
assert
(
rangeFilterArray
!=
NULL
);
if
(
lower
==
TSDB_RELATION_GREATER_EQUAL
)
{
if
(
upper
==
TSDB_RELATION_LESS_EQUAL
)
{
pSingleColFilter
->
fp
=
rangeFilterArray
[
4
];
}
else
{
pSingleColFilter
->
fp
=
rangeFilterArray
[
2
];
}
}
else
{
if
(
upper
==
TSDB_RELATION_LESS_EQUAL
)
{
pSingleColFilter
->
fp
=
rangeFilterArray
[
3
];
}
else
{
pSingleColFilter
->
fp
=
rangeFilterArray
[
1
];
}
}
}
else
{
// set callback filter function
assert
(
filterArray
!=
NULL
);
if
(
lower
!=
TSDB_RELATION_INVALID
)
{
pSingleColFilter
->
fp
=
filterArray
[
lower
];
if
(
upper
!=
TSDB_RELATION_INVALID
)
{
qError
(
"pQInfo:%p failed to get filter function, invalid filter condition: %d"
,
pQInfo
,
type
);
return
TSDB_CODE_QRY_INVALID_MSG
;
}
}
else
{
pSingleColFilter
->
fp
=
filterArray
[
upper
];
}
}
assert
(
pSingleColFilter
->
fp
!=
NULL
);
pSingleColFilter
->
bytes
=
bytes
;
pSingleColFilter
->
bytes
=
pQuery
->
colList
[
i
].
bytes
;
}
j
++
;
...
...
@@ -6800,7 +6763,7 @@ static int32_t initQInfo(SQueryTableMsg *pQueryMsg, void *tsdb, int32_t vgId, SQ
UNUSED
(
ret
);
}
pQuery
->
precision
=
tsdbGetCfg
(
tsdb
)
->
precision
;
if
((
QUERY_IS_ASC_QUERY
(
pQuery
)
&&
(
pQuery
->
window
.
skey
>
pQuery
->
window
.
ekey
))
||
...
...
src/query/src/qFilterfunc.c
浏览文件 @
51e61370
此差异已折叠。
点击以展开。
src/query/tests/astTest.cpp
浏览文件 @
51e61370
...
...
@@ -471,7 +471,7 @@ tExprNode *createExpr1() {
pRight->pVal = (tVariant*) calloc(1, sizeof(tVariant));
pRight->pVal->nType = TSDB_DATA_TYPE_INT;
pRight->pVal->i64
Key
= 12;
pRight->pVal->i64 = 12;
auto *pRoot = (tExprNode*) calloc(1, sizeof(tExprNode));
pRoot->nodeType = TSQL_NODE_EXPR;
...
...
@@ -574,7 +574,7 @@ void exprSerializeTest1() {
tVariant* v2 = p2->_node.pRight->pVal;
ASSERT_EQ(v1->nType, v2->nType);
ASSERT_EQ(v1->i64
Key, v2->i64Key
);
ASSERT_EQ(v1->i64
, v2->i64
);
ASSERT_EQ(p1->_node.hasPK, p2->_node.hasPK);
tExprTreeDestroy(&p1, nullptr);
...
...
tests/script/general/parser/null_char.sim
浏览文件 @
51e61370
...
...
@@ -451,11 +451,8 @@ sql select tag_bigint, tag_smallint, tag_tinyint from st51
if $data00 != 9223372036854775807 then
return -1
endi
sql alter table st51 set tag tag_bigint = 9223372036854775808
sql select tag_bigint, tag_smallint, tag_tinyint from st51
if $data00 != 9223372036854775807 then
return -1
endi
sql_error alter table st51 set tag tag_bigint = 9223372036854775808
sql alter table st51 set tag tag_bigint = -9223372036854775807
sql select tag_bigint, tag_smallint, tag_tinyint from st51
if $data00 != -9223372036854775807 then
...
...
tests/script/general/parser/testSuite.sim
浏览文件 @
51e61370
run general/parser/alter.sim
sleep 100
run general/parser/alter1.sim
sleep 100
run general/parser/alter_stable.sim
sleep 100
run general/parser/auto_create_tb.sim
sleep 100
run general/parser/auto_create_tb_drop_tb.sim
sleep 100
run general/parser/col_arithmetic_operation.sim
sleep 100
run general/parser/columnValue.sim
sleep 100
run general/parser/commit.sim
sleep 100
run general/parser/create_db.sim
sleep 100
run general/parser/create_mt.sim
sleep 100
run general/parser/create_tb.sim
sleep 100
run general/parser/dbtbnameValidate.sim
sleep 100
run general/parser/fill.sim
sleep 100
run general/parser/fill_stb.sim
sleep 100
#run general/parser/fill_us.sim #
sleep 100
run general/parser/first_last.sim
sleep 100
run general/parser/import_commit1.sim
sleep 100
run general/parser/import_commit2.sim
sleep 100
run general/parser/import_commit3.sim
sleep 100
#run general/parser/import_file.sim
sleep 100
run general/parser/insert_tb.sim
sleep 100
run general/parser/tags_dynamically_specifiy.sim
sleep 100
run general/parser/interp.sim
sleep 100
run general/parser/lastrow.sim
sleep 100
run general/parser/limit.sim
sleep 100
run general/parser/limit1.sim
sleep 100
run general/parser/limit1_tblocks100.sim
sleep 100
run general/parser/limit2.sim
sleep 100
run general/parser/mixed_blocks.sim
sleep 100
run general/parser/nchar.sim
sleep 100
run general/parser/null_char.sim
#
run general/parser/alter.sim
#
sleep 100
#
run general/parser/alter1.sim
#
sleep 100
#
run general/parser/alter_stable.sim
#
sleep 100
#
run general/parser/auto_create_tb.sim
#
sleep 100
#
run general/parser/auto_create_tb_drop_tb.sim
#
sleep 100
#
run general/parser/col_arithmetic_operation.sim
#
sleep 100
#
run general/parser/columnValue.sim
#
sleep 100
#
run general/parser/commit.sim
#
sleep 100
#
run general/parser/create_db.sim
#
sleep 100
#
run general/parser/create_mt.sim
#
sleep 100
#
run general/parser/create_tb.sim
#
sleep 100
#
run general/parser/dbtbnameValidate.sim
#
sleep 100
#
run general/parser/fill.sim
#
sleep 100
#
run general/parser/fill_stb.sim
#
sleep 100
#
#
run general/parser/fill_us.sim #
#
sleep 100
#
run general/parser/first_last.sim
#
sleep 100
#
run general/parser/import_commit1.sim
#
sleep 100
#
run general/parser/import_commit2.sim
#
sleep 100
#
run general/parser/import_commit3.sim
#
sleep 100
#
#
run general/parser/import_file.sim
#
sleep 100
#
run general/parser/insert_tb.sim
#
sleep 100
#
run general/parser/tags_dynamically_specifiy.sim
#
sleep 100
#
run general/parser/interp.sim
#
sleep 100
#
run general/parser/lastrow.sim
#
sleep 100
#
run general/parser/limit.sim
#
sleep 100
#
run general/parser/limit1.sim
#
sleep 100
#
run general/parser/limit1_tblocks100.sim
#
sleep 100
#
run general/parser/limit2.sim
#
sleep 100
#
run general/parser/mixed_blocks.sim
#
sleep 100
#
run general/parser/nchar.sim
#
sleep 100
#
run general/parser/null_char.sim
sleep 100
run general/parser/selectResNum.sim
sleep 100
...
...
tests/tsim/src/simExe.c
浏览文件 @
51e61370
...
...
@@ -746,15 +746,27 @@ bool simExecuteNativeSqlCommand(SScript *script, char *rest, bool isSlow) {
case
TSDB_DATA_TYPE_TINYINT
:
sprintf
(
value
,
"%d"
,
*
((
int8_t
*
)
row
[
i
]));
break
;
case
TSDB_DATA_TYPE_UTINYINT
:
sprintf
(
value
,
"%u"
,
*
((
uint8_t
*
)
row
[
i
]));
break
;
case
TSDB_DATA_TYPE_SMALLINT
:
sprintf
(
value
,
"%d"
,
*
((
int16_t
*
)
row
[
i
]));
break
;
case
TSDB_DATA_TYPE_USMALLINT
:
sprintf
(
value
,
"%u"
,
*
((
uint16_t
*
)
row
[
i
]));
break
;
case
TSDB_DATA_TYPE_INT
:
sprintf
(
value
,
"%d"
,
*
((
int32_t
*
)
row
[
i
]));
break
;
case
TSDB_DATA_TYPE_UINT
:
sprintf
(
value
,
"%u"
,
*
((
uint32_t
*
)
row
[
i
]));
break
;
case
TSDB_DATA_TYPE_BIGINT
:
sprintf
(
value
,
"%"
PRId64
,
*
((
int64_t
*
)
row
[
i
]));
break
;
case
TSDB_DATA_TYPE_UBIGINT
:
sprintf
(
value
,
"%"
PRIu64
,
*
((
uint64_t
*
)
row
[
i
]));
break
;
case
TSDB_DATA_TYPE_FLOAT
:
sprintf
(
value
,
"%.5f"
,
GET_FLOAT_VAL
(
row
[
i
]));
break
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录