Böser Bug: CASE liefert zusätzliche Rows zurück

Heute gibt’s mal wieder nur einen kurzen Post, aber dieser Bug ist so gemein, daß ich ihn gleich öffentlich dokumentieren wollte. Schließlich hat er zur Folge, daß auf die Ergebnisse von Abfragen mit CASE-Anweisungen kein Verlass mehr ist!

Szenario

Konstellation:

  • Oracle-Versionen zwischen 9.2.0.1 und 11.1.x (in meinem Fall: 10.2.0.4)

Bei der Ausführung beliebiger SQLs mit einer CASE-Anweisung (die genauen Auslöser sind unklar) kann es dazu kommen, daß falsche Ergebnisse geliefert werden, meist mehr als erwartet.

In anderen Fällen kann es dazu kommen, daß Teile einer CASE-Bedingung evaluiert werden, obwohl bereits ein vorhergehender Teil TRUE ergibt und daher laut Dokumentation nachfolgende Teile nicht mehr evaluiert werden sollten („Short Circuit“). So kann es dann zu Abbrüchen – z.B. wegen falscher Datentypen – kommen, die aufgrund der vorherigen Bedingungen gar nicht hätten auftreten dürfen.

In wieder anderen Fällen kann es dazu kommen, dass weniger Ergebnisse als erwartet geliefert werden, weil zusätzliche Prädikate in die Abfrage „eingebaut“ werden.

Betroffen sind anscheinend CASE-Anweisungen, die mehrere Bedingungen umfassen. Hier ist ein Testfall, bei dem alle Bedingungen „FALSE“ ergeben, daher müsste eine leere Menge zurückgeliefert werden. Betroffene Systeme liefern hierbei jedoch eine Row:

SELECT 1 FROM DUAL
 WHERE CASE
        WHEN (1 = 2) THEN 'A'
        WHEN (1 = 2) THEN 'B'
        WHEN (SUBSTR ('12345', 2, 1) ='2') THEN 'M'
        WHEN (1 = 2) THEN 'Y' WHEN (1 = 2) THEN 'Z'
        ELSE 'Error'
       END IN ('A','Z');

Abhilfe

Es gibt z.T. One-Off Patches für den Bug 6344497. In der Regel empfiehlt Oracle jedoch ein Upgrade auf 10.2.0.5 oder 11.2.x.

Weblinks

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s