Konstantin Orlov created IGNITE-20227:
-----------------------------------------

             Summary: Sql. Upgrade JavaCC version
                 Key: IGNITE-20227
                 URL: https://issues.apache.org/jira/browse/IGNITE-20227
             Project: Ignite
          Issue Type: Improvement
          Components: sql
            Reporter: Konstantin Orlov


After IGNITE-20196, the version of JavaCC was decreased from 4.2 to 4.0. The 
reason is changes in generated {{jj_add_error_token}} method:

{code:java}
// generated by JavaCC 4.0
  private void jj_add_error_token(int kind, int pos) {
    if (pos >= 100) return;
    if (pos == jj_endpos + 1) {
      jj_lasttokens[jj_endpos++] = kind;
    } else if (jj_endpos != 0) {
      jj_expentry = new int[jj_endpos];
      for (int i = 0; i < jj_endpos; i++) {
        jj_expentry[i] = jj_lasttokens[i];
      }
      boolean exists = false;
      for (java.util.Enumeration e = jj_expentries.elements(); 
e.hasMoreElements();) {
        int[] oldentry = (int[])(e.nextElement());
        if (oldentry.length == jj_expentry.length) {
          exists = true;
          for (int i = 0; i < jj_expentry.length; i++) {
            if (oldentry[i] != jj_expentry[i]) {
              exists = false;
              break;
            }
          }
          if (exists) break;
        }
      }
      if (!exists) jj_expentries.addElement(jj_expentry);
      if (pos != 0) jj_lasttokens[(jj_endpos = pos) - 1] = kind;
    }
  }

// generated by JavaCC 4.2
  private void jj_add_error_token(int kind, int pos) {
    if (pos >= 100) return;
    if (pos == jj_endpos + 1) {
      jj_lasttokens[jj_endpos++] = kind;
    } else if (jj_endpos != 0) {
      jj_expentry = new int[jj_endpos];
      for (int i = 0; i < jj_endpos; i++) {
        jj_expentry[i] = jj_lasttokens[i];
      }
      jj_entries_loop: for (java.util.Iterator it = jj_expentries.iterator(); 
it.hasNext();) {
        int[] oldentry = (int[])(it.next());
        if (oldentry.length == jj_expentry.length) {
          for (int i = 0; i < jj_expentry.length; i++) {
            if (oldentry[i] != jj_expentry[i]) {
              continue jj_entries_loop;
            }
          }
          jj_expentries.add(jj_expentry);
          break jj_entries_loop;
        }
      }
      if (pos != 0) jj_lasttokens[(jj_endpos = pos) - 1] = kind;
    }
  }
{code}

In JavaCC 4.0, if collection {{jj_expentries}} is empty, all visited tokes 
(represented by {{jj_expentry}}) will be added to these collection. In JavaCC 
4.2, the collection {{jj_expentries}} is updated only if it is _not_ empty.

This change broke 
{{org.apache.calcite.sql.parser.SqlAbstractParserImpl.Metadata}}, because 
initialisation of meta is relied on properly filled {{jj_expentries}} 
collection. Besides, this affects generation of parsing exception: without 
{{jj_expentries}}, only tokens reachable by LA(1) will be presented in possible 
options (currently, default LA is set to 2).

Let's figure out what the benefits would be with upgrading to the most recent 
version (7.0.12 at the time the ticket was created), and if any, make an 
upgrade plan.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to