[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20210803170606.694085-15-rostedt@goodmis.org>
Date: Tue, 3 Aug 2021 13:05:58 -0400
From: Steven Rostedt <rostedt@...dmis.org>
To: linux-trace-devel@...r.kernel.org
Cc: linux-kernel@...r.kernel.org, Tom Zanussi <zanussi@...nel.org>,
Daniel Bristot de Oliveira <bristot@...hat.com>,
Masami Hiramatsu <mhiramat@...nel.org>,
Namhyung Kim <namhyung@...nel.org>,
linux-rt-users <linux-rt-users@...r.kernel.org>,
Clark Williams <williams@...hat.com>,
"Steven Rostedt (VMware)" <rostedt@...dmis.org>
Subject: [PATCH v3 14/22] libtracefs: Add error message for grouping events in SQL filter
From: "Steven Rostedt (VMware)" <rostedt@...dmis.org>
One requirement for the SQL filter in tracefs_sql() is that the WHERE
clause (filter) can only filter the FROM and JOIN events with "&&".
That is, you can not have:
sched_switch.next_pid == 0 || sched_waking.pid == 0
As the filtering one event stops the synthetic event, having an ||
conjunction makes no sense.
Add an error message that explains this when it is found.
Signed-off-by: Steven Rostedt (VMware) <rostedt@...dmis.org>
---
src/tracefs-sqlhist.c | 35 +++++++++++++++++++++++++----------
1 file changed, 25 insertions(+), 10 deletions(-)
diff --git a/src/tracefs-sqlhist.c b/src/tracefs-sqlhist.c
index acd3e0242d65..a0d934b4cd68 100644
--- a/src/tracefs-sqlhist.c
+++ b/src/tracefs-sqlhist.c
@@ -802,21 +802,36 @@ static int build_compare(struct tracefs_synth *synth,
return ret;
}
-static int do_verify_filter(struct filter *filter,
+static int verify_filter_error(struct sqlhist_bison *sb, struct expr *expr,
+ const char *event)
+{
+ struct field *field = &expr->field;
+
+ sb->line_no = expr->line;
+ sb->line_idx = expr->idx;
+
+ parse_error(sb, field->raw,
+ "event '%s' can not be grouped or '||' together with '%s'\n"
+ "All filters between '&&' must be for the same event\n",
+ field->event, event);
+ return -1;
+}
+
+static int do_verify_filter(struct sqlhist_bison *sb, struct filter *filter,
const char **system, const char **event)
{
int ret;
if (filter->type == FILTER_OR ||
filter->type == FILTER_AND) {
- ret = do_verify_filter(&filter->lval->filter, system, event);
+ ret = do_verify_filter(sb, &filter->lval->filter, system, event);
if (ret)
return ret;
- return do_verify_filter(&filter->rval->filter, system, event);
+ return do_verify_filter(sb, &filter->rval->filter, system, event);
}
if (filter->type == FILTER_GROUP ||
filter->type == FILTER_NOT_GROUP) {
- return do_verify_filter(&filter->lval->filter, system, event);
+ return do_verify_filter(sb, &filter->lval->filter, system, event);
}
/*
@@ -831,12 +846,12 @@ static int do_verify_filter(struct filter *filter,
if (filter->lval->field.system != *system ||
filter->lval->field.event_name != *event)
- return -1;
+ return verify_filter_error(sb, filter->lval, *event);
return 0;
}
-static int verify_filter(struct filter *filter,
+static int verify_filter(struct sqlhist_bison *sb, struct filter *filter,
const char **system, const char **event)
{
int ret;
@@ -848,17 +863,17 @@ static int verify_filter(struct filter *filter,
case FILTER_NOT_GROUP:
break;
default:
- return do_verify_filter(filter, system, event);
+ return do_verify_filter(sb, filter, system, event);
}
- ret = do_verify_filter(&filter->lval->filter, system, event);
+ ret = do_verify_filter(sb, &filter->lval->filter, system, event);
if (ret)
return ret;
switch (filter->type) {
case FILTER_OR:
case FILTER_AND:
- return do_verify_filter(&filter->rval->filter, system, event);
+ return do_verify_filter(sb, &filter->rval->filter, system, event);
default:
return 0;
}
@@ -1165,7 +1180,7 @@ static struct tracefs_synth *build_synth(struct tep_handle *tep,
bool *started;
bool start;
- ret = verify_filter(&expr->filter, &filter_system,
+ ret = verify_filter(table->sb, &expr->filter, &filter_system,
&filter_event);
if (ret < 0)
goto free;
--
2.30.2
Powered by blists - more mailing lists