anchor.diff:      | simpleExpr
       ;
       
  -simpleExpr:
  -    functionCall
  +simpleExpr
  +    : functionCall
       | liter
       | ID
       | simpleExpr collateClause
  
positive.code:     | NOT NULL
      ;
  
  primaryKey:
  	PRIMARY KEY
  	;
  
  matchNone:
      'Default does not match anything'
      ;
      
  idList:
      LEFT_PAREN ID (COMMA  ID)* RIGHT_PAREN
      ;
  
  rangeClause:
      NUMBER (COMMA  NUMBER)* 
      | NUMBER OFFSET NUMBER
      ;
  
  tableNamesWithParen:
      LEFT_PAREN tableNames RIGHT_PAREN
      ;
  
  tableNames:
      tableName (COMMA tableName)*
      ;
  
  columnNamesWithParen:
      LEFT_PAREN columnNames RIGHT_PAREN
      ;
  
  columnNames:
      columnName (COMMA columnName)*
      ;
      
  columnList:
      LEFT_PAREN columnNames RIGHT_PAREN
      ;
  
  indexNames:
      indexName (COMMA indexName)*
      ;
  
  rowNames:
      rowName (COMMA rowName)*
      ;
      
  bitExprs:
       bitExpr (COMMA bitExpr)*
       ;
  
  exprs:
       expr (COMMA expr)*
       ;
   
  exprsWithParen:
      LEFT_PAREN exprs RIGHT_PAREN
      ;
  
  //https://dev.mysql.com/doc/refman/8.0/en/expressions.html
  expr:
      expr OR expr
      | expr OR_SYM  expr
      | expr XOR expr
      | expr AND expr
  
negative.code:     |privateExprOfDb
      ;
  
  functionCall
      : ID LEFT_PAREN( bitExprs?) RIGHT_PAREN
      ;    
   
  privateExprOfDb
      : matchNone
      ;
       
  liter
      : QUESTION
      | NUMBER
      | TRUE 
      | FALSE
      | NULL
      | LEFT_BRACE ID STRING RIGHT_BRACE
      | HEX_DIGIT
      | ID? STRING  collateClause?
      | (DATE | TIME |TIMESTAMP) STRING
      | ID? BIT_NUM collateClause?
      ; 
  
  subquery
      : matchNone
      ;
  
  collateClause
      : matchNone
      ;
  
  orderByClause
      : ORDER BY groupByItem (COMMA groupByItem)*
      ;
      
  groupByItem
      : (columnName | NUMBER |expr)  (ASC|DESC)?
      ;