Trafił na problem z ograniczeniem długości zapytania w MySQL.
Wygląda to jakby MySQL ucinał zapytanie gdzieś w okolicy 1024 znaku.
Wszelkie informacje, jakie udało mi się znaleźć sugerują błędne
ustawienie 'max_allowed_packet'. Jednak w środowisku w którym błąd
występuje ta zmienna ma zawartość 16M, co potwierdza 'SHOW VARIABLES'
pisząc 16776192.
Pierwotnie zapytanie wykonywane było przez skrypt PHP (konkretnie
scaffold CakePHP), ale po uruchomieniu standardowego commandline'owego
klienta 'mysql' i wklejeniu zapytania do Vima wywołanego przez '\e' w
kliencie - efekt identyczny.
Co ciekawe - po podziale zapytania na kilka linii w edytorze wywołanym
przez '\e', efekt jest identyczny. Zapytanie urywa się w tym
samym miejscu tego samego wyrazu, mimo dodania kilku znaków (znaków
nowej linii) - jedyne co się zmienia, to numer linii w komunikacie
błędu.
Problematyczne zapytanie to:
SELECT `Book`.`id`, `Book`.`title`, `Book`.`trans_title`,
`Book`.`comment`, `Book`.`publish_year`, `Book`.`trans_publish_year`,
`Book`.`language_id`, `Book`.`trans_language_id`, `Book`.`user_id`,
`Book`.`status_id`, `Book`.`created`, `Book`.`modified`, `User`.`id`,
`User`.`profile_id`, `User`.`last_name`, `User`.`first_name`,
`User`.`nickname`, `User`.`email`, `User`.`created`,
`User`.`modified`, `Language`.`id`, `Language`.`name`,
`Language`.`created`, `Language`.`modified`, `Translation
Language`.`id`, `Translation Language`.`name`, `Translation
Language`.`created`, `Translation Language`.`modified`, `Status`.`id`,
`Status`.`name`, `Status`.`created`, `Status`.`modified` FROM `books`
AS `Book` LEFT JOIN `users` AS `User` ON (`Book`.`user_id` =
`User`.`id`) LEFT JOIN `languages` AS `Language` ON
(`Book`.`language_id` = `Language`.`id`) LEFT JOIN `languages` AS
`Translation Language` ON (`Book`.`trans_language_id` = Translation
`Language`.`id`) LEFT JOIN `statuses` AS `Status` ON
(`Book`.`status_id` = `Status`.`id`) WHERE 1 = 1;
A zgłaszany błąd:
SQL Error: 1064: 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 'Language`.`id`) LEFT JOIN `statuses` AS `Status`
ON (`Book`.`status_id` = `Statu' at line 1
Wersja MySQL na której zaobserwowano problem - 5.0.32-7etch5 z Debiana
Etch.
--
Jacek Politowski
Nic nie ucina. Zapytanie jest błędne, co widać dokładnie w miejscu wskazanym
przez interpreter. Najwyraźniej CakePHP nie radzi sobie z tabelami mającymi
spację w nazwie.
.pk.
LEFT JOIN `languages` AS
`Translation Language` ON (`Book`.`trans_language_id` = `Translation
Language`.`id`) LEFT JOIN `statuses` AS `Status` ON
(`Book`.`status_id` = `Status`.`id`) WHERE 1 = 1;
W złym miejscu odwrócony aposrof dla aliasu Translation
Language
--
Mariusz
Dzięki. Nie zauważyłem błędu w okolicy Translation Language.
Nie podejrzewałem jednak użycia nazwy modelu ze spacją (to model
w CakePHP, a nie tabela w bazie miał spację w nazwie).
Dodatkowo komunikat, który obcięty był akurat na 1024 znaku (gdyby to
był znak np. 997, to pewnie jakaś lampka ostrzegawcza by mi się
zapaliła, a tu taka ładna, okrągła i bardzo prawdopodobna liczba...),
dobrze zgrał się z pytaniem znajomego -- "limit długości zapytania?".
--
Jacek Politowski