dbms: development [#CONV-2504].

This commit is contained in:
Alexey Milovidov 2011-08-09 19:19:00 +00:00
parent cd7e317362
commit 9f5cc680a4
36 changed files with 195 additions and 91 deletions

View File

@ -27,13 +27,13 @@ public:
typedef std::vector<size_t> Offsets_t;
/** Создать пустой столбец массивов, с типом значений, как в столбце nested_column */
ColumnArray(SharedPtr<IColumn> nested_column)
ColumnArray(ColumnPtr nested_column)
: data(nested_column)
{
data->clear();
}
SharedPtr<IColumn> cloneEmpty() const
ColumnPtr cloneEmpty() const
{
return new ColumnArray(data->cloneEmpty());
}
@ -119,7 +119,7 @@ public:
}
protected:
SharedPtr<IColumn> data;
ColumnPtr data;
Offsets_t offsets;
};

View File

@ -21,7 +21,7 @@ class ColumnConst : public IColumn
public:
ColumnConst(size_t s_, T & data_) : s(s_), data(data_) {}
SharedPtr<IColumn> cloneEmpty() const { return new ColumnConst(0, data); }
ColumnPtr cloneEmpty() const { return new ColumnConst(0, data); }
size_t size() const { return s; }
Field operator[](size_t n) const { return data; }
void cut(size_t start, size_t length) { s = length; }
@ -37,7 +37,7 @@ public:
const T & getData() const { return data; }
/** Преобразование из константы в полноценный столбец */
virtual SharedPtr<IColumn> convertToFullColumn() const = 0;
virtual ColumnPtr convertToFullColumn() const = 0;
private:
size_t s;

View File

@ -20,13 +20,13 @@ class ColumnFixedArray : public IColumn
{
public:
/** Создать пустой столбец массивов фиксированного размера n, со типом значений, как в столбце nested_column */
ColumnFixedArray(SharedPtr<IColumn> nested_column, size_t n_)
ColumnFixedArray(ColumnPtr nested_column, size_t n_)
: data(nested_column), n(n_)
{
clear();
}
SharedPtr<IColumn> cloneEmpty() const
ColumnPtr cloneEmpty() const
{
return new ColumnFixedArray(data->cloneEmpty(), n);
}
@ -83,7 +83,7 @@ public:
}
protected:
SharedPtr<IColumn> data;
ColumnPtr data;
const size_t n;
};

View File

@ -26,7 +26,7 @@ public:
{
}
SharedPtr<IColumn> cloneEmpty() const
ColumnPtr cloneEmpty() const
{
return new ColumnFixedString(n);
}

View File

@ -25,13 +25,13 @@ public:
typedef std::vector<Flag_t> Nulls_t;
/** Создать пустой столбец, с типом значений, как в столбце nested_column */
ColumnNullable(SharedPtr<IColumn> nested_column)
ColumnNullable(ColumnPtr nested_column)
: data(nested_column)
{
data.clear();
}
SharedPtr<IColumn> cloneEmpty() const
ColumnPtr cloneEmpty() const
{
return new ColumnNullable(data->cloneEmpty());
}
@ -111,7 +111,7 @@ public:
}
private:
SharedPtr<IColumn> data;
ColumnPtr data;
Nulls_t nulls;
};

View File

@ -26,7 +26,7 @@ public:
{
}
SharedPtr<IColumn> cloneEmpty() const
ColumnPtr cloneEmpty() const
{
return new ColumnString;
}

View File

