Dit is een Oracle-bug.
Het wordt geactiveerd door een kolom toe te voegen met zowel een NOT NULL
beperking en een DEFAULT
waarde toe aan een bestaande tabel.
Om de kolom snel toe te voegen, slaat Oracle 11g de standaardwaarde op in de datadictionary. Oracle noemt dit "kolomoptimalisatie toevoegen".
Dit is sneller dan het wegschrijven van de standaardwaarde in elke tabelrij. De query-engine moet dan elke NULL in de tabelrij vervangen door de standaardwaarde uit de datadictionary. Helaas zijn er verschillende bugs die hiermee te maken hebben. De jouwe lijkt een instantie te zijn van:
U kunt als volgt controleren welke kolommen zijn toegevoegd:
select owner, object_name, name
from dba_objects, col$
where bitand(col$.PROPERTY,1073741824)=1073741824
and object_id=obj#;
In ons geval werden we gestoken door een andere bug die de verkeerde resultaten opleverde voor een SELECT FOR UPDATE
.
We stellen parameter _add_col_optim_enabled=FALSE
in om deze "optimalisatie" uit te schakelen. Als alternatief kunt u mogelijk upgraden naar een latere Oracle-versie waarin deze bugs zijn opgelost.
Het upgraden of instellen van de bovenstaande parameter zal uw bestaande tabel, die corrupt is, niet herstellen. Je moet die tabel opnieuw maken.