summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <bar@bar.mysql.r18.ru>2003-03-20 22:01:03 +0400
committerunknown <bar@bar.mysql.r18.ru>2003-03-20 22:01:03 +0400
commit9e5a1ba67e1c4dd918ab357905f1708f1b101e9e (patch)
treef05e0eb097334e2e34d2d5b5078859a95ebd118c
parentd0ae2c126e699a1c2d21aa046a8ebf2dd5384f25 (diff)
downloadmariadb-git-9e5a1ba67e1c4dd918ab357905f1708f1b101e9e.tar.gz
SELECT N'string'
-rw-r--r--include/m_ctype.h3
-rw-r--r--mysys/charset.c1
-rw-r--r--sql/sql_lex.cc20
-rw-r--r--sql/sql_yacc.yy7
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