Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
慢慢CG
TDengine
提交
d4f39548
T
TDengine
项目概览
慢慢CG
/
TDengine
与 Fork 源项目一致
Fork自
taosdata / TDengine
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
d4f39548
编写于
8月 10, 2020
作者:
S
Shengliang Guan
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
TD-1057 change compile errors
上级
d79cad4b
变更
10
隐藏空白更改
内联
并排
Showing
10 changed file
with
36 addition
and
36 deletion
+36
-36
src/client/src/tscLocalMerge.c
src/client/src/tscLocalMerge.c
+3
-3
src/client/src/tscSQLParser.c
src/client/src/tscSQLParser.c
+3
-3
src/client/src/tscSql.c
src/client/src/tscSql.c
+1
-1
src/client/src/tscSubquery.c
src/client/src/tscSubquery.c
+1
-1
src/client/src/tscUtil.c
src/client/src/tscUtil.c
+4
-4
src/query/src/qExecutor.c
src/query/src/qExecutor.c
+6
-6
src/query/src/qResultbuf.c
src/query/src/qResultbuf.c
+6
-6
src/tsdb/src/tsdbRead.c
src/tsdb/src/tsdbRead.c
+1
-1
src/util/src/hash.c
src/util/src/hash.c
+8
-8
src/util/src/tcache.c
src/util/src/tcache.c
+3
-3
未找到文件。
src/client/src/tscLocalMerge.c
浏览文件 @
d4f39548
...
...
@@ -914,8 +914,8 @@ static void doFillResult(SSqlObj *pSql, SLocalReducer *pLocalReducer, bool doneO
if
(
pQueryInfo
->
limit
.
limit
>=
0
&&
pRes
->
numOfRowsGroup
>
pQueryInfo
->
limit
.
limit
)
{
/* impose the limitation of output rows on the final result */
int32_t
prevSize
=
pFinalDataPage
->
num
;
int32_t
overflow
=
pRes
->
numOfRowsGroup
-
pQueryInfo
->
limit
.
limit
;
int32_t
prevSize
=
(
int32_t
)
pFinalDataPage
->
num
;
int32_t
overflow
=
(
int32_t
)(
pRes
->
numOfRowsGroup
-
pQueryInfo
->
limit
.
limit
)
;
assert
(
overflow
<
pRes
->
numOfRows
);
pRes
->
numOfRowsGroup
=
pQueryInfo
->
limit
.
limit
;
...
...
@@ -984,7 +984,7 @@ static void doFillResult(SSqlObj *pSql, SLocalReducer *pLocalReducer, bool doneO
if
(
pRes
->
numOfRows
>
0
)
{
if
(
pQueryInfo
->
limit
.
limit
>=
0
&&
pRes
->
numOfRows
>
pQueryInfo
->
limit
.
limit
)
{
int32_t
overflow
=
pRes
->
numOfRows
-
pQueryInfo
->
limit
.
limit
;
int32_t
overflow
=
(
int32_t
)(
pRes
->
numOfRows
-
pQueryInfo
->
limit
.
limit
)
;
pRes
->
numOfRows
-=
overflow
;
pFinalDataPage
->
num
-=
overflow
;
...
...
src/client/src/tscSQLParser.c
浏览文件 @
d4f39548
...
...
@@ -1182,7 +1182,7 @@ static int32_t handleArithmeticExpr(SSqlCmd* pCmd, int32_t clauseIndex, int32_t
char
*
c
=
tbufGetData
(
&
bw
,
true
);
// set the serialized binary string as the parameter of arithmetic expression
addExprParams
(
pExpr
,
c
,
TSDB_DATA_TYPE_BINARY
,
len
,
index
.
tableIndex
);
addExprParams
(
pExpr
,
c
,
TSDB_DATA_TYPE_BINARY
,
(
int32_t
)
len
,
index
.
tableIndex
);
insertResultField
(
pQueryInfo
,
exprIndex
,
&
columnList
,
sizeof
(
double
),
TSDB_DATA_TYPE_DOUBLE
,
pExpr
->
aliasName
,
pExpr
);
...
...
@@ -1237,7 +1237,7 @@ int32_t parseSelectClause(SSqlCmd* pCmd, int32_t clauseIndex, tSQLExprList* pSel
}
for
(
int32_t
i
=
0
;
i
<
pSelection
->
nExpr
;
++
i
)
{
int32_t
outputIndex
=
tscSqlExprNumOfExprs
(
pQueryInfo
);
int32_t
outputIndex
=
(
int32_t
)
tscSqlExprNumOfExprs
(
pQueryInfo
);
tSQLExprItem
*
pItem
=
&
pSelection
->
a
[
i
];
// project on all fields
...
...
@@ -3144,7 +3144,7 @@ static int32_t arithmeticExprToString(tSQLExpr* pExpr, char** str) {
int32_t
code
=
doArithmeticExprToString
(
pExpr
,
str
);
if
(
code
==
TSDB_CODE_SUCCESS
)
{
// remove out the parenthesis
int32_t
len
=
strlen
(
start
);
int32_t
len
=
(
int32_t
)
strlen
(
start
);
memmove
(
start
,
start
+
1
,
len
-
2
);
start
[
len
-
2
]
=
0
;
}
...
...
src/client/src/tscSql.c
浏览文件 @
d4f39548
...
...
@@ -263,7 +263,7 @@ TAOS_RES* taos_query_c(TAOS *taos, const char *sqlstr, uint32_t sqlLen) {
}
TAOS_RES
*
taos_query
(
TAOS
*
taos
,
const
char
*
sqlstr
)
{
return
taos_query_c
(
taos
,
sqlstr
,
strlen
(
sqlstr
));
return
taos_query_c
(
taos
,
sqlstr
,
(
uint32_t
)
strlen
(
sqlstr
));
}
int
taos_result_precision
(
TAOS_RES
*
res
)
{
...
...
src/client/src/tscSubquery.c
浏览文件 @
d4f39548
...
...
@@ -1027,7 +1027,7 @@ void tscSetupOutputColumnIndex(SSqlObj* pSql) {
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfoDetail
(
pCmd
,
pCmd
->
clauseIndex
);
int32_t
numOfExprs
=
tscSqlExprNumOfExprs
(
pQueryInfo
);
int32_t
numOfExprs
=
(
int32_t
)
tscSqlExprNumOfExprs
(
pQueryInfo
);
pRes
->
pColumnIndex
=
calloc
(
1
,
sizeof
(
SColumnIndex
)
*
numOfExprs
);
for
(
int32_t
i
=
0
;
i
<
numOfExprs
;
++
i
)
{
...
...
src/client/src/tscUtil.c
浏览文件 @
d4f39548
...
...
@@ -1683,7 +1683,7 @@ SSqlObj* createSimpleSubObj(SSqlObj* pSql, void (*fp)(), void* param, int32_t cm
// current sql function is not direct output result, so create a dummy output field
static
void
doSetNewFieldInfo
(
SQueryInfo
*
pNewQueryInfo
,
SSqlExpr
*
pExpr
)
{
TAOS_FIELD
f
=
{.
type
=
pExpr
->
resType
,
.
bytes
=
pExpr
->
resBytes
};
TAOS_FIELD
f
=
{.
type
=
(
uint8_t
)
pExpr
->
resType
,
.
bytes
=
pExpr
->
resBytes
};
tstrncpy
(
f
.
name
,
pExpr
->
aliasName
,
sizeof
(
f
.
name
));
SFieldSupInfo
*
pInfo1
=
tscFieldInfoAppend
(
&
pNewQueryInfo
->
fieldsInfo
,
&
f
);
...
...
@@ -1693,7 +1693,7 @@ static void doSetNewFieldInfo(SQueryInfo* pNewQueryInfo, SSqlExpr* pExpr) {
}
static
void
doSetSqlExprAndResultFieldInfo
(
SQueryInfo
*
pQueryInfo
,
SQueryInfo
*
pNewQueryInfo
,
int64_t
uid
)
{
int32_t
numOfOutput
=
tscSqlExprNumOfExprs
(
pNewQueryInfo
);
int32_t
numOfOutput
=
(
int32_t
)
tscSqlExprNumOfExprs
(
pNewQueryInfo
);
if
(
numOfOutput
==
0
)
{
return
;
}
...
...
@@ -2044,7 +2044,7 @@ bool hasMoreVnodesToTry(SSqlObj* pSql) {
int32_t
numOfVgroups
=
pTableMetaInfo
->
vgroupList
->
numOfVgroups
;
if
(
pTableMetaInfo
->
pVgroupTables
!=
NULL
)
{
numOfVgroups
=
taosArrayGetSize
(
pTableMetaInfo
->
pVgroupTables
);
numOfVgroups
=
(
int32_t
)
taosArrayGetSize
(
pTableMetaInfo
->
pVgroupTables
);
}
return
tscNonOrderedProjectionQueryOnSTable
(
pQueryInfo
,
0
)
&&
...
...
@@ -2249,6 +2249,6 @@ bool tscSetSqlOwner(SSqlObj* pSql) {
}
void
tscClearSqlOwner
(
SSqlObj
*
pSql
)
{
assert
(
pSql
->
owner
!=
0
);
assert
(
taosCheckPthreadValid
(
pSql
->
owner
)
);
atomic_store_64
(
&
pSql
->
owner
,
0
);
}
\ No newline at end of file
src/query/src/qExecutor.c
浏览文件 @
d4f39548
...
...
@@ -405,9 +405,9 @@ static SWindowResult *doSetTimeWindowFromKey(SQueryRuntimeEnv *pRuntimeEnv, SWin
if
(
pWindowResInfo
->
size
>=
pWindowResInfo
->
capacity
)
{
int64_t
newCap
=
0
;
if
(
pWindowResInfo
->
capacity
>
10000
)
{
newCap
=
pWindowResInfo
->
capacity
*
1
.
25
;
newCap
=
(
int64_t
)(
pWindowResInfo
->
capacity
*
1
.
25
)
;
}
else
{
newCap
=
pWindowResInfo
->
capacity
*
1
.
5
;
newCap
=
(
int64_t
)(
pWindowResInfo
->
capacity
*
1
.
5
)
;
}
char
*
t
=
realloc
(
pWindowResInfo
->
pResult
,
newCap
*
sizeof
(
SWindowResult
));
...
...
@@ -2725,7 +2725,7 @@ void copyResToQueryResultBuf(SQInfo *pQInfo, SQuery *pQuery) {
memcpy
(
pDest
+
offset
*
bytes
,
pData
->
data
+
pRuntimeEnv
->
offset
[
i
]
*
pData
->
num
,
bytes
*
pData
->
num
);
}
offset
+=
pData
->
num
;
offset
+=
(
int32_t
)
pData
->
num
;
}
assert
(
pQuery
->
rec
.
rows
==
0
);
...
...
@@ -3051,7 +3051,7 @@ void disableFuncInReverseScan(SQInfo *pQInfo) {
static
void
setupQueryRangeForReverseScan
(
SQInfo
*
pQInfo
)
{
SQuery
*
pQuery
=
pQInfo
->
runtimeEnv
.
pQuery
;
int32_t
numOfGroups
=
GET_NUM_OF_TABLEGROUP
(
pQInfo
);
int32_t
numOfGroups
=
(
int32_t
)(
GET_NUM_OF_TABLEGROUP
(
pQInfo
)
);
for
(
int32_t
i
=
0
;
i
<
numOfGroups
;
++
i
)
{
SArray
*
group
=
GET_TABLEGROUP
(
pQInfo
,
i
);
...
...
@@ -6379,7 +6379,7 @@ static bool doBuildResCheck(SQInfo* pQInfo) {
// clear qhandle owner
assert
(
pQInfo
->
owner
==
pthread_self
());
pQInfo
->
owner
=
0
;
taosResetPthread
(
&
pQInfo
->
owner
)
;
return
buildRes
;
}
...
...
@@ -6549,7 +6549,7 @@ int32_t qKillQuery(qinfo_t qinfo) {
// Wait for the query executing thread being stopped/
// Once the query is stopped, the owner of qHandle will be cleared immediately.
while
(
pQInfo
->
owner
!=
0
)
{
while
(
taosCheckPthreadValid
(
pQInfo
->
owner
)
)
{
taosMsleep
(
100
);
}
...
...
src/query/src/qResultbuf.c
浏览文件 @
d4f39548
...
...
@@ -6,7 +6,7 @@
#include "queryLog.h"
#include "taoserror.h"
#define GET_DATA_PAYLOAD(_p) ((_p)->pData + POINTER_BYTES)
#define GET_DATA_PAYLOAD(_p) ((
char *)(
_p)->pData + POINTER_BYTES)
#define NO_IN_MEM_AVAILABLE_PAGES(_b) (listNEles((_b)->lruList) >= (_b)->inMemPages)
int32_t
createDiskbasedResultBuffer
(
SDiskbasedResultBuf
**
pResultBuf
,
int32_t
rowSize
,
int32_t
pagesize
,
...
...
@@ -248,7 +248,7 @@ static char* evicOneDataPage(SDiskbasedResultBuf* pResultBuf) {
int32_t
prev
=
pResultBuf
->
inMemPages
;
// increase by 50% of previous mem pages
pResultBuf
->
inMemPages
=
pResultBuf
->
inMemPages
*
1
.
5
f
;
pResultBuf
->
inMemPages
=
(
int32_t
)(
pResultBuf
->
inMemPages
*
1
.
5
f
)
;
qWarn
(
"%p in memory buf page not sufficient, expand from %d to %d, page size:%d"
,
pResultBuf
,
prev
,
pResultBuf
->
inMemPages
,
pResultBuf
->
pageSize
);
...
...
@@ -313,7 +313,7 @@ tFilePage* getNewDataBuf(SDiskbasedResultBuf* pResultBuf, int32_t groupId, int32
((
void
**
)
pi
->
pData
)[
0
]
=
pi
;
pi
->
used
=
true
;
return
GET_DATA_PAYLOAD
(
pi
);
return
(
void
*
)(
GET_DATA_PAYLOAD
(
pi
)
);
}
tFilePage
*
getResBufPage
(
SDiskbasedResultBuf
*
pResultBuf
,
int32_t
id
)
{
...
...
@@ -327,7 +327,7 @@ tFilePage* getResBufPage(SDiskbasedResultBuf* pResultBuf, int32_t id) {
// no need to update the LRU list if only one page exists
if
(
pResultBuf
->
numOfPages
==
1
)
{
(
*
pi
)
->
used
=
true
;
return
GET_DATA_PAYLOAD
(
*
pi
);
return
(
void
*
)(
GET_DATA_PAYLOAD
(
*
pi
)
);
}
SPageInfo
**
pInfo
=
(
SPageInfo
**
)
((
*
pi
)
->
pn
->
data
);
...
...
@@ -336,7 +336,7 @@ tFilePage* getResBufPage(SDiskbasedResultBuf* pResultBuf, int32_t id) {
lruListMoveToFront
(
pResultBuf
->
lruList
,
(
*
pi
));
(
*
pi
)
->
used
=
true
;
return
GET_DATA_PAYLOAD
(
*
pi
);
return
(
void
*
)(
GET_DATA_PAYLOAD
(
*
pi
)
);
}
else
{
// not in memory
assert
((
*
pi
)
->
pData
==
NULL
&&
(
*
pi
)
->
pn
==
NULL
&&
(
*
pi
)
->
info
.
length
>=
0
&&
(
*
pi
)
->
info
.
offset
>=
0
);
...
...
@@ -358,7 +358,7 @@ tFilePage* getResBufPage(SDiskbasedResultBuf* pResultBuf, int32_t id) {
(
*
pi
)
->
used
=
true
;
loadPageFromDisk
(
pResultBuf
,
*
pi
);
return
GET_DATA_PAYLOAD
(
*
pi
);
return
(
void
*
)(
GET_DATA_PAYLOAD
(
*
pi
)
);
}
}
...
...
src/tsdb/src/tsdbRead.c
浏览文件 @
d4f39548
...
...
@@ -245,9 +245,9 @@ TsdbQueryHandleT* tsdbQueryTables(TSDB_REPO_T* tsdb, STsdbQueryCond* pCond, STab
STableCheckInfo
info
=
{
.
lastKey
=
pKeyInfo
->
lastKey
,
.
tableId
=
((
STable
*
)(
pKeyInfo
->
pTable
))
->
tableId
,
.
pTableObj
=
pKeyInfo
->
pTable
,
};
info
.
tableId
=
((
STable
*
)(
pKeyInfo
->
pTable
))
->
tableId
;
assert
(
info
.
pTableObj
!=
NULL
&&
(
info
.
pTableObj
->
type
==
TSDB_NORMAL_TABLE
||
info
.
pTableObj
->
type
==
TSDB_CHILD_TABLE
||
info
.
pTableObj
->
type
==
TSDB_STREAM_TABLE
));
...
...
src/util/src/hash.c
浏览文件 @
d4f39548
...
...
@@ -167,7 +167,7 @@ SHashObj *taosHashInit(size_t capacity, _hash_fn_t fn, bool update, SHashLockTyp
void
*
p
=
calloc
(
pHashObj
->
capacity
,
sizeof
(
SHashEntry
));
for
(
int32_t
i
=
0
;
i
<
pHashObj
->
capacity
;
++
i
)
{
pHashObj
->
hashList
[
i
]
=
p
+
i
*
sizeof
(
SHashEntry
);
pHashObj
->
hashList
[
i
]
=
(
void
*
)((
char
*
)
p
+
i
*
sizeof
(
SHashEntry
)
);
}
taosArrayPush
(
pHashObj
->
pMemBlock
,
&
p
);
...
...
@@ -179,7 +179,7 @@ SHashObj *taosHashInit(size_t capacity, _hash_fn_t fn, bool update, SHashLockTyp
size_t
taosHashGetSize
(
const
SHashObj
*
pHashObj
)
{
return
(
pHashObj
==
NULL
)
?
0
:
pHashObj
->
size
;
}
int32_t
taosHashPut
(
SHashObj
*
pHashObj
,
const
void
*
key
,
size_t
keyLen
,
void
*
data
,
size_t
size
)
{
uint32_t
hashVal
=
(
*
pHashObj
->
hashFp
)(
key
,
keyLen
);
uint32_t
hashVal
=
(
*
pHashObj
->
hashFp
)(
key
,
(
uint32_t
)
keyLen
);
SHashNode
*
pNewNode
=
doCreateHashNode
(
key
,
keyLen
,
data
,
size
,
hashVal
);
if
(
pNewNode
==
NULL
)
{
return
-
1
;
...
...
@@ -263,7 +263,7 @@ void *taosHashGetCB(SHashObj *pHashObj, const void *key, size_t keyLen, void (*f
return
NULL
;
}
uint32_t
hashVal
=
(
*
pHashObj
->
hashFp
)(
key
,
keyLen
);
uint32_t
hashVal
=
(
*
pHashObj
->
hashFp
)(
key
,
(
uint32_t
)
keyLen
);
// only add the read lock to disable the resize process
__rd_lock
(
&
pHashObj
->
lock
,
pHashObj
->
type
);
...
...
@@ -317,7 +317,7 @@ int32_t taosHashRemoveWithData(SHashObj *pHashObj, const void *key, size_t keyLe
return
-
1
;
}
uint32_t
hashVal
=
(
*
pHashObj
->
hashFp
)(
key
,
keyLen
);
uint32_t
hashVal
=
(
*
pHashObj
->
hashFp
)(
key
,
(
uint32_t
)
keyLen
);
// disable the resize process
__rd_lock
(
&
pHashObj
->
lock
,
pHashObj
->
type
);
...
...
@@ -418,7 +418,7 @@ int32_t taosHashCondTraverse(SHashObj *pHashObj, bool (*fp)(void *, void *), voi
// disable the resize process
__rd_lock
(
&
pHashObj
->
lock
,
pHashObj
->
type
);
int32_t
numOfEntries
=
pHashObj
->
capacity
;
int32_t
numOfEntries
=
(
int32_t
)
pHashObj
->
capacity
;
for
(
int32_t
i
=
0
;
i
<
numOfEntries
;
++
i
)
{
SHashEntry
*
pEntry
=
pHashObj
->
hashList
[
i
];
if
(
pEntry
->
num
==
0
)
{
...
...
@@ -649,7 +649,7 @@ void taosHashTableResize(SHashObj *pHashObj) {
SHashNode
*
pNode
=
NULL
;
SHashNode
*
pNext
=
NULL
;
int32_t
newSize
=
pHashObj
->
capacity
<<
1u
;
int32_t
newSize
=
(
int32_t
)(
pHashObj
->
capacity
<<
1u
)
;
if
(
newSize
>
HASH_MAX_CAPACITY
)
{
// uDebug("current capacity:%d, maximum capacity:%d, no resize applied due to limitation is reached",
// pHashObj->capacity, HASH_MAX_CAPACITY);
...
...
@@ -669,7 +669,7 @@ void taosHashTableResize(SHashObj *pHashObj) {
void
*
p
=
calloc
(
inc
,
sizeof
(
SHashEntry
));
for
(
int32_t
i
=
0
;
i
<
inc
;
++
i
)
{
pHashObj
->
hashList
[
i
+
pHashObj
->
capacity
]
=
p
+
i
*
sizeof
(
SHashEntry
);
pHashObj
->
hashList
[
i
+
pHashObj
->
capacity
]
=
(
void
*
)((
char
*
)
p
+
i
*
sizeof
(
SHashEntry
)
);
}
taosArrayPush
(
pHashObj
->
pMemBlock
,
&
p
);
...
...
@@ -762,7 +762,7 @@ SHashNode *doCreateHashNode(const void *key, size_t keyLen, const void *pData, s
pNewNode
->
key
=
pNewNode
->
data
+
dsize
;
memcpy
(
pNewNode
->
key
,
key
,
keyLen
);
pNewNode
->
keyLen
=
keyLen
;
pNewNode
->
keyLen
=
(
uint32_t
)
keyLen
;
pNewNode
->
hashVal
=
hashVal
;
return
pNewNode
;
}
...
...
src/util/src/tcache.c
浏览文件 @
d4f39548
...
...
@@ -95,7 +95,7 @@ static FORCE_INLINE void taosCacheReleaseNode(SCacheObj *pCacheObj, SCacheDataNo
}
pCacheObj
->
totalSize
-=
pNode
->
size
;
int32_t
size
=
taosHashGetSize
(
pCacheObj
->
pHashTable
);
int32_t
size
=
(
int32_t
)
taosHashGetSize
(
pCacheObj
->
pHashTable
);
assert
(
size
>
0
);
uDebug
(
"cache:%s, key:%p, %p is destroyed from cache, size:%dbytes, num:%d size:%"
PRId64
"bytes"
,
...
...
@@ -388,7 +388,7 @@ void taosCacheRelease(SCacheObj *pCacheObj, void **data, bool _remove) {
}
else
{
// ref == 0
atomic_sub_fetch_64
(
&
pCacheObj
->
totalSize
,
pNode
->
size
);
int32_t
size
=
taosHashGetSize
(
pCacheObj
->
pHashTable
);
int32_t
size
=
(
int32_t
)
taosHashGetSize
(
pCacheObj
->
pHashTable
);
uDebug
(
"cache:%s, key:%p, %p is destroyed from cache, size:%dbytes, num:%d size:%"
PRId64
"bytes"
,
pCacheObj
->
name
,
pNode
->
key
,
pNode
->
data
,
pNode
->
size
,
size
,
pCacheObj
->
totalSize
);
...
...
@@ -560,7 +560,7 @@ bool travHashTableFn(void* param, void* data) {
SCacheObj
*
pCacheObj
=
ps
->
pCacheObj
;
SCacheDataNode
*
pNode
=
*
(
SCacheDataNode
**
)
data
;
if
(
pNode
->
expireTime
<
ps
->
time
&&
T_REF_VAL_GET
(
pNode
)
<=
0
)
{
if
(
(
int64_t
)
pNode
->
expireTime
<
ps
->
time
&&
T_REF_VAL_GET
(
pNode
)
<=
0
)
{
taosCacheReleaseNode
(
pCacheObj
,
pNode
);
// this node should be remove from hash table
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录