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