summaryrefslogtreecommitdiff
path: root/sql/sql_yacc.yy
diff options
context:
space:
mode:
authorunknown <bar@bar.mysql.r18.ru>2003-04-08 14:38:17 +0500
committerunknown <bar@bar.mysql.r18.ru>2003-04-08 14:38:17 +0500
commit8c95b516254b3af107dc8d8407f864ebcce79ee5 (patch)
tree61ea115f17b75a76465238e1d7d684f336c0f646 /sql/sql_yacc.yy
parentf20835c7aa678dfb043d683346bec920ce8895d9 (diff)
downloadmariadb-git-8c95b516254b3af107dc8d8407f864ebcce79ee5.tar.gz
Use of CHARSWT_INFO *result_collation
instead of bool convert_result_charset SET CHARACTER SET inststead of SET NAMES in tests
Diffstat (limited to 'sql/sql_yacc.yy')
-rw-r--r--sql/sql_yacc.yy49
1 files changed, 32 insertions, 17 deletions
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index bb6e445bfc2..189a28aea51 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -563,7 +563,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize);
%type <lex_str>
IDENT TEXT_STRING REAL_NUM FLOAT_NUM NUM LONG_NUM HEX_NUM LEX_HOSTNAME
ULONGLONG_NUM field_ident select_alias ident ident_or_text
- UNDERSCORE_CHARSET IDENT_sys TEXT_STRING_sys TEXT_STRING_db
+ UNDERSCORE_CHARSET IDENT_sys TEXT_STRING_sys TEXT_STRING_literal
NCHAR_STRING
%type <lex_str_ptr>
@@ -2279,9 +2279,9 @@ simple_expr:
Lex->uncacheable();;
}
| ENCRYPT '(' expr ',' expr ')' { $$= new Item_func_encrypt($3,$5); }
- | DECODE_SYM '(' expr ',' TEXT_STRING_db ')'
+ | DECODE_SYM '(' expr ',' TEXT_STRING_literal ')'
{ $$= new Item_func_decode($3,$5.str); }
- | ENCODE_SYM '(' expr ',' TEXT_STRING_db ')'
+ | ENCODE_SYM '(' expr ',' TEXT_STRING_literal ')'
{ $$= new Item_func_encode($3,$5.str); }
| DES_DECRYPT_SYM '(' expr ')'
{ $$= new Item_func_des_decrypt($3); }
@@ -2910,7 +2910,7 @@ having_clause:
;
opt_escape:
- ESCAPE_SYM TEXT_STRING_db { $$= $2.str; }
+ ESCAPE_SYM TEXT_STRING_literal { $$= $2.str; }
| /* empty */ { $$= (char*) "\\"; };
@@ -3921,24 +3921,22 @@ opt_ignore_lines:
/* Common definitions */
text_literal:
- TEXT_STRING_db
+ TEXT_STRING_literal
{
THD *thd= YYTHD;
- CHARSET_INFO *cs= my_charset_same(thd->charset(),thd->db_charset) ?
- thd->charset() : thd->db_charset;
- $$ = new Item_string($1.str,$1.length,cs);
+ $$ = new Item_string($1.str,$1.length,thd->variables.literal_collation);
}
| NCHAR_STRING
{ $$= new Item_string($1.str,$1.length,national_charset_info); }
| UNDERSCORE_CHARSET TEXT_STRING
{ $$ = new Item_string($2.str,$2.length,Lex->charset); }
- | text_literal TEXT_STRING_db
+ | text_literal TEXT_STRING_literal
{ ((Item_string*) $1)->append($2.str,$2.length); }
;
text_string:
- TEXT_STRING_db
- { $$= new String($1.str,$1.length,YYTHD->db_charset); }
+ TEXT_STRING_literal
+ { $$= new String($1.str,$1.length,YYTHD->variables.literal_collation); }
| HEX_NUM
{
Item *tmp = new Item_varbinary($1.str,$1.length);
@@ -4104,18 +4102,18 @@ TEXT_STRING_sys:
}
;
-TEXT_STRING_db:
+TEXT_STRING_literal:
TEXT_STRING
{
THD *thd= YYTHD;
- if (my_charset_same(thd->charset(),thd->db_charset))
+ if (my_charset_same(thd->charset(),thd->variables.literal_collation))
{
$$=$1;
}
else
{
String ident;
- ident.copy($1.str,$1.length,thd->charset(),thd->db_charset);
+ ident.copy($1.str,$1.length,thd->charset(),thd->variables.literal_collation);
$$.str= thd->strmake(ident.ptr(),ident.length());
$$.length= ident.length();
}
@@ -4403,15 +4401,32 @@ option_value:
find_sys_var("tx_isolation"),
new Item_int((int32) $4)));
}
- | charset old_or_new_charset_name_or_default
+ | charset old_or_new_charset_name_or_default opt_collate
{
+ THD *thd= YYTHD;
LEX *lex= Lex;
- lex->var_list.push_back(new set_var_client_collation($2,NULL,1));
+ $2= $2 ? $2: global_system_variables.client_collation;
+ $3= $3 ? $3 : $2;
+ if (!my_charset_same($2,$3))
+ {
+ net_printf(YYTHD,ER_COLLATION_CHARSET_MISMATCH,
+ $3->name,$2->csname);
+ YYABORT;
+ }
+ lex->var_list.push_back(new set_var_client_collation($3,thd->db_charset,$3));
}
| NAMES_SYM charset_name_or_default opt_collate
{
LEX *lex= Lex;
- lex->var_list.push_back(new set_var_client_collation($2,$3,0));
+ $2= $2 ? $2 : global_system_variables.client_collation;
+ $3= $3 ? $3 : $2;
+ if (!my_charset_same($2,$3))
+ {
+ net_printf(YYTHD,ER_COLLATION_CHARSET_MISMATCH,
+ $3->name,$2->csname);
+ YYABORT;
+ }
+ lex->var_list.push_back(new set_var_client_collation($3,$3,$3));
}
| PASSWORD equal text_or_password
{