mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-26 09:32:01 +00:00
dbms: development [#CONV-2944].
This commit is contained in:
parent
e07d47617f
commit
d9a68ccf2a
22
dbms/include/DB/Functions/FunctionsLibrary.h
Normal file
22
dbms/include/DB/Functions/FunctionsLibrary.h
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <Poco/SharedPtr.h>
|
||||||
|
|
||||||
|
#include <DB/Functions/IFunction.h>
|
||||||
|
|
||||||
|
|
||||||
|
namespace DB
|
||||||
|
{
|
||||||
|
|
||||||
|
/// имя функции -> функция
|
||||||
|
typedef std::map<String, FunctionPtr> Functions;
|
||||||
|
|
||||||
|
|
||||||
|
/// Библиотека обычных функций.
|
||||||
|
namespace FunctionsLibrary
|
||||||
|
{
|
||||||
|
/// Получить все функции.
|
||||||
|
SharedPtr<Functions> get();
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
#include <DB/Core/NamesAndTypes.h>
|
#include <DB/Core/NamesAndTypes.h>
|
||||||
#include <DB/Storages/IStorage.h>
|
#include <DB/Storages/IStorage.h>
|
||||||
#include <DB/Functions/IFunction.h>
|
#include <DB/Functions/FunctionsLibrary.h>
|
||||||
#include <DB/AggregateFunctions/AggregateFunctionFactory.h>
|
#include <DB/AggregateFunctions/AggregateFunctionFactory.h>
|
||||||
#include <DB/DataTypes/DataTypeFactory.h>
|
#include <DB/DataTypes/DataTypeFactory.h>
|
||||||
#include <DB/Storages/StorageFactory.h>
|
#include <DB/Storages/StorageFactory.h>
|
||||||
@ -20,9 +20,6 @@ namespace DB
|
|||||||
|
|
||||||
using Poco::SharedPtr;
|
using Poco::SharedPtr;
|
||||||
|
|
||||||
/// имя функции -> функция
|
|
||||||
typedef std::map<String, FunctionPtr> Functions;
|
|
||||||
|
|
||||||
/// имя таблицы -> таблица
|
/// имя таблицы -> таблица
|
||||||
typedef std::map<String, StoragePtr> Tables;
|
typedef std::map<String, StoragePtr> Tables;
|
||||||
|
|
||||||
@ -44,9 +41,30 @@ struct Context
|
|||||||
NamesAndTypesList columns; /// Столбцы текущей обрабатываемой таблицы.
|
NamesAndTypesList columns; /// Столбцы текущей обрабатываемой таблицы.
|
||||||
Settings settings; /// Настройки выполнения запроса.
|
Settings settings; /// Настройки выполнения запроса.
|
||||||
|
|
||||||
SharedPtr<Poco::FastMutex> mutex; /// Для доступа и модификации разделяемых объектов.
|
mutable SharedPtr<Poco::FastMutex> mutex; /// Для доступа и модификации разделяемых объектов.
|
||||||
|
|
||||||
Context() : databases(new Databases), functions(new Functions), mutex(new Poco::FastMutex) {}
|
Context() : databases(new Databases), functions(new Functions), mutex(new Poco::FastMutex) {}
|
||||||
|
|
||||||
|
/** В сервере есть глобальный контекст.
|
||||||
|
* При соединении, он копируется в контекст сессии.
|
||||||
|
* Для каждого запроса, контекст сессии копируется в контекст запроса.
|
||||||
|
* Блокировка нужна, так как запрос может модифицировать глобальный контекст (SET GLOBAL ...).
|
||||||
|
*/
|
||||||
|
Context(const Context & rhs)
|
||||||
|
{
|
||||||
|
Poco::ScopedLock<Poco::FastMutex> lock(*rhs.mutex);
|
||||||
|
|
||||||
|
path = rhs.path;
|
||||||
|
databases = rhs.databases;
|
||||||
|
current_database = rhs.current_database;
|
||||||
|
functions = rhs.functions;
|
||||||
|
aggregate_function_factory = rhs.aggregate_function_factory;
|
||||||
|
data_type_factory = rhs.data_type_factory;
|
||||||
|
storage_factory = rhs.storage_factory;
|
||||||
|
columns = rhs.columns;
|
||||||
|
settings = rhs.settings;
|
||||||
|
mutex = rhs.mutex;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
|
|
||||||
#include <DB/DataTypes/DataTypesNumberFixed.h>
|
#include <DB/DataTypes/DataTypesNumberFixed.h>
|
||||||
|
|
||||||
#include <DB/Functions/FunctionsArithmetic.h>
|
#include <DB/Functions/FunctionsLibrary.h>
|
||||||
|
|
||||||
#include <DB/Parsers/ParserSelectQuery.h>
|
#include <DB/Parsers/ParserSelectQuery.h>
|
||||||
|
|
||||||
@ -49,9 +49,7 @@ int main(int argc, char ** argv)
|
|||||||
|
|
||||||
DB::Context context;
|
DB::Context context;
|
||||||
context.columns.push_back(DB::NameAndTypePair("number", new DB::DataTypeUInt64));
|
context.columns.push_back(DB::NameAndTypePair("number", new DB::DataTypeUInt64));
|
||||||
(*context.functions)["plus"] = new DB::FunctionPlus;
|
context.functions = DB::FunctionsLibrary::get();
|
||||||
(*context.functions)["multiply"] = new DB::FunctionMultiply;
|
|
||||||
(*context.functions)["divide"] = new DB::FunctionDivideFloating;
|
|
||||||
|
|
||||||
Poco::SharedPtr<DB::Expression> expression = new DB::Expression(ast, context);
|
Poco::SharedPtr<DB::Expression> expression = new DB::Expression(ast, context);
|
||||||
|
|
||||||
|
@ -19,10 +19,12 @@
|
|||||||
#include <DB/DataStreams/copyData.h>
|
#include <DB/DataStreams/copyData.h>
|
||||||
|
|
||||||
#include <DB/DataTypes/DataTypesNumberFixed.h>
|
#include <DB/DataTypes/DataTypesNumberFixed.h>
|
||||||
|
#include <DB/DataTypes/DataTypeString.h>
|
||||||
|
#include <DB/DataTypes/DataTypeFixedString.h>
|
||||||
|
#include <DB/DataTypes/DataTypeDate.h>
|
||||||
|
#include <DB/DataTypes/DataTypeDateTime.h>
|
||||||
|
|
||||||
//#include <DB/Functions/FunctionsArithmetic.h>
|
#include <DB/Functions/FunctionsLibrary.h>
|
||||||
#include <DB/Functions/FunctionsComparison.h>
|
|
||||||
//#include <DB/Functions/FunctionsLogical.h>
|
|
||||||
|
|
||||||
#include <DB/Parsers/ParserSelectQuery.h>
|
#include <DB/Parsers/ParserSelectQuery.h>
|
||||||
#include <DB/Parsers/formatAST.h>
|
#include <DB/Parsers/formatAST.h>
|
||||||
@ -100,25 +102,8 @@ int main(int argc, char ** argv)
|
|||||||
|
|
||||||
DB::Context context;
|
DB::Context context;
|
||||||
|
|
||||||
/* (*context.functions)["plus"] = new DB::FunctionPlus;
|
context.functions = DB::FunctionsLibrary::get();
|
||||||
(*context.functions)["minus"] = new DB::FunctionMinus;
|
|
||||||
(*context.functions)["multiply"] = new DB::FunctionMultiply;
|
|
||||||
(*context.functions)["divide"] = new DB::FunctionDivideFloating;
|
|
||||||
(*context.functions)["intDiv"] = new DB::FunctionDivideIntegral;
|
|
||||||
(*context.functions)["modulo"] = new DB::FunctionModulo;
|
|
||||||
*/
|
|
||||||
(*context.functions)["equals"] = new DB::FunctionEquals;
|
|
||||||
/* (*context.functions)["notEquals"] = new DB::FunctionNotEquals;
|
|
||||||
(*context.functions)["less"] = new DB::FunctionLess;
|
|
||||||
(*context.functions)["greater"] = new DB::FunctionGreater;
|
|
||||||
(*context.functions)["lessOrEquals"] = new DB::FunctionLessOrEquals;
|
|
||||||
(*context.functions)["greaterOrEquals"] = new DB::FunctionGreaterOrEquals;
|
|
||||||
|
|
||||||
(*context.functions)["and"] = new DB::FunctionAnd;
|
|
||||||
(*context.functions)["or"] = new DB::FunctionOr;
|
|
||||||
(*context.functions)["xor"] = new DB::FunctionXor;
|
|
||||||
(*context.functions)["not"] = new DB::FunctionNot;
|
|
||||||
*/
|
|
||||||
context.columns = *names_and_types_list;
|
context.columns = *names_and_types_list;
|
||||||
|
|
||||||
DB::ParserSelectQuery parser;
|
DB::ParserSelectQuery parser;
|
||||||
|
97
dbms/src/Functions/FunctionsLibrary.cpp
Normal file
97
dbms/src/Functions/FunctionsLibrary.cpp
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
#include <boost/assign/list_inserter.hpp>
|
||||||
|
|
||||||
|
#include <DB/Functions/FunctionsArithmetic.h>
|
||||||
|
#include <DB/Functions/FunctionsComparison.h>
|
||||||
|
#include <DB/Functions/FunctionsLogical.h>
|
||||||
|
#include <DB/Functions/FunctionsString.h>
|
||||||
|
#include <DB/Functions/FunctionsConversion.h>
|
||||||
|
#include <DB/Functions/FunctionsDateTime.h>
|
||||||
|
#include <DB/Functions/FunctionsStringSearch.h>
|
||||||
|
#include <DB/Functions/FunctionsMiscellaneous.h>
|
||||||
|
|
||||||
|
#include <DB/Functions/FunctionsLibrary.h>
|
||||||
|
|
||||||
|
|
||||||
|
namespace DB
|
||||||
|
{
|
||||||
|
|
||||||
|
namespace FunctionsLibrary
|
||||||
|
{
|
||||||
|
SharedPtr<Functions> get()
|
||||||
|
{
|
||||||
|
Functions * res = new Functions;
|
||||||
|
|
||||||
|
boost::assign::insert(*res)
|
||||||
|
("plus", new FunctionPlus)
|
||||||
|
("minus", new FunctionMinus)
|
||||||
|
("multiply", new FunctionMultiply)
|
||||||
|
("divide", new FunctionDivideFloating)
|
||||||
|
("intDiv", new FunctionDivideIntegral)
|
||||||
|
("modulo", new FunctionModulo)
|
||||||
|
("negate", new FunctionNegate)
|
||||||
|
|
||||||
|
("equals", new FunctionEquals)
|
||||||
|
("notEquals", new FunctionNotEquals)
|
||||||
|
("less", new FunctionLess)
|
||||||
|
("greater", new FunctionGreater)
|
||||||
|
("lessOrEquals", new FunctionLessOrEquals)
|
||||||
|
("greaterOrEquals", new FunctionGreaterOrEquals)
|
||||||
|
|
||||||
|
("and", new FunctionAnd)
|
||||||
|
("or", new FunctionOr)
|
||||||
|
("xor", new FunctionXor)
|
||||||
|
("not", new FunctionNot)
|
||||||
|
|
||||||
|
("length", new FunctionLength)
|
||||||
|
("lengthUTF8", new FunctionLengthUTF8)
|
||||||
|
("lower", new FunctionLower)
|
||||||
|
("upper", new FunctionUpper)
|
||||||
|
("lowerUTF8", new FunctionLowerUTF8)
|
||||||
|
("upperUTF8", new FunctionUpperUTF8)
|
||||||
|
("reverse", new FunctionReverse)
|
||||||
|
("reverseUTF8", new FunctionReverseUTF8)
|
||||||
|
("concat", new FunctionConcat)
|
||||||
|
("substring", new FunctionSubstring)
|
||||||
|
("substringUTF8", new FunctionSubstringUTF8)
|
||||||
|
|
||||||
|
("toUInt8", new FunctionToUInt8)
|
||||||
|
("toUInt16", new FunctionToUInt16)
|
||||||
|
("toUInt32", new FunctionToUInt32)
|
||||||
|
("toUInt64", new FunctionToUInt64)
|
||||||
|
("toInt8", new FunctionToInt8)
|
||||||
|
("toInt16", new FunctionToInt16)
|
||||||
|
("toInt32", new FunctionToInt32)
|
||||||
|
("toInt64", new FunctionToInt64)
|
||||||
|
("toFloat32", new FunctionToFloat32)
|
||||||
|
("toFloat64", new FunctionToFloat64)
|
||||||
|
("toVarUInt", new FunctionToVarUInt)
|
||||||
|
("toVarInt", new FunctionToVarInt)
|
||||||
|
("toDate", new FunctionToDate)
|
||||||
|
("toDateTime", new FunctionToDateTime)
|
||||||
|
("toString", new FunctionToString)
|
||||||
|
|
||||||
|
("toYear", new FunctionToYear)
|
||||||
|
("toMonth", new FunctionToMonth)
|
||||||
|
("toDayOfMonth", new FunctionToDayOfMonth)
|
||||||
|
("toDayOfWeek", new FunctionToDayOfWeek)
|
||||||
|
("toHour", new FunctionToHour)
|
||||||
|
("toMinute", new FunctionToMinute)
|
||||||
|
("toSecond", new FunctionToSecond)
|
||||||
|
("toMonday", new FunctionToMonday)
|
||||||
|
("toStartOfMonth", new FunctionToStartOfMonth)
|
||||||
|
("toTime", new FunctionToTime)
|
||||||
|
|
||||||
|
("position", new FunctionPosition)
|
||||||
|
("positionUTF8", new FunctionPositionUTF8)
|
||||||
|
("match", new FunctionMatch)
|
||||||
|
("like", new FunctionLike)
|
||||||
|
("notLike", new FunctionNotLike)
|
||||||
|
|
||||||
|
("visibleWidth", new FunctionVisibleWidth)
|
||||||
|
;
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
@ -34,7 +34,7 @@ static void executeCreateQuery(const String & query, Context & context, const St
|
|||||||
ASTCreateQuery & ast_create_query = dynamic_cast<ASTCreateQuery &>(*ast);
|
ASTCreateQuery & ast_create_query = dynamic_cast<ASTCreateQuery &>(*ast);
|
||||||
ast_create_query.attach = true;
|
ast_create_query.attach = true;
|
||||||
ast_create_query.database = database;
|
ast_create_query.database = database;
|
||||||
|
|
||||||
InterpreterCreateQuery interpreter(ast, context);
|
InterpreterCreateQuery interpreter(ast, context);
|
||||||
interpreter.execute();
|
interpreter.execute();
|
||||||
}
|
}
|
||||||
|
@ -7,9 +7,7 @@
|
|||||||
|
|
||||||
#include <DB/DataTypes/DataTypesNumberFixed.h>
|
#include <DB/DataTypes/DataTypesNumberFixed.h>
|
||||||
|
|
||||||
#include <DB/Functions/FunctionsArithmetic.h>
|
#include <DB/Functions/FunctionsLibrary.h>
|
||||||
#include <DB/Functions/FunctionsComparison.h>
|
|
||||||
#include <DB/Functions/FunctionsLogical.h>
|
|
||||||
|
|
||||||
#include <DB/Parsers/ASTSelectQuery.h>
|
#include <DB/Parsers/ASTSelectQuery.h>
|
||||||
#include <DB/Parsers/ParserSelectQuery.h>
|
#include <DB/Parsers/ParserSelectQuery.h>
|
||||||
@ -110,25 +108,8 @@ int main(int argc, char ** argv)
|
|||||||
context.columns.push_back(DB::NameAndTypePair("s1", new DB::DataTypeString));
|
context.columns.push_back(DB::NameAndTypePair("s1", new DB::DataTypeString));
|
||||||
context.columns.push_back(DB::NameAndTypePair("s2", new DB::DataTypeString));
|
context.columns.push_back(DB::NameAndTypePair("s2", new DB::DataTypeString));
|
||||||
|
|
||||||
(*context.functions)["plus"] = new DB::FunctionPlus;
|
context.functions = DB::FunctionsLibrary::get();
|
||||||
(*context.functions)["minus"] = new DB::FunctionMinus;
|
|
||||||
(*context.functions)["multiply"] = new DB::FunctionMultiply;
|
|
||||||
(*context.functions)["divide"] = new DB::FunctionDivideFloating;
|
|
||||||
(*context.functions)["intDiv"] = new DB::FunctionDivideIntegral;
|
|
||||||
(*context.functions)["modulo"] = new DB::FunctionModulo;
|
|
||||||
|
|
||||||
(*context.functions)["equals"] = new DB::FunctionEquals;
|
|
||||||
(*context.functions)["notEquals"] = new DB::FunctionNotEquals;
|
|
||||||
(*context.functions)["less"] = new DB::FunctionLess;
|
|
||||||
(*context.functions)["greater"] = new DB::FunctionGreater;
|
|
||||||
(*context.functions)["lessOrEquals"] = new DB::FunctionLessOrEquals;
|
|
||||||
(*context.functions)["greaterOrEquals"] = new DB::FunctionGreaterOrEquals;
|
|
||||||
|
|
||||||
(*context.functions)["and"] = new DB::FunctionAnd;
|
|
||||||
(*context.functions)["or"] = new DB::FunctionOr;
|
|
||||||
(*context.functions)["xor"] = new DB::FunctionXor;
|
|
||||||
(*context.functions)["not"] = new DB::FunctionNot;
|
|
||||||
|
|
||||||
DB::Expression expression(ast, context);
|
DB::Expression expression(ast, context);
|
||||||
|
|
||||||
dump(*ast);
|
dump(*ast);
|
||||||
|
@ -15,17 +15,7 @@
|
|||||||
#include <DB/Storages/StorageSystemOne.h>
|
#include <DB/Storages/StorageSystemOne.h>
|
||||||
#include <DB/Storages/StorageFactory.h>
|
#include <DB/Storages/StorageFactory.h>
|
||||||
|
|
||||||
#include <DB/DataTypes/DataTypesNumberFixed.h>
|
#include <DB/Functions/FunctionsLibrary.h>
|
||||||
#include <DB/DataTypes/DataTypeFactory.h>
|
|
||||||
|
|
||||||
#include <DB/Functions/FunctionsArithmetic.h>
|
|
||||||
#include <DB/Functions/FunctionsComparison.h>
|
|
||||||
#include <DB/Functions/FunctionsLogical.h>
|
|
||||||
#include <DB/Functions/FunctionsString.h>
|
|
||||||
#include <DB/Functions/FunctionsConversion.h>
|
|
||||||
#include <DB/Functions/FunctionsDateTime.h>
|
|
||||||
#include <DB/Functions/FunctionsStringSearch.h>
|
|
||||||
#include <DB/Functions/FunctionsMiscellaneous.h>
|
|
||||||
|
|
||||||
#include <DB/Interpreters/loadMetadata.h>
|
#include <DB/Interpreters/loadMetadata.h>
|
||||||
#include <DB/Interpreters/executeQuery.h>
|
#include <DB/Interpreters/executeQuery.h>
|
||||||
@ -41,140 +31,9 @@ int main(int argc, char ** argv)
|
|||||||
/// Заранее инициализируем DateLUT, чтобы первая инициализация потом не влияла на измеряемую скорость выполнения.
|
/// Заранее инициализируем DateLUT, чтобы первая инициализация потом не влияла на измеряемую скорость выполнения.
|
||||||
Yandex::DateLUTSingleton::instance();
|
Yandex::DateLUTSingleton::instance();
|
||||||
|
|
||||||
DB::NamesAndTypesListPtr names_and_types_list = new DB::NamesAndTypesList;
|
|
||||||
|
|
||||||
boost::assign::push_back(*names_and_types_list)
|
|
||||||
("WatchID", new DB::DataTypeUInt64)
|
|
||||||
("JavaEnable", new DB::DataTypeUInt8)
|
|
||||||
("Title", new DB::DataTypeString)
|
|
||||||
("GoodEvent", new DB::DataTypeUInt32)
|
|
||||||
("EventTime", new DB::DataTypeDateTime)
|
|
||||||
("CounterID", new DB::DataTypeUInt32)
|
|
||||||
("ClientIP", new DB::DataTypeUInt32)
|
|
||||||
("RegionID", new DB::DataTypeUInt32)
|
|
||||||
("UniqID", new DB::DataTypeUInt64)
|
|
||||||
("CounterClass", new DB::DataTypeUInt8)
|
|
||||||
("OS", new DB::DataTypeUInt8)
|
|
||||||
("UserAgent", new DB::DataTypeUInt8)
|
|
||||||
("URL", new DB::DataTypeString)
|
|
||||||
("Referer", new DB::DataTypeString)
|
|
||||||
("Refresh", new DB::DataTypeUInt8)
|
|
||||||
("ResolutionWidth", new DB::DataTypeUInt16)
|
|
||||||
("ResolutionHeight", new DB::DataTypeUInt16)
|
|
||||||
("ResolutionDepth", new DB::DataTypeUInt8)
|
|
||||||
("FlashMajor", new DB::DataTypeUInt8)
|
|
||||||
("FlashMinor", new DB::DataTypeUInt8)
|
|
||||||
("FlashMinor2", new DB::DataTypeString)
|
|
||||||
("NetMajor", new DB::DataTypeUInt8)
|
|
||||||
("NetMinor", new DB::DataTypeUInt8)
|
|
||||||
("UserAgentMajor", new DB::DataTypeUInt16)
|
|
||||||
("UserAgentMinor", new DB::DataTypeFixedString(2))
|
|
||||||
("CookieEnable", new DB::DataTypeUInt8)
|
|
||||||
("JavascriptEnable", new DB::DataTypeUInt8)
|
|
||||||
("IsMobile", new DB::DataTypeUInt8)
|
|
||||||
("MobilePhone", new DB::DataTypeUInt8)
|
|
||||||
("MobilePhoneModel", new DB::DataTypeString)
|
|
||||||
("Params", new DB::DataTypeString)
|
|
||||||
("IPNetworkID", new DB::DataTypeUInt32)
|
|
||||||
("TraficSourceID", new DB::DataTypeInt8)
|
|
||||||
("SearchEngineID", new DB::DataTypeUInt16)
|
|
||||||
("SearchPhrase", new DB::DataTypeString)
|
|
||||||
("AdvEngineID", new DB::DataTypeUInt8)
|
|
||||||
("IsArtifical", new DB::DataTypeUInt8)
|
|
||||||
("WindowClientWidth", new DB::DataTypeUInt16)
|
|
||||||
("WindowClientHeight", new DB::DataTypeUInt16)
|
|
||||||
("ClientTimeZone", new DB::DataTypeInt16)
|
|
||||||
("ClientEventTime", new DB::DataTypeDateTime)
|
|
||||||
("SilverlightVersion1", new DB::DataTypeUInt8)
|
|
||||||
("SilverlightVersion2", new DB::DataTypeUInt8)
|
|
||||||
("SilverlightVersion3", new DB::DataTypeUInt32)
|
|
||||||
("SilverlightVersion4", new DB::DataTypeUInt16)
|
|
||||||
("PageCharset", new DB::DataTypeString)
|
|
||||||
("CodeVersion", new DB::DataTypeUInt32)
|
|
||||||
("IsLink", new DB::DataTypeUInt8)
|
|
||||||
("IsDownload", new DB::DataTypeUInt8)
|
|
||||||
("IsNotBounce", new DB::DataTypeUInt8)
|
|
||||||
("FUniqID", new DB::DataTypeUInt64)
|
|
||||||
("OriginalURL", new DB::DataTypeString)
|
|
||||||
("HID", new DB::DataTypeUInt32)
|
|
||||||
("IsOldCounter", new DB::DataTypeUInt8)
|
|
||||||
("IsEvent", new DB::DataTypeUInt8)
|
|
||||||
("IsParameter", new DB::DataTypeUInt8)
|
|
||||||
("DontCountHits", new DB::DataTypeUInt8)
|
|
||||||
("WithHash", new DB::DataTypeUInt8)
|
|
||||||
;
|
|
||||||
|
|
||||||
DB::Context context;
|
DB::Context context;
|
||||||
|
|
||||||
boost::assign::insert(*context.functions)
|
context.functions = DB::FunctionsLibrary::get();
|
||||||
("plus", new DB::FunctionPlus)
|
|
||||||
("minus", new DB::FunctionMinus)
|
|
||||||
("multiply", new DB::FunctionMultiply)
|
|
||||||
("divide", new DB::FunctionDivideFloating)
|
|
||||||
("intDiv", new DB::FunctionDivideIntegral)
|
|
||||||
("modulo", new DB::FunctionModulo)
|
|
||||||
("negate", new DB::FunctionNegate)
|
|
||||||
|
|
||||||
("equals", new DB::FunctionEquals)
|
|
||||||
("notEquals", new DB::FunctionNotEquals)
|
|
||||||
("less", new DB::FunctionLess)
|
|
||||||
("greater", new DB::FunctionGreater)
|
|
||||||
("lessOrEquals", new DB::FunctionLessOrEquals)
|
|
||||||
("greaterOrEquals", new DB::FunctionGreaterOrEquals)
|
|
||||||
|
|
||||||
("and", new DB::FunctionAnd)
|
|
||||||
("or", new DB::FunctionOr)
|
|
||||||
("xor", new DB::FunctionXor)
|
|
||||||
("not", new DB::FunctionNot)
|
|
||||||
|
|
||||||
("length", new DB::FunctionLength)
|
|
||||||
("lengthUTF8", new DB::FunctionLengthUTF8)
|
|
||||||
("lower", new DB::FunctionLower)
|
|
||||||
("upper", new DB::FunctionUpper)
|
|
||||||
("lowerUTF8", new DB::FunctionLowerUTF8)
|
|
||||||
("upperUTF8", new DB::FunctionUpperUTF8)
|
|
||||||
("reverse", new DB::FunctionReverse)
|
|
||||||
("reverseUTF8", new DB::FunctionReverseUTF8)
|
|
||||||
("concat", new DB::FunctionConcat)
|
|
||||||
("substring", new DB::FunctionSubstring)
|
|
||||||
("substringUTF8", new DB::FunctionSubstringUTF8)
|
|
||||||
|
|
||||||
("toUInt8", new DB::FunctionToUInt8)
|
|
||||||
("toUInt16", new DB::FunctionToUInt16)
|
|
||||||
("toUInt32", new DB::FunctionToUInt32)
|
|
||||||
("toUInt64", new DB::FunctionToUInt64)
|
|
||||||
("toInt8", new DB::FunctionToInt8)
|
|
||||||
("toInt16", new DB::FunctionToInt16)
|
|
||||||
("toInt32", new DB::FunctionToInt32)
|
|
||||||
("toInt64", new DB::FunctionToInt64)
|
|
||||||
("toFloat32", new DB::FunctionToFloat32)
|
|
||||||
("toFloat64", new DB::FunctionToFloat64)
|
|
||||||
("toVarUInt", new DB::FunctionToVarUInt)
|
|
||||||
("toVarInt", new DB::FunctionToVarInt)
|
|
||||||
("toDate", new DB::FunctionToDate)
|
|
||||||
("toDateTime", new DB::FunctionToDateTime)
|
|
||||||
("toString", new DB::FunctionToString)
|
|
||||||
|
|
||||||
("toYear", new DB::FunctionToYear)
|
|
||||||
("toMonth", new DB::FunctionToMonth)
|
|
||||||
("toDayOfMonth", new DB::FunctionToDayOfMonth)
|
|
||||||
("toDayOfWeek", new DB::FunctionToDayOfWeek)
|
|
||||||
("toHour", new DB::FunctionToHour)
|
|
||||||
("toMinute", new DB::FunctionToMinute)
|
|
||||||
("toSecond", new DB::FunctionToSecond)
|
|
||||||
("toMonday", new DB::FunctionToMonday)
|
|
||||||
("toStartOfMonth", new DB::FunctionToStartOfMonth)
|
|
||||||
("toTime", new DB::FunctionToTime)
|
|
||||||
|
|
||||||
("position", new DB::FunctionPosition)
|
|
||||||
("positionUTF8", new DB::FunctionPositionUTF8)
|
|
||||||
("match", new DB::FunctionMatch)
|
|
||||||
("like", new DB::FunctionLike)
|
|
||||||
("notLike", new DB::FunctionNotLike)
|
|
||||||
|
|
||||||
("visibleWidth", new DB::FunctionVisibleWidth)
|
|
||||||
;
|
|
||||||
|
|
||||||
context.path = "./";
|
context.path = "./";
|
||||||
|
|
||||||
context.aggregate_function_factory = new DB::AggregateFunctionFactory;
|
context.aggregate_function_factory = new DB::AggregateFunctionFactory;
|
||||||
@ -183,9 +42,6 @@ int main(int argc, char ** argv)
|
|||||||
|
|
||||||
DB::loadMetadata(context);
|
DB::loadMetadata(context);
|
||||||
|
|
||||||
(*context.databases)["default"]["hits"] = new DB::StorageLog("./data/default/", "hits", names_and_types_list);
|
|
||||||
(*context.databases)["default"]["hits2"] = new DB::StorageLog("./data/default/", "hits2", names_and_types_list);
|
|
||||||
(*context.databases)["default"]["hits3"] = new DB::StorageLog("./data/default/", "hits3", names_and_types_list);
|
|
||||||
(*context.databases)["system"]["one"] = new DB::StorageSystemOne("one");
|
(*context.databases)["system"]["one"] = new DB::StorageSystemOne("one");
|
||||||
(*context.databases)["system"]["numbers"] = new DB::StorageSystemNumbers("numbers");
|
(*context.databases)["system"]["numbers"] = new DB::StorageSystemNumbers("numbers");
|
||||||
context.current_database = "default";
|
context.current_database = "default";
|
||||||
|
87
dbms/src/Server/Handler.cpp
Normal file
87
dbms/src/Server/Handler.cpp
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
#include <Poco/URI.h>
|
||||||
|
|
||||||
|
#include <DB/Core/ErrorCodes.h>
|
||||||
|
|
||||||
|
#include <DB/IO/ReadBufferFromIStream.h>
|
||||||
|
#include <DB/IO/WriteBufferFromOStream.h>
|
||||||
|
#include <DB/IO/WriteBufferFromString.h>
|
||||||
|
#include <DB/IO/WriteHelpers.h>
|
||||||
|
|
||||||
|
#include <DB/Interpreters/executeQuery.h>
|
||||||
|
|
||||||
|
#include "Handler.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace DB
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
struct HTMLForm : public Poco::Net::HTMLForm
|
||||||
|
{
|
||||||
|
HTMLForm(Poco::Net::HTTPRequest & request)
|
||||||
|
{
|
||||||
|
Poco::URI uri(request.getURI());
|
||||||
|
std::istringstream istr(uri.getRawQuery());
|
||||||
|
readUrl(istr);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
void HTTPRequestHandler::processQuery(Poco::Net::NameValueCollection & params, std::ostream & ostr, std::istream & istr)
|
||||||
|
{
|
||||||
|
BlockInputStreamPtr query_plan;
|
||||||
|
ReadBufferFromIStream in(istr);
|
||||||
|
WriteBufferFromOStream out(ostr);
|
||||||
|
Context context = server.global_context;
|
||||||
|
|
||||||
|
executeQuery(in, out, context, query_plan);
|
||||||
|
|
||||||
|
if (query_plan)
|
||||||
|
{
|
||||||
|
std::stringstream log_str;
|
||||||
|
log_str << "Query plan:\n";
|
||||||
|
query_plan->dumpTree(log_str);
|
||||||
|
LOG_DEBUG(log, log_str.str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void HTTPRequestHandler::handleRequest(Poco::Net::HTTPServerRequest & request, Poco::Net::HTTPServerResponse & response)
|
||||||
|
{
|
||||||
|
std::ostream & ostr = response.send();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
LOG_TRACE(log, "Request URI: " << request.getURI());
|
||||||
|
|
||||||
|
HTMLForm params(request);
|
||||||
|
std::istream & istr = request.stream();
|
||||||
|
processQuery(params, ostr, istr);
|
||||||
|
|
||||||
|
LOG_INFO(log, "Done processing query");
|
||||||
|
}
|
||||||
|
catch (Poco::Exception & e)
|
||||||
|
{
|
||||||
|
std::stringstream s;
|
||||||
|
s << "Code: " << ErrorCodes::POCO_EXCEPTION << ", e.code() = " << e.code()
|
||||||
|
<< ", e.message() = " << e.message() << ", e.what() = " << e.what();
|
||||||
|
ostr << s.str() << std::endl;
|
||||||
|
LOG_ERROR(log, s.str());
|
||||||
|
}
|
||||||
|
catch (std::exception & e)
|
||||||
|
{
|
||||||
|
std::stringstream s;
|
||||||
|
s << "Code: " << ErrorCodes::STD_EXCEPTION << ". " << e.what();
|
||||||
|
ostr << s.str() << std::endl;
|
||||||
|
LOG_ERROR(log, s.str());
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
std::stringstream s;
|
||||||
|
s << "Code: " << ErrorCodes::UNKNOWN_EXCEPTION << ". Unknown exception.";
|
||||||
|
ostr << s.str() << std::endl;
|
||||||
|
LOG_ERROR(log, s.str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
31
dbms/src/Server/Handler.h
Normal file
31
dbms/src/Server/Handler.h
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <Poco/Net/HTMLForm.h>
|
||||||
|
|
||||||
|
#include "Server.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace DB
|
||||||
|
{
|
||||||
|
|
||||||
|
class HTTPRequestHandler : public Poco::Net::HTTPRequestHandler
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
HTTPRequestHandler(Server & server_)
|
||||||
|
: server(server_)
|
||||||
|
, log(&Logger::get("HTTPRequestHandler"))
|
||||||
|
{
|
||||||
|
LOG_TRACE(log, "In constructor.");
|
||||||
|
}
|
||||||
|
|
||||||
|
void handleRequest(Poco::Net::HTTPServerRequest & request, Poco::Net::HTTPServerResponse & response);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Server & server;
|
||||||
|
|
||||||
|
Logger * log;
|
||||||
|
|
||||||
|
void processQuery(Poco::Net::NameValueCollection & params, std::ostream & ostr, std::istream & istr);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
87
dbms/src/Server/Server.cpp
Normal file
87
dbms/src/Server/Server.cpp
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
#include <Poco/Net/HTTPServerRequest.h>
|
||||||
|
|
||||||
|
#include <Yandex/ApplicationServerExt.h>
|
||||||
|
|
||||||
|
#include <DB/Functions/FunctionsLibrary.h>
|
||||||
|
#include <DB/Interpreters/loadMetadata.h>
|
||||||
|
#include <DB/Storages/StorageSystemNumbers.h>
|
||||||
|
#include <DB/Storages/StorageSystemOne.h>
|
||||||
|
|
||||||
|
#include "Server.h"
|
||||||
|
#include "Handler.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace DB
|
||||||
|
{
|
||||||
|
|
||||||
|
/// Отвечает "Ok.\n", если получен любой GET запрос. Используется для проверки живости.
|
||||||
|
class PingRequestHandler : public Poco::Net::HTTPRequestHandler
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
PingRequestHandler()
|
||||||
|
{
|
||||||
|
LOG_TRACE((&Logger::get("PingRequestHandler")), "Ping request.");
|
||||||
|
}
|
||||||
|
|
||||||
|
void handleRequest(Poco::Net::HTTPServerRequest & request, Poco::Net::HTTPServerResponse & response)
|
||||||
|
{
|
||||||
|
response.send() << "Ok." << std::endl;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Poco::Net::HTTPRequestHandler * HTTPRequestHandlerFactory::createRequestHandler(
|
||||||
|
const Poco::Net::HTTPServerRequest & request)
|
||||||
|
{
|
||||||
|
LOG_TRACE(log, "HTTP Request. "
|
||||||
|
<< "Method: " << request.getMethod()
|
||||||
|
<< ", Address: " << request.clientAddress().toString()
|
||||||
|
<< ", User-Agent: " << (request.has("User-Agent") ? request.get("User-Agent") : "none"));
|
||||||
|
|
||||||
|
if (request.getURI().find('?') != std::string::npos)
|
||||||
|
return new HTTPRequestHandler(server);
|
||||||
|
else if (request.getMethod() == Poco::Net::HTTPRequest::HTTP_GET)
|
||||||
|
return new PingRequestHandler();
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int Server::main(const std::vector<std::string> & args)
|
||||||
|
{
|
||||||
|
/// Заранее инициализируем DateLUT, чтобы первая инициализация потом не влияла на измеряемую скорость выполнения.
|
||||||
|
Yandex::DateLUTSingleton::instance();
|
||||||
|
|
||||||
|
global_context.path = config.getString("path");
|
||||||
|
global_context.functions = FunctionsLibrary::get();
|
||||||
|
global_context.aggregate_function_factory = new AggregateFunctionFactory;
|
||||||
|
global_context.data_type_factory = new DataTypeFactory;
|
||||||
|
global_context.storage_factory = new StorageFactory;
|
||||||
|
|
||||||
|
loadMetadata(global_context);
|
||||||
|
|
||||||
|
(*global_context.databases)["system"]["one"] = new StorageSystemOne("one");
|
||||||
|
(*global_context.databases)["system"]["numbers"] = new StorageSystemNumbers("numbers");
|
||||||
|
|
||||||
|
global_context.current_database = config.getString("default_database", "default");
|
||||||
|
|
||||||
|
Poco::Net::ServerSocket socket(Poco::Net::SocketAddress("[::]:" + config.getString("http_port")));
|
||||||
|
|
||||||
|
Poco::ThreadPool server_pool(2, config.getInt("max_threads", 128));
|
||||||
|
|
||||||
|
Poco::Net::HTTPServer server(
|
||||||
|
new HTTPRequestHandlerFactory(*this),
|
||||||
|
server_pool,
|
||||||
|
socket,
|
||||||
|
new Poco::Net::HTTPServerParams);
|
||||||
|
|
||||||
|
server.start();
|
||||||
|
waitForTerminationRequest();
|
||||||
|
server.stop();
|
||||||
|
return Application::EXIT_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
YANDEX_APP_SERVER_MAIN(DB::Server);
|
78
dbms/src/Server/Server.h
Normal file
78
dbms/src/Server/Server.h
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <Poco/Util/LayeredConfiguration.h>
|
||||||
|
|
||||||
|
#include <Poco/Net/HTTPServer.h>
|
||||||
|
#include <Poco/Net/HTTPRequestHandlerFactory.h>
|
||||||
|
#include <Poco/Net/HTTPRequestHandler.h>
|
||||||
|
#include <Poco/Net/HTTPRequest.h>
|
||||||
|
#include <Poco/Net/HTTPServerParams.h>
|
||||||
|
#include <Poco/Net/HTTPServerRequest.h>
|
||||||
|
#include <Poco/Net/HTTPServerResponse.h>
|
||||||
|
|
||||||
|
#include <Yandex/logger_useful.h>
|
||||||
|
#include <Yandex/daemon.h>
|
||||||
|
|
||||||
|
#include <DB/Interpreters/Context.h>
|
||||||
|
|
||||||
|
/** Сервер предоставляет два интерфейса:
|
||||||
|
* 1. HTTP - простой интерфейс для доступа из любых приложений.
|
||||||
|
* 2. TCP - интерфейс для доступа из родной библиотеки, родного клиента, и для межсерверного взаимодействия.
|
||||||
|
* Более эффективен, так как
|
||||||
|
* - данные передаются по столбцам;
|
||||||
|
* - данные передаются со сжатием;
|
||||||
|
* - возможно выполнение нескольких запросов одновременно;
|
||||||
|
* Позволяет тонко управлять настройками и получать более подробную информацию в ответах.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
namespace DB
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
class Server;
|
||||||
|
|
||||||
|
class HTTPRequestHandlerFactory : public Poco::Net::HTTPRequestHandlerFactory
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
Server & server;
|
||||||
|
Logger * log;
|
||||||
|
|
||||||
|
public:
|
||||||
|
HTTPRequestHandlerFactory(Server & server_) : server(server_), log(&Logger::get("RequestHandlerFactory")) {}
|
||||||
|
Poco::Net::HTTPRequestHandler * createRequestHandler(const Poco::Net::HTTPServerRequest & request);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class Server : public Daemon
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
Logger * log;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Poco::Util::LayeredConfiguration & config;
|
||||||
|
|
||||||
|
/// Глобальные настройки севрера
|
||||||
|
Context global_context;
|
||||||
|
|
||||||
|
|
||||||
|
Server() : log(&Logger::get("Server")), config(Application::instance().config()) {}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void initialize(Application& self)
|
||||||
|
{
|
||||||
|
Daemon::initialize(self);
|
||||||
|
logger().information("starting up");
|
||||||
|
}
|
||||||
|
|
||||||
|
void uninitialize()
|
||||||
|
{
|
||||||
|
logger().information("shutting down");
|
||||||
|
Daemon::uninitialize();
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(const std::vector<std::string>& args);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
}
|
61
dbms/src/Server/metadata/default/hits.sql
Normal file
61
dbms/src/Server/metadata/default/hits.sql
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
ATTACH TABLE hits
|
||||||
|
(
|
||||||
|
WatchID UInt64,
|
||||||
|
JavaEnable UInt8,
|
||||||
|
Title String,
|
||||||
|
GoodEvent UInt32,
|
||||||
|
EventTime DateTime,
|
||||||
|
CounterID UInt32,
|
||||||
|
ClientIP UInt32,
|
||||||
|
RegionID UInt32,
|
||||||
|
UniqID UInt64,
|
||||||
|
CounterClass UInt8,
|
||||||
|
OS UInt8,
|
||||||
|
UserAgent UInt8,
|
||||||
|
URL String,
|
||||||
|
Referer String,
|
||||||
|
Refresh UInt8,
|
||||||
|
ResolutionWidth UInt16,
|
||||||
|
ResolutionHeight UInt16,
|
||||||
|
ResolutionDepth UInt8,
|
||||||
|
FlashMajor UInt8,
|
||||||
|
FlashMinor UInt8,
|
||||||
|
FlashMinor2 String,
|
||||||
|
NetMajor UInt8,
|
||||||
|
NetMinor UInt8,
|
||||||
|
UserAgentMajor UInt16,
|
||||||
|
UserAgentMinor FixedString(2),
|
||||||
|
CookieEnable UInt8,
|
||||||
|
JavascriptEnable UInt8,
|
||||||
|
IsMobile UInt8,
|
||||||
|
MobilePhone UInt8,
|
||||||
|
MobilePhoneModel String,
|
||||||
|
Params String,
|
||||||
|
IPNetworkID UInt32,
|
||||||
|
TraficSourceID Int8,
|
||||||
|
SearchEngineID UInt16,
|
||||||
|
SearchPhrase String,
|
||||||
|
AdvEngineID UInt8,
|
||||||
|
IsArtifical UInt8,
|
||||||
|
WindowClientWidth UInt16,
|
||||||
|
WindowClientHeight UInt16,
|
||||||
|
ClientTimeZone Int16,
|
||||||
|
ClientEventTime DateTime,
|
||||||
|
SilverlightVersion1 UInt8,
|
||||||
|
SilverlightVersion2 UInt8,
|
||||||
|
SilverlightVersion3 UInt32,
|
||||||
|
SilverlightVersion4 UInt16,
|
||||||
|
PageCharset String,
|
||||||
|
CodeVersion UInt32,
|
||||||
|
IsLink UInt8,
|
||||||
|
IsDownload UInt8,
|
||||||
|
IsNotBounce UInt8,
|
||||||
|
FUniqID UInt64,
|
||||||
|
OriginalURL String,
|
||||||
|
HID UInt32,
|
||||||
|
IsOldCounter UInt8,
|
||||||
|
IsEvent UInt8,
|
||||||
|
IsParameter UInt8,
|
||||||
|
DontCountHits UInt8,
|
||||||
|
WithHash UInt8
|
||||||
|
) ENGINE = Log
|
Loading…
Reference in New Issue
Block a user