From c9ec2888539dddeefa1282f52a53c8f4f8a8fc3c Mon Sep 17 00:00:00 2001 From: Tim Stack Date: Thu, 1 Sep 2022 07:32:51 -0700 Subject: [PATCH] [regexp_vtab] hex floats were being passed through to json, which does not support hex floats It looks like sscanf("%f") was accepting hex-floats. So, lnav was passing that through to the JSON, which does not like hex floats. FYI, @trantor, this should fix the regexp_capture_into_json() issue of hex numbers being passed through. --- src/regexp_vtab.cc | 43 +++++++++---------- test/expected/expected.am | 4 ++ ...293df041b6969ccecc60204dce3676d0fb006d.err | 0 ...293df041b6969ccecc60204dce3676d0fb006d.out | 2 + ...d1128cf61a9af8f9dc937b46217443f42e1a7a.err | 0 ...d1128cf61a9af8f9dc937b46217443f42e1a7a.out | 2 + test/test_sql_regexp.sh | 8 ++++ 7 files changed, 36 insertions(+), 23 deletions(-) create mode 100644 test/expected/test_sql_regexp.sh_51293df041b6969ccecc60204dce3676d0fb006d.err create mode 100644 test/expected/test_sql_regexp.sh_51293df041b6969ccecc60204dce3676d0fb006d.out create mode 100644 test/expected/test_sql_regexp.sh_bbd1128cf61a9af8f9dc937b46217443f42e1a7a.err create mode 100644 test/expected/test_sql_regexp.sh_bbd1128cf61a9af8f9dc937b46217443f42e1a7a.out diff --git a/src/regexp_vtab.cc b/src/regexp_vtab.cc index 349caa2b..7b9de227 100644 --- a/src/regexp_vtab.cc +++ b/src/regexp_vtab.cc @@ -35,6 +35,7 @@ #include "column_namer.hh" #include "config.h" #include "pcrepp/pcrepp.hh" +#include "scn/scn.h" #include "sql_help.hh" #include "sql_util.hh" #include "vtab_module.hh" @@ -332,31 +333,27 @@ CREATE TABLE regexp_capture_into_json ( if (!cap->is_valid()) { yajl_gen_null(gen); } else { - auto* cap_start = vc.c_input->get_substr_start(cap); - char* cap_copy = (char*) alloca(cap->length() + 1); - long long int i_value; - double d_value; - int end_index; + auto cap_view = vc.c_input->to_string_view(cap); + auto scan_int_res + = scn::scan_value(cap_view); - memcpy(cap_copy, cap_start, cap->length()); - cap_copy[cap->length()] = '\0'; - - if (sscanf(cap_copy, "%lld%n", &i_value, &end_index) - == 1 - && (end_index == cap->length())) - { - yajl_gen_integer(gen, i_value); - } else if (sscanf(cap_copy, - "%lf%n", - &d_value, - &end_index) - == 1 - && (end_index == cap->length())) - { - yajl_gen_number(gen, cap_start, cap->length()); - } else { - yajl_gen_pstring(gen, cap_start, cap->length()); + if (scan_int_res && scan_int_res.range().empty()) { + yajl_gen_integer(gen, scan_int_res.value()); + continue; } + + auto scan_float_res + = scn::scan_value(cap_view); + if (scan_float_res + && scan_float_res.range().empty()) + { + yajl_gen_number( + gen, cap_view.data(), cap_view.length()); + continue; + } + + yajl_gen_pstring( + gen, cap_view.data(), cap_view.length()); } } } diff --git a/test/expected/expected.am b/test/expected/expected.am index 1972c288..7fb05baf 100644 --- a/test/expected/expected.am +++ b/test/expected/expected.am @@ -754,8 +754,12 @@ EXPECTED_FILES = \ $(srcdir)/%reldir%/test_sql_json_func.sh_f34205b59e04f261897ad89f659595c743a18ca9.out \ $(srcdir)/%reldir%/test_sql_json_func.sh_f34f5dfa938a1ac7721f924beb16bbceec127a1b.err \ $(srcdir)/%reldir%/test_sql_json_func.sh_f34f5dfa938a1ac7721f924beb16bbceec127a1b.out \ + $(srcdir)/%reldir%/test_sql_regexp.sh_51293df041b6969ccecc60204dce3676d0fb006d.err \ + $(srcdir)/%reldir%/test_sql_regexp.sh_51293df041b6969ccecc60204dce3676d0fb006d.out \ $(srcdir)/%reldir%/test_sql_regexp.sh_b841a0c09601e2419eeb99e85f7e286c889e4801.err \ $(srcdir)/%reldir%/test_sql_regexp.sh_b841a0c09601e2419eeb99e85f7e286c889e4801.out \ + $(srcdir)/%reldir%/test_sql_regexp.sh_bbd1128cf61a9af8f9dc937b46217443f42e1a7a.err \ + $(srcdir)/%reldir%/test_sql_regexp.sh_bbd1128cf61a9af8f9dc937b46217443f42e1a7a.out \ $(srcdir)/%reldir%/test_sql_search_table.sh_1a0d872ebc492fcecb2e79a0993170d5fc771a5b.err \ $(srcdir)/%reldir%/test_sql_search_table.sh_1a0d872ebc492fcecb2e79a0993170d5fc771a5b.out \ $(srcdir)/%reldir%/test_sql_search_table.sh_3f5f74863d065418bca5a000e6ad3d9344635164.err \ diff --git a/test/expected/test_sql_regexp.sh_51293df041b6969ccecc60204dce3676d0fb006d.err b/test/expected/test_sql_regexp.sh_51293df041b6969ccecc60204dce3676d0fb006d.err new file mode 100644 index 00000000..e69de29b diff --git a/test/expected/test_sql_regexp.sh_51293df041b6969ccecc60204dce3676d0fb006d.out b/test/expected/test_sql_regexp.sh_51293df041b6969ccecc60204dce3676d0fb006d.out new file mode 100644 index 00000000..49171831 --- /dev/null +++ b/test/expected/test_sql_regexp.sh_51293df041b6969ccecc60204dce3676d0fb006d.out @@ -0,0 +1,2 @@ +match_index  content  + 0 {"key":"foo","value":4670}  diff --git a/test/expected/test_sql_regexp.sh_bbd1128cf61a9af8f9dc937b46217443f42e1a7a.err b/test/expected/test_sql_regexp.sh_bbd1128cf61a9af8f9dc937b46217443f42e1a7a.err new file mode 100644 index 00000000..e69de29b diff --git a/test/expected/test_sql_regexp.sh_bbd1128cf61a9af8f9dc937b46217443f42e1a7a.out b/test/expected/test_sql_regexp.sh_bbd1128cf61a9af8f9dc937b46217443f42e1a7a.out new file mode 100644 index 00000000..655ce134 --- /dev/null +++ b/test/expected/test_sql_regexp.sh_bbd1128cf61a9af8f9dc937b46217443f42e1a7a.out @@ -0,0 +1,2 @@ +match_index  content  + 0 {"key":"foo","value":"123e"}  diff --git a/test/test_sql_regexp.sh b/test/test_sql_regexp.sh index edc2ede9..0aa0ca8b 100644 --- a/test/test_sql_regexp.sh +++ b/test/test_sql_regexp.sh @@ -6,3 +6,11 @@ run_cap_test ${lnav_test} -n \ -c ";SELECT * FROM syslog_log, regexp_capture_into_json(log_body, '"'"'"(?[^"'"'"]+)')" \ -c ":write-csv-to -" \ ${test_dir}/logfile_syslog.3 + +run_cap_test ${lnav_test} -n \ + -c ";SELECT * from regexp_capture_into_json('foo=0x123e;', '(?\w+)=(?[^;]+)')" \ + ${test_dir}/logfile_syslog.3 + +run_cap_test ${lnav_test} -n \ + -c ";SELECT * from regexp_capture_into_json('foo=123e;', '(?\w+)=(?[^;]+)')" \ + ${test_dir}/logfile_syslog.3