@ -7,7 +7,7 @@
#include <DB/Core/Exception.h>
#include <DB/Core/ErrorCodes.h>
#include <DB/Column/IColumn.h>
#include <DB/Columns/IColumn.h>
namespace DB
@ -43,7 +43,7 @@ public:
checkSizes();
}
SharedPtr<IColumn> cloneEmpty() const
ColumnPtr cloneEmpty() const
{
Container_t new_data(data.size());
for (size_t i = 0; i < data.size(); ++i)
@ -94,7 +94,7 @@ public:
/// манипуляция с Tuple
void insertColumn(size_t pos, SharedPtr<IColumn> & column)
void insertColumn(size_t pos, ColumnPtr & column)
{
if (pos > data.size())
throw Exception("Position out of bound in ColumnTuple::insertColumn().",

View File

@ -24,7 +24,7 @@ public:
ColumnVector() {}
ColumnVector(size_t n) : data(n) {}
SharedPtr<IColumn> cloneEmpty() const
ColumnPtr cloneEmpty() const
{
return new ColumnVector<T>;
}

View File

@ -1,18 +0,0 @@
#ifndef DBMS_COLUMNS_COLUMNS_H
#define DBMS_COLUMNS_COLUMNS_H
#include <vector>
#include <Poco/SharedPtr.h>
#include <DB/Columns/IColumn.h>
namespace DB
{
using Poco::SharedPtr;
typedef std::vector<SharedPtr<IColumn> > Columns;
}
#endif

View File

@ -49,6 +49,9 @@ public:
};
typedef SharedPtr<IColumn> ColumnPtr;
typedef std::vector<ColumnPtr> Columns;
}
#endif

View File

@ -17,8 +17,8 @@ using Poco::SharedPtr;
struct ColumnWithNameAndType
{
SharedPtr<IColumn> column;
SharedPtr<IDataType> type;
ColumnPtr column;
DataTypePtr type;
String name;
};

View File

@ -2,11 +2,16 @@
#define DBMS_CORE_FIELD_H
#include <vector>
#include <sstream>
#include <boost/variant.hpp>
#include <boost/variant/recursive_variant.hpp>
#include <boost/variant/static_visitor.hpp>
#include <Poco/NumberFormatter.h>
#include <mysqlxx/mysqlxx.h>
#include <DB/Core/Types.h>
@ -64,6 +69,39 @@ public:
FieldType::Enum operator() (const Array & x) const { return FieldType::Array; }
};
/** Возвращает строковый дамп типа */
class FieldVisitorDump : public boost::static_visitor<std::string>
{
public:
std::string operator() (const Null & x) const { return "NULL"; }
std::string operator() (const UInt64 & x) const { return "UInt64_" + Poco::NumberFormatter::format(x); }
std::string operator() (const Int64 & x) const { return "Int64_" + Poco::NumberFormatter::format(x); }
std::string operator() (const Float64 & x) const { return "Float64_" + Poco::NumberFormatter::format(x); }
std::string operator() (const String & x) const
{
std::stringstream s;
s << mysqlxx::quote << x;
return s.str();
}
std::string operator() (const Array & x) const
{
std::stringstream s;
s << "Array_[";
for (Array::const_iterator it = x.begin(); it != x.end(); ++it)
{
if (it != x.begin())
s << ", ";
s << boost::apply_visitor(FieldVisitorDump(), *it);
}
s << "]";
return s.str();
}
};
template <typename T> struct NearestFieldType;

View File

@ -17,7 +17,7 @@ using Poco::SharedPtr;
struct NameAndType
{
SharedPtr<IDataType> type;
DataTypePtr type;
String name;
};

View File

@ -14,7 +14,7 @@ namespace DB
using Poco::SharedPtr;
typedef std::map<std::string, SharedPtr<IDataType> > NamesAndTypes;
typedef std::map<std::string, DataTypePtr> NamesAndTypes;
}

View File

@ -1,10 +1,9 @@
#ifndef DBMS_DATA_STREAMS_TABSEPARATEDROWINPUTSTREAM_H
#define DBMS_DATA_STREAMS_TABSEPARATEDROWINPUTSTREAM_H
#pragma once
#include <Poco/SharedPtr.h>
#include <DB/IO/ReadBuffer.h>
#include <DB/DataTypes/DataTypes.h>
#include <DB/DataTypes/IDataType.h>
#include <DB/DataStreams/IRowInputStream.h>
@ -29,5 +28,3 @@ private:
};
}
#endif

View File

@ -1,10 +1,9 @@
#ifndef DBMS_DATA_STREAMS_TABSEPARATEDROWOUTPUTSTREAM_H
#define DBMS_DATA_STREAMS_TABSEPARATEDROWOUTPUTSTREAM_H
#pragma once
#include <Poco/SharedPtr.h>
#include <DB/IO/WriteBuffer.h>
#include <DB/DataTypes/DataTypes.h>
#include <DB/DataTypes/IDataType.h>
#include <DB/DataStreams/IRowOutputStream.h>
@ -33,4 +32,3 @@ private:
}
#endif

View File

@ -16,7 +16,7 @@ public:
DataTypeDate() {}
std::string getName() const { return "Date"; }
SharedPtr<IDataType> clone() const { return new DataTypeDate; }
DataTypePtr clone() const { return new DataTypeDate; }
void serializeText(const Field & field, WriteBuffer & ostr) const
{

View File

@ -16,7 +16,7 @@ public:
DataTypeDateTime() {}
std::string getName() const { return "DateTime"; }
SharedPtr<IDataType> clone() const { return new DataTypeDateTime; }
DataTypePtr clone() const { return new DataTypeDateTime; }
void serializeText(const Field & field, WriteBuffer & ostr) const
{

View File

@ -27,7 +27,7 @@ public:
return "FixedString(" + Poco::NumberFormatter::format(n) + ")";
}
SharedPtr<IDataType> clone() const
DataTypePtr clone() const
{
return new DataTypeFixedString(n);
}
@ -46,7 +46,7 @@ public:
void serializeTextQuoted(const Field & field, WriteBuffer & ostr, bool compatible = false) const;
void deserializeTextQuoted(Field & field, ReadBuffer & istr, bool compatible = false) const;
SharedPtr<IColumn> createColumn() const;
ColumnPtr createColumn() const;
};
}

