From 9b045452c90dd5052bcbb619cabf4337c9532696 Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 1 Dec 2002 14:59:06 +0200 Subject: [PATCH] Fixed that one can use ` in identifiers: CREATE TABLE `fo``a` ... Added BOOLEAN as synonym for tinyint sql/sql_lex.cc: Fixed that one can use ` in identifiers: CREATE TABLE `fo``a` ... sql/sql_yacc.yy: Added BOOLEAN as synonym for tinyint --- sql/sql_lex.cc | 49 +++++++++++++++++++++++++++++++++++++++++++------ sql/sql_yacc.yy | 2 ++ 2 files changed, 45 insertions(+), 6 deletions(-) diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 5104487c700..fa5911db30d 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -216,7 +216,7 @@ static int find_keyword(LEX *lex, uint len, bool function) /* make a copy of token before ptr and set yytoklen */ -LEX_STRING get_token(LEX *lex,uint length) +static LEX_STRING get_token(LEX *lex,uint length) { LEX_STRING tmp; yyUnget(); // ptr points now after last token char @@ -225,8 +225,27 @@ LEX_STRING get_token(LEX *lex,uint length) return tmp; } -/* Return an unescaped text literal without quotes */ -/* Fix sometimes to do only one scan of the string */ +static LEX_STRING get_quoted_token(LEX *lex,uint length, char quote) +{ + LEX_STRING tmp; + byte *from, *to, *end; + yyUnget(); // ptr points now after last token char + tmp.length=lex->yytoklen=length; + tmp.str=(char*) lex->thd->alloc(tmp.length+1); + for (from= (byte*) lex->tok_start, to= tmp.str, end= to+length ; to != end ;) + { + if ((*to++= *from++) == quote) + from++; // Skip double quotes + } + *to= 0; // End null for safety + return tmp; +} + + +/* + Return an unescaped text literal without quotes + Fix sometimes to do only one scan of the string +*/ static char *get_text(LEX *lex) { @@ -663,14 +682,32 @@ int yylex(void *arg) lex->ptr += l-1; } } + yylval->lex_str=get_token(lex,yyLength()); } else #endif { - while ((c=yyGet()) && state_map[c] != STATE_USER_VARIABLE_DELIMITER && - c != (uchar) NAMES_SEP_CHAR) ; + uint double_quotes= 0; + char quote_char= c; + while ((c=yyGet())) + { + if (c == quote_char) + { + if (yyPeek() != quote_char) + break; + c=yyGet(); + double_quotes++; + continue; + } + if (c == (uchar) NAMES_SEP_CHAR) + break; + } + if (double_quotes) + yylval->lex_str=get_quoted_token(lex,yyLength() - double_quotes, + quote_char); + else + yylval->lex_str=get_token(lex,yyLength()); } - yylval->lex_str=get_token(lex,yyLength()); if (lex->convert_set) lex->convert_set->convert((char*) yylval->lex_str.str,lex->yytoklen); if (state_map[c] == STATE_USER_VARIABLE_DELIMITER) diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 4c8a257bcd3..820cde04c34 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1072,6 +1072,8 @@ type: $$=FIELD_TYPE_TINY; } | BOOL_SYM { Lex->length=(char*) "1"; $$=FIELD_TYPE_TINY; } + | BOOLEAN_SYM { Lex->length=(char*) "1"; + $$=FIELD_TYPE_TINY; } | char '(' NUM ')' opt_binary { Lex->length=$3.str; $$=FIELD_TYPE_STRING; } | char opt_binary { Lex->length=(char*) "1";