anchor.diff:    :RETURNS TABLE
     (WITH function_option (',' function_option)*)?
     AS?
  -  RETURN select_statement 
  +  RETURN select_statement
     ;
   
   func_body_returns_table
  
positive.code:     | drop_view
      ;
  
  // Control-of-Flow Language: https://msdn.microsoft.com/en-us/library/ms174290.aspx
  // Labels for better AST traverse.
  cfl_statement
      // https://msdn.microsoft.com/en-us/library/ms190487.aspx
      : BEGIN ';'? sql_clauses? END ';'?               #block_statement
      // https://msdn.microsoft.com/en-us/library/ms181271.aspx
      | BREAK ';'?                                     #break_statement
      // https://msdn.microsoft.com/en-us/library/ms174366.aspx
      | CONTINUE ';'?                                  #continue_statement
      // https://msdn.microsoft.com/en-us/library/ms180188.aspx
      | GOTO id ';'?                                   #goto_statement
      | id ':' ';'?                                    #goto_statement
      // https://msdn.microsoft.com/en-us/library/ms182717.aspx
      | IF search_condition sql_clause (ELSE sql_clause)? ';'?  #if_statement
      // https://msdn.microsoft.com/en-us/library/ms174998.aspx
      | RETURN expression? ';'?                        #return_statement
      // https://msdn.microsoft.com/en-us/library/ee677615.aspx
      | THROW (
        error_number=(DECIMAL | LOCAL_ID) ',' message=(STRING | LOCAL_ID) ','
        state=(DECIMAL | LOCAL_ID))? ';'?              #throw_statement
      // https://msdn.microsoft.com/en-us/library/ms175976.aspx
      | BEGIN TRY ';'? try_clauses=sql_clauses? END TRY ';'?
        BEGIN CATCH ';'? catch_clauses=sql_clauses? END CATCH ';'?                                          #try_catch_statement
      // https://msdn.microsoft.com/en-us/library/ms187331.aspx
      | WAITFOR receive_statement? ','? ((DELAY | TIME | TIMEOUT) time)?  expression? ';'?                  #waitfor_statement
      // https://msdn.microsoft.com/en-us/library/ms178642.aspx
      | WHILE search_condition (sql_clause | BREAK ';'? | CONTINUE ';'?)                                    #while_statement
      // https://msdn.microsoft.com/en-us/library/ms176047.aspx.
      | PRINT expression ';'?                                                                               #print_statement
      // https://msdn.microsoft.com/en-us/library/ms178592.aspx
      | RAISERROR '(' msg=(DECIMAL | STRING | LOCAL_ID) ',' severity=constant_LOCAL_ID ','
          state=constant_LOCAL_ID (',' constant_LOCAL_ID)* ')' (WITH (LOG | SETERROR))? ';'?       #raiseerror_statementb
      ;
  
  empty_statement
  
negative.code: 
  // Expression.
  
  // https://docs.microsoft.com/en-us/sql/t-sql/language-elements/expressions-transact-sql
  // Operator precendence: https://docs.microsoft.com/en-us/sql/t-sql/language-elements/operator-precedence-transact-sql
  expression
      : primitive_expression
      | function_call | expression COLLATE id
      | case_expression
      | full_column_name
      | bracket_expression
      | unary_operator_expression
      | expression binary_operator_expression
      | expression assignment_operator expression
      | over_clause
      ;
  
  primitive_expression
      : DEFAULT | NULL | LOCAL_ID | constant
      ;
  
  // https://docs.microsoft.com/en-us/sql/t-sql/language-elements/case-transact-sql
  case_expression
      : CASE caseExpr=expression switch_section+ (ELSE elseExpr=expression)? END
      | CASE switch_search_condition_section+ (ELSE elseExpr=expression)? END
      ;
  
  unary_operator_expression
      : '~' expression
      | op=('+' | '-') expression
      ;
  
  binary_operator_expression
      : op=('*' | '/' | '%') expression
      | op=('+' | '-' | '&' | '^' | '|') expression
      | comparison_operator expression
      ;
  
  bracket_expression
      : '(' expression ')' | '(' subquery ')'
      ;
  
  constant_expression
  