1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
|
#include "catch.hpp"
#include "test_helpers.hpp"
#include <iostream>
#include <thread>
using namespace duckdb;
using namespace std;
TEST_CASE("Test query profiler", "[api]") {
duckdb::unique_ptr<QueryResult> result;
DuckDB db(nullptr);
Connection con(db);
string output;
con.EnableQueryVerification();
con.EnableProfiling();
// don't pollute the console with profiler info.
con.context->config.emit_profiler_output = false;
string query = "SELECT * FROM (SELECT 42) tbl1, (SELECT 33) tbl2";
REQUIRE_NO_FAIL(con.Query(query));
output = con.GetProfilingInformation();
REQUIRE(output.size() > 0);
bool query_found_in_output = output.find(query) != std::string::npos;
REQUIRE(query_found_in_output);
output = con.GetProfilingInformation(ProfilerPrintFormat::JSON);
REQUIRE(output.size() > 0);
query_found_in_output = output.find(query) != std::string::npos;
REQUIRE(query_found_in_output);
}
TEST_CASE("Test query profiler, no query in the profiling output.", "[api]") {
duckdb::unique_ptr<QueryResult> result;
DuckDB db(nullptr);
Connection con(db);
string output;
con.EnableQueryVerification();
con.EnableProfiling();
// don't pollute the console with profiler info.
con.context->config.emit_profiler_output = false;
// Disable `QUERY_NAME` in profiling output.
REQUIRE_NO_FAIL(con.Query(R"(PRAGMA custom_profiling_settings = '{"QUERY_NAME": "false"}')"));
string query = "SELECT * FROM (SELECT 42) tbl1, (SELECT 33) tbl2";
REQUIRE_NO_FAIL(con.Query(query));
output = con.GetProfilingInformation();
REQUIRE(output.size() > 0);
bool query_not_found_in_output = output.find(query) == std::string::npos;
REQUIRE(query_not_found_in_output);
output = con.GetProfilingInformation(ProfilerPrintFormat::JSON);
REQUIRE(output.size() > 0);
query_not_found_in_output = output.find(query) == std::string::npos;
REQUIRE(query_not_found_in_output);
}
TEST_CASE("Test latency when interrupting query", "[api]") {
duckdb::unique_ptr<QueryResult> result;
DuckDB db(nullptr);
Connection con(db);
con.EnableQueryVerification();
con.EnableProfiling();
con.context->config.emit_profiler_output = false;
// Test interupting a query and running a new one afterward.
// The latency should reflect the new one.
thread t([&con]() {
string query = "explain analyze select sum(range) from range(1_000_000_000);";
con.Query(query);
});
this_thread::sleep_for(chrono::milliseconds(100));
con.Interrupt();
t.join();
string query = "explain analyze select 42;";
REQUIRE_NO_FAIL(con.Query(query));
auto profiling_info = con.GetProfilingTree()->GetProfilingInfo();
auto latency = profiling_info.GetMetricValue<double>(MetricType::LATENCY);
auto query_name = profiling_info.GetMetricValue<string>(MetricType::QUERY_NAME);
REQUIRE(query == query_name);
REQUIRE(latency > 0);
REQUIRE(latency < 0.1);
}
|