Fixes Field_datetime::store(NUMBER) to throw an error when invalid date time numbers are passed through.
This fix illuminated a bug in the optimizer, where the following:
CREATE TABLE t1 (d datetime NOT NULL); SELECT * FROM t1 WHERE d IS NULL;
was producing an incorrect query plan. The reason is because the optimizer was incorrectly reducing an Item_func_isnull to an Item_int with a value of 0. In MySQL, the optimizer compares datetimes as integers, and *just in the optimizer*, ignores bad datetimes so that it can do this comparison. Unfortunately for MySQL, what this means is that the optimizer cannot optimize away the above IS NULL condition because it converts the NULL to a 0000-00-00 00:00:00.
Drizzle's optimizer now shows an impossible WHERE reduction in the explain output for the above query, which is optimal.
Also fixed an assert that was occurring in mysql_alter_table because that function called fix_fields() which ignores data truncation errors improperly and mysql_alter_table ignores the errors as well, which led to an assertion failure in Diagnostics_area::send_ok_status() because mysql_alter_table() assumes that all errors would be logged as only warnings from Field::store().
Also contained in this patch is corrections for invalid numeric datetime input for all test cases affected.