| 1 | #include "benchmark_runner.hpp" | 
|---|
| 2 | #include "compare_result.hpp" | 
|---|
| 3 | #include "dbgen.hpp" | 
|---|
| 4 | #include "duckdb_benchmark_macro.hpp" | 
|---|
| 5 |  | 
|---|
| 6 | using namespace duckdb; | 
|---|
| 7 | using namespace std; | 
|---|
| 8 |  | 
|---|
| 9 | #define SF 0.2 | 
|---|
| 10 |  | 
|---|
| 11 | string getQuery(int queryID) { | 
|---|
| 12 |  | 
|---|
| 13 | string queries[42] = { | 
|---|
| 14 | "l_quantity <= 1 + 10",           // H0, BOUND_COMPARISON, COMPARE_LESSTHANOREQUALTO | 
|---|
| 15 | "l_shipdate > date '1992-01-01'", // H1, BOUND_COMPARISON, COMPARE_GREATERTHAN | 
|---|
| 16 | "l_receiptdate >= l_commitdate",  // H2, BOUND_COMPARISON, COMPARE_GREATERTHANOREQUALTO | 
|---|
| 17 | "l_shipinstruct < l_comment",     // H3, BOUND_COMPARISON, | 
|---|
| 18 |  | 
|---|
| 19 | "l_commitdate = l_receiptdate",          // H4, BOUND_COMPARISON, COMPARE_EQUAL | 
|---|
| 20 | "l_orderkey != 0",                       // H5, BOUND_COMPARISON, COMPARE_NOTEQUAL | 
|---|
| 21 | "l_discount = 1.0",                      // H6, BOUND_COMPARISON, COMPARE_EQUAL | 
|---|
| 22 | "l_returnflag = 'R'",                    // H7, BOUND_COMPARISON, COMPARE_EQUAL | 
|---|
| 23 | "l_shipinstruct != 'DELIVER IN PERSON'", // H8, BOUND_COMPARISON, COMPARE_NOTEQUAL | 
|---|
| 24 |  | 
|---|
| 25 | "l_returnflag IS NOT NULL", // H9, BOUND_OPERATOR, OPERATOR_IS_NOT_NULL | 
|---|
| 26 | "l_quantity IS NULL",       // H10, BOUND_OPERATOR, | 
|---|
| 27 |  | 
|---|
| 28 | "l_shipinstruct LIKE 'DE%I%ER%'",          // H11, BOUND_FUNCTION, "~~" | 
|---|
| 29 | "l_comment NOT LIKE '%str%'",              // H12, BOUND_FUNCTION, "!~~" | 
|---|
| 30 | "l_shipinstruct SIMILAR TO 'DE.*I.*ER.*'", // H13, BOUND_FUNCTION, "regexp_matches" | 
|---|
| 31 | "l_comment NOT SIMILAR TO '.*str.*'",      // H14, BOUND_FUNCTION, "regexp_matches", preceeded by NOT | 
|---|
| 32 |  | 
|---|
| 33 | "l_shipmode IN ('MAIL', 'SHIP')", // H15, BOUND_OPERATOR, COMPARE_IN, children - 1 is the cardinality, loop over | 
|---|
| 34 | // children | 
|---|
| 35 |  | 
|---|
| 36 | "(CASE WHEN l_orderkey = 2 THEN 1 ELSE 0 END) = 1", // H16, BOUND_CASE, three children | 
|---|
| 37 |  | 
|---|
| 38 | "l_discount + l_tax",           // H17, BOUND_FUNCTION, "+" | 
|---|
| 39 | "l_tax - l_discount",           // H18, BOUND_FUNCTION, "-" | 
|---|
| 40 | "l_receiptdate - l_commitdate", // H19, BOUND_FUNCTION, "-" | 
|---|
| 41 | "l_discount * l_tax",           // H20, BOUND_FUNCTION, "*" | 
|---|
| 42 | "l_discount / l_tax",           // H21, BOUND_FUNCTION, "/" | 
|---|
| 43 | "l_orderkey % 5",               // H22, BOUND_FUNCTION, "%" | 
|---|
| 44 | "l_orderkey & l_partkey",       // H23, BOUND_FUNCTION, "&" | 
|---|
| 45 | "l_orderkey # l_partkey",       // H24, BOUND_FUNCTION, "#" | 
|---|
| 46 | "l_orderkey >> l_partkey",      // H25, BOUND_FUNCTION, ">>" | 
|---|
| 47 | "l_orderkey << l_partkey",      // H26, BOUND_FUNCTION, "<<" | 
|---|
| 48 |  | 
|---|
| 49 | "abs(l_extendedprice)", // H27, BOUND_FUNCTION, "abs" | 
|---|
| 50 | "round(l_discount, 1)", // H28, BOUND_FUNCTION, "round" | 
|---|
| 51 |  | 
|---|
| 52 | "l_shipinstruct || l_returnflag = 'R'",  // H29, BOUND_FUNCTION, "||" | 
|---|
| 53 | "length(l_comment)",                     // H30, BOUND_FUNCTION, "length" | 
|---|
| 54 | "lower(l_comment) = 'R'",                // H31, BOUND_FUNCTION, "lower" | 
|---|
| 55 | "upper(l_comment) = 'R'",                // H32, BOUND_FUNCTION, "upper" | 
|---|
| 56 | "substring(l_shipinstruct, 1, 7) = 'R'", // H33, BOUND_FUNCTION, "substring" | 
|---|
| 57 |  | 
|---|
| 58 | "date_part('year', l_commitdate)", // H34, BOUND_FUNCTION, "date_part" | 
|---|
| 59 |  | 
|---|
| 60 | "l_orderkey::VARCHAR = '1'", // H35, BOUND_CAST, OPERATOR_CAST | 
|---|
| 61 | "l_orderkey::DOUBLE = 3.0",  // H36, BOUND_CAST, OPERATOR_CAST | 
|---|
| 62 |  | 
|---|
| 63 | "l_comment SIMILAR TO '.*str.*'",     // H37, BOUND_FUNCTION, used to estimate runtime of OPERATOR_NOT | 
|---|
| 64 | "l_quantity < 10 OR l_quantity > 20", // H38, BOUND_CONJUNCTION, CONJUNCTION_OR | 
|---|
| 65 | "(l_quantity < 10 AND l_shipdate > date '1992-01-01') OR l_quantity > 20", // H39, BOUND_CONJUNCTION, | 
|---|
| 66 | // CONJUNCTION_AND | 
|---|
| 67 | "EXTRACT(YEAR from l_shipdate) = 1995", // H40, BOUND_FUNCTION, "date_part" | 
|---|
| 68 | "YEAR(l_shipdate) IN ('1995','1996')"// H41, BOUND_FUNCTION, "year" | 
|---|
| 69 | }; | 
|---|
| 70 |  | 
|---|
| 71 | string enable_profiling = "pragma enable_profiling='json';"; | 
|---|
| 72 | string query = "SELECT * FROM lineitem WHERE "+ queries[queryID] + ";"; | 
|---|
| 73 | return enable_profiling + query; | 
|---|
| 74 | } | 
|---|
| 75 |  | 
|---|
| 76 | #define HEURISTICS_QUERY_BODY(QNR)                                                                                     \ | 
|---|
| 77 | virtual void Load(DuckDBBenchmarkState *state) {                                                                   \ | 
|---|
| 78 | tpch::dbgen(SF, state->db);                                                                                    \ | 
|---|
| 79 | }                                                                                                                  \ | 
|---|
| 80 | virtual string GetQuery() {                                                                                        \ | 
|---|
| 81 | return getQuery(QNR);                                                                                          \ | 
|---|
| 82 | }                                                                                                                  \ | 
|---|
| 83 | virtual string VerifyResult(QueryResult *result) {                                                                 \ | 
|---|
| 84 | if (!result->success) {                                                                                        \ | 
|---|
| 85 | return result->error;                                                                                      \ | 
|---|
| 86 | }                                                                                                              \ | 
|---|
| 87 | return string();                                                                                               \ | 
|---|
| 88 | }                                                                                                                  \ | 
|---|
| 89 | virtual string BenchmarkInfo() {                                                                                   \ | 
|---|
| 90 | return "Executing heuristics query...";                                                                        \ | 
|---|
| 91 | } | 
|---|
| 92 |  | 
|---|
| 93 | DUCKDB_BENCHMARK(ExpressionReorderingH0, "[expression_reordering]") | 
|---|
| 94 | HEURISTICS_QUERY_BODY(0); | 
|---|
| 95 | FINISH_BENCHMARK(ExpressionReorderingH0) | 
|---|
| 96 |  | 
|---|
| 97 | DUCKDB_BENCHMARK(ExpressionReorderingH1, "[expression_reordering]") | 
|---|
| 98 | HEURISTICS_QUERY_BODY(1); | 
|---|
| 99 | FINISH_BENCHMARK(ExpressionReorderingH1) | 
|---|
| 100 |  | 
|---|
| 101 | DUCKDB_BENCHMARK(ExpressionReorderingH2, "[expression_reordering]") | 
|---|
| 102 | HEURISTICS_QUERY_BODY(2); | 
|---|
| 103 | FINISH_BENCHMARK(ExpressionReorderingH2) | 
|---|
| 104 |  | 
|---|
| 105 | DUCKDB_BENCHMARK(ExpressionReorderingH3, "[expression_reordering]") | 
|---|
| 106 | HEURISTICS_QUERY_BODY(3); | 
|---|
| 107 | FINISH_BENCHMARK(ExpressionReorderingH3) | 
|---|
| 108 |  | 
|---|
| 109 | DUCKDB_BENCHMARK(ExpressionReorderingH4, "[expression_reordering]") | 
|---|
| 110 | HEURISTICS_QUERY_BODY(4); | 
|---|
| 111 | FINISH_BENCHMARK(ExpressionReorderingH4) | 
|---|
| 112 |  | 
|---|
| 113 | DUCKDB_BENCHMARK(ExpressionReorderingH5, "[expression_reordering]") | 
|---|
| 114 | HEURISTICS_QUERY_BODY(5); | 
|---|
| 115 | FINISH_BENCHMARK(ExpressionReorderingH5) | 
|---|
| 116 |  | 
|---|
| 117 | DUCKDB_BENCHMARK(ExpressionReorderingH6, "[expression_reordering]") | 
|---|
| 118 | HEURISTICS_QUERY_BODY(6); | 
|---|
| 119 | FINISH_BENCHMARK(ExpressionReorderingH6) | 
|---|
| 120 |  | 
|---|
| 121 | DUCKDB_BENCHMARK(ExpressionReorderingH7, "[expression_reordering]") | 
|---|
| 122 | HEURISTICS_QUERY_BODY(7); | 
|---|
| 123 | FINISH_BENCHMARK(ExpressionReorderingH7) | 
|---|
| 124 |  | 
|---|
| 125 | DUCKDB_BENCHMARK(ExpressionReorderingH8, "[expression_reordering]") | 
|---|
| 126 | HEURISTICS_QUERY_BODY(8); | 
|---|
| 127 | FINISH_BENCHMARK(ExpressionReorderingH8) | 
|---|
| 128 |  | 
|---|
| 129 | DUCKDB_BENCHMARK(ExpressionReorderingH9, "[expression_reordering]") | 
|---|
| 130 | HEURISTICS_QUERY_BODY(9); | 
|---|
| 131 | FINISH_BENCHMARK(ExpressionReorderingH9) | 
|---|
| 132 |  | 
|---|
| 133 | DUCKDB_BENCHMARK(ExpressionReorderingH10, "[expression_reordering]") | 
|---|
| 134 | HEURISTICS_QUERY_BODY(10); | 
|---|
| 135 | FINISH_BENCHMARK(ExpressionReorderingH10) | 
|---|
| 136 |  | 
|---|
| 137 | DUCKDB_BENCHMARK(ExpressionReorderingH11, "[expression_reordering]") | 
|---|
| 138 | HEURISTICS_QUERY_BODY(11); | 
|---|
| 139 | FINISH_BENCHMARK(ExpressionReorderingH11) | 
|---|
| 140 |  | 
|---|
| 141 | DUCKDB_BENCHMARK(ExpressionReorderingH12, "[expression_reordering]") | 
|---|
| 142 | HEURISTICS_QUERY_BODY(12); | 
|---|
| 143 | FINISH_BENCHMARK(ExpressionReorderingH12) | 
|---|
| 144 |  | 
|---|
| 145 | DUCKDB_BENCHMARK(ExpressionReorderingH13, "[expression_reordering]") | 
|---|
| 146 | HEURISTICS_QUERY_BODY(13); | 
|---|
| 147 | FINISH_BENCHMARK(ExpressionReorderingH13) | 
|---|
| 148 |  | 
|---|
| 149 | DUCKDB_BENCHMARK(ExpressionReorderingH14, "[expression_reordering]") | 
|---|
| 150 | HEURISTICS_QUERY_BODY(14); | 
|---|
| 151 | FINISH_BENCHMARK(ExpressionReorderingH14) | 
|---|
| 152 |  | 
|---|
| 153 | DUCKDB_BENCHMARK(ExpressionReorderingH15, "[expression_reordering]") | 
|---|
| 154 | HEURISTICS_QUERY_BODY(15); | 
|---|
| 155 | FINISH_BENCHMARK(ExpressionReorderingH15) | 
|---|
| 156 |  | 
|---|
| 157 | DUCKDB_BENCHMARK(ExpressionReorderingH16, "[expression_reordering]") | 
|---|
| 158 | HEURISTICS_QUERY_BODY(16); | 
|---|
| 159 | FINISH_BENCHMARK(ExpressionReorderingH16) | 
|---|
| 160 |  | 
|---|
| 161 | DUCKDB_BENCHMARK(ExpressionReorderingH17, "[expression_reordering]") | 
|---|
| 162 | HEURISTICS_QUERY_BODY(17); | 
|---|
| 163 | FINISH_BENCHMARK(ExpressionReorderingH17) | 
|---|
| 164 |  | 
|---|
| 165 | DUCKDB_BENCHMARK(ExpressionReorderingH18, "[expression_reordering]") | 
|---|
| 166 | HEURISTICS_QUERY_BODY(18); | 
|---|
| 167 | FINISH_BENCHMARK(ExpressionReorderingH18) | 
|---|
| 168 |  | 
|---|
| 169 | DUCKDB_BENCHMARK(ExpressionReorderingH19, "[expression_reordering]") | 
|---|
| 170 | HEURISTICS_QUERY_BODY(19); | 
|---|
| 171 | FINISH_BENCHMARK(ExpressionReorderingH19) | 
|---|
| 172 |  | 
|---|
| 173 | DUCKDB_BENCHMARK(ExpressionReorderingH20, "[expression_reordering]") | 
|---|
| 174 | HEURISTICS_QUERY_BODY(20); | 
|---|
| 175 | FINISH_BENCHMARK(ExpressionReorderingH20) | 
|---|
| 176 |  | 
|---|
| 177 | DUCKDB_BENCHMARK(ExpressionReorderingH21, "[expression_reordering]") | 
|---|
| 178 | HEURISTICS_QUERY_BODY(21); | 
|---|
| 179 | FINISH_BENCHMARK(ExpressionReorderingH21) | 
|---|
| 180 |  | 
|---|
| 181 | DUCKDB_BENCHMARK(ExpressionReorderingH22, "[expression_reordering]") | 
|---|
| 182 | HEURISTICS_QUERY_BODY(22); | 
|---|
| 183 | FINISH_BENCHMARK(ExpressionReorderingH22) | 
|---|
| 184 |  | 
|---|
| 185 | DUCKDB_BENCHMARK(ExpressionReorderingH23, "[expression_reordering]") | 
|---|
| 186 | HEURISTICS_QUERY_BODY(23); | 
|---|
| 187 | FINISH_BENCHMARK(ExpressionReorderingH23) | 
|---|
| 188 |  | 
|---|
| 189 | DUCKDB_BENCHMARK(ExpressionReorderingH24, "[expression_reordering]") | 
|---|
| 190 | HEURISTICS_QUERY_BODY(24); | 
|---|
| 191 | FINISH_BENCHMARK(ExpressionReorderingH24) | 
|---|
| 192 |  | 
|---|
| 193 | DUCKDB_BENCHMARK(ExpressionReorderingH25, "[expression_reordering]") | 
|---|
| 194 | HEURISTICS_QUERY_BODY(25); | 
|---|
| 195 | FINISH_BENCHMARK(ExpressionReorderingH25) | 
|---|
| 196 |  | 
|---|
| 197 | DUCKDB_BENCHMARK(ExpressionReorderingH26, "[expression_reordering]") | 
|---|
| 198 | HEURISTICS_QUERY_BODY(26); | 
|---|
| 199 | FINISH_BENCHMARK(ExpressionReorderingH26) | 
|---|
| 200 |  | 
|---|
| 201 | DUCKDB_BENCHMARK(ExpressionReorderingH27, "[expression_reordering]") | 
|---|
| 202 | HEURISTICS_QUERY_BODY(27); | 
|---|
| 203 | FINISH_BENCHMARK(ExpressionReorderingH27) | 
|---|
| 204 |  | 
|---|
| 205 | DUCKDB_BENCHMARK(ExpressionReorderingH28, "[expression_reordering]") | 
|---|
| 206 | HEURISTICS_QUERY_BODY(28); | 
|---|
| 207 | FINISH_BENCHMARK(ExpressionReorderingH28) | 
|---|
| 208 |  | 
|---|
| 209 | DUCKDB_BENCHMARK(ExpressionReorderingH29, "[expression_reordering]") | 
|---|
| 210 | HEURISTICS_QUERY_BODY(29); | 
|---|
| 211 | FINISH_BENCHMARK(ExpressionReorderingH29) | 
|---|
| 212 |  | 
|---|
| 213 | DUCKDB_BENCHMARK(ExpressionReorderingH30, "[expression_reordering]") | 
|---|
| 214 | HEURISTICS_QUERY_BODY(30); | 
|---|
| 215 | FINISH_BENCHMARK(ExpressionReorderingH30) | 
|---|
| 216 |  | 
|---|
| 217 | DUCKDB_BENCHMARK(ExpressionReorderingH31, "[expression_reordering]") | 
|---|
| 218 | HEURISTICS_QUERY_BODY(31); | 
|---|
| 219 | FINISH_BENCHMARK(ExpressionReorderingH31) | 
|---|
| 220 |  | 
|---|
| 221 | DUCKDB_BENCHMARK(ExpressionReorderingH32, "[expression_reordering]") | 
|---|
| 222 | HEURISTICS_QUERY_BODY(32); | 
|---|
| 223 | FINISH_BENCHMARK(ExpressionReorderingH32) | 
|---|
| 224 |  | 
|---|
| 225 | DUCKDB_BENCHMARK(ExpressionReorderingH33, "[expression_reordering]") | 
|---|
| 226 | HEURISTICS_QUERY_BODY(33); | 
|---|
| 227 | FINISH_BENCHMARK(ExpressionReorderingH33) | 
|---|
| 228 |  | 
|---|
| 229 | DUCKDB_BENCHMARK(ExpressionReorderingH34, "[expression_reordering]") | 
|---|
| 230 | HEURISTICS_QUERY_BODY(34); | 
|---|
| 231 | FINISH_BENCHMARK(ExpressionReorderingH34) | 
|---|
| 232 |  | 
|---|
| 233 | DUCKDB_BENCHMARK(ExpressionReorderingH35, "[expression_reordering]") | 
|---|
| 234 | HEURISTICS_QUERY_BODY(35); | 
|---|
| 235 | FINISH_BENCHMARK(ExpressionReorderingH35) | 
|---|
| 236 |  | 
|---|
| 237 | DUCKDB_BENCHMARK(ExpressionReorderingH36, "[expression_reordering]") | 
|---|
| 238 | HEURISTICS_QUERY_BODY(36); | 
|---|
| 239 | FINISH_BENCHMARK(ExpressionReorderingH36) | 
|---|
| 240 |  | 
|---|
| 241 | DUCKDB_BENCHMARK(ExpressionReorderingH37, "[expression_reordering]") | 
|---|
| 242 | HEURISTICS_QUERY_BODY(37); | 
|---|
| 243 | FINISH_BENCHMARK(ExpressionReorderingH37) | 
|---|
| 244 |  | 
|---|
| 245 | DUCKDB_BENCHMARK(ExpressionReorderingH38, "[expression_reordering]") | 
|---|
| 246 | HEURISTICS_QUERY_BODY(38); | 
|---|
| 247 | FINISH_BENCHMARK(ExpressionReorderingH38) | 
|---|
| 248 |  | 
|---|
| 249 | DUCKDB_BENCHMARK(ExpressionReorderingH39, "[expression_reordering]") | 
|---|
| 250 | HEURISTICS_QUERY_BODY(39); | 
|---|
| 251 | FINISH_BENCHMARK(ExpressionReorderingH39) | 
|---|
| 252 |  | 
|---|
| 253 | DUCKDB_BENCHMARK(ExpressionReorderingH40, "[expression_reordering]") | 
|---|
| 254 | HEURISTICS_QUERY_BODY(40); | 
|---|
| 255 | FINISH_BENCHMARK(ExpressionReorderingH40) | 
|---|
| 256 |  | 
|---|
| 257 | DUCKDB_BENCHMARK(ExpressionReorderingH41, "[expression_reordering]") | 
|---|
| 258 | HEURISTICS_QUERY_BODY(41); | 
|---|
| 259 | FINISH_BENCHMARK(ExpressionReorderingH41) | 
|---|
| 260 |  | 
|---|