anchor.diff:  #include "cql3/sets.hh"
   #include "cql3/lists.hh"
   #include "cql3/type_cast.hh"
  +#include "cql3/tuples.hh"
   #include "cql3/functions/function_name.hh"
   #include "cql3/functions/function_call.hh"
   #include "core/sstring.hh"
  
positive.code: comparatorType returns [shared_ptr<cql3_type::raw> t]
      : n=native_type     { $t = cql3_type::raw::from(n); }
      | c=collection_type { $t = c; }
  #if 0
      | tt=tuple_type     { $t = tt; }
      | id=userTypeName   { $t = CQL3Type.Raw.userType(id); }
      | K_FROZEN '<' f=comparatorType '>'
        {
  
negative.code:     // We don't allow empty literals because that conflicts with sets/maps and is currently useless since we don't allow empty user types
      : '{' k1=ident ':' v1=term { m.put(k1, v1); } ( ',' kn=ident ':' vn=term { m.put(kn, vn); } )* '}'
      ;
  #endif
  
  tupleLiteral returns [shared_ptr<cql3::tuples::literal> tt]
      @init{ std::vector<shared_ptr<cql3::term::raw>> l; }
      @after{ $tt = ::make_shared<cql3::tuples::literal>(std::move(l)); }
      : '(' t1=term { l.push_back(t1); } ( ',' tn=term { l.push_back(tn); } )* ')'
      ;
  
  value returns [::shared_ptr<cql3::term::raw> value]
      : c=constant           { $value = c; }
      | l=collectionLiteral  { $value = l; }
  #if 0
      | u=usertypeLiteral    { $value = u; }
  #endif
      | t=tupleLiteral       { $value = t; }
      | K_NULL               { $value = cql3::constants::NULL_LITERAL; }
      | ':' id=ident         { $value = new_bind_variables(id); }
      | QMARK                { $value = new_bind_variables(shared_ptr<cql3::column_identifier>{}); }
  