Commit 28b7b6d9 authored by unknown's avatar unknown

Added missing semicolons in sql_yacc.yy, and did a style clean-up.

Note: Textual changes only, no functional changes.


sql/sql_yacc.yy:
  Added missing semicolons to quiet yacc warnings.
  Also did a general style clean-up, placing clause terminating semicolons in
  a consistent way (on separate lines).
BitKeeper/etc/logging_ok:
  Logging to logging@openlogging.org accepted
parent 417aefa0
...@@ -89,3 +89,4 @@ zak@balfor.local ...@@ -89,3 +89,4 @@ zak@balfor.local
zak@linux.local zak@linux.local
zgreant@mysql.com zgreant@mysql.com
mwagner@work.mysql.com mwagner@work.mysql.com
pem@mysql.com
...@@ -656,7 +656,8 @@ query: ...@@ -656,7 +656,8 @@ query:
thd->lex.sql_command = SQLCOM_EMPTY_QUERY; thd->lex.sql_command = SQLCOM_EMPTY_QUERY;
} }
} }
| verb_clause END_OF_INPUT {}; | verb_clause END_OF_INPUT {}
;
verb_clause: verb_clause:
alter alter
...@@ -694,7 +695,8 @@ verb_clause: ...@@ -694,7 +695,8 @@ verb_clause:
| handler | handler
| unlock | unlock
| update | update
| use; | use
;
/* change master */ /* change master */
...@@ -704,11 +706,13 @@ change: ...@@ -704,11 +706,13 @@ change:
LEX *lex = Lex; LEX *lex = Lex;
lex->sql_command = SQLCOM_CHANGE_MASTER; lex->sql_command = SQLCOM_CHANGE_MASTER;
memset(&lex->mi, 0, sizeof(lex->mi)); memset(&lex->mi, 0, sizeof(lex->mi));
} master_defs; } master_defs
;
master_defs: master_defs:
master_def master_def
| master_defs ',' master_def; | master_defs ',' master_def
;
master_def: master_def:
MASTER_HOST_SYM EQ TEXT_STRING MASTER_HOST_SYM EQ TEXT_STRING
...@@ -754,8 +758,8 @@ master_def: ...@@ -754,8 +758,8 @@ master_def:
RELAY_LOG_POS_SYM EQ ULONG_NUM RELAY_LOG_POS_SYM EQ ULONG_NUM
{ {
Lex->mi.relay_log_pos = $3; Lex->mi.relay_log_pos = $3;
}; }
;
/* create a table */ /* create a table */
...@@ -819,11 +823,13 @@ create: ...@@ -819,11 +823,13 @@ create:
LEX *lex=Lex; LEX *lex=Lex;
lex->udf.returns=(Item_result) $7; lex->udf.returns=(Item_result) $7;
lex->udf.dl=$9.str; lex->udf.dl=$9.str;
}; }
;
create2: create2:
'(' field_list ')' opt_create_table_options create3 {} '(' field_list ')' opt_create_table_options create3 {}
| opt_create_table_options create3 {}; | opt_create_table_options create3 {}
;
create3: create3:
/* empty */ {} /* empty */ {}
...@@ -833,34 +839,42 @@ create3: ...@@ -833,34 +839,42 @@ create3:
lex->lock_option= (using_update_log) ? TL_READ_NO_INSERT : TL_READ; lex->lock_option= (using_update_log) ? TL_READ_NO_INSERT : TL_READ;
mysql_init_select(lex); mysql_init_select(lex);
} }
select_options select_item_list opt_select_from union {}; select_options select_item_list opt_select_from union {}
;
opt_as: opt_as:
/* empty */ {} /* empty */ {}
| AS {}; | AS {}
;
opt_table_options: opt_table_options:
/* empty */ { $$= 0; } /* empty */ { $$= 0; }
| table_options { $$= $1;}; | table_options { $$= $1;}
;
table_options: table_options:
table_option { $$=$1; } table_option { $$=$1; }
| table_option table_options { $$= $1 | $2; }; | table_option table_options { $$= $1 | $2; }
;
table_option: table_option:
TEMPORARY { $$=HA_LEX_CREATE_TMP_TABLE; }; TEMPORARY { $$=HA_LEX_CREATE_TMP_TABLE; }
;
opt_if_not_exists: opt_if_not_exists:
/* empty */ { $$= 0; } /* empty */ { $$= 0; }
| IF NOT EXISTS { $$=HA_LEX_CREATE_IF_NOT_EXISTS; }; | IF NOT EXISTS { $$=HA_LEX_CREATE_IF_NOT_EXISTS; }
;
opt_create_table_options: opt_create_table_options:
/* empty */ /* empty */
| create_table_options; | create_table_options
;
create_table_options: create_table_options:
create_table_option create_table_option
| create_table_option create_table_options; | create_table_option create_table_options
;
create_table_option: create_table_option:
TYPE_SYM EQ table_types { Lex->create_info.db_type= $3; } TYPE_SYM EQ table_types { Lex->create_info.db_type= $3; }
...@@ -898,7 +912,8 @@ create_table_option: ...@@ -898,7 +912,8 @@ create_table_option:
} }
| INSERT_METHOD EQ merge_insert_types { Lex->create_info.merge_insert_method= $3; Lex->create_info.used_fields|= HA_CREATE_USED_INSERT_METHOD;} | INSERT_METHOD EQ merge_insert_types { Lex->create_info.merge_insert_method= $3; Lex->create_info.used_fields|= HA_CREATE_USED_INSERT_METHOD;}
| DATA_SYM DIRECTORY_SYM EQ TEXT_STRING { Lex->create_info.data_file_name= $4.str; } | DATA_SYM DIRECTORY_SYM EQ TEXT_STRING { Lex->create_info.data_file_name= $4.str; }
| INDEX DIRECTORY_SYM EQ TEXT_STRING { Lex->create_info.index_file_name= $4.str; }; | INDEX DIRECTORY_SYM EQ TEXT_STRING { Lex->create_info.index_file_name= $4.str; }
;
table_types: table_types:
ISAM_SYM { $$= DB_TYPE_ISAM; } ISAM_SYM { $$= DB_TYPE_ISAM; }
...@@ -906,41 +921,48 @@ table_types: ...@@ -906,41 +921,48 @@ table_types:
| MERGE_SYM { $$= DB_TYPE_MRG_MYISAM; } | MERGE_SYM { $$= DB_TYPE_MRG_MYISAM; }
| HEAP_SYM { $$= DB_TYPE_HEAP; } | HEAP_SYM { $$= DB_TYPE_HEAP; }
| BERKELEY_DB_SYM { $$= DB_TYPE_BERKELEY_DB; } | BERKELEY_DB_SYM { $$= DB_TYPE_BERKELEY_DB; }
| INNOBASE_SYM { $$= DB_TYPE_INNODB; }; | INNOBASE_SYM { $$= DB_TYPE_INNODB; }
;
row_types: row_types:
DEFAULT { $$= ROW_TYPE_DEFAULT; } DEFAULT { $$= ROW_TYPE_DEFAULT; }
| FIXED_SYM { $$= ROW_TYPE_FIXED; } | FIXED_SYM { $$= ROW_TYPE_FIXED; }
| DYNAMIC_SYM { $$= ROW_TYPE_DYNAMIC; } | DYNAMIC_SYM { $$= ROW_TYPE_DYNAMIC; }
| COMPRESSED_SYM { $$= ROW_TYPE_COMPRESSED; }; | COMPRESSED_SYM { $$= ROW_TYPE_COMPRESSED; }
;
raid_types: raid_types:
RAID_STRIPED_SYM { $$= RAID_TYPE_0; } RAID_STRIPED_SYM { $$= RAID_TYPE_0; }
| RAID_0_SYM { $$= RAID_TYPE_0; } | RAID_0_SYM { $$= RAID_TYPE_0; }
| ULONG_NUM { $$=$1;}; | ULONG_NUM { $$=$1; }
;
merge_insert_types: merge_insert_types:
NO_SYM { $$= MERGE_INSERT_DISABLED; } NO_SYM { $$= MERGE_INSERT_DISABLED; }
| FIRST_SYM { $$= MERGE_INSERT_TO_FIRST; } | FIRST_SYM { $$= MERGE_INSERT_TO_FIRST; }
| LAST_SYM { $$= MERGE_INSERT_TO_LAST; }; | LAST_SYM { $$= MERGE_INSERT_TO_LAST; }
;
opt_select_from: opt_select_from:
/* empty */ /* empty */
| select_from select_lock_type; | select_from select_lock_type
;
udf_func_type: udf_func_type:
/* empty */ { $$ = UDFTYPE_FUNCTION; } /* empty */ { $$ = UDFTYPE_FUNCTION; }
| AGGREGATE_SYM { $$ = UDFTYPE_AGGREGATE; }; | AGGREGATE_SYM { $$ = UDFTYPE_AGGREGATE; }
;
udf_type: udf_type:
STRING_SYM {$$ = (int) STRING_RESULT; } STRING_SYM {$$ = (int) STRING_RESULT; }
| REAL {$$ = (int) REAL_RESULT; } | REAL {$$ = (int) REAL_RESULT; }
| INT_SYM {$$ = (int) INT_RESULT; }; | INT_SYM {$$ = (int) INT_RESULT; }
;
field_list: field_list:
field_list_item field_list_item
| field_list ',' field_list_item; | field_list ',' field_list_item
;
field_list_item: field_list_item:
field_spec field_spec
...@@ -968,11 +990,13 @@ field_list_item: ...@@ -968,11 +990,13 @@ field_list_item:
| opt_constraint CHECK_SYM '(' expr ')' | opt_constraint CHECK_SYM '(' expr ')'
{ {
Lex->col_list.empty(); /* Alloced by sql_alloc */ Lex->col_list.empty(); /* Alloced by sql_alloc */
}; }
;
opt_constraint: opt_constraint:
/* empty */ /* empty */
| CONSTRAINT opt_ident; | CONSTRAINT opt_ident
;
field_spec: field_spec:
field_ident field_ident
...@@ -991,7 +1015,8 @@ field_spec: ...@@ -991,7 +1015,8 @@ field_spec:
lex->default_value, lex->comment, lex->default_value, lex->comment,
lex->change,lex->interval,lex->charset)) lex->change,lex->interval,lex->charset))
YYABORT; YYABORT;
}; }
;
type: type:
int_type opt_len field_options { Lex->length=$2; $$=$1; } int_type opt_len field_options { Lex->length=$2; $$=$1; }
...@@ -1052,65 +1077,77 @@ type: ...@@ -1052,65 +1077,77 @@ type:
LEX *lex=Lex; LEX *lex=Lex;
lex->interval=typelib(lex->interval_list); lex->interval=typelib(lex->interval_list);
$$=FIELD_TYPE_SET; $$=FIELD_TYPE_SET;
}; }
;
char: char:
CHAR_SYM {} CHAR_SYM {}
| NCHAR_SYM {} | NCHAR_SYM {}
| NATIONAL_SYM CHAR_SYM {}; | NATIONAL_SYM CHAR_SYM {}
;
varchar: varchar:
char VARYING {} char VARYING {}
| VARCHAR {} | VARCHAR {}
| NATIONAL_SYM VARCHAR {} | NATIONAL_SYM VARCHAR {}
| NCHAR_SYM VARCHAR {}; | NCHAR_SYM VARCHAR {}
;
int_type: int_type:
INT_SYM { $$=FIELD_TYPE_LONG; } INT_SYM { $$=FIELD_TYPE_LONG; }
| TINYINT { $$=FIELD_TYPE_TINY; } | TINYINT { $$=FIELD_TYPE_TINY; }
| SMALLINT { $$=FIELD_TYPE_SHORT; } | SMALLINT { $$=FIELD_TYPE_SHORT; }
| MEDIUMINT { $$=FIELD_TYPE_INT24; } | MEDIUMINT { $$=FIELD_TYPE_INT24; }
| BIGINT { $$=FIELD_TYPE_LONGLONG; }; | BIGINT { $$=FIELD_TYPE_LONGLONG; }
;
real_type: real_type:
REAL { $$= current_thd->sql_mode & MODE_REAL_AS_FLOAT ? REAL { $$= current_thd->sql_mode & MODE_REAL_AS_FLOAT ?
FIELD_TYPE_FLOAT : FIELD_TYPE_DOUBLE; } FIELD_TYPE_FLOAT : FIELD_TYPE_DOUBLE; }
| DOUBLE_SYM { $$=FIELD_TYPE_DOUBLE; } | DOUBLE_SYM { $$=FIELD_TYPE_DOUBLE; }
| DOUBLE_SYM PRECISION { $$=FIELD_TYPE_DOUBLE; }; | DOUBLE_SYM PRECISION { $$=FIELD_TYPE_DOUBLE; }
;
float_options: float_options:
/* empty */ {} /* empty */ {}
| '(' NUM ')' { Lex->length=$2.str; } | '(' NUM ')' { Lex->length=$2.str; }
| precision {}; | precision {}
;
precision: precision:
'(' NUM ',' NUM ')' '(' NUM ',' NUM ')'
{ {
LEX *lex=Lex; LEX *lex=Lex;
lex->length=$2.str; lex->dec=$4.str; lex->length=$2.str; lex->dec=$4.str;
}; }
;
field_options: field_options:
/* empty */ {} /* empty */ {}
| field_opt_list {}; | field_opt_list {}
;
field_opt_list: field_opt_list:
field_opt_list field_option {} field_opt_list field_option {}
| field_option {}; | field_option {}
;
field_option: field_option:
SIGNED_SYM {} SIGNED_SYM {}
| UNSIGNED { Lex->type|= UNSIGNED_FLAG;} | UNSIGNED { Lex->type|= UNSIGNED_FLAG;}
| ZEROFILL { Lex->type|= UNSIGNED_FLAG | ZEROFILL_FLAG; }; | ZEROFILL { Lex->type|= UNSIGNED_FLAG | ZEROFILL_FLAG; }
;
opt_len: opt_len:
/* empty */ { $$=(char*) 0; } /* use default length */ /* empty */ { $$=(char*) 0; } /* use default length */
| '(' NUM ')' { $$=$2.str; }; | '(' NUM ')' { $$=$2.str; }
;
opt_precision: opt_precision:
/* empty */ {} /* empty */ {}
| precision {}; | precision {}
;
opt_attribute: opt_attribute:
/* empty */ {} /* empty */ {}
...@@ -1128,7 +1165,8 @@ attribute: ...@@ -1128,7 +1165,8 @@ attribute:
| PRIMARY_SYM KEY_SYM { Lex->type|= PRI_KEY_FLAG | NOT_NULL_FLAG; } | PRIMARY_SYM KEY_SYM { Lex->type|= PRI_KEY_FLAG | NOT_NULL_FLAG; }
| UNIQUE_SYM { Lex->type|= UNIQUE_FLAG; } | UNIQUE_SYM { Lex->type|= UNIQUE_FLAG; }
| UNIQUE_SYM KEY_SYM { Lex->type|= UNIQUE_KEY_FLAG; } | UNIQUE_SYM KEY_SYM { Lex->type|= UNIQUE_KEY_FLAG; }
| COMMENT_SYM text_literal { Lex->comment= $2; }; | COMMENT_SYM text_literal { Lex->comment= $2; }
;
charset_name: charset_name:
ident ident
...@@ -1138,20 +1176,24 @@ charset_name: ...@@ -1138,20 +1176,24 @@ charset_name:
net_printf(current_thd,ER_UNKNOWN_CHARACTER_SET,$1.str); net_printf(current_thd,ER_UNKNOWN_CHARACTER_SET,$1.str);
YYABORT; YYABORT;
} }
}; }
;
charset_name_or_default: charset_name_or_default:
charset_name { $$=$1; } charset_name { $$=$1; }
| DEFAULT { $$=NULL; } ; | DEFAULT { $$=NULL; }
;
opt_db_default_character_set: opt_db_default_character_set:
/* empty */ { $$=default_charset_info; } /* empty */ { $$=default_charset_info; }
| DEFAULT CHAR_SYM SET charset_name_or_default { $$=$4; }; | DEFAULT CHAR_SYM SET charset_name_or_default { $$=$4; }
;
opt_binary: opt_binary:
/* empty */ { Lex->charset=NULL; } /* empty */ { Lex->charset=NULL; }
| BINARY { Lex->type|=BINARY_FLAG; Lex->charset=NULL; } | BINARY { Lex->type|=BINARY_FLAG; Lex->charset=NULL; }
| CHAR_SYM SET charset_name { Lex->charset=$3; } ; | CHAR_SYM SET charset_name { Lex->charset=$3; }
;
references: references:
REFERENCES table_ident REFERENCES table_ident
...@@ -1163,38 +1205,45 @@ references: ...@@ -1163,38 +1205,45 @@ references:
opt_ref_list opt_ref_list
{ {
$$=$2; $$=$2;
}; }
;
opt_ref_list: opt_ref_list:
/* empty */ opt_on_delete {} /* empty */ opt_on_delete {}
| '(' ref_list ')' opt_on_delete {}; | '(' ref_list ')' opt_on_delete {}
;
ref_list: ref_list:
ref_list ',' ident { Lex->ref_list.push_back(new key_part_spec($3.str)); } ref_list ',' ident { Lex->ref_list.push_back(new key_part_spec($3.str)); }
| ident { Lex->ref_list.push_back(new key_part_spec($1.str)); }; | ident { Lex->ref_list.push_back(new key_part_spec($1.str)); }
;
opt_on_delete: opt_on_delete:
/* empty */ {} /* empty */ {}
| opt_on_delete_list {}; | opt_on_delete_list {}
;
opt_on_delete_list: opt_on_delete_list:
opt_on_delete_list opt_on_delete_item {} opt_on_delete_list opt_on_delete_item {}
| opt_on_delete_item {}; | opt_on_delete_item {}
;
opt_on_delete_item: opt_on_delete_item:
ON DELETE_SYM delete_option { Lex->fk_delete_opt= $3; } ON DELETE_SYM delete_option { Lex->fk_delete_opt= $3; }
| ON UPDATE_SYM delete_option { Lex->fk_update_opt= $3; } | ON UPDATE_SYM delete_option { Lex->fk_update_opt= $3; }
| MATCH FULL { Lex->fk_match_option= foreign_key::FK_MATCH_FULL; } | MATCH FULL { Lex->fk_match_option= foreign_key::FK_MATCH_FULL; }
| MATCH PARTIAL { Lex->fk_match_option= foreign_key::FK_MATCH_PARTIAL; } | MATCH PARTIAL { Lex->fk_match_option= foreign_key::FK_MATCH_PARTIAL; }
| MATCH SIMPLE_SYM { Lex->fk_match_option= foreign_key::FK_MATCH_SIMPLE; }; | MATCH SIMPLE_SYM { Lex->fk_match_option= foreign_key::FK_MATCH_SIMPLE; }
;
delete_option: delete_option:
RESTRICT { $$= (int) foreign_key::FK_OPTION_RESTRICT; } RESTRICT { $$= (int) foreign_key::FK_OPTION_RESTRICT; }
| CASCADE { $$= (int) foreign_key::FK_OPTION_CASCADE; } | CASCADE { $$= (int) foreign_key::FK_OPTION_CASCADE; }
| SET NULL_SYM { $$= (int) foreign_key::FK_OPTION_SET_NULL; } | SET NULL_SYM { $$= (int) foreign_key::FK_OPTION_SET_NULL; }
| NO_SYM ACTION { $$= (int) foreign_key::FK_OPTION_NO_ACTION; } | NO_SYM ACTION { $$= (int) foreign_key::FK_OPTION_NO_ACTION; }
| SET DEFAULT { $$= (int) foreign_key::FK_OPTION_DEFAULT; }; | SET DEFAULT { $$= (int) foreign_key::FK_OPTION_DEFAULT; }
;
key_type: key_type:
opt_constraint PRIMARY_SYM KEY_SYM { $$= Key::PRIMARY; } opt_constraint PRIMARY_SYM KEY_SYM { $$= Key::PRIMARY; }
...@@ -1204,46 +1253,56 @@ key_type: ...@@ -1204,46 +1253,56 @@ key_type:
| SPATIAL_SYM { $$= Key::SPATIAL; } | SPATIAL_SYM { $$= Key::SPATIAL; }
| SPATIAL_SYM key_or_index { $$= Key::SPATIAL; } | SPATIAL_SYM key_or_index { $$= Key::SPATIAL; }
| opt_constraint UNIQUE_SYM { $$= Key::UNIQUE; } | opt_constraint UNIQUE_SYM { $$= Key::UNIQUE; }
| opt_constraint UNIQUE_SYM key_or_index { $$= Key::UNIQUE; }; | opt_constraint UNIQUE_SYM key_or_index { $$= Key::UNIQUE; }
;
key_or_index: key_or_index:
KEY_SYM {} KEY_SYM {}
| INDEX {}; | INDEX {}
;
keys_or_index: keys_or_index:
KEYS {} KEYS {}
| INDEX {} | INDEX {}
| INDEXES {}; | INDEXES {}
;
opt_unique_or_fulltext: opt_unique_or_fulltext:
/* empty */ { $$= Key::MULTIPLE; } /* empty */ { $$= Key::MULTIPLE; }
| UNIQUE_SYM { $$= Key::UNIQUE; } | UNIQUE_SYM { $$= Key::UNIQUE; }
| SPATIAL_SYM { $$= Key::SPATIAL; }; | SPATIAL_SYM { $$= Key::SPATIAL; }
;
key_alg: key_alg:
/* empty */ { $$= HA_KEY_ALG_UNDEF; } /* empty */ { $$= HA_KEY_ALG_UNDEF; }
| USING opt_btree_or_rtree { $$= $2; }; | USING opt_btree_or_rtree { $$= $2; }
;
opt_btree_or_rtree: opt_btree_or_rtree:
BTREE_SYM { $$= HA_KEY_ALG_BTREE; } BTREE_SYM { $$= HA_KEY_ALG_BTREE; }
| RTREE_SYM { $$= HA_KEY_ALG_RTREE; } | RTREE_SYM { $$= HA_KEY_ALG_RTREE; }
| HASH_SYM { $$= HA_KEY_ALG_HASH; }; | HASH_SYM { $$= HA_KEY_ALG_HASH; }
;
key_list: key_list:
key_list ',' key_part order_dir { Lex->col_list.push_back($3); } key_list ',' key_part order_dir { Lex->col_list.push_back($3); }
| key_part order_dir { Lex->col_list.push_back($1); }; | key_part order_dir { Lex->col_list.push_back($1); }
;
key_part: key_part:
ident { $$=new key_part_spec($1.str); } ident { $$=new key_part_spec($1.str); }
| ident '(' NUM ')' { $$=new key_part_spec($1.str,(uint) atoi($3.str)); }; | ident '(' NUM ')' { $$=new key_part_spec($1.str,(uint) atoi($3.str)); }
;
opt_ident: opt_ident:
/* empty */ { $$=(char*) 0; } /* Defaultlength */ /* empty */ { $$=(char*) 0; } /* Defaultlength */
| field_ident { $$=$1.str; }; | field_ident { $$=$1.str; }
;
string_list: string_list:
text_string { Lex->interval_list.push_back($1); } text_string { Lex->interval_list.push_back($1); }
| string_list ',' text_string { Lex->interval_list.push_back($3); }; | string_list ',' text_string { Lex->interval_list.push_back($3); }
;
/* /*
** Alter table ** Alter table
...@@ -1275,23 +1334,24 @@ alter: ...@@ -1275,23 +1334,24 @@ alter:
lex->alter_keys_onoff=LEAVE_AS_IS; lex->alter_keys_onoff=LEAVE_AS_IS;
lex->simple_alter=1; lex->simple_alter=1;
} }
alter_list; alter_list
| ALTER DATABASE ident opt_db_default_character_set | ALTER DATABASE ident opt_db_default_character_set
{ {
LEX *lex=Lex; LEX *lex=Lex;
lex->sql_command=SQLCOM_ALTER_DB; lex->sql_command=SQLCOM_ALTER_DB;
lex->name=$3.str; lex->name=$3.str;
lex->create_info.table_charset=$4; lex->create_info.table_charset=$4;
}; }
;
alter_list: alter_list:
| alter_list_item | alter_list_item
| alter_list ',' alter_list_item; | alter_list ',' alter_list_item
;
add_column: add_column:
ADD opt_column { Lex->change=0; }; ADD opt_column { Lex->change=0; }
;
alter_list_item: alter_list_item:
add_column field_list_item opt_place { Lex->simple_alter=0; } add_column field_list_item opt_place { Lex->simple_alter=0; }
...@@ -1360,31 +1420,37 @@ alter_list_item: ...@@ -1360,31 +1420,37 @@ alter_list_item:
lex->name= $3->table.str; lex->name= $3->table.str;
} }
| create_table_options { Lex->simple_alter=0; } | create_table_options { Lex->simple_alter=0; }
| order_clause { Lex->simple_alter=0; }; | order_clause { Lex->simple_alter=0; }
;
opt_column: opt_column:
/* empty */ {} /* empty */ {}
| COLUMN_SYM {}; | COLUMN_SYM {}
;
opt_ignore: opt_ignore:
/* empty */ { Lex->duplicates=DUP_ERROR; } /* empty */ { Lex->duplicates=DUP_ERROR; }
| IGNORE_SYM { Lex->duplicates=DUP_IGNORE; }; | IGNORE_SYM { Lex->duplicates=DUP_IGNORE; }
;
opt_restrict: opt_restrict:
/* empty */ {} /* empty */ {}
| RESTRICT {} | RESTRICT {}
| CASCADE {}; | CASCADE {}
;
opt_place: opt_place:
/* empty */ {} /* empty */ {}
| AFTER_SYM ident { store_position_for_column($2.str); } | AFTER_SYM ident { store_position_for_column($2.str); }
| FIRST_SYM { store_position_for_column(first_keyword); }; | FIRST_SYM { store_position_for_column(first_keyword); }
;
opt_to: opt_to:
/* empty */ {} /* empty */ {}
| TO_SYM {} | TO_SYM {}
| EQ {} | EQ {}
| AS {}; | AS {}
;
slave: slave:
SLAVE START_SYM slave_thread_opts SLAVE START_SYM slave_thread_opts
...@@ -1399,11 +1465,13 @@ slave: ...@@ -1399,11 +1465,13 @@ slave:
LEX *lex=Lex; LEX *lex=Lex;
lex->sql_command = SQLCOM_SLAVE_STOP; lex->sql_command = SQLCOM_SLAVE_STOP;
lex->type = 0; lex->type = 0;
}; }
;
slave_thread_opts: slave_thread_opts:
slave_thread_opt slave_thread_opt
| slave_thread_opts ',' slave_thread_opt; | slave_thread_opts ',' slave_thread_opt
;
slave_thread_opt: slave_thread_opt:
/*empty*/ {} /*empty*/ {}
...@@ -1419,7 +1487,8 @@ restore: ...@@ -1419,7 +1487,8 @@ restore:
table_list FROM TEXT_STRING table_list FROM TEXT_STRING
{ {
Lex->backup_dir = $6.str; Lex->backup_dir = $6.str;
}; }
;
backup: backup:
BACKUP_SYM table_or_tables BACKUP_SYM table_or_tables
...@@ -1429,7 +1498,8 @@ backup: ...@@ -1429,7 +1498,8 @@ backup:
table_list TO_SYM TEXT_STRING table_list TO_SYM TEXT_STRING
{ {
Lex->backup_dir = $6.str; Lex->backup_dir = $6.str;
}; }
;
repair: repair:
REPAIR table_or_tables REPAIR table_or_tables
...@@ -1438,20 +1508,24 @@ repair: ...@@ -1438,20 +1508,24 @@ repair:
lex->sql_command = SQLCOM_REPAIR; lex->sql_command = SQLCOM_REPAIR;
lex->check_opt.init(); lex->check_opt.init();
} }
table_list opt_mi_repair_type; table_list opt_mi_repair_type
;
opt_mi_repair_type: opt_mi_repair_type:
/* empty */ { Lex->check_opt.flags = T_MEDIUM; } /* empty */ { Lex->check_opt.flags = T_MEDIUM; }
| mi_repair_types {}; | mi_repair_types {}
;
mi_repair_types: mi_repair_types:
mi_repair_type {} mi_repair_type {}
| mi_repair_type mi_repair_types {}; | mi_repair_type mi_repair_types {}
;
mi_repair_type: mi_repair_type:
QUICK { Lex->check_opt.flags|= T_QUICK; } QUICK { Lex->check_opt.flags|= T_QUICK; }
| EXTENDED_SYM { Lex->check_opt.flags|= T_EXTEND; } | EXTENDED_SYM { Lex->check_opt.flags|= T_EXTEND; }
| USE_FRM { Lex->check_opt.sql_flags|= TT_USEFRM; }; | USE_FRM { Lex->check_opt.sql_flags|= TT_USEFRM; }
;
analyze: analyze:
ANALYZE_SYM table_or_tables ANALYZE_SYM table_or_tables
...@@ -1460,7 +1534,8 @@ analyze: ...@@ -1460,7 +1534,8 @@ analyze:
lex->sql_command = SQLCOM_ANALYZE; lex->sql_command = SQLCOM_ANALYZE;
lex->check_opt.init(); lex->check_opt.init();
} }
table_list opt_mi_check_type; table_list opt_mi_check_type
;
check: check:
CHECK_SYM table_or_tables CHECK_SYM table_or_tables
...@@ -1469,22 +1544,26 @@ check: ...@@ -1469,22 +1544,26 @@ check:
lex->sql_command = SQLCOM_CHECK; lex->sql_command = SQLCOM_CHECK;
lex->check_opt.init(); lex->check_opt.init();
} }
table_list opt_mi_check_type; table_list opt_mi_check_type
;
opt_mi_check_type: opt_mi_check_type:
/* empty */ { Lex->check_opt.flags = T_MEDIUM; } /* empty */ { Lex->check_opt.flags = T_MEDIUM; }
| mi_check_types {}; | mi_check_types {}
;
mi_check_types: mi_check_types:
mi_check_type {} mi_check_type {}
| mi_check_type mi_check_types {}; | mi_check_type mi_check_types {}
;
mi_check_type: mi_check_type:
QUICK { Lex->check_opt.flags|= T_QUICK; } QUICK { Lex->check_opt.flags|= T_QUICK; }
| FAST_SYM { Lex->check_opt.flags|= T_FAST; } | FAST_SYM { Lex->check_opt.flags|= T_FAST; }
| MEDIUM_SYM { Lex->check_opt.flags|= T_MEDIUM; } | MEDIUM_SYM { Lex->check_opt.flags|= T_MEDIUM; }
| EXTENDED_SYM { Lex->check_opt.flags|= T_EXTEND; } | EXTENDED_SYM { Lex->check_opt.flags|= T_EXTEND; }
| CHANGED { Lex->check_opt.flags|= T_CHECK_ONLY_CHANGED; }; | CHANGED { Lex->check_opt.flags|= T_CHECK_ONLY_CHANGED; }
;
optimize: optimize:
OPTIMIZE table_or_tables OPTIMIZE table_or_tables
...@@ -1493,25 +1572,29 @@ optimize: ...@@ -1493,25 +1572,29 @@ optimize:
lex->sql_command = SQLCOM_OPTIMIZE; lex->sql_command = SQLCOM_OPTIMIZE;
lex->check_opt.init(); lex->check_opt.init();
} }
table_list opt_mi_check_type; table_list opt_mi_check_type
;
rename: rename:
RENAME table_or_tables RENAME table_or_tables
{ {
Lex->sql_command=SQLCOM_RENAME_TABLE; Lex->sql_command=SQLCOM_RENAME_TABLE;
} }
table_to_table_list; table_to_table_list
;
table_to_table_list: table_to_table_list:
table_to_table table_to_table
| table_to_table_list ',' table_to_table; | table_to_table_list ',' table_to_table
;
table_to_table: table_to_table:
table_ident TO_SYM table_ident table_ident TO_SYM table_ident
{ if (!add_table_to_list($1,NULL,1,TL_IGNORE) || { if (!add_table_to_list($1,NULL,1,TL_IGNORE) ||
!add_table_to_list($3,NULL,1,TL_IGNORE)) !add_table_to_list($3,NULL,1,TL_IGNORE))
YYABORT; YYABORT;
}; }
;
/* /*
Select : retrieve data from table Select : retrieve data from table
...@@ -1519,7 +1602,8 @@ table_to_table: ...@@ -1519,7 +1602,8 @@ table_to_table:
select: select:
select_init { Lex->sql_command=SQLCOM_SELECT; }; select_init { Lex->sql_command=SQLCOM_SELECT; }
;
select_init: select_init:
SELECT_SYM select_part2 { Select->braces=false; } union SELECT_SYM select_part2 { Select->braces=false; } union
...@@ -1531,7 +1615,8 @@ select_init: ...@@ -1531,7 +1615,8 @@ select_init:
/* select in braces, can't contain global parameters */ /* select in braces, can't contain global parameters */
sel->master_unit()->global_parameters= sel->master_unit()->global_parameters=
sel->master_unit(); sel->master_unit();
} union_opt; } union_opt
;
select_part2: select_part2:
{ {
...@@ -1539,25 +1624,29 @@ select_part2: ...@@ -1539,25 +1624,29 @@ select_part2:
lex->lock_option=TL_READ; lex->lock_option=TL_READ;
mysql_init_select(lex); mysql_init_select(lex);
} }
select_options select_item_list select_into select_lock_type; select_options select_item_list select_into select_lock_type
;
select_into: select_into:
limit_clause {} limit_clause {}
| select_from | select_from
| opt_into select_from | opt_into select_from
| select_from opt_into; | select_from opt_into
;
select_from: select_from:
FROM join_table_list where_clause group_clause having_clause opt_order_clause limit_clause procedure_clause; FROM join_table_list where_clause group_clause having_clause opt_order_clause limit_clause procedure_clause
;
select_options: select_options:
/* empty*/ /* empty*/
| select_option_list; | select_option_list
;
select_option_list: select_option_list:
select_option_list select_option select_option_list select_option
| select_option; | select_option
;
select_option: select_option:
STRAIGHT_JOIN { Select->options|= SELECT_STRAIGHT_JOIN; } STRAIGHT_JOIN { Select->options|= SELECT_STRAIGHT_JOIN; }
...@@ -1614,8 +1703,8 @@ select_item_list: ...@@ -1614,8 +1703,8 @@ select_item_list:
{ {
if (add_item_to_list(new Item_field(NULL,NULL,"*"))) if (add_item_to_list(new Item_field(NULL,NULL,"*")))
YYABORT; YYABORT;
}; }
;
select_item: select_item:
remember_name select_item2 remember_end select_alias remember_name select_item2 remember_end select_alias
...@@ -1626,32 +1715,39 @@ select_item: ...@@ -1626,32 +1715,39 @@ select_item:
$2->set_name($4.str); $2->set_name($4.str);
else if (!$2->name) else if (!$2->name)
$2->set_name($1,(uint) ($3 - $1)); $2->set_name($1,(uint) ($3 - $1));
}; }
;
remember_name: remember_name:
{ $$=(char*) Lex->tok_start; }; { $$=(char*) Lex->tok_start; }
;
remember_end: remember_end:
{ $$=(char*) Lex->tok_end; }; { $$=(char*) Lex->tok_end; }
;
select_item2: select_item2:
table_wild { $$=$1; } /* table.* */ table_wild { $$=$1; } /* table.* */
| expr { $$=$1; }; | expr { $$=$1; }
;
select_alias: select_alias:
{ $$.str=0;} { $$.str=0;}
| AS ident { $$=$2; } | AS ident { $$=$2; }
| AS TEXT_STRING { $$=$2; } | AS TEXT_STRING { $$=$2; }
| ident { $$=$1; } | ident { $$=$1; }
| TEXT_STRING { $$=$1; }; | TEXT_STRING { $$=$1; }
;
optional_braces: optional_braces:
/* empty */ {} /* empty */ {}
| '(' ')' {}; | '(' ')' {}
;
/* all possible expressions */ /* all possible expressions */
expr: expr_expr { $$= $1; } expr: expr_expr { $$= $1; }
| simple_expr { $$= $1; }; | simple_expr { $$= $1; }
;
/* expressions that begin with 'expr' */ /* expressions that begin with 'expr' */
expr_expr: expr_expr:
...@@ -1695,7 +1791,8 @@ expr_expr: ...@@ -1695,7 +1791,8 @@ expr_expr:
| expr '-' INTERVAL_SYM expr interval | expr '-' INTERVAL_SYM expr interval
{ $$= new Item_date_add_interval($1,$4,$5,1); } { $$= new Item_date_add_interval($1,$4,$5,1); }
| expr COLLATE_SYM charset_name | expr COLLATE_SYM charset_name
{ $$= new Item_func_set_collation($1,$3); }; { $$= new Item_func_set_collation($1,$3); }
;
/* expressions that begin with 'expr' that do NOT follow IN_SYM */ /* expressions that begin with 'expr' that do NOT follow IN_SYM */
no_in_expr: no_in_expr:
...@@ -1734,7 +1831,8 @@ no_in_expr: ...@@ -1734,7 +1831,8 @@ no_in_expr:
{ $$= new Item_date_add_interval($1,$4,$5,0); } { $$= new Item_date_add_interval($1,$4,$5,0); }
| no_in_expr '-' INTERVAL_SYM expr interval | no_in_expr '-' INTERVAL_SYM expr interval
{ $$= new Item_date_add_interval($1,$4,$5,1); } { $$= new Item_date_add_interval($1,$4,$5,1); }
| simple_expr; | simple_expr
;
/* expressions that begin with 'expr' that does NOT follow AND */ /* expressions that begin with 'expr' that does NOT follow AND */
no_and_expr: no_and_expr:
...@@ -1776,7 +1874,8 @@ no_and_expr: ...@@ -1776,7 +1874,8 @@ no_and_expr:
{ $$= new Item_date_add_interval($1,$4,$5,0); } { $$= new Item_date_add_interval($1,$4,$5,0); }
| no_and_expr '-' INTERVAL_SYM expr interval | no_and_expr '-' INTERVAL_SYM expr interval
{ $$= new Item_date_add_interval($1,$4,$5,1); } { $$= new Item_date_add_interval($1,$4,$5,1); }
| simple_expr; | simple_expr
;
simple_expr: simple_expr:
simple_ident simple_ident
...@@ -2105,11 +2204,13 @@ simple_expr: ...@@ -2105,11 +2204,13 @@ simple_expr:
current_thd->safe_to_cache_query=0; current_thd->safe_to_cache_query=0;
} }
| EXTRACT_SYM '(' interval FROM expr ')' | EXTRACT_SYM '(' interval FROM expr ')'
{ $$=new Item_extract( $3, $5); }; { $$=new Item_extract( $3, $5); }
;
udf_expr_list: udf_expr_list:
/* empty */ { $$= NULL; } /* empty */ { $$= NULL; }
| expr_list { $$= $1;}; | expr_list { $$= $1; }
;
sum_expr: sum_expr:
AVG_SYM '(' in_sum_expr ')' AVG_SYM '(' in_sum_expr ')'
...@@ -2133,7 +2234,8 @@ sum_expr: ...@@ -2133,7 +2234,8 @@ sum_expr:
| STD_SYM '(' in_sum_expr ')' | STD_SYM '(' in_sum_expr ')'
{ $$=new Item_sum_std($3); } { $$=new Item_sum_std($3); }
| SUM_SYM '(' in_sum_expr ')' | SUM_SYM '(' in_sum_expr ')'
{ $$=new Item_sum_sum($3); }; { $$=new Item_sum_sum($3); }
;
in_sum_expr: in_sum_expr:
{ Select->in_sum_expr++; } { Select->in_sum_expr++; }
...@@ -2141,7 +2243,8 @@ in_sum_expr: ...@@ -2141,7 +2243,8 @@ in_sum_expr:
{ {
Select->in_sum_expr--; Select->in_sum_expr--;
$$=$2; $$=$2;
}; }
;
cast_type: cast_type:
BINARY { $$=ITEM_CAST_BINARY; } BINARY { $$=ITEM_CAST_BINARY; }
...@@ -2151,42 +2254,51 @@ cast_type: ...@@ -2151,42 +2254,51 @@ cast_type:
| UNSIGNED INT_SYM { $$=ITEM_CAST_UNSIGNED_INT; } | UNSIGNED INT_SYM { $$=ITEM_CAST_UNSIGNED_INT; }
| DATE_SYM { $$=ITEM_CAST_DATE; } | DATE_SYM { $$=ITEM_CAST_DATE; }
| TIME_SYM { $$=ITEM_CAST_TIME; } | TIME_SYM { $$=ITEM_CAST_TIME; }
| DATETIME { $$=ITEM_CAST_DATETIME; }; | DATETIME { $$=ITEM_CAST_DATETIME; }
;
expr_list: expr_list:
{ Select->expr_list.push_front(new List<Item>); } { Select->expr_list.push_front(new List<Item>); }
expr_list2 expr_list2
{ $$= Select->expr_list.pop(); }; { $$= Select->expr_list.pop(); }
;
expr_list2: expr_list2:
expr { Select->expr_list.head()->push_back($1); } expr { Select->expr_list.head()->push_back($1); }
| expr_list2 ',' expr { Select->expr_list.head()->push_back($3); }; | expr_list2 ',' expr { Select->expr_list.head()->push_back($3); }
;
ident_list_arg: ident_list_arg:
ident_list { $$= $1; } ident_list { $$= $1; }
| '(' ident_list ')' { $$= $2; }; | '(' ident_list ')' { $$= $2; }
;
ident_list: ident_list:
{ Select->expr_list.push_front(new List<Item>); } { Select->expr_list.push_front(new List<Item>); }
ident_list2 ident_list2
{ $$= Select->expr_list.pop(); }; { $$= Select->expr_list.pop(); }
;
ident_list2: ident_list2:
simple_ident { Select->expr_list.head()->push_back($1); } simple_ident { Select->expr_list.head()->push_back($1); }
| ident_list2 ',' simple_ident { Select->expr_list.head()->push_back($3); }; | ident_list2 ',' simple_ident { Select->expr_list.head()->push_back($3); }
;
opt_expr: opt_expr:
/* empty */ { $$= NULL; } /* empty */ { $$= NULL; }
| expr { $$= $1; }; | expr { $$= $1; }
;
opt_else: opt_else:
/* empty */ { $$= NULL; } /* empty */ { $$= NULL; }
| ELSE expr { $$= $2; }; | ELSE expr { $$= $2; }
;
when_list: when_list:
{ Select->when_list.push_front(new List<Item>); } { Select->when_list.push_front(new List<Item>); }
when_list2 when_list2
{ $$= Select->when_list.pop(); }; { $$= Select->when_list.pop(); }
;
when_list2: when_list2:
expr THEN_SYM expr expr THEN_SYM expr
...@@ -2200,11 +2312,13 @@ when_list2: ...@@ -2200,11 +2312,13 @@ when_list2:
SELECT_LEX *sel=Select; SELECT_LEX *sel=Select;
sel->when_list.head()->push_back($3); sel->when_list.head()->push_back($3);
sel->when_list.head()->push_back($5); sel->when_list.head()->push_back($5);
}; }
;
opt_pad: opt_pad:
/* empty */ { $$=new Item_string(" ",1,default_charset_info); } /* empty */ { $$=new Item_string(" ",1,default_charset_info); }
| expr { $$=$1; }; | expr { $$=$1; }
;
join_table_list: join_table_list:
'(' join_table_list ')' { $$=$2; } '(' join_table_list ')' { $$=$2; }
...@@ -2246,12 +2360,14 @@ join_table_list: ...@@ -2246,12 +2360,14 @@ join_table_list:
| join_table_list NATURAL RIGHT opt_outer JOIN_SYM join_table | join_table_list NATURAL RIGHT opt_outer JOIN_SYM join_table
{ add_join_natural($6,$1); $1->outer_join|=JOIN_TYPE_RIGHT; $$=$1; } { add_join_natural($6,$1); $1->outer_join|=JOIN_TYPE_RIGHT; $$=$1; }
| join_table_list NATURAL JOIN_SYM join_table | join_table_list NATURAL JOIN_SYM join_table
{ add_join_natural($1,$4); $$=$4; }; { add_join_natural($1,$4); $$=$4; }
;
normal_join: normal_join:
',' {} ',' {}
| JOIN_SYM {} | JOIN_SYM {}
| CROSS JOIN_SYM {}; | CROSS JOIN_SYM {}
;
join_table: join_table:
{ {
...@@ -2275,7 +2391,8 @@ join_table: ...@@ -2275,7 +2391,8 @@ join_table:
if (!($$= add_table_to_list(new Table_ident(unit), if (!($$= add_table_to_list(new Table_ident(unit),
$5,0,TL_UNLOCK))) $5,0,TL_UNLOCK)))
YYABORT; YYABORT;
}; }
;
select_part3: select_part3:
{ {
...@@ -2288,14 +2405,17 @@ select_part3: ...@@ -2288,14 +2405,17 @@ select_part3:
lex->select->linkage= DERIVED_TABLE_TYPE; lex->select->linkage= DERIVED_TABLE_TYPE;
} }
select_options select_item_list select_intoto select_options select_item_list select_intoto
;
select_intoto: select_intoto:
limit_clause {} limit_clause {}
| select_from | select_from
;
opt_outer: opt_outer:
/* empty */ {} /* empty */ {}
| OUTER {}; | OUTER {}
;
opt_key_definition: opt_key_definition:
/* empty */ {} /* empty */ {}
...@@ -2310,11 +2430,13 @@ opt_key_definition: ...@@ -2310,11 +2430,13 @@ opt_key_definition:
SELECT_LEX *sel=Select; SELECT_LEX *sel=Select;
sel->ignore_index= *$2; sel->ignore_index= *$2;
sel->ignore_index_ptr= &sel->ignore_index; sel->ignore_index_ptr= &sel->ignore_index;
}; }
;
key_usage_list: key_usage_list:
key_or_index { Select->interval_list.empty(); } '(' key_usage_list2 ')' key_or_index { Select->interval_list.empty(); } '(' key_usage_list2 ')'
{ $$= &Select->interval_list; }; { $$= &Select->interval_list; }
;
key_usage_list2: key_usage_list2:
key_usage_list2 ',' ident key_usage_list2 ',' ident
...@@ -2322,7 +2444,8 @@ key_usage_list2: ...@@ -2322,7 +2444,8 @@ key_usage_list2:
| ident | ident
{ Select->interval_list.push_back(new String((const char*) $1.str,$1.length,default_charset_info)); } { Select->interval_list.push_back(new String((const char*) $1.str,$1.length,default_charset_info)); }
| PRIMARY_SYM | PRIMARY_SYM
{ Select->interval_list.push_back(new String("PRIMARY",7,default_charset_info)); }; { Select->interval_list.push_back(new String("PRIMARY",7,default_charset_info)); }
;
using_list: using_list:
ident ident
...@@ -2336,7 +2459,8 @@ using_list: ...@@ -2336,7 +2459,8 @@ using_list:
SELECT_LEX *sel=Select; SELECT_LEX *sel=Select;
if (!($$= new Item_cond_and(new Item_func_eq(new Item_field(sel->db1,sel->table1,$3.str), new Item_field(sel->db2,sel->table2,$3.str)), $1))) if (!($$= new Item_cond_and(new Item_func_eq(new Item_field(sel->db1,sel->table1,$3.str), new Item_field(sel->db2,sel->table2,$3.str)), $1)))
YYABORT; YYABORT;
}; }
;
interval: interval:
DAY_HOUR_SYM { $$=INTERVAL_DAY_HOUR; } DAY_HOUR_SYM { $$=INTERVAL_DAY_HOUR; }
...@@ -2351,22 +2475,25 @@ interval: ...@@ -2351,22 +2475,25 @@ interval:
| MONTH_SYM { $$=INTERVAL_MONTH; } | MONTH_SYM { $$=INTERVAL_MONTH; }
| SECOND_SYM { $$=INTERVAL_SECOND; } | SECOND_SYM { $$=INTERVAL_SECOND; }
| YEAR_MONTH_SYM { $$=INTERVAL_YEAR_MONTH; } | YEAR_MONTH_SYM { $$=INTERVAL_YEAR_MONTH; }
| YEAR_SYM { $$=INTERVAL_YEAR; }; | YEAR_SYM { $$=INTERVAL_YEAR; }
;
table_alias: table_alias:
/* empty */ /* empty */
| AS | AS
| EQ; | EQ
;
opt_table_alias: opt_table_alias:
/* empty */ { $$=0; } /* empty */ { $$=0; }
| table_alias ident | table_alias ident
{ $$= (LEX_STRING*) sql_memdup(&$2,sizeof(LEX_STRING)); }; { $$= (LEX_STRING*) sql_memdup(&$2,sizeof(LEX_STRING)); }
;
where_clause: where_clause:
/* empty */ { Select->where= 0; } /* empty */ { Select->where= 0; }
| WHERE expr { Select->where= $2; }; | WHERE expr { Select->where= $2; }
;
having_clause: having_clause:
/* empty */ /* empty */
...@@ -2374,11 +2501,13 @@ having_clause: ...@@ -2374,11 +2501,13 @@ having_clause:
{ {
SELECT_LEX *sel=Select; SELECT_LEX *sel=Select;
sel->having= $3; sel->create_refs=0; sel->having= $3; sel->create_refs=0;
}; }
;
opt_escape: opt_escape:
ESCAPE_SYM TEXT_STRING { $$= $2.str; } ESCAPE_SYM TEXT_STRING { $$= $2.str; }
| /* empty */ { $$= (char*) "\\"; }; | /* empty */ { $$= (char*) "\\"; }
;
/* /*
...@@ -2387,13 +2516,15 @@ opt_escape: ...@@ -2387,13 +2516,15 @@ opt_escape:
group_clause: group_clause:
/* empty */ /* empty */
| GROUP BY group_list olap_opt; | GROUP BY group_list olap_opt
;
group_list: group_list:
group_list ',' order_ident order_dir group_list ',' order_ident order_dir
{ if (add_group_to_list($3,(bool) $4)) YYABORT; } { if (add_group_to_list($3,(bool) $4)) YYABORT; }
| order_ident order_dir | order_ident order_dir
{ if (add_group_to_list($1,(bool) $2)) YYABORT; }; { if (add_group_to_list($1,(bool) $2)) YYABORT; }
;
olap_opt: olap_opt:
/* empty */ {} /* empty */ {}
...@@ -2421,7 +2552,8 @@ olap_opt: ...@@ -2421,7 +2552,8 @@ olap_opt:
opt_order_clause: opt_order_clause:
/* empty */ /* empty */
| order_clause; | order_clause
;
order_clause: order_clause:
ORDER_SYM BY ORDER_SYM BY
...@@ -2440,19 +2572,21 @@ order_clause: ...@@ -2440,19 +2572,21 @@ order_clause:
"ORDER BY"); "ORDER BY");
YYABORT; YYABORT;
} }
} order_list; } order_list
;
order_list: order_list:
order_list ',' order_ident order_dir order_list ',' order_ident order_dir
{ if (add_order_to_list($3,(bool) $4)) YYABORT; } { if (add_order_to_list($3,(bool) $4)) YYABORT; }
| order_ident order_dir | order_ident order_dir
{ if (add_order_to_list($1,(bool) $2)) YYABORT; }; { if (add_order_to_list($1,(bool) $2)) YYABORT; }
;
order_dir: order_dir:
/* empty */ { $$ = 1; } /* empty */ { $$ = 1; }
| ASC { $$ =1; } | ASC { $$ =1; }
| DESC { $$ =0; }; | DESC { $$ =0; }
;
limit_clause: limit_clause:
/* empty */ {} /* empty */ {}
...@@ -2483,7 +2617,8 @@ limit_clause: ...@@ -2483,7 +2617,8 @@ limit_clause:
SELECT_LEX *sel=lex->select; SELECT_LEX *sel=lex->select;
sel->select_limit= $4; sel->select_limit= $4;
sel->offset_limit= $2; sel->offset_limit= $2;
}; }
;
delete_limit_clause: delete_limit_clause:
/* empty */ /* empty */
...@@ -2497,20 +2632,23 @@ delete_limit_clause: ...@@ -2497,20 +2632,23 @@ delete_limit_clause:
lex->select->select_limit= HA_POS_ERROR; lex->select->select_limit= HA_POS_ERROR;
} }
| LIMIT ulonglong_num | LIMIT ulonglong_num
{ Select->select_limit= (ha_rows) $2; }; { Select->select_limit= (ha_rows) $2; }
;
ULONG_NUM: ULONG_NUM:
NUM { $$= strtoul($1.str,NULL,10); } NUM { $$= strtoul($1.str,NULL,10); }
| ULONGLONG_NUM { $$= (ulong) strtoull($1.str,NULL,10); } | ULONGLONG_NUM { $$= (ulong) strtoull($1.str,NULL,10); }
| REAL_NUM { $$= strtoul($1.str,NULL,10); } | REAL_NUM { $$= strtoul($1.str,NULL,10); }
| FLOAT_NUM { $$= strtoul($1.str,NULL,10); }; | FLOAT_NUM { $$= strtoul($1.str,NULL,10); }
;
ulonglong_num: ulonglong_num:
NUM { $$= (ulonglong) strtoul($1.str,NULL,10); } NUM { $$= (ulonglong) strtoul($1.str,NULL,10); }
| ULONGLONG_NUM { $$= strtoull($1.str,NULL,10); } | ULONGLONG_NUM { $$= strtoull($1.str,NULL,10); }
| LONG_NUM { $$= (ulonglong) strtoul($1.str,NULL,10); } | LONG_NUM { $$= (ulonglong) strtoul($1.str,NULL,10); }
| REAL_NUM { $$= strtoull($1.str,NULL,10); } | REAL_NUM { $$= strtoull($1.str,NULL,10); }
| FLOAT_NUM { $$= strtoull($1.str,NULL,10); }; | FLOAT_NUM { $$= strtoull($1.str,NULL,10); }
;
procedure_clause: procedure_clause:
/* empty */ /* empty */
...@@ -2524,16 +2662,18 @@ procedure_clause: ...@@ -2524,16 +2662,18 @@ procedure_clause:
YYABORT; YYABORT;
current_thd->safe_to_cache_query=0; current_thd->safe_to_cache_query=0;
} }
'(' procedure_list ')'; '(' procedure_list ')'
;
procedure_list: procedure_list:
/* empty */ {} /* empty */ {}
| procedure_list2 {}; | procedure_list2 {}
;
procedure_list2: procedure_list2:
procedure_list2 ',' procedure_item procedure_list2 ',' procedure_item
| procedure_item; | procedure_item
;
procedure_item: procedure_item:
remember_name expr remember_name expr
...@@ -2542,7 +2682,8 @@ procedure_item: ...@@ -2542,7 +2682,8 @@ procedure_item:
YYABORT; YYABORT;
if (!$2->name) if (!$2->name)
$2->set_name($1,(uint) ((char*) Lex->tok_end - $1)); $2->set_name($1,(uint) ((char*) Lex->tok_end - $1));
}; }
;
opt_into: opt_into:
INTO OUTFILE TEXT_STRING INTO OUTFILE TEXT_STRING
...@@ -2555,7 +2696,8 @@ opt_into: ...@@ -2555,7 +2696,8 @@ opt_into:
{ {
if (!(Lex->exchange= new sql_exchange($3.str,1))) if (!(Lex->exchange= new sql_exchange($3.str,1)))
YYABORT; YYABORT;
}; }
;
/* /*
DO statement DO statement
...@@ -2568,7 +2710,9 @@ do: DO_SYM ...@@ -2568,7 +2710,9 @@ do: DO_SYM
if (!(lex->insert_list = new List_item)) if (!(lex->insert_list = new List_item))
YYABORT; YYABORT;
} }
values; values
;
/* /*
Drop : delete tables or index Drop : delete tables or index
*/ */
...@@ -2602,27 +2746,32 @@ drop: ...@@ -2602,27 +2746,32 @@ drop:
LEX *lex=Lex; LEX *lex=Lex;
lex->sql_command = SQLCOM_DROP_FUNCTION; lex->sql_command = SQLCOM_DROP_FUNCTION;
lex->udf.name=$3.str; lex->udf.name=$3.str;
}; }
;
table_list: table_list:
table_name table_name
| table_list ',' table_name; | table_list ',' table_name
;
table_name: table_name:
table_ident table_ident
{ if (!add_table_to_list($1,NULL,1)) YYABORT; }; { if (!add_table_to_list($1,NULL,1)) YYABORT; }
;
if_exists: if_exists:
/* empty */ { $$=0; } /* empty */ { $$=0; }
| IF EXISTS { $$= 1; }; | IF EXISTS { $$= 1; }
;
/* /*
** Insert : add new data to table ** Insert : add new data to table
*/ */
insert: insert:
INSERT { Lex->sql_command = SQLCOM_INSERT; } insert_lock_option opt_ignore insert2 insert_field_spec; INSERT { Lex->sql_command = SQLCOM_INSERT; } insert_lock_option opt_ignore insert2 insert_field_spec
;
replace: replace:
REPLACE REPLACE
...@@ -2631,21 +2780,25 @@ replace: ...@@ -2631,21 +2780,25 @@ replace:
lex->sql_command = SQLCOM_REPLACE; lex->sql_command = SQLCOM_REPLACE;
lex->duplicates= DUP_REPLACE; lex->duplicates= DUP_REPLACE;
} }
replace_lock_option insert2 insert_field_spec; replace_lock_option insert2 insert_field_spec
;
insert_lock_option: insert_lock_option:
/* empty */ { Lex->lock_option= TL_WRITE_CONCURRENT_INSERT; } /* empty */ { Lex->lock_option= TL_WRITE_CONCURRENT_INSERT; }
| LOW_PRIORITY { Lex->lock_option= TL_WRITE_LOW_PRIORITY; } | LOW_PRIORITY { Lex->lock_option= TL_WRITE_LOW_PRIORITY; }
| DELAYED_SYM { Lex->lock_option= TL_WRITE_DELAYED; } | DELAYED_SYM { Lex->lock_option= TL_WRITE_DELAYED; }
| HIGH_PRIORITY { Lex->lock_option= TL_WRITE; }; | HIGH_PRIORITY { Lex->lock_option= TL_WRITE; }
;
replace_lock_option: replace_lock_option:
opt_low_priority {} opt_low_priority {}
| DELAYED_SYM { Lex->lock_option= TL_WRITE_DELAYED; }; | DELAYED_SYM { Lex->lock_option= TL_WRITE_DELAYED; }
;
insert2: insert2:
INTO insert_table {} INTO insert_table {}
| insert_table {}; | insert_table {}
;
insert_table: insert_table:
table_name table_name
...@@ -2654,7 +2807,8 @@ insert_table: ...@@ -2654,7 +2807,8 @@ insert_table:
lex->field_list.empty(); lex->field_list.empty();
lex->many_values.empty(); lex->many_values.empty();
lex->insert_list=0; lex->insert_list=0;
}; }
;
insert_field_spec: insert_field_spec:
opt_field_spec insert_values {} opt_field_spec insert_values {}
...@@ -2665,16 +2819,19 @@ insert_field_spec: ...@@ -2665,16 +2819,19 @@ insert_field_spec:
lex->many_values.push_back(lex->insert_list)) lex->many_values.push_back(lex->insert_list))
YYABORT; YYABORT;
} }
ident_eq_list; ident_eq_list
;
opt_field_spec: opt_field_spec:
/* empty */ { } /* empty */ { }
| '(' fields ')' { } | '(' fields ')' { }
| '(' ')' { }; | '(' ')' { }
;
fields: fields:
fields ',' insert_ident { Lex->field_list.push_back($3); } fields ',' insert_ident { Lex->field_list.push_back($3); }
| insert_ident { Lex->field_list.push_back($1); }; | insert_ident { Lex->field_list.push_back($1); }
;
insert_values: insert_values:
VALUES values_list {} VALUES values_list {}
...@@ -2687,25 +2844,29 @@ insert_values: ...@@ -2687,25 +2844,29 @@ insert_values:
mysql_init_select(lex); mysql_init_select(lex);
} }
select_options select_item_list select_from select_lock_type select_options select_item_list select_from select_lock_type
union {}; union {}
;
values_list: values_list:
values_list ',' no_braces values_list ',' no_braces
| no_braces; | no_braces
;
ident_eq_list: ident_eq_list:
ident_eq_list ',' ident_eq_value ident_eq_list ',' ident_eq_value
| |
ident_eq_value; ident_eq_value
;
ident_eq_value: ident_eq_value:
simple_ident equal expr_or_default simple_ident equal expr_or_default
{ {
LEX *lex=Lex; LEX *lex=Lex;
if (lex->field_list.push_back($1) || if (lex->field_list.push_back($1) ||
lex->insert_list->push_back($3)) lex->insert_list->push_back($3))
YYABORT; YYABORT;
}; }
;
equal: EQ {} equal: EQ {}
| SET_VAR {} | SET_VAR {}
...@@ -2727,11 +2888,13 @@ no_braces: ...@@ -2727,11 +2888,13 @@ no_braces:
LEX *lex=Lex; LEX *lex=Lex;
if (lex->many_values.push_back(lex->insert_list)) if (lex->many_values.push_back(lex->insert_list))
YYABORT; YYABORT;
}; }
;
opt_values: opt_values:
/* empty */ {} /* empty */ {}
| values; | values
;
values: values:
values ',' expr_or_default values ',' expr_or_default
...@@ -2762,7 +2925,8 @@ update: ...@@ -2762,7 +2925,8 @@ update:
lex->select->order_list.first=0; lex->select->order_list.first=0;
lex->select->order_list.next= (byte**) &lex->select->order_list.first; lex->select->order_list.next= (byte**) &lex->select->order_list.first;
} }
opt_low_priority opt_ignore join_table_list SET update_list where_clause opt_order_clause delete_limit_clause; opt_low_priority opt_ignore join_table_list SET update_list where_clause opt_order_clause delete_limit_clause
;
update_list: update_list:
update_list ',' simple_ident equal expr update_list ',' simple_ident equal expr
...@@ -2774,11 +2938,13 @@ update_list: ...@@ -2774,11 +2938,13 @@ update_list:
{ {
if (add_item_to_list($1) || add_value_to_list($3)) if (add_item_to_list($1) || add_value_to_list($3))
YYABORT; YYABORT;
}; }
;
opt_low_priority: opt_low_priority:
/* empty */ { Lex->lock_option= current_thd->update_lock_default; } /* empty */ { Lex->lock_option= current_thd->update_lock_default; }
| LOW_PRIORITY { Lex->lock_option= TL_WRITE_LOW_PRIORITY; }; | LOW_PRIORITY { Lex->lock_option= TL_WRITE_LOW_PRIORITY; }
;
/* Delete rows from a table */ /* Delete rows from a table */
...@@ -2792,7 +2958,8 @@ delete: ...@@ -2792,7 +2958,8 @@ delete:
lex->select->order_list.first=0; lex->select->order_list.first=0;
lex->select->order_list.next= (byte**) &lex->select->order_list.first; lex->select->order_list.next= (byte**) &lex->select->order_list.first;
} }
opt_delete_options single_multi {}; opt_delete_options single_multi {}
;
single_multi: single_multi:
FROM table_name where_clause opt_order_clause delete_limit_clause {} FROM table_name where_clause opt_order_clause delete_limit_clause {}
...@@ -2801,11 +2968,13 @@ single_multi: ...@@ -2801,11 +2968,13 @@ single_multi:
FROM join_table_list where_clause FROM join_table_list where_clause
| FROM table_wild_list | FROM table_wild_list
{ mysql_init_multi_delete(Lex); } { mysql_init_multi_delete(Lex); }
USING join_table_list where_clause; USING join_table_list where_clause
;
table_wild_list: table_wild_list:
table_wild_one {} table_wild_one {}
| table_wild_list ',' table_wild_one {}; | table_wild_list ',' table_wild_one {}
;
table_wild_one: table_wild_one:
ident opt_wild ident opt_wild
...@@ -2817,20 +2986,24 @@ table_wild_one: ...@@ -2817,20 +2986,24 @@ table_wild_one:
{ {
if (!add_table_to_list(new Table_ident($1,$3,0),NULL,1,TL_WRITE)) if (!add_table_to_list(new Table_ident($1,$3,0),NULL,1,TL_WRITE))
YYABORT; YYABORT;
}; }
;
opt_wild: opt_wild:
/* empty */ {} /* empty */ {}
| '.' '*' {}; | '.' '*' {}
;
opt_delete_options: opt_delete_options:
/* empty */ {} /* empty */ {}
| opt_delete_option opt_delete_options {}; | opt_delete_option opt_delete_options {}
;
opt_delete_option: opt_delete_option:
QUICK { Select->options|= OPTION_QUICK; } QUICK { Select->options|= OPTION_QUICK; }
| LOW_PRIORITY { Lex->lock_option= TL_WRITE_LOW_PRIORITY; }; | LOW_PRIORITY { Lex->lock_option= TL_WRITE_LOW_PRIORITY; }
;
truncate: truncate:
TRUNCATE_SYM opt_table_sym table_name TRUNCATE_SYM opt_table_sym table_name
...@@ -2841,15 +3014,19 @@ truncate: ...@@ -2841,15 +3014,19 @@ truncate:
lex->select->order_list.elements=0; lex->select->order_list.elements=0;
lex->select->order_list.first=0; lex->select->order_list.first=0;
lex->select->order_list.next= (byte**) &lex->select->order_list.first; lex->select->order_list.next= (byte**) &lex->select->order_list.first;
lex->lock_option= current_thd->update_lock_default; }; lex->lock_option= current_thd->update_lock_default;
}
;
opt_table_sym: opt_table_sym:
/* empty */ /* empty */
| TABLE_SYM; | TABLE_SYM
;
/* Show things */ /* Show things */
show: SHOW { Lex->wild=0;} show_param; show: SHOW { Lex->wild=0;} show_param
;
show_param: show_param:
DATABASES wild DATABASES wild
...@@ -2979,31 +3156,38 @@ show_param: ...@@ -2979,31 +3156,38 @@ show_param:
| SLAVE STATUS_SYM | SLAVE STATUS_SYM
{ {
Lex->sql_command = SQLCOM_SHOW_SLAVE_STAT; Lex->sql_command = SQLCOM_SHOW_SLAVE_STAT;
}; }
;
opt_db: opt_db:
/* empty */ { $$= 0; } /* empty */ { $$= 0; }
| from_or_in ident { $$= $2.str; }; | from_or_in ident { $$= $2.str; }
;
wild: wild:
/* empty */ /* empty */
| LIKE text_string { Lex->wild= $2; }; | LIKE text_string { Lex->wild= $2; }
;
opt_full: opt_full:
/* empty */ { Lex->verbose=0; } /* empty */ { Lex->verbose=0; }
| FULL { Lex->verbose=1; }; | FULL { Lex->verbose=1; }
;
from_or_in: from_or_in:
FROM FROM
| IN_SYM; | IN_SYM
;
binlog_in: binlog_in:
/* empty */ { Lex->mi.log_file_name = 0; } /* empty */ { Lex->mi.log_file_name = 0; }
| IN_SYM TEXT_STRING { Lex->mi.log_file_name = $2.str; }; | IN_SYM TEXT_STRING { Lex->mi.log_file_name = $2.str; }
;
binlog_from: binlog_from:
/* empty */ { Lex->mi.pos = 4; /* skip magic number */ } /* empty */ { Lex->mi.pos = 4; /* skip magic number */ }
| FROM ulonglong_num { Lex->mi.pos = $2; }; | FROM ulonglong_num { Lex->mi.pos = $2; }
;
/* A Oracle compatible synonym for show */ /* A Oracle compatible synonym for show */
...@@ -3019,18 +3203,21 @@ describe: ...@@ -3019,18 +3203,21 @@ describe:
} }
opt_describe_column opt_describe_column
| describe_command select | describe_command select
{ Lex->select_lex.options|= SELECT_DESCRIBE; }; { Lex->select_lex.options|= SELECT_DESCRIBE; }
;
describe_command: describe_command:
DESC DESC
| DESCRIBE; | DESCRIBE
;
opt_describe_column: opt_describe_column:
/* empty */ {} /* empty */ {}
| text_string { Lex->wild= $1; } | text_string { Lex->wild= $1; }
| ident | ident
{ Lex->wild= new String((const char*) $1.str,$1.length,default_charset_info); }; { Lex->wild= new String((const char*) $1.str,$1.length,default_charset_info); }
;
/* flush things */ /* flush things */
...@@ -3041,11 +3228,13 @@ flush: ...@@ -3041,11 +3228,13 @@ flush:
LEX *lex=Lex; LEX *lex=Lex;
lex->sql_command= SQLCOM_FLUSH; lex->type=0; lex->sql_command= SQLCOM_FLUSH; lex->type=0;
} }
flush_options; flush_options
;
flush_options: flush_options:
flush_options ',' flush_option flush_options ',' flush_option
| flush_option; | flush_option
;
flush_option: flush_option:
table_or_tables { Lex->type|= REFRESH_TABLES; } opt_table_list table_or_tables { Lex->type|= REFRESH_TABLES; } opt_table_list
...@@ -3058,26 +3247,32 @@ flush_option: ...@@ -3058,26 +3247,32 @@ flush_option:
| SLAVE { Lex->type|= REFRESH_SLAVE; } | SLAVE { Lex->type|= REFRESH_SLAVE; }
| MASTER_SYM { Lex->type|= REFRESH_MASTER; } | MASTER_SYM { Lex->type|= REFRESH_MASTER; }
| DES_KEY_FILE { Lex->type|= REFRESH_DES_KEY_FILE; } | DES_KEY_FILE { Lex->type|= REFRESH_DES_KEY_FILE; }
| RESOURCES { Lex->type|= REFRESH_USER_RESOURCES; }; | RESOURCES { Lex->type|= REFRESH_USER_RESOURCES; }
;
opt_table_list: opt_table_list:
/* empty */ {;} /* empty */ {}
| table_list {;}; | table_list {}
;
reset: reset:
RESET_SYM RESET_SYM
{ {
LEX *lex=Lex; LEX *lex=Lex;
lex->sql_command= SQLCOM_RESET; lex->type=0; lex->sql_command= SQLCOM_RESET; lex->type=0;
} reset_options; } reset_options
;
reset_options: reset_options:
reset_options ',' reset_option reset_options ',' reset_option
| reset_option; | reset_option
;
reset_option: reset_option:
SLAVE { Lex->type|= REFRESH_SLAVE; } SLAVE { Lex->type|= REFRESH_SLAVE; }
| MASTER_SYM { Lex->type|= REFRESH_MASTER; } | MASTER_SYM { Lex->type|= REFRESH_MASTER; }
| QUERY_SYM CACHE_SYM { Lex->type|= REFRESH_QUERY_CACHE;}; | QUERY_SYM CACHE_SYM { Lex->type|= REFRESH_QUERY_CACHE;}
;
purge: purge:
PURGE PURGE
...@@ -3087,9 +3282,10 @@ purge: ...@@ -3087,9 +3282,10 @@ purge:
lex->type=0; lex->type=0;
} }
MASTER_SYM LOGS_SYM TO_SYM TEXT_STRING MASTER_SYM LOGS_SYM TO_SYM TEXT_STRING
{ {
Lex->to_log = $6.str; Lex->to_log = $6.str;
} ; }
;
/* kill threads */ /* kill threads */
...@@ -3104,7 +3300,8 @@ kill: ...@@ -3104,7 +3300,8 @@ kill:
} }
lex->sql_command=SQLCOM_KILL; lex->sql_command=SQLCOM_KILL;
lex->thread_id= (ulong) $2->val_int(); lex->thread_id= (ulong) $2->val_int();
}; }
;
/* change database */ /* change database */
...@@ -3112,7 +3309,8 @@ use: USE_SYM ident ...@@ -3112,7 +3309,8 @@ use: USE_SYM ident
{ {
LEX *lex=Lex; LEX *lex=Lex;
lex->sql_command=SQLCOM_CHANGE_DB; lex->select->db= $2.str; lex->sql_command=SQLCOM_CHANGE_DB; lex->select->db= $2.str;
}; }
;
/* import, export of files */ /* import, export of files */
...@@ -3143,30 +3341,36 @@ load: LOAD DATA_SYM load_data_lock opt_local INFILE TEXT_STRING ...@@ -3143,30 +3341,36 @@ load: LOAD DATA_SYM load_data_lock opt_local INFILE TEXT_STRING
LOAD DATA_SYM FROM MASTER_SYM LOAD DATA_SYM FROM MASTER_SYM
{ {
Lex->sql_command = SQLCOM_LOAD_MASTER_DATA; Lex->sql_command = SQLCOM_LOAD_MASTER_DATA;
}; }
;
opt_local: opt_local:
/* empty */ { $$=0;} /* empty */ { $$=0; }
| LOCAL_SYM { $$=1;}; | LOCAL_SYM { $$=1; }
;
load_data_lock: load_data_lock:
/* empty */ { Lex->lock_option= current_thd->update_lock_default; } /* empty */ { Lex->lock_option= current_thd->update_lock_default; }
| CONCURRENT { Lex->lock_option= TL_WRITE_CONCURRENT_INSERT ; } | CONCURRENT { Lex->lock_option= TL_WRITE_CONCURRENT_INSERT ; }
| LOW_PRIORITY { Lex->lock_option= TL_WRITE_LOW_PRIORITY; }; | LOW_PRIORITY { Lex->lock_option= TL_WRITE_LOW_PRIORITY; }
;
opt_duplicate: opt_duplicate:
/* empty */ { Lex->duplicates=DUP_ERROR; } /* empty */ { Lex->duplicates=DUP_ERROR; }
| REPLACE { Lex->duplicates=DUP_REPLACE; } | REPLACE { Lex->duplicates=DUP_REPLACE; }
| IGNORE_SYM { Lex->duplicates=DUP_IGNORE; }; | IGNORE_SYM { Lex->duplicates=DUP_IGNORE; }
;
opt_field_term: opt_field_term:
/* empty */ /* empty */
| COLUMNS field_term_list; | COLUMNS field_term_list
;
field_term_list: field_term_list:
field_term_list field_term field_term_list field_term
| field_term; | field_term
;
field_term: field_term:
TERMINATED BY text_string { Lex->exchange->field_term= $3;} TERMINATED BY text_string { Lex->exchange->field_term= $3;}
...@@ -3176,25 +3380,30 @@ field_term: ...@@ -3176,25 +3380,30 @@ field_term:
lex->exchange->enclosed= $4; lex->exchange->enclosed= $4;
lex->exchange->opt_enclosed=1; lex->exchange->opt_enclosed=1;
} }
| ENCLOSED BY text_string { Lex->exchange->enclosed= $3;} | ENCLOSED BY text_string { Lex->exchange->enclosed= $3; }
| ESCAPED BY text_string { Lex->exchange->escaped= $3;}; | ESCAPED BY text_string { Lex->exchange->escaped= $3; }
;
opt_line_term: opt_line_term:
/* empty */ /* empty */
| LINES line_term_list; | LINES line_term_list
;
line_term_list: line_term_list:
line_term_list line_term line_term_list line_term
| line_term; | line_term
;
line_term: line_term:
TERMINATED BY text_string { Lex->exchange->line_term= $3;} TERMINATED BY text_string { Lex->exchange->line_term= $3; }
| STARTING BY text_string { Lex->exchange->line_start= $3;}; | STARTING BY text_string { Lex->exchange->line_start= $3; }
;
opt_ignore_lines: opt_ignore_lines:
/* empty */ /* empty */
| IGNORE_SYM NUM LINES | IGNORE_SYM NUM LINES
{ Lex->exchange->skip_lines=atol($2.str); }; { Lex->exchange->skip_lines=atol($2.str); }
;
/* Common definitions */ /* Common definitions */
...@@ -3202,7 +3411,8 @@ text_literal: ...@@ -3202,7 +3411,8 @@ text_literal:
TEXT_STRING { $$ = new Item_string($1.str,$1.length,default_charset_info); } TEXT_STRING { $$ = new Item_string($1.str,$1.length,default_charset_info); }
| UNDERSCORE_CHARSET TEXT_STRING { $$ = new Item_string($2.str,$2.length,Lex->charset); } | UNDERSCORE_CHARSET TEXT_STRING { $$ = new Item_string($2.str,$2.length,Lex->charset); }
| text_literal TEXT_STRING | text_literal TEXT_STRING
{ ((Item_string*) $1)->append($2.str,$2.length); }; { ((Item_string*) $1)->append($2.str,$2.length); }
;
text_string: text_string:
TEXT_STRING { $$= new String($1.str,$1.length,default_charset_info); } TEXT_STRING { $$= new String($1.str,$1.length,default_charset_info); }
...@@ -3210,7 +3420,9 @@ text_string: ...@@ -3210,7 +3420,9 @@ text_string:
{ {
Item *tmp = new Item_varbinary($1.str,$1.length,default_charset_info); Item *tmp = new Item_varbinary($1.str,$1.length,default_charset_info);
$$= tmp ? tmp->val_str((String*) 0) : (String*) 0; $$= tmp ? tmp->val_str((String*) 0) : (String*) 0;
}; }
;
param_marker: param_marker:
'?' '?'
{ {
...@@ -3226,6 +3438,8 @@ param_marker: ...@@ -3226,6 +3438,8 @@ param_marker:
YYABORT; YYABORT;
} }
} }
;
literal: literal:
text_literal { $$ = $1; } text_literal { $$ = $1; }
| NUM { $$ = new Item_int($1.str, (longlong) atol($1.str),$1.length); } | NUM { $$ = new Item_int($1.str, (longlong) atol($1.str),$1.length); }
...@@ -3238,7 +3452,8 @@ literal: ...@@ -3238,7 +3452,8 @@ literal:
| HEX_NUM { $$ = new Item_varbinary($1.str,$1.length,default_charset_info);} | HEX_NUM { $$ = new Item_varbinary($1.str,$1.length,default_charset_info);}
| DATE_SYM text_literal { $$ = $2; } | DATE_SYM text_literal { $$ = $2; }
| TIME_SYM text_literal { $$ = $2; } | TIME_SYM text_literal { $$ = $2; }
| TIMESTAMP text_literal { $$ = $2; }; | TIMESTAMP text_literal { $$ = $2; }
;
/********************************************************************** /**********************************************************************
** Createing different items. ** Createing different items.
...@@ -3246,16 +3461,19 @@ literal: ...@@ -3246,16 +3461,19 @@ literal:
insert_ident: insert_ident:
simple_ident { $$=$1; } simple_ident { $$=$1; }
| table_wild { $$=$1; }; | table_wild { $$=$1; }
;
table_wild: table_wild:
ident '.' '*' { $$ = new Item_field(NullS,$1.str,"*"); } ident '.' '*' { $$ = new Item_field(NullS,$1.str,"*"); }
| ident '.' ident '.' '*' | ident '.' ident '.' '*'
{ $$ = new Item_field((current_thd->client_capabilities & { $$ = new Item_field((current_thd->client_capabilities &
CLIENT_NO_SCHEMA ? NullS : $1.str),$3.str,"*"); }; CLIENT_NO_SCHEMA ? NullS : $1.str),$3.str,"*"); }
;
order_ident: order_ident:
expr { $$=$1; }; expr { $$=$1; }
;
simple_ident: simple_ident:
ident ident
...@@ -3277,19 +3495,20 @@ simple_ident: ...@@ -3277,19 +3495,20 @@ simple_ident:
{ {
SELECT_LEX *sel=Select; SELECT_LEX *sel=Select;
$$ = !sel->create_refs || sel->in_sum_expr > 0 ? (Item*) new Item_field((current_thd->client_capabilities & CLIENT_NO_SCHEMA ? NullS :$1.str),$3.str,$5.str) : (Item*) new Item_ref((current_thd->client_capabilities & CLIENT_NO_SCHEMA ? NullS :$1.str),$3.str,$5.str); $$ = !sel->create_refs || sel->in_sum_expr > 0 ? (Item*) new Item_field((current_thd->client_capabilities & CLIENT_NO_SCHEMA ? NullS :$1.str),$3.str,$5.str) : (Item*) new Item_ref((current_thd->client_capabilities & CLIENT_NO_SCHEMA ? NullS :$1.str),$3.str,$5.str);
}; }
;
field_ident: field_ident:
ident { $$=$1;} ident { $$=$1;}
| ident '.' ident { $$=$3;} /* Skipp schema name in create*/ | ident '.' ident { $$=$3;} /* Skipp schema name in create*/
| '.' ident { $$=$2;} /* For Delphi */; | '.' ident { $$=$2;} /* For Delphi */
;
table_ident: table_ident:
ident { $$=new Table_ident($1); } ident { $$=new Table_ident($1); }
| ident '.' ident { $$=new Table_ident($1,$3,0);} | ident '.' ident { $$=new Table_ident($1,$3,0);}
| '.' ident { $$=new Table_ident($2);} | '.' ident { $$=new Table_ident($2);} /* For Delphi */
/* For Delphi */; ;
ident: ident:
IDENT { $$=$1; } IDENT { $$=$1; }
...@@ -3300,12 +3519,14 @@ ident: ...@@ -3300,12 +3519,14 @@ ident:
$$.length=$1.length; $$.length=$1.length;
if ((lex=Lex)->next_state != STATE_END) if ((lex=Lex)->next_state != STATE_END)
lex->next_state=STATE_OPERATOR_OR_IDENT; lex->next_state=STATE_OPERATOR_OR_IDENT;
}; }
;
ident_or_text: ident_or_text:
ident { $$=$1;} ident { $$=$1;}
| TEXT_STRING { $$=$1;} | TEXT_STRING { $$=$1;}
| LEX_HOSTNAME { $$=$1;}; | LEX_HOSTNAME { $$=$1;}
;
user: user:
ident_or_text ident_or_text
...@@ -3319,7 +3540,8 @@ user: ...@@ -3319,7 +3540,8 @@ user:
if (!($$=(LEX_USER*) sql_alloc(sizeof(st_lex_user)))) if (!($$=(LEX_USER*) sql_alloc(sizeof(st_lex_user))))
YYABORT; YYABORT;
$$->user = $1; $$->host=$3; $$->user = $1; $$->host=$3;
}; }
;
/* Keyword that we allow for identifiers */ /* Keyword that we allow for identifiers */
...@@ -3492,15 +3714,18 @@ set: ...@@ -3492,15 +3714,18 @@ set:
lex->option_type=OPT_DEFAULT; lex->option_type=OPT_DEFAULT;
lex->var_list.empty(); lex->var_list.empty();
} }
option_value_list; option_value_list
;
opt_option: opt_option:
/* empty */ {} /* empty */ {}
| OPTION {}; | OPTION {}
;
option_value_list: option_value_list:
option_type option_value option_type option_value
| option_value_list ',' option_type option_value; | option_value_list ',' option_type option_value
;
option_type: option_type:
/* empty */ {} /* empty */ {}
...@@ -3566,6 +3791,7 @@ option_value: ...@@ -3566,6 +3791,7 @@ option_value:
{ {
Lex->var_list.push_back(new set_var_password($3,$5)); Lex->var_list.push_back(new set_var_password($3,$5));
} }
;
internal_variable_name: internal_variable_name:
ident ident
...@@ -3575,6 +3801,7 @@ internal_variable_name: ...@@ -3575,6 +3801,7 @@ internal_variable_name:
YYABORT; YYABORT;
$$=tmp; $$=tmp;
} }
;
isolation_types: isolation_types:
READ_SYM UNCOMMITTED_SYM { $$= ISO_READ_UNCOMMITTED; } READ_SYM UNCOMMITTED_SYM { $$= ISO_READ_UNCOMMITTED; }
...@@ -3595,8 +3822,8 @@ text_or_password: ...@@ -3595,8 +3822,8 @@ text_or_password:
make_scrambled_password(buff,$3.str); make_scrambled_password(buff,$3.str);
$$=buff; $$=buff;
} }
}; }
;
set_expr_or_default: set_expr_or_default:
expr { $$=$1; } expr { $$=$1; }
...@@ -3613,28 +3840,34 @@ lock: ...@@ -3613,28 +3840,34 @@ lock:
{ {
Lex->sql_command=SQLCOM_LOCK_TABLES; Lex->sql_command=SQLCOM_LOCK_TABLES;
} }
table_lock_list; table_lock_list
;
table_or_tables: table_or_tables:
TABLE_SYM TABLE_SYM
| TABLES; | TABLES
;
table_lock_list: table_lock_list:
table_lock table_lock
| table_lock_list ',' table_lock; | table_lock_list ',' table_lock
;
table_lock: table_lock:
table_ident opt_table_alias lock_option table_ident opt_table_alias lock_option
{ if (!add_table_to_list($1,$2,0,(thr_lock_type) $3)) YYABORT; }; { if (!add_table_to_list($1,$2,0,(thr_lock_type) $3)) YYABORT; }
;
lock_option: lock_option:
READ_SYM { $$=TL_READ_NO_INSERT; } READ_SYM { $$=TL_READ_NO_INSERT; }
| WRITE_SYM { $$=current_thd->update_lock_default; } | WRITE_SYM { $$=current_thd->update_lock_default; }
| LOW_PRIORITY WRITE_SYM { $$=TL_WRITE_LOW_PRIORITY; } | LOW_PRIORITY WRITE_SYM { $$=TL_WRITE_LOW_PRIORITY; }
| READ_SYM LOCAL_SYM { $$= TL_READ; }; | READ_SYM LOCAL_SYM { $$= TL_READ; }
;
unlock: unlock:
UNLOCK_SYM table_or_tables { Lex->sql_command=SQLCOM_UNLOCK_TABLES; }; UNLOCK_SYM table_or_tables { Lex->sql_command=SQLCOM_UNLOCK_TABLES; }
;
/* /*
...@@ -3664,15 +3897,18 @@ handler: ...@@ -3664,15 +3897,18 @@ handler:
if (!add_table_to_list($2,0,0)) if (!add_table_to_list($2,0,0))
YYABORT; YYABORT;
} }
handler_read_or_scan where_clause limit_clause { }; handler_read_or_scan where_clause limit_clause { }
;
handler_read_or_scan: handler_read_or_scan:
handler_scan_function { Lex->backup_dir= 0; } handler_scan_function { Lex->backup_dir= 0; }
| ident handler_rkey_function { Lex->backup_dir= $1.str; }; | ident handler_rkey_function { Lex->backup_dir= $1.str; }
;
handler_scan_function: handler_scan_function:
FIRST_SYM { Lex->ha_read_mode = RFIRST; } FIRST_SYM { Lex->ha_read_mode = RFIRST; }
| NEXT_SYM { Lex->ha_read_mode = RNEXT; }; | NEXT_SYM { Lex->ha_read_mode = RNEXT; }
;
handler_rkey_function: handler_rkey_function:
FIRST_SYM { Lex->ha_read_mode = RFIRST; } FIRST_SYM { Lex->ha_read_mode = RFIRST; }
...@@ -3680,20 +3916,23 @@ handler_rkey_function: ...@@ -3680,20 +3916,23 @@ handler_rkey_function:
| PREV_SYM { Lex->ha_read_mode = RPREV; } | PREV_SYM { Lex->ha_read_mode = RPREV; }
| LAST_SYM { Lex->ha_read_mode = RLAST; } | LAST_SYM { Lex->ha_read_mode = RLAST; }
| handler_rkey_mode | handler_rkey_mode
{ {
LEX *lex=Lex; LEX *lex=Lex;
lex->ha_read_mode = RKEY; lex->ha_read_mode = RKEY;
lex->ha_rkey_mode=$1; lex->ha_rkey_mode=$1;
if (!(lex->insert_list = new List_item)) if (!(lex->insert_list = new List_item))
YYABORT; YYABORT;
} '(' values ')' { }; }
'(' values ')' { }
;
handler_rkey_mode: handler_rkey_mode:
EQ { $$=HA_READ_KEY_EXACT; } EQ { $$=HA_READ_KEY_EXACT; }
| GE { $$=HA_READ_KEY_OR_NEXT; } | GE { $$=HA_READ_KEY_OR_NEXT; }
| LE { $$=HA_READ_KEY_OR_PREV; } | LE { $$=HA_READ_KEY_OR_PREV; }
| GT_SYM { $$=HA_READ_AFTER_KEY; } | GT_SYM { $$=HA_READ_AFTER_KEY; }
| LT { $$=HA_READ_BEFORE_KEY; }; | LT { $$=HA_READ_BEFORE_KEY; }
;
/* GRANT / REVOKE */ /* GRANT / REVOKE */
...@@ -3710,7 +3949,8 @@ revoke: ...@@ -3710,7 +3949,8 @@ revoke:
lex->ssl_cipher= lex->x509_subject= lex->x509_issuer= 0; lex->ssl_cipher= lex->x509_subject= lex->x509_issuer= 0;
bzero((char*) &lex->mqh, sizeof(lex->mqh)); bzero((char*) &lex->mqh, sizeof(lex->mqh));
} }
grant_privileges ON opt_table FROM user_list; grant_privileges ON opt_table FROM user_list
;
grant: grant:
GRANT GRANT
...@@ -3726,16 +3966,19 @@ grant: ...@@ -3726,16 +3966,19 @@ grant:
bzero(&(lex->mqh),sizeof(lex->mqh)); bzero(&(lex->mqh),sizeof(lex->mqh));
} }
grant_privileges ON opt_table TO_SYM user_list grant_privileges ON opt_table TO_SYM user_list
require_clause grant_options; require_clause grant_options
;
grant_privileges: grant_privileges:
grant_privilege_list {} grant_privilege_list {}
| ALL PRIVILEGES { Lex->grant = GLOBAL_ACLS;} | ALL PRIVILEGES { Lex->grant = GLOBAL_ACLS;}
| ALL { Lex->grant = GLOBAL_ACLS;}; | ALL { Lex->grant = GLOBAL_ACLS;}
;
grant_privilege_list: grant_privilege_list:
grant_privilege grant_privilege
| grant_privilege_list ',' grant_privilege; | grant_privilege_list ',' grant_privilege
;
grant_privilege: grant_privilege:
SELECT_SYM { Lex->which_columns = SELECT_ACL;} opt_column_list SELECT_SYM { Lex->which_columns = SELECT_ACL;} opt_column_list
...@@ -3762,7 +4005,6 @@ grant_privilege: ...@@ -3762,7 +4005,6 @@ grant_privilege:
| REPLICATION CLIENT_SYM { Lex->grant |= REPL_CLIENT_ACL;} | REPLICATION CLIENT_SYM { Lex->grant |= REPL_CLIENT_ACL;}
; ;
opt_and: opt_and:
/* empty */ {} /* empty */ {}
| AND {} | AND {}
...@@ -3850,8 +4092,8 @@ opt_table: ...@@ -3850,8 +4092,8 @@ opt_table:
YYABORT; YYABORT;
if (lex->grant == GLOBAL_ACLS) if (lex->grant == GLOBAL_ACLS)
lex->grant = TABLE_ACLS & ~GRANT_ACL; lex->grant = TABLE_ACLS & ~GRANT_ACL;
}; }
;
user_list: user_list:
grant_user { if (Lex->users_list.push_back($1)) YYABORT;} grant_user { if (Lex->users_list.push_back($1)) YYABORT;}
...@@ -3862,7 +4104,6 @@ user_list: ...@@ -3862,7 +4104,6 @@ user_list:
} }
; ;
grant_user: grant_user:
user IDENTIFIED_SYM BY TEXT_STRING user IDENTIFIED_SYM BY TEXT_STRING
{ {
...@@ -3881,8 +4122,8 @@ grant_user: ...@@ -3881,8 +4122,8 @@ grant_user:
| user IDENTIFIED_SYM BY PASSWORD TEXT_STRING | user IDENTIFIED_SYM BY PASSWORD TEXT_STRING
{ $$=$1; $1->password=$5 ; } { $$=$1; $1->password=$5 ; }
| user | user
{ $$=$1; $1->password.str=NullS; }; { $$=$1; $1->password.str=NullS; }
;
opt_column_list: opt_column_list:
/* empty */ /* empty */
...@@ -3890,11 +4131,13 @@ opt_column_list: ...@@ -3890,11 +4131,13 @@ opt_column_list:
LEX *lex=Lex; LEX *lex=Lex;
lex->grant |= lex->which_columns; lex->grant |= lex->which_columns;
} }
| '(' column_list ')'; | '(' column_list ')'
;
column_list: column_list:
column_list ',' column_list_id column_list ',' column_list_id
| column_list_id; | column_list_id
;
column_list_id: column_list_id:
ident ident
...@@ -3914,8 +4157,8 @@ column_list_id: ...@@ -3914,8 +4157,8 @@ column_list_id:
point->rights |= lex->which_columns; point->rights |= lex->which_columns;
else else
lex->columns.push_back(new LEX_COLUMN (*new_str,lex->which_columns)); lex->columns.push_back(new LEX_COLUMN (*new_str,lex->which_columns));
}; }
;
require_clause: /* empty */ require_clause: /* empty */
| REQUIRE_SYM require_list | REQUIRE_SYM require_list
...@@ -3934,14 +4177,17 @@ require_clause: /* empty */ ...@@ -3934,14 +4177,17 @@ require_clause: /* empty */
{ {
Lex->ssl_type=SSL_TYPE_NONE; Lex->ssl_type=SSL_TYPE_NONE;
} }
;
grant_options: grant_options:
/* empty */ {} /* empty */ {}
| WITH grant_option_list; | WITH grant_option_list
;
grant_option_list: grant_option_list:
grant_option_list grant_option {} grant_option_list grant_option {}
| grant_option {}; | grant_option {}
;
grant_option: grant_option:
GRANT OPTION { Lex->grant |= GRANT_ACL;} GRANT OPTION { Lex->grant |= GRANT_ACL;}
...@@ -3959,20 +4205,25 @@ grant_option: ...@@ -3959,20 +4205,25 @@ grant_option:
{ {
Lex->mqh.connections=$2; Lex->mqh.connections=$2;
Lex->mqh.bits |= 4; Lex->mqh.bits |= 4;
}; }
;
begin: begin:
BEGIN_SYM { Lex->sql_command = SQLCOM_BEGIN;} opt_work; BEGIN_SYM { Lex->sql_command = SQLCOM_BEGIN;} opt_work
;
opt_work: opt_work:
/* empty */ {} /* empty */ {}
| WORK_SYM {;}; | WORK_SYM {}
;
commit: commit:
COMMIT_SYM { Lex->sql_command = SQLCOM_COMMIT;}; COMMIT_SYM { Lex->sql_command = SQLCOM_COMMIT; }
;
rollback: rollback:
ROLLBACK_SYM { Lex->sql_command = SQLCOM_ROLLBACK;}; ROLLBACK_SYM { Lex->sql_command = SQLCOM_ROLLBACK; }
;
/* /*
...@@ -3982,7 +4233,8 @@ rollback: ...@@ -3982,7 +4233,8 @@ rollback:
union: union:
/* empty */ {} /* empty */ {}
| union_list; | union_list
;
union_list: union_list:
UNION_SYM union_option UNION_SYM union_option
...@@ -4008,7 +4260,8 @@ union_list: ...@@ -4008,7 +4260,8 @@ union_list:
union_opt: union_opt:
union {} union {}
| optional_order_or_limit {}; | optional_order_or_limit {}
;
optional_order_or_limit: optional_order_or_limit:
/* empty */ {} /* empty */ {}
...@@ -4034,44 +4287,51 @@ optional_order_or_limit: ...@@ -4034,44 +4287,51 @@ optional_order_or_limit:
union_option: union_option:
/* empty */ {} /* empty */ {}
| ALL {Lex->union_option=1;}; | ALL {Lex->union_option=1; }
;
singleval_subselect: singleval_subselect:
subselect_start singleval_subselect_init subselect_start singleval_subselect_init
subselect_end subselect_end
{ {
$$= $2; $$= $2;
}; }
;
singleval_subselect_init: singleval_subselect_init:
select_init select_init
{ {
$$= new Item_singleval_subselect(current_thd, Lex->select); $$= new Item_singleval_subselect(current_thd, Lex->select);
}; }
;
exists_subselect: exists_subselect:
subselect_start exists_subselect_init subselect_start exists_subselect_init
subselect_end subselect_end
{ {
$$= $2; $$= $2;
}; }
;
exists_subselect_init: exists_subselect_init:
select_init select_init
{ {
$$= new Item_exists_subselect(current_thd, Lex->select); $$= new Item_exists_subselect(current_thd, Lex->select);
}; }
;
subselect_start: subselect_start:
'(' '('
{ {
if (mysql_new_select(Lex, 1)) if (mysql_new_select(Lex, 1))
YYABORT; YYABORT;
}; }
;
subselect_end: subselect_end:
')' ')'
{ {
LEX *lex=Lex; LEX *lex=Lex;
lex->select = lex->select->outer_select(); lex->select = lex->select->outer_select();
}; }
;
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