-/* ------------------------------------------------
-Copyright 2014 AT&T Intellectual Property
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- ------------------------------------------- */
-
-/*
- MUST COMPILE WITH
- bison --verbose --defines=fta.tab.cc.h -p FtaParser -o fta.tab.cc fta.y
-
- (or equivalent).
-*/
-
-%{
-
-
-#include <stdio.h>
-
-/* Some addn'l includes, necessary but not included by the
- bison generated code.
-*/
-
-#include <stdlib.h>
-
-/* prototypes for the parser callbacks.
-*/
-
-#include "parse_fta.h"
-#include "parse_schema.h"
-
-
-extern fta_parse_t *fta_parse_result;
-extern var_defs_t *fta_parse_defines;
-
-
-#define YYDEBUG 1
-
-%}
-
-
- /* symbolic tokens */
-
-%union {
- int intval;
- double floatval;
- char *strval;
- int subtok;
-
- string_t *stringval;
-
-/* for FTA definition. */
- literal_t *litval;
- scalarexp_t *scalarval;
- se_list_t *se_listval;
- select_list_t *select_listval;
- table_exp_t *tblp;
- predicate_t *predp;
- literal_list_t *lit_l;
- tablevar_t *table;
- tablevar_list_t *tbl_list;
- colref_t *colref;
- ifpref_t *ifpref;
- colref_list_t *clist;
- var_defs_t *var_defs;
- var_pair_t *var_pair;
- gb_t *gb_val;
- gb_list_t *gb_list;
- list_of_gb_list_t *list_of_gb_list;
- extended_gb_t *extended_gb;
- extended_gb_list_t *extended_gb_list;
-
- query_list_t *q_list;
-
-/* For table definition */
- field_entry *field_t;
- field_entry_list *field_list_t;
- table_def *table_def_t;
- table_list *table_list_schema;
- param_list *plist_t;
- name_vec *namevec_t;
- subquery_spec *subq_spec_t;
- subqueryspec_list *subqueryspec_list_t;
- unpack_fcn *ufcn;
- unpack_fcn_list *ufcnl;
-
-}
-
-%token <strval> NAME
-%token <strval> STRING_TOKEN
-%token <strval> INTNUM
-%token <strval> LONGINTNUM
-%token <strval> APPROXNUM
-
-/* for FTA definition. */
-%type <q_list> query_list
-%type <tblp> gsql
-%type <tblp> select_statement
-%type <tblp> merge_statement
-%type <predp> opt_where_clause
-%type <predp> opt_having_clause
-%type <select_listval> selection
-%type <tblp> table_exp
-%type <tbl_list> from_clause
-%type <tbl_list> table_ref_commalist
-%type <table> table_ref
-%type <stringval> qname
-%type <predp> where_clause
-%type <predp> having_clause
-%type <predp> search_condition
-%type <predp> predicate
-%type <predp> comparison_predicate
-%type <predp> in_predicate
-%type <predp> opt_cleaning_when_clause
-%type <predp> opt_cleaning_by_clause
-%type <predp> opt_closing_when_clause
-%type <litval> literal
-%type <colref> column_ref
-%type <colref> gb_ref
-%type <ifpref> ifparam
-%type <clist> column_ref_list
-%type <clist> gb_ref_list
-%type <table> table
-%type <scalarval> scalar_exp
-%type <se_listval> scalar_exp_commalist
-%type <select_listval> select_commalist
-%type <lit_l> literal_commalist
-%type <extended_gb_list> opt_group_by_clause
-%type <clist> opt_supergroup_clause
-%type <gb_list> gb_commalist
-%type <extended_gb> extended_gb
-%type <extended_gb_list> extended_gb_commalist
-%type <list_of_gb_list> list_of_gb_commalist
-%type <gb_val> gb
-/* for PARAM, DEFINE block */
-%type <var_defs> variable_def
-%type <var_defs> params_def
-%type <var_defs> variable_list
-%type <var_pair> variable_assign
-
-/* For table definition */
-%type <field_t> field
-%type <field_list_t> field_list
-%type <table_def_t> table_def
-%type <table_list_schema> table_list
-%type <plist_t> param_commalist
-%type <plist_t> opt_param_commalist
-%type <plist_t> singleparam_commalist
-%type <plist_t> opt_singleparam_commalist
-%type <plist_t> opt_singleparam_commalist_bkt
-%type <namevec_t> namevec_commalist
-%type <subq_spec_t> subq_spec
-%type <subqueryspec_list_t> subqueryspec_list
-%type <ufcn> unpack_func
-%type <ufcnl> unpack_func_list
-
- /* operators */
-
-%left OR
-%left AND
-%left NOT
-%left <strval> COMPARISON /* = <> < > <= >= */
-%left '|'
-%left '&'
-%left <strval> SHIFT_OP /* << >> */
-%left '+' '-'
-%left '*' '/' '%'
-%nonassoc UMINUS
-
- /* literal keyword tokens */
-%token SEMICOLON LEFTBRACE RIGHTBRACE
-/* For query definition */
-%token BY AS
-%token <strval> AGGR
-%token FROM INNER_JOIN FILTER_JOIN OUTER_JOIN LEFT_OUTER_JOIN RIGHT_OUTER_JOIN
-%token GROUP HAVING IN
-%token SELECT
-%token WHERE SUPERGROUP CLEANING_WHEN CLEANING_BY CLOSING_WHEN
-%token SUCH THAT
-%token CUBE ROLLUP GROUPING_SETS
-
-%token TRUE_V FALSE_V
-%token TIMEVAL_L HEX_L LHEX_L IP_L IPV6_L
-%token MERGE SLACK
-
-%token DEFINE_SEC PARAM_SEC
-
-/* For table definition */
-%token PROTOCOL TABLE STREAM FTA UNPACK_FCNS
-%token OPERATOR OPERATOR_VIEW FIELDS SUBQUERIES SELECTION_PUSHDOWN
-
-
-%%
-
-/* Union of possible results */
-parse_result: query_list {
- fta_parse_result->parse_tree_list = $1;
- fta_parse_result->tables = NULL;
- fta_parse_result->parse_type = QUERY_PARSE;
- }
- | table_list {
- fta_parse_result->parse_tree_list = NULL;
- fta_parse_result->fta_parse_tree = NULL;
- fta_parse_result->tables = $1;
- fta_parse_result->parse_type = TABLE_PARSE;
- }
-// table_list should contain a single STREAM_SCHEMA table.
- | FTA LEFTBRACE table_list gsql RIGHTBRACE {
- fta_parse_result->parse_tree_list = NULL;
- fta_parse_result->fta_parse_tree = $4;
- fta_parse_result->tables = $3;
- fta_parse_result->parse_type = STREAM_PARSE;
- }
- ;
-
-
-
-/* Query definition.
- WARNING: there might be some relics.
-*/
-
-gsql: variable_def params_def select_statement {
- $3->add_nmap($1); // Memory leak : plug it.
- $3->add_param_list($2); // Memory leak : plug it.
- $$ = $3;
- }
- | params_def variable_def select_statement {
- $3->add_nmap($2); // Memory leak : plug it.
- $3->add_param_list($1); // Memory leak : plug it.
- $$ = $3;
- }
- | params_def select_statement {
- $2->add_nmap(NULL); // Memory leak : plug it.
- $2->add_param_list($1); // Memory leak : plug it.
- $$ = $2;
- }
- | variable_def select_statement {
- $2->add_nmap($1); // Memory leak : plug it.
- $$ = $2;
- }
- | select_statement {
- $$ = $1;
- }
- | variable_def params_def merge_statement{
- $3->add_nmap($1); // Memory leak : plug it.
- $3->add_param_list($2); // Memory leak : plug it.
- $$ = $3;
- }
- | params_def variable_def merge_statement{
- $3->add_nmap($2); // Memory leak : plug it.
- $3->add_param_list($1); // Memory leak : plug it.
- $$ = $3;
- }
- | params_def merge_statement{
- $2->add_param_list($1); // Memory leak : plug it.
- $$ = $2;
- }
- | variable_def merge_statement{
- $2->add_nmap($1); // Memory leak : plug it.
- $$ = $2;
- }
- | merge_statement{
- $$ = $1;
- }
- ;
-
-query_list: gsql {$$ = new query_list_t($1);}
- | query_list SEMICOLON gsql {$$ = $1->append($3);}
- ;
-
-params_def:
- PARAM_SEC LEFTBRACE variable_list RIGHTBRACE {$$=$3;}
- | PARAM_SEC LEFTBRACE RIGHTBRACE {$$=NULL;}
- ;
-
-variable_def:
- DEFINE_SEC LEFTBRACE variable_list RIGHTBRACE {$$=$3;fta_parse_defines=$3;}
- | DEFINE_SEC LEFTBRACE RIGHTBRACE {$$=NULL;fta_parse_defines = NULL;}
- ;
-
-variable_list:
- variable_assign {$$ = new var_defs_t($1);}
- | variable_list variable_assign {$$ = $1->add_var_pair($2);}
- ;
-
-variable_assign:
- NAME STRING_TOKEN SEMICOLON {$$ = new var_pair_t($1,$2);}
- | NAME NAME SEMICOLON {$$ = new var_pair_t($1,$2);}
- ;
-
-select_statement:
- SELECT selection table_exp {$$ = $3->add_selection($2);}
- ;
-
-merge_statement:
- MERGE column_ref_list
- from_clause {$$ = new table_exp_t($2,$3);}
- | MERGE column_ref_list SLACK scalar_exp
- from_clause {$$ = new table_exp_t($2,$4,$5);}
- ;
-
- /* query expressions */
-
-
-selection:
- select_commalist { $$ = $1;}
- ;
-
-table_exp:
- from_clause
- opt_where_clause
- opt_group_by_clause
- opt_supergroup_clause
- opt_having_clause
- opt_cleaning_when_clause
- opt_cleaning_by_clause
- opt_closing_when_clause
- {$$=new table_exp_t($1,$2,$3,$4,$5,$6,$7, $8);}
- ;
-
-from_clause:
- FROM table_ref_commalist {$$ = $2; $$->set_properties(-1);}
- | INNER_JOIN FROM table_ref_commalist {$$ = $3; $$->set_properties(INNER_JOIN_PROPERTY);}
- | OUTER_JOIN FROM table_ref_commalist {$$ = $3; $$->set_properties(OUTER_JOIN_PROPERTY);}
- | RIGHT_OUTER_JOIN FROM table_ref_commalist {$$ = $3; $$->set_properties(RIGHT_OUTER_JOIN_PROPERTY);}
- | LEFT_OUTER_JOIN FROM table_ref_commalist {$$ = $3; $$->set_properties(LEFT_OUTER_JOIN_PROPERTY);}
- | FILTER_JOIN '(' column_ref ',' INTNUM ')' FROM table_ref_commalist {$$ = $8; $$->set_properties(FILTER_JOIN_PROPERTY); $$->set_colref($3); $$->set_temporal_range($5);}
- ;
-
-table_ref_commalist:
- table_ref {$$ = new tablevar_list_t($1);}
- | table_ref_commalist ',' table_ref {$$= $1->append_table($3);}
- ;
-
-table_ref:
- table { $$ = $1;}
- | table NAME { $$= $1->set_range_var($2);}
- ;
-
-table:
- qname {$$ = new tablevar_t($1->c_str());}
- | NAME '.' qname {$$ = new tablevar_t($1,$3->c_str(),0);}
- | NAME '.' NAME '.' qname {$$ = new tablevar_t($1,$3,$5->c_str());}
- | STRING_TOKEN '.' NAME '.' qname {$$ = new tablevar_t($1,$3,$5->c_str());}
- | '[' NAME ']' '.' qname {$$ = new tablevar_t($2,$5->c_str(),1);}
- ;
-
-qname:
- NAME {$$ = new string_t($1);}
- | qname '/' NAME {$$ = $$->append("/",$3);}
- ;
-
-
-opt_where_clause:
- /* empty */ {$$=NULL;}
- | where_clause {$$=$1;}
- ;
-
-where_clause:
- WHERE search_condition {$$ = $2;}
- ;
-
-opt_cleaning_when_clause:
- /* empty */ {$$=NULL;}
- | CLEANING_WHEN search_condition {$$=$2; }
- ;
-
-opt_cleaning_by_clause:
- /* empty */ {$$=NULL;}
- | CLEANING_BY search_condition {$$=$2; }
- ;
-
-opt_closing_when_clause:
- /* empty */ {$$=NULL;}
- | CLOSING_WHEN search_condition {$$=$2; }
- ;
-
-opt_having_clause:
- /* empty */ {$$=NULL;}
- | having_clause {$$=$1;}
- ;
-
-having_clause:
- HAVING search_condition {$$ = $2;}
- ;
-
-
- /* search conditions */
-
-search_condition:
- search_condition OR search_condition {$$=new predicate_t("OR",$1,$3);}
- | search_condition AND search_condition {$$=new predicate_t("AND",$1,$3);}
- | NOT search_condition {$$ = new predicate_t("NOT", $2 );}
- | '(' search_condition ')' {$$ = $2;}
- | predicate {$$ = $1;}
- ;
-
-predicate:
- comparison_predicate { $$=$1;}
- | in_predicate { $$ = $1;}
- | NAME '[' ']' {$$ = predicate_t::make_paramless_fcn_predicate($1); }
- | NAME '[' scalar_exp_commalist ']' {$$ = new predicate_t($1, $3->get_se_list()); }
- ;
-
-comparison_predicate:
- scalar_exp COMPARISON scalar_exp {$$ = new predicate_t($1,$2,$3);}
- ;
-
-in_predicate:
- scalar_exp IN '[' literal_commalist ']' { $$ = new predicate_t($1,$4); }
- ;
-
-literal_commalist:
- literal {$$ = new literal_list_t($1);}
- | literal_commalist ',' literal {$$ = $1->append_literal($3);}
- ;
-
- /* scalar expressions */
-
-scalar_exp:
- scalar_exp '+' scalar_exp { $$=new scalarexp_t("+",$1,$3);}
- | scalar_exp '-' scalar_exp { $$=new scalarexp_t("-",$1,$3);}
- | scalar_exp '|' scalar_exp { $$=new scalarexp_t("|",$1,$3);}
- | scalar_exp '*' scalar_exp { $$=new scalarexp_t("*",$1,$3);}
- | scalar_exp '/' scalar_exp { $$=new scalarexp_t("/",$1,$3);}
- | scalar_exp '&' scalar_exp { $$=new scalarexp_t("&",$1,$3);}
- | scalar_exp '%' scalar_exp { $$=new scalarexp_t("%",$1,$3);}
- | scalar_exp SHIFT_OP scalar_exp { $$=new scalarexp_t($2,$1,$3);}
- | '+' scalar_exp %prec UMINUS { $$ = new scalarexp_t("+",$2);}
- | '-' scalar_exp %prec UMINUS { $$ = new scalarexp_t("-",$2);}
- | '!' scalar_exp %prec UMINUS { $$ = new scalarexp_t("!",$2);}
- | '~' scalar_exp %prec UMINUS { $$ = new scalarexp_t("~",$2);}
- | literal { $$= new scalarexp_t($1);}
- | '$' NAME {$$ = scalarexp_t::make_param_reference($2);}
- | ifparam {$$ = scalarexp_t::make_iface_param_reference($1);}
- | column_ref { $$ = new scalarexp_t($1);}
- | '(' scalar_exp ')' {$$ = $2;}
- | AGGR '(' '*' ')' { $$ = scalarexp_t::make_star_aggr($1); }
- | AGGR '(' scalar_exp ')' { $$ = scalarexp_t::make_se_aggr($1,$3); }
- | NAME '(' scalar_exp_commalist ')' {$$ = new scalarexp_t($1, $3->get_se_list()); }
- | NAME '(' ')' {$$ = scalarexp_t::make_paramless_fcn($1); }
- | AGGR '$' '(' '*' ')' { $$ = scalarexp_t::make_star_aggr($1); $$->set_superaggr(true); }
- | AGGR '$' '(' scalar_exp ')' { $$ = scalarexp_t::make_se_aggr($1,$4); $$->set_superaggr(true); }
- | NAME '$' '(' scalar_exp_commalist ')' {$$ = new scalarexp_t($1, $4->get_se_list()); $$->set_superaggr(true); }
- | NAME '$' '(' ')' {$$ = scalarexp_t::make_paramless_fcn($1); $$->set_superaggr(true); }
- ;
-
-
-select_commalist:
- scalar_exp { $$= new select_list_t($1); }
- | scalar_exp AS NAME { $$= new select_list_t($1,$3); }
- | select_commalist ',' scalar_exp { $$=$1->append($3); }
- | select_commalist ',' scalar_exp AS NAME { $$=$1->append($3,$5); }
- ;
-
-scalar_exp_commalist:
- scalar_exp { $$= new se_list_t($1); }
- | scalar_exp_commalist ',' scalar_exp { $$=$1->append($3); }
- ;
-
-literal:
- STRING_TOKEN {$$ = new literal_t($1,LITERAL_STRING);}
- | INTNUM {$$ = new literal_t($1,LITERAL_INT);}
- | LONGINTNUM {$$ = new literal_t($1,LITERAL_LONGINT);}
- | APPROXNUM {$$ = new literal_t($1,LITERAL_FLOAT);}
- | TRUE_V {$$ = new literal_t("TRUE",LITERAL_BOOL);}
- | FALSE_V {$$ = new literal_t("FALSE",LITERAL_BOOL);}
- | TIMEVAL_L STRING_TOKEN {$$ = new literal_t($2,LITERAL_TIMEVAL);}
- | HEX_L STRING_TOKEN {$$ = new literal_t($2,LITERAL_HEX);}
- | LHEX_L STRING_TOKEN {$$ = new literal_t($2,LITERAL_LONGHEX);}
- | IP_L STRING_TOKEN {$$ = new literal_t($2,LITERAL_IP);}
- | IPV6_L STRING_TOKEN {$$ = new literal_t($2,LITERAL_IPV6);}
- | '#' NAME {$$ = literal_t::make_define_literal($2,fta_parse_defines);}
- ;
-
-
-
-opt_group_by_clause:
- /* empty */ {$$ = NULL;}
- | GROUP BY extended_gb_commalist {$$ = $3;}
- ;
-
-opt_supergroup_clause:
- /* empty */ {$$ = NULL;}
- | SUPERGROUP gb_ref_list {$$ = $2;}
- ;
-
-list_of_gb_commalist:
- '(' gb_commalist ')' { $$ = new list_of_gb_list_t($2);}
- | list_of_gb_commalist ',' '(' gb_commalist ')' {$$ = $1->append($4);}
- ;
-
-extended_gb:
- gb {$$ = extended_gb_t::create_from_gb($1);}
- | ROLLUP '(' gb_commalist ')' {$$ = extended_gb_t::extended_create_from_rollup($3);}
- | CUBE '(' gb_commalist ')' {$$ = extended_gb_t::extended_create_from_cube($3);}
- | GROUPING_SETS '(' list_of_gb_commalist ')' {$$ = extended_gb_t::extended_create_from_gsets($3);}
- ;
-
-extended_gb_commalist:
- extended_gb { $$ = new extended_gb_list_t($1);}
- | extended_gb_commalist ',' extended_gb { $$=$1->append($3);}
- ;
-
-gb_commalist:
- gb { $$ = new gb_list_t($1);}
- | gb_commalist ',' gb { $$=$1->append($3);}
- ;
-
-gb:
- NAME {$$ = new gb_t($1); }
- | NAME '.' NAME {$$ = new gb_t($1,$3); }
- | NAME '.' NAME '.' NAME {$$ = new gb_t($1,$3,$5); }
- | scalar_exp AS NAME {$$ = new gb_t($1,$3); }
- ;
-
- /* miscellaneous */
-
-
-/*
- I do not currently use 3 part column refs
-*/
-
-ifparam:
- '@' NAME {$$ = new ifpref_t($2);}
- | NAME '.' '@' NAME {$$ = new ifpref_t($1, $4);}
- ;
-
-column_ref:
- NAME {$$ = new colref_t($1); }
- | NAME '.' NAME {$$ = new colref_t($1,$3); }
- | NAME '.' NAME '.' NAME {$$ = new colref_t($1,$3,$5); }
- ;
-
-column_ref_list:
- column_ref ':' column_ref {$$=new colref_list_t($1); $$->append($3);}
- | column_ref_list ':' column_ref {$$ = $1->append($3);}
- ;
-
-gb_ref:
- NAME {$$ = new colref_t($1); }
- ;
-
-gb_ref_list:
- gb_ref ',' gb_ref {$$=new colref_list_t($1); $$->append($3);}
- | gb_ref_list ',' gb_ref {$$ = $1->append($3);}
- ;
-
- /* data types */
-
-
- /* the various things you can name */
-
-
-
-
-
-/* Table definition section */
-
-
-table_list: table_def {$$ = new table_list($1);}
- | table_list table_def {$$ = $1->append_table($2);}
- ;
-
-table_def: PROTOCOL NAME opt_singleparam_commalist opt_singleparam_commalist_bkt LEFTBRACE field_list RIGHTBRACE {
- $$=new table_def($2,$3,$4, $6, PROTOCOL_SCHEMA); delete $6;}
- | STREAM qname opt_singleparam_commalist LEFTBRACE field_list RIGHTBRACE {
- $$=new table_def($2->c_str(),$3,NULL,$5, STREAM_SCHEMA); delete $5;}
- | OPERATOR_VIEW NAME LEFTBRACE OPERATOR opt_param_commalist FIELDS LEFTBRACE field_list RIGHTBRACE SUBQUERIES LEFTBRACE subqueryspec_list RIGHTBRACE SELECTION_PUSHDOWN opt_param_commalist RIGHTBRACE {
- $$ = new table_def($2, $5, $8, $12, $15); }
- | UNPACK_FCNS LEFTBRACE unpack_func_list RIGHTBRACE { $$ = new table_def($3); }
- ;
-
-unpack_func_list:
- unpack_func {$$ = new unpack_fcn_list($1);}
- | unpack_func_list SEMICOLON unpack_func {$$ = $1 -> append($3);}
- ;
-
-unpack_func:
- NAME NAME INTNUM {$$ = new unpack_fcn($1,$2,$3);}
- ;
-
-subqueryspec_list:
- subq_spec {$$ = new subqueryspec_list($1);}
- | subqueryspec_list SEMICOLON subq_spec {$$ = $1->append($3);}
- ;
-
-subq_spec:
- NAME '(' namevec_commalist ')' {$$=new subquery_spec($1, $3); delete $3;}
- ;
-
-field_list: field {$$ = new field_entry_list($1);}
- | field_list field {$$ = $1->append_field($2);}
- ;
-
-field:
- NAME NAME NAME opt_param_commalist opt_singleparam_commalist_bkt SEMICOLON {$$ = new field_entry($1,$2,$3,$4,$5);}
- | NAME NAME opt_param_commalist SEMICOLON {$$ = new field_entry($1,$2,"",$3,NULL);}
- ;
-
-opt_param_commalist:
- /* empty */ {$$ = NULL;}
- | '(' param_commalist ')' {$$ = $2;}
- ;
-
-param_commalist:
- NAME {$$ = new param_list($1);}
- | NAME NAME {$$ = new param_list($1,$2);}
- | NAME STRING_TOKEN {$$ = new param_list($1,$2);}
- | NAME INTNUM {$$ = new param_list($1,$2);}
- | param_commalist ',' NAME {$$ = $1->append($3);}
- | param_commalist ',' NAME NAME {$$ = $1->append($3,$4);}
- | param_commalist ',' NAME STRING_TOKEN {$$ = $1->append($3,$4);}
- | param_commalist ',' NAME INTNUM {$$ = $1->append($3,$4);}
- ;
-
-opt_singleparam_commalist_bkt:
- /* empty */ {$$ = NULL;}
- | '[' singleparam_commalist ']' {$$ = $2;}
- ;
-
-opt_singleparam_commalist:
- /* empty */ {$$ = NULL;}
- | '(' singleparam_commalist ')' {$$ = $2;}
- ;
-
-singleparam_commalist:
- NAME {$$ = new param_list($1);}
- | singleparam_commalist ',' NAME {$$ = $1->append($3);}
- ;
-
-namevec_commalist:
- NAME NAME opt_param_commalist {$$ = new name_vec($1,$2,$3);}
- | namevec_commalist ',' NAME NAME opt_param_commalist {$$ = $1->append($3,$4, $5);}
- ;
-
-%%
-
+/* ------------------------------------------------\r
+Copyright 2014 AT&T Intellectual Property\r
+ Licensed under the Apache License, Version 2.0 (the "License");\r
+ you may not use this file except in compliance with the License.\r
+ You may obtain a copy of the License at\r
+\r
+ http://www.apache.org/licenses/LICENSE-2.0\r
+\r
+ Unless required by applicable law or agreed to in writing, software\r
+ distributed under the License is distributed on an "AS IS" BASIS,\r
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ See the License for the specific language governing permissions and\r
+ limitations under the License.\r
+ ------------------------------------------- */\r
+\r
+/*\r
+ MUST COMPILE WITH\r
+ bison --verbose --defines=fta.tab.cc.h -p FtaParser -o fta.tab.cc fta.y\r
+\r
+ (or equivalent).\r
+*/\r
+\r
+%{\r
+\r
+\r
+#include <stdio.h>\r
+\r
+/* Some addn'l includes, necessary but not included by the\r
+ bison generated code.\r
+*/\r
+\r
+#include <stdlib.h>\r
+\r
+/* prototypes for the parser callbacks.\r
+*/\r
+\r
+#include "parse_fta.h"\r
+#include "parse_schema.h"\r
+\r
+\r
+extern fta_parse_t *fta_parse_result;\r
+extern var_defs_t *fta_parse_defines;\r
+\r
+\r
+#define YYDEBUG 1\r
+\r
+%}\r
+\r
+\r
+ /* symbolic tokens */\r
+\r
+%union {\r
+ int intval;\r
+ double floatval;\r
+ char *strval;\r
+ int subtok;\r
+\r
+ string_t *stringval;\r
+\r
+/* for FTA definition. */\r
+ literal_t *litval;\r
+ scalarexp_t *scalarval;\r
+ se_list_t *se_listval;\r
+ select_list_t *select_listval;\r
+ table_exp_t *tblp;\r
+ predicate_t *predp;\r
+ literal_list_t *lit_l;\r
+ tablevar_t *table;\r
+ tablevar_list_t *tbl_list;\r
+ colref_t *colref;\r
+ ifpref_t *ifpref;\r
+ colref_list_t *clist;\r
+ var_defs_t *var_defs;\r
+ var_pair_t *var_pair;\r
+ gb_t *gb_val;\r
+ gb_list_t *gb_list;\r
+ list_of_gb_list_t *list_of_gb_list;\r
+ extended_gb_t *extended_gb;\r
+ extended_gb_list_t *extended_gb_list;\r
+\r
+ query_list_t *q_list;\r
+\r
+/* For table definition */\r
+ field_entry *field_t;\r
+ field_entry_list *field_list_t;\r
+ table_def *table_def_t;\r
+ table_list *table_list_schema;\r
+ param_list *plist_t;\r
+ name_vec *namevec_t;\r
+ subquery_spec *subq_spec_t;\r
+ subqueryspec_list *subqueryspec_list_t;\r
+ unpack_fcn *ufcn;\r
+ unpack_fcn_list *ufcnl;\r
+\r
+}\r
+\r
+%token <strval> NAME\r
+%token <strval> STRING_TOKEN\r
+%token <strval> INTNUM\r
+%token <strval> LONGINTNUM\r
+%token <strval> APPROXNUM\r
+\r
+/* for FTA definition. */\r
+%type <q_list> query_list\r
+%type <tblp> gsql\r
+%type <tblp> select_statement\r
+%type <tblp> merge_statement\r
+%type <predp> opt_where_clause\r
+%type <predp> opt_having_clause\r
+%type <select_listval> selection\r
+%type <tblp> table_exp\r
+%type <tbl_list> from_clause\r
+%type <tbl_list> table_ref_commalist\r
+%type <table> table_ref\r
+%type <stringval> qname\r
+%type <predp> where_clause\r
+%type <predp> having_clause\r
+%type <predp> search_condition\r
+%type <predp> predicate\r
+%type <predp> comparison_predicate\r
+%type <predp> in_predicate\r
+%type <predp> opt_cleaning_when_clause\r
+%type <predp> opt_cleaning_by_clause\r
+%type <predp> opt_closing_when_clause\r
+%type <litval> literal\r
+%type <colref> column_ref\r
+%type <colref> gb_ref\r
+%type <ifpref> ifparam\r
+%type <clist> column_ref_list\r
+%type <clist> gb_ref_list\r
+%type <table> table\r
+%type <scalarval> scalar_exp\r
+%type <se_listval> scalar_exp_commalist\r
+%type <select_listval> select_commalist\r
+%type <lit_l> literal_commalist\r
+%type <extended_gb_list> opt_group_by_clause\r
+%type <clist> opt_supergroup_clause\r
+%type <gb_list> gb_commalist\r
+%type <extended_gb> extended_gb\r
+%type <extended_gb_list> extended_gb_commalist\r
+%type <list_of_gb_list> list_of_gb_commalist\r
+%type <gb_val> gb\r
+/* for PARAM, DEFINE block */\r
+%type <var_defs> variable_def\r
+%type <var_defs> params_def\r
+%type <var_defs> variable_list\r
+%type <var_pair> variable_assign\r
+\r
+/* For table definition */\r
+%type <field_t> field\r
+%type <field_list_t> field_list\r
+%type <table_def_t> table_def\r
+%type <table_list_schema> table_list\r
+%type <plist_t> param_commalist\r
+%type <plist_t> opt_param_commalist\r
+%type <plist_t> singleparam_commalist\r
+%type <plist_t> opt_singleparam_commalist\r
+%type <plist_t> opt_singleparam_commalist_bkt\r
+%type <namevec_t> namevec_commalist\r
+%type <subq_spec_t> subq_spec\r
+%type <subqueryspec_list_t> subqueryspec_list\r
+%type <ufcn> unpack_func \r
+%type <ufcnl> unpack_func_list \r
+\r
+ /* operators */\r
+\r
+%left OR\r
+%left AND\r
+%left NOT\r
+%left <strval> COMPARISON /* = <> < > <= >= */\r
+%left '|'\r
+%left '&'\r
+%left <strval> SHIFT_OP /* << >> */\r
+%left '+' '-'\r
+%left '*' '/' '%'\r
+%nonassoc UMINUS\r
+\r
+ /* literal keyword tokens */\r
+%token SEMICOLON LEFTBRACE RIGHTBRACE\r
+/* For query definition */\r
+%token BY AS\r
+%token <strval> AGGR\r
+%token FROM INNER_JOIN FILTER_JOIN OUTER_JOIN LEFT_OUTER_JOIN RIGHT_OUTER_JOIN\r
+%token GROUP HAVING IN\r
+%token SELECT\r
+%token WHERE SUPERGROUP CLEANING_WHEN CLEANING_BY CLOSING_WHEN\r
+%token SUCH THAT\r
+%token CUBE ROLLUP GROUPING_SETS\r
+\r
+%token TRUE_V FALSE_V\r
+%token TIMEVAL_L HEX_L LHEX_L IP_L IPV6_L\r
+%token MERGE SLACK\r
+\r
+%token DEFINE_SEC PARAM_SEC\r
+\r
+/* For table definition */\r
+%token PROTOCOL TABLE STREAM FTA UNPACK_FCNS\r
+%token OPERATOR OPERATOR_VIEW FIELDS SUBQUERIES SELECTION_PUSHDOWN\r
+\r
+\r
+%%\r
+\r
+/* Union of possible results */\r
+parse_result: query_list {\r
+ fta_parse_result->parse_tree_list = $1;\r
+ fta_parse_result->tables = NULL;\r
+ fta_parse_result->parse_type = QUERY_PARSE;\r
+ }\r
+ | table_list {\r
+ fta_parse_result->parse_tree_list = NULL;\r
+ fta_parse_result->fta_parse_tree = NULL;\r
+ fta_parse_result->tables = $1;\r
+ fta_parse_result->parse_type = TABLE_PARSE;\r
+ }\r
+// table_list should contain a single STREAM_SCHEMA table.\r
+ | FTA LEFTBRACE table_list gsql RIGHTBRACE {\r
+ fta_parse_result->parse_tree_list = NULL;\r
+ fta_parse_result->fta_parse_tree = $4;\r
+ fta_parse_result->tables = $3;\r
+ fta_parse_result->parse_type = STREAM_PARSE;\r
+ }\r
+ ;\r
+\r
+\r
+\r
+/* Query definition.\r
+ WARNING: there might be some relics.\r
+*/\r
+\r
+gsql: variable_def params_def select_statement {\r
+ $3->add_nmap($1); // Memory leak : plug it.\r
+ $3->add_param_list($2); // Memory leak : plug it.\r
+ $$ = $3;\r
+ }\r
+ | params_def variable_def select_statement {\r
+ $3->add_nmap($2); // Memory leak : plug it.\r
+ $3->add_param_list($1); // Memory leak : plug it.\r
+ $$ = $3;\r
+ }\r
+ | params_def select_statement {\r
+ $2->add_nmap(NULL); // Memory leak : plug it.\r
+ $2->add_param_list($1); // Memory leak : plug it.\r
+ $$ = $2;\r
+ }\r
+ | variable_def select_statement {\r
+ $2->add_nmap($1); // Memory leak : plug it.\r
+ $$ = $2;\r
+ }\r
+ | select_statement {\r
+ $$ = $1;\r
+ }\r
+ | variable_def params_def merge_statement{\r
+ $3->add_nmap($1); // Memory leak : plug it.\r
+ $3->add_param_list($2); // Memory leak : plug it.\r
+ $$ = $3;\r
+ }\r
+ | params_def variable_def merge_statement{\r
+ $3->add_nmap($2); // Memory leak : plug it.\r
+ $3->add_param_list($1); // Memory leak : plug it.\r
+ $$ = $3;\r
+ }\r
+ | params_def merge_statement{\r
+ $2->add_param_list($1); // Memory leak : plug it.\r
+ $$ = $2;\r
+ }\r
+ | variable_def merge_statement{\r
+ $2->add_nmap($1); // Memory leak : plug it.\r
+ $$ = $2;\r
+ }\r
+ | merge_statement{\r
+ $$ = $1;\r
+ }\r
+ ;\r
+\r
+query_list: gsql {$$ = new query_list_t($1);}\r
+ | query_list SEMICOLON gsql {$$ = $1->append($3);}\r
+ ;\r
+\r
+params_def:\r
+ PARAM_SEC LEFTBRACE variable_list RIGHTBRACE {$$=$3;}\r
+ | PARAM_SEC LEFTBRACE RIGHTBRACE {$$=NULL;}\r
+ ;\r
+\r
+variable_def:\r
+ DEFINE_SEC LEFTBRACE variable_list RIGHTBRACE {$$=$3;fta_parse_defines=$3;}\r
+ | DEFINE_SEC LEFTBRACE RIGHTBRACE {$$=NULL;fta_parse_defines = NULL;} \r
+ ;\r
+\r
+variable_list:\r
+ variable_assign {$$ = new var_defs_t($1);}\r
+ | variable_list variable_assign {$$ = $1->add_var_pair($2);}\r
+ ;\r
+\r
+variable_assign:\r
+ NAME STRING_TOKEN SEMICOLON {$$ = new var_pair_t($1,$2);}\r
+ | NAME NAME SEMICOLON {$$ = new var_pair_t($1,$2);}\r
+ ;\r
+\r
+select_statement:\r
+ SELECT selection table_exp {$$ = $3->add_selection($2);}\r
+ ;\r
+\r
+merge_statement:\r
+ MERGE column_ref_list\r
+ from_clause {$$ = new table_exp_t($2,$3);}\r
+ | MERGE column_ref_list SLACK scalar_exp\r
+ from_clause {$$ = new table_exp_t($2,$4,$5);}\r
+ ;\r
+\r
+ /* query expressions */\r
+\r
+\r
+selection:\r
+ select_commalist { $$ = $1;}\r
+ ;\r
+\r
+table_exp:\r
+ from_clause\r
+ opt_where_clause\r
+ opt_group_by_clause\r
+ opt_supergroup_clause\r
+ opt_having_clause \r
+ opt_cleaning_when_clause \r
+ opt_cleaning_by_clause \r
+ opt_closing_when_clause \r
+ {$$=new table_exp_t($1,$2,$3,$4,$5,$6,$7, $8);}\r
+ ;\r
+\r
+from_clause:\r
+ FROM table_ref_commalist {$$ = $2; $$->set_properties(-1);}\r
+ | INNER_JOIN FROM table_ref_commalist {$$ = $3; $$->set_properties(INNER_JOIN_PROPERTY);}\r
+ | OUTER_JOIN FROM table_ref_commalist {$$ = $3; $$->set_properties(OUTER_JOIN_PROPERTY);}\r
+ | RIGHT_OUTER_JOIN FROM table_ref_commalist {$$ = $3; $$->set_properties(RIGHT_OUTER_JOIN_PROPERTY);}\r
+ | LEFT_OUTER_JOIN FROM table_ref_commalist {$$ = $3; $$->set_properties(LEFT_OUTER_JOIN_PROPERTY);}\r
+ | FILTER_JOIN '(' column_ref ',' INTNUM ')' FROM table_ref_commalist {$$ = $8; $$->set_properties(FILTER_JOIN_PROPERTY); $$->set_colref($3); $$->set_temporal_range($5);}\r
+ ;\r
+\r
+table_ref_commalist:\r
+ table_ref {$$ = new tablevar_list_t($1);}\r
+ | table_ref_commalist ',' table_ref {$$= $1->append_table($3);}\r
+ ;\r
+\r
+table_ref:\r
+ table { $$ = $1;}\r
+ | table NAME { $$= $1->set_range_var($2);}\r
+ ;\r
+\r
+table:\r
+ qname {$$ = new tablevar_t($1->c_str());}\r
+ | NAME '.' qname {$$ = new tablevar_t($1,$3->c_str(),0);}\r
+ | NAME '.' NAME '.' qname {$$ = new tablevar_t($1,$3,$5->c_str());}\r
+ | STRING_TOKEN '.' NAME '.' qname {$$ = new tablevar_t($1,$3,$5->c_str());}\r
+ | '[' NAME ']' '.' qname {$$ = new tablevar_t($2,$5->c_str(),1);}\r
+ ;\r
+\r
+qname:\r
+ NAME {$$ = new string_t($1);}\r
+ | qname '/' NAME {$$ = $$->append("/",$3);}\r
+ ;\r
+\r
+\r
+opt_where_clause:\r
+ /* empty */ {$$=NULL;}\r
+ | where_clause {$$=$1;}\r
+ ;\r
+\r
+where_clause:\r
+ WHERE search_condition {$$ = $2;}\r
+ ;\r
+\r
+opt_cleaning_when_clause:\r
+ /* empty */ {$$=NULL;}\r
+ | CLEANING_WHEN search_condition {$$=$2; }\r
+ ;\r
+\r
+opt_cleaning_by_clause:\r
+ /* empty */ {$$=NULL;}\r
+ | CLEANING_BY search_condition {$$=$2; }\r
+ ;\r
+\r
+opt_closing_when_clause:\r
+ /* empty */ {$$=NULL;}\r
+ | CLOSING_WHEN search_condition {$$=$2; }\r
+ ;\r
+\r
+opt_having_clause:\r
+ /* empty */ {$$=NULL;}\r
+ | having_clause {$$=$1;}\r
+ ;\r
+\r
+having_clause:\r
+ HAVING search_condition {$$ = $2;}\r
+ ;\r
+\r
+\r
+ /* search conditions */\r
+\r
+search_condition:\r
+ search_condition OR search_condition {$$=new predicate_t("OR",$1,$3);}\r
+ | search_condition AND search_condition {$$=new predicate_t("AND",$1,$3);}\r
+ | NOT search_condition {$$ = new predicate_t("NOT", $2 );}\r
+ | '(' search_condition ')' {$$ = $2;}\r
+ | predicate {$$ = $1;}\r
+ ;\r
+\r
+predicate:\r
+ comparison_predicate { $$=$1;}\r
+ | in_predicate { $$ = $1;}\r
+ | NAME '[' ']' {$$ = predicate_t::make_paramless_fcn_predicate($1); } \r
+ | NAME '[' scalar_exp_commalist ']' {$$ = new predicate_t($1, $3->get_se_list()); }\r
+ ;\r
+\r
+comparison_predicate:\r
+ scalar_exp COMPARISON scalar_exp {$$ = new predicate_t($1,$2,$3);}\r
+ ;\r
+\r
+in_predicate:\r
+ scalar_exp IN '[' literal_commalist ']' { $$ = new predicate_t($1,$4); }\r
+ ;\r
+\r
+literal_commalist:\r
+ literal {$$ = new literal_list_t($1);}\r
+ | literal_commalist ',' literal {$$ = $1->append_literal($3);}\r
+ ;\r
+\r
+ /* scalar expressions */\r
+\r
+scalar_exp:\r
+ scalar_exp '+' scalar_exp { $$=new scalarexp_t("+",$1,$3);}\r
+ | scalar_exp '-' scalar_exp { $$=new scalarexp_t("-",$1,$3);}\r
+ | scalar_exp '|' scalar_exp { $$=new scalarexp_t("|",$1,$3);}\r
+ | scalar_exp '*' scalar_exp { $$=new scalarexp_t("*",$1,$3);}\r
+ | scalar_exp '/' scalar_exp { $$=new scalarexp_t("/",$1,$3);}\r
+ | scalar_exp '&' scalar_exp { $$=new scalarexp_t("&",$1,$3);}\r
+ | scalar_exp '%' scalar_exp { $$=new scalarexp_t("%",$1,$3);}\r
+ | scalar_exp SHIFT_OP scalar_exp { $$=new scalarexp_t($2,$1,$3);}\r
+ | '+' scalar_exp %prec UMINUS { $$ = new scalarexp_t("+",$2);}\r
+ | '-' scalar_exp %prec UMINUS { $$ = new scalarexp_t("-",$2);}\r
+ | '!' scalar_exp %prec UMINUS { $$ = new scalarexp_t("!",$2);}\r
+ | '~' scalar_exp %prec UMINUS { $$ = new scalarexp_t("~",$2);}\r
+ | literal { $$= new scalarexp_t($1);}\r
+ | '$' NAME {$$ = scalarexp_t::make_param_reference($2);}\r
+ | ifparam {$$ = scalarexp_t::make_iface_param_reference($1);}\r
+ | column_ref { $$ = new scalarexp_t($1);}\r
+ | '(' scalar_exp ')' {$$ = $2;}\r
+ | AGGR '(' '*' ')' { $$ = scalarexp_t::make_star_aggr($1); }\r
+ | AGGR '(' scalar_exp ')' { $$ = scalarexp_t::make_se_aggr($1,$3); }\r
+ | NAME '(' scalar_exp_commalist ')' {$$ = new scalarexp_t($1, $3->get_se_list()); }\r
+ | NAME '(' ')' {$$ = scalarexp_t::make_paramless_fcn($1); }\r
+ | AGGR '$' '(' '*' ')' { $$ = scalarexp_t::make_star_aggr($1); $$->set_superaggr(true); }\r
+ | AGGR '$' '(' scalar_exp ')' { $$ = scalarexp_t::make_se_aggr($1,$4); $$->set_superaggr(true); }\r
+ | NAME '$' '(' scalar_exp_commalist ')' {$$ = new scalarexp_t($1, $4->get_se_list()); $$->set_superaggr(true); }\r
+ | NAME '$' '(' ')' {$$ = scalarexp_t::make_paramless_fcn($1); $$->set_superaggr(true); }\r
+ ;\r
+\r
+\r
+select_commalist:\r
+ scalar_exp { $$= new select_list_t($1); }\r
+ | scalar_exp AS NAME { $$= new select_list_t($1,$3); }\r
+ | select_commalist ',' scalar_exp { $$=$1->append($3); }\r
+ | select_commalist ',' scalar_exp AS NAME { $$=$1->append($3,$5); }\r
+ ;\r
+\r
+scalar_exp_commalist:\r
+ scalar_exp { $$= new se_list_t($1); }\r
+ | scalar_exp_commalist ',' scalar_exp { $$=$1->append($3); }\r
+ ;\r
+\r
+literal:\r
+ STRING_TOKEN {$$ = new literal_t($1,LITERAL_STRING);}\r
+ | INTNUM {$$ = new literal_t($1,LITERAL_INT);}\r
+ | LONGINTNUM {$$ = new literal_t($1,LITERAL_LONGINT);}\r
+ | APPROXNUM {$$ = new literal_t($1,LITERAL_FLOAT);}\r
+ | TRUE_V {$$ = new literal_t("TRUE",LITERAL_BOOL);}\r
+ | FALSE_V {$$ = new literal_t("FALSE",LITERAL_BOOL);}\r
+ | TIMEVAL_L STRING_TOKEN {$$ = new literal_t($2,LITERAL_TIMEVAL);}\r
+ | HEX_L STRING_TOKEN {$$ = new literal_t($2,LITERAL_HEX);}\r
+ | LHEX_L STRING_TOKEN {$$ = new literal_t($2,LITERAL_LONGHEX);}\r
+ | IP_L STRING_TOKEN {$$ = new literal_t($2,LITERAL_IP);}\r
+ | IPV6_L STRING_TOKEN {$$ = new literal_t($2,LITERAL_IPV6);}\r
+ | '#' NAME {$$ = literal_t::make_define_literal($2,fta_parse_defines);}\r
+ ;\r
+\r
+\r
+\r
+opt_group_by_clause:\r
+ /* empty */ {$$ = NULL;}\r
+ | GROUP BY extended_gb_commalist {$$ = $3;}\r
+ ;\r
+\r
+opt_supergroup_clause:\r
+ /* empty */ {$$ = NULL;}\r
+ | SUPERGROUP gb_ref_list {$$ = $2;}\r
+ ;\r
+\r
+list_of_gb_commalist:\r
+ '(' gb_commalist ')' { $$ = new list_of_gb_list_t($2);}\r
+ | list_of_gb_commalist ',' '(' gb_commalist ')' {$$ = $1->append($4);}\r
+ ;\r
+\r
+extended_gb:\r
+ gb {$$ = extended_gb_t::create_from_gb($1);}\r
+ | ROLLUP '(' gb_commalist ')' {$$ = extended_gb_t::extended_create_from_rollup($3);}\r
+ | CUBE '(' gb_commalist ')' {$$ = extended_gb_t::extended_create_from_cube($3);}\r
+ | GROUPING_SETS '(' list_of_gb_commalist ')' {$$ = extended_gb_t::extended_create_from_gsets($3);}\r
+ ;\r
+\r
+extended_gb_commalist:\r
+ extended_gb { $$ = new extended_gb_list_t($1);}\r
+ | extended_gb_commalist ',' extended_gb { $$=$1->append($3);}\r
+ ;\r
+\r
+gb_commalist:\r
+ gb { $$ = new gb_list_t($1);}\r
+ | gb_commalist ',' gb { $$=$1->append($3);}\r
+ ;\r
+\r
+gb:\r
+ NAME {$$ = new gb_t($1); }\r
+ | NAME '.' NAME {$$ = new gb_t($1,$3); }\r
+ | NAME '.' NAME '.' NAME {$$ = new gb_t($1,$3,$5); }\r
+ | scalar_exp AS NAME {$$ = new gb_t($1,$3); }\r
+ ;\r
+\r
+ /* miscellaneous */\r
+\r
+\r
+/*\r
+ I do not currently use 3 part column refs\r
+*/\r
+\r
+ifparam:\r
+ '@' NAME {$$ = new ifpref_t($2);}\r
+ | NAME '.' '@' NAME {$$ = new ifpref_t($1, $4);}\r
+ ;\r
+\r
+column_ref:\r
+ NAME {$$ = new colref_t($1); }\r
+ | NAME '.' NAME {$$ = new colref_t($1,$3); }\r
+ | NAME '.' NAME '.' NAME {$$ = new colref_t($1,$3,$5); }\r
+ ;\r
+\r
+column_ref_list:\r
+ column_ref ':' column_ref {$$=new colref_list_t($1); $$->append($3);}\r
+ | column_ref_list ':' column_ref {$$ = $1->append($3);}\r
+ ;\r
+\r
+gb_ref:\r
+ NAME {$$ = new colref_t($1); }\r
+ ;\r
+\r
+gb_ref_list:\r
+ gb_ref ',' gb_ref {$$=new colref_list_t($1); $$->append($3);}\r
+ | gb_ref_list ',' gb_ref {$$ = $1->append($3);}\r
+ ;\r
+\r
+ /* data types */\r
+\r
+\r
+ /* the various things you can name */\r
+\r
+\r
+\r
+\r
+\r
+/* Table definition section */\r
+\r
+\r
+table_list: table_def {$$ = new table_list($1);}\r
+ | table_list table_def {$$ = $1->append_table($2);}\r
+ ;\r
+\r
+table_def: PROTOCOL NAME opt_singleparam_commalist opt_singleparam_commalist_bkt LEFTBRACE field_list RIGHTBRACE {\r
+ $$=new table_def($2,$3,$4, $6, PROTOCOL_SCHEMA); delete $6;}\r
+ | STREAM qname opt_singleparam_commalist LEFTBRACE field_list RIGHTBRACE {\r
+ $$=new table_def($2->c_str(),$3,NULL,$5, STREAM_SCHEMA); delete $5;}\r
+ | OPERATOR_VIEW NAME LEFTBRACE OPERATOR opt_param_commalist FIELDS LEFTBRACE field_list RIGHTBRACE SUBQUERIES LEFTBRACE subqueryspec_list RIGHTBRACE SELECTION_PUSHDOWN opt_param_commalist RIGHTBRACE {\r
+ $$ = new table_def($2, $5, $8, $12, $15); }\r
+ | UNPACK_FCNS LEFTBRACE unpack_func_list RIGHTBRACE { $$ = new table_def($3); }\r
+ ;\r
+\r
+unpack_func_list:\r
+ unpack_func {$$ = new unpack_fcn_list($1);}\r
+ | unpack_func_list SEMICOLON unpack_func {$$ = $1 -> append($3);}\r
+ ;\r
+\r
+unpack_func:\r
+ NAME NAME INTNUM {$$ = new unpack_fcn($1,$2,$3);}\r
+ ;\r
+\r
+subqueryspec_list:\r
+ subq_spec {$$ = new subqueryspec_list($1);}\r
+ | subqueryspec_list SEMICOLON subq_spec {$$ = $1->append($3);}\r
+ ;\r
+\r
+subq_spec:\r
+ NAME '(' namevec_commalist ')' {$$=new subquery_spec($1, $3); delete $3;}\r
+ ;\r
+\r
+field_list: field {$$ = new field_entry_list($1);}\r
+ | field_list field {$$ = $1->append_field($2);}\r
+ ;\r
+\r
+field:\r
+ NAME NAME NAME opt_param_commalist opt_singleparam_commalist_bkt SEMICOLON {$$ = new field_entry($1,$2,$3,$4,$5);}\r
+ | NAME NAME opt_param_commalist SEMICOLON {$$ = new field_entry($1,$2,"",$3,NULL);}\r
+ ;\r
+\r
+opt_param_commalist:\r
+ /* empty */ {$$ = NULL;}\r
+ | '(' param_commalist ')' {$$ = $2;}\r
+ ;\r
+\r
+param_commalist:\r
+ NAME {$$ = new param_list($1);}\r
+ | NAME NAME {$$ = new param_list($1,$2);}\r
+ | NAME STRING_TOKEN {$$ = new param_list($1,$2);}\r
+ | NAME INTNUM {$$ = new param_list($1,$2);}\r
+ | param_commalist ',' NAME {$$ = $1->append($3);}\r
+ | param_commalist ',' NAME NAME {$$ = $1->append($3,$4);}\r
+ | param_commalist ',' NAME STRING_TOKEN {$$ = $1->append($3,$4);}\r
+ | param_commalist ',' NAME INTNUM {$$ = $1->append($3,$4);}\r
+ ;\r
+\r
+opt_singleparam_commalist_bkt:\r
+ /* empty */ {$$ = NULL;}\r
+ | '[' singleparam_commalist ']' {$$ = $2;}\r
+ ;\r
+\r
+opt_singleparam_commalist:\r
+ /* empty */ {$$ = NULL;}\r
+ | '(' singleparam_commalist ')' {$$ = $2;}\r
+ ;\r
+\r
+singleparam_commalist:\r
+ NAME {$$ = new param_list($1);}\r
+ | singleparam_commalist ',' NAME {$$ = $1->append($3);}\r
+ ;\r
+\r
+namevec_commalist:\r
+ NAME NAME opt_param_commalist {$$ = new name_vec($1,$2,$3);}\r
+ | namevec_commalist ',' NAME NAME opt_param_commalist {$$ = $1->append($3,$4, $5);}\r
+ ;\r
+\r
+%%\r
+\r