Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
fe12d1d6
TDengine
项目概览
taosdata
/
TDengine
1 年多 前同步成功
通知
1185
Star
22016
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
fe12d1d6
编写于
12月 23, 2021
作者:
S
Shengliang Guan
提交者:
GitHub
12月 23, 2021
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #9329 from taosdata/feature/3.0_wxy
TD-12450 perfect parser interface
上级
784975da
6307883f
变更
12
隐藏空白更改
内联
并排
Showing
12 changed file
with
179 addition
and
138 deletion
+179
-138
include/libs/parser/parsenodes.h
include/libs/parser/parsenodes.h
+7
-0
include/libs/parser/parser.h
include/libs/parser/parser.h
+2
-19
source/client/src/clientImpl.c
source/client/src/clientImpl.c
+53
-59
source/libs/parser/inc/parserInt.h
source/libs/parser/inc/parserInt.h
+1
-1
source/libs/parser/src/astValidate.c
source/libs/parser/src/astValidate.c
+25
-24
source/libs/parser/src/insertParser.c
source/libs/parser/src/insertParser.c
+1
-0
source/libs/parser/src/parser.c
source/libs/parser/src/parser.c
+24
-10
source/libs/parser/test/mockCatalog.cpp
source/libs/parser/test/mockCatalog.cpp
+4
-4
source/libs/parser/test/mockCatalogService.cpp
source/libs/parser/test/mockCatalogService.cpp
+11
-3
source/libs/parser/test/parserTests.cpp
source/libs/parser/test/parserTests.cpp
+4
-10
source/libs/planner/src/physicalPlanJson.c
source/libs/planner/src/physicalPlanJson.c
+1
-1
source/libs/planner/test/phyPlanTests.cpp
source/libs/planner/test/phyPlanTests.cpp
+46
-7
未找到文件。
include/libs/parser/parsenodes.h
浏览文件 @
fe12d1d6
...
...
@@ -160,6 +160,13 @@ typedef struct SInsertStmtInfo {
const
char
*
sql
;
// current sql statement position
}
SInsertStmtInfo
;
typedef
struct
SDclStmtInfo
{
int16_t
nodeType
;
int16_t
msgType
;
char
*
pMsg
;
int32_t
msgLen
;
}
SDclStmtInfo
;
#ifdef __cplusplus
}
#endif
...
...
include/libs/parser/parser.h
浏览文件 @
fe12d1d6
...
...
@@ -22,20 +22,11 @@ extern "C" {
#include "parsenodes.h"
/**
* True will be returned if the input sql string is insert, false otherwise.
* @param pStr sql string
* @param length length of the sql string
* @return
*/
bool
qIsInsertSql
(
const
char
*
pStr
,
size_t
length
);
typedef
struct
SParseContext
{
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
...
...
@@ -51,17 +42,9 @@ typedef struct SParseContext {
* @param msg extended error message if exists.
* @return error code
*/
int32_t
qParseQuerySql
(
const
char
*
pStr
,
size_t
length
,
SParseBasicCtx
*
pParseCtx
,
int32_t
*
type
,
void
**
pOutput
,
int32_t
*
outputLen
,
char
*
msg
,
int32_t
msgLen
);
int32_t
qParseQuerySql
(
SParseContext
*
pContext
,
SQueryNode
**
pQuery
);
/**
* Parse the insert sql statement.
* @param pStr sql string
* @param length length of the sql string
* @param id operator id, generated by uuid generator.
* @param msg extended error message if exists to help avoid the problem in sql statement.
* @return data in binary format to submit to vnode directly.
*/
int32_t
qParseInsertSql
(
SParseContext
*
pContext
,
struct
SInsertStmtInfo
**
pInfo
);
bool
qIsDclQuery
(
const
SQueryNode
*
pQuery
);
/**
* Convert a normal sql statement to only query tags information to enable that the subscribe client can be aware quickly of the true vgroup ids that
...
...
source/client/src/clientImpl.c
浏览文件 @
fe12d1d6
...
...
@@ -144,72 +144,66 @@ TAOS_RES *taos_query_l(TAOS *taos, const char *sql, int sqlLen) {
tscDebugL
(
"0x%"
PRIx64
" SQL: %s"
,
pRequest
->
requestId
,
pRequest
->
sqlstr
);
int32_t
code
=
0
;
if
(
qIsInsertSql
(
pRequest
->
sqlstr
,
sqlLen
))
{
// todo add
}
else
{
int32_t
type
=
0
;
void
*
output
=
NULL
;
int32_t
outputLen
=
0
;
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_MSG_TYPE_CREATE_USER
||
type
==
TSDB_MSG_TYPE_SHOW
||
type
==
TSDB_MSG_TYPE_DROP_USER
||
type
==
TSDB_MSG_TYPE_DROP_ACCT
||
type
==
TSDB_MSG_TYPE_CREATE_DB
||
type
==
TSDB_MSG_TYPE_CREATE_ACCT
||
type
==
TSDB_MSG_TYPE_CREATE_TABLE
||
type
==
TSDB_MSG_TYPE_CREATE_STB
||
type
==
TSDB_MSG_TYPE_USE_DB
||
type
==
TSDB_MSG_TYPE_DROP_DB
||
type
==
TSDB_MSG_TYPE_DROP_STB
)
{
pRequest
->
type
=
type
;
pRequest
->
body
.
requestMsg
=
(
SReqMsgInfo
){.
pMsg
=
output
,
.
len
=
outputLen
};
SRequestMsgBody
body
=
buildRequestMsgImpl
(
pRequest
);
SEpSet
*
pEpSet
=
&
pTscObj
->
pAppInfo
->
mgmtEp
.
epSet
;
if
(
type
==
TSDB_MSG_TYPE_CREATE_TABLE
)
{
struct
SCatalog
*
pCatalog
=
NULL
;
char
buf
[
12
]
=
{
0
};
sprintf
(
buf
,
"%d"
,
pTscObj
->
pAppInfo
->
clusterId
);
code
=
catalogGetHandle
(
buf
,
&
pCatalog
);
if
(
code
!=
0
)
{
pRequest
->
code
=
code
;
return
pRequest
;
}
SCreateTableMsg
*
pMsg
=
body
.
msgInfo
.
pMsg
;
SName
t
=
{
0
};
tNameFromString
(
&
t
,
pMsg
->
name
,
T_NAME_ACCT
|
T_NAME_DB
|
T_NAME_TABLE
);
char
db
[
TSDB_DB_NAME_LEN
+
TS_PATH_DELIMITER_LEN
+
TSDB_ACCT_ID_LEN
]
=
{
0
};
tNameGetFullDbName
(
&
t
,
db
);
SVgroupInfo
info
=
{
0
};
catalogGetTableHashVgroup
(
pCatalog
,
pTscObj
->
pTransporter
,
pEpSet
,
db
,
tNameGetTableName
(
&
t
),
&
info
);
int64_t
transporterId
=
0
;
SEpSet
ep
=
{
0
};
ep
.
inUse
=
info
.
inUse
;
ep
.
numOfEps
=
info
.
numOfEps
;
for
(
int32_t
i
=
0
;
i
<
ep
.
numOfEps
;
++
i
)
{
ep
.
port
[
i
]
=
info
.
epAddr
[
i
].
port
;
tstrncpy
(
ep
.
fqdn
[
i
],
info
.
epAddr
[
i
].
fqdn
,
tListLen
(
ep
.
fqdn
[
i
]));
}
sendMsgToServer
(
pTscObj
->
pTransporter
,
&
ep
,
&
body
,
&
transporterId
);
}
else
{
int64_t
transporterId
=
0
;
sendMsgToServer
(
pTscObj
->
pTransporter
,
pEpSet
,
&
body
,
&
transporterId
);
SParseContext
cxt
=
{
.
ctx
=
{.
requestId
=
pRequest
->
requestId
,
.
acctId
=
pTscObj
->
acctId
,
.
db
=
getConnectionDB
(
pTscObj
)},
.
pSql
=
pRequest
->
sqlstr
,
.
sqlLen
=
sqlLen
,
.
pMsg
=
pRequest
->
msgBuf
,
.
msgLen
=
ERROR_MSG_BUF_DEFAULT_SIZE
};
SQueryNode
*
pQuery
=
NULL
;
int32_t
code
=
qParseQuerySql
(
&
cxt
,
&
pQuery
);
if
(
qIsDclQuery
(
pQuery
))
{
SDclStmtInfo
*
pDcl
=
(
SDclStmtInfo
*
)
pQuery
;
pRequest
->
type
=
pDcl
->
msgType
;
pRequest
->
body
.
requestMsg
=
(
SReqMsgInfo
){.
pMsg
=
pDcl
->
pMsg
,
.
len
=
pDcl
->
msgLen
};
SRequestMsgBody
body
=
buildRequestMsgImpl
(
pRequest
);
SEpSet
*
pEpSet
=
&
pTscObj
->
pAppInfo
->
mgmtEp
.
epSet
;
if
(
pDcl
->
msgType
==
TSDB_MSG_TYPE_CREATE_TABLE
)
{
struct
SCatalog
*
pCatalog
=
NULL
;
char
buf
[
12
]
=
{
0
};
sprintf
(
buf
,
"%d"
,
pTscObj
->
pAppInfo
->
clusterId
);
code
=
catalogGetHandle
(
buf
,
&
pCatalog
);
if
(
code
!=
0
)
{
pRequest
->
code
=
code
;
return
pRequest
;
}
SCreateTableMsg
*
pMsg
=
body
.
msgInfo
.
pMsg
;
SName
t
=
{
0
};
tNameFromString
(
&
t
,
pMsg
->
name
,
T_NAME_ACCT
|
T_NAME_DB
|
T_NAME_TABLE
);
char
db
[
TSDB_DB_NAME_LEN
+
TS_PATH_DELIMITER_LEN
+
TSDB_ACCT_ID_LEN
]
=
{
0
};
tNameGetFullDbName
(
&
t
,
db
);
SVgroupInfo
info
=
{
0
};
catalogGetTableHashVgroup
(
pCatalog
,
pTscObj
->
pTransporter
,
pEpSet
,
db
,
tNameGetTableName
(
&
t
),
&
info
);
int64_t
transporterId
=
0
;
SEpSet
ep
=
{
0
};
ep
.
inUse
=
info
.
inUse
;
ep
.
numOfEps
=
info
.
numOfEps
;
for
(
int32_t
i
=
0
;
i
<
ep
.
numOfEps
;
++
i
)
{
ep
.
port
[
i
]
=
info
.
epAddr
[
i
].
port
;
tstrncpy
(
ep
.
fqdn
[
i
],
info
.
epAddr
[
i
].
fqdn
,
tListLen
(
ep
.
fqdn
[
i
]));
}
tsem_wait
(
&
pRequest
->
body
.
rspSem
);
destroyRequestMsgBody
(
&
body
);
sendMsgToServer
(
pTscObj
->
pTransporter
,
&
ep
,
&
body
,
&
transporterId
);
}
else
{
assert
(
0
);
int64_t
transporterId
=
0
;
sendMsgToServer
(
pTscObj
->
pTransporter
,
pEpSet
,
&
body
,
&
transporterId
);
}
tfree
(
c
.
db
);
tsem_wait
(
&
pRequest
->
body
.
rspSem
);
destroyRequestMsgBody
(
&
body
);
}
tfree
(
cxt
.
ctx
.
db
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
pRequest
->
code
=
code
;
return
pRequest
;
...
...
source/libs/parser/inc/parserInt.h
浏览文件 @
fe12d1d6
...
...
@@ -68,7 +68,7 @@ int32_t qParserValidateSqlNode(struct SCatalog* pCatalog, SSqlInfo* pSqlInfo, SQ
* @param type
* @return
*/
int32_t
qParserValidateDclSqlNode
(
SSqlInfo
*
pInfo
,
SParseBasicCtx
*
pCtx
,
void
**
output
,
int32_t
*
outputLen
,
int32_t
*
type
,
char
*
msgBuf
,
int32_t
msgBufLen
);
int32_t
qParserValidateDclSqlNode
(
SSqlInfo
*
pInfo
,
SParseBasicCtx
*
pCtx
,
SDclStmtInfo
*
pDcl
,
char
*
msgBuf
,
int32_t
msgBufLen
);
/**
* Evaluate the numeric and timestamp arithmetic expression in the WHERE clause.
...
...
source/libs/parser/src/astValidate.c
浏览文件 @
fe12d1d6
...
...
@@ -4306,7 +4306,7 @@ int32_t doCheckForCreateTable(SSqlInfo* pInfo, SMsgBuf* pMsgBuf) {
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
qParserValidateDclSqlNode
(
SSqlInfo
*
pInfo
,
SParseBasicCtx
*
pCtx
,
SDclStmtInfo
*
pDcl
,
char
*
msgBuf
,
int32_t
msgBufLen
)
{
int32_t
code
=
0
;
SMsgBuf
m
=
{.
buf
=
msgBuf
,
.
len
=
msgBufLen
};
...
...
@@ -4357,8 +4357,8 @@ int32_t qParserValidateDclSqlNode(SSqlInfo* pInfo, SParseBasicCtx* pCtx, void**
}
}
*
output
=
buildUserManipulationMsg
(
pInfo
,
output
Len
,
pCtx
->
requestId
,
msgBuf
,
msgBufLen
);
*
t
ype
=
(
pInfo
->
type
==
TSDB_SQL_CREATE_USER
)
?
TSDB_MSG_TYPE_CREATE_USER
:
TSDB_MSG_TYPE_ALTER_USER
;
pDcl
->
pMsg
=
(
char
*
)
buildUserManipulationMsg
(
pInfo
,
&
pDcl
->
msg
Len
,
pCtx
->
requestId
,
msgBuf
,
msgBufLen
);
pDcl
->
msgT
ype
=
(
pInfo
->
type
==
TSDB_SQL_CREATE_USER
)
?
TSDB_MSG_TYPE_CREATE_USER
:
TSDB_MSG_TYPE_ALTER_USER
;
break
;
}
...
...
@@ -4394,21 +4394,21 @@ int32_t qParserValidateDclSqlNode(SSqlInfo* pInfo, SParseBasicCtx* pCtx, void**
}
}
*
output
=
buildAcctManipulationMsg
(
pInfo
,
output
Len
,
pCtx
->
requestId
,
msgBuf
,
msgBufLen
);
*
t
ype
=
(
pInfo
->
type
==
TSDB_SQL_CREATE_ACCT
)
?
TSDB_MSG_TYPE_CREATE_ACCT
:
TSDB_MSG_TYPE_ALTER_ACCT
;
pDcl
->
pMsg
=
(
char
*
)
buildAcctManipulationMsg
(
pInfo
,
&
pDcl
->
msg
Len
,
pCtx
->
requestId
,
msgBuf
,
msgBufLen
);
pDcl
->
msgT
ype
=
(
pInfo
->
type
==
TSDB_SQL_CREATE_ACCT
)
?
TSDB_MSG_TYPE_CREATE_ACCT
:
TSDB_MSG_TYPE_ALTER_ACCT
;
break
;
}
case
TSDB_SQL_DROP_ACCT
:
case
TSDB_SQL_DROP_USER
:
{
*
output
=
buildDropUserMsg
(
pInfo
,
output
Len
,
pCtx
->
requestId
,
msgBuf
,
msgBufLen
);
*
t
ype
=
(
pInfo
->
type
==
TSDB_SQL_DROP_ACCT
)
?
TSDB_MSG_TYPE_DROP_ACCT
:
TSDB_MSG_TYPE_DROP_USER
;
pDcl
->
pMsg
=
(
char
*
)
buildDropUserMsg
(
pInfo
,
&
pDcl
->
msg
Len
,
pCtx
->
requestId
,
msgBuf
,
msgBufLen
);
pDcl
->
msgT
ype
=
(
pInfo
->
type
==
TSDB_SQL_DROP_ACCT
)
?
TSDB_MSG_TYPE_DROP_ACCT
:
TSDB_MSG_TYPE_DROP_USER
;
break
;
}
case
TSDB_SQL_SHOW
:
{
code
=
setShowInfo
(
&
pInfo
->
pMiscInfo
->
showOpt
,
pCtx
,
output
,
output
Len
,
pMsgBuf
);
*
t
ype
=
TSDB_MSG_TYPE_SHOW
;
code
=
setShowInfo
(
&
pInfo
->
pMiscInfo
->
showOpt
,
pCtx
,
(
void
**
)
&
pDcl
->
pMsg
,
&
pDcl
->
msg
Len
,
pMsgBuf
);
pDcl
->
msgT
ype
=
TSDB_MSG_TYPE_SHOW
;
break
;
}
...
...
@@ -4429,9 +4429,9 @@ int32_t qParserValidateDclSqlNode(SSqlInfo* pInfo, SParseBasicCtx* pCtx, void**
SUseDbMsg
*
pUseDbMsg
=
(
SUseDbMsg
*
)
calloc
(
1
,
sizeof
(
SUseDbMsg
));
tNameExtractFullName
(
&
n
,
pUseDbMsg
->
db
);
*
output
=
pUseDbMsg
;
*
output
Len
=
sizeof
(
SUseDbMsg
);
*
type
=
TSDB_MSG_TYPE_USE_DB
;
pDcl
->
pMsg
=
(
char
*
)
pUseDbMsg
;
pDcl
->
msg
Len
=
sizeof
(
SUseDbMsg
);
pDcl
->
msgType
=
TSDB_MSG_TYPE_USE_DB
;
break
;
}
...
...
@@ -4457,9 +4457,11 @@ int32_t qParserValidateDclSqlNode(SSqlInfo* pInfo, SParseBasicCtx* pCtx, void**
return
TSDB_CODE_TSC_INVALID_OPERATION
;
}
*
output
=
pCreateMsg
;
*
outputLen
=
sizeof
(
SCreateDbMsg
);
*
type
=
(
pInfo
->
type
==
TSDB_SQL_CREATE_DB
)
?
TSDB_MSG_TYPE_CREATE_DB
:
TSDB_MSG_TYPE_ALTER_DB
;
strncpy
(
pCreateMsg
->
db
,
token
.
z
,
token
.
n
);
pDcl
->
pMsg
=
(
char
*
)
pCreateMsg
;
pDcl
->
msgLen
=
sizeof
(
SCreateDbMsg
);
pDcl
->
msgType
=
(
pInfo
->
type
==
TSDB_SQL_CREATE_DB
)
?
TSDB_MSG_TYPE_CREATE_DB
:
TSDB_MSG_TYPE_ALTER_DB
;
break
;
}
...
...
@@ -4481,9 +4483,9 @@ int32_t qParserValidateDclSqlNode(SSqlInfo* pInfo, SParseBasicCtx* pCtx, void**
pDropDbMsg
->
ignoreNotExists
=
pInfo
->
pMiscInfo
->
existsCheck
?
1
:
0
;
assert
(
code
==
TSDB_CODE_SUCCESS
&&
name
.
type
==
TSDB_DB_NAME_T
);
*
type
=
TSDB_MSG_TYPE_DROP_DB
;
*
output
Len
=
sizeof
(
SDropDbMsg
);
*
output
=
pDropDbMsg
;
pDcl
->
msgType
=
TSDB_MSG_TYPE_DROP_DB
;
pDcl
->
msg
Len
=
sizeof
(
SDropDbMsg
);
pDcl
->
pMsg
=
(
char
*
)
pDropDbMsg
;
return
TSDB_CODE_SUCCESS
;
}
...
...
@@ -4494,9 +4496,8 @@ int32_t qParserValidateDclSqlNode(SSqlInfo* pInfo, SParseBasicCtx* pCtx, void**
if
((
code
=
doCheckForCreateTable
(
pInfo
,
pMsgBuf
))
!=
TSDB_CODE_SUCCESS
)
{
return
code
;
}
*
output
=
buildCreateTableMsg
(
pCreateTable
,
outputLen
,
pCtx
,
pMsgBuf
);
*
type
=
(
pCreateTable
->
type
==
TSQL_CREATE_TABLE
)
?
TSDB_MSG_TYPE_CREATE_TABLE
:
TSDB_MSG_TYPE_CREATE_STB
;
pDcl
->
pMsg
=
(
char
*
)
buildCreateTableMsg
(
pCreateTable
,
&
pDcl
->
msgLen
,
pCtx
,
pMsgBuf
);
pDcl
->
msgType
=
(
pCreateTable
->
type
==
TSQL_CREATE_TABLE
)
?
TSDB_MSG_TYPE_CREATE_TABLE
:
TSDB_MSG_TYPE_CREATE_STB
;
}
else
if
(
pCreateTable
->
type
==
TSQL_CREATE_CTABLE
)
{
// if ((code = doCheckForCreateFromStable(pSql, pInfo)) != TSDB_CODE_SUCCESS) {
// return code;
...
...
@@ -4511,12 +4512,12 @@ int32_t qParserValidateDclSqlNode(SSqlInfo* pInfo, SParseBasicCtx* pCtx, void**
}
case
TSDB_SQL_DROP_TABLE
:
{
*
output
=
buildDropTableMsg
(
pInfo
,
output
Len
,
pCtx
,
pMsgBuf
);
if
(
output
==
NULL
)
{
pDcl
->
pMsg
=
(
char
*
)
buildDropTableMsg
(
pInfo
,
&
pDcl
->
msg
Len
,
pCtx
,
pMsgBuf
);
if
(
pDcl
->
pMsg
==
NULL
)
{
return
terrno
;
}
*
t
ype
=
TSDB_MSG_TYPE_DROP_STB
;
pDcl
->
msgT
ype
=
TSDB_MSG_TYPE_DROP_STB
;
return
TSDB_CODE_SUCCESS
;
break
;
}
...
...
source/libs/parser/src/insertParser.c
浏览文件 @
fe12d1d6
...
...
@@ -909,6 +909,7 @@ int32_t parseInsertSql(SParseContext* pContext, SInsertStmtInfo** pInfo) {
}
*
pInfo
=
context
.
pOutput
;
context
.
pOutput
->
nodeType
=
TSDB_SQL_INSERT
;
context
.
pOutput
->
schemaAttache
=
pContext
->
schemaAttached
;
context
.
pOutput
->
payloadType
=
PAYLOAD_TYPE_KV
;
...
...
source/libs/parser/src/parser.c
浏览文件 @
fe12d1d6
...
...
@@ -20,7 +20,7 @@
#include "function.h"
#include "insertParser.h"
bool
qI
sInsertSql
(
const
char
*
pStr
,
size_t
length
)
{
bool
i
sInsertSql
(
const
char
*
pStr
,
size_t
length
)
{
int32_t
index
=
0
;
do
{
...
...
@@ -31,18 +31,28 @@ bool qIsInsertSql(const char* pStr, size_t length) {
}
while
(
1
);
}
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
);
bool
qIsDclQuery
(
const
SQueryNode
*
pQuery
)
{
return
TSDB_SQL_INSERT
!=
pQuery
->
type
&&
TSDB_SQL_SELECT
!=
pQuery
->
type
;
}
int32_t
parseQuerySql
(
SParseContext
*
pCxt
,
SQueryNode
**
pQuery
)
{
SSqlInfo
info
=
doGenerateAST
(
pCxt
->
pSql
);
if
(
!
info
.
valid
)
{
strncpy
(
msg
,
info
.
msg
,
msgLen
);
strncpy
(
pCxt
->
pMsg
,
info
.
msg
,
pCxt
->
msgLen
);
terrno
=
TSDB_CODE_TSC_SQL_SYNTAX_ERROR
;
return
terrno
;
}
if
(
!
isDqlSqlStatement
(
&
info
))
{
int32_t
code
=
qParserValidateDclSqlNode
(
&
info
,
pParseCtx
,
pOutput
,
outputLen
,
type
,
msg
,
msgLen
);
SDclStmtInfo
*
pDcl
=
calloc
(
1
,
sizeof
(
SQueryStmtInfo
));
if
(
NULL
==
pDcl
)
{
terrno
=
TSDB_CODE_TSC_OUT_OF_MEMORY
;
// set correct error code.
return
terrno
;
}
pDcl
->
nodeType
=
info
.
type
;
int32_t
code
=
qParserValidateDclSqlNode
(
&
info
,
&
pCxt
->
ctx
,
pDcl
,
pCxt
->
pMsg
,
pCxt
->
msgLen
);
if
(
code
==
TSDB_CODE_SUCCESS
)
{
// do nothing
*
pQuery
=
(
SQueryNode
*
)
pDcl
;
}
}
else
{
SQueryStmtInfo
*
pQueryInfo
=
calloc
(
1
,
sizeof
(
SQueryStmtInfo
));
...
...
@@ -53,9 +63,9 @@ int32_t qParseQuerySql(const char* pStr, size_t length, SParseBasicCtx* pParseCt
struct
SCatalog
*
pCatalog
=
NULL
;
int32_t
code
=
catalogGetHandle
(
NULL
,
&
pCatalog
);
code
=
qParserValidateSqlNode
(
pCatalog
,
&
info
,
pQueryInfo
,
p
ParseCtx
->
requestId
,
msg
,
msgLen
);
code
=
qParserValidateSqlNode
(
pCatalog
,
&
info
,
pQueryInfo
,
p
Cxt
->
ctx
.
requestId
,
pCxt
->
pMsg
,
pCxt
->
msgLen
);
if
(
code
==
TSDB_CODE_SUCCESS
)
{
*
p
Output
=
pQueryInfo
;
*
p
Query
=
(
SQueryNode
*
)
pQueryInfo
;
}
}
...
...
@@ -63,8 +73,12 @@ int32_t qParseQuerySql(const char* pStr, size_t length, SParseBasicCtx* pParseCt
return
TSDB_CODE_SUCCESS
;
}
int32_t
qParseInsertSql
(
SParseContext
*
pContext
,
SInsertStmtInfo
**
pInfo
)
{
return
parseInsertSql
(
pContext
,
pInfo
);
int32_t
qParseQuerySql
(
SParseContext
*
pCxt
,
SQueryNode
**
pQuery
)
{
if
(
isInsertSql
(
pCxt
->
pSql
,
pCxt
->
sqlLen
))
{
return
parseInsertSql
(
pCxt
,
(
SInsertStmtInfo
**
)
pQuery
);
}
else
{
return
parseQuerySql
(
pCxt
,
pQuery
);
}
}
int32_t
qParserConvertSql
(
const
char
*
pStr
,
size_t
length
,
char
**
pConvertSql
)
{
...
...
source/libs/parser/test/mockCatalog.cpp
浏览文件 @
fe12d1d6
...
...
@@ -23,20 +23,20 @@
namespace
{
void
generateTestT1
(
MockCatalogService
*
mcs
)
{
ITableBuilder
&
builder
=
mcs
->
createTableBuilder
(
"
root.
test"
,
"t1"
,
TSDB_NORMAL_TABLE
,
3
)
ITableBuilder
&
builder
=
mcs
->
createTableBuilder
(
"test"
,
"t1"
,
TSDB_NORMAL_TABLE
,
3
)
.
setPrecision
(
TSDB_TIME_PRECISION_MILLI
).
setVgid
(
1
).
addColumn
(
"ts"
,
TSDB_DATA_TYPE_TIMESTAMP
)
.
addColumn
(
"c1"
,
TSDB_DATA_TYPE_INT
).
addColumn
(
"c2"
,
TSDB_DATA_TYPE_BINARY
,
20
);
builder
.
done
();
}
void
generateTestST1
(
MockCatalogService
*
mcs
)
{
ITableBuilder
&
builder
=
mcs
->
createTableBuilder
(
"
root.
test"
,
"st1"
,
TSDB_SUPER_TABLE
,
3
,
2
)
ITableBuilder
&
builder
=
mcs
->
createTableBuilder
(
"test"
,
"st1"
,
TSDB_SUPER_TABLE
,
3
,
2
)
.
setPrecision
(
TSDB_TIME_PRECISION_MILLI
).
addColumn
(
"ts"
,
TSDB_DATA_TYPE_TIMESTAMP
)
.
addTag
(
"tag1"
,
TSDB_DATA_TYPE_INT
).
addTag
(
"tag2"
,
TSDB_DATA_TYPE_BINARY
,
20
)
.
addColumn
(
"c1"
,
TSDB_DATA_TYPE_INT
).
addColumn
(
"c2"
,
TSDB_DATA_TYPE_BINARY
,
20
);
builder
.
done
();
mcs
->
createSubTable
(
"
root.
test"
,
"st1"
,
"st1s1"
,
1
);
mcs
->
createSubTable
(
"
root.
test"
,
"st1"
,
"st1s2"
,
2
);
mcs
->
createSubTable
(
"test"
,
"st1"
,
"st1s1"
,
1
);
mcs
->
createSubTable
(
"test"
,
"st1"
,
"st1s2"
,
2
);
}
}
...
...
source/libs/parser/test/mockCatalogService.cpp
浏览文件 @
fe12d1d6
...
...
@@ -94,9 +94,9 @@ public:
return
0
;
}
int32_t
catalogGetTableMeta
(
const
char
*
pD
B
Name
,
const
char
*
pTableName
,
STableMeta
**
pTableMeta
)
const
{
int32_t
catalogGetTableMeta
(
const
char
*
pD
bFull
Name
,
const
char
*
pTableName
,
STableMeta
**
pTableMeta
)
const
{
std
::
unique_ptr
<
STableMeta
>
table
;
int32_t
code
=
copyTableSchemaMeta
(
pDBName
,
pTableName
,
&
table
);
int32_t
code
=
copyTableSchemaMeta
(
toDbname
(
pDbFullName
)
,
pTableName
,
&
table
);
if
(
TSDB_CODE_SUCCESS
!=
code
)
{
return
code
;
}
...
...
@@ -104,7 +104,7 @@ public:
return
TSDB_CODE_SUCCESS
;
}
int32_t
catalogGetTableHashVgroup
(
const
char
*
pD
B
Name
,
const
char
*
pTableName
,
SVgroupInfo
*
vgInfo
)
const
{
int32_t
catalogGetTableHashVgroup
(
const
char
*
pD
bFull
Name
,
const
char
*
pTableName
,
SVgroupInfo
*
vgInfo
)
const
{
// todo
return
0
;
}
...
...
@@ -195,6 +195,14 @@ private:
typedef
std
::
map
<
std
::
string
,
std
::
shared_ptr
<
MockTableMeta
>>
TableMetaCache
;
typedef
std
::
map
<
std
::
string
,
TableMetaCache
>
DbMetaCache
;
std
::
string
toDbname
(
const
std
::
string
&
dbFullName
)
const
{
std
::
string
::
size_type
n
=
dbFullName
.
find
(
"."
);
if
(
n
==
std
::
string
::
npos
)
{
return
dbFullName
;
}
return
dbFullName
.
substr
(
n
+
1
);
}
std
::
string
ttToString
(
int8_t
tableType
)
const
{
switch
(
tableType
)
{
case
TSDB_SUPER_TABLE
:
...
...
source/libs/parser/test/parserTests.cpp
浏览文件 @
fe12d1d6
...
...
@@ -714,12 +714,9 @@ TEST(testCase, show_user_Test) {
SSqlInfo
info1
=
doGenerateAST
(
sql1
);
ASSERT_EQ
(
info1
.
valid
,
true
);
void
*
output
=
NULL
;
int32_t
type
=
0
;
int32_t
len
=
0
;
SDclStmtInfo
output
;
SParseBasicCtx
ct
=
{.
db
=
"abc"
,
.
acctId
=
1
,
.
requestId
=
1
};
int32_t
code
=
qParserValidateDclSqlNode
(
&
info1
,
&
ct
,
&
output
,
&
len
,
&
type
,
msg
,
buf
.
len
);
int32_t
code
=
qParserValidateDclSqlNode
(
&
info1
,
&
ct
,
&
output
,
msg
,
buf
.
len
);
ASSERT_EQ
(
code
,
0
);
// convert the show command to be the select query
...
...
@@ -738,12 +735,9 @@ TEST(testCase, create_user_Test) {
ASSERT_EQ
(
info1
.
valid
,
true
);
ASSERT_EQ
(
isDclSqlStatement
(
&
info1
),
true
);
void
*
output
=
NULL
;
int32_t
type
=
0
;
int32_t
len
=
0
;
SDclStmtInfo
output
;
SParseBasicCtx
ct
=
{.
db
=
"abc"
,
.
acctId
=
1
,
.
requestId
=
1
};
int32_t
code
=
qParserValidateDclSqlNode
(
&
info1
,
&
ct
,
&
output
,
&
len
,
&
type
,
msg
,
buf
.
len
);
int32_t
code
=
qParserValidateDclSqlNode
(
&
info1
,
&
ct
,
&
output
,
msg
,
buf
.
len
);
ASSERT_EQ
(
code
,
0
);
destroySqlInfo
(
&
info1
);
...
...
source/libs/planner/src/physicalPlanJson.c
浏览文件 @
fe12d1d6
...
...
@@ -845,7 +845,7 @@ int32_t subPlanToString(const SSubplan* subplan, char** str, int32_t* len) {
return
TSDB_CODE_FAILED
;
}
*
str
=
cJSON_Print
(
json
);
*
len
=
strlen
(
*
str
);
*
len
=
strlen
(
*
str
)
+
1
;
return
TSDB_CODE_SUCCESS
;
}
...
...
source/libs/planner/test/phyPlanTests.cpp
浏览文件 @
fe12d1d6
...
...
@@ -33,10 +33,6 @@ protected:
void
pushScan
(
const
string
&
db
,
const
string
&
table
,
int32_t
scanOp
)
{
shared_ptr
<
MockTableMeta
>
meta
=
mockCatalogService
->
getTableMeta
(
db
,
table
);
EXPECT_TRUE
(
meta
);
// typedef struct SQueryPlanNode {
// SArray *pExpr; // the query functions or sql aggregations
// int32_t numOfExpr; // number of result columns, which is also the number of pExprs
// } SQueryPlanNode;
unique_ptr
<
SQueryPlanNode
>
scan
((
SQueryPlanNode
*
)
calloc
(
1
,
sizeof
(
SQueryPlanNode
)));
scan
->
info
.
type
=
scanOp
;
scan
->
numOfCols
=
meta
->
schema
->
tableInfo
.
numOfColumns
;
...
...
@@ -54,6 +50,21 @@ protected:
return
code
;
}
int32_t
run
(
const
string
&
db
,
const
string
&
sql
)
{
SParseContext
cxt
;
buildParseContext
(
db
,
sql
,
&
cxt
);
SQueryNode
*
query
;
int32_t
code
=
qParseQuerySql
(
&
cxt
,
&
query
);
if
(
TSDB_CODE_SUCCESS
!=
code
)
{
cout
<<
"error no:"
<<
code
<<
", msg:"
<<
cxt
.
pMsg
<<
endl
;
return
code
;
}
SQueryDag
*
dag
=
nullptr
;
code
=
qCreateQueryDag
(
query
,
nullptr
,
&
dag
);
dag_
.
reset
(
dag
);
return
code
;
}
void
explain
()
{
size_t
level
=
taosArrayGetSize
(
dag_
->
pSubplans
);
for
(
size_t
i
=
0
;
i
<
level
;
++
i
)
{
...
...
@@ -64,7 +75,8 @@ protected:
std
::
cout
<<
"no "
<<
j
<<
":"
<<
std
::
endl
;
int32_t
len
=
0
;
char
*
str
=
nullptr
;
ASSERT_EQ
(
TSDB_CODE_SUCCESS
,
qSubPlanToString
((
const
SSubplan
*
)
taosArrayGetP
(
subplans
,
j
),
&
str
,
&
len
));
ASSERT_EQ
(
TSDB_CODE_SUCCESS
,
qSubPlanToString
((
const
SSubplan
*
)
taosArrayGetP
(
subplans
,
j
),
&
str
,
&
len
));
std
::
cout
<<
"len:"
<<
len
<<
std
::
endl
;
std
::
cout
<<
str
<<
std
::
endl
;
free
(
str
);
}
...
...
@@ -108,6 +120,25 @@ private:
return
info
;
}
void
buildParseContext
(
const
string
&
db
,
const
string
&
sql
,
SParseContext
*
pCxt
)
{
static
string
_db
;
static
string
_sql
;
static
const
int32_t
_msgMaxLen
=
4096
;
static
char
_msg
[
_msgMaxLen
];
_db
=
db
;
_sql
=
sql
;
memset
(
_msg
,
0
,
_msgMaxLen
);
pCxt
->
ctx
.
acctId
=
1
;
pCxt
->
ctx
.
db
=
_db
.
c_str
();
pCxt
->
ctx
.
requestId
=
1
;
pCxt
->
pSql
=
_sql
.
c_str
();
pCxt
->
sqlLen
=
_sql
.
length
();
pCxt
->
pMsg
=
_msg
;
pCxt
->
msgLen
=
_msgMaxLen
;
}
shared_ptr
<
MockTableMeta
>
meta_
;
unique_ptr
<
SQueryPlanNode
>
logicPlan_
;
unique_ptr
<
SQueryDag
>
dag_
;
...
...
@@ -115,7 +146,7 @@ private:
// select * from table
TEST_F
(
PhyPlanTest
,
tableScanTest
)
{
pushScan
(
"
root.
test"
,
"t1"
,
QNODE_TABLESCAN
);
pushScan
(
"test"
,
"t1"
,
QNODE_TABLESCAN
);
ASSERT_EQ
(
run
(),
TSDB_CODE_SUCCESS
);
explain
();
SQueryDag
*
dag
=
reslut
();
...
...
@@ -124,9 +155,17 @@ TEST_F(PhyPlanTest, tableScanTest) {
// select * from supertable
TEST_F
(
PhyPlanTest
,
superTableScanTest
)
{
pushScan
(
"
root.
test"
,
"st1"
,
QNODE_TABLESCAN
);
pushScan
(
"test"
,
"st1"
,
QNODE_TABLESCAN
);
ASSERT_EQ
(
run
(),
TSDB_CODE_SUCCESS
);
explain
();
SQueryDag
*
dag
=
reslut
();
// todo check
}
// insert into t values(...)
TEST_F
(
PhyPlanTest
,
insertTest
)
{
ASSERT_EQ
(
run
(
"test"
,
"insert into t1 values (now, 1,
\"
beijing
\"
)"
),
TSDB_CODE_SUCCESS
);
explain
();
SQueryDag
*
dag
=
reslut
();
// todo check
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录