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