Added quantiling UDAFs
[com/gs-lite.git] / src / ftacmp / parse_fta.h
index c1ea6ed..f042f0a 100644 (file)
-/* ------------------------------------------------
-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.
- ------------------------------------------- */
-#ifndef _FTA_PARSE_H_INCLUDED__
-#define _FTA_PARSE_H_INCLUDED__
-
-#include<stdio.h>
-#include<ctype.h>
-
-       int yyparse();
-       void yyerror(char *s);
-       int yylex();
-extern int flex_fta_lineno, flex_fta_ch;
-
-/*             Interface to FTA Parser         */
-void FtaParser_setfileinput(FILE *f);
-void FtaParser_setstringinput(char *s);
-
-
-/*             Get type defines.       */
-#include"type_objects.h"
-#include"literal_types.h"
-#include"type_indicators.h"
-
-#include <string>
-#include <vector>
-#include <map>
-#include <math.h>
-#include <string>
-#include <stdio.h>
-#include <stdlib.h>
-
-
-//             colref_t::is_equivalent needs to understand the schema
-#include"parse_schema.h"
-class colref_t;
-
-
-
-class var_pair_t{
-public:
-  std::string name;
-  std::string val;
-
-  var_pair_t(char *n, char *v){
-       name=n; val=v;
-//printf("NEW var_pair_t(%s, %s)\n",n,v);
-       };
-
-  var_pair_t(const std::string n, const std::string v){
-       name=n; val=v;
-       };
-};
-
-typedef std::map< std::string, std::string > ss_map;
-
-class var_defs_t{
-private:
-       std::vector<var_pair_t *> namevec;
-
-public:
-       var_defs_t(var_pair_t *vp){
-               namevec.push_back(vp);
-       };
-
-       var_defs_t *add_var_pair(var_pair_t *vp){
-               namevec.push_back(vp);
-               return(this);
-       };
-
-       std::vector<var_pair_t *> get_nvec(){return namevec;};
-
-       int size(){return namevec.size();};
-
-       int find_name(std::string n){
-               int i;
-               for(i=0;i<namevec.size();i++){
-                       if(namevec[i]->name == n)
-                               return i;
-               }
-               return -1;
-       }
-       std::string get_name(int i){
-               if(i>=0 && i<namevec.size()){
-                       return(namevec[i]->name);
-               }else{
-                       return("");
-               }
-       }
-
-       std::string get_def(int i){
-               if(i>=0 && i<namevec.size()){
-                       return(namevec[i]->val);
-               }else{
-                       return("");
-               }
-       }
-
-       std::string dump(){
-               int i;
-               std::string ret;
-               for(i=0;i<namevec.size();++i){
-                       ret += "\t"+namevec[i]->name+" = "+namevec[i]->val+"\n";
-               }
-               return ret;
-       }
-
-};
-
-
-
-
-//             literal type constants are defined in literal_types.h
-//             (must share this info with type_objects.h)
-
-//             Represents a literal, as expected
-//             NOTE: this class contains some code generation methods.
-
-class literal_t{
-private:
-
-public:
-       std::string lstring;            /* literal value */
-       short int ltype;                        /* literal type */
-       int lineno, charno;
-
-       int complex_literal_id; // if this literal has a complex constructor,
-                                                       // there is a function which constructs it)
-                                                       //set to the idx in the complex literal
-                                                       // table.  (Must store this here (instead of in SE)
-                                                       // because of bare literals in the IN predicate).
-
-
-       literal_t(std::string v){
-               lstring = v;
-               ltype = LITERAL_STRING;
-               complex_literal_id = -1;
-               lineno = flex_fta_lineno; charno = flex_fta_ch;
-       }
-       static literal_t *make_define_literal(const char *s, var_defs_t *d){
-               int i;
-               i=d->find_name(s);
-               if(i<0){
-                       fprintf(stderr,"ERROR at line %d, char %d; DEFINE'd literal %s referenced but not in DEFINE block.\n",flex_fta_lineno, flex_fta_ch, s);
-                       exit(1);
-               }
-               return new literal_t(d->get_def(i));
-       }
-
-       literal_t(const char *lit, int t){lstring = lit; ltype = t;
-               lineno = flex_fta_lineno; charno = flex_fta_ch;
-               complex_literal_id = -1;
-
-//             For some datatypes we need to modify literal so make a copy of the string
-               char v[100];
-               strcpy(v, lit);
-
-//                     Remove UL, ULL suffix from INT constants.
-               if(ltype == LITERAL_INT || ltype == LITERAL_LONGINT){
-                       int i;
-                       int len=strlen(v);
-                       for(i=0;i<len;++i){
-                               if(v[i] == 'U') v[i] = '\0';
-                       }
-                       lstring = v;
-               }
-
-//                     HEX and LONGHEX must be converted to uint (long long uint)
-               if(ltype == LITERAL_HEX){
-                       char *c,ltmpstr[100];
-                       unsigned long tmp_l;
-                       for(c=v; (*c)!='\0';++c){
-                               if(! ( ((*c) >= '0' && (*c) <= '9') || (tolower(*c) >= 'a' && tolower(*c) <= 'f') ) ){
-                                       fprintf(stderr,"Syntax Error, line=%d, character=%d.  The literal %s is not a HEX constant.\n",
-                                               lineno, charno, v);
-                                       exit(1);
-                               }
-                       }
-                       sscanf(v,"%lx",&tmp_l);
-                       sprintf(ltmpstr,"%lu",tmp_l);
-                       lstring = ltmpstr;
-                       ltype = LITERAL_INT;
-               }
-               if(ltype == LITERAL_LONGHEX){
-                       char *c,ltmpstr[100];
-                       unsigned long long tmp_ll;
-                       for(c=v; (*c)!='\0';++c){
-                               if(! ( ((*c) >= '0' && (*c) <= '9') || (tolower(*c) >= 'a' && tolower(*c) <= 'f') ) ){
-                                       fprintf(stderr,"Syntax Error, line=%d, character=%d.  The literal %s is not a LHEX constant.\n",
-                                               lineno, charno, v);
-                                       exit(1);
-                               }
-                       }
-                       sscanf(v,"%llx",&tmp_ll);
-                       sprintf(ltmpstr,"%llu",tmp_ll);
-                       lstring = ltmpstr;
-                       ltype = LITERAL_LONGINT;
-               }
-//                     Convert IP to uint
-               if(ltype == LITERAL_IP){
-                       char ltmpstr[100];
-                       unsigned int o1,o2,o3,o4,tmp_l;
-                       if(sscanf(v,"%u.%u.%u.%u",&o1,&o2,&o3,&o4) != 4){
-                                       fprintf(stderr,"Syntax Error, line=%d, character=%d.  The literal %s is not an IP constant.\n",
-                                               lineno, charno, v);
-                                       exit(1);
-                       }
-                       if( (o1>255) || (o2>255) || (o3>255) || (o4>255) ){
-                                       fprintf(stderr,"Syntax Error, line=%d, character=%d.  The literal %s is not an IP constant.\n",
-                                               lineno, charno, v);
-                                       exit(1);
-                       }
-                       tmp_l = (o1<<24)+(o2<<16)+(o3<<8)+o4;
-                       sprintf(ltmpstr,"%u",tmp_l);
-                       lstring = ltmpstr;
-                       ltype = LITERAL_IP;
-               }
-       };
-
-//                     used to create literals with a default or initial value.
-       literal_t(int type_indicator){
-               lineno=-1; charno=-1;
-               complex_literal_id = -1;
-
-               switch(type_indicator){
-               case UINT_TYPE:
-               case INT_TYPE:
-               case USHORT_TYPE:
-                       ltype = LITERAL_INT;
-                       lstring = "0";
-                       break;
-               case ULLONG_TYPE:
-               case LLONG_TYPE:
-                       ltype = LITERAL_LONGINT;
-                       lstring = "0";
-                       break;
-               case FLOAT_TYPE:
-                       ltype = LITERAL_FLOAT;
-                       lstring = "0.0";
-                       break;
-               case BOOL_TYPE:
-                       ltype = LITERAL_BOOL;
-                       lstring = "FALSE";
-                       break;
-               case VSTR_TYPE:
-                       ltype = LITERAL_STRING;
-                       lstring = ""; complex_literal_id = 0; // unregistred complex lit
-                       break;
-               case TIMEVAL_TYPE:
-                       ltype = LITERAL_TIMEVAL;
-                       lstring = "0.0";
-                       break;
-               case IPV6_TYPE:
-                       ltype = LITERAL_IPV6;
-                       lstring = "0000:0000:0000:0000:0000:0000:0000:0000";
-                       complex_literal_id = 0; // unregistered complex literal
-                       break;
-               case IP_TYPE:
-                       ltype = LITERAL_IP;
-                       lstring = "0";
-                       break;
-               default:
-                       ltype = LITERAL_UDEF;
-                       lstring=" INTERNAL ERROR, UNKNOWN TYPE INDICATOR IN literal_t::literal_t(int) ";
-               }
-       };
-
-       std::string to_string(){return lstring;};
-
-       int get_type(){return ltype;    };
-       int get_lineno(){return lineno; };
-       int get_charno(){return charno; };
-
-       bool is_equivalent(literal_t *l2){
-               if(ltype != l2->ltype)
-                       return(false);
-               if(lstring != l2->lstring)
-                       return(false);
-
-               return(true);
-       };
-
-//                     Internal function to unescape control characters.
-       static std::string gsqlstr_to_cstr(std::string s){
-               std::string retval;
-               unsigned char c, prev_c='\0';
-               int i;
-
-               for(i=0;i<s.size();++i){
-                       c = s[i];
-                       if(c=='\''){            // || c=='\\'
-                               if(prev_c==c){
-                                       retval += c;
-                                       prev_c = '\0';
-                               }else{
-                                       prev_c=c;
-                               }
-                               continue;
-                       }
-
-                       retval += c;
-                       prev_c = c;
-               }
-
-               return retval;
-       }
-
-
-
-       std::string to_hfta_C_code(std::string param){
-               std::string retval;
-               double tmp_f;
-               int secs, millisecs;
-               char tmpstr[100];
-
-               switch(ltype){
-               case LITERAL_STRING:
-                       retval.append(this->hfta_constructor_name() );
-                       retval.append("("+param+",\"");
-                       retval.append(gsqlstr_to_cstr(lstring));
-                       retval.append("\")");
-                       return(retval);
-               case LITERAL_INT:
-               case LITERAL_IP:
-                       return("((gs_uint32_t)"+lstring+")");
-               case LITERAL_LONGINT:
-                       return("((gs_uint64_t)"+lstring+")");
-               case LITERAL_FLOAT:
-                       return(lstring);
-//             case LITERAL_HEX:
-//                     return("0x"+lstring);
-               case LITERAL_BOOL:
-                       if(lstring == "TRUE"){
-                               return("1");
-                       }else{
-                               return("0");
-                       }
-               case LITERAL_TIMEVAL:
-                       retval.append(this->hfta_constructor_name() );
-                       tmp_f = atof(lstring.c_str());
-                       secs = (int)floor(tmp_f);
-                       millisecs = (int) rint((tmp_f - secs)*1000);
-                       sprintf(tmpstr,"(%d, %d)",secs,millisecs);
-                       retval.append(tmpstr);
-                       return(retval);
-               case LITERAL_IPV6:
-                       retval = this->hfta_constructor_name();
-                       retval += "("+param+",\""+lstring+"\")";
-                       return retval;
-               }
-
-               return("ERROR UNKNOWN LITERAL");
-       };
-
-
-///                    for LFTA code generation
-       std::string to_C_code(std::string param){
-               std::string retval;
-               double tmp_f;
-               int secs, millisecs;
-               char tmpstr[100];
-
-               switch(ltype){
-               case LITERAL_STRING:
-                       retval = this->constructor_name()+"("+param+",\""+gsqlstr_to_cstr(lstring)+"\")";
-                       return(retval);
-               case LITERAL_INT:
-               case LITERAL_IP:
-                       return("((gs_uint32_t)"+lstring+")");
-               case LITERAL_LONGINT:
-                       return("((gs_uint64_t)"+lstring+")");
-               case LITERAL_FLOAT:
-                       return(lstring);
-//             case LITERAL_HEX:
-//                     return("0x"+lstring);
-               case LITERAL_BOOL:
-                       if(lstring == "TRUE"){
-                               return("1");
-                       }else{
-                               return("0");
-                       }
-               case LITERAL_IPV6:
-                       retval = this->constructor_name()+"("+param+",\""+lstring+"\")";
-                       return(retval);
-               case LITERAL_TIMEVAL:
-                       retval.append(this->constructor_name() );
-                       tmp_f = atof(lstring.c_str());
-                       secs = (int)floor(tmp_f);
-                       millisecs = (int) rint((tmp_f - secs)*1000);
-                       sprintf(tmpstr,"(%d, %d)",secs,millisecs);
-                       retval.append(tmpstr);
-                       return(retval);
-               }
-
-               return("ERROR UNKNOWN LITERAL");
-       };
-
-
-       std::string to_query_string(){
-               std::string retval;
-
-               switch(ltype){
-               case LITERAL_IP:
-               {
-                       unsigned int v;
-                       sscanf(lstring.c_str(),"%u",&v);
-                       int d1 = v & 0xff;
-                       int d2 = (v & 0xff00) >> 8;
-                       int d3 = (v & 0xff0000) >> 16;
-                       int d4 = (v & 0xff000000) >> 24;
-                       char ret[200];
-                       sprintf(ret,"IP_VAL'%u.%u.%u.%u'",d4,d3,d2,d1);
-                       return ret;
-               }
-               case LITERAL_STRING:
-                       retval = "'"+lstring+"'";
-                       return(retval);
-               case LITERAL_INT:
-               case LITERAL_FLOAT:
-               case LITERAL_TIMEVAL:
-               case LITERAL_IPV6:
-               case LITERAL_BOOL:
-                       return(lstring);
-               case LITERAL_LONGINT:
-                       return(lstring+"ULL");
-               }
-
-               return("ERROR UNKNOWN LITERAL in literal_t::to_query_string");
-       };
-
-//             TODO : Use definition files instead of hardwiring these.
-
-//             constructor in LFTA code
-       std::string constructor_name(){
-
-               switch(ltype){
-               case LITERAL_TIMEVAL:
-                       return("Timeval_Constructor");
-               case LITERAL_IPV6:
-                       return("Ipv6_Constructor");
-               case LITERAL_STRING:
-                       return("str_constructor");
-               case LITERAL_INT:
-               case LITERAL_IP:
-               case LITERAL_LONGINT:
-               case LITERAL_BOOL:
-               case LITERAL_FLOAT:
-                       return("");
-               }
-               return("ERROR UNKNOWN LITERAL");
-       };
-
-       std::string hfta_constructor_name(){
-
-               switch(ltype){
-               case LITERAL_TIMEVAL:
-                       return("HFTA_Timeval_Constructor");
-               case LITERAL_IPV6:
-                       return("HFTA_Ipv6_Constructor");
-               case LITERAL_STRING:
-                       return("Vstring_Constructor");
-               case LITERAL_INT:
-               case LITERAL_IP:
-               case LITERAL_LONGINT:
-               case LITERAL_BOOL:
-               case LITERAL_FLOAT:
-                       return("");
-               }
-               return("ERROR UNKNOWN LITERAL");
-       };
-
-       std::string hfta_empty_literal_name(){
-
-               switch(ltype){
-               case LITERAL_TIMEVAL:
-                       return("EmptyTimeval");
-               case LITERAL_IPV6:
-                       return("EmptyIp6");
-               case LITERAL_STRING:
-                       return("EmptyString");
-               }
-               return("ERROR_NOT_A_COMPLEX_LITERAL");
-       };
-
-
-       void set_cpx_lit_ref(int g){complex_literal_id = g;     };
-       int get_cpx_lit_ref(){return (complex_literal_id );     };
-       bool is_cpx_lit(){return(complex_literal_id  >= 0);     };
-
-};
-
-
-/*
-               A (null terminated) list of literals.
-               Used for the IN clause
-*/
-
-class literal_list_t{
-private:
-
-public:
-       std::vector<literal_t *> lit_list;
-       int lineno, charno;
-
-       literal_list_t(literal_t *l){
-               lit_list.push_back(l);
-               lineno = flex_fta_lineno; charno = flex_fta_ch;
-       };
-
-       literal_list_t(std::vector<literal_t *> lvec){
-               lineno = charno = 0;
-               lit_list = lvec;
-       };
-
-       literal_list_t *append_literal(literal_t *l){
-               lit_list.push_back(l);
-               return(this);
-       };
-
-       std::string to_string(){
-               int i;
-               std::string retval;
-               for(i=0;i<lit_list.size();i++){
-                       if(i>0) retval.append(", ");
-                       retval.append(lit_list[i]->to_query_string());
-               }
-           return(retval);
-       };
-
-       std::vector<literal_t *> get_literal_vector(){return(lit_list);};
-
-};
-
-
-class string_t{
-public:
-       std::string val;
-       string_t(char *s){
-               val = s;
-       }
-       string_t *append(char *s){
-               val += s;
-               return this;
-       }
-       string_t *append(char *sep, char *s){
-               val += sep;
-               val += s;
-               return this;
-       }
-       const char *c_str(){
-               return val.c_str();
-       }
-};
-
-//             A tablevar is a data source in a GSQL query.
-//             Every column ref must be bound to a tablevar,
-//             either explicitly or via imputation.
-
-
-class tablevar_t{
-public:
-//             A tablevar is a variable which binds to a named data source.
-//             the variable name might be explicit in the query, or it might be
-//             implicit in which case the variable name is imputed.  In either case
-//             the variable name is set via the set_range_var method.
-//
-//             The data source is the name of either a STREAM or a PROTOCOL.
-//             All STREAMS are unique, but a PROTOCOL must be bound to an
-//             interface.  If the interface is not given, it is imputed to be
-//             the default interface.
-
-       std::string machine;
-       std::string interface;
-       std::string schema_name;
-       std::string variable_name;
-       std::string udop_alias;         // record UDOP ID for of UDOP
-                                                               // for use by cluster manager
-
-       int schema_ref;         // index of the table in the schema (table_list)
-       int opview_idx;         // index in list of operator views (if any)
-       bool iface_is_query;    // true if iface resolves to query
-                                                       // instead of specific interface.
-
-       int properties;         // inner (0) or outer (1) join;
-                                               // labeled using FROM clause,
-                                               // determines join algorithm.
-
-       int lineno, charno;
-
-       tablevar_t(){ opview_idx = -1; schema_ref=-1; iface_is_query = false;
-                               lineno=-1; charno=-1;};
-       tablevar_t(const char *t){schema_name=t;  interface="";
-               opview_idx = -1; schema_ref = -1;
-               variable_name=""; properties = 0;
-               iface_is_query = false;
-               lineno = flex_fta_lineno; charno = flex_fta_ch;};
-
-       tablevar_t(const char *i, const char *s, int iq){interface=i; schema_name=s;
-               opview_idx = -1; schema_ref = -1;
-               variable_name=""; properties = 0;
-               if(iq) iface_is_query = true; else iface_is_query = false;
-               lineno = flex_fta_lineno; charno = flex_fta_ch;};
-
-       tablevar_t(const char *m, const char *i, const char *s){
-               machine = m; interface=i; schema_name=s;
-               opview_idx = -1; schema_ref = -1;
-               variable_name=""; properties = 0;
-               iface_is_query = false;
-               lineno = flex_fta_lineno; charno = flex_fta_ch;};
-
-       tablevar_t *duplicate(){
-               tablevar_t *ret = new tablevar_t();
-               ret->lineno = lineno; ret->charno = charno;
-               ret->schema_ref = schema_ref;
-               ret->opview_idx = opview_idx;
-               ret->machine = machine;
-               ret->interface = interface;
-               ret->schema_name = schema_name;
-               ret->variable_name = variable_name;
-               ret->properties = properties;
-               ret->iface_is_query = iface_is_query;
-               return(ret);
-       };
-
-       tablevar_t *set_range_var(const char *r){
-               variable_name = r;
-               return(this);
-       };
-       tablevar_t *set_range_var(std::string r){
-               variable_name = r;
-               return(this);
-       };
-
-       void set_schema(std::string s){schema_name = s;};
-       void set_interface(std::string i){interface=i;};
-       void set_machine(std::string m){machine = m;};
-       void set_udop_alias(std::string u){udop_alias = u;};
-
-       void set_schema_ref(int r){schema_ref = r;};
-       int get_schema_ref(){return schema_ref;};
-
-       void set_opview_idx(int i){opview_idx = i;};
-       int get_opview_idx(){return opview_idx;};
-
-       void set_property(int p){properties = p;};
-       int get_property(){return properties;};
-
-       bool get_ifq(){return iface_is_query;};
-    void set_ifq(bool b){iface_is_query = b;};
-
-       std::string to_string(){
-               std::string retval;
-
-               if(machine != "" && !iface_is_query)
-                       retval += "'"+machine+"'.";
-               if(interface != ""){
-                       if(iface_is_query){
-                        retval += '['+interface+"].";
-                       }else{
-                        retval += interface+".";
-                       }
-               }
-               retval += schema_name;
-               if(variable_name != "") retval+=" "+variable_name;
-
-               return(retval);
-       };
-
-       std::string get_schema_name(){return schema_name;};
-       void set_schema_name(std::string n){schema_name=n;};
-       std::string get_var_name(){return variable_name;};
-       std::string get_interface(){return interface;};
-       std::string get_machine(){return machine;};
-       std::string get_udop_alias(){return udop_alias;};
-
-       int get_lineno(){return(lineno);        };
-       int get_charno(){return(charno);        };
-
-};
-
-#define INNER_JOIN_PROPERTY 0
-#define LEFT_OUTER_JOIN_PROPERTY 1
-#define RIGHT_OUTER_JOIN_PROPERTY 2
-#define OUTER_JOIN_PROPERTY 3
-#define FILTER_JOIN_PROPERTY 4
-
-//             tablevar_list_t is the list of tablevars in a FROM clause
-
-struct tablevar_list_t{
-public:
-       std::vector<tablevar_t *> tlist;
-       int properties;
-       int lineno, charno;
-//             For filter join
-       colref_t *temporal_var;
-       unsigned int temporal_range;
-
-       tablevar_list_t(){properties = -1; temporal_var = NULL;}
-       tablevar_list_t(tablevar_t *t){tlist.push_back(t); properties=-1; temporal_var = NULL;
-               lineno = flex_fta_lineno; charno = flex_fta_ch;};
-       tablevar_list_t(std::vector<tablevar_t *> t){tlist = t; properties=-1; temporal_var = NULL;
-               lineno = 0; charno = 0;};
-
-       tablevar_list_t *duplicate(){
-               tablevar_list_t *ret = new tablevar_list_t();
-               ret->lineno = lineno; ret->charno = charno;
-               ret->properties = properties;
-               ret->temporal_var = temporal_var;
-               ret->temporal_range = temporal_range;
-               int i;
-               for(i=0;i<tlist.size();++i){
-                       ret->append_table(tlist[i]->duplicate());
-               }
-               return(ret);
-       }
-
-
-
-       tablevar_list_t *append_table(tablevar_t *t){
-               tlist.push_back(t);
-               return(this);
-       };
-
-       std::string to_string(){
-               int i;
-               std::string retval;
-
-               for(i=0;i<tlist.size();i++){
-                       if(i>0) retval.append(", ");
-                       retval.append(tlist[i]->to_string());
-               }
-               return(retval);
-       };
-
-       std::vector<tablevar_t *> get_table_list(){return(tlist);       };
-
-       std::vector<std::string> get_table_names(){
-               std::vector<std::string> ret;
-               int t;
-               for(t=0;t<tlist.size();++t){
-                       std::string tbl_name = tlist[t]->get_schema_name();
-                       ret.push_back(tbl_name);
-               }
-               return(ret);
-       }
-
-       std::vector<std::string> get_src_tbls(table_list *Schema){
-               std::vector<std::string> ret;
-               int t, sq;
-               for(t=0;t<tlist.size();++t){
-                       std::string tbl_name = tlist[t]->get_schema_name();
-                       int sid = Schema->find_tbl(tbl_name);
-                       if(sid < 0){ ret.push_back(tbl_name);
-                       }else
-                       if(Schema->get_schema_type(sid) != OPERATOR_VIEW_SCHEMA){
-                               ret.push_back(tbl_name);
-                       }else{
-                               std::vector<subquery_spec *> sqspec = Schema->get_subqueryspecs(sid);
-                               for(sq=0;sq<sqspec.size();++sq){
-                                       ret.push_back(sqspec[sq]->name);
-                               }
-                       }
-               }
-               return(ret);
-       };
-
-       int size(){
-               return tlist.size();
-       };
-
-//             Some accessor functions.
-
-       std::vector<std::string> get_schema_names(){
-               int i;
-               std::vector<std::string > retval;
-               for(i=0;i<tlist.size();i++){
-                       retval.push_back(tlist[i]->get_schema_name());
-               }
-               return(retval);
-       }
-
-       std::vector<int> get_schema_refs(){
-               int i;
-               std::vector<int> retval;
-               for(i=0;i<tlist.size();i++){
-                       retval.push_back(tlist[i]->get_schema_ref());
-               }
-               return(retval);
-       }
-
-
-       int get_schema_ref(int i){
-               if(i<0 || i>=tlist.size()) return(-1);
-               return tlist[i]->get_schema_ref();
-       };
-
-       std::string get_tablevar_name(int i){
-               if(i<0 || i>=tlist.size()) return("");
-               return tlist[i]->get_var_name();
-       };
-
-       void set_properties(int p){properties = p;};
-       int get_properties(){return properties;};
-
-       void set_colref(colref_t *c){temporal_var = c;};
-       void set_temporal_range(unsigned int t){temporal_range = t;};
-       void set_temporal_range(const char *t){temporal_range= atoi(t);};
-       colref_t *get_colref(){return temporal_var;};
-       unsigned int get_temporal_range(){return temporal_range;};
-
-};
-
-//                     A reference to an interface parameter.
-//                     (I need to be able to record the source
-//                      tablevar, else this would be a lot simpler).
-class ifpref_t{
-public:
-       std::string tablevar;
-       std::string pname;
-       int tablevar_ref;
-       int lineno, charno;
-
-       ifpref_t(const char *p){
-               tablevar="";
-               pname = p;
-               tablevar_ref = -1;
-               lineno = flex_fta_lineno; charno = flex_fta_ch;
-       };
-
-       ifpref_t(const char *t, const char *p){
-               tablevar=t;
-               pname = p;
-               tablevar_ref = -1;
-               lineno = flex_fta_lineno; charno = flex_fta_ch;
-       };
-
-       void set_tablevar_ref(int i){tablevar_ref = i;};
-       int get_tablevar_ref(){return tablevar_ref;};
-       std::string get_tablevar(){return tablevar;}
-       void set_tablevar(std::string t){tablevar = t;};
-       std::string get_pname(){return pname;}
-       std::string to_string(){
-               std::string ret;
-               if(tablevar != "")
-                       ret += tablevar + ".";
-               ret += "@"+pname;
-               return ret;
-       };
-       bool is_equivalent(ifpref_t *i){
-               return (tablevar_ref == i->tablevar_ref) && (pname == i->pname);
-       };
-};
-
-
-
-
-//                     A representation of a reference to a field of a
-//                     stream (or table).  This reference must be bound
-//                     to a particular schema (schema_ref) and to a
-//                     particular table variable in the FROM clause (tablevar_ref)
-//                     If the column reference was generated by the parser,
-//                     it will contain some binding text wich might need
-//                     interpretation to do the actual binding.
-class colref_t{
-public:
-       std::string interface;          // specified interface, if any.
-       std::string table_name;         // specified table name or range var, if any.
-       std::string field;                      // field name
-       bool default_table;                     // true iff. no table or range var given.
-       int schema_ref;                         // ID of the source schema.
-       int tablevar_ref;                       // ID of the tablevar (in FROM clause).
-       int lineno, charno;
-
-       colref_t(const char *f){
-               field = f; default_table = true;
-               schema_ref = -1; tablevar_ref = -1;
-               lineno = flex_fta_lineno; charno = flex_fta_ch;
-       };
-
-       colref_t(const char *t, const char *f){
-               table_name = t; field=f; default_table = false;
-               schema_ref = -1; tablevar_ref = -1;
-               lineno = flex_fta_lineno; charno = flex_fta_ch;
-       };
-
-       colref_t(const char *i, const char *t, const char *f){
-               interface=i;
-               table_name = t; field=f; default_table = false;
-               schema_ref = -1; tablevar_ref = -1;
-               lineno = flex_fta_lineno; charno = flex_fta_ch;
-       };
-
-       colref_t *duplicate(){
-               colref_t *retval = new colref_t(interface.c_str(), table_name.c_str(), field.c_str());
-               retval->schema_ref = schema_ref;
-               retval->tablevar_ref = tablevar_ref;
-               retval->lineno = lineno;
-               retval->charno = charno;
-               retval->default_table = default_table;
-               return(retval);
-       }
-
-       std::string to_string(){
-               if(default_table){
-                       return field;
-               }else{
-                       if(interface != "") return(interface+"."+table_name+"."+field);
-                       return(table_name + "." + field);
-               }
-       };
-
-       std::string to_query_string(){
-               if(default_table){
-                       return field;
-               }else{
-                       if(interface != "") return(interface+"."+table_name+"."+field);
-                       if(table_name != "") return(table_name + "." + field);
-                       return(field);
-               }
-       };
-
-       int get_lineno(){return lineno; };
-       int get_charno(){return charno; };
-
-       bool uses_default_table(){return default_table; };
-
-       std::string get_field(){return(field);  };
-       void set_field(std::string f){field=f;};
-       std::string get_table_name(){return(table_name);};
-       std::string get_interface(){return(interface);};
-       void set_table_name(std::string t){table_name = t; default_table=false;};
-       void set_interface(std::string i){interface=i;};
-
-       int get_schema_ref(){return schema_ref;}
-       void set_schema_ref(int s){schema_ref = s;};
-       int get_tablevar_ref(){return tablevar_ref;}
-       void set_tablevar_ref(int s){tablevar_ref = s;};
-
-//                     Should equivalence be based on tablevar_ref or schema_ref?
-       bool is_equivalent(colref_t *c2){
-               if(schema_ref == c2->schema_ref){
-                       return(field == c2->field);
-               }
-               return(false);
-       };
-
-       bool is_equivalent_base(colref_t *c2, table_list *Schema){
-               if(Schema->get_basetbl_name(schema_ref,field) ==
-                  Schema->get_basetbl_name(c2->schema_ref,c2->field)){
-                       return(field == c2->field);
-               }
-               return(false);
-       };
-};
-
-class colref_list_t{
-public:
-       std::vector<colref_t *> clist;
-
-//     colref_list_t(){};
-
-       colref_list_t(colref_t *c){
-               clist.push_back(c);
-       }
-
-       colref_list_t *append(colref_t *c){
-               clist.push_back(c);
-               return this;
-       }
-
-       std::vector<colref_t *> get_clist(){
-               return clist;
-       }
-};
-
-
-
-
-
-
-/*
-               A tree containing a scalar expression.
-                       Used for
-                               atom : a parameter or a literal
-                               scalar_exp (see the scalar_exp: rule in emf.l for details)
-                               function_ref (a function that has a value, e.g. an aggregate
-                                                               function).
-               operator_type defines the contents of the node.  If its a non-terminal,
-               then op has a meaning and defines the operation.  See the list of
-               #define'd constants following the structure definition.
-
-
-*/
-
-#define SE_LITERAL 1
-#define SE_PARAM 2
-#define SE_COLREF 3
-#define SE_UNARY_OP 4
-#define SE_BINARY_OP 5
-#define SE_AGGR_STAR 6
-#define SE_AGGR_SE 7
-#define SE_FUNC 8
-#define SE_IFACE_PARAM 9
-
-
-class scalarexp_t{
-public:
-       int operator_type;
-       std::string op;
-       union{
-               scalarexp_t *scalarp;
-               literal_t *litp;
-               colref_t *colref;
-               ifpref_t *ifp;
-       } lhs;
-       union{
-               scalarexp_t *scalarp;
-       } rhs;
-       std::vector<scalarexp_t *> param_list;
-
-//             SE node decorations -- results of query analysis.
-       data_type *dt;
-       int gb_ref;                             // set to the gb attr tbl ref, else -1
-       int aggr_id;                    // set to the aggr tbl ref, else -1
-       int fcn_id;                             // external function table ref, else -1
-       int partial_ref;                // partial fcn table ref, else -1
-       int fcn_cache_ref;              // function cache ref, else -1
-       int handle_ref;                 // Entry in pass-by-handle parameter table, else -1.
-                                                       // (might be a literal or a query param).
-       bool is_superagg;               // true if is aggregate and associated with supergroup.
-       std::string storage_state;      // storage state of stateful fcn,
-                                                               // empty o'wise.
-
-       int lineno, charno;
-
-       void default_init(){
-               operator_type = 0;
-               gb_ref = -1; aggr_id = -1;      fcn_id = -1;
-               partial_ref = -1; fcn_cache_ref=-1;
-               handle_ref = -1;
-               dt = NULL; lineno = flex_fta_lineno; charno = flex_fta_ch;
-               is_superagg = false;
-               };
-
-       scalarexp_t(){
-               default_init();};
-
-       scalarexp_t(colref_t *c){
-               default_init();
-               operator_type = SE_COLREF;
-               lhs.colref = c;
-       };
-
-       scalarexp_t(literal_t *l){
-               default_init();
-               operator_type = SE_LITERAL;
-               lhs.litp = l;
-       };
-
-       void convert_to_literal(literal_t *l){
-//             default_init();
-               if(operator_type != SE_IFACE_PARAM){
-                       fprintf(stderr,"INTERNAL ERROR in literal_t::convert_to_literal, operator type isn't SE_IFACE_PARAM.\n");
-                       exit(1);
-               }
-               operator_type = SE_LITERAL;
-               lhs.litp = l;
-       }
-
-       scalarexp_t(const char *o, scalarexp_t *operand){
-               default_init();
-               operator_type = SE_UNARY_OP;
-               op = o;
-               lhs.scalarp = operand;
-       };
-
-       scalarexp_t(const char *o, scalarexp_t *l_op, scalarexp_t *r_op){
-               default_init();
-               operator_type = SE_BINARY_OP;
-               op = o;
-               lhs.scalarp = l_op;
-               rhs.scalarp = r_op;
-       };
-
-       scalarexp_t(const char *o, std::vector<scalarexp_t *> op_list){
-               default_init();
-               operator_type = SE_FUNC;
-               op = o;
-               param_list = op_list;
-       };
-
-       static scalarexp_t *make_paramless_fcn(const char *o){
-               scalarexp_t *ret = new scalarexp_t();
-               ret->operator_type = SE_FUNC;
-               ret->op = o;
-               return(ret);
-       };
-
-       static scalarexp_t *make_star_aggr(const char *ag){
-               scalarexp_t *ret = new scalarexp_t();
-               ret->operator_type = SE_AGGR_STAR;
-               ret->op = ag;
-               return(ret);
-       };
-
-       static scalarexp_t *make_se_aggr(const char *ag, scalarexp_t *l_op){
-               scalarexp_t *ret = new scalarexp_t();
-               ret->operator_type = SE_AGGR_SE;
-               ret->op = ag;
-               ret->lhs.scalarp = l_op;
-               return(ret);
-       };
-
-       static scalarexp_t *make_param_reference(const char *param){
-               scalarexp_t *ret = new scalarexp_t();
-               ret->operator_type = SE_PARAM;
-               ret->op = param;
-               return(ret);
-       };
-
-       static scalarexp_t *make_iface_param_reference(ifpref_t *i){
-               scalarexp_t *ret = new scalarexp_t();
-               ret->operator_type = SE_IFACE_PARAM;
-               ret->lhs.ifp = i;
-               return(ret);
-       };
-
-
-       std::string to_string(){
-               if(operator_type == SE_COLREF){
-                       return lhs.colref->to_string();
-               }
-               if(operator_type == SE_LITERAL){
-                       return lhs.litp->to_string();
-               }
-               if(operator_type == SE_UNARY_OP){
-                       return op + " (" + lhs.scalarp->to_string() + ")";
-               }
-               if(operator_type == SE_BINARY_OP){
-                       return "(" + lhs.scalarp->to_string() + " " + op + " " + rhs.scalarp->to_string() + ")";
-               }
-               return("");
-       };
-
-       scalarexp_t *get_left_se(){return lhs.scalarp;  };
-       scalarexp_t *get_right_se(){return rhs.scalarp; };
-       int get_operator_type(){return operator_type;   };
-       std::string & get_op(){return op;       };
-       std::string & get_param_name(){return op;       };
-//     std::string & get_iface_param_name(){return op; };
-       colref_t *get_colref(){return lhs.colref;       };
-       ifpref_t *get_ifpref(){return lhs.ifp;  };
-       literal_t *get_literal(){return lhs.litp;       };
-
-       int get_lineno(){return lineno; };
-       int get_charno(){return charno; };
-
-       void set_data_type(data_type *d){dt=d;  };
-       data_type *get_data_type(){return dt;   };
-       void reset_temporal(){if(dt!=NULL) dt->reset_temporal();}
-
-       void set_gb_ref(int g){gb_ref = g;      };
-       int get_gb_ref(){return (gb_ref);       };
-       bool is_gb(){return(gb_ref >= 0);       };
-
-       void set_aggr_id(int a){aggr_id = a;};
-       int get_aggr_ref(){return(aggr_id);     };
-
-       void set_storage_state(std::string s){storage_state = s;};
-       std::string get_storage_state(){return storage_state;};
-
-       std::vector<scalarexp_t *> get_operands(){return param_list;};
-       void set_fcn_id(int f){fcn_id = f;      };
-       int get_fcn_id(){return fcn_id; };
-
-       void set_partial_ref(int p){partial_ref = p;    };
-       int get_partial_ref(){return partial_ref;       };
-       bool is_partial(){return partial_ref >= 0;      };
-
-       void set_fcncache_ref(int p){fcn_cache_ref = p; };
-       int get_fcncache_ref(){return fcn_cache_ref;    };
-       bool is_fcncached(){return fcn_cache_ref >= 0;  };
-
-       void set_handle_ref(int tf){handle_ref = tf;    };
-       int get_handle_ref(){return handle_ref; };
-       bool is_handle_ref(){return handle_ref>=0;      };
-
-       void set_superaggr(bool b){is_superagg=b;};
-       bool is_superaggr(){return is_superagg;};
-
-       void use_decorations_of(scalarexp_t *se){
-               if(se->get_data_type() != NULL)
-                       dt = se->get_data_type()->duplicate();
-               gb_ref = se->gb_ref;
-               aggr_id = se->aggr_id;
-               fcn_id = se->fcn_id;
-               partial_ref = se->partial_ref;
-               handle_ref = se->handle_ref;
-               lineno = se->lineno;
-               charno = se->charno;
-               is_superagg = se->is_superagg;
-       };
-};
-
-
-/*
-               A (null terminated) list of scalar expressions.
-               Used for
-                       selection, scalar_exp_commalist
-*/
-
-class se_list_t{
-public:
-       std::vector<scalarexp_t *> se_list;
-       int lineno, charno;
-
-       se_list_t(scalarexp_t *s){se_list.push_back(s);
-               lineno = flex_fta_lineno; charno = flex_fta_ch;};
-
-       se_list_t *append(scalarexp_t *s){
-                       se_list.push_back(s);
-                       return(this);
-       };
-
-       std::string to_string(){
-               int i;
-               std::string retval;
-               for(i=0;i<se_list.size();i++){
-                       if(i>0) retval.append(", ");
-                       retval.append(se_list[i]->to_string());
-               }
-               return(retval);
-       };
-
-       std::vector<scalarexp_t *> get_se_list(){return se_list;        };
-
-
-};
-
-/*
-               select_commalist : collect some additional info about
-               the selected things -- mostly the name.
-*/
-
-struct select_element{
-       scalarexp_t *se;
-       std::string name;
-
-       select_element(){se=NULL; name="";};
-       select_element(scalarexp_t *s){se=s; name="";};
-       select_element(scalarexp_t *s, std::string n){se=s; name=n;};
-};
-
-class select_list_t{
-public:
-       std::vector<select_element *> select_list;
-       int lineno, charno;
-
-       select_list_t(){lineno = -1; charno = -1;};
-       select_list_t(scalarexp_t *s){select_list.push_back(new select_element(s));
-               lineno = flex_fta_lineno; charno = flex_fta_ch;};
-       select_list_t(scalarexp_t *s, std::string n){
-               select_list.push_back(new select_element(s,n));
-               lineno = flex_fta_lineno; charno = flex_fta_ch;
-       };
-       select_list_t *append(scalarexp_t *s){
-                       select_list.push_back(new select_element(s));
-                       return(this);
-       };
-       select_list_t *append(scalarexp_t *s, std::string n){
-                       select_list.push_back(new select_element(s,n));
-                       return(this);
-       };
-
-       std::string to_string(){
-               int i;
-               std::string retval;
-               for(i=0;i<select_list.size();i++){
-                       if(i>0) retval.append(", ");
-                       retval.append(select_list[i]->se->to_string());
-                       if(select_list[i]->name != "")
-                               retval += " AS " + select_list[i]->name;
-
-               }
-               return(retval);
-       };
-
-       std::vector<select_element *> get_select_list(){return select_list;     };
-       std::vector<scalarexp_t *> get_select_se_list(){
-               std::vector<scalarexp_t *> ret;
-               int i;
-               for(i=0; i<select_list.size();++i) ret.push_back(select_list[i]->se);
-               return ret;
-       };
-};
-
-
-
-#define GB_COLREF 1
-#define GB_COMPUTED 2
-
-class gb_t{
-public:
-       std::string name;
-       std::string table;
-       std::string interface;
-       scalarexp_t *def;
-       int type;
-       int lineno, charno;
-
-       gb_t(const char *field_name){
-               interface="";
-               name = field_name; table=""; def=NULL; type=GB_COLREF;
-               lineno = flex_fta_lineno; charno = flex_fta_ch;
-       };
-
-       gb_t(const char *table_name, const char *field_name){
-               interface="";
-               name = field_name; table=""; def=NULL; type=GB_COLREF;
-               lineno = flex_fta_lineno; charno = flex_fta_ch;
-       };
-
-       gb_t(const char *iface, const char *table_name, const char *field_name){
-               interface=iface;
-               name = field_name; table=""; def=NULL; type=GB_COLREF;
-               lineno = flex_fta_lineno; charno = flex_fta_ch;
-       };
-
-       gb_t( scalarexp_t *s, const char *gname){
-               name = gname; table = ""; def = s; type = GB_COMPUTED;
-               lineno = flex_fta_lineno; charno = flex_fta_ch;
-       };
-
-       std::string to_string(){
-               std::string retval;
-               if(type == GB_COLREF){
-                       if(table != ""){
-                               retval = table;
-                               retval.append(".");
-                       }
-                       retval.append(name);
-               }
-               if(type == GB_COMPUTED){
-                       retval = "(scalarexp) AS ";
-                       retval.append(name);
-               }
-               return(retval);
-       };
-
-       gb_t *duplicate();
-
-};
-
-/*
-               A (null terminated) list of group by attributes
-*/
-
-class gb_list_t{
-public:
-       std::vector<gb_t *> gb_list;
-       int lineno, charno;
-
-       gb_list_t(gb_t *g){gb_list.push_back(g);
-               lineno = flex_fta_lineno; charno = flex_fta_ch;};
-
-       gb_list_t *append(gb_t *s){
-                       gb_list.push_back(s);
-                       return(this);
-       };
-       gb_list_t(int l, int c) : lineno(l), charno(c){ }
-
-       std::string to_string(){
-               int i;
-               std::string retval;
-               for(i=0;i<gb_list.size();i++){
-                       if(i>0) retval.append(", ");
-                       retval.append(gb_list[i]->to_string());
-               }
-               return(retval);
-       };
-
-       std::vector<gb_t *> get_gb_list(){return gb_list;       };
-
-       gb_list_t *duplicate(){
-               gb_list_t *ret = new gb_list_t(lineno, charno);
-               int i;
-               for(i=0;i<gb_list.size();++i){
-                       ret->append(gb_list[i]->duplicate());
-               }
-
-               return ret;
-       }
-
-
-};
-
-class list_of_gb_list_t{
-public:
-       std::vector<gb_list_t *> gb_lists;
-
-       list_of_gb_list_t(gb_list_t *gl){
-               gb_lists.push_back(gl);
-       }
-
-       list_of_gb_list_t *append(gb_list_t *gl){
-               gb_lists.push_back(gl);
-               return this;
-       }
-};
-
-
-enum extended_gb_type {no_egb_type, gb_egb_type, rollup_egb_type,
-                       cube_egb_type, gsets_egb_type};
-class extended_gb_t{
-public:
-
-       extended_gb_type type;
-       gb_t *gb;
-       std::vector<gb_list_t *> gb_lists;
-
-       extended_gb_t(){
-               gb = NULL;
-               type = no_egb_type;
-       }
-
-       ~extended_gb_t(){
-       }
-
-       static extended_gb_t *create_from_gb(gb_t *g){
-               extended_gb_t *ret  = new extended_gb_t();
-               ret->type = gb_egb_type;
-               ret->gb = g;
-               return ret;
-       }
-
-       static extended_gb_t *extended_create_from_rollup(gb_list_t *gl){
-               extended_gb_t *ret  = new extended_gb_t();
-               ret->type = rollup_egb_type;
-               ret->gb_lists.push_back(gl);
-               return ret;
-       }
-
-       static extended_gb_t *extended_create_from_cube(gb_list_t *gl){
-               extended_gb_t *ret  = new extended_gb_t();
-               ret->type = cube_egb_type;
-               ret->gb_lists.push_back(gl);
-               return ret;
-       }
-
-       static extended_gb_t *extended_create_from_gsets(list_of_gb_list_t *lgl){
-               extended_gb_t *ret  = new extended_gb_t();
-               ret->type = gsets_egb_type;
-               ret->gb_lists = lgl->gb_lists;
-               return ret;
-       }
-
-       extended_gb_t *duplicate(){
-               extended_gb_t *ret = new extended_gb_t();
-               ret->type = type;
-               if(gb != NULL)
-                       ret->gb = gb->duplicate();
-               int i;
-               for(i=0;i<gb_lists.size();++i){
-                       ret->gb_lists.push_back(gb_lists[i]->duplicate());
-               }
-               return ret;
-       }
-
-
-       std::string to_string(){
-               std::string ret;
-               int i;
-
-               switch(type){
-               case no_egb_type:
-                       return "Error, undefined extended gb type.";
-               case gb_egb_type:
-                       return gb->to_string();
-               case rollup_egb_type:
-                       return "ROLLUP("+gb_lists[0]->to_string()+")";
-               case cube_egb_type:
-                       return "CUBE("+gb_lists[0]->to_string()+")";
-               case gsets_egb_type:
-                       ret = "GROUPING_SETS(";
-                       for(i=0;i<gb_lists.size();++i){
-                               if(i>0) ret+=", ";
-                               ret += "(" +gb_lists[i]->to_string()+")";
-                       }
-                       ret += ")";
-                       return ret;
-               default:
-                       break;
-               }
-               return "Error, unknown extended gb type.";
-       }
-
-};
-
-class extended_gb_list_t{
-public:
-       std::vector<extended_gb_t *> gb_list;
-       int lineno, charno;
-
-       extended_gb_list_t(extended_gb_t *g){gb_list.push_back(g);
-               lineno = flex_fta_lineno; charno = flex_fta_ch;};
-
-       extended_gb_list_t *append(extended_gb_t *s){
-                       gb_list.push_back(s);
-                       return(this);
-       };
-
-       std::string to_string(){
-               int i;
-               std::string retval;
-               for(i=0;i<gb_list.size();i++){
-                       if(i>0) retval.append(", ");
-                       retval.append(gb_list[i]->to_string());
-               }
-               return(retval);
-       };
-
-       std::vector<extended_gb_t *> get_gb_list(){return gb_list;      };
-};
-
-
-
-/*
-               A predicate tree.  Structure is similar to
-               a scalar expression tree but the type is always boolean.
-               Used by
-                       opt_where_clause, where_clause, opt_having_clause,
-                       search_condition, predicate, comparison_predicate, repl_predicate
-*/
-
-#define PRED_COMPARE 1
-#define PRED_UNARY_OP 2
-#define PRED_BINARY_OP 3
-#define PRED_FUNC 4
-#define PRED_IN 5
-
-class  predicate_t{
-public:
-       int operator_type;
-       std::string op;
-       union {
-               predicate_t *predp;
-               scalarexp_t *sexp;
-       }lhs;
-       union {
-               predicate_t *predp;
-               scalarexp_t *sexp;
-               literal_list_t *ll;
-       }rhs;
-       std::vector<scalarexp_t *> param_list;  /// pred fcn params
-       int fcn_id;                                                             /// external pred fcn id
-       int combinable_ref;
-       bool is_sampling_fcn;
-       int lineno, charno;
-
-       predicate_t(scalarexp_t *s, literal_list_t *litl){
-               operator_type = PRED_IN;
-               op = "in";
-               lhs.sexp = s;
-               rhs.ll = litl;
-               fcn_id = -1;
-               combinable_ref = -1;
-               lineno = flex_fta_lineno; charno = flex_fta_ch;
-       };
-
-       predicate_t(scalarexp_t *s, std::vector<literal_t *> litv){
-               operator_type = PRED_IN;
-               op = "in";
-               lhs.sexp = s;
-               rhs.ll = new literal_list_t(litv);
-               fcn_id = -1;
-               combinable_ref = -1;
-               lineno = flex_fta_lineno; charno = flex_fta_ch;
-       };
-
-
-       predicate_t(scalarexp_t *l_op, const char *o, scalarexp_t *r_op){
-               operator_type = PRED_COMPARE;
-               op = o;
-               lhs.sexp = l_op;
-               rhs.sexp = r_op;
-               fcn_id = -1;
-               combinable_ref = -1;
-               lineno = flex_fta_lineno; charno = flex_fta_ch;
-       };
-
-       predicate_t(const char *o, predicate_t *p){
-               operator_type = PRED_UNARY_OP;
-               op = o;
-               lhs.predp = p;
-               fcn_id = -1;
-               combinable_ref = -1;
-               lineno = flex_fta_lineno; charno = flex_fta_ch;
-       };
-
-       predicate_t(const char *o, predicate_t *l_p, predicate_t *r_p){
-               operator_type = PRED_BINARY_OP;
-               op = o;
-               lhs.predp = l_p;
-               rhs.predp = r_p;
-               fcn_id = -1;
-               combinable_ref = -1;
-               lineno = flex_fta_lineno; charno = flex_fta_ch;
-       };
-
-       predicate_t(const char *o, std::vector<scalarexp_t *> op_list){
-               operator_type = PRED_FUNC;
-               op = o;
-               param_list = op_list;
-               fcn_id = -1;
-               combinable_ref = -1;
-               lineno = flex_fta_lineno; charno = flex_fta_ch;
-       };
-
-       predicate_t(const char *o){
-               op = o;
-               fcn_id = -1;
-               combinable_ref = -1;
-               lineno = flex_fta_lineno; charno = flex_fta_ch;
-       };
-
-
-       static predicate_t *make_paramless_fcn_predicate(const char *o){
-               predicate_t *ret = new predicate_t(o);
-               ret->operator_type = PRED_FUNC;
-               ret->fcn_id = -1;
-               ret->combinable_ref = -1;
-               return(ret);
-       };
-
-       std::string to_string(){
-               if(operator_type == PRED_IN){
-                       return( lhs.sexp->to_string() + " " + op + " [ " + rhs.ll->to_string() +" ]");
-               }
-               if(operator_type == PRED_COMPARE){
-                       return( lhs.sexp->to_string() + " " + op + " " + rhs.sexp->to_string() );
-               }
-               if(operator_type == PRED_UNARY_OP){
-                       return( op + " (" + lhs.predp->to_string() + ")" );
-               }
-               if(operator_type == PRED_BINARY_OP){
-                       return( "(" + lhs.predp->to_string() + " " + op + " " + rhs.predp->to_string() + ")" );
-               }
-               if(operator_type == PRED_FUNC){
-                       std::string ret = op + "[ ";
-                       int i;
-                       for(i=0;i<param_list.size();++i){
-                               if(i>0) ret += ", ";
-                               ret += param_list[i]->to_string();
-                       }
-                       ret += "] ";
-                       return(ret);
-               }
-               return("");
-       };
-
-       std::vector<scalarexp_t *> get_op_list(){return param_list;     };
-       int get_operator_type(){return operator_type;   };
-       std::string get_op(){return op; };
-       int get_lineno(){return lineno; };
-       int get_charno(){return charno; };
-       int get_combinable_ref(){return combinable_ref;}
-       void set_combinable_ref(int f){combinable_ref = f;};
-       predicate_t *get_left_pr(){return(lhs.predp);   };
-       predicate_t *get_right_pr(){return(rhs.predp);  };
-       scalarexp_t *get_left_se(){return(lhs.sexp);    };
-       scalarexp_t *get_right_se(){return(rhs.sexp);   };
-       std::vector<literal_t *> get_lit_vec(){return(rhs.ll->get_literal_vector());            };
-
-       void swap_scalar_operands(){
-               if(operator_type != PRED_COMPARE){
-                       fprintf(stderr,"INTERNAL ERROR: swap_scalar_operands called on predicate of type %d\n",operator_type);
-                       exit(1);
-               }
-               scalarexp_t *tmp;
-               tmp = lhs.sexp; lhs.sexp = rhs.sexp; rhs.sexp = tmp;
-               if(op == ">"){op = "<"; return;}
-               if(op == ">="){op = "<="; return;}
-               if(op == "<"){op = ">"; return;}
-               if(op == "<="){op = ">="; return;}
-       };
-       void set_fcn_id(int i){fcn_id = i;};
-       int get_fcn_id(){return fcn_id;};
-
-
-};
-
-
-/*
-               A structure that holds the components of a query.
-               This is the root type.
-               Used by manipulative_statement, select_statement, table_exp
-*/
-
-#define SELECT_QUERY 1
-#define MERGE_QUERY 2
-
-class table_exp_t{
-public:
-  int query_type;                                      // roughly, the type of the query.
-  ss_map nmap;                                         //      DEFINE block
-  std::vector<var_pair_t *> query_params;      // PARAM block (uninterpreted)
-  select_list_t *sl;                                   // SELECT
-  tablevar_list_t *fm;                                 // FROM
-  predicate_t *wh;                                     // WHERE
-  predicate_t *hv;                                     // HAVING
-  predicate_t *cleaning_when;          // CLEANING WHEN
-  predicate_t *cleaning_by;                    // CLEANING BY
-  predicate_t *closing_when;           // CLOSING WHEN
-  std::vector<extended_gb_t *> gb;                     // GROUP BY
-  std::vector<colref_t *> mergevars;           // merge colrefs.
-  std::vector<colref_t *> supergb;     // supergroup.
-  scalarexp_t *slack;                          // merge slack
-  bool exernal_visible;                                // true iff. it can be subscribed to.
-  int lineno, charno;
-
-
-  table_exp_t(tablevar_list_t *f, predicate_t *p, extended_gb_list_t *g, colref_list_t *sg, predicate_t *h, predicate_t *cw, predicate_t *cb, predicate_t *closew)
-               {fm = f; wh = p; hv = h;
-               cleaning_when = cw; cleaning_by = cb;
-               closing_when = closew;
-               if(g != NULL)
-                       gb = g->gb_list;
-               if(sg != NULL)
-                       supergb = sg->get_clist();
-               slack = NULL;
-               query_type = SELECT_QUERY;
-               exernal_visible = true;
-               lineno = flex_fta_lineno; charno = flex_fta_ch;
-       };
-
-  table_exp_t(colref_list_t *mv, tablevar_list_t *f)
-               {fm = f; mergevars=mv->get_clist();
-                slack = NULL;
-               query_type = MERGE_QUERY;
-               exernal_visible = true;
-               lineno = flex_fta_lineno; charno = flex_fta_ch;
-       };
-
-  table_exp_t(colref_list_t *mv, scalarexp_t *sl, tablevar_list_t *f)
-               {fm = f; mergevars=mv->get_clist();
-                slack = sl;
-               query_type = MERGE_QUERY;
-               exernal_visible = true;
-               lineno = flex_fta_lineno; charno = flex_fta_ch;
-       };
-
-//                     Figure out the temporal merge field at analyze_fta time.
-       static table_exp_t *make_deferred_merge(std::vector<std::string> src_tbls){
-               table_exp_t *ret = new table_exp_t();
-               ret->query_type = MERGE_QUERY;
-               ret->fm = new tablevar_list_t();
-               int t;
-               for(t=0;t<src_tbls.size();++t){
-                       ret->fm->append_table(new tablevar_t(src_tbls[t].c_str()));
-               }
-               ret->lineno = 0; ret->charno = 0;
-               return ret;
-       }
-
-       table_exp_t(){
-               fm = NULL; sl = NULL; wh=NULL; hv=NULL;
-               slack = NULL;
-               cleaning_when=NULL; cleaning_by = NULL;
-               closing_when = NULL;
-               exernal_visible = true;
-       };
-
-  table_exp_t *add_selection(select_list_t *s){
-         sl = s;
-         return(this);
-       };
-
-       void add_nmap(var_defs_t *vd){
-               int n;
-               if(vd != NULL){
-                       for(n=0;n<vd->size();++n){
-                               nmap[vd->get_name(n)] = vd->get_def(n);
-//printf("Adding (%s, %s) to name map.\n",vd->get_name(n).c_str(), vd->get_def(n).c_str());
-                       }
-               }
-       };
-
-       void add_param_list(var_defs_t *vd){
-               int n;
-               if(vd != NULL){
-                       query_params = vd->get_nvec();
-               }
-       };
-
-
-       std::string to_string(){
-               std::string retval;
-               if(sl != NULL){
-                       retval.append("Select " + sl->to_string() + "\n");
-               }
-               if(fm != NULL){
-                       retval.append("From " + fm->to_string() + "\n");
-               }
-               if(wh != NULL){
-                       retval.append("Where "+ wh->to_string() + "\n");
-               }
-               if(hv != NULL){
-                       retval.append("Having "+hv->to_string() + "\n");
-               }
-               return(retval);
-               };
-
-       tablevar_list_t *get_from(){return fm;  };
-       select_list_t *get_select(){return sl;  };
-       std::vector<select_element *> get_sl_vec(){return sl->get_select_list();        };
-       predicate_t *get_where(){return wh;     };
-       predicate_t *get_having(){return hv;    };
-       predicate_t *get_cleaning_by(){return cleaning_by;      };
-       predicate_t *get_cleaning_when(){return cleaning_when;  };
-       predicate_t *get_closing_when(){return closing_when;    };
-       std::vector<extended_gb_t *> get_groupby(){return(gb);  };
-    std::vector<colref_t *> get_supergb(){return supergb;};
-
-       ss_map get_name_map(){return nmap;};
-
-       bool name_exists(std::string nm){
-               return(nmap.count(nm) > 0);
-       };
-
-       std::string get_val_of_name(std::string nm){
-               if(nmap.count(nm) == 0) return("");
-               else return nmap[nm];
-       };
-
-       void set_val_of_name(const std::string n, const std::string v){
-               nmap[n]=v;
-       }
-
-       void set_visible(bool v){exernal_visible=v;};
-       bool get_visible(){return exernal_visible;};
-};
-
-struct query_list_t{
-       std::vector<table_exp_t *> qlist;
-
-       query_list_t(table_exp_t *t){
-               qlist.push_back(t);
-       };
-       query_list_t *append(table_exp_t *t){
-               qlist.push_back(t);
-               return(this);
-       };
-};
-
-
-#define TABLE_PARSE 1
-#define QUERY_PARSE 2
-#define STREAM_PARSE 3
-
-struct fta_parse_t{
-       query_list_t *parse_tree_list;
-       table_exp_t *fta_parse_tree;
-       table_list *tables;
-       int parse_type;
-};
-
-
-
-
-
-       extern table_exp_t *fta_parse_tree;
-
-
-
-
-
-#endif
-
+/* ------------------------------------------------\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
+#ifndef _FTA_PARSE_H_INCLUDED__\r
+#define _FTA_PARSE_H_INCLUDED__\r
+\r
+#include<stdio.h>\r
+#include<ctype.h>\r
+\r
+       int yyparse();\r
+       void yyerror(char *s);\r
+       int yylex();\r
+extern int flex_fta_lineno, flex_fta_ch;\r
+\r
+/*             Interface to FTA Parser         */\r
+void FtaParser_setfileinput(FILE *f);\r
+void FtaParser_setstringinput(char *s);\r
+\r
+\r
+/*             Get type defines.       */\r
+#include"type_objects.h"\r
+#include"literal_types.h"\r
+#include"type_indicators.h"\r
+\r
+#include <string>\r
+#include <vector>\r
+#include <map>\r
+#include <math.h>\r
+#include <string>\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+\r
+\r
+//             colref_t::is_equivalent needs to understand the schema\r
+#include"parse_schema.h"\r
+class colref_t;\r
+\r
+\r
+\r
+class var_pair_t{\r
+public:\r
+  std::string name;\r
+  std::string val;\r
+\r
+  var_pair_t(char *n, char *v){\r
+       name=n; val=v;\r
+//printf("NEW var_pair_t(%s, %s)\n",n,v);\r
+       };\r
+\r
+  var_pair_t(const std::string n, const std::string v){\r
+       name=n; val=v;\r
+       };\r
+};\r
+\r
+typedef std::map< std::string, std::string > ss_map;\r
+\r
+class var_defs_t{\r
+private:\r
+       std::vector<var_pair_t *> namevec;\r
+\r
+public:\r
+       var_defs_t(var_pair_t *vp){\r
+               namevec.push_back(vp);\r
+       };\r
+\r
+       var_defs_t *add_var_pair(var_pair_t *vp){\r
+               namevec.push_back(vp);\r
+               return(this);\r
+       };\r
+\r
+       std::vector<var_pair_t *> get_nvec(){return namevec;};\r
+\r
+       int size(){return namevec.size();};\r
+\r
+       int find_name(std::string n){\r
+               int i;\r
+               for(i=0;i<namevec.size();i++){\r
+                       if(namevec[i]->name == n)\r
+                               return i;\r
+               }\r
+               return -1;\r
+       }\r
+       std::string get_name(int i){\r
+               if(i>=0 && i<namevec.size()){\r
+                       return(namevec[i]->name);\r
+               }else{\r
+                       return("");\r
+               }\r
+       }\r
+\r
+       std::string get_def(int i){\r
+               if(i>=0 && i<namevec.size()){\r
+                       return(namevec[i]->val);\r
+               }else{\r
+                       return("");\r
+               }\r
+       }\r
+\r
+       std::string dump(){\r
+               int i;\r
+               std::string ret;\r
+               for(i=0;i<namevec.size();++i){\r
+                       ret += "\t"+namevec[i]->name+" = "+namevec[i]->val+"\n";\r
+               }\r
+               return ret;\r
+       }\r
+\r
+};\r
+\r
+\r
+\r
+\r
+//             literal type constants are defined in literal_types.h\r
+//             (must share this info with type_objects.h)\r
+\r
+//             Represents a literal, as expected\r
+//             NOTE: this class contains some code generation methods.\r
+\r
+class literal_t{\r
+private:\r
+\r
+public:\r
+       std::string lstring;            /* literal value */\r
+       short int ltype;                        /* literal type */\r
+       int lineno, charno;\r
+\r
+       int complex_literal_id; // if this literal has a complex constructor,\r
+                                                       // there is a function which constructs it)\r
+                                                       //set to the idx in the complex literal\r
+                                                       // table.  (Must store this here (instead of in SE)\r
+                                                       // because of bare literals in the IN predicate).\r
+\r
+\r
+       literal_t(std::string v){\r
+               lstring = v;\r
+               ltype = LITERAL_STRING;\r
+               complex_literal_id = -1;\r
+               lineno = flex_fta_lineno; charno = flex_fta_ch;\r
+       }\r
+       static literal_t *make_define_literal(const char *s, var_defs_t *d){\r
+               int i;\r
+               i=d->find_name(s);\r
+               if(i<0){\r
+                       fprintf(stderr,"ERROR at line %d, char %d; DEFINE'd literal %s referenced but not in DEFINE block.\n",flex_fta_lineno, flex_fta_ch, s);\r
+                       exit(1);\r
+               }\r
+               return new literal_t(d->get_def(i));\r
+       }\r
+\r
+       literal_t(const char *lit, int t){lstring = lit; ltype = t;\r
+               lineno = flex_fta_lineno; charno = flex_fta_ch;\r
+               complex_literal_id = -1;\r
+\r
+//             For some datatypes we need to modify literal so make a copy of the string\r
+               char v[100];\r
+               strcpy(v, lit);\r
+\r
+//                     Remove UL, ULL suffix from INT constants.\r
+               if(ltype == LITERAL_INT || ltype == LITERAL_LONGINT){\r
+                       int i;\r
+                       int len=strlen(v);\r
+                       for(i=0;i<len;++i){\r
+                               if(v[i] == 'U') v[i] = '\0';\r
+                       }\r
+                       lstring = v;\r
+               }\r
+\r
+//                     HEX and LONGHEX must be converted to uint (long long uint)\r
+               if(ltype == LITERAL_HEX){\r
+                       char *c,ltmpstr[100];\r
+                       unsigned long tmp_l;\r
+                       for(c=v; (*c)!='\0';++c){\r
+                               if(! ( ((*c) >= '0' && (*c) <= '9') || (tolower(*c) >= 'a' && tolower(*c) <= 'f') ) ){\r
+                                       fprintf(stderr,"Syntax Error, line=%d, character=%d.  The literal %s is not a HEX constant.\n",\r
+                                               lineno, charno, v);\r
+                                       exit(1);\r
+                               }\r
+                       }\r
+                       sscanf(v,"%lx",&tmp_l);\r
+                       sprintf(ltmpstr,"%lu",tmp_l);\r
+                       lstring = ltmpstr;\r
+                       ltype = LITERAL_INT;\r
+               }\r
+               if(ltype == LITERAL_LONGHEX){\r
+                       char *c,ltmpstr[100];\r
+                       unsigned long long tmp_ll;\r
+                       for(c=v; (*c)!='\0';++c){\r
+                               if(! ( ((*c) >= '0' && (*c) <= '9') || (tolower(*c) >= 'a' && tolower(*c) <= 'f') ) ){\r
+                                       fprintf(stderr,"Syntax Error, line=%d, character=%d.  The literal %s is not a LHEX constant.\n",\r
+                                               lineno, charno, v);\r
+                                       exit(1);\r
+                               }\r
+                       }\r
+                       sscanf(v,"%llx",&tmp_ll);\r
+                       sprintf(ltmpstr,"%llu",tmp_ll);\r
+                       lstring = ltmpstr;\r
+                       ltype = LITERAL_LONGINT;\r
+               }\r
+//                     Convert IP to uint\r
+               if(ltype == LITERAL_IP){\r
+                       char ltmpstr[100];\r
+                       unsigned int o1,o2,o3,o4,tmp_l;\r
+                       if(sscanf(v,"%u.%u.%u.%u",&o1,&o2,&o3,&o4) != 4){\r
+                                       fprintf(stderr,"Syntax Error, line=%d, character=%d.  The literal %s is not an IP constant.\n",\r
+                                               lineno, charno, v);\r
+                                       exit(1);\r
+                       }\r
+                       if( (o1>255) || (o2>255) || (o3>255) || (o4>255) ){\r
+                                       fprintf(stderr,"Syntax Error, line=%d, character=%d.  The literal %s is not an IP constant.\n",\r
+                                               lineno, charno, v);\r
+                                       exit(1);\r
+                       }\r
+                       tmp_l = (o1<<24)+(o2<<16)+(o3<<8)+o4;\r
+                       sprintf(ltmpstr,"%u",tmp_l);\r
+                       lstring = ltmpstr;\r
+                       ltype = LITERAL_IP;\r
+               }\r
+       };\r
+\r
+//                     used to create literals with a default or initial value.\r
+       literal_t(int type_indicator){\r
+               lineno=-1; charno=-1;\r
+               complex_literal_id = -1;\r
+\r
+               switch(type_indicator){\r
+               case UINT_TYPE:\r
+               case INT_TYPE:\r
+               case USHORT_TYPE:\r
+                       ltype = LITERAL_INT;\r
+                       lstring = "0";\r
+                       break;\r
+               case ULLONG_TYPE:\r
+               case LLONG_TYPE:\r
+                       ltype = LITERAL_LONGINT;\r
+                       lstring = "0";\r
+                       break;\r
+               case FLOAT_TYPE:\r
+                       ltype = LITERAL_FLOAT;\r
+                       lstring = "0.0";\r
+                       break;\r
+               case BOOL_TYPE:\r
+                       ltype = LITERAL_BOOL;\r
+                       lstring = "FALSE";\r
+                       break;\r
+               case VSTR_TYPE:\r
+                       ltype = LITERAL_STRING;\r
+                       lstring = ""; complex_literal_id = 0; // unregistred complex lit\r
+                       break;\r
+               case TIMEVAL_TYPE:\r
+                       ltype = LITERAL_TIMEVAL;\r
+                       lstring = "0.0";\r
+                       break;\r
+               case IPV6_TYPE:\r
+                       ltype = LITERAL_IPV6;\r
+                       lstring = "0000:0000:0000:0000:0000:0000:0000:0000";\r
+                       complex_literal_id = 0; // unregistered complex literal\r
+                       break;\r
+               case IP_TYPE:\r
+                       ltype = LITERAL_IP;\r
+                       lstring = "0";\r
+                       break;\r
+               default:\r
+                       ltype = LITERAL_UDEF;\r
+                       lstring=" INTERNAL ERROR, UNKNOWN TYPE INDICATOR IN literal_t::literal_t(int) ";\r
+               }\r
+       };\r
+\r
+       std::string to_string(){return lstring;};\r
+\r
+       int get_type(){return ltype;    };\r
+       int get_lineno(){return lineno; };\r
+       int get_charno(){return charno; };\r
+\r
+       bool is_equivalent(literal_t *l2){\r
+               if(ltype != l2->ltype)\r
+                       return(false);\r
+               if(lstring != l2->lstring)\r
+                       return(false);\r
+\r
+               return(true);\r
+       };\r
+\r
+//                     Internal function to unescape control characters.\r
+       static std::string gsqlstr_to_cstr(std::string s){\r
+               std::string retval;\r
+               unsigned char c, prev_c='\0';\r
+               int i;\r
+\r
+               for(i=0;i<s.size();++i){\r
+                       c = s[i];\r
+                       if(c=='\''){            // || c=='\\'\r
+                               if(prev_c==c){\r
+                                       retval += c;\r
+                                       prev_c = '\0';\r
+                               }else{\r
+                                       prev_c=c;\r
+                               }\r
+                               continue;\r
+                       }\r
+\r
+                       retval += c;\r
+                       prev_c = c;\r
+               }\r
+\r
+               return retval;\r
+       }\r
+\r
+\r
+\r
+       std::string to_hfta_C_code(std::string param){\r
+               std::string retval;\r
+               double tmp_f;\r
+               int secs, millisecs;\r
+               char tmpstr[100];\r
+\r
+               switch(ltype){\r
+               case LITERAL_STRING:\r
+                       retval.append(this->hfta_constructor_name() );\r
+                       retval.append("("+param+",\"");\r
+                       retval.append(gsqlstr_to_cstr(lstring));\r
+                       retval.append("\")");\r
+                       return(retval);\r
+               case LITERAL_INT:\r
+               case LITERAL_IP:\r
+                       return("((gs_uint32_t)"+lstring+")");\r
+               case LITERAL_LONGINT:\r
+                       return("((gs_uint64_t)"+lstring+")");\r
+               case LITERAL_FLOAT:\r
+                       return(lstring);\r
+//             case LITERAL_HEX:\r
+//                     return("0x"+lstring);\r
+               case LITERAL_BOOL:\r
+                       if(lstring == "TRUE"){\r
+                               return("1");\r
+                       }else{\r
+                               return("0");\r
+                       }\r
+               case LITERAL_TIMEVAL:\r
+                       retval.append(this->hfta_constructor_name() );\r
+                       tmp_f = atof(lstring.c_str());\r
+                       secs = (int)floor(tmp_f);\r
+                       millisecs = (int) rint((tmp_f - secs)*1000);\r
+                       sprintf(tmpstr,"(%d, %d)",secs,millisecs);\r
+                       retval.append(tmpstr);\r
+                       return(retval);\r
+               case LITERAL_IPV6:\r
+                       retval = this->hfta_constructor_name();\r
+                       retval += "("+param+",\""+lstring+"\")";\r
+                       return retval;\r
+               }\r
+\r
+               return("ERROR UNKNOWN LITERAL");\r
+       };\r
+\r
+\r
+///                    for LFTA code generation\r
+       std::string to_C_code(std::string param){\r
+               std::string retval;\r
+               double tmp_f;\r
+               int secs, millisecs;\r
+               char tmpstr[100];\r
+\r
+               switch(ltype){\r
+               case LITERAL_STRING:\r
+                       retval = this->constructor_name()+"("+param+",\""+gsqlstr_to_cstr(lstring)+"\")";\r
+                       return(retval);\r
+               case LITERAL_INT:\r
+               case LITERAL_IP:\r
+                       return("((gs_uint32_t)"+lstring+")");\r
+               case LITERAL_LONGINT:\r
+                       return("((gs_uint64_t)"+lstring+")");\r
+               case LITERAL_FLOAT:\r
+                       return(lstring);\r
+//             case LITERAL_HEX:\r
+//                     return("0x"+lstring);\r
+               case LITERAL_BOOL:\r
+                       if(lstring == "TRUE"){\r
+                               return("1");\r
+                       }else{\r
+                               return("0");\r
+                       }\r
+               case LITERAL_IPV6:\r
+                       retval = this->constructor_name()+"("+param+",\""+lstring+"\")";\r
+                       return(retval);\r
+               case LITERAL_TIMEVAL:\r
+                       retval.append(this->constructor_name() );\r
+                       tmp_f = atof(lstring.c_str());\r
+                       secs = (int)floor(tmp_f);\r
+                       millisecs = (int) rint((tmp_f - secs)*1000);\r
+                       sprintf(tmpstr,"(%d, %d)",secs,millisecs);\r
+                       retval.append(tmpstr);\r
+                       return(retval);\r
+               }\r
+\r
+               return("ERROR UNKNOWN LITERAL");\r
+       };\r
+\r
+\r
+       std::string to_query_string(){\r
+               std::string retval;\r
+\r
+               switch(ltype){\r
+               case LITERAL_IP:\r
+               {\r
+                       unsigned int v;\r
+                       sscanf(lstring.c_str(),"%u",&v);\r
+                       int d1 = v & 0xff;\r
+                       int d2 = (v & 0xff00) >> 8;\r
+                       int d3 = (v & 0xff0000) >> 16;\r
+                       int d4 = (v & 0xff000000) >> 24;\r
+                       char ret[200];\r
+                       sprintf(ret,"IP_VAL'%u.%u.%u.%u'",d4,d3,d2,d1);\r
+                       return ret;\r
+               }\r
+               case LITERAL_STRING:\r
+                       retval = "'"+lstring+"'";\r
+                       return(retval);\r
+               case LITERAL_INT:\r
+               case LITERAL_FLOAT:\r
+               case LITERAL_TIMEVAL:\r
+               case LITERAL_IPV6:\r
+               case LITERAL_BOOL:\r
+                       return(lstring);\r
+               case LITERAL_LONGINT:\r
+                       return(lstring+"ULL");\r
+               }\r
+\r
+               return("ERROR UNKNOWN LITERAL in literal_t::to_query_string");\r
+       };\r
+\r
+//             TODO : Use definition files instead of hardwiring these.\r
+\r
+//             constructor in LFTA code\r
+       std::string constructor_name(){\r
+\r
+               switch(ltype){\r
+               case LITERAL_TIMEVAL:\r
+                       return("Timeval_Constructor");\r
+               case LITERAL_IPV6:\r
+                       return("Ipv6_Constructor");\r
+               case LITERAL_STRING:\r
+                       return("str_constructor");\r
+               case LITERAL_INT:\r
+               case LITERAL_IP:\r
+               case LITERAL_LONGINT:\r
+               case LITERAL_BOOL:\r
+               case LITERAL_FLOAT:\r
+                       return("");\r
+               }\r
+               return("ERROR UNKNOWN LITERAL");\r
+       };\r
+\r
+       std::string hfta_constructor_name(){\r
+\r
+               switch(ltype){\r
+               case LITERAL_TIMEVAL:\r
+                       return("HFTA_Timeval_Constructor");\r
+               case LITERAL_IPV6:\r
+                       return("HFTA_Ipv6_Constructor");\r
+               case LITERAL_STRING:\r
+                       return("Vstring_Constructor");\r
+               case LITERAL_INT:\r
+               case LITERAL_IP:\r
+               case LITERAL_LONGINT:\r
+               case LITERAL_BOOL:\r
+               case LITERAL_FLOAT:\r
+                       return("");\r
+               }\r
+               return("ERROR UNKNOWN LITERAL");\r
+       };\r
+\r
+       std::string hfta_empty_literal_name(){\r
+\r
+               switch(ltype){\r
+               case LITERAL_TIMEVAL:\r
+                       return("EmptyTimeval");\r
+               case LITERAL_IPV6:\r
+                       return("EmptyIp6");\r
+               case LITERAL_STRING:\r
+                       return("EmptyString");\r
+               }\r
+               return("ERROR_NOT_A_COMPLEX_LITERAL");\r
+       };\r
+\r
+\r
+       void set_cpx_lit_ref(int g){complex_literal_id = g;     };\r
+       int get_cpx_lit_ref(){return (complex_literal_id );     };\r
+       bool is_cpx_lit(){return(complex_literal_id  >= 0);     };\r
+\r
+};\r
+\r
+\r
+/*\r
+               A (null terminated) list of literals.\r
+               Used for the IN clause\r
+*/\r
+\r
+class literal_list_t{\r
+private:\r
+\r
+public:\r
+       std::vector<literal_t *> lit_list;\r
+       int lineno, charno;\r
+\r
+       literal_list_t(literal_t *l){\r
+               lit_list.push_back(l);\r
+               lineno = flex_fta_lineno; charno = flex_fta_ch;\r
+       };\r
+\r
+       literal_list_t(std::vector<literal_t *> lvec){\r
+               lineno = charno = 0;\r
+               lit_list = lvec;\r
+       };\r
+\r
+       literal_list_t *append_literal(literal_t *l){\r
+               lit_list.push_back(l);\r
+               return(this);\r
+       };\r
+\r
+       std::string to_string(){\r
+               int i;\r
+               std::string retval;\r
+               for(i=0;i<lit_list.size();i++){\r
+                       if(i>0) retval.append(", ");\r
+                       retval.append(lit_list[i]->to_query_string());\r
+               }\r
+           return(retval);\r
+       };\r
+\r
+       std::vector<literal_t *> get_literal_vector(){return(lit_list);};\r
+\r
+};\r
+\r
+\r
+class string_t{\r
+public:\r
+       std::string val;\r
+       string_t(char *s){\r
+               val = s;\r
+       }\r
+       string_t *append(char *s){\r
+               val += s;\r
+               return this;\r
+       }\r
+       string_t *append(char *sep, char *s){\r
+               val += sep;\r
+               val += s;\r
+               return this;\r
+       }\r
+       const char *c_str(){\r
+               return val.c_str();\r
+       }\r
+};\r
+\r
+//             A tablevar is a data source in a GSQL query.\r
+//             Every column ref must be bound to a tablevar,\r
+//             either explicitly or via imputation.\r
+\r
+\r
+class tablevar_t{\r
+public:\r
+//             A tablevar is a variable which binds to a named data source.\r
+//             the variable name might be explicit in the query, or it might be\r
+//             implicit in which case the variable name is imputed.  In either case\r
+//             the variable name is set via the set_range_var method.\r
+//\r
+//             The data source is the name of either a STREAM or a PROTOCOL.\r
+//             All STREAMS are unique, but a PROTOCOL must be bound to an\r
+//             interface.  If the interface is not given, it is imputed to be\r
+//             the default interface.\r
+\r
+       std::string machine;\r
+       std::string interface;\r
+       std::string schema_name;\r
+       std::string variable_name;\r
+       std::string udop_alias;         // record UDOP ID for of UDOP\r
+                                                               // for use by cluster manager\r
+\r
+       int schema_ref;         // index of the table in the schema (table_list)\r
+       int opview_idx;         // index in list of operator views (if any)\r
+       bool iface_is_query;    // true if iface resolves to query\r
+                                                       // instead of specific interface.\r
+\r
+       int properties;         // inner (0) or outer (1) join;\r
+                                               // labeled using FROM clause,\r
+                                               // determines join algorithm.\r
+\r
+       int lineno, charno;\r
+\r
+       tablevar_t(){ opview_idx = -1; schema_ref=-1; iface_is_query = false;\r
+                               lineno=-1; charno=-1;};\r
+       tablevar_t(const char *t){schema_name=t;  interface="";\r
+               opview_idx = -1; schema_ref = -1;\r
+               variable_name=""; properties = 0;\r
+               iface_is_query = false;\r
+               lineno = flex_fta_lineno; charno = flex_fta_ch;};\r
+\r
+       tablevar_t(const char *i, const char *s, int iq){interface=i; schema_name=s;\r
+               opview_idx = -1; schema_ref = -1;\r
+               variable_name=""; properties = 0;\r
+               if(iq) iface_is_query = true; else iface_is_query = false;\r
+               lineno = flex_fta_lineno; charno = flex_fta_ch;};\r
+\r
+       tablevar_t(const char *m, const char *i, const char *s){\r
+               machine = m; interface=i; schema_name=s;\r
+               opview_idx = -1; schema_ref = -1;\r
+               variable_name=""; properties = 0;\r
+               iface_is_query = false;\r
+               lineno = flex_fta_lineno; charno = flex_fta_ch;};\r
+\r
+       tablevar_t *duplicate(){\r
+               tablevar_t *ret = new tablevar_t();\r
+               ret->lineno = lineno; ret->charno = charno;\r
+               ret->schema_ref = schema_ref;\r
+               ret->opview_idx = opview_idx;\r
+               ret->machine = machine;\r
+               ret->interface = interface;\r
+               ret->schema_name = schema_name;\r
+               ret->variable_name = variable_name;\r
+               ret->properties = properties;\r
+               ret->iface_is_query = iface_is_query;\r
+               return(ret);\r
+       };\r
+\r
+       tablevar_t *set_range_var(const char *r){\r
+               variable_name = r;\r
+               return(this);\r
+       };\r
+       tablevar_t *set_range_var(std::string r){\r
+               variable_name = r;\r
+               return(this);\r
+       };\r
+\r
+       void set_schema(std::string s){schema_name = s;};\r
+       void set_interface(std::string i){interface=i;};\r
+       void set_machine(std::string m){machine = m;};\r
+       void set_udop_alias(std::string u){udop_alias = u;};\r
+\r
+       void set_schema_ref(int r){schema_ref = r;};\r
+       int get_schema_ref(){return schema_ref;};\r
+\r
+       void set_opview_idx(int i){opview_idx = i;};\r
+       int get_opview_idx(){return opview_idx;};\r
+\r
+       void set_property(int p){properties = p;};\r
+       int get_property(){return properties;};\r
+\r
+       bool get_ifq(){return iface_is_query;};\r
+    void set_ifq(bool b){iface_is_query = b;};\r
+\r
+       std::string to_string(){\r
+               std::string retval;\r
+\r
+               if(machine != "" && !iface_is_query)\r
+                       retval += "'"+machine+"'.";\r
+               if(interface != ""){\r
+                       if(iface_is_query){\r
+                        retval += '['+interface+"].";\r
+                       }else{\r
+                        retval += interface+".";\r
+                       }\r
+               }\r
+               retval += schema_name;\r
+               if(variable_name != "") retval+=" "+variable_name;\r
+\r
+               return(retval);\r
+       };\r
+\r
+       std::string get_schema_name(){return schema_name;};\r
+       void set_schema_name(std::string n){schema_name=n;};\r
+       std::string get_var_name(){return variable_name;};\r
+       std::string get_interface(){return interface;};\r
+       std::string get_machine(){return machine;};\r
+       std::string get_udop_alias(){return udop_alias;};\r
+\r
+       int get_lineno(){return(lineno);        };\r
+       int get_charno(){return(charno);        };\r
+\r
+};\r
+\r
+#define INNER_JOIN_PROPERTY 0\r
+#define LEFT_OUTER_JOIN_PROPERTY 1\r
+#define RIGHT_OUTER_JOIN_PROPERTY 2\r
+#define OUTER_JOIN_PROPERTY 3\r
+#define FILTER_JOIN_PROPERTY 4\r
+\r
+//             tablevar_list_t is the list of tablevars in a FROM clause\r
+\r
+struct tablevar_list_t{\r
+public:\r
+       std::vector<tablevar_t *> tlist;\r
+       int properties;\r
+       int lineno, charno;\r
+//             For filter join\r
+       colref_t *temporal_var;\r
+       unsigned int temporal_range;\r
+\r
+       tablevar_list_t(){properties = -1; temporal_var = NULL;}\r
+       tablevar_list_t(tablevar_t *t){tlist.push_back(t); properties=-1; temporal_var = NULL;\r
+               lineno = flex_fta_lineno; charno = flex_fta_ch;};\r
+       tablevar_list_t(std::vector<tablevar_t *> t){tlist = t; properties=-1; temporal_var = NULL;\r
+               lineno = 0; charno = 0;};\r
+\r
+       tablevar_list_t *duplicate(){\r
+               tablevar_list_t *ret = new tablevar_list_t();\r
+               ret->lineno = lineno; ret->charno = charno;\r
+               ret->properties = properties;\r
+               ret->temporal_var = temporal_var;\r
+               ret->temporal_range = temporal_range;\r
+               int i;\r
+               for(i=0;i<tlist.size();++i){\r
+                       ret->append_table(tlist[i]->duplicate());\r
+               }\r
+               return(ret);\r
+       }\r
+\r
+\r
+\r
+       tablevar_list_t *append_table(tablevar_t *t){\r
+               tlist.push_back(t);\r
+               return(this);\r
+       };\r
+\r
+       std::string to_string(){\r
+               int i;\r
+               std::string retval;\r
+\r
+               for(i=0;i<tlist.size();i++){\r
+                       if(i>0) retval.append(", ");\r
+                       retval.append(tlist[i]->to_string());\r
+               }\r
+               return(retval);\r
+       };\r
+\r
+       std::vector<tablevar_t *> get_table_list(){return(tlist);       };\r
+\r
+       std::vector<std::string> get_table_names(){\r
+               std::vector<std::string> ret;\r
+               int t;\r
+               for(t=0;t<tlist.size();++t){\r
+                       std::string tbl_name = tlist[t]->get_schema_name();\r
+                       ret.push_back(tbl_name);\r
+               }\r
+               return(ret);\r
+       }\r
+\r
+       std::vector<std::string> get_src_tbls(table_list *Schema){\r
+               std::vector<std::string> ret;\r
+               int t, sq;\r
+               for(t=0;t<tlist.size();++t){\r
+                       std::string tbl_name = tlist[t]->get_schema_name();\r
+                       int sid = Schema->find_tbl(tbl_name);\r
+                       if(sid < 0){ ret.push_back(tbl_name);\r
+                       }else\r
+                       if(Schema->get_schema_type(sid) != OPERATOR_VIEW_SCHEMA){\r
+                               ret.push_back(tbl_name);\r
+                       }else{\r
+                               std::vector<subquery_spec *> sqspec = Schema->get_subqueryspecs(sid);\r
+                               for(sq=0;sq<sqspec.size();++sq){\r
+                                       ret.push_back(sqspec[sq]->name);\r
+                               }\r
+                       }\r
+               }\r
+               return(ret);\r
+       };\r
+\r
+       int size(){\r
+               return tlist.size();\r
+       };\r
+\r
+//             Some accessor functions.\r
+\r
+       std::vector<std::string> get_schema_names(){\r
+               int i;\r
+               std::vector<std::string > retval;\r
+               for(i=0;i<tlist.size();i++){\r
+                       retval.push_back(tlist[i]->get_schema_name());\r
+               }\r
+               return(retval);\r
+       }\r
+\r
+       std::vector<int> get_schema_refs(){\r
+               int i;\r
+               std::vector<int> retval;\r
+               for(i=0;i<tlist.size();i++){\r
+                       retval.push_back(tlist[i]->get_schema_ref());\r
+               }\r
+               return(retval);\r
+       }\r
+\r
+\r
+       int get_schema_ref(int i){\r
+               if(i<0 || i>=tlist.size()) return(-1);\r
+               return tlist[i]->get_schema_ref();\r
+       };\r
+\r
+       std::string get_tablevar_name(int i){\r
+               if(i<0 || i>=tlist.size()) return("");\r
+               return tlist[i]->get_var_name();\r
+       };\r
+\r
+       void set_properties(int p){properties = p;};\r
+       int get_properties(){return properties;};\r
+\r
+       void set_colref(colref_t *c){temporal_var = c;};\r
+       void set_temporal_range(unsigned int t){temporal_range = t;};\r
+       void set_temporal_range(const char *t){temporal_range= atoi(t);};\r
+       colref_t *get_colref(){return temporal_var;};\r
+       unsigned int get_temporal_range(){return temporal_range;};\r
+\r
+};\r
+\r
+//                     A reference to an interface parameter.\r
+//                     (I need to be able to record the source\r
+//                      tablevar, else this would be a lot simpler).\r
+class ifpref_t{\r
+public:\r
+       std::string tablevar;\r
+       std::string pname;\r
+       int tablevar_ref;\r
+       int lineno, charno;\r
+\r
+       ifpref_t(const char *p){\r
+               tablevar="";\r
+               pname = p;\r
+               tablevar_ref = -1;\r
+               lineno = flex_fta_lineno; charno = flex_fta_ch;\r
+       };\r
+\r
+       ifpref_t(const char *t, const char *p){\r
+               tablevar=t;\r
+               pname = p;\r
+               tablevar_ref = -1;\r
+               lineno = flex_fta_lineno; charno = flex_fta_ch;\r
+       };\r
+\r
+       void set_tablevar_ref(int i){tablevar_ref = i;};\r
+       int get_tablevar_ref(){return tablevar_ref;};\r
+       std::string get_tablevar(){return tablevar;}\r
+       void set_tablevar(std::string t){tablevar = t;};\r
+       std::string get_pname(){return pname;}\r
+       std::string to_string(){\r
+               std::string ret;\r
+               if(tablevar != "")\r
+                       ret += tablevar + ".";\r
+               ret += "@"+pname;\r
+               return ret;\r
+       };\r
+       bool is_equivalent(ifpref_t *i){\r
+               return (tablevar_ref == i->tablevar_ref) && (pname == i->pname);\r
+       };\r
+};\r
+\r
+\r
+\r
+\r
+//                     A representation of a reference to a field of a\r
+//                     stream (or table).  This reference must be bound\r
+//                     to a particular schema (schema_ref) and to a\r
+//                     particular table variable in the FROM clause (tablevar_ref)\r
+//                     If the column reference was generated by the parser,\r
+//                     it will contain some binding text wich might need\r
+//                     interpretation to do the actual binding.\r
+class colref_t{\r
+public:\r
+       std::string interface;          // specified interface, if any.\r
+       std::string table_name;         // specified table name or range var, if any.\r
+       std::string field;                      // field name\r
+       bool default_table;                     // true iff. no table or range var given.\r
+       int schema_ref;                         // ID of the source schema.\r
+       int tablevar_ref;                       // ID of the tablevar (in FROM clause).\r
+       int lineno, charno;\r
+\r
+       colref_t(const char *f){\r
+               field = f; default_table = true;\r
+               schema_ref = -1; tablevar_ref = -1;\r
+               lineno = flex_fta_lineno; charno = flex_fta_ch;\r
+       };\r
+\r
+       colref_t(const char *t, const char *f){\r
+               table_name = t; field=f; default_table = false;\r
+               schema_ref = -1; tablevar_ref = -1;\r
+               lineno = flex_fta_lineno; charno = flex_fta_ch;\r
+       };\r
+\r
+       colref_t(const char *i, const char *t, const char *f){\r
+               interface=i;\r
+               table_name = t; field=f; default_table = false;\r
+               schema_ref = -1; tablevar_ref = -1;\r
+               lineno = flex_fta_lineno; charno = flex_fta_ch;\r
+       };\r
+\r
+       colref_t *duplicate(){\r
+               colref_t *retval = new colref_t(interface.c_str(), table_name.c_str(), field.c_str());\r
+               retval->schema_ref = schema_ref;\r
+               retval->tablevar_ref = tablevar_ref;\r
+               retval->lineno = lineno;\r
+               retval->charno = charno;\r
+               retval->default_table = default_table;\r
+               return(retval);\r
+       }\r
+\r
+       std::string to_string(){\r
+               if(default_table){\r
+                       return field;\r
+               }else{\r
+                       if(interface != "") return(interface+"."+table_name+"."+field);\r
+                       return(table_name + "." + field);\r
+               }\r
+       };\r
+\r
+       std::string to_query_string(){\r
+               if(default_table){\r
+                       return field;\r
+               }else{\r
+                       if(interface != "") return(interface+"."+table_name+"."+field);\r
+                       if(table_name != "") return(table_name + "." + field);\r
+                       return(field);\r
+               }\r
+       };\r
+\r
+       int get_lineno(){return lineno; };\r
+       int get_charno(){return charno; };\r
+\r
+       bool uses_default_table(){return default_table; };\r
+\r
+       std::string get_field(){return(field);  };\r
+       void set_field(std::string f){field=f;};\r
+       std::string get_table_name(){return(table_name);};\r
+       std::string get_interface(){return(interface);};\r
+       void set_table_name(std::string t){table_name = t; default_table=false;};\r
+       void set_interface(std::string i){interface=i;};\r
+\r
+       int get_schema_ref(){return schema_ref;}\r
+       void set_schema_ref(int s){schema_ref = s;};\r
+       int get_tablevar_ref(){return tablevar_ref;}\r
+       void set_tablevar_ref(int s){tablevar_ref = s;};\r
+\r
+//                     Should equivalence be based on tablevar_ref or schema_ref?\r
+       bool is_equivalent(colref_t *c2){\r
+               if(schema_ref == c2->schema_ref){\r
+                       return(field == c2->field);\r
+               }\r
+               return(false);\r
+       };\r
+\r
+       bool is_equivalent_base(colref_t *c2, table_list *Schema){\r
+               if(Schema->get_basetbl_name(schema_ref,field) ==\r
+                  Schema->get_basetbl_name(c2->schema_ref,c2->field)){\r
+                       return(field == c2->field);\r
+               }\r
+               return(false);\r
+       };\r
+};\r
+\r
+class colref_list_t{\r
+public:\r
+       std::vector<colref_t *> clist;\r
+\r
+//     colref_list_t(){};\r
+\r
+       colref_list_t(colref_t *c){\r
+               clist.push_back(c);\r
+       }\r
+\r
+       colref_list_t *append(colref_t *c){\r
+               clist.push_back(c);\r
+               return this;\r
+       }\r
+\r
+       std::vector<colref_t *> get_clist(){\r
+               return clist;\r
+       }\r
+};\r
+\r
+\r
+\r
+\r
+\r
+\r
+/*\r
+               A tree containing a scalar expression.\r
+                       Used for\r
+                               atom : a parameter or a literal\r
+                               scalar_exp (see the scalar_exp: rule in emf.l for details)\r
+                               function_ref (a function that has a value, e.g. an aggregate\r
+                                                               function).\r
+               operator_type defines the contents of the node.  If its a non-terminal,\r
+               then op has a meaning and defines the operation.  See the list of\r
+               #define'd constants following the structure definition.\r
+\r
+\r
+*/\r
+\r
+#define SE_LITERAL 1\r
+#define SE_PARAM 2\r
+#define SE_COLREF 3\r
+#define SE_UNARY_OP 4\r
+#define SE_BINARY_OP 5\r
+#define SE_AGGR_STAR 6\r
+#define SE_AGGR_SE 7\r
+#define SE_FUNC 8\r
+#define SE_IFACE_PARAM 9\r
+\r
+\r
+class scalarexp_t{\r
+public:\r
+       int operator_type;\r
+       std::string op;\r
+       union{\r
+               scalarexp_t *scalarp;\r
+               literal_t *litp;\r
+               colref_t *colref;\r
+               ifpref_t *ifp;\r
+       } lhs;\r
+       union{\r
+               scalarexp_t *scalarp;\r
+       } rhs;\r
+       std::vector<scalarexp_t *> param_list;\r
+\r
+//             SE node decorations -- results of query analysis.\r
+       data_type *dt;\r
+       int gb_ref;                             // set to the gb attr tbl ref, else -1\r
+       int aggr_id;                    // set to the aggr tbl ref, else -1\r
+       int fcn_id;                             // external function table ref, else -1\r
+       int partial_ref;                // partial fcn table ref, else -1\r
+       int fcn_cache_ref;              // function cache ref, else -1\r
+       int handle_ref;                 // Entry in pass-by-handle parameter table, else -1.\r
+                                                       // (might be a literal or a query param).\r
+       bool is_superagg;               // true if is aggregate and associated with supergroup.\r
+       std::string storage_state;      // storage state of stateful fcn,\r
+                                                               // empty o'wise.\r
+\r
+       int lineno, charno;\r
+\r
+       void default_init(){\r
+               operator_type = 0;\r
+               gb_ref = -1; aggr_id = -1;      fcn_id = -1;\r
+               partial_ref = -1; fcn_cache_ref=-1;\r
+               handle_ref = -1;\r
+               dt = NULL; lineno = flex_fta_lineno; charno = flex_fta_ch;\r
+               is_superagg = false;\r
+               };\r
+\r
+       scalarexp_t(){\r
+               default_init();};\r
+\r
+       scalarexp_t(colref_t *c){\r
+               default_init();\r
+               operator_type = SE_COLREF;\r
+               lhs.colref = c;\r
+       };\r
+\r
+       scalarexp_t(literal_t *l){\r
+               default_init();\r
+               operator_type = SE_LITERAL;\r
+               lhs.litp = l;\r
+       };\r
+\r
+       void convert_to_literal(literal_t *l){\r
+//             default_init();\r
+               if(operator_type != SE_IFACE_PARAM){\r
+                       fprintf(stderr,"INTERNAL ERROR in literal_t::convert_to_literal, operator type isn't SE_IFACE_PARAM.\n");\r
+                       exit(1);\r
+               }\r
+               operator_type = SE_LITERAL;\r
+               lhs.litp = l;\r
+       }\r
+\r
+       scalarexp_t(const char *o, scalarexp_t *operand){\r
+               default_init();\r
+               operator_type = SE_UNARY_OP;\r
+               op = o;\r
+               lhs.scalarp = operand;\r
+       };\r
+\r
+       scalarexp_t(const char *o, scalarexp_t *l_op, scalarexp_t *r_op){\r
+               default_init();\r
+               operator_type = SE_BINARY_OP;\r
+               op = o;\r
+               lhs.scalarp = l_op;\r
+               rhs.scalarp = r_op;\r
+       };\r
+\r
+       scalarexp_t(const char *o, std::vector<scalarexp_t *> op_list){\r
+               default_init();\r
+               operator_type = SE_FUNC;\r
+               op = o;\r
+               param_list = op_list;\r
+       };\r
+\r
+       static scalarexp_t *make_paramless_fcn(const char *o){\r
+               scalarexp_t *ret = new scalarexp_t();\r
+               ret->operator_type = SE_FUNC;\r
+               ret->op = o;\r
+               return(ret);\r
+       };\r
+\r
+       static scalarexp_t *make_star_aggr(const char *ag){\r
+               scalarexp_t *ret = new scalarexp_t();\r
+               ret->operator_type = SE_AGGR_STAR;\r
+               ret->op = ag;\r
+               return(ret);\r
+       };\r
+\r
+       static scalarexp_t *make_se_aggr(const char *ag, scalarexp_t *l_op){\r
+               scalarexp_t *ret = new scalarexp_t();\r
+               ret->operator_type = SE_AGGR_SE;\r
+               ret->op = ag;\r
+               ret->lhs.scalarp = l_op;\r
+               return(ret);\r
+       };\r
+\r
+       static scalarexp_t *make_param_reference(const char *param){\r
+               scalarexp_t *ret = new scalarexp_t();\r
+               ret->operator_type = SE_PARAM;\r
+               ret->op = param;\r
+               return(ret);\r
+       };\r
+\r
+       static scalarexp_t *make_iface_param_reference(ifpref_t *i){\r
+               scalarexp_t *ret = new scalarexp_t();\r
+               ret->operator_type = SE_IFACE_PARAM;\r
+               ret->lhs.ifp = i;\r
+               return(ret);\r
+       };\r
+\r
+\r
+       std::string to_string(){\r
+               if(operator_type == SE_COLREF){\r
+                       return lhs.colref->to_string();\r
+               }\r
+               if(operator_type == SE_LITERAL){\r
+                       return lhs.litp->to_string();\r
+               }\r
+               if(operator_type == SE_UNARY_OP){\r
+                       return op + " (" + lhs.scalarp->to_string() + ")";\r
+               }\r
+               if(operator_type == SE_BINARY_OP){\r
+                       return "(" + lhs.scalarp->to_string() + " " + op + " " + rhs.scalarp->to_string() + ")";\r
+               }\r
+               return("");\r
+       };\r
+\r
+       scalarexp_t *get_left_se(){return lhs.scalarp;  };\r
+       scalarexp_t *get_right_se(){return rhs.scalarp; };\r
+       int get_operator_type(){return operator_type;   };\r
+       std::string & get_op(){return op;       };\r
+       std::string & get_param_name(){return op;       };\r
+//     std::string & get_iface_param_name(){return op; };\r
+       colref_t *get_colref(){return lhs.colref;       };\r
+       ifpref_t *get_ifpref(){return lhs.ifp;  };\r
+       literal_t *get_literal(){return lhs.litp;       };\r
+\r
+       int get_lineno(){return lineno; };\r
+       int get_charno(){return charno; };\r
+\r
+       void set_data_type(data_type *d){dt=d;  };\r
+       data_type *get_data_type(){return dt;   };\r
+       void reset_temporal(){if(dt!=NULL) dt->reset_temporal();}\r
+\r
+       void set_gb_ref(int g){gb_ref = g;      };\r
+       int get_gb_ref(){return (gb_ref);       };\r
+       bool is_gb(){return(gb_ref >= 0);       };\r
+\r
+       void set_aggr_id(int a){aggr_id = a;};\r
+       int get_aggr_ref(){return(aggr_id);     };\r
+\r
+       void set_storage_state(std::string s){storage_state = s;};\r
+       std::string get_storage_state(){return storage_state;};\r
+\r
+       std::vector<scalarexp_t *> get_operands(){return param_list;};\r
+       void set_fcn_id(int f){fcn_id = f;      };\r
+       int get_fcn_id(){return fcn_id; };\r
+\r
+       void set_partial_ref(int p){partial_ref = p;    };\r
+       int get_partial_ref(){return partial_ref;       };\r
+       bool is_partial(){return partial_ref >= 0;      };\r
+\r
+       void set_fcncache_ref(int p){fcn_cache_ref = p; };\r
+       int get_fcncache_ref(){return fcn_cache_ref;    };\r
+       bool is_fcncached(){return fcn_cache_ref >= 0;  };\r
+\r
+       void set_handle_ref(int tf){handle_ref = tf;    };\r
+       int get_handle_ref(){return handle_ref; };\r
+       bool is_handle_ref(){return handle_ref>=0;      };\r
+\r
+       void set_superaggr(bool b){is_superagg=b;};\r
+       bool is_superaggr(){return is_superagg;};\r
+\r
+       void use_decorations_of(scalarexp_t *se){\r
+               if(se->get_data_type() != NULL)\r
+                       dt = se->get_data_type()->duplicate();\r
+               gb_ref = se->gb_ref;\r
+               aggr_id = se->aggr_id;\r
+               fcn_id = se->fcn_id;\r
+               partial_ref = se->partial_ref;\r
+               handle_ref = se->handle_ref;\r
+               lineno = se->lineno;\r
+               charno = se->charno;\r
+               is_superagg = se->is_superagg;\r
+       };\r
+};\r
+\r
+\r
+/*\r
+               A (null terminated) list of scalar expressions.\r
+               Used for\r
+                       selection, scalar_exp_commalist\r
+*/\r
+\r
+class se_list_t{\r
+public:\r
+       std::vector<scalarexp_t *> se_list;\r
+       int lineno, charno;\r
+\r
+       se_list_t(scalarexp_t *s){se_list.push_back(s);\r
+               lineno = flex_fta_lineno; charno = flex_fta_ch;};\r
+\r
+       se_list_t *append(scalarexp_t *s){\r
+                       se_list.push_back(s);\r
+                       return(this);\r
+       };\r
+\r
+       std::string to_string(){\r
+               int i;\r
+               std::string retval;\r
+               for(i=0;i<se_list.size();i++){\r
+                       if(i>0) retval.append(", ");\r
+                       retval.append(se_list[i]->to_string());\r
+               }\r
+               return(retval);\r
+       };\r
+\r
+       std::vector<scalarexp_t *> get_se_list(){return se_list;        };\r
+\r
+\r
+};\r
+\r
+/*\r
+               select_commalist : collect some additional info about\r
+               the selected things -- mostly the name.\r
+*/\r
+\r
+struct select_element{\r
+       scalarexp_t *se;\r
+       std::string name;\r
+\r
+       select_element(){se=NULL; name="";};\r
+       select_element(scalarexp_t *s){se=s; name="";};\r
+       select_element(scalarexp_t *s, std::string n){se=s; name=n;};\r
+};\r
+\r
+class select_list_t{\r
+public:\r
+       std::vector<select_element *> select_list;\r
+       int lineno, charno;\r
+\r
+       select_list_t(){lineno = -1; charno = -1;};\r
+       select_list_t(scalarexp_t *s){select_list.push_back(new select_element(s));\r
+               lineno = flex_fta_lineno; charno = flex_fta_ch;};\r
+       select_list_t(scalarexp_t *s, std::string n){\r
+               select_list.push_back(new select_element(s,n));\r
+               lineno = flex_fta_lineno; charno = flex_fta_ch;\r
+       };\r
+       select_list_t *append(scalarexp_t *s){\r
+                       select_list.push_back(new select_element(s));\r
+                       return(this);\r
+       };\r
+       select_list_t *append(scalarexp_t *s, std::string n){\r
+                       select_list.push_back(new select_element(s,n));\r
+                       return(this);\r
+       };\r
+\r
+       std::string to_string(){\r
+               int i;\r
+               std::string retval;\r
+               for(i=0;i<select_list.size();i++){\r
+                       if(i>0) retval.append(", ");\r
+                       retval.append(select_list[i]->se->to_string());\r
+                       if(select_list[i]->name != "")\r
+                               retval += " AS " + select_list[i]->name;\r
+\r
+               }\r
+               return(retval);\r
+       };\r
+\r
+       std::vector<select_element *> get_select_list(){return select_list;     };\r
+       std::vector<scalarexp_t *> get_select_se_list(){\r
+               std::vector<scalarexp_t *> ret;\r
+               int i;\r
+               for(i=0; i<select_list.size();++i) ret.push_back(select_list[i]->se);\r
+               return ret;\r
+       };\r
+};\r
+\r
+\r
+\r
+#define GB_COLREF 1\r
+#define GB_COMPUTED 2\r
+\r
+class gb_t{\r
+public:\r
+       std::string name;\r
+       std::string table;\r
+       std::string interface;\r
+       scalarexp_t *def;\r
+       int type;\r
+       int lineno, charno;\r
+\r
+       gb_t(const char *field_name){\r
+               interface="";\r
+               name = field_name; table=""; def=NULL; type=GB_COLREF;\r
+               lineno = flex_fta_lineno; charno = flex_fta_ch;\r
+       };\r
+\r
+       gb_t(const char *table_name, const char *field_name){\r
+               interface="";\r
+               name = field_name; table=""; def=NULL; type=GB_COLREF;\r
+               lineno = flex_fta_lineno; charno = flex_fta_ch;\r
+       };\r
+\r
+       gb_t(const char *iface, const char *table_name, const char *field_name){\r
+               interface=iface;\r
+               name = field_name; table=""; def=NULL; type=GB_COLREF;\r
+               lineno = flex_fta_lineno; charno = flex_fta_ch;\r
+       };\r
+\r
+       gb_t( scalarexp_t *s, const char *gname){\r
+               name = gname; table = ""; def = s; type = GB_COMPUTED;\r
+               lineno = flex_fta_lineno; charno = flex_fta_ch;\r
+       };\r
+\r
+       std::string to_string(){\r
+               std::string retval;\r
+               if(type == GB_COLREF){\r
+                       if(table != ""){\r
+                               retval = table;\r
+                               retval.append(".");\r
+                       }\r
+                       retval.append(name);\r
+               }\r
+               if(type == GB_COMPUTED){\r
+                       retval = "(scalarexp) AS ";\r
+                       retval.append(name);\r
+               }\r
+               return(retval);\r
+       };\r
+\r
+       gb_t *duplicate();\r
+\r
+};\r
+\r
+/*\r
+               A (null terminated) list of group by attributes\r
+*/\r
+\r
+class gb_list_t{\r
+public:\r
+       std::vector<gb_t *> gb_list;\r
+       int lineno, charno;\r
+\r
+       gb_list_t(gb_t *g){gb_list.push_back(g);\r
+               lineno = flex_fta_lineno; charno = flex_fta_ch;};\r
+\r
+       gb_list_t *append(gb_t *s){\r
+                       gb_list.push_back(s);\r
+                       return(this);\r
+       };\r
+       gb_list_t(int l, int c) : lineno(l), charno(c){ }\r
+\r
+       std::string to_string(){\r
+               int i;\r
+               std::string retval;\r
+               for(i=0;i<gb_list.size();i++){\r
+                       if(i>0) retval.append(", ");\r
+                       retval.append(gb_list[i]->to_string());\r
+               }\r
+               return(retval);\r
+       };\r
+\r
+       std::vector<gb_t *> get_gb_list(){return gb_list;       };\r
+\r
+       gb_list_t *duplicate(){\r
+               gb_list_t *ret = new gb_list_t(lineno, charno);\r
+               int i;\r
+               for(i=0;i<gb_list.size();++i){\r
+                       ret->append(gb_list[i]->duplicate());\r
+               }\r
+\r
+               return ret;\r
+       }\r
+\r
+\r
+};\r
+\r
+class list_of_gb_list_t{\r
+public:\r
+       std::vector<gb_list_t *> gb_lists;\r
+\r
+       list_of_gb_list_t(gb_list_t *gl){\r
+               gb_lists.push_back(gl);\r
+       }\r
+\r
+       list_of_gb_list_t *append(gb_list_t *gl){\r
+               gb_lists.push_back(gl);\r
+               return this;\r
+       }\r
+};\r
+\r
+\r
+enum extended_gb_type {no_egb_type, gb_egb_type, rollup_egb_type,\r
+                       cube_egb_type, gsets_egb_type};\r
+class extended_gb_t{\r
+public:\r
+\r
+       extended_gb_type type;\r
+       gb_t *gb;\r
+       std::vector<gb_list_t *> gb_lists;\r
+\r
+       extended_gb_t(){\r
+               gb = NULL;\r
+               type = no_egb_type;\r
+       }\r
+\r
+       ~extended_gb_t(){\r
+       }\r
+\r
+       static extended_gb_t *create_from_gb(gb_t *g){\r
+               extended_gb_t *ret  = new extended_gb_t();\r
+               ret->type = gb_egb_type;\r
+               ret->gb = g;\r
+               return ret;\r
+       }\r
+\r
+       static extended_gb_t *extended_create_from_rollup(gb_list_t *gl){\r
+               extended_gb_t *ret  = new extended_gb_t();\r
+               ret->type = rollup_egb_type;\r
+               ret->gb_lists.push_back(gl);\r
+               return ret;\r
+       }\r
+\r
+       static extended_gb_t *extended_create_from_cube(gb_list_t *gl){\r
+               extended_gb_t *ret  = new extended_gb_t();\r
+               ret->type = cube_egb_type;\r
+               ret->gb_lists.push_back(gl);\r
+               return ret;\r
+       }\r
+\r
+       static extended_gb_t *extended_create_from_gsets(list_of_gb_list_t *lgl){\r
+               extended_gb_t *ret  = new extended_gb_t();\r
+               ret->type = gsets_egb_type;\r
+               ret->gb_lists = lgl->gb_lists;\r
+               return ret;\r
+       }\r
+\r
+       extended_gb_t *duplicate(){\r
+               extended_gb_t *ret = new extended_gb_t();\r
+               ret->type = type;\r
+               if(gb != NULL)\r
+                       ret->gb = gb->duplicate();\r
+               int i;\r
+               for(i=0;i<gb_lists.size();++i){\r
+                       ret->gb_lists.push_back(gb_lists[i]->duplicate());\r
+               }\r
+               return ret;\r
+       }\r
+\r
+\r
+       std::string to_string(){\r
+               std::string ret;\r
+               int i;\r
+\r
+               switch(type){\r
+               case no_egb_type:\r
+                       return "Error, undefined extended gb type.";\r
+               case gb_egb_type:\r
+                       return gb->to_string();\r
+               case rollup_egb_type:\r
+                       return "ROLLUP("+gb_lists[0]->to_string()+")";\r
+               case cube_egb_type:\r
+                       return "CUBE("+gb_lists[0]->to_string()+")";\r
+               case gsets_egb_type:\r
+                       ret = "GROUPING_SETS(";\r
+                       for(i=0;i<gb_lists.size();++i){\r
+                               if(i>0) ret+=", ";\r
+                               ret += "(" +gb_lists[i]->to_string()+")";\r
+                       }\r
+                       ret += ")";\r
+                       return ret;\r
+               default:\r
+                       break;\r
+               }\r
+               return "Error, unknown extended gb type.";\r
+       }\r
+\r
+};\r
+\r
+class extended_gb_list_t{\r
+public:\r
+       std::vector<extended_gb_t *> gb_list;\r
+       int lineno, charno;\r
+\r
+       extended_gb_list_t(extended_gb_t *g){gb_list.push_back(g);\r
+               lineno = flex_fta_lineno; charno = flex_fta_ch;};\r
+\r
+       extended_gb_list_t *append(extended_gb_t *s){\r
+                       gb_list.push_back(s);\r
+                       return(this);\r
+       };\r
+\r
+       std::string to_string(){\r
+               int i;\r
+               std::string retval;\r
+               for(i=0;i<gb_list.size();i++){\r
+                       if(i>0) retval.append(", ");\r
+                       retval.append(gb_list[i]->to_string());\r
+               }\r
+               return(retval);\r
+       };\r
+\r
+       std::vector<extended_gb_t *> get_gb_list(){return gb_list;      };\r
+};\r
+\r
+\r
+\r
+/*\r
+               A predicate tree.  Structure is similar to\r
+               a scalar expression tree but the type is always boolean.\r
+               Used by\r
+                       opt_where_clause, where_clause, opt_having_clause,\r
+                       search_condition, predicate, comparison_predicate, repl_predicate\r
+*/\r
+\r
+#define PRED_COMPARE 1\r
+#define PRED_UNARY_OP 2\r
+#define PRED_BINARY_OP 3\r
+#define PRED_FUNC 4\r
+#define PRED_IN 5\r
+\r
+class  predicate_t{\r
+public:\r
+       int operator_type;\r
+       std::string op;\r
+       union {\r
+               predicate_t *predp;\r
+               scalarexp_t *sexp;\r
+       }lhs;\r
+       union {\r
+               predicate_t *predp;\r
+               scalarexp_t *sexp;\r
+               literal_list_t *ll;\r
+       }rhs;\r
+       std::vector<scalarexp_t *> param_list;  /// pred fcn params\r
+       int fcn_id;                                                             /// external pred fcn id\r
+       int combinable_ref;\r
+       bool is_sampling_fcn;\r
+       int lineno, charno;\r
+\r
+       predicate_t(scalarexp_t *s, literal_list_t *litl){\r
+               operator_type = PRED_IN;\r
+               op = "in";\r
+               lhs.sexp = s;\r
+               rhs.ll = litl;\r
+               fcn_id = -1;\r
+               combinable_ref = -1;\r
+               lineno = flex_fta_lineno; charno = flex_fta_ch;\r
+       };\r
+\r
+       predicate_t(scalarexp_t *s, std::vector<literal_t *> litv){\r
+               operator_type = PRED_IN;\r
+               op = "in";\r
+               lhs.sexp = s;\r
+               rhs.ll = new literal_list_t(litv);\r
+               fcn_id = -1;\r
+               combinable_ref = -1;\r
+               lineno = flex_fta_lineno; charno = flex_fta_ch;\r
+       };\r
+\r
+\r
+       predicate_t(scalarexp_t *l_op, const char *o, scalarexp_t *r_op){\r
+               operator_type = PRED_COMPARE;\r
+               op = o;\r
+               lhs.sexp = l_op;\r
+               rhs.sexp = r_op;\r
+               fcn_id = -1;\r
+               combinable_ref = -1;\r
+               lineno = flex_fta_lineno; charno = flex_fta_ch;\r
+       };\r
+\r
+       predicate_t(const char *o, predicate_t *p){\r
+               operator_type = PRED_UNARY_OP;\r
+               op = o;\r
+               lhs.predp = p;\r
+               fcn_id = -1;\r
+               combinable_ref = -1;\r
+               lineno = flex_fta_lineno; charno = flex_fta_ch;\r
+       };\r
+\r
+       predicate_t(const char *o, predicate_t *l_p, predicate_t *r_p){\r
+               operator_type = PRED_BINARY_OP;\r
+               op = o;\r
+               lhs.predp = l_p;\r
+               rhs.predp = r_p;\r
+               fcn_id = -1;\r
+               combinable_ref = -1;\r
+               lineno = flex_fta_lineno; charno = flex_fta_ch;\r
+       };\r
+\r
+       predicate_t(const char *o, std::vector<scalarexp_t *> op_list){\r
+               operator_type = PRED_FUNC;\r
+               op = o;\r
+               param_list = op_list;\r
+               fcn_id = -1;\r
+               combinable_ref = -1;\r
+               lineno = flex_fta_lineno; charno = flex_fta_ch;\r
+       };\r
+\r
+       predicate_t(const char *o){\r
+               op = o;\r
+               fcn_id = -1;\r
+               combinable_ref = -1;\r
+               lineno = flex_fta_lineno; charno = flex_fta_ch;\r
+       };\r
+\r
+\r
+       static predicate_t *make_paramless_fcn_predicate(const char *o){\r
+               predicate_t *ret = new predicate_t(o);\r
+               ret->operator_type = PRED_FUNC;\r
+               ret->fcn_id = -1;\r
+               ret->combinable_ref = -1;\r
+               return(ret);\r
+       };\r
+\r
+       std::string to_string(){\r
+               if(operator_type == PRED_IN){\r
+                       return( lhs.sexp->to_string() + " " + op + " [ " + rhs.ll->to_string() +" ]");\r
+               }\r
+               if(operator_type == PRED_COMPARE){\r
+                       return( lhs.sexp->to_string() + " " + op + " " + rhs.sexp->to_string() );\r
+               }\r
+               if(operator_type == PRED_UNARY_OP){\r
+                       return( op + " (" + lhs.predp->to_string() + ")" );\r
+               }\r
+               if(operator_type == PRED_BINARY_OP){\r
+                       return( "(" + lhs.predp->to_string() + " " + op + " " + rhs.predp->to_string() + ")" );\r
+               }\r
+               if(operator_type == PRED_FUNC){\r
+                       std::string ret = op + "[ ";\r
+                       int i;\r
+                       for(i=0;i<param_list.size();++i){\r
+                               if(i>0) ret += ", ";\r
+                               ret += param_list[i]->to_string();\r
+                       }\r
+                       ret += "] ";\r
+                       return(ret);\r
+               }\r
+               return("");\r
+       };\r
+\r
+       std::vector<scalarexp_t *> get_op_list(){return param_list;     };\r
+       int get_operator_type(){return operator_type;   };\r
+       std::string get_op(){return op; };\r
+       int get_lineno(){return lineno; };\r
+       int get_charno(){return charno; };\r
+       int get_combinable_ref(){return combinable_ref;}\r
+       void set_combinable_ref(int f){combinable_ref = f;};\r
+       predicate_t *get_left_pr(){return(lhs.predp);   };\r
+       predicate_t *get_right_pr(){return(rhs.predp);  };\r
+       scalarexp_t *get_left_se(){return(lhs.sexp);    };\r
+       scalarexp_t *get_right_se(){return(rhs.sexp);   };\r
+       std::vector<literal_t *> get_lit_vec(){return(rhs.ll->get_literal_vector());            };\r
+\r
+       void swap_scalar_operands(){\r
+               if(operator_type != PRED_COMPARE){\r
+                       fprintf(stderr,"INTERNAL ERROR: swap_scalar_operands called on predicate of type %d\n",operator_type);\r
+                       exit(1);\r
+               }\r
+               scalarexp_t *tmp;\r
+               tmp = lhs.sexp; lhs.sexp = rhs.sexp; rhs.sexp = tmp;\r
+               if(op == ">"){op = "<"; return;}\r
+               if(op == ">="){op = "<="; return;}\r
+               if(op == "<"){op = ">"; return;}\r
+               if(op == "<="){op = ">="; return;}\r
+       };\r
+       void set_fcn_id(int i){fcn_id = i;};\r
+       int get_fcn_id(){return fcn_id;};\r
+\r
+\r
+};\r
+\r
+\r
+/*\r
+               A structure that holds the components of a query.\r
+               This is the root type.\r
+               Used by manipulative_statement, select_statement, table_exp\r
+*/\r
+\r
+#define SELECT_QUERY 1\r
+#define MERGE_QUERY 2\r
+\r
+class table_exp_t{\r
+public:\r
+  int query_type;                                      // roughly, the type of the query.\r
+  ss_map nmap;                                         //      DEFINE block\r
+  std::vector<var_pair_t *> query_params;      // PARAM block (uninterpreted)\r
+  select_list_t *sl;                                   // SELECT\r
+  tablevar_list_t *fm;                                 // FROM\r
+  predicate_t *wh;                                     // WHERE\r
+  predicate_t *hv;                                     // HAVING\r
+  predicate_t *cleaning_when;          // CLEANING WHEN\r
+  predicate_t *cleaning_by;                    // CLEANING BY\r
+  predicate_t *closing_when;           // CLOSING WHEN\r
+  std::vector<extended_gb_t *> gb;                     // GROUP BY\r
+  std::vector<colref_t *> mergevars;           // merge colrefs.\r
+  std::vector<colref_t *> supergb;     // supergroup.\r
+  scalarexp_t *slack;                          // merge slack\r
+  bool exernal_visible;                                // true iff. it can be subscribed to.\r
+  int lineno, charno;\r
+\r
+\r
+  table_exp_t(tablevar_list_t *f, predicate_t *p, extended_gb_list_t *g, colref_list_t *sg, predicate_t *h, predicate_t *cw, predicate_t *cb, predicate_t *closew)\r
+               {fm = f; wh = p; hv = h;\r
+               cleaning_when = cw; cleaning_by = cb;\r
+               closing_when = closew;\r
+               if(g != NULL)\r
+                       gb = g->gb_list;\r
+               if(sg != NULL)\r
+                       supergb = sg->get_clist();\r
+               slack = NULL;\r
+               query_type = SELECT_QUERY;\r
+               exernal_visible = true;\r
+               lineno = flex_fta_lineno; charno = flex_fta_ch;\r
+       };\r
+\r
+  table_exp_t(colref_list_t *mv, tablevar_list_t *f)\r
+               {fm = f; mergevars=mv->get_clist();\r
+                slack = NULL;\r
+               query_type = MERGE_QUERY;\r
+               exernal_visible = true;\r
+               lineno = flex_fta_lineno; charno = flex_fta_ch;\r
+       };\r
+\r
+  table_exp_t(colref_list_t *mv, scalarexp_t *sl, tablevar_list_t *f)\r
+               {fm = f; mergevars=mv->get_clist();\r
+                slack = sl;\r
+               query_type = MERGE_QUERY;\r
+               exernal_visible = true;\r
+               lineno = flex_fta_lineno; charno = flex_fta_ch;\r
+       };\r
+\r
+//                     Figure out the temporal merge field at analyze_fta time.\r
+       static table_exp_t *make_deferred_merge(std::vector<std::string> src_tbls){\r
+               table_exp_t *ret = new table_exp_t();\r
+               ret->query_type = MERGE_QUERY;\r
+               ret->fm = new tablevar_list_t();\r
+               int t;\r
+               for(t=0;t<src_tbls.size();++t){\r
+                       ret->fm->append_table(new tablevar_t(src_tbls[t].c_str()));\r
+               }\r
+               ret->lineno = 0; ret->charno = 0;\r
+               return ret;\r
+       }\r
+\r
+       table_exp_t(){\r
+               fm = NULL; sl = NULL; wh=NULL; hv=NULL;\r
+               slack = NULL;\r
+               cleaning_when=NULL; cleaning_by = NULL;\r
+               closing_when = NULL;\r
+               exernal_visible = true;\r
+       };\r
+\r
+  table_exp_t *add_selection(select_list_t *s){\r
+         sl = s;\r
+         return(this);\r
+       };\r
+\r
+       void add_nmap(var_defs_t *vd){\r
+               int n;\r
+               if(vd != NULL){\r
+                       for(n=0;n<vd->size();++n){\r
+                               nmap[vd->get_name(n)] = vd->get_def(n);\r
+//printf("Adding (%s, %s) to name map.\n",vd->get_name(n).c_str(), vd->get_def(n).c_str());\r
+                       }\r
+               }\r
+       };\r
+\r
+       void add_param_list(var_defs_t *vd){\r
+               int n;\r
+               if(vd != NULL){\r
+                       query_params = vd->get_nvec();\r
+               }\r
+       };\r
+\r
+\r
+       std::string to_string(){\r
+               std::string retval;\r
+               if(sl != NULL){\r
+                       retval.append("Select " + sl->to_string() + "\n");\r
+               }\r
+               if(fm != NULL){\r
+                       retval.append("From " + fm->to_string() + "\n");\r
+               }\r
+               if(wh != NULL){\r
+                       retval.append("Where "+ wh->to_string() + "\n");\r
+               }\r
+               if(hv != NULL){\r
+                       retval.append("Having "+hv->to_string() + "\n");\r
+               }\r
+               return(retval);\r
+               };\r
+\r
+       tablevar_list_t *get_from(){return fm;  };\r
+       select_list_t *get_select(){return sl;  };\r
+       std::vector<select_element *> get_sl_vec(){return sl->get_select_list();        };\r
+       predicate_t *get_where(){return wh;     };\r
+       predicate_t *get_having(){return hv;    };\r
+       predicate_t *get_cleaning_by(){return cleaning_by;      };\r
+       predicate_t *get_cleaning_when(){return cleaning_when;  };\r
+       predicate_t *get_closing_when(){return closing_when;    };\r
+       std::vector<extended_gb_t *> get_groupby(){return(gb);  };\r
+    std::vector<colref_t *> get_supergb(){return supergb;};\r
+\r
+       ss_map get_name_map(){return nmap;};\r
+\r
+       bool name_exists(std::string nm){\r
+               return(nmap.count(nm) > 0);\r
+       };\r
+\r
+       std::string get_val_of_name(std::string nm){\r
+               if(nmap.count(nm) == 0) return("");\r
+               else return nmap[nm];\r
+       };\r
+\r
+       void set_val_of_name(const std::string n, const std::string v){\r
+               nmap[n]=v;\r
+       }\r
+\r
+       void set_visible(bool v){exernal_visible=v;};\r
+       bool get_visible(){return exernal_visible;};\r
+};\r
+\r
+struct query_list_t{\r
+       std::vector<table_exp_t *> qlist;\r
+\r
+       query_list_t(table_exp_t *t){\r
+               qlist.push_back(t);\r
+       };\r
+       query_list_t *append(table_exp_t *t){\r
+               qlist.push_back(t);\r
+               return(this);\r
+       };\r
+};\r
+\r
+\r
+#define TABLE_PARSE 1\r
+#define QUERY_PARSE 2\r
+#define STREAM_PARSE 3\r
+\r
+struct fta_parse_t{\r
+       query_list_t *parse_tree_list;\r
+       table_exp_t *fta_parse_tree;\r
+       table_list *tables;\r
+       int parse_type;\r
+};\r
+\r
+\r
+\r
+\r
+\r
+       extern table_exp_t *fta_parse_tree;\r
+\r
+\r
+\r
+\r
+\r
+#endif\r
+\r