Commit c0221b0e authored by Dmitry Lenev's avatar Dmitry Lenev

This patch is prerequisite for the 2nd milestone of WL#148 "Foreign keys"

storing and restoring information about foreign keys in the .FRM files and
properly displaying it in SHOW CREATE TABLE output and I_S tables.

The idea of this patch is to change type of Key_part_spec::field_name and
Key::name to LEX_STRING in order to avoid extra strlen() calls during
semantic analysis and statement execution, particularly, in code to be
implemented on the 2nd milestone of WL#148.

Note that since we are not using LEX_STRING everywhere yet (e.g. in
Create_field and KEY) and we want to limit scope of our changes we
have to do strlen() in places where we create Key and Key_part_spec
instances from objects using plain (char*) for strings. These calls
will go away during the process of further (char*) -> LEX_STRING
refactoring.

We have introduced these changes in 6.0 and backported them to 5.5
tree to make people aware of these changes as early as possible and
to simplify merges with mysql-fk and mysql-6.1-fk trees.

No test case is needed since this patch does not introduce any
user visible changes.

sql/sql_class.cc:
  Key_part_spec::field_name is now LEX_STRING. Adjusted code accordingly.
sql/sql_class.h:
  Changed type of Key_part_spec::field_name and Key::name to LEX_STRING in
  order to avoid extra strlen() calls in code responsible for semantic
  analysis and statement execution (e.g. in future code responsible for
  saving/restoring info about foreign keys).
sql/sql_lex.cc:
  Moved null_lex_str from sql_yacc.yy to sql_lex.cc and added its
  declaration to sql_lex.h to make it accessible in other SQL-layer
  modules (e.g. sql_parse.cc).
sql/sql_lex.h:
  Made null_lex_str accessible from outside of sql_lex.cc.
sql/sql_parse.cc:
  Key_part_spec::field_name and Key::name are now LEX_STRING. Adjusted
  code accordingly.
sql/sql_table.cc:
  Adjusted code to accomodate change of type to LEX_STRING for
  Key_part_spec::field_name and Key::name.
sql/sql_yacc.yy:
  Now Key::name and Key_part_spec::field_name are LEX_STRINGs. Adjusted
  grammar to be able properly initialize them. This should allow us to
  save on some strlen() calls during later stages of statement execution.
