Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
1b9d8daa
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看板
未验证
提交
1b9d8daa
编写于
12月 23, 2021
作者:
S
Shengliang Guan
提交者:
GitHub
12月 23, 2021
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #9303 from taosdata/feature/3.0_liaohj
Feature/3.0 liaohj
上级
6a4424b5
bc48abe8
变更
30
展开全部
隐藏空白更改
内联
并排
Showing
30 changed file
with
682 addition
and
2907 deletion
+682
-2907
include/common/taosmsg.h
include/common/taosmsg.h
+34
-16
include/common/tmsgtype.h
include/common/tmsgtype.h
+0
-8
include/common/tname.h
include/common/tname.h
+0
-2
include/libs/parser/parsenodes.h
include/libs/parser/parsenodes.h
+6
-0
include/libs/parser/parser.h
include/libs/parser/parser.h
+11
-13
include/libs/qcom/query.h
include/libs/qcom/query.h
+16
-4
source/client/inc/clientInt.h
source/client/inc/clientInt.h
+6
-3
source/client/src/clientEnv.c
source/client/src/clientEnv.c
+6
-18
source/client/src/clientImpl.c
source/client/src/clientImpl.c
+23
-9
source/client/src/clientMain.c
source/client/src/clientMain.c
+9
-10
source/client/src/clientMsgHandler.c
source/client/src/clientMsgHandler.c
+29
-2769
source/client/test/clientTests.cpp
source/client/test/clientTests.cpp
+35
-2
source/common/src/tname.c
source/common/src/tname.c
+5
-30
source/libs/catalog/src/catalog.c
source/libs/catalog/src/catalog.c
+1
-1
source/libs/parser/inc/astToMsg.h
source/libs/parser/inc/astToMsg.h
+1
-0
source/libs/parser/inc/parserInt.h
source/libs/parser/inc/parserInt.h
+9
-1
source/libs/parser/inc/parserUtil.h
source/libs/parser/inc/parserUtil.h
+2
-0
source/libs/parser/src/astGenerator.c
source/libs/parser/src/astGenerator.c
+3
-2
source/libs/parser/src/astToMsg.c
source/libs/parser/src/astToMsg.c
+124
-0
source/libs/parser/src/astValidate.c
source/libs/parser/src/astValidate.c
+183
-4
source/libs/parser/src/insertParser.c
source/libs/parser/src/insertParser.c
+4
-4
source/libs/parser/src/parser.c
source/libs/parser/src/parser.c
+4
-4
source/libs/parser/src/parserUtil.c
source/libs/parser/src/parserUtil.c
+12
-1
source/libs/parser/src/sql.c
source/libs/parser/src/sql.c
+1
-0
source/libs/parser/test/insertParserTest.cpp
source/libs/parser/test/insertParserTest.cpp
+2
-2
source/libs/parser/test/parserTests.cpp
source/libs/parser/test/parserTests.cpp
+6
-3
source/libs/qcom/CMakeLists.txt
source/libs/qcom/CMakeLists.txt
+2
-0
source/libs/qcom/src/queryUtil.c
source/libs/qcom/src/queryUtil.c
+46
-1
source/libs/qcom/test/CMakeLists.txt
source/libs/qcom/test/CMakeLists.txt
+19
-0
source/libs/qcom/test/queryTest.cpp
source/libs/qcom/test/queryTest.cpp
+83
-0
未找到文件。
include/common/taosmsg.h
浏览文件 @
1b9d8daa
...
...
@@ -94,15 +94,15 @@ TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_NETWORK_TEST, "nettest" )
// message from mnode to vnode
TAOS_DEFINE_MESSAGE_TYPE
(
TSDB_MSG_TYPE_CREATE_STB_IN
,
"create-stb-internal"
)
TAOS_DEFINE_MESSAGE_TYPE
(
TSDB_MSG_TYPE_ALTER_STB_IN
,
"alter-stb-internal"
)
TAOS_DEFINE_MESSAGE_TYPE
(
TSDB_MSG_TYPE_ALTER_STB_IN
,
"alter-stb-internal"
)
TAOS_DEFINE_MESSAGE_TYPE
(
TSDB_MSG_TYPE_DROP_STB_IN
,
"drop-stb-internal"
)
// message from mnode to mnode
// message from mnode to qnode
// message from mnode to dnode
TAOS_DEFINE_MESSAGE_TYPE
(
TSDB_MSG_TYPE_CREATE_VNODE_IN
,
"create-vnode-internal"
)
TAOS_DEFINE_MESSAGE_TYPE
(
TSDB_MSG_TYPE_ALTER_VNODE_IN
,
"alter-vnode-internal"
)
TAOS_DEFINE_MESSAGE_TYPE
(
TSDB_MSG_TYPE_DROP_VNODE_IN
,
"drop-vnode-internal"
)
TAOS_DEFINE_MESSAGE_TYPE
(
TSDB_MSG_TYPE_AUTH_VNODE_IN
,
"auth-vnode-internal"
)
TAOS_DEFINE_MESSAGE_TYPE
(
TSDB_MSG_TYPE_DROP_VNODE_IN
,
"drop-vnode-internal"
)
TAOS_DEFINE_MESSAGE_TYPE
(
TSDB_MSG_TYPE_AUTH_VNODE_IN
,
"auth-vnode-internal"
)
TAOS_DEFINE_MESSAGE_TYPE
(
TSDB_MSG_TYPE_SYNC_VNODE_IN
,
"sync-vnode-internal"
)
TAOS_DEFINE_MESSAGE_TYPE
(
TSDB_MSG_TYPE_COMPACT_VNODE_IN
,
"compact-vnode-internal"
)
TAOS_DEFINE_MESSAGE_TYPE
(
TSDB_MSG_TYPE_CREATE_MNODE_IN
,
"create-mnode-internal"
)
...
...
@@ -289,6 +289,37 @@ typedef struct SSchema {
char
name
[
TSDB_COL_NAME_LEN
];
}
SSchema
;
typedef
struct
{
int32_t
contLen
;
int32_t
vgId
;
int8_t
tableType
;
int16_t
numOfColumns
;
int16_t
numOfTags
;
int32_t
tid
;
int32_t
sversion
;
int32_t
tversion
;
int32_t
tagDataLen
;
int32_t
sqlDataLen
;
uint64_t
uid
;
uint64_t
superTableUid
;
uint64_t
createdTime
;
char
tableFname
[
TSDB_TABLE_FNAME_LEN
];
char
stbFname
[
TSDB_TABLE_FNAME_LEN
];
char
data
[];
}
SMDCreateTableMsg
;
typedef
struct
{
int32_t
len
;
// one create table message
char
tableName
[
TSDB_TABLE_FNAME_LEN
];
int16_t
numOfTags
;
int16_t
numOfColumns
;
int16_t
sqlLen
;
// the length of SQL, it starts after schema , sql is a null-terminated string
int8_t
igExists
;
int8_t
rspMeta
;
int8_t
reserved
[
16
];
char
schema
[];
}
SCreateTableMsg
;
typedef
struct
{
char
name
[
TSDB_TABLE_FNAME_LEN
];
int8_t
igExists
;
...
...
@@ -326,19 +357,6 @@ typedef struct {
uint64_t
suid
;
}
SDropStbInternalMsg
;
typedef
struct
{
SMsgHead
head
;
char
name
[
TSDB_TABLE_FNAME_LEN
];
char
stbFname
[
TSDB_TABLE_FNAME_LEN
];
int8_t
tableType
;
uint64_t
suid
;
int32_t
sversion
;
int32_t
numOfTags
;
int32_t
numOfColumns
;
int32_t
tagDataLen
;
char
data
[];
}
SCreateTableMsg
;
typedef
struct
{
SMsgHead
head
;
char
name
[
TSDB_TABLE_FNAME_LEN
];
...
...
include/common/tmsgtype.h
浏览文件 @
1b9d8daa
...
...
@@ -102,14 +102,6 @@ enum {
TSDB_DEFINE_SQL_TYPE
(
TSDB_SQL_MAX
,
"max"
)
};
// create table operation type
enum
TSQL_CREATE_TABLE_TYPE
{
TSQL_CREATE_TABLE
=
0x1
,
TSQL_CREATE_STABLE
=
0x2
,
TSQL_CREATE_CTABLE
=
0x3
,
TSQL_CREATE_STREAM
=
0x4
,
};
#ifdef __cplusplus
}
#endif
...
...
include/common/tname.h
浏览文件 @
1b9d8daa
...
...
@@ -16,8 +16,6 @@
#ifndef TDENGINE_TNAME_H
#define TDENGINE_TNAME_H
//#include "taosmsg.h"
#define TSDB_DB_NAME_T 1
#define TSDB_TABLE_NAME_T 2
...
...
include/libs/parser/parsenodes.h
浏览文件 @
1b9d8daa
...
...
@@ -43,6 +43,12 @@ typedef struct SField {
int16_t
bytes
;
}
SField
;
typedef
struct
SParseBasicCtx
{
const
char
*
db
;
int32_t
acctId
;
uint64_t
requestId
;
}
SParseBasicCtx
;
typedef
struct
SFieldInfo
{
int16_t
numOfOutput
;
// number of column in result
SField
*
final
;
...
...
include/libs/parser/parser.h
浏览文件 @
1b9d8daa
...
...
@@ -31,18 +31,16 @@ extern "C" {
bool
qIsInsertSql
(
const
char
*
pStr
,
size_t
length
);
typedef
struct
SParseContext
{
const
char
*
pAcctId
;
const
char
*
pDbname
;
void
*
pRpc
;
const
char
*
pClusterId
;
struct
SCatalog
*
pCatalog
;
const
SEpSet
*
pEpSet
;
int64_t
id
;
// query id, generated by uuid generator
int8_t
schemaAttached
;
// denote if submit block is built with table schema or not
const
char
*
pSql
;
// sql string
size_t
sqlLen
;
// length of the sql string
char
*
pMsg
;
// extended error message if exists to help avoid the problem in sql statement.
int32_t
msgLen
;
// max length of the msg
SParseBasicCtx
ctx
;
void
*
pRpc
;
struct
SCatalog
*
pCatalog
;
const
SEpSet
*
pEpSet
;
int64_t
id
;
// query id, generated by uuid generator
int8_t
schemaAttached
;
// denote if submit block is built with table schema or not
const
char
*
pSql
;
// sql string
size_t
sqlLen
;
// length of the sql string
char
*
pMsg
;
// extended error message if exists to help avoid the problem in sql statement.
int32_t
msgLen
;
// max length of the msg
}
SParseContext
;
/**
...
...
@@ -53,7 +51,7 @@ typedef struct SParseContext {
* @param msg extended error message if exists.
* @return error code
*/
int32_t
qParseQuerySql
(
const
char
*
pStr
,
size_t
length
,
int64_t
id
,
int32_t
*
type
,
void
**
pOutput
,
int32_t
*
outputLen
,
char
*
msg
,
int32_t
msgLen
);
int32_t
qParseQuerySql
(
const
char
*
pStr
,
size_t
length
,
SParseBasicCtx
*
pParseCtx
,
int32_t
*
type
,
void
**
pOutput
,
int32_t
*
outputLen
,
char
*
msg
,
int32_t
msgLen
);
/**
* Parse the insert sql statement.
...
...
include/libs/qcom/query.h
浏览文件 @
1b9d8daa
...
...
@@ -90,15 +90,27 @@ typedef struct STableMetaOutput {
STableMeta
*
tbMeta
;
}
STableMetaOutput
;
typedef
int32_t
__async_exec_fn_t
(
void
*
param
);
bool
tIsValidSchema
(
struct
SSchema
*
pSchema
,
int32_t
numOfCols
,
int32_t
numOfTags
);
extern
int32_t
(
*
queryBuildMsg
[
TSDB_MSG_TYPE_MAX
])(
void
*
input
,
char
**
msg
,
int32_t
msgSize
,
int32_t
*
msgLen
);
extern
int32_t
(
*
queryProcessMsgRsp
[
TSDB_MSG_TYPE_MAX
])(
void
*
output
,
char
*
msg
,
int32_t
msgSize
);
int32_t
initTaskQueue
();
int32_t
cleanupTaskQueue
();
/**
*
* @param execFn The asynchronously execution function
* @param execParam The parameters of the execFn
* @param code The response code during execution the execFn
* @return
*/
int32_t
taosAsyncExec
(
__async_exec_fn_t
execFn
,
void
*
execParam
,
int32_t
*
code
);
SSchema
*
tGetTbnameColumnSchema
();
extern
void
msgInit
();
void
msgInit
();
extern
int32_t
qDebugFlag
;
extern
int32_t
(
*
queryBuildMsg
[
TSDB_MSG_TYPE_MAX
])(
void
*
input
,
char
**
msg
,
int32_t
msgSize
,
int32_t
*
msgLen
);
extern
int32_t
(
*
queryProcessMsgRsp
[
TSDB_MSG_TYPE_MAX
])(
void
*
output
,
char
*
msg
,
int32_t
msgSize
);
#define qFatal(...) do { if (qDebugFlag & DEBUG_FATAL) { taosPrintLog("QRY FATAL ", qDebugFlag, __VA_ARGS__); }} while(0)
#define qError(...) do { if (qDebugFlag & DEBUG_ERROR) { taosPrintLog("QRY ERROR ", qDebugFlag, __VA_ARGS__); }} while(0)
...
...
source/client/inc/clientInt.h
浏览文件 @
1b9d8daa
...
...
@@ -148,13 +148,16 @@ int taos_init();
void
*
createTscObj
(
const
char
*
user
,
const
char
*
auth
,
const
char
*
ip
,
uint32_t
port
,
SAppInstInfo
*
pAppInfo
);
void
destroyTscObj
(
void
*
pObj
);
void
*
createRequest
(
STscObj
*
pObj
,
__taos_async_fn_t
fp
,
void
*
param
,
int32_t
type
);
void
destroyRequest
(
SRequestObj
*
pRequest
);
void
*
createRequest
(
STscObj
*
pObj
,
__taos_async_fn_t
fp
,
void
*
param
,
int32_t
type
);
void
destroyRequest
(
SRequestObj
*
pRequest
);
char
*
getConnectionDB
(
STscObj
*
pObj
);
void
setConnectionDB
(
STscObj
*
pTscObj
,
const
char
*
db
);
void
taos_init_imp
(
void
);
int
taos_options_imp
(
TSDB_OPTION
option
,
const
char
*
str
);
void
*
openTransporter
(
const
char
*
user
,
const
char
*
auth
);
void
*
openTransporter
(
const
char
*
user
,
const
char
*
auth
,
int32_t
numOfThreads
);
void
processMsgFromServer
(
void
*
parent
,
SRpcMsg
*
pMsg
,
SEpSet
*
pEpSet
);
void
initMsgHandleFp
();
...
...
source/client/src/
tsc
Env.c
→
source/client/src/
client
Env.c
浏览文件 @
1b9d8daa
...
...
@@ -13,17 +13,17 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "clientInt.h"
#include "clientLog.h"
#include "os.h"
#include "taosmsg.h"
#include "query.h"
#include "clientInt.h"
#include "clientLog.h"
#include "tcache.h"
#include "tconfig.h"
#include "tglobal.h"
#include "tnote.h"
#include "tref.h"
#include "trpc.h"
#include "tsched.h"
#include "ttime.h"
#include "ttimezone.h"
...
...
@@ -33,10 +33,8 @@
SAppInfo
appInfo
;
int32_t
tscReqRef
=
-
1
;
int32_t
tscConnRef
=
-
1
;
void
*
tscQhandle
=
NULL
;
static
pthread_once_t
tscinit
=
PTHREAD_ONCE_INIT
;
int32_t
tsNumOfThreads
=
1
;
volatile
int32_t
tscInitRes
=
0
;
static
void
registerRequest
(
SRequestObj
*
pRequest
)
{
...
...
@@ -98,12 +96,12 @@ void closeTransporter(STscObj* pTscObj) {
}
// TODO refactor
void
*
openTransporter
(
const
char
*
user
,
const
char
*
auth
)
{
void
*
openTransporter
(
const
char
*
user
,
const
char
*
auth
,
int32_t
numOfThread
)
{
SRpcInit
rpcInit
;
memset
(
&
rpcInit
,
0
,
sizeof
(
rpcInit
));
rpcInit
.
localPort
=
0
;
rpcInit
.
label
=
"TSC"
;
rpcInit
.
numOfThreads
=
tsNumOfThreads
;
rpcInit
.
numOfThreads
=
numOfThread
;
rpcInit
.
cfp
=
processMsgFromServer
;
rpcInit
.
sessions
=
tsMaxConnections
;
rpcInit
.
connType
=
TAOS_CONN_CLIENT
;
...
...
@@ -229,18 +227,8 @@ void taos_init_imp(void) {
taosSetCoreDump
(
true
);
double
factor
=
4
.
0
;
int32_t
numOfThreads
=
MAX
((
int
)(
tsNumOfCores
*
tsNumOfThreadsPerCore
/
factor
),
2
);
int32_t
queueSize
=
tsMaxConnections
*
2
;
tscQhandle
=
taosInitScheduler
(
queueSize
,
numOfThreads
,
"tsc"
);
if
(
NULL
==
tscQhandle
)
{
tscError
(
"failed to init task queue"
);
tscInitRes
=
-
1
;
return
;
}
initTaskQueue
();
tscDebug
(
"client task queue is initialized, numOfThreads: %d"
,
numOfThreads
);
tscConnRef
=
taosOpenRef
(
200
,
destroyTscObj
);
tscReqRef
=
taosOpenRef
(
40960
,
doDestroyRequest
);
...
...
source/client/src/clientImpl.c
浏览文件 @
1b9d8daa
...
...
@@ -102,9 +102,8 @@ TAOS *taos_connect_internal(const char *ip, const char *user, const char *pass,
SAppInstInfo
**
pInst
=
taosHashGet
(
appInfo
.
pInstMap
,
key
,
strlen
(
key
));
if
(
pInst
==
NULL
)
{
SAppInstInfo
*
p
=
calloc
(
1
,
sizeof
(
struct
SAppInstInfo
));
p
->
mgmtEp
=
epSet
;
p
->
pTransporter
=
openTransporter
(
user
,
secretEncrypt
);
p
->
pTransporter
=
openTransporter
(
user
,
secretEncrypt
,
tsNumOfCores
);
taosHashPut
(
appInfo
.
pInstMap
,
key
,
strlen
(
key
),
&
p
,
POINTER_BYTES
);
pInst
=
&
p
;
...
...
@@ -152,8 +151,12 @@ TAOS_RES *taos_query_l(TAOS *taos, const char *sql, int sqlLen) {
int32_t
type
=
0
;
void
*
output
=
NULL
;
int32_t
outputLen
=
0
;
code
=
qParseQuerySql
(
pRequest
->
sqlstr
,
sqlLen
,
pRequest
->
requestId
,
&
type
,
&
output
,
&
outputLen
,
pRequest
->
msgBuf
,
ERROR_MSG_BUF_DEFAULT_SIZE
);
if
(
type
==
TSDB_SQL_CREATE_USER
||
type
==
TSDB_SQL_SHOW
||
type
==
TSDB_SQL_DROP_USER
||
type
==
TSDB_SQL_DROP_ACCT
||
type
==
TSDB_SQL_CREATE_DB
||
type
==
TSDB_SQL_CREATE_ACCT
)
{
SParseBasicCtx
c
=
{.
requestId
=
pRequest
->
requestId
,
.
acctId
=
pTscObj
->
acctId
,
.
db
=
getConnectionDB
(
pTscObj
)};
code
=
qParseQuerySql
(
pRequest
->
sqlstr
,
sqlLen
,
&
c
,
&
type
,
&
output
,
&
outputLen
,
pRequest
->
msgBuf
,
ERROR_MSG_BUF_DEFAULT_SIZE
);
if
(
type
==
TSDB_SQL_CREATE_USER
||
type
==
TSDB_SQL_SHOW
||
type
==
TSDB_SQL_DROP_USER
||
type
==
TSDB_SQL_DROP_ACCT
||
type
==
TSDB_SQL_CREATE_DB
||
type
==
TSDB_SQL_CREATE_ACCT
||
type
==
TSDB_SQL_CREATE_TABLE
||
type
==
TSDB_SQL_USE_DB
)
{
pRequest
->
type
=
type
;
pRequest
->
body
.
requestMsg
=
(
SReqMsgInfo
){.
pMsg
=
output
,
.
len
=
outputLen
};
...
...
@@ -164,12 +167,12 @@ TAOS_RES *taos_query_l(TAOS *taos, const char *sql, int sqlLen) {
sendMsgToServer
(
pTscObj
->
pTransporter
,
&
pTscObj
->
pAppInfo
->
mgmtEp
.
epSet
,
&
body
,
&
transporterId
);
tsem_wait
(
&
pRequest
->
body
.
rspSem
);
destroyRequestMsgBody
(
&
body
);
}
else
{
assert
(
0
);
}
tfree
(
c
.
db
);
}
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
...
...
@@ -437,8 +440,19 @@ void setResultDataPtr(SReqResultInfo* pResultInfo, TAOS_FIELD* pFields, int32_t
}
}
const
char
*
taos_get_client_info
()
{
return
version
;
}
char
*
getConnectionDB
(
STscObj
*
pObj
)
{
char
*
p
=
NULL
;
pthread_mutex_lock
(
&
pObj
->
mutex
);
p
=
strndup
(
pObj
->
db
,
tListLen
(
pObj
->
db
));
pthread_mutex_unlock
(
&
pObj
->
mutex
);
int
taos_affected_rows
(
TAOS_RES
*
res
)
{
return
1
;
}
return
p
;
}
void
setConnectionDB
(
STscObj
*
pTscObj
,
const
char
*
db
)
{
assert
(
db
!=
NULL
&&
pTscObj
!=
NULL
);
pthread_mutex_lock
(
&
pTscObj
->
mutex
);
tstrncpy
(
pTscObj
->
db
,
db
,
tListLen
(
pTscObj
->
db
));
pthread_mutex_unlock
(
&
pTscObj
->
mutex
);
}
int
taos_result_precision
(
TAOS_RES
*
res
)
{
return
TSDB_TIME_PRECISION_MILLI
;
}
source/client/src/clientMain.c
浏览文件 @
1b9d8daa
#include "os.h"
#include "clientInt.h"
#include "clientLog.h"
#include "
os
.h"
#include "
query
.h"
#include "taosmsg.h"
#include "tcache.h"
#include "tconfig.h"
#include "tglobal.h"
#include "tnote.h"
#include "tref.h"
#include "trpc.h"
#include "tsched.h"
#include "ttime.h"
#include "ttimezone.h"
#define TSC_VAR_NOT_RELEASE 1
#define TSC_VAR_RELEASED 0
...
...
@@ -44,9 +39,7 @@ void taos_cleanup(void) {
tscReqRef
=
-
1
;
taosCloseRef
(
id
);
void
*
p
=
tscQhandle
;
tscQhandle
=
NULL
;
taosCleanUpScheduler
(
p
);
cleanupTaskQueue
();
id
=
tscConnRef
;
tscConnRef
=
-
1
;
...
...
@@ -262,3 +255,9 @@ const char *taos_data_type(int type) {
default:
return
"UNKNOWN"
;
}
}
const
char
*
taos_get_client_info
()
{
return
version
;
}
int
taos_affected_rows
(
TAOS_RES
*
res
)
{
return
1
;
}
int
taos_result_precision
(
TAOS_RES
*
res
)
{
return
TSDB_TIME_PRECISION_MILLI
;
}
source/client/src/clientMsgHandler.c
浏览文件 @
1b9d8daa
此差异已折叠。
点击以展开。
source/client/test/clientTests.cpp
浏览文件 @
1b9d8daa
...
...
@@ -16,15 +16,15 @@
#include <gtest/gtest.h>
#include <taoserror.h>
#include <iostream>
#include "tglobal.h"
#pragma GCC diagnostic ignored "-Wwrite-strings"
#pragma GCC diagnostic ignored "-Wunused-function"
#pragma GCC diagnostic ignored "-Wunused-variable"
#pragma GCC diagnostic ignored "-Wsign-compare"
#include "../inc/clientInt.h"
#include "taos.h"
#include "tglobal.h"
#include "../inc/clientInt.h"
namespace
{
}
// namespace
...
...
@@ -148,3 +148,36 @@ TEST(testCase, create_db_Test) {
taos_close
(
pConn
);
}
TEST
(
testCase
,
use_db_test
)
{
TAOS
*
pConn
=
taos_connect
(
"ubuntu"
,
"root"
,
"taosdata"
,
NULL
,
0
);
assert
(
pConn
!=
NULL
);
TAOS_RES
*
pRes
=
taos_query
(
pConn
,
"use abc1"
);
TAOS_FIELD
*
pFields
=
taos_fetch_fields
(
pRes
);
ASSERT_TRUE
(
pFields
==
NULL
);
int32_t
numOfFields
=
taos_num_fields
(
pRes
);
ASSERT_EQ
(
numOfFields
,
0
);
taos_close
(
pConn
);
}
TEST
(
testCase
,
create_stable_Test
)
{
TAOS
*
pConn
=
taos_connect
(
"ubuntu"
,
"root"
,
"taosdata"
,
NULL
,
0
);
assert
(
pConn
!=
NULL
);
TAOS_RES
*
pRes
=
taos_query
(
pConn
,
"use abc1"
);
taos_free_result
(
pRes
);
pRes
=
taos_query
(
pConn
,
"create stable st1(ts timestamp, k int) tags(a int)"
);
TAOS_FIELD
*
pFields
=
taos_fetch_fields
(
pRes
);
ASSERT_TRUE
(
pFields
==
NULL
);
int32_t
numOfFields
=
taos_num_fields
(
pRes
);
ASSERT_EQ
(
numOfFields
,
0
);
taos_close
(
pConn
);
}
source/common/src/tname.c
浏览文件 @
1b9d8daa
...
...
@@ -6,21 +6,6 @@
#define VALID_NAME_TYPE(x) ((x) == TSDB_DB_NAME_T || (x) == TSDB_TABLE_NAME_T)
char
*
extractDBName
(
const
char
*
tableId
,
char
*
name
)
{
size_t
offset1
=
strcspn
(
tableId
,
&
TS_PATH_DELIMITER
[
0
]);
size_t
len
=
strcspn
(
&
tableId
[
offset1
+
1
],
&
TS_PATH_DELIMITER
[
0
]);
return
strncpy
(
name
,
&
tableId
[
offset1
+
1
],
len
);
}
// todo remove it
size_t
tableIdPrefix
(
const
char
*
name
,
char
*
prefix
,
int32_t
len
)
{
tstrncpy
(
prefix
,
name
,
len
);
strcat
(
prefix
,
TS_PATH_DELIMITER
);
return
strlen
(
prefix
);
}
bool
tscValidateTableNameLength
(
size_t
len
)
{
return
len
<
TSDB_TABLE_NAME_LEN
;
}
...
...
@@ -125,7 +110,7 @@ int32_t tNameExtractFullName(const SName* name, char* dst) {
return
-
1
;
}
int32_t
len
=
snprintf
(
dst
,
TSDB_FULL_DB_NAME_LEN
,
"%
s
.%s"
,
name
->
acctId
,
name
->
dbname
);
int32_t
len
=
snprintf
(
dst
,
TSDB_FULL_DB_NAME_LEN
,
"%
d
.%s"
,
name
->
acctId
,
name
->
dbname
);
size_t
tnameLen
=
strlen
(
name
->
tname
);
if
(
tnameLen
>
0
)
{
...
...
@@ -141,7 +126,9 @@ int32_t tNameExtractFullName(const SName* name, char* dst) {
int32_t
tNameLen
(
const
SName
*
name
)
{
assert
(
name
!=
NULL
);
int32_t
len
=
(
int32_t
)
strlen
(
name
->
acctId
);
char
tmp
[
12
]
=
{
0
};
int32_t
len
=
sprintf
(
tmp
,
"%d"
,
name
->
acctId
);
int32_t
len1
=
(
int32_t
)
strlen
(
name
->
dbname
);
int32_t
len2
=
(
int32_t
)
strlen
(
name
->
tname
);
...
...
@@ -161,10 +148,6 @@ bool tNameIsValid(const SName* name) {
return
false
;
}
if
(
strlen
(
name
->
acctId
)
<=
0
)
{
return
false
;
}
if
(
name
->
type
==
TSDB_DB_NAME_T
)
{
return
strlen
(
name
->
dbname
)
>
0
;
}
else
{
...
...
@@ -237,13 +220,6 @@ int32_t tNameFromString(SName* dst, const char* str, uint32_t type) {
return
-
1
;
}
int32_t
len
=
(
int32_t
)(
p
-
str
);
// too long account id or too long db name
// if ((len >= tListLen(dst->acctId)) || (len <= 0)) {
// return -1;
// }
// memcpy (dst->acctId, str, len);
dst
->
acctId
=
strtoll
(
str
,
NULL
,
10
);
}
...
...
@@ -272,9 +248,8 @@ int32_t tNameFromString(SName* dst, const char* str, uint32_t type) {
dst
->
type
=
TSDB_TABLE_NAME_T
;
char
*
start
=
(
char
*
)
((
p
==
NULL
)
?
str
:
(
p
+
1
));
int32_t
len
=
(
int32_t
)
strlen
(
start
);
// too long account id or too long db name
int32_t
len
=
(
int32_t
)
strlen
(
start
);
if
((
len
>=
tListLen
(
dst
->
tname
))
||
(
len
<=
0
))
{
return
-
1
;
}
...
...
source/libs/catalog/src/catalog.c
浏览文件 @
1b9d8daa
...
...
@@ -605,7 +605,7 @@ int32_t catalogGetAllMeta(struct SCatalog* pCatalog, void *pRpc, const SEpSet* p
SName
*
name
=
taosArrayGet
(
pReq
->
pTableName
,
i
);
STableMeta
*
pTableMeta
=
NULL
;
snprintf
(
dbName
,
sizeof
(
dbName
),
"%
s
.%s"
,
name
->
acctId
,
name
->
dbname
);
snprintf
(
dbName
,
sizeof
(
dbName
),
"%
d
.%s"
,
name
->
acctId
,
name
->
dbname
);
CTG_ERR_JRET
(
catalogGetTableMeta
(
pCatalog
,
pRpc
,
pMgmtEps
,
dbName
,
name
->
tname
,
&
pTableMeta
));
...
...
source/libs/parser/inc/astToMsg.h
浏览文件 @
1b9d8daa
...
...
@@ -9,5 +9,6 @@ SCreateAcctMsg* buildAcctManipulationMsg(SSqlInfo* pInfo, int32_t* outputLen, in
SDropUserMsg
*
buildDropUserMsg
(
SSqlInfo
*
pInfo
,
int32_t
*
outputLen
,
int64_t
id
,
char
*
msgBuf
,
int32_t
msgLen
);
SShowMsg
*
buildShowMsg
(
SShowInfo
*
pShowInfo
,
int64_t
id
,
char
*
msgBuf
,
int32_t
msgLen
);
SCreateDbMsg
*
buildCreateDbMsg
(
SCreateDbInfo
*
pCreateDbInfo
,
char
*
msgBuf
,
int32_t
msgLen
);
SCreateStbMsg
*
buildCreateTableMsg
(
SCreateTableSql
*
pCreateTableSql
,
int32_t
*
len
,
SParseBasicCtx
*
pParseCtx
,
SMsgBuf
*
pMsgBuf
);
#endif // TDENGINE_ASTTOMSG_H
source/libs/parser/inc/parserInt.h
浏览文件 @
1b9d8daa
...
...
@@ -38,6 +38,14 @@ typedef struct SMsgBuf {
char
*
buf
;
}
SMsgBuf
;
// create table operation type
enum
TSQL_CREATE_TABLE_TYPE
{
TSQL_CREATE_TABLE
=
0x1
,
TSQL_CREATE_STABLE
=
0x2
,
TSQL_CREATE_CTABLE
=
0x3
,
TSQL_CREATE_STREAM
=
0x4
,
};
void
clearTableMetaInfo
(
STableMetaInfo
*
pTableMetaInfo
);
void
clearAllTableMetaInfo
(
SQueryStmtInfo
*
pQueryInfo
,
bool
removeMeta
,
uint64_t
id
);
...
...
@@ -60,7 +68,7 @@ int32_t qParserValidateSqlNode(struct SCatalog* pCatalog, SSqlInfo* pSqlInfo, SQ
* @param type
* @return
*/
int32_t
qParserValidateDclSqlNode
(
SSqlInfo
*
pInfo
,
int64_t
id
,
void
**
output
,
int32_t
*
outputLen
,
int32_t
*
type
,
char
*
msgBuf
,
int32_t
msgBufLen
);
int32_t
qParserValidateDclSqlNode
(
SSqlInfo
*
pInfo
,
SParseBasicCtx
*
pCtx
,
void
**
output
,
int32_t
*
outputLen
,
int32_t
*
type
,
char
*
msgBuf
,
int32_t
msgBufLen
);
/**
* Evaluate the numeric and timestamp arithmetic expression in the WHERE clause.
...
...
source/libs/parser/inc/parserUtil.h
浏览文件 @
1b9d8daa
...
...
@@ -67,6 +67,8 @@ int32_t getExprFunctionId(SExprInfo *pExprInfo);
STableMeta
*
tableMetaDup
(
const
STableMeta
*
pTableMeta
);
bool
isDclSqlStatement
(
SSqlInfo
*
pSqlInfo
);
bool
isDdlSqlStatement
(
SSqlInfo
*
pSqlInfo
);
bool
isDqlSqlStatement
(
SSqlInfo
*
pSqlInfo
);
#ifdef __cplusplus
}
...
...
source/libs/parser/src/astGenerator.c
浏览文件 @
1b9d8daa
...
...
@@ -13,9 +13,10 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "taos.h"
#include "os.h"
#include "astGenerator.h"
#include <parserInt.h>
#include "os.h"
#include "taos.h"
#include "tmsgtype.h"
SArray
*
tListItemAppend
(
SArray
*
pList
,
SVariant
*
pVar
,
uint8_t
sortOrder
)
{
...
...
source/libs/parser/src/astToMsg.c
浏览文件 @
1b9d8daa
#include <astGenerator.h>
#include "parserInt.h"
#include "parserUtil.h"
...
...
@@ -219,3 +220,126 @@ SCreateDbMsg* buildCreateDbMsg(SCreateDbInfo* pCreateDbInfo, char* msgBuf, int32
return
pCreateMsg
;
}
int32_t
createSName
(
SName
*
pName
,
SToken
*
pTableName
,
SParseBasicCtx
*
pParseCtx
,
SMsgBuf
*
pMsgBuf
)
{
const
char
*
msg1
=
"name too long"
;
const
char
*
msg2
=
"acctId too long"
;
int32_t
code
=
TSDB_CODE_SUCCESS
;
char
*
p
=
strnchr
(
pTableName
->
z
,
TS_PATH_DELIMITER
[
0
],
pTableName
->
n
,
false
);
if
(
p
!=
NULL
)
{
// db has been specified in sql string so we ignore current db path
code
=
tNameSetAcctId
(
pName
,
pParseCtx
->
acctId
);
if
(
code
!=
0
)
{
return
buildInvalidOperationMsg
(
pMsgBuf
,
msg2
);
}
char
name
[
TSDB_TABLE_FNAME_LEN
]
=
{
0
};
strncpy
(
name
,
pTableName
->
z
,
pTableName
->
n
);
code
=
tNameFromString
(
pName
,
name
,
T_NAME_DB
|
T_NAME_TABLE
);
if
(
code
!=
0
)
{
return
buildInvalidOperationMsg
(
pMsgBuf
,
msg1
);
}
}
else
{
// get current DB name first, and then set it into path
if
(
pTableName
->
n
>=
TSDB_TABLE_NAME_LEN
)
{
return
buildInvalidOperationMsg
(
pMsgBuf
,
msg1
);
}
tNameSetDbName
(
pName
,
pParseCtx
->
acctId
,
pParseCtx
->
db
,
strlen
(
pParseCtx
->
db
));
char
name
[
TSDB_TABLE_FNAME_LEN
]
=
{
0
};
strncpy
(
name
,
pTableName
->
z
,
pTableName
->
n
);
code
=
tNameFromString
(
pName
,
name
,
T_NAME_TABLE
);
if
(
code
!=
0
)
{
code
=
buildInvalidOperationMsg
(
pMsgBuf
,
msg1
);
}
}
return
code
;
}
SCreateStbMsg
*
buildCreateTableMsg
(
SCreateTableSql
*
pCreateTableSql
,
int32_t
*
len
,
SParseBasicCtx
*
pParseCtx
,
SMsgBuf
*
pMsgBuf
)
{
SSchema
*
pSchema
;
int32_t
numOfCols
=
(
int32_t
)
taosArrayGetSize
(
pCreateTableSql
->
colInfo
.
pColumns
);
int32_t
numOfTags
=
(
int32_t
)
taosArrayGetSize
(
pCreateTableSql
->
colInfo
.
pTagColumns
);
SCreateStbMsg
*
pCreateTableMsg
=
(
SCreateStbMsg
*
)
calloc
(
1
,
sizeof
(
SCreateStbMsg
)
+
(
numOfCols
+
numOfTags
)
*
sizeof
(
SSchema
));
char
*
pMsg
=
NULL
;
int8_t
type
=
pCreateTableSql
->
type
;
if
(
type
==
TSQL_CREATE_TABLE
)
{
// create by using super table, tags value
#if 0
SArray* list = pInfo->pCreateTableInfo->childTableInfo;
int32_t numOfTables = (int32_t)taosArrayGetSize(list);
pCreateTableMsg->numOfTables = htonl(numOfTables);
pMsg = (char*)pCreateMsg;
for (int32_t i = 0; i < numOfTables; ++i) {
SCreateTableMsg* pCreate = (SCreateTableMsg*)pMsg;
pCreate->numOfColumns = htons(pCmd->numOfCols);
pCreate->numOfTags = htons(pCmd->count);
pMsg += sizeof(SCreateTableMsg);
SCreatedTableInfo* p = taosArrayGet(list, i);
strcpy(pCreate->tableName, p->fullname);
pCreate->igExists = (p->igExist) ? 1 : 0;
// use dbinfo from table id without modifying current db info
pMsg = serializeTagData(&p->tagdata, pMsg);
int32_t len = (int32_t)(pMsg - (char*)pCreate);
pCreate->len = htonl(len);
}
#endif
}
else
{
// create (super) table
SName
n
=
{
0
};
int32_t
code
=
createSName
(
&
n
,
&
pCreateTableSql
->
name
,
pParseCtx
,
pMsgBuf
);
if
(
code
!=
0
)
{
return
NULL
;
}
code
=
tNameExtractFullName
(
&
n
,
pCreateTableMsg
->
name
);
if
(
code
!=
0
)
{
buildInvalidOperationMsg
(
pMsgBuf
,
"invalid table name or database not specified"
);
return
NULL
;
}
pCreateTableMsg
->
igExists
=
pCreateTableSql
->
existCheck
?
1
:
0
;
pCreateTableMsg
->
numOfColumns
=
htonl
(
numOfCols
);
pCreateTableMsg
->
numOfTags
=
htonl
(
numOfTags
);
pSchema
=
(
SSchema
*
)
pCreateTableMsg
->
pSchema
;
for
(
int
i
=
0
;
i
<
numOfCols
;
++
i
)
{
TAOS_FIELD
*
pField
=
taosArrayGet
(
pCreateTableSql
->
colInfo
.
pColumns
,
i
);
pSchema
->
type
=
pField
->
type
;
pSchema
->
bytes
=
htonl
(
pField
->
bytes
);
strcpy
(
pSchema
->
name
,
pField
->
name
);
pSchema
++
;
}
for
(
int32_t
i
=
0
;
i
<
numOfTags
;
++
i
)
{
TAOS_FIELD
*
pField
=
taosArrayGet
(
pCreateTableSql
->
colInfo
.
pTagColumns
,
i
);
pSchema
->
type
=
pField
->
type
;
pSchema
->
bytes
=
htonl
(
pField
->
bytes
);
strcpy
(
pSchema
->
name
,
pField
->
name
);
pSchema
++
;
}
pMsg
=
(
char
*
)
pSchema
;
}
int32_t
msgLen
=
(
int32_t
)(
pMsg
-
(
char
*
)
pCreateTableMsg
);
*
len
=
msgLen
;
return
pCreateTableMsg
;
}
source/libs/parser/src/astValidate.c
浏览文件 @
1b9d8daa
...
...
@@ -4171,7 +4171,144 @@ static int32_t doCheckDbOptions(SCreateDbMsg* pCreate, SMsgBuf* pMsgBuf) {
return
TSDB_CODE_SUCCESS
;
}
int32_t
qParserValidateDclSqlNode
(
SSqlInfo
*
pInfo
,
int64_t
id
,
void
**
output
,
int32_t
*
outputLen
,
int32_t
*
type
,
char
*
msgBuf
,
int32_t
msgBufLen
)
{
/* is contained in pFieldList or not */
static
bool
has
(
SArray
*
pFieldList
,
int32_t
startIndex
,
const
char
*
name
)
{
size_t
numOfCols
=
taosArrayGetSize
(
pFieldList
);
for
(
int32_t
j
=
startIndex
;
j
<
numOfCols
;
++
j
)
{
TAOS_FIELD
*
field
=
taosArrayGet
(
pFieldList
,
j
);
if
(
strncasecmp
(
name
,
field
->
name
,
sizeof
(
field
->
name
)
-
1
)
==
0
)
return
true
;
}
return
false
;
}
static
int32_t
validateTableColumns
(
SArray
*
pFieldList
,
int32_t
maxRowLength
,
int32_t
maxColumns
,
SMsgBuf
*
pMsgBuf
)
{
const
char
*
msg2
=
"row length exceeds max length"
;
const
char
*
msg3
=
"duplicated column names"
;
const
char
*
msg4
=
"invalid data type"
;
const
char
*
msg5
=
"invalid binary/nchar column length"
;
const
char
*
msg6
=
"invalid column name"
;
const
char
*
msg7
=
"too many columns"
;
const
char
*
msg8
=
"illegal number of columns"
;
size_t
numOfCols
=
taosArrayGetSize
(
pFieldList
);
if
(
numOfCols
>
maxColumns
)
{
return
buildInvalidOperationMsg
(
pMsgBuf
,
msg7
);
}
int32_t
rowLen
=
0
;
for
(
int32_t
i
=
0
;
i
<
numOfCols
;
++
i
)
{
TAOS_FIELD
*
pField
=
taosArrayGet
(
pFieldList
,
i
);
if
(
!
isValidDataType
(
pField
->
type
))
{
return
buildInvalidOperationMsg
(
pMsgBuf
,
msg4
);
}
if
(
pField
->
bytes
==
0
)
{
return
buildInvalidOperationMsg
(
pMsgBuf
,
msg5
);
}
if
((
pField
->
type
==
TSDB_DATA_TYPE_BINARY
&&
(
pField
->
bytes
<=
0
||
pField
->
bytes
>
TSDB_MAX_BINARY_LEN
))
||
(
pField
->
type
==
TSDB_DATA_TYPE_NCHAR
&&
(
pField
->
bytes
<=
0
||
pField
->
bytes
>
TSDB_MAX_NCHAR_LEN
)))
{
return
buildInvalidOperationMsg
(
pMsgBuf
,
msg5
);
}
SToken
nameToken
=
{.
z
=
pField
->
name
,
.
n
=
strlen
(
pField
->
name
),
.
type
=
TK_ID
};
if
(
parserValidateNameToken
(
&
nameToken
)
!=
TSDB_CODE_SUCCESS
)
{
return
buildInvalidOperationMsg
(
pMsgBuf
,
msg6
);
}
// field name must be unique
if
(
has
(
pFieldList
,
i
+
1
,
pField
->
name
)
==
true
)
{
return
buildInvalidOperationMsg
(
pMsgBuf
,
msg3
);
}
rowLen
+=
pField
->
bytes
;
}
// max row length must be less than TSDB_MAX_BYTES_PER_ROW
if
(
rowLen
>
maxRowLength
)
{
return
buildInvalidOperationMsg
(
pMsgBuf
,
msg2
);
}
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
validateTableColumnInfo
(
SArray
*
pFieldList
,
SMsgBuf
*
pMsgBuf
)
{
assert
(
pFieldList
!=
NULL
);
const
char
*
msg1
=
"first column must be timestamp"
;
const
char
*
msg2
=
"row length exceeds max length"
;
const
char
*
msg3
=
"duplicated column names"
;
const
char
*
msg4
=
"invalid data type"
;
const
char
*
msg5
=
"invalid binary/nchar column length"
;
const
char
*
msg6
=
"invalid column name"
;
const
char
*
msg7
=
"too many columns"
;
const
char
*
msg8
=
"illegal number of columns"
;
// first column must be timestamp
TAOS_FIELD
*
pField
=
taosArrayGet
(
pFieldList
,
0
);
if
(
pField
->
type
!=
TSDB_DATA_TYPE_TIMESTAMP
)
{
return
buildInvalidOperationMsg
(
pMsgBuf
,
msg1
);
}
// number of fields no less than 2
size_t
numOfCols
=
taosArrayGetSize
(
pFieldList
);
if
(
numOfCols
<=
1
)
{
return
buildInvalidOperationMsg
(
pMsgBuf
,
msg8
);
}
return
validateTableColumns
(
pFieldList
,
TSDB_MAX_BYTES_PER_ROW
,
TSDB_MAX_COLUMNS
,
pMsgBuf
);
}
static
int32_t
validateTagParams
(
SArray
*
pTagsList
,
SArray
*
pFieldList
,
SMsgBuf
*
pMsgBuf
)
{
assert
(
pTagsList
!=
NULL
);
const
char
*
msg1
=
"invalid number of tag columns"
;
const
char
*
msg3
=
"duplicated column names"
;
// number of fields at least 1
size_t
numOfTags
=
taosArrayGetSize
(
pTagsList
);
if
(
numOfTags
<
1
)
{
return
buildInvalidOperationMsg
(
pMsgBuf
,
msg1
);
}
// field name must be unique
for
(
int32_t
i
=
0
;
i
<
numOfTags
;
++
i
)
{
TAOS_FIELD
*
p
=
taosArrayGet
(
pTagsList
,
i
);
if
(
has
(
pFieldList
,
0
,
p
->
name
)
==
true
)
{
return
buildInvalidOperationMsg
(
pMsgBuf
,
msg3
);
}
}
return
validateTableColumns
(
pFieldList
,
TSDB_MAX_TAGS_LEN
,
TSDB_MAX_TAGS
,
pMsgBuf
);
}
int32_t
doCheckForCreateTable
(
SSqlInfo
*
pInfo
,
SMsgBuf
*
pMsgBuf
)
{
const
char
*
msg1
=
"invalid table name"
;
SCreateTableSql
*
pCreateTable
=
pInfo
->
pCreateTableInfo
;
SArray
*
pFieldList
=
pCreateTable
->
colInfo
.
pColumns
;
SArray
*
pTagList
=
pCreateTable
->
colInfo
.
pTagColumns
;
assert
(
pFieldList
!=
NULL
);
// if sql specifies db, use it, otherwise use default db
SToken
*
pzTableName
=
&
(
pCreateTable
->
name
);
bool
dbIncluded
=
false
;
if
(
parserValidateNameToken
(
pzTableName
)
!=
TSDB_CODE_SUCCESS
)
{
return
buildInvalidOperationMsg
(
pMsgBuf
,
msg1
);
}
if
(
validateTableColumnInfo
(
pFieldList
,
pMsgBuf
)
!=
TSDB_CODE_SUCCESS
||
(
pTagList
!=
NULL
&&
validateTagParams
(
pTagList
,
pFieldList
,
pMsgBuf
)
!=
TSDB_CODE_SUCCESS
))
{
return
TSDB_CODE_TSC_INVALID_OPERATION
;
}
return
TSDB_CODE_SUCCESS
;
}
int32_t
qParserValidateDclSqlNode
(
SSqlInfo
*
pInfo
,
SParseBasicCtx
*
pCtx
,
void
**
output
,
int32_t
*
outputLen
,
int32_t
*
type
,
char
*
msgBuf
,
int32_t
msgBufLen
)
{
int32_t
code
=
0
;
SMsgBuf
m
=
{.
buf
=
msgBuf
,
.
len
=
msgBufLen
};
...
...
@@ -4224,7 +4361,7 @@ int32_t qParserValidateDclSqlNode(SSqlInfo* pInfo, int64_t id, void** output, in
}
}
*
output
=
buildUserManipulationMsg
(
pInfo
,
outputLen
,
i
d
,
msgBuf
,
msgBufLen
);
*
output
=
buildUserManipulationMsg
(
pInfo
,
outputLen
,
pCtx
->
requestI
d
,
msgBuf
,
msgBufLen
);
break
;
}
...
...
@@ -4260,13 +4397,13 @@ int32_t qParserValidateDclSqlNode(SSqlInfo* pInfo, int64_t id, void** output, in
}
}
*
output
=
buildAcctManipulationMsg
(
pInfo
,
outputLen
,
i
d
,
msgBuf
,
msgBufLen
);
*
output
=
buildAcctManipulationMsg
(
pInfo
,
outputLen
,
pCtx
->
requestI
d
,
msgBuf
,
msgBufLen
);
break
;
}
case
TSDB_SQL_DROP_ACCT
:
case
TSDB_SQL_DROP_USER
:
{
*
output
=
buildDropUserMsg
(
pInfo
,
outputLen
,
i
d
,
msgBuf
,
msgBufLen
);
*
output
=
buildDropUserMsg
(
pInfo
,
outputLen
,
pCtx
->
requestI
d
,
msgBuf
,
msgBufLen
);
break
;
}
...
...
@@ -4275,6 +4412,28 @@ int32_t qParserValidateDclSqlNode(SSqlInfo* pInfo, int64_t id, void** output, in
break
;
}
case
TSDB_SQL_USE_DB
:
{
const
char
*
msg
=
"invalid db name"
;
SToken
*
pToken
=
taosArrayGet
(
pInfo
->
pMiscInfo
->
a
,
0
);
if
(
parserValidateNameToken
(
pToken
)
!=
TSDB_CODE_SUCCESS
)
{
return
buildInvalidOperationMsg
(
pMsgBuf
,
msg
);
}
SName
n
=
{
0
};
int32_t
ret
=
tNameSetDbName
(
&
n
,
pCtx
->
acctId
,
pToken
->
z
,
pToken
->
n
);
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
return
buildInvalidOperationMsg
(
pMsgBuf
,
msg
);
}
SUseDbMsg
*
pUseDbMsg
=
(
SUseDbMsg
*
)
calloc
(
1
,
sizeof
(
SUseDbMsg
));
tNameExtractFullName
(
&
n
,
pUseDbMsg
->
db
);
*
output
=
pUseDbMsg
;
*
outputLen
=
sizeof
(
SUseDbMsg
);
break
;
}
case
TSDB_SQL_ALTER_DB
:
case
TSDB_SQL_CREATE_DB
:
{
const
char
*
msg1
=
"invalid db name"
;
...
...
@@ -4304,6 +4463,26 @@ int32_t qParserValidateDclSqlNode(SSqlInfo* pInfo, int64_t id, void** output, in
break
;
}
case
TSDB_SQL_CREATE_TABLE
:
{
SCreateTableSql
*
pCreateTable
=
pInfo
->
pCreateTableInfo
;
if
(
pCreateTable
->
type
==
TSQL_CREATE_TABLE
||
pCreateTable
->
type
==
TSQL_CREATE_STABLE
)
{
if
((
code
=
doCheckForCreateTable
(
pInfo
,
pMsgBuf
))
!=
TSDB_CODE_SUCCESS
)
{
return
code
;
}
*
output
=
buildCreateTableMsg
(
pCreateTable
,
outputLen
,
pCtx
,
pMsgBuf
);
}
else
if
(
pCreateTable
->
type
==
TSQL_CREATE_CTABLE
)
{
// if ((code = doCheckForCreateFromStable(pSql, pInfo)) != TSDB_CODE_SUCCESS) {
// return code;
// }
}
else
if
(
pCreateTable
->
type
==
TSQL_CREATE_STREAM
)
{
// if ((code = doCheckForStream(pSql, pInfo)) != TSDB_CODE_SUCCESS) {
// return code;
}
break
;
}
default:
break
;
}
...
...
source/libs/parser/src/insertParser.c
浏览文件 @
1b9d8daa
...
...
@@ -158,14 +158,14 @@ static int32_t buildName(SInsertParseContext* pCxt, SToken* pStname, char* fullD
char
*
p
=
strnchr
(
pStname
->
z
,
TS_PATH_DELIMITER
[
0
],
pStname
->
n
,
false
);
if
(
NULL
!=
p
)
{
// db.table
strcpy
(
fullDbName
,
pCxt
->
pComCxt
->
pAcctId
);
fullDbName
[
strlen
(
pCxt
->
pComCxt
->
pAcctId
)]
=
TS_PATH_DELIMITER
[
0
];
strncpy
(
fullDbName
,
pStname
->
z
,
p
-
pStname
->
z
);
int32_t
n
=
sprintf
(
fullDbName
,
"%d."
,
pCxt
->
pComCxt
->
ctx
.
acctId
);
strncpy
(
fullDbName
+
n
,
pStname
->
z
,
p
-
pStname
->
z
);
strncpy
(
tableName
,
p
+
1
,
pStname
->
n
-
(
p
-
pStname
->
z
)
-
1
);
}
else
{
snprintf
(
fullDbName
,
TSDB_FULL_DB_NAME_LEN
,
"%
s.%s"
,
pCxt
->
pComCxt
->
pAcctId
,
pCxt
->
pComCxt
->
pDbname
);
snprintf
(
fullDbName
,
TSDB_FULL_DB_NAME_LEN
,
"%
d.%s"
,
pCxt
->
pComCxt
->
ctx
.
acctId
,
pCxt
->
pComCxt
->
ctx
.
db
);
strncpy
(
tableName
,
pStname
->
z
,
pStname
->
n
);
}
return
TSDB_CODE_SUCCESS
;
}
...
...
source/libs/parser/src/parser.c
浏览文件 @
1b9d8daa
...
...
@@ -31,7 +31,7 @@ bool qIsInsertSql(const char* pStr, size_t length) {
}
while
(
1
);
}
int32_t
qParseQuerySql
(
const
char
*
pStr
,
size_t
length
,
int64_t
id
,
int32_t
*
type
,
void
**
pOutput
,
int32_t
*
outputLen
,
char
*
msg
,
int32_t
msgLen
)
{
int32_t
qParseQuerySql
(
const
char
*
pStr
,
size_t
length
,
SParseBasicCtx
*
pParseCtx
,
int32_t
*
type
,
void
**
pOutput
,
int32_t
*
outputLen
,
char
*
msg
,
int32_t
msgLen
)
{
SSqlInfo
info
=
doGenerateAST
(
pStr
);
if
(
!
info
.
valid
)
{
strncpy
(
msg
,
info
.
msg
,
msgLen
);
...
...
@@ -39,8 +39,8 @@ int32_t qParseQuerySql(const char* pStr, size_t length, int64_t id, int32_t *typ
return
terrno
;
}
if
(
isDc
lSqlStatement
(
&
info
))
{
int32_t
code
=
qParserValidateDclSqlNode
(
&
info
,
id
,
pOutput
,
outputLen
,
type
,
msg
,
msgLen
);
if
(
!
isDq
lSqlStatement
(
&
info
))
{
int32_t
code
=
qParserValidateDclSqlNode
(
&
info
,
pParseCtx
,
pOutput
,
outputLen
,
type
,
msg
,
msgLen
);
if
(
code
==
TSDB_CODE_SUCCESS
)
{
// do nothing
}
...
...
@@ -53,7 +53,7 @@ int32_t qParseQuerySql(const char* pStr, size_t length, int64_t id, int32_t *typ
struct
SCatalog
*
pCatalog
=
NULL
;
int32_t
code
=
catalogGetHandle
(
NULL
,
&
pCatalog
);
code
=
qParserValidateSqlNode
(
pCatalog
,
&
info
,
pQueryInfo
,
i
d
,
msg
,
msgLen
);
code
=
qParserValidateSqlNode
(
pCatalog
,
&
info
,
pQueryInfo
,
pParseCtx
->
requestI
d
,
msg
,
msgLen
);
if
(
code
==
TSDB_CODE_SUCCESS
)
{
*
pOutput
=
pQueryInfo
;
}
...
...
source/libs/parser/src/parserUtil.c
浏览文件 @
1b9d8daa
...
...
@@ -1613,7 +1613,18 @@ uint32_t convertRelationalOperator(SToken *pToken) {
}
bool
isDclSqlStatement
(
SSqlInfo
*
pSqlInfo
)
{
return
(
pSqlInfo
->
type
!=
TSDB_SQL_SELECT
);
int32_t
type
=
pSqlInfo
->
type
;
return
(
type
==
TSDB_SQL_CREATE_USER
||
type
==
TSDB_SQL_CREATE_ACCT
||
type
==
TSDB_SQL_DROP_USER
||
type
==
TSDB_SQL_DROP_ACCT
||
type
==
TSDB_SQL_SHOW
);
}
bool
isDdlSqlStatement
(
SSqlInfo
*
pSqlInfo
)
{
int32_t
type
=
pSqlInfo
->
type
;
return
(
type
==
TSDB_SQL_CREATE_TABLE
||
type
==
TSDB_SQL_CREATE_DB
||
type
==
TSDB_SQL_DROP_DB
);
}
bool
isDqlSqlStatement
(
SSqlInfo
*
pSqlInfo
)
{
return
pSqlInfo
->
type
==
TSDB_SQL_SELECT
;
}
#if 0
...
...
source/libs/parser/src/sql.c
浏览文件 @
1b9d8daa
...
...
@@ -31,6 +31,7 @@
#include <assert.h>
#include <stdbool.h>
#include "astGenerator.h"
#include "parserInt.h"
#include "tmsgtype.h"
#include "ttoken.h"
#include "ttokendef.h"
...
...
source/libs/parser/test/insertParserTest.cpp
浏览文件 @
1b9d8daa
...
...
@@ -43,8 +43,8 @@ protected:
void
bind
(
const
char
*
sql
)
{
reset
();
cxt_
.
pAcctId
=
acctId_
.
c_str
(
);
cxt_
.
pDbname
=
db_
.
c_str
();
cxt_
.
ctx
.
acctId
=
atoi
(
acctId_
.
c_str
()
);
cxt_
.
ctx
.
db
=
(
char
*
)
db_
.
c_str
();
strcpy
(
sqlBuf_
,
sql
);
cxt_
.
sqlLen
=
strlen
(
sql
);
sqlBuf_
[
cxt_
.
sqlLen
]
=
'\0'
;
...
...
source/libs/parser/test/parserTests.cpp
浏览文件 @
1b9d8daa
...
...
@@ -717,7 +717,9 @@ TEST(testCase, show_user_Test) {
void
*
output
=
NULL
;
int32_t
type
=
0
;
int32_t
len
=
0
;
int32_t
code
=
qParserValidateDclSqlNode
(
&
info1
,
1
,
&
output
,
&
len
,
&
type
,
msg
,
buf
.
len
);
SParseBasicCtx
ct
=
{.
db
=
"abc"
,
.
acctId
=
1
,
.
requestId
=
1
};
int32_t
code
=
qParserValidateDclSqlNode
(
&
info1
,
&
ct
,
&
output
,
&
len
,
&
type
,
msg
,
buf
.
len
);
ASSERT_EQ
(
code
,
0
);
// convert the show command to be the select query
...
...
@@ -734,13 +736,14 @@ TEST(testCase, create_user_Test) {
SSqlInfo
info1
=
doGenerateAST
(
sql
);
ASSERT_EQ
(
info1
.
valid
,
true
);
ASSERT_EQ
(
isDclSqlStatement
(
&
info1
),
true
);
void
*
output
=
NULL
;
int32_t
type
=
0
;
int32_t
len
=
0
;
int32_t
code
=
qParserValidateDclSqlNode
(
&
info1
,
1
,
&
output
,
&
len
,
&
type
,
msg
,
buf
.
len
);
SParseBasicCtx
ct
=
{.
db
=
"abc"
,
.
acctId
=
1
,
.
requestId
=
1
};
int32_t
code
=
qParserValidateDclSqlNode
(
&
info1
,
&
ct
,
&
output
,
&
len
,
&
type
,
msg
,
buf
.
len
);
ASSERT_EQ
(
code
,
0
);
destroySqlInfo
(
&
info1
);
...
...
source/libs/qcom/CMakeLists.txt
浏览文件 @
1b9d8daa
...
...
@@ -10,3 +10,5 @@ target_link_libraries(
qcom
PRIVATE os util transport
)
ADD_SUBDIRECTORY
(
test
)
source/libs/qcom/src/queryUtil.c
浏览文件 @
1b9d8daa
#include "os.h"
#include "taosmsg.h"
#include "query.h"
#include "tglobal.h"
#include "tsched.h"
#define VALIDNUMOFCOLS(x) ((x) >= TSDB_MIN_COLUMNS && (x) <= TSDB_MAX_COLUMNS)
#define VALIDNUMOFTAGS(x) ((x) >= 0 && (x) <= TSDB_MAX_TAGS)
...
...
@@ -75,4 +78,46 @@ bool tIsValidSchema(struct SSchema* pSchema, int32_t numOfCols, int32_t numOfTag
}
return
true
;
}
\ No newline at end of file
}
static
void
*
pTaskQueue
=
NULL
;
int32_t
initTaskQueue
()
{
double
factor
=
4
.
0
;
int32_t
numOfThreads
=
MAX
((
int
)(
tsNumOfCores
*
tsNumOfThreadsPerCore
/
factor
),
2
);
int32_t
queueSize
=
tsMaxConnections
*
2
;
pTaskQueue
=
taosInitScheduler
(
queueSize
,
numOfThreads
,
"tsc"
);
if
(
NULL
==
pTaskQueue
)
{
qError
(
"failed to init task queue"
);
return
-
1
;
}
qDebug
(
"task queue is initialized, numOfThreads: %d"
,
numOfThreads
);
}
int32_t
cleanupTaskQueue
()
{
taosCleanUpScheduler
(
pTaskQueue
);
}
static
void
execHelper
(
struct
SSchedMsg
*
pSchedMsg
)
{
assert
(
pSchedMsg
!=
NULL
&&
pSchedMsg
->
ahandle
!=
NULL
);
__async_exec_fn_t
*
execFn
=
(
__async_exec_fn_t
*
)
pSchedMsg
->
ahandle
;
int32_t
code
=
execFn
(
pSchedMsg
->
thandle
);
if
(
code
!=
0
&&
pSchedMsg
->
msg
!=
NULL
)
{
*
(
int32_t
*
)
pSchedMsg
->
msg
=
code
;
}
}
int32_t
taosAsyncExec
(
__async_exec_fn_t
execFn
,
void
*
execParam
,
int32_t
*
code
)
{
assert
(
execFn
!=
NULL
);
SSchedMsg
schedMsg
=
{
0
};
schedMsg
.
fp
=
execHelper
;
schedMsg
.
ahandle
=
execFn
;
schedMsg
.
thandle
=
execParam
;
schedMsg
.
msg
=
code
;
taosScheduleTask
(
pTaskQueue
,
&
schedMsg
);
}
source/libs/qcom/test/CMakeLists.txt
0 → 100644
浏览文件 @
1b9d8daa
MESSAGE
(
STATUS
"build qcom unit test"
)
# GoogleTest requires at least C++11
SET
(
CMAKE_CXX_STANDARD 11
)
AUX_SOURCE_DIRECTORY
(
${
CMAKE_CURRENT_SOURCE_DIR
}
SOURCE_LIST
)
ADD_EXECUTABLE
(
queryUtilTest
${
SOURCE_LIST
}
)
TARGET_INCLUDE_DIRECTORIES
(
queryUtilTest
PUBLIC
"
${
CMAKE_SOURCE_DIR
}
/include/libs/qcom/"
PRIVATE
"
${
CMAKE_SOURCE_DIR
}
/source/libs/qcom/inc"
)
TARGET_LINK_LIBRARIES
(
queryUtilTest
PUBLIC os util gtest qcom common
)
source/libs/qcom/test/queryTest.cpp
0 → 100644
浏览文件 @
1b9d8daa
/*
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
*
* This program is free software: you can use, redistribute, and/or modify
* it under the terms of the GNU Affero General Public License, version 3
* or later ("AGPL"), as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <gtest/gtest.h>
#include <iostream>
#include "taosmsg.h"
#include "query.h"
#pragma GCC diagnostic ignored "-Wwrite-strings"
#pragma GCC diagnostic ignored "-Wunused-function"
#pragma GCC diagnostic ignored "-Wunused-variable"
#pragma GCC diagnostic ignored "-Wsign-compare"
namespace
{
typedef
struct
SParam
{
int32_t
v
;
}
SParam
;
int32_t
testPrint
(
void
*
p
)
{
SParam
*
param
=
(
SParam
*
)
p
;
printf
(
"hello world, %d
\n
"
,
param
->
v
);
tfree
(
p
);
return
0
;
}
int32_t
testPrintError
(
void
*
p
)
{
SParam
*
param
=
(
SParam
*
)
p
;
tfree
(
p
);
return
-
1
;
}
}
// namespace
class
QueryTestEnv
:
public
testing
::
Environment
{
public:
virtual
void
SetUp
()
{
initTaskQueue
();
}
virtual
void
TearDown
()
{
cleanupTaskQueue
();
}
QueryTestEnv
()
{}
virtual
~
QueryTestEnv
()
{}
};
int
main
(
int
argc
,
char
**
argv
)
{
testing
::
AddGlobalTestEnvironment
(
new
QueryTestEnv
());
testing
::
InitGoogleTest
(
&
argc
,
argv
);
return
RUN_ALL_TESTS
();
}
TEST
(
testCase
,
async_task_test
)
{
SParam
*
p
=
(
SParam
*
)
calloc
(
1
,
sizeof
(
SParam
));
taosAsyncExec
(
testPrint
,
p
,
NULL
);
usleep
(
5000
);
}
TEST
(
testCase
,
many_async_task_test
)
{
for
(
int32_t
i
=
0
;
i
<
50
;
++
i
)
{
SParam
*
p
=
(
SParam
*
)
calloc
(
1
,
sizeof
(
SParam
));
p
->
v
=
i
;
taosAsyncExec
(
testPrint
,
p
,
NULL
);
}
usleep
(
10000
);
}
TEST
(
testCase
,
error_in_async_test
)
{
int32_t
code
=
0
;
SParam
*
p
=
(
SParam
*
)
calloc
(
1
,
sizeof
(
SParam
));
taosAsyncExec
(
testPrintError
,
p
,
&
code
);
usleep
(
1000
);
printf
(
"Error code:%d after asynchronously exec function
\n
"
,
code
);
}
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录