FB2, 6.3.0.12654, ODS 11.0, ibexpert 2006.01.30.

есть запрос
select intervals.name, sum(q1.r_out_md)
from intervals left join
     get_an2(intervals.vdate1,intervals.vdate2) q1 on (intervals.vdate1 between 
'2005-09-01' and '2006-04-30')
group by 1

работает, результат дает.
строк в результате - 21. (fetch all, само собой)

теперь просто хочу добавить в вывод intervals.vdate1, intervals.vdate2, 
соответственно запускаю тот же запрос, но добавив эти два поля в select and 
group by.

получаю запрос
select intervals.name, intervals.vdate1, intervals.vdate2, sum(q1.r_out_md)
from intervals left join
     get_an2(intervals.vdate1,intervals.vdate2) q1 on (intervals.vdate1 between 
'2005-09-01' and '2006-04-30')
group by 1,2,3

не работает.. ошибка "arithmetic overflow or divizion by zero has occured".

хотя с моей колокольни кажется, что ход выполнения данных запросов должен быть 
идентичен. просто пристегнуты два поля, в которых DATE NOT NULL. на всякий 
случай содержимое таблицы INTERVALS в PS1, ничего криминального.
Планы запросов идентичны (на всякий случай в PS2), что подтверждает мое 
субъективное ощущение о том, что они выполняются одинаково :) что не так, пока 
не понял. (используемая в этом запросе процедура - куча заплаток, накопившихся 
за год, поэтому пока не выделил простой пример с глюкой) может, это что-то 
известное?

есть подозрение, что проблема в том, что из тех 21 строк результата, 13 как 
sum(q1.r_out_md) выдают null.. но простыми скриптами это подтвердить не 
удается. время выполнения практически одинаковое (достаточное заметное, порядка 
4х минут), что опять же подталкивает к мысли, что ошибка возникает в самый 
последний момент при группировке и наверняка тут null является проблемой. но в 
простых случаях группировка с null легко выполняется..

PS1:
CREATE TABLE INTERVALS (
    ID      INTEGER NOT NULL,
    VDATE1  DATE NOT NULL,
    VDATE2  DATE NOT NULL,
    NAME    VARCHAR(50) NOT NULL
);
INSERT INTO INTERVALS (ID, VDATE1, VDATE2, NAME) VALUES (34958, '2005-01-01', 
'2005-01-31', '2005 г., январь');
INSERT INTO INTERVALS (ID, VDATE1, VDATE2, NAME) VALUES (34959, '2005-08-01', 
'2005-08-31', '2005 г., август');
INSERT INTO INTERVALS (ID, VDATE1, VDATE2, NAME) VALUES (34960, '2005-09-01', 
'2005-09-30', '2005 г., сентябрь');
INSERT INTO INTERVALS (ID, VDATE1, VDATE2, NAME) VALUES (34961, '2005-10-01', 
'2005-10-31', '2005 г., октябрь');
INSERT INTO INTERVALS (ID, VDATE1, VDATE2, NAME) VALUES (42438, '2005-11-01', 
'2005-11-30', '2005 г., ноябрь');
INSERT INTO INTERVALS (ID, VDATE1, VDATE2, NAME) VALUES (42439, '2005-12-01', 
'2005-12-31', '2005 г., декабрь');
INSERT INTO INTERVALS (ID, VDATE1, VDATE2, NAME) VALUES (66650, '2005-02-01', 
'2005-02-28', '2005 г., февраль');
INSERT INTO INTERVALS (ID, VDATE1, VDATE2, NAME) VALUES (66651, '2005-03-01', 
'2005-03-31', '2005 г., март');
INSERT INTO INTERVALS (ID, VDATE1, VDATE2, NAME) VALUES (66652, '2006-01-01', 
'2006-01-31', '2006 г., январь');
INSERT INTO INTERVALS (ID, VDATE1, VDATE2, NAME) VALUES (66653, '2006-02-01', 
'2006-02-28', '2006 г., февраль');
INSERT INTO INTERVALS (ID, VDATE1, VDATE2, NAME) VALUES (74255, '2006-03-01', 
'2006-03-31', '2006 г., март');
INSERT INTO INTERVALS (ID, VDATE1, VDATE2, NAME) VALUES (74256, '2006-04-01', 
'2006-04-30', '2006 г., апрель');
INSERT INTO INTERVALS (ID, VDATE1, VDATE2, NAME) VALUES (81378, '2005-04-01', 
'2005-04-30', '2005 г., апрель');
INSERT INTO INTERVALS (ID, VDATE1, VDATE2, NAME) VALUES (81379, '2006-05-01', 
'2006-05-31', '2006 г., май');
INSERT INTO INTERVALS (ID, VDATE1, VDATE2, NAME) VALUES (1022510, '2006-06-01', 
'2006-06-30', '2006 г., июнь');
INSERT INTO INTERVALS (ID, VDATE1, VDATE2, NAME) VALUES (1022511, '2006-07-01', 
'2006-07-31', '2006 г., июль');
INSERT INTO INTERVALS (ID, VDATE1, VDATE2, NAME) VALUES (1022512, '2006-08-01', 
'2006-08-31', '2006 г., август');
INSERT INTO INTERVALS (ID, VDATE1, VDATE2, NAME) VALUES (1022513, '2006-09-01', 
'2006-09-30', '2006 г., сентябрь');
INSERT INTO INTERVALS (ID, VDATE1, VDATE2, NAME) VALUES (1022514, '2006-10-01', 
'2006-10-31', '2006 г., октябрь');
INSERT INTO INTERVALS (ID, VDATE1, VDATE2, NAME) VALUES (1022515, '2006-11-01', 
'2006-11-30', '2006 г., ноябрь');
INSERT INTO INTERVALS (ID, VDATE1, VDATE2, NAME) VALUES (1022516, '2006-12-01', 
'2006-12-31', '2006 г., декабрь');
ALTER TABLE INTERVALS ADD CONSTRAINT UNQ1_INTERVALS UNIQUE (NAME);
ALTER TABLE INTERVALS ADD CONSTRAINT UNQ2_INTERVALS UNIQUE (VDATE1, VDATE2);
ALTER TABLE INTERVALS ADD CONSTRAINT PK_INTERVALS PRIMARY KEY (ID);
CREATE INDEX INTERVALS_IDX1 ON INTERVALS (VDATE1);
CREATE INDEX INTERVALS_IDX2 ON INTERVALS (VDATE2);

