anchor.diff:      : K_USING K_TIMESTAMP ts=intValue { attrs->timestamp = ts; }
       ;
   
  -#if 0
   /**
    * BEGIN BATCH
    *   UPDATE <CF> SET name1 = value1 WHERE KEY = keyname1;
  
positive.code:  *   ...
   * APPLY BATCH
   */
  batchStatement returns [BatchStatement.Parsed expr]
      @init {
          BatchStatement.Type type = BatchStatement.Type.LOGGED;
          List<ModificationStatement.Parsed> statements = new ArrayList<ModificationStatement.Parsed>();
          Attributes.Raw attrs = new Attributes.Raw();
      }
      : K_BEGIN
        ( K_UNLOGGED { type = BatchStatement.Type.UNLOGGED; } | K_COUNTER { type = BatchStatement.Type.COUNTER; } )?
        K_BATCH ( usingClause[attrs] )?
            ( s=batchStatementObjective ';'? { statements.add(s); } )*
        K_APPLY K_BATCH
        {
            return new BatchStatement.Parsed(type, attrs, statements);
        }
      ;
  
  batchStatementObjective returns [ModificationStatement.Parsed statement]
      : i=insertStatement  { $statement = i; }
      | u=updateStatement  { $statement = u; }
      | d=deleteStatement  { $statement = d; }
      ;
  
  createAggregateStatement returns [CreateAggregateStatement expr]
      @init {
          boolean orReplace = false;
  
negative.code:     : st1= selectStatement             { $stmt = st1; }
      | st2= insertStatement             { $stmt = st2; }
      | st3= updateStatement             { $stmt = st3; }
      | st4= batchStatement              { $stmt = st4; }
      | st5= deleteStatement             { $stmt = st5; }
      | st6= useStatement                { $stmt = st6; }
  #if 0
  