Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

mysqldump-ed SQL file cause parse errors. #64

Closed
uzulla opened this issue Oct 5, 2018 · 2 comments · Fixed by #65
Closed

mysqldump-ed SQL file cause parse errors. #64

uzulla opened this issue Oct 5, 2018 · 2 comments · Fixed by #65

Comments

@uzulla
Copy link

uzulla commented Oct 5, 2018

I got parse error with mysqldump-ed sql file.

error sample

(details described below.)

: parse error: expected CREATE, COMMENT_IDENT or EOF at line 7 column 64
    "TER_SET_CLIENT=@@CHARACTER_SET_CLIENT */" <---- AROUND HERE

it be caused by

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;

workaround

remove ;.

/* <snip> */;

to

/* <snip> */

detail

$ schemalex_linux_amd64/schemalex -v
schemalex version v0.0.8, built with go go1.9.1 for linux/amd64
$ mysqldump --version
mysqldump  Ver 10.14 Distrib 5.5.56-MariaDB, for Linux (x86_64)
$ mysqldump -u root -p test > test1.sql
$ mysqldump -u root -p test > test2.sql
$ schemalex_linux_amd64/schemalex test1.sql test2.sql
2018/10/05 16:29:41 failed to parse "from" -- MySQL dump 10.14  Distrib 5.5.56-MariaDB, for Linux (x86_64)
--
-- Host: localhost    Database: test
-- ------------------------------------------------------
-- Server version	5.5.56-MariaDB

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2018-10-05 16:29:24
: parse error: expected CREATE, COMMENT_IDENT or EOF at line 7 column 64
    "TER_SET_CLIENT=@@CHARACTER_SET_CLIENT */" <---- AROUND HERE
$ cat test1.sql
-- MySQL dump 10.14  Distrib 5.5.56-MariaDB, for Linux (x86_64)
--
-- Host: localhost    Database: test
-- ------------------------------------------------------
-- Server version	5.5.56-MariaDB

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2018-10-05 16:29:24

🙇

@mackee
Copy link

mackee commented Oct 5, 2018

日本語で失礼します。

この問題はparserにおいて、トークンSEMICOLONがいきなり現れるケースが想定されていなく、default処理に落ちてエラーが出てしまうため、起こっていることだと思います。

https://github.com/schemalex/schemalex/blob/master/parser.go#L192

lexerは出していただいた例ではトークンCOMMENT_IDENTの次にトークンSEMICOLONが来ます。しかし、COMMENT_IDENTはそれだけで完結する文なので、上記parserは次のトークンをコンテキストを初期化して取得します。
parserではSEMICOLONから始まる文を想定していないため、defaultに落ちて報告されているエラーが出ています。
ですので、乱暴ですが、

https://github.com/schemalex/schemalex/blob/master/parser.go#L172

case COMMENT_IDENT, SEMICOLON:

とするか、

https://github.com/schemalex/schemalex/blob/master/lexer.go#L335

ここでさらに;が現れるかを見るかするなどの対処が必要そうです。
mysqldにおいてセミコロンがどのように許容されているかまでは調査していません。

@soh335
Copy link
Member

soh335 commented Oct 5, 2018

ありがとうございます。
#62
これの comment のやつの原因がこれってことみたいですね。

ちょっと mysql のセミコロンの扱いを調べてみないとダメかも?
時間あれば pr もらえると嬉しいです。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants