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@mariadb.org 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@mariadb.org https://lists.askmonty.org/cgi-bin/mailman/listinfo/commits