]> git.ipfire.org Git - thirdparty/public-inbox.git/commitdiff
lei q: set exit code for invalid Xapian queries
authorEric Wong <e@80x24.org>
Fri, 15 Sep 2023 22:47:00 +0000 (22:47 +0000)
committerEric Wong <e@80x24.org>
Sat, 16 Sep 2023 12:12:47 +0000 (12:12 +0000)
Xapian can't parse every query, so ensure we set the
exit code for the client.

lib/PublicInbox/LeiXSearch.pm
t/lei.t

index 5965274ca211396df49e263ec6ade1508e3ba458..7f4911b34c08a7be620f985792eb99b906d98cd3 100644 (file)
@@ -186,7 +186,8 @@ sub query_one_mset { # for --threads and l2m w/o sort
        }
        my $first_ids;
        do {
-               $mset = $srch->mset($mo->{qstr}, $mo);
+               $mset = eval { $srch->mset($mo->{qstr}, $mo) };
+               return $lei->child_error(22 << 8, "E: $@") if $@; # 22 from curl
                mset_progress($lei, $dir, $mo->{offset} + $mset->size,
                                $mset->get_matches_estimated);
                wait_startq($lei); # wait for keyword updates
@@ -249,7 +250,8 @@ sub query_combined_mset { # non-parallel for non-"--threads" users
        }
        my $each_smsg = $lei->{ovv}->ovv_each_smsg_cb($lei);
        do {
-               $mset = $self->mset($mo->{qstr}, $mo);
+               $mset = eval { $self->mset($mo->{qstr}, $mo) };
+               return $lei->child_error(22 << 8, "E: $@") if $@; # 22 from curl
                mset_progress($lei, 'xsearch', $mo->{offset} + $mset->size,
                                $mset->get_matches_estimated);
                wait_startq($lei); # wait for keyword updates
diff --git a/t/lei.t b/t/lei.t
index d83bde69fd44207a98e1b35564082f9941de47b8..1199ca755b4d6459279b3e5c66193ac77460bf36 100644 (file)
--- a/t/lei.t
+++ b/t/lei.t
@@ -147,6 +147,11 @@ my $test_fail = sub {
        lei_ok('q', "foo\n");
        like($lei_err, qr/trailing `\\n' removed/s, "noted `\\n' removal");
 
+       lei(qw(q from:infinity..));
+       is($? >> 8, 22, 'combined query fails on invalid range op');
+       lei(qw(q -t from:infinity..));
+       is($? >> 8, 22, 'single query fails on invalid range op');
+
        for my $lk (qw(ei inbox)) {
                my $d = "$home/newline\n$lk";
                my $all = $lk eq 'ei' ? 'ALL' : 'all';