Oraculix

Geschichten aus dem Alltag der Oracle Datenbank-Programmierung und -Administration

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

Geschrieben von Uwe M. Küchler am 11. Oktober 2011

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

Kommentar verfassen

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

WordPress.com-Logo

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

Twitter-Bild

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

Facebook-Foto

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

Verbinde mit %s

 
Follow

Get every new post delivered to your Inbox.