maria-developers team mailing list archive
-
maria-developers team
-
Mailing list archive
-
Message #10929
Re: MDEV-14038 ALTER TABLE does not exit on error with InnoDB + bad default function
Hi Bar,
The logic of the fix looks sound to me. Before you push, I would like you
to address one comment.
This first suggestion is optional:
diff --git a/mysql-test/suite/innodb/t/innodb-online-alter-gis.test
> b/mysql-test/suite/innodb/t/innodb-online-alter-gis.test
> index 64d07ba..3f39750 100644
> --- a/mysql-test/suite/innodb/t/innodb-online-alter-gis.test
> +++ b/mysql-test/suite/innodb/t/innodb-online-alter-gis.test
> @@ -19,3 +19,13 @@ ALTER ONLINE TABLE t1 ADD PRIMARY KEY(a),DROP INDEX d,
> LOCK=SHARED;
> show warnings;
> show errors;
> drop table t1;
> +
> +--echo #
> +--echo # MDEV-14038 ALTER TABLE does not exit on error with InnoDB + bad
> default function
> +--echo #
> +
> +CREATE OR REPLACE TABLE t1 (a INT) ENGINE=InnoDB;
> +--error ER_TRUNCATED_WRONG_VALUE_FOR_FIELD
> +ALTER TABLE t1 ADD COLUMN b LINESTRING DEFAULT POINT(1,1);
> +DESCRIBE t1;
> +DROP TABLE t1;
>
Consider using CREATE TABLE instead of CREATE OR REPLACE TABLE. The table
will not pre-exist here because of the preceding DROP TABLE t1.
diff --git a/storage/innobase/handler/handler0alter.cc
> b/storage/innobase/handler/handler0alter.cc
> index 084fc80..6a6295e 100644
> --- a/storage/innobase/handler/handler0alter.cc
> +++ b/storage/innobase/handler/handler0alter.cc
> @@ -1069,8 +1069,9 @@ ha_innobase::check_if_supported_inplace_alter(
>
> /* Compute the DEFAULT values of non-constant columns
> (VCOL_SESSION_FUNC | VCOL_TIME_FUNC). */
> - (*af)->set_default();
> - goto next_column;
> + int rc= (*af)->set_default();
> + if (rc == 0 || rc == 3)
> + goto next_column;
> }
>
> DBUG_RETURN(HA_ALTER_INPLACE_NOT_SUPPORTED);
>
In the InnoDB coding style, {} braces are mandatory after "if" and "while".
Would it be possible to change the return type of Field::set_default() to
an enum, and to use switch here? It is not clear what the other possible
error return values are, or what the code 3 means. I tried to search, and I
did not find any symbolic name that could be used in place of the 3. It
looks like some date or time conversions could return 3 when the data is
truncated. Maybe this truncation is considered minor compared to the
original issue (clamping 1000 to 127).
I would suggest the following:
switch ((*af)->set_default()) {
case 0: /* No error */
case 3: /* Date or time precision loss */
goto next_column;
}
My suggested comment after "case 3:" is a guess. Feel free to adjust it.
Best regards,
Marko
References