Added watchlist support
[com/gs-lite.git] / src / ftacmp / fta.y
1 /* ------------------------------------------------
2 Copyright 2020 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
6
7      http://www.apache.org/licenses/LICENSE-2.0
8
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  ------------------------------------------- */
15
16 /*
17         MUST COMPILE WITH
18    bison --verbose --defines=fta.tab.cc.h -p FtaParser  -o fta.tab.cc fta.y
19
20          (or equivalent).
21 */
22
23 %{
24
25
26 #include <stdio.h>
27
28 /*              Some addn'l includes, necessary but not included by the
29                 bison generated code.
30 */
31
32 #include <stdlib.h>
33
34 /*              prototypes for the parser callbacks.
35 */
36
37 #include "parse_fta.h"
38 #include "parse_schema.h"
39
40
41 extern fta_parse_t *fta_parse_result;
42 extern var_defs_t *fta_parse_defines;
43
44
45 #define YYDEBUG 1
46
47 %}
48
49
50         /* symbolic tokens */
51
52 %union {
53         int intval;
54         double floatval;
55         char *strval;
56         int subtok;
57
58         string_t *stringval;
59
60 /*                      for FTA definition.     */
61         literal_t *litval;
62         scalarexp_t *scalarval;
63         se_list_t *se_listval;
64         select_list_t *select_listval;
65         table_exp_t *tblp;
66         predicate_t *predp;
67         literal_list_t *lit_l;
68         tablevar_t *table;
69         tablevar_list_t *tbl_list;
70         colref_t *colref;
71         ifpref_t *ifpref;
72         colref_list_t *clist;
73         var_defs_t *var_defs;
74         var_pair_t *var_pair;
75         gb_t *gb_val;
76         gb_list_t *gb_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;
80
81         query_list_t *q_list;
82
83 /*              For table definition    */
84         field_entry *field_t;
85         field_entry_list *field_list_t;
86         table_def *table_def_t;
87         table_list *table_list_schema;
88         param_list *plist_t;
89         name_vec  *namevec_t;
90         subquery_spec *subq_spec_t;
91         subqueryspec_list *subqueryspec_list_t;
92         unpack_fcn      *ufcn;
93         unpack_fcn_list *ufcnl;
94
95 }
96
97 %token <strval> NAME
98 %token <strval> STRING_TOKEN
99 %token <strval> INTNUM
100 %token <strval> LONGINTNUM
101 %token <strval> APPROXNUM
102
103 /*                      for FTA definition.     */
104 %type <q_list> query_list
105 %type <tblp> gsql
106 %type <tblp> select_statement
107 %type <tblp> merge_statement
108 %type <tblp> watchlist_statement
109 %type <predp> opt_where_clause
110 %type <predp> opt_having_clause
111 %type <select_listval> selection
112 %type <tblp> table_exp
113 %type <tbl_list> from_clause
114 %type <tbl_list> table_ref_commalist
115 %type <table> table_ref
116 %type <stringval> qname
117 %type <predp> where_clause
118 %type <predp> having_clause
119 %type <predp> search_condition
120 %type <predp> predicate
121 %type <predp> comparison_predicate
122 %type <predp> in_predicate
123 %type <predp> opt_cleaning_when_clause
124 %type <predp> opt_cleaning_by_clause
125 %type <predp> opt_closing_when_clause
126 %type <litval> literal
127 %type <colref> column_ref
128 %type <colref> gb_ref
129 %type <ifpref> ifparam
130 %type <clist> column_ref_list
131 %type <clist> gb_ref_list
132 %type <table> table
133 %type <scalarval> scalar_exp
134 %type <se_listval> scalar_exp_commalist
135 %type <select_listval> select_commalist
136 %type <lit_l> literal_commalist
137 %type <extended_gb_list> opt_group_by_clause
138 %type <clist> opt_supergroup_clause
139 %type <gb_list> gb_commalist
140 %type <extended_gb> extended_gb
141 %type <extended_gb_list> extended_gb_commalist
142 %type <list_of_gb_list> list_of_gb_commalist
143 %type <gb_val> gb
144 /*                      for PARAM, DEFINE block */
145 %type <var_defs> variable_def
146 %type <var_defs> params_def
147 %type <var_defs> variable_list
148 %type <var_pair> variable_assign
149
150 /*              For table definition    */
151 %type <field_t> field
152 %type <field_list_t> field_list
153 %type <table_def_t> table_def
154 %type <table_list_schema> table_list
155 %type <plist_t> param_commalist
156 %type <plist_t> opt_param_commalist
157 %type <plist_t> singleparam_commalist
158 %type <plist_t> opt_singleparam_commalist
159 %type <plist_t> opt_singleparam_commalist_bkt
160 %type <namevec_t> namevec_commalist
161 %type <subq_spec_t> subq_spec
162 %type <subqueryspec_list_t> subqueryspec_list
163 %type <ufcn> unpack_func 
164 %type <ufcnl> unpack_func_list 
165
166         /* operators */
167
168 %left OR
169 %left AND
170 %left NOT
171 %left <strval> COMPARISON /* = <> < > <= >= */
172 %left '|'
173 %left '&'
174 %left <strval> SHIFT_OP /* << >> */
175 %left '+' '-'
176 %left '*' '/' '%'
177 %nonassoc UMINUS
178
179         /* literal keyword tokens */
180 %token  SEMICOLON LEFTBRACE RIGHTBRACE
181 /*              For query definition    */
182 %token BY AS
183 %token <strval> AGGR
184 %token FROM INNER_JOIN FILTER_JOIN OUTER_JOIN LEFT_OUTER_JOIN RIGHT_OUTER_JOIN
185 %token WATCHLIST_JOIN
186 %token GROUP HAVING IN
187 %token SELECT WATCHLIST
188 %token WHERE SUPERGROUP CLEANING_WHEN CLEANING_BY CLOSING_WHEN
189 %token SUCH THAT
190 %token CUBE ROLLUP GROUPING_SETS
191
192 %token TRUE_V FALSE_V
193 %token TIMEVAL_L HEX_L LHEX_L IP_L IPV6_L
194 %token  MERGE SLACK
195
196 %token DEFINE_SEC PARAM_SEC
197
198 /*              For table definition    */
199 %token PROTOCOL TABLE STREAM FTA UNPACK_FCNS
200 %token OPERATOR OPERATOR_VIEW FIELDS SUBQUERIES SELECTION_PUSHDOWN
201
202
203 %%
204
205 /*                      Union of possible results       */
206 parse_result:   query_list      {
207                 fta_parse_result->parse_tree_list = $1;
208                 fta_parse_result->tables = NULL;
209                 fta_parse_result->parse_type = QUERY_PARSE;
210         }
211         | table_list    {
212                 fta_parse_result->parse_tree_list = NULL;
213                 fta_parse_result->fta_parse_tree = NULL;
214                 fta_parse_result->tables = $1;
215                 fta_parse_result->parse_type = TABLE_PARSE;
216         }
217 //                              table_list should contain a single STREAM_SCHEMA table.
218         | FTA LEFTBRACE table_list gsql RIGHTBRACE      {
219                 fta_parse_result->parse_tree_list = NULL;
220                 fta_parse_result->fta_parse_tree = $4;
221                 fta_parse_result->tables = $3;
222                 fta_parse_result->parse_type = STREAM_PARSE;
223         }
224         ;
225
226
227
228 /*              Query definition.
229                 WARNING: there might be some relics.
230 */
231
232 gsql:           variable_def params_def select_statement {
233                                 $3->add_nmap($1);                       // Memory leak : plug it.
234                                 $3->add_param_list($2);         // Memory leak : plug it.
235                                 $$ = $3;
236                         }
237                 |       params_def variable_def select_statement {
238                                 $3->add_nmap($2);                       // Memory leak : plug it.
239                                 $3->add_param_list($1);         // Memory leak : plug it.
240                                 $$ = $3;
241                         }
242                 |       params_def select_statement {
243                                 $2->add_nmap(NULL);                     // Memory leak : plug it.
244                                 $2->add_param_list($1);         // Memory leak : plug it.
245                                 $$ = $2;
246                         }
247                 |       variable_def select_statement {
248                                 $2->add_nmap($1);                       // Memory leak : plug it.
249                                 $$ = $2;
250                         }
251                 |       select_statement {
252                                 $$ = $1;
253                         }
254                 |       variable_def params_def merge_statement{
255                                 $3->add_nmap($1);                       // Memory leak : plug it.
256                                 $3->add_param_list($2);         // Memory leak : plug it.
257                                 $$ = $3;
258                         }
259                 |       params_def variable_def merge_statement{
260                                 $3->add_nmap($2);                       // Memory leak : plug it.
261                                 $3->add_param_list($1);         // Memory leak : plug it.
262                                 $$ = $3;
263                         }
264                 |       params_def merge_statement{
265                                 $2->add_param_list($1);         // Memory leak : plug it.
266                                 $$ = $2;
267                         }
268                 |       variable_def merge_statement{
269                                 $2->add_nmap($1);                       // Memory leak : plug it.
270                                 $$ = $2;
271                         }
272                 |       merge_statement{
273                                 $$ = $1;
274                         }
275                 |       variable_def params_def watchlist_statement{
276                                 $3->add_nmap($1);                       // Memory leak : plug it.
277                                 $3->add_param_list($2);         // Memory leak : plug it.
278                                 $$ = $3;
279                         }
280                 |       params_def variable_def watchlist_statement{
281                                 $3->add_nmap($2);                       // Memory leak : plug it.
282                                 $3->add_param_list($1);         // Memory leak : plug it.
283                                 $$ = $3;
284                         }
285                 |       params_def watchlist_statement{
286                                 $2->add_param_list($1);         // Memory leak : plug it.
287                                 $$ = $2;
288                         }
289                 |       variable_def watchlist_statement{
290                                 $2->add_nmap($1);                       // Memory leak : plug it.
291                                 $$ = $2;
292                         }
293                 |       watchlist_statement{
294                                 $$ = $1;
295                         }
296         ;
297
298 query_list:     gsql    {$$ = new query_list_t($1);}
299         |       query_list SEMICOLON gsql       {$$ = $1->append($3);}
300         ;
301
302 params_def:
303          PARAM_SEC LEFTBRACE variable_list RIGHTBRACE   {$$=$3;}
304         | PARAM_SEC LEFTBRACE  RIGHTBRACE       {$$=NULL;}
305         ;
306
307 variable_def:
308          DEFINE_SEC LEFTBRACE variable_list RIGHTBRACE {$$=$3;fta_parse_defines=$3;}
309         | DEFINE_SEC LEFTBRACE RIGHTBRACE       {$$=NULL;fta_parse_defines = NULL;}     
310         ;
311
312 variable_list:
313         variable_assign                 {$$ = new var_defs_t($1);}
314         | variable_list variable_assign {$$ = $1->add_var_pair($2);}
315         ;
316
317 variable_assign:
318         NAME STRING_TOKEN SEMICOLON     {$$ = new var_pair_t($1,$2);}
319         | NAME NAME SEMICOLON   {$$ = new var_pair_t($1,$2);}
320         ;
321
322 select_statement:
323                 SELECT  selection table_exp     {$$ = $3->add_selection($2);}
324         ;
325
326 merge_statement:
327                 MERGE column_ref_list
328                 from_clause             {$$ = new table_exp_t($2,$3);}
329         |       MERGE column_ref_list SLACK  scalar_exp
330                 from_clause             {$$ = new table_exp_t($2,$4,$5);}
331         ;
332
333 watchlist_statement:
334                 WATCHLIST
335                 FIELDS LEFTBRACE field_list RIGHTBRACE {$$ = table_exp_t::make_watchlist_tbl($4); }
336         ; 
337
338         /* query expressions */
339
340
341 selection:
342                 select_commalist        { $$ = $1;}
343         ;
344
345 table_exp:
346                 from_clause
347                 opt_where_clause
348                 opt_group_by_clause
349                 opt_supergroup_clause
350                 opt_having_clause       
351                 opt_cleaning_when_clause        
352                 opt_cleaning_by_clause  
353                 opt_closing_when_clause 
354                         {$$=new table_exp_t($1,$2,$3,$4,$5,$6,$7, $8);}
355         ;
356
357 from_clause:
358                 FROM table_ref_commalist        {$$ = $2; $$->set_properties(-1);}
359         |       INNER_JOIN FROM table_ref_commalist     {$$ = $3; $$->set_properties(INNER_JOIN_PROPERTY);}
360         |       OUTER_JOIN FROM table_ref_commalist     {$$ = $3; $$->set_properties(OUTER_JOIN_PROPERTY);}
361         |       RIGHT_OUTER_JOIN FROM table_ref_commalist       {$$ = $3; $$->set_properties(RIGHT_OUTER_JOIN_PROPERTY);}
362         |       LEFT_OUTER_JOIN FROM table_ref_commalist        {$$ = $3; $$->set_properties(LEFT_OUTER_JOIN_PROPERTY);}
363         |       WATCHLIST_JOIN FROM table_ref_commalist {$$ = $3; $$->set_properties(WATCHLIST_JOIN_PROPERTY);}
364         |       FILTER_JOIN '(' column_ref ',' INTNUM ')' FROM table_ref_commalist      {$$ = $8; $$->set_properties(FILTER_JOIN_PROPERTY); $$->set_colref($3); $$->set_temporal_range($5);}
365         ;
366
367 table_ref_commalist:
368                 table_ref       {$$ = new tablevar_list_t($1);}
369         |       table_ref_commalist ',' table_ref       {$$= $1->append_table($3);}
370         ;
371
372 table_ref:
373                 table { $$ = $1;}
374         |       table NAME { $$= $1->set_range_var($2);}
375         ;
376
377 table:
378                 qname   {$$ = new tablevar_t($1->c_str());}
379         |       NAME '.' qname  {$$ = new tablevar_t($1,$3->c_str(),0);}
380         |       NAME '.' NAME '.' qname {$$ = new tablevar_t($1,$3,$5->c_str());}
381         |       STRING_TOKEN '.' NAME '.' qname {$$ = new tablevar_t($1,$3,$5->c_str());}
382         |       '[' NAME ']' '.' qname  {$$ = new tablevar_t($2,$5->c_str(),1);}
383         ;
384
385 qname:
386                 NAME    {$$ = new string_t($1);}
387         |       qname '/' NAME  {$$ = $$->append("/",$3);}
388         ;
389
390
391 opt_where_clause:
392                 /* empty */     {$$=NULL;}
393         |       where_clause    {$$=$1;}
394         ;
395
396 where_clause:
397                 WHERE search_condition  {$$ = $2;}
398         ;
399
400 opt_cleaning_when_clause:
401                 /* empty */     {$$=NULL;}
402         |       CLEANING_WHEN search_condition {$$=$2; }
403         ;
404
405 opt_cleaning_by_clause:
406                 /* empty */     {$$=NULL;}
407         |       CLEANING_BY search_condition {$$=$2; }
408         ;
409
410 opt_closing_when_clause:
411                 /* empty */     {$$=NULL;}
412         |       CLOSING_WHEN search_condition {$$=$2; }
413         ;
414
415 opt_having_clause:
416                 /* empty */     {$$=NULL;}
417         |       having_clause   {$$=$1;}
418         ;
419
420 having_clause:
421                 HAVING search_condition {$$ = $2;}
422         ;
423
424
425         /* search conditions */
426
427 search_condition:
428                 search_condition OR search_condition  {$$=new predicate_t("OR",$1,$3);}
429         |       search_condition AND search_condition {$$=new predicate_t("AND",$1,$3);}
430         |       NOT search_condition    {$$ = new predicate_t("NOT", $2 );}
431         |       '(' search_condition ')' {$$ = $2;}
432         |       predicate {$$ = $1;}
433         ;
434
435 predicate:
436                 comparison_predicate { $$=$1;}
437         |       in_predicate    { $$ = $1;}
438         |       NAME '[' ']' {$$ = predicate_t::make_paramless_fcn_predicate($1); }     
439         |       NAME '[' scalar_exp_commalist ']' {$$ = new predicate_t($1, $3->get_se_list()); }
440         ;
441
442 comparison_predicate:
443                 scalar_exp COMPARISON scalar_exp        {$$ = new predicate_t($1,$2,$3);}
444         ;
445
446 in_predicate:
447                 scalar_exp IN '[' literal_commalist ']' { $$ = new predicate_t($1,$4); }
448         ;
449
450 literal_commalist:
451                 literal {$$ = new literal_list_t($1);}
452         |       literal_commalist ',' literal   {$$ = $1->append_literal($3);}
453         ;
454
455         /* scalar expressions */
456
457 scalar_exp:
458                 scalar_exp '+' scalar_exp       { $$=new scalarexp_t("+",$1,$3);}
459         |       scalar_exp '-' scalar_exp       { $$=new scalarexp_t("-",$1,$3);}
460         |       scalar_exp '|' scalar_exp       { $$=new scalarexp_t("|",$1,$3);}
461         |       scalar_exp '*' scalar_exp       { $$=new scalarexp_t("*",$1,$3);}
462         |       scalar_exp '/' scalar_exp       { $$=new scalarexp_t("/",$1,$3);}
463         |       scalar_exp '&' scalar_exp       { $$=new scalarexp_t("&",$1,$3);}
464         |       scalar_exp '%' scalar_exp       { $$=new scalarexp_t("%",$1,$3);}
465         |       scalar_exp SHIFT_OP scalar_exp  { $$=new scalarexp_t($2,$1,$3);}
466         |       '+' scalar_exp %prec UMINUS     { $$ = new scalarexp_t("+",$2);}
467         |       '-' scalar_exp %prec UMINUS     { $$ = new scalarexp_t("-",$2);}
468         |       '!' scalar_exp %prec UMINUS     { $$ = new scalarexp_t("!",$2);}
469         |       '~' scalar_exp %prec UMINUS     { $$ = new scalarexp_t("~",$2);}
470         |       literal { $$= new scalarexp_t($1);}
471         |       '$' NAME {$$ = scalarexp_t::make_param_reference($2);}
472         |       ifparam {$$ = scalarexp_t::make_iface_param_reference($1);}
473         |       column_ref { $$ = new scalarexp_t($1);}
474         |       '(' scalar_exp ')'      {$$ = $2;}
475         |       AGGR '(' '*' ')'        { $$ = scalarexp_t::make_star_aggr($1); }
476         |       AGGR '(' scalar_exp ')' { $$ = scalarexp_t::make_se_aggr($1,$3); }
477         |       NAME '(' scalar_exp_commalist ')' {$$ = new scalarexp_t($1, $3->get_se_list()); }
478         |       NAME '(' ')' {$$ = scalarexp_t::make_paramless_fcn($1); }
479         |       AGGR '$' '(' '*' ')'    { $$ = scalarexp_t::make_star_aggr($1); $$->set_superaggr(true); }
480         |       AGGR '$' '(' scalar_exp ')'     { $$ = scalarexp_t::make_se_aggr($1,$4); $$->set_superaggr(true); }
481         |       NAME '$' '(' scalar_exp_commalist ')' {$$ = new scalarexp_t($1, $4->get_se_list()); $$->set_superaggr(true); }
482         |       NAME '$' '(' ')' {$$ = scalarexp_t::make_paramless_fcn($1); $$->set_superaggr(true); }
483         ;
484
485
486 select_commalist:
487                 scalar_exp      {       $$= new select_list_t($1); }
488         |       scalar_exp AS NAME      {       $$= new select_list_t($1,$3); }
489         |       select_commalist ',' scalar_exp { $$=$1->append($3); }
490         |       select_commalist ',' scalar_exp AS NAME { $$=$1->append($3,$5); }
491         ;
492
493 scalar_exp_commalist:
494                 scalar_exp      {       $$= new se_list_t($1); }
495         |       scalar_exp_commalist ',' scalar_exp     { $$=$1->append($3); }
496         ;
497
498 literal:
499                 STRING_TOKEN    {$$ = new literal_t($1,LITERAL_STRING);}
500         |       INTNUM          {$$ = new literal_t($1,LITERAL_INT);}
501         |       LONGINTNUM              {$$ = new literal_t($1,LITERAL_LONGINT);}
502         |       APPROXNUM       {$$ = new literal_t($1,LITERAL_FLOAT);}
503         |       TRUE_V          {$$ = new literal_t("TRUE",LITERAL_BOOL);}
504         |       FALSE_V         {$$ = new literal_t("FALSE",LITERAL_BOOL);}
505         |       TIMEVAL_L STRING_TOKEN  {$$ = new literal_t($2,LITERAL_TIMEVAL);}
506         |       HEX_L  STRING_TOKEN     {$$ = new literal_t($2,LITERAL_HEX);}
507         |       LHEX_L  STRING_TOKEN    {$$ = new literal_t($2,LITERAL_LONGHEX);}
508         |       IP_L  STRING_TOKEN      {$$ = new literal_t($2,LITERAL_IP);}
509         |       IPV6_L  STRING_TOKEN    {$$ = new literal_t($2,LITERAL_IPV6);}
510         |       '#' NAME        {$$ = literal_t::make_define_literal($2,fta_parse_defines);}
511         ;
512
513
514
515 opt_group_by_clause:
516                 /* empty */    {$$ = NULL;}
517         |       GROUP BY extended_gb_commalist  {$$ = $3;}
518         ;
519
520 opt_supergroup_clause:
521                 /* empty */    {$$ = NULL;}
522         |       SUPERGROUP gb_ref_list  {$$ = $2;}
523         ;
524
525 list_of_gb_commalist:
526                 '(' gb_commalist ')' { $$ = new list_of_gb_list_t($2);}
527         |       list_of_gb_commalist ',' '(' gb_commalist ')' {$$ = $1->append($4);}
528         ;
529
530 extended_gb:
531                 gb      {$$ = extended_gb_t::create_from_gb($1);}
532         |       ROLLUP '(' gb_commalist ')' {$$ = extended_gb_t::extended_create_from_rollup($3);}
533         |       CUBE '(' gb_commalist ')' {$$ = extended_gb_t::extended_create_from_cube($3);}
534         |       GROUPING_SETS '(' list_of_gb_commalist ')' {$$ = extended_gb_t::extended_create_from_gsets($3);}
535         ;
536
537 extended_gb_commalist:
538                 extended_gb { $$ = new extended_gb_list_t($1);}
539         |       extended_gb_commalist ',' extended_gb { $$=$1->append($3);}
540     ;
541
542 gb_commalist:
543                 gb { $$ = new gb_list_t($1);}
544         |       gb_commalist ',' gb { $$=$1->append($3);}
545     ;
546
547 gb:
548                 NAME    {$$ = new gb_t($1); }
549         |       NAME '.' NAME   {$$ = new gb_t($1,$3); }
550         |       NAME '.' NAME '.' NAME  {$$ = new gb_t($1,$3,$5); }
551         |       scalar_exp AS NAME {$$ = new gb_t($1,$3); }
552         ;
553
554         /* miscellaneous */
555
556
557 /*
558                 I do not currently use 3 part column refs
559 */
560
561 ifparam:
562                 '@' NAME        {$$ = new ifpref_t($2);}
563         |       NAME '.' '@' NAME       {$$ = new ifpref_t($1, $4);}
564         ;
565
566 column_ref:
567                 NAME    {$$ = new colref_t($1); }
568         |       NAME '.' NAME   {$$ = new colref_t($1,$3); }
569         |       NAME '.' NAME '.' NAME  {$$ = new colref_t($1,$3,$5); }
570         ;
571
572 column_ref_list:
573                 column_ref ':' column_ref       {$$=new colref_list_t($1); $$->append($3);}
574         |       column_ref_list ':' column_ref  {$$ = $1->append($3);}
575         ;
576
577 gb_ref:
578         NAME    {$$ = new colref_t($1); }
579         ;
580
581 gb_ref_list:
582                 gb_ref ',' gb_ref       {$$=new colref_list_t($1); $$->append($3);}
583         |       gb_ref_list ',' gb_ref  {$$ = $1->append($3);}
584         ;
585
586                 /* data types */
587
588
589         /* the various things you can name */
590
591
592
593
594
595 /*                      Table definition section                */
596
597
598 table_list:     table_def       {$$ = new table_list($1);}
599         |       table_list table_def    {$$ = $1->append_table($2);}
600         ;
601
602 table_def:      PROTOCOL NAME   opt_param_commalist opt_singleparam_commalist_bkt LEFTBRACE field_list RIGHTBRACE {
603                                         $$=new table_def($2,$3,$4, $6, PROTOCOL_SCHEMA); delete $3; delete $6;}
604         |               STREAM qname  opt_singleparam_commalist LEFTBRACE field_list RIGHTBRACE {
605                                         $$=new table_def($2->c_str(),$3,NULL,$5, STREAM_SCHEMA); delete $5;}
606         |               OPERATOR_VIEW NAME LEFTBRACE OPERATOR opt_param_commalist FIELDS LEFTBRACE field_list RIGHTBRACE SUBQUERIES LEFTBRACE subqueryspec_list RIGHTBRACE SELECTION_PUSHDOWN opt_param_commalist RIGHTBRACE {
607                                 $$ = new table_def($2, $5, $8, $12, $15); }
608         |               UNPACK_FCNS LEFTBRACE unpack_func_list RIGHTBRACE { $$ = new table_def($3); }
609         ;
610
611 unpack_func_list:
612         unpack_func     {$$ = new unpack_fcn_list($1);}
613         |       unpack_func_list SEMICOLON unpack_func  {$$ = $1 -> append($3);}
614         ;
615
616 unpack_func:
617         NAME NAME INTNUM {$$ = new unpack_fcn($1,$2,$3);}
618         ;
619
620 subqueryspec_list:
621         subq_spec       {$$ = new subqueryspec_list($1);}
622         |       subqueryspec_list SEMICOLON subq_spec {$$ = $1->append($3);}
623         ;
624
625 subq_spec:
626         NAME '(' namevec_commalist ')' {$$=new subquery_spec($1, $3); delete $3;}
627         ;
628
629 field_list:     field   {$$ = new field_entry_list($1);}
630         |       field_list field        {$$ = $1->append_field($2);}
631         ;
632
633 field:
634                 NAME NAME NAME opt_param_commalist opt_singleparam_commalist_bkt SEMICOLON {$$ = new field_entry($1,$2,$3,$4,$5);}
635         |       NAME NAME opt_param_commalist SEMICOLON {$$ = new field_entry($1,$2,"",$3,NULL);}
636         ;
637
638 opt_param_commalist:
639                 /* empty */    {$$ = NULL;}
640         |       '(' param_commalist ')' {$$ = $2;}
641         ;
642
643 param_commalist:
644                 NAME    {$$ = new param_list($1);}
645         |       NAME NAME       {$$ = new param_list($1,$2);}
646         |       NAME STRING_TOKEN       {$$ = new param_list($1,$2);}
647         |       NAME INTNUM     {$$ = new param_list($1,$2);}
648         |       param_commalist ',' NAME {$$ = $1->append($3);}
649         |       param_commalist ',' NAME NAME {$$ = $1->append($3,$4);}
650         |       param_commalist ',' NAME STRING_TOKEN {$$ = $1->append($3,$4);}
651         |       param_commalist ',' NAME INTNUM {$$ = $1->append($3,$4);}
652         ;
653
654 opt_singleparam_commalist_bkt:
655                 /* empty */    {$$ = NULL;}
656         |       '[' singleparam_commalist ']' {$$ = $2;}
657         ;
658
659 opt_singleparam_commalist:
660                 /* empty */    {$$ = NULL;}
661         |       '(' singleparam_commalist ')' {$$ = $2;}
662         ;
663
664 singleparam_commalist:
665                 NAME    {$$ = new param_list($1);}
666         |       singleparam_commalist ',' NAME {$$ = $1->append($3);}
667         ;
668
669 namevec_commalist:
670                 NAME NAME opt_param_commalist   {$$ = new name_vec($1,$2,$3);}
671         |       namevec_commalist ',' NAME NAME opt_param_commalist {$$ = $1->append($3,$4, $5);}
672         ;
673
674 %%
675