-
Bug
-
Resolution: Done
-
Major
-
0.1
I'm getting this odd behavior with the app/mysql version i'm using 5.6 (https://github.com/openshift/mysql) and using the ticket monster application. I'm getting stack traces like this:
2016-05-05 20:46:52,685 - ERROR [WorkerSourceTask-ticketmonster-connector-0:TableConverters@111] - Error parsing DDL statement and updating tables: CREATE TABLE IF NOT EXISTS help_r elation ( help_topic_id int unsigned not null references help_topic, help_keyword_id int unsigned not null references help_keyword, primary key (help_keyword_id, help_topic_id) ) e ngine=MyISAM CHARACTER SET utf8 comment='keyword-topic relation'; io.debezium.text.ParsingException: Expecting '(' at line 1, column 101 but found ',': eferences help_topic ===>> , help_keyword_id i at io.debezium.text.TokenStream.consume(TokenStream.java:693) at io.debezium.connector.mysql.MySqlDdlParser.parseColumnNameList(MySqlDdlParser.java:983) at io.debezium.connector.mysql.MySqlDdlParser.parseReferenceDefinition(MySqlDdlParser.java:581) at io.debezium.connector.mysql.MySqlDdlParser.parseColumnDefinition(MySqlDdlParser.java:526) at io.debezium.connector.mysql.MySqlDdlParser.parseCreateColumn(MySqlDdlParser.java:437) at io.debezium.connector.mysql.MySqlDdlParser.parseCreateDefinition(MySqlDdlParser.java:427) at io.debezium.connector.mysql.MySqlDdlParser.parseCreateDefinitionList(MySqlDdlParser.java:353) at io.debezium.connector.mysql.MySqlDdlParser.parseCreateTable(MySqlDdlParser.java:183) at io.debezium.connector.mysql.MySqlDdlParser.parseCreate(MySqlDdlParser.java:133) at io.debezium.connector.mysql.MySqlDdlParser.parseNextStatement(MySqlDdlParser.java:116) at io.debezium.relational.ddl.DdlParser.parse(DdlParser.java:269) at io.debezium.relational.ddl.DdlParser.parse(DdlParser.java:250)
But this kinda doesn't make any sense.. from the code we expect a '(" opening brace for the column name, but as the stack trace indicates, the statement doesn't have an parens..
protected List<String> parseColumnNameList(Marker start) { List<String> names = new ArrayList<>(); tokens.consume('('); names.add(tokens.consume()); while (tokens.canConsume(',')) { names.add(tokens.consume()); } tokens.consume(')'); return names; }
And seems the parsing is correct based on the mysql REFERENCES clause:
https://dev.mysql.com/doc/refman/5.6/en/create-table.html
reference_definition: REFERENCES tbl_name (index_col_name,...) [MATCH FULL | MATCH PARTIAL | MATCH SIMPLE] [ON DELETE reference_option] [ON UPDATE reference_option]
Not sure if this is a bug in mysql or how this statement got created.