Description:
In 5.5 series, when trying to LOAD DATA LOCAL INFILE using a relative path with 3 or more levels up in the directory hierarchy, mysqld wrongly parses the path and as a consequence, can't find the file. This can cause automated script to break for example. Worse then the LOAD DATA failing would be to load the wrong data file due to a wrongly parsed (but existing) path.
How to repeat:
In my test case below I use a City.sql file that contains tab separated data from the "world" sample database, exported using regular SELECT INTO OUTFILE method. You can use any data file you wish as long as LOAD DATA LOCAL INFILE can import it.
Note, both client and server have local-infile=1 :
[mysql]
local-infile=1
...
[mysqld]
local-infile=1
TEST CASE
=========
[user@hostname 1]$ pwd
/home/user/sandboxes/msb_5_5_11/TEST/1
[user@hostname 1]$ find
.
./2
./2/3
./2/3/4
./2/3/4/City.sql
---
[user@hostname msb_5_5_11]$ /home/user/sandboxes/msb_5_5_11/use test
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.5.11-enterprise-commercial-advanced MySQL Enterprise Server - Advanced Edition (Commercial)
...
mysql [localhost] {msandbox} (test) > TRUNCATE TABLE City; LOAD DATA LOCAL INFILE './City.sql' INTO TABLE City;
Query OK, 0 rows affected (0.00 sec)
Query OK, 4079 rows affected (0.01 sec)
Records: 4079 Deleted: 0 Skipped: 0 Warnings: 0
---
[user@hostname 4]$ mv City.sql ..
[user@hostname 4]$ /home/user/sandboxes/msb_5_5_11/use test
mysql [localhost] {msandbox} (test) > TRUNCATE TABLE City; LOAD DATA LOCAL INFILE '../City.sql' INTO TABLE City;
Query OK, 0 rows affected (0.00 sec)
Query OK, 4079 rows affected (0.01 sec)
Records: 4079 Deleted: 0 Skipped: 0 Warnings: 0
---
[user@hostname 4]$ mv ../City.sql ../../
[user@hostname 4]$ /home/user/sandboxes/msb_5_5_11/use test
mysql [localhost] {msandbox} (test) > TRUNCATE TABLE City; LOAD DATA LOCAL INFILE '../../City.sql' INTO TABLE City;
Query OK, 0 rows affected (0.00 sec)
Query OK, 4079 rows affected (0.02 sec)
Records: 4079 Deleted: 0 Skipped: 0 Warnings: 0
---
[user@hostname 4]$ mv ../../City.sql ../../../
[user@hostname 4]$ /home/user/sandboxes/msb_5_5_11/use test
mysql [localhost] {msandbox} (test) > TRUNCATE TABLE City; LOAD DATA LOCAL INFILE '../../../City.sql' INTO TABLE City;
Query OK, 0 rows affected (0.00 sec)
ERROR 2 (HY000): File '../City.sql' not found (Errcode: 2)
NOTE how above^^^ the '../../../City.sql' path is wrongly parsed as '../City.sql'! This is the bug.
Suggested fix:
Correctly parse the relative path.