Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
38f20ec3
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看板
提交
38f20ec3
编写于
11月 10, 2022
作者:
X
Xiaoyu Wang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
enh: show table tags command extension
上级
1a1ce767
变更
12
展开全部
显示空白变更内容
内联
并排
Showing
12 changed file
with
2599 addition
and
2536 deletion
+2599
-2536
include/common/ttokendef.h
include/common/ttokendef.h
+55
-55
include/libs/nodes/cmdnodes.h
include/libs/nodes/cmdnodes.h
+7
-0
include/libs/nodes/querynodes.h
include/libs/nodes/querynodes.h
+1
-0
source/libs/nodes/src/nodesUtilFuncs.c
source/libs/nodes/src/nodesUtilFuncs.c
+10
-3
source/libs/parser/inc/parAst.h
source/libs/parser/inc/parAst.h
+1
-0
source/libs/parser/inc/sql.y
source/libs/parser/inc/sql.y
+13
-1
source/libs/parser/src/parAstCreater.c
source/libs/parser/src/parAstCreater.c
+15
-0
source/libs/parser/src/parAstParser.c
source/libs/parser/src/parAstParser.c
+2
-2
source/libs/parser/src/parTranslater.c
source/libs/parser/src/parTranslater.c
+18
-9
source/libs/parser/src/sql.c
source/libs/parser/src/sql.c
+2461
-2464
source/libs/parser/test/parShowToUse.cpp
source/libs/parser/test/parShowToUse.cpp
+10
-0
source/libs/planner/src/planLogicCreater.c
source/libs/planner/src/planLogicCreater.c
+6
-2
未找到文件。
include/common/ttokendef.h
浏览文件 @
38f20ec3
...
...
@@ -174,61 +174,61 @@
#define TK_SUBSCRIPTIONS 156
#define TK_VNODES 157
#define TK_LIKE 158
#define TK_
INDEX
159
#define TK_
FUNCTION
160
#define TK_
INTERVAL
161
#define TK_
TOPIC
162
#define TK_
AS
163
#define TK_
WITH
164
#define TK_
META
165
#define TK_
CONSUMER
166
#define TK_
GROUP
167
#define TK_
DESC
168
#define TK_
DESCRIBE
169
#define TK_
RESET
170
#define TK_
QUERY
171
#define TK_
CACHE
172
#define TK_
EXPLAIN
173
#define TK_
ANALYZE
174
#define TK_
VERBOSE
175
#define TK_
NK_BOOL
176
#define TK_
RATIO
177
#define TK_NK_
FLOAT
178
#define TK_
OUTPUTTYPE
179
#define TK_
AGGREGATE
180
#define TK_
BUFSIZE
181
#define TK_
STREAM
182
#define TK_
INTO
183
#define TK_
TRIGGER
184
#define TK_
AT_ONCE
185
#define TK_
WINDOW_CLOSE
186
#define TK_
IGNORE
187
#define TK_
EXPIRED
188
#define TK_
FILL_HISTORY
189
#define TK_
SUBTABLE
190
#define TK_
KILL
191
#define TK_
CONNECTION
192
#define TK_
TRANSACTION
193
#define TK_
BALANCE
194
#define TK_
VGROUP
195
#define TK_
MERGE
196
#define TK_
REDISTRIBUTE
197
#define TK_
SPLIT
198
#define TK_
DELETE
199
#define TK_
INSERT
200
#define TK_
NULL
201
#define TK_
NK_QUESTION
202
#define TK_N
K_ARROW
203
#define TK_
ROWTS
204
#define TK_
TBNAME
205
#define TK_
QSTART
206
#define TK_Q
END
207
#define TK_Q
DURATION
208
#define TK_
WSTART
209
#define TK_W
END
210
#define TK_W
DURATION
211
#define TK_
IROWTS
212
#define TK_
QTAGS
213
#define TK_
TBNAME
159
#define TK_
QTAGS
160
#define TK_
AS
161
#define TK_
INDEX
162
#define TK_
FUNCTION
163
#define TK_
INTERVAL
164
#define TK_
TOPIC
165
#define TK_
WITH
166
#define TK_
META
167
#define TK_
CONSUMER
168
#define TK_
GROUP
169
#define TK_
DESC
170
#define TK_
DESCRIBE
171
#define TK_
RESET
172
#define TK_
QUERY
173
#define TK_
CACHE
174
#define TK_
EXPLAIN
175
#define TK_
ANALYZE
176
#define TK_
VERBOSE
177
#define TK_NK_
BOOL
178
#define TK_
RATIO
179
#define TK_
NK_FLOAT
180
#define TK_
OUTPUTTYPE
181
#define TK_
AGGREGATE
182
#define TK_
BUFSIZE
183
#define TK_
STREAM
184
#define TK_
INTO
185
#define TK_
TRIGGER
186
#define TK_
AT_ONCE
187
#define TK_
WINDOW_CLOSE
188
#define TK_
IGNORE
189
#define TK_
EXPIRED
190
#define TK_
FILL_HISTORY
191
#define TK_
SUBTABLE
192
#define TK_
KILL
193
#define TK_
CONNECTION
194
#define TK_
TRANSACTION
195
#define TK_
BALANCE
196
#define TK_
VGROUP
197
#define TK_
MERGE
198
#define TK_
REDISTRIBUTE
199
#define TK_
SPLIT
200
#define TK_
DELETE
201
#define TK_
INSERT
202
#define TK_N
ULL
203
#define TK_
NK_QUESTION
204
#define TK_
NK_ARROW
205
#define TK_
ROWTS
206
#define TK_Q
START
207
#define TK_Q
END
208
#define TK_
QDURATION
209
#define TK_W
START
210
#define TK_W
END
211
#define TK_
WDURATION
212
#define TK_
IROWTS
213
#define TK_CAST 214
#define TK_NOW 215
#define TK_TODAY 216
...
...
include/libs/nodes/cmdnodes.h
浏览文件 @
38f20ec3
...
...
@@ -284,6 +284,13 @@ typedef struct SShowVnodesStmt {
SNode
*
pDnodeEndpoint
;
}
SShowVnodesStmt
;
typedef
struct
SShowTableTagsStmt
{
ENodeType
type
;
SNode
*
pDbName
;
// SValueNode
SNode
*
pTbName
;
// SValueNode
SNodeList
*
pTags
;
}
SShowTableTagsStmt
;
typedef
enum
EIndexType
{
INDEX_TYPE_SMA
=
1
,
INDEX_TYPE_FULLTEXT
}
EIndexType
;
typedef
struct
SIndexOptions
{
...
...
include/libs/nodes/querynodes.h
浏览文件 @
38f20ec3
...
...
@@ -297,6 +297,7 @@ typedef struct SSelectStmt {
bool
hasStateKey
;
bool
onlyHasKeepOrderFunc
;
bool
groupSort
;
bool
tagScan
;
}
SSelectStmt
;
typedef
enum
ESetOperatorType
{
SET_OP_TYPE_UNION_ALL
=
1
,
SET_OP_TYPE_UNION
}
ESetOperatorType
;
...
...
source/libs/nodes/src/nodesUtilFuncs.c
浏览文件 @
38f20ec3
...
...
@@ -424,8 +424,9 @@ SNode* nodesMakeNode(ENodeType type) {
case
QUERY_NODE_SHOW_TRANSACTIONS_STMT
:
case
QUERY_NODE_SHOW_SUBSCRIPTIONS_STMT
:
case
QUERY_NODE_SHOW_TAGS_STMT
:
case
QUERY_NODE_SHOW_TABLE_TAGS_STMT
:
return
makeNode
(
type
,
sizeof
(
SShowStmt
));
case
QUERY_NODE_SHOW_TABLE_TAGS_STMT
:
return
makeNode
(
type
,
sizeof
(
SShowTableTagsStmt
));
case
QUERY_NODE_SHOW_DNODE_VARIABLES_STMT
:
return
makeNode
(
type
,
sizeof
(
SShowDnodeVariablesStmt
));
case
QUERY_NODE_SHOW_CREATE_DATABASE_STMT
:
...
...
@@ -942,13 +943,19 @@ void nodesDestroyNode(SNode* pNode) {
case
QUERY_NODE_SHOW_LOCAL_VARIABLES_STMT
:
case
QUERY_NODE_SHOW_TRANSACTIONS_STMT
:
case
QUERY_NODE_SHOW_SUBSCRIPTIONS_STMT
:
case
QUERY_NODE_SHOW_TAGS_STMT
:
case
QUERY_NODE_SHOW_TABLE_TAGS_STMT
:
{
case
QUERY_NODE_SHOW_TAGS_STMT
:
{
SShowStmt
*
pStmt
=
(
SShowStmt
*
)
pNode
;
nodesDestroyNode
(
pStmt
->
pDbName
);
nodesDestroyNode
(
pStmt
->
pTbName
);
break
;
}
case
QUERY_NODE_SHOW_TABLE_TAGS_STMT
:
{
SShowTableTagsStmt
*
pStmt
=
(
SShowTableTagsStmt
*
)
pNode
;
nodesDestroyNode
(
pStmt
->
pDbName
);
nodesDestroyNode
(
pStmt
->
pTbName
);
nodesDestroyList
(
pStmt
->
pTags
);
break
;
}
case
QUERY_NODE_SHOW_DNODE_VARIABLES_STMT
:
nodesDestroyNode
(((
SShowDnodeVariablesStmt
*
)
pNode
)
->
pDnodeId
);
nodesDestroyNode
(((
SShowDnodeVariablesStmt
*
)
pNode
)
->
pLikePattern
);
...
...
source/libs/parser/inc/parAst.h
浏览文件 @
38f20ec3
...
...
@@ -178,6 +178,7 @@ SNode* createShowCreateTableStmt(SAstCreateContext* pCxt, ENodeType type, SNode*
SNode
*
createShowTableDistributedStmt
(
SAstCreateContext
*
pCxt
,
SNode
*
pRealTable
);
SNode
*
createShowDnodeVariablesStmt
(
SAstCreateContext
*
pCxt
,
SNode
*
pDnodeId
,
SNode
*
pLikePattern
);
SNode
*
createShowVnodesStmt
(
SAstCreateContext
*
pCxt
,
SNode
*
pDnodeId
,
SNode
*
pDnodeEndpoint
);
SNode
*
createShowTableTagsStmt
(
SAstCreateContext
*
pCxt
,
SNode
*
pTbName
,
SNode
*
pDbName
,
SNodeList
*
pTags
);
SNode
*
createCreateUserStmt
(
SAstCreateContext
*
pCxt
,
SToken
*
pUserName
,
const
SToken
*
pPassword
,
int8_t
sysinfo
);
SNode
*
createAlterUserStmt
(
SAstCreateContext
*
pCxt
,
SToken
*
pUserName
,
int8_t
alterType
,
const
SToken
*
pVal
);
SNode
*
createDropUserStmt
(
SAstCreateContext
*
pCxt
,
SToken
*
pUserName
);
...
...
source/libs/parser/inc/sql.y
浏览文件 @
38f20ec3
...
...
@@ -426,7 +426,7 @@ cmd ::= SHOW TABLE DISTRIBUTED full_table_name(A).
cmd ::= SHOW CONSUMERS. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_CONSUMERS_STMT); }
cmd ::= SHOW SUBSCRIPTIONS. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_SUBSCRIPTIONS_STMT); }
cmd ::= SHOW TAGS FROM table_name_cond(A) from_db_opt(B). { pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TAGS_STMT, B, A, OP_TYPE_EQUAL); }
cmd ::= SHOW TABLE TAGS
FROM table_name_cond(A) from_db_opt(B). { pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TABLE_TAGS_STMT, B, A, OP_TYPE_EQUAL
); }
cmd ::= SHOW TABLE TAGS
tag_list_opt(C) FROM table_name_cond(A) from_db_opt(B). { pCxt->pRootNode = createShowTableTagsStmt(pCxt, A, B, C
); }
cmd ::= SHOW VNODES NK_INTEGER(A). { pCxt->pRootNode = createShowVnodesStmt(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &A), NULL); }
cmd ::= SHOW VNODES NK_STRING(A). { pCxt->pRootNode = createShowVnodesStmt(pCxt, NULL, createValueNode(pCxt, TSDB_DATA_TYPE_VARCHAR, &A)); }
...
...
@@ -441,6 +441,18 @@ table_name_cond(A) ::= table_name(B).
from_db_opt(A) ::= . { A = createDefaultDatabaseCondValue(pCxt); }
from_db_opt(A) ::= FROM db_name(B). { A = createIdentifierValueNode(pCxt, &B); }
%type tag_list_opt { SNodeList* }
%destructor tag_list_opt { nodesDestroyList($$); }
tag_list_opt(A) ::= . { A = NULL; }
tag_list_opt(A) ::= tag_item(B). { A = createNodeList(pCxt, B); }
tag_list_opt(A) ::= tag_list_opt(B) NK_COMMA tag_item(C). { A = addNodeToList(pCxt, B, C); }
tag_item(A) ::= TBNAME(B). { A = setProjectionAlias(pCxt, createFunctionNode(pCxt, &B, NULL), &B); }
tag_item(A) ::= QTAGS(B). { A = createFunctionNode(pCxt, &B, NULL); }
tag_item(A) ::= column_name(B). { A = createColumnNode(pCxt, NULL, &B); }
tag_item(A) ::= column_name(B) column_alias(C). { A = setProjectionAlias(pCxt, createColumnNode(pCxt, NULL, &B), &C); }
tag_item(A) ::= column_name(B) AS column_alias(C). { A = setProjectionAlias(pCxt, createColumnNode(pCxt, NULL, &B), &C); }
/************************************************ create index ********************************************************/
cmd ::= CREATE SMA INDEX not_exists_opt(D)
full_table_name(A) ON full_table_name(B) index_options(C). { pCxt->pRootNode = createCreateIndexStmt(pCxt, INDEX_TYPE_SMA, D, A, B, NULL, C); }
...
...
source/libs/parser/src/parAstCreater.c
浏览文件 @
38f20ec3
...
...
@@ -1390,6 +1390,21 @@ SNode* createShowVnodesStmt(SAstCreateContext* pCxt, SNode* pDnodeId, SNode* pDn
return
(
SNode
*
)
pStmt
;
}
SNode
*
createShowTableTagsStmt
(
SAstCreateContext
*
pCxt
,
SNode
*
pTbName
,
SNode
*
pDbName
,
SNodeList
*
pTags
)
{
CHECK_PARSER_STATUS
(
pCxt
);
if
(
NULL
==
pDbName
)
{
snprintf
(
pCxt
->
pQueryCxt
->
pMsg
,
pCxt
->
pQueryCxt
->
msgLen
,
"database not specified"
);
pCxt
->
errCode
=
TSDB_CODE_PAR_SYNTAX_ERROR
;
return
NULL
;
}
SShowTableTagsStmt
*
pStmt
=
(
SShowTableTagsStmt
*
)
nodesMakeNode
(
QUERY_NODE_SHOW_TABLE_TAGS_STMT
);
CHECK_OUT_OF_MEM
(
pStmt
);
pStmt
->
pDbName
=
pDbName
;
pStmt
->
pTbName
=
pTbName
;
pStmt
->
pTags
=
pTags
;
return
(
SNode
*
)
pStmt
;
}
SNode
*
createCreateUserStmt
(
SAstCreateContext
*
pCxt
,
SToken
*
pUserName
,
const
SToken
*
pPassword
,
int8_t
sysinfo
)
{
CHECK_PARSER_STATUS
(
pCxt
);
char
password
[
TSDB_USET_PASSWORD_LEN
]
=
{
0
};
...
...
source/libs/parser/src/parAstParser.c
浏览文件 @
38f20ec3
...
...
@@ -440,7 +440,7 @@ static int32_t collectMetaKeyFromShowTags(SCollectMetaKeyCxt* pCxt, SShowStmt* p
return
code
;
}
static
int32_t
collectMetaKeyFromShowStableTags
(
SCollectMetaKeyCxt
*
pCxt
,
SShowStmt
*
pStmt
)
{
static
int32_t
collectMetaKeyFromShowStableTags
(
SCollectMetaKeyCxt
*
pCxt
,
SShow
TableTags
Stmt
*
pStmt
)
{
return
collectMetaKeyFromRealTableImpl
(
pCxt
,
((
SValueNode
*
)
pStmt
->
pDbName
)
->
literal
,
((
SValueNode
*
)
pStmt
->
pTbName
)
->
literal
,
AUTH_TYPE_READ
);
}
...
...
@@ -627,7 +627,7 @@ static int32_t collectMetaKeyFromQuery(SCollectMetaKeyCxt* pCxt, SNode* pStmt) {
case
QUERY_NODE_SHOW_TAGS_STMT
:
return
collectMetaKeyFromShowTags
(
pCxt
,
(
SShowStmt
*
)
pStmt
);
case
QUERY_NODE_SHOW_TABLE_TAGS_STMT
:
return
collectMetaKeyFromShowStableTags
(
pCxt
,
(
SShowStmt
*
)
pStmt
);
return
collectMetaKeyFromShowStableTags
(
pCxt
,
(
SShow
TableTags
Stmt
*
)
pStmt
);
case
QUERY_NODE_SHOW_USERS_STMT
:
return
collectMetaKeyFromShowUsers
(
pCxt
,
(
SShowStmt
*
)
pStmt
);
case
QUERY_NODE_SHOW_LICENCES_STMT
:
...
...
source/libs/parser/src/parTranslater.c
浏览文件 @
38f20ec3
...
...
@@ -4969,7 +4969,8 @@ static int32_t translateUseDatabase(STranslateContext* pCxt, SUseDatabaseStmt* p
SName
name
=
{
0
};
tNameSetDbName
(
&
name
,
pCxt
->
pParseCxt
->
acctId
,
pStmt
->
dbName
,
strlen
(
pStmt
->
dbName
));
tNameExtractFullName
(
&
name
,
usedbReq
.
db
);
int32_t
code
=
getDBVgVersion
(
pCxt
,
usedbReq
.
db
,
&
usedbReq
.
vgVersion
,
&
usedbReq
.
dbId
,
&
usedbReq
.
numOfTable
,
&
usedbReq
.
stateTs
);
int32_t
code
=
getDBVgVersion
(
pCxt
,
usedbReq
.
db
,
&
usedbReq
.
vgVersion
,
&
usedbReq
.
dbId
,
&
usedbReq
.
numOfTable
,
&
usedbReq
.
stateTs
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
buildCmdMsg
(
pCxt
,
TDMT_MND_USE_DB
,
(
FSerializeFunc
)
tSerializeSUseDbReq
,
&
usedbReq
);
}
...
...
@@ -6281,21 +6282,29 @@ static SNode* createTagsFunction() {
return
(
SNode
*
)
pFunc
;
}
static
int32_t
createShowTableTagsProjections
(
SNodeList
**
pProjections
,
SNodeList
**
pTags
)
{
if
(
NULL
!=
*
pTags
)
{
TSWAP
(
*
pProjections
,
*
pTags
);
return
TSDB_CODE_SUCCESS
;
}
int32_t
code
=
nodesListMakeStrictAppend
(
pProjections
,
createTbnameFunction
());
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
nodesListStrictAppend
(
*
pProjections
,
createTagsFunction
());
}
return
code
;
}
static
int32_t
rewriteShowStableTags
(
STranslateContext
*
pCxt
,
SQuery
*
pQuery
)
{
const
char
*
cols
[]
=
{
"tbname"
,
"_tags"
};
SShowStmt
*
pShow
=
(
SShowStmt
*
)
pQuery
->
pRoot
;
SShowTableTagsStmt
*
pShow
=
(
SShowTableTagsStmt
*
)
pQuery
->
pRoot
;
SSelectStmt
*
pSelect
=
NULL
;
int32_t
code
=
createSimpleSelectStmt
(((
SValueNode
*
)
pShow
->
pDbName
)
->
literal
,
((
SValueNode
*
)
pShow
->
pTbName
)
->
literal
,
-
1
,
NULL
,
&
pSelect
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
nodesListMakeStrictAppend
(
&
pSelect
->
pProjectionList
,
createTbnameFunction
());
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
nodesListMakeStrictAppend
(
&
pSelect
->
pProjectionList
,
createTagsFunction
());
code
=
createShowTableTagsProjections
(
&
pSelect
->
pProjectionList
,
&
pShow
->
pTags
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
pSelect
->
isDistinct
=
true
;
pQuery
->
showRewrite
=
true
;
pSelect
->
tagScan
=
true
;
nodesDestroyNode
(
pQuery
->
pRoot
);
pQuery
->
pRoot
=
(
SNode
*
)
pSelect
;
}
else
{
...
...
source/libs/parser/src/sql.c
浏览文件 @
38f20ec3
此差异已折叠。
点击以展开。
source/libs/parser/test/parShowToUse.cpp
浏览文件 @
38f20ec3
...
...
@@ -192,6 +192,16 @@ TEST_F(ParserShowToUseTest, showTableDistributed) {
run
(
"SHOW TABLE DISTRIBUTED st1"
);
}
TEST_F
(
ParserShowToUseTest
,
showTableTags
)
{
useDb
(
"root"
,
"test"
);
run
(
"SHOW TABLE TAGS FROM st1"
);
run
(
"SHOW TABLE TAGS tag1, tag2 FROM st1"
);
run
(
"SHOW TABLE TAGS TBNAME, _TAG, tag3 FROM st1"
);
}
TEST_F
(
ParserShowToUseTest
,
showTags
)
{
useDb
(
"root"
,
"test"
);
...
...
source/libs/planner/src/planLogicCreater.c
浏览文件 @
38f20ec3
...
...
@@ -189,7 +189,7 @@ static int32_t createSelectRootLogicNode(SLogicPlanContext* pCxt, SSelectStmt* p
}
static
EScanType
getScanType
(
SLogicPlanContext
*
pCxt
,
SNodeList
*
pScanPseudoCols
,
SNodeList
*
pScanCols
,
int8_t
tableType
)
{
int8_t
tableType
,
bool
tagScan
)
{
if
(
pCxt
->
pPlanCxt
->
topicQuery
||
pCxt
->
pPlanCxt
->
streamQuery
)
{
return
SCAN_TYPE_STREAM
;
}
...
...
@@ -198,6 +198,10 @@ static EScanType getScanType(SLogicPlanContext* pCxt, SNodeList* pScanPseudoCols
return
SCAN_TYPE_SYSTEM_TABLE
;
}
if
(
tagScan
)
{
return
SCAN_TYPE_TAG
;
}
if
(
NULL
==
pScanCols
)
{
return
NULL
==
pScanPseudoCols
?
SCAN_TYPE_TABLE
...
...
@@ -310,7 +314,7 @@ static int32_t createScanLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect
code
=
rewriteExprsForSelect
(
pScan
->
pScanPseudoCols
,
pSelect
,
SQL_CLAUSE_FROM
);
}
pScan
->
scanType
=
getScanType
(
pCxt
,
pScan
->
pScanPseudoCols
,
pScan
->
pScanCols
,
pScan
->
tableType
);
pScan
->
scanType
=
getScanType
(
pCxt
,
pScan
->
pScanPseudoCols
,
pScan
->
pScanCols
,
pScan
->
tableType
,
pSelect
->
tagScan
);
if
(
NULL
!=
pScan
->
pScanCols
)
{
pScan
->
hasNormalCols
=
true
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录