anchor.diff:          return s;
       }
   
  -    cql3::expr::bind_variable new_bind_variables(shared_ptr<cql3::column_identifier> name)
  +    bind_variable new_bind_variables(shared_ptr<cql3::column_identifier> name)
       {
  -        auto marker = cql3::expr::bind_variable{cql3::expr::bind_variable::shape_type::scalar, _bind_variables.size()};
  +        auto marker = bind_variable{bind_variable::shape_type::scalar, _bind_variables.size()};
           _bind_variables.push_back(name);
           return marker;
       }
   
  -    cql3::expr::bind_variable new_in_bind_variables(shared_ptr<cql3::column_identifier> name) {
  -        auto marker = cql3::expr::bind_variable{cql3::expr::bind_variable::shape_type::scalar_in, _bind_variables.size()};
  +    bind_variable new_in_bind_variables(shared_ptr<cql3::column_identifier> name) {
  +        auto marker = bind_variable{bind_variable::shape_type::scalar_in, _bind_variables.size()};
           _bind_variables.push_back(std::move(name));
           return marker;
       }
   
  -    cql3::expr::bind_variable new_tuple_bind_variables(shared_ptr<cql3::column_identifier> name)
  +    bind_variable new_tuple_bind_variables(shared_ptr<cql3::column_identifier> name)
       {
  -        auto marker = cql3::expr::bind_variable{cql3::expr::bind_variable::shape_type::tuple, _bind_variables.size()};
  +        auto marker = bind_variable{bind_variable::shape_type::tuple, _bind_variables.size()};
           _bind_variables.push_back(std::move(name));
           return marker;
       }
   
  -    cql3::expr::bind_variable new_tuple_in_bind_variables(shared_ptr<cql3::column_identifier> name)
  +    bind_variable new_tuple_in_bind_variables(shared_ptr<cql3::column_identifier> name)
       {
  -        auto marker = cql3::expr::bind_variable{cql3::expr::bind_variable::shape_type::tuple_in, _bind_variables.size()};
  +        auto marker = bind_variable{bind_variable::shape_type::tuple_in, _bind_variables.size()};
           _bind_variables.push_back(std::move(name));
           return marker;
       }
  
positive.code:     : us=unaliasedSelector (K_AS c=ident { alias = c; })? { $s = ::make_shared<raw_selector>(us, alias); }
      ;
  
  unaliasedSelector returns [cql3::expr::expression s]
      @init { cql3::expr::expression tmp; }
      :  ( c=cident                                  { tmp = cql3::expr::unresolved_identifier{std::move(c)}; }
         | K_COUNT '(' countArgument ')'             { tmp = make_count_rows_function_expression(); }
         | K_WRITETIME '(' c=cident ')'              { tmp = cql3::expr::column_mutation_attribute{cql3::expr::column_mutation_attribute::attribute_kind::writetime,
                                                                                                cql3::expr::unresolved_identifier{std::move(c)}}; }
         | K_TTL       '(' c=cident ')'              { tmp = cql3::expr::column_mutation_attribute{cql3::expr::column_mutation_attribute::attribute_kind::ttl,
                                                                                                cql3::expr::unresolved_identifier{std::move(c)}}; }
         | f=functionName args=selectionFunctionArgs { tmp = cql3::expr::function_call{std::move(f), std::move(args)}; }
         | K_CAST      '(' arg=unaliasedSelector K_AS t=native_type ')'  { tmp = cql3::expr::cast{std::move(arg), std::move(t)}; }
         )
         ( '.' fi=cident { tmp = cql3::expr::field_selection{std::move(tmp), std::move(fi)}; } )*
      { $s = tmp; }
      ;
  
  selectionFunctionArgs returns [std::vector<cql3::expr::expression> a]
      : '(' ')'
      | '(' s1=unaliasedSelector { a.push_back(std::move(s1)); }
            ( ',' sn=unaliasedSelector { a.push_back(std::move(sn)); } )*
  
negative.code:     | '(' relation[$clauses] ')'
      ;
  
  inMarker returns [expression marker]
      : QMARK { $marker = new_in_bind_variables(nullptr); }
      | ':' name=ident { $marker = new_in_bind_variables(name); }
      ;
  