Fixed newline characters throughout the code
[com/gs-lite.git] / src / ftacmp / fta.y
index b78e122..cab9546 100644 (file)
-/* ------------------------------------------------\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
+/* ------------------------------------------------
+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);}
+       ;
+
+%%
+