|
17 | 17 |
|
18 | 18 | #pragma once
|
19 | 19 |
|
| 20 | +#include <glog/logging.h> |
| 21 | + |
20 | 22 | #include "agent/be_exec_version_manager.h"
|
21 | 23 | #define POP true
|
22 | 24 | #define NOTPOP false
|
@@ -138,13 +140,22 @@ struct PopData : Data {
|
138 | 140 | template <typename T, typename Data>
|
139 | 141 | struct SampData_OLDER : Data {
|
140 | 142 | void insert_result_into(IColumn& to) const {
|
141 |
| - ColumnNullable& nullable_column = assert_cast<ColumnNullable&>(to); |
142 |
| - if (this->count == 1 || this->count == 0) { |
143 |
| - nullable_column.insert_default(); |
| 143 | + if (to.is_nullable()) { |
| 144 | + ColumnNullable& nullable_column = assert_cast<ColumnNullable&>(to); |
| 145 | + if (this->count == 1 || this->count == 0) { |
| 146 | + nullable_column.insert_default(); |
| 147 | + } else { |
| 148 | + auto& col = assert_cast<ColumnFloat64&>(nullable_column.get_nested_column()); |
| 149 | + col.get_data().push_back(this->get_samp_result()); |
| 150 | + nullable_column.get_null_map_data().push_back(0); |
| 151 | + } |
144 | 152 | } else {
|
145 |
| - auto& col = assert_cast<ColumnFloat64&>(nullable_column.get_nested_column()); |
146 |
| - col.get_data().push_back(this->get_samp_result()); |
147 |
| - nullable_column.get_null_map_data().push_back(0); |
| 153 | + auto& col = assert_cast<ColumnFloat64&>(to); |
| 154 | + if (this->count == 1 || this->count == 0) { |
| 155 | + col.insert_default(); |
| 156 | + } else { |
| 157 | + col.get_data().push_back(this->get_samp_result()); |
| 158 | + } |
148 | 159 | }
|
149 | 160 | }
|
150 | 161 | static DataTypePtr get_return_type() {
|
@@ -195,12 +206,30 @@ class AggregateFunctionSampCovariance
|
195 | 206 | this->data(place).add(columns[0], columns[1], row_num);
|
196 | 207 | } else {
|
197 | 208 | if constexpr (is_nullable) { //this if check could remove with old function
|
| 209 | + // nullable means at least one child is null. |
| 210 | + // so here, maybe JUST ONE OF ups is null. so nullptr perhaps in ..._x or ..._y! |
198 | 211 | const auto* nullable_column_x = check_and_get_column<ColumnNullable>(columns[0]);
|
199 | 212 | const auto* nullable_column_y = check_and_get_column<ColumnNullable>(columns[1]);
|
200 |
| - if (!nullable_column_x->is_null_at(row_num) && |
201 |
| - !nullable_column_y->is_null_at(row_num)) { |
202 |
| - this->data(place).add(&nullable_column_x->get_nested_column(), |
203 |
| - &nullable_column_y->get_nested_column(), row_num); |
| 213 | + |
| 214 | + if (nullable_column_x && nullable_column_y) { // both nullable |
| 215 | + if (!nullable_column_x->is_null_at(row_num) && |
| 216 | + !nullable_column_y->is_null_at(row_num)) { |
| 217 | + this->data(place).add(&nullable_column_x->get_nested_column(), |
| 218 | + &nullable_column_y->get_nested_column(), row_num); |
| 219 | + } |
| 220 | + } else if (nullable_column_x) { // x nullable |
| 221 | + if (!nullable_column_x->is_null_at(row_num)) { |
| 222 | + this->data(place).add(&nullable_column_x->get_nested_column(), columns[1], |
| 223 | + row_num); |
| 224 | + } |
| 225 | + } else if (nullable_column_y) { // y nullable |
| 226 | + if (!nullable_column_y->is_null_at(row_num)) { |
| 227 | + this->data(place).add(columns[0], &nullable_column_y->get_nested_column(), |
| 228 | + row_num); |
| 229 | + } |
| 230 | + } else { |
| 231 | + throw Exception(ErrorCode::INTERNAL_ERROR, |
| 232 | + "Nullable function {} get non-nullable columns!", get_name()); |
204 | 233 | }
|
205 | 234 | } else {
|
206 | 235 | this->data(place).add(columns[0], columns[1], row_num);
|
|
0 commit comments