[ 
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

Reply via email to