PS2:
Plan
PLAN JOIN (SORT (JOIN (INTERVALS INDEX (INTERVALS_IDX1), RDB$DATABASE 
NATURAL)), SYSTEMDATA NATURAL)(GET_REST NATURAL)(STORAGES NATURAL)SORT (JOIN 
(AGENTS NATURAL, SALES_MOVE INDEX (RDB$FOREIGN38)))JOIN (SALES_MOVE INDEX 
(RDB$FOREIGN36, RDB$FOREIGN37, RDB$FOREIGN37), AGENTS INDEX 
(RDB$PRIMARY2))(SRV_GET41_V20060512 NATURAL)(SRV_GET41_V20060512 NATURAL)JOIN 
(INTERVALS INDEX (INTERVALS_IDX1, INTERVALS_IDX2), REAL41 INDEX 
(PK_REAL41))(SALES_MOVE INDEX (RDB$FOREIGN36, RDB$FOREIGN38))SORT (JOIN (TEMP1 
INDEX (TEMP1_IDX3), SORTAMENT INDEX (RDB$PRIMARY15), SGROUP INDEX 
(RDB$PRIMARY14), SSGROUP INDEX (PK_SSGROUP)))(TEMP1 INDEX (TEMP1_IDX3))
Adapted Plan
PLAN JOIN (SORT (JOIN (INTERVALS INDEX (INTERVALS_IDX1), RDB$DATABASE 
NATURAL)), SYSTEMDATA NATURAL)(GET_REST NATURAL)(STORAGES NATURAL)SORT (JOIN 
(AGENTS NATURAL, SALES_MOVE INDEX (INTEG_226)))JOIN (SALES_MOVE INDEX 
(INTEG_224, INTEG_225, INTEG_225), AGENTS INDEX 
(INTEG_190))(SRV_GET41_V20060512 NATURAL)(SRV_GET41_V20060512 NATURAL)JOIN 
(INTERVALS INDEX (INTERVALS_IDX1, INTERVALS_IDX2), REAL41 INDEX 
(PK_REAL41))(SALES_MOVE INDEX (INTEG_224, INTEG_226))SORT (JOIN (TEMP1 INDEX 
(TEMP1_IDX3), SORTAMENT INDEX (INTEG_203), SGROUP INDEX (INTEG_202), SSGROUP 
INDEX (PK_SSGROUP)))(TEMP1 INDEX (TEMP1_IDX3))
--~--~---------~--~----~------------~-------~--~----~
-~----------~----~----~----~------~----~------~--~---

Ответить