parent 0da35764
...@@ -90,7 +90,9 @@ extern "C" void free_user_var(user_var_entry *entry) ...@@ -90,7 +90,9 @@ extern "C" void free_user_var(user_var_entry *entry)
bool Key_part_spec::operator==(const Key_part_spec& other) const bool Key_part_spec::operator==(const Key_part_spec& other) const
{ {
return length == other.length && !strcmp(field_name, other.field_name); return length == other.length &&
field_name.length == other.field_name.length &&
!strcmp(field_name.str, other.field_name.str);
} }
/** /**
......
...@@ -145,9 +145,14 @@ typedef struct st_copy_info { ...@@ -145,9 +145,14 @@ typedef struct st_copy_info {
class Key_part_spec :public Sql_alloc { class Key_part_spec :public Sql_alloc {
public: public:
const char *field_name; LEX_STRING field_name;
uint length; uint length;
Key_part_spec(const char *name,uint len=0) :field_name(name), length(len) {} Key_part_spec(const LEX_STRING &name, uint len)
: field_name(name), length(len)
{}
Key_part_spec(const char *name, const size_t name_len, uint len)
: length(len)
{ field_name.str= (char *)name; field_name.length= name_len; }
bool operator==(const Key_part_spec& other) const; bool operator==(const Key_part_spec& other) const;
/** /**
Construct a copy of this Key_part_spec. field_name is copied Construct a copy of this Key_part_spec. field_name is copied
...@@ -200,15 +205,24 @@ public: ...@@ -200,15 +205,24 @@ public:
enum Keytype type; enum Keytype type;
KEY_CREATE_INFO key_create_info; KEY_CREATE_INFO key_create_info;
List<Key_part_spec> columns; List<Key_part_spec> columns;
const char *name; LEX_STRING name;
bool generated; bool generated;
Key(enum Keytype type_par, const char *name_arg, Key(enum Keytype type_par, const LEX_STRING &name_arg,
KEY_CREATE_INFO *key_info_arg, KEY_CREATE_INFO *key_info_arg,
bool generated_arg, List<Key_part_spec> &cols) bool generated_arg, List<Key_part_spec> &cols)
:type(type_par), key_create_info(*key_info_arg), columns(cols), :type(type_par), key_create_info(*key_info_arg), columns(cols),
name(name_arg), generated(generated_arg) name(name_arg), generated(generated_arg)
{} {}
Key(enum Keytype type_par, const char *name_arg, size_t name_len_arg,
KEY_CREATE_INFO *key_info_arg, bool generated_arg,
List<Key_part_spec> &cols)
:type(type_par), key_create_info(*key_info_arg), columns(cols),
generated(generated_arg)
{
name.str= (char *)name_arg;
name.length= name_len_arg;
}
Key(const Key &rhs, MEM_ROOT *mem_root); Key(const Key &rhs, MEM_ROOT *mem_root);
virtual ~Key() {} virtual ~Key() {}
/* Equality comparison of keys (ignoring name) */ /* Equality comparison of keys (ignoring name) */
...@@ -233,7 +247,7 @@ public: ...@@ -233,7 +247,7 @@ public:
Table_ident *ref_table; Table_ident *ref_table;
List<Key_part_spec> ref_columns; List<Key_part_spec> ref_columns;
uint delete_opt, update_opt, match_opt; uint delete_opt, update_opt, match_opt;
Foreign_key(const char *name_arg, List<Key_part_spec> &cols, Foreign_key(const LEX_STRING &name_arg, List<Key_part_spec> &cols,
Table_ident *table, List<Key_part_spec> &ref_cols, Table_ident *table, List<Key_part_spec> &ref_cols,
uint delete_opt_arg, uint update_opt_arg, uint match_opt_arg) uint delete_opt_arg, uint update_opt_arg, uint match_opt_arg)
:Key(FOREIGN_KEY, name_arg, &default_key_create_info, 0, cols), :Key(FOREIGN_KEY, name_arg, &default_key_create_info, 0, cols),
......
...@@ -31,7 +31,13 @@ ...@@ -31,7 +31,13 @@
sys_var *trg_new_row_fake_var= (sys_var*) 0x01; sys_var *trg_new_row_fake_var= (sys_var*) 0x01;
/**
LEX_STRING constant for null-string to be used in parser and other places.
*/
const LEX_STRING null_lex_str= {NULL, 0};
/* Longest standard keyword name */ /* Longest standard keyword name */
#define TOCK_NAME_LENGTH 24 #define TOCK_NAME_LENGTH 24
/* /*
......
...@@ -951,6 +951,8 @@ extern sys_var *trg_new_row_fake_var; ...@@ -951,6 +951,8 @@ extern sys_var *trg_new_row_fake_var;
enum xa_option_words {XA_NONE, XA_JOIN, XA_RESUME, XA_ONE_PHASE, enum xa_option_words {XA_NONE, XA_JOIN, XA_RESUME, XA_ONE_PHASE,
XA_SUSPEND, XA_FOR_MIGRATE}; XA_SUSPEND, XA_FOR_MIGRATE};
extern const LEX_STRING null_lex_str;
/* /*
Class representing list of all tables used by statement. Class representing list of all tables used by statement.
......
...@@ -6110,8 +6110,8 @@ bool add_field_to_list(THD *thd, LEX_STRING *field_name, enum_field_types type, ...@@ -6110,8 +6110,8 @@ bool add_field_to_list(THD *thd, LEX_STRING *field_name, enum_field_types type,
if (type_modifier & PRI_KEY_FLAG) if (type_modifier & PRI_KEY_FLAG)
{ {
Key *key; Key *key;
lex->col_list.push_back(new Key_part_spec(field_name->str, 0)); lex->col_list.push_back(new Key_part_spec(*field_name, 0));
key= new Key(Key::PRIMARY, NullS, key= new Key(Key::PRIMARY, null_lex_str,
&default_key_create_info, &default_key_create_info,
0, lex->col_list); 0, lex->col_list);
lex->alter_info.key_list.push_back(key); lex->alter_info.key_list.push_back(key);
...@@ -6120,8 +6120,8 @@ bool add_field_to_list(THD *thd, LEX_STRING *field_name, enum_field_types type, ...@@ -6120,8 +6120,8 @@ bool add_field_to_list(THD *thd, LEX_STRING *field_name, enum_field_types type,
if (type_modifier & (UNIQUE_FLAG | UNIQUE_KEY_FLAG)) if (type_modifier & (UNIQUE_FLAG | UNIQUE_KEY_FLAG))
{ {
Key *key; Key *key;
lex->col_list.push_back(new Key_part_spec(field_name->str, 0)); lex->col_list.push_back(new Key_part_spec(*field_name, 0));
key= new Key(Key::UNIQUE, NullS, key= new Key(Key::UNIQUE, null_lex_str,
&default_key_create_info, 0, &default_key_create_info, 0,
lex->col_list); lex->col_list);
lex->alter_info.key_list.push_back(key); lex->alter_info.key_list.push_back(key);
......
...@@ -2877,9 +2877,8 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info, ...@@ -2877,9 +2877,8 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
while ((key=key_iterator++)) while ((key=key_iterator++))
{ {
DBUG_PRINT("info", ("key name: '%s' type: %d", key->name ? key->name : DBUG_PRINT("info", ("key name: '%s' type: %d", key->name.str ? key->name.str :
"(none)" , key->type)); "(none)" , key->type));
LEX_STRING key_name_str;
if (key->type == Key::FOREIGN_KEY) if (key->type == Key::FOREIGN_KEY)
{ {
fk_key_count++; fk_key_count++;
...@@ -2888,7 +2887,8 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info, ...@@ -2888,7 +2887,8 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
fk_key->ref_columns.elements != fk_key->columns.elements) fk_key->ref_columns.elements != fk_key->columns.elements)
{ {
my_error(ER_WRONG_FK_DEF, MYF(0), my_error(ER_WRONG_FK_DEF, MYF(0),
(fk_key->name ? fk_key->name : "foreign key without name"), (fk_key->name.str ? fk_key->name.str :
"foreign key without name"),
ER(ER_KEY_REF_DO_NOT_MATCH_TABLE_REF)); ER(ER_KEY_REF_DO_NOT_MATCH_TABLE_REF));
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
} }
...@@ -2901,12 +2901,10 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info, ...@@ -2901,12 +2901,10 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
my_error(ER_TOO_MANY_KEY_PARTS,MYF(0),tmp); my_error(ER_TOO_MANY_KEY_PARTS,MYF(0),tmp);
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
} }
key_name_str.str= (char*) key->name; if (check_string_char_length(&key->name, "", NAME_CHAR_LEN,
key_name_str.length= key->name ? strlen(key->name) : 0;
if (check_string_char_length(&key_name_str, "", NAME_CHAR_LEN,
system_charset_info, 1)) system_charset_info, 1))
{ {
my_error(ER_TOO_LONG_IDENT, MYF(0), key->name); my_error(ER_TOO_LONG_IDENT, MYF(0), key->name.str);
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
} }
key_iterator2.rewind (); key_iterator2.rewind ();
...@@ -2920,7 +2918,7 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info, ...@@ -2920,7 +2918,7 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
Then we do not need the generated shorter key. Then we do not need the generated shorter key.
*/ */
if ((key2->type != Key::FOREIGN_KEY && if ((key2->type != Key::FOREIGN_KEY &&
key2->name != ignore_key && key2->name.str != ignore_key &&
!foreign_key_prefix(key, key2))) !foreign_key_prefix(key, key2)))
{ {
/* TODO: issue warning message */ /* TODO: issue warning message */
...@@ -2928,10 +2926,10 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info, ...@@ -2928,10 +2926,10 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
if (!key2->generated || if (!key2->generated ||
(key->generated && key->columns.elements < (key->generated && key->columns.elements <
key2->columns.elements)) key2->columns.elements))
key->name= ignore_key; key->name.str= ignore_key;
else else
{ {
key2->name= ignore_key; key2->name.str= ignore_key;
key_parts-= key2->columns.elements; key_parts-= key2->columns.elements;
(*key_count)--; (*key_count)--;
} }
...@@ -2939,14 +2937,14 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info, ...@@ -2939,14 +2937,14 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
} }
} }
} }
if (key->name != ignore_key) if (key->name.str != ignore_key)
key_parts+=key->columns.elements; key_parts+=key->columns.elements;
else else
(*key_count)--; (*key_count)--;
if (key->name && !tmp_table && (key->type != Key::PRIMARY) && if (key->name.str && !tmp_table && (key->type != Key::PRIMARY) &&
!my_strcasecmp(system_charset_info,key->name,primary_key_name)) !my_strcasecmp(system_charset_info, key->name.str, primary_key_name))
{ {
my_error(ER_WRONG_NAME_FOR_INDEX, MYF(0), key->name); my_error(ER_WRONG_NAME_FOR_INDEX, MYF(0), key->name.str);
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
} }
} }
...@@ -2969,12 +2967,12 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info, ...@@ -2969,12 +2967,12 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
uint key_length=0; uint key_length=0;
Key_part_spec *column; Key_part_spec *column;
if (key->name == ignore_key) if (key->name.str == ignore_key)
{ {
/* ignore redundant keys */ /* ignore redundant keys */
do do
key=key_iterator++; key=key_iterator++;
while (key && key->name == ignore_key); while (key && key->name.str == ignore_key);
if (!key) if (!key)
break; break;
} }
...@@ -3087,22 +3085,22 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info, ...@@ -3087,22 +3085,22 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
field=0; field=0;
while ((sql_field=it++) && while ((sql_field=it++) &&
my_strcasecmp(system_charset_info, my_strcasecmp(system_charset_info,
column->field_name, column->field_name.str,
sql_field->field_name)) sql_field->field_name))
field++; field++;
if (!sql_field) if (!sql_field)
{ {
my_error(ER_KEY_COLUMN_DOES_NOT_EXITS, MYF(0), column->field_name); my_error(ER_KEY_COLUMN_DOES_NOT_EXITS, MYF(0), column->field_name.str);
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
} }
while ((dup_column= cols2++) != column) while ((dup_column= cols2++) != column)
{ {
if (!my_strcasecmp(system_charset_info, if (!my_strcasecmp(system_charset_info,
column->field_name, dup_column->field_name)) column->field_name.str, dup_column->field_name.str))
{ {
my_printf_error(ER_DUP_FIELDNAME, my_printf_error(ER_DUP_FIELDNAME,
ER(ER_DUP_FIELDNAME),MYF(0), ER(ER_DUP_FIELDNAME),MYF(0),
column->field_name); column->field_name.str);
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
} }
} }
...@@ -3116,7 +3114,7 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info, ...@@ -3116,7 +3114,7 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
sql_field->charset->mbminlen > 1 || // ucs2 doesn't work yet sql_field->charset->mbminlen > 1 || // ucs2 doesn't work yet
(ft_key_charset && sql_field->charset != ft_key_charset)) (ft_key_charset && sql_field->charset != ft_key_charset))
{ {
my_error(ER_BAD_FT_COLUMN, MYF(0), column->field_name); my_error(ER_BAD_FT_COLUMN, MYF(0), column->field_name.str);
DBUG_RETURN(-1); DBUG_RETURN(-1);
} }
ft_key_charset=sql_field->charset; ft_key_charset=sql_field->charset;
...@@ -3144,7 +3142,7 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info, ...@@ -3144,7 +3142,7 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
{ {
if (!(file->ha_table_flags() & HA_CAN_INDEX_BLOBS)) if (!(file->ha_table_flags() & HA_CAN_INDEX_BLOBS))
{ {
my_error(ER_BLOB_USED_AS_KEY, MYF(0), column->field_name); my_error(ER_BLOB_USED_AS_KEY, MYF(0), column->field_name.str);
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
} }
if (f_is_geom(sql_field->pack_flag) && sql_field->geom_type == if (f_is_geom(sql_field->pack_flag) && sql_field->geom_type ==
...@@ -3152,7 +3150,7 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info, ...@@ -3152,7 +3150,7 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
column->length= 25; column->length= 25;
if (!column->length) if (!column->length)
{ {
my_error(ER_BLOB_KEY_WITHOUT_LENGTH, MYF(0), column->field_name); my_error(ER_BLOB_KEY_WITHOUT_LENGTH, MYF(0), column->field_name.str);
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
} }
} }
...@@ -3183,7 +3181,7 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info, ...@@ -3183,7 +3181,7 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
key_info->flags|= HA_NULL_PART_KEY; key_info->flags|= HA_NULL_PART_KEY;
if (!(file->ha_table_flags() & HA_NULL_IN_KEY)) if (!(file->ha_table_flags() & HA_NULL_IN_KEY))
{ {
my_error(ER_NULL_COLUMN_IN_INDEX, MYF(0), column->field_name); my_error(ER_NULL_COLUMN_IN_INDEX, MYF(0), column->field_name.str);
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
} }
if (key->type == Key::SPATIAL) if (key->type == Key::SPATIAL)
...@@ -3256,7 +3254,7 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info, ...@@ -3256,7 +3254,7 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
} }
else if (length == 0) else if (length == 0)
{ {
my_error(ER_WRONG_KEY_COLUMN, MYF(0), column->field_name); my_error(ER_WRONG_KEY_COLUMN, MYF(0), column->field_name.str);
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
} }
if (length > file->max_key_part_length() && key->type != Key::FULLTEXT) if (length > file->max_key_part_length() && key->type != Key::FULLTEXT)
...@@ -3314,7 +3312,7 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info, ...@@ -3314,7 +3312,7 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
key_name=primary_key_name; key_name=primary_key_name;
primary_key=1; primary_key=1;
} }
else if (!(key_name = key->name)) else if (!(key_name= key->name.str))
key_name=make_unique_key_name(sql_field->field_name, key_name=make_unique_key_name(sql_field->field_name,
*key_info_buffer, key_info); *key_info_buffer, key_info);
if (check_if_keyname_exists(key_name, *key_info_buffer, key_info)) if (check_if_keyname_exists(key_name, *key_info_buffer, key_info))
...@@ -6244,6 +6242,7 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, ...@@ -6244,6 +6242,7 @@ mysql_prepare_alter_table(THD *thd, TABLE *table,
} }
key_part_length /= key_part->field->charset()->mbmaxlen; key_part_length /= key_part->field->charset()->mbmaxlen;
key_parts.push_back(new Key_part_spec(cfield->field_name, key_parts.push_back(new Key_part_spec(cfield->field_name,
strlen(cfield->field_name),
key_part_length)); key_part_length));
} }
if (key_parts.elements) if (key_parts.elements)
...@@ -6273,7 +6272,7 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, ...@@ -6273,7 +6272,7 @@ mysql_prepare_alter_table(THD *thd, TABLE *table,
else else
key_type= Key::MULTIPLE; key_type= Key::MULTIPLE;
key= new Key(key_type, key_name, key= new Key(key_type, key_name, strlen(key_name),
&key_create_info, &key_create_info,
test(key_info->flags & HA_GENERATED_KEY), test(key_info->flags & HA_GENERATED_KEY),
key_parts); key_parts);
...@@ -6286,10 +6285,10 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, ...@@ -6286,10 +6285,10 @@ mysql_prepare_alter_table(THD *thd, TABLE *table,
{ {
if (key->type != Key::FOREIGN_KEY) if (key->type != Key::FOREIGN_KEY)
new_key_list.push_back(key); new_key_list.push_back(key);
if (key->name && if (key->name.str &&
!my_strcasecmp(system_charset_info,key->name,primary_key_name)) !my_strcasecmp(system_charset_info, key->name.str, primary_key_name))
{ {
my_error(ER_WRONG_NAME_FOR_INDEX, MYF(0), key->name); my_error(ER_WRONG_NAME_FOR_INDEX, MYF(0), key->name.str);
goto err; goto err;
} }
} }
......
...@@ -56,8 +56,6 @@ ...@@ -56,8 +56,6 @@
int yylex(void *yylval, void *yythd); int yylex(void *yylval, void *yythd);
const LEX_STRING null_lex_str= {0,0};
#define yyoverflow(A,B,C,D,E,F) \ #define yyoverflow(A,B,C,D,E,F) \
{ \ { \
ulong val= *(F); \ ulong val= *(F); \
...@@ -1147,6 +1145,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); ...@@ -1147,6 +1145,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
IDENT_sys TEXT_STRING_sys TEXT_STRING_literal IDENT_sys TEXT_STRING_sys TEXT_STRING_literal
NCHAR_STRING opt_component key_cache_name NCHAR_STRING opt_component key_cache_name
sp_opt_label BIN_NUM label_ident TEXT_STRING_filesystem ident_or_empty sp_opt_label BIN_NUM label_ident TEXT_STRING_filesystem ident_or_empty
opt_constraint constraint opt_ident
%type <lex_str_ptr> %type <lex_str_ptr>
opt_table_alias opt_table_alias
...@@ -1155,8 +1154,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); ...@@ -1155,8 +1154,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
table_ident table_ident_nodb references xid table_ident table_ident_nodb references xid
%type <simple_string> %type <simple_string>
remember_name remember_end opt_ident opt_db text_or_password remember_name remember_end opt_db text_or_password
opt_constraint constraint
%type <string> %type <string>
text_string opt_gconcat_separator text_string opt_gconcat_separator
...@@ -1738,7 +1736,7 @@ create: ...@@ -1738,7 +1736,7 @@ create:
my_parse_error(ER(ER_SYNTAX_ERROR)); my_parse_error(ER(ER_SYNTAX_ERROR));
MYSQL_YYABORT; MYSQL_YYABORT;
} }
key= new Key($2, $4.str, &lex->key_create_info, 0, key= new Key($2, $4, &lex->key_create_info, 0,
lex->col_list); lex->col_list);
if (key == NULL) if (key == NULL)
MYSQL_YYABORT; MYSQL_YYABORT;
...@@ -4873,8 +4871,7 @@ key_def: ...@@ -4873,8 +4871,7 @@ key_def:
'(' key_list ')' key_options '(' key_list ')' key_options
{ {
LEX *lex=Lex; LEX *lex=Lex;
const char *key_name= $3 ? $3 : $1; Key *key= new Key($2, $3.str ? $3 : $1, &lex->key_create_info, 0,
Key *key= new Key($2, key_name, &lex->key_create_info, 0,
lex->col_list); lex->col_list);
if (key == NULL) if (key == NULL)
MYSQL_YYABORT; MYSQL_YYABORT;
...@@ -4884,9 +4881,7 @@ key_def: ...@@ -4884,9 +4881,7 @@ key_def:
| opt_constraint FOREIGN KEY_SYM opt_ident '(' key_list ')' references | opt_constraint FOREIGN KEY_SYM opt_ident '(' key_list ')' references
{ {
LEX *lex=Lex; LEX *lex=Lex;
const char *key_name= $1 ? $1 : $4; Key *key= new Foreign_key($4.str ? $4 : $1, lex->col_list,
const char *fkey_name = $4 ? $4 : key_name;
Key *key= new Foreign_key(fkey_name, lex->col_list,
$8, $8,
lex->ref_list, lex->ref_list,
lex->fk_delete_opt, lex->fk_delete_opt,
...@@ -4895,7 +4890,7 @@ key_def: ...@@ -4895,7 +4890,7 @@ key_def:
if (key == NULL) if (key == NULL)
MYSQL_YYABORT; MYSQL_YYABORT;
lex->alter_info.key_list.push_back(key); lex->alter_info.key_list.push_back(key);
key= new Key(Key::MULTIPLE, key_name, key= new Key(Key::MULTIPLE, $1.str ? $1 : $4,
&default_key_create_info, 1, &default_key_create_info, 1,
lex->col_list); lex->col_list);
if (key == NULL) if (key == NULL)
...@@ -4925,7 +4920,7 @@ check_constraint: ...@@ -4925,7 +4920,7 @@ check_constraint:
; ;
opt_constraint: opt_constraint:
/* empty */ { $$=(char*) 0; } /* empty */ { $$= null_lex_str; }
| constraint { $$= $1; } | constraint { $$= $1; }
; ;
...@@ -5430,14 +5425,14 @@ opt_ref_list: ...@@ -5430,14 +5425,14 @@ opt_ref_list:
ref_list: ref_list:
ref_list ',' ident ref_list ',' ident
{ {
Key_part_spec *key= new Key_part_spec($3.str); Key_part_spec *key= new Key_part_spec($3, 0);
if (key == NULL) if (key == NULL)
MYSQL_YYABORT; MYSQL_YYABORT;
Lex->ref_list.push_back(key); Lex->ref_list.push_back(key);
} }
| ident | ident
{ {
Key_part_spec *key= new Key_part_spec($1.str); Key_part_spec *key= new Key_part_spec($1, 0);
if (key == NULL) if (key == NULL)
MYSQL_YYABORT; MYSQL_YYABORT;
Lex->ref_list.push_back(key); Lex->ref_list.push_back(key);
...@@ -5584,7 +5579,7 @@ key_list: ...@@ -5584,7 +5579,7 @@ key_list:
key_part: key_part:
ident ident
{ {
$$= new Key_part_spec($1.str); $$= new Key_part_spec($1, 0);
if ($$ == NULL) if ($$ == NULL)
MYSQL_YYABORT; MYSQL_YYABORT;
} }
...@@ -5595,15 +5590,15 @@ key_part: ...@@ -5595,15 +5590,15 @@ key_part:
{ {
my_error(ER_KEY_PART_0, MYF(0), $1.str); my_error(ER_KEY_PART_0, MYF(0), $1.str);
} }
$$= new Key_part_spec($1.str,(uint) key_part_len); $$= new Key_part_spec($1, (uint) key_part_len);
if ($$ == NULL) if ($$ == NULL)
MYSQL_YYABORT; MYSQL_YYABORT;
} }
; ;
opt_ident: opt_ident:
/* empty */ { $$=(char*) 0; /* Default length */ } /* empty */ { $$= null_lex_str; }
| field_ident { $$=$1.str; } | field_ident { $$= $1; }
; ;
opt_component: opt_component:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment