[ http://tracker.firebirdsql.org/browse/CORE-6120?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Sean Leyne reopened CORE-6120: ------------------------------ > NOT EXISTS() predicate sometimes return NULL instead of True or False > --------------------------------------------------------------------- > > Key: CORE-6120 > URL: http://tracker.firebirdsql.org/browse/CORE-6120 > Project: Firebird Core > Issue Type: Bug > Components: Engine > Affects Versions: 3.0.4, 3.0.5 > Reporter: Karol Bieniaszewski > > In below query second column rerurn "NULL" instead of "TRUE". If you remove > "NOT" then result is "FALSE". > Run it against database from CORE-6106 > SELECT > K.ID > , > > ( > NOT EXISTS > (WITH KWARTALY AS > (SELECT > * > FROM > KWARTAL KW > WHERE > KW.CKWARTAL BETWEEN '2019.I' > AND '2019.I'), KWARTALY_DATY AS > (SELECT > MIN(KW.ZALICZAJ_OD) AS MIN_ZALICZAJ_OD > , MAX(KW.ZALICZAJ_DO) AS MAX_ZALICZAJ_DO > , MIN(KW.D_OD) AS MIN_D_OD > , MAX(KW.D_DO) AS MAX_D_DO > , MIN(KW.CKWARTAL) AS MIN_KWARTAL > , MAX(KW.CKWARTAL) AS MAX_KWARTAL > FROM > KWARTALY KW) > SELECT > 1 > FROM > KWARTALY_DATY KW > WHERE > /* jest jakakolwiek deklaracja w zadanym przedziale to znaczy, ze jest > platnikiem */ > EXISTS > (SELECT > * > FROM > SPR S > INNER JOIN KWARTAL SKW ON S.ID_KWARTAL = SKW.ID > WHERE > S.ID_KONTRAHENT = K.ID > AND SKW.CKWARTAL BETWEEN KW.MIN_KWARTAL > AND KW.MAX_KWARTAL > ) > OR > /* jesli ma wpis o statusie dzialnosci za zadany okres (z data pozyaskania > nie z przyszlosci) to tez jest platnikiem */ > EXISTS > (SELECT > * > FROM > STATUS_PLATNIKA SP > INNER JOIN STATUS_PLATNIKA_TYP SPT ON > SP.ID_STATUS_PLATNIKA_TYP = SPT.ID > WHERE > SP.ID_KONTRAHENT = K.ID > AND SP.DATA_POZYSKANIA <= KW.MAX_ZALICZAJ_DO > AND (SPT.FLAGA_SYS IN(1) AND ((SP.DATA_OD <= KW.MAX_D_DO) > AND (SP.DATA_DO IS NULL OR (SP.DATA_DO >= KW.MIN_D_OD)))) > ) > UNION ALL > SELECT > 1 > FROM > KWARTALY_DATY KD > INNER JOIN URZADZENIE U ON 1 = 1 > /* robimy liste kwartalow w ktorych obowiazuje status > dzialalnosci kontrahenta i szukamy brakow deklaracji > */ > INNER JOIN KWARTALY KW ON > EXISTS > (SELECT > * > FROM > STATUS_PLATNIKA SP > INNER JOIN STATUS_PLATNIKA_TYP SPT ON > SP.ID_STATUS_PLATNIKA_TYP = SPT.ID > WHERE > SP.ID_KONTRAHENT = K.ID > AND SP.DATA_POZYSKANIA <= KD.MAX_ZALICZAJ_DO > AND (SPT.FLAGA_SYS IN(1) AND ((SP.DATA_OD <= KW.D_DO) AND > (SP.DATA_DO IS NULL OR (SP.DATA_DO >= KW.D_OD)))) > ) > WHERE > NOT EXISTS > (SELECT > * > FROM > SPR S > WHERE > S.ID_KONTRAHENT = K.ID > AND S.ID_URZADZENIE = U.ID > AND ((EXTRACT(YEAR FROM S.DATA_OD)*12+EXTRACT(MONTH FROM > S.DATA_OD)) BETWEEN(KW.ROK*12+KW.MIESIAC_OD) AND (KW.ROK*12+KW.MIESIAC_DO) OR > (EXTRACT(YEAR FROM S.DATA_DO)*12+EXTRACT(MONTH FROM S.DATA_DO)) > BETWEEN(KW.ROK*12+KW.MIESIAC_OD) AND (KW.ROK*12+KW.MIESIAC_DO)) > ) > ) AND (WITH KWARTALY AS > (SELECT > * > FROM > KWARTAL KW > WHERE > KW.CKWARTAL BETWEEN '2019.I' > AND '2019.I'), KWARTALY_DATY AS > (SELECT > MIN(KW.ZALICZAJ_OD) AS MIN_ZALICZAJ_OD > , MAX(KW.ZALICZAJ_DO) AS MAX_ZALICZAJ_DO > , MIN(KW.D_OD) AS MIN_D_OD > , MAX(KW.D_DO) AS MAX_D_DO > , MIN(KW.CKWARTAL) AS MIN_KWARTAL > , MAX(KW.CKWARTAL) AS MAX_KWARTAL > FROM > KWARTALY KW) > SELECT > DATEDIFF(DAY, KD.MIN_D_OD, KD.MAX_D_DO) > FROM > KWARTALY_DATY KD) =(WITH KWARTALY AS > (SELECT > * > FROM > KWARTAL KW > WHERE > KW.CKWARTAL BETWEEN '2019.I' > AND '2019.I'), KWARTALY_DATY AS > (SELECT > MIN(KW.ZALICZAJ_OD) AS MIN_ZALICZAJ_OD > , MAX(KW.ZALICZAJ_DO) AS MAX_ZALICZAJ_DO > , MIN(KW.D_OD) AS MIN_D_OD > , MAX(KW.D_DO) AS MAX_D_DO > , MIN(KW.CKWARTAL) AS MIN_KWARTAL > , MAX(KW.CKWARTAL) AS MAX_KWARTAL > FROM > KWARTALY KW) > SELECT > SUM(DATEDIFF(DAY, CASE WHEN SP.DATA_OD < KD.MIN_D_OD THEN KD.MIN_D_OD > ELSE SP.DATA_OD END, CASE WHEN COALESCE(SP.DATA_DO, KD.MAX_D_DO) > > KD.MAX_D_DO THEN KD.MAX_ZALICZAJ_DO ELSE COALESCE(SP.DATA_DO, KD.MAX_D_DO) > END)) > FROM > KWARTALY_DATY KD > INNER JOIN STATUS_PLATNIKA SP ON 1 = 1 > INNER JOIN STATUS_PLATNIKA_TYP SPT ON SP.ID_STATUS_PLATNIKA_TYP = > SPT.ID > WHERE > SP.ID_KONTRAHENT = K.ID > AND SP.DATA_POZYSKANIA <= KD.MAX_ZALICZAJ_DO > AND (SPT.FLAGA_SYS IN(2) AND SP.DATA_OD <= KD.MAX_D_DO AND > (SP.DATA_DO IS NULL OR SP.DATA_DO >= KD.MIN_D_OD)))) > > > FROM > KONTRAHENT K -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://tracker.firebirdsql.org/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira Firebird-Devel mailing list, web interface at https://lists.sourceforge.net/lists/listinfo/firebird-devel