dbms: fixed error [#METR-12412].

This commit is contained in:
Alexey Milovidov 2014-08-20 08:57:03 +04:00
parent d76bfae57b
commit 0019c0ef57
9 changed files with 55 additions and 33 deletions

View File

@ -386,6 +386,10 @@ private:
throw Exception("Size of offsets doesn't match size of column.", ErrorCodes::SIZES_OF_COLUMNS_DOESNT_MATCH); throw Exception("Size of offsets doesn't match size of column.", ErrorCodes::SIZES_OF_COLUMNS_DOESNT_MATCH);
ColumnPtr res = cloneEmpty(); ColumnPtr res = cloneEmpty();
if (0 == col_size)
return res;
ColumnArray & res_ = typeid_cast<ColumnArray &>(*res); ColumnArray & res_ = typeid_cast<ColumnArray &>(*res);
const typename ColumnVector<T>::Container_t & cur_data = typeid_cast<const ColumnVector<T> &>(*data).getData(); const typename ColumnVector<T>::Container_t & cur_data = typeid_cast<const ColumnVector<T> &>(*data).getData();
@ -430,6 +434,10 @@ private:
throw Exception("Size of offsets doesn't match size of column.", ErrorCodes::SIZES_OF_COLUMNS_DOESNT_MATCH); throw Exception("Size of offsets doesn't match size of column.", ErrorCodes::SIZES_OF_COLUMNS_DOESNT_MATCH);
ColumnPtr res = cloneEmpty(); ColumnPtr res = cloneEmpty();
if (0 == col_size)
return res;
ColumnArray & res_ = typeid_cast<ColumnArray &>(*res); ColumnArray & res_ = typeid_cast<ColumnArray &>(*res);
const ColumnString & cur_string = typeid_cast<const ColumnString &>(*data); const ColumnString & cur_string = typeid_cast<const ColumnString &>(*data);

View File

@ -87,7 +87,8 @@ public:
if (s != offsets.size()) if (s != offsets.size())
throw Exception("Size of offsets doesn't match size of column.", ErrorCodes::SIZES_OF_COLUMNS_DOESNT_MATCH); throw Exception("Size of offsets doesn't match size of column.", ErrorCodes::SIZES_OF_COLUMNS_DOESNT_MATCH);
return new ColumnConst<T>(offsets.back(), data, data_type); size_t replicated_size = 0 == s ? 0 : offsets.back();
return new ColumnConst<T>(replicated_size, data, data_type);
} }
size_t byteSize() const { return sizeof(data) + sizeof(s); } size_t byteSize() const { return sizeof(data) + sizeof(s); }

View File

@ -223,6 +223,9 @@ public:
ColumnFixedString * res_ = new ColumnFixedString(n); ColumnFixedString * res_ = new ColumnFixedString(n);
ColumnPtr res = res_; ColumnPtr res = res_;
if (0 == col_size)
return res;
Chars_t & res_chars = res_->chars; Chars_t & res_chars = res_->chars;
res_chars.reserve(n * offsets.back()); res_chars.reserve(n * offsets.back());

View File

@ -354,6 +354,9 @@ public:
ColumnString * res_ = new ColumnString; ColumnString * res_ = new ColumnString;
ColumnPtr res = res_; ColumnPtr res = res_;
if (0 == col_size)
return res;
Chars_t & res_chars = res_->chars; Chars_t & res_chars = res_->chars;
Offsets_t & res_offsets = res_->offsets; Offsets_t & res_offsets = res_->offsets;
res_chars.reserve(chars.size() / col_size * replicate_offsets.back()); res_chars.reserve(chars.size() / col_size * replicate_offsets.back());

View File

@ -296,6 +296,9 @@ public:
if (size != offsets.size()) if (size != offsets.size())
throw Exception("Size of offsets doesn't match size of column.", ErrorCodes::SIZES_OF_COLUMNS_DOESNT_MATCH); throw Exception("Size of offsets doesn't match size of column.", ErrorCodes::SIZES_OF_COLUMNS_DOESNT_MATCH);
if (0 == size)
return new Self;
Self * res_ = new Self; Self * res_ = new Self;
ColumnPtr res = res_; ColumnPtr res = res_;
typename Self::Container_t & res_data = res_->getData(); typename Self::Container_t & res_data = res_->getData();

View File

@ -70,7 +70,7 @@ public:
if (s != offsets.size()) if (s != offsets.size())
throw Exception("Size of offsets doesn't match size of column.", ErrorCodes::SIZES_OF_COLUMNS_DOESNT_MATCH); throw Exception("Size of offsets doesn't match size of column.", ErrorCodes::SIZES_OF_COLUMNS_DOESNT_MATCH);
return cloneDummy(offsets.back()); return cloneDummy(s == 0 ? 0 : offsets.back());
} }
private: private:

View File

@ -375,7 +375,7 @@ public:
prev_offset = new_offset; prev_offset = new_offset;
} }
if (out_offsets.back() != out_vec.size()) if (!out_offsets.empty() && out_offsets.back() != out_vec.size())
throw Exception("Column size mismatch (internal logical error)", ErrorCodes::LOGICAL_ERROR); throw Exception("Column size mismatch (internal logical error)", ErrorCodes::LOGICAL_ERROR);
return true; return true;
@ -436,7 +436,7 @@ public:
prev_offset = new_offset; prev_offset = new_offset;
} }
if (out_offsets.back() != out_vec.size()) if (!out_offsets.empty() && out_offsets.back() != out_vec.size())
throw Exception("Column size mismatch (internal logical error)", ErrorCodes::LOGICAL_ERROR); throw Exception("Column size mismatch (internal logical error)", ErrorCodes::LOGICAL_ERROR);
return true; return true;
@ -742,7 +742,7 @@ public:
} }
out_vec.resize(pos - begin); out_vec.resize(pos - begin);
if (out_offsets.back() != out_vec.size()) if (!out_offsets.empty() && out_offsets.back() != out_vec.size())
throw Exception("Column size mismatch (internal logical error)", ErrorCodes::LOGICAL_ERROR); throw Exception("Column size mismatch (internal logical error)", ErrorCodes::LOGICAL_ERROR);
return true; return true;
@ -797,7 +797,7 @@ public:
} }
out_vec.resize(pos - begin); out_vec.resize(pos - begin);
if (out_offsets.back() != out_vec.size()) if (!out_offsets.empty() && out_offsets.back() != out_vec.size())
throw Exception("Column size mismatch (internal logical error)", ErrorCodes::LOGICAL_ERROR); throw Exception("Column size mismatch (internal logical error)", ErrorCodes::LOGICAL_ERROR);
return true; return true;

View File

@ -0,0 +1,2 @@
[] 1
[] 1

View File

@ -0,0 +1,2 @@
SELECT arrayFilter(x -> materialize(0), materialize([0])) AS p, arrayAll(y -> arrayExists(x -> y != x, p), p) AS test;
SELECT arrayFilter(x -> materialize(0), materialize([''])) AS p, arrayAll(y -> arrayExists(x -> y != x, p), p) AS test;