From 39c212e38d85ac7a82214fcc1c68b37b7bc293c2 Mon Sep 17 00:00:00 2001 From: "Sinisa@sinisa.nasamreza.org" <> Date: Tue, 19 Feb 2002 15:32:11 +0200 Subject: small bug fix for 2.95.4 --- sql/sql_yacc.yy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sql/sql_yacc.yy') diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 91cf0ae5fc9..742c39ce901 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -776,7 +776,7 @@ opt_table_options: table_options: table_option { $$=$1; } - | table_option table_options { $$= $1 | $2 } + | table_option table_options { $$= $1 | $2; } table_option: TEMPORARY { $$=HA_LEX_CREATE_TMP_TABLE; } -- cgit v1.2.1 From 735b27d578f2b60c928ec2bc85d47f266c1f633a Mon Sep 17 00:00:00 2001 From: "bar@gw.udmsearch.izhnet.ru" <> Date: Fri, 22 Feb 2002 15:24:42 +0400 Subject: Added GIS extension --- sql/sql_yacc.yy | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 55 insertions(+), 6 deletions(-) (limited to 'sql/sql_yacc.yy') diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 742c39ce901..62b1e1841ff 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -54,6 +54,7 @@ inline Item *or_or_concat(Item* A, Item* B) List *item_list; List *string_list; Key::Keytype key_type; + enum ha_key_alg key_alg; enum db_type db_type; enum row_type row_type; enum ha_rkey_function ha_rkey_mode; @@ -154,6 +155,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %token BOOL_SYM %token BOOLEAN_SYM %token BOTH +%token BTREE_SYM %token BY %token CACHE_SYM %token CASCADE @@ -200,6 +202,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %token GREATEST_SYM %token GROUP %token HAVING +%token HASH_SYM %token HEAP_SYM %token HEX_NUM %token HIGH_PRIORITY @@ -291,10 +294,12 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %token ROWS_SYM %token ROW_FORMAT_SYM %token ROW_SYM +%token RTREE_SYM %token SET %token SERIALIZABLE_SYM %token SESSION_SYM %token SHUTDOWN +%token SPATIAL_SYM %token SQL_CACHE_SYM %token SQL_NO_CACHE_SYM %token SSL_SYM @@ -344,6 +349,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %token ENUM %token FAST_SYM %token FLOAT_SYM +%token GEOM_SYM %token INT_SYM %token LIMIT %token LONGBLOB @@ -401,6 +407,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %token FORMAT_SYM %token FOR_SYM %token FROM_UNIXTIME +%token GEOMETRYCOLLECTION %token GROUP_UNIQUE_USERS %token HOUR_MINUTE_SYM %token HOUR_SECOND_SYM @@ -412,6 +419,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %token INTERVAL_SYM %token LAST_INSERT_ID %token LEFT +%token LINESTRING %token LOCATE %token MAKE_SET_SYM %token MINUTE_SECOND_SYM @@ -419,8 +427,12 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %token MODE_SYM %token MODIFY_SYM %token MONTH_SYM +%token MULTILINESTRING +%token MULTIPOINT +%token MULTIPOLYGON %token NOW_SYM %token PASSWORD +%token POLYGON %token POSITION_SYM %token PROCEDURE %token RAND @@ -527,6 +539,9 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %type key_type opt_unique_or_fulltext +%type + key_alg opt_btree_or_rtree + %type key_usage_list @@ -713,21 +728,22 @@ create: } create2 - | CREATE opt_unique_or_fulltext INDEX ident ON table_ident + | CREATE opt_unique_or_fulltext INDEX ident key_alg ON table_ident { LEX *lex=Lex; lex->sql_command= SQLCOM_CREATE_INDEX; - if (!add_table_to_list($6,NULL,1)) + if (!add_table_to_list($7,NULL,1)) YYABORT; lex->create_list.empty(); lex->key_list.empty(); lex->col_list.empty(); lex->change=NullS; } - '(' key_list ')' + '(' key_list ')' { LEX *lex=Lex; - lex->key_list.push_back(new Key($2,$4.str,lex->col_list)); + + lex->key_list.push_back(new Key($2,$5,$4.str,lex->col_list)); lex->col_list.empty(); } | CREATE DATABASE opt_if_not_exists ident @@ -874,10 +890,10 @@ field_list_item: { Lex->col_list.empty(); /* Alloced by sql_alloc */ } - | key_type opt_ident '(' key_list ')' + | key_type opt_ident key_alg '(' key_list ')' { LEX *lex=Lex; - lex->key_list.push_back(new Key($1,$2,lex->col_list)); + lex->key_list.push_back(new Key($1,$3,$2,lex->col_list)); lex->col_list.empty(); /* Alloced by sql_alloc */ } | opt_constraint FOREIGN KEY_SYM opt_ident '(' key_list ')' references @@ -942,6 +958,8 @@ type: $$=FIELD_TYPE_TINY_BLOB; } | BLOB_SYM { Lex->type|=BINARY_FLAG; $$=FIELD_TYPE_BLOB; } + | GEOM_SYM { Lex->type|=BINARY_FLAG; + $$=FIELD_TYPE_GEOMETRY; } | MEDIUMBLOB { Lex->type|=BINARY_FLAG; $$=FIELD_TYPE_MEDIUM_BLOB; } | LONGBLOB { Lex->type|=BINARY_FLAG; @@ -1083,6 +1101,8 @@ key_type: | key_or_index { $$= Key::MULTIPLE; } | FULLTEXT_SYM { $$= Key::FULLTEXT; } | FULLTEXT_SYM key_or_index { $$= Key::FULLTEXT; } + | SPATIAL_SYM { $$= Key::SPATIAL; } + | SPATIAL_SYM key_or_index { $$= Key::SPATIAL; } | opt_constraint UNIQUE_SYM { $$= Key::UNIQUE; } | opt_constraint UNIQUE_SYM key_or_index { $$= Key::UNIQUE; } @@ -1099,6 +1119,16 @@ opt_unique_or_fulltext: /* empty */ { $$= Key::MULTIPLE; } | UNIQUE_SYM { $$= Key::UNIQUE; } | FULLTEXT_SYM { $$= Key::FULLTEXT; } + | SPATIAL_SYM { $$= Key::SPATIAL; } + +key_alg: + /* empty */ { $$= HA_KEY_ALG_BTREE; } + | USING opt_btree_or_rtree { $$= $2 } + +opt_btree_or_rtree: + BTREE_SYM { $$= HA_KEY_ALG_BTREE; } + | RTREE_SYM { $$= HA_KEY_ALG_RTREE; } + | HASH_SYM { $$= HA_KEY_ALG_HASH; } key_list: key_list ',' key_part order_dir { Lex->col_list.push_back($3); } @@ -1684,6 +1714,10 @@ simple_expr: } | FIELD_FUNC '(' expr ',' expr_list ')' { $$= new Item_func_field($3, *$5); } + | GEOMETRYCOLLECTION '(' expr_list ')' + { $$= new Item_func_spatial_collection(* $3, + Geometry::wkbGeometryCollection, + Geometry::wkbPoint); } | HOUR_SYM '(' expr ')' { $$= new Item_func_hour($3); } | IF '(' expr ',' expr ',' expr ')' @@ -1708,6 +1742,9 @@ simple_expr: } | LEFT '(' expr ',' expr ')' { $$= new Item_func_left($3,$5); } + | LINESTRING '(' expr_list ')' + { $$= new Item_func_spatial_collection(* $3, + Geometry::wkbLineString, Geometry::wkbPoint); } | LOCATE '(' expr ',' expr ')' { $$= new Item_func_locate($5,$3); } | LOCATE '(' expr ',' expr ',' expr ')' @@ -1720,6 +1757,15 @@ simple_expr: { $$= new Item_func_minute($3); } | MONTH_SYM '(' expr ')' { $$= new Item_func_month($3); } + | MULTILINESTRING '(' expr_list ')' + { $$= new Item_func_spatial_collection(* $3, + Geometry::wkbMultiLineString, Geometry::wkbLineString); } + | MULTIPOINT '(' expr_list ')' + { $$= new Item_func_spatial_collection(* $3, + Geometry::wkbMultiPoint, Geometry::wkbPoint); } + | MULTIPOLYGON '(' expr_list ')' + { $$= new Item_func_spatial_collection(* $3, + Geometry::wkbMultiPolygon, Geometry::wkbPolygon ); } | NOW_SYM optional_braces { $$= new Item_func_now(); current_thd->safe_to_cache_query=0;} | NOW_SYM '(' expr ')' @@ -1728,6 +1774,9 @@ simple_expr: { $$= new Item_func_password($3); } + | POLYGON '(' expr_list ')' + { $$= new Item_func_spatial_collection(* $3, + Geometry::wkbPolygon, Geometry::wkbLineString); } | POSITION_SYM '(' no_in_expr IN_SYM expr ')' { $$ = new Item_func_locate($5,$3); } | RAND '(' expr ')' -- cgit v1.2.1 From 1c0a5fd45769e934bb8c84d4d4ce4a1a7ee82b1f Mon Sep 17 00:00:00 2001 From: "bar@gw.udmsearch.izhnet.ru" <> Date: Thu, 28 Feb 2002 17:28:36 +0400 Subject: Several new OpenGIS functions Fixes in GeomFromText() to accept an new optional argument respobsible for SRID. This is for more OpenGIS conformance and PostGIS compatibility to simplify migrating from PgSQL to MySQL --- sql/sql_yacc.yy | 50 +++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 45 insertions(+), 5 deletions(-) (limited to 'sql/sql_yacc.yy') diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 857d7a245f0..b8b56a72657 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -349,7 +349,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %token ENUM %token FAST_SYM %token FLOAT_SYM -%token GEOM_SYM +%token GEOMETRY_SYM %token INT_SYM %token LIMIT %token LONGBLOB @@ -407,6 +407,8 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %token FORMAT_SYM %token FOR_SYM %token FROM_UNIXTIME +%token GEOMCOLLFROMTEXT +%token GEOMFROMTEXT %token GEOMETRYCOLLECTION %token GROUP_UNIQUE_USERS %token HOUR_MINUTE_SYM @@ -419,6 +421,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %token INTERVAL_SYM %token LAST_INSERT_ID %token LEFT +%token LINEFROMTEXT %token LINESTRING %token LOCATE %token MAKE_SET_SYM @@ -427,11 +430,16 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %token MODE_SYM %token MODIFY_SYM %token MONTH_SYM +%token MLINEFROMTEXT +%token MPOINTFROMTEXT +%token MPOLYFROMTEXT %token MULTILINESTRING %token MULTIPOINT %token MULTIPOLYGON %token NOW_SYM %token PASSWORD +%token POINTFROMTEXT +%token POLYFROMTEXT %token POLYGON %token POSITION_SYM %token PROCEDURE @@ -966,7 +974,7 @@ type: $$=FIELD_TYPE_TINY_BLOB; } | BLOB_SYM { Lex->type|=BINARY_FLAG; $$=FIELD_TYPE_BLOB; } - | GEOM_SYM { Lex->type|=BINARY_FLAG; + | GEOMETRY_SYM { Lex->type|=BINARY_FLAG; $$=FIELD_TYPE_GEOMETRY; } | MEDIUMBLOB { Lex->type|=BINARY_FLAG; $$=FIELD_TYPE_MEDIUM_BLOB; } @@ -1722,6 +1730,10 @@ simple_expr: } | FIELD_FUNC '(' expr ',' expr_list ')' { $$= new Item_func_field($3, *$5); } + | GEOMFROMTEXT '(' expr ')' + { $$= new Item_func_geometry_from_text($3) } + | GEOMFROMTEXT '(' expr ',' expr ')' + { $$= new Item_func_geometry_from_text($3) } | GEOMETRYCOLLECTION '(' expr_list ')' { $$= new Item_func_spatial_collection(* $3, Geometry::wkbGeometryCollection, @@ -1757,10 +1769,18 @@ simple_expr: { $$= new Item_func_locate($5,$3); } | LOCATE '(' expr ',' expr ',' expr ')' { $$= new Item_func_locate($5,$3,$7); } - | GREATEST_SYM '(' expr ',' expr_list ')' + | GEOMCOLLFROMTEXT '(' expr ')' + { $$= new Item_func_geometry_from_text($3) } + | GEOMCOLLFROMTEXT '(' expr ',' expr ')' + { $$= new Item_func_geometry_from_text($3) } + | GREATEST_SYM '(' expr ',' expr_list ')' { $5->push_front($3); $$= new Item_func_max(*$5); } | LEAST_SYM '(' expr ',' expr_list ')' { $5->push_front($3); $$= new Item_func_min(*$5); } + | LINEFROMTEXT '(' expr ')' + { $$= new Item_func_geometry_from_text($3) } + | LINEFROMTEXT '(' expr ',' expr ')' + { $$= new Item_func_geometry_from_text($3) } | MINUTE_SYM '(' expr ')' { $$= new Item_func_minute($3); } | MONTH_SYM '(' expr ')' @@ -1768,7 +1788,19 @@ simple_expr: | MULTILINESTRING '(' expr_list ')' { $$= new Item_func_spatial_collection(* $3, Geometry::wkbMultiLineString, Geometry::wkbLineString); } - | MULTIPOINT '(' expr_list ')' + | MLINEFROMTEXT '(' expr ')' + { $$= new Item_func_geometry_from_text($3) } + | MLINEFROMTEXT '(' expr ',' expr ')' + { $$= new Item_func_geometry_from_text($3) } + | MPOINTFROMTEXT '(' expr ')' + { $$= new Item_func_geometry_from_text($3) } + | MPOINTFROMTEXT '(' expr ',' expr ')' + { $$= new Item_func_geometry_from_text($3) } + | MPOLYFROMTEXT '(' expr ')' + { $$= new Item_func_geometry_from_text($3) } + | MPOLYFROMTEXT '(' expr ',' expr ')' + { $$= new Item_func_geometry_from_text($3) } + | MULTIPOINT '(' expr_list ')' { $$= new Item_func_spatial_collection(* $3, Geometry::wkbMultiPoint, Geometry::wkbPoint); } | MULTIPOLYGON '(' expr_list ')' @@ -1782,7 +1814,15 @@ simple_expr: { $$= new Item_func_password($3); } - | POLYGON '(' expr_list ')' + | POINTFROMTEXT '(' expr ')' + { $$= new Item_func_geometry_from_text($3) } + | POINTFROMTEXT '(' expr ',' expr ')' + { $$= new Item_func_geometry_from_text($3) } + | POLYFROMTEXT '(' expr ')' + { $$= new Item_func_geometry_from_text($3) } + | POLYFROMTEXT '(' expr ',' expr ')' + { $$= new Item_func_geometry_from_text($3) } + | POLYGON '(' expr_list ')' { $$= new Item_func_spatial_collection(* $3, Geometry::wkbPolygon, Geometry::wkbLineString); } | POSITION_SYM '(' no_in_expr IN_SYM expr ')' -- cgit v1.2.1 From cdddb6546049b021d8f9dd6d5a1cfede1c4ae6fb Mon Sep 17 00:00:00 2001 From: "Sinisa@sinisa.nasamreza.org" <> Date: Thu, 28 Feb 2002 22:01:41 +0200 Subject: Porting from mysql-4.0. Read comments there if you are interested .. --- sql/sql_yacc.yy | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'sql/sql_yacc.yy') diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 857d7a245f0..3c0d476ac83 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1977,7 +1977,7 @@ opt_else: | ELSE expr { $$= $2; } when_list: - { Select->when_list.push_front(new List) } + { Select->when_list.push_front(new List); } when_list2 { $$= Select->when_list.pop(); } @@ -2080,7 +2080,7 @@ opt_key_definition: } 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; } key_usage_list2: @@ -2686,7 +2686,7 @@ describe: YYABORT; } opt_describe_column - | describe_command select { Lex->select_lex.options|= SELECT_DESCRIBE }; + | describe_command select { Lex->select_lex.options|= SELECT_DESCRIBE; } describe_command: @@ -3126,7 +3126,7 @@ set: lex->select->select_limit=lex->thd->default_select_limit; lex->tx_isolation=lex->thd->tx_isolation; lex->option_type=0; - lex->option_list.empty() + lex->option_list.empty(); } option_value_list -- cgit v1.2.1 From c276cc060a5e0ba9fe791408100498ce7b2b3166 Mon Sep 17 00:00:00 2001 From: "Sinisa@sinisa.nasamreza.org" <> Date: Thu, 7 Mar 2002 14:19:18 +0200 Subject: Same patches as for 4.0. See there for details --- sql/sql_yacc.yy | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'sql/sql_yacc.yy') diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index f91d6a48d50..41e56328613 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1652,7 +1652,7 @@ simple_expr: | BINARY expr %prec NEG { $$= new Item_func_binary($2); } | CAST_SYM '(' expr AS cast_type ')' { $$= create_func_cast($3, $5); } | CASE_SYM opt_expr WHEN_SYM when_list opt_else END - { $$= new Item_func_case(* $4, $2, $5 ) } + { $$= new Item_func_case(* $4, $2, $5 ); } | CONVERT_SYM '(' expr ',' cast_type ')' { $$= create_func_cast($3, $5); } | FUNC_ARG0 '(' ')' { $$= ((Item*(*)(void))($1.symbol->create_func))();} @@ -1969,7 +1969,7 @@ sum_expr: { $$=new Item_sum_sum($3); } in_sum_expr: - { Select->in_sum_expr++ } + { Select->in_sum_expr++; } expr { Select->in_sum_expr--; @@ -2042,7 +2042,7 @@ opt_pad: join_table_list: '(' join_table_list ')' { $$=$2; } | join_table { $$=$1; } - | join_table_list normal_join join_table { $$=$3 } + | join_table_list normal_join join_table { $$=$3; } | join_table_list STRAIGHT_JOIN join_table { $$=$3 ; $$->straight=1; } | join_table_list INNER_SYM JOIN_SYM join_table ON expr { add_join_on($4,$6); $$=$4; } -- cgit v1.2.1 From b37ce8e76944610b92087fe0e04e05f1b60903c8 Mon Sep 17 00:00:00 2001 From: "bar@gw.udmsearch.izhnet.ru" <> Date: Tue, 12 Mar 2002 21:37:58 +0400 Subject: New ctype functions/macros to support many charsets at a time --- sql/sql_yacc.yy | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'sql/sql_yacc.yy') diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 41e56328613..d762c8784a3 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -3654,7 +3654,8 @@ column_list_id: LEX *lex=Lex; while ((point=iter++)) { - if (!my_strcasecmp(point->column.ptr(),new_str->ptr())) + if (!my_strcasecmp(system_charset_info, + point->column.ptr(), new_str->ptr())) break; } lex->grant_tot_col|= lex->which_columns; -- cgit v1.2.1 From b226bad64aae0ccaba22f507a7011e7b2fee11c7 Mon Sep 17 00:00:00 2001 From: "Sinisa@sinisa.nasamreza.org" <> Date: Tue, 19 Mar 2002 14:23:11 +0200 Subject: Some changes from 4.0. Take a look their for details --- sql/sql_yacc.yy | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'sql/sql_yacc.yy') diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index d762c8784a3..3c9c005fb48 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1441,22 +1441,22 @@ select_option_list: select_option: STRAIGHT_JOIN { Select->options|= SELECT_STRAIGHT_JOIN; } - | HIGH_PRIORITY { Lex->lock_option= TL_READ_HIGH_PRIORITY; } + | HIGH_PRIORITY { if (Select != &Lex->select_lex) YYABORT; Lex->lock_option= TL_READ_HIGH_PRIORITY; } | DISTINCT { Select->options|= SELECT_DISTINCT; } | SQL_SMALL_RESULT { Select->options|= SELECT_SMALL_RESULT; } | SQL_BIG_RESULT { Select->options|= SELECT_BIG_RESULT; } - | SQL_BUFFER_RESULT { Select->options|= OPTION_BUFFER_RESULT; } - | SQL_CALC_FOUND_ROWS { Select->options|= OPTION_FOUND_ROWS; } - | SQL_NO_CACHE_SYM { current_thd->safe_to_cache_query=0; } - | SQL_CACHE_SYM { Select->options |= OPTION_TO_QUERY_CACHE; } + | SQL_BUFFER_RESULT { if (Select != &Lex->select_lex) YYABORT; Select->options|= OPTION_BUFFER_RESULT; } + | SQL_CALC_FOUND_ROWS { if (Select != &Lex->select_lex) YYABORT; Select->options|= OPTION_FOUND_ROWS; } + | SQL_NO_CACHE_SYM { if (Select != &Lex->select_lex) YYABORT; current_thd->safe_to_cache_query=0; } + | SQL_CACHE_SYM { if (Select != &Lex->select_lex) YYABORT; Select->options |= OPTION_TO_QUERY_CACHE; } | ALL {} select_lock_type: /* empty */ | FOR_SYM UPDATE_SYM - { Lex->lock_option= TL_WRITE; current_thd->safe_to_cache_query=0; } + { if (Select != &Lex->select_lex) YYABORT; Lex->lock_option= TL_WRITE; current_thd->safe_to_cache_query=0; } | LOCK_SYM IN_SYM SHARE_SYM MODE_SYM - { Lex->lock_option= TL_READ_WITH_SHARED_LOCKS; current_thd->safe_to_cache_query=0; } + { if (Select != &Lex->select_lex) YYABORT; Lex->lock_option= TL_READ_WITH_SHARED_LOCKS; current_thd->safe_to_cache_query=0; } select_item_list: select_item_list ',' select_item -- cgit v1.2.1 From 22d4f87e6984bd086217147ec8afb1ab6a8059ae Mon Sep 17 00:00:00 2001 From: "Sinisa@sinisa.nasamreza.org" <> Date: Tue, 26 Mar 2002 15:06:05 +0200 Subject: Derived tables ! --- sql/sql_yacc.yy | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'sql/sql_yacc.yy') diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 3c9c005fb48..ee31e726eb1 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -2099,6 +2099,30 @@ join_table: } | '{' ident join_table LEFT OUTER JOIN_SYM join_table ON expr '}' { add_join_on($7,$9); $7->outer_join|=JOIN_TYPE_LEFT; $$=$7; } + | '(' SELECT_SYM select_part3 ')' opt_table_alias + { + LEX *lex=Lex; + lex->select=lex->select->prev; + if (!($$=add_table_to_list(new Table_ident(Lex->last_select),$5,0,TL_UNLOCK))) + YYABORT; + } + +select_part3: + { + LEX *lex=Lex; + lex->derived_tables=true; + SELECT_LEX *tmp=lex->select; + if (lex->select->linkage == NOT_A_SELECT || mysql_new_select(lex)) + YYABORT; + mysql_init_select(lex); + lex->select->linkage=DERIVED_TABLE_TYPE; + lex->select->prev=tmp; + } + select_options select_item_list select_intoto + +select_intoto: + limit_clause {} + | select_from opt_outer: /* empty */ {} -- cgit v1.2.1 From ae03ccc40399d01fd78a5bf393b92dbfcdf1951e Mon Sep 17 00:00:00 2001 From: "bar@gw.udmsearch.izhnet.ru" <> Date: Fri, 29 Mar 2002 18:22:21 +0400 Subject: Charset convertion operator CONVERT( string USING charset) --- sql/sql_yacc.yy | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'sql/sql_yacc.yy') diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index ee31e726eb1..9ca5b44aa64 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1654,6 +1654,16 @@ simple_expr: | CASE_SYM opt_expr WHEN_SYM when_list opt_else END { $$= new Item_func_case(* $4, $2, $5 ); } | CONVERT_SYM '(' expr ',' cast_type ')' { $$= create_func_cast($3, $5); } + | CONVERT_SYM '(' expr USING IDENT ')' + { + CHARSET_INFO *cs=find_compiled_charset_by_name($5.str); + if (!cs) + { + net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$5); + YYABORT; + } + $$= new Item_func_conv_charset($3,cs); + } | FUNC_ARG0 '(' ')' { $$= ((Item*(*)(void))($1.symbol->create_func))();} | FUNC_ARG1 '(' expr ')' -- cgit v1.2.1 From 648bd2788aa27bed452073b8c0393c61dc58b7cc Mon Sep 17 00:00:00 2001 From: "bar@gw.udmsearch.izhnet.ru" <> Date: Fri, 29 Mar 2002 19:11:06 +0400 Subject: Now this syntax works too: CONVERT(string,charset_to,charset_from) where charset_to and charset_from are expressions. For example: CONVERT('test','latin2','cp1250') --- sql/sql_yacc.yy | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'sql/sql_yacc.yy') diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 9ca5b44aa64..90ecb4c92fc 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1664,6 +1664,10 @@ simple_expr: } $$= new Item_func_conv_charset($3,cs); } + | CONVERT_SYM '(' expr ',' expr ',' expr ')' + { + $$= new Item_func_conv_charset3($3,$5,$7); + } | FUNC_ARG0 '(' ')' { $$= ((Item*(*)(void))($1.symbol->create_func))();} | FUNC_ARG1 '(' expr ')' -- cgit v1.2.1 From 4a3942bb74e2b09828540f93530c5cffcaba71af Mon Sep 17 00:00:00 2001 From: "bar@gw.udmsearch.izhnet.ru" <> Date: Tue, 16 Apr 2002 18:21:53 +0500 Subject: Some fixes after merging changes from 4.0 --- sql/sql_yacc.yy | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) (limited to 'sql/sql_yacc.yy') diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 18b8e5bb824..77a70093036 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1154,7 +1154,7 @@ opt_unique_or_fulltext: key_alg: /* empty */ { $$= HA_KEY_ALG_BTREE; } - | USING opt_btree_or_rtree { $$= $2 } + | USING opt_btree_or_rtree { $$= $2; } opt_btree_or_rtree: BTREE_SYM { $$= HA_KEY_ALG_BTREE; } @@ -1784,9 +1784,9 @@ simple_expr: | FIELD_FUNC '(' expr ',' expr_list ')' { $$= new Item_func_field($3, *$5); } | GEOMFROMTEXT '(' expr ')' - { $$= new Item_func_geometry_from_text($3) } + { $$= new Item_func_geometry_from_text($3); } | GEOMFROMTEXT '(' expr ',' expr ')' - { $$= new Item_func_geometry_from_text($3) } + { $$= new Item_func_geometry_from_text($3); } | GEOMETRYCOLLECTION '(' expr_list ')' { $$= new Item_func_spatial_collection(* $3, Geometry::wkbGeometryCollection, @@ -1823,17 +1823,17 @@ simple_expr: | LOCATE '(' expr ',' expr ',' expr ')' { $$= new Item_func_locate($5,$3,$7); } | GEOMCOLLFROMTEXT '(' expr ')' - { $$= new Item_func_geometry_from_text($3) } + { $$= new Item_func_geometry_from_text($3); } | GEOMCOLLFROMTEXT '(' expr ',' expr ')' - { $$= new Item_func_geometry_from_text($3) } + { $$= new Item_func_geometry_from_text($3); } | GREATEST_SYM '(' expr ',' expr_list ')' { $5->push_front($3); $$= new Item_func_max(*$5); } | LEAST_SYM '(' expr ',' expr_list ')' { $5->push_front($3); $$= new Item_func_min(*$5); } | LINEFROMTEXT '(' expr ')' - { $$= new Item_func_geometry_from_text($3) } + { $$= new Item_func_geometry_from_text($3); } | LINEFROMTEXT '(' expr ',' expr ')' - { $$= new Item_func_geometry_from_text($3) } + { $$= new Item_func_geometry_from_text($3); } | MINUTE_SYM '(' expr ')' { $$= new Item_func_minute($3); } | MONTH_SYM '(' expr ')' @@ -1842,17 +1842,17 @@ simple_expr: { $$= new Item_func_spatial_collection(* $3, Geometry::wkbMultiLineString, Geometry::wkbLineString); } | MLINEFROMTEXT '(' expr ')' - { $$= new Item_func_geometry_from_text($3) } + { $$= new Item_func_geometry_from_text($3); } | MLINEFROMTEXT '(' expr ',' expr ')' - { $$= new Item_func_geometry_from_text($3) } + { $$= new Item_func_geometry_from_text($3); } | MPOINTFROMTEXT '(' expr ')' - { $$= new Item_func_geometry_from_text($3) } + { $$= new Item_func_geometry_from_text($3); } | MPOINTFROMTEXT '(' expr ',' expr ')' - { $$= new Item_func_geometry_from_text($3) } + { $$= new Item_func_geometry_from_text($3); } | MPOLYFROMTEXT '(' expr ')' - { $$= new Item_func_geometry_from_text($3) } + { $$= new Item_func_geometry_from_text($3); } | MPOLYFROMTEXT '(' expr ',' expr ')' - { $$= new Item_func_geometry_from_text($3) } + { $$= new Item_func_geometry_from_text($3); } | MULTIPOINT '(' expr_list ')' { $$= new Item_func_spatial_collection(* $3, Geometry::wkbMultiPoint, Geometry::wkbPoint); } @@ -1868,13 +1868,13 @@ simple_expr: $$= new Item_func_password($3); } | POINTFROMTEXT '(' expr ')' - { $$= new Item_func_geometry_from_text($3) } + { $$= new Item_func_geometry_from_text($3); } | POINTFROMTEXT '(' expr ',' expr ')' - { $$= new Item_func_geometry_from_text($3) } + { $$= new Item_func_geometry_from_text($3); } | POLYFROMTEXT '(' expr ')' - { $$= new Item_func_geometry_from_text($3) } + { $$= new Item_func_geometry_from_text($3); } | POLYFROMTEXT '(' expr ',' expr ')' - { $$= new Item_func_geometry_from_text($3) } + { $$= new Item_func_geometry_from_text($3); } | POLYGON '(' expr_list ')' { $$= new Item_func_spatial_collection(* $3, Geometry::wkbPolygon, Geometry::wkbLineString); } -- cgit v1.2.1 From eab2893dac4f2447baf6b1b2b4f70869e974bf44 Mon Sep 17 00:00:00 2001 From: "bar@gw.udmsearch.izhnet.ru" <> Date: Thu, 25 Apr 2002 13:36:55 +0500 Subject: RB-Tree indexes support in HEAP tables Renamed _hp_func -> hp_func mi_key_cmp moved to /mysys/my_handler.c New tests for HEAP tables --- sql/sql_yacc.yy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sql/sql_yacc.yy') diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 77a70093036..6317b21a603 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1153,7 +1153,7 @@ opt_unique_or_fulltext: | SPATIAL_SYM { $$= Key::SPATIAL; } key_alg: - /* empty */ { $$= HA_KEY_ALG_BTREE; } + /* empty */ { $$= HA_KEY_ALG_UNDEF; } | USING opt_btree_or_rtree { $$= $2; } opt_btree_or_rtree: -- cgit v1.2.1 From ac28b1995557b9c0601b3dc260aafefd624d2f64 Mon Sep 17 00:00:00 2001 From: "bell@sanja.is.com.ua" <> Date: Mon, 6 May 2002 22:47:57 +0300 Subject: fixed bug in derived tables if derived tables more than 1 --- sql/sql_yacc.yy | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'sql/sql_yacc.yy') diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 6317b21a603..24321dbdb53 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -2155,8 +2155,10 @@ join_table: | '(' SELECT_SYM select_part3 ')' opt_table_alias { LEX *lex=Lex; + SELECT_LEX *select_to_execute= lex->select; lex->select=lex->select->prev; - if (!($$=add_table_to_list(new Table_ident(Lex->last_select),$5,0,TL_UNLOCK))) + if (!($$=add_table_to_list(new Table_ident(select_to_execute), + $5,0,TL_UNLOCK))) YYABORT; } -- cgit v1.2.1 From 494184ff5fe9b614d843d622bc1a0230c970fe3f Mon Sep 17 00:00:00 2001 From: "bell@sanja.is.com.ua" <> Date: Tue, 7 May 2002 00:04:16 +0300 Subject: new SELECT_LEX structure --- sql/sql_yacc.yy | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) (limited to 'sql/sql_yacc.yy') diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 6317b21a603..f9d075b75b3 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -2155,21 +2155,22 @@ join_table: | '(' SELECT_SYM select_part3 ')' opt_table_alias { LEX *lex=Lex; - lex->select=lex->select->prev; - if (!($$=add_table_to_list(new Table_ident(Lex->last_select),$5,0,TL_UNLOCK))) + SELECT_LEX_UNIT *unit= (SELECT_LEX_UNIT*) lex->select->master; + lex->select= (SELECT_LEX*) unit->master; + if (!($$= add_table_to_list(new Table_ident(unit), + $5,0,TL_UNLOCK))) YYABORT; } select_part3: { - LEX *lex=Lex; - lex->derived_tables=true; - SELECT_LEX *tmp=lex->select; - if (lex->select->linkage == NOT_A_SELECT || mysql_new_select(lex)) + LEX *lex= Lex; + lex->derived_tables= true; + if (lex->select->linkage == GLOBAL_OPTIONS_TYPE || + mysql_new_select(lex, 1)) YYABORT; mysql_init_select(lex); - lex->select->linkage=DERIVED_TABLE_TYPE; - lex->select->prev=tmp; + lex->select->linkage= DERIVED_TABLE_TYPE; } select_options select_item_list select_intoto @@ -3809,7 +3810,8 @@ union_list: net_printf(&lex->thd->net, ER_WRONG_USAGE,"UNION","INTO"); YYABORT; } - if (lex->select->linkage == NOT_A_SELECT || mysql_new_select(lex)) + if (lex->select->linkage == GLOBAL_OPTIONS_TYPE || + mysql_new_select(lex, 0)) YYABORT; lex->select->linkage=UNION_TYPE; } @@ -3824,10 +3826,10 @@ optional_order_or_limit: | { LEX *lex=Lex; - if (!lex->select->braces || mysql_new_select(lex)) + if (!lex->select->braces || mysql_new_select(lex, 0)) YYABORT; mysql_init_select(lex); - lex->select->linkage=NOT_A_SELECT; + lex->select->linkage= GLOBAL_OPTIONS_TYPE; lex->select->select_limit=lex->thd->default_select_limit; } opt_order_clause limit_clause -- cgit v1.2.1 From ead6f225a426c43b181e3dee2dfebad40df4f163 Mon Sep 17 00:00:00 2001 From: "bell@sanja.is.com.ua" <> Date: Wed, 8 May 2002 23:14:40 +0300 Subject: new SELECT_LEX structures used for storing global ORDER BY, global LIMIT & limit counters --- sql/sql_yacc.yy | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) (limited to 'sql/sql_yacc.yy') diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index f9d075b75b3..bd7a5ff3b48 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1449,7 +1449,14 @@ select: select_init: SELECT_SYM select_part2 { Select->braces=false; } union | - '(' SELECT_SYM select_part2 ')' { Select->braces=true;} union_opt + '(' SELECT_SYM select_part2 ')' + { + SELECT_LEX * sel=Select; + sel->braces=true; + /* select in braces, can't contain global parameters */ + ((SELECT_LEX_UNIT*)sel->master)->global_parameters= + sel->master; + } union_opt select_part2: @@ -3826,10 +3833,15 @@ optional_order_or_limit: | { LEX *lex=Lex; - if (!lex->select->braces || mysql_new_select(lex, 0)) + if (!lex->select->braces) YYABORT; - mysql_init_select(lex); - lex->select->linkage= GLOBAL_OPTIONS_TYPE; + ((SELECT_LEX_UNIT*)lex->select->master)->global_parameters= + lex->select->master; + /* + Following type conversion looks like hack, but all that need SELECT_LEX + fields always check linkage type. + */ + lex->select= (SELECT_LEX*)lex->select->master; lex->select->select_limit=lex->thd->default_select_limit; } opt_order_clause limit_clause -- cgit v1.2.1 From e077890b04fe6278e434739ee8d01ec76a0a9a75 Mon Sep 17 00:00:00 2001 From: "bell@sanja.is.com.ua" <> Date: Sun, 12 May 2002 23:46:42 +0300 Subject: simple subselects ported to new select_lex structures --- sql/sql_yacc.yy | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) (limited to 'sql/sql_yacc.yy') diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index bd7a5ff3b48..8d981f05a1f 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -544,7 +544,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); literal text_literal insert_ident order_ident simple_ident select_item2 expr opt_expr opt_else sum_expr in_sum_expr table_wild opt_pad no_in_expr expr_expr simple_expr no_and_expr - using_list + using_list subselect subselect_init %type expr_list udf_expr_list when_list ident_list ident_list_arg @@ -612,7 +612,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); table_to_table_list table_to_table opt_table_list opt_as handler_rkey_function handler_read_or_scan single_multi table_wild_list table_wild_one opt_wild union union_list - precision union_option + precision union_option subselect_start subselect_end END_OF_INPUT %type @@ -1547,8 +1547,8 @@ optional_braces: | '(' ')' {} /* all possible expressions */ -expr: expr_expr {$$ = $1; } - | simple_expr {$$ = $1; } +expr: expr_expr { $$= $1; } + | simple_expr { $$= $1; } /* expressions that begin with 'expr' */ expr_expr: @@ -1688,6 +1688,7 @@ simple_expr: | NOT expr %prec NEG { $$= new Item_func_not($2); } | '!' expr %prec NEG { $$= new Item_func_not($2); } | '(' expr ')' { $$= $2; } + | subselect { $$= $1; } | '{' ident expr '}' { $$= $3; } | MATCH ident_list_arg AGAINST '(' expr ')' { Select->ftfunc_list.push_back((Item_func_match *) @@ -3849,3 +3850,30 @@ optional_order_or_limit: union_option: /* empty */ {} | ALL {Lex->union_option=1;} + +subselect: + subselect_start subselect_init + subselect_end + { + $$= $2; + } + +subselect_init: + select_init + { + $$= new Item_subselect(current_thd, Lex->select); + } + +subselect_start: + '(' + { + if (mysql_new_select(Lex, 1)) + YYABORT; + } + +subselect_end: + ')' + { + LEX *lex=Lex; + lex->select = (SELECT_LEX*)lex->select->master->master; + } -- cgit v1.2.1 From 196aa19cf6624c17fb3c36c876e3e1a40f18ed23 Mon Sep 17 00:00:00 2001 From: "bar@gw.udmsearch.izhnet.ru" <> Date: Fri, 17 May 2002 16:29:52 +0500 Subject: Now string values are created and filled with charset field SELECT func(charset2) FROM t ORDER BY 1 works in correct charset --- sql/sql_yacc.yy | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) (limited to 'sql/sql_yacc.yy') diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 24321dbdb53..6ce661440c0 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1904,7 +1904,7 @@ simple_expr: | SUBSTRING_INDEX '(' expr ',' expr ',' expr ')' { $$= new Item_func_substr_index($3,$5,$7); } | TRIM '(' expr ')' - { $$= new Item_func_trim($3,new Item_string(" ",1)); } + { $$= new Item_func_trim($3,new Item_string(" ",1,default_charset_info)); } | TRIM '(' LEADING opt_pad FROM expr ')' { $$= new Item_func_ltrim($6,$4); } | TRIM '(' TRAILING opt_pad FROM expr ')' @@ -2089,7 +2089,7 @@ when_list2: } opt_pad: - /* empty */ { $$=new Item_string(" ",1); } + /* empty */ { $$=new Item_string(" ",1,default_charset_info); } | expr { $$=$1; } join_table_list: @@ -2204,11 +2204,11 @@ key_usage_list: key_usage_list2: key_usage_list2 ',' ident - { Select->interval_list.push_back(new String((const char*) $3.str,$3.length)); } + { Select->interval_list.push_back(new String((const char*) $3.str,$3.length,default_charset_info)); } | ident - { Select->interval_list.push_back(new String((const char*) $1.str,$1.length)); } + { Select->interval_list.push_back(new String((const char*) $1.str,$1.length,default_charset_info)); } | PRIMARY_SYM - { Select->interval_list.push_back(new String("PRIMARY",7)); } + { Select->interval_list.push_back(new String("PRIMARY",7,default_charset_info)); } using_list: ident @@ -2815,7 +2815,7 @@ describe_command: opt_describe_column: /* empty */ {} | text_string { Lex->wild= $1; } - | ident { Lex->wild= new String((const char*) $1.str,$1.length); } + | ident { Lex->wild= new String((const char*) $1.str,$1.length,default_charset_info); } /* flush things */ @@ -2983,15 +2983,15 @@ opt_ignore_lines: /* Common definitions */ text_literal: - TEXT_STRING { $$ = new Item_string($1.str,$1.length); } + TEXT_STRING { $$ = new Item_string($1.str,$1.length,default_charset_info); } | text_literal TEXT_STRING { ((Item_string*) $1)->append($2.str,$2.length); } text_string: - TEXT_STRING { $$= new String($1.str,$1.length); } + TEXT_STRING { $$= new String($1.str,$1.length,default_charset_info); } | HEX_NUM { - Item *tmp = new Item_varbinary($1.str,$1.length); + Item *tmp = new Item_varbinary($1.str,$1.length,default_charset_info); $$= tmp ? tmp->val_str((String*) 0) : (String*) 0; } @@ -3004,7 +3004,7 @@ literal: | FLOAT_NUM { $$ = new Item_float($1.str, $1.length); } | NULL_SYM { $$ = new Item_null(); Lex->next_state=STATE_OPERATOR_OR_IDENT;} - | HEX_NUM { $$ = new Item_varbinary($1.str,$1.length);} + | HEX_NUM { $$ = new Item_varbinary($1.str,$1.length,default_charset_info);} | DATE_SYM text_literal { $$ = $2; } | TIME_SYM text_literal { $$ = $2; } | TIMESTAMP text_literal { $$ = $2; } @@ -3731,7 +3731,7 @@ column_list: column_list_id: ident { - String *new_str = new String((const char*) $1.str,$1.length); + String *new_str = new String((const char*) $1.str,$1.length,default_charset_info); List_iterator iter(Lex->columns); class LEX_COLUMN *point; LEX *lex=Lex; -- cgit v1.2.1 From 2b0a5e1f65885b686ce8af603d135ae69c576087 Mon Sep 17 00:00:00 2001 From: "bar@gw.udmsearch.izhnet.ru" <> Date: Mon, 20 May 2002 17:10:50 +0500 Subject: Charset related synax changes, now these things work in parser: CREATE DATABASE name DEFAULT CHARACTER SET charsetname; CREATE DATABASE name (fieldname CHAR(n) CHARACTER SET charsetname); Changes affect query parsing ONLY and do not have other effect yet. --- sql/sql_yacc.yy | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) (limited to 'sql/sql_yacc.yy') diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 6ce661440c0..756afbd7a09 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -777,7 +777,7 @@ create: lex->key_list.push_back(new Key($2,$5,$4.str,lex->col_list)); lex->col_list.empty(); } - | CREATE DATABASE opt_if_not_exists ident + | CREATE DATABASE opt_if_not_exists ident default_charset { LEX *lex=Lex; lex->sql_command=SQLCOM_CREATE_DB; @@ -1095,8 +1095,31 @@ attribute: | UNIQUE_SYM KEY_SYM { Lex->type|= UNIQUE_KEY_FLAG; } opt_binary: - /* empty */ {} - | BINARY { Lex->type|=BINARY_FLAG; } + /* empty */ { Lex->charset=default_charset_info; } + | BINARY { Lex->type|=BINARY_FLAG; Lex->charset=default_charset_info; } + | CHAR_SYM SET ident + { + CHARSET_INFO *cs=get_charset_by_name($3.str,MYF(MY_WME)); + if (!cs) + { + net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$3); + YYABORT; + } + Lex->charset=cs; + } + +default_charset: + /* empty */ { Lex->charset-default_charset_info; } + | DEFAULT CHAR_SYM SET ident + { + CHARSET_INFO *cs=get_charset_by_name($4.str,MYF(MY_WME)); + if (!cs) + { + net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$4); + YYABORT; + } + Lex->charset=cs; + } references: REFERENCES table_ident opt_on_delete {} -- cgit v1.2.1 From ab36838e9b5c923972400a4848fa74c0aed0ac89 Mon Sep 17 00:00:00 2001 From: "bell@sanja.is.com.ua" <> Date: Mon, 27 May 2002 20:52:54 +0300 Subject: Hiding internal pointers of SELECT_LEX structures --- sql/sql_yacc.yy | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'sql/sql_yacc.yy') diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index c5addfee15e..ebd26939ad5 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1477,8 +1477,8 @@ select_init: SELECT_LEX * sel=Select; sel->braces=true; /* select in braces, can't contain global parameters */ - ((SELECT_LEX_UNIT*)sel->master)->global_parameters= - sel->master; + sel->master_unit()->global_parameters= + sel->master_unit(); } union_opt @@ -2186,8 +2186,8 @@ join_table: | '(' SELECT_SYM select_part3 ')' opt_table_alias { LEX *lex=Lex; - SELECT_LEX_UNIT *unit= (SELECT_LEX_UNIT*) lex->select->master; - lex->select= (SELECT_LEX*) unit->master; + SELECT_LEX_UNIT *unit= lex->select->master_unit(); + lex->select= unit->outer_select(); if (!($$= add_table_to_list(new Table_ident(unit), $5,0,TL_UNLOCK))) YYABORT; @@ -2325,7 +2325,7 @@ order_clause: LEX *lex=Lex; if (lex->sql_command == SQLCOM_MULTI_UPDATE) YYABORT; - lex->select->sort_default=1; + /*lex->select->sort_default=1;*/ } order_list order_list: @@ -3859,13 +3859,13 @@ optional_order_or_limit: LEX *lex=Lex; if (!lex->select->braces) YYABORT; - ((SELECT_LEX_UNIT*)lex->select->master)->global_parameters= - lex->select->master; + lex->select->master_unit()->global_parameters= + lex->select->master_unit(); /* Following type conversion looks like hack, but all that need SELECT_LEX fields always check linkage type. */ - lex->select= (SELECT_LEX*)lex->select->master; + lex->select= (SELECT_LEX*)lex->select->master_unit(); lex->select->select_limit=lex->thd->default_select_limit; } opt_order_clause limit_clause @@ -3898,5 +3898,5 @@ subselect_end: ')' { LEX *lex=Lex; - lex->select = (SELECT_LEX*)lex->select->master->master; + lex->select = lex->select->outer_select(); } -- cgit v1.2.1 From 24f28f3bf0eb6e434f7c377cf2ec31210e944e77 Mon Sep 17 00:00:00 2001 From: "bar@gw.udmsearch.izhnet.ru" <> Date: Fri, 31 May 2002 21:04:47 +0500 Subject: Added filling of unicode mapping arrays during charset.conf loading All charset.conf files were extended to supply unicode mapping array CONVERT() now uses more common order of arguments: CONVERT(expr,charset_from,charset_to) Dynamic charset can be used as CONVERT() argument --- sql/sql_yacc.yy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'sql/sql_yacc.yy') diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 756afbd7a09..61d97cb43f2 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1718,7 +1718,7 @@ simple_expr: | CONVERT_SYM '(' expr ',' cast_type ')' { $$= create_func_cast($3, $5); } | CONVERT_SYM '(' expr USING IDENT ')' { - CHARSET_INFO *cs=find_compiled_charset_by_name($5.str); + CHARSET_INFO *cs=get_charset_by_name($5.str,MYF(MY_WME)); if (!cs) { net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$5); @@ -1728,7 +1728,7 @@ simple_expr: } | CONVERT_SYM '(' expr ',' expr ',' expr ')' { - $$= new Item_func_conv_charset3($3,$5,$7); + $$= new Item_func_conv_charset3($3,$7,$5); } | FUNC_ARG0 '(' ')' { $$= ((Item*(*)(void))($1.symbol->create_func))();} -- cgit v1.2.1 From fb2cd68b5da4c19ec7b4a12d709f3cc150cfba1c Mon Sep 17 00:00:00 2001 From: "bell@sanja.is.com.ua" <> Date: Sat, 1 Jun 2002 23:35:36 +0300 Subject: new subselect tests LIMIT fixed AVG & STD with subselect fixed join_free fixed to be depended queries compatible sort_default removed from SELECT_LEX --- sql/sql_yacc.yy | 1 - 1 file changed, 1 deletion(-) (limited to 'sql/sql_yacc.yy') diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index ebd26939ad5..9b95ab05977 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -2325,7 +2325,6 @@ order_clause: LEX *lex=Lex; if (lex->sql_command == SQLCOM_MULTI_UPDATE) YYABORT; - /*lex->select->sort_default=1;*/ } order_list order_list: -- cgit v1.2.1 From 6e54cc492c424a7697a7139600b67b9cfe36a5da Mon Sep 17 00:00:00 2001 From: "monty@hundin.mysql.fi" <> Date: Sun, 2 Jun 2002 21:22:20 +0300 Subject: Extension of .frm file (not yet ready for push) --- sql/sql_yacc.yy | 99 ++++++++++++++++++++++++++++++++------------------------- 1 file changed, 56 insertions(+), 43 deletions(-) (limited to 'sql/sql_yacc.yy') diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 756afbd7a09..a9961090197 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -302,6 +302,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %token SET %token SERIALIZABLE_SYM %token SESSION_SYM +%token SIMPLE_SYM %token SHUTDOWN %token SPATIAL_SYM %token SQL_CACHE_SYM @@ -520,7 +521,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); opt_table_alias %type - table_ident + table_ident references %type remember_name remember_end opt_len opt_ident opt_db text_or_password @@ -532,7 +533,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %type type int_type real_type order_dir opt_field_spec set_option lock_option udf_type if_exists opt_local opt_table_options table_options - table_option opt_if_not_exists + table_option opt_if_not_exists delete_option %type ULONG_NUM raid_types merge_insert_types @@ -600,7 +601,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); opt_precision opt_ignore opt_column opt_restrict grant revoke set lock unlock string_list field_options field_option field_opt_list opt_binary table_lock_list table_lock varchar - references opt_on_delete opt_on_delete_list opt_on_delete_item use + ref_list opt_on_delete opt_on_delete_list opt_on_delete_item use opt_delete_options opt_delete_option opt_outer table_list table_name opt_option opt_place opt_low_priority opt_attribute opt_attribute_list attribute column_list column_list_id @@ -612,7 +613,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); table_to_table_list table_to_table opt_table_list opt_as handler_rkey_function handler_read_or_scan single_multi table_wild_list table_wild_one opt_wild union union_list - precision union_option + precision union_option opt_on_delete_item END_OF_INPUT %type @@ -756,6 +757,7 @@ create: bzero((char*) &lex->create_info,sizeof(lex->create_info)); lex->create_info.options=$2 | $4; lex->create_info.db_type= default_table_type; + lex->create_info.table_charset=default_charset_info; } create2 @@ -774,7 +776,7 @@ create: { LEX *lex=Lex; - lex->key_list.push_back(new Key($2,$5,$4.str,lex->col_list)); + lex->key_list.push_back(new Key($2,$4.str, $5, lex->col_list)); lex->col_list.empty(); } | CREATE DATABASE opt_if_not_exists ident default_charset @@ -924,12 +926,19 @@ field_list_item: | key_type opt_ident key_alg '(' key_list ')' { LEX *lex=Lex; - lex->key_list.push_back(new Key($1,$3,$2,lex->col_list)); + lex->key_list.push_back(new Key($1,$2, $3, lex->col_list)); lex->col_list.empty(); /* Alloced by sql_alloc */ } | opt_constraint FOREIGN KEY_SYM opt_ident '(' key_list ')' references { - Lex->col_list.empty(); /* Alloced by sql_alloc */ + LEX *lex=Lex; + lex->key_list.push_back(new foreign_key($4, lex->col_list, + $8, + lex->ref_list, + lex->fk_delete_opt, + lex->fk_update_opt, + lex->fk_match_option)); + lex->col_list.empty(); /* Alloced by sql_alloc */ } | opt_constraint CHECK_SYM '(' expr ')' { @@ -945,7 +954,7 @@ field_spec: { LEX *lex=Lex; lex->length=lex->dec=0; lex->type=0; lex->interval=0; - lex->default_value=0; + lex->default_value=lex->comment=0; } type opt_attribute { @@ -953,8 +962,8 @@ field_spec: if (add_field_to_list($1.str, (enum enum_field_types) $3, lex->length,lex->dec,lex->type, - lex->default_value,lex->change, - lex->interval)) + lex->default_value, lex->comment, + lex->change,lex->interval)) YYABORT; } @@ -1093,6 +1102,7 @@ attribute: | PRIMARY_SYM KEY_SYM { Lex->type|= PRI_KEY_FLAG | NOT_NULL_FLAG; } | UNIQUE_SYM { Lex->type|= UNIQUE_FLAG; } | UNIQUE_SYM KEY_SYM { Lex->type|= UNIQUE_KEY_FLAG; } + | COMMENT_SYM text_literal { Lex->comment= $2; } opt_binary: /* empty */ { Lex->charset=default_charset_info; } @@ -1122,11 +1132,25 @@ default_charset: } references: - REFERENCES table_ident opt_on_delete {} - | REFERENCES table_ident '(' key_list ')' opt_on_delete - { - Lex->col_list.empty(); /* Alloced by sql_alloc */ - } + REFERENCES table_ident + { + LEX *lex=Lex; + lex->fk_delete_opt= lex->fk_update_opt= lex->fk_match_option= 0; + lex->ref_list.empty(); + } + opt_ref_list + { + $$=$2; + } + +opt_ref_list: + /* empty */ {} + | '(' ref_list ')' opt_on_delete {} + +ref_list: + 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)); } + opt_on_delete: /* empty */ {} @@ -1136,19 +1160,19 @@ opt_on_delete_list: opt_on_delete_list opt_on_delete_item {} | opt_on_delete_item {} - opt_on_delete_item: - ON DELETE_SYM delete_option {} - | ON UPDATE_SYM delete_option {} - | MATCH FULL {} - | MATCH PARTIAL {} + ON DELETE_SYM delete_option { Lex->fk_delete_opt= $3; } + | ON UPDATE_SYM delete_option { Lex->fk_update_opt= $3; } + | MATCH FULL { Lex->fk_match_option= foreign_key::FK_MATCH_FULL; } + | MATCH PARTIAL { Lex->fk_match_option= foreign_key::FK_MATCH_PARTIAL; } + | MATCH SIMPLE_SYM { Lex->fk_match_option= foreign_key::FK_MATCH_SIMPLE; } delete_option: - RESTRICT {} - | CASCADE {} - | SET NULL_SYM {} - | NO_SYM ACTION {} - | SET DEFAULT {} + RESTRICT { $$= (int) foreign_key::FK_OPTION_RESTRICT; } + | CASCADE { $$= (int) foreign_key::FK_OPTION_CASCADE; } + | SET NULL_SYM { $$= (int) foreign_key::FK_OPTION_SET_NULL; } + | NO_SYM ACTION { $$= (int) foreign_key::FK_OPTION_NO_ACTION; } + | SET DEFAULT { $$= (int) foreign_key::FK_OPTION_DEFAULT; } key_type: opt_constraint PRIMARY_SYM KEY_SYM { $$= Key::PRIMARY; } @@ -1225,6 +1249,7 @@ alter: bzero((char*) &lex->create_info,sizeof(lex->create_info)); lex->create_info.db_type= DB_TYPE_DEFAULT; lex->create_info.row_type= ROW_TYPE_NOT_USED; + lex->create_info.table_charset=default_charset_info; lex->alter_keys_onoff=LEAVE_AS_IS; lex->simple_alter=1; } @@ -1246,23 +1271,9 @@ alter_list_item: lex->change= $3.str; lex->simple_alter=0; } field_spec opt_place - | MODIFY_SYM opt_column field_ident + | MODIFY_SYM opt_column field_spec { - LEX *lex=Lex; - lex->length=lex->dec=0; lex->type=0; lex->interval=0; - lex->default_value=0; - lex->simple_alter=0; - } - type opt_attribute - { - LEX *lex=Lex; - if (add_field_to_list($3.str, - (enum enum_field_types) $5, - lex->length,lex->dec,lex->type, - lex->default_value, $3.str, - lex->interval)) - YYABORT; - lex->simple_alter=0; + Lex->simple_alter=0; } opt_place | DROP opt_column field_ident opt_restrict @@ -3209,6 +3220,7 @@ keyword: | OFF {} | OPEN_SYM {} | PACK_KEYS_SYM {} + | PARTIAL {} | PASSWORD {} | PREV_SYM {} | PROCESS {} @@ -3220,8 +3232,8 @@ keyword: | RAID_CHUNKSIZE {} | RAID_STRIPED_SYM {} | RAID_TYPE {} - | RELAY_LOG_FILE_SYM {} - | RELAY_LOG_POS_SYM {} + | RELAY_LOG_FILE_SYM {} + | RELAY_LOG_POS_SYM {} | RELOAD {} | REPAIR {} | REPEATABLE_SYM {} @@ -3235,6 +3247,7 @@ keyword: | SERIALIZABLE_SYM {} | SESSION_SYM {} | SIGNED_SYM {} + | SIMPLE_SYM {} | SHARE_SYM {} | SHUTDOWN {} | SLAVE {} -- cgit v1.2.1 From ee6bd848804192d9bb4258ccf84b61b774190673 Mon Sep 17 00:00:00 2001 From: "monty@hundin.mysql.fi" <> Date: Tue, 4 Jun 2002 08:23:57 +0300 Subject: Changes for new binary .frm format Fixes after last merge from 4.0. (Code not yet complete, need anoter merge from 4.0) --- sql/sql_yacc.yy | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) (limited to 'sql/sql_yacc.yy') diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 32af9a0197f..578cad25bb4 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1147,7 +1147,7 @@ references: }; opt_ref_list: - /* empty */ {} + /* empty */ opt_on_delete {} | '(' ref_list ')' opt_on_delete {}; ref_list: @@ -1273,11 +1273,24 @@ alter_list_item: lex->change= $3.str; lex->simple_alter=0; } field_spec opt_place - | MODIFY_SYM opt_column field_spec - { - Lex->simple_alter=0; - } - opt_place + | MODIFY_SYM opt_column field_ident + { + LEX *lex=Lex; + lex->length=lex->dec=0; lex->type=0; lex->interval=0; + lex->default_value=lex->comment=0; + lex->simple_alter=0; + } + type opt_attribute + { + LEX *lex=Lex; + if (add_field_to_list($3.str, + (enum enum_field_types) $5, + lex->length,lex->dec,lex->type, + lex->default_value, lex->comment, + $3.str, lex->interval)) + YYABORT; + } + opt_place | DROP opt_column field_ident opt_restrict { LEX *lex=Lex; -- cgit v1.2.1 From 1a91646854196e7690ef6d915ae3f7fdf6d05543 Mon Sep 17 00:00:00 2001 From: "bar@gw.udmsearch.izhnet.ru" <> Date: Fri, 7 Jun 2002 17:23:33 +0500 Subject: Charset of any string field now can be specified during CREATE TABLE --- sql/sql_yacc.yy | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) (limited to 'sql/sql_yacc.yy') diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index d9595e841b3..316996ac7c2 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -958,6 +958,7 @@ field_spec: LEX *lex=Lex; lex->length=lex->dec=0; lex->type=0; lex->interval=0; lex->default_value=lex->comment=0; + lex->charset=default_charset_info; } type opt_attribute { @@ -966,7 +967,7 @@ field_spec: (enum enum_field_types) $3, lex->length,lex->dec,lex->type, lex->default_value, lex->comment, - lex->change,lex->interval)) + lex->change,lex->interval,lex->charset)) YYABORT; }; @@ -1009,11 +1010,11 @@ type: $$=FIELD_TYPE_LONG_BLOB; } | LONG_SYM VARBINARY { Lex->type|=BINARY_FLAG; $$=FIELD_TYPE_MEDIUM_BLOB; } - | LONG_SYM varchar { $$=FIELD_TYPE_MEDIUM_BLOB; } - | TINYTEXT { $$=FIELD_TYPE_TINY_BLOB; } - | TEXT_SYM { $$=FIELD_TYPE_BLOB; } - | MEDIUMTEXT { $$=FIELD_TYPE_MEDIUM_BLOB; } - | LONGTEXT { $$=FIELD_TYPE_LONG_BLOB; } + | LONG_SYM varchar opt_binary { $$=FIELD_TYPE_MEDIUM_BLOB; } + | TINYTEXT opt_binary { $$=FIELD_TYPE_TINY_BLOB; } + | TEXT_SYM opt_binary { $$=FIELD_TYPE_BLOB; } + | MEDIUMTEXT opt_binary { $$=FIELD_TYPE_MEDIUM_BLOB; } + | LONGTEXT opt_binary { $$=FIELD_TYPE_LONG_BLOB; } | DECIMAL_SYM float_options field_options { $$=FIELD_TYPE_DECIMAL;} | NUMERIC_SYM float_options field_options @@ -1287,7 +1288,7 @@ alter_list_item: (enum enum_field_types) $5, lex->length,lex->dec,lex->type, lex->default_value, lex->comment, - $3.str, lex->interval)) + $3.str, lex->interval, lex->charset)) YYABORT; } opt_place -- cgit v1.2.1 From e8571e68bbccac8b01ed11c88dcfce4fdf41a530 Mon Sep 17 00:00:00 2001 From: "bar@gw.udmsearch.izhnet.ru" <> Date: Tue, 11 Jun 2002 17:40:06 +0500 Subject: New command: SHOW CHARACTER SET [LIKE 'wild'] --- sql/sql_yacc.yy | 2 ++ 1 file changed, 2 insertions(+) (limited to 'sql/sql_yacc.yy') diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index efc8b8b5389..25d8dbbab16 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -2801,6 +2801,8 @@ show_param: { Lex->sql_command= SQLCOM_SHOW_PROCESSLIST;} | VARIABLES wild { Lex->sql_command= SQLCOM_SHOW_VARIABLES; } + | CHAR_SYM SET wild + { Lex->sql_command= SQLCOM_SHOW_CHARSETS; } | LOGS_SYM { Lex->sql_command= SQLCOM_SHOW_LOGS; } | GRANTS FOR_SYM user -- cgit v1.2.1 From 5a33842a1642a8bdc8a8bb19eccc1f844379b887 Mon Sep 17 00:00:00 2001 From: "venu@myvenu.com" <> Date: Wed, 12 Jun 2002 14:13:12 -0700 Subject: sql_error.cc, sql_prepare.cc: new file Client-server protocol 4.1 changes - Server side: * Enhanced metadata information: - SHOW [COUNT(*)] ERRORS [LIMIT [offset,] rows] - SHOW [COUNT(*)] WARNING [LIMIT [offset,] rows] - SHOW TABLE TYPES - SHOW PRIVILEGES - SHOW COLUMN TYPES (Not fully implemented) * Prepared execution * Long data handling in pieces * And other misc changes --- sql/sql_yacc.yy | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 55 insertions(+), 2 deletions(-) (limited to 'sql/sql_yacc.yy') diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 25d8dbbab16..d140cd4dcdd 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -324,6 +324,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %token TRAILING %token TRANSACTION_SYM %token TYPE_SYM +%token TYPES_SYM %token FUNC_ARG0 %token FUNC_ARG1 %token FUNC_ARG2 @@ -346,6 +347,11 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %token X509_SYM %token COMPRESSED_SYM +%token ERRORS +%token SQL_ERROR_COUNT +%token WARNINGS +%token SQL_WARNING_COUNT + %token BIGINT %token BLOB_SYM %token CHAR_SYM @@ -548,7 +554,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); literal text_literal insert_ident order_ident simple_ident select_item2 expr opt_expr opt_else sum_expr in_sum_expr table_wild opt_pad no_in_expr expr_expr simple_expr no_and_expr - using_list subselect subselect_init + using_list param_marker subselect subselect_init %type expr_list udf_expr_list when_list ident_list ident_list_arg @@ -1720,6 +1726,7 @@ no_and_expr: simple_expr: simple_ident | literal + | param_marker | '@' ident_or_text SET_VAR expr { $$= new Item_func_set_user_var($2,$4); current_thd->safe_to_cache_query=0; @@ -2795,6 +2802,29 @@ show_param: if (!add_table_to_list($3,NULL,0)) YYABORT; } + | COLUMN_SYM TYPES_SYM + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_SHOW_COLUMN_TYPES; + } + | TABLE_SYM TYPES_SYM + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_SHOW_TABLE_TYPES; + } + | PRIVILEGES + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_SHOW_PRIVILEGES; + } + | COUNT_SYM '(' '*' ')' WARNINGS + { Lex->sql_command = SQLCOM_SHOW_WARNS_COUNT;} + | COUNT_SYM '(' '*' ')' ERRORS + { Lex->sql_command = SQLCOM_SHOW_ERRORS_COUNT;} + | WARNINGS {Select->offset_limit=0L;} limit_clause + { Lex->sql_command = SQLCOM_SHOW_WARNS;} + | ERRORS {Select->offset_limit=0L;} limit_clause + { Lex->sql_command = SQLCOM_SHOW_ERRORS;} | STATUS_SYM wild { Lex->sql_command= SQLCOM_SHOW_STATUS; } | opt_full PROCESSLIST_SYM @@ -3055,7 +3085,20 @@ text_string: Item *tmp = new Item_varbinary($1.str,$1.length,default_charset_info); $$= tmp ? tmp->val_str((String*) 0) : (String*) 0; }; - +param_marker: + '?' + { + if(current_thd->prepare_command) + { + Lex->param_list.push_back($$=new Item_param()); + current_thd->param_count++; + } + else + { + yyerror("You have an error in your SQL syntax"); + YYABORT; + } + } literal: text_literal { $$ = $1; } | NUM { $$ = new Item_int($1.str, (longlong) atol($1.str),$1.length); } @@ -3411,6 +3454,16 @@ option_value: YYABORT; } | SQL_QUERY_CACHE_TYPE_SYM equal query_cache_type + | SQL_ERROR_COUNT equal ULONG_NUM + { + LEX *lex = Lex; + lex->thd->max_error_count = $3; + } + | SQL_WARNING_COUNT equal ULONG_NUM + { + LEX *lex = Lex; + lex->thd->max_warning_count = $3; + } | '@' ident_or_text equal expr { Item_func_set_user_var *item = new Item_func_set_user_var($2,$4); -- cgit v1.2.1 From f974c735cf419b56824ed4e5f27dfe182cf50e03 Mon Sep 17 00:00:00 2001 From: "bell@sanja.is.com.ua" <> Date: Wed, 19 Jun 2002 17:52:44 +0300 Subject: EXISTS type of subselect more correct parameters in result creation script --- sql/sql_yacc.yy | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) (limited to 'sql/sql_yacc.yy') diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index efc8b8b5389..9047bc472ac 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -548,7 +548,8 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); literal text_literal insert_ident order_ident simple_ident select_item2 expr opt_expr opt_else sum_expr in_sum_expr table_wild opt_pad no_in_expr expr_expr simple_expr no_and_expr - using_list subselect subselect_init + using_list singleval_subselect singleval_subselect_init + exists_subselect exists_subselect_init %type expr_list udf_expr_list when_list ident_list ident_list_arg @@ -1738,7 +1739,8 @@ simple_expr: | NOT expr %prec NEG { $$= new Item_func_not($2); } | '!' expr %prec NEG { $$= new Item_func_not($2); } | '(' expr ')' { $$= $2; } - | subselect { $$= $1; } + | EXISTS exists_subselect { $$= $2; } + | singleval_subselect { $$= $1; } | '{' ident expr '}' { $$= $3; } | MATCH ident_list_arg AGAINST '(' expr ')' { Select->ftfunc_list.push_back((Item_func_match *) @@ -3918,17 +3920,30 @@ union_option: /* empty */ {} | ALL {Lex->union_option=1;}; -subselect: - subselect_start subselect_init +singleval_subselect: + subselect_start singleval_subselect_init subselect_end { $$= $2; }; -subselect_init: +singleval_subselect_init: select_init { - $$= new Item_subselect(current_thd, Lex->select); + $$= new Item_singleval_subselect(current_thd, Lex->select); + }; + +exists_subselect: + subselect_start exists_subselect_init + subselect_end + { + $$= $2; + }; + +exists_subselect_init: + select_init + { + $$= new Item_exists_subselect(current_thd, Lex->select); }; subselect_start: -- cgit v1.2.1 From 6f5f47855acc0e421596dd287217f95685b1ec8b Mon Sep 17 00:00:00 2001 From: "bar@gw.udmsearch.izhnet.ru" <> Date: Wed, 19 Jun 2002 21:21:30 +0500 Subject: Default table character set has been added: CREATE TABLE a (field,...) TYPE=type CHARSET=cset; --- sql/sql_yacc.yy | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) (limited to 'sql/sql_yacc.yy') diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index d140cd4dcdd..228e43f3954 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -162,6 +162,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %token CACHE_SYM %token CASCADE %token CAST_SYM +%token CHARSET %token CHECKSUM_SYM %token CHECK_SYM %token CIPHER @@ -767,7 +768,7 @@ create: bzero((char*) &lex->create_info,sizeof(lex->create_info)); lex->create_info.options=$2 | $4; lex->create_info.db_type= default_table_type; - lex->create_info.table_charset=default_charset_info; + lex->create_info.table_charset=NULL; } create2 @@ -881,6 +882,17 @@ create_table_option: table_list->next=0; lex->create_info.used_fields|= HA_CREATE_USED_UNION; } + | CHARSET EQ ident + { + CHARSET_INFO *cs=get_charset_by_name($3.str,MYF(MY_WME)); + if (!cs) + { + net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$3); + YYABORT; + } + Lex->create_info.table_charset=cs; + Lex->create_info.used_fields|= HA_CREATE_USED_CHARSET; + } | 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; } | INDEX DIRECTORY_SYM EQ TEXT_STRING { Lex->create_info.index_file_name= $4.str; }; @@ -965,7 +977,7 @@ field_spec: LEX *lex=Lex; lex->length=lex->dec=0; lex->type=0; lex->interval=0; lex->default_value=lex->comment=0; - lex->charset=default_charset_info; + lex->charset=NULL; } type opt_attribute { @@ -1116,8 +1128,8 @@ attribute: | COMMENT_SYM text_literal { Lex->comment= $2; }; opt_binary: - /* empty */ { Lex->charset=default_charset_info; } - | BINARY { Lex->type|=BINARY_FLAG; Lex->charset=default_charset_info; } + /* empty */ { Lex->charset=NULL; } + | BINARY { Lex->type|=BINARY_FLAG; Lex->charset=NULL; } | CHAR_SYM SET ident { CHARSET_INFO *cs=get_charset_by_name($3.str,MYF(MY_WME)); @@ -1130,7 +1142,7 @@ opt_binary: }; default_charset: - /* empty */ { Lex->charset-default_charset_info; } + /* empty */ { Lex->charset=NULL; } | DEFAULT CHAR_SYM SET ident { CHARSET_INFO *cs=get_charset_by_name($4.str,MYF(MY_WME)); @@ -1259,7 +1271,7 @@ alter: bzero((char*) &lex->create_info,sizeof(lex->create_info)); lex->create_info.db_type= DB_TYPE_DEFAULT; lex->create_info.row_type= ROW_TYPE_NOT_USED; - lex->create_info.table_charset=default_charset_info; + lex->create_info.table_charset=NULL; lex->alter_keys_onoff=LEAVE_AS_IS; lex->simple_alter=1; } -- cgit v1.2.1 From 630f7cac959aba78b4bfacbaddd3eaf20c80dce2 Mon Sep 17 00:00:00 2001 From: "bar@gw.udmsearch.izhnet.ru" <> Date: Wed, 19 Jun 2002 21:48:34 +0500 Subject: Now it is possible to drop default charset from table: ALTER TABLE a CHARSET=DEFAULT --- sql/sql_yacc.yy | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'sql/sql_yacc.yy') diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 228e43f3954..83343e429e8 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -882,6 +882,11 @@ create_table_option: table_list->next=0; lex->create_info.used_fields|= HA_CREATE_USED_UNION; } + | CHARSET EQ DEFAULT + { + Lex->create_info.table_charset=NULL; + Lex->create_info.used_fields|= HA_CREATE_USED_CHARSET; + } | CHARSET EQ ident { CHARSET_INFO *cs=get_charset_by_name($3.str,MYF(MY_WME)); -- cgit v1.2.1 From 5eafe401c0cb60a45d838e4503ba6c053b71a52d Mon Sep 17 00:00:00 2001 From: "bar@gw.udmsearch.izhnet.ru" <> Date: Thu, 20 Jun 2002 18:47:55 +0500 Subject: New syntax for string with charset: _latin1'string' Remove dupicated code --- sql/sql_yacc.yy | 58 +++++++++++++++++++-------------------------------------- 1 file changed, 19 insertions(+), 39 deletions(-) (limited to 'sql/sql_yacc.yy') diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 78d03bbbd1a..f3c5ae6efaf 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -334,6 +334,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %token UDF_SONAME_SYM %token UDF_SYM %token UNCOMMITTED_SYM +%token UNDERSCORE_CHARSET %token UNION_SYM %token UNIQUE_SYM %token USAGE @@ -525,7 +526,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %type IDENT TEXT_STRING REAL_NUM FLOAT_NUM NUM LONG_NUM HEX_NUM LEX_HOSTNAME - ULONGLONG_NUM field_ident select_alias ident ident_or_text + ULONGLONG_NUM field_ident select_alias ident ident_or_text UNDERSCORE_CHARSET %type opt_table_alias @@ -888,15 +889,9 @@ create_table_option: Lex->create_info.table_charset=NULL; Lex->create_info.used_fields|= HA_CREATE_USED_CHARSET; } - | CHARSET EQ ident + | CHARSET EQ charset { - CHARSET_INFO *cs=get_charset_by_name($3.str,MYF(MY_WME)); - if (!cs) - { - net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$3); - YYABORT; - } - Lex->create_info.table_charset=cs; + Lex->create_info.table_charset=Lex->charset; Lex->create_info.used_fields|= HA_CREATE_USED_CHARSET; } | INSERT_METHOD EQ merge_insert_types { Lex->create_info.merge_insert_method= $3; Lex->create_info.used_fields|= HA_CREATE_USED_INSERT_METHOD;} @@ -1133,32 +1128,24 @@ attribute: | UNIQUE_SYM KEY_SYM { Lex->type|= UNIQUE_KEY_FLAG; } | COMMENT_SYM text_literal { Lex->comment= $2; }; +charset: + ident + { + if (!(Lex->charset=get_charset_by_name($1.str,MYF(0)))) + { + net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$1); + YYABORT; + } + }; + opt_binary: /* empty */ { Lex->charset=NULL; } | BINARY { Lex->type|=BINARY_FLAG; Lex->charset=NULL; } - | CHAR_SYM SET ident - { - CHARSET_INFO *cs=get_charset_by_name($3.str,MYF(MY_WME)); - if (!cs) - { - net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$3); - YYABORT; - } - Lex->charset=cs; - }; + | CHAR_SYM SET charset {/* charset is already in Lex->charset */} ; default_charset: /* empty */ { Lex->charset=NULL; } - | DEFAULT CHAR_SYM SET ident - { - CHARSET_INFO *cs=get_charset_by_name($4.str,MYF(MY_WME)); - if (!cs) - { - net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$4); - YYABORT; - } - Lex->charset=cs; - }; + | DEFAULT CHAR_SYM SET charset ; references: REFERENCES table_ident @@ -1777,16 +1764,8 @@ simple_expr: | CASE_SYM opt_expr WHEN_SYM when_list opt_else END { $$= new Item_func_case(* $4, $2, $5 ); } | CONVERT_SYM '(' expr ',' cast_type ')' { $$= create_func_cast($3, $5); } - | CONVERT_SYM '(' expr USING IDENT ')' - { - CHARSET_INFO *cs=get_charset_by_name($5.str,MYF(MY_WME)); - if (!cs) - { - net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$5); - YYABORT; - } - $$= new Item_func_conv_charset($3,cs); - } + | CONVERT_SYM '(' expr USING charset ')' + { $$= new Item_func_conv_charset($3,Lex->charset); } | CONVERT_SYM '(' expr ',' expr ',' expr ')' { $$= new Item_func_conv_charset3($3,$7,$5); @@ -3094,6 +3073,7 @@ opt_ignore_lines: text_literal: 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); } | text_literal TEXT_STRING { ((Item_string*) $1)->append($2.str,$2.length); }; -- cgit v1.2.1 From c5b8f48cf5acecb4f50155a98bf83f4eefd53484 Mon Sep 17 00:00:00 2001 From: "bar@gw.udmsearch.izhnet.ru" <> Date: Thu, 20 Jun 2002 23:26:04 +0500 Subject: New CHARSET() function --- sql/sql_yacc.yy | 2 ++ 1 file changed, 2 insertions(+) (limited to 'sql/sql_yacc.yy') diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index f3c5ae6efaf..91c87e9b849 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1784,6 +1784,8 @@ simple_expr: { $$= new Item_func_atan($3,$5); } | CHAR_SYM '(' expr_list ')' { $$= new Item_func_char(*$3); } + | CHARSET '(' expr ')' + { $$= new Item_func_charset($3); } | COALESCE '(' expr_list ')' { $$= new Item_func_coalesce(* $3); } | CONCAT '(' expr_list ')' -- cgit v1.2.1 From 5b45ebe812a564a6d118124d428f17abd8ec14f7 Mon Sep 17 00:00:00 2001 From: "bar@gw.udmsearch.izhnet.ru" <> Date: Fri, 21 Jun 2002 16:55:55 +0500 Subject: database default character set is now stored in database directory --- sql/sql_yacc.yy | 1 + 1 file changed, 1 insertion(+) (limited to 'sql/sql_yacc.yy') diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 91c87e9b849..faa63afa6c7 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -798,6 +798,7 @@ create: lex->sql_command=SQLCOM_CREATE_DB; lex->name=$4.str; lex->create_info.options=$3; + lex->create_info.table_charset=lex->charset; } | CREATE udf_func_type UDF_SYM ident { -- cgit v1.2.1 From 0dce493b69bb53a38af044f9bd56a2933163a37b Mon Sep 17 00:00:00 2001 From: "bar@gw.udmsearch.izhnet.ru" <> Date: Thu, 27 Jun 2002 14:41:02 +0500 Subject: ALTER DATABASE DEFAULT CHARACTER SET latin1; --- sql/sql_yacc.yy | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) (limited to 'sql/sql_yacc.yy') diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index faa63afa6c7..303a539eb49 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -885,12 +885,7 @@ create_table_option: table_list->next=0; lex->create_info.used_fields|= HA_CREATE_USED_UNION; } - | CHARSET EQ DEFAULT - { - Lex->create_info.table_charset=NULL; - Lex->create_info.used_fields|= HA_CREATE_USED_CHARSET; - } - | CHARSET EQ charset + | CHARSET EQ charset_or_nocharset { Lex->create_info.table_charset=Lex->charset; Lex->create_info.used_fields|= HA_CREATE_USED_CHARSET; @@ -1139,6 +1134,10 @@ charset: } }; +charset_or_nocharset: + charset + | DEFAULT {Lex->charset=NULL; } + opt_binary: /* empty */ { Lex->charset=NULL; } | BINARY { Lex->type|=BINARY_FLAG; Lex->charset=NULL; } @@ -1146,7 +1145,7 @@ opt_binary: default_charset: /* empty */ { Lex->charset=NULL; } - | DEFAULT CHAR_SYM SET charset ; + | DEFAULT CHAR_SYM SET charset_or_nocharset ; references: REFERENCES table_ident @@ -1270,7 +1269,16 @@ alter: lex->simple_alter=1; } alter_list; - + + | ALTER DATABASE ident default_charset + { + LEX *lex=Lex; + lex->sql_command=SQLCOM_ALTER_DB; + lex->name=$3.str; + lex->create_info.table_charset=lex->charset; + } + + alter_list: | alter_list_item | alter_list ',' alter_list_item; -- cgit v1.2.1 From 2cf620004e8a15c5d72a27377b536db2394a62d8 Mon Sep 17 00:00:00 2001 From: "bell@sanja.is.com.ua" <> Date: Mon, 1 Jul 2002 14:14:51 +0300 Subject: subselect in having clause fixed bug in sum function in subselect --- sql/sql_yacc.yy | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'sql/sql_yacc.yy') diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index faa63afa6c7..f237aac81d3 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -2973,7 +2973,7 @@ kill: KILL_SYM expr { LEX *lex=Lex; - if ($2->fix_fields(lex->thd,0)) + if ($2->fix_fields(lex->thd, 0, &$2)) { send_error(&lex->thd->net, ER_SET_CONSTANTS_ONLY); YYABORT; @@ -3469,7 +3469,8 @@ option_value: | '@' ident_or_text equal expr { Item_func_set_user_var *item = new Item_func_set_user_var($2,$4); - if (item->fix_fields(current_thd,0) || item->update()) + if (item->fix_fields(current_thd, 0, (Item**) &item) || + item->update()) { send_error(¤t_thd->net, ER_SET_CONSTANTS_ONLY); YYABORT; @@ -3501,7 +3502,7 @@ option_value: { THD *thd=current_thd; Item *item= $3; - if (item->fix_fields(current_thd,0)) + if (item->fix_fields(current_thd, 0, &item)) { send_error(&thd->net, ER_SET_CONSTANTS_ONLY); YYABORT; -- cgit v1.2.1 From 189d1dd630676a2e3be004d27770ae820e81b36b Mon Sep 17 00:00:00 2001 From: "bar@gw.udmsearch.izhnet.ru" <> Date: Tue, 2 Jul 2002 14:31:54 +0500 Subject: SHOW CREATE DATABASE name; Small fixes in database default charset code --- sql/sql_yacc.yy | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'sql/sql_yacc.yy') diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index e96c72ab04b..160bc253dc9 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -2851,6 +2851,11 @@ show_param: lex->grant_user=$3; lex->grant_user->password.str=NullS; } + | CREATE DATABASE ident + { + Lex->sql_command=SQLCOM_SHOW_CREATE_DB; + Lex->name=$3.str; + } | CREATE TABLE_SYM table_ident { Lex->sql_command = SQLCOM_SHOW_CREATE; -- cgit v1.2.1 From faaddbd21495900c9599d226428bb441aeff10ab Mon Sep 17 00:00:00 2001 From: "bar@bar.mysql.r18.ru" <> Date: Thu, 22 Aug 2002 18:12:45 +0500 Subject: Stupid bug fixes in sql_yacc.cc New class Item_func_set_collation() Fixed that "SELECT CONVERT(expr USING charset) GROUP BY 1" was not working New COLLATION syntax: COLLATE latin1 --- sql/sql_yacc.yy | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) (limited to 'sql/sql_yacc.yy') diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 160bc253dc9..01894bfb7ad 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -167,6 +167,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %token CHECK_SYM %token CIPHER %token COMMITTED_SYM +%token COLLATE_SYM %token COLUMNS %token COLUMN_SYM %token CONCURRENT @@ -522,7 +523,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %left '*' '/' '%' %left NEG '~' %right NOT -%right BINARY +%right BINARY COLLATE_SYM %type IDENT TEXT_STRING REAL_NUM FLOAT_NUM NUM LONG_NUM HEX_NUM LEX_HOSTNAME @@ -1129,7 +1130,7 @@ charset: { if (!(Lex->charset=get_charset_by_name($1.str,MYF(0)))) { - net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$1); + net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$1.str); YYABORT; } }; @@ -1658,7 +1659,16 @@ expr_expr: | expr '+' INTERVAL_SYM expr interval { $$= new Item_date_add_interval($1,$4,$5,0); } | 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 ident + { + if (!(Lex->charset=get_charset_by_name($3.str,MYF(0)))) + { + net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$3.str); + YYABORT; + } + $$= new Item_func_set_collation($1,Lex->charset); + }; /* expressions that begin with 'expr' that do NOT follow IN_SYM */ no_in_expr: @@ -3446,7 +3456,7 @@ option_value: CONVERT *tmp; if (!(tmp=get_convert_set($3.str))) { - net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$3); + net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$3.str); YYABORT; } current_thd->convert_set=tmp; -- cgit v1.2.1 From d5d10b0db5e979f301bcda4ec9b4efc999ebe137 Mon Sep 17 00:00:00 2001 From: "bar@bar.mysql.r18.ru" <> Date: Thu, 12 Sep 2002 19:36:22 +0500 Subject: Now table and database inhirited a character set from a level above at CREATE time Some optimization to reduce rules number in sql_yacc.yy --- sql/sql_yacc.yy | 69 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 34 insertions(+), 35 deletions(-) (limited to 'sql/sql_yacc.yy') diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 01894bfb7ad..7d6163fafc3 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -67,6 +67,7 @@ inline Item *or_or_concat(Item* A, Item* B) interval_type interval; LEX_USER *lex_user; enum Item_udftype udf_type; + CHARSET_INFO *charset; } %{ @@ -600,6 +601,11 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %type user grant_user +%type + charset_name + charset_name_or_default + opt_db_default_character_set + %type query verb_clause create change select do drop insert replace insert2 insert_values update delete truncate rename @@ -758,6 +764,7 @@ master_def: create: CREATE opt_table_options TABLE_SYM opt_if_not_exists table_ident { + THD *thd=current_thd; LEX *lex=Lex; lex->sql_command= SQLCOM_CREATE_TABLE; if (!add_table_to_list($5, @@ -771,7 +778,7 @@ create: bzero((char*) &lex->create_info,sizeof(lex->create_info)); lex->create_info.options=$2 | $4; lex->create_info.db_type= default_table_type; - lex->create_info.table_charset=NULL; + lex->create_info.table_charset=thd->db_charset?thd->db_charset:default_charset_info; } create2 @@ -793,13 +800,13 @@ create: lex->key_list.push_back(new Key($2,$4.str, $5, lex->col_list)); lex->col_list.empty(); } - | CREATE DATABASE opt_if_not_exists ident default_charset + | CREATE DATABASE opt_if_not_exists ident opt_db_default_character_set { LEX *lex=Lex; lex->sql_command=SQLCOM_CREATE_DB; lex->name=$4.str; lex->create_info.options=$3; - lex->create_info.table_charset=lex->charset; + lex->create_info.table_charset=$5; } | CREATE udf_func_type UDF_SYM ident { @@ -886,9 +893,9 @@ create_table_option: table_list->next=0; lex->create_info.used_fields|= HA_CREATE_USED_UNION; } - | CHARSET EQ charset_or_nocharset + | CHARSET EQ charset_name_or_default { - Lex->create_info.table_charset=Lex->charset; + Lex->create_info.table_charset= $3; Lex->create_info.used_fields|= HA_CREATE_USED_CHARSET; } | INSERT_METHOD EQ merge_insert_types { Lex->create_info.merge_insert_method= $3; Lex->create_info.used_fields|= HA_CREATE_USED_INSERT_METHOD;} @@ -996,7 +1003,7 @@ type: $$=FIELD_TYPE_TINY; } | BOOL_SYM { Lex->length=(char*) "1"; $$=FIELD_TYPE_TINY; } - | char '(' NUM ')' opt_binary { Lex->length=$3.str; + | char '(' NUM ')' opt_binary { Lex->length=$3.str; $$=FIELD_TYPE_STRING; } | char opt_binary { Lex->length=(char*) "1"; $$=FIELD_TYPE_STRING; } @@ -1125,28 +1132,28 @@ attribute: | UNIQUE_SYM KEY_SYM { Lex->type|= UNIQUE_KEY_FLAG; } | COMMENT_SYM text_literal { Lex->comment= $2; }; -charset: +charset_name: ident { - if (!(Lex->charset=get_charset_by_name($1.str,MYF(0)))) + if (!($$=get_charset_by_name($1.str,MYF(0)))) { net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$1.str); YYABORT; } }; -charset_or_nocharset: - charset - | DEFAULT {Lex->charset=NULL; } +charset_name_or_default: + charset_name { $$=$1; } + | DEFAULT { $$=NULL; } ; -opt_binary: - /* empty */ { Lex->charset=NULL; } - | BINARY { Lex->type|=BINARY_FLAG; Lex->charset=NULL; } - | CHAR_SYM SET charset {/* charset is already in Lex->charset */} ; +opt_db_default_character_set: + /* empty */ { $$=default_charset_info; } + | DEFAULT CHAR_SYM SET charset_name_or_default { $$=$4; }; -default_charset: +opt_binary: /* empty */ { Lex->charset=NULL; } - | DEFAULT CHAR_SYM SET charset_or_nocharset ; + | BINARY { Lex->type|=BINARY_FLAG; Lex->charset=NULL; } + | CHAR_SYM SET charset_name { Lex->charset=$3; } ; references: REFERENCES table_ident @@ -1247,6 +1254,7 @@ string_list: alter: ALTER opt_ignore TABLE_SYM table_ident { + THD *thd=current_thd; LEX *lex=Lex; lex->sql_command = SQLCOM_ALTER_TABLE; lex->name=0; @@ -1264,20 +1272,20 @@ alter: lex->select->db=lex->name=0; bzero((char*) &lex->create_info,sizeof(lex->create_info)); lex->create_info.db_type= DB_TYPE_DEFAULT; + lex->create_info.table_charset=thd->db_charset?thd->db_charset:default_charset_info; lex->create_info.row_type= ROW_TYPE_NOT_USED; - lex->create_info.table_charset=NULL; lex->alter_keys_onoff=LEAVE_AS_IS; lex->simple_alter=1; } alter_list; - | ALTER DATABASE ident default_charset + | ALTER DATABASE ident opt_db_default_character_set { LEX *lex=Lex; lex->sql_command=SQLCOM_ALTER_DB; lex->name=$3.str; - lex->create_info.table_charset=lex->charset; - } + lex->create_info.table_charset=$4; + }; alter_list: @@ -1660,15 +1668,8 @@ expr_expr: { $$= new Item_date_add_interval($1,$4,$5,0); } | expr '-' INTERVAL_SYM expr interval { $$= new Item_date_add_interval($1,$4,$5,1); } - | expr COLLATE_SYM ident - { - if (!(Lex->charset=get_charset_by_name($3.str,MYF(0)))) - { - net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$3.str); - YYABORT; - } - $$= new Item_func_set_collation($1,Lex->charset); - }; + | expr COLLATE_SYM charset_name + { $$= new Item_func_set_collation($1,$3); }; /* expressions that begin with 'expr' that do NOT follow IN_SYM */ no_in_expr: @@ -1783,12 +1784,10 @@ simple_expr: | CASE_SYM opt_expr WHEN_SYM when_list opt_else END { $$= new Item_func_case(* $4, $2, $5 ); } | CONVERT_SYM '(' expr ',' cast_type ')' { $$= create_func_cast($3, $5); } - | CONVERT_SYM '(' expr USING charset ')' - { $$= new Item_func_conv_charset($3,Lex->charset); } + | CONVERT_SYM '(' expr USING charset_name ')' + { $$= new Item_func_conv_charset($3,$5); } | CONVERT_SYM '(' expr ',' expr ',' expr ')' - { - $$= new Item_func_conv_charset3($3,$7,$5); - } + { $$= new Item_func_conv_charset3($3,$7,$5); } | FUNC_ARG0 '(' ')' { $$= ((Item*(*)(void))($1.symbol->create_func))();} | FUNC_ARG1 '(' expr ')' -- cgit v1.2.1 From cee9813f690be95a0130a967a4ed660b1eefc8ba Mon Sep 17 00:00:00 2001 From: "bar@bar.mysql.r18.ru" <> Date: Fri, 13 Sep 2002 18:35:29 +0500 Subject: Fixed that CHARSET keyword could not be used as identifier --- sql/sql_yacc.yy | 1 + 1 file changed, 1 insertion(+) (limited to 'sql/sql_yacc.yy') diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 7d6163fafc3..befd1c6b637 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -3238,6 +3238,7 @@ keyword: | BOOLEAN_SYM {} | CACHE_SYM {} | CHANGED {} + | CHARSET {} | CHECKSUM_SYM {} | CHECK_SYM {} | CIPHER_SYM {} -- cgit v1.2.1 From d69250a969449da43891ef5b2859df77917183a8 Mon Sep 17 00:00:00 2001 From: "monty@mashka.mysql.fi" <> Date: Wed, 2 Oct 2002 13:33:08 +0300 Subject: Fixes and code cleanups after merge with 4.0.3 Warning handling and initial prepared statement handling (last not complete yet) Changed a lot of functions that returned 0/1 to my_bool type. GRANT handling now uses read/write locks instead of mutex Change basic net functions to use THD instead of NET (needed for 4.1 protocol) Use my_sprintf instead of sprintf() + strlen() Added alloc_query() to be able to chare query initialization code with prepared statements. Cleanup handling of SHOW COUNT(*) WARNINGS and SELECT LAST_INSERT_ID() Note that the following test fails (will be fixed ASAP): sub_select, union, rpl_rotate_logs and rpl_mystery22 --- sql/sql_yacc.yy | 67 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 33 insertions(+), 34 deletions(-) (limited to 'sql/sql_yacc.yy') diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 8571cb9af6d..d9662f25c1b 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -26,6 +26,7 @@ #include "slave.h" #include "sql_acl.h" #include "lex_symbol.h" +#include "item_create.h" #include #include @@ -356,9 +357,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %token COMPRESSED_SYM %token ERRORS -%token SQL_ERROR_COUNT %token WARNINGS -%token SQL_WARNING_COUNT %token BIGINT %token BLOB_SYM @@ -642,7 +641,7 @@ query: if (!thd->bootstrap && (!(thd->lex.select_lex.options & OPTION_FOUND_COMMENT))) { - send_error(¤t_thd->net,ER_EMPTY_QUERY); + send_error(current_thd,ER_EMPTY_QUERY); YYABORT; } else @@ -1128,7 +1127,7 @@ charset: { if (!(Lex->charset=get_charset_by_name($1.str,MYF(0)))) { - net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$1.str); + net_printf(current_thd,ER_UNKNOWN_CHARACTER_SET,$1.str); YYABORT; } }; @@ -1690,7 +1689,7 @@ expr_expr: { if (!(Lex->charset=get_charset_by_name($3.str,MYF(0)))) { - net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$3.str); + net_printf(current_thd,ER_UNKNOWN_CHARACTER_SET,$3.str); YYABORT; } $$= new Item_func_set_collation($1,Lex->charset); @@ -1921,9 +1920,8 @@ simple_expr: { $$= new Item_func_interval($3,* $5); } | LAST_INSERT_ID '(' ')' { - $$= new Item_int((char*) "last_insert_id()", - current_thd->insert_id(),21); - current_thd->safe_to_cache_query=0; + $$= get_system_var(OPT_SESSION, "last_insert_id", 14, + "last_insert_id()"); } | LAST_INSERT_ID '(' expr ')' { @@ -2409,7 +2407,7 @@ olap_opt: LEX *lex=Lex; lex->olap = true; lex->select->olap= CUBE_TYPE; - net_printf(&lex->thd->net, ER_NOT_SUPPORTED_YET, "CUBE"); + net_printf(lex->thd, ER_NOT_SUPPORTED_YET, "CUBE"); YYABORT; /* To be deleted in 4.1 */ } | WITH ROLLUP_SYM @@ -2417,7 +2415,7 @@ olap_opt: LEX *lex=Lex; lex->olap = true; lex->select->olap= ROLLUP_TYPE; - net_printf(&lex->thd->net, ER_NOT_SUPPORTED_YET, "ROLLUP"); + net_printf(lex->thd, ER_NOT_SUPPORTED_YET, "ROLLUP"); YYABORT; /* To be deleted in 4.1 */ } ; @@ -2436,12 +2434,12 @@ order_clause: LEX *lex=Lex; if (lex->sql_command == SQLCOM_MULTI_UPDATE) { - net_printf(&lex->thd->net, ER_WRONG_USAGE, "UPDATE", "ORDER BY"); + net_printf(lex->thd, ER_WRONG_USAGE, "UPDATE", "ORDER BY"); YYABORT; } if (lex->select->olap != UNSPECIFIED_OLAP_TYPE) { - net_printf(&lex->thd->net, ER_WRONG_USAGE, + net_printf(lex->thd, ER_WRONG_USAGE, "CUBE/ROLLUP", "ORDER BY"); YYABORT; @@ -2467,7 +2465,7 @@ limit_clause: LEX *lex=Lex; if (lex->select->olap != UNSPECIFIED_OLAP_TYPE) { - net_printf(&lex->thd->net, ER_WRONG_USAGE, "CUBE/ROLLUP", + net_printf(lex->thd, ER_WRONG_USAGE, "CUBE/ROLLUP", "LIMIT"); YYABORT; } @@ -2480,7 +2478,7 @@ limit_clause: LEX *lex=Lex; if (lex->select->olap != UNSPECIFIED_OLAP_TYPE) { - net_printf(&lex->thd->net, ER_WRONG_USAGE, "CUBE/ROLLUP", + net_printf(lex->thd, ER_WRONG_USAGE, "CUBE/ROLLUP", "LIMIT"); YYABORT; } @@ -2495,7 +2493,7 @@ delete_limit_clause: LEX *lex=Lex; if (lex->sql_command == SQLCOM_MULTI_UPDATE) { - net_printf(&lex->thd->net, ER_WRONG_USAGE, "DELETE", "LIMIT"); + net_printf(lex->thd, ER_WRONG_USAGE, "DELETE", "LIMIT"); YYABORT; } lex->select->select_limit= HA_POS_ERROR; @@ -2935,9 +2933,9 @@ show_param: lex->sql_command= SQLCOM_SHOW_PRIVILEGES; } | COUNT_SYM '(' '*' ')' WARNINGS - { Lex->sql_command = SQLCOM_SHOW_WARNS_COUNT;} + { (void) create_select_for_variable("warning_count"); } | COUNT_SYM '(' '*' ')' ERRORS - { Lex->sql_command = SQLCOM_SHOW_ERRORS_COUNT;} + { (void) create_select_for_variable("error_count"); } | WARNINGS {Select->offset_limit=0L;} limit_clause { Lex->sql_command = SQLCOM_SHOW_WARNS;} | ERRORS {Select->offset_limit=0L;} limit_clause @@ -3103,7 +3101,7 @@ kill: LEX *lex=Lex; if ($2->fix_fields(lex->thd, 0, &$2)) { - send_error(&lex->thd->net, ER_SET_CONSTANTS_ONLY); + send_error(lex->thd, ER_SET_CONSTANTS_ONLY); YYABORT; } lex->sql_command=SQLCOM_KILL; @@ -3218,10 +3216,11 @@ text_string: param_marker: '?' { - if(current_thd->prepare_command) + LEX *lex=Lex; + if (current_thd->prepare_command) { - Lex->param_list.push_back($$=new Item_param()); - current_thd->param_count++; + lex->param_list.push_back($$=new Item_param()); + lex->param_count++; } else { @@ -3602,8 +3601,8 @@ text_or_password: set_expr_or_default: expr { $$=$1; } | DEFAULT { $$=0; } - | ON { $$=new Item_string("ON",2); } - | ALL { $$=new Item_string("ALL",3); } + | ON { $$=new Item_string("ON", 2, system_charset_info); } + | ALL { $$=new Item_string("ALL", 3, system_charset_info); } ; @@ -3769,7 +3768,7 @@ require_list_element: SUBJECT_SYM TEXT_STRING LEX *lex=Lex; if (lex->x509_subject) { - net_printf(&lex->thd->net,ER_DUP_ARGUMENT, "SUBJECT"); + net_printf(lex->thd,ER_DUP_ARGUMENT, "SUBJECT"); YYABORT; } lex->x509_subject=$2.str; @@ -3779,7 +3778,7 @@ require_list_element: SUBJECT_SYM TEXT_STRING LEX *lex=Lex; if (lex->x509_issuer) { - net_printf(&lex->thd->net,ER_DUP_ARGUMENT, "ISSUER"); + net_printf(lex->thd,ER_DUP_ARGUMENT, "ISSUER"); YYABORT; } lex->x509_issuer=$2.str; @@ -3789,7 +3788,7 @@ require_list_element: SUBJECT_SYM TEXT_STRING LEX *lex=Lex; if (lex->ssl_cipher) { - net_printf(&lex->thd->net,ER_DUP_ARGUMENT, "CIPHER"); + net_printf(lex->thd,ER_DUP_ARGUMENT, "CIPHER"); YYABORT; } lex->ssl_cipher=$2.str; @@ -3805,7 +3804,7 @@ opt_table: lex->grant = DB_ACLS & ~GRANT_ACL; else if (lex->columns.elements) { - send_error(&lex->thd->net,ER_ILLEGAL_GRANT_FOR_TABLE); + send_error(lex->thd,ER_ILLEGAL_GRANT_FOR_TABLE); YYABORT; } } @@ -3817,7 +3816,7 @@ opt_table: lex->grant = DB_ACLS & ~GRANT_ACL; else if (lex->columns.elements) { - send_error(&lex->thd->net,ER_ILLEGAL_GRANT_FOR_TABLE); + send_error(lex->thd,ER_ILLEGAL_GRANT_FOR_TABLE); YYABORT; } } @@ -3829,7 +3828,7 @@ opt_table: lex->grant= GLOBAL_ACLS & ~GRANT_ACL; else if (lex->columns.elements) { - send_error(&lex->thd->net,ER_ILLEGAL_GRANT_FOR_TABLE); + send_error(lex->thd,ER_ILLEGAL_GRANT_FOR_TABLE); YYABORT; } } @@ -3977,15 +3976,15 @@ union_list: if (lex->exchange) { /* Only the last SELECT can have INTO...... */ - net_printf(&lex->thd->net, ER_WRONG_USAGE, "UNION", "INTO"); + net_printf(lex->thd, ER_WRONG_USAGE, "UNION", "INTO"); YYABORT; } if (lex->select->linkage == GLOBAL_OPTIONS_TYPE) { - send_error(&lex->thd->net, ER_SYNTAX_ERROR); + send_error(lex->thd, ER_SYNTAX_ERROR); YYABORT; } - if (mysql_new_select(lex)) + if (mysql_new_select(lex, 0)) YYABORT; lex->select->linkage=UNION_TYPE; } @@ -4003,7 +4002,7 @@ optional_order_or_limit: LEX *lex=Lex; if (!lex->select->braces) { - send_error(&lex->thd->net, ER_SYNTAX_ERROR); + send_error(lex->thd, ER_SYNTAX_ERROR); YYABORT; } lex->select->master_unit()->global_parameters= @@ -4013,7 +4012,7 @@ optional_order_or_limit: SELECT_LEX fields always check linkage type. */ lex->select= (SELECT_LEX*)lex->select->master_unit(); - lex->select->select_limit=lex->thd->default_select_limit; + lex->select->select_limit=lex->thd->variables.select_limit; } opt_order_clause limit_clause ; -- cgit v1.2.1