Commit 307bbfca authored by unknown's avatar unknown

Merged 4.1 into 5.0.


BitKeeper/etc/gone:
  auto-union
BitKeeper/etc/logging_ok:
  auto-union
BitKeeper/deleted/.del-skipkeys~98ee606e6b0fe965:
  'Auto converge rename'
configure.in:
  Auto merged
sql/sql_yacc.yy:
  Manually merged.
parents 9f1dd644 dcdf98fa
...@@ -6,6 +6,7 @@ FROM=$USER@mysql.com ...@@ -6,6 +6,7 @@ FROM=$USER@mysql.com
INTERNALS=internals@lists.mysql.com INTERNALS=internals@lists.mysql.com
DOCS=docs-commit@mysql.com DOCS=docs-commit@mysql.com
LIMIT=10000 LIMIT=10000
REPOV=5.0
if [ "$REAL_EMAIL" = "" ] if [ "$REAL_EMAIL" = "" ]
then then
...@@ -25,15 +26,15 @@ then ...@@ -25,15 +26,15 @@ then
echo "Commit successful, notifying developers at $TO" echo "Commit successful, notifying developers at $TO"
( (
cat <<EOF cat <<EOF
List-ID: <bk.mysql-4.1> List-ID: <bk.mysql-$REPOV>
From: $FROM From: $FROM
To: $TO To: $TO
Subject: bk commit - 4.1 tree Subject: bk commit - $REPOV tree
EOF EOF
bk changes -v -r+ bk changes -v -r+
bk cset -r+ -d bk cset -r+ -d
) | head -n $LIMIT | /usr/sbin/sendmail -t ) | /usr/sbin/sendmail -t
#++ #++
# internals@ mail # internals@ mail
...@@ -41,13 +42,13 @@ EOF ...@@ -41,13 +42,13 @@ EOF
echo "Notifying internals list at $INTERNALS" echo "Notifying internals list at $INTERNALS"
( (
cat <<EOF cat <<EOF
List-ID: <bk.mysql-4.1> List-ID: <bk.mysql-$REPOV>
From: $FROM From: $FROM
To: $INTERNALS To: $INTERNALS
Subject: bk commit into 4.1 tree Subject: bk commit into $REPOV tree
Below is the list of changes that have just been committed into a local Below is the list of changes that have just been committed into a local
4.1 repository of $USER. When $USER does a push these changes will $REPOV repository of $USER. When $USER does a push these changes will
be propagated to the main repository and, within 24 hours after the be propagated to the main repository and, within 24 hours after the
push, to the public repository. push, to the public repository.
For information on how to access the public repository For information on how to access the public repository
...@@ -68,15 +69,15 @@ EOF ...@@ -68,15 +69,15 @@ EOF
echo "Notifying docs list at $DOCS" echo "Notifying docs list at $DOCS"
( (
cat <<EOF cat <<EOF
List-ID: <bk.mysql-4.1> List-ID: <bk.mysql-$REPOV>
From: $FROM From: $FROM
To: $DOCS To: $DOCS
Subject: bk commit - 4.1 tree (Manual) Subject: bk commit - $REPOV tree (Manual)
EOF EOF
bk changes -v -r+ bk changes -v -r+
bk cset -r+ -d bk cset -r+ -d
) | head -n $LIMIT | /usr/sbin/sendmail -t ) | /usr/sbin/sendmail -t
fi fi
else else
......
...@@ -4,7 +4,7 @@ dnl Process this file with autoconf to produce a configure script. ...@@ -4,7 +4,7 @@ dnl Process this file with autoconf to produce a configure script.
AC_INIT(sql/mysqld.cc) AC_INIT(sql/mysqld.cc)
AC_CANONICAL_SYSTEM AC_CANONICAL_SYSTEM
# The Docs Makefile.am parses this line! # The Docs Makefile.am parses this line!
AM_INIT_AUTOMAKE(mysql, 4.1.0-alpha) AM_INIT_AUTOMAKE(mysql, 5.0.0-alpha)
AM_CONFIG_HEADER(config.h) AM_CONFIG_HEADER(config.h)
PROTOCOL_VERSION=10 PROTOCOL_VERSION=10
......
...@@ -663,7 +663,8 @@ query: ...@@ -663,7 +663,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
...@@ -702,7 +703,8 @@ verb_clause: ...@@ -702,7 +703,8 @@ verb_clause:
| unlock | unlock
| update | update
| use | use
| help; | help
;
/* help */ /* help */
...@@ -712,7 +714,8 @@ help: ...@@ -712,7 +714,8 @@ help:
LEX *lex= Lex; LEX *lex= Lex;
lex->sql_command= SQLCOM_HELP; lex->sql_command= SQLCOM_HELP;
lex->help_arg= $2.str; lex->help_arg= $2.str;
}; }
;
/* change master */ /* change master */
...@@ -722,11 +725,13 @@ change: ...@@ -722,11 +725,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
...@@ -775,7 +780,6 @@ master_def: ...@@ -775,7 +780,6 @@ master_def:
} }
; ;
/* create a table */ /* create a table */
create: create:
...@@ -861,30 +865,37 @@ create3: ...@@ -861,30 +865,37 @@ create3:
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_with_if_not_exists: opt_with_if_not_exists:
/* empty */ { $$= 0; } /* empty */ { $$= 0; }
| WITH IF NOT EXISTS { $$=HA_LEX_CREATE_IF_NOT_EXISTS; }; | WITH 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_space_separated: create_table_options_space_separated:
create_table_option create_table_option
...@@ -892,12 +903,14 @@ create_table_options_space_separated: ...@@ -892,12 +903,14 @@ create_table_options_space_separated:
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_options; | create_table_option ',' create_table_options
;
o_eq: o_eq:
/* empty */ /* empty */
| EQ {}; | EQ {}
;
create_table_option: create_table_option:
TYPE_SYM o_eq table_types { Lex->create_info.db_type= $3; } TYPE_SYM o_eq table_types { Lex->create_info.db_type= $3; }
...@@ -940,7 +953,8 @@ create_table_option: ...@@ -940,7 +953,8 @@ create_table_option:
} }
| INSERT_METHOD o_eq merge_insert_types { Lex->create_info.merge_insert_method= $3; Lex->create_info.used_fields|= HA_CREATE_USED_INSERT_METHOD;} | INSERT_METHOD o_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 o_eq TEXT_STRING { Lex->create_info.data_file_name= $4.str; } | DATA_SYM DIRECTORY_SYM o_eq TEXT_STRING { Lex->create_info.data_file_name= $4.str; }
| INDEX DIRECTORY_SYM o_eq TEXT_STRING { Lex->create_info.index_file_name= $4.str; }; | INDEX DIRECTORY_SYM o_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; }
...@@ -948,41 +962,48 @@ table_types: ...@@ -948,41 +962,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
...@@ -1010,11 +1031,13 @@ field_list_item: ...@@ -1010,11 +1031,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
...@@ -1033,7 +1056,8 @@ field_spec: ...@@ -1033,7 +1056,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; }
...@@ -1094,69 +1118,82 @@ type: ...@@ -1094,69 +1118,82 @@ 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 */ {}
| opt_attribute_list {}; | opt_attribute_list {}
;
opt_attribute_list: opt_attribute_list:
opt_attribute_list attribute {} opt_attribute_list attribute {}
...@@ -1170,7 +1207,8 @@ attribute: ...@@ -1170,7 +1207,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:
BINARY BINARY
...@@ -1188,25 +1226,30 @@ charset_name: ...@@ -1188,25 +1226,30 @@ 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_default: opt_default:
/* empty */ {} /* empty */ {}
| DEFAULT {}; | DEFAULT {}
;
opt_db_default_character_set: opt_db_default_character_set:
/* empty */ { $$=default_charset_info; } /* empty */ { $$=default_charset_info; }
| opt_default CHAR_SYM SET charset_name_or_default { $$=$4; } | opt_default CHAR_SYM SET charset_name_or_default { $$=$4; }
| opt_default CHARSET charset_name_or_default { $$=$3; }; | opt_default CHARSET charset_name_or_default { $$=$3; }
;
opt_binary: opt_binary:
/* empty */ { Lex->charset=NULL; } /* empty */ { Lex->charset=NULL; }
| BINARY { Lex->charset=my_charset_bin; } | BINARY { Lex->charset=my_charset_bin; }
| CHAR_SYM SET charset_name { Lex->charset=$3; } ; | CHAR_SYM SET charset_name { Lex->charset=$3; }
;
references: references:
REFERENCES table_ident REFERENCES table_ident
...@@ -1218,38 +1261,45 @@ references: ...@@ -1218,38 +1261,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; }
...@@ -1259,46 +1309,56 @@ key_type: ...@@ -1259,46 +1309,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
...@@ -1328,23 +1388,24 @@ alter: ...@@ -1328,23 +1388,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; }
...@@ -1413,31 +1474,37 @@ alter_list_item: ...@@ -1413,31 +1474,37 @@ alter_list_item:
lex->name= $3->table.str; lex->name= $3->table.str;
} }
| create_table_options_space_separated { Lex->simple_alter=0; } | create_table_options_space_separated { 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:
START_SYM SLAVE slave_thread_opts START_SYM SLAVE slave_thread_opts
...@@ -1452,11 +1519,13 @@ slave: ...@@ -1452,11 +1519,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*/ {}
...@@ -1472,7 +1541,8 @@ restore: ...@@ -1472,7 +1541,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
...@@ -1482,7 +1552,8 @@ backup: ...@@ -1482,7 +1552,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
...@@ -1491,20 +1562,24 @@ repair: ...@@ -1491,20 +1562,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
...@@ -1513,7 +1588,8 @@ analyze: ...@@ -1513,7 +1588,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
...@@ -1522,22 +1598,26 @@ check: ...@@ -1522,22 +1598,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
...@@ -1546,18 +1626,21 @@ optimize: ...@@ -1546,18 +1626,21 @@ 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
...@@ -1566,7 +1649,8 @@ table_to_table: ...@@ -1566,7 +1649,8 @@ table_to_table:
if (!sl->add_table_to_list($1,NULL,1,TL_IGNORE) || if (!sl->add_table_to_list($1,NULL,1,TL_IGNORE) ||
!sl->add_table_to_list($3,NULL,1,TL_IGNORE)) !sl->add_table_to_list($3,NULL,1,TL_IGNORE))
YYABORT; YYABORT;
}; }
;
/* /*
Select : retrieve data from table Select : retrieve data from table
...@@ -1574,7 +1658,8 @@ table_to_table: ...@@ -1574,7 +1658,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_SYM select_part2
...@@ -1600,7 +1685,8 @@ select_init: ...@@ -1600,7 +1685,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:
{ {
...@@ -1608,26 +1694,30 @@ select_part2: ...@@ -1608,26 +1694,30 @@ 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 | opt_into
| 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; }
...@@ -1684,8 +1774,8 @@ select_item_list: ...@@ -1684,8 +1774,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
...@@ -1696,32 +1786,39 @@ select_item: ...@@ -1696,32 +1786,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:
...@@ -1765,7 +1862,8 @@ expr_expr: ...@@ -1765,7 +1862,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:
...@@ -1804,7 +1902,8 @@ no_in_expr: ...@@ -1804,7 +1902,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:
...@@ -1846,7 +1945,8 @@ no_and_expr: ...@@ -1846,7 +1945,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
...@@ -2175,11 +2275,13 @@ simple_expr: ...@@ -2175,11 +2275,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 ')'
...@@ -2203,7 +2305,8 @@ sum_expr: ...@@ -2203,7 +2305,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:
{ {
...@@ -2218,7 +2321,8 @@ in_sum_expr: ...@@ -2218,7 +2321,8 @@ in_sum_expr:
{ {
Select->select_lex()->in_sum_expr--; Select->select_lex()->in_sum_expr--;
$$=$2; $$=$2;
}; }
;
cast_type: cast_type:
BINARY { $$=ITEM_CAST_BINARY; } BINARY { $$=ITEM_CAST_BINARY; }
...@@ -2228,42 +2332,51 @@ cast_type: ...@@ -2228,42 +2332,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
...@@ -2277,11 +2390,13 @@ when_list2: ...@@ -2277,11 +2390,13 @@ when_list2:
SELECT_LEX_NODE *sel=Select; SELECT_LEX_NODE *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; }
...@@ -2324,12 +2439,14 @@ join_table_list: ...@@ -2324,12 +2439,14 @@ join_table_list:
| join_table_list NATURAL RIGHT opt_outer JOIN_SYM join_table_list | join_table_list NATURAL RIGHT opt_outer JOIN_SYM join_table_list
{ 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_list | join_table_list NATURAL JOIN_SYM join_table_list
{ 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:
{ {
...@@ -2354,7 +2471,8 @@ join_table: ...@@ -2354,7 +2471,8 @@ join_table:
if (!($$= lex->current_select-> if (!($$= lex->current_select->
add_table_to_list(new Table_ident(unit), $5, 0, TL_UNLOCK))) add_table_to_list(new Table_ident(unit), $5, 0, TL_UNLOCK)))
YYABORT; YYABORT;
}; }
;
select_part3: select_part3:
{ {
...@@ -2366,15 +2484,18 @@ select_part3: ...@@ -2366,15 +2484,18 @@ select_part3:
mysql_init_select(lex); mysql_init_select(lex);
lex->current_select->linkage= DERIVED_TABLE_TYPE; lex->current_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 */ {}
...@@ -2389,12 +2510,14 @@ opt_key_definition: ...@@ -2389,12 +2510,14 @@ opt_key_definition:
SELECT_LEX *sel= Select->select_lex(); SELECT_LEX *sel= Select->select_lex();
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->select_lex()->interval_list.empty(); } key_or_index { Select->select_lex()->interval_list.empty(); }
'(' key_usage_list2 ')' '(' key_usage_list2 ')'
{ $$= &Select->select_lex()->interval_list; }; { $$= &Select->select_lex()->interval_list; }
;
key_usage_list2: key_usage_list2:
key_usage_list2 ',' ident key_usage_list2 ',' ident
...@@ -2408,7 +2531,8 @@ key_usage_list2: ...@@ -2408,7 +2531,8 @@ key_usage_list2:
| PRIMARY_SYM | PRIMARY_SYM
{ Select->select_lex()-> { Select->select_lex()->
interval_list.push_back(new String("PRIMARY", 7, interval_list.push_back(new String("PRIMARY", 7,
default_charset_info)); }; default_charset_info)); }
;
using_list: using_list:
ident ident
...@@ -2425,7 +2549,8 @@ using_list: ...@@ -2425,7 +2549,8 @@ using_list:
SELECT_LEX *sel= Select->select_lex(); SELECT_LEX *sel= Select->select_lex();
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; }
...@@ -2440,22 +2565,25 @@ interval: ...@@ -2440,22 +2565,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->select_lex()->where= 0; } /* empty */ { Select->select_lex()->where= 0; }
| WHERE expr { Select->select_lex()->where= $2; }; | WHERE expr { Select->select_lex()->where= $2; }
;
having_clause: having_clause:
/* empty */ /* empty */
...@@ -2463,11 +2591,13 @@ having_clause: ...@@ -2463,11 +2591,13 @@ having_clause:
{ {
SELECT_LEX *sel= Select->select_lex(); SELECT_LEX *sel= Select->select_lex();
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*) "\\"; }
;
/* /*
...@@ -2476,13 +2606,15 @@ opt_escape: ...@@ -2476,13 +2606,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 */ {}
...@@ -2522,7 +2654,8 @@ olap_opt: ...@@ -2522,7 +2654,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
...@@ -2542,19 +2675,21 @@ order_clause: ...@@ -2542,19 +2675,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 */ {}
...@@ -2587,7 +2722,8 @@ limit_clause: ...@@ -2587,7 +2722,8 @@ limit_clause:
SELECT_LEX_NODE *sel= lex->current_select; SELECT_LEX_NODE *sel= lex->current_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 */
...@@ -2601,20 +2737,23 @@ delete_limit_clause: ...@@ -2601,20 +2737,23 @@ delete_limit_clause:
lex->current_select->select_limit= HA_POS_ERROR; lex->current_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 */
...@@ -2628,16 +2767,18 @@ procedure_clause: ...@@ -2628,16 +2767,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
...@@ -2713,7 +2854,9 @@ do: DO_SYM ...@@ -2713,7 +2854,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
*/ */
...@@ -2747,27 +2890,32 @@ drop: ...@@ -2747,27 +2890,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 (!Select->add_table_to_list($1, NULL, 1)) YYABORT; }; { if (!Select->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
...@@ -2776,21 +2924,25 @@ replace: ...@@ -2776,21 +2924,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
...@@ -2799,7 +2951,8 @@ insert_table: ...@@ -2799,7 +2951,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 {}
...@@ -2810,16 +2963,19 @@ insert_field_spec: ...@@ -2810,16 +2963,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 {}
...@@ -2832,16 +2988,19 @@ insert_values: ...@@ -2832,16 +2988,19 @@ 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
...@@ -2850,7 +3009,8 @@ ident_eq_value: ...@@ -2850,7 +3009,8 @@ ident_eq_value:
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 {}
...@@ -2872,11 +3032,13 @@ no_braces: ...@@ -2872,11 +3032,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
...@@ -2905,7 +3067,8 @@ update: ...@@ -2905,7 +3067,8 @@ update:
lex->sql_command= SQLCOM_UPDATE; lex->sql_command= SQLCOM_UPDATE;
lex->select_lex.init_order(); lex->select_lex.init_order();
} }
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
...@@ -2917,11 +3080,13 @@ update_list: ...@@ -2917,11 +3080,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 */
...@@ -2934,7 +3099,8 @@ delete: ...@@ -2934,7 +3099,8 @@ delete:
lex->lock_option= lex->thd->update_lock_default; lex->lock_option= lex->thd->update_lock_default;
lex->select_lex.init_order(); lex->select_lex.init_order();
} }
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 {}
...@@ -2943,11 +3109,13 @@ single_multi: ...@@ -2943,11 +3109,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
...@@ -2961,20 +3129,24 @@ table_wild_one: ...@@ -2961,20 +3129,24 @@ table_wild_one:
if (!Select->add_table_to_list(new Table_ident($1, $3, 0), NULL, if (!Select->add_table_to_list(new Table_ident($1, $3, 0), NULL,
1, TL_WRITE)) 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
...@@ -2983,11 +3155,14 @@ truncate: ...@@ -2983,11 +3155,14 @@ truncate:
lex->sql_command= SQLCOM_TRUNCATE; lex->sql_command= SQLCOM_TRUNCATE;
lex->select_lex.options= 0; lex->select_lex.options= 0;
lex->select_lex.init_order(); lex->select_lex.init_order();
lex->lock_option= lex->thd->update_lock_default; }; lex->lock_option= lex->thd->update_lock_default;
}
;
opt_table_sym: opt_table_sym:
/* empty */ /* empty */
| TABLE_SYM; | TABLE_SYM
;
/* Show things */ /* Show things */
...@@ -2997,7 +3172,9 @@ show: SHOW ...@@ -2997,7 +3172,9 @@ show: SHOW
lex->wild=0; lex->wild=0;
bzero((char*) &lex->create_info,sizeof(lex->create_info)); bzero((char*) &lex->create_info,sizeof(lex->create_info));
} }
show_param; show_param
;
show_param: show_param:
DATABASES wild DATABASES wild
...@@ -3129,31 +3306,38 @@ show_param: ...@@ -3129,31 +3306,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 */
...@@ -3173,18 +3357,21 @@ describe: ...@@ -3173,18 +3357,21 @@ describe:
LEX *lex=Lex; LEX *lex=Lex;
lex->select_lex.options|= SELECT_DESCRIBE; lex->select_lex.options|= SELECT_DESCRIBE;
lex->describe=1; lex->describe=1;
}; }
;
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 */
...@@ -3195,11 +3382,13 @@ flush: ...@@ -3195,11 +3382,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
...@@ -3212,26 +3401,32 @@ flush_option: ...@@ -3212,26 +3401,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
...@@ -3243,7 +3438,8 @@ purge: ...@@ -3243,7 +3438,8 @@ purge:
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 */
...@@ -3258,7 +3454,8 @@ kill: ...@@ -3258,7 +3454,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 */
...@@ -3267,7 +3464,8 @@ use: USE_SYM ident ...@@ -3267,7 +3464,8 @@ use: USE_SYM ident
LEX *lex=Lex; LEX *lex=Lex;
lex->sql_command=SQLCOM_CHANGE_DB; lex->sql_command=SQLCOM_CHANGE_DB;
lex->select_lex.db= $2.str; lex->select_lex.db= $2.str;
}; }
;
/* import, export of files */ /* import, export of files */
...@@ -3298,30 +3496,36 @@ load: LOAD DATA_SYM load_data_lock opt_local INFILE TEXT_STRING ...@@ -3298,30 +3496,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;}
...@@ -3331,25 +3535,30 @@ field_term: ...@@ -3331,25 +3535,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 */
...@@ -3357,7 +3566,8 @@ text_literal: ...@@ -3357,7 +3566,8 @@ text_literal:
TEXT_STRING { $$ = new Item_string($1.str,$1.length,current_thd->thd_charset); } TEXT_STRING { $$ = new Item_string($1.str,$1.length,current_thd->thd_charset); }
| 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,current_thd->thd_charset); } TEXT_STRING { $$= new String($1.str,$1.length,current_thd->thd_charset); }
...@@ -3365,7 +3575,9 @@ text_string: ...@@ -3365,7 +3575,9 @@ text_string:
{ {
Item *tmp = new Item_varbinary($1.str,$1.length); Item *tmp = new Item_varbinary($1.str,$1.length);
$$= tmp ? tmp->val_str((String*) 0) : (String*) 0; $$= tmp ? tmp->val_str((String*) 0) : (String*) 0;
}; }
;
param_marker: param_marker:
'?' '?'
{ {
...@@ -3380,7 +3592,9 @@ param_marker: ...@@ -3380,7 +3592,9 @@ param_marker:
yyerror("You have an error in your SQL syntax"); yyerror("You have an error in your SQL syntax");
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); }
...@@ -3393,7 +3607,8 @@ literal: ...@@ -3393,7 +3607,8 @@ literal:
| HEX_NUM { $$ = new Item_varbinary($1.str,$1.length);} | HEX_NUM { $$ = new Item_varbinary($1.str,$1.length);}
| 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.
...@@ -3401,16 +3616,19 @@ literal: ...@@ -3401,16 +3616,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
...@@ -3432,19 +3650,20 @@ simple_ident: ...@@ -3432,19 +3650,20 @@ simple_ident:
{ {
SELECT_LEX_NODE *sel=Select; SELECT_LEX_NODE *sel=Select;
$$ = !sel->create_refs || sel->get_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->get_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; }
...@@ -3455,12 +3674,14 @@ ident: ...@@ -3455,12 +3674,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
...@@ -3474,7 +3695,8 @@ user: ...@@ -3474,7 +3695,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 */
...@@ -3647,15 +3869,18 @@ set: ...@@ -3647,15 +3869,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 */ {}
...@@ -3733,6 +3958,7 @@ internal_variable_name: ...@@ -3733,6 +3958,7 @@ internal_variable_name:
} }
; ;
isolation_types: isolation_types:
READ_SYM UNCOMMITTED_SYM { $$= ISO_READ_UNCOMMITTED; } READ_SYM UNCOMMITTED_SYM { $$= ISO_READ_UNCOMMITTED; }
| READ_SYM COMMITTED_SYM { $$= ISO_READ_COMMITTED; } | READ_SYM COMMITTED_SYM { $$= ISO_READ_COMMITTED; }
...@@ -3755,7 +3981,6 @@ text_or_password: ...@@ -3755,7 +3981,6 @@ text_or_password:
} }
; ;
set_expr_or_default: set_expr_or_default:
expr { $$=$1; } expr { $$=$1; }
| DEFAULT { $$=0; } | DEFAULT { $$=0; }
...@@ -3771,15 +3996,18 @@ lock: ...@@ -3771,15 +3996,18 @@ 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
...@@ -3881,7 +4109,8 @@ revoke: ...@@ -3881,7 +4109,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
...@@ -3897,7 +4126,8 @@ grant: ...@@ -3897,7 +4126,8 @@ 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 {}
...@@ -3907,7 +4137,8 @@ grant_privileges: ...@@ -3907,7 +4137,8 @@ grant_privileges:
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
...@@ -3934,7 +4165,6 @@ grant_privilege: ...@@ -3934,7 +4165,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 {}
...@@ -4025,7 +4255,6 @@ opt_table: ...@@ -4025,7 +4255,6 @@ opt_table:
} }
; ;
user_list: user_list:
grant_user { if (Lex->users_list.push_back($1)) YYABORT;} grant_user { if (Lex->users_list.push_back($1)) YYABORT;}
| user_list ',' grant_user | user_list ',' grant_user
...@@ -4035,7 +4264,6 @@ user_list: ...@@ -4035,7 +4264,6 @@ user_list:
} }
; ;
grant_user: grant_user:
user IDENTIFIED_SYM BY TEXT_STRING user IDENTIFIED_SYM BY TEXT_STRING
{ {
...@@ -4064,11 +4292,13 @@ opt_column_list: ...@@ -4064,11 +4292,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
...@@ -4111,9 +4341,11 @@ require_clause: /* empty */ ...@@ -4111,9 +4341,11 @@ require_clause: /* empty */
} }
; ;
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 {}
...@@ -4140,7 +4372,8 @@ grant_option: ...@@ -4140,7 +4372,8 @@ grant_option:
; ;
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 */ {}
...@@ -4148,10 +4381,12 @@ opt_work: ...@@ -4148,10 +4381,12 @@ opt_work:
; ;
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; }
;
/* /*
...@@ -4161,7 +4396,8 @@ rollback: ...@@ -4161,7 +4396,8 @@ rollback:
union: union:
/* empty */ {} /* empty */ {}
| union_list; | union_list
;
union_list: union_list:
UNION_SYM union_option UNION_SYM union_option
...@@ -4187,7 +4423,8 @@ union_list: ...@@ -4187,7 +4423,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 */ {}
...@@ -4211,14 +4448,16 @@ optional_order_or_limit: ...@@ -4211,14 +4448,16 @@ optional_order_or_limit:
union_option: union_option:
/* empty */ {} /* empty */ {}
| ALL {Select->master_unit()->union_option= 1;}; | ALL {Select->master_unit()->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
...@@ -4226,14 +4465,16 @@ singleval_subselect_init: ...@@ -4226,14 +4465,16 @@ singleval_subselect_init:
$$= new Item_singleval_subselect(current_thd, $$= new Item_singleval_subselect(current_thd,
Lex->current_select->master_unit()-> Lex->current_select->master_unit()->
first_select()); first_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
...@@ -4241,18 +4482,21 @@ exists_subselect_init: ...@@ -4241,18 +4482,21 @@ exists_subselect_init:
$$= new Item_exists_subselect(current_thd, $$= new Item_exists_subselect(current_thd,
Lex->current_select->master_unit()-> Lex->current_select->master_unit()->
first_select()); first_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->current_select = lex->current_select->outer_select(); lex->current_select = lex->current_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