mirror of
https://github.com/MariaDB/server.git
synced 2025-01-18 13:02:28 +01:00
Merge work:/home/bk/mysql-4.1 into hundin.mysql.fi:/my/mysql-4.1
This commit is contained in:
commit
cc1a522b8b
2 changed files with 45 additions and 6 deletions
|
@ -222,7 +222,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
|
||||
|
@ -231,8 +231,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)
|
||||
{
|
||||
|
@ -669,14 +688,32 @@ int yylex(void *arg, void *yythd)
|
|||
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)
|
||||
|
|
|
@ -1086,6 +1086,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";
|
||||
|
|
Loading…
Reference in a new issue