1 /* ------------------------------------------------
2 Copyright 2014 AT&T Intellectual Property
3 Licensed under the Apache License, Version 2.0 (the "License");
4 you may not use this file except in compliance with the License.
5 You may obtain a copy of the License at
7 http://www.apache.org/licenses/LICENSE-2.0
9 Unless required by applicable law or agreed to in writing, software
10 distributed under the License is distributed on an "AS IS" BASIS,
11 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 See the License for the specific language governing permissions and
13 limitations under the License.
14 ------------------------------------------- */
18 bison --verbose --defines=fta.tab.cc.h -p FtaParser -o fta.tab.cc fta.y
28 /* Some addn'l includes, necessary but not included by the
34 /* prototypes for the parser callbacks.
37 #include "parse_fta.h"
38 #include "parse_schema.h"
41 extern fta_parse_t *fta_parse_result;
42 extern var_defs_t *fta_parse_defines;
60 /* for FTA definition. */
62 scalarexp_t *scalarval;
63 se_list_t *se_listval;
64 select_list_t *select_listval;
67 literal_list_t *lit_l;
69 tablevar_list_t *tbl_list;
77 list_of_gb_list_t *list_of_gb_list;
78 extended_gb_t *extended_gb;
79 extended_gb_list_t *extended_gb_list;
83 /* For table definition */
85 field_entry_list *field_list_t;
86 table_def *table_def_t;
87 table_list *table_list_schema;
90 subquery_spec *subq_spec_t;
91 subqueryspec_list *subqueryspec_list_t;
93 unpack_fcn_list *ufcnl;
98 %token <strval> STRING_TOKEN
99 %token <strval> INTNUM
100 %token <strval> LONGINTNUM
101 %token <strval> APPROXNUM
103 /* for FTA definition. */
104 %type <q_list> query_list
106 %type <tblp> select_statement
107 %type <tblp> merge_statement
108 %type <predp> opt_where_clause
109 %type <predp> opt_having_clause
110 %type <select_listval> selection
111 %type <tblp> table_exp
112 %type <tbl_list> from_clause
113 %type <tbl_list> table_ref_commalist
114 %type <table> table_ref
115 %type <stringval> qname
116 %type <predp> where_clause
117 %type <predp> having_clause
118 %type <predp> search_condition
119 %type <predp> predicate
120 %type <predp> comparison_predicate
121 %type <predp> in_predicate
122 %type <predp> opt_cleaning_when_clause
123 %type <predp> opt_cleaning_by_clause
124 %type <predp> opt_closing_when_clause
125 %type <litval> literal
126 %type <colref> column_ref
127 %type <colref> gb_ref
128 %type <ifpref> ifparam
129 %type <clist> column_ref_list
130 %type <clist> gb_ref_list
132 %type <scalarval> scalar_exp
133 %type <se_listval> scalar_exp_commalist
134 %type <select_listval> select_commalist
135 %type <lit_l> literal_commalist
136 %type <extended_gb_list> opt_group_by_clause
137 %type <clist> opt_supergroup_clause
138 %type <gb_list> gb_commalist
139 %type <extended_gb> extended_gb
140 %type <extended_gb_list> extended_gb_commalist
141 %type <list_of_gb_list> list_of_gb_commalist
143 /* for PARAM, DEFINE block */
144 %type <var_defs> variable_def
145 %type <var_defs> params_def
146 %type <var_defs> variable_list
147 %type <var_pair> variable_assign
149 /* For table definition */
150 %type <field_t> field
151 %type <field_list_t> field_list
152 %type <table_def_t> table_def
153 %type <table_list_schema> table_list
154 %type <plist_t> param_commalist
155 %type <plist_t> opt_param_commalist
156 %type <plist_t> singleparam_commalist
157 %type <plist_t> opt_singleparam_commalist
158 %type <plist_t> opt_singleparam_commalist_bkt
159 %type <namevec_t> namevec_commalist
160 %type <subq_spec_t> subq_spec
161 %type <subqueryspec_list_t> subqueryspec_list
162 %type <ufcn> unpack_func
163 %type <ufcnl> unpack_func_list
170 %left <strval> COMPARISON /* = <> < > <= >= */
173 %left <strval> SHIFT_OP /* << >> */
178 /* literal keyword tokens */
179 %token SEMICOLON LEFTBRACE RIGHTBRACE
180 /* For query definition */
183 %token FROM INNER_JOIN FILTER_JOIN OUTER_JOIN LEFT_OUTER_JOIN RIGHT_OUTER_JOIN
184 %token GROUP HAVING IN
186 %token WHERE SUPERGROUP CLEANING_WHEN CLEANING_BY CLOSING_WHEN
188 %token CUBE ROLLUP GROUPING_SETS
190 %token TRUE_V FALSE_V
191 %token TIMEVAL_L HEX_L LHEX_L IP_L IPV6_L
194 %token DEFINE_SEC PARAM_SEC
196 /* For table definition */
197 %token PROTOCOL TABLE STREAM FTA UNPACK_FCNS
198 %token OPERATOR OPERATOR_VIEW FIELDS SUBQUERIES SELECTION_PUSHDOWN
203 /* Union of possible results */
204 parse_result: query_list {
205 fta_parse_result->parse_tree_list = $1;
206 fta_parse_result->tables = NULL;
207 fta_parse_result->parse_type = QUERY_PARSE;
210 fta_parse_result->parse_tree_list = NULL;
211 fta_parse_result->fta_parse_tree = NULL;
212 fta_parse_result->tables = $1;
213 fta_parse_result->parse_type = TABLE_PARSE;
215 // table_list should contain a single STREAM_SCHEMA table.
216 | FTA LEFTBRACE table_list gsql RIGHTBRACE {
217 fta_parse_result->parse_tree_list = NULL;
218 fta_parse_result->fta_parse_tree = $4;
219 fta_parse_result->tables = $3;
220 fta_parse_result->parse_type = STREAM_PARSE;
227 WARNING: there might be some relics.
230 gsql: variable_def params_def select_statement {
231 $3->add_nmap($1); // Memory leak : plug it.
232 $3->add_param_list($2); // Memory leak : plug it.
235 | params_def variable_def select_statement {
236 $3->add_nmap($2); // Memory leak : plug it.
237 $3->add_param_list($1); // Memory leak : plug it.
240 | params_def select_statement {
241 $2->add_nmap(NULL); // Memory leak : plug it.
242 $2->add_param_list($1); // Memory leak : plug it.
245 | variable_def select_statement {
246 $2->add_nmap($1); // Memory leak : plug it.
252 | variable_def params_def merge_statement{
253 $3->add_nmap($1); // Memory leak : plug it.
254 $3->add_param_list($2); // Memory leak : plug it.
257 | params_def variable_def merge_statement{
258 $3->add_nmap($2); // Memory leak : plug it.
259 $3->add_param_list($1); // Memory leak : plug it.
262 | params_def merge_statement{
263 $2->add_param_list($1); // Memory leak : plug it.
266 | variable_def merge_statement{
267 $2->add_nmap($1); // Memory leak : plug it.
275 query_list: gsql {$$ = new query_list_t($1);}
276 | query_list SEMICOLON gsql {$$ = $1->append($3);}
280 PARAM_SEC LEFTBRACE variable_list RIGHTBRACE {$$=$3;}
281 | PARAM_SEC LEFTBRACE RIGHTBRACE {$$=NULL;}
285 DEFINE_SEC LEFTBRACE variable_list RIGHTBRACE {$$=$3;fta_parse_defines=$3;}
286 | DEFINE_SEC LEFTBRACE RIGHTBRACE {$$=NULL;fta_parse_defines = NULL;}
290 variable_assign {$$ = new var_defs_t($1);}
291 | variable_list variable_assign {$$ = $1->add_var_pair($2);}
295 NAME STRING_TOKEN SEMICOLON {$$ = new var_pair_t($1,$2);}
296 | NAME NAME SEMICOLON {$$ = new var_pair_t($1,$2);}
300 SELECT selection table_exp {$$ = $3->add_selection($2);}
304 MERGE column_ref_list
305 from_clause {$$ = new table_exp_t($2,$3);}
306 | MERGE column_ref_list SLACK scalar_exp
307 from_clause {$$ = new table_exp_t($2,$4,$5);}
310 /* query expressions */
314 select_commalist { $$ = $1;}
321 opt_supergroup_clause
323 opt_cleaning_when_clause
324 opt_cleaning_by_clause
325 opt_closing_when_clause
326 {$$=new table_exp_t($1,$2,$3,$4,$5,$6,$7, $8);}
330 FROM table_ref_commalist {$$ = $2; $$->set_properties(-1);}
331 | INNER_JOIN FROM table_ref_commalist {$$ = $3; $$->set_properties(INNER_JOIN_PROPERTY);}
332 | OUTER_JOIN FROM table_ref_commalist {$$ = $3; $$->set_properties(OUTER_JOIN_PROPERTY);}
333 | RIGHT_OUTER_JOIN FROM table_ref_commalist {$$ = $3; $$->set_properties(RIGHT_OUTER_JOIN_PROPERTY);}
334 | LEFT_OUTER_JOIN FROM table_ref_commalist {$$ = $3; $$->set_properties(LEFT_OUTER_JOIN_PROPERTY);}
335 | FILTER_JOIN '(' column_ref ',' INTNUM ')' FROM table_ref_commalist {$$ = $8; $$->set_properties(FILTER_JOIN_PROPERTY); $$->set_colref($3); $$->set_temporal_range($5);}
339 table_ref {$$ = new tablevar_list_t($1);}
340 | table_ref_commalist ',' table_ref {$$= $1->append_table($3);}
345 | table NAME { $$= $1->set_range_var($2);}
349 qname {$$ = new tablevar_t($1->c_str());}
350 | NAME '.' qname {$$ = new tablevar_t($1,$3->c_str(),0);}
351 | NAME '.' NAME '.' qname {$$ = new tablevar_t($1,$3,$5->c_str());}
352 | STRING_TOKEN '.' NAME '.' qname {$$ = new tablevar_t($1,$3,$5->c_str());}
353 | '[' NAME ']' '.' qname {$$ = new tablevar_t($2,$5->c_str(),1);}
357 NAME {$$ = new string_t($1);}
358 | qname '/' NAME {$$ = $$->append("/",$3);}
363 /* empty */ {$$=NULL;}
364 | where_clause {$$=$1;}
368 WHERE search_condition {$$ = $2;}
371 opt_cleaning_when_clause:
372 /* empty */ {$$=NULL;}
373 | CLEANING_WHEN search_condition {$$=$2; }
376 opt_cleaning_by_clause:
377 /* empty */ {$$=NULL;}
378 | CLEANING_BY search_condition {$$=$2; }
381 opt_closing_when_clause:
382 /* empty */ {$$=NULL;}
383 | CLOSING_WHEN search_condition {$$=$2; }
387 /* empty */ {$$=NULL;}
388 | having_clause {$$=$1;}
392 HAVING search_condition {$$ = $2;}
396 /* search conditions */
399 search_condition OR search_condition {$$=new predicate_t("OR",$1,$3);}
400 | search_condition AND search_condition {$$=new predicate_t("AND",$1,$3);}
401 | NOT search_condition {$$ = new predicate_t("NOT", $2 );}
402 | '(' search_condition ')' {$$ = $2;}
403 | predicate {$$ = $1;}
407 comparison_predicate { $$=$1;}
408 | in_predicate { $$ = $1;}
409 | NAME '[' ']' {$$ = predicate_t::make_paramless_fcn_predicate($1); }
410 | NAME '[' scalar_exp_commalist ']' {$$ = new predicate_t($1, $3->get_se_list()); }
413 comparison_predicate:
414 scalar_exp COMPARISON scalar_exp {$$ = new predicate_t($1,$2,$3);}
418 scalar_exp IN '[' literal_commalist ']' { $$ = new predicate_t($1,$4); }
422 literal {$$ = new literal_list_t($1);}
423 | literal_commalist ',' literal {$$ = $1->append_literal($3);}
426 /* scalar expressions */
429 scalar_exp '+' scalar_exp { $$=new scalarexp_t("+",$1,$3);}
430 | scalar_exp '-' scalar_exp { $$=new scalarexp_t("-",$1,$3);}
431 | scalar_exp '|' scalar_exp { $$=new scalarexp_t("|",$1,$3);}
432 | scalar_exp '*' scalar_exp { $$=new scalarexp_t("*",$1,$3);}
433 | scalar_exp '/' scalar_exp { $$=new scalarexp_t("/",$1,$3);}
434 | scalar_exp '&' scalar_exp { $$=new scalarexp_t("&",$1,$3);}
435 | scalar_exp '%' scalar_exp { $$=new scalarexp_t("%",$1,$3);}
436 | scalar_exp SHIFT_OP scalar_exp { $$=new scalarexp_t($2,$1,$3);}
437 | '+' scalar_exp %prec UMINUS { $$ = new scalarexp_t("+",$2);}
438 | '-' scalar_exp %prec UMINUS { $$ = new scalarexp_t("-",$2);}
439 | '!' scalar_exp %prec UMINUS { $$ = new scalarexp_t("!",$2);}
440 | '~' scalar_exp %prec UMINUS { $$ = new scalarexp_t("~",$2);}
441 | literal { $$= new scalarexp_t($1);}
442 | '$' NAME {$$ = scalarexp_t::make_param_reference($2);}
443 | ifparam {$$ = scalarexp_t::make_iface_param_reference($1);}
444 | column_ref { $$ = new scalarexp_t($1);}
445 | '(' scalar_exp ')' {$$ = $2;}
446 | AGGR '(' '*' ')' { $$ = scalarexp_t::make_star_aggr($1); }
447 | AGGR '(' scalar_exp ')' { $$ = scalarexp_t::make_se_aggr($1,$3); }
448 | NAME '(' scalar_exp_commalist ')' {$$ = new scalarexp_t($1, $3->get_se_list()); }
449 | NAME '(' ')' {$$ = scalarexp_t::make_paramless_fcn($1); }
450 | AGGR '$' '(' '*' ')' { $$ = scalarexp_t::make_star_aggr($1); $$->set_superaggr(true); }
451 | AGGR '$' '(' scalar_exp ')' { $$ = scalarexp_t::make_se_aggr($1,$4); $$->set_superaggr(true); }
452 | NAME '$' '(' scalar_exp_commalist ')' {$$ = new scalarexp_t($1, $4->get_se_list()); $$->set_superaggr(true); }
453 | NAME '$' '(' ')' {$$ = scalarexp_t::make_paramless_fcn($1); $$->set_superaggr(true); }
458 scalar_exp { $$= new select_list_t($1); }
459 | scalar_exp AS NAME { $$= new select_list_t($1,$3); }
460 | select_commalist ',' scalar_exp { $$=$1->append($3); }
461 | select_commalist ',' scalar_exp AS NAME { $$=$1->append($3,$5); }
464 scalar_exp_commalist:
465 scalar_exp { $$= new se_list_t($1); }
466 | scalar_exp_commalist ',' scalar_exp { $$=$1->append($3); }
470 STRING_TOKEN {$$ = new literal_t($1,LITERAL_STRING);}
471 | INTNUM {$$ = new literal_t($1,LITERAL_INT);}
472 | LONGINTNUM {$$ = new literal_t($1,LITERAL_LONGINT);}
473 | APPROXNUM {$$ = new literal_t($1,LITERAL_FLOAT);}
474 | TRUE_V {$$ = new literal_t("TRUE",LITERAL_BOOL);}
475 | FALSE_V {$$ = new literal_t("FALSE",LITERAL_BOOL);}
476 | TIMEVAL_L STRING_TOKEN {$$ = new literal_t($2,LITERAL_TIMEVAL);}
477 | HEX_L STRING_TOKEN {$$ = new literal_t($2,LITERAL_HEX);}
478 | LHEX_L STRING_TOKEN {$$ = new literal_t($2,LITERAL_LONGHEX);}
479 | IP_L STRING_TOKEN {$$ = new literal_t($2,LITERAL_IP);}
480 | IPV6_L STRING_TOKEN {$$ = new literal_t($2,LITERAL_IPV6);}
481 | '#' NAME {$$ = literal_t::make_define_literal($2,fta_parse_defines);}
487 /* empty */ {$$ = NULL;}
488 | GROUP BY extended_gb_commalist {$$ = $3;}
491 opt_supergroup_clause:
492 /* empty */ {$$ = NULL;}
493 | SUPERGROUP gb_ref_list {$$ = $2;}
496 list_of_gb_commalist:
497 '(' gb_commalist ')' { $$ = new list_of_gb_list_t($2);}
498 | list_of_gb_commalist ',' '(' gb_commalist ')' {$$ = $1->append($4);}
502 gb {$$ = extended_gb_t::create_from_gb($1);}
503 | ROLLUP '(' gb_commalist ')' {$$ = extended_gb_t::extended_create_from_rollup($3);}
504 | CUBE '(' gb_commalist ')' {$$ = extended_gb_t::extended_create_from_cube($3);}
505 | GROUPING_SETS '(' list_of_gb_commalist ')' {$$ = extended_gb_t::extended_create_from_gsets($3);}
508 extended_gb_commalist:
509 extended_gb { $$ = new extended_gb_list_t($1);}
510 | extended_gb_commalist ',' extended_gb { $$=$1->append($3);}
514 gb { $$ = new gb_list_t($1);}
515 | gb_commalist ',' gb { $$=$1->append($3);}
519 NAME {$$ = new gb_t($1); }
520 | NAME '.' NAME {$$ = new gb_t($1,$3); }
521 | NAME '.' NAME '.' NAME {$$ = new gb_t($1,$3,$5); }
522 | scalar_exp AS NAME {$$ = new gb_t($1,$3); }
529 I do not currently use 3 part column refs
533 '@' NAME {$$ = new ifpref_t($2);}
534 | NAME '.' '@' NAME {$$ = new ifpref_t($1, $4);}
538 NAME {$$ = new colref_t($1); }
539 | NAME '.' NAME {$$ = new colref_t($1,$3); }
540 | NAME '.' NAME '.' NAME {$$ = new colref_t($1,$3,$5); }
544 column_ref ':' column_ref {$$=new colref_list_t($1); $$->append($3);}
545 | column_ref_list ':' column_ref {$$ = $1->append($3);}
549 NAME {$$ = new colref_t($1); }
553 gb_ref ',' gb_ref {$$=new colref_list_t($1); $$->append($3);}
554 | gb_ref_list ',' gb_ref {$$ = $1->append($3);}
560 /* the various things you can name */
566 /* Table definition section */
569 table_list: table_def {$$ = new table_list($1);}
570 | table_list table_def {$$ = $1->append_table($2);}
573 table_def: PROTOCOL NAME opt_param_commalist opt_singleparam_commalist_bkt LEFTBRACE field_list RIGHTBRACE {
574 $$=new table_def($2,$3,$4, $6, PROTOCOL_SCHEMA); delete $3; delete $6;}
575 | STREAM qname opt_singleparam_commalist LEFTBRACE field_list RIGHTBRACE {
576 $$=new table_def($2->c_str(),$3,NULL,$5, STREAM_SCHEMA); delete $5;}
577 | OPERATOR_VIEW NAME LEFTBRACE OPERATOR opt_param_commalist FIELDS LEFTBRACE field_list RIGHTBRACE SUBQUERIES LEFTBRACE subqueryspec_list RIGHTBRACE SELECTION_PUSHDOWN opt_param_commalist RIGHTBRACE {
578 $$ = new table_def($2, $5, $8, $12, $15); }
579 | UNPACK_FCNS LEFTBRACE unpack_func_list RIGHTBRACE { $$ = new table_def($3); }
583 unpack_func {$$ = new unpack_fcn_list($1);}
584 | unpack_func_list SEMICOLON unpack_func {$$ = $1 -> append($3);}
588 NAME NAME INTNUM {$$ = new unpack_fcn($1,$2,$3);}
592 subq_spec {$$ = new subqueryspec_list($1);}
593 | subqueryspec_list SEMICOLON subq_spec {$$ = $1->append($3);}
597 NAME '(' namevec_commalist ')' {$$=new subquery_spec($1, $3); delete $3;}
600 field_list: field {$$ = new field_entry_list($1);}
601 | field_list field {$$ = $1->append_field($2);}
605 NAME NAME NAME opt_param_commalist opt_singleparam_commalist_bkt SEMICOLON {$$ = new field_entry($1,$2,$3,$4,$5);}
606 | NAME NAME opt_param_commalist SEMICOLON {$$ = new field_entry($1,$2,"",$3,NULL);}
610 /* empty */ {$$ = NULL;}
611 | '(' param_commalist ')' {$$ = $2;}
615 NAME {$$ = new param_list($1);}
616 | NAME NAME {$$ = new param_list($1,$2);}
617 | NAME STRING_TOKEN {$$ = new param_list($1,$2);}
618 | NAME INTNUM {$$ = new param_list($1,$2);}
619 | param_commalist ',' NAME {$$ = $1->append($3);}
620 | param_commalist ',' NAME NAME {$$ = $1->append($3,$4);}
621 | param_commalist ',' NAME STRING_TOKEN {$$ = $1->append($3,$4);}
622 | param_commalist ',' NAME INTNUM {$$ = $1->append($3,$4);}
625 opt_singleparam_commalist_bkt:
626 /* empty */ {$$ = NULL;}
627 | '[' singleparam_commalist ']' {$$ = $2;}
630 opt_singleparam_commalist:
631 /* empty */ {$$ = NULL;}
632 | '(' singleparam_commalist ')' {$$ = $2;}
635 singleparam_commalist:
636 NAME {$$ = new param_list($1);}
637 | singleparam_commalist ',' NAME {$$ = $1->append($3);}
641 NAME NAME opt_param_commalist {$$ = new name_vec($1,$2,$3);}
642 | namevec_commalist ',' NAME NAME opt_param_commalist {$$ = $1->append($3,$4, $5);}