Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
95f7f165
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看板
提交
95f7f165
编写于
4月 29, 2022
作者:
X
Xiaoyu Wang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
enh: refactor unit test of parser and planner
上级
ab0e6896
变更
6
显示空白变更内容
内联
并排
Showing
6 changed file
with
38 addition
and
53 deletion
+38
-53
source/libs/parser/inc/parAst.h
source/libs/parser/inc/parAst.h
+0
-1
source/libs/parser/inc/sql.y
source/libs/parser/inc/sql.y
+4
-5
source/libs/parser/src/parAstCreater.c
source/libs/parser/src/parAstCreater.c
+20
-38
source/libs/parser/src/parAstParser.c
source/libs/parser/src/parAstParser.c
+4
-4
source/libs/parser/src/sql.c
source/libs/parser/src/sql.c
+4
-5
source/libs/parser/test/parInitialATest.cpp
source/libs/parser/test/parInitialATest.cpp
+6
-0
未找到文件。
source/libs/parser/inc/parAst.h
浏览文件 @
95f7f165
...
...
@@ -30,7 +30,6 @@ typedef struct SAstCreateContext {
SParseContext
*
pQueryCxt
;
SMsgBuf
msgBuf
;
bool
notSupport
;
bool
valid
;
SNode
*
pRootNode
;
int16_t
placeholderNo
;
int32_t
errCode
;
...
...
source/libs/parser/inc/sql.y
浏览文件 @
95f7f165
...
...
@@ -23,13 +23,12 @@
}
%syntax_error {
if (
pCxt->valid
) {
if (
TSDB_CODE_SUCCESS == pCxt->errCode
) {
if(TOKEN.z) {
pCxt->errCode = generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_SYNTAX_ERROR, TOKEN.z);
} else {
pCxt->errCode = generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INCOMPLETE_SQL);
}
pCxt->valid = false;
}
}
...
...
@@ -42,8 +41,8 @@
%left NK_CONCAT.
/************************************************ create/alter account *****************************************/
cmd ::= CREATE ACCOUNT NK_ID PASS NK_STRING account_options. { pCxt->
valid = false; pCxt->
errCode = generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_EXPRIE_STATEMENT); }
cmd ::= ALTER ACCOUNT NK_ID alter_account_options. { pCxt->
valid = false; pCxt->
errCode = generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_EXPRIE_STATEMENT); }
cmd ::= CREATE ACCOUNT NK_ID PASS NK_STRING account_options. { pCxt->errCode = generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_EXPRIE_STATEMENT); }
cmd ::= ALTER ACCOUNT NK_ID alter_account_options. { pCxt->errCode = generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_EXPRIE_STATEMENT); }
%type account_options { int32_t }
%destructor account_options { }
...
...
@@ -323,7 +322,7 @@ cmd ::= SHOW QNODES.
cmd ::= SHOW FUNCTIONS. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_FUNCTIONS_STMT, NULL, NULL); }
cmd ::= SHOW INDEXES FROM table_name_cond(A) from_db_opt(B). { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_INDEXES_STMT, A, B); }
cmd ::= SHOW STREAMS. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_STREAMS_STMT, NULL, NULL); }
cmd ::= SHOW ACCOUNTS. { pCxt->
valid = false; pCxt->
errCode = generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_EXPRIE_STATEMENT); }
cmd ::= SHOW ACCOUNTS. { pCxt->errCode = generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_EXPRIE_STATEMENT); }
cmd ::= SHOW APPS. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_APPS_STMT, NULL, NULL); }
cmd ::= SHOW CONNECTIONS. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_CONNECTIONS_STMT, NULL, NULL); }
cmd ::= SHOW LICENCE. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_LICENCE_STMT, NULL, NULL); }
...
...
source/libs/parser/src/parAstCreater.c
浏览文件 @
95f7f165
...
...
@@ -21,7 +21,7 @@
#define CHECK_OUT_OF_MEM(p) \
do { \
if (NULL == (p)) { \
pCxt->
valid = false;
\
pCxt->
errCode = TSDB_CODE_OUT_OF_MEMORY;
\
snprintf(pCxt->pQueryCxt->pMsg, pCxt->pQueryCxt->msgLen, "Out of memory"); \
return NULL; \
} \
...
...
@@ -30,7 +30,7 @@
#define CHECK_RAW_EXPR_NODE(node) \
do { \
if (NULL == (node) || QUERY_NODE_RAW_EXPR != nodeType(node)) { \
pCxt->
valid = false;
\
pCxt->
errCode = TSDB_CODE_PAR_SYNTAX_ERROR;
\
return NULL; \
} \
} while (0)
...
...
@@ -42,7 +42,6 @@ void initAstCreateContext(SParseContext* pParseCxt, SAstCreateContext* pCxt) {
pCxt
->
msgBuf
.
buf
=
pParseCxt
->
pMsg
;
pCxt
->
msgBuf
.
len
=
pParseCxt
->
msgLen
;
pCxt
->
notSupport
=
false
;
pCxt
->
valid
=
true
;
pCxt
->
pRootNode
=
NULL
;
pCxt
->
placeholderNo
=
0
;
pCxt
->
errCode
=
TSDB_CODE_SUCCESS
;
...
...
@@ -64,42 +63,38 @@ static void trimEscape(SToken* pName) {
static
bool
checkUserName
(
SAstCreateContext
*
pCxt
,
SToken
*
pUserName
)
{
if
(
NULL
==
pUserName
)
{
pCxt
->
valid
=
false
;
pCxt
->
errCode
=
TSDB_CODE_PAR_SYNTAX_ERROR
;
}
else
{
if
(
pUserName
->
n
>=
TSDB_USER_LEN
)
{
pCxt
->
errCode
=
generateSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_NAME_OR_PASSWD_TOO_LONG
);
pCxt
->
valid
=
false
;
}
}
if
(
pCxt
->
valid
)
{
if
(
TSDB_CODE_SUCCESS
==
pCxt
->
errCode
)
{
trimEscape
(
pUserName
);
}
return
pCxt
->
valid
;
return
TSDB_CODE_SUCCESS
==
pCxt
->
errCode
;
}
static
bool
checkPassword
(
SAstCreateContext
*
pCxt
,
const
SToken
*
pPasswordToken
,
char
*
pPassword
)
{
if
(
NULL
==
pPasswordToken
)
{
pCxt
->
valid
=
false
;
pCxt
->
errCode
=
TSDB_CODE_PAR_SYNTAX_ERROR
;
}
else
if
(
pPasswordToken
->
n
>=
(
TSDB_USET_PASSWORD_LEN
-
2
))
{
pCxt
->
errCode
=
generateSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_NAME_OR_PASSWD_TOO_LONG
);
pCxt
->
valid
=
false
;
}
else
{
strncpy
(
pPassword
,
pPasswordToken
->
z
,
pPasswordToken
->
n
);
strdequote
(
pPassword
);
if
(
strtrim
(
pPassword
)
<=
0
)
{
pCxt
->
errCode
=
generateSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_PASSWD_EMPTY
);
pCxt
->
valid
=
false
;
}
}
return
pCxt
->
valid
;
return
TSDB_CODE_SUCCESS
==
pCxt
->
errCode
;
}
static
bool
checkAndSplitEndpoint
(
SAstCreateContext
*
pCxt
,
const
SToken
*
pEp
,
char
*
pFqdn
,
int32_t
*
pPort
)
{
if
(
NULL
==
pEp
)
{
pCxt
->
valid
=
false
;
pCxt
->
errCode
=
TSDB_CODE_PAR_SYNTAX_ERROR
;
}
else
if
(
pEp
->
n
>=
TSDB_FQDN_LEN
+
2
+
6
)
{
// format 'fqdn:port'
pCxt
->
errCode
=
generateSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_NAME_OR_PASSWD_TOO_LONG
);
pCxt
->
valid
=
false
;
}
else
{
char
ep
[
TSDB_FQDN_LEN
+
2
+
6
];
strncpy
(
ep
,
pEp
->
z
,
pEp
->
n
);
...
...
@@ -108,65 +103,58 @@ static bool checkAndSplitEndpoint(SAstCreateContext* pCxt, const SToken* pEp, ch
char
*
pColon
=
strchr
(
ep
,
':'
);
if
(
NULL
==
pColon
)
{
pCxt
->
errCode
=
generateSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_INVALID_ENDPOINT
);
pCxt
->
valid
=
false
;
}
else
{
strncpy
(
pFqdn
,
ep
,
pColon
-
ep
);
*
pPort
=
strtol
(
pColon
+
1
,
NULL
,
10
);
if
(
*
pPort
>=
UINT16_MAX
||
*
pPort
<=
0
)
{
pCxt
->
errCode
=
generateSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_INVALID_PORT
);
pCxt
->
valid
=
false
;
}
}
}
return
pCxt
->
valid
;
return
TSDB_CODE_SUCCESS
==
pCxt
->
errCode
;
}
static
bool
checkFqdn
(
SAstCreateContext
*
pCxt
,
const
SToken
*
pFqdn
)
{
if
(
NULL
==
pFqdn
)
{
pCxt
->
valid
=
false
;
pCxt
->
errCode
=
TSDB_CODE_PAR_SYNTAX_ERROR
;
}
else
{
if
(
pFqdn
->
n
>=
TSDB_FQDN_LEN
)
{
pCxt
->
errCode
=
generateSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_NAME_OR_PASSWD_TOO_LONG
);
pCxt
->
valid
=
false
;
}
}
return
pCxt
->
valid
;
return
TSDB_CODE_SUCCESS
==
pCxt
->
errCode
;
}
static
bool
checkPort
(
SAstCreateContext
*
pCxt
,
const
SToken
*
pPortToken
,
int32_t
*
pPort
)
{
if
(
NULL
==
pPortToken
)
{
pCxt
->
valid
=
false
;
pCxt
->
errCode
=
TSDB_CODE_PAR_SYNTAX_ERROR
;
}
else
{
*
pPort
=
strtol
(
pPortToken
->
z
,
NULL
,
10
);
if
(
*
pPort
>=
UINT16_MAX
||
*
pPort
<=
0
)
{
pCxt
->
errCode
=
generateSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_INVALID_PORT
);
pCxt
->
valid
=
false
;
}
}
return
pCxt
->
valid
;
return
TSDB_CODE_SUCCESS
==
pCxt
->
errCode
;
}
static
bool
checkDbName
(
SAstCreateContext
*
pCxt
,
SToken
*
pDbName
,
bool
query
)
{
if
(
NULL
==
pDbName
)
{
if
(
query
&&
NULL
==
pCxt
->
pQueryCxt
->
db
)
{
pCxt
->
errCode
=
generateSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_DB_NOT_SPECIFIED
);
pCxt
->
valid
=
false
;
}
}
else
{
trimEscape
(
pDbName
);
if
(
pDbName
->
n
>=
TSDB_DB_NAME_LEN
)
{
pCxt
->
errCode
=
generateSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_INVALID_IDENTIFIER_NAME
,
pDbName
->
z
);
pCxt
->
valid
=
false
;
}
}
return
pCxt
->
valid
;
return
TSDB_CODE_SUCCESS
==
pCxt
->
errCode
;
}
static
bool
checkTableName
(
SAstCreateContext
*
pCxt
,
SToken
*
pTableName
)
{
trimEscape
(
pTableName
);
if
(
NULL
!=
pTableName
&&
pTableName
->
n
>=
TSDB_TABLE_NAME_LEN
)
{
pCxt
->
errCode
=
generateSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_INVALID_IDENTIFIER_NAME
,
pTableName
->
z
);
pCxt
->
valid
=
false
;
return
false
;
}
return
true
;
...
...
@@ -176,7 +164,6 @@ static bool checkColumnName(SAstCreateContext* pCxt, SToken* pColumnName) {
trimEscape
(
pColumnName
);
if
(
NULL
!=
pColumnName
&&
pColumnName
->
n
>=
TSDB_COL_NAME_LEN
)
{
pCxt
->
errCode
=
generateSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_INVALID_IDENTIFIER_NAME
,
pColumnName
->
z
);
pCxt
->
valid
=
false
;
return
false
;
}
return
true
;
...
...
@@ -186,7 +173,6 @@ static bool checkIndexName(SAstCreateContext* pCxt, SToken* pIndexName) {
trimEscape
(
pIndexName
);
if
(
NULL
!=
pIndexName
&&
pIndexName
->
n
>=
TSDB_INDEX_NAME_LEN
)
{
pCxt
->
errCode
=
generateSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_INVALID_IDENTIFIER_NAME
,
pIndexName
->
z
);
pCxt
->
valid
=
false
;
return
false
;
}
return
true
;
...
...
@@ -225,7 +211,7 @@ SNode* releaseRawExprNode(SAstCreateContext* pCxt, SNode* pNode) {
SToken
getTokenFromRawExprNode
(
SAstCreateContext
*
pCxt
,
SNode
*
pNode
)
{
if
(
NULL
==
pNode
||
QUERY_NODE_RAW_EXPR
!=
nodeType
(
pNode
))
{
pCxt
->
valid
=
false
;
pCxt
->
errCode
=
TSDB_CODE_PAR_SYNTAX_ERROR
;
return
nil_token
;
}
SRawExprNode
*
target
=
(
SRawExprNode
*
)
pNode
;
...
...
@@ -236,16 +222,12 @@ SToken getTokenFromRawExprNode(SAstCreateContext* pCxt, SNode* pNode) {
SNodeList
*
createNodeList
(
SAstCreateContext
*
pCxt
,
SNode
*
pNode
)
{
SNodeList
*
list
=
nodesMakeList
();
CHECK_OUT_OF_MEM
(
list
);
if
(
TSDB_CODE_SUCCESS
!=
nodesListAppend
(
list
,
pNode
))
{
pCxt
->
valid
=
false
;
}
pCxt
->
errCode
=
nodesListAppend
(
list
,
pNode
);
return
list
;
}
SNodeList
*
addNodeToList
(
SAstCreateContext
*
pCxt
,
SNodeList
*
pList
,
SNode
*
pNode
)
{
if
(
TSDB_CODE_SUCCESS
!=
nodesListAppend
(
pList
,
pNode
))
{
pCxt
->
valid
=
false
;
}
pCxt
->
errCode
=
nodesListAppend
(
pList
,
pNode
);
return
pList
;
}
...
...
@@ -532,7 +514,7 @@ SNode* createGroupingSetNode(SAstCreateContext* pCxt, SNode* pNode) {
}
SNode
*
setProjectionAlias
(
SAstCreateContext
*
pCxt
,
SNode
*
pNode
,
const
SToken
*
pAlias
)
{
if
(
NULL
==
pNode
||
!
pCxt
->
valid
)
{
if
(
NULL
==
pNode
||
TSDB_CODE_SUCCESS
!=
pCxt
->
errCode
)
{
return
pNode
;
}
int32_t
len
=
TMIN
(
sizeof
(((
SExprNode
*
)
pNode
)
->
aliasName
)
-
1
,
pAlias
->
n
);
...
...
@@ -996,7 +978,7 @@ static bool needDbShowStmt(ENodeType type) {
SNode
*
createShowStmt
(
SAstCreateContext
*
pCxt
,
ENodeType
type
,
SNode
*
pDbName
,
SNode
*
pTbNamePattern
)
{
if
(
needDbShowStmt
(
type
)
&&
NULL
==
pDbName
&&
NULL
==
pCxt
->
pQueryCxt
->
db
)
{
snprintf
(
pCxt
->
pQueryCxt
->
pMsg
,
pCxt
->
pQueryCxt
->
msgLen
,
"db not specified"
);
pCxt
->
valid
=
false
;
pCxt
->
errCode
=
TSDB_CODE_PAR_SYNTAX_ERROR
;
return
NULL
;
}
SShowStmt
*
pStmt
=
nodesMakeNode
(
type
);
...
...
@@ -1257,7 +1239,7 @@ SNode* createCompactStmt(SAstCreateContext* pCxt, SNodeList* pVgroups) {
SNode
*
createCreateFunctionStmt
(
SAstCreateContext
*
pCxt
,
bool
ignoreExists
,
bool
aggFunc
,
const
SToken
*
pFuncName
,
const
SToken
*
pLibPath
,
SDataType
dataType
,
int32_t
bufSize
)
{
if
(
pLibPath
->
n
<=
2
)
{
pCxt
->
valid
=
false
;
pCxt
->
errCode
=
TSDB_CODE_PAR_SYNTAX_ERROR
;
return
NULL
;
}
SCreateFunctionStmt
*
pStmt
=
nodesMakeNode
(
QUERY_NODE_CREATE_FUNCTION_STMT
);
...
...
source/libs/parser/src/parAstParser.c
浏览文件 @
95f7f165
...
...
@@ -53,20 +53,20 @@ int32_t parse(SParseContext* pParseCxt, SQuery** pQuery) {
}
case
TK_NK_ILLEGAL
:
{
snprintf
(
cxt
.
pQueryCxt
->
pMsg
,
cxt
.
pQueryCxt
->
msgLen
,
"unrecognized token:
\"
%s
\"
"
,
t0
.
z
);
cxt
.
valid
=
false
;
cxt
.
errCode
=
TSDB_CODE_PAR_SYNTAX_ERROR
;
goto
abort_parse
;
}
case
TK_NK_HEX
:
case
TK_NK_OCT
:
case
TK_NK_BIN
:
{
snprintf
(
cxt
.
pQueryCxt
->
pMsg
,
cxt
.
pQueryCxt
->
msgLen
,
"unsupported token:
\"
%s
\"
"
,
t0
.
z
);
cxt
.
valid
=
false
;
cxt
.
errCode
=
TSDB_CODE_PAR_SYNTAX_ERROR
;
goto
abort_parse
;
}
default:
Parse
(
pParser
,
t0
.
type
,
t0
,
&
cxt
);
// ParseTrace(stdout, "");
if
(
!
cxt
.
valid
)
{
if
(
TSDB_CODE_SUCCESS
!=
cxt
.
errCode
)
{
goto
abort_parse
;
}
}
...
...
@@ -74,7 +74,7 @@ int32_t parse(SParseContext* pParseCxt, SQuery** pQuery) {
abort_parse:
ParseFree
(
pParser
,
(
FFree
)
taosMemoryFree
);
if
(
cxt
.
valid
)
{
if
(
TSDB_CODE_SUCCESS
==
cxt
.
errCode
)
{
*
pQuery
=
taosMemoryCalloc
(
1
,
sizeof
(
SQuery
));
if
(
NULL
==
*
pQuery
)
{
return
TSDB_CODE_OUT_OF_MEMORY
;
...
...
source/libs/parser/src/sql.c
浏览文件 @
95f7f165
...
...
@@ -3021,11 +3021,11 @@ static YYACTIONTYPE yy_reduce(
/********** Begin reduce actions **********************************************/
YYMINORTYPE
yylhsminor
;
case
0
:
/* cmd ::= CREATE ACCOUNT NK_ID PASS NK_STRING account_options */
{
pCxt
->
valid
=
false
;
pCxt
->
errCode
=
generateSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_EXPRIE_STATEMENT
);
}
{
pCxt
->
errCode
=
generateSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_EXPRIE_STATEMENT
);
}
yy_destructor
(
yypParser
,
232
,
&
yymsp
[
0
].
minor
);
break
;
case
1
:
/* cmd ::= ALTER ACCOUNT NK_ID alter_account_options */
{
pCxt
->
valid
=
false
;
pCxt
->
errCode
=
generateSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_EXPRIE_STATEMENT
);
}
{
pCxt
->
errCode
=
generateSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_EXPRIE_STATEMENT
);
}
yy_destructor
(
yypParser
,
233
,
&
yymsp
[
0
].
minor
);
break
;
case
2
:
/* account_options ::= */
...
...
@@ -3591,7 +3591,7 @@ static YYACTIONTYPE yy_reduce(
{
pCxt
->
pRootNode
=
createShowStmt
(
pCxt
,
QUERY_NODE_SHOW_STREAMS_STMT
,
NULL
,
NULL
);
}
break
;
case
178
:
/* cmd ::= SHOW ACCOUNTS */
{
pCxt
->
valid
=
false
;
pCxt
->
errCode
=
generateSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_EXPRIE_STATEMENT
);
}
{
pCxt
->
errCode
=
generateSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_EXPRIE_STATEMENT
);
}
break
;
case
179
:
/* cmd ::= SHOW APPS */
{
pCxt
->
pRootNode
=
createShowStmt
(
pCxt
,
QUERY_NODE_SHOW_APPS_STMT
,
NULL
,
NULL
);
}
...
...
@@ -4353,13 +4353,12 @@ static void yy_syntax_error(
#define TOKEN yyminor
/************ Begin %syntax_error code ****************************************/
if
(
pCxt
->
valid
)
{
if
(
TSDB_CODE_SUCCESS
==
pCxt
->
errCode
)
{
if
(
TOKEN
.
z
)
{
pCxt
->
errCode
=
generateSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_SYNTAX_ERROR
,
TOKEN
.
z
);
}
else
{
pCxt
->
errCode
=
generateSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_INCOMPLETE_SQL
);
}
pCxt
->
valid
=
false
;
}
/************ End %syntax_error code ******************************************/
ParseARG_STORE
/* Suppress warning about unused %extra_argument variable */
...
...
source/libs/parser/test/parInitialATest.cpp
浏览文件 @
95f7f165
...
...
@@ -53,4 +53,10 @@ TEST_F(ParserInitialATest, alterUser) {
run
(
"alter user wxy privilege 'write'"
);
}
TEST_F
(
ParserInitialATest
,
bug001
)
{
useDb
(
"root"
,
"test"
);
run
(
"alter database db wal 0 # td-14436"
);
}
}
// namespace ParserTest
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录