Neulich entdeckte ich, dass eine Tabelle, die eigentlich per Trigger regelmäßig neu erzeugt werden sollte, nicht mehr generiert wird. Das Script ist recht schlicht:
DROP TABLE IF EXISTS <tablename>;
CREATE TABLE <tablename> AS SELECT ...
Von Hand ausgeführt zeigte der CREATE TABLE
-Befehl folgenden Fehler:
#1292 - Truncated incorrect DOUBLE value:
Nun existiert allerdings weder in der Zieltabelle noch in einer der Quellen (zwei Views, die wiederum auf mehreren Tabellen basieren) irgendein DOUBLE
-Wert. Es gibt ausschließlich INT und String-Felder. Das gab mir zu denken.
Zudem ließ sich der SELECT
-Befehl problemlos und fehlerfrei ausführen. Erst durch das CREATE TABLE ... AS ...
(oder auch ein SELECT ... INTO ...
) wird der Fehler erzeugt.
Nach einiger Recherche stieß ich auf viele ähnlich gelagerte Fälle. Das grundlegende Problem ist wohl ein Vergleich zwischen einem numerischen und einem String-Wert in irgendeinem der beteiligten Views. Dafür werden intern wohl beide Werte in DOUBLE
-Typen umgewandelt, was bei einem String zu einem Fehler führt. Warum der Fehler allerdings erst beim SELECT INTO
oder CREATE TABLE AS
und nicht schon beim SELECT
entsteht, bleibt schleierhaft.
Es wurde eine längere Suche. Nach gefühlt Stunden fand ich dann folgende Bedingung in einem der Views:
... WHERE (`cat_address`.`closure` IS NULL
OR `cat_address`.`closure` = '') ...
Da liegt der Hase im Pfeffer, denn cat_address.closure
ist kein String, sondern ein TINYINT
. Werden intern für den Vergleich beide Werte in DOUBLE
umgewandelt, erzeugt das bei einem String den besagten Fehler. Dass hier mit einem leeren String verglichen wird, erklärt auch den scheinbar abgeschnittenen Fehlerwert am Ende der Fehlermeldung.
Mit folgender winziger Änderung ist das Problem behoben:
... WHERE (`cat_address`.`closure` IS NULL
OR `cat_address`.`closure` = 0) ...
Kleine Änderung, große Wirkung. Mit einer etwas aussagekräftigeren Fehlermeldung hätte mir Oracle bzw. die MariaDB-Entwickler allerdings viel Zeit erspart.
Hallo Jörg,
vielen Dank für den Tipp! Ich hatte ebenfalls den Fehler 1292 in Zusammenhang mit dem Typ UUID - 1292: Incorrect uuid value ” bei der Bedingung
WHERE tbc.id = CAST(refstr AS UUID)
wobei tbc.id vom Typ UUID ist.
refstr konnte den Wert ” annehmen und CAST(refstr AS UUID) gibt dann korrekt (null) aus, was in der Bedingung auch OK gewesen wäre… nur eben nicht in der Kombination von Vergleich und CAST. Es hat den Anschein, dass der CAST (” as UUID ) beim Vergleich eben kein (null) zurückgibt - im Gegensatz zum SELECT CAST( ” AS UUID ).