Autor Zpráva
AM_
Profil
Zdravím,
narazil jsem u MySQL (opět) na syntaktickou obskurnost.
Pro vysvětlení - vyvíjím databázový framework, kterým je dotaz vygenerovaný, proto je dotaz tak paranoidně ozávorkovaný a uměle vykonstruovaný pro otestování unionů ve frameworku.

Mám následující dotaz:
SELECT * FROM (`query_log`) WHERE (`id_query`) = (65)
UNION ALL
SELECT * FROM (`query_log`) WHERE (`id_query`) = (63)

Kolem názvů tabulek jsou závorky proto,že framework na tom místě dosazuje libovolný výraz, který je použitelný v klauzuli FROM, tedy např. vnořený select, další vnořený join atd.
Bez unionů to není problém, ale v tomto dotazu dostávám chybu:
You have an error in your SQL syntax; ...to use near 'WHERE (`id_query`) = (63)' at line 3

Zvláštnost je v tom, že problém s ozávorkováním názvů tabulek je až ve druhém selectu (za unionem).

Tento dotaz:
SELECT * FROM (`query_log`) WHERE (`id_query`) = (65)
UNION ALL
SELECT * FROM `query_log` WHERE (`id_query`) = (63)
již funguje zcela bez problému (v prvním selectu je tabulka stále ozávorkovaná, ve druhém ne).

Můj dotaz tedy zní - uniká mi něco, nebo je to bug v mysql parseru? Jak byste to řešili s přihlédnutím na mou strategii, že raději ozávorkovávám všude, kde by to mohlo být potřeba?

Děkuji za odpovědi.
Tori
Profil
AM:
Jaká verze DB a engine tabulky to je? Zkoušela jsem na 5.1.63, verze prot. 10 (tabulka MyISAM) jak přes PMA tak mysql_query, se závorkami i bez, a chybu mi žádnou nehlásilo. Nevím, v čem dalším by mohl být podstatný rozdíl.
edit: potvrzuju tuto chybu, projevila se mi v MySQL 5.5.12, ver. protokolu 10, InnoDB i MyISAM.
AM_
Profil
Verze MySQL: 5.5.9
Verze protokolu: 10
divné, že v novější verzi by to nešlo, ale i to se může stát.

Já to mám na engine InnoDB, mám to zcizoklíčované. Ale zkusil jsem si udělat myisam tabulku a problém je pořád stejný, takže to taky nebude ono.
AM_
Profil
tak po chvíli googlení jsem zjistil, že tento bug existoval ve verzích < 5.0, takže se zřejmě znovu objevil a existuje stále i ve verzi 5.5.25, takže jsem zaslal bug report na web mysql a tím to zatím považuji za uzavřené... ve svém frameworku to holt musím vyřešit tak, aby se tam závorky nevkládaly, pokud to není opravdu nutné :)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: