Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
2dot5
ClickHouse
提交
58ea3b10
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,发现更多精彩内容 >>
提交
58ea3b10
编写于
3月 09, 2014
作者:
M
Michael Kolupaev
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Merge
上级
96fb6da0
变更
14
展开全部
隐藏空白更改
内联
并排
Showing
14 changed file
with
2154 addition
and
2008 deletion
+2154
-2008
dbms/include/DB/Storages/IColumnsDeclaration.h
dbms/include/DB/Storages/IColumnsDeclaration.h
+65
-0
dbms/include/DB/Storages/IStorage.h
dbms/include/DB/Storages/IStorage.h
+5
-45
dbms/include/DB/Storages/MergeTree/MergeTreeBlockInputStream.h
...include/DB/Storages/MergeTree/MergeTreeBlockInputStream.h
+6
-6
dbms/include/DB/Storages/MergeTree/MergeTreeData.h
dbms/include/DB/Storages/MergeTree/MergeTreeData.h
+527
-0
dbms/include/DB/Storages/MergeTree/MergeTreeDataBlockOutputStream.h
...de/DB/Storages/MergeTree/MergeTreeDataBlockOutputStream.h
+8
-8
dbms/include/DB/Storages/MergeTree/MergeTreeReader.h
dbms/include/DB/Storages/MergeTree/MergeTreeReader.h
+3
-3
dbms/include/DB/Storages/MergeTree/MergedBlockOutputStream.h
dbms/include/DB/Storages/MergeTree/MergedBlockOutputStream.h
+5
-5
dbms/include/DB/Storages/MergeTreeData.h
dbms/include/DB/Storages/MergeTreeData.h
+0
-27
dbms/include/DB/Storages/StorageMergeTree.h
dbms/include/DB/Storages/StorageMergeTree.h
+18
-447
dbms/src/Storages/IColumnsDeclaration.cpp
dbms/src/Storages/IColumnsDeclaration.cpp
+21
-27
dbms/src/Storages/MergeTree/MergeTreeData.cpp
dbms/src/Storages/MergeTree/MergeTreeData.cpp
+1468
-0
dbms/src/Storages/StorageFactory.cpp
dbms/src/Storages/StorageFactory.cpp
+2
-2
dbms/src/Storages/StorageMergeTree.cpp
dbms/src/Storages/StorageMergeTree.cpp
+25
-1437
dbms/src/Storages/tests/MergeLogicTester.cpp
dbms/src/Storages/tests/MergeLogicTester.cpp
+1
-1
未找到文件。
dbms/include/DB/Storages/IColumnsDeclaration.h
0 → 100644
浏览文件 @
58ea3b10
#pragma once
#include <DB/Core/Names.h>
#include <DB/Core/NamesAndTypes.h>
#include <DB/Core/Exception.h>
#include <DB/Core/Block.h>
#include <DB/Parsers/ASTAlterQuery.h>
namespace
DB
{
class
Context
;
/** Описание столбцов таблицы.
*/
class
IColumnsDeclaration
{
public:
/// Имя таблицы. Ни на что не влияет, используется только для сообщений об ошибках.
virtual
std
::
string
getTableName
()
const
{
return
""
;
}
/** Получить список имён и типов столбцов таблицы, только невиртуальные.
*/
virtual
const
NamesAndTypesList
&
getColumnsList
()
const
=
0
;
/** Получить описание реального (невиртуального) столбца по его имени.
*/
virtual
NameAndTypePair
getRealColumn
(
const
String
&
column_name
)
const
;
/** Присутствует ли реальный (невиртуальный) столбец с таким именем.
*/
virtual
bool
hasRealColumn
(
const
String
&
column_name
)
const
;
/** Получить описание любого столбца по его имени.
*/
virtual
NameAndTypePair
getColumn
(
const
String
&
column_name
)
const
;
/** Присутствует ли столбец с таким именем.
*/
virtual
bool
hasColumn
(
const
String
&
column_name
)
const
;
const
DataTypePtr
getDataTypeByName
(
const
String
&
column_name
)
const
;
/** То же самое, но в виде блока-образца.
*/
Block
getSampleBlock
()
const
;
/** Проверить, что все запрошенные имена есть в таблице и заданы корректно.
* (список имён не пустой и имена не повторяются)
*/
void
check
(
const
Names
&
column_names
)
const
;
/** Проверить, что блок с данными для записи содержит все столбцы таблицы с правильными типами,
* содержит только столбцы таблицы, и все столбцы различны.
* Если need_all, еще проверяет, что все столбцы таблицы есть в блоке.
*/
void
check
(
const
Block
&
block
,
bool
need_all
=
false
)
const
;
/// реализация alter, модифицирующая список столбцов.
static
void
alterColumns
(
const
ASTAlterQuery
::
Parameters
&
params
,
NamesAndTypesListPtr
&
columns
,
const
Context
&
context
);
virtual
~
IColumnsDeclaration
()
{}
};
}
dbms/include/DB/Storages/IStorage.h
浏览文件 @
58ea3b10
...
...
@@ -13,7 +13,8 @@
#include <DB/Parsers/ASTAlterQuery.h>
#include <DB/Interpreters/Settings.h>
#include <DB/Storages/StoragePtr.h>
#include "DatabaseDropper.h"
#include <DB/Storages/IColumnsDeclaration.h>
#include <DB/Storages/DatabaseDropper.h>
#include <Poco/File.h>
...
...
@@ -30,41 +31,15 @@ class Context;
* - структура хранения данных (сжатие, etc.)
* - конкуррентный доступ к данным (блокировки, etc.)
*/
class
IStorage
:
private
boost
::
noncopyable
class
IStorage
:
private
boost
::
noncopyable
,
public
IColumnsDeclaration
{
public:
/// Основное имя типа таблицы (например, Storage
WithoutKey
).
/// Основное имя типа таблицы (например, Storage
MergeTree
).
virtual
std
::
string
getName
()
const
=
0
;
/// Имя самой таблицы (например, hits)
virtual
std
::
string
getTableName
()
const
=
0
;
/** Получить список имён и типов столбцов таблицы, только невиртуальные.
*/
virtual
const
NamesAndTypesList
&
getColumnsList
()
const
=
0
;
/** Получить описание реального (невиртуального) столбца по его имени.
*/
virtual
NameAndTypePair
getRealColumn
(
const
String
&
column_name
)
const
;
/** Присутствует ли реальный (невиртуальный) столбец с таким именем.
*/
virtual
bool
hasRealColumn
(
const
String
&
column_name
)
const
;
/** Получить описание любого столбца по его имени.
*/
virtual
NameAndTypePair
getColumn
(
const
String
&
column_name
)
const
;
/** Присутствует ли столбец с таким именем.
*/
virtual
bool
hasColumn
(
const
String
&
column_name
)
const
;
const
DataTypePtr
getDataTypeByName
(
const
String
&
column_name
)
const
;
/** То же самое, но в виде блока-образца.
*/
Block
getSampleBlock
()
const
;
/** Возвращает true, если хранилище получает данные с удалённого сервера или серверов.
*/
virtual
bool
isRemote
()
const
{
return
false
;
}
...
...
@@ -172,19 +147,6 @@ public:
*/
virtual
void
shutdown
()
{}
virtual
~
IStorage
()
{}
/** Проверить, что все запрошенные имена есть в таблице и заданы корректно.
* (список имён не пустой и имена не повторяются)
*/
void
check
(
const
Names
&
column_names
)
const
;
/** Проверить, что блок с данными для записи содержит все столбцы таблицы с правильными типами,
* содержит только столбцы таблицы, и все столбцы различны.
* Если need_all, еще проверяет, что все столбцы таблицы есть в блоке.
*/
void
check
(
const
Block
&
block
,
bool
need_all
=
false
)
const
;
/** Возвращает владеющий указатель на себя.
*/
StoragePtr
thisPtr
()
...
...
@@ -213,9 +175,7 @@ public:
protected:
IStorage
()
:
drop_on_destroy
(
false
)
{}
/// реализация alter, модифицирующая список столбцов.
void
alterColumns
(
const
ASTAlterQuery
::
Parameters
&
params
,
NamesAndTypesListPtr
&
columns
,
const
Context
&
context
)
const
;
private:
boost
::
weak_ptr
<
StoragePtr
::
Wrapper
>
this_ptr
;
};
...
...
dbms/include/DB/Storages/MergeTree/MergeTreeBlockInputStream.h
浏览文件 @
58ea3b10
#pragma once
#include <DB/DataStreams/IProfilingBlockInputStream.h>
#include <DB/Storages/
StorageMergeTree
.h>
#include <DB/Storages/
MergeTree/MergeTreeData
.h>
#include <DB/Storages/MergeTree/PKCondition.h>
#include <DB/Storages/MergeTree/MergeTreeReader.h>
...
...
@@ -18,7 +18,7 @@ public:
/// (например, поток, сливаящий куски). В таком случае сам storage должен следить, чтобы не удалить данные, пока их читают.
MergeTreeBlockInputStream
(
const
String
&
path_
,
/// Путь к куску
size_t
block_size_
,
const
Names
&
column_names_
,
StorageMergeTree
&
storage_
,
const
StorageMergeTree
::
DataPartPtr
&
owned_data_part_
,
MergeTreeData
&
storage_
,
const
MergeTreeData
::
DataPartPtr
&
owned_data_part_
,
const
MarkRanges
&
mark_ranges_
,
StoragePtr
owned_storage
,
bool
use_uncompressed_cache_
,
ExpressionActionsPtr
prewhere_actions_
,
String
prewhere_column_
)
:
IProfilingBlockInputStream
(
owned_storage
),
...
...
@@ -74,8 +74,8 @@ public:
/// Получает набор диапазонов засечек, вне которых не могут находиться ключи из заданного диапазона.
static
MarkRanges
markRangesFromPkRange
(
const
StorageMergeTree
::
DataPart
::
Index
&
index
,
StorageMergeTree
&
storage
,
const
MergeTreeData
::
DataPart
::
Index
&
index
,
MergeTreeData
&
storage
,
PKCondition
&
key_condition
)
{
MarkRanges
res
;
...
...
@@ -321,8 +321,8 @@ private:
Names
column_names
;
NameSet
column_name_set
;
Names
pre_column_names
;
StorageMergeTree
&
storage
;
const
StorageMergeTree
::
DataPartPtr
owned_data_part
;
/// Кусок не будет удалён, пока им владеет этот объект.
MergeTreeData
&
storage
;
const
MergeTreeData
::
DataPartPtr
owned_data_part
;
/// Кусок не будет удалён, пока им владеет этот объект.
MarkRanges
all_mark_ranges
;
/// В каких диапазонах засечек читать. В порядке возрастания номеров.
MarkRanges
remaining_mark_ranges
;
/// В каких диапазонах засечек еще не прочли.
/// В порядке убывания номеров, чтобы можно было выбрасывать из конца.
...
...
dbms/include/DB/Storages/MergeTree/MergeTreeData.h
0 → 100644
浏览文件 @
58ea3b10
此差异已折叠。
点击以展开。
dbms/include/DB/Storages/MergeTree/MergeTreeBlockOutputStream.h
→
dbms/include/DB/Storages/MergeTree/MergeTree
Data
BlockOutputStream.h
浏览文件 @
58ea3b10
...
...
@@ -7,16 +7,16 @@
#include <DB/Interpreters/sortBlock.h>
#include <DB/Storages/
StorageMergeTree
.h>
#include <DB/Storages/
MergeTree/MergeTreeData
.h>
namespace
DB
{
class
MergeTreeBlockOutputStream
:
public
IBlockOutputStream
class
MergeTree
Data
BlockOutputStream
:
public
IBlockOutputStream
{
public:
MergeTree
BlockOutputStream
(
StoragePtr
owned_storage
)
:
IBlockOutputStream
(
owned_storage
),
storage
(
dynamic_cast
<
StorageMergeTree
&>
(
*
owned_storage
)
),
flags
(
O_TRUNC
|
O_CREAT
|
O_WRONLY
)
MergeTree
DataBlockOutputStream
(
MergeTreeData
&
data
,
StoragePtr
owned_storage
)
:
IBlockOutputStream
(
owned_storage
),
storage
(
data
),
flags
(
O_TRUNC
|
O_CREAT
|
O_WRONLY
)
{
}
...
...
@@ -25,7 +25,7 @@ public:
Poco
::
ScopedReadRWLock
write_lock
(
storage
.
write_lock
);
storage
.
check
(
block
,
true
);
DateLUTSingleton
&
date_lut
=
DateLUTSingleton
::
instance
();
size_t
rows
=
block
.
rows
();
...
...
@@ -82,7 +82,7 @@ public:
}
private:
StorageMergeTree
&
storage
;
MergeTreeData
&
storage
;
const
int
flags
;
...
...
@@ -130,7 +130,7 @@ private:
LOG_TRACE
(
storage
.
log
,
"Writing index."
);
/// Сначала пишем индекс. Индекс содержит значение PK для каждой index_granularity строки.
StorageMergeTree
::
DataPart
::
Index
index_vec
;
MergeTreeData
::
DataPart
::
Index
index_vec
;
index_vec
.
reserve
(
part_size
*
storage
.
sort_descr
.
size
());
{
...
...
@@ -183,7 +183,7 @@ private:
String
part_name
=
storage
.
getPartName
(
DayNum_t
(
min_date
),
DayNum_t
(
max_date
),
part_id
,
part_id
,
0
);
String
part_res_path
=
storage
.
full_path
+
part_name
+
"/"
;
StorageMergeTree
::
DataPartPtr
new_data_part
=
new
StorageMergeTree
::
DataPart
(
storage
);
MergeTreeData
::
DataPartPtr
new_data_part
=
new
MergeTreeData
::
DataPart
(
storage
);
new_data_part
->
left_date
=
DayNum_t
(
min_date
);
new_data_part
->
right_date
=
DayNum_t
(
max_date
);
new_data_part
->
left
=
part_id
;
...
...
dbms/include/DB/Storages/MergeTree/MergeTreeReader.h
浏览文件 @
58ea3b10
#pragma once
#include <DB/Storages/
StorageMergeTree
.h>
#include <DB/Storages/
MergeTree/MergeTreeData
.h>
#include <DB/DataTypes/IDataType.h>
#include <DB/DataTypes/DataTypeNested.h>
#include <DB/Core/NamesAndTypes.h>
...
...
@@ -22,7 +22,7 @@ class MergeTreeReader
{
public:
MergeTreeReader
(
const
String
&
path_
,
/// Путь к куску
const
Names
&
columns_names_
,
bool
use_uncompressed_cache_
,
StorageMergeTree
&
storage_
)
const
Names
&
columns_names_
,
bool
use_uncompressed_cache_
,
MergeTreeData
&
storage_
)
:
path
(
path_
),
column_names
(
columns_names_
),
use_uncompressed_cache
(
use_uncompressed_cache_
),
storage
(
storage_
)
{
for
(
Names
::
const_iterator
it
=
column_names
.
begin
();
it
!=
column_names
.
end
();
++
it
)
...
...
@@ -220,7 +220,7 @@ private:
FileStreams
streams
;
Names
column_names
;
bool
use_uncompressed_cache
;
StorageMergeTree
&
storage
;
MergeTreeData
&
storage
;
void
addStream
(
const
String
&
name
,
const
IDataType
&
type
,
size_t
level
=
0
)
{
...
...
dbms/include/DB/Storages/MergeTree/MergedBlockOutputStream.h
浏览文件 @
58ea3b10
...
...
@@ -3,7 +3,7 @@
#include <DB/IO/WriteBufferFromFile.h>
#include <DB/IO/CompressedWriteBuffer.h>
#include <DB/Storages/
StorageMergeTree
.h>
#include <DB/Storages/
MergeTree/MergeTreeData
.h>
namespace
DB
...
...
@@ -11,7 +11,7 @@ namespace DB
class
IMergedBlockOutputStream
:
public
IBlockOutputStream
{
public:
IMergedBlockOutputStream
(
StorageMergeTree
&
storage_
)
:
storage
(
storage_
),
index_offset
(
0
)
IMergedBlockOutputStream
(
MergeTreeData
&
storage_
)
:
storage
(
storage_
),
index_offset
(
0
)
{
}
...
...
@@ -182,7 +182,7 @@ protected:
}
}
StorageMergeTree
&
storage
;
MergeTreeData
&
storage
;
ColumnStreams
column_streams
;
...
...
@@ -196,7 +196,7 @@ protected:
class
MergedBlockOutputStream
:
public
IMergedBlockOutputStream
{
public:
MergedBlockOutputStream
(
StorageMergeTree
&
storage_
,
MergedBlockOutputStream
(
MergeTreeData
&
storage_
,
UInt16
min_date
,
UInt16
max_date
,
UInt64
min_part_id
,
UInt64
max_part_id
,
UInt32
level
)
:
IMergedBlockOutputStream
(
storage_
),
marks_count
(
0
)
{
...
...
@@ -299,7 +299,7 @@ typedef Poco::SharedPtr<MergedBlockOutputStream> MergedBlockOutputStreamPtr;
class
MergedColumnOnlyOutputStream
:
public
IMergedBlockOutputStream
{
public:
MergedColumnOnlyOutputStream
(
StorageMergeTree
&
storage_
,
String
part_path_
,
bool
sync_
=
false
)
:
MergedColumnOnlyOutputStream
(
MergeTreeData
&
storage_
,
String
part_path_
,
bool
sync_
=
false
)
:
IMergedBlockOutputStream
(
storage_
),
part_path
(
part_path_
),
initialized
(
false
),
sync
(
sync_
)
{
}
...
...
dbms/include/DB/Storages/MergeTreeData.h
已删除
100644 → 0
浏览文件 @
96fb6da0
#pragma once
namespace
DB
{
/** Отвечает за хранение локальных данных всех *MergeTree движков.
* - Поддерживает набор кусков на диске. Синхронизирует доступ к ним, поддерживает в памяти их список.
* - Полностью выполняет запросы SELECT.
* - Сам не принимает решений об изменении данных.
* - Умеет двавть рекомендации:
* - Говорить, какие куски нужно удалить, потому что они покрыты другими кусками.
* - Выбирать набор кусков для слияния.
* При этом нужна внешняя информация о том, какие куски с какими разрешено объединять.
* - Умеет изменять данные по запросу:
* - Записать новый кусок с данными из блока.
* - Слить указанные куски.
* - Сделать ALTER.
*/
class
MergeTreeData
{
public:
private:
};
}
dbms/include/DB/Storages/StorageMergeTree.h
浏览文件 @
58ea3b10
此差异已折叠。
点击以展开。
dbms/src/Storages/I
Storage
.cpp
→
dbms/src/Storages/I
ColumnsDeclaration
.cpp
浏览文件 @
58ea3b10
#include <set>
#include <boost/bind.hpp>
#include <sparsehash/dense_hash_set>
#include <sparsehash/dense_hash_map>
#include <DB/
Columns/ColumnNested
.h>
#include <sparsehash/dense_hash_set>
#include <DB/
Storages/IColumnsDeclaration
.h>
#include <DB/DataTypes/DataTypeNested.h>
#include <DB/Storages/IStorage.h>
#include <DB/Parsers/ASTIdentifier.h>
#include <DB/Parsers/ASTNameTypePair.h>
#include <DB/Interpreters/Context.h>
#include <boost/bind.hpp>
namespace
DB
{
bool
I
Storage
::
hasRealColumn
(
const
String
&
column_name
)
const
bool
I
ColumnsDeclaration
::
hasRealColumn
(
const
String
&
column_name
)
const
{
const
NamesAndTypesList
&
real_columns
=
getColumnsList
();
for
(
auto
&
it
:
real_columns
)
...
...
@@ -25,7 +20,7 @@ bool IStorage::hasRealColumn(const String &column_name) const
}
NameAndTypePair
I
Storage
::
getRealColumn
(
const
String
&
column_name
)
const
NameAndTypePair
I
ColumnsDeclaration
::
getRealColumn
(
const
String
&
column_name
)
const
{
const
NamesAndTypesList
&
real_columns
=
getColumnsList
();
for
(
auto
&
it
:
real_columns
)
...
...
@@ -35,30 +30,30 @@ NameAndTypePair IStorage::getRealColumn(const String &column_name) const
}
bool
I
Storage
::
hasColumn
(
const
String
&
column_name
)
const
bool
I
ColumnsDeclaration
::
hasColumn
(
const
String
&
column_name
)
const
{
return
hasRealColumn
(
column_name
);
/// По умолчанию считаем, что виртуальных столбцов в сторадже нет.
}
NameAndTypePair
I
Storage
::
getColumn
(
const
String
&
column_name
)
const
NameAndTypePair
I
ColumnsDeclaration
::
getColumn
(
const
String
&
column_name
)
const
{
return
getRealColumn
(
column_name
);
/// По умолчанию считаем, что виртуальных столбцов в сторадже нет.
}
const
DataTypePtr
I
Storage
::
getDataTypeByName
(
const
String
&
column_name
)
const
const
DataTypePtr
I
ColumnsDeclaration
::
getDataTypeByName
(
const
String
&
column_name
)
const
{
const
NamesAndTypesList
&
names_and_types
=
getColumnsList
();
for
(
NamesAndTypesList
::
const_iterator
it
=
names_and_types
.
begin
();
it
!=
names_and_types
.
end
();
++
it
)
if
(
it
->
first
==
column_name
)
return
it
->
second
;
throw
Exception
(
"There is no column "
+
column_name
+
" in table "
+
getTableName
(),
ErrorCodes
::
NO_SUCH_COLUMN_IN_TABLE
);
}
Block
I
Storage
::
getSampleBlock
()
const
Block
I
ColumnsDeclaration
::
getSampleBlock
()
const
{
Block
res
;
const
NamesAndTypesList
&
names_and_types
=
getColumnsList
();
...
...
@@ -71,7 +66,7 @@ Block IStorage::getSampleBlock() const
col
.
column
=
col
.
type
->
createColumn
();
res
.
insert
(
col
);
}
return
res
;
}
...
...
@@ -104,10 +99,10 @@ static NamesAndTypesMap getColumnsMap(const NamesAndTypesList & available_column
}
void
I
Storage
::
check
(
const
Names
&
column_names
)
const
void
I
ColumnsDeclaration
::
check
(
const
Names
&
column_names
)
const
{
const
NamesAndTypesList
&
available_columns
=
getColumnsList
();
if
(
column_names
.
empty
())
throw
Exception
(
"Empty list of columns queried for table "
+
getTableName
()
+
". There are columns: "
+
listOfColumns
(
available_columns
),
...
...
@@ -134,14 +129,14 @@ void IStorage::check(const Names & column_names) const
}
void
I
Storage
::
check
(
const
Block
&
block
,
bool
need_all
)
const
void
I
ColumnsDeclaration
::
check
(
const
Block
&
block
,
bool
need_all
)
const
{
const
NamesAndTypesList
&
available_columns
=
getColumnsList
();
const
NamesAndTypesMap
&
columns_map
=
getColumnsMap
(
available_columns
);
typedef
std
::
unordered_set
<
String
>
NameSet
;
NameSet
names_in_block
;
for
(
size_t
i
=
0
;
i
<
block
.
columns
();
++
i
)
{
const
ColumnWithNameAndType
&
column
=
block
.
getByPosition
(
i
);
...
...
@@ -163,7 +158,7 @@ void IStorage::check(const Block & block, bool need_all) const
+
". Column has type "
+
it
->
second
->
getName
()
+
", got type "
+
column
.
type
->
getName
(),
ErrorCodes
::
TYPE_MISMATCH
);
}
if
(
need_all
&&
names_in_block
.
size
()
<
columns_map
.
size
())
{
for
(
NamesAndTypesList
::
const_iterator
it
=
available_columns
.
begin
();
it
!=
available_columns
.
end
();
++
it
)
...
...
@@ -174,7 +169,6 @@ void IStorage::check(const Block & block, bool need_all) const
}
}
/// одинаковыми считаются имена, если они совпадают целиком или name_without_dot совпадает с частью имени до точки
static
bool
namesEqual
(
const
String
&
name_without_dot
,
const
DB
::
NameAndTypePair
&
name_type
)
{
...
...
@@ -182,7 +176,7 @@ static bool namesEqual(const String & name_without_dot, const DB::NameAndTypePai
return
(
name_with_dot
==
name_type
.
first
.
substr
(
0
,
name_without_dot
.
length
()
+
1
)
||
name_without_dot
==
name_type
.
first
);
}
void
I
Storage
::
alterColumns
(
const
ASTAlterQuery
::
Parameters
&
params
,
NamesAndTypesListPtr
&
columns
,
const
Context
&
context
)
const
void
I
ColumnsDeclaration
::
alterColumns
(
const
ASTAlterQuery
::
Parameters
&
params
,
NamesAndTypesListPtr
&
columns
,
const
Context
&
context
)
{
if
(
params
.
type
==
ASTAlterQuery
::
ADD
)
{
...
...
@@ -219,14 +213,14 @@ void IStorage::alterColumns(const ASTAlterQuery::Parameters & params, NamesAndTy
else
if
(
params
.
type
==
ASTAlterQuery
::
DROP
)
{
String
column_name
=
dynamic_cast
<
const
ASTIdentifier
&>
(
*
(
params
.
column
)).
name
;
/// Удаляем колонки из листа columns
bool
is_first
=
true
;
NamesAndTypesList
::
iterator
column_it
;
do
{
column_it
=
std
::
find_if
(
columns
->
begin
(),
columns
->
end
(),
boost
::
bind
(
namesEqual
,
column_name
,
_1
));
if
(
column_it
==
columns
->
end
())
{
if
(
is_first
)
...
...
@@ -252,7 +246,7 @@ void IStorage::alterColumns(const ASTAlterQuery::Parameters & params, NamesAndTy
column_it
->
second
=
data_type
;
}
else
throw
Exception
(
"Wrong parameter type in ALTER query"
,
ErrorCodes
::
LOGICAL_ERROR
);
throw
Exception
(
"Wrong parameter type in ALTER query"
,
ErrorCodes
::
LOGICAL_ERROR
);
}
}
dbms/src/Storages/MergeTree/MergeTreeData.cpp
0 → 100644
浏览文件 @
58ea3b10
此差异已折叠。
点击以展开。
dbms/src/Storages/StorageFactory.cpp
浏览文件 @
58ea3b10
...
...
@@ -192,7 +192,7 @@ StoragePtr StorageFactory::get(
return
StorageMergeTree
::
create
(
data_path
,
table_name
,
columns
,
context
,
primary_expr
,
date_column_name
,
sampling_expression
,
index_granularity
,
name
==
"SummingMergeTree"
?
StorageMergeTree
::
Summing
:
StorageMergeTree
::
Ordinary
);
name
==
"SummingMergeTree"
?
MergeTreeData
::
Summing
:
MergeTreeData
::
Ordinary
);
}
else
if
(
name
==
"CollapsingMergeTree"
)
{
...
...
@@ -234,7 +234,7 @@ StoragePtr StorageFactory::get(
return
StorageMergeTree
::
create
(
data_path
,
table_name
,
columns
,
context
,
primary_expr
,
date_column_name
,
sampling_expression
,
index_granularity
,
StorageMergeTree
::
Collapsing
,
sign_column_name
);
sampling_expression
,
index_granularity
,
MergeTreeData
::
Collapsing
,
sign_column_name
);
}
else
if
(
name
==
"SystemNumbers"
)
{
...
...
dbms/src/Storages/StorageMergeTree.cpp
浏览文件 @
58ea3b10
此差异已折叠。
点击以展开。
dbms/src/Storages/tests/MergeLogicTester.cpp
浏览文件 @
58ea3b10
...
...
@@ -37,7 +37,7 @@ DataParts copy(const DataParts &a)
const
int
RowsPerSec
=
100000
;
Storage
MergeTreeSettings
settings
;
MergeTreeSettings
settings
;
size_t
index_granularity
=
1
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录