xref: /aosp_15_r20/external/libtracefs/src/sqlhist.y (revision 287e80b3a36113050663245e7f2c00d274188f18)
1*287e80b3SSadaf Ebrahimi %{
2*287e80b3SSadaf Ebrahimi #include <stdio.h>
3*287e80b3SSadaf Ebrahimi #include <stdlib.h>
4*287e80b3SSadaf Ebrahimi #include <string.h>
5*287e80b3SSadaf Ebrahimi #include <errno.h>
6*287e80b3SSadaf Ebrahimi 
7*287e80b3SSadaf Ebrahimi #include "sqlhist-parse.h"
8*287e80b3SSadaf Ebrahimi 
9*287e80b3SSadaf Ebrahimi #define scanner sb->scanner
10*287e80b3SSadaf Ebrahimi 
11*287e80b3SSadaf Ebrahimi extern int yylex(YYSTYPE *yylval, void *);
12*287e80b3SSadaf Ebrahimi extern void yyerror(struct sqlhist_bison *, char *fmt, ...);
13*287e80b3SSadaf Ebrahimi 
14*287e80b3SSadaf Ebrahimi #define CHECK_RETURN_PTR(x)					\
15*287e80b3SSadaf Ebrahimi 	do {							\
16*287e80b3SSadaf Ebrahimi 		if (!(x)) {					\
17*287e80b3SSadaf Ebrahimi 			printf("FAILED MEMORY: %s\n", #x);	\
18*287e80b3SSadaf Ebrahimi 			return -ENOMEM;				\
19*287e80b3SSadaf Ebrahimi 		}						\
20*287e80b3SSadaf Ebrahimi 	} while (0)
21*287e80b3SSadaf Ebrahimi 
22*287e80b3SSadaf Ebrahimi #define CHECK_RETURN_VAL(x)					\
23*287e80b3SSadaf Ebrahimi 	do {							\
24*287e80b3SSadaf Ebrahimi 		if ((x) < 0) {					\
25*287e80b3SSadaf Ebrahimi 			printf("FAILED MEMORY: %s\n", #x);	\
26*287e80b3SSadaf Ebrahimi 			return -ENOMEM;				\
27*287e80b3SSadaf Ebrahimi 		}						\
28*287e80b3SSadaf Ebrahimi 	} while (0)
29*287e80b3SSadaf Ebrahimi 
30*287e80b3SSadaf Ebrahimi %}
31*287e80b3SSadaf Ebrahimi 
32*287e80b3SSadaf Ebrahimi %define api.pure
33*287e80b3SSadaf Ebrahimi 
34*287e80b3SSadaf Ebrahimi /* Change the globals to use tracefs_ prefix */
35*287e80b3SSadaf Ebrahimi %define api.prefix{tracefs_}
36*287e80b3SSadaf Ebrahimi %code provides
37*287e80b3SSadaf Ebrahimi {
38*287e80b3SSadaf Ebrahimi   #define YYSTYPE TRACEFS_STYPE
39*287e80b3SSadaf Ebrahimi   #define yylex tracefs_lex
40*287e80b3SSadaf Ebrahimi   #define yyerror tracefs_error
41*287e80b3SSadaf Ebrahimi }
42*287e80b3SSadaf Ebrahimi 
43*287e80b3SSadaf Ebrahimi %lex-param {void *scanner}
44*287e80b3SSadaf Ebrahimi %parse-param {struct sqlhist_bison *sb}
45*287e80b3SSadaf Ebrahimi 
46*287e80b3SSadaf Ebrahimi %union {
47*287e80b3SSadaf Ebrahimi 	int	s32;
48*287e80b3SSadaf Ebrahimi 	char	*string;
49*287e80b3SSadaf Ebrahimi 	long	number;
50*287e80b3SSadaf Ebrahimi 	void	*expr;
51*287e80b3SSadaf Ebrahimi }
52*287e80b3SSadaf Ebrahimi 
53*287e80b3SSadaf Ebrahimi %token AS SELECT FROM JOIN ON WHERE PARSE_ERROR CAST
54*287e80b3SSadaf Ebrahimi %token <number> NUMBER field_type
55*287e80b3SSadaf Ebrahimi %token <string> STRING
56*287e80b3SSadaf Ebrahimi %token <string> FIELD
57*287e80b3SSadaf Ebrahimi %token <string> LE GE EQ NEQ AND OR
58*287e80b3SSadaf Ebrahimi 
59*287e80b3SSadaf Ebrahimi %left '+' '-'
60*287e80b3SSadaf Ebrahimi %left '*' '/'
61*287e80b3SSadaf Ebrahimi %left '<' '>'
62*287e80b3SSadaf Ebrahimi %left AND OR
63*287e80b3SSadaf Ebrahimi 
64*287e80b3SSadaf Ebrahimi %type <string> name label
65*287e80b3SSadaf Ebrahimi 
66*287e80b3SSadaf Ebrahimi %type <expr>  selection_expr field item named_field
67*287e80b3SSadaf Ebrahimi %type <expr>  selection_addition
68*287e80b3SSadaf Ebrahimi %type <expr>  compare compare_list compare_cmds compare_items
69*287e80b3SSadaf Ebrahimi %type <expr>  compare_and_or
70*287e80b3SSadaf Ebrahimi %type <expr>  str_val val
71*287e80b3SSadaf Ebrahimi 
72*287e80b3SSadaf Ebrahimi %%
73*287e80b3SSadaf Ebrahimi 
74*287e80b3SSadaf Ebrahimi start :
75*287e80b3SSadaf Ebrahimi    select_statement
76*287e80b3SSadaf Ebrahimi  ;
77*287e80b3SSadaf Ebrahimi 
78*287e80b3SSadaf Ebrahimi label : AS name { CHECK_RETURN_PTR($$ = store_str(sb, $2)); }
79*287e80b3SSadaf Ebrahimi  | name { CHECK_RETURN_PTR($$ = store_str(sb, $1)); }
80*287e80b3SSadaf Ebrahimi  ;
81*287e80b3SSadaf Ebrahimi 
82*287e80b3SSadaf Ebrahimi select : SELECT  { table_start(sb); }
83*287e80b3SSadaf Ebrahimi   ;
84*287e80b3SSadaf Ebrahimi 
85*287e80b3SSadaf Ebrahimi select_statement :
86*287e80b3SSadaf Ebrahimi     select selection_list table_exp
87*287e80b3SSadaf Ebrahimi   ;
88*287e80b3SSadaf Ebrahimi 
89*287e80b3SSadaf Ebrahimi selection_list :
90*287e80b3SSadaf Ebrahimi    selection
91*287e80b3SSadaf Ebrahimi  | selection ',' selection_list
92*287e80b3SSadaf Ebrahimi  ;
93*287e80b3SSadaf Ebrahimi 
94*287e80b3SSadaf Ebrahimi selection :
95*287e80b3SSadaf Ebrahimi     selection_expr
96*287e80b3SSadaf Ebrahimi 				{
97*287e80b3SSadaf Ebrahimi 					CHECK_RETURN_VAL(add_selection(sb, $1, NULL));
98*287e80b3SSadaf Ebrahimi 				}
99*287e80b3SSadaf Ebrahimi   | selection_expr label
100*287e80b3SSadaf Ebrahimi 				{
101*287e80b3SSadaf Ebrahimi 					CHECK_RETURN_VAL(add_selection(sb, $1, $2));
102*287e80b3SSadaf Ebrahimi 				}
103*287e80b3SSadaf Ebrahimi   ;
104*287e80b3SSadaf Ebrahimi 
105*287e80b3SSadaf Ebrahimi selection_expr :
106*287e80b3SSadaf Ebrahimi    field
107*287e80b3SSadaf Ebrahimi  | '(' field ')'		{  $$ = $2; }
108*287e80b3SSadaf Ebrahimi  | selection_addition
109*287e80b3SSadaf Ebrahimi  | '(' selection_addition ')'	{  $$ = $2; }
110*287e80b3SSadaf Ebrahimi  | CAST '(' field AS FIELD ')'	{
111*287e80b3SSadaf Ebrahimi 					 $$ = add_cast(sb, $3, $5);
112*287e80b3SSadaf Ebrahimi 					 CHECK_RETURN_PTR($$);
113*287e80b3SSadaf Ebrahimi 				}
114*287e80b3SSadaf Ebrahimi  ;
115*287e80b3SSadaf Ebrahimi 
116*287e80b3SSadaf Ebrahimi selection_addition :
117*287e80b3SSadaf Ebrahimi    field '+' field
118*287e80b3SSadaf Ebrahimi 				{
119*287e80b3SSadaf Ebrahimi 					$$ = add_compare(sb, $1, $3, COMPARE_ADD);
120*287e80b3SSadaf Ebrahimi 					CHECK_RETURN_PTR($$);
121*287e80b3SSadaf Ebrahimi 				}
122*287e80b3SSadaf Ebrahimi  | field '-' field
123*287e80b3SSadaf Ebrahimi 				{
124*287e80b3SSadaf Ebrahimi 					$$ = add_compare(sb, $1, $3, COMPARE_SUB);
125*287e80b3SSadaf Ebrahimi 					CHECK_RETURN_PTR($$);
126*287e80b3SSadaf Ebrahimi 				}
127*287e80b3SSadaf Ebrahimi  ;
128*287e80b3SSadaf Ebrahimi 
129*287e80b3SSadaf Ebrahimi item :
130*287e80b3SSadaf Ebrahimi    named_field
131*287e80b3SSadaf Ebrahimi  | field
132*287e80b3SSadaf Ebrahimi  ;
133*287e80b3SSadaf Ebrahimi 
134*287e80b3SSadaf Ebrahimi field :
135*287e80b3SSadaf Ebrahimi    FIELD	{ $$ = add_field(sb, $1, NULL); CHECK_RETURN_PTR($$); }
136*287e80b3SSadaf Ebrahimi  ;
137*287e80b3SSadaf Ebrahimi 
138*287e80b3SSadaf Ebrahimi named_field :
139*287e80b3SSadaf Ebrahimi    FIELD label { $$ = add_field(sb, $1, $2); CHECK_RETURN_PTR($$); }
140*287e80b3SSadaf Ebrahimi  ;
141*287e80b3SSadaf Ebrahimi 
142*287e80b3SSadaf Ebrahimi name :
143*287e80b3SSadaf Ebrahimi    FIELD
144*287e80b3SSadaf Ebrahimi  ;
145*287e80b3SSadaf Ebrahimi 
146*287e80b3SSadaf Ebrahimi str_val :
147*287e80b3SSadaf Ebrahimi    STRING	{ $$ = add_string(sb, $1); CHECK_RETURN_PTR($$); }
148*287e80b3SSadaf Ebrahimi  ;
149*287e80b3SSadaf Ebrahimi 
150*287e80b3SSadaf Ebrahimi val :
151*287e80b3SSadaf Ebrahimi    str_val
152*287e80b3SSadaf Ebrahimi  | NUMBER	{ $$ = add_number(sb, $1); CHECK_RETURN_PTR($$); }
153*287e80b3SSadaf Ebrahimi  ;
154*287e80b3SSadaf Ebrahimi 
155*287e80b3SSadaf Ebrahimi 
156*287e80b3SSadaf Ebrahimi compare :
157*287e80b3SSadaf Ebrahimi    field '<' val	{ $$ = add_filter(sb, $1, $3, FILTER_LT); CHECK_RETURN_PTR($$); }
158*287e80b3SSadaf Ebrahimi  | field '>' val	{ $$ = add_filter(sb, $1, $3, FILTER_GT); CHECK_RETURN_PTR($$); }
159*287e80b3SSadaf Ebrahimi  | field LE val	{ $$ = add_filter(sb, $1, $3, FILTER_LE); CHECK_RETURN_PTR($$); }
160*287e80b3SSadaf Ebrahimi  | field GE val	{ $$ = add_filter(sb, $1, $3, FILTER_GE); CHECK_RETURN_PTR($$); }
161*287e80b3SSadaf Ebrahimi  | field '=' val	{ $$ = add_filter(sb, $1, $3, FILTER_EQ); CHECK_RETURN_PTR($$); }
162*287e80b3SSadaf Ebrahimi  | field EQ val	{ $$ = add_filter(sb, $1, $3, FILTER_EQ); CHECK_RETURN_PTR($$); }
163*287e80b3SSadaf Ebrahimi  | field NEQ val	{ $$ = add_filter(sb, $1, $3, FILTER_NE); CHECK_RETURN_PTR($$); }
164*287e80b3SSadaf Ebrahimi  | field "!=" val	{ $$ = add_filter(sb, $1, $3, FILTER_NE); CHECK_RETURN_PTR($$); }
165*287e80b3SSadaf Ebrahimi  | field '&' val	{ $$ = add_filter(sb, $1, $3, FILTER_BIN_AND); CHECK_RETURN_PTR($$); }
166*287e80b3SSadaf Ebrahimi  | field '~' str_val	{ $$ = add_filter(sb, $1, $3, FILTER_STR_CMP); CHECK_RETURN_PTR($$); }
167*287e80b3SSadaf Ebrahimi ;
168*287e80b3SSadaf Ebrahimi 
169*287e80b3SSadaf Ebrahimi compare_and_or :
170*287e80b3SSadaf Ebrahimi    compare_and_or OR compare_and_or	{ $$ = add_filter(sb, $1, $3, FILTER_OR); CHECK_RETURN_PTR($$); }
171*287e80b3SSadaf Ebrahimi  | compare_and_or AND compare_and_or	{ $$ = add_filter(sb, $1, $3, FILTER_AND); CHECK_RETURN_PTR($$); }
172*287e80b3SSadaf Ebrahimi  | '!' '(' compare_and_or ')'		{ $$ = add_filter(sb, $3, NULL, FILTER_NOT_GROUP); CHECK_RETURN_PTR($$); }
173*287e80b3SSadaf Ebrahimi  | '!' compare				{ $$ = add_filter(sb, $2, NULL, FILTER_NOT_GROUP); CHECK_RETURN_PTR($$); }
174*287e80b3SSadaf Ebrahimi  | compare
175*287e80b3SSadaf Ebrahimi  ;
176*287e80b3SSadaf Ebrahimi 
177*287e80b3SSadaf Ebrahimi compare_items :
178*287e80b3SSadaf Ebrahimi    compare_items OR compare_items	{ $$ = add_filter(sb, $1, $3, FILTER_OR); CHECK_RETURN_PTR($$); }
179*287e80b3SSadaf Ebrahimi  | '(' compare_and_or ')'		{ $$ = add_filter(sb, $2, NULL, FILTER_GROUP); CHECK_RETURN_PTR($$); }
180*287e80b3SSadaf Ebrahimi  | '!' '(' compare_and_or ')'		{ $$ = add_filter(sb, $3, NULL, FILTER_NOT_GROUP); CHECK_RETURN_PTR($$); }
181*287e80b3SSadaf Ebrahimi  | '!' compare				{ $$ = add_filter(sb, $2, NULL, FILTER_NOT_GROUP); CHECK_RETURN_PTR($$); }
182*287e80b3SSadaf Ebrahimi  | compare
183*287e80b3SSadaf Ebrahimi  ;
184*287e80b3SSadaf Ebrahimi 
185*287e80b3SSadaf Ebrahimi compare_cmds :
186*287e80b3SSadaf Ebrahimi    compare_items		{ CHECK_RETURN_VAL(add_where(sb, $1)); }
187*287e80b3SSadaf Ebrahimi  ;
188*287e80b3SSadaf Ebrahimi 
189*287e80b3SSadaf Ebrahimi /*
190*287e80b3SSadaf Ebrahimi  * Top level AND is equal to ',' but the compare_cmds in them must
191*287e80b3SSadaf Ebrahimi  * all be of for the same event (start or end exclusive).
192*287e80b3SSadaf Ebrahimi  * That is, OR is not to be used between start and end events.
193*287e80b3SSadaf Ebrahimi  */
194*287e80b3SSadaf Ebrahimi compare_list :
195*287e80b3SSadaf Ebrahimi    compare_cmds
196*287e80b3SSadaf Ebrahimi  | compare_cmds ',' compare_list
197*287e80b3SSadaf Ebrahimi  | compare_cmds AND compare_list
198*287e80b3SSadaf Ebrahimi  ;
199*287e80b3SSadaf Ebrahimi 
200*287e80b3SSadaf Ebrahimi where_clause :
201*287e80b3SSadaf Ebrahimi    WHERE compare_list
202*287e80b3SSadaf Ebrahimi  ;
203*287e80b3SSadaf Ebrahimi 
204*287e80b3SSadaf Ebrahimi opt_where_clause :
205*287e80b3SSadaf Ebrahimi    /* empty */
206*287e80b3SSadaf Ebrahimi  | where_clause
207*287e80b3SSadaf Ebrahimi ;
208*287e80b3SSadaf Ebrahimi 
209*287e80b3SSadaf Ebrahimi opt_join_clause :
210*287e80b3SSadaf Ebrahimi   /* empty set */
211*287e80b3SSadaf Ebrahimi   | join_clause
212*287e80b3SSadaf Ebrahimi  ;
213*287e80b3SSadaf Ebrahimi 
214*287e80b3SSadaf Ebrahimi table_exp :
215*287e80b3SSadaf Ebrahimi    from_clause opt_join_clause opt_where_clause
216*287e80b3SSadaf Ebrahimi  ;
217*287e80b3SSadaf Ebrahimi 
218*287e80b3SSadaf Ebrahimi from_clause :
219*287e80b3SSadaf Ebrahimi    FROM item		{ CHECK_RETURN_VAL(add_from(sb, $2)); }
220*287e80b3SSadaf Ebrahimi 
221*287e80b3SSadaf Ebrahimi /*
222*287e80b3SSadaf Ebrahimi  * Select from a from clause confuses the variable parsing.
223*287e80b3SSadaf Ebrahimi  * disable it for now.
224*287e80b3SSadaf Ebrahimi 
225*287e80b3SSadaf Ebrahimi    | FROM '(' select_statement ')' label
226*287e80b3SSadaf Ebrahimi 				{
227*287e80b3SSadaf Ebrahimi 					from_table_end($5);
228*287e80b3SSadaf Ebrahimi 					$$ = store_printf("FROM (%s) AS %s", $3, $5);
229*287e80b3SSadaf Ebrahimi 				}
230*287e80b3SSadaf Ebrahimi */
231*287e80b3SSadaf Ebrahimi  ;
232*287e80b3SSadaf Ebrahimi 
233*287e80b3SSadaf Ebrahimi join_clause :
234*287e80b3SSadaf Ebrahimi  JOIN item ON match_clause	{ add_to(sb, $2); }
235*287e80b3SSadaf Ebrahimi  ;
236*287e80b3SSadaf Ebrahimi 
237*287e80b3SSadaf Ebrahimi match :
238*287e80b3SSadaf Ebrahimi    item '=' item { CHECK_RETURN_VAL(add_match(sb, $1, $3)); }
239*287e80b3SSadaf Ebrahimi  | item EQ item { CHECK_RETURN_VAL(add_match(sb, $1, $3)); }
240*287e80b3SSadaf Ebrahimi 
241*287e80b3SSadaf Ebrahimi  ;
242*287e80b3SSadaf Ebrahimi 
243*287e80b3SSadaf Ebrahimi match_clause :
244*287e80b3SSadaf Ebrahimi    match
245*287e80b3SSadaf Ebrahimi  | match ',' match_clause
246*287e80b3SSadaf Ebrahimi  ;
247*287e80b3SSadaf Ebrahimi 
248*287e80b3SSadaf Ebrahimi %%
249