mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-28 10:31:57 +00:00
Merge
This commit is contained in:
commit
6c317a3e1e
@ -98,15 +98,15 @@ struct AggregateFunctionUniqExactData<String>
|
|||||||
template <typename T, HyperLogLogMode mode>
|
template <typename T, HyperLogLogMode mode>
|
||||||
struct BaseUniqCombinedData
|
struct BaseUniqCombinedData
|
||||||
{
|
{
|
||||||
using Key = UInt64;
|
using Key = UInt32;
|
||||||
using Set = CombinedCardinalityEstimator<
|
using Set = CombinedCardinalityEstimator<
|
||||||
Key,
|
Key,
|
||||||
HashSet<Key, DefaultHash<Key>, HashTableGrower<> >,
|
HashSet<Key, TrivialHash, HashTableGrower<> >,
|
||||||
16,
|
16,
|
||||||
14,
|
14,
|
||||||
17,
|
17,
|
||||||
DefaultHash<Key>,
|
TrivialHash,
|
||||||
UInt64,
|
UInt32,
|
||||||
HyperLogLogBiasEstimator<UniqCombinedBiasData>,
|
HyperLogLogBiasEstimator<UniqCombinedBiasData>,
|
||||||
mode
|
mode
|
||||||
>;
|
>;
|
||||||
@ -195,6 +195,33 @@ template <> struct AggregateFunctionUniqTraits<Float64>
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** Хэш-функция для uniqCombined.
|
||||||
|
*/
|
||||||
|
template <typename T> struct AggregateFunctionUniqCombinedTraits
|
||||||
|
{
|
||||||
|
static UInt32 hash(T x) { return static_cast<UInt32>(intHash64(x)); }
|
||||||
|
};
|
||||||
|
|
||||||
|
template <> struct AggregateFunctionUniqCombinedTraits<Float32>
|
||||||
|
{
|
||||||
|
static UInt32 hash(Float32 x)
|
||||||
|
{
|
||||||
|
UInt64 res = 0;
|
||||||
|
memcpy(reinterpret_cast<char *>(&res), reinterpret_cast<char *>(&x), sizeof(x));
|
||||||
|
return static_cast<UInt32>(intHash64(res));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <> struct AggregateFunctionUniqCombinedTraits<Float64>
|
||||||
|
{
|
||||||
|
static UInt32 hash(Float64 x)
|
||||||
|
{
|
||||||
|
UInt64 res = 0;
|
||||||
|
memcpy(reinterpret_cast<char *>(&res), reinterpret_cast<char *>(&x), sizeof(x));
|
||||||
|
return static_cast<UInt32>(intHash64(res));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/** Структура для делегации работы по добавлению одного элемента в агрегатные функции uniq.
|
/** Структура для делегации работы по добавлению одного элемента в агрегатные функции uniq.
|
||||||
* Используется для частичной специализации для добавления строк.
|
* Используется для частичной специализации для добавления строк.
|
||||||
*/
|
*/
|
||||||
@ -204,7 +231,27 @@ struct OneAdder;
|
|||||||
template <typename T, typename Data>
|
template <typename T, typename Data>
|
||||||
struct OneAdder<T, Data, typename std::enable_if<
|
struct OneAdder<T, Data, typename std::enable_if<
|
||||||
std::is_same<Data, AggregateFunctionUniqUniquesHashSetData>::value ||
|
std::is_same<Data, AggregateFunctionUniqUniquesHashSetData>::value ||
|
||||||
std::is_same<Data, AggregateFunctionUniqHLL12Data<T> >::value ||
|
std::is_same<Data, AggregateFunctionUniqHLL12Data<T> >::value>::type>
|
||||||
|
{
|
||||||
|
template <typename T2 = T>
|
||||||
|
static void addOne(Data & data, const IColumn & column, size_t row_num,
|
||||||
|
typename std::enable_if<!std::is_same<T2, String>::value>::type * = nullptr)
|
||||||
|
{
|
||||||
|
const auto & value = static_cast<const ColumnVector<T2> &>(column).getData()[row_num];
|
||||||
|
data.set.insert(AggregateFunctionUniqTraits<T2>::hash(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T2 = T>
|
||||||
|
static void addOne(Data & data, const IColumn & column, size_t row_num,
|
||||||
|
typename std::enable_if<std::is_same<T2, String>::value>::type * = nullptr)
|
||||||
|
{
|
||||||
|
StringRef value = column.getDataAt(row_num);
|
||||||
|
data.set.insert(CityHash64(value.data, value.size));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename T, typename Data>
|
||||||
|
struct OneAdder<T, Data, typename std::enable_if<
|
||||||
std::is_same<Data, AggregateFunctionUniqCombinedRawData<T> >::value ||
|
std::is_same<Data, AggregateFunctionUniqCombinedRawData<T> >::value ||
|
||||||
std::is_same<Data, AggregateFunctionUniqCombinedLinearCountingData<T> >::value ||
|
std::is_same<Data, AggregateFunctionUniqCombinedLinearCountingData<T> >::value ||
|
||||||
std::is_same<Data, AggregateFunctionUniqCombinedBiasCorrectedData<T> >::value ||
|
std::is_same<Data, AggregateFunctionUniqCombinedBiasCorrectedData<T> >::value ||
|
||||||
@ -215,7 +262,7 @@ struct OneAdder<T, Data, typename std::enable_if<
|
|||||||
typename std::enable_if<!std::is_same<T2, String>::value>::type * = nullptr)
|
typename std::enable_if<!std::is_same<T2, String>::value>::type * = nullptr)
|
||||||
{
|
{
|
||||||
const auto & value = static_cast<const ColumnVector<T2> &>(column).getData()[row_num];
|
const auto & value = static_cast<const ColumnVector<T2> &>(column).getData()[row_num];
|
||||||
data.set.insert(AggregateFunctionUniqTraits<T2>::hash(value));
|
data.set.insert(AggregateFunctionUniqCombinedTraits<T2>::hash(value));
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T2 = T>
|
template <typename T2 = T>
|
||||||
|
@ -27,7 +27,7 @@ namespace DB
|
|||||||
*/
|
*/
|
||||||
struct UniqCombinedBiasData
|
struct UniqCombinedBiasData
|
||||||
{
|
{
|
||||||
using InterpolatedData = std::array<double, 178>;
|
using InterpolatedData = std::array<double, 200>;
|
||||||
|
|
||||||
static double getThreshold();
|
static double getThreshold();
|
||||||
/// Оценки количества уникальных значений по алгоритму HyperLogLog без применения каких-либо поправок.
|
/// Оценки количества уникальных значений по алгоритму HyperLogLog без применения каких-либо поправок.
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
#include <DB/IO/ReadHelpers.h>
|
#include <DB/IO/ReadHelpers.h>
|
||||||
#include <DB/IO/WriteHelpers.h>
|
#include <DB/IO/WriteHelpers.h>
|
||||||
#include <DB/Core/Defines.h>
|
#include <DB/Core/Defines.h>
|
||||||
|
#include <DB/Core/ErrorCodes.h>
|
||||||
|
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
@ -569,33 +570,15 @@ private:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template <HyperLogLogMode mode2 = mode>
|
double fixRawEstimate(double raw_estimate) const
|
||||||
inline double fixRawEstimate(double raw_estimate,
|
|
||||||
typename std::enable_if<(mode2 == HyperLogLogMode::Raw)
|
|
||||||
|| ((mode2 == HyperLogLogMode::BiasCorrected)
|
|
||||||
&& BiasEstimator::isTrivial())>::type * = nullptr) const
|
|
||||||
{
|
{
|
||||||
|
if ((mode == HyperLogLogMode::Raw) || ((mode == HyperLogLogMode::BiasCorrected) && BiasEstimator::isTrivial()))
|
||||||
return raw_estimate;
|
return raw_estimate;
|
||||||
}
|
else if (mode == HyperLogLogMode::LinearCounting)
|
||||||
|
|
||||||
template <HyperLogLogMode mode2 = mode>
|
|
||||||
inline double fixRawEstimate(double raw_estimate,
|
|
||||||
typename std::enable_if<(mode2 == HyperLogLogMode::LinearCounting)>::type * = nullptr) const
|
|
||||||
{
|
|
||||||
return applyLinearCorrection(raw_estimate);
|
return applyLinearCorrection(raw_estimate);
|
||||||
}
|
else if ((mode == HyperLogLogMode::BiasCorrected) && !BiasEstimator::isTrivial())
|
||||||
|
|
||||||
template <HyperLogLogMode mode2 = mode>
|
|
||||||
inline double fixRawEstimate(double raw_estimate,
|
|
||||||
typename std::enable_if<(mode2 == HyperLogLogMode::BiasCorrected)
|
|
||||||
&& !BiasEstimator::isTrivial()>::type * = nullptr) const
|
|
||||||
{
|
|
||||||
return applyBiasCorrection(raw_estimate);
|
return applyBiasCorrection(raw_estimate);
|
||||||
}
|
else if (mode == HyperLogLogMode::FullFeatured)
|
||||||
|
|
||||||
template <HyperLogLogMode mode2 = mode>
|
|
||||||
double fixRawEstimate(double raw_estimate,
|
|
||||||
typename std::enable_if<(mode2 == HyperLogLogMode::FullFeatured)>::type * = nullptr) const
|
|
||||||
{
|
{
|
||||||
static constexpr bool fix_big_cardinalities = std::is_same<HashValueType, UInt32>::value;
|
static constexpr bool fix_big_cardinalities = std::is_same<HashValueType, UInt32>::value;
|
||||||
static constexpr double pow2_32 = 4294967296.0;
|
static constexpr double pow2_32 = 4294967296.0;
|
||||||
@ -609,12 +592,16 @@ private:
|
|||||||
|
|
||||||
return fixed_estimate;
|
return fixed_estimate;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
throw Poco::Exception("Internal error", DB::ErrorCodes::LOGICAL_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
template <bool is_trivial = BiasEstimator::isTrivial()>
|
inline double applyCorrection(double raw_estimate) const
|
||||||
inline double applyCorrection(double raw_estimate, typename std::enable_if<is_trivial>::type * = nullptr) const
|
|
||||||
{
|
{
|
||||||
double fixed_estimate;
|
double fixed_estimate;
|
||||||
|
|
||||||
|
if (BiasEstimator::isTrivial())
|
||||||
|
{
|
||||||
if (raw_estimate <= (2.5 * bucket_count))
|
if (raw_estimate <= (2.5 * bucket_count))
|
||||||
{
|
{
|
||||||
/// Поправка в случае маленкой оценки.
|
/// Поправка в случае маленкой оценки.
|
||||||
@ -622,18 +609,15 @@ private:
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
fixed_estimate = raw_estimate;
|
fixed_estimate = raw_estimate;
|
||||||
|
|
||||||
return fixed_estimate;
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
template <bool is_trivial = BiasEstimator::isTrivial()>
|
|
||||||
inline double applyCorrection(double raw_estimate, typename std::enable_if<!is_trivial>::type * = nullptr) const
|
|
||||||
{
|
{
|
||||||
double fixed_estimate = applyBiasCorrection(raw_estimate);
|
fixed_estimate = applyBiasCorrection(raw_estimate);
|
||||||
double linear_estimate = applyLinearCorrection(fixed_estimate);
|
double linear_estimate = applyLinearCorrection(fixed_estimate);
|
||||||
|
|
||||||
if (linear_estimate < BiasEstimator::getThreshold())
|
if (linear_estimate < BiasEstimator::getThreshold())
|
||||||
fixed_estimate = linear_estimate;
|
fixed_estimate = linear_estimate;
|
||||||
|
}
|
||||||
|
|
||||||
return fixed_estimate;
|
return fixed_estimate;
|
||||||
}
|
}
|
||||||
|
@ -386,23 +386,16 @@ public:
|
|||||||
throw Exception("Second argument for function '" + getName() + "' must be Set; found " + column_set_ptr->getName(),
|
throw Exception("Second argument for function '" + getName() + "' must be Set; found " + column_set_ptr->getName(),
|
||||||
ErrorCodes::ILLEGAL_COLUMN);
|
ErrorCodes::ILLEGAL_COLUMN);
|
||||||
|
|
||||||
/// Столбцы, которые проверяются на принадлежность множеству.
|
Block block_of_key_columns;
|
||||||
ColumnNumbers left_arguments;
|
|
||||||
|
|
||||||
/// Первый аргумент может быть tuple или одиночным столбцом.
|
/// Первый аргумент может быть tuple или одиночным столбцом.
|
||||||
const ColumnTuple * tuple = typeid_cast<const ColumnTuple *>(&*block.getByPosition(arguments[0]).column);
|
const ColumnTuple * tuple = typeid_cast<const ColumnTuple *>(&*block.getByPosition(arguments[0]).column);
|
||||||
if (tuple)
|
if (tuple)
|
||||||
{
|
block_of_key_columns = tuple->getData();
|
||||||
/// Находим в блоке столбцы из tuple.
|
|
||||||
const Block & tuple_elems = tuple->getData();
|
|
||||||
size_t tuple_size = tuple_elems.columns();
|
|
||||||
for (size_t i = 0; i < tuple_size; ++i)
|
|
||||||
left_arguments.push_back(block.getPositionByName(tuple_elems.getByPosition(i).name));
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
left_arguments.push_back(arguments[0]);
|
block_of_key_columns.insert(block.getByPosition(arguments[0]));
|
||||||
|
|
||||||
column_set->getData()->execute(block, left_arguments, result, negative);
|
block.getByPosition(result).column = column_set->getData()->execute(block_of_key_columns, negative);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -288,10 +288,10 @@ public:
|
|||||||
// Возвращает false, если превышено какое-нибудь ограничение, и больше не нужно вставлять.
|
// Возвращает false, если превышено какое-нибудь ограничение, и больше не нужно вставлять.
|
||||||
bool insertFromBlock(const Block & block, bool create_ordered_set = false);
|
bool insertFromBlock(const Block & block, bool create_ordered_set = false);
|
||||||
|
|
||||||
/** Для указанных столбцов блока проверить принадлежность их значений множеству.
|
/** Для столбцов блока проверить принадлежность их значений множеству.
|
||||||
* Записать результат в столбец в позиции result.
|
* Записать результат в столбец в позиции result.
|
||||||
*/
|
*/
|
||||||
void execute(Block & block, const ColumnNumbers & arguments, size_t result, bool negative) const;
|
ColumnPtr execute(const Block & block, bool negative) const;
|
||||||
|
|
||||||
std::string describe() const
|
std::string describe() const
|
||||||
{
|
{
|
||||||
|
@ -120,7 +120,7 @@ struct Settings
|
|||||||
M(SettingUInt64, merge_tree_max_rows_to_use_cache, (1024 * 1024)) \
|
M(SettingUInt64, merge_tree_max_rows_to_use_cache, (1024 * 1024)) \
|
||||||
\
|
\
|
||||||
/** Распределять чтение из MergeTree по потокам равномерно, обеспечивая стабильное среднее время исполнения каждого потока в пределах одного чтения. */ \
|
/** Распределять чтение из MergeTree по потокам равномерно, обеспечивая стабильное среднее время исполнения каждого потока в пределах одного чтения. */ \
|
||||||
M(SettingBool, merge_tree_uniform_read_distribution, false) \
|
M(SettingBool, merge_tree_uniform_read_distribution, true) \
|
||||||
\
|
\
|
||||||
/** Минимальная длина выражения expr = x1 OR ... expr = xN для оптимизации */ \
|
/** Минимальная длина выражения expr = x1 OR ... expr = xN для оптимизации */ \
|
||||||
M(SettingUInt64, optimize_min_equality_disjunction_chain_length, 3) \
|
M(SettingUInt64, optimize_min_equality_disjunction_chain_length, 3) \
|
||||||
|
@ -8,373 +8,417 @@ namespace
|
|||||||
|
|
||||||
const UniqCombinedBiasData::InterpolatedData raw_estimates =
|
const UniqCombinedBiasData::InterpolatedData raw_estimates =
|
||||||
{
|
{
|
||||||
700.0
|
99791.8496
|
||||||
,3850.0
|
,101386.91930000001
|
||||||
,7350.0
|
,105450.95623333333
|
||||||
,10850.0
|
,108128.01393333334
|
||||||
,14350.0
|
,110851.10286666667
|
||||||
,89003.5714
|
,113620.01383333335
|
||||||
,103764.30343333333
|
,116434.98796666665
|
||||||
,105572.1915
|
,119295.74893333332
|
||||||
,109252.46533333334
|
,122202.58199999998
|
||||||
,112638.20573333332
|
,124783.45270000001
|
||||||
,116094.29566666669
|
,127775.84493333333
|
||||||
,119619.81926666666
|
,130432.03390000002
|
||||||
,123214.92233333334
|
,133122.13506666667
|
||||||
,126469.06656666666
|
,136239.7482
|
||||||
,130196.15093333334
|
,139004.69996666667
|
||||||
,133566.85673333335
|
,141803.40813333335
|
||||||
,136991.63890000002
|
,144228.62236666665
|
||||||
,140470.0118666667
|
,147089.61343333335
|
||||||
,144000.91686666667
|
,149984.35636666667
|
||||||
,147585.44463333333
|
,152912.8223666667
|
||||||
,151222.7466
|
,155449.4413666667
|
||||||
,154447.75893333333
|
,158440.23733333332
|
||||||
,158181.68399999998
|
,161029.4043
|
||||||
,161492.41386666667
|
,164080.25746666666
|
||||||
,164840.6352
|
,166720.31723333334
|
||||||
,168713.9904
|
,169384.27826666666
|
||||||
,172143.82656666666
|
,172521.4491666667
|
||||||
,175611.2078
|
,175235.4233
|
||||||
,179116.94873333335
|
,177971.46556666668
|
||||||
,182658.0355
|
,180730.04403333334
|
||||||
,186236.36723333332
|
,183510.69883333333
|
||||||
,189332.1009
|
,186313.77773333332
|
||||||
,192976.1847
|
,189138.67343333332
|
||||||
,196654.62706666664
|
,191985.62490000002
|
||||||
,199835.39103333335
|
,194853.55733333333
|
||||||
,203575.92429999998
|
,197259.4243333333
|
||||||
,206808.87086666666
|
,200165.33826666666
|
||||||
,210611.72886666664
|
,203093.2792
|
||||||
,213896.25913333334
|
,205550.0133666667
|
||||||
,217759.63066666664
|
,208515.49296666667
|
||||||
,221096.10933333333
|
,211500.27113333336
|
||||||
,224456.31466666667
|
,214002.73933333336
|
||||||
,227839.0366333333
|
,217022.66503333332
|
||||||
,231242.72576666667
|
,219554.61286666666
|
||||||
,235239.98256666667
|
,222611.62203333332
|
||||||
,238688.95070000002
|
,225172.43516666666
|
||||||
,242158.17593333332
|
,228261.63369999998
|
||||||
,245649.42926666664
|
,230849.9269333333
|
||||||
,249158.9859666667
|
,233450.9665
|
||||||
,252689.67179999998
|
,236588.48176666666
|
||||||
,256241.95376666667
|
,239217.14506666665
|
||||||
,259214.9391666667
|
,241858.01729999995
|
||||||
,262798.3925666667
|
,245040.88769999996
|
||||||
,266399.8345666667
|
,247707.505
|
||||||
,270018.35863333335
|
,250385.32816666667
|
||||||
,273653.1149
|
,253072.74516666666
|
||||||
,276696.7119
|
,255772.3767333333
|
||||||
,280366.51476666663
|
,259026.62416666665
|
||||||
,284051.95540000004
|
,261750.1933
|
||||||
,287133.5254333333
|
,264484.4988666667
|
||||||
,290847.31173333334
|
,267229.4741
|
||||||
,294579.5226
|
,269983.9762
|
||||||
,297698.64109999995
|
,272747.6032
|
||||||
,301454.39253333333
|
,275521.9937
|
||||||
,305223.59123333334
|
,278306.35263333336
|
||||||
,308375.3184666667
|
,281100.67233333335
|
||||||
,312170.06
|
,283902.65756666666
|
||||||
,315342.02996666665
|
,286716.28403333336
|
||||||
,319162.8188666667
|
,289537.95599999995
|
||||||
,322356.3565666666
|
,292368.9353666667
|
||||||
,326199.5866
|
,295207.7315
|
||||||
,329412.83396666666
|
,298055.9653333333
|
||||||
,332634.3235666667
|
,300911.9654666667
|
||||||
,336510.7596333333
|
,303204.35336666665
|
||||||
,339747.7330333333
|
,306077.9537333333
|
||||||
,343643.0385666667
|
,308958.00193333335
|
||||||
,346896.77420000004
|
,311845.22890000005
|
||||||
,350157.6729666667
|
,314741.81600000005
|
||||||
,354079.3932333334
|
,317644.8173333333
|
||||||
,357354.5196333334
|
,319972.31696666667
|
||||||
,360638.3034333333
|
,322888.63776666665
|
||||||
,364588.47873333335
|
,325811.89053333335
|
||||||
,367886.05706666666
|
,328741.73743333324
|
||||||
,371189.98006666667
|
,331091.32163333334
|
||||||
,375161.95876666665
|
,334034.29806666664
|
||||||
,378478.6737666666
|
,336984.6469666666
|
||||||
,381801.6619
|
,339939.86216666666
|
||||||
,385130.9645
|
,342309.7939
|
||||||
,389131.7460333333
|
,345278.14656666666
|
||||||
,392471.6233333333
|
,348252.3204333333
|
||||||
,395817.1175
|
,350635.0094666667
|
||||||
,399165.1003333333
|
,353618.8034000001
|
||||||
,402518.7819333333
|
,356610.7431333333
|
||||||
,406549.7624333333
|
,359005.6872333333
|
||||||
,409916.016
|
,362005.8481
|
||||||
,413289.0218666666
|
,365011.9431333333
|
||||||
,416661.9977333333
|
,367422.15616666665
|
||||||
,420040.4257333334
|
,370439.9724666667
|
||||||
,424099.3186333333
|
,373460.6025
|
||||||
,427485.4292000001
|
,375879.31826666667
|
||||||
,430876.4814666666
|
,378908.1752
|
||||||
,434269.4718
|
,381335.98703333334
|
||||||
,437665.82826666674
|
,384373.7107666666
|
||||||
,441066.7185
|
,387416.2068333333
|
||||||
,444469.97226666665
|
,389852.7087666667
|
||||||
,448561.9376666667
|
,392901.8697
|
||||||
,451974.73750000005
|
,395343.33469999995
|
||||||
,455389.1112
|
,398401.5141333333
|
||||||
,458808.5816666667
|
,400851.9174
|
||||||
,462230.8184666667
|
,403917.6844666666
|
||||||
,465656.9889
|
,406371.6598333334
|
||||||
,469081.3269
|
,409440.80490000005
|
||||||
,472512.4878
|
,412517.26203333336
|
||||||
,475944.4204333333
|
,414981.9741666666
|
||||||
,480065.7132666667
|
,418063.8305
|
||||||
,483502.04110000003
|
,420530.6776
|
||||||
,486939.5075666667
|
,423616.6512666666
|
||||||
,490379.7868333334
|
,426088.72699999996
|
||||||
,493818.5365333333
|
,429181.1127666666
|
||||||
,497259.08013333334
|
,431657.64166666666
|
||||||
,500705.3513
|
,434757.3337
|
||||||
,504155.6234666666
|
,437235.97023333336
|
||||||
,507606.65499999997
|
,440338.2023666667
|
||||||
,511060.7448666667
|
,442823.12679999997
|
||||||
,514517.4004
|
,445932.7757666667
|
||||||
,517973.35829999996
|
,448419.81309999997
|
||||||
,521431.3761666666
|
,451533.39386666665
|
||||||
,524891.7097333333
|
,454026.96746666665
|
||||||
,529044.7593
|
,457147.8259333333
|
||||||
,532507.0878999999
|
,459643.8253666666
|
||||||
,535971.5070333333
|
,462140.6687333334
|
||||||
,539436.2416999999
|
,465264.5323
|
||||||
,542903.1470333333
|
,467767.3770333333
|
||||||
,546370.3423
|
,470899.63109999994
|
||||||
,549837.6947999999
|
,473406.5693999999
|
||||||
,553307.0003666667
|
,476540.8793333333
|
||||||
,556775.3770333333
|
,479051.11850000004
|
||||||
,560247.6308333334
|
,482189.9576
|
||||||
,563721.0700333334
|
,484701.15849999996
|
||||||
,567196.7586333333
|
,487836.66456666664
|
||||||
,570669.8439666666
|
,490348.32859999995
|
||||||
,574146.018
|
,492863.5349666667
|
||||||
,577622.2794666667
|
,496009.21856666665
|
||||||
,581098.3862333334
|
,498525.42956666666
|
||||||
,584575.8826666666
|
,501674.7545333333
|
||||||
,588055.1468000001
|
,504197.08666666667
|
||||||
,591538.0234
|
,507345.7158333334
|
||||||
,595018.0103000001
|
,509865.2856
|
||||||
,598504.5469333333
|
,512385.7114666667
|
||||||
,601992.5697666666
|
,515538.75786666665
|
||||||
,605475.5452
|
,518061.9924333333
|
||||||
,608959.4645
|
,521216.2575333333
|
||||||
,612444.0261
|
,523741.7463333334
|
||||||
,615929.6436
|
,526898.6196333334
|
||||||
,619412.3877333334
|
,529426.4153666666
|
||||||
,622903.4263999999
|
,531957.1346999999
|
||||||
,626391.3657333333
|
,535122.4158
|
||||||
,629876.7359333333
|
,537654.0189
|
||||||
,633364.2825999999
|
,540820.3046333335
|
||||||
,636855.2673666667
|
,543353.1055
|
||||||
,640344.4321000001
|
,545886.3092666665
|
||||||
,643836.5543666667
|
,549053.4182666666
|
||||||
,647327.3073999999
|
,551588.0846666667
|
||||||
,650818.3525666667
|
,554757.5437333334
|
||||||
,654312.2421666667
|
,557292.4032000001
|
||||||
,657807.0899666668
|
,559828.7957
|
||||||
,661301.4443666666
|
,562997.8541333332
|
||||||
,664794.1040333334
|
,565534.2980666666
|
||||||
,668288.1969666666
|
,568709.6649999999
|
||||||
,671781.0196666667
|
,571249.7172666666
|
||||||
,675272.7522333333
|
,573790.0703666667
|
||||||
,678766.9045999999
|
,576966.0044666667
|
||||||
,682259.3583666667
|
,579505.9694666667
|
||||||
,685747.8148333334
|
,582682.2277
|
||||||
,689238.7994666666
|
,585223.6823
|
||||||
,692732.0478333334
|
,587764.2020666667
|
||||||
,696224.6407
|
,590940.0571666666
|
||||||
,700069.9224
|
,593483.1912666665
|
||||||
|
,596026.3725
|
||||||
|
,599205.4451
|
||||||
|
,601746.4072333333
|
||||||
|
,604921.6576333332
|
||||||
|
,607463.0489333333
|
||||||
|
,610007.9545333334
|
||||||
|
,613191.4748666667
|
||||||
|
,615738.8463666667
|
||||||
|
,618922.8917333334
|
||||||
|
,621470.0042333334
|
||||||
|
,624017.6801333333
|
||||||
|
,627203.1910333333
|
||||||
|
,629749.1271666667
|
||||||
|
,632298.0367666667
|
||||||
|
,635482.3311666666
|
||||||
|
,638030.0856333333
|
||||||
|
,641214.3490333334
|
||||||
|
,643760.2273333333
|
||||||
|
,646307.8729
|
||||||
|
,649497.0210000001
|
||||||
|
,652049.6203333334
|
||||||
|
,654923.103
|
||||||
};
|
};
|
||||||
|
|
||||||
const UniqCombinedBiasData::InterpolatedData biases =
|
const UniqCombinedBiasData::InterpolatedData biases =
|
||||||
{
|
{
|
||||||
0.0
|
83406.8496
|
||||||
,0.0
|
,84682.41930000001
|
||||||
,0.0
|
,83634.45623333333
|
||||||
,0.0
|
,81199.51393333334
|
||||||
,0.0
|
,78810.60286666667
|
||||||
,71153.5714
|
,76467.51383333335
|
||||||
,85214.30343333333
|
,74170.48796666665
|
||||||
,83522.1915
|
,71919.24893333334
|
||||||
,80202.46533333334
|
,69714.082
|
||||||
,77288.20573333332
|
,67821.95270000001
|
||||||
,74444.29566666667
|
,65702.34493333333
|
||||||
,71669.81926666667
|
,63885.5339
|
||||||
,68964.92233333334
|
,62102.63506666666
|
||||||
,66619.06656666666
|
,60108.2482
|
||||||
,64046.15093333333
|
,58400.199966666674
|
||||||
,61816.85673333333
|
,56725.90813333334
|
||||||
,59641.6389
|
,55317.122366666656
|
||||||
,57520.01186666667
|
,53705.113433333325
|
||||||
,55450.91686666667
|
,52126.856366666674
|
||||||
,53435.44463333334
|
,50582.32236666667
|
||||||
,51472.74659999999
|
,49284.94136666667
|
||||||
,49797.75893333333
|
,47802.73733333333
|
||||||
,47931.68399999999
|
,46557.904299999995
|
||||||
,46342.41386666667
|
,45135.75746666667
|
||||||
,44790.6352
|
,43941.817233333335
|
||||||
,43063.9904
|
,42771.77826666667
|
||||||
,41593.82656666667
|
,41435.949166666665
|
||||||
,40161.2078
|
,40315.9233
|
||||||
,38766.94873333333
|
,39217.96556666667
|
||||||
,37408.035500000005
|
,38142.54403333333
|
||||||
,36086.36723333333
|
,37089.19883333333
|
||||||
,34982.1009
|
,36058.277733333336
|
||||||
,33726.184700000005
|
,35049.17343333334
|
||||||
,32504.627066666664
|
,34062.1249
|
||||||
,31485.391033333333
|
,33096.05733333334
|
||||||
,30325.924299999995
|
,32306.924333333332
|
||||||
,29358.870866666668
|
,31378.83826666667
|
||||||
,28261.72886666667
|
,30472.7792
|
||||||
,27346.259133333337
|
,29734.513366666666
|
||||||
,26309.630666666668
|
,28865.99296666667
|
||||||
,25446.109333333337
|
,28016.77113333333
|
||||||
,24606.31466666666
|
,27324.23933333333
|
||||||
,23789.036633333333
|
,26510.165033333327
|
||||||
,22992.725766666666
|
,25847.112866666674
|
||||||
,22089.98256666667
|
,25070.122033333333
|
||||||
,21338.9507
|
,24435.935166666663
|
||||||
,20608.175933333332
|
,23691.133699999995
|
||||||
,19899.429266666673
|
,23084.426933333332
|
||||||
,19208.985966666663
|
,22490.466500000006
|
||||||
,18539.6718
|
,21793.981766666664
|
||||||
,17891.95376666667
|
,21227.645066666664
|
||||||
,17364.939166666667
|
,20673.517299999996
|
||||||
,16748.392566666666
|
,20022.387699999996
|
||||||
,16149.834566666666
|
,19494.005
|
||||||
,15568.358633333331
|
,18976.828166666663
|
||||||
,15003.114899999995
|
,18469.24516666666
|
||||||
,14546.711900000004
|
,17973.876733333327
|
||||||
,14016.51476666668
|
,17394.124166666665
|
||||||
,13501.955399999997
|
,16922.693300000003
|
||||||
,13083.52543333332
|
,16461.998866666672
|
||||||
,12597.311733333336
|
,16011.974100000001
|
||||||
,12129.522600000006
|
,15571.476200000005
|
||||||
,11748.641100000008
|
,15140.103200000012
|
||||||
,11304.392533333332
|
,14719.493699999992
|
||||||
,10873.59123333334
|
,14308.852633333338
|
||||||
,10525.318466666678
|
,13908.172333333341
|
||||||
,10120.059999999998
|
,13515.15756666667
|
||||||
,9792.029966666674
|
,13133.78403333333
|
||||||
,9412.818866666668
|
,12760.455999999986
|
||||||
,9106.356566666664
|
,12396.435366666663
|
||||||
,8749.58660000001
|
,12040.231499999994
|
||||||
,8462.833966666678
|
,11693.465333333335
|
||||||
,8184.323566666659
|
,11354.465466666676
|
||||||
,7860.759633333325
|
,11090.853366666668
|
||||||
,7597.733033333323
|
,10769.453733333328
|
||||||
,7293.038566666665
|
,10454.501933333328
|
||||||
,7046.774200000004
|
,10146.728900000007
|
||||||
,6807.672966666675
|
,9848.316
|
||||||
,6529.393233333336
|
,9556.31733333334
|
||||||
,6304.519633333344
|
,9327.816966666656
|
||||||
,6088.30343333332
|
,9049.137766666672
|
||||||
,5838.4787333333325
|
,8777.390533333344
|
||||||
,5636.057066666661
|
,8512.237433333328
|
||||||
,5439.980066666671
|
,8305.821633333331
|
||||||
,5211.958766666658
|
,8053.79806666668
|
||||||
,5028.673766666664
|
,7809.146966666663
|
||||||
,4851.661899999996
|
,7569.362166666669
|
||||||
,4680.964499999992
|
,7383.2939
|
||||||
,4481.746033333319
|
,7156.646566666673
|
||||||
,4321.623333333322
|
,6935.8204333333315
|
||||||
,4167.117500000012
|
,6762.50946666667
|
||||||
,4015.1003333333356
|
,6551.303400000004
|
||||||
,3868.781933333337
|
,6348.243133333327
|
||||||
,3699.762433333332
|
,6187.18723333332
|
||||||
,3566.0159999999937
|
,5992.348100000003
|
||||||
,3439.021866666648
|
,5803.44313333333
|
||||||
,3311.9977333333422
|
,5657.656166666672
|
||||||
,3190.4257333333276
|
,5480.472466666678
|
||||||
,3049.3186333333238
|
,5306.102499999989
|
||||||
,2935.4291999999937
|
,5168.818266666669
|
||||||
,2826.4814666666593
|
,5002.675199999988
|
||||||
,2719.4717999999993
|
,4874.487033333319
|
||||||
,2615.8282666666782
|
,4717.210766666666
|
||||||
,2516.7184999999977
|
,4564.70683333333
|
||||||
,2419.972266666669
|
,4445.208766666678
|
||||||
,2311.9376666666744
|
,4299.36970000001
|
||||||
,2224.7374999999884
|
,4184.834699999997
|
||||||
,2139.1111999999944
|
,4048.0141333333354
|
||||||
,2058.581666666665
|
,3942.4174000000057
|
||||||
,1980.8184666666687
|
,3813.1844666666584
|
||||||
,1906.9888999999966
|
,3711.159833333329
|
||||||
,1831.3268999999952
|
,3585.304899999998
|
||||||
,1762.4878000000026
|
,3466.7620333333325
|
||||||
,1694.420433333328
|
,3375.4741666666523
|
||||||
,1615.7132666666682
|
,3262.3304999999914
|
||||||
,1552.0410999999924
|
,3173.1775999999954
|
||||||
,1489.507566666677
|
,3064.151266666653
|
||||||
,1429.7868333333365
|
,2980.226999999994
|
||||||
,1368.536533333332
|
,2877.6127666666675
|
||||||
,1309.0801333333268
|
,2798.141666666663
|
||||||
,1255.35129999999
|
,2702.8336999999883
|
||||||
,1205.6234666666617
|
,2625.4702333333166
|
||||||
,1156.6549999999988
|
,2532.7023666666646
|
||||||
,1110.744866666675
|
,2461.626799999998
|
||||||
,1067.4004000000034
|
,2376.275766666678
|
||||||
,1023.3583000000023
|
,2307.313100000019
|
||||||
,981.3761666666638
|
,2225.89386666668
|
||||||
,941.7097333333513
|
,2163.4674666666738
|
||||||
,894.7593000000148
|
,2089.325933333341
|
||||||
,857.0879000000035
|
,2029.3253666666667
|
||||||
,821.5070333333375
|
,1970.1687333333346
|
||||||
,786.2416999999745
|
,1899.032300000011
|
||||||
,753.1470333333127
|
,1845.8770333333425
|
||||||
,720.3422999999797
|
,1783.1310999999987
|
||||||
,687.6947999999975
|
,1734.0693999999978
|
||||||
,657.0003666666647
|
,1673.3793333333258
|
||||||
,625.3770333333329
|
,1627.618499999992
|
||||||
,597.6308333333387
|
,1571.457600000004
|
||||||
,571.0700333333225
|
,1526.6585000000002
|
||||||
,546.7586333333165
|
,1467.1645666666639
|
||||||
,519.8439666666478
|
,1422.8285999999982
|
||||||
,496.0180000000012
|
,1382.0349666666687
|
||||||
,472.2794666666693
|
,1332.7185666666676
|
||||||
,448.386233333343
|
,1292.9295666666683
|
||||||
,425.8826666666816
|
,1247.2545333333353
|
||||||
,405.1468000000071
|
,1213.5866666666698
|
||||||
,388.0233999999861
|
,1167.2158333333402
|
||||||
,368.01030000002356
|
,1130.785599999993
|
||||||
,354.54693333333125
|
,1095.21146666667
|
||||||
,342.5697666666626
|
,1053.2578666666716
|
||||||
,325.5452000000126
|
,1020.4924333333329
|
||||||
,309.4644999999825
|
,979.7575333333225
|
||||||
,294.0261000000173
|
,949.2463333333241
|
||||||
,279.64360000001034
|
,911.1196333333113
|
||||||
,262.38773333333666
|
,882.9153666666631
|
||||||
,253.42639999999665
|
,857.6347000000145
|
||||||
,241.36573333333945
|
,827.915800000017
|
||||||
,226.7359333333443
|
,803.5189000000051
|
||||||
,214.28259999999622
|
,774.8046333333477
|
||||||
,205.26736666667662
|
,751.6055000000051
|
||||||
,194.43210000001514
|
,728.8092666666489
|
||||||
,186.55436666666841
|
,700.9182666666651
|
||||||
,177.30740000001
|
,679.5846666666524
|
||||||
,168.35256666666828
|
,654.0437333333539
|
||||||
,162.24216666668266
|
,632.9032000000007
|
||||||
,157.0899666666713
|
,613.2956999999975
|
||||||
,151.44436666666297
|
,587.3541333333123
|
||||||
,144.1040333333464
|
,567.7980666666408
|
||||||
,138.19696666668946
|
,548.164999999979
|
||||||
,131.01966666666945
|
,532.2172666666642
|
||||||
,122.7522333333424
|
,516.5703666666523
|
||||||
,116.90459999998954
|
,497.5044666666848
|
||||||
,109.35836666667213
|
,481.4694666666522
|
||||||
,97.81483333332774
|
,462.72769999998854
|
||||||
,88.7994666666491
|
,448.1823000000052
|
||||||
,82.04783333333519
|
,432.7020666666601
|
||||||
,74.64070000000841
|
,413.5571666666656
|
||||||
,69.92240000003949
|
,400.69126666665153
|
||||||
|
,387.8724999999977
|
||||||
|
,371.94510000001173
|
||||||
|
,356.90723333331215
|
||||||
|
,337.1576333333117
|
||||||
|
,322.54893333330983
|
||||||
|
,311.4545333333469
|
||||||
|
,299.97486666667584
|
||||||
|
,291.3463666666842
|
||||||
|
,280.39173333333264
|
||||||
|
,271.5042333333404
|
||||||
|
,263.1801333333521
|
||||||
|
,253.69103333332654
|
||||||
|
,243.62716666665315
|
||||||
|
,236.53676666668616
|
||||||
|
,225.83116666666078
|
||||||
|
,217.58563333332617
|
||||||
|
,206.84903333332235
|
||||||
|
,196.72733333332386
|
||||||
|
,188.37289999997788
|
||||||
|
,182.52100000000792
|
||||||
|
,179.12033333334452
|
||||||
|
,177.1030000000028
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
double UniqCombinedBiasData::getThreshold()
|
double UniqCombinedBiasData::getThreshold()
|
||||||
{
|
{
|
||||||
return 176000;
|
return 177700;
|
||||||
}
|
}
|
||||||
|
|
||||||
const UniqCombinedBiasData::InterpolatedData & UniqCombinedBiasData::getRawEstimates()
|
const UniqCombinedBiasData::InterpolatedData & UniqCombinedBiasData::getRawEstimates()
|
||||||
|
@ -375,7 +375,9 @@ std::string ExpressionAction::toString() const
|
|||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case ADD_COLUMN:
|
case ADD_COLUMN:
|
||||||
ss << "ADD " << result_name << " " << result_type->getName() << " " << added_column->getName();
|
ss << "ADD " << result_name << " "
|
||||||
|
<< (result_type ? result_type->getName() : "(no type)") << " "
|
||||||
|
<< (added_column ? added_column->getName() : "(no column)");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case REMOVE_COLUMN:
|
case REMOVE_COLUMN:
|
||||||
@ -387,7 +389,9 @@ std::string ExpressionAction::toString() const
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case APPLY_FUNCTION:
|
case APPLY_FUNCTION:
|
||||||
ss << "FUNCTION " << result_name << " " << result_type->getName() << " = " << function->getName() << "(";
|
ss << "FUNCTION " << result_name << " "
|
||||||
|
<< (result_type ? result_type->getName() : "(no type)") << " = "
|
||||||
|
<< (function ? function->getName() : "(no function)") << "(";
|
||||||
for (size_t i = 0; i < argument_names.size(); ++i)
|
for (size_t i = 0; i < argument_names.size(); ++i)
|
||||||
{
|
{
|
||||||
if (i)
|
if (i)
|
||||||
@ -456,9 +460,9 @@ void ExpressionActions::checkLimits(Block & block) const
|
|||||||
std::stringstream list_of_non_const_columns;
|
std::stringstream list_of_non_const_columns;
|
||||||
for (size_t i = 0, size = block.columns(); i < size; ++i)
|
for (size_t i = 0, size = block.columns(); i < size; ++i)
|
||||||
if (!block.getByPosition(i).column->isConst())
|
if (!block.getByPosition(i).column->isConst())
|
||||||
list_of_non_const_columns << (i == 0 ? "" : ", ") << block.getByPosition(i).name;
|
list_of_non_const_columns << "\n" << block.getByPosition(i).name;
|
||||||
|
|
||||||
throw Exception("Too many temporary non-const columns: " + list_of_non_const_columns.str()
|
throw Exception("Too many temporary non-const columns:" + list_of_non_const_columns.str()
|
||||||
+ ". Maximum: " + toString(limits.max_temporary_non_const_columns),
|
+ ". Maximum: " + toString(limits.max_temporary_non_const_columns),
|
||||||
ErrorCodes::TOO_MUCH_TEMPORARY_NON_CONST_COLUMNS);
|
ErrorCodes::TOO_MUCH_TEMPORARY_NON_CONST_COLUMNS);
|
||||||
}
|
}
|
||||||
@ -628,8 +632,6 @@ std::string ExpressionActions::getSmallestColumn(const NamesAndTypesList & colum
|
|||||||
|
|
||||||
void ExpressionActions::finalize(const Names & output_columns)
|
void ExpressionActions::finalize(const Names & output_columns)
|
||||||
{
|
{
|
||||||
// std::cerr << "finalize\n";
|
|
||||||
|
|
||||||
NameSet final_columns;
|
NameSet final_columns;
|
||||||
for (size_t i = 0; i < output_columns.size(); ++i)
|
for (size_t i = 0; i < output_columns.size(); ++i)
|
||||||
{
|
{
|
||||||
@ -756,13 +758,66 @@ void ExpressionActions::finalize(const Names & output_columns)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = static_cast<int>(sample_block.columns()) - 1; i >= 0; --i)
|
/* std::cerr << "\n";
|
||||||
|
for (const auto & action : actions)
|
||||||
|
std::cerr << action.toString() << "\n";
|
||||||
|
std::cerr << "\n";*/
|
||||||
|
|
||||||
|
/// Удаление ненужных временных столбцов.
|
||||||
|
|
||||||
|
/// Если у столбца после выполнения функции refcount = 0, то его можно удалить.
|
||||||
|
std::map<String, int> columns_refcount;
|
||||||
|
|
||||||
|
for (const auto & name : final_columns)
|
||||||
|
++columns_refcount[name];
|
||||||
|
|
||||||
|
for (const auto & action : actions)
|
||||||
{
|
{
|
||||||
const std::string & name = sample_block.getByPosition(i).name;
|
if (!action.source_name.empty())
|
||||||
if (!final_columns.count(name))
|
++columns_refcount[action.source_name];
|
||||||
add(ExpressionAction::removeColumn(name));
|
|
||||||
|
for (const auto & name : action.argument_names)
|
||||||
|
++columns_refcount[name];
|
||||||
|
|
||||||
|
for (const auto & name : action.prerequisite_names)
|
||||||
|
++columns_refcount[name];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Actions new_actions;
|
||||||
|
new_actions.reserve(actions.size());
|
||||||
|
|
||||||
|
for (const auto & action : actions)
|
||||||
|
{
|
||||||
|
new_actions.push_back(action);
|
||||||
|
|
||||||
|
auto process = [&] (const String & name)
|
||||||
|
{
|
||||||
|
auto refcount = --columns_refcount[name];
|
||||||
|
if (refcount <= 0)
|
||||||
|
{
|
||||||
|
new_actions.push_back(ExpressionAction::removeColumn(name));
|
||||||
|
if (sample_block.has(name))
|
||||||
|
sample_block.erase(name);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!action.source_name.empty())
|
||||||
|
process(action.source_name);
|
||||||
|
|
||||||
|
for (const auto & name : action.argument_names)
|
||||||
|
process(name);
|
||||||
|
|
||||||
|
for (const auto & name : action.prerequisite_names)
|
||||||
|
process(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
actions.swap(new_actions);
|
||||||
|
|
||||||
|
/* std::cerr << "\n";
|
||||||
|
for (const auto & action : actions)
|
||||||
|
std::cerr << action.toString() << "\n";
|
||||||
|
std::cerr << "\n";*/
|
||||||
|
|
||||||
optimize();
|
optimize();
|
||||||
checkLimits(sample_block);
|
checkLimits(sample_block);
|
||||||
}
|
}
|
||||||
|
@ -478,12 +478,17 @@ void Set::createFromAST(DataTypes & types, ASTPtr node, const Context & context,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Set::execute(Block & block, const ColumnNumbers & arguments, size_t result, bool negative) const
|
ColumnPtr Set::execute(const Block & block, bool negative) const
|
||||||
{
|
{
|
||||||
ColumnUInt8 * c_res = new ColumnUInt8;
|
size_t num_key_columns = block.columns();
|
||||||
block.getByPosition(result).column = c_res;
|
|
||||||
ColumnUInt8::Container_t & vec_res = c_res->getData();
|
if (0 == num_key_columns)
|
||||||
vec_res.resize(block.getByPosition(arguments[0]).column->size());
|
throw Exception("Logical error: no columns passed to Set::execute method.", ErrorCodes::LOGICAL_ERROR);
|
||||||
|
|
||||||
|
ColumnUInt8 * p_res = new ColumnUInt8;
|
||||||
|
ColumnPtr res = p_res;
|
||||||
|
ColumnUInt8::Container_t & vec_res = p_res->getData();
|
||||||
|
vec_res.resize(block.getByPosition(0).column->size());
|
||||||
|
|
||||||
Poco::ScopedReadRWLock lock(rwlock);
|
Poco::ScopedReadRWLock lock(rwlock);
|
||||||
|
|
||||||
@ -494,19 +499,19 @@ void Set::execute(Block & block, const ColumnNumbers & arguments, size_t result,
|
|||||||
memset(&vec_res[0], 1, vec_res.size());
|
memset(&vec_res[0], 1, vec_res.size());
|
||||||
else
|
else
|
||||||
memset(&vec_res[0], 0, vec_res.size());
|
memset(&vec_res[0], 0, vec_res.size());
|
||||||
return;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
DataTypeArray * array_type = typeid_cast<DataTypeArray *>(&*block.getByPosition(arguments[0]).type);
|
const DataTypeArray * array_type = typeid_cast<const DataTypeArray *>(&*block.getByPosition(0).type);
|
||||||
|
|
||||||
if (array_type)
|
if (array_type)
|
||||||
{
|
{
|
||||||
if (data_types.size() != 1 || arguments.size() != 1)
|
if (data_types.size() != 1 || num_key_columns != 1)
|
||||||
throw Exception("Number of columns in section IN doesn't match.", ErrorCodes::NUMBER_OF_COLUMNS_DOESNT_MATCH);
|
throw Exception("Number of columns in section IN doesn't match.", ErrorCodes::NUMBER_OF_COLUMNS_DOESNT_MATCH);
|
||||||
if (array_type->getNestedType()->getName() != data_types[0]->getName())
|
if (array_type->getNestedType()->getName() != data_types[0]->getName())
|
||||||
throw Exception(std::string() + "Types in section IN don't match: " + data_types[0]->getName() + " on the right, " + array_type->getNestedType()->getName() + " on the left.", ErrorCodes::TYPE_MISMATCH);
|
throw Exception(std::string() + "Types in section IN don't match: " + data_types[0]->getName() + " on the right, " + array_type->getNestedType()->getName() + " on the left.", ErrorCodes::TYPE_MISMATCH);
|
||||||
|
|
||||||
IColumn * in_column = &*block.getByPosition(arguments[0]).column;
|
const IColumn * in_column = &*block.getByPosition(0).column;
|
||||||
|
|
||||||
/// Константный столбец слева от IN поддерживается не напрямую. Для этого, он сначала материализуется.
|
/// Константный столбец слева от IN поддерживается не напрямую. Для этого, он сначала материализуется.
|
||||||
ColumnPtr materialized_column;
|
ColumnPtr materialized_column;
|
||||||
@ -516,24 +521,26 @@ void Set::execute(Block & block, const ColumnNumbers & arguments, size_t result,
|
|||||||
in_column = materialized_column.get();
|
in_column = materialized_column.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ColumnArray * col = typeid_cast<ColumnArray *>(in_column))
|
if (const ColumnArray * col = typeid_cast<const ColumnArray *>(in_column))
|
||||||
executeArray(col, vec_res, negative);
|
executeArray(col, vec_res, negative);
|
||||||
else
|
else
|
||||||
throw Exception("Unexpected array column type: " + in_column->getName(), ErrorCodes::ILLEGAL_COLUMN);
|
throw Exception("Unexpected array column type: " + in_column->getName(), ErrorCodes::ILLEGAL_COLUMN);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (data_types.size() != arguments.size())
|
if (data_types.size() != num_key_columns)
|
||||||
throw Exception("Number of columns in section IN doesn't match.", ErrorCodes::NUMBER_OF_COLUMNS_DOESNT_MATCH);
|
throw Exception("Number of columns in section IN doesn't match.", ErrorCodes::NUMBER_OF_COLUMNS_DOESNT_MATCH);
|
||||||
|
|
||||||
/// Запоминаем столбцы, с которыми будем работать. Также проверим, что типы данных правильные.
|
/// Запоминаем столбцы, с которыми будем работать. Также проверим, что типы данных правильные.
|
||||||
ConstColumnPlainPtrs key_columns(arguments.size());
|
ConstColumnPlainPtrs key_columns(num_key_columns);
|
||||||
for (size_t i = 0; i < arguments.size(); ++i)
|
for (size_t i = 0; i < num_key_columns; ++i)
|
||||||
{
|
{
|
||||||
key_columns[i] = block.getByPosition(arguments[i]).column;
|
key_columns[i] = block.getByPosition(i).column;
|
||||||
|
|
||||||
if (data_types[i]->getName() != block.getByPosition(arguments[i]).type->getName())
|
if (data_types[i]->getName() != block.getByPosition(i).type->getName())
|
||||||
throw Exception("Types of column " + toString(i + 1) + " in section IN don't match: " + data_types[i]->getName() + " on the right, " + block.getByPosition(arguments[i]).type->getName() + " on the left.", ErrorCodes::TYPE_MISMATCH);
|
throw Exception("Types of column " + toString(i + 1) + " in section IN don't match: "
|
||||||
|
+ data_types[i]->getName() + " on the right, " + block.getByPosition(i).type->getName() + " on the left.",
|
||||||
|
ErrorCodes::TYPE_MISMATCH);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Константные столбцы слева от IN поддерживается не напрямую. Для этого, они сначала материализуется.
|
/// Константные столбцы слева от IN поддерживается не напрямую. Для этого, они сначала материализуется.
|
||||||
@ -549,6 +556,8 @@ void Set::execute(Block & block, const ColumnNumbers & arguments, size_t result,
|
|||||||
|
|
||||||
executeOrdinary(key_columns, vec_res, negative);
|
executeOrdinary(key_columns, vec_res, negative);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -0,0 +1 @@
|
|||||||
|
20
|
@ -0,0 +1,2 @@
|
|||||||
|
SET max_temporary_non_const_columns = 10;
|
||||||
|
SELECT number + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 AS x FROM system.numbers LIMIT 1;
|
Loading…
Reference in New Issue
Block a user