View File

@ -22,7 +22,7 @@ public:
return "String";
}
SharedPtr<IDataType> clone() const
DataTypePtr clone() const
{
return new DataTypeString;
}
@ -41,7 +41,7 @@ public:
void serializeTextQuoted(const Field & field, WriteBuffer & ostr, bool compatible = false) const;
void deserializeTextQuoted(Field & field, ReadBuffer & istr, bool compatible = false) const;
SharedPtr<IColumn> createColumn() const;
ColumnPtr createColumn() const;
};
}

View File

@ -1,20 +0,0 @@
#ifndef DBMS_DATA_TYPES_DATATYPES_H
#define DBMS_DATA_TYPES_DATATYPES_H
#include <vector>
#include <Poco/SharedPtr.h>
#include <DB/DataTypes/IDataType.h>
namespace DB
{
using Poco::SharedPtr;
typedef std::vector<SharedPtr<IDataType> > DataTypes;
}
#endif

View File

@ -17,7 +17,7 @@ struct DataTypeFromFieldType;
{ \
public: \
std::string getName() const { return #TYPE; } \
SharedPtr<IDataType> clone() const { return new DataType ## TYPE; } \
DataTypePtr clone() const { return new DataType ## TYPE; } \
}; \
\
template <> struct DataTypeFromFieldType<TYPE> \

View File

@ -14,14 +14,14 @@ class DataTypeVarUInt : public IDataTypeNumberVariable<UInt64, ColumnUInt64>
{
public:
std::string getName() const { return "VarUInt"; }
SharedPtr<IDataType> clone() const { return new DataTypeVarUInt; }
DataTypePtr clone() const { return new DataTypeVarUInt; }
};
class DataTypeVarInt : public IDataTypeNumberVariable<Int64, ColumnInt64>
{
public:
std::string getName() const { return "VarInt"; }
SharedPtr<IDataType> clone() const { return new DataTypeVarInt; }
DataTypePtr clone() const { return new DataTypeVarInt; }
};
}

View File

@ -1,5 +1,4 @@
#ifndef DBMS_DATA_TYPES_IDATATYPE_H
#define DBMS_DATA_TYPES_IDATATYPE_H
#pragma once
#include <Poco/SharedPtr.h>
@ -61,6 +60,9 @@ public:
virtual ~IDataType() {}
};
typedef Poco::SharedPtr<IDataType> DataTypePtr;
typedef std::vector<DataTypePtr> DataTypes;
}
#endif

View File

@ -51,7 +51,7 @@ public:
x.resize(size / sizeof(typename ColumnType::value_type));
}
SharedPtr<IColumn> createColumn() const
ColumnPtr createColumn() const
{
return new ColumnType;
}

View File

@ -58,7 +58,7 @@ public:
}
}
SharedPtr<IColumn> createColumn() const
ColumnPtr createColumn() const
{
return new ColumnType;
}

View File

@ -1,10 +1,11 @@
#pragma once
#include <Poco/SharedPtr.h>
#include <DB/Core/Names.h>
#include <DB/Core/Block.h>
#include <DB/Core/ColumnNumbers.h>
#include <DB/DataTypes/IDataType.h>
#include <DB/DataTypes/DataTypes.h>
namespace DB
@ -40,4 +41,9 @@ public:
};
using Poco::SharedPtr;
typedef SharedPtr<IFunction> FunctionPtr;
}

View File

@ -23,6 +23,12 @@ public:
/** Получить кусок текста, откуда был получен этот элемент. */
StringRange getRange() { return range; }
/** Получить всех детей. */
ASTs getChildren() { return children; }
/** Получить текст, который идентифицирует этот элемент. */
String getID() { return "ExpressionList"; }
};
}

View File

@ -2,6 +2,7 @@
#define DBMS_PARSERS_ASTFUNCTION_H
#include <DB/Parsers/IAST.h>
#include <DB/Functions/IFunction.h>
namespace DB
@ -18,11 +19,25 @@ public:
/// параметры
ASTPtr arguments;
/// сама функция
FunctionPtr function;
ASTFunction() {}
ASTFunction(StringRange range_) : range(range_) {}
/** Получить кусок текста, откуда был получен этот элемент. */
StringRange getRange() { return range; }
/** Получить всех детей. */
ASTs getChildren()
{
ASTs res;
res.push_back(arguments);
return res;
}
/** Получить текст, который идентифицирует этот элемент. */
String getID() { return "Function_" + name; }
};
}

