Uploaded image for project: 'Debezium'
  1. Debezium
  2. DBZ-2641

Antlr DDL parser fails to interpret BLOB([size])

    XMLWordPrintable

Details

    Description

      A mysql connector is pointed to a `db` with a whitelisted database `A`. The initial snapshot and transition to binlog reader works fine. Then we issue the following DDL statement to the `db`:

      CREATE TABLE A.foo (bar BLOB(100));
      

       

      This results in the following error:

      org.apache.kafka.connect.errors.ConnectException: no viable alternative at input 'create table test2 (thing BLOB('
      at io.debezium.connector.mysql.AbstractReader.wrap(AbstractReader.java:230)
      at io.debezium.connector.mysql.AbstractReader.failed(AbstractReader.java:207)
      at io.debezium.connector.mysql.BinlogReader.handleEvent(BinlogReader.java:604)
      at com.github.shyiko.mysql.binlog.BinaryLogClient.notifyEventListeners(BinaryLogClient.java:1100)
      at com.github.shyiko.mysql.binlog.BinaryLogClient.listenForEventPackets(BinaryLogClient.java:951)
      at com.github.shyiko.mysql.binlog.BinaryLogClient.connect(BinaryLogClient.java:594)
      at com.github.shyiko.mysql.binlog.BinaryLogClient$7.run(BinaryLogClient.java:838)
      at java.base/java.lang.Thread.run(Thread.java:834)
      Caused by: io.debezium.text.ParsingException: no viable alternative at input 'create table test2 (thing BLOB('
      at io.debezium.antlr.ParsingErrorListener.syntaxError(ParsingErrorListener.java:40)
      at org.antlr.v4.runtime.ProxyErrorListener.syntaxError(ProxyErrorListener.java:41)
      at org.antlr.v4.runtime.Parser.notifyErrorListeners(Parser.java:544)
      at org.antlr.v4.runtime.DefaultErrorStrategy.reportNoViableAlternative(DefaultErrorStrategy.java:310)
      at org.antlr.v4.runtime.DefaultErrorStrategy.reportError(DefaultErrorStrategy.java:136)
      at io.debezium.ddl.parser.mysql.generated.MySqlParser.sqlStatements(MySqlParser.java:1154)
      at io.debezium.ddl.parser.mysql.generated.MySqlParser.root(MySqlParser.java:882)
      at io.debezium.connector.mysql.antlr.MySqlAntlrDdlParser.parseTree(MySqlAntlrDdlParser.java:68)
      at io.debezium.connector.mysql.antlr.MySqlAntlrDdlParser.parseTree(MySqlAntlrDdlParser.java:41)
      at io.debezium.antlr.AntlrDdlParser.parse(AntlrDdlParser.java:80)
      at io.debezium.connector.mysql.MySqlSchema.applyDdl(MySqlSchema.java:326)
      at io.debezium.connector.mysql.BinlogReader.handleQueryEvent(BinlogReader.java:807)
      at io.debezium.connector.mysql.BinlogReader.handleEvent(BinlogReader.java:587)
      ... 5 more
      Caused by: org.antlr.v4.runtime.NoViableAltException
      at org.antlr.v4.runtime.atn.ParserATNSimulator.noViableAlt(ParserATNSimulator.java:2026)
      at org.antlr.v4.runtime.atn.ParserATNSimulator.execATN(ParserATNSimulator.java:467)
      at org.antlr.v4.runtime.atn.ParserATNSimulator.adaptivePredict(ParserATNSimulator.java:393)
      at io.debezium.ddl.parser.mysql.generated.MySqlParser.sqlStatements(MySqlParser.java:956)
      ... 12 more
      

      The problem is how the parser interprets setting the maximal size of the BLOB field. The error does not occur if we set the exact blob-type directly ala:

      CREATE TABLE A.tiny (bar TINYBLOB);
      CREATE TABLE A.reg (bar BLOB);
      CREATE TABLE A.med (bar MEDIUMBLOB);
      CREATE TABLE A.long (bar LONGBLOB);

      This issue is present in 1.2.0.Final and 1.3.0.Final

      Attachments

        Activity

          People

            jpechane Jiri Pechanec
            chrislee93 Chris Lee (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: