| 980 | } |
| 981 | |
| 982 | void QueryOracle::generateExportQuery( |
| 983 | RandomGenerator & rg, StatementGenerator & gen, const bool test_content, const SQLTable & t, SQLQuery & sq2) |
| 984 | { |
| 985 | SettingValues * svs = nullptr; |
| 986 | Insert * ins = sq2.mutable_single_query()->mutable_explain()->mutable_inner_query()->mutable_insert(); |
| 987 | FileFunc * ff = ins->mutable_tof()->mutable_tfunc()->mutable_file(); |
| 988 | Expr * expr = ff->mutable_structure(); |
| 989 | SelectParen * sparen = ins->mutable_select(); |
| 990 | SelectStatementCore * sel = sparen->mutable_select()->mutable_select_core(); |
| 991 | const std::filesystem::path & cnfile = fc.client_file_path / "table.data"; |
| 992 | const std::filesystem::path & snfile = fc.server_file_path / "table.data"; |
| 993 | |
| 994 | can_test_oracle_result &= test_content; |
| 995 | /// Remove the file if exists |
| 996 | const auto err = std::filesystem::remove(cnfile); |
| 997 | UNUSED(err); |
| 998 | ff->set_path(snfile.generic_string()); |
| 999 | ff->set_fname(FileFunc_FName::FileFunc_FName_file); |
| 1000 | |
| 1001 | gen.flatTableColumnPath(skip_nested_node | flat_nested, t.cols, [](const SQLColumn & c) { return c.canBeInserted(); }); |
| 1002 | if (!can_test_oracle_result && rg.nextSmallNumber() < 3) |
| 1003 | { |
| 1004 | /// Sometimes generate a not matching structure |
| 1005 | gen.addRandomRelation(rg, std::nullopt, static_cast<uint32_t>(gen.entries.size()), expr); |
| 1006 | } |
| 1007 | else |
| 1008 | { |
| 1009 | String buf; |
| 1010 | bool first = true; |
| 1011 | |
| 1012 | for (const auto & entry : gen.entries) |
| 1013 | { |
| 1014 | buf += fmt::format( |
| 1015 | "{}{} {}{}{}{}", |
| 1016 | first ? "" : ", ", |
| 1017 | entry.columnPathRef(), |
| 1018 | entry.path.size() > 1 ? "Array(" : "", |
| 1019 | entry.getBottomType()->typeName(false, false), |
| 1020 | entry.path.size() > 1 ? ")" : "", |
| 1021 | (entry.path.size() == 1 && entry.nullable.has_value()) ? (entry.nullable.value() ? " NULL" : " NOT NULL") : ""); |
| 1022 | first = false; |
| 1023 | } |
| 1024 | expr->mutable_lit_val()->set_string_lit(std::move(buf)); |
| 1025 | } |
| 1026 | for (const auto & entry : gen.entries) |
| 1027 | { |
| 1028 | gen.columnPathRef(entry, sel->add_result_columns()->mutable_etc()->mutable_col()->mutable_path()); |
| 1029 | } |
| 1030 | gen.entries.clear(); |
| 1031 | ff->set_outformat(rg.pickRandomly(rg.pickRandomly(can_test_oracle_result ? QueryOracle::oracleFormats : outFormats))); |
| 1032 | if (rg.nextSmallNumber() < 4) |
| 1033 | { |
| 1034 | ff->set_fcomp(rg.pickRandomly(compressionMethods)); |
| 1035 | } |
| 1036 | if (rg.nextSmallNumber() < 10) |
| 1037 | { |
| 1038 | const auto & settings = can_test_oracle_result ? serverSettings : formatSettings; |
| 1039 |
nothing calls this directly
no test coverage detected