From 842eabb4afd2633687915eb439e432fb3b73ce9b Mon Sep 17 00:00:00 2001 From: Tim Stack Date: Thu, 13 Jun 2024 15:37:28 -0700 Subject: [PATCH] [sql] do not dump the log on an empty SQL result Related to #466 --- src/command_executor.cc | 49 ++++++++++--------- src/internals/sql-ref.rst | 1 + src/lnav_commands.cc | 1 + src/textfile_sub_source.cc | 16 +++++- test/Makefile.am | 1 + test/empty-result.lnav | 1 + ...9abe70ea4f072199dda850a8e1c5565ce37829.err | 0 ...9abe70ea4f072199dda850a8e1c5565ce37829.out | 0 ...a1d3c9cdc302c3f9ddfe4d8cf05fb40ffd3b56.err | 0 ...a1d3c9cdc302c3f9ddfe4d8cf05fb40ffd3b56.out | 0 test/test_sql.sh | 13 +++-- 11 files changed, 56 insertions(+), 26 deletions(-) create mode 100644 test/empty-result.lnav create mode 100644 test/expected/test_sql.sh_179abe70ea4f072199dda850a8e1c5565ce37829.err create mode 100644 test/expected/test_sql.sh_179abe70ea4f072199dda850a8e1c5565ce37829.out create mode 100644 test/expected/test_sql.sh_59a1d3c9cdc302c3f9ddfe4d8cf05fb40ffd3b56.err create mode 100644 test/expected/test_sql.sh_59a1d3c9cdc302c3f9ddfe4d8cf05fb40ffd3b56.out diff --git a/src/command_executor.cc b/src/command_executor.cc index d7c35e4b..24be29d6 100644 --- a/src/command_executor.cc +++ b/src/command_executor.cc @@ -914,7 +914,7 @@ execute_init_commands( wait_for_pipers(deadline); rebuild_indexes_repeatedly(); } - if (dls.dls_rows.size() > 1 && lnav_data.ld_view_stack.size() == 1) + if (!dls.dls_headers.empty() && lnav_data.ld_view_stack.size() == 1) { lnav_data.ld_views[LNV_DB].reload_data(); ensure_view(LNV_DB); @@ -951,36 +951,38 @@ execute_init_commands( int sql_callback(exec_context& ec, sqlite3_stmt* stmt) { + const auto& vc = view_colors::singleton(); auto& dls = *(ec.ec_label_source_stack.back()); + int ncols = sqlite3_column_count(stmt); if (!sqlite3_stmt_busy(stmt)) { dls.clear(); + for (int lpc = 0; lpc < ncols; lpc++) { + const int type = sqlite3_column_type(stmt, lpc); + std::string colname = sqlite3_column_name(stmt, lpc); + + dls.push_header(colname, type, false); + } return 0; } - auto& vc = view_colors::singleton(); - int ncols = sqlite3_column_count(stmt); - int row_number; - int lpc, retval = 0; - auto set_vars = false; + int retval = 0; + auto set_vars = dls.dls_rows.empty(); - row_number = dls.dls_rows.size(); - dls.dls_rows.resize(row_number + 1); - if (dls.dls_headers.empty()) { - for (lpc = 0; lpc < ncols; lpc++) { + if (dls.dls_rows.empty()) { + for (int lpc = 0; lpc < ncols; lpc++) { int type = sqlite3_column_type(stmt, lpc); std::string colname = sqlite3_column_name(stmt, lpc); - bool graphable; - graphable = ((type == SQLITE_INTEGER || type == SQLITE_FLOAT) - && !binary_search(lnav_data.ld_db_key_names.begin(), - lnav_data.ld_db_key_names.end(), - colname)); - - dls.push_header(colname, type, graphable); + bool graphable = (type == SQLITE_INTEGER || type == SQLITE_FLOAT) + && !binary_search(lnav_data.ld_db_key_names.begin(), + lnav_data.ld_db_key_names.end(), + colname); + auto& hm = dls.dls_headers[lpc]; + hm.hm_column_type = type; + hm.hm_graphable = graphable; if (graphable) { - auto& hm = dls.dls_headers.back(); auto name_for_ident_attrs = colname; auto attrs = vc.attrs_for_ident(name_for_ident_attrs); for (size_t attempt = 0; @@ -991,14 +993,17 @@ sql_callback(exec_context& ec, sqlite3_stmt* stmt) attrs = vc.attrs_for_ident(name_for_ident_attrs); } hm.hm_chart.with_attrs_for_ident(colname, attrs); - dls.dls_headers.back().hm_title_attrs = attrs; + hm.hm_title_attrs = attrs; + hm.hm_column_size = std::max(hm.hm_column_size, size_t{10}); } } - set_vars = true; } - for (lpc = 0; lpc < ncols; lpc++) { + + auto row_number = dls.dls_rows.size(); + dls.dls_rows.resize(row_number + 1); + for (int lpc = 0; lpc < ncols; lpc++) { auto* raw_value = sqlite3_column_value(stmt, lpc); - auto value_type = sqlite3_value_type(raw_value); + const auto value_type = sqlite3_value_type(raw_value); scoped_value_t value; auto& hm = dls.dls_headers[lpc]; diff --git a/src/internals/sql-ref.rst b/src/internals/sql-ref.rst index ca411bee..8e3f87f9 100644 --- a/src/internals/sql-ref.rst +++ b/src/internals/sql-ref.rst @@ -337,6 +337,7 @@ SELECT *result-column* FROM *table* WHERE *\[cond\]* GROUP BY *grouping-expr* OR .. code-block:: custsqlite ;SELECT * FROM syslog_log + log_line log_time log_level log_hostname log_msgid log_pid log_pri log_procname log_struct log_syslog_tag syslog_version log_part log_idle_msecs log_mark log_comment log_tags log_annotations log_filters ---- diff --git a/src/lnav_commands.cc b/src/lnav_commands.cc index 6c424a90..1bca3c4e 100644 --- a/src/lnav_commands.cc +++ b/src/lnav_commands.cc @@ -4397,6 +4397,7 @@ com_summarize(exec_context& ec, } else { bool done = false; + ec.ec_sql_callback(ec, stmt.in()); while (!done) { retcode = sqlite3_step(stmt.in()); diff --git a/src/textfile_sub_source.cc b/src/textfile_sub_source.cc index 6183fe0c..89156923 100644 --- a/src/textfile_sub_source.cc +++ b/src/textfile_sub_source.cc @@ -52,6 +52,20 @@ using namespace lnav::roles::literals; +static bool +file_needs_reformatting(const std::shared_ptr lf) +{ + switch (lf->get_text_format()) { + case text_format_t::TF_DIFF: + return false; + default: + if (lf->get_longest_line_length() > 240) { + return true; + } + return false; + } +} + size_t textfile_sub_source::text_line_count() { @@ -990,7 +1004,7 @@ textfile_sub_source::rescan_files(textfile_sub_source::scan_callback& callback, lf->get_filename().c_str(), read_res.unwrapErr().c_str()); } - } else if (lf->get_longest_line_length() > 240) { + } else if (file_needs_reformatting(lf)) { auto rend_iter = this->tss_rendered_files.find(lf->get_filename()); if (rend_iter != this->tss_rendered_files.end()) { diff --git a/test/Makefile.am b/test/Makefile.am index 8a9624de..c81e3779 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -296,6 +296,7 @@ dist_noinst_DATA = \ datafile_xml.0 \ dhcp.pcapng \ dhcp-trunc.pcapng \ + empty-result.lnav \ example.patch \ example.toml \ expected_help.txt \ diff --git a/test/empty-result.lnav b/test/empty-result.lnav new file mode 100644 index 00000000..aa282978 --- /dev/null +++ b/test/empty-result.lnav @@ -0,0 +1 @@ +;SELECT * FROM syslog_log LIMIT 0 diff --git a/test/expected/test_sql.sh_179abe70ea4f072199dda850a8e1c5565ce37829.err b/test/expected/test_sql.sh_179abe70ea4f072199dda850a8e1c5565ce37829.err new file mode 100644 index 00000000..e69de29b diff --git a/test/expected/test_sql.sh_179abe70ea4f072199dda850a8e1c5565ce37829.out b/test/expected/test_sql.sh_179abe70ea4f072199dda850a8e1c5565ce37829.out new file mode 100644 index 00000000..e69de29b diff --git a/test/expected/test_sql.sh_59a1d3c9cdc302c3f9ddfe4d8cf05fb40ffd3b56.err b/test/expected/test_sql.sh_59a1d3c9cdc302c3f9ddfe4d8cf05fb40ffd3b56.err new file mode 100644 index 00000000..e69de29b diff --git a/test/expected/test_sql.sh_59a1d3c9cdc302c3f9ddfe4d8cf05fb40ffd3b56.out b/test/expected/test_sql.sh_59a1d3c9cdc302c3f9ddfe4d8cf05fb40ffd3b56.out new file mode 100644 index 00000000..e69de29b diff --git a/test/test_sql.sh b/test/test_sql.sh index 00b774e7..c667f3a8 100644 --- a/test/test_sql.sh +++ b/test/test_sql.sh @@ -161,12 +161,13 @@ Wed May 19 12:00:04 +0000 2021 line 4 EOF -run_test ${lnav_test} -n \ +run_cap_test ${lnav_test} -n \ -c ";SELECT * FROM access_log LIMIT 0" \ ${test_dir}/logfile_access_log.0 -check_output "output generated for empty result set?" <