| 1244 | } |
| 1245 | |
| 1246 | Datum MakeStruct(const std::vector<Datum>& conds) { |
| 1247 | if (conds.size() == 0) { |
| 1248 | // The tests below want a struct scalar when no condition values passed, |
| 1249 | // not a StructArray of length 0 |
| 1250 | ScalarVector value; |
| 1251 | return std::make_shared<StructScalar>(value, struct_({})); |
| 1252 | } else { |
| 1253 | EXPECT_OK_AND_ASSIGN(Datum result, CallFunction("make_struct", conds)); |
| 1254 | return result; |
| 1255 | } |
| 1256 | } |
| 1257 | |
| 1258 | void TestCaseWhenFixedSize(const std::shared_ptr<DataType>& type) { |
| 1259 | auto cond_true = ScalarFromJSON(boolean(), "true"); |
| 1260 | auto cond_false = ScalarFromJSON(boolean(), "false"); |
| 1261 | auto cond_null = ScalarFromJSON(boolean(), "null"); |
| 1262 | auto cond1 = ArrayFromJSON(boolean(), "[true, true, null, null]"); |
| 1263 | auto cond2 = ArrayFromJSON(boolean(), "[true, false, true, null]"); |
| 1264 | auto scalar_null = ScalarFromJSON(type, "null"); |
| 1265 | auto values_null = ArrayFromJSON(type, "[null, null, null, null]"); |
| 1266 | |
| 1267 | if (type->id() == Type::DATE64) { |
| 1268 | auto scalar1 = ScalarFromJSON(type, "86400000"); |
| 1269 | auto scalar2 = ScalarFromJSON(type, "172800000"); |
| 1270 | auto values1 = ArrayFromJSON(type, "[259200000, null, 432000000, 518400000]"); |
| 1271 | auto values2 = ArrayFromJSON(type, "[604800000, 691200000, null, 864000000]"); |
| 1272 | |
| 1273 | CheckScalar("case_when", {MakeStruct({}), values1}, values1); |
| 1274 | CheckScalar("case_when", {MakeStruct({}), values_null}, values_null); |
| 1275 | |
| 1276 | CheckScalar("case_when", {MakeStruct({cond_true}), scalar1, values1}, |
| 1277 | *MakeArrayFromScalar(*scalar1, 4)); |
| 1278 | CheckScalar("case_when", {MakeStruct({cond_false}), scalar1, values1}, values1); |
| 1279 | |
| 1280 | CheckScalar("case_when", {MakeStruct({cond_true}), values1}, values1); |
| 1281 | CheckScalar("case_when", {MakeStruct({cond_false}), values1}, values_null); |
| 1282 | CheckScalar("case_when", {MakeStruct({cond_null}), values1}, values_null); |
| 1283 | CheckScalar("case_when", {MakeStruct({cond_true}), values1, values2}, values1); |
| 1284 | CheckScalar("case_when", {MakeStruct({cond_false}), values1, values2}, values2); |
| 1285 | CheckScalar("case_when", {MakeStruct({cond_null}), values1, values2}, values2); |
| 1286 | |
| 1287 | CheckScalar("case_when", {MakeStruct({cond_true, cond_true}), values1, values2}, |
| 1288 | values1); |
| 1289 | CheckScalar("case_when", {MakeStruct({cond_false, cond_false}), values1, values2}, |
| 1290 | values_null); |
| 1291 | CheckScalar("case_when", {MakeStruct({cond_true, cond_false}), values1, values2}, |
| 1292 | values1); |
| 1293 | CheckScalar("case_when", {MakeStruct({cond_false, cond_true}), values1, values2}, |
| 1294 | values2); |
| 1295 | CheckScalar("case_when", {MakeStruct({cond_null, cond_true}), values1, values2}, |
| 1296 | values2); |
| 1297 | CheckScalar("case_when", |
| 1298 | {MakeStruct({cond_false, cond_false}), values1, values2, values2}, |
| 1299 | values2); |
| 1300 | |
| 1301 | CheckScalar("case_when", {MakeStruct({cond1, cond2}), scalar1, scalar2}, |
| 1302 | ArrayFromJSON(type, "[86400000, 86400000, 172800000, null]")); |
| 1303 | CheckScalar("case_when", {MakeStruct({cond1}), scalar_null}, values_null); |
no test coverage detected