Autor Zpráva
MaK
Profil
Pokud v phpMyAdmin 4.1.8 jsem v db1 a položím dotaz:
SELECT id
FROM
(
SELECT id FROM tab_a WHERE id < 10 
) AS dt
LEFT JOIN db2.tab_b USING(id)
WHERE db2.tab_b.x IS NULL

dostanu chybu: #1146 - Table 'db2.tab_a' doesn't exist. Ale proc proboha jde do db2, kdy ma jit do aktualni DB, kterou je db1?
V general query logu je:
1 Init DB db1
1 Init DB db2
1 Query SELECT id ...

Proc phpMyAdmin mění databázi?

Pokud za dotaz pripojim:
;--

asi ho donutim běžet nějakou multiple-statement-větví, vše proběhne korektně a v logu je:
1 Init DB db1
1 Query SELECT id ...

Jak přinutit phpMyAdmin aby nedělal takové koniny?

MaK
Tori
Profil
No a když doplníte název DB i do poddotazu? (Připadá mi to v pořádku, že PMA parsuje lineárně to SQL, nejdřív naváže spojení s výchozí DB, pak uvidí db2 a naváže spojení s ní. Možná při tom navázání spojení se rovnou nastaví, že se má používat tato DB. Takže když pak v poddotazu není DB uvedená, tak se použije poslední, ke které se PhpMyAdmin připojil - čili db2.)
Amunak
Profil
Zkus tam prvně zkusit spustit příkaz
USE dbname;

Ale mně to nikdy problém nedělalo.
peta
Profil
Mi to taky prijde logicke. Kdyz neuvedes jmeno db, kdyz pouzivas dve odlisne db, ze pouzije db2, ktere tam uvedene mas.
MaK
Profil
Tori:
PMA parsuje lineárně to SQL, nejdřív naváže spojení s výchozí DB

Proč PMA parsuje dotaz?

Amunak:
Zkus tam prvně zkusit spustit příkaz...

Nepomuze, tady je log:
1 Init DB db1
1 Query USE db1
1 Init DB db2
1 Query SELECT id ...


peta:
Mi to taky prijde logicke.

Všem připadá logické, že pokud do "okénka" nad kterým je napsáno:
"Run SQL query/queries on database db1:"

napíšu dotaz, PMA se zamyslí a zvolí db2!?

Proč pak tuto logiku nepožije při dotazu:
SELECT id
FROM tab_a 
LEFT JOIN db2.tab_b ...

MaK
Tori
Profil
MaK:
Proč PMA parsuje dotaz?
Jen se domnívám, že tak činí. Nepitvala jsem PMA. Nicméně - PMA tvoří PHPčkové skripty, takže musejí někde a nějak navázat spojení se všemi DB, s nimiž chtějí pracovat, ne? Samozřejmě nejjednodušší způsob, jak zjistit, jak PMA přemýšlí, je podívat se do zdrojáku.
edit: Zběžně jsem koukla do kódu, nějaké parsování SQL a detekce názvů DB se tam opravdu děje.

A zkusil jste teda dopsat databázi i do toho poddotazu, jestli to bude fungovat správně?
peta
Profil
MaK:
Protoze je to Join tabulky. V prvnim pripade musi nejdriv zpracovat vnitrek dotazu, coz ho prepne na db2.
Ale uznavam, ze to muze byt zajimavy problem, kdyz tam podobnych veci mas v dotaze vic, ze ti je vsechny prepne na db2 :) Jen proste v examplech takove veci obvykle mas napsane spravne, kdyz stridas db.
MaK
Profil
peta:
V prvnim pripade musi nejdriv zpracovat vnitrek dotazu, coz ho prepne na db2

Kdo zpracuje vnitřek dotazu? Snad SQL. Kdo přepne DB?

Doteď jsem žil v představě, že žadný select nepřepne aktuální DB a všechna jména tabulek, kterým nepředchazí jméno databáze, jsou brány jako tabulky z aktuální DB. To neplatí?

MaK
Kajman
Profil
Ano, je to nelogická chyba v PMA, ale asi je potřeba stěžovat u jejich vývojářů.

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: