diff options
author | unknown <bar@bar.mysql.r18.ru> | 2003-03-20 22:01:03 +0400 |
---|---|---|
committer | unknown <bar@bar.mysql.r18.ru> | 2003-03-20 22:01:03 +0400 |
commit | 9e5a1ba67e1c4dd918ab357905f1708f1b101e9e (patch) | |
tree | f05e0eb097334e2e34d2d5b5078859a95ebd118c | |
parent | d0ae2c126e699a1c2d21aa046a8ebf2dd5384f25 (diff) | |
download | mariadb-git-9e5a1ba67e1c4dd918ab357905f1708f1b101e9e.tar.gz |
SELECT N'string'
-rw-r--r-- | include/m_ctype.h | 3 | ||||
-rw-r--r-- | mysys/charset.c | 1 | ||||
-rw-r--r-- | sql/sql_lex.cc | 20 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 7 |
4 files changed, 29 insertions, 2 deletions
diff --git a/include/m_ctype.h b/include/m_ctype.h index 8833b7df47e..29ea40eaf33 100644 --- a/include/m_ctype.h +++ b/include/m_ctype.h @@ -85,7 +85,8 @@ enum my_lex_states MY_LEX_LONG_COMMENT, MY_LEX_END_LONG_COMMENT, MY_LEX_COLON, MY_LEX_SET_VAR, MY_LEX_USER_END, MY_LEX_HOSTNAME, MY_LEX_SKIP, MY_LEX_USER_VARIABLE_DELIMITER, MY_LEX_SYSTEM_VAR, - MY_LEX_IDENT_OR_KEYWORD, MY_LEX_IDENT_OR_HEX, MY_LEX_IDENT_OR_BIN, + MY_LEX_IDENT_OR_KEYWORD, + MY_LEX_IDENT_OR_HEX, MY_LEX_IDENT_OR_BIN, MY_LEX_IDENT_OR_NCHAR, MY_LEX_STRING_OR_DELIMITER }; diff --git a/mysys/charset.c b/mysys/charset.c index ce44353b065..899acf46fac 100644 --- a/mysys/charset.c +++ b/mysys/charset.c @@ -110,6 +110,7 @@ static void init_state_maps(CHARSET_INFO *cs) /* Special handling of hex and binary strings */ state_map[(uchar)'x']= state_map[(uchar)'X']= (uchar) MY_LEX_IDENT_OR_HEX; state_map[(uchar)'b']= state_map[(uchar)'b']= (uchar) MY_LEX_IDENT_OR_BIN; + state_map[(uchar)'n']= state_map[(uchar)'N']= (uchar) MY_LEX_IDENT_OR_NCHAR; } diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index da67f5646fc..a5bed692293 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -463,6 +463,26 @@ int yylex(void *arg, void *yythd) lex->tok_start=lex->ptr; // Let tok_start point at next item return((int) c); + case MY_LEX_IDENT_OR_NCHAR: + if (yyPeek() != '\'') + { // Found x'hex-number' + state= MY_LEX_IDENT; + break; + } + yyGet(); // Skip ' + while ((c = yyGet()) && (c !='\'')) ; + length=(lex->ptr - lex->tok_start); // Length of hexnum+3 + if (c != '\'') + { + return(ABORT_SYM); // Illegal hex constant + } + yyGet(); // get_token makes an unget + yylval->lex_str=get_token(lex,length); + yylval->lex_str.str+=2; // Skip x' + yylval->lex_str.length-=3; // Don't count x' and last ' + lex->yytoklen-=3; + return (NCHAR_STRING); + case MY_LEX_IDENT_OR_HEX: if (yyPeek() == '\'') { // Found x'hex-number' diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 45db591478c..428af27ed3f 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -291,6 +291,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %token NATURAL %token NEW_SYM %token NCHAR_SYM +%token NCHAR_STRING %token NOT %token NO_SYM %token NULL_SYM @@ -561,6 +562,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); 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 + NCHAR_STRING %type <lex_str_ptr> opt_table_alias @@ -3862,10 +3864,13 @@ text_literal: thd->charset() : thd->db_charset; $$ = new Item_string($1.str,$1.length,cs); } + | NCHAR_STRING + { $$= new Item_string($1.str,$1.length,&my_charset_utf8); } | UNDERSCORE_CHARSET TEXT_STRING { $$ = new Item_string($2.str,$2.length,Lex->charset,Item::COER_IMPLICIT); } | text_literal TEXT_STRING_db - { ((Item_string*) $1)->append($2.str,$2.length); }; + { ((Item_string*) $1)->append($2.str,$2.length); } + ; text_string: TEXT_STRING_db |