Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
2dot5
ClickHouse
提交
e8b3bac5
C
ClickHouse
项目概览
2dot5
/
ClickHouse
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
ClickHouse
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
e8b3bac5
编写于
3月 09, 2020
作者:
A
Alexey Milovidov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
clang-tidy, part 5
上级
79c6bd5a
变更
20
隐藏空白更改
内联
并排
Showing
20 changed file
with
38 addition
and
61 deletion
+38
-61
dbms/programs/performance-test/ConfigPreprocessor.cpp
dbms/programs/performance-test/ConfigPreprocessor.cpp
+1
-1
dbms/src/Access/AccessControlManager.cpp
dbms/src/Access/AccessControlManager.cpp
+1
-3
dbms/src/Access/AccessRights.h
dbms/src/Access/AccessRights.h
+16
-16
dbms/src/Access/AccessRightsContext.h
dbms/src/Access/AccessRightsContext.h
+2
-2
dbms/src/Access/DiskAccessStorage.cpp
dbms/src/Access/DiskAccessStorage.cpp
+1
-1
dbms/src/Access/GenericRoleSet.cpp
dbms/src/Access/GenericRoleSet.cpp
+2
-8
dbms/src/Access/MemoryAccessStorage.cpp
dbms/src/Access/MemoryAccessStorage.cpp
+0
-3
dbms/src/Access/MemoryAccessStorage.h
dbms/src/Access/MemoryAccessStorage.h
+0
-1
dbms/src/Access/MultipleAccessStorage.cpp
dbms/src/Access/MultipleAccessStorage.cpp
+0
-5
dbms/src/Access/MultipleAccessStorage.h
dbms/src/Access/MultipleAccessStorage.h
+0
-1
dbms/src/Access/QuotaContextFactory.cpp
dbms/src/Access/QuotaContextFactory.cpp
+1
-3
dbms/src/Access/RowPolicyContextFactory.cpp
dbms/src/Access/RowPolicyContextFactory.cpp
+1
-1
dbms/src/Access/UsersConfigAccessStorage.cpp
dbms/src/Access/UsersConfigAccessStorage.cpp
+0
-3
dbms/src/Access/UsersConfigAccessStorage.h
dbms/src/Access/UsersConfigAccessStorage.h
+0
-1
dbms/src/Dictionaries/getDictionaryConfigurationFromAST.cpp
dbms/src/Dictionaries/getDictionaryConfigurationFromAST.cpp
+2
-2
dbms/src/Interpreters/ExpressionActions.cpp
dbms/src/Interpreters/ExpressionActions.cpp
+1
-1
dbms/src/Parsers/ASTDictionary.cpp
dbms/src/Parsers/ASTDictionary.cpp
+2
-2
dbms/src/Parsers/ASTIdentifier.cpp
dbms/src/Parsers/ASTIdentifier.cpp
+2
-2
dbms/src/Processors/Formats/Impl/AvroRowOutputFormat.cpp
dbms/src/Processors/Formats/Impl/AvroRowOutputFormat.cpp
+1
-1
dbms/src/Storages/MergeTree/MergeTreeIndices.cpp
dbms/src/Storages/MergeTree/MergeTreeIndices.cpp
+5
-4
未找到文件。
dbms/programs/performance-test/ConfigPreprocessor.cpp
浏览文件 @
e8b3bac5
...
...
@@ -21,7 +21,7 @@ std::vector<XMLConfigurationPtr> ConfigPreprocessor::processConfig(
const
auto
path
=
Poco
::
Path
(
path_str
);
test
->
setString
(
"path"
,
path
.
absolute
().
toString
());
if
(
test
->
getString
(
"name"
,
""
)
==
""
)
if
(
test
->
getString
(
"name"
,
""
)
.
empty
()
)
test
->
setString
(
"name"
,
path
.
getBaseName
());
}
...
...
dbms/src/Access/AccessControlManager.cpp
浏览文件 @
e8b3bac5
...
...
@@ -37,9 +37,7 @@ AccessControlManager::AccessControlManager()
}
AccessControlManager
::~
AccessControlManager
()
{
}
AccessControlManager
::~
AccessControlManager
()
=
default
;
void
AccessControlManager
::
setLocalDirectory
(
const
String
&
directory_path
)
...
...
dbms/src/Access/AccessRights.h
浏览文件 @
e8b3bac5
...
...
@@ -34,8 +34,8 @@ public:
void
grant
(
const
AccessFlags
&
access
,
const
std
::
string_view
&
database
,
const
std
::
string_view
&
table
,
const
std
::
string_view
&
column
);
void
grant
(
const
AccessFlags
&
access
,
const
std
::
string_view
&
database
,
const
std
::
string_view
&
table
,
const
std
::
vector
<
std
::
string_view
>
&
columns
);
void
grant
(
const
AccessFlags
&
access
,
const
std
::
string_view
&
database
,
const
std
::
string_view
&
table
,
const
Strings
&
columns
);
void
grant
(
const
AccessRightsElement
&
access
,
std
::
string_view
current_database
=
{});
void
grant
(
const
AccessRightsElements
&
acces
s
,
std
::
string_view
current_database
=
{});
void
grant
(
const
AccessRightsElement
&
element
,
std
::
string_view
current_database
=
{});
void
grant
(
const
AccessRightsElements
&
element
s
,
std
::
string_view
current_database
=
{});
/// Revokes a specified access granted earlier on a specified database/table/column.
/// Does nothing if the specified access is not granted.
...
...
@@ -48,8 +48,8 @@ public:
void
revoke
(
const
AccessFlags
&
access
,
const
std
::
string_view
&
database
,
const
std
::
string_view
&
table
,
const
std
::
string_view
&
column
);
void
revoke
(
const
AccessFlags
&
access
,
const
std
::
string_view
&
database
,
const
std
::
string_view
&
table
,
const
std
::
vector
<
std
::
string_view
>
&
columns
);
void
revoke
(
const
AccessFlags
&
access
,
const
std
::
string_view
&
database
,
const
std
::
string_view
&
table
,
const
Strings
&
columns
);
void
revoke
(
const
AccessRightsElement
&
access
,
std
::
string_view
current_database
=
{});
void
revoke
(
const
AccessRightsElements
&
acces
s
,
std
::
string_view
current_database
=
{});
void
revoke
(
const
AccessRightsElement
&
element
,
std
::
string_view
current_database
=
{});
void
revoke
(
const
AccessRightsElements
&
element
s
,
std
::
string_view
current_database
=
{});
/// Revokes a specified access granted earlier on a specified database/table/column or on lower levels.
/// The function also restricts access if it's granted on upper level.
...
...
@@ -61,8 +61,8 @@ public:
void
partialRevoke
(
const
AccessFlags
&
access
,
const
std
::
string_view
&
database
,
const
std
::
string_view
&
table
,
const
std
::
string_view
&
column
);
void
partialRevoke
(
const
AccessFlags
&
access
,
const
std
::
string_view
&
database
,
const
std
::
string_view
&
table
,
const
std
::
vector
<
std
::
string_view
>
&
columns
);
void
partialRevoke
(
const
AccessFlags
&
access
,
const
std
::
string_view
&
database
,
const
std
::
string_view
&
table
,
const
Strings
&
columns
);
void
partialRevoke
(
const
AccessRightsElement
&
access
,
std
::
string_view
current_database
=
{});
void
partialRevoke
(
const
AccessRightsElements
&
acces
s
,
std
::
string_view
current_database
=
{});
void
partialRevoke
(
const
AccessRightsElement
&
element
,
std
::
string_view
current_database
=
{});
void
partialRevoke
(
const
AccessRightsElements
&
element
s
,
std
::
string_view
current_database
=
{});
/// Revokes a specified access granted earlier on a specified database/table/column or on lower levels.
/// The function also restricts access if it's granted on upper level.
...
...
@@ -74,8 +74,8 @@ public:
void
fullRevoke
(
const
AccessFlags
&
access
,
const
std
::
string_view
&
database
,
const
std
::
string_view
&
table
,
const
std
::
string_view
&
column
);
void
fullRevoke
(
const
AccessFlags
&
access
,
const
std
::
string_view
&
database
,
const
std
::
string_view
&
table
,
const
std
::
vector
<
std
::
string_view
>
&
columns
);
void
fullRevoke
(
const
AccessFlags
&
access
,
const
std
::
string_view
&
database
,
const
std
::
string_view
&
table
,
const
Strings
&
columns
);
void
fullRevoke
(
const
AccessRightsElement
&
access
,
std
::
string_view
current_database
=
{});
void
fullRevoke
(
const
AccessRightsElements
&
acces
s
,
std
::
string_view
current_database
=
{});
void
fullRevoke
(
const
AccessRightsElement
&
element
,
std
::
string_view
current_database
=
{});
void
fullRevoke
(
const
AccessRightsElements
&
element
s
,
std
::
string_view
current_database
=
{});
/// Returns the information about all the access granted.
struct
Elements
...
...
@@ -95,8 +95,8 @@ public:
bool
isGranted
(
const
AccessFlags
&
access
,
const
std
::
string_view
&
database
,
const
std
::
string_view
&
table
,
const
std
::
string_view
&
column
)
const
;
bool
isGranted
(
const
AccessFlags
&
access
,
const
std
::
string_view
&
database
,
const
std
::
string_view
&
table
,
const
std
::
vector
<
std
::
string_view
>
&
columns
)
const
;
bool
isGranted
(
const
AccessFlags
&
access
,
const
std
::
string_view
&
database
,
const
std
::
string_view
&
table
,
const
Strings
&
columns
)
const
;
bool
isGranted
(
const
AccessRightsElement
&
access
,
std
::
string_view
current_database
=
{})
const
;
bool
isGranted
(
const
AccessRightsElements
&
acces
s
,
std
::
string_view
current_database
=
{})
const
;
bool
isGranted
(
const
AccessRightsElement
&
element
,
std
::
string_view
current_database
=
{})
const
;
bool
isGranted
(
const
AccessRightsElements
&
element
s
,
std
::
string_view
current_database
=
{})
const
;
friend
bool
operator
==
(
const
AccessRights
&
left
,
const
AccessRights
&
right
);
friend
bool
operator
!=
(
const
AccessRights
&
left
,
const
AccessRights
&
right
)
{
return
!
(
left
==
right
);
}
...
...
@@ -109,23 +109,23 @@ private:
template
<
typename
...
Args
>
void
grantImpl
(
const
AccessFlags
&
access
,
const
Args
&
...
args
);
void
grantImpl
(
const
AccessRightsElement
&
access
,
std
::
string_view
current_database
);
void
grantImpl
(
const
AccessRightsElements
&
acces
s
,
std
::
string_view
current_database
);
void
grantImpl
(
const
AccessRightsElement
&
element
,
std
::
string_view
current_database
);
void
grantImpl
(
const
AccessRightsElements
&
element
s
,
std
::
string_view
current_database
);
template
<
int
mode
,
typename
...
Args
>
void
revokeImpl
(
const
AccessFlags
&
access
,
const
Args
&
...
args
);
template
<
int
mode
>
void
revokeImpl
(
const
AccessRightsElement
&
access
,
std
::
string_view
current_database
);
void
revokeImpl
(
const
AccessRightsElement
&
element
,
std
::
string_view
current_database
);
template
<
int
mode
>
void
revokeImpl
(
const
AccessRightsElements
&
acces
s
,
std
::
string_view
current_database
);
void
revokeImpl
(
const
AccessRightsElements
&
element
s
,
std
::
string_view
current_database
);
template
<
typename
...
Args
>
bool
isGrantedImpl
(
const
AccessFlags
&
access
,
const
Args
&
...
args
)
const
;
bool
isGrantedImpl
(
const
AccessRightsElement
&
access
,
std
::
string_view
current_database
)
const
;
bool
isGrantedImpl
(
const
AccessRightsElements
&
acces
s
,
std
::
string_view
current_database
)
const
;
bool
isGrantedImpl
(
const
AccessRightsElement
&
element
,
std
::
string_view
current_database
)
const
;
bool
isGrantedImpl
(
const
AccessRightsElements
&
element
s
,
std
::
string_view
current_database
)
const
;
template
<
typename
...
Args
>
AccessFlags
getAccessImpl
(
const
Args
&
...
args
)
const
;
...
...
dbms/src/Access/AccessRightsContext.h
浏览文件 @
e8b3bac5
...
...
@@ -128,10 +128,10 @@ private:
bool
checkAccessImpl
(
Poco
::
Logger
*
log_
,
const
AccessFlags
&
access
,
const
Args
&
...
args
)
const
;
template
<
int
mode
,
bool
grant_option
>
bool
checkAccessImpl
(
Poco
::
Logger
*
log_
,
const
AccessRightsElement
&
access
)
const
;
bool
checkAccessImpl
(
Poco
::
Logger
*
log_
,
const
AccessRightsElement
&
element
)
const
;
template
<
int
mode
,
bool
grant_option
>
bool
checkAccessImpl
(
Poco
::
Logger
*
log_
,
const
AccessRightsElements
&
acces
s
)
const
;
bool
checkAccessImpl
(
Poco
::
Logger
*
log_
,
const
AccessRightsElements
&
element
s
)
const
;
boost
::
shared_ptr
<
const
AccessRights
>
calculateResultAccess
(
bool
grant_option
)
const
;
boost
::
shared_ptr
<
const
AccessRights
>
calculateResultAccess
(
bool
grant_option
,
UInt64
readonly_
,
bool
allow_ddl_
,
bool
allow_introspection_
)
const
;
...
...
dbms/src/Access/DiskAccessStorage.cpp
浏览文件 @
e8b3bac5
...
...
@@ -254,7 +254,7 @@ namespace
}
static
const
std
::
vector
<
std
::
type_index
>
&
getAllAccessEntityTypes
()
const
std
::
vector
<
std
::
type_index
>
&
getAllAccessEntityTypes
()
{
static
const
std
::
vector
<
std
::
type_index
>
res
=
{
typeid
(
User
),
typeid
(
Role
),
typeid
(
RowPolicy
),
typeid
(
Quota
)};
return
res
;
...
...
dbms/src/Access/GenericRoleSet.cpp
浏览文件 @
e8b3bac5
...
...
@@ -270,10 +270,7 @@ bool GenericRoleSet::match(const UUID & user_id, const std::vector<UUID> & enabl
bool
in_except_list
=
std
::
any_of
(
enabled_roles
.
begin
(),
enabled_roles
.
end
(),
[
this
](
const
UUID
&
enabled_role
)
{
return
except_ids
.
contains
(
enabled_role
);
});
if
(
in_except_list
)
return
false
;
return
true
;
return
!
in_except_list
;
}
...
...
@@ -292,10 +289,7 @@ bool GenericRoleSet::match(const UUID & user_id, const boost::container::flat_se
bool
in_except_list
=
std
::
any_of
(
enabled_roles
.
begin
(),
enabled_roles
.
end
(),
[
this
](
const
UUID
&
enabled_role
)
{
return
except_ids
.
contains
(
enabled_role
);
});
if
(
in_except_list
)
return
false
;
return
true
;
return
!
in_except_list
;
}
...
...
dbms/src/Access/MemoryAccessStorage.cpp
浏览文件 @
e8b3bac5
...
...
@@ -11,9 +11,6 @@ MemoryAccessStorage::MemoryAccessStorage(const String & storage_name_)
}
MemoryAccessStorage
::~
MemoryAccessStorage
()
{}
std
::
optional
<
UUID
>
MemoryAccessStorage
::
findImpl
(
std
::
type_index
type
,
const
String
&
name
)
const
{
std
::
lock_guard
lock
{
mutex
};
...
...
dbms/src/Access/MemoryAccessStorage.h
浏览文件 @
e8b3bac5
...
...
@@ -14,7 +14,6 @@ class MemoryAccessStorage : public IAccessStorage
{
public:
MemoryAccessStorage
(
const
String
&
storage_name_
=
"memory"
);
~
MemoryAccessStorage
()
override
;
/// Sets all entities at once.
void
setAll
(
const
std
::
vector
<
AccessEntityPtr
>
&
all_entities
);
...
...
dbms/src/Access/MultipleAccessStorage.cpp
浏览文件 @
e8b3bac5
...
...
@@ -38,11 +38,6 @@ MultipleAccessStorage::MultipleAccessStorage(
}
MultipleAccessStorage
::~
MultipleAccessStorage
()
{
}
std
::
vector
<
UUID
>
MultipleAccessStorage
::
findMultiple
(
std
::
type_index
type
,
const
String
&
name
)
const
{
std
::
vector
<
UUID
>
ids
;
...
...
dbms/src/Access/MultipleAccessStorage.h
浏览文件 @
e8b3bac5
...
...
@@ -14,7 +14,6 @@ public:
using
Storage
=
IAccessStorage
;
MultipleAccessStorage
(
std
::
vector
<
std
::
unique_ptr
<
Storage
>>
nested_storages_
);
~
MultipleAccessStorage
()
override
;
std
::
vector
<
UUID
>
findMultiple
(
std
::
type_index
type
,
const
String
&
name
)
const
;
...
...
dbms/src/Access/QuotaContextFactory.cpp
浏览文件 @
e8b3bac5
...
...
@@ -170,9 +170,7 @@ QuotaContextFactory::QuotaContextFactory(const AccessControlManager & access_con
}
QuotaContextFactory
::~
QuotaContextFactory
()
{
}
QuotaContextFactory
::~
QuotaContextFactory
()
=
default
;
QuotaContextPtr
QuotaContextFactory
::
createContext
(
const
String
&
user_name
,
const
UUID
&
user_id
,
const
std
::
vector
<
UUID
>
&
enabled_roles
,
const
Poco
::
Net
::
IPAddress
&
address
,
const
String
&
client_key
)
...
...
dbms/src/Access/RowPolicyContextFactory.cpp
浏览文件 @
e8b3bac5
...
...
@@ -93,7 +93,7 @@ namespace
using
ConditionIndex
=
RowPolicy
::
ConditionIndex
;
static
constexpr
size_t
MAX_CONDITION_INDEX
=
RowPolicy
::
MAX_CONDITION_INDEX
;
constexpr
size_t
MAX_CONDITION_INDEX
=
RowPolicy
::
MAX_CONDITION_INDEX
;
/// Accumulates conditions from multiple row policies and joins them using the AND logical operation.
...
...
dbms/src/Access/UsersConfigAccessStorage.cpp
浏览文件 @
e8b3bac5
...
...
@@ -339,9 +339,6 @@ UsersConfigAccessStorage::UsersConfigAccessStorage() : IAccessStorage("users.xml
}
UsersConfigAccessStorage
::~
UsersConfigAccessStorage
()
{}
void
UsersConfigAccessStorage
::
setConfiguration
(
const
Poco
::
Util
::
AbstractConfiguration
&
config
)
{
std
::
vector
<
std
::
pair
<
UUID
,
AccessEntityPtr
>>
all_entities
;
...
...
dbms/src/Access/UsersConfigAccessStorage.h
浏览文件 @
e8b3bac5
...
...
@@ -19,7 +19,6 @@ class UsersConfigAccessStorage : public IAccessStorage
{
public:
UsersConfigAccessStorage
();
~
UsersConfigAccessStorage
()
override
;
void
setConfiguration
(
const
Poco
::
Util
::
AbstractConfiguration
&
config
);
...
...
dbms/src/Dictionaries/getDictionaryConfigurationFromAST.cpp
浏览文件 @
e8b3bac5
...
...
@@ -311,9 +311,9 @@ NamesToTypeNames buildDictionaryAttributesConfiguration(
{
const
auto
&
children
=
dictionary_attributes
->
children
;
NamesToTypeNames
attributes_names_and_types
;
for
(
size_t
i
=
0
;
i
<
children
.
size
();
++
i
)
for
(
const
auto
&
child
:
children
)
{
const
ASTDictionaryAttributeDeclaration
*
dict_attr
=
child
ren
[
i
]
->
as
<
const
ASTDictionaryAttributeDeclaration
>
();
const
ASTDictionaryAttributeDeclaration
*
dict_attr
=
child
->
as
<
const
ASTDictionaryAttributeDeclaration
>
();
if
(
!
dict_attr
->
type
)
throw
Exception
(
"Dictionary attribute must has type"
,
ErrorCodes
::
INCORRECT_DICTIONARY_DEFINITION
);
...
...
dbms/src/Interpreters/ExpressionActions.cpp
浏览文件 @
e8b3bac5
...
...
@@ -64,7 +64,7 @@ ExpressionAction ExpressionAction::applyFunction(
const
std
::
vector
<
std
::
string
>
&
argument_names_
,
std
::
string
result_name_
)
{
if
(
result_name_
==
""
)
if
(
result_name_
.
empty
()
)
{
result_name_
=
function_
->
getName
()
+
"("
;
for
(
size_t
i
=
0
;
i
<
argument_names_
.
size
();
++
i
)
...
...
dbms/src/Parsers/ASTDictionary.cpp
浏览文件 @
e8b3bac5
...
...
@@ -76,7 +76,7 @@ ASTPtr ASTDictionaryLayout::clone() const
void
ASTDictionaryLayout
::
formatImpl
(
const
FormatSettings
&
settings
,
FormatState
&
state
,
FormatStateStacked
expected
)
const
FormatStateStacked
frame
)
const
{
settings
.
ostr
<<
(
settings
.
hilite
?
hilite_keyword
:
""
)
<<
"LAYOUT"
...
...
@@ -94,7 +94,7 @@ void ASTDictionaryLayout::formatImpl(const FormatSettings & settings,
<<
(
settings
.
hilite
?
hilite_none
:
""
)
<<
" "
;
parameter
->
second
->
formatImpl
(
settings
,
state
,
expected
);
parameter
->
second
->
formatImpl
(
settings
,
state
,
frame
);
}
settings
.
ostr
<<
")"
;
settings
.
ostr
<<
")"
;
...
...
dbms/src/Parsers/ASTIdentifier.cpp
浏览文件 @
e8b3bac5
...
...
@@ -34,10 +34,10 @@ ASTIdentifier::ASTIdentifier(const String & name_, std::vector<String> && name_p
,
name_parts
(
name_parts_
)
,
semantic
(
std
::
make_shared
<
IdentifierSemanticImpl
>
())
{
if
(
name_parts
.
size
()
&&
name_parts
[
0
]
==
""
)
if
(
!
name_parts
.
empty
()
&&
name_parts
[
0
].
empty
()
)
name_parts
.
erase
(
name_parts
.
begin
());
if
(
name
==
""
)
if
(
name
.
empty
()
)
{
if
(
name_parts
.
size
()
==
2
)
name
=
name_parts
[
0
]
+
'.'
+
name_parts
[
1
];
...
...
dbms/src/Processors/Formats/Impl/AvroRowOutputFormat.cpp
浏览文件 @
e8b3bac5
...
...
@@ -315,7 +315,7 @@ void AvroSerializer::serializeRow(const Columns & columns, size_t row_num, avro:
static
avro
::
Codec
getCodec
(
const
std
::
string
&
codec_name
)
{
if
(
codec_name
==
""
)
if
(
codec_name
.
empty
()
)
{
#ifdef SNAPPY_CODEC_AVAILABLE
return
avro
::
Codec
::
SNAPPY_CODEC
;
...
...
dbms/src/Storages/MergeTree/MergeTreeIndices.cpp
浏览文件 @
e8b3bac5
...
...
@@ -43,11 +43,12 @@ std::unique_ptr<IMergeTreeIndex> MergeTreeIndexFactory::get(
throw
Exception
(
"Unknown Index type '"
+
node
->
type
->
name
+
"'. Available index types: "
+
std
::
accumulate
(
indexes
.
cbegin
(),
indexes
.
cend
(),
std
::
string
{},
[]
(
auto
&&
lft
,
const
auto
&
rht
)
->
std
::
string
{
if
(
lft
==
""
)
return
rht
.
first
;
[]
(
auto
&&
left
,
const
auto
&
right
)
->
std
::
string
{
if
(
left
.
empty
())
return
right
.
first
;
else
return
l
ft
+
", "
+
r
ht
.
first
;
return
l
eft
+
", "
+
rig
ht
.
first
;
}),
ErrorCodes
::
INCORRECT_QUERY
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录