Details
-
Bug
-
Status: Closed (View Workflow)
-
Major
-
Resolution: Fixed
-
1.4.1
-
None
-
Debian GNU/Linux 8.2 (jessie)
MaxScale 1.4.1
MySQL 5.7.12-log
Description
After a installing MaxScale on a freshly installed VM using the default config (expect server locations) it fails with the following error in the log:
2016-04-21 12:24:48 debug : Dbusers : Loading data from backend database with Master role [10.0.3.26:3306] for service [Read-Write Service]
2016-04-21 12:24:48 error : Loading users for service [Read-Write Service] encountered error: [You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'B' at line 1].
MaxScale doesn't log internal queries so I used tcpdump to capture the query
13:24:55.798079 IP 10.0.3.16.52185 > 10.0.3.26.3306: Flags [P.], seq 2183529305:2183529981, ack 3775999896, win 229, options [nop,nop,TS val 42627172 ecr 42101003], length 676
E...r.@.@...
...
........&.Y../............
..pd..i......SELECT COUNT(1) AS nusers_db FROM (SELECT DISTINCT user.user AS user, user.host AS host, user.authentication_string AS password, concat(user.user,user.host,user.authentication_string, IF((user.Select_priv+0)||find_in_set('Select',Coalesce(tp.Table_priv,0)),'Y','N') , COALESCE( db.db,tp.db, '')) AS userdata, user.Select_priv AS anydb, COALESCE( db.db,tp.db, NULL) AS db FROM mysql.user LEFT JOIN mysql.db ON user.user=db.user AND user.host=db.host LEFT JOIN mysql.tables_priv tp ON user.user=tp.user AND user.host=tp.host WHERE user.user IS NOT NULL AND user.user <> '' AND user.user NOT IN ('root') ORDER B
13:24:55.798440 IP 10.0.3.26.3306 > 10.0.3.16.52185: Flags [P.], seq 3775999896:3776000056, ack 2183529981, win 246, options [nop,nop,TS val 42101003 ecr 42627172], length 160
E...F3@.@...
...
........./..&.............
..i...pd.....(.#42000You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'B' at line 1
Looking at the code I think I found the cause in server/core/dbusers.c. It seems that the MAX_QUERY_STR_LEN is incorrect.
The definition is:
/** The maximum possible length of the query */
#define MAX_QUERY_STR_LEN strlen(MYSQL_USERS_COUNT_TEMPLATE_START \
MYSQL_USERS_COUNT_TEMPLATE_END MYSQL_USERS_DB_QUERY_TEMPLATE \
MYSQL_USERS_ORDER_BY) + strlen(MYSQL57_PASSWORD) * 2 + 1
While the code in the get_usercount_query function actually uses:
snprintf(buffer, MAX_QUERY_STR_LEN, MYSQL_USERS_COUNT_TEMPLATE_START
MYSQL_USERS_DB_QUERY_TEMPLATE "%s" MYSQL_USERS_ORDER_BY
MYSQL_USERS_COUNT_TEMPLATE_END, password, password,
include_root ? "" : USERS_QUERY_NO_ROOT);
The USERS_QUERY_NO_ROOT seems to be missing in the MAX_QUERY_STR_LEN.