anchor.diff:      : COLLATE EQ_? (STRING_ | ignoredIdentifier_)
       ;
   
  -userDefinedFunction_
  -    : userDefinedfunctionName_ LP_ (expr (COMMA_ expr)* | ASTERISK_)? RP_
  -    ;
  -
  -userDefinedfunctionName_
  -    : identifier_ | IF | CURRENT_TIMESTAMP | LOCALTIME | LOCALTIMESTAMP | NOW | REPLACE | CAST | CONVERT | POSITION | CHAR | TRIM
  -    ;
  -
   ignoredIdentifier_
       : identifier_ (DOT_ identifier_)?
       ;
  
positive.code:     | literal
      | columnName
      | simpleExpr COLLATE (STRING_ | identifier_)
      | variable
      | simpleExpr OR_ simpleExpr
      | (PLUS_ | MINUS_ | TILDE_ | NOT_ | BINARY) simpleExpr
      | ROW? LP_ expr (COMMA_ expr)* RP_
  
negative.code:     ;
  
  weightStringFunction_
      : WEIGHT_STRING LP_ expr (AS dataType)? levelClause_? RP_
      ;
  
  levelClause_
      : LEVEL (levelInWeightListElement_ (COMMA_ levelInWeightListElement_)* | NUMBER_ MINUS_ NUMBER_)
      ;
  
  levelInWeightListElement_
      : NUMBER_ (ASC | DESC)? REVERSE?
      ;
  
  regularFunction_
      : regularFunctionName_ LP_ (expr (COMMA_ expr)* | ASTERISK_)? RP_
      ;
  
  regularFunctionName_
      : identifier_ | IF | CURRENT_TIMESTAMP | LOCALTIME | LOCALTIMESTAMP | NOW | REPLACE
      ;
  
  matchExpression_
  