Recently, I received a question related to GO
as delimter to send a query. The user got some generated statements from a third party tool that looked like this:
/* CreateTable VersionInfo */ CREATE TABLE VersionInfo (Version BIGINT NOT NULL) ENGINE = INNODB GO /* VersionMigration migrated */ /* VersionUniqueMigration migrating ========================================== */ /* CreateIndex VersionInfo (Version) */ CREATE UNIQUE INDEX UC_Version ON VersionInfo (Version ASC) GO
and so on…
To be honest I was lost ?! I never heard about that syntax and I was convinced that this was not valid (and you?)…
But in fact it is ! It’s the long command name for \g
and EGO
is the one for \G
.
You can try help
in the client (see the manual) and you will see it:
ego (\G) Send command to mysql server, display result vertically. ... go (\g) Send command to mysql server.
I wasn’t aware of this… So I tried of course:
node1 [localhost] {root} ((none)) > select now() -> go ->
so it failed, it expected ‘;
‘, ‘\g
‘ or ‘\G
‘ to send the command…
Then I found this bug #69534 where the solution was explained: --named-commands
. In fact the client needs to be started with this option to enable the long named commands, see the manual. The manual is not that clear as it takes for example \q and quit… but in fact both are working even when --named-commands
is not enabled.
Let’s try starting the client with that option to see if it works:
node1 [localhost] {msandbox} ((none)) > select now() -> go +---------------------+ | now() | +---------------------+ | 2018-03-09 22:49:04 | +---------------------+ 1 row in set (0.00 sec)
Wuuhuuu It works \o/
So I learned something about MySQL that was completely NOT new. I don’t know how useful this can be other than for a quiz but at least if you have a tool generating statements like these ones, now you know how to use them even without replacing all GO
by ‘;
‘.