Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
f9241ef1
T
TDengine
项目概览
taosdata
/
TDengine
大约 1 年 前同步成功
通知
1185
Star
22015
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看板
体验新版 GitCode,发现更多精彩内容 >>
提交
f9241ef1
编写于
3月 19, 2020
作者:
H
hjxilinx
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[TD-32] refactor the table meta
上级
5d4f826b
变更
10
显示空白变更内容
内联
并排
Showing
10 changed file
with
40 addition
and
63 deletion
+40
-63
src/client/inc/tschemautil.h
src/client/inc/tschemautil.h
+1
-1
src/client/inc/tsclient.h
src/client/inc/tsclient.h
+13
-32
src/client/src/tscFunctionImpl.c
src/client/src/tscFunctionImpl.c
+0
-4
src/client/src/tscParseInsert.c
src/client/src/tscParseInsert.c
+5
-5
src/client/src/tscSQLParser.c
src/client/src/tscSQLParser.c
+6
-6
src/client/src/tscSchemaUtil.c
src/client/src/tscSchemaUtil.c
+5
-5
src/client/src/tscSecondaryMerge.c
src/client/src/tscSecondaryMerge.c
+6
-6
src/client/src/tscServer.c
src/client/src/tscServer.c
+2
-2
src/client/src/tscStream.c
src/client/src/tscStream.c
+1
-1
src/client/src/tscUtil.c
src/client/src/tscUtil.c
+1
-1
未找到文件。
src/client/inc/tschemautil.h
浏览文件 @
f9241ef1
...
...
@@ -47,7 +47,7 @@ int32_t tscGetNumOfColumns(const STableMeta* pTableMeta);
* @param pTableMeta
* @return
*/
STableInfo
tscGetTableInfo
(
const
STableMeta
*
pTableMeta
);
STable
Com
Info
tscGetTableInfo
(
const
STableMeta
*
pTableMeta
);
/**
* get the schema
...
...
src/client/inc/tsclient.h
浏览文件 @
f9241ef1
...
...
@@ -47,47 +47,28 @@ typedef struct SSqlGroupbyExpr {
int16_t
orderType
;
// order by type: asc/desc
}
SSqlGroupbyExpr
;
typedef
struct
STableInfo
{
typedef
struct
STable
Com
Info
{
uint8_t
numOfTags
;
uint8_t
precision
;
int16_t
numOfColumns
;
int16_t
rowSize
;
}
STableInfo
;
}
STable
Com
Info
;
typedef
struct
STableMeta
{
char
*
tableId
;
// null-terminated string
union
{
// pointer to super table if it is created according to super table
struct
STableMeta
*
pSTable
;
// otherwise, the following information is required.
STableInfo
tableInfo
;
};
//super table if it is created according to super table, otherwise, tableInfo is used
union
{
struct
STableMeta
*
pSTable
;
STableComInfo
tableInfo
;
};
uint8_t
tableType
;
int16_t
sversion
;
int8_t
numOfVpeers
;
int16_t
sversion
;
SVnodeDesc
vpeerDesc
[
TSDB_VNODES_SUPPORT
];
int32_t
vgid
;
int32_t
sid
;
uint64_t
uid
;
// if the table is TSDB_CHILD_TABLE, schema is acquired by super table meta info
SSchema
schema
[];
int32_t
vgid
;
// virtual group id, which current table belongs to
int32_t
sid
;
// the index of one table in a virtual node
uint64_t
uid
;
// unique id of a table
SSchema
schema
[];
// if the table is TSDB_CHILD_TABLE, schema is acquired by super table meta info
}
STableMeta
;
typedef
struct
SSTableMeta
{
char
*
tableId
;
STableInfo
tableInfo
;
int32_t
sid
;
int32_t
vgid
;
uint64_t
uid
;
SSchema
schema
[];
}
SSTableMeta
;
typedef
struct
STableMetaInfo
{
STableMeta
*
pTableMeta
;
// table meta
info
STableMeta
*
pTableMeta
;
// table meta
, cached in client side and acquried by name
SSuperTableMeta
*
pMetricMeta
;
// metricmeta
/*
...
...
@@ -95,7 +76,7 @@ typedef struct STableMetaInfo {
* 2. keep the vnode index for multi-vnode insertion
*/
int32_t
vnodeIndex
;
char
name
[
TSDB_TABLE_ID_LEN
+
1
];
// (super) table name
char
name
[
TSDB_TABLE_ID_LEN
];
// (super) table name
int16_t
numOfTags
;
// total required tags in query, including groupby tags
int16_t
tagColumnIndex
[
TSDB_MAX_TAGS
];
// clause + tag projection
}
STableMetaInfo
;
...
...
src/client/src/tscFunctionImpl.c
浏览文件 @
f9241ef1
...
...
@@ -4601,12 +4601,8 @@ static void rate_func_merge(SQLFunctionCtx *pCtx) {
if
(
numOfNotNull
>
0
)
{
pBuf
->
hasResult
=
DATA_SET_FLAG
;
}
return
;
}
static
void
rate_func_copy
(
SQLFunctionCtx
*
pCtx
)
{
assert
(
pCtx
->
inputType
==
TSDB_DATA_TYPE_BINARY
);
...
...
src/client/src/tscParseInsert.c
浏览文件 @
f9241ef1
...
...
@@ -504,7 +504,7 @@ int tsParseValues(char **str, STableDataBlocks *pDataBlock, STableMeta *pTableMe
int16_t
numOfRows
=
0
;
SSchema
*
pSchema
=
tscGetTableSchema
(
pTableMeta
);
STableInfo
tinfo
=
tscGetTableInfo
(
pTableMeta
);
STable
Com
Info
tinfo
=
tscGetTableInfo
(
pTableMeta
);
int32_t
precision
=
tinfo
.
precision
;
...
...
@@ -658,7 +658,7 @@ static int32_t doParseInsertStatement(SSqlObj *pSql, void *pTableHashList, char
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
STableMetaInfo
*
pTableMetaInfo
=
tscGetTableMetaInfoFromCmd
(
pCmd
,
pCmd
->
clauseIndex
,
0
);
STableMeta
*
pTableMeta
=
pTableMetaInfo
->
pTableMeta
;
STableInfo
tinfo
=
tscGetTableInfo
(
pTableMeta
);
STable
Com
Info
tinfo
=
tscGetTableInfo
(
pTableMeta
);
STableDataBlocks
*
dataBuf
=
NULL
;
int32_t
ret
=
tscGetDataBlockFromList
(
pTableHashList
,
pCmd
->
pDataBlocks
,
pTableMeta
->
uid
,
TSDB_DEFAULT_PAYLOAD_SIZE
,
...
...
@@ -790,7 +790,7 @@ static int32_t tscCheckIfCreateTable(char **sqlstr, SSqlObj *pSql) {
}
SSchema
*
pTagSchema
=
tscGetTableTagSchema
(
pSTableMeterMetaInfo
->
pTableMeta
);
STableInfo
tinfo
=
tscGetTableInfo
(
pSTableMeterMetaInfo
->
pTableMeta
);
STable
Com
Info
tinfo
=
tscGetTableInfo
(
pSTableMeterMetaInfo
->
pTableMeta
);
index
=
0
;
sToken
=
tStrGetToken
(
sql
,
&
index
,
false
,
0
,
NULL
);
...
...
@@ -1096,7 +1096,7 @@ int doParseInsertSql(SSqlObj *pSql, char *str) {
}
int32_t
numOfCols
=
tscGetNumOfTags
(
pTableMetaInfo
->
pTableMeta
);
STableInfo
tinfo
=
tscGetTableInfo
(
pTableMetaInfo
->
pTableMeta
);
STable
Com
Info
tinfo
=
tscGetTableInfo
(
pTableMetaInfo
->
pTableMeta
);
if
(
sToken
.
type
==
TK_VALUES
)
{
SParsedDataColInfo
spd
=
{.
numOfCols
=
numOfCols
};
...
...
@@ -1390,7 +1390,7 @@ static int tscInsertDataFromFile(SSqlObj *pSql, FILE *fp, char *tmpTokenBuf) {
STableMetaInfo
*
pTableMetaInfo
=
tscGetTableMetaInfoFromCmd
(
pCmd
,
pCmd
->
clauseIndex
,
0
);
STableMeta
*
pTableMeta
=
pTableMetaInfo
->
pTableMeta
;
STableInfo
tinfo
=
tscGetTableInfo
(
pTableMeta
);
STable
Com
Info
tinfo
=
tscGetTableInfo
(
pTableMeta
);
assert
(
pCmd
->
numOfClause
==
1
);
...
...
src/client/src/tscSQLParser.c
浏览文件 @
f9241ef1
...
...
@@ -153,7 +153,7 @@ static int setColumnFilterInfoForTimestamp(SQueryInfo* pQueryInfo, tVariant* pVa
char
*
seg
=
strnchr
(
pVar
->
pz
,
'-'
,
pVar
->
nLen
,
false
);
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
STableInfo
tinfo
=
tscGetTableInfo
(
pTableMetaInfo
->
pTableMeta
);
STable
Com
Info
tinfo
=
tscGetTableInfo
(
pTableMetaInfo
->
pTableMeta
);
if
(
seg
!=
NULL
)
{
if
(
taosParseTime
(
pVar
->
pz
,
&
time
,
pVar
->
nLen
,
tinfo
.
precision
)
!=
TSDB_CODE_SUCCESS
)
{
...
...
@@ -590,7 +590,7 @@ int32_t parseIntervalClause(SQueryInfo* pQueryInfo, SQuerySQL* pQuerySql) {
const
char
*
msg2
=
"interval cannot be less than 10 ms"
;
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
STableInfo
tinfo
=
tscGetTableInfo
(
pTableMetaInfo
->
pTableMeta
);
STable
Com
Info
tinfo
=
tscGetTableInfo
(
pTableMetaInfo
->
pTableMeta
);
if
(
pQuerySql
->
interval
.
type
==
0
||
pQuerySql
->
interval
.
n
==
0
)
{
return
TSDB_CODE_SUCCESS
;
...
...
@@ -683,7 +683,7 @@ int32_t parseSlidingClause(SQueryInfo* pQueryInfo, SQuerySQL* pQuerySql) {
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
SSQLToken
*
pSliding
=
&
pQuerySql
->
sliding
;
STableInfo
tinfo
=
tscGetTableInfo
(
pTableMetaInfo
->
pTableMeta
);
STable
Com
Info
tinfo
=
tscGetTableInfo
(
pTableMetaInfo
->
pTableMeta
);
if
(
pSliding
->
n
!=
0
)
{
getTimestampInUsFromStr
(
pSliding
->
z
,
pSliding
->
n
,
&
pQueryInfo
->
slidingTime
);
...
...
@@ -1380,7 +1380,7 @@ static int32_t doAddProjectionExprAndResultFields(SQueryInfo* pQueryInfo, SColum
STableMeta
*
pTableMeta
=
pTableMetaInfo
->
pTableMeta
;
SSchema
*
pSchema
=
tscGetTableSchema
(
pTableMeta
);
STableInfo
tinfo
=
tscGetTableInfo
(
pTableMeta
);
STable
Com
Info
tinfo
=
tscGetTableInfo
(
pTableMeta
);
if
(
UTIL_METER_IS_SUPERTABLE
(
pTableMetaInfo
))
{
numOfTotalColumns
=
tinfo
.
numOfColumns
+
tinfo
.
numOfTags
;
...
...
@@ -3621,7 +3621,7 @@ static int32_t getTimeRangeFromExpr(SQueryInfo* pQueryInfo, tSQLExpr* pExpr) {
}
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
index
.
tableIndex
);
STableInfo
tinfo
=
tscGetTableInfo
(
pTableMetaInfo
->
pTableMeta
);
STable
Com
Info
tinfo
=
tscGetTableInfo
(
pTableMetaInfo
->
pTableMeta
);
tSQLExpr
*
pRight
=
pExpr
->
pRight
;
...
...
@@ -5708,7 +5708,7 @@ int32_t doCheckForQuery(SSqlObj* pSql, SQuerySQL* pQuerySql, int32_t index) {
}
// set where info
STableInfo
tinfo
=
tscGetTableInfo
(
pTableMetaInfo
->
pTableMeta
);
STable
Com
Info
tinfo
=
tscGetTableInfo
(
pTableMetaInfo
->
pTableMeta
);
if
(
pQuerySql
->
pWhere
!=
NULL
)
{
if
(
parseWhereClause
(
pQueryInfo
,
&
pQuerySql
->
pWhere
,
pSql
)
!=
TSDB_CODE_SUCCESS
)
{
...
...
src/client/src/tscSchemaUtil.c
浏览文件 @
f9241ef1
...
...
@@ -24,7 +24,7 @@
int32_t
tscGetNumOfTags
(
const
STableMeta
*
pTableMeta
)
{
assert
(
pTableMeta
!=
NULL
);
STableInfo
tinfo
=
tscGetTableInfo
(
pTableMeta
);
STable
Com
Info
tinfo
=
tscGetTableInfo
(
pTableMeta
);
if
(
pTableMeta
->
tableType
==
TSDB_NORMAL_TABLE
)
{
assert
(
tinfo
.
numOfTags
==
0
);
...
...
@@ -44,7 +44,7 @@ int32_t tscGetNumOfColumns(const STableMeta* pTableMeta) {
assert
(
pTableMeta
!=
NULL
);
// table created according to super table, use data from super table
STableInfo
tinfo
=
tscGetTableInfo
(
pTableMeta
);
STable
Com
Info
tinfo
=
tscGetTableInfo
(
pTableMeta
);
return
tinfo
.
numOfColumns
;
}
...
...
@@ -64,13 +64,13 @@ SSchema *tscGetTableSchema(const STableMeta *pTableMeta) {
SSchema
*
tscGetTableTagSchema
(
const
STableMeta
*
pTableMeta
)
{
assert
(
pTableMeta
!=
NULL
&&
(
pTableMeta
->
tableType
==
TSDB_SUPER_TABLE
||
pTableMeta
->
tableType
==
TSDB_CHILD_TABLE
));
STableInfo
tinfo
=
tscGetTableInfo
(
pTableMeta
);
STable
Com
Info
tinfo
=
tscGetTableInfo
(
pTableMeta
);
assert
(
tinfo
.
numOfTags
>
0
);
return
tscGetTableColumnSchema
(
pTableMeta
,
tinfo
.
numOfColumns
);
}
STableInfo
tscGetTableInfo
(
const
STableMeta
*
pTableMeta
)
{
STable
Com
Info
tscGetTableInfo
(
const
STableMeta
*
pTableMeta
)
{
assert
(
pTableMeta
!=
NULL
);
if
(
pTableMeta
->
tableType
==
TSDB_CHILD_TABLE
)
{
...
...
@@ -156,7 +156,7 @@ STableMeta* tscCreateTableMetaFromMsg(STableMetaMsg* pTableMetaMsg, size_t* size
int32_t
schemaSize
=
(
pTableMetaMsg
->
numOfColumns
+
pTableMetaMsg
->
numOfTags
)
*
sizeof
(
SSchema
);
STableMeta
*
pTableMeta
=
calloc
(
1
,
sizeof
(
STableMeta
)
+
schemaSize
);
pTableMeta
->
tableType
=
pTableMetaMsg
->
tableType
;
pTableMeta
->
tableInfo
=
(
STableInfo
){.
numOfTags
=
pTableMetaMsg
->
numOfTags
,
.
numOfColumns
=
pTableMetaMsg
->
numOfColumns
,
pTableMeta
->
tableInfo
=
(
STable
Com
Info
){.
numOfTags
=
pTableMetaMsg
->
numOfTags
,
.
numOfColumns
=
pTableMetaMsg
->
numOfColumns
,
.
precision
=
pTableMetaMsg
->
precision
};
pTableMeta
->
sid
=
pTableMetaMsg
->
sid
;
pTableMeta
->
uid
=
pTableMetaMsg
->
uid
;
...
...
src/client/src/tscSecondaryMerge.c
浏览文件 @
f9241ef1
...
...
@@ -320,7 +320,7 @@ void tscCreateLocalReducer(tExtMemBuffer **pMemBuffer, int32_t numOfBuffer, tOrd
pRes
->
numOfGroups
=
0
;
STableMetaInfo
*
pTableMetaInfo
=
tscGetTableMetaInfoFromCmd
(
pCmd
,
pCmd
->
clauseIndex
,
0
);
STableInfo
tinfo
=
tscGetTableInfo
(
pTableMetaInfo
->
pTableMeta
);
STable
Com
Info
tinfo
=
tscGetTableInfo
(
pTableMetaInfo
->
pTableMeta
);
int16_t
prec
=
tinfo
.
precision
;
int64_t
stime
=
(
pQueryInfo
->
stime
<
pQueryInfo
->
etime
)
?
pQueryInfo
->
stime
:
pQueryInfo
->
etime
;
...
...
@@ -777,7 +777,7 @@ void savePrevRecordAndSetupInterpoInfo(SLocalReducer *pLocalReducer, SQueryInfo
// discard following dataset in the same group and reset the interpolation information
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
STableInfo
tinfo
=
tscGetTableInfo
(
pTableMetaInfo
->
pTableMeta
);
STable
Com
Info
tinfo
=
tscGetTableInfo
(
pTableMetaInfo
->
pTableMeta
);
int16_t
prec
=
tinfo
.
precision
;
int64_t
stime
=
(
pQueryInfo
->
stime
<
pQueryInfo
->
etime
)
?
pQueryInfo
->
stime
:
pQueryInfo
->
etime
;
...
...
@@ -921,7 +921,7 @@ static void doInterpolateResult(SSqlObj *pSql, SLocalReducer *pLocalReducer, boo
}
STableMetaInfo
*
pTableMetaInfo
=
tscGetTableMetaInfoFromCmd
(
pCmd
,
pCmd
->
clauseIndex
,
0
);
STableInfo
tinfo
=
tscGetTableInfo
(
pTableMetaInfo
->
pTableMeta
);
STable
Com
Info
tinfo
=
tscGetTableInfo
(
pTableMetaInfo
->
pTableMeta
);
int8_t
precision
=
tinfo
.
precision
;
...
...
@@ -1274,7 +1274,7 @@ static void resetEnvForNewResultset(SSqlRes *pRes, SSqlCmd *pCmd, SLocalReducer
pQueryInfo
->
limit
.
offset
=
pLocalReducer
->
offset
;
STableMetaInfo
*
pTableMetaInfo
=
tscGetTableMetaInfoFromCmd
(
pCmd
,
pCmd
->
clauseIndex
,
0
);
STableInfo
tinfo
=
tscGetTableInfo
(
pTableMetaInfo
->
pTableMeta
);
STable
Com
Info
tinfo
=
tscGetTableInfo
(
pTableMetaInfo
->
pTableMeta
);
int8_t
precision
=
tinfo
.
precision
;
...
...
@@ -1302,7 +1302,7 @@ static bool doInterpolationForCurrentGroup(SSqlObj *pSql) {
SInterpolationInfo
*
pInterpoInfo
=
&
pLocalReducer
->
interpolationInfo
;
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
STableInfo
tinfo
=
tscGetTableInfo
(
pTableMetaInfo
->
pTableMeta
);
STable
Com
Info
tinfo
=
tscGetTableInfo
(
pTableMetaInfo
->
pTableMeta
);
int8_t
p
=
tinfo
.
precision
;
...
...
@@ -1339,7 +1339,7 @@ static bool doHandleLastRemainData(SSqlObj *pSql) {
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfoDetail
(
pCmd
,
pCmd
->
clauseIndex
);
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
STableInfo
tinfo
=
tscGetTableInfo
(
pTableMetaInfo
->
pTableMeta
);
STable
Com
Info
tinfo
=
tscGetTableInfo
(
pTableMetaInfo
->
pTableMeta
);
int8_t
precision
=
tinfo
.
precision
;
if
((
isAllSourcesCompleted
(
pLocalReducer
)
&&
!
pLocalReducer
->
hasPrevRow
)
||
pLocalReducer
->
pLocalDataSrc
[
0
]
==
NULL
||
...
...
src/client/src/tscServer.c
浏览文件 @
f9241ef1
...
...
@@ -2176,7 +2176,7 @@ int tscProcessDescribeTableRsp(SSqlObj *pSql) {
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
STableMetaInfo
*
pTableMetaInfo
=
tscGetTableMetaInfoFromCmd
(
pCmd
,
pCmd
->
clauseIndex
,
0
);
STableInfo
tinfo
=
tscGetTableInfo
(
pTableMetaInfo
->
pTableMeta
);
STable
Com
Info
tinfo
=
tscGetTableInfo
(
pTableMetaInfo
->
pTableMeta
);
int32_t
numOfRes
=
tinfo
.
numOfColumns
+
tinfo
.
numOfTags
;
return
tscLocalResultCommonBuilder
(
pSql
,
numOfRes
);
...
...
@@ -3147,7 +3147,7 @@ int32_t tscGetTableMeta(SSqlObj *pSql, STableMetaInfo *pTableMetaInfo) {
pTableMetaInfo
->
pTableMeta
=
(
STableMeta
*
)
taosCacheAcquireByName
(
tscCacheHandle
,
pTableMetaInfo
->
name
);
if
(
pTableMetaInfo
->
pTableMeta
!=
NULL
)
{
STableInfo
tinfo
=
tscGetTableInfo
(
pTableMetaInfo
->
pTableMeta
);
STable
Com
Info
tinfo
=
tscGetTableInfo
(
pTableMetaInfo
->
pTableMeta
);
tscTrace
(
"%p retrieve tableMeta from cache, the number of columns:%d, numOfTags:%d"
,
pSql
,
tinfo
.
numOfColumns
,
tinfo
.
numOfTags
);
...
...
src/client/src/tscStream.c
浏览文件 @
f9241ef1
...
...
@@ -541,7 +541,7 @@ TAOS_STREAM *taos_open_stream(TAOS *taos, const char *sqlstr, void (*fp)(void *p
SQueryInfo
*
pQueryInfo
=
tscGetQueryInfoDetail
(
pCmd
,
0
);
STableMetaInfo
*
pTableMetaInfo
=
tscGetMetaInfo
(
pQueryInfo
,
0
);
STableInfo
tinfo
=
tscGetTableInfo
(
pTableMetaInfo
->
pTableMeta
);
STable
Com
Info
tinfo
=
tscGetTableInfo
(
pTableMetaInfo
->
pTableMeta
);
pStream
->
fp
=
fp
;
pStream
->
callback
=
callback
;
...
...
src/client/src/tscUtil.c
浏览文件 @
f9241ef1
...
...
@@ -1583,7 +1583,7 @@ bool tscValidateColumnId(STableMetaInfo* pTableMetaInfo, int32_t colId) {
}
SSchema
*
pSchema
=
tscGetTableSchema
(
pTableMetaInfo
->
pTableMeta
);
STableInfo
tinfo
=
tscGetTableInfo
(
pTableMetaInfo
->
pTableMeta
);
STable
Com
Info
tinfo
=
tscGetTableInfo
(
pTableMetaInfo
->
pTableMeta
);
int32_t
numOfTotal
=
tinfo
.
numOfTags
+
tinfo
.
numOfColumns
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录