← Back to team overview

maria-developers team mailing list archive

Re: [Commits] cb918231a25: MDEV-11582 InnoDB: Failing assertion: !((field)->vcol_info && !(field)->stored_in_db())

 

Hello Sergei,

The patch looks fine. I suggest one improvement.

Currently SERIAL can have various redundant, ignored, non-applicable
attributes, e.g.:

CREATE TABLE t1 (a SERIAL NULL);
CREATE TABLE t1 (a SERIAL AUTO_INCREMENT);
CREATE TABLE t1 (a SERIAL SERIAL DEFAULT VALUE);
CREATE OR REPLACE TABLE t1 (a SERIAL COLLATE `binary`);


Can we split the "attribute:" rule to disallow these for SERIAL?

Thanks!


On 02/09/2017 03:06 PM, serg@xxxxxxxxxxx wrote:
> revision-id: cb918231a25ee792749d7e64ebc97e19c0faaf09 (mariadb-10.2.3-192-gcb918231a25)
> parent(s): d1cc58f55ad516453aed42b65d71810e1392f745
> author: Sergei Golubchik
> committer: Sergei Golubchik
> timestamp: 2017-02-09 12:06:15 +0100
> message:
> 
> MDEV-11582 InnoDB: Failing assertion: !((field)->vcol_info && !(field)->stored_in_db())
> 
> change the parser not to allow SERIAL as a normal data type.
> make a special rule for it, where it could be used for define
> fields, but not generated fields, not return type of a stored function, etc.
> 
> ---
>  mysql-test/r/parser.result | 12 ++++++++++++
>  mysql-test/t/parser.test   | 11 +++++++++++
>  sql/sql_yacc.yy            | 22 ++++++++++++++--------
>  3 files changed, 37 insertions(+), 8 deletions(-)
> 
> diff --git a/mysql-test/r/parser.result b/mysql-test/r/parser.result
> index 7a0a8667350..1292b0bd2e5 100644
> --- a/mysql-test/r/parser.result
> +++ b/mysql-test/r/parser.result
> @@ -1289,3 +1289,15 @@ SELECT 1;
>  ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'UNION
>  SELECT 1' at line 2
>  DROP TABLE t1;
> +create table t1 (i int, vc serial as (i));
> +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'as (i))' at line 1
> +create function fs() returns serial return 1;
> +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'serial return 1' at line 1
> +create table t1 ( id serial );
> +show create table t1;
> +Table	Create Table
> +t1	CREATE TABLE `t1` (
> +  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
> +  UNIQUE KEY `id` (`id`)
> +) ENGINE=MyISAM DEFAULT CHARSET=latin1
> +drop table t1;
> diff --git a/mysql-test/t/parser.test b/mysql-test/t/parser.test
> index 1fa7df7fc3d..dc538db6073 100644
> --- a/mysql-test/t/parser.test
> +++ b/mysql-test/t/parser.test
> @@ -1321,3 +1321,14 @@ UNION
>  SELECT 1;
>  
>  DROP TABLE t1;
> +
> +#
> +# MDEV-11582 InnoDB: Failing assertion: !((field)->vcol_info && !(field)->stored_in_db())
> +#
> +--error ER_PARSE_ERROR
> +create table t1 (i int, vc serial as (i));
> +--error ER_PARSE_ERROR
> +create function fs() returns serial return 1;
> +create table t1 ( id serial );
> +show create table t1;
> +drop table t1;
> diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
> index 12423e71f1f..db22708db43 100644
> --- a/sql/sql_yacc.yy
> +++ b/sql/sql_yacc.yy
> @@ -6145,8 +6145,7 @@ field_spec:
>              lex->init_last_field(f, $1.str, NULL);
>              $<create_field>$= f;
>            }
> -          field_type  { Lex->set_last_field_type($3); }
> -          field_def
> +          field_type_or_serial
>            {
>              LEX *lex=Lex;
>              $$= $<create_field>2;
> @@ -6164,6 +6163,19 @@ field_spec:
>            }
>          ;
>  
> +field_type_or_serial:
> +          field_type  { Lex->set_last_field_type($1); } field_def
> +        | SERIAL_SYM
> +          {
> +            Lex_field_type_st type;
> +            type.set(MYSQL_TYPE_LONGLONG);
> +            Lex->set_last_field_type(type);
> +            Lex->last_field->flags|= AUTO_INCREMENT_FLAG | NOT_NULL_FLAG
> +                                     | UNSIGNED_FLAG | UNIQUE_KEY_FLAG;
> +          }
> +          opt_attribute
> +        ;
> +
>  field_def:
>            opt_attribute
>          | opt_generated_always AS virtual_column_func
> @@ -6441,12 +6453,6 @@ field_type:
>            { $$.set(MYSQL_TYPE_SET); }
>          | LONG_SYM opt_binary
>            { $$.set(MYSQL_TYPE_MEDIUM_BLOB); }
> -        | SERIAL_SYM
> -          {
> -            $$.set(MYSQL_TYPE_LONGLONG);
> -            Lex->last_field->flags|= (AUTO_INCREMENT_FLAG | NOT_NULL_FLAG | UNSIGNED_FLAG |
> -              UNIQUE_KEY_FLAG);
> -          }
>          ;
>  
>  spatial_type:
> _______________________________________________
> commits mailing list
> commits@xxxxxxxxxxx
> https://lists.askmonty.org/cgi-bin/mailman/listinfo/commits
>