View File

@ -1,6 +1,7 @@
#ifndef DBMS_PARSERS_ASTIDENTIFIER_H
#define DBMS_PARSERS_ASTIDENTIFIER_H
#include <DB/DataTypes/IDataType.h>
#include <DB/Parsers/IAST.h>
@ -15,12 +16,20 @@ public:
StringRange range;
/// имя
String name;
/// тип
DataTypePtr type;
ASTIdentifier() {}
ASTIdentifier(StringRange range_, const String & name_) : range(range_), name(name_) {}
/** Получить кусок текста, откуда был получен этот элемент. */
StringRange getRange() { return range; }
/** Получить всех детей. */
ASTs getChildren() { return ASTs(); }
/** Получить текст, который идентифицирует этот элемент. */
String getID() { return "Identifier_" + name; }
};
}

View File

@ -22,6 +22,12 @@ public:
/** Получить кусок текста, откуда был получен этот элемент. */
StringRange getRange() { return range; }
/** Получить всех детей. */
ASTs getChildren() { return ASTs(); }
/** Получить текст, который идентифицирует этот элемент. */
String getID() { return "Literal_" + boost::apply_visitor(FieldVisitorDump(), value); }
};
}

View File

@ -21,6 +21,30 @@ public:
/** Получить кусок текста, откуда был получен этот элемент. */
StringRange getRange() { return range; }
/** Получить всех детей. */
ASTs getChildren()
{
ASTs res;
if (!select.isNull())
res.push_back(select);
if (!from.isNull())
res.push_back(from);
if (!where.isNull())
res.push_back(where);
if (!group.isNull())
res.push_back(group);
if (!having.isNull())
res.push_back(having);
if (!order.isNull())
res.push_back(order);
if (!limit.isNull())
res.push_back(limit);
return res;
}
/** Получить текст, который идентифицирует этот элемент. */
String getID() { return "SelectQuery"; };
};
}

View File

@ -1,7 +1,8 @@
#ifndef DBMS_PARSERS_IAST_H
#define DBMS_PARSERS_IAST_H
#pragma once
#include <list>
#include <sstream>
#include <Poco/SharedPtr.h>
#include <DB/Core/Types.h>
@ -17,17 +18,52 @@ using Poco::SharedPtr;
/** Элемент синтаксического дерева (в дальнейшем - направленного ациклического графа с элементами семантики)
*/
class IAST
{
{
public:
typedef std::list<SharedPtr<IAST> > ASTs;
/** Получить кусок текста, откуда был получен этот элемент. */
virtual StringRange getRange() = 0;
/** Получить всех детей. */
virtual ASTs getChildren() = 0;
/** Получить текст, который идентифицирует этот элемент. */
virtual String getID() = 0;
/** Получить текст, который идентифицирует этот элемент и всё поддерево.
* Обычно он содержит идентификатор элемента и getTreeID от всех детей.
*/
virtual String getTreeID()
{
std::stringstream s;
s << getID();
ASTs children = getChildren();
if (!children.empty())
{
s << "(";
for (ASTs::iterator it = children.begin(); it != children.end(); ++it)
{
if (it != children.begin())
s << ", ";
s << (*it)->getTreeID();
}
s << ")";
}
return s.str();
}
IAST() : calculated(false) {}
virtual ~IAST() {}
/// Было ли соответствующее выражение вычислено.
bool calculated;
};
typedef Poco::SharedPtr<IAST> ASTPtr;
typedef SharedPtr<IAST> ASTPtr;
typedef std::list<ASTPtr> ASTs;
}
#endif

View File

@ -105,7 +105,7 @@ void DataTypeFixedString::deserializeTextQuoted(Field & field, ReadBuffer & istr
}
SharedPtr<IColumn> DataTypeFixedString::createColumn() const
ColumnPtr DataTypeFixedString::createColumn() const
{
return new ColumnFixedString(n);
}

View File

@ -131,7 +131,7 @@ void DataTypeString::deserializeTextQuoted(Field & field, ReadBuffer & istr, boo
}
SharedPtr<IColumn> DataTypeString::createColumn() const
ColumnPtr DataTypeString::createColumn() const
{
return new ColumnString;
}

View File

@ -23,6 +23,8 @@ int main(int argc, char ** argv)
std::cout << "Success." << std::endl;
DB::formatAST(*ast, std::cout);
std::cout << std::endl;
std::cout << std::endl << ast->getTreeID() << std::endl;
